From 7c759ec96a0e5f6fac405e67e2b7299c0ac0a867 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Thu, 29 Nov 2018 21:39:47 +0200 Subject: Disable writing to arbitrary elements of SYMTAB. --- NEWS | 3 +++ doc/ChangeLog | 6 ++++++ doc/gawk.1 | 5 +++-- doc/gawktexi.in | 8 ++++---- interpret.h | 32 +++++++++++++++++++------------- test/Makefile.am | 3 +-- test/Makefile.in | 3 +-- test/symtab6.ok | 30 ++---------------------------- test/symtab7.ok | 4 ++-- 9 files changed, 41 insertions(+), 53 deletions(-) diff --git a/NEWS b/NEWS index a25c30d7..b543b0fe 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,9 @@ Changes from 4.2.x to 5.0.0 4. PROCINFO["platform"] yields a string indicating the platform for which gawk was compiled. +5. Writing to elements of SYMTAB that are not variable names now + causes a fatal error. + Changes from 4.2.1 to 4.2.2 --------------------------- diff --git a/doc/ChangeLog b/doc/ChangeLog index f31aae7f..261388a2 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,9 @@ +2018-11-29 Arnold D. Robbins + + * gawktexi.in (Auto-set): Document that you can no longer use + arbitrary indices in SYMTAB. + * gawk.1: Ditto. + 2018-11-27 Arnold D. Robbins * gawktexi.in (Other Versions): Document GoAWK, an awk interpreter diff --git a/doc/gawk.1 b/doc/gawk.1 index 5caff79b..4964cb3d 100644 --- a/doc/gawk.1 +++ b/doc/gawk.1 @@ -13,7 +13,7 @@ . if \w'\(rq' .ds rq "\(rq . \} .\} -.TH GAWK 1 "Nov 26 2018" "Free Software Foundation" "Utility Commands" +.TH GAWK 1 "Nov 29 2018" "Free Software Foundation" "Utility Commands" .SH NAME gawk \- pattern scanning and processing language .SH SYNOPSIS @@ -1425,7 +1425,8 @@ You may not use the .B delete statement with the .B SYMTAB -array. +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 diff --git a/doc/gawktexi.in b/doc/gawktexi.in index 9a21913b..cc667534 100644 --- a/doc/gawktexi.in +++ b/doc/gawktexi.in @@ -15253,7 +15253,8 @@ if an element in @code{SYMTAB} is an array. Also, you may not use the @code{delete} statement with the @code{SYMTAB} array. -You may use an index for @code{SYMTAB} that is not a predefined identifier: +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 @@ -15261,9 +15262,8 @@ print SYMTAB["xxx"] @end example @noindent -This works as expected: in this case @code{SYMTAB} acts just like -a regular array. The only difference is that you can't then delete -@code{SYMTAB["xxx"]}. +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 diff --git a/interpret.h b/interpret.h index 4381a929..6a1a08b4 100644 --- a/interpret.h +++ b/interpret.h @@ -348,16 +348,19 @@ uninitialized_scalar: * 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 just us the value we got from assoc_lookup(), above. + * 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 - && ( (*lhs)->type == Node_var + 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 */ + 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); @@ -658,22 +661,25 @@ mod: /* * Changing something in FUNCTAB is not allowed. * - * SYMTAB is a little more messy. Three kinds of values may - * be stored in SYMTAB: + * 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 just us the value we got from assoc_lookup(), above. + * 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 - && ( (*lhs)->type == Node_var + else if (t1 == symbol_table) { + if (( (*lhs)->type == Node_var || (*lhs)->type == Node_var_new)) { - (*lhs)->type = Node_var; /* in case was Node_var_new */ - lhs = & ((*lhs)->var_value); /* extra level of indirection */ + 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); diff --git a/test/Makefile.am b/test/Makefile.am index e1ecc649..a44a1944 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2101,8 +2101,7 @@ charasbytes: symtab6: @echo $@ - @$(AWK) -d__$@ -f "$(srcdir)"/$@.awk - @grep -v '^ENVIRON' __$@ | grep -v '^PROCINFO' > _$@ ; rm __$@ + @$(AWK) -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ symtab8: diff --git a/test/Makefile.in b/test/Makefile.in index 1e3fe2ee..4c195884 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -2549,8 +2549,7 @@ charasbytes: symtab6: @echo $@ - @$(AWK) -d__$@ -f "$(srcdir)"/$@.awk - @grep -v '^ENVIRON' __$@ | grep -v '^PROCINFO' > _$@ ; rm __$@ + @$(AWK) -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ symtab8: diff --git a/test/symtab6.ok b/test/symtab6.ok index 7de717a0..23a1633d 100644 --- a/test/symtab6.ok +++ b/test/symtab6.ok @@ -1,28 +1,2 @@ -ARGC: 1 -ARGIND: 0 -ARGV: array, 1 elements -BINMODE: 0 -CONVFMT: "%.6g" -ERRNO: "" -FIELDWIDTHS: "" -FILENAME: "" -FNR: 0 -FPAT: "[^[:space:]]+" -FS: " " -FUNCTAB: array, 41 elements -IGNORECASE: 0 -LINT: 0 -NF: 0 -NR: 0 -OFMT: "%.6g" -OFS: " " -ORS: "\n" -PREC: 53 -RLENGTH: 0 -ROUNDMODE: "N" -RS: "\n" -RSTART: 0 -RT: "" -SUBSEP: "\034" -SYMTAB: array, 29 elements -TEXTDOMAIN: "messages" +gawk: ./symtab6.awk:1: fatal: cannot assign to arbitrary elements of SYMTAB +EXIT CODE: 2 diff --git a/test/symtab7.ok b/test/symtab7.ok index 28328831..37de1a49 100644 --- a/test/symtab7.ok +++ b/test/symtab7.ok @@ -1,2 +1,2 @@ -30 -40 +gawk: symtab7.awk:4: (FILENAME=- FNR=1) fatal: cannot assign to arbitrary elements of SYMTAB +EXIT CODE: 2 -- cgit v1.2.1 From 68ba43d9c7604d8544834dadc6f549af45d8992c Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Thu, 29 Nov 2018 21:40:23 +0200 Subject: And add doc. --- doc/gawk.info | 747 +++++++++++++++++++++++++++++----------------------------- doc/gawk.texi | 8 +- 2 files changed, 377 insertions(+), 378 deletions(-) diff --git a/doc/gawk.info b/doc/gawk.info index 561a40f6..60713f8f 100644 --- a/doc/gawk.info +++ b/doc/gawk.info @@ -11190,15 +11190,14 @@ they are not special: test if an element in 'SYMTAB' is an array. Also, you may not use the 'delete' statement with the 'SYMTAB' array. - You may use an index for 'SYMTAB' that is not a predefined - identifier: + Prior to version 5.0 of 'gawk', you could use an index for 'SYMTAB' + that was not a predefined identifier: SYMTAB["xxx"] = 5 print SYMTAB["xxx"] - This works as expected: in this case 'SYMTAB' acts just like a - regular array. The only difference is that you can't then delete - 'SYMTAB["xxx"]'. + This no longer works, instead producing a fatal error, as it led to + rampant confusion. The 'SYMTAB' array is more interesting than it looks. Andrew Schorr points out that it effectively gives 'awk' data pointers. @@ -33916,7 +33915,7 @@ Index * dark corner, field separators: Full Line Fields. (line 22) * dark corner, FILENAME variable: Getline Notes. (line 19) * dark corner, FILENAME variable <1>: Auto-set. (line 108) -* dark corner, FNR/NR variables: Auto-set. (line 410) +* dark corner, FNR/NR variables: Auto-set. (line 409) * dark corner, format-control characters: Control Letters. (line 33) * dark corner, format-control characters <1>: Control Letters. (line 108) @@ -34484,7 +34483,7 @@ Index (line 12) * FNR variable: Records. (line 6) * FNR variable <1>: Auto-set. (line 118) -* FNR variable, changing: Auto-set. (line 410) +* FNR variable, changing: Auto-set. (line 409) * for statement: For Statement. (line 6) * for statement, looping over arrays: Scanning an Array. (line 20) * fork() extension function: Extension Sample Fork. @@ -35142,7 +35141,7 @@ Index * not Boolean-logic operator: Boolean Ops. (line 6) * NR variable: Records. (line 6) * NR variable <1>: Auto-set. (line 143) -* NR variable, changing: Auto-set. (line 410) +* NR variable, changing: Auto-set. (line 409) * null strings: awk split records. (line 121) * null strings <1>: Regexp Field Splitting. (line 43) @@ -35660,7 +35659,7 @@ Index * scanning arrays: Scanning an Array. (line 6) * scanning multidimensional arrays: Multiscanning. (line 11) * Schorr, Andrew: Acknowledgments. (line 60) -* Schorr, Andrew <1>: Auto-set. (line 380) +* Schorr, Andrew <1>: Auto-set. (line 379) * Schorr, Andrew <2>: Contributors. (line 136) * Schreiber, Bert: Acknowledgments. (line 38) * Schreiber, Rita: Acknowledgments. (line 38) @@ -35746,7 +35745,7 @@ Index * sidebar, Beware The Smoke and Mirrors!: Bitwise Functions. (line 127) * sidebar, Changing FS Does Not Affect the Fields: Full Line Fields. (line 14) -* sidebar, Changing NR and FNR: Auto-set. (line 408) +* sidebar, Changing NR and FNR: Auto-set. (line 407) * sidebar, Controlling Output Buffering with system(): I/O Functions. (line 166) * sidebar, Escape Sequences for Metacharacters: Escape Sequences. @@ -36380,369 +36379,369 @@ Node: Exit Statement454653 Node: Built-in Variables457056 Node: User-modified458189 Node: Auto-set465956 -Ref: Auto-set-Footnote-1482792 -Ref: Auto-set-Footnote-2482998 -Node: ARGC and ARGV483054 -Node: Pattern Action Summary487267 -Node: Arrays489697 -Node: Array Basics491026 -Node: Array Intro491870 -Ref: figure-array-elements493845 -Ref: Array Intro-Footnote-1496549 -Node: Reference to Elements496677 -Node: Assigning Elements499141 -Node: Array Example499632 -Node: Scanning an Array501391 -Node: Controlling Scanning504413 -Ref: Controlling Scanning-Footnote-1509812 -Node: Numeric Array Subscripts510128 -Node: Uninitialized Subscripts512312 -Node: Delete513931 -Ref: Delete-Footnote-1516683 -Node: Multidimensional516740 -Node: Multiscanning519835 -Node: Arrays of Arrays521426 -Node: Arrays Summary526194 -Node: Functions528287 -Node: Built-in529325 -Node: Calling Built-in530406 -Node: Numeric Functions532402 -Ref: Numeric Functions-Footnote-1536430 -Ref: Numeric Functions-Footnote-2536787 -Ref: Numeric Functions-Footnote-3536835 -Node: String Functions537107 -Ref: String Functions-Footnote-1560965 -Ref: String Functions-Footnote-2561093 -Ref: String Functions-Footnote-3561341 -Node: Gory Details561428 -Ref: table-sub-escapes563219 -Ref: table-sub-proposed564738 -Ref: table-posix-sub566101 -Ref: table-gensub-escapes567642 -Ref: Gory Details-Footnote-1568465 -Node: I/O Functions568619 -Ref: table-system-return-values575087 -Ref: I/O Functions-Footnote-1577167 -Ref: I/O Functions-Footnote-2577315 -Node: Time Functions577435 -Ref: Time Functions-Footnote-1588106 -Ref: Time Functions-Footnote-2588174 -Ref: Time Functions-Footnote-3588332 -Ref: Time Functions-Footnote-4588443 -Ref: Time Functions-Footnote-5588555 -Ref: Time Functions-Footnote-6588782 -Node: Bitwise Functions589048 -Ref: table-bitwise-ops589642 -Ref: Bitwise Functions-Footnote-1595705 -Ref: Bitwise Functions-Footnote-2595878 -Node: Type Functions596069 -Node: I18N Functions598820 -Node: User-defined600471 -Node: Definition Syntax601276 -Ref: Definition Syntax-Footnote-1606963 -Node: Function Example607034 -Ref: Function Example-Footnote-1609956 -Node: Function Caveats609978 -Node: Calling A Function610496 -Node: Variable Scope611454 -Node: Pass By Value/Reference614448 -Node: Return Statement617947 -Node: Dynamic Typing620926 -Node: Indirect Calls621856 -Ref: Indirect Calls-Footnote-1632108 -Node: Functions Summary632236 -Node: Library Functions634941 -Ref: Library Functions-Footnote-1638548 -Ref: Library Functions-Footnote-2638691 -Node: Library Names638862 -Ref: Library Names-Footnote-1642322 -Ref: Library Names-Footnote-2642545 -Node: General Functions642631 -Node: Strtonum Function643734 -Node: Assert Function646756 -Node: Round Function650082 -Node: Cliff Random Function651622 -Node: Ordinal Functions652638 -Ref: Ordinal Functions-Footnote-1655701 -Ref: Ordinal Functions-Footnote-2655953 -Node: Join Function656163 -Ref: Join Function-Footnote-1657933 -Node: Getlocaltime Function658133 -Node: Readfile Function661875 -Node: Shell Quoting663852 -Node: Data File Management665253 -Node: Filetrans Function665885 -Node: Rewind Function669981 -Node: File Checking671891 -Ref: File Checking-Footnote-1673225 -Node: Empty Files673426 -Node: Ignoring Assigns675405 -Node: Getopt Function676955 -Ref: Getopt Function-Footnote-1688424 -Node: Passwd Functions688624 -Ref: Passwd Functions-Footnote-1697463 -Node: Group Functions697551 -Ref: Group Functions-Footnote-1705449 -Node: Walking Arrays705656 -Node: Library Functions Summary708664 -Node: Library Exercises710070 -Node: Sample Programs710535 -Node: Running Examples711305 -Node: Clones712033 -Node: Cut Program713257 -Node: Egrep Program723186 -Ref: Egrep Program-Footnote-1730698 -Node: Id Program730808 -Node: Split Program734488 -Ref: Split Program-Footnote-1737946 -Node: Tee Program738075 -Node: Uniq Program740865 -Node: Wc Program748291 -Ref: Wc Program-Footnote-1752546 -Node: Miscellaneous Programs752640 -Node: Dupword Program753853 -Node: Alarm Program755883 -Node: Translate Program760738 -Ref: Translate Program-Footnote-1765303 -Node: Labels Program765573 -Ref: Labels Program-Footnote-1768924 -Node: Word Sorting769008 -Node: History Sorting773080 -Node: Extract Program774915 -Node: Simple Sed782969 -Node: Igawk Program786043 -Ref: Igawk Program-Footnote-1800374 -Ref: Igawk Program-Footnote-2800576 -Ref: Igawk Program-Footnote-3800698 -Node: Anagram Program800813 -Node: Signature Program803875 -Node: Programs Summary805122 -Node: Programs Exercises806336 -Ref: Programs Exercises-Footnote-1810465 -Node: Advanced Features810556 -Node: Nondecimal Data812546 -Node: Array Sorting814137 -Node: Controlling Array Traversal814837 -Ref: Controlling Array Traversal-Footnote-1823205 -Node: Array Sorting Functions823323 -Ref: Array Sorting Functions-Footnote-1828414 -Node: Two-way I/O828610 -Ref: Two-way I/O-Footnote-1836330 -Ref: Two-way I/O-Footnote-2836517 -Node: TCP/IP Networking836599 -Node: Profiling839717 -Ref: Profiling-Footnote-1848389 -Node: Advanced Features Summary848712 -Node: Internationalization850556 -Node: I18N and L10N852036 -Node: Explaining gettext852723 -Ref: Explaining gettext-Footnote-1858615 -Ref: Explaining gettext-Footnote-2858800 -Node: Programmer i18n858965 -Ref: Programmer i18n-Footnote-1863914 -Node: Translator i18n863963 -Node: String Extraction864757 -Ref: String Extraction-Footnote-1865889 -Node: Printf Ordering865975 -Ref: Printf Ordering-Footnote-1868761 -Node: I18N Portability868825 -Ref: I18N Portability-Footnote-1871281 -Node: I18N Example871344 -Ref: I18N Example-Footnote-1874150 -Node: Gawk I18N874223 -Node: I18N Summary874868 -Node: Debugger876209 -Node: Debugging877232 -Node: Debugging Concepts877673 -Node: Debugging Terms879482 -Node: Awk Debugging882057 -Node: Sample Debugging Session882963 -Node: Debugger Invocation883497 -Node: Finding The Bug884883 -Node: List of Debugger Commands891361 -Node: Breakpoint Control892694 -Node: Debugger Execution Control896388 -Node: Viewing And Changing Data899750 -Node: Execution Stack903124 -Node: Debugger Info904761 -Node: Miscellaneous Debugger Commands908832 -Node: Readline Support913894 -Node: Limitations914790 -Node: Debugging Summary916899 -Node: Arbitrary Precision Arithmetic918178 -Node: Computer Arithmetic919663 -Ref: table-numeric-ranges923429 -Ref: table-floating-point-ranges923922 -Ref: Computer Arithmetic-Footnote-1924580 -Node: Math Definitions924637 -Ref: table-ieee-formats927953 -Ref: Math Definitions-Footnote-1928556 -Node: MPFR features928661 -Node: FP Math Caution930379 -Ref: FP Math Caution-Footnote-1931451 -Node: Inexactness of computations931820 -Node: Inexact representation932780 -Node: Comparing FP Values934140 -Node: Errors accumulate935381 -Node: Getting Accuracy936814 -Node: Try To Round939524 -Node: Setting precision940423 -Ref: table-predefined-precision-strings941120 -Node: Setting the rounding mode942950 -Ref: table-gawk-rounding-modes943324 -Ref: Setting the rounding mode-Footnote-1947255 -Node: Arbitrary Precision Integers947434 -Ref: Arbitrary Precision Integers-Footnote-1950609 -Node: Checking for MPFR950758 -Node: POSIX Floating Point Problems952232 -Ref: POSIX Floating Point Problems-Footnote-1956517 -Node: Floating point summary956555 -Node: Dynamic Extensions958745 -Node: Extension Intro960298 -Node: Plugin License961564 -Node: Extension Mechanism Outline962361 -Ref: figure-load-extension962800 -Ref: figure-register-new-function964365 -Ref: figure-call-new-function965457 -Node: Extension API Description967519 -Node: Extension API Functions Introduction969161 -Node: General Data Types974701 -Ref: General Data Types-Footnote-1983062 -Node: Memory Allocation Functions983361 -Ref: Memory Allocation Functions-Footnote-1987571 -Node: Constructor Functions987670 -Node: Registration Functions991256 -Node: Extension Functions991941 -Node: Exit Callback Functions997156 -Node: Extension Version String998406 -Node: Input Parsers999069 -Node: Output Wrappers1011790 -Node: Two-way processors1016302 -Node: Printing Messages1018567 -Ref: Printing Messages-Footnote-11019738 -Node: Updating ERRNO1019891 -Node: Requesting Values1020630 -Ref: table-value-types-returned1021367 -Node: Accessing Parameters1022303 -Node: Symbol Table Access1023538 -Node: Symbol table by name1024050 -Node: Symbol table by cookie1025839 -Ref: Symbol table by cookie-Footnote-11030024 -Node: Cached values1030088 -Ref: Cached values-Footnote-11033624 -Node: Array Manipulation1033777 -Ref: Array Manipulation-Footnote-11034868 -Node: Array Data Types1034905 -Ref: Array Data Types-Footnote-11037563 -Node: Array Functions1037655 -Node: Flattening Arrays1042153 -Node: Creating Arrays1049129 -Node: Redirection API1053896 -Node: Extension API Variables1056729 -Node: Extension Versioning1057440 -Ref: gawk-api-version1057869 -Node: Extension GMP/MPFR Versioning1059600 -Node: Extension API Informational Variables1061228 -Node: Extension API Boilerplate1062301 -Node: Changes from API V11066275 -Node: Finding Extensions1067847 -Node: Extension Example1068406 -Node: Internal File Description1069204 -Node: Internal File Ops1073284 -Ref: Internal File Ops-Footnote-11084634 -Node: Using Internal File Ops1084774 -Ref: Using Internal File Ops-Footnote-11087157 -Node: Extension Samples1087431 -Node: Extension Sample File Functions1088960 -Node: Extension Sample Fnmatch1096609 -Node: Extension Sample Fork1098096 -Node: Extension Sample Inplace1099314 -Node: Extension Sample Ord1102531 -Node: Extension Sample Readdir1103367 -Ref: table-readdir-file-types1104256 -Node: Extension Sample Revout1105061 -Node: Extension Sample Rev2way1105650 -Node: Extension Sample Read write array1106390 -Node: Extension Sample Readfile1108332 -Node: Extension Sample Time1109427 -Node: Extension Sample API Tests1110775 -Node: gawkextlib1111267 -Node: Extension summary1114185 -Node: Extension Exercises1117887 -Node: Language History1119385 -Node: V7/SVR3.11121041 -Node: SVR41123193 -Node: POSIX1124627 -Node: BTL1126007 -Node: POSIX/GNU1126736 -Node: Feature History1132514 -Node: Common Extensions1148560 -Node: Ranges and Locales1149843 -Ref: Ranges and Locales-Footnote-11154459 -Ref: Ranges and Locales-Footnote-21154486 -Ref: Ranges and Locales-Footnote-31154721 -Node: Contributors1154942 -Node: History summary1160887 -Node: Installation1162267 -Node: Gawk Distribution1163211 -Node: Getting1163695 -Node: Extracting1164658 -Node: Distribution contents1166296 -Node: Unix Installation1172776 -Node: Quick Installation1173458 -Node: Shell Startup Files1175872 -Node: Additional Configuration Options1176961 -Node: Configuration Philosophy1179126 -Node: Non-Unix Installation1181495 -Node: PC Installation1181955 -Node: PC Binary Installation1182793 -Node: PC Compiling1183228 -Node: PC Using1184345 -Node: Cygwin1187898 -Node: MSYS1188997 -Node: VMS Installation1189498 -Node: VMS Compilation1190289 -Ref: VMS Compilation-Footnote-11191518 -Node: VMS Dynamic Extensions1191576 -Node: VMS Installation Details1193261 -Node: VMS Running1195514 -Node: VMS GNV1199793 -Node: VMS Old Gawk1200528 -Node: Bugs1200999 -Node: Bug address1201662 -Node: Usenet1204644 -Node: Maintainers1205648 -Node: Other Versions1206909 -Node: Installation summary1213823 -Node: Notes1215025 -Node: Compatibility Mode1215819 -Node: Additions1216601 -Node: Accessing The Source1217526 -Node: Adding Code1218963 -Node: New Ports1225182 -Node: Derived Files1229670 -Ref: Derived Files-Footnote-11235316 -Ref: Derived Files-Footnote-21235351 -Ref: Derived Files-Footnote-31235949 -Node: Future Extensions1236063 -Node: Implementation Limitations1236721 -Node: Extension Design1237904 -Node: Old Extension Problems1239048 -Ref: Old Extension Problems-Footnote-11240566 -Node: Extension New Mechanism Goals1240623 -Ref: Extension New Mechanism Goals-Footnote-11243987 -Node: Extension Other Design Decisions1244176 -Node: Extension Future Growth1246289 -Node: Notes summary1247125 -Node: Basic Concepts1248300 -Node: Basic High Level1248981 -Ref: figure-general-flow1249263 -Ref: figure-process-flow1249948 -Ref: Basic High Level-Footnote-11253249 -Node: Basic Data Typing1253434 -Node: Glossary1256762 -Node: Copying1288600 -Node: GNU Free Documentation License1326143 -Node: Index1351263 +Ref: Auto-set-Footnote-1482763 +Ref: Auto-set-Footnote-2482969 +Node: ARGC and ARGV483025 +Node: Pattern Action Summary487238 +Node: Arrays489668 +Node: Array Basics490997 +Node: Array Intro491841 +Ref: figure-array-elements493816 +Ref: Array Intro-Footnote-1496520 +Node: Reference to Elements496648 +Node: Assigning Elements499112 +Node: Array Example499603 +Node: Scanning an Array501362 +Node: Controlling Scanning504384 +Ref: Controlling Scanning-Footnote-1509783 +Node: Numeric Array Subscripts510099 +Node: Uninitialized Subscripts512283 +Node: Delete513902 +Ref: Delete-Footnote-1516654 +Node: Multidimensional516711 +Node: Multiscanning519806 +Node: Arrays of Arrays521397 +Node: Arrays Summary526165 +Node: Functions528258 +Node: Built-in529296 +Node: Calling Built-in530377 +Node: Numeric Functions532373 +Ref: Numeric Functions-Footnote-1536401 +Ref: Numeric Functions-Footnote-2536758 +Ref: Numeric Functions-Footnote-3536806 +Node: String Functions537078 +Ref: String Functions-Footnote-1560936 +Ref: String Functions-Footnote-2561064 +Ref: String Functions-Footnote-3561312 +Node: Gory Details561399 +Ref: table-sub-escapes563190 +Ref: table-sub-proposed564709 +Ref: table-posix-sub566072 +Ref: table-gensub-escapes567613 +Ref: Gory Details-Footnote-1568436 +Node: I/O Functions568590 +Ref: table-system-return-values575058 +Ref: I/O Functions-Footnote-1577138 +Ref: I/O Functions-Footnote-2577286 +Node: Time Functions577406 +Ref: Time Functions-Footnote-1588077 +Ref: Time Functions-Footnote-2588145 +Ref: Time Functions-Footnote-3588303 +Ref: Time Functions-Footnote-4588414 +Ref: Time Functions-Footnote-5588526 +Ref: Time Functions-Footnote-6588753 +Node: Bitwise Functions589019 +Ref: table-bitwise-ops589613 +Ref: Bitwise Functions-Footnote-1595676 +Ref: Bitwise Functions-Footnote-2595849 +Node: Type Functions596040 +Node: I18N Functions598791 +Node: User-defined600442 +Node: Definition Syntax601247 +Ref: Definition Syntax-Footnote-1606934 +Node: Function Example607005 +Ref: Function Example-Footnote-1609927 +Node: Function Caveats609949 +Node: Calling A Function610467 +Node: Variable Scope611425 +Node: Pass By Value/Reference614419 +Node: Return Statement617918 +Node: Dynamic Typing620897 +Node: Indirect Calls621827 +Ref: Indirect Calls-Footnote-1632079 +Node: Functions Summary632207 +Node: Library Functions634912 +Ref: Library Functions-Footnote-1638519 +Ref: Library Functions-Footnote-2638662 +Node: Library Names638833 +Ref: Library Names-Footnote-1642293 +Ref: Library Names-Footnote-2642516 +Node: General Functions642602 +Node: Strtonum Function643705 +Node: Assert Function646727 +Node: Round Function650053 +Node: Cliff Random Function651593 +Node: Ordinal Functions652609 +Ref: Ordinal Functions-Footnote-1655672 +Ref: Ordinal Functions-Footnote-2655924 +Node: Join Function656134 +Ref: Join Function-Footnote-1657904 +Node: Getlocaltime Function658104 +Node: Readfile Function661846 +Node: Shell Quoting663823 +Node: Data File Management665224 +Node: Filetrans Function665856 +Node: Rewind Function669952 +Node: File Checking671862 +Ref: File Checking-Footnote-1673196 +Node: Empty Files673397 +Node: Ignoring Assigns675376 +Node: Getopt Function676926 +Ref: Getopt Function-Footnote-1688395 +Node: Passwd Functions688595 +Ref: Passwd Functions-Footnote-1697434 +Node: Group Functions697522 +Ref: Group Functions-Footnote-1705420 +Node: Walking Arrays705627 +Node: Library Functions Summary708635 +Node: Library Exercises710041 +Node: Sample Programs710506 +Node: Running Examples711276 +Node: Clones712004 +Node: Cut Program713228 +Node: Egrep Program723157 +Ref: Egrep Program-Footnote-1730669 +Node: Id Program730779 +Node: Split Program734459 +Ref: Split Program-Footnote-1737917 +Node: Tee Program738046 +Node: Uniq Program740836 +Node: Wc Program748262 +Ref: Wc Program-Footnote-1752517 +Node: Miscellaneous Programs752611 +Node: Dupword Program753824 +Node: Alarm Program755854 +Node: Translate Program760709 +Ref: Translate Program-Footnote-1765274 +Node: Labels Program765544 +Ref: Labels Program-Footnote-1768895 +Node: Word Sorting768979 +Node: History Sorting773051 +Node: Extract Program774886 +Node: Simple Sed782940 +Node: Igawk Program786014 +Ref: Igawk Program-Footnote-1800345 +Ref: Igawk Program-Footnote-2800547 +Ref: Igawk Program-Footnote-3800669 +Node: Anagram Program800784 +Node: Signature Program803846 +Node: Programs Summary805093 +Node: Programs Exercises806307 +Ref: Programs Exercises-Footnote-1810436 +Node: Advanced Features810527 +Node: Nondecimal Data812517 +Node: Array Sorting814108 +Node: Controlling Array Traversal814808 +Ref: Controlling Array Traversal-Footnote-1823176 +Node: Array Sorting Functions823294 +Ref: Array Sorting Functions-Footnote-1828385 +Node: Two-way I/O828581 +Ref: Two-way I/O-Footnote-1836301 +Ref: Two-way I/O-Footnote-2836488 +Node: TCP/IP Networking836570 +Node: Profiling839688 +Ref: Profiling-Footnote-1848360 +Node: Advanced Features Summary848683 +Node: Internationalization850527 +Node: I18N and L10N852007 +Node: Explaining gettext852694 +Ref: Explaining gettext-Footnote-1858586 +Ref: Explaining gettext-Footnote-2858771 +Node: Programmer i18n858936 +Ref: Programmer i18n-Footnote-1863885 +Node: Translator i18n863934 +Node: String Extraction864728 +Ref: String Extraction-Footnote-1865860 +Node: Printf Ordering865946 +Ref: Printf Ordering-Footnote-1868732 +Node: I18N Portability868796 +Ref: I18N Portability-Footnote-1871252 +Node: I18N Example871315 +Ref: I18N Example-Footnote-1874121 +Node: Gawk I18N874194 +Node: I18N Summary874839 +Node: Debugger876180 +Node: Debugging877203 +Node: Debugging Concepts877644 +Node: Debugging Terms879453 +Node: Awk Debugging882028 +Node: Sample Debugging Session882934 +Node: Debugger Invocation883468 +Node: Finding The Bug884854 +Node: List of Debugger Commands891332 +Node: Breakpoint Control892665 +Node: Debugger Execution Control896359 +Node: Viewing And Changing Data899721 +Node: Execution Stack903095 +Node: Debugger Info904732 +Node: Miscellaneous Debugger Commands908803 +Node: Readline Support913865 +Node: Limitations914761 +Node: Debugging Summary916870 +Node: Arbitrary Precision Arithmetic918149 +Node: Computer Arithmetic919634 +Ref: table-numeric-ranges923400 +Ref: table-floating-point-ranges923893 +Ref: Computer Arithmetic-Footnote-1924551 +Node: Math Definitions924608 +Ref: table-ieee-formats927924 +Ref: Math Definitions-Footnote-1928527 +Node: MPFR features928632 +Node: FP Math Caution930350 +Ref: FP Math Caution-Footnote-1931422 +Node: Inexactness of computations931791 +Node: Inexact representation932751 +Node: Comparing FP Values934111 +Node: Errors accumulate935352 +Node: Getting Accuracy936785 +Node: Try To Round939495 +Node: Setting precision940394 +Ref: table-predefined-precision-strings941091 +Node: Setting the rounding mode942921 +Ref: table-gawk-rounding-modes943295 +Ref: Setting the rounding mode-Footnote-1947226 +Node: Arbitrary Precision Integers947405 +Ref: Arbitrary Precision Integers-Footnote-1950580 +Node: Checking for MPFR950729 +Node: POSIX Floating Point Problems952203 +Ref: POSIX Floating Point Problems-Footnote-1956488 +Node: Floating point summary956526 +Node: Dynamic Extensions958716 +Node: Extension Intro960269 +Node: Plugin License961535 +Node: Extension Mechanism Outline962332 +Ref: figure-load-extension962771 +Ref: figure-register-new-function964336 +Ref: figure-call-new-function965428 +Node: Extension API Description967490 +Node: Extension API Functions Introduction969132 +Node: General Data Types974672 +Ref: General Data Types-Footnote-1983033 +Node: Memory Allocation Functions983332 +Ref: Memory Allocation Functions-Footnote-1987542 +Node: Constructor Functions987641 +Node: Registration Functions991227 +Node: Extension Functions991912 +Node: Exit Callback Functions997127 +Node: Extension Version String998377 +Node: Input Parsers999040 +Node: Output Wrappers1011761 +Node: Two-way processors1016273 +Node: Printing Messages1018538 +Ref: Printing Messages-Footnote-11019709 +Node: Updating ERRNO1019862 +Node: Requesting Values1020601 +Ref: table-value-types-returned1021338 +Node: Accessing Parameters1022274 +Node: Symbol Table Access1023509 +Node: Symbol table by name1024021 +Node: Symbol table by cookie1025810 +Ref: Symbol table by cookie-Footnote-11029995 +Node: Cached values1030059 +Ref: Cached values-Footnote-11033595 +Node: Array Manipulation1033748 +Ref: Array Manipulation-Footnote-11034839 +Node: Array Data Types1034876 +Ref: Array Data Types-Footnote-11037534 +Node: Array Functions1037626 +Node: Flattening Arrays1042124 +Node: Creating Arrays1049100 +Node: Redirection API1053867 +Node: Extension API Variables1056700 +Node: Extension Versioning1057411 +Ref: gawk-api-version1057840 +Node: Extension GMP/MPFR Versioning1059571 +Node: Extension API Informational Variables1061199 +Node: Extension API Boilerplate1062272 +Node: Changes from API V11066246 +Node: Finding Extensions1067818 +Node: Extension Example1068377 +Node: Internal File Description1069175 +Node: Internal File Ops1073255 +Ref: Internal File Ops-Footnote-11084605 +Node: Using Internal File Ops1084745 +Ref: Using Internal File Ops-Footnote-11087128 +Node: Extension Samples1087402 +Node: Extension Sample File Functions1088931 +Node: Extension Sample Fnmatch1096580 +Node: Extension Sample Fork1098067 +Node: Extension Sample Inplace1099285 +Node: Extension Sample Ord1102502 +Node: Extension Sample Readdir1103338 +Ref: table-readdir-file-types1104227 +Node: Extension Sample Revout1105032 +Node: Extension Sample Rev2way1105621 +Node: Extension Sample Read write array1106361 +Node: Extension Sample Readfile1108303 +Node: Extension Sample Time1109398 +Node: Extension Sample API Tests1110746 +Node: gawkextlib1111238 +Node: Extension summary1114156 +Node: Extension Exercises1117858 +Node: Language History1119356 +Node: V7/SVR3.11121012 +Node: SVR41123164 +Node: POSIX1124598 +Node: BTL1125978 +Node: POSIX/GNU1126707 +Node: Feature History1132485 +Node: Common Extensions1148531 +Node: Ranges and Locales1149814 +Ref: Ranges and Locales-Footnote-11154430 +Ref: Ranges and Locales-Footnote-21154457 +Ref: Ranges and Locales-Footnote-31154692 +Node: Contributors1154913 +Node: History summary1160858 +Node: Installation1162238 +Node: Gawk Distribution1163182 +Node: Getting1163666 +Node: Extracting1164629 +Node: Distribution contents1166267 +Node: Unix Installation1172747 +Node: Quick Installation1173429 +Node: Shell Startup Files1175843 +Node: Additional Configuration Options1176932 +Node: Configuration Philosophy1179097 +Node: Non-Unix Installation1181466 +Node: PC Installation1181926 +Node: PC Binary Installation1182764 +Node: PC Compiling1183199 +Node: PC Using1184316 +Node: Cygwin1187869 +Node: MSYS1188968 +Node: VMS Installation1189469 +Node: VMS Compilation1190260 +Ref: VMS Compilation-Footnote-11191489 +Node: VMS Dynamic Extensions1191547 +Node: VMS Installation Details1193232 +Node: VMS Running1195485 +Node: VMS GNV1199764 +Node: VMS Old Gawk1200499 +Node: Bugs1200970 +Node: Bug address1201633 +Node: Usenet1204615 +Node: Maintainers1205619 +Node: Other Versions1206880 +Node: Installation summary1213794 +Node: Notes1214996 +Node: Compatibility Mode1215790 +Node: Additions1216572 +Node: Accessing The Source1217497 +Node: Adding Code1218934 +Node: New Ports1225153 +Node: Derived Files1229641 +Ref: Derived Files-Footnote-11235287 +Ref: Derived Files-Footnote-21235322 +Ref: Derived Files-Footnote-31235920 +Node: Future Extensions1236034 +Node: Implementation Limitations1236692 +Node: Extension Design1237875 +Node: Old Extension Problems1239019 +Ref: Old Extension Problems-Footnote-11240537 +Node: Extension New Mechanism Goals1240594 +Ref: Extension New Mechanism Goals-Footnote-11243958 +Node: Extension Other Design Decisions1244147 +Node: Extension Future Growth1246260 +Node: Notes summary1247096 +Node: Basic Concepts1248271 +Node: Basic High Level1248952 +Ref: figure-general-flow1249234 +Ref: figure-process-flow1249919 +Ref: Basic High Level-Footnote-11253220 +Node: Basic Data Typing1253405 +Node: Glossary1256733 +Node: Copying1288571 +Node: GNU Free Documentation License1326114 +Node: Index1351234  End Tag Table diff --git a/doc/gawk.texi b/doc/gawk.texi index 6d0c7319..3443aeec 100644 --- a/doc/gawk.texi +++ b/doc/gawk.texi @@ -15935,7 +15935,8 @@ if an element in @code{SYMTAB} is an array. Also, you may not use the @code{delete} statement with the @code{SYMTAB} array. -You may use an index for @code{SYMTAB} that is not a predefined identifier: +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 @@ -15943,9 +15944,8 @@ print SYMTAB["xxx"] @end example @noindent -This works as expected: in this case @code{SYMTAB} acts just like -a regular array. The only difference is that you can't then delete -@code{SYMTAB["xxx"]}. +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 -- cgit v1.2.1