Skip to content

Commit 20a787a

Browse files
deshipunotro
authored andcommitted
extmod/ure: Handle some escape sequences.
Fix MicroPython adafruit#3176 Handle escape sequences inside regular expressions. This adds handling for \a, \b, \f, \n, \r, \v and \\.
1 parent b9dc23c commit 20a787a

2 files changed

Lines changed: 54 additions & 5 deletions

File tree

extmod/re1.5/compilecode.c

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,29 @@
1010
#define EMIT(at, byte) (code ? (code[at] = byte) : (at))
1111
#define PC (prog->bytelen)
1212

13+
14+
static char unescape(char c) {
15+
switch (c) {
16+
case 'a':
17+
return '\a';
18+
case 'b':
19+
return '\b';
20+
case 'f':
21+
return '\f';
22+
case 'n':
23+
return '\n';
24+
case 'r':
25+
return '\r';
26+
case 'v':
27+
return '\v';
28+
case 'x':
29+
return '\\';
30+
default:
31+
return c;
32+
}
33+
}
34+
35+
1336
static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
1437
{
1538
char *code = sizecode ? NULL : prog->insts;
@@ -22,13 +45,16 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
2245
case '\\':
2346
re++;
2447
if (!*re) return NULL; // Trailing backslash
48+
term = PC;
2549
if ((*re | 0x20) == 'd' || (*re | 0x20) == 's' || (*re | 0x20) == 'w') {
26-
term = PC;
2750
EMIT(PC++, NamedClass);
2851
EMIT(PC++, *re);
29-
prog->len++;
30-
break;
52+
} else {
53+
EMIT(PC++, Char);
54+
EMIT(PC++, unescape(*re));
3155
}
56+
prog->len++;
57+
break;
3258
default:
3359
term = PC;
3460
EMIT(PC++, Char);
@@ -54,11 +80,21 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
5480
prog->len++;
5581
for (cnt = 0; *re != ']'; re++, cnt++) {
5682
if (!*re) return NULL;
57-
EMIT(PC++, *re);
83+
if (*re == '\\') {
84+
re += 1;
85+
EMIT(PC++, unescape(*re));
86+
} else {
87+
EMIT(PC++, *re);
88+
}
5889
if (re[1] == '-' && re[2] != ']') {
5990
re += 2;
6091
}
61-
EMIT(PC++, *re);
92+
if (*re == '\\') {
93+
re += 1;
94+
EMIT(PC++, unescape(*re));
95+
} else {
96+
EMIT(PC++, *re);
97+
}
6298
}
6399
EMIT(term + 1, cnt);
64100
break;

tests/extmod/ure1.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@
2828
except IndexError:
2929
print("IndexError")
3030

31+
r = re.compile(r"\n")
32+
m = r.match("\n")
33+
print(m.group(0))
34+
m = r.match("\\")
35+
print(m)
36+
r = re.compile(r"[\n-\r]")
37+
m = r.match("\n")
38+
print(m.group(0))
39+
r = re.compile(r"[\]]")
40+
m = r.match("]")
41+
print(m.group(0))
42+
print("===")
43+
3144
r = re.compile("[a-cu-z]")
3245
m = r.match("a")
3346
print(m.group(0))

0 commit comments

Comments
 (0)