gawk-diffs
[Top][All Lists]
Advanced

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

[SCM] gawk branch, gawk-5.2-stable, updated. gawk-4.1.0-5006-gd5c88fbb


From: Arnold Robbins
Subject: [SCM] gawk branch, gawk-5.2-stable, updated. gawk-4.1.0-5006-gd5c88fbb
Date: Mon, 27 Feb 2023 15:19:42 -0500 (EST)

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

The branch, gawk-5.2-stable has been updated
       via  d5c88fbbbc92b80f424d35e5fd8cf3ede854dd87 (commit)
       via  6e98a8184b52173cf961cc4052bdd81c33b04244 (commit)
       via  1b4506029a421f09df3a41377f0f6260aa7aa100 (commit)
       via  2e2263c3c04a13463be1fbd13a392962f00234b2 (commit)
      from  bd3a8ae05c40b6e44a7be92bcaddd2dfbd9cdbaf (commit)

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

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

commit d5c88fbbbc92b80f424d35e5fd8cf3ede854dd87
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Mon Feb 27 22:19:19 2023 +0200

    Squashed commit of the following:
    
    commit 4a145797803d4e16b3461d844464e753bf2ed5cf
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Mon Feb 27 21:58:06 2023 +0200
    
        Update ChangeLogs and doc.
    
    commit a0262e53529c2f75dc4930dbeb95f47d526fd5d5
    Merge: 6dd3e482 6e98a818
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Mon Feb 27 21:35:08 2023 +0200
    
        Merge branch 'gawk-5.2-stable' into private/fixes-for-readdir
    
    commit 6dd3e48226e365f8c2f1398037064c73f4f67ddb
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Sun Feb 26 21:45:18 2023 +0200
    
        Improvements for setting up input parser.

diff --git a/ChangeLog b/ChangeLog
index ad82e180..4bf60db4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,12 @@
        * interpret.h (r_interpret): Handle Op_store_field in the switch.
        * profile.c (pprint): Same.
 
+       Unrelated: Improve how information is passed to input parsers:
+
+       * io.c (iop_alloc): lstat() or stat() the file if could not be opened.
+       See the doc for explanation as to why.
+       * NEWS: Updated.
+
 2023-02-26         Arnold D. Robbins     <arnold@skeeve.com>
 
        * Multiple files: Remove trailing whitespace.
diff --git a/NEWS b/NEWS
index d6437ce7..ca2ac451 100644
--- a/NEWS
+++ b/NEWS
@@ -27,7 +27,11 @@ Changes from 5.2.1 to 5.2.2
 6. The time extension is no longer deprecated. The strptime() function
    from gawkextlib's timex extension has been added to it.
 
-7. As usual, there have been several minor code cleanups and bug fixes.
+7. Better information is passed to input parsers for when they want to
+   decide whether or not to take control of a file. In particular, the
+   readdir extension is simplified for Windows because of this.
+
+8. As usual, there have been several minor code cleanups and bug fixes.
    See the ChangeLog for details.
 
 Changes from 5.2.0 to 5.2.1
diff --git a/configh.in b/configh.in
index e82ae154..fa922263 100644
--- a/configh.in
+++ b/configh.in
@@ -123,6 +123,9 @@
 /* Define to 1 if the system has the type 'long long int'. */
 #undef HAVE_LONG_LONG_INT
 
+/* Define to 1 if you have the `lstat' function. */
+#undef HAVE_LSTAT
+
 /* Define to 1 if you have the `mbrlen' function. */
 #undef HAVE_MBRLEN
 
diff --git a/configure b/configure
index b7020b38..f97ec96d 100755
--- a/configure
+++ b/configure
@@ -12245,6 +12245,12 @@ if test "x$ac_cv_func_iswupper" = xyes
 then :
   printf "%s\n" "#define HAVE_ISWUPPER 1" >>confdefs.h
 
+fi
+ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat"
+if test "x$ac_cv_func_lstat" = xyes
+then :
+  printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h
+
 fi
 ac_fn_c_check_func "$LINENO" "mbrlen" "ac_cv_func_mbrlen"
 if test "x$ac_cv_func_mbrlen" = xyes
