Fix Issue 60; sub/gsub follow POSIX if POSIXLY_CORRECT in the environment.
This commit is contained in:
parent
df6ccd2982
commit
de6284e037
5
FIXES
5
FIXES
|
@ -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
10
awk.1
|
@ -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
2
main.c
|
@ -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
10
run.c
|
@ -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++;
|
||||||
|
|
Loading…
Reference in New Issue