summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-10-22 22:23:47 +1100
committerDamien George <damien@micropython.org>2023-01-18 09:15:32 +1100
commit64193c7de9f53e01dca447a4a902398fe85b9c06 (patch)
tree1db9fbe0f3a774f643270f4e17de87ca5c925ea3
parentbd86ce5f8213398a196019ad517df42e27fc173d (diff)
lib/re1.5: Add support for named classes in class sets.
Total code size change of this and previous commit: bare-arm: +0 +0.000% minimal x86: +0 +0.000% unix x64: +32 +0.004% standard stm32: +24 +0.006% PYBV10 cc3200: +16 +0.009% esp8266: +20 +0.003% GENERIC esp32: +44 +0.003% GENERIC[incl +8(data)] mimxrt: +32 +0.009% TEENSY40 renesas-ra: +24 +0.004% RA6M2_EK nrf: +0 +0.000% pca10040 rp2: +24 +0.005% PICO samd: +32 +0.012% ADAFRUIT_ITSYBITSY_M4_EXPRESS Addresses issue #7920. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--lib/re1.5/charclass.c10
-rw-r--r--lib/re1.5/compilecode.c13
-rw-r--r--lib/re1.5/re1.5.h1
3 files changed, 20 insertions, 4 deletions
diff --git a/lib/re1.5/charclass.c b/lib/re1.5/charclass.c
index 7f6388c93..2553b4053 100644
--- a/lib/re1.5/charclass.c
+++ b/lib/re1.5/charclass.c
@@ -6,7 +6,15 @@ int _re1_5_classmatch(const char *pc, const char *sp)
int is_positive = (pc[-1] == Class);
int cnt = *pc++;
while (cnt--) {
- if (*sp >= *pc && *sp <= pc[1]) return is_positive;
+ if (*pc == RE15_CLASS_NAMED_CLASS_INDICATOR) {
+ if (_re1_5_namedclassmatch(pc + 1, sp)) {
+ return is_positive;
+ }
+ } else {
+ if (*sp >= *pc && *sp <= pc[1]) {
+ return is_positive;
+ }
+ }
pc += 2;
}
return !is_positive;
diff --git a/lib/re1.5/compilecode.c b/lib/re1.5/compilecode.c
index d4fc2a289..513a15597 100644
--- a/lib/re1.5/compilecode.c
+++ b/lib/re1.5/compilecode.c
@@ -66,14 +66,21 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode)
PC++; // Skip # of pair byte
prog->len++;
for (cnt = 0; *re != ']'; re++, cnt++) {
- if (*re == '\\') {
+ char c = *re;
+ if (c == '\\') {
++re;
+ c = *re;
+ if (MATCH_NAMED_CLASS_CHAR(c)) {
+ c = RE15_CLASS_NAMED_CLASS_INDICATOR;
+ goto emit_char_pair;
+ }
}
- if (!*re) return NULL;
- EMIT(PC++, *re);
+ if (!c) return NULL;
if (re[1] == '-' && re[2] != ']') {
re += 2;
}
+ emit_char_pair:
+ EMIT(PC++, c);
EMIT(PC++, *re);
}
EMIT_CHECKED(term + 1, cnt);
diff --git a/lib/re1.5/re1.5.h b/lib/re1.5/re1.5.h
index 81f43ed7f..b1ec01cbc 100644
--- a/lib/re1.5/re1.5.h
+++ b/lib/re1.5/re1.5.h
@@ -138,6 +138,7 @@ struct Subject {
#define NON_ANCHORED_PREFIX 5
#define HANDLE_ANCHORED(bytecode, is_anchored) ((is_anchored) ? (bytecode) + NON_ANCHORED_PREFIX : (bytecode))
+#define RE15_CLASS_NAMED_CLASS_INDICATOR 0
int re1_5_backtrack(ByteProg*, Subject*, const char**, int, int);
int re1_5_pikevm(ByteProg*, Subject*, const char**, int, int);