diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2020-01-19 20:37:33 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2020-01-19 20:37:33 +0200 |
commit | de6284e0377e1c10f6249586df1a67311e9c5b2f (patch) | |
tree | c1250ac5c844611d0720188dda84b38a65685e24 | |
parent | df6ccd29820f4e51d15eff6dab3c62014e877550 (diff) | |
download | one-true-awk-de6284e0377e1c10f6249586df1a67311e9c5b2f.tar.gz |
Fix Issue 60; sub/gsub follow POSIX if POSIXLY_CORRECT in the environment.
-rw-r--r-- | FIXES | 5 | ||||
-rw-r--r-- | awk.1 | 10 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | run.c | 10 |
4 files changed, 26 insertions, 1 deletions
@@ -25,6 +25,11 @@ THIS SOFTWARE. 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>. @@ -502,6 +502,16 @@ functions may be called recursively. 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 @@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ -const char *version = "version 20200109"; +const char *version = "version 20200119"; #define DEBUG #include <stdio.h> @@ -1983,6 +1983,13 @@ void backsub(char **pb_ptr, const char **sptr_ptr) /* handle \\& variations */ { /* 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] == '&') { /* \\\& -> \& */ @@ -1992,6 +1999,9 @@ void backsub(char **pb_ptr, const char **sptr_ptr) /* handle \\& variations */ } else if (sptr[2] == '&') { /* \\& -> \ + matched */ *pb++ = '\\'; sptr += 2; + } else if (do_posix) { /* \\x -> \x */ + sptr++; + *pb++ = *sptr++; } else { /* \\x -> \\x */ *pb++ = *sptr++; *pb++ = *sptr++; |