Got more regex tests passing

This commit is contained in:
Dan Hirsch 2013-05-24 02:50:05 +02:00
parent 0600440b7c
commit de38f7bce8
5 changed files with 54 additions and 18 deletions

View file

@ -41,13 +41,25 @@ static bool cs_ctrvm(HRVMProg *prog, void *env) {
h_rvm_insert_insn(prog, RVM_PUSH, 0);
uint16_t start = h_rvm_get_ip(prog);
for (size_t i=0; i<256; ++i) {
// TODO: merge ranges.
if (charset_isset(cs, i)) {
uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0);
h_rvm_insert_insn(prog, RVM_MATCH, i | i << 8);
h_rvm_insert_insn(prog, RVM_GOTO, 0);
h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog));
uint8_t range_start = 0;
bool collecting = false;
for (size_t i=0; i<257; ++i) {
// Position 256 is only there so that every included character has
// a non-included character after it.
if (i < 256 && charset_isset(cs, i)) {
if (!collecting) {
collecting = true;
range_start = i;
}
} else {
if (collecting) {
collecting = false;
uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0);
h_rvm_insert_insn(prog, RVM_MATCH, range_start | i << 8);
h_rvm_insert_insn(prog, RVM_GOTO, 0);
h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog));
}
}
}
h_rvm_insert_insn(prog, RVM_MATCH, 0x00FF);

View file

@ -97,7 +97,7 @@ static bool is_ctrvm(HRVMProg *prog, void* env) {
HIgnoreSeq *seq = (HIgnoreSeq*)env;
for (size_t i=0; i<seq->len; ++i) {
h_rvm_insert_insn(prog, RVM_PUSH, 0);
if (!h_compile_regex(prog, seq->parsers[i]->env))
if (!h_compile_regex(prog, seq->parsers[i]))
return false;
}
h_rvm_insert_insn(prog, RVM_ACTION, h_rvm_create_action(prog, h_svm_action_ignoreseq, env));

View file

@ -67,9 +67,15 @@ static bool ws_ctrvm(HRVMProg *prog, void *env) {
uint16_t start = h_rvm_get_ip(prog);
uint16_t next;
for (int i = 0; i < 6; i++) {
uint16_t ranges[2] = {
0x0d09,
0x2020,
};
for (int i = 0; i < 2; i++) {
next = h_rvm_insert_insn(prog, RVM_FORK, 0);
h_rvm_insert_insn(prog, RVM_MATCH, (SPACE_CHRS[i] << 8) | (SPACE_CHRS[i]));
h_rvm_insert_insn(prog, RVM_MATCH, ranges[i]);
h_rvm_insert_insn(prog, RVM_STEP, 0);
h_rvm_insert_insn(prog, RVM_GOTO, start);
h_rvm_patch_arg(prog, next, h_rvm_get_ip(prog));
}