Exemplo n.º 1
0
static bool opt_ctrvm(HRVMProg *prog, void* env) {
  h_rvm_insert_insn(prog, RVM_PUSH, 0);
  uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0);
  HParser *p = (HParser*) env;
  if (!h_compile_regex(prog, p))
    return false;
  h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog));
  h_rvm_insert_insn(prog, RVM_ACTION, h_rvm_create_action(prog, h_svm_action_optional, NULL));
  return true;
}
Exemplo n.º 2
0
static bool choice_ctrvm(HRVMProg *prog, void* env) {
  HSequence *s = (HSequence*)env;
  // NOTE(uucidl): stack allocation since this backend uses
  // setjmp/longjmp for error handling.
  STACK_VLA(uint16_t, gotos, s->len);
  for (size_t i=0; i<s->len; ++i) {
    uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0);
    if (!h_compile_regex(prog, s->p_array[i])) {
      return false;
    }
    gotos[i] = h_rvm_insert_insn(prog, RVM_GOTO, 65535);
    h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog));
  }
  h_rvm_insert_insn(prog, RVM_MATCH, 0x00FF); // fail.
  uint16_t jump = h_rvm_get_ip(prog);
  for (size_t i=0; i<s->len; ++i) {
      h_rvm_patch_arg(prog, gotos[i], jump);
  }
  return true;
}
Exemplo n.º 3
0
// FUTURE: this is horribly inefficient
static bool cs_ctrvm(HRVMProg *prog, void *env) {
  HCharset cs = (HCharset)env;
  h_rvm_insert_insn(prog, RVM_PUSH, 0);

  uint16_t start = 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-1) << 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);
  uint16_t jump = h_rvm_insert_insn(prog, RVM_STEP, 0);
  for (size_t i=start; i<jump; ++i) {
    if (RVM_GOTO == prog->insns[i].op)
      h_rvm_patch_arg(prog, i, jump);
  }

  h_rvm_insert_insn(prog, RVM_CAPTURE, 0);
  h_rvm_insert_insn(prog, RVM_ACTION, h_rvm_create_action(prog, h_svm_action_ch, env));
  return true;
}
Exemplo n.º 4
0
static bool ws_ctrvm(HRVMProg *prog, void *env) {
  HParser *p = (HParser*)env;
  uint16_t start = h_rvm_get_ip(prog);
  uint16_t next;

  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, 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));
  }
  return h_compile_regex(prog, p);
}