aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/lib/re1.5/charclass.c
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2022-06-19 19:47:51 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2022-06-19 19:47:51 +0530
commit4fd287655a72b9aea14cdac715ad5b90ed082ed2 (patch)
tree65d393bc0e699dd12d05b29ba568e04cea666207 /circuitpython/lib/re1.5/charclass.c
parent0150f70ce9c39e9e6dd878766c0620c85e47bed0 (diff)
add circuitpython code
Diffstat (limited to 'circuitpython/lib/re1.5/charclass.c')
-rw-r--r--circuitpython/lib/re1.5/charclass.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/circuitpython/lib/re1.5/charclass.c b/circuitpython/lib/re1.5/charclass.c
new file mode 100644
index 0000000..7f6388c
--- /dev/null
+++ b/circuitpython/lib/re1.5/charclass.c
@@ -0,0 +1,33 @@
+#include "re1.5.h"
+
+int _re1_5_classmatch(const char *pc, const char *sp)
+{
+ // pc points to "cnt" byte after opcode
+ int is_positive = (pc[-1] == Class);
+ int cnt = *pc++;
+ while (cnt--) {
+ if (*sp >= *pc && *sp <= pc[1]) return is_positive;
+ pc += 2;
+ }
+ return !is_positive;
+}
+
+int _re1_5_namedclassmatch(const char *pc, const char *sp)
+{
+ // pc points to name of class
+ int off = (*pc >> 5) & 1;
+ if ((*pc | 0x20) == 'd') {
+ if (!(*sp >= '0' && *sp <= '9')) {
+ off ^= 1;
+ }
+ } else if ((*pc | 0x20) == 's') {
+ if (!(*sp == ' ' || (*sp >= '\t' && *sp <= '\r'))) {
+ off ^= 1;
+ }
+ } else { // w
+ if (!((*sp >= 'A' && *sp <= 'Z') || (*sp >= 'a' && *sp <= 'z') || (*sp >= '0' && *sp <= '9') || *sp == '_')) {
+ off ^= 1;
+ }
+ }
+ return off;
+}