diff --git a/configure.ac b/configure.ac
index 18b42bc4..e09f63aa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -316,6 +316,7 @@ esac
 # Need the check for mkstemp and tmpfile for missing_d/snprintf.c.
 AC_CHECK_FUNCS(__etoa_l atexit btowc fmod fwrite_unlocked gai_strerror \
        getgrent getgroups grantpt isascii isblank iswctype iswlower iswupper \
+       lstat \
        mbrlen memcmp memcpy memmove memset \
        mkstemp mtrace posix_openpt setenv setlocale setsid sigprocmask \
        snprintf strcasecmp strchr strcoll strerror strftime strncasecmp \
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 315b1195..c2ffca29 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -3,6 +3,7 @@
        * gawktexi.in (Include Files): Mention that -i and @include are
        the same and that files are only included once, even if nested
        in multiple include files.
+       (Input Parsers): Improve discussion of struct stat buf.
 
 2023-02-26         Arnold D. Robbins     <arnold@skeeve.com>
 
diff --git a/doc/gawk.info b/doc/gawk.info
index 0a55097b..cf15cde5 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -26745,7 +26745,17 @@ as follows:
 
 ‘struct stat sbuf;’
      If the file descriptor is valid, then ‘gawk’ will have filled in
-     this structure via a call to the ‘fstat()’ system call.
+     this structure via a call to the ‘fstat()’ system call.  Otherwise,
+     if the ‘lstat()’ system call is available, it will use that.  If
+     ‘lstat()’ is not available, then it uses ‘stat()’.  Getting the
+     file’s information allows extensions to check the type of the file
+     even if it could not be opened.  This occurs, for example, on
+     Windows systems when trying to use ‘open()’ on a directory.
+
+     If ‘gawk’ was not able to get the file information, then ‘sbuf’
+     will be zeroed out.  In particular, extension code can check if
+     ‘sbuf.st_mode == 0’.  If that’s true, then there is no information
+     in ‘sbuf’.
 
    The ‘XXX_can_take_file()’ function should examine these fields and
 decide if the input parser should be used for the file.  The decision
@@ -39775,140 +39785,140 @@ Node: Extension Functions1113097
 Node: Exit Callback Functions1118673
 Node: Extension Version String1119992
 Node: Input Parsers1120687
-Node: Output Wrappers1134179
-Node: Two-way processors1138887
-Node: Printing Messages1141248
-Ref: Printing Messages-Footnote-11142462
-Node: Updating ERRNO1142617
-Node: Requesting Values1143416
-Ref: table-value-types-returned1144169
-Node: Accessing Parameters1145278
-Node: Symbol Table Access1146562
-Node: Symbol table by name1147078
-Ref: Symbol table by name-Footnote-11150289
-Node: Symbol table by cookie1150421
-Ref: Symbol table by cookie-Footnote-11154702
-Node: Cached values1154766
-Ref: Cached values-Footnote-11158410
-Node: Array Manipulation1158567
-Ref: Array Manipulation-Footnote-11159670
-Node: Array Data Types1159707
-Ref: Array Data Types-Footnote-11162529
-Node: Array Functions1162629
-Node: Flattening Arrays1167658
-Node: Creating Arrays1174710
-Node: Redirection API1179560
-Node: Extension API Variables1182581
-Node: Extension Versioning1183306
-Ref: gawk-api-version1183743
-Node: Extension GMP/MPFR Versioning1185531
-Node: Extension API Informational Variables1187237
-Node: Extension API Boilerplate1188398
-Node: Changes from API V11192534
-Node: Finding Extensions1194168
-Node: Extension Example1194743
-Node: Internal File Description1195567
-Node: Internal File Ops1199891
-Ref: Internal File Ops-Footnote-11211449
-Node: Using Internal File Ops1211597
-Ref: Using Internal File Ops-Footnote-11214028
-Node: Extension Samples1214306
-Node: Extension Sample File Functions1215875
-Node: Extension Sample Fnmatch1224013
-Node: Extension Sample Fork1225608
-Node: Extension Sample Inplace1226884
-Node: Extension Sample Ord1230556
-Node: Extension Sample Readdir1231432
-Ref: table-readdir-file-types1232329
-Node: Extension Sample Revout1233467
-Node: Extension Sample Rev2way1234064
-Node: Extension Sample Read write array1234816
-Node: Extension Sample Readfile1238090
-Node: Extension Sample Time1239221
-Node: Extension Sample API Tests1241511
-Node: gawkextlib1242019
-Node: Extension summary1245055
-Node: Extension Exercises1248913
-Node: Language History1250191
-Node: V7/SVR3.11251905
-Node: SVR41254255
-Node: POSIX1255787
-Node: BTL1257212
-Node: POSIX/GNU1257981
-Node: Feature History1264512
-Node: Common Extensions1283630
-Node: Ranges and Locales1284999
-Ref: Ranges and Locales-Footnote-11289800
-Ref: Ranges and Locales-Footnote-21289827
-Ref: Ranges and Locales-Footnote-31290066
-Node: Contributors1290289
-Node: History summary1296494
-Node: Installation1297940
-Node: Gawk Distribution1298904
-Node: Getting1299396
-Node: Extracting1300395
-Node: Distribution contents1302107
-Node: Unix Installation1310187
-Node: Quick Installation1311009
-Node: Compiling with MPFR1313555
-Node: Shell Startup Files1314261
-Node: Additional Configuration Options1315418
-Node: Configuration Philosophy1317805
-Node: Compiling from Git1320307
-Node: Building the Documentation1320866
-Node: Non-Unix Installation1322278
-Node: PC Installation1322754
-Node: PC Binary Installation1323627
-Node: PC Compiling1324532
-Node: PC Using1325710
-Node: Cygwin1329438
-Node: MSYS1330694
-Node: OpenVMS Installation1331326
-Node: OpenVMS Compilation1332007
-Ref: OpenVMS Compilation-Footnote-11333490
-Node: OpenVMS Dynamic Extensions1333552
-Node: OpenVMS Installation Details1335188
-Node: OpenVMS Running1337623
-Node: OpenVMS GNV1341760
-Node: Bugs1342515
-Node: Bug definition1343439
-Node: Bug address1347090
-Node: Usenet1350681
-Node: Performance bugs1351912
-Node: Asking for help1354930
-Node: Maintainers1356921
-Node: Other Versions1357948
-Node: Installation summary1366880
-Node: Notes1368264
-Node: Compatibility Mode1369074
-Node: Additions1369896
-Node: Accessing The Source1370841
-Node: Adding Code1372376
-Node: New Ports1379512
-Node: Derived Files1384022
-Ref: Derived Files-Footnote-11389869
-Ref: Derived Files-Footnote-21389904
-Ref: Derived Files-Footnote-31390521
-Node: Future Extensions1390635
-Node: Implementation Limitations1391307
-Node: Extension Design1392549
-Node: Old Extension Problems1393713
-Ref: Old Extension Problems-Footnote-11395289
-Node: Extension New Mechanism Goals1395350
-Ref: Extension New Mechanism Goals-Footnote-11398846
-Node: Extension Other Design Decisions1399047
-Node: Extension Future Growth1401246
-Node: Notes summary1401870
-Node: Basic Concepts1403083
-Node: Basic High Level1403768
-Ref: figure-general-flow1404050
-Ref: figure-process-flow1404752
-Ref: Basic High Level-Footnote-11408148
-Node: Basic Data Typing1408337
-Node: Glossary1411755
-Node: Copying1444877
-Node: GNU Free Documentation License1482638
-Node: Index1507961
+Node: Output Wrappers1134797
+Node: Two-way processors1139505
+Node: Printing Messages1141866
+Ref: Printing Messages-Footnote-11143080
+Node: Updating ERRNO1143235
+Node: Requesting Values1144034
+Ref: table-value-types-returned1144787
+Node: Accessing Parameters1145896
+Node: Symbol Table Access1147180
+Node: Symbol table by name1147696
+Ref: Symbol table by name-Footnote-11150907
+Node: Symbol table by cookie1151039
+Ref: Symbol table by cookie-Footnote-11155320
+Node: Cached values1155384
+Ref: Cached values-Footnote-11159028
+Node: Array Manipulation1159185
+Ref: Array Manipulation-Footnote-11160288
+Node: Array Data Types1160325
+Ref: Array Data Types-Footnote-11163147
+Node: Array Functions1163247
+Node: Flattening Arrays1168276
+Node: Creating Arrays1175328
+Node: Redirection API1180178
+Node: Extension API Variables1183199
+Node: Extension Versioning1183924
+Ref: gawk-api-version1184361
+Node: Extension GMP/MPFR Versioning1186149
+Node: Extension API Informational Variables1187855
+Node: Extension API Boilerplate1189016
+Node: Changes from API V11193152
+Node: Finding Extensions1194786
+Node: Extension Example1195361
+Node: Internal File Description1196185
+Node: Internal File Ops1200509
+Ref: Internal File Ops-Footnote-11212067
+Node: Using Internal File Ops1212215
+Ref: Using Internal File Ops-Footnote-11214646
+Node: Extension Samples1214924
+Node: Extension Sample File Functions1216493
+Node: Extension Sample Fnmatch1224631
+Node: Extension Sample Fork1226226
+Node: Extension Sample Inplace1227502
+Node: Extension Sample Ord1231174
+Node: Extension Sample Readdir1232050
+Ref: table-readdir-file-types1232947
+Node: Extension Sample Revout1234085
+Node: Extension Sample Rev2way1234682
+Node: Extension Sample Read write array1235434
+Node: Extension Sample Readfile1238708
+Node: Extension Sample Time1239839
+Node: Extension Sample API Tests1242129
+Node: gawkextlib1242637
+Node: Extension summary1245673
+Node: Extension Exercises1249531
+Node: Language History1250809
+Node: V7/SVR3.11252523
+Node: SVR41254873
+Node: POSIX1256405
+Node: BTL1257830
+Node: POSIX/GNU1258599
+Node: Feature History1265130
+Node: Common Extensions1284248
+Node: Ranges and Locales1285617
+Ref: Ranges and Locales-Footnote-11290418
+Ref: Ranges and Locales-Footnote-21290445
+Ref: Ranges and Locales-Footnote-31290684
+Node: Contributors1290907
+Node: History summary1297112
+Node: Installation1298558
+Node: Gawk Distribution1299522
+Node: Getting1300014
+Node: Extracting1301013
+Node: Distribution contents1302725
+Node: Unix Installation1310805
+Node: Quick Installation1311627
+Node: Compiling with MPFR1314173
+Node: Shell Startup Files1314879
+Node: Additional Configuration Options1316036
+Node: Configuration Philosophy1318423
+Node: Compiling from Git1320925
+Node: Building the Documentation1321484
+Node: Non-Unix Installation1322896
+Node: PC Installation1323372
+Node: PC Binary Installation1324245
+Node: PC Compiling1325150
+Node: PC Using1326328
+Node: Cygwin1330056
+Node: MSYS1331312
+Node: OpenVMS Installation1331944
+Node: OpenVMS Compilation1332625
+Ref: OpenVMS Compilation-Footnote-11334108
+Node: OpenVMS Dynamic Extensions1334170
+Node: OpenVMS Installation Details1335806
+Node: OpenVMS Running1338241
+Node: OpenVMS GNV1342378
+Node: Bugs1343133
+Node: Bug definition1344057
+Node: Bug address1347708
+Node: Usenet1351299
+Node: Performance bugs1352530
+Node: Asking for help1355548
+Node: Maintainers1357539
+Node: Other Versions1358566
+Node: Installation summary1367498
+Node: Notes1368882
+Node: Compatibility Mode1369692
+Node: Additions1370514
+Node: Accessing The Source1371459
+Node: Adding Code1372994
+Node: New Ports1380130
+Node: Derived Files1384640
+Ref: Derived Files-Footnote-11390487
+Ref: Derived Files-Footnote-21390522
+Ref: Derived Files-Footnote-31391139
+Node: Future Extensions1391253
+Node: Implementation Limitations1391925
+Node: Extension Design1393167
+Node: Old Extension Problems1394331
+Ref: Old Extension Problems-Footnote-11395907
+Node: Extension New Mechanism Goals1395968
+Ref: Extension New Mechanism Goals-Footnote-11399464
+Node: Extension Other Design Decisions1399665
+Node: Extension Future Growth1401864
+Node: Notes summary1402488
+Node: Basic Concepts1403701
+Node: Basic High Level1404386
+Ref: figure-general-flow1404668
+Ref: figure-process-flow1405370
+Ref: Basic High Level-Footnote-11408766
+Node: Basic Data Typing1408955
+Node: Glossary1412373
+Node: Copying1445495
+Node: GNU Free Documentation License1483256
+Node: Index1508579
 
 End Tag Table
 
diff --git a/doc/gawk.texi b/doc/gawk.texi
index b49670a6..cd75aae0 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -36969,6 +36969,16 @@ able to open the file, then @code{fd} will @emph{not} 
be equal to
 @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.
+Otherwise, if the @code{lstat()} system call is available, it will
+use that. If @code{lstat()} is not available, then it uses @code{stat()}.
+Getting the file's information allows extensions to check the type of
+the file even if it could not be opened.  This occurs, for example,
+on Windows systems when trying to use @code{open()} on a directory.
+
+If @command{gawk} was not able to get the file information, then
+@code{sbuf} will be zeroed out. In particular, extension code
+can check if @samp{sbuf.st_mode == 0}. If that's true, then there
+is no information in @code{sbuf}.
 @end table
 
 The @code{@var{XXX}_can_take_file()} function should examine these
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 3e448340..219a8929 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -35885,6 +35885,16 @@ able to open the file, then @code{fd} will @emph{not} 
be equal to
 @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.
+Otherwise, if the @code{lstat()} system call is available, it will
+use that. If @code{lstat()} is not available, then it uses @code{stat()}.
+Getting the file's information allows extensions to check the type of
+the file even if it could not be opened.  This occurs, for example,
+on Windows systems when trying to use @code{open()} on a directory.
+
+If @command{gawk} was not able to get the file information, then
+@code{sbuf} will be zeroed out. In particular, extension code
+can check if @samp{sbuf.st_mode == 0}. If that's true, then there
+is no information in @code{sbuf}.
 @end table
 
 The @code{@var{XXX}_can_take_file()} function should examine these
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 14b95fa0..afc5e58b 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,8 @@
+2023-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * readdir.c (dir_can_take_file): Test is more flexible, based on
+       change in gawk's iop.c:iop_alloc() function.
+
 2023-02-09         Arnold D. Robbins     <arnold@skeeve.com>
 
        * readdir.c (dir_can_take_control_of): If ! HAVE_OPENDIR,
diff --git a/extension/readdir.c b/extension/readdir.c
index 8ec695d7..2499b4e2 100644
--- a/extension/readdir.c
+++ b/extension/readdir.c
@@ -249,7 +249,7 @@ 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));
+       return (iobuf->fd != INVALID_HANDLE || S_ISDIR(iobuf->sbuf.st_mode));
 }
 
 /*
diff --git a/io.c b/io.c
index 979cad45..dcbec287 100644
--- a/io.c
+++ b/io.c
@@ -3377,12 +3377,19 @@ iop_alloc(int fd, const char *name, int errno_val)
 
        if (fd != INVALID_HANDLE)
                fstat(fd, & iop->public.sbuf);
-#if defined(__MINGW32__)
-       else if (errno_val == EISDIR) {
-               iop->public.sbuf.st_mode = (_S_IFDIR | _S_IRWXU);
-               iop->public.fd = FAKE_FD_VALUE;
-       }
+       else {
+#ifdef HAVE_LSTAT
+               int (*statf)(const char *, struct stat *) = lstat;
+#else
+               int (*statf)(const char *, struct stat *) = stat;
 #endif
+               /*
+                * Try to fill in the stat struct. If it fails, zero
+                * it out.
+                */
+               if (statf(name, & iop->public.sbuf) < 0)
+                       memset(& iop->public.sbuf, 0, sizeof(struct stat));
+       }
 
        return iop;
 }

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=6e98a8184b52173cf961cc4052bdd81c33b04244

