summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2022-02-18 18:58:00 +0100
committerTyge Løvset <[email protected]>2022-02-18 18:58:00 +0100
commit575642c5f17e5a226cbfae7c4511583c964d5335 (patch)
treecd98cb9de1a6f7e2f8d9314b69e0fb497488a551
parent4ac5ef68726057ff97e56c951e4faeaa29995e40 (diff)
downloadSTC-modified-575642c5f17e5a226cbfae7c4511583c964d5335.tar.gz
STC-modified-575642c5f17e5a226cbfae7c4511583c964d5335.zip
Fixed \x{...} and \Q...\E modes.
-rw-r--r--src/cregex.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/cregex.c b/src/cregex.c
index be185a40..2518736a 100644
--- a/src/cregex.c
+++ b/src/cregex.c
@@ -566,12 +566,15 @@ nextc(Parser *par, Rune *rp)
{
if (par->lexdone) {
*rp = 0;
- return true;
+ return 1;
}
par->exprp += chartorune(rp, par->exprp);
if (*rp == '\\') {
+ if (par->litmode && *par->exprp != 'E')
+ return 1;
par->exprp += chartorune(rp, par->exprp);
- if (!par->litmode) switch (*rp) {
+ switch (*rp) {
+ case 'E': return par->litmode + 1;
case 't': *rp = '\t'; break;
case 'n': *rp = '\n'; break;
case 'r': *rp = '\r'; break;
@@ -585,8 +588,10 @@ nextc(Parser *par, Rune *rp)
case 'W': *rp = U8N_Xw; break;
case 'x': if (*par->exprp != '{') break;
*rp = 0; sscanf(++par->exprp, "%x", rp);
- while (*par->exprp) if (*par->exprp++ == '}') break;
- break;
+ while (*par->exprp) if (*(par->exprp++) == '}') break;
+ if (par->exprp[-1] != '}')
+ rcerror(par, creg_unmatchedrightparenthesis);
+ return 2;
case 'p': case 'P': { /* https://www.regular-expressions.info/unicode.html */
static struct { const char* c; int n, r; } cls[] = {
{"{Alpha}", 7, U8_LC}, {"{LC}", 4, U8_LC},
@@ -613,11 +618,12 @@ nextc(Parser *par, Rune *rp)
}
if (*rp < OPERATOR) {
rcerror(par, creg_unknownoperator);
- *rp = 0; break;
+ *rp = 0;
}
+ break;
}
}
- return true;
+ return 1;
}
if (*rp == 0)
par->lexdone = true;
@@ -631,8 +637,11 @@ lex(Parser *par)
start:
quoted = nextc(par, &par->yyrune);
if (quoted) {
- if (par->litmode) {
- if (par->yyrune == 'E') { par->litmode = false; goto start; }
+ if (quoted == 2) {
+ if (par->litmode && par->yyrune == 'E') {
+ par->litmode = false;
+ goto start;
+ }
return par->yyrune == 0 ? END : par->rune_type;
}
switch (par->yyrune) {
@@ -642,7 +651,8 @@ lex(Parser *par)
case 'A': return BOS;
case 'z': return EOS;
case 'Z': return EOZ;
- case 'Q': par->litmode = true; goto start;
+ case 'Q': par->litmode = true;
+ goto start;
default : return par->rune_type;
}
}