Skip to content

Commit 297d846

Browse files
committed
modure: Update to re1.5 v0.6.1, fixed and extended character class support.
1 parent 391db86 commit 297d846

6 files changed

Lines changed: 35 additions & 9 deletions

File tree

extmod/re1.5/charclass.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
int _re1_5_classmatch(const char *pc, const char *sp)
44
{
55
// pc points to "cnt" byte after opcode
6+
int is_positive = (pc[-1] == Class);
67
int cnt = *pc++;
78
while (cnt--) {
8-
if (!(*sp >= *pc && *sp <= pc[1])) return 0;
9+
if (*sp >= *pc && *sp <= pc[1]) return is_positive;
10+
pc += 2;
911
}
10-
return 1;
11-
}
12+
return !is_positive;
13+
}

extmod/re1.5/compilecode.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ int re1_5_sizecode(const char *re)
4848
case '[': {
4949
pc += 2;
5050
re++;
51+
if (*re == '^') re++;
5152
while (*re != ']') {
5253
if (!*re) return -1;
5354
if (re[1] == '-') {
@@ -91,10 +92,15 @@ const char *_compilecode(const char *re, ByteProg *prog)
9192
case '[': {
9293
int cnt;
9394
term = pc;
94-
EMIT(pc++, Class);
95+
re++;
96+
if (*re == '^') {
97+
EMIT(pc++, ClassNot);
98+
re++;
99+
} else {
100+
EMIT(pc++, Class);
101+
}
95102
pc++; // Skip # of pair byte
96103
prog->len++;
97-
re++;
98104
for (cnt = 0; *re != ']'; re++, cnt++) {
99105
if (!*re) return NULL;
100106
EMIT(pc++, *re);

extmod/re1.5/dumpcode.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ void re1_5_dumpcode(ByteProg *prog)
3232
case Any:
3333
printf("any\n");
3434
break;
35-
case Class: {
36-
int num = code[pc++];
37-
printf("class %d", num);
35+
case Class:
36+
case ClassNot: {
37+
int num = code[pc];
38+
printf("class%s %d", (code[pc - 1] == ClassNot ? "not" : ""), num);
39+
pc++;
3840
while (num--) {
3941
printf(" 0x%02x-0x%02x", code[pc], code[pc + 1]);
4042
pc += 2;

extmod/re1.5/re1.5.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ enum /* Inst.opcode */
8181
Char = CONSUMERS,
8282
Any,
8383
Class,
84+
ClassNot,
8485

8586
ASSERTS = 0x50,
8687
Bol = ASSERTS,

extmod/re1.5/recursiveloop.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ recursiveloop(char *pc, const char *sp, Subject *input, const char **subp, int n
2424
sp++;
2525
continue;
2626
case Class:
27+
case ClassNot:
2728
if (!_re1_5_classmatch(pc, sp))
2829
return 0;
2930
pc += *(unsigned char*)pc * 2 + 1;

tests/extmod/ure1.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,27 @@
2020
except IndexError:
2121
print("IndexError")
2222

23-
r = re.compile("[a-c]")
23+
r = re.compile("[a-cu-z]")
2424
m = r.match("a")
2525
print(m.group(0))
26+
m = r.match("z")
27+
print(m.group(0))
2628
m = r.match("d")
2729
print(m)
2830
m = r.match("A")
2931
print(m)
32+
print("===")
33+
34+
r = re.compile("[^a-cu-z]")
35+
m = r.match("a")
36+
print(m)
37+
m = r.match("z")
38+
print(m)
39+
m = r.match("d")
40+
print(m.group(0))
41+
m = r.match("A")
42+
print(m.group(0))
43+
3044

3145
r = re.compile("o+")
3246
m = r.search("foobar")

0 commit comments

Comments
 (0)