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 This file lists all bug fixes, changes, etc., made since the AWK book
was sent to the printers in August, 1987. 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: January 9, 2020:
Input/output errors on closing files are now fatal instead of Input/output errors on closing files are now fatal instead of
mere warnings. Thanks to Martijn Dekker <martijn@inlv.org>. 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. Parameters are local to the function; all other variables are global.
Thus local variables may be created by providing excess parameters in Thus local variables may be created by providing excess parameters in
the function definition. 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 .SH EXAMPLES
.TP .TP
.EX .EX

2
main.c
View File

@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE. THIS SOFTWARE.
****************************************************************/ ****************************************************************/
const char *version = "version 20200109"; const char *version = "version 20200119";
#define DEBUG #define DEBUG
#include <stdio.h> #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] == '\\' */ { /* sptr[0] == '\\' */
char *pb = *pb_ptr; char *pb = *pb_ptr;
const char *sptr = *sptr_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[1] == '\\') {
if (sptr[2] == '\\' && sptr[3] == '&') { /* \\\& -> \& */ 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 */ } else if (sptr[2] == '&') { /* \\& -> \ + matched */
*pb++ = '\\'; *pb++ = '\\';
sptr += 2; sptr += 2;
} else if (do_posix) { /* \\x -> \x */
sptr++;
*pb++ = *sptr++;
} else { /* \\x -> \\x */ } else { /* \\x -> \\x */
*pb++ = *sptr++; *pb++ = *sptr++;
*pb++ = *sptr++; *pb++ = *sptr++;