gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, master, updated. 1abfe5e82822a9e81a3bd1d


From: Andrew J. Schorr
Subject: [gawk-diffs] [SCM] gawk branch, master, updated. 1abfe5e82822a9e81a3bd1df2e7747afbc0ae1b9
Date: Wed, 09 Jan 2013 01:56:49 +0000

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, master has been updated
       via  1abfe5e82822a9e81a3bd1df2e7747afbc0ae1b9 (commit)
      from  155fc0deca8d8976915fdc5edc84c4c6a1af652b (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=1abfe5e82822a9e81a3bd1df2e7747afbc0ae1b9

commit 1abfe5e82822a9e81a3bd1df2e7747afbc0ae1b9
Author: Andrew J. Schorr <address@hidden>
Date:   Tue Jan 8 20:56:33 2013 -0500

    Add inplace file editing extension.

diff --git a/awklib/ChangeLog b/awklib/ChangeLog
index 98bdc3d..1b6a31e 100644
--- a/awklib/ChangeLog
+++ b/awklib/ChangeLog
@@ -1,3 +1,7 @@
+2013-01-08         Andrew J. Schorr     <address@hidden>
+
+       * eg/lib/inplace.awk: Add new file generated from doc/gawk.texi.
+
 2012-12-24         Arnold D. Robbins     <address@hidden>
 
        * 4.0.2: Release tar ball made.
diff --git a/awklib/eg/lib/inplace.awk b/awklib/eg/lib/inplace.awk
new file mode 100644
index 0000000..a090d9e
--- /dev/null
+++ b/awklib/eg/lib/inplace.awk
@@ -0,0 +1,14 @@
+# inplace --- load and invoke the inplace extension.
+
address@hidden "inplace"
+
+# Please set INPLACE_SUFFIX to make a backup copy.  For example,
+# you may want to set INPLACE_SUFFIX to .bak on the command-line or in a
+# BEGIN block.
+
+BEGINFILE {
+       inplace_begin(FILENAME, INPLACE_SUFFIX)
+}
+ENDFILE {
+       inplace_end(FILENAME, INPLACE_SUFFIX)
+}
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 09beb1e..6f141ad 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2013-01-08         Andrew J. Schorr     <address@hidden>
+
+       * gawk.texi: Add documentation for new inplace extension.
+
 2013-01-08         Arnold D. Robbins     <address@hidden>
 
        * gawk.texi, awkcard.in: Sync what mawk has. Main point of
diff --git a/doc/gawk.info b/doc/gawk.info
index 82ff0c4..3297126 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -557,6 +557,7 @@ texts being (a) (see below), and with the Back-Cover Texts 
being (b)
 * Extension Sample Fnmatch::            An interface to `fnmatch()'.
 * Extension Sample Fork::               An interface to `fork()' and
                                         other process functions.
+* Extension Sample Inplace::            Enabling in-place file editing.
 * Extension Sample Ord::                Character to value to character
                                         conversions.
 * Extension Sample Readdir::            An interface to `readdir()'.
@@ -3527,7 +3528,7 @@ Class       Meaning
 `[:upper:]' Uppercase alphabetic characters.
 `[:xdigit:]'Characters that are hexadecimal digits.
 
-Table 3.1: POSIX Character Classes
+Table    3.1: POSIX Character Classes
 
    For example, before the POSIX standard, you had to write
 `/[A-Za-z0-9]/' to match alphanumeric characters.  If your character
@@ -5515,7 +5516,7 @@ COMMAND `|& getline'     Sets `$0' and `NF'          
Extension
 COMMAND `|& getline'     Sets VAR                    Extension
 VAR                                                  
 
-Table 4.1: `getline' Variants and What They Set
+Table    4.1: `getline' Variants and What They Set
 
 
 File: gawk.info,  Node: Read Timeout,  Next: Command line directories,  Prev: 
Getline,  Up: Reading Files
@@ -7183,7 +7184,7 @@ Feature     Default        `--posix' or `--use-lc-numeric'
 Input       Use period     Use locale
 `strtonum()'Use period     Use locale
 
-Table 6.1: Locale Decimal Point versus A Period
+Table    6.1: Locale Decimal Point versus A Period
 
    Finally, modern day formal standards and IEEE standard floating point
 representation can have an unusual but important effect on the way
@@ -7525,7 +7526,7 @@ LVALUE `%=' MODULUS    Sets LVALUE to its remainder by 
MODULUS.
 LVALUE `^=' POWER      
 LVALUE `**=' POWER     Raises LVALUE to the power POWER. (c.e.)
 
-Table 6.2: Arithmetic Assignment Operators
+Table    6.2: Arithmetic Assignment Operators
 
      NOTE: Only the `^=' operator is specified by POSIX.  For maximum
      portability, do not use the `**=' operator.
@@ -7830,7 +7831,7 @@ X `!~' Y           True if the string X does not match 
the regexp
 SUBSCRIPT `in'     True if the array ARRAY has an element with the
 ARRAY              subscript SUBSCRIPT.
 
-Table 6.3: Relational Operators
+Table    6.3: Relational Operators
 
    Comparison expressions have the value one if true and zero if false.
 When comparing operands of mixed types, numeric operands are converted
@@ -11747,7 +11748,7 @@ is illustrated in *note table-sub-escapes::.
      `\\\\\\&'           `\\\&'            a literal `\\&'
          `\\q'             `\q'            a literal `\q'
 
-Table 9.1: Historical Escape Sequence Processing for `sub()' and
+Table    9.1: Historical Escape Sequence Processing for `sub()' and
 `gsub()'
 
 This table shows both the lexical-level processing, where an odd number
@@ -11772,7 +11773,7 @@ literally.  The interpretation of `\' and `&' then 
becomes as shown in
        `\\\\&'            `\\&'            a literal `\', then the matched text
      `\\\\\\&'           `\\\&'            a literal `\&'
 
-Table 9.2: 1992 POSIX Rules for `sub()' and `gsub()' Escape Sequence
+Table    9.2: 1992 POSIX Rules for `sub()' and `gsub()' Escape Sequence
 Processing
 
 This appears to solve the problem.  Unfortunately, the phrasing of the
@@ -11802,7 +11803,7 @@ table-sub-proposed::.
          `\\q'             `\q'            a literal `\q'
         `\\\\'             `\\'            `\\'
 
-Table 9.3: Proposed Rules For `sub()' And Backslash
+Table    9.3: Proposed Rules For `sub()' And Backslash
 
    In a nutshell, at the runtime level, there are now three special
 sequences of characters (`\\\&', `\\&' and `\&') whereas historically
@@ -11829,7 +11830,7 @@ rules are presented in *note table-posix-sub::.
          `\\q'             `\q'            a literal `\q'
         `\\\\'             `\\'            `\'
 
-Table 9.4: POSIX Rules For `sub()' And `gsub()'
+Table    9.4: POSIX Rules For `sub()' And `gsub()'
 
    The only case where the difference is noticeable is the last one:
 `\\\\' is seen as `\\' and produces `\' instead of `\\'.
@@ -11861,7 +11862,7 @@ the `\' does not, as shown in *note 
table-gensub-escapes::.
      `\\\\\\&'                 `\\\&'            a literal `\&'
          `\\q'                   `\q'            a literal `q'
 
-Table 9.5: Escape Sequence Processing For `gensub()'
+Table    9.5: Escape Sequence Processing For `gensub()'
 
    Because of the complexity of the lexical and runtime level processing
 and the special cases for `sub()' and `gsub()', we recommend the use of
@@ -12420,7 +12421,7 @@ table-bitwise-ops::.
          0     | 0   0 | 0   1 | 0   1
          1     | 0   1 | 1   1 | 1   0
 
-Table 9.6: Bitwise Operations
+Table    9.6: Bitwise Operations
 
    As you can see, the result of an AND operation is 1 only when _both_
 bits are 1.  The result of an OR operation is 1 if _either_ bit is 1.
@@ -20864,7 +20865,7 @@ Single         32             24             -126       
    +127
 Double         64             53             -1022          +1023
 Quadruple      128            113            -16382         +16383
 
-Table 15.1: Basic IEEE Format Context Values
+Table   15.1: Basic IEEE Format Context Values
 
      NOTE: The precision numbers include the implied leading one that
      gives them one extra bit of significand.
@@ -20906,7 +20907,7 @@ Round toward zero                `roundTowardZero'
 Round to nearest, ties away      `roundTiesToAway'
 from zero                        
 
-Table 15.2: IEEE 754 Rounding Modes
+Table   15.2: IEEE 754 Rounding Modes
 
    The default mode `roundTiesToEven' is the most preferred, but the
 least intuitive. This method does the obvious thing for most values, by
@@ -21138,10 +21139,10 @@ Round toward zero                `roundTowardZero'    
  `"Z"' or `"z"'
 Round to nearest, ties away      `roundTiesToAway'      `"A"' or `"a"'
 from zero                                               
 
-Table 15.3: `gawk' Rounding Modes
+Table   15.3: `gawk' Rounding Modes
 
    `ROUNDMODE' has the default value `"N"', which selects the IEEE-754
-rounding mode `roundTiesToEven'.  *note Table 15.3:
+rounding mode `roundTiesToEven'.  *note Table   15.3:
 table-gawk-rounding-modes, lists `"A"' to select the IEEE-754 mode
 `roundTiesToAway'.  This is only available if your version of the MPFR
 library supports it; otherwise setting `ROUNDMODE' to this value has no
@@ -21478,7 +21479,7 @@ fields are function pointers.  This is shown in *note 
load-extension::.
 +-------+-+---+-+---+-+------------------+--------------------+
 
     gawk Main Program Address Space              Extension
-Figure 16.1: Loading The Extension
+Figure   16.1: Loading The Extension
 
    The extension can call functions inside `gawk' through these
 function pointers, at runtime, without needing (link-time) access to
@@ -21498,7 +21499,7 @@ load-new-function::.
 +-------+-+---+-+---+-+------------------+--------------+-+---+
 
     gawk Main Program Address Space              Extension
-Figure 16.2: Loading The New Function
+Figure   16.2: Loading The New Function
 
    In the other direction, the extension registers its new functions
 with `gawk' by passing function pointers to the functions that provide
@@ -21519,7 +21520,7 @@ calling convention.  This is shown in *note 
call-new-function::.
 +-------+-+---+-+---+-+------------------+--------------+-+---+
 
     gawk Main Program Address Space              Extension
-Figure 16.3: Calling The New Function
+Figure   16.3: Calling The New Function
 
    The `do_XXX()' function, in turn, then uses the function pointers in
 the API `struct' to do its work, such as updating variables or arrays,
@@ -21875,7 +21876,7 @@ Requested:   Scalar       Scalar         Scalar      
false       false
              Value        false          false       false       false
              Cookie                                              
 
-Table 16.1: Value Types Returned
+Table   16.1: Value Types Returned
 
 
 File: gawk.info,  Node: Constructor Functions,  Next: Registration Functions,  
Prev: Requesting Values,  Up: Extension API Description
@@ -22510,7 +22511,7 @@ your extension function. They are:
      Fill in the `awk_value_t' structure pointed to by `result' with
      the `count''th argument.  Return true if the actual type matches
      `wanted', false otherwise.  In the latter case, `result->val_type'
-     indicates the actual type (*note Table 16.1:
+     indicates the actual type (*note Table   16.1:
      table-value-types-returned.).  Counts are zero based--the first
      argument is numbered zero, the second one, and so on. `wanted'
      indicates the type of value expected.
@@ -22556,7 +22557,7 @@ termed a "symbol table".
      regular C string.  `wanted' indicates the type of value expected.
      Return true if the actual type matches `wanted', false otherwise
      In the latter case, `result->val_type' indicates the actual type
-     (*note Table 16.1: table-value-types-returned.).
+     (*note Table   16.1: table-value-types-returned.).
 
 `awk_bool_t sym_update(const char *name, awk_value_t *value);'
      Update the variable named by the string `name', which is a regular
@@ -22891,7 +22892,7 @@ The following functions relate to individual array 
elements.
      value of the element whose index is `index'.  `wanted' specifies
      the type of value you wish to retrieve.  Return false if `wanted'
      does not match the actual type or if `index' is not in the array
-     (*note Table 16.1: table-value-types-returned.).
+     (*note Table   16.1: table-value-types-returned.).
 
      The value for `index' can be numeric, in which case `gawk'
      converts it to a string. Using non-integral values is possible, but
@@ -24057,8 +24058,9 @@ File: gawk.info,  Node: Extension Samples,  Next: 
gawkextlib,  Prev: Extension E
 
 This minor node provides brief overviews of the sample extensions that
 come in the `gawk' distribution. Some of them are intended for
-production use, such the `filefuncs' and `readdir' extensions.  Others
-mainly provide example code that shows how to use the extension API.
+production use, such the `filefuncs', `readdir' and `inplace'
+extensions.  Others mainly provide example code that shows how to use
+the extension API.
 
 * Menu:
 
@@ -24066,6 +24068,7 @@ mainly provide example code that shows how to use the 
extension API.
 * Extension Sample Fnmatch::          An interface to `fnmatch()'.
 * Extension Sample Fork::             An interface to `fork()' and other
                                       process functions.
+* Extension Sample Inplace::          Enabling in-place file editing.
 * Extension Sample Ord::              Character to value to character
                                       conversions.
 * Extension Sample Readdir::          An interface to `readdir()'.
@@ -24319,7 +24322,7 @@ occurred.
          print "no match"
 
 
-File: gawk.info,  Node: Extension Sample Fork,  Next: Extension Sample Ord,  
Prev: Extension Sample Fnmatch,  Up: Extension Samples
+File: gawk.info,  Node: Extension Sample Fork,  Next: Extension Sample 
Inplace,  Prev: Extension Sample Fnmatch,  Up: Extension Samples
 
 16.6.3 Interface To `fork()', `wait()' and `waitpid()'
 ------------------------------------------------------
@@ -24356,9 +24359,55 @@ The `fork' extension adds three functions, as follows.
          print "hello from the parent"
 
 
-File: gawk.info,  Node: Extension Sample Ord,  Next: Extension Sample Readdir, 
 Prev: Extension Sample Fork,  Up: Extension Samples
+File: gawk.info,  Node: Extension Sample Inplace,  Next: Extension Sample Ord, 
 Prev: Extension Sample Fork,  Up: Extension Samples
 
-16.6.4 Character and Numeric values: `ord()' and `chr()'
+16.6.4 Enabling in-place file editing.
+--------------------------------------
+
+The `inplace' extension emulates the `sed' `-i' option.  It uses the
+bundled `inplace.awk' include file to invoke the extension properly:
+
+     # inplace --- load and invoke the inplace extension.
+
+     @load "inplace"
+
+     # Please set INPLACE_SUFFIX to make a backup copy.  For example,
+     # you may want to set INPLACE_SUFFIX to .bak on the command-line or in a
+     # BEGIN block.
+
+     BEGINFILE {
+       inplace_begin(FILENAME, INPLACE_SUFFIX)
+     }
+     ENDFILE {
+       inplace_end(FILENAME, INPLACE_SUFFIX)
+     }
+
+   For each regular file that is processed, the extension redirects
+stdout to a temporary file configured to have the same owner and
+permissions.  After the file has been processed, stdout is restored to
+its default destination.  If `INPLACE_SUFFIX' is not an empty string,
+the original file will be linked to a backup filename created by
+appending that suffix.  Finally, the temporary file is renamed to the
+original filename.
+
+   If any error is encountered, the extension issues a fatal error to
+terminate processing immediately without damaging the original file.
+
+   Here are a couple of simple examples:
+
+     $ gawk -i inplace '{gsub(/foo/, "bar")} {print}' file1 file2 file3
+
+   To keep a backup copy of the original files, try this:
+
+     $ gawk -i inplace -vINPLACE_SUFFIX=.bak '{gsub(/foo/, "bar")} {print}' 
file1 file2 file3
+
+   It is left as an exercise to write a wrapper script that presents an
+interface similar to the `sed' `-i' option.
+
+
+File: gawk.info,  Node: Extension Sample Ord,  Next: Extension Sample Readdir, 
 Prev: Extension Sample Inplace,  Up: Extension Samples
+
+16.6.5 Character and Numeric values: `ord()' and `chr()'
 --------------------------------------------------------
 
 The `ordchr' extension adds two functions, named `ord()' and `chr()',
@@ -24382,7 +24431,7 @@ same name.  Here is an example:
 
 File: gawk.info,  Node: Extension Sample Readdir,  Next: Extension Sample 
Revout,  Prev: Extension Sample Ord,  Up: Extension Samples
 
-16.6.5 Reading Directories
+16.6.6 Reading Directories
 --------------------------
 
 The `readdir' extension adds an input parser for directories.  The
@@ -24430,7 +24479,7 @@ always `u'.
 
 File: gawk.info,  Node: Extension Sample Revout,  Next: Extension Sample 
Rev2way,  Prev: Extension Sample Readdir,  Up: Extension Samples
 
-16.6.6 Reversing Output
+16.6.7 Reversing Output
 -----------------------
 
 The `revoutput' extension adds a simple output wrapper that reverses
@@ -24450,7 +24499,7 @@ unwary.  Here is an example:
 
 File: gawk.info,  Node: Extension Sample Rev2way,  Next: Extension Sample Read 
write array,  Prev: Extension Sample Revout,  Up: Extension Samples
 
-16.6.7 Two-Way I/O Example
+16.6.8 Two-Way I/O Example
 --------------------------
 
 The `revtwoway' extension adds a simple two-way processor that reverses
@@ -24472,7 +24521,7 @@ example shows how to use it:
 
 File: gawk.info,  Node: Extension Sample Read write array,  Next: Extension 
Sample Readfile,  Prev: Extension Sample Rev2way,  Up: Extension Samples
 
-16.6.8 Dumping and Restoring An Array
+16.6.9 Dumping and Restoring An Array
 -------------------------------------
 
 The `rwarray' extension adds two functions, named `writea()' and
@@ -24516,8 +24565,8 @@ restored on systems with a different one, but this has 
not been tried.
 
 File: gawk.info,  Node: Extension Sample Readfile,  Next: Extension Sample API 
Tests,  Prev: Extension Sample Read write array,  Up: Extension Samples
 
-16.6.9 Reading An Entire File
------------------------------
+16.6.10 Reading An Entire File
+------------------------------
 
 The `readfile' extension adds a single function named `readfile()':
 
@@ -24539,7 +24588,7 @@ The `readfile' extension adds a single function named 
`readfile()':
 
 File: gawk.info,  Node: Extension Sample API Tests,  Next: Extension Sample 
Time,  Prev: Extension Sample Readfile,  Up: Extension Samples
 
-16.6.10 API Tests
+16.6.11 API Tests
 -----------------
 
 The `testext' extension exercises parts of the extension API that are
@@ -24551,7 +24600,7 @@ code and runs the tests.  See the source file for more 
information.
 
 File: gawk.info,  Node: Extension Sample Time,  Prev: Extension Sample API 
Tests,  Up: Extension Samples
 
-16.6.11 Extension Time Functions
+16.6.12 Extension Time Functions
 --------------------------------
 
 These functions can be used by either invoking `gawk' with a
@@ -31859,517 +31908,518 @@ Index
 
 Tag Table:
 Node: Top1358
-Node: Foreword40229
-Node: Preface44574
-Ref: Preface-Footnote-147627
-Ref: Preface-Footnote-247733
-Node: History47965
-Node: Names50356
-Ref: Names-Footnote-151833
-Node: This Manual51905
-Ref: This Manual-Footnote-157811
-Node: Conventions57911
-Node: Manual History60045
-Ref: Manual History-Footnote-163315
-Ref: Manual History-Footnote-263356
-Node: How To Contribute63430
-Node: Acknowledgments64574
-Node: Getting Started69070
-Node: Running gawk71449
-Node: One-shot72635
-Node: Read Terminal73860
-Ref: Read Terminal-Footnote-175510
-Ref: Read Terminal-Footnote-275786
-Node: Long75957
-Node: Executable Scripts77333
-Ref: Executable Scripts-Footnote-179202
-Ref: Executable Scripts-Footnote-279304
-Node: Comments79851
-Node: Quoting82318
-Node: DOS Quoting86941
-Node: Sample Data Files87616
-Node: Very Simple90648
-Node: Two Rules95247
-Node: More Complex97394
-Ref: More Complex-Footnote-1100324
-Node: Statements/Lines100409
-Ref: Statements/Lines-Footnote-1104871
-Node: Other Features105136
-Node: When106064
-Node: Invoking Gawk108211
-Node: Command Line109672
-Node: Options110455
-Ref: Options-Footnote-1125853
-Node: Other Arguments125878
-Node: Naming Standard Input128536
-Node: Environment Variables129630
-Node: AWKPATH Variable130188
-Ref: AWKPATH Variable-Footnote-1132946
-Node: AWKLIBPATH Variable133206
-Node: Other Environment Variables133803
-Node: Exit Status136298
-Node: Include Files136973
-Node: Loading Shared Libraries140542
-Node: Obsolete141767
-Node: Undocumented142464
-Node: Regexp142707
-Node: Regexp Usage144096
-Node: Escape Sequences146122
-Node: Regexp Operators151885
-Ref: Regexp Operators-Footnote-1159265
-Ref: Regexp Operators-Footnote-2159412
-Node: Bracket Expressions159510
-Ref: table-char-classes161400
-Node: GNU Regexp Operators163923
-Node: Case-sensitivity167646
-Ref: Case-sensitivity-Footnote-1170614
-Ref: Case-sensitivity-Footnote-2170849
-Node: Leftmost Longest170957
-Node: Computed Regexps172158
-Node: Reading Files175568
-Node: Records177571
-Ref: Records-Footnote-1186495
-Node: Fields186532
-Ref: Fields-Footnote-1189565
-Node: Nonconstant Fields189651
-Node: Changing Fields191853
-Node: Field Separators197834
-Node: Default Field Splitting200463
-Node: Regexp Field Splitting201580
-Node: Single Character Fields204922
-Node: Command Line Field Separator205981
-Node: Field Splitting Summary209422
-Ref: Field Splitting Summary-Footnote-1212614
-Node: Constant Size212715
-Node: Splitting By Content217299
-Ref: Splitting By Content-Footnote-1221025
-Node: Multiple Line221065
-Ref: Multiple Line-Footnote-1226912
-Node: Getline227091
-Node: Plain Getline229307
-Node: Getline/Variable231396
-Node: Getline/File232537
-Node: Getline/Variable/File233859
-Ref: Getline/Variable/File-Footnote-1235458
-Node: Getline/Pipe235545
-Node: Getline/Variable/Pipe238105
-Node: Getline/Coprocess239212
-Node: Getline/Variable/Coprocess240455
-Node: Getline Notes241169
-Node: Getline Summary243956
-Ref: table-getline-variants244364
-Node: Read Timeout245222
-Ref: Read Timeout-Footnote-1248967
-Node: Command line directories249024
-Node: Printing249654
-Node: Print251285
-Node: Print Examples252622
-Node: Output Separators255406
-Node: OFMT257166
-Node: Printf258524
-Node: Basic Printf259430
-Node: Control Letters260969
-Node: Format Modifiers264781
-Node: Printf Examples270790
-Node: Redirection273505
-Node: Special Files280489
-Node: Special FD281022
-Ref: Special FD-Footnote-1284647
-Node: Special Network284721
-Node: Special Caveats285571
-Node: Close Files And Pipes286367
-Ref: Close Files And Pipes-Footnote-1293390
-Ref: Close Files And Pipes-Footnote-2293538
-Node: Expressions293688
-Node: Values294820
-Node: Constants295496
-Node: Scalar Constants296176
-Ref: Scalar Constants-Footnote-1297035
-Node: Nondecimal-numbers297217
-Node: Regexp Constants300276
-Node: Using Constant Regexps300751
-Node: Variables303806
-Node: Using Variables304461
-Node: Assignment Options306185
-Node: Conversion308057
-Ref: table-locale-affects313433
-Ref: Conversion-Footnote-1314057
-Node: All Operators314166
-Node: Arithmetic Ops314796
-Node: Concatenation317301
-Ref: Concatenation-Footnote-1320094
-Node: Assignment Ops320214
-Ref: table-assign-ops325202
-Node: Increment Ops326610
-Node: Truth Values and Conditions330080
-Node: Truth Values331163
-Node: Typing and Comparison332212
-Node: Variable Typing333001
-Ref: Variable Typing-Footnote-1336898
-Node: Comparison Operators337020
-Ref: table-relational-ops337430
-Node: POSIX String Comparison340979
-Ref: POSIX String Comparison-Footnote-1341935
-Node: Boolean Ops342073
-Ref: Boolean Ops-Footnote-1346151
-Node: Conditional Exp346242
-Node: Function Calls347974
-Node: Precedence351568
-Node: Locales355237
-Node: Patterns and Actions356326
-Node: Pattern Overview357380
-Node: Regexp Patterns359049
-Node: Expression Patterns359592
-Node: Ranges363277
-Node: BEGIN/END366243
-Node: Using BEGIN/END367005
-Ref: Using BEGIN/END-Footnote-1369736
-Node: I/O And BEGIN/END369842
-Node: BEGINFILE/ENDFILE372124
-Node: Empty375028
-Node: Using Shell Variables375344
-Node: Action Overview377629
-Node: Statements379986
-Node: If Statement381840
-Node: While Statement383339
-Node: Do Statement385383
-Node: For Statement386539
-Node: Switch Statement389691
-Node: Break Statement391788
-Node: Continue Statement393778
-Node: Next Statement395571
-Node: Nextfile Statement397961
-Node: Exit Statement400602
-Node: Built-in Variables403018
-Node: User-modified404113
-Ref: User-modified-Footnote-1412468
-Node: Auto-set412530
-Ref: Auto-set-Footnote-1424881
-Ref: Auto-set-Footnote-2425086
-Node: ARGC and ARGV425142
-Node: Arrays428993
-Node: Array Basics430498
-Node: Array Intro431324
-Node: Reference to Elements435642
-Node: Assigning Elements437912
-Node: Array Example438403
-Node: Scanning an Array440135
-Node: Controlling Scanning442449
-Ref: Controlling Scanning-Footnote-1447382
-Node: Delete447698
-Ref: Delete-Footnote-1450463
-Node: Numeric Array Subscripts450520
-Node: Uninitialized Subscripts452703
-Node: Multi-dimensional454331
-Node: Multi-scanning457425
-Node: Arrays of Arrays459016
-Node: Functions463661
-Node: Built-in464480
-Node: Calling Built-in465558
-Node: Numeric Functions467546
-Ref: Numeric Functions-Footnote-1471378
-Ref: Numeric Functions-Footnote-2471735
-Ref: Numeric Functions-Footnote-3471783
-Node: String Functions472052
-Ref: String Functions-Footnote-1495549
-Ref: String Functions-Footnote-2495678
-Ref: String Functions-Footnote-3495926
-Node: Gory Details496013
-Ref: table-sub-escapes497692
-Ref: table-sub-posix-92499046
-Ref: table-sub-proposed500397
-Ref: table-posix-sub501751
-Ref: table-gensub-escapes503296
-Ref: Gory Details-Footnote-1504503
-Ref: Gory Details-Footnote-2504554
-Node: I/O Functions504705
-Ref: I/O Functions-Footnote-1511810
-Node: Time Functions511957
-Ref: Time Functions-Footnote-1522890
-Ref: Time Functions-Footnote-2522958
-Ref: Time Functions-Footnote-3523116
-Ref: Time Functions-Footnote-4523227
-Ref: Time Functions-Footnote-5523339
-Ref: Time Functions-Footnote-6523566
-Node: Bitwise Functions523832
-Ref: table-bitwise-ops524390
-Ref: Bitwise Functions-Footnote-1528611
-Node: Type Functions528795
-Node: I18N Functions529265
-Node: User-defined530892
-Node: Definition Syntax531696
-Ref: Definition Syntax-Footnote-1536606
-Node: Function Example536675
-Node: Function Caveats539269
-Node: Calling A Function539690
-Node: Variable Scope540805
-Node: Pass By Value/Reference543768
-Node: Return Statement547208
-Node: Dynamic Typing550189
-Node: Indirect Calls550924
-Node: Library Functions560609
-Ref: Library Functions-Footnote-1564122
-Ref: Library Functions-Footnote-2564265
-Node: Library Names564436
-Ref: Library Names-Footnote-1567907
-Ref: Library Names-Footnote-2568127
-Node: General Functions568213
-Node: Strtonum Function569166
-Node: Assert Function572096
-Node: Round Function575422
-Node: Cliff Random Function576965
-Node: Ordinal Functions577981
-Ref: Ordinal Functions-Footnote-1581051
-Ref: Ordinal Functions-Footnote-2581303
-Node: Join Function581512
-Ref: Join Function-Footnote-1583283
-Node: Getlocaltime Function583483
-Node: Data File Management587198
-Node: Filetrans Function587830
-Node: Rewind Function591969
-Node: File Checking593356
-Node: Empty Files594450
-Node: Ignoring Assigns596680
-Node: Getopt Function598233
-Ref: Getopt Function-Footnote-1609537
-Node: Passwd Functions609740
-Ref: Passwd Functions-Footnote-1618715
-Node: Group Functions618803
-Node: Walking Arrays626887
-Node: Sample Programs628456
-Node: Running Examples629133
-Node: Clones629861
-Node: Cut Program631085
-Node: Egrep Program640930
-Ref: Egrep Program-Footnote-1648703
-Node: Id Program648813
-Node: Split Program652429
-Ref: Split Program-Footnote-1655948
-Node: Tee Program656076
-Node: Uniq Program658879
-Node: Wc Program666308
-Ref: Wc Program-Footnote-1670574
-Ref: Wc Program-Footnote-2670774
-Node: Miscellaneous Programs670866
-Node: Dupword Program672054
-Node: Alarm Program674085
-Node: Translate Program678834
-Ref: Translate Program-Footnote-1683221
-Ref: Translate Program-Footnote-2683449
-Node: Labels Program683583
-Ref: Labels Program-Footnote-1686954
-Node: Word Sorting687038
-Node: History Sorting690922
-Node: Extract Program692761
-Ref: Extract Program-Footnote-1700244
-Node: Simple Sed700372
-Node: Igawk Program703434
-Ref: Igawk Program-Footnote-1718591
-Ref: Igawk Program-Footnote-2718792
-Node: Anagram Program718930
-Node: Signature Program721998
-Node: Internationalization723098
-Node: I18N and L10N724530
-Node: Explaining gettext725216
-Ref: Explaining gettext-Footnote-1730282
-Ref: Explaining gettext-Footnote-2730466
-Node: Programmer i18n730631
-Node: Translator i18n734831
-Node: String Extraction735624
-Ref: String Extraction-Footnote-1736585
-Node: Printf Ordering736671
-Ref: Printf Ordering-Footnote-1739455
-Node: I18N Portability739519
-Ref: I18N Portability-Footnote-1741968
-Node: I18N Example742031
-Ref: I18N Example-Footnote-1744666
-Node: Gawk I18N744738
-Node: Advanced Features745355
-Node: Nondecimal Data746859
-Node: Array Sorting748442
-Node: Controlling Array Traversal749139
-Node: Array Sorting Functions757377
-Ref: Array Sorting Functions-Footnote-1761051
-Ref: Array Sorting Functions-Footnote-2761144
-Node: Two-way I/O761338
-Ref: Two-way I/O-Footnote-1766770
-Node: TCP/IP Networking766840
-Node: Profiling769684
-Node: Debugger777138
-Node: Debugging778106
-Node: Debugging Concepts778539
-Node: Debugging Terms780395
-Node: Awk Debugging782992
-Node: Sample Debugging Session783884
-Node: Debugger Invocation784404
-Node: Finding The Bug785733
-Node: List of Debugger Commands792221
-Node: Breakpoint Control793555
-Node: Debugger Execution Control797219
-Node: Viewing And Changing Data800579
-Node: Execution Stack803935
-Node: Debugger Info805402
-Node: Miscellaneous Debugger Commands809383
-Node: Readline Support814828
-Node: Limitations815659
-Node: Arbitrary Precision Arithmetic817911
-Ref: Arbitrary Precision Arithmetic-Footnote-1819553
-Node: General Arithmetic819701
-Node: Floating Point Issues821421
-Node: String Conversion Precision822302
-Ref: String Conversion Precision-Footnote-1824008
-Node: Unexpected Results824117
-Node: POSIX Floating Point Problems826270
-Ref: POSIX Floating Point Problems-Footnote-1830095
-Node: Integer Programming830133
-Node: Floating-point Programming831886
-Ref: Floating-point Programming-Footnote-1838195
-Node: Floating-point Representation838459
-Node: Floating-point Context839624
-Ref: table-ieee-formats840466
-Node: Rounding Mode841850
-Ref: table-rounding-modes842329
-Ref: Rounding Mode-Footnote-1845333
-Node: Gawk and MPFR845514
-Node: Arbitrary Precision Floats846756
-Ref: Arbitrary Precision Floats-Footnote-1849185
-Node: Setting Precision849496
-Node: Setting Rounding Mode852229
-Ref: table-gawk-rounding-modes852633
-Node: Floating-point Constants853813
-Node: Changing Precision855237
-Ref: Changing Precision-Footnote-1856637
-Node: Exact Arithmetic856811
-Node: Arbitrary Precision Integers859919
-Ref: Arbitrary Precision Integers-Footnote-1862919
-Node: Dynamic Extensions863066
-Node: Extension Intro864443
-Node: Plugin License865651
-Node: Extension Mechanism Outline866336
-Ref: load-extension866753
-Ref: load-new-function868231
-Ref: call-new-function869212
-Node: Extension API Description871206
-Node: Extension API Functions Introduction872545
-Node: General Data Types877323
-Ref: General Data Types-Footnote-1882925
-Node: Requesting Values883224
-Ref: table-value-types-returned883955
-Node: Constructor Functions884909
-Node: Registration Functions887905
-Node: Extension Functions888590
-Node: Exit Callback Functions890764
-Node: Extension Version String892007
-Node: Input Parsers892657
-Node: Output Wrappers902374
-Node: Two-way processors906790
-Node: Printing Messages908920
-Ref: Printing Messages-Footnote-1909997
-Node: Updating `ERRNO'910149
-Node: Accessing Parameters910888
-Node: Symbol Table Access912118
-Node: Symbol table by name912630
-Node: Symbol table by cookie914203
-Ref: Symbol table by cookie-Footnote-1918332
-Node: Cached values918395
-Ref: Cached values-Footnote-1921838
-Node: Array Manipulation921929
-Ref: Array Manipulation-Footnote-1923027
-Node: Array Data Types923066
-Ref: Array Data Types-Footnote-1925769
-Node: Array Functions925861
-Node: Flattening Arrays929627
-Node: Creating Arrays936466
-Node: Extension API Variables941261
-Node: Extension Versioning941897
-Node: Extension API Informational Variables943798
-Node: Extension API Boilerplate944884
-Node: Finding Extensions948715
-Node: Extension Example949262
-Node: Internal File Description950000
-Node: Internal File Ops953688
-Ref: Internal File Ops-Footnote-1965135
-Node: Using Internal File Ops965275
-Ref: Using Internal File Ops-Footnote-1967628
-Node: Extension Samples967894
-Node: Extension Sample File Functions969337
-Node: Extension Sample Fnmatch977810
-Node: Extension Sample Fork979536
-Node: Extension Sample Ord980750
-Node: Extension Sample Readdir981526
-Node: Extension Sample Revout983030
-Node: Extension Sample Rev2way983623
-Node: Extension Sample Read write array984313
-Node: Extension Sample Readfile986196
-Node: Extension Sample API Tests986951
-Node: Extension Sample Time987476
-Node: gawkextlib988783
-Node: Language History991164
-Node: V7/SVR3.1992686
-Node: SVR4995007
-Node: POSIX996449
-Node: BTL997457
-Node: POSIX/GNU998262
-Node: Common Extensions1003797
-Node: Ranges and Locales1004904
-Ref: Ranges and Locales-Footnote-11009522
-Ref: Ranges and Locales-Footnote-21009549
-Ref: Ranges and Locales-Footnote-31009809
-Node: Contributors1010030
-Node: Installation1014326
-Node: Gawk Distribution1015220
-Node: Getting1015704
-Node: Extracting1016530
-Node: Distribution contents1018222
-Node: Unix Installation1023483
-Node: Quick Installation1024100
-Node: Additional Configuration Options1026062
-Node: Configuration Philosophy1027539
-Node: Non-Unix Installation1029881
-Node: PC Installation1030339
-Node: PC Binary Installation1031638
-Node: PC Compiling1033486
-Node: PC Testing1036430
-Node: PC Using1037606
-Node: Cygwin1041791
-Node: MSYS1042791
-Node: VMS Installation1043305
-Node: VMS Compilation1043908
-Ref: VMS Compilation-Footnote-11044915
-Node: VMS Installation Details1044973
-Node: VMS Running1046608
-Node: VMS Old Gawk1048215
-Node: Bugs1048689
-Node: Other Versions1052541
-Node: Notes1058197
-Node: Compatibility Mode1058997
-Node: Additions1059780
-Node: Accessing The Source1060707
-Node: Adding Code1062310
-Node: New Ports1068352
-Node: Derived Files1072487
-Ref: Derived Files-Footnote-11077808
-Ref: Derived Files-Footnote-21077842
-Ref: Derived Files-Footnote-31078442
-Node: Future Extensions1078540
-Node: Implementation Limitations1079121
-Node: Extension Design1080373
-Node: Old Extension Problems1081522
-Ref: Old Extension Problems-Footnote-11083030
-Node: Extension New Mechanism Goals1083087
-Ref: Extension New Mechanism Goals-Footnote-11086446
-Node: Extension Other Design Decisions1086632
-Node: Extension Future Growth1088738
-Node: Old Extension Mechansim1089559
-Node: Basic Concepts1091316
-Node: Basic High Level1091997
-Ref: figure-general-flow1092268
-Ref: figure-process-flow1092867
-Ref: Basic High Level-Footnote-11096096
-Node: Basic Data Typing1096281
-Node: Glossary1099636
-Node: Copying1124947
-Node: GNU Free Documentation License1162504
-Node: Index1187641
+Node: Foreword40301
+Node: Preface44646
+Ref: Preface-Footnote-147699
+Ref: Preface-Footnote-247805
+Node: History48037
+Node: Names50428
+Ref: Names-Footnote-151905
+Node: This Manual51977
+Ref: This Manual-Footnote-157883
+Node: Conventions57983
+Node: Manual History60117
+Ref: Manual History-Footnote-163387
+Ref: Manual History-Footnote-263428
+Node: How To Contribute63502
+Node: Acknowledgments64646
+Node: Getting Started69142
+Node: Running gawk71521
+Node: One-shot72707
+Node: Read Terminal73932
+Ref: Read Terminal-Footnote-175582
+Ref: Read Terminal-Footnote-275858
+Node: Long76029
+Node: Executable Scripts77405
+Ref: Executable Scripts-Footnote-179274
+Ref: Executable Scripts-Footnote-279376
+Node: Comments79923
+Node: Quoting82390
+Node: DOS Quoting87013
+Node: Sample Data Files87688
+Node: Very Simple90720
+Node: Two Rules95319
+Node: More Complex97466
+Ref: More Complex-Footnote-1100396
+Node: Statements/Lines100481
+Ref: Statements/Lines-Footnote-1104943
+Node: Other Features105208
+Node: When106136
+Node: Invoking Gawk108283
+Node: Command Line109744
+Node: Options110527
+Ref: Options-Footnote-1125925
+Node: Other Arguments125950
+Node: Naming Standard Input128608
+Node: Environment Variables129702
+Node: AWKPATH Variable130260
+Ref: AWKPATH Variable-Footnote-1133018
+Node: AWKLIBPATH Variable133278
+Node: Other Environment Variables133875
+Node: Exit Status136370
+Node: Include Files137045
+Node: Loading Shared Libraries140614
+Node: Obsolete141839
+Node: Undocumented142536
+Node: Regexp142779
+Node: Regexp Usage144168
+Node: Escape Sequences146194
+Node: Regexp Operators151957
+Ref: Regexp Operators-Footnote-1159337
+Ref: Regexp Operators-Footnote-2159484
+Node: Bracket Expressions159582
+Ref: table-char-classes161472
+Node: GNU Regexp Operators163998
+Node: Case-sensitivity167721
+Ref: Case-sensitivity-Footnote-1170689
+Ref: Case-sensitivity-Footnote-2170924
+Node: Leftmost Longest171032
+Node: Computed Regexps172233
+Node: Reading Files175643
+Node: Records177646
+Ref: Records-Footnote-1186570
+Node: Fields186607
+Ref: Fields-Footnote-1189640
+Node: Nonconstant Fields189726
+Node: Changing Fields191928
+Node: Field Separators197909
+Node: Default Field Splitting200538
+Node: Regexp Field Splitting201655
+Node: Single Character Fields204997
+Node: Command Line Field Separator206056
+Node: Field Splitting Summary209497
+Ref: Field Splitting Summary-Footnote-1212689
+Node: Constant Size212790
+Node: Splitting By Content217374
+Ref: Splitting By Content-Footnote-1221100
+Node: Multiple Line221140
+Ref: Multiple Line-Footnote-1226987
+Node: Getline227166
+Node: Plain Getline229382
+Node: Getline/Variable231471
+Node: Getline/File232612
+Node: Getline/Variable/File233934
+Ref: Getline/Variable/File-Footnote-1235533
+Node: Getline/Pipe235620
+Node: Getline/Variable/Pipe238180
+Node: Getline/Coprocess239287
+Node: Getline/Variable/Coprocess240530
+Node: Getline Notes241244
+Node: Getline Summary244031
+Ref: table-getline-variants244439
+Node: Read Timeout245300
+Ref: Read Timeout-Footnote-1249045
+Node: Command line directories249102
+Node: Printing249732
+Node: Print251363
+Node: Print Examples252700
+Node: Output Separators255484
+Node: OFMT257244
+Node: Printf258602
+Node: Basic Printf259508
+Node: Control Letters261047
+Node: Format Modifiers264859
+Node: Printf Examples270868
+Node: Redirection273583
+Node: Special Files280567
+Node: Special FD281100
+Ref: Special FD-Footnote-1284725
+Node: Special Network284799
+Node: Special Caveats285649
+Node: Close Files And Pipes286445
+Ref: Close Files And Pipes-Footnote-1293468
+Ref: Close Files And Pipes-Footnote-2293616
+Node: Expressions293766
+Node: Values294898
+Node: Constants295574
+Node: Scalar Constants296254
+Ref: Scalar Constants-Footnote-1297113
+Node: Nondecimal-numbers297295
+Node: Regexp Constants300354
+Node: Using Constant Regexps300829
+Node: Variables303884
+Node: Using Variables304539
+Node: Assignment Options306263
+Node: Conversion308135
+Ref: table-locale-affects313511
+Ref: Conversion-Footnote-1314138
+Node: All Operators314247
+Node: Arithmetic Ops314877
+Node: Concatenation317382
+Ref: Concatenation-Footnote-1320175
+Node: Assignment Ops320295
+Ref: table-assign-ops325283
+Node: Increment Ops326694
+Node: Truth Values and Conditions330164
+Node: Truth Values331247
+Node: Typing and Comparison332296
+Node: Variable Typing333085
+Ref: Variable Typing-Footnote-1336982
+Node: Comparison Operators337104
+Ref: table-relational-ops337514
+Node: POSIX String Comparison341066
+Ref: POSIX String Comparison-Footnote-1342022
+Node: Boolean Ops342160
+Ref: Boolean Ops-Footnote-1346238
+Node: Conditional Exp346329
+Node: Function Calls348061
+Node: Precedence351655
+Node: Locales355324
+Node: Patterns and Actions356413
+Node: Pattern Overview357467
+Node: Regexp Patterns359136
+Node: Expression Patterns359679
+Node: Ranges363364
+Node: BEGIN/END366330
+Node: Using BEGIN/END367092
+Ref: Using BEGIN/END-Footnote-1369823
+Node: I/O And BEGIN/END369929
+Node: BEGINFILE/ENDFILE372211
+Node: Empty375115
+Node: Using Shell Variables375431
+Node: Action Overview377716
+Node: Statements380073
+Node: If Statement381927
+Node: While Statement383426
+Node: Do Statement385470
+Node: For Statement386626
+Node: Switch Statement389778
+Node: Break Statement391875
+Node: Continue Statement393865
+Node: Next Statement395658
+Node: Nextfile Statement398048
+Node: Exit Statement400689
+Node: Built-in Variables403105
+Node: User-modified404200
+Ref: User-modified-Footnote-1412555
+Node: Auto-set412617
+Ref: Auto-set-Footnote-1424968
+Ref: Auto-set-Footnote-2425173
+Node: ARGC and ARGV425229
+Node: Arrays429080
+Node: Array Basics430585
+Node: Array Intro431411
+Node: Reference to Elements435729
+Node: Assigning Elements437999
+Node: Array Example438490
+Node: Scanning an Array440222
+Node: Controlling Scanning442536
+Ref: Controlling Scanning-Footnote-1447469
+Node: Delete447785
+Ref: Delete-Footnote-1450550
+Node: Numeric Array Subscripts450607
+Node: Uninitialized Subscripts452790
+Node: Multi-dimensional454418
+Node: Multi-scanning457512
+Node: Arrays of Arrays459103
+Node: Functions463748
+Node: Built-in464567
+Node: Calling Built-in465645
+Node: Numeric Functions467633
+Ref: Numeric Functions-Footnote-1471465
+Ref: Numeric Functions-Footnote-2471822
+Ref: Numeric Functions-Footnote-3471870
+Node: String Functions472139
+Ref: String Functions-Footnote-1495636
+Ref: String Functions-Footnote-2495765
+Ref: String Functions-Footnote-3496013
+Node: Gory Details496100
+Ref: table-sub-escapes497779
+Ref: table-sub-posix-92499136
+Ref: table-sub-proposed500490
+Ref: table-posix-sub501847
+Ref: table-gensub-escapes503395
+Ref: Gory Details-Footnote-1504605
+Ref: Gory Details-Footnote-2504656
+Node: I/O Functions504807
+Ref: I/O Functions-Footnote-1511912
+Node: Time Functions512059
+Ref: Time Functions-Footnote-1522992
+Ref: Time Functions-Footnote-2523060
+Ref: Time Functions-Footnote-3523218
+Ref: Time Functions-Footnote-4523329
+Ref: Time Functions-Footnote-5523441
+Ref: Time Functions-Footnote-6523668
+Node: Bitwise Functions523934
+Ref: table-bitwise-ops524492
+Ref: Bitwise Functions-Footnote-1528716
+Node: Type Functions528900
+Node: I18N Functions529370
+Node: User-defined530997
+Node: Definition Syntax531801
+Ref: Definition Syntax-Footnote-1536711
+Node: Function Example536780
+Node: Function Caveats539374
+Node: Calling A Function539795
+Node: Variable Scope540910
+Node: Pass By Value/Reference543873
+Node: Return Statement547313
+Node: Dynamic Typing550294
+Node: Indirect Calls551029
+Node: Library Functions560714
+Ref: Library Functions-Footnote-1564227
+Ref: Library Functions-Footnote-2564370
+Node: Library Names564541
+Ref: Library Names-Footnote-1568012
+Ref: Library Names-Footnote-2568232
+Node: General Functions568318
+Node: Strtonum Function569271
+Node: Assert Function572201
+Node: Round Function575527
+Node: Cliff Random Function577070
+Node: Ordinal Functions578086
+Ref: Ordinal Functions-Footnote-1581156
+Ref: Ordinal Functions-Footnote-2581408
+Node: Join Function581617
+Ref: Join Function-Footnote-1583388
+Node: Getlocaltime Function583588
+Node: Data File Management587303
+Node: Filetrans Function587935
+Node: Rewind Function592074
+Node: File Checking593461
+Node: Empty Files594555
+Node: Ignoring Assigns596785
+Node: Getopt Function598338
+Ref: Getopt Function-Footnote-1609642
+Node: Passwd Functions609845
+Ref: Passwd Functions-Footnote-1618820
+Node: Group Functions618908
+Node: Walking Arrays626992
+Node: Sample Programs628561
+Node: Running Examples629238
+Node: Clones629966
+Node: Cut Program631190
+Node: Egrep Program641035
+Ref: Egrep Program-Footnote-1648808
+Node: Id Program648918
+Node: Split Program652534
+Ref: Split Program-Footnote-1656053
+Node: Tee Program656181
+Node: Uniq Program658984
+Node: Wc Program666413
+Ref: Wc Program-Footnote-1670679
+Ref: Wc Program-Footnote-2670879
+Node: Miscellaneous Programs670971
+Node: Dupword Program672159
+Node: Alarm Program674190
+Node: Translate Program678939
+Ref: Translate Program-Footnote-1683326
+Ref: Translate Program-Footnote-2683554
+Node: Labels Program683688
+Ref: Labels Program-Footnote-1687059
+Node: Word Sorting687143
+Node: History Sorting691027
+Node: Extract Program692866
+Ref: Extract Program-Footnote-1700349
+Node: Simple Sed700477
+Node: Igawk Program703539
+Ref: Igawk Program-Footnote-1718696
+Ref: Igawk Program-Footnote-2718897
+Node: Anagram Program719035
+Node: Signature Program722103
+Node: Internationalization723203
+Node: I18N and L10N724635
+Node: Explaining gettext725321
+Ref: Explaining gettext-Footnote-1730387
+Ref: Explaining gettext-Footnote-2730571
+Node: Programmer i18n730736
+Node: Translator i18n734936
+Node: String Extraction735729
+Ref: String Extraction-Footnote-1736690
+Node: Printf Ordering736776
+Ref: Printf Ordering-Footnote-1739560
+Node: I18N Portability739624
+Ref: I18N Portability-Footnote-1742073
+Node: I18N Example742136
+Ref: I18N Example-Footnote-1744771
+Node: Gawk I18N744843
+Node: Advanced Features745460
+Node: Nondecimal Data746964
+Node: Array Sorting748547
+Node: Controlling Array Traversal749244
+Node: Array Sorting Functions757482
+Ref: Array Sorting Functions-Footnote-1761156
+Ref: Array Sorting Functions-Footnote-2761249
+Node: Two-way I/O761443
+Ref: Two-way I/O-Footnote-1766875
+Node: TCP/IP Networking766945
+Node: Profiling769789
+Node: Debugger777243
+Node: Debugging778211
+Node: Debugging Concepts778644
+Node: Debugging Terms780500
+Node: Awk Debugging783097
+Node: Sample Debugging Session783989
+Node: Debugger Invocation784509
+Node: Finding The Bug785838
+Node: List of Debugger Commands792326
+Node: Breakpoint Control793660
+Node: Debugger Execution Control797324
+Node: Viewing And Changing Data800684
+Node: Execution Stack804040
+Node: Debugger Info805507
+Node: Miscellaneous Debugger Commands809488
+Node: Readline Support814933
+Node: Limitations815764
+Node: Arbitrary Precision Arithmetic818016
+Ref: Arbitrary Precision Arithmetic-Footnote-1819658
+Node: General Arithmetic819806
+Node: Floating Point Issues821526
+Node: String Conversion Precision822407
+Ref: String Conversion Precision-Footnote-1824113
+Node: Unexpected Results824222
+Node: POSIX Floating Point Problems826375
+Ref: POSIX Floating Point Problems-Footnote-1830200
+Node: Integer Programming830238
+Node: Floating-point Programming831991
+Ref: Floating-point Programming-Footnote-1838300
+Node: Floating-point Representation838564
+Node: Floating-point Context839729
+Ref: table-ieee-formats840571
+Node: Rounding Mode841957
+Ref: table-rounding-modes842436
+Ref: Rounding Mode-Footnote-1845442
+Node: Gawk and MPFR845623
+Node: Arbitrary Precision Floats846865
+Ref: Arbitrary Precision Floats-Footnote-1849294
+Node: Setting Precision849605
+Node: Setting Rounding Mode852338
+Ref: table-gawk-rounding-modes852742
+Node: Floating-point Constants853926
+Node: Changing Precision855350
+Ref: Changing Precision-Footnote-1856750
+Node: Exact Arithmetic856924
+Node: Arbitrary Precision Integers860032
+Ref: Arbitrary Precision Integers-Footnote-1863032
+Node: Dynamic Extensions863179
+Node: Extension Intro864556
+Node: Plugin License865764
+Node: Extension Mechanism Outline866449
+Ref: load-extension866866
+Ref: load-new-function868346
+Ref: call-new-function869329
+Node: Extension API Description871325
+Node: Extension API Functions Introduction872664
+Node: General Data Types877442
+Ref: General Data Types-Footnote-1883044
+Node: Requesting Values883343
+Ref: table-value-types-returned884074
+Node: Constructor Functions885030
+Node: Registration Functions888026
+Node: Extension Functions888711
+Node: Exit Callback Functions890885
+Node: Extension Version String892128
+Node: Input Parsers892778
+Node: Output Wrappers902495
+Node: Two-way processors906911
+Node: Printing Messages909041
+Ref: Printing Messages-Footnote-1910118
+Node: Updating `ERRNO'910270
+Node: Accessing Parameters911009
+Node: Symbol Table Access912241
+Node: Symbol table by name912753
+Node: Symbol table by cookie914328
+Ref: Symbol table by cookie-Footnote-1918457
+Node: Cached values918520
+Ref: Cached values-Footnote-1921963
+Node: Array Manipulation922054
+Ref: Array Manipulation-Footnote-1923152
+Node: Array Data Types923191
+Ref: Array Data Types-Footnote-1925894
+Node: Array Functions925986
+Node: Flattening Arrays929754
+Node: Creating Arrays936593
+Node: Extension API Variables941388
+Node: Extension Versioning942024
+Node: Extension API Informational Variables943925
+Node: Extension API Boilerplate945011
+Node: Finding Extensions948842
+Node: Extension Example949389
+Node: Internal File Description950127
+Node: Internal File Ops953815
+Ref: Internal File Ops-Footnote-1965262
+Node: Using Internal File Ops965402
+Ref: Using Internal File Ops-Footnote-1967755
+Node: Extension Samples968021
+Node: Extension Sample File Functions969545
+Node: Extension Sample Fnmatch978018
+Node: Extension Sample Fork979744
+Node: Extension Sample Inplace980962
+Node: Extension Sample Ord982657
+Node: Extension Sample Readdir983436
+Node: Extension Sample Revout984940
+Node: Extension Sample Rev2way985533
+Node: Extension Sample Read write array986223
+Node: Extension Sample Readfile988106
+Node: Extension Sample API Tests988863
+Node: Extension Sample Time989388
+Node: gawkextlib990695
+Node: Language History993076
+Node: V7/SVR3.1994598
+Node: SVR4996919
+Node: POSIX998361
+Node: BTL999369
+Node: POSIX/GNU1000174
+Node: Common Extensions1005709
+Node: Ranges and Locales1006816
+Ref: Ranges and Locales-Footnote-11011434
+Ref: Ranges and Locales-Footnote-21011461
+Ref: Ranges and Locales-Footnote-31011721
+Node: Contributors1011942
+Node: Installation1016238
+Node: Gawk Distribution1017132
+Node: Getting1017616
+Node: Extracting1018442
+Node: Distribution contents1020134
+Node: Unix Installation1025395
+Node: Quick Installation1026012
+Node: Additional Configuration Options1027974
+Node: Configuration Philosophy1029451
+Node: Non-Unix Installation1031793
+Node: PC Installation1032251
+Node: PC Binary Installation1033550
+Node: PC Compiling1035398
+Node: PC Testing1038342
+Node: PC Using1039518
+Node: Cygwin1043703
+Node: MSYS1044703
+Node: VMS Installation1045217
+Node: VMS Compilation1045820
+Ref: VMS Compilation-Footnote-11046827
+Node: VMS Installation Details1046885
+Node: VMS Running1048520
+Node: VMS Old Gawk1050127
+Node: Bugs1050601
+Node: Other Versions1054453
+Node: Notes1060109
+Node: Compatibility Mode1060909
+Node: Additions1061692
+Node: Accessing The Source1062619
+Node: Adding Code1064222
+Node: New Ports1070264
+Node: Derived Files1074399
+Ref: Derived Files-Footnote-11079720
+Ref: Derived Files-Footnote-21079754
+Ref: Derived Files-Footnote-31080354
+Node: Future Extensions1080452
+Node: Implementation Limitations1081033
+Node: Extension Design1082285
+Node: Old Extension Problems1083434
+Ref: Old Extension Problems-Footnote-11084942
+Node: Extension New Mechanism Goals1084999
+Ref: Extension New Mechanism Goals-Footnote-11088358
+Node: Extension Other Design Decisions1088544
+Node: Extension Future Growth1090650
+Node: Old Extension Mechansim1091471
+Node: Basic Concepts1093228
+Node: Basic High Level1093909
+Ref: figure-general-flow1094180
+Ref: figure-process-flow1094779
+Ref: Basic High Level-Footnote-11098008
+Node: Basic Data Typing1098193
+Node: Glossary1101548
+Node: Copying1126859
+Node: GNU Free Documentation License1164416
+Node: Index1189553
 
 End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index 6d476b7..6f44c96 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -765,6 +765,7 @@ particular records in a file and perform operations upon 
them.
 * Extension Sample Fnmatch::            An interface to @code{fnmatch()}.
 * Extension Sample Fork::               An interface to @code{fork()} and
                                         other process functions.
+* Extension Sample Inplace::            Enabling in-place file editing.
 * Extension Sample Ord::                Character to value to character
                                         conversions.
 * Extension Sample Readdir::            An interface to @code{readdir()}.
@@ -31156,7 +31157,7 @@ $ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk}
 
 This @value{SECTION} provides brief overviews of the sample extensions
 that come in the @command{gawk} distribution. Some of them are intended
-for production use, such the @code{filefuncs} and @code{readdir} extensions.
+for production use, such the @code{filefuncs}, @code{readdir} and 
@code{inplace} extensions.
 Others mainly provide example code that shows how to use the extension API.
 
 @menu
@@ -31164,6 +31165,7 @@ Others mainly provide example code that shows how to 
use the extension API.
 * Extension Sample Fnmatch::          An interface to @code{fnmatch()}.
 * Extension Sample Fork::             An interface to @code{fork()} and other
                                       process functions.
+* Extension Sample Inplace::          Enabling in-place file editing.
 * Extension Sample Ord::              Character to value to character
                                       conversions.
 * Extension Sample Readdir::          An interface to @code{readdir()}.
@@ -31504,6 +31506,59 @@ else
     print "hello from the parent"
 @end example
 
address@hidden Extension Sample Inplace
address@hidden Enabling in-place file editing.
+
+The @code{inplace} extension emulates the @command{sed} @option{-i} option.
+It uses the bundled @file{inplace.awk} include file to invoke the extension
+properly:
+
address@hidden
address@hidden file eg/lib/inplace.awk
address@hidden
+# inplace --- load and invoke the inplace extension.
+
+@@load "inplace"
+
+# Please set INPLACE_SUFFIX to make a backup copy.  For example,
+# you may want to set INPLACE_SUFFIX to .bak on the command-line or in a
+# BEGIN block.
+
+BEGINFILE @{
+       inplace_begin(FILENAME, INPLACE_SUFFIX)
address@hidden
+ENDFILE @{
+       inplace_end(FILENAME, INPLACE_SUFFIX)
address@hidden
address@hidden group
address@hidden endfile
address@hidden example
+
+For each regular file that is processed, the extension redirects stdout
+to a temporary file configured to have the same owner and permissions.
+After the file has been processed, stdout is restored to its default
+destination.  If @code{INPLACE_SUFFIX} is not an empty string, the
+original file will be linked to a backup filename created by appending
+that suffix.  Finally, the temporary file is renamed to the original filename.
+
+If any error is encountered, the extension issues a fatal error to terminate
+processing immediately without damaging the original file.
+
+Here are a couple of simple examples:
+
address@hidden
+$ @kbd{gawk -i inplace '@{gsub(/foo/, "bar")@} @address@hidden' file1 file2 
file3}
address@hidden example
+
+To keep a backup copy of the original files, try this:
+
address@hidden
+$ @kbd{gawk -i inplace -vINPLACE_SUFFIX=.bak '@{gsub(/foo/, "bar")@} 
@address@hidden' file1 file2 file3}
address@hidden example
+
+It is left as an exercise to write a wrapper script that presents an
+interface similar to the @command{sed} @option{-i} option.
+
 @node Extension Sample Ord
 @subsection Character and Numeric values: @code{ord()} and @code{chr()}
 
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 3091fac..7fea3bf 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-08         Andrew J. Schorr     <address@hidden>
+
+       * inplace.c: New extension to implement in-place editing.
+       * Makefile.am: Add inplace extension.
+
 2012-12-25         Arnold D. Robbins     <address@hidden>
 
        * filefuncs.3am, fnmatch.3am: Predefined variables are no
diff --git a/extension/Makefile.am b/extension/Makefile.am
index 33902a6..d5977f2 100644
--- a/extension/Makefile.am
+++ b/extension/Makefile.am
@@ -35,6 +35,7 @@ pkgextension_LTLIBRARIES =    \
        filefuncs.la    \
        fnmatch.la      \
        fork.la         \
+       inplace.la      \
        ordchr.la       \
        readdir.la      \
        readfile.la     \
@@ -60,6 +61,10 @@ fork_la_SOURCES       = fork.c
 fork_la_LDFLAGS       = $(MY_MODULE_FLAGS)
 fork_la_LIBADD        = $(MY_LIBS)
 
+inplace_la_SOURCES    = inplace.c
+inplace_la_LDFLAGS    = $(MY_MODULE_FLAGS)
+inplace_la_LIBADD     = $(MY_LIBS)
+
 ordchr_la_SOURCES     = ordchr.c
 ordchr_la_LDFLAGS     = $(MY_MODULE_FLAGS)
 ordchr_la_LIBADD      = $(MY_LIBS)
diff --git a/extension/Makefile.in b/extension/Makefile.in
index e0bb243..21a5663 100644
--- a/extension/Makefile.in
+++ b/extension/Makefile.in
@@ -155,6 +155,12 @@ fork_la_OBJECTS = $(am_fork_la_OBJECTS)
 fork_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(fork_la_LDFLAGS) \
        $(LDFLAGS) -o $@
+inplace_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_inplace_la_OBJECTS = inplace.lo
+inplace_la_OBJECTS = $(am_inplace_la_OBJECTS)
+inplace_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(inplace_la_LDFLAGS) $(LDFLAGS) -o $@
 ordchr_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
 am_ordchr_la_OBJECTS = ordchr.lo
 ordchr_la_OBJECTS = $(am_ordchr_la_OBJECTS)
@@ -217,15 +223,15 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) 
$(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
        $(LDFLAGS) -o $@
 SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \
-       $(fork_la_SOURCES) $(ordchr_la_SOURCES) $(readdir_la_SOURCES) \
-       $(readfile_la_SOURCES) $(revoutput_la_SOURCES) \
-       $(revtwoway_la_SOURCES) $(rwarray_la_SOURCES) \
-       $(testext_la_SOURCES) $(time_la_SOURCES)
+       $(fork_la_SOURCES) $(inplace_la_SOURCES) $(ordchr_la_SOURCES) \
+       $(readdir_la_SOURCES) $(readfile_la_SOURCES) \
+       $(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \
+       $(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES)
 DIST_SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \
-       $(fork_la_SOURCES) $(ordchr_la_SOURCES) $(readdir_la_SOURCES) \
-       $(readfile_la_SOURCES) $(revoutput_la_SOURCES) \
-       $(revtwoway_la_SOURCES) $(rwarray_la_SOURCES) \
-       $(testext_la_SOURCES) $(time_la_SOURCES)
+       $(fork_la_SOURCES) $(inplace_la_SOURCES) $(ordchr_la_SOURCES) \
+       $(readdir_la_SOURCES) $(readfile_la_SOURCES) \
+       $(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \
+       $(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        html-recursive info-recursive install-data-recursive \
        install-dvi-recursive install-exec-recursive \
@@ -434,6 +440,7 @@ pkgextension_LTLIBRARIES = \
        filefuncs.la    \
        fnmatch.la      \
        fork.la         \
+       inplace.la      \
        ordchr.la       \
        readdir.la      \
        readfile.la     \
@@ -455,6 +462,9 @@ fnmatch_la_LIBADD = $(MY_LIBS)
 fork_la_SOURCES = fork.c
 fork_la_LDFLAGS = $(MY_MODULE_FLAGS)
 fork_la_LIBADD = $(MY_LIBS)
+inplace_la_SOURCES = inplace.c
+inplace_la_LDFLAGS = $(MY_MODULE_FLAGS)
+inplace_la_LIBADD = $(MY_LIBS)
 ordchr_la_SOURCES = ordchr.c
 ordchr_la_LDFLAGS = $(MY_MODULE_FLAGS)
 ordchr_la_LIBADD = $(MY_LIBS)
@@ -587,6 +597,8 @@ fnmatch.la: $(fnmatch_la_OBJECTS) 
$(fnmatch_la_DEPENDENCIES) $(EXTRA_fnmatch_la_
        $(fnmatch_la_LINK) -rpath $(pkgextensiondir) $(fnmatch_la_OBJECTS) 
$(fnmatch_la_LIBADD) $(LIBS)
 fork.la: $(fork_la_OBJECTS) $(fork_la_DEPENDENCIES) 
$(EXTRA_fork_la_DEPENDENCIES) 
        $(fork_la_LINK) -rpath $(pkgextensiondir) $(fork_la_OBJECTS) 
$(fork_la_LIBADD) $(LIBS)
+inplace.la: $(inplace_la_OBJECTS) $(inplace_la_DEPENDENCIES) 
$(EXTRA_inplace_la_DEPENDENCIES) 
+       $(inplace_la_LINK) -rpath $(pkgextensiondir) $(inplace_la_OBJECTS) 
$(inplace_la_LIBADD) $(LIBS)
 ordchr.la: $(ordchr_la_OBJECTS) $(ordchr_la_DEPENDENCIES) 
$(EXTRA_ordchr_la_DEPENDENCIES) 
        $(ordchr_la_LINK) -rpath $(pkgextensiondir) $(ordchr_la_OBJECTS) 
$(ordchr_la_LIBADD) $(LIBS)
 readdir.la: $(readdir_la_OBJECTS) $(readdir_la_DEPENDENCIES) 
$(EXTRA_readdir_la_DEPENDENCIES) 
@@ -614,6 +626,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
address@hidden@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
diff --git a/extension/inplace.c b/extension/inplace.c
new file mode 100644
index 0000000..69b188b
--- /dev/null
+++ b/extension/inplace.c
@@ -0,0 +1,241 @@
+/*
+ * inplace.c - Provide support for in-place editing.
+ */
+
+/*
+ * Copyright (C) 2013 the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ * 
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;  /* for convenience macros to work */
+static awk_ext_id_t *ext_id;
+static const char *ext_version = "inplace extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+static struct {
+       char *tname;
+       int default_stdout;
+       int posrc;      /* return code from fgetpos */
+       fpos_t pos;
+} state = { NULL, -1 };
+
+/*
+ * XXX Known problems:
+ * 1. Should copy ACL.
+ * 2. Not reentrant, so will not work if multiple files are open at
+ *    the same time.  I'm not sure this is a meaningful problem in practice.
+ */
+
+static void
+at_exit(void *data, int exit_status)
+{
+       if (state.tname) {
+               unlink(state.tname);
+               free(state.tname);
+               state.tname = NULL;
+       }
+}
+
+/*
+ * N.B. Almost everything is a fatal error because this feature is typically
+ * used for one-liners where the user is not going to be worrying about
+ * checking errors.  If anything unexpected occurs, we want to abort
+ * immediately!
+ */
+
+static int
+invalid_filename(const awk_string_t *filename)
+{
+       return filename->len == 0 ||
+               (filename->len == 1 && *filename->str == '-');
+}
+
+/* do_inplace_begin --- start in-place editing */
+
+static awk_value_t *
+do_inplace_begin(int nargs, awk_value_t *result)
+{
+       awk_value_t filename, suffix;
+       struct stat sbuf;
+       char *p;
+       int fd;
+
+       assert(result != NULL);
+
+       if (state.tname)
+               fatal(ext_id, _("inplace_begin: in-place editing already 
active"));
+
+       if (nargs != 2)
+               fatal(ext_id, _("inplace_begin: expects 2 arguments but called 
with %d"), nargs);
+               
+       if (! get_argument(0, AWK_STRING, &filename))
+               fatal(ext_id, _("inplace_begin: cannot retrieve 1st argument as 
a string filename"));
+
+       if (! get_argument(1, AWK_STRING, &suffix))
+               suffix.str_value.str = NULL;
+
+       if (invalid_filename(&filename.str_value)) {
+               warning(ext_id, _("inplace_begin: disabling in-place editing 
for invalid FILENAME `%s'"),
+                       filename.str_value.str);
+               unset_ERRNO();
+               return make_number(-1, result);
+       }
+
+       if (stat(filename.str_value.str, & sbuf) < 0) {
+               warning(ext_id, _("inplace_begin: Cannot stat `%s' (%s)"),
+                       filename.str_value.str, strerror(errno));
+               update_ERRNO_int(errno);
+               return make_number(-1, result);
+       }
+
+       if (! S_ISREG(sbuf.st_mode)) {
+               warning(ext_id, _("inplace_begin: `%s' is not a regular file"),
+                       filename.str_value.str);
+               unset_ERRNO();
+               return make_number(-1, result);
+       }
+
+       /* create a temporary file to which to redirect stdout */
+       emalloc(state.tname, char *, filename.str_value.len+14, 
"do_inplace_begin");
+       sprintf(state.tname, "%s.gawk.XXXXXX", filename.str_value.str);
+
+       if ((fd = mkstemp(state.tname)) < 0)
+               fatal(ext_id, _("inplace_begin: mkstemp(`%s') failed (%s)"),
+                       state.tname, strerror(errno));
+
+       /* N.B. chown/chmod should be more portable than fchown/fchmod */
+       if (chown(state.tname, sbuf.st_uid, sbuf.st_gid) < 0)
+          chown(state.tname, -1, sbuf.st_gid);
+       if (chmod(state.tname, sbuf.st_mode) < 0)
+               fatal(ext_id, _("inplace_begin: chmod failed (%s)"),
+                       strerror(errno));
+
+       fflush(stdout);
+       /* N.B. fgetpos fails when stdout is a tty */
+       state.posrc = fgetpos(stdout, &state.pos);
+       if ((state.default_stdout = dup(STDOUT_FILENO)) < 0)
+               fatal(ext_id, _("inplace_begin: dup(stdout) failed (%s)"),
+                       strerror(errno));
+       if (dup2(fd, STDOUT_FILENO) < 0)
+               fatal(ext_id, _("inplace_begin: dup2(%d, stdout) failed (%s)"),
+                       fd, strerror(errno));
+       if (close(fd) < 0)
+               fatal(ext_id, _("inplace_begin: close(%d) failed (%s)"),
+                       fd, strerror(errno));
+       rewind(stdout);
+       return make_number(0, result);
+}
+
+/* do_inplace_end --- finish in-place editing */
+
+static awk_value_t *
+do_inplace_end(int nargs, awk_value_t *result)
+{
+       awk_value_t filename, suffix;
+
+       assert(result != NULL);
+
+       if (nargs != 2)
+               fatal(ext_id, _("inplace_begin: expects 2 arguments but called 
with %d"), nargs);
+
+       if (! get_argument(0, AWK_STRING, &filename))
+               fatal(ext_id, _("inplace_end: cannot retrieve 1st argument as a 
string filename"));
+
+       if (! get_argument(1, AWK_STRING, &suffix))
+               suffix.str_value.str = NULL;
+
+       if (! state.tname) {
+               if (! invalid_filename(&filename.str_value))
+                       warning(ext_id, _("inplace_end: in-place editing not 
active"));
+               return make_number(0, result);
+       }
+
+       fflush(stdout);
+       if (dup2(state.default_stdout, STDOUT_FILENO) < 0)
+               fatal(ext_id, _("inplace_end: dup2(%d, stdout) failed (%s)"),
+                       state.default_stdout, strerror(errno));
+       if (close(state.default_stdout) < 0)
+               fatal(ext_id, _("inplace_end: close(%d) failed (%s)"),
+                       state.default_stdout, strerror(errno));
+       state.default_stdout = -1;
+       if (state.posrc == 0 && fsetpos(stdout, &state.pos) < 0)
+               fatal(ext_id, _("inplace_end: fsetpos(stdout) failed (%s)"),
+                       strerror(errno));
+
+       if (suffix.str_value.str && suffix.str_value.str[0]) {
+               /* backup requested */
+               char *bakname;
+
+               emalloc(bakname, char *, 
filename.str_value.len+suffix.str_value.len+1,
+                       "do_inplace_end");
+               sprintf(bakname, "%s%s",
+                       filename.str_value.str, suffix.str_value.str);
+               unlink(bakname); /* if backup file exists already, remove it */
+               if (link(filename.str_value.str, bakname) < 0)
+                       fatal(ext_id, _("inplace_end: link(`%s', `%s') failed 
(%s)"),
+                               filename.str_value.str, bakname, 
strerror(errno));
+               free(bakname);
+       }
+
+       if (rename(state.tname, filename.str_value.str) < 0)
+               fatal(ext_id, _("inplace_end: rename(`%s', `%s') failed (%s)"),
+                       state.tname, filename.str_value.str, strerror(errno));
+       free(state.tname);
+       state.tname = NULL;
+       return make_number(0, result);
+}
+
+static awk_ext_func_t func_table[] = {
+       { "inplace_begin", do_inplace_begin, 2 },
+       { "inplace_end", do_inplace_end, 2 },
+};
+
+static awk_bool_t init_inplace(void)
+{
+       awk_atexit(at_exit, NULL);
+       return awk_true;
+}
+
+static awk_bool_t (*init_func)(void) = init_inplace;
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, inplace, "")

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

Summary of changes:
 awklib/ChangeLog          |    4 +
 awklib/eg/lib/inplace.awk |   14 +
 doc/ChangeLog             |    4 +
 doc/gawk.info             | 1144 +++++++++++++++++++++++----------------------
 doc/gawk.texi             |   57 +++-
 extension/ChangeLog       |    5 +
 extension/Makefile.am     |    5 +
 extension/Makefile.in     |   29 +-
 extension/inplace.c       |  241 ++++++++++
 9 files changed, 947 insertions(+), 556 deletions(-)
 create mode 100644 awklib/eg/lib/inplace.awk
 create mode 100644 extension/inplace.c


hooks/post-receive
-- 
gawk



reply via email to

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