extmod: Pull in upstream changes to re1.5; fixes bug, adds named class.
This commit is contained in:
parent
2e24034c3f
commit
d09a5b51c2
|
@ -11,3 +11,23 @@ int _re1_5_classmatch(const char *pc, const char *sp)
|
||||||
}
|
}
|
||||||
return !is_positive;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -78,6 +78,13 @@ const char *_compilecode(const char *re, ByteProg *prog)
|
||||||
switch (*re) {
|
switch (*re) {
|
||||||
case '\\':
|
case '\\':
|
||||||
re++;
|
re++;
|
||||||
|
if ((*re | 0x20) == 'd' || (*re | 0x20) == 's' || (*re | 0x20) == 'w') {
|
||||||
|
term = pc;
|
||||||
|
EMIT(pc++, NamedClass);
|
||||||
|
EMIT(pc++, *re);
|
||||||
|
prog->len++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
term = pc;
|
term = pc;
|
||||||
EMIT(pc++, Char);
|
EMIT(pc++, Char);
|
||||||
|
@ -112,11 +119,12 @@ const char *_compilecode(const char *re, ByteProg *prog)
|
||||||
EMIT(term + 1, cnt);
|
EMIT(term + 1, cnt);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '(':
|
case '(': {
|
||||||
term = pc;
|
term = pc;
|
||||||
|
int sub = ++prog->sub;
|
||||||
|
|
||||||
EMIT(pc++, Save);
|
EMIT(pc++, Save);
|
||||||
EMIT(pc++, 2 * ++prog->sub);
|
EMIT(pc++, 2 * sub);
|
||||||
prog->len++;
|
prog->len++;
|
||||||
|
|
||||||
prog->bytelen = pc;
|
prog->bytelen = pc;
|
||||||
|
@ -124,10 +132,11 @@ const char *_compilecode(const char *re, ByteProg *prog)
|
||||||
pc = prog->bytelen;
|
pc = prog->bytelen;
|
||||||
|
|
||||||
EMIT(pc++, Save);
|
EMIT(pc++, Save);
|
||||||
EMIT(pc++, 2 * prog->sub + 1);
|
EMIT(pc++, 2 * sub + 1);
|
||||||
prog->len++;
|
prog->len++;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case '?':
|
case '?':
|
||||||
insert_code(code, term, 2, &pc);
|
insert_code(code, term, 2, &pc);
|
||||||
EMIT(term, Split);
|
EMIT(term, Split);
|
||||||
|
|
|
@ -82,6 +82,7 @@ enum /* Inst.opcode */
|
||||||
Any,
|
Any,
|
||||||
Class,
|
Class,
|
||||||
ClassNot,
|
ClassNot,
|
||||||
|
NamedClass,
|
||||||
|
|
||||||
ASSERTS = 0x50,
|
ASSERTS = 0x50,
|
||||||
Bol = ASSERTS,
|
Bol = ASSERTS,
|
||||||
|
@ -145,5 +146,6 @@ int re1_5_compilecode(ByteProg *prog, const char *re);
|
||||||
void re1_5_dumpcode(ByteProg *prog);
|
void re1_5_dumpcode(ByteProg *prog);
|
||||||
void cleanmarks(ByteProg *prog);
|
void cleanmarks(ByteProg *prog);
|
||||||
int _re1_5_classmatch(const char *pc, const char *sp);
|
int _re1_5_classmatch(const char *pc, const char *sp);
|
||||||
|
int _re1_5_namedclassmatch(const char *pc, const char *sp);
|
||||||
|
|
||||||
#endif /*_RE1_5_REGEXP__H*/
|
#endif /*_RE1_5_REGEXP__H*/
|
||||||
|
|
|
@ -30,6 +30,12 @@ recursiveloop(char *pc, const char *sp, Subject *input, const char **subp, int n
|
||||||
pc += *(unsigned char*)pc * 2 + 1;
|
pc += *(unsigned char*)pc * 2 + 1;
|
||||||
sp++;
|
sp++;
|
||||||
continue;
|
continue;
|
||||||
|
case NamedClass:
|
||||||
|
if (!_re1_5_namedclassmatch(pc, sp))
|
||||||
|
return 0;
|
||||||
|
pc++;
|
||||||
|
sp++;
|
||||||
|
continue;
|
||||||
case Match:
|
case Match:
|
||||||
return 1;
|
return 1;
|
||||||
case Jmp:
|
case Jmp:
|
||||||
|
|
Loading…
Reference in New Issue