resolve parsing of a slash character within a cclass "/[/]/" without escape
This commit is contained in:
parent
c50ef66d11
commit
d91c473c7c
33
lex.c
33
lex.c
@ -523,11 +523,12 @@ int regexpr(void)
|
|||||||
static char *buf = NULL;
|
static char *buf = NULL;
|
||||||
static int bufsz = 500;
|
static int bufsz = 500;
|
||||||
char *bp;
|
char *bp;
|
||||||
|
int brackets = 0;
|
||||||
|
|
||||||
if (buf == NULL && (buf = (char *) malloc(bufsz)) == NULL)
|
if (buf == NULL && (buf = (char *) malloc(bufsz)) == NULL)
|
||||||
FATAL("out of space for rex expr");
|
FATAL("out of space for reg expr");
|
||||||
bp = buf;
|
bp = buf;
|
||||||
for ( ; (c = input()) != '/' && c != 0; ) {
|
for ( ; ((c = input()) != '/' || brackets > 0) && c != 0; ) {
|
||||||
if (!adjbuf(&buf, &bufsz, bp-buf+3, 500, &bp, "regexpr"))
|
if (!adjbuf(&buf, &bufsz, bp-buf+3, 500, &bp, "regexpr"))
|
||||||
FATAL("out of space for reg expr %.10s...", buf);
|
FATAL("out of space for reg expr %.10s...", buf);
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
@ -538,6 +539,34 @@ int regexpr(void)
|
|||||||
} else if (c == '\\') {
|
} else if (c == '\\') {
|
||||||
*bp++ = '\\';
|
*bp++ = '\\';
|
||||||
*bp++ = input();
|
*bp++ = input();
|
||||||
|
} else if (c == '[') {
|
||||||
|
*bp++ = c;
|
||||||
|
brackets++;
|
||||||
|
if ((c = input()) == '^') {
|
||||||
|
*bp++ = c;
|
||||||
|
if ((c = input()) == ']') {
|
||||||
|
*bp++ = c;
|
||||||
|
if ((c = input()) == '[')
|
||||||
|
*bp++ = c;
|
||||||
|
else
|
||||||
|
unput(c);
|
||||||
|
} else if (c == '[') {
|
||||||
|
*bp++ = c;
|
||||||
|
} else
|
||||||
|
unput(c);
|
||||||
|
} else if (c == ']') { /* []] is ok */
|
||||||
|
*bp++ = c;
|
||||||
|
if ((c = input()) == '[')
|
||||||
|
*bp++ = c;
|
||||||
|
else
|
||||||
|
unput(c);
|
||||||
|
} else if (brackets == 1 && c == '[') { /* [[] is also ok */
|
||||||
|
*bp++ = c;
|
||||||
|
} else
|
||||||
|
unput(c);
|
||||||
|
} else if (c == ']') {
|
||||||
|
*bp++ = c;
|
||||||
|
brackets--;
|
||||||
} else {
|
} else {
|
||||||
*bp++ = c;
|
*bp++ = c;
|
||||||
}
|
}
|
||||||
|
@ -164,10 +164,6 @@ $awk 'BEGIN { unireghf() }
|
|||||||
function unireghf(hfeed) { hfeed[1] = 0 }'
|
function unireghf(hfeed) { hfeed[1] = 0 }'
|
||||||
if test -r core; then echo 1>&2 "BAD: T.misc unireghf dropped core"; fi
|
if test -r core; then echo 1>&2 "BAD: T.misc unireghf dropped core"; fi
|
||||||
|
|
||||||
echo x | $awk '/[/]/' 2>foo
|
|
||||||
grep 'nonterminated character class' foo >/dev/null || error 'BAD: T.misc nonterminated fails'
|
|
||||||
if test -r core; then echo 1>&2 "BAD: T.misc nonterminated dropped core"; fi
|
|
||||||
|
|
||||||
$awk '
|
$awk '
|
||||||
function f() { return 12345 }
|
function f() { return 12345 }
|
||||||
BEGIN { printf "<%s>\n", f() }
|
BEGIN { printf "<%s>\n", f() }
|
||||||
|
Loading…
Reference in New Issue
Block a user