summaryrefslogtreecommitdiff
path: root/extmod
diff options
context:
space:
mode:
authorRadomir Dopieralski <openstack@sheep.art.pl>2017-07-25 01:09:47 +0200
committerNoralf Trønnes <noralf@tronnes.org>2019-02-14 15:42:25 +0100
commit20a787adb4140002acb8e5ea21536069e184ffaf (patch)
tree111dbf757ef46fb61d73b05217397607e702844a /extmod
parentb9dc23c070bde772a941f803d8fac9cafc0e163c (diff)
extmod/ure: Handle some escape sequences.
Fix MicroPython #3176 Handle escape sequences inside regular expressions. This adds handling for \a, \b, \f, \n, \r, \v and \\.
Diffstat (limited to 'extmod')
-rw-r--r--extmod/re1.5/compilecode.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/extmod/re1.5/compilecode.c b/extmod/re1.5/compilecode.c
index a685a508a..01d3d1498 100644
--- a/extmod/re1.5/compilecode.c
+++ b/extmod/re1.5/compilecode.c
@@ -10,6 +10,29 @@
#define EMIT(at, byte) (code ? (code[at] = byte) : (at))
#define PC (prog->bytelen)
+
+static char unescape(char c) {
+ switch (c) {
+ case 'a':
+ return '\a';
+ case 'b':
+ return '\b';
+ case 'f':
+ return '\f';
+ case 'n':
+ return '\n';
+ case 'r':
+ return '\r';
+ case 'v':
+ return '\v';
+ case 'x':
+ return '\\';
+ default:
+ return c;
+ }
+}
+
+
static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
{
char *code = sizecode ? NULL : prog->insts;
@@ -22,13 +45,16 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
case '\\':
re++;
if (!*re) return NULL; // Trailing backslash
+ term = PC;
if ((*re | 0x20) == 'd' || (*re | 0x20) == 's' || (*re | 0x20) == 'w') {
- term = PC;
EMIT(PC++, NamedClass);
EMIT(PC++, *re);
- prog->len++;
- break;
+ } else {
+ EMIT(PC++, Char);
+ EMIT(PC++, unescape(*re));
}
+ prog->len++;
+ break;
default:
term = PC;
EMIT(PC++, Char);
@@ -54,11 +80,21 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
prog->len++;
for (cnt = 0; *re != ']'; re++, cnt++) {
if (!*re) return NULL;
- EMIT(PC++, *re);
+ if (*re == '\\') {
+ re += 1;
+ EMIT(PC++, unescape(*re));
+ } else {
+ EMIT(PC++, *re);
+ }
if (re[1] == '-' && re[2] != ']') {
re += 2;
}
- EMIT(PC++, *re);
+ if (*re == '\\') {
+ re += 1;
+ EMIT(PC++, unescape(*re));
+ } else {
+ EMIT(PC++, *re);
+ }
}
EMIT(term + 1, cnt);
break;