shithub: trueawk

Download patch

ref: de6284e0377e1c10f6249586df1a67311e9c5b2f
parent: df6ccd29820f4e51d15eff6dab3c62014e877550
author: Arnold D. Robbins <arnold@skeeve.com>
date: Sun Jan 19 15:37:33 EST 2020

Fix Issue 60; sub/gsub follow POSIX if POSIXLY_CORRECT in the environment.

--- a/FIXES
+++ b/FIXES
@@ -25,6 +25,11 @@
 This file lists all bug fixes, changes, etc., made since the AWK book
 was sent to the printers in August, 1987.
 
+January 19, 2020:
+	If POSIXLY_CORRECT is set in the environment, then sub and gsub
+	use POSIX rules for multiple backslashes.  This fixes Issue #66,
+	while maintaining backwards compatibility.
+
 January 9, 2020:
 	Input/output errors on closing files are now fatal instead of
 	mere warnings. Thanks to Martijn Dekker <martijn@inlv.org>.
--- a/awk.1
+++ b/awk.1
@@ -502,6 +502,16 @@
 Parameters are local to the function; all other variables are global.
 Thus local variables may be created by providing excess parameters in
 the function definition.
+.SH ENVIRONMENT VARIABLES
+If
+.B POSIXLY_CORRECT
+is set in the environment, then
+.I awk
+follows the POSIX rules for
+.B sub
+and
+.B gsub
+with respect to consecutive backslashes and ampersands.
 .SH EXAMPLES
 .TP
 .EX
--- a/main.c
+++ b/main.c
@@ -22,7 +22,7 @@
 THIS SOFTWARE.
 ****************************************************************/
 
-const char	*version = "version 20200109";
+const char	*version = "version 20200119";
 
 #define DEBUG
 #include <stdio.h>
--- a/run.c
+++ b/run.c
@@ -1983,7 +1983,14 @@
 {						/* sptr[0] == '\\' */
 	char *pb = *pb_ptr;
 	const char *sptr = *sptr_ptr;
+	static bool first = true;
+	static bool do_posix = false;
 
+	if (first) {
+		first = false;
+		do_posix = (getenv("POSIXLY_CORRECT") != NULL);
+	}
+
 	if (sptr[1] == '\\') {
 		if (sptr[2] == '\\' && sptr[3] == '&') { /* \\\& -> \& */
 			*pb++ = '\\';
@@ -1992,6 +1999,9 @@
 		} else if (sptr[2] == '&') {	/* \\& -> \ + matched */
 			*pb++ = '\\';
 			sptr += 2;
+		} else if (do_posix) {		/* \\x -> \x */
+			sptr++;
+			*pb++ = *sptr++;
 		} else {			/* \\x -> \\x */
 			*pb++ = *sptr++;
 			*pb++ = *sptr++;
--