commit 6e98a8184b52173cf961cc4052bdd81c33b04244
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Mon Feb 27 21:32:29 2023 +0200

    Fix memory leak when $a = $b appears in expressions.

diff --git a/ChangeLog b/ChangeLog
index c214a6ea..ad82e180 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,18 @@
 
        * gawkmisc.c: Use #elif. Update copyright year.
 
+       Unrelated: Fix handling of $a = $b so that it's done OK also in
+       expressions, and not just in statements. This fixes a memory
+       leak seen with valgrind in test/fieldassign.awk.
+
+       * awk.h (enum opcodeval): Add new member, Op_store_field_exp.
+       * awkgram.y (mk_assignment): Generate Op_store_field_exp under the
+       right circumstances.
+       (optimize_assignment): Remove case for Op_field_spec_lhs.
+       * eval.c (optypes): Add entry for Op_store_field.
+       * interpret.h (r_interpret): Handle Op_store_field in the switch.
+       * profile.c (pprint): Same.
+
 2023-02-26         Arnold D. Robbins     <arnold@skeeve.com>
 
        * Multiple files: Remove trailing whitespace.
diff --git a/awk.h b/awk.h
index 7208cea4..661eb637 100644
--- a/awk.h
+++ b/awk.h
@@ -623,6 +623,7 @@ typedef enum opcodeval {
        Op_store_var,           /* simple variable assignment optimization */
        Op_store_sub,           /* array[subscript] assignment optimization */
        Op_store_field,         /* $n assignment optimization */
+       Op_store_field_exp,     /* $n assignment optimization in an expression 
*/
        Op_assign_times,
        Op_assign_quotient,
        Op_assign_mod,
diff --git a/awkgram.c b/awkgram.c
index 48fd6357..7f833c73 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -8368,7 +8368,8 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op)
        else
                ip = lhs;
 
-       (void) list_append(ip, op);
+       if (tp->opcode != Op_field_spec_lhs || op->opcode != Op_assign)
+               (void) list_append(ip, op);
 
        if (tp->opcode == Op_push_lhs
                        && tp->memory->type == Node_var
@@ -8380,9 +8381,14 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op)
                (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;
+               if (op->opcode == Op_assign) {
+                       bcfree(op);
+                       tp->opcode = Op_store_field_exp;
+               } else {
+                       (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));
        }
@@ -8475,21 +8481,6 @@ optimize_assignment(INSTRUCTION *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;
diff --git a/awkgram.y b/awkgram.y
index 77c10372..9e4a64ae 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -5866,7 +5866,8 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op)
        else
                ip = lhs;
 
-       (void) list_append(ip, op);
+       if (tp->opcode != Op_field_spec_lhs || op->opcode != Op_assign)
+               (void) list_append(ip, op);
 
        if (tp->opcode == Op_push_lhs
                        && tp->memory->type == Node_var
@@ -5878,9 +5879,14 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op)
                (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;
+               if (op->opcode == Op_assign) {
+                       bcfree(op);
+                       tp->opcode = Op_store_field_exp;
+               } else {
+                       (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));
        }
