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

This commit is contained in:
Arnold D. Robbins 2020-01-19 20:37:33 +02:00
parent df6ccd2982
commit de6284e037
4 changed files with 26 additions and 1 deletions

5
FIXES
View File

@ -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>.

10
awk.1
View File

@ -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

2
main.c
View File

@ -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>

10
run.c
View File

@ -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++;