@@ -5973,21 +5979,6 @@ optimize_assignment(INSTRUCTION *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;
diff --git a/eval.c b/eval.c
index 3bfff0ca..c91083e2 100644
--- a/eval.c
+++ b/eval.c
@@ -296,6 +296,7 @@ static struct optypetab {
        { "Op_store_var", " = " },
        { "Op_store_sub", " = " },
        { "Op_store_field", " = " },
+       { "Op_store_field_exp", " = " },
        { "Op_assign_times", " *= " },
        { "Op_assign_quotient", " /= " },
        { "Op_assign_mod", " %= " },
diff --git a/interpret.h b/interpret.h
index 2e63c419..d9f97b1b 100644
--- a/interpret.h
+++ b/interpret.h
@@ -794,6 +794,7 @@ mod:
                        break;
 
                case Op_store_field:
+               case Op_store_field_exp:
                {
                        /* field assignment optimization,
                         * see awkgram.y (optimize_assignment)
@@ -816,6 +817,10 @@ mod:
                        UNFIELD(*lhs, r);
                        /* field variables need the string representation: */
                        force_string(*lhs);
+                       if (op == Op_store_field_exp) {
+                               UPREF(*lhs);
+                               PUSH(*lhs);
+                       }
                }
                        break;
 
diff --git a/profile.c b/profile.c
index b350d985..f17beb1b 100644
--- a/profile.c
+++ b/profile.c
@@ -539,15 +539,28 @@ cleanup:
                        break;
 
                case Op_store_field:
+               case Op_store_field_exp:
+               {
+                       char *assignment, *final;
+
                        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);
+                       assignment = pp_group3(t1->pp_str, op2str(pc->opcode), 
t2->pp_str);
+                       final = pp_group3("$", assignment, "");
+                       efree(assignment);
                        pp_free(t2);
                        pp_free(t1);
-                       if ((flags & IN_FOR_HEADER) == 0)
-                               pc = end_line(pc);
+                       if (pc->opcode == Op_store_field_exp)
+                               pp_push(pc->opcode, final, CAN_FREE, NULL);
+                       else {
+                               fprintf(prof_fp, "%s", final);
+                               efree(final);
+                               if ((flags & IN_FOR_HEADER) == 0)
+                                       pc = end_line(pc);
+                       }
+               }
                        break;
 
                case Op_concat:

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=1b4506029a421f09df3a41377f0f6260aa7aa100

commit 1b4506029a421f09df3a41377f0f6260aa7aa100
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Mon Feb 27 21:08:31 2023 +0200

    Small doc improvement.

diff --git a/doc/ChangeLog b/doc/ChangeLog
index ed573c16..315b1195 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,9 @@
+2023-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * gawktexi.in (Include Files): Mention that -i and @include are
+       the same and that files are only included once, even if nested
+       in multiple include files.
+
 2023-02-26         Arnold D. Robbins     <arnold@skeeve.com>
 
        * Multiple files: Remove trailing whitespace.
diff --git a/doc/gawk.info b/doc/gawk.info
index a1e6043a..0a55097b 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -3413,6 +3413,10 @@ reducing the need for writing complex and tedious 
command lines.  In
 particular, ‘@include’ is very useful for writing CGI scripts to be run
 from web pages.
 
+   The ‘@include’ directive and the ‘-i’/‘--include’ command line 
option
+are completely equivalent.  An included program source is not loaded if
+it has been previously loaded.
+
    The rules for finding a source file described in *note AWKPATH
 Variable:: also apply to files loaded with ‘@include’.
 
@@ -39346,565 +39350,565 @@ Ref: AWKLIBPATH Variable-Footnote-1156510
 Node: Other Environment Variables156907
 Node: Exit Status161403
 Node: Include Files162118
-Node: Loading Shared Libraries165989
-Node: Obsolete167481
-Node: Undocumented168117
-Node: Invoking Summary168416
-Node: Regexp171443
-Node: Regexp Usage172937
-Node: Escape Sequences175038
-Node: Regexp Operators181569
-Node: Regexp Operator Details182062
-Ref: Regexp Operator Details-Footnote-1189928
-Node: Interval Expressions190087
-Ref: Interval Expressions-Footnote-1192356
-Node: Bracket Expressions192456
-Ref: table-char-classes195016
-Node: Leftmost Longest198538
-Node: Computed Regexps199898
-Node: GNU Regexp Operators203421
-Node: Case-sensitivity207444
-Ref: Case-sensitivity-Footnote-1210401
-Ref: Case-sensitivity-Footnote-2210646
-Node: Regexp Summary210762
-Node: Reading Files212286
-Node: Records214603
-Node: awk split records215714
-Node: gawk split records220604
-Ref: gawk split records-Footnote-1225898
-Node: Fields225935
-Node: Nonconstant Fields228822
-Ref: Nonconstant Fields-Footnote-1231133
-Node: Changing Fields231349
-Node: Field Separators237657
-Node: Default Field Splitting240473
-Node: Regexp Field Splitting241616
-Node: Single Character Fields245445
-Node: Command Line Field Separator246540
-Node: Full Line Fields249927
-Ref: Full Line Fields-Footnote-1251507
-Ref: Full Line Fields-Footnote-2251553
-Node: Field Splitting Summary251661
-Node: Constant Size253830
-Node: Fixed width data254574
-Node: Skipping intervening258093
-Node: Allowing trailing data258895
-Node: Fields with fixed data259960
-Node: Splitting By Content261586
-Ref: Splitting By Content-Footnote-1265525
-Node: More CSV265688
-Node: FS versus FPAT267341
-Node: Testing field creation268550
-Node: Multiple Line270243
-Node: Getline276725
-Node: Plain Getline279311
-Node: Getline/Variable281961
-Node: Getline/File283158
-Node: Getline/Variable/File284606
-Ref: Getline/Variable/File-Footnote-1286251
-Node: Getline/Pipe286347
-Node: Getline/Variable/Pipe289160
-Node: Getline/Coprocess290343
-Node: Getline/Variable/Coprocess291666
-Node: Getline Notes292432
-Node: Getline Summary295393
-Ref: table-getline-variants295837
-Node: Read Timeout296742
-Ref: Read Timeout-Footnote-1300706
-Node: Retrying Input300764
-Node: Command-line directories302031
-Node: Input Summary302969
-Node: Input Exercises306349
-Node: Printing306789
-Node: Print308675
-Node: Print Examples310181
-Node: Output Separators313034
-Node: OFMT315145
-Node: Printf316568
-Node: Basic Printf317373
-Node: Control Letters319009
-Node: Format Modifiers324478
-Node: Printf Examples330764
-Node: Redirection333309
-Node: Special FD340383
-Ref: Special FD-Footnote-1343673
-Node: Special Files343759
-Node: Other Inherited Files344388
-Node: Special Network345453
-Node: Special Caveats346341
-Node: Close Files And Pipes347324
-Ref: Close Files And Pipes-Footnote-1353461
-Node: Close Return Value353617
-Ref: table-close-pipe-return-values354892
-Ref: Close Return Value-Footnote-1355726
-Node: Nonfatal355882
-Node: Output Summary358313
-Node: Output Exercises359599
-Node: Expressions360290
-Node: Values361492
-Node: Constants362170
-Node: Scalar Constants362867
-Ref: Scalar Constants-Footnote-1365442
-Node: Nondecimal-numbers365692
-Node: Regexp Constants368813
-Node: Using Constant Regexps369359
-Node: Standard Regexp Constants370005
-Node: Strong Regexp Constants373305
-Node: Variables377156
-Node: Using Variables377821
-Node: Assignment Options379801
-Node: Conversion382363
-Node: Strings And Numbers382895
-Ref: Strings And Numbers-Footnote-1386114
-Node: Locale influences conversions386223
-Ref: table-locale-affects389073
-Node: All Operators389716
-Node: Arithmetic Ops390357
-Node: Concatenation393187
-Ref: Concatenation-Footnote-1396137
-Node: Assignment Ops396260
-Ref: table-assign-ops401399
-Node: Increment Ops402781
-Node: Truth Values and Conditions406380
-Node: Truth Values407506
-Node: Typing and Comparison408597
-Node: Variable Typing409433
-Ref: Variable Typing-Footnote-1416095
-Ref: Variable Typing-Footnote-2416175
-Node: Comparison Operators416258
-Ref: table-relational-ops416685
-Node: POSIX String Comparison420371
-Ref: POSIX String Comparison-Footnote-1422130
-Ref: POSIX String Comparison-Footnote-2422273
-Node: Boolean Ops422357
-Ref: Boolean Ops-Footnote-1427050
-Node: Conditional Exp427146
-Node: Function Calls428932
-Node: Precedence432882
-Node: Locales436759
-Node: Expressions Summary438441
-Node: Patterns and Actions441104
-Node: Pattern Overview442246
-Node: Regexp Patterns443972
-Node: Expression Patterns444518
-Node: Ranges448427
-Node: BEGIN/END451605
-Node: Using BEGIN/END452418
-Ref: Using BEGIN/END-Footnote-1455328
-Node: I/O And BEGIN/END455438
-Node: BEGINFILE/ENDFILE457919
-Node: Empty461360
-Node: Using Shell Variables461677
-Node: Action Overview464015
-Node: Statements466450
-Node: If Statement468348
-Node: While Statement469917
-Node: Do Statement472005
-Node: For Statement473191
-Node: Switch Statement476548
-Node: Break Statement479099
-Node: Continue Statement481291
-Node: Next Statement483223
-Node: Nextfile Statement485720
-Node: Exit Statement488581
-Node: Built-in Variables491114
-Node: User-modified492293
-Node: Auto-set500504
-Ref: Auto-set-Footnote-1518357
-Ref: Auto-set-Footnote-2518575
-Node: ARGC and ARGV518631
-Node: Pattern Action Summary523070
-Node: Arrays525686
-Node: Array Basics527063
-Node: Array Intro527913
-Ref: figure-array-elements529929
-Ref: Array Intro-Footnote-1532793
-Node: Reference to Elements532925
-Node: Assigning Elements535447
-Node: Array Example535942
-Node: Scanning an Array537911
-Node: Controlling Scanning541008
-Ref: Controlling Scanning-Footnote-1547671
-Node: Numeric Array Subscripts547995
-Node: Uninitialized Subscripts550269
-Node: Delete551948
-Ref: Delete-Footnote-1554762
-Node: Multidimensional554819
-Node: Multiscanning558024
-Node: Arrays of Arrays559696
-Node: Arrays Summary564596
-Node: Functions566785
-Node: Built-in567845
-Node: Calling Built-in569034
-Node: Boolean Functions571081
-Node: Numeric Functions571651
-Ref: Numeric Functions-Footnote-1575844
-Ref: Numeric Functions-Footnote-2576528
-Ref: Numeric Functions-Footnote-3576580
-Node: String Functions576856
-Ref: String Functions-Footnote-1602686
-Ref: String Functions-Footnote-2602820
-Ref: String Functions-Footnote-3603080
-Node: Gory Details603167
-Ref: table-sub-escapes605074
-Ref: table-sub-proposed606720
-Ref: table-posix-sub608230
-Ref: table-gensub-escapes609918
-Ref: Gory Details-Footnote-1610852
-Node: I/O Functions611006
-Ref: table-system-return-values617693
-Ref: I/O Functions-Footnote-1619864
-Ref: I/O Functions-Footnote-2620012
-Node: Time Functions620132
-Ref: Time Functions-Footnote-1631288
-Ref: Time Functions-Footnote-2631364
-Ref: Time Functions-Footnote-3631526
-Ref: Time Functions-Footnote-4631637
-Ref: Time Functions-Footnote-5631755
-Ref: Time Functions-Footnote-6631990
-Node: Bitwise Functions632272
-Ref: table-bitwise-ops632874
-Ref: Bitwise Functions-Footnote-1639128
-Ref: Bitwise Functions-Footnote-2639307
-Node: Type Functions639504
-Node: I18N Functions643097
-Node: User-defined644840
-Node: Definition Syntax645660
-Ref: Definition Syntax-Footnote-1651488
-Node: Function Example651565
-Ref: Function Example-Footnote-1654544
-Node: Function Calling654566
-Node: Calling A Function655160
-Node: Variable Scope656130
-Node: Pass By Value/Reference659184
-Node: Function Caveats661916
-Ref: Function Caveats-Footnote-1664011
-Node: Return Statement664135
-Node: Dynamic Typing667190
-Node: Indirect Calls668146
-Node: Functions Summary679305
-Node: Library Functions682082
-Ref: Library Functions-Footnote-1685630
-Ref: Library Functions-Footnote-2685773
-Node: Library Names685948
-Ref: Library Names-Footnote-1689742
-Ref: Library Names-Footnote-2689969
-Node: General Functions690065
-Node: Strtonum Function691259
-Node: Assert Function694341
-Node: Round Function697793
-Node: Cliff Random Function699371
-Node: Ordinal Functions700404
-Ref: Ordinal Functions-Footnote-1703513
-Ref: Ordinal Functions-Footnote-2703765
-Node: Join Function703979
-Ref: Join Function-Footnote-1705782
-Node: Getlocaltime Function705986
-Node: Readfile Function709760
-Node: Shell Quoting711789
-Node: Isnumeric Function713245
-Node: Data File Management714657
-Node: Filetrans Function715289
-Node: Rewind Function719583
-Node: File Checking721562
-Ref: File Checking-Footnote-1722934
-Node: Empty Files723141
-Node: Ignoring Assigns725208
-Node: Getopt Function726782
-Ref: Getopt Function-Footnote-1742616
-Node: Passwd Functions742828
-Ref: Passwd Functions-Footnote-1752010
-Node: Group Functions752098
-Ref: Group Functions-Footnote-1760236
-Node: Walking Arrays760449
-Node: Library Functions Summary763497
-Node: Library Exercises764921
-Node: Sample Programs765408
-Node: Running Examples766190
-Node: Clones766942
-Node: Cut Program768214
-Node: Egrep Program778655
-Node: Id Program787972
-Node: Split Program798086
-Ref: Split Program-Footnote-1808321
-Node: Tee Program808508
-Node: Uniq Program811417
-Node: Wc Program819282
-Node: Bytes vs. Characters819677
-Node: Using extensions821279
-Node: wc program822059
-Node: Miscellaneous Programs827065
-Node: Dupword Program828294
-Node: Alarm Program830357
-Node: Translate Program835270
-Ref: Translate Program-Footnote-1840011
-Node: Labels Program840289
-Ref: Labels Program-Footnote-1843730
-Node: Word Sorting843822
-Node: History Sorting848016
-Node: Extract Program850291
-Node: Simple Sed858560
-Node: Igawk Program861776
-Ref: Igawk Program-Footnote-1877023
-Ref: Igawk Program-Footnote-2877229
-Ref: Igawk Program-Footnote-3877359
-Node: Anagram Program877486
-Node: Signature Program880582
-Node: Programs Summary881834
-Node: Programs Exercises883092
-Ref: Programs Exercises-Footnote-1887408
-Node: Advanced Features887494
-Node: Nondecimal Data889988
-Node: Boolean Typed Values891618
-Node: Array Sorting893593
-Node: Controlling Array Traversal894322
-Ref: Controlling Array Traversal-Footnote-1902829
-Node: Array Sorting Functions902951
-Ref: Array Sorting Functions-Footnote-1909070
-Node: Two-way I/O909278
-Ref: Two-way I/O-Footnote-1917273
-Ref: Two-way I/O-Footnote-2917464
-Node: TCP/IP Networking917546
-Node: Profiling920726
-Node: Persistent Memory930436
-Ref: Persistent Memory-Footnote-1939394
-Node: Extension Philosophy939525
-Node: Advanced Features Summary941060
-Node: Internationalization943330
-Node: I18N and L10N945036
-Node: Explaining gettext945731
-Ref: Explaining gettext-Footnote-1951884
-Ref: Explaining gettext-Footnote-2952079
-Node: Programmer i18n952244
-Ref: Programmer i18n-Footnote-1957357
-Node: Translator i18n957406
-Node: String Extraction958242
-Ref: String Extraction-Footnote-1959420
-Node: Printf Ordering959518
-Ref: Printf Ordering-Footnote-1962380
-Node: I18N Portability962448
-Ref: I18N Portability-Footnote-1965022
-Node: I18N Example965093
-Ref: I18N Example-Footnote-1968493
-Ref: I18N Example-Footnote-2968569
-Node: Gawk I18N968686
-Node: I18N Summary969342
-Node: Debugger970743
-Node: Debugging971767
-Node: Debugging Concepts972216
-Node: Debugging Terms974042
-Node: Awk Debugging976655
-Ref: Awk Debugging-Footnote-1977632
-Node: Sample Debugging Session977772
-Node: Debugger Invocation978324
-Node: Finding The Bug979953
-Node: List of Debugger Commands986639
-Node: Breakpoint Control988016
-Node: Debugger Execution Control991848
-Node: Viewing And Changing Data995328
-Node: Execution Stack999066
-Node: Debugger Info1000747
-Node: Miscellaneous Debugger Commands1005046
-Node: Readline Support1010299
-Node: Limitations1011245
-Node: Debugging Summary1013889
-Node: Namespaces1015192
-Node: Global Namespace1016319
-Node: Qualified Names1017764
-Node: Default Namespace1018799
-Node: Changing The Namespace1019574
-Node: Naming Rules1021268
-Node: Internal Name Management1023183
-Node: Namespace Example1024253
-Node: Namespace And Features1026836
-Node: Namespace Summary1028293
-Node: Arbitrary Precision Arithmetic1029806
-Node: Computer Arithmetic1031325
-Ref: table-numeric-ranges1035142
-Ref: table-floating-point-ranges1035640
-Ref: Computer Arithmetic-Footnote-11036299
-Node: Math Definitions1036358
-Ref: table-ieee-formats1039403
-Node: MPFR features1039977
-Node: MPFR On Parole1040430
-Ref: MPFR On Parole-Footnote-11041274
-Node: MPFR Intro1041433
-Node: FP Math Caution1043123
-Ref: FP Math Caution-Footnote-11044197
-Node: Inexactness of computations1044574
-Node: Inexact representation1045605
-Node: Comparing FP Values1046988
-Node: Errors accumulate1048246
-Node: Strange values1049713
-Ref: Strange values-Footnote-11052379
-Node: Getting Accuracy1052484
-Node: Try To Round1055221
-Node: Setting precision1056128
-Ref: table-predefined-precision-strings1056833
-Node: Setting the rounding mode1058718
-Ref: table-gawk-rounding-modes1059100
-Ref: Setting the rounding mode-Footnote-11063158
-Node: Arbitrary Precision Integers1063341
-Ref: Arbitrary Precision Integers-Footnote-11066553
-Node: Checking for MPFR1066709
-Node: POSIX Floating Point Problems1068199
-Ref: POSIX Floating Point Problems-Footnote-11073063
-Node: Floating point summary1073101
-Node: Dynamic Extensions1075365
-Node: Extension Intro1076964
-Node: Plugin License1078272
-Node: Extension Mechanism Outline1079085
-Ref: figure-load-extension1079536
-Ref: figure-register-new-function1081116
-Ref: figure-call-new-function1082221
-Node: Extension API Description1084340
-Node: Extension API Functions Introduction1086069
-Ref: table-api-std-headers1087967
-Node: General Data Types1092431
-Ref: General Data Types-Footnote-11101599
-Node: Memory Allocation Functions1101914
-Ref: Memory Allocation Functions-Footnote-11106639
-Node: Constructor Functions1106738
-Node: API Ownership of MPFR and GMP Values1110643
-Node: Registration Functions1112204
-Node: Extension Functions1112908
-Node: Exit Callback Functions1118484
-Node: Extension Version String1119803
-Node: Input Parsers1120498
-Node: Output Wrappers1133990
-Node: Two-way processors1138698
-Node: Printing Messages1141059
-Ref: Printing Messages-Footnote-11142273
-Node: Updating ERRNO1142428
-Node: Requesting Values1143227
-Ref: table-value-types-returned1143980
-Node: Accessing Parameters1145089
-Node: Symbol Table Access1146373
-Node: Symbol table by name1146889
-Ref: Symbol table by name-Footnote-11150100
-Node: Symbol table by cookie1150232
-Ref: Symbol table by cookie-Footnote-11154513
-Node: Cached values1154577
-Ref: Cached values-Footnote-11158221
-Node: Array Manipulation1158378
-Ref: Array Manipulation-Footnote-11159481
-Node: Array Data Types1159518
-Ref: Array Data Types-Footnote-11162340
-Node: Array Functions1162440
-Node: Flattening Arrays1167469
-Node: Creating Arrays1174521
-Node: Redirection API1179371
-Node: Extension API Variables1182392
-Node: Extension Versioning1183117
-Ref: gawk-api-version1183554
-Node: Extension GMP/MPFR Versioning1185342
-Node: Extension API Informational Variables1187048
-Node: Extension API Boilerplate1188209
-Node: Changes from API V11192345
-Node: Finding Extensions1193979
-Node: Extension Example1194554
-Node: Internal File Description1195378
-Node: Internal File Ops1199702
-Ref: Internal File Ops-Footnote-11211260
-Node: Using Internal File Ops1211408
-Ref: Using Internal File Ops-Footnote-11213839
-Node: Extension Samples1214117
-Node: Extension Sample File Functions1215686
-Node: Extension Sample Fnmatch1223824
-Node: Extension Sample Fork1225419
-Node: Extension Sample Inplace1226695
-Node: Extension Sample Ord1230367
-Node: Extension Sample Readdir1231243
-Ref: table-readdir-file-types1232140
-Node: Extension Sample Revout1233278
-Node: Extension Sample Rev2way1233875
-Node: Extension Sample Read write array1234627
-Node: Extension Sample Readfile1237901
-Node: Extension Sample Time1239032
-Node: Extension Sample API Tests1241322
-Node: gawkextlib1241830
-Node: Extension summary1244866
-Node: Extension Exercises1248724
-Node: Language History1250002
-Node: V7/SVR3.11251716
-Node: SVR41254066
-Node: POSIX1255598
-Node: BTL1257023
-Node: POSIX/GNU1257792
-Node: Feature History1264323
-Node: Common Extensions1283441
-Node: Ranges and Locales1284810
-Ref: Ranges and Locales-Footnote-11289611
-Ref: Ranges and Locales-Footnote-21289638
-Ref: Ranges and Locales-Footnote-31289877
-Node: Contributors1290100
-Node: History summary1296305
-Node: Installation1297751
-Node: Gawk Distribution1298715
-Node: Getting1299207
-Node: Extracting1300206
-Node: Distribution contents1301918
-Node: Unix Installation1309998
-Node: Quick Installation1310820
-Node: Compiling with MPFR1313366
-Node: Shell Startup Files1314072
-Node: Additional Configuration Options1315229
-Node: Configuration Philosophy1317616
-Node: Compiling from Git1320118
-Node: Building the Documentation1320677
-Node: Non-Unix Installation1322089
-Node: PC Installation1322565
-Node: PC Binary Installation1323438
-Node: PC Compiling1324343
-Node: PC Using1325521
-Node: Cygwin1329249
-Node: MSYS1330505
-Node: OpenVMS Installation1331137
-Node: OpenVMS Compilation1331818
-Ref: OpenVMS Compilation-Footnote-11333301
-Node: OpenVMS Dynamic Extensions1333363
-Node: OpenVMS Installation Details1334999
-Node: OpenVMS Running1337434
-Node: OpenVMS GNV1341571
-Node: Bugs1342326
-Node: Bug definition1343250
-Node: Bug address1346901
-Node: Usenet1350492
-Node: Performance bugs1351723
-Node: Asking for help1354741
-Node: Maintainers1356732
-Node: Other Versions1357759
-Node: Installation summary1366691
-Node: Notes1368075
-Node: Compatibility Mode1368885
-Node: Additions1369707
-Node: Accessing The Source1370652
-Node: Adding Code1372187
-Node: New Ports1379323
-Node: Derived Files1383833
-Ref: Derived Files-Footnote-11389680
-Ref: Derived Files-Footnote-21389715
-Ref: Derived Files-Footnote-31390332
-Node: Future Extensions1390446
-Node: Implementation Limitations1391118
-Node: Extension Design1392360
-Node: Old Extension Problems1393524
-Ref: Old Extension Problems-Footnote-11395100
-Node: Extension New Mechanism Goals1395161
-Ref: Extension New Mechanism Goals-Footnote-11398657
-Node: Extension Other Design Decisions1398858
-Node: Extension Future Growth1401057
-Node: Notes summary1401681
-Node: Basic Concepts1402894
-Node: Basic High Level1403579
-Ref: figure-general-flow1403861
-Ref: figure-process-flow1404563
-Ref: Basic High Level-Footnote-11407959
-Node: Basic Data Typing1408148
-Node: Glossary1411566
-Node: Copying1444688
-Node: GNU Free Documentation License1482449
-Node: Index1507772
+Node: Loading Shared Libraries166178
+Node: Obsolete167670
+Node: Undocumented168306
+Node: Invoking Summary168605
+Node: Regexp171632
+Node: Regexp Usage173126
+Node: Escape Sequences175227
+Node: Regexp Operators181758
+Node: Regexp Operator Details182251
+Ref: Regexp Operator Details-Footnote-1190117
+Node: Interval Expressions190276
+Ref: Interval Expressions-Footnote-1192545
+Node: Bracket Expressions192645
+Ref: table-char-classes195205
+Node: Leftmost Longest198727
+Node: Computed Regexps200087
+Node: GNU Regexp Operators203610
+Node: Case-sensitivity207633
+Ref: Case-sensitivity-Footnote-1210590
+Ref: Case-sensitivity-Footnote-2210835
+Node: Regexp Summary210951
+Node: Reading Files212475
+Node: Records214792
+Node: awk split records215903
+Node: gawk split records220793
+Ref: gawk split records-Footnote-1226087
+Node: Fields226124
+Node: Nonconstant Fields229011
+Ref: Nonconstant Fields-Footnote-1231322
+Node: Changing Fields231538
+Node: Field Separators237846
+Node: Default Field Splitting240662
+Node: Regexp Field Splitting241805
+Node: Single Character Fields245634
+Node: Command Line Field Separator246729
+Node: Full Line Fields250116
+Ref: Full Line Fields-Footnote-1251696
+Ref: Full Line Fields-Footnote-2251742
+Node: Field Splitting Summary251850
+Node: Constant Size254019
+Node: Fixed width data254763
+Node: Skipping intervening258282
+Node: Allowing trailing data259084
+Node: Fields with fixed data260149
+Node: Splitting By Content261775
+Ref: Splitting By Content-Footnote-1265714
+Node: More CSV265877
+Node: FS versus FPAT267530
+Node: Testing field creation268739
+Node: Multiple Line270432
+Node: Getline276914
+Node: Plain Getline279500
+Node: Getline/Variable282150
+Node: Getline/File283347
+Node: Getline/Variable/File284795
+Ref: Getline/Variable/File-Footnote-1286440
+Node: Getline/Pipe286536
+Node: Getline/Variable/Pipe289349
+Node: Getline/Coprocess290532
+Node: Getline/Variable/Coprocess291855
+Node: Getline Notes292621
+Node: Getline Summary295582
+Ref: table-getline-variants296026
+Node: Read Timeout296931
+Ref: Read Timeout-Footnote-1300895
+Node: Retrying Input300953
+Node: Command-line directories302220
+Node: Input Summary303158
+Node: Input Exercises306538
+Node: Printing306978
+Node: Print308864
+Node: Print Examples310370
+Node: Output Separators313223
+Node: OFMT315334
+Node: Printf316757
+Node: Basic Printf317562
+Node: Control Letters319198
+Node: Format Modifiers324667
+Node: Printf Examples330953
+Node: Redirection333498
+Node: Special FD340572
+Ref: Special FD-Footnote-1343862
+Node: Special Files343948
+Node: Other Inherited Files344577
+Node: Special Network345642
+Node: Special Caveats346530
+Node: Close Files And Pipes347513
+Ref: Close Files And Pipes-Footnote-1353650
+Node: Close Return Value353806
+Ref: table-close-pipe-return-values355081
+Ref: Close Return Value-Footnote-1355915
+Node: Nonfatal356071
+Node: Output Summary358502
+Node: Output Exercises359788
+Node: Expressions360479
+Node: Values361681
+Node: Constants362359
+Node: Scalar Constants363056
+Ref: Scalar Constants-Footnote-1365631
+Node: Nondecimal-numbers365881
+Node: Regexp Constants369002
+Node: Using Constant Regexps369548
+Node: Standard Regexp Constants370194
+Node: Strong Regexp Constants373494
+Node: Variables377345
+Node: Using Variables378010
+Node: Assignment Options379990
+Node: Conversion382552
+Node: Strings And Numbers383084
+Ref: Strings And Numbers-Footnote-1386303
+Node: Locale influences conversions386412
+Ref: table-locale-affects389262
+Node: All Operators389905
+Node: Arithmetic Ops390546
+Node: Concatenation393376
+Ref: Concatenation-Footnote-1396326
+Node: Assignment Ops396449
+Ref: table-assign-ops401588
+Node: Increment Ops402970
+Node: Truth Values and Conditions406569
+Node: Truth Values407695
+Node: Typing and Comparison408786
+Node: Variable Typing409622
+Ref: Variable Typing-Footnote-1416284
+Ref: Variable Typing-Footnote-2416364
+Node: Comparison Operators416447
+Ref: table-relational-ops416874
+Node: POSIX String Comparison420560
+Ref: POSIX String Comparison-Footnote-1422319
+Ref: POSIX String Comparison-Footnote-2422462
+Node: Boolean Ops422546
+Ref: Boolean Ops-Footnote-1427239
+Node: Conditional Exp427335
+Node: Function Calls429121
+Node: Precedence433071
+Node: Locales436948
+Node: Expressions Summary438630
+Node: Patterns and Actions441293
+Node: Pattern Overview442435
+Node: Regexp Patterns444161
+Node: Expression Patterns444707
+Node: Ranges448616
+Node: BEGIN/END451794
+Node: Using BEGIN/END452607
+Ref: Using BEGIN/END-Footnote-1455517
+Node: I/O And BEGIN/END455627
+Node: BEGINFILE/ENDFILE458108
+Node: Empty461549
+Node: Using Shell Variables461866
+Node: Action Overview464204
+Node: Statements466639
+Node: If Statement468537
+Node: While Statement470106
+Node: Do Statement472194
+Node: For Statement473380
+Node: Switch Statement476737
+Node: Break Statement479288
+Node: Continue Statement481480
+Node: Next Statement483412
+Node: Nextfile Statement485909
+Node: Exit Statement488770
+Node: Built-in Variables491303
+Node: User-modified492482
+Node: Auto-set500693
+Ref: Auto-set-Footnote-1518546
+Ref: Auto-set-Footnote-2518764
+Node: ARGC and ARGV518820
+Node: Pattern Action Summary523259
+Node: Arrays525875
+Node: Array Basics527252
+Node: Array Intro528102
+Ref: figure-array-elements530118
+Ref: Array Intro-Footnote-1532982
+Node: Reference to Elements533114
+Node: Assigning Elements535636
+Node: Array Example536131
+Node: Scanning an Array538100
+Node: Controlling Scanning541197
+Ref: Controlling Scanning-Footnote-1547860
+Node: Numeric Array Subscripts548184
+Node: Uninitialized Subscripts550458
+Node: Delete552137
+Ref: Delete-Footnote-1554951
+Node: Multidimensional555008
+Node: Multiscanning558213
+Node: Arrays of Arrays559885
+Node: Arrays Summary564785
+Node: Functions566974
+Node: Built-in568034
+Node: Calling Built-in569223
+Node: Boolean Functions571270
+Node: Numeric Functions571840
+Ref: Numeric Functions-Footnote-1576033
+Ref: Numeric Functions-Footnote-2576717
+Ref: Numeric Functions-Footnote-3576769
+Node: String Functions577045
+Ref: String Functions-Footnote-1602875
+Ref: String Functions-Footnote-2603009
+Ref: String Functions-Footnote-3603269
+Node: Gory Details603356
+Ref: table-sub-escapes605263
+Ref: table-sub-proposed606909
+Ref: table-posix-sub608419
+Ref: table-gensub-escapes610107
+Ref: Gory Details-Footnote-1611041
+Node: I/O Functions611195
+Ref: table-system-return-values617882
+Ref: I/O Functions-Footnote-1620053
+Ref: I/O Functions-Footnote-2620201
+Node: Time Functions620321
+Ref: Time Functions-Footnote-1631477
+Ref: Time Functions-Footnote-2631553
+Ref: Time Functions-Footnote-3631715
+Ref: Time Functions-Footnote-4631826
+Ref: Time Functions-Footnote-5631944
+Ref: Time Functions-Footnote-6632179
+Node: Bitwise Functions632461
+Ref: table-bitwise-ops633063
+Ref: Bitwise Functions-Footnote-1639317
+Ref: Bitwise Functions-Footnote-2639496
+Node: Type Functions639693
+Node: I18N Functions643286
+Node: User-defined645029
+Node: Definition Syntax645849
+Ref: Definition Syntax-Footnote-1651677
+Node: Function Example651754
+Ref: Function Example-Footnote-1654733
+Node: Function Calling654755
+Node: Calling A Function655349
+Node: Variable Scope656319
+Node: Pass By Value/Reference659373
+Node: Function Caveats662105
+Ref: Function Caveats-Footnote-1664200
+Node: Return Statement664324
+Node: Dynamic Typing667379
+Node: Indirect Calls668335
+Node: Functions Summary679494
+Node: Library Functions682271
+Ref: Library Functions-Footnote-1685819
+Ref: Library Functions-Footnote-2685962
+Node: Library Names686137
+Ref: Library Names-Footnote-1689931
+Ref: Library Names-Footnote-2690158
+Node: General Functions690254
+Node: Strtonum Function691448
+Node: Assert Function694530
+Node: Round Function697982
+Node: Cliff Random Function699560
+Node: Ordinal Functions700593
+Ref: Ordinal Functions-Footnote-1703702
+Ref: Ordinal Functions-Footnote-2703954
+Node: Join Function704168
+Ref: Join Function-Footnote-1705971
+Node: Getlocaltime Function706175
+Node: Readfile Function709949
+Node: Shell Quoting711978
+Node: Isnumeric Function713434
+Node: Data File Management714846
+Node: Filetrans Function715478
+Node: Rewind Function719772
+Node: File Checking721751
+Ref: File Checking-Footnote-1723123
+Node: Empty Files723330
+Node: Ignoring Assigns725397
+Node: Getopt Function726971
+Ref: Getopt Function-Footnote-1742805
+Node: Passwd Functions743017
+Ref: Passwd Functions-Footnote-1752199
+Node: Group Functions752287
+Ref: Group Functions-Footnote-1760425
+Node: Walking Arrays760638
+Node: Library Functions Summary763686
+Node: Library Exercises765110
+Node: Sample Programs765597
+Node: Running Examples766379
+Node: Clones767131
+Node: Cut Program768403
+Node: Egrep Program778844
+Node: Id Program788161
+Node: Split Program798275
+Ref: Split Program-Footnote-1808510
+Node: Tee Program808697
+Node: Uniq Program811606
+Node: Wc Program819471
+Node: Bytes vs. Characters819866
+Node: Using extensions821468
+Node: wc program822248
+Node: Miscellaneous Programs827254
+Node: Dupword Program828483
+Node: Alarm Program830546
+Node: Translate Program835459
+Ref: Translate Program-Footnote-1840200
+Node: Labels Program840478
+Ref: Labels Program-Footnote-1843919
+Node: Word Sorting844011
+Node: History Sorting848205
+Node: Extract Program850480
+Node: Simple Sed858749
+Node: Igawk Program861965
+Ref: Igawk Program-Footnote-1877212
+Ref: Igawk Program-Footnote-2877418
+Ref: Igawk Program-Footnote-3877548
+Node: Anagram Program877675
+Node: Signature Program880771
+Node: Programs Summary882023
+Node: Programs Exercises883281
+Ref: Programs Exercises-Footnote-1887597
+Node: Advanced Features887683
+Node: Nondecimal Data890177
+Node: Boolean Typed Values891807
+Node: Array Sorting893782
+Node: Controlling Array Traversal894511
+Ref: Controlling Array Traversal-Footnote-1903018
+Node: Array Sorting Functions903140
+Ref: Array Sorting Functions-Footnote-1909259
+Node: Two-way I/O909467
+Ref: Two-way I/O-Footnote-1917462
+Ref: Two-way I/O-Footnote-2917653
+Node: TCP/IP Networking917735
+Node: Profiling920915
+Node: Persistent Memory930625
+Ref: Persistent Memory-Footnote-1939583
+Node: Extension Philosophy939714
+Node: Advanced Features Summary941249
+Node: Internationalization943519
+Node: I18N and L10N945225
+Node: Explaining gettext945920
+Ref: Explaining gettext-Footnote-1952073
+Ref: Explaining gettext-Footnote-2952268
+Node: Programmer i18n952433
+Ref: Programmer i18n-Footnote-1957546
+Node: Translator i18n957595
+Node: String Extraction958431
+Ref: String Extraction-Footnote-1959609
+Node: Printf Ordering959707
+Ref: Printf Ordering-Footnote-1962569
+Node: I18N Portability962637
+Ref: I18N Portability-Footnote-1965211
+Node: I18N Example965282
+Ref: I18N Example-Footnote-1968682
+Ref: I18N Example-Footnote-2968758
+Node: Gawk I18N968875
+Node: I18N Summary969531
+Node: Debugger970932
+Node: Debugging971956
+Node: Debugging Concepts972405
+Node: Debugging Terms974231
+Node: Awk Debugging976844
+Ref: Awk Debugging-Footnote-1977821
+Node: Sample Debugging Session977961
+Node: Debugger Invocation978513
+Node: Finding The Bug980142
+Node: List of Debugger Commands986828
+Node: Breakpoint Control988205
+Node: Debugger Execution Control992037
+Node: Viewing And Changing Data995517
+Node: Execution Stack999255
+Node: Debugger Info1000936
+Node: Miscellaneous Debugger Commands1005235
+Node: Readline Support1010488
+Node: Limitations1011434
+Node: Debugging Summary1014078
+Node: Namespaces1015381
+Node: Global Namespace1016508
+Node: Qualified Names1017953
+Node: Default Namespace1018988
+Node: Changing The Namespace1019763
+Node: Naming Rules1021457
+Node: Internal Name Management1023372
+Node: Namespace Example1024442
+Node: Namespace And Features1027025
+Node: Namespace Summary1028482
+Node: Arbitrary Precision Arithmetic1029995
+Node: Computer Arithmetic1031514
+Ref: table-numeric-ranges1035331
+Ref: table-floating-point-ranges1035829
+Ref: Computer Arithmetic-Footnote-11036488
+Node: Math Definitions1036547
+Ref: table-ieee-formats1039592
+Node: MPFR features1040166
+Node: MPFR On Parole1040619
+Ref: MPFR On Parole-Footnote-11041463
+Node: MPFR Intro1041622
+Node: FP Math Caution1043312
+Ref: FP Math Caution-Footnote-11044386
+Node: Inexactness of computations1044763
+Node: Inexact representation1045794
+Node: Comparing FP Values1047177
+Node: Errors accumulate1048435
+Node: Strange values1049902
+Ref: Strange values-Footnote-11052568
+Node: Getting Accuracy1052673
+Node: Try To Round1055410
+Node: Setting precision1056317
+Ref: table-predefined-precision-strings1057022
+Node: Setting the rounding mode1058907
+Ref: table-gawk-rounding-modes1059289
+Ref: Setting the rounding mode-Footnote-11063347
+Node: Arbitrary Precision Integers1063530
+Ref: Arbitrary Precision Integers-Footnote-11066742
+Node: Checking for MPFR1066898
+Node: POSIX Floating Point Problems1068388
+Ref: POSIX Floating Point Problems-Footnote-11073252
+Node: Floating point summary1073290
+Node: Dynamic Extensions1075554
+Node: Extension Intro1077153
+Node: Plugin License1078461
+Node: Extension Mechanism Outline1079274
+Ref: figure-load-extension1079725
+Ref: figure-register-new-function1081305
+Ref: figure-call-new-function1082410
+Node: Extension API Description1084529
+Node: Extension API Functions Introduction1086258
+Ref: table-api-std-headers1088156
+Node: General Data Types1092620
+Ref: General Data Types-Footnote-11101788
+Node: Memory Allocation Functions1102103
+Ref: Memory Allocation Functions-Footnote-11106828
+Node: Constructor Functions1106927
+Node: API Ownership of MPFR and GMP Values1110832
+Node: Registration Functions1112393
+Node: Extension Functions1113097
+Node: Exit Callback Functions1118673
+Node: Extension Version String1119992
+Node: Input Parsers1120687
+Node: Output Wrappers1134179
+Node: Two-way processors1138887
+Node: Printing Messages1141248
+Ref: Printing Messages-Footnote-11142462
+Node: Updating ERRNO1142617
+Node: Requesting Values1143416
+Ref: table-value-types-returned1144169
+Node: Accessing Parameters1145278
+Node: Symbol Table Access1146562
+Node: Symbol table by name1147078
+Ref: Symbol table by name-Footnote-11150289
+Node: Symbol table by cookie1150421
+Ref: Symbol table by cookie-Footnote-11154702
+Node: Cached values1154766
+Ref: Cached values-Footnote-11158410
+Node: Array Manipulation1158567
+Ref: Array Manipulation-Footnote-11159670
+Node: Array Data Types1159707
+Ref: Array Data Types-Footnote-11162529
+Node: Array Functions1162629
+Node: Flattening Arrays1167658
+Node: Creating Arrays1174710
+Node: Redirection API1179560
+Node: Extension API Variables1182581
+Node: Extension Versioning1183306
+Ref: gawk-api-version1183743
+Node: Extension GMP/MPFR Versioning1185531
+Node: Extension API Informational Variables1187237
+Node: Extension API Boilerplate1188398
+Node: Changes from API V11192534
+Node: Finding Extensions1194168
+Node: Extension Example1194743
+Node: Internal File Description1195567
+Node: Internal File Ops1199891
+Ref: Internal File Ops-Footnote-11211449
+Node: Using Internal File Ops1211597
+Ref: Using Internal File Ops-Footnote-11214028
+Node: Extension Samples1214306
+Node: Extension Sample File Functions1215875
+Node: Extension Sample Fnmatch1224013
+Node: Extension Sample Fork1225608
+Node: Extension Sample Inplace1226884
+Node: Extension Sample Ord1230556
+Node: Extension Sample Readdir1231432
+Ref: table-readdir-file-types1232329
+Node: Extension Sample Revout1233467
+Node: Extension Sample Rev2way1234064
+Node: Extension Sample Read write array1234816
+Node: Extension Sample Readfile1238090
+Node: Extension Sample Time1239221
+Node: Extension Sample API Tests1241511
+Node: gawkextlib1242019
+Node: Extension summary1245055
+Node: Extension Exercises1248913
+Node: Language History1250191
+Node: V7/SVR3.11251905
+Node: SVR41254255
+Node: POSIX1255787
+Node: BTL1257212
+Node: POSIX/GNU1257981
+Node: Feature History1264512
+Node: Common Extensions1283630
+Node: Ranges and Locales1284999
+Ref: Ranges and Locales-Footnote-11289800
+Ref: Ranges and Locales-Footnote-21289827
+Ref: Ranges and Locales-Footnote-31290066
+Node: Contributors1290289
+Node: History summary1296494
+Node: Installation1297940
+Node: Gawk Distribution1298904
+Node: Getting1299396
+Node: Extracting1300395
+Node: Distribution contents1302107
+Node: Unix Installation1310187
+Node: Quick Installation1311009
+Node: Compiling with MPFR1313555
+Node: Shell Startup Files1314261
+Node: Additional Configuration Options1315418
+Node: Configuration Philosophy1317805
+Node: Compiling from Git1320307
+Node: Building the Documentation1320866
+Node: Non-Unix Installation1322278
+Node: PC Installation1322754
+Node: PC Binary Installation1323627
+Node: PC Compiling1324532
+Node: PC Using1325710
+Node: Cygwin1329438
+Node: MSYS1330694
+Node: OpenVMS Installation1331326
+Node: OpenVMS Compilation1332007
+Ref: OpenVMS Compilation-Footnote-11333490
+Node: OpenVMS Dynamic Extensions1333552
+Node: OpenVMS Installation Details1335188
+Node: OpenVMS Running1337623
+Node: OpenVMS GNV1341760
+Node: Bugs1342515
+Node: Bug definition1343439
+Node: Bug address1347090
+Node: Usenet1350681
+Node: Performance bugs1351912
+Node: Asking for help1354930
+Node: Maintainers1356921
+Node: Other Versions1357948
+Node: Installation summary1366880
+Node: Notes1368264
+Node: Compatibility Mode1369074
+Node: Additions1369896
+Node: Accessing The Source1370841
+Node: Adding Code1372376
+Node: New Ports1379512
+Node: Derived Files1384022
+Ref: Derived Files-Footnote-11389869
+Ref: Derived Files-Footnote-21389904
+Ref: Derived Files-Footnote-31390521
+Node: Future Extensions1390635
+Node: Implementation Limitations1391307
+Node: Extension Design1392549
+Node: Old Extension Problems1393713
+Ref: Old Extension Problems-Footnote-11395289
+Node: Extension New Mechanism Goals1395350
+Ref: Extension New Mechanism Goals-Footnote-11398846
+Node: Extension Other Design Decisions1399047
+Node: Extension Future Growth1401246
+Node: Notes summary1401870
+Node: Basic Concepts1403083
+Node: Basic High Level1403768
+Ref: figure-general-flow1404050
+Ref: figure-process-flow1404752
+Ref: Basic High Level-Footnote-11408148
+Node: Basic Data Typing1408337
+Node: Glossary1411755
+Node: Copying1444877
+Node: GNU Free Documentation License1482638
+Node: Index1507961
 
 End Tag Table
 
diff --git a/doc/gawk.texi b/doc/gawk.texi
index 98afef70..b49670a6 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -5156,6 +5156,10 @@ 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 @code{@@include} directive and the @option{-i}/@option{--include}
+command line option are completely equivalent. An included program
+source is not loaded if it has been previously loaded.
+
 The rules for finding a source file described in @ref{AWKPATH Variable} also
 apply to files loaded with @code{@@include}.
 
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 54187483..3e448340 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -5022,6 +5022,10 @@ 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 @code{@@include} directive and the @option{-i}/@option{--include}
+command line option are completely equivalent. An included program
+source is not loaded if it has been previously loaded.
+
 The rules for finding a source file described in @ref{AWKPATH Variable} also
 apply to files loaded with @code{@@include}.
 

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=2e2263c3c04a13463be1fbd13a392962f00234b2

commit 2e2263c3c04a13463be1fbd13a392962f00234b2
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Mon Feb 27 21:05:44 2023 +0200

    Small improvement in gawkmisc.c.

diff --git a/ChangeLog b/ChangeLog
index 5885061a..c214a6ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2023-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * gawkmisc.c: Use #elif. Update copyright year.
+
 2023-02-26         Arnold D. Robbins     <arnold@skeeve.com>
 
        * Multiple files: Remove trailing whitespace.
@@ -250,7 +254,7 @@
        Emanuel Attila Czirai <corre.a.buscar@gmail.com> for the report,
        and to Jan Alexander Steffens (heftig)" <heftig@archlinux.org>
        for the fix.
-       
+
 2022-09-04         Arnold D. Robbins     <arnold@skeeve.com>
 
        * 5.2.0: Release tar ball made.
@@ -728,7 +732,7 @@
        * gawkapi.c (awk_value_to_node): Clear the GMP/MPFR values
        returned from the C extension after setting the internal
        variable.
-       
+
 2022-02-22         Arnold D. Robbins     <arnold@skeeve.com>
 
        Enable interval expressions even for --traditional, as BWK
@@ -1496,7 +1500,7 @@
        * NEWS: Updated.
 
 2020-07-10         Arnold D. Robbins     <arnold@skeeve.com>
-       
+
        Fix printf issues. Thanks to Michal Jaegermann for the report.
 
        * cint_array.c (cint_dump): Fix printf formats.
@@ -1852,7 +1856,7 @@
 
 2020-01-14         Andrew J. Schorr      <aschorr@telemetry-investments.com>
 
-       * cint_array.c (cint_array_init): Fix off-by-one error in array 
+       * cint_array.c (cint_array_init): Fix off-by-one error in array
        bounds overflow check for an NHAT value set in the environment.
        Thanks to Michael Builov <mbuilov@gmail.com> for the report.
 
@@ -2206,7 +2210,7 @@
        * awkgram.y (errcount): No longer static.
        * command.y (dbg_errcount): Renamed from errcount.
        * main.c (catchsig, catchsegv): If errcount > 0, just exit,
-       don't abort.  
+       don't abort.
 
 2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
 
diff --git a/gawkmisc.c b/gawkmisc.c
index 88a87612..447210cb 100644
--- a/gawkmisc.c
+++ b/gawkmisc.c
@@ -3,7 +3,7 @@
  */
 
 /*
- * Copyright (C) 1986, 1988, 1989, 1991-2004, 2010, 2011, 2017, 2022,
+ * Copyright (C) 1986, 1988, 1989, 1991-2004, 2010, 2011, 2017, 2022, 2023,
  * the Free Software Foundation, Inc.
  *
  * This file is part of GAWK, the GNU implementation of the
@@ -30,14 +30,10 @@
 #include <fcntl.h>
 #endif
 
-/* some old compilers don't grok #elif. sigh */
-
 #if defined(__MINGW32__)
 #include "pc/gawkmisc.pc"
-#else /* not __MINGW32__ */
-#if defined(VMS)
+#elif defined(VMS)
 #include "vms/gawkmisc.vms"
-#else /* not VMS */
+#else /* posix */
 #include "posix/gawkmisc.c"
-#endif /* not VMS */
-#endif /* not __MINGW32__ */
+#endif

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

Summary of changes:
 ChangeLog           |   32 +-
 NEWS                |    6 +-
 awk.h               |    1 +
 awkgram.c           |   29 +-
 awkgram.y           |   29 +-
 configh.in          |    3 +
 configure           |    6 +
 configure.ac        |    1 +
 doc/ChangeLog       |    7 +
 doc/gawk.info       | 1134 ++++++++++++++++++++++++++-------------------------
 doc/gawk.texi       |   14 +
 doc/gawktexi.in     |   14 +
 eval.c              |    1 +
 extension/ChangeLog |    5 +
 extension/readdir.c |    2 +-
 gawkmisc.c          |   12 +-
 interpret.h         |    5 +
 io.c                |   17 +-
 profile.c           |   19 +-
 19 files changed, 716 insertions(+), 621 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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