コード例 #1
1
ファイル: regexp.cpp プロジェクト: Halfnhav/rubinius
  // Called with the individual regexp lock held.
  regex_t* Regexp::maybe_recompile(STATE, String* string) {
    const UChar *pat;
    const UChar *end;
    OnigEncoding enc;
    OnigErrorInfo err_info;
    int err;

    if(fixed_encoding_) return onig_source_data(state);

    Encoding* string_enc = string->encoding(state);
    regex_t* onig_encoded = onig_data_encoded(state, string_enc);

    if(onig_encoded) return onig_encoded;

    enc = string_enc->get_encoding();

    Encoding* source_enc = source()->encoding(state);
    String* converted = source()->convert_escaped(state, source_enc, fixed_encoding_);
    pat = (UChar*)converted->byte_address();
    end = pat + converted->byte_size();

    int options = onig_source_data(state)->options;
    OnigEncoding orig_enc = onig_source_data(state)->enc;
    regex_t* reg;

    err = onig_new(&reg, pat, end, options,
                   enc, ONIG_SYNTAX_RUBY, &err_info);

    // If it doesn't work out, then abort and reset the encoding back
    // and say that it's forced.
    if(err != ONIG_NORMAL) {

      err = onig_new(&reg, pat, end, options,
                     orig_enc, ONIG_SYNTAX_RUBY, &err_info);

      // Ok, wtf. Well, no way to proceed now.
      if(err != ONIG_NORMAL) {
        UChar onig_err_buf[ONIG_MAX_ERROR_MESSAGE_LEN];
        char err_buf[REGEXP_ONIG_ERROR_MESSAGE_LEN];
        onig_error_code_to_str(onig_err_buf, err, &err_info);
        snprintf(err_buf, REGEXP_ONIG_ERROR_MESSAGE_LEN, "%s: %s", onig_err_buf, pat);

        Exception::regexp_error(state, err_buf);
        return NULL;
      }

      string_enc = source_enc;
      fixed_encoding_ = true;
    }

    return make_managed(state, string_enc, reg);
  }
コード例 #2
1
cell AMX_NATIVE_CALL pawn_regex_set(AMX* amx, cell* params)
{
	const char *rexp = NULL;
	amx_StrParam(amx, params[1], rexp);
	if(rexp)
	{
		int aidi=(int)params[2];
		//logprintf("aidi %d", aidi);
		if(aidi>=0 && aidi<TotalExpressions)
		{
			onig_free(rexpression[aidi].RegExpr);
			onig_region_free(rexpression[aidi].zreg, 1);
			UChar* pattern = (UChar* )rexp;
			OnigErrorInfo einfo;
			rexpression[aidi].id = onig_new(&rexpression[aidi].RegExpr, pattern, pattern + strlen(rexp), ONIG_OPTION_NONE, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, &einfo);
			if(rexpression[aidi].id != ONIG_NORMAL)
			{
				UChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
				onig_error_code_to_str(s, rexpression[aidi].id, &einfo);
				logprintf("[REGEX ERROR]: %s | at index %d. regex_set aborted.", s, aidi);
				onig_free(rexpression[aidi].RegExpr);
				return -1;
			}
			rexpression[aidi].zreg = onig_region_new();
			//logprintf("aidi %d", aidi);
			return 1;
		}
		logprintf("[REGEX ERROR]: Call regex_set with undefined parameter at index %d", aidi);
		return -1;
	}
    return -1337;
}
コード例 #3
0
ファイル: php_mbregex.c プロジェクト: AllenJB/php-src
/* {{{ php_mbregex_compile_pattern */
static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, size_t patlen, OnigOptionType options, OnigEncoding enc, OnigSyntaxType *syntax)
{
	int err_code = 0;
	php_mb_regex_t *retval = NULL, *rc = NULL;
	OnigErrorInfo err_info;
	OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];

	rc = zend_hash_str_find_ptr(&MBREX(ht_rc), (char *)pattern, patlen);
	if (!rc || onig_get_options(rc) != options || onig_get_encoding(rc) != enc || onig_get_syntax(rc) != syntax) {
		if ((err_code = onig_new(&retval, (OnigUChar *)pattern, (OnigUChar *)(pattern + patlen), options, enc, syntax, &err_info)) != ONIG_NORMAL) {
			onig_error_code_to_str(err_str, err_code, &err_info);
			php_error_docref(NULL, E_WARNING, "mbregex compile err: %s", err_str);
			retval = NULL;
			goto out;
		}
		if (rc == MBREX(search_re)) {
			/* reuse the new rc? see bug #72399 */
			MBREX(search_re) = NULL;
		}
		zend_hash_str_update_ptr(&MBREX(ht_rc), (char *)pattern, patlen, retval);
	} else {
		retval = rc;
	}
out:
	return retval;
}
コード例 #4
0
ファイル: regposix.c プロジェクト: AxiosCros/php-src
extern int
regcomp(regex_t* reg, const char* pattern, int posix_options)
{
  int r, len;
  OnigSyntaxType* syntax = OnigDefaultSyntax;
  OnigOptionType options;

  if ((posix_options & REG_EXTENDED) == 0)
    syntax = ONIG_SYNTAX_POSIX_BASIC;

  options = syntax->options;
  if ((posix_options & REG_ICASE)   != 0)
    ONIG_OPTION_ON(options, ONIG_OPTION_IGNORECASE);
  if ((posix_options & REG_NEWLINE) != 0) {
    ONIG_OPTION_ON( options, ONIG_OPTION_NEGATE_SINGLELINE);
    ONIG_OPTION_OFF(options, ONIG_OPTION_SINGLELINE);
  }

  reg->comp_options = posix_options;

  ENC_STRING_LEN(OnigEncDefaultCharEncoding, pattern, len);
  r = onig_new(PONIG_C(reg), (UChar* )pattern, (UChar* )(pattern + len),
	       options, OnigEncDefaultCharEncoding, syntax,
	       (OnigErrorInfo* )NULL);
  if (r != ONIG_NORMAL) {
    return onig2posix_error_code(r);
  }

  reg->re_nsub = ONIG_C(reg)->num_mem;
  return 0;
}
コード例 #5
0
ファイル: chelper.c プロジェクト: admpub/gonigmo
int NewOnigRegex(char *pattern, int pattern_length, int option,
                  OnigRegex *regex, OnigRegion **region, OnigEncoding *encoding, OnigErrorInfo **error_info, char **error_buffer) {
    int ret = ONIG_NORMAL;
    int error_msg_len = 0;

    OnigUChar *pattern_start = (OnigUChar *) pattern;
    OnigUChar *pattern_end = (OnigUChar *) (pattern + pattern_length);

    *error_info = (OnigErrorInfo *) malloc(sizeof(OnigErrorInfo));
    memset(*error_info, 0, sizeof(OnigErrorInfo));

    *encoding = (void*)ONIG_ENCODING_UTF8;

    *error_buffer = (char*) malloc(ONIG_MAX_ERROR_MESSAGE_LEN * sizeof(char));

    memset(*error_buffer, 0, ONIG_MAX_ERROR_MESSAGE_LEN * sizeof(char));

    *region = onig_region_new();

    ret = onig_new(regex, pattern_start, pattern_end, (OnigOptionType)(option), *encoding, OnigDefaultSyntax, *error_info);

    if (ret != ONIG_NORMAL) {
        error_msg_len = onig_error_code_to_str((unsigned char*)(*error_buffer), ret, *error_info);
        if (error_msg_len >= ONIG_MAX_ERROR_MESSAGE_LEN) {
            error_msg_len = ONIG_MAX_ERROR_MESSAGE_LEN - 1;
        }
        (*error_buffer)[error_msg_len] = '\0';
    }
    return ret;
}
コード例 #6
0
cell AMX_NATIVE_CALL pawn_regex_match(AMX* amx, cell* params)
{
	regex_t* RegExpr;
	const char *rexp = NULL, *string = NULL;
	amx_StrParam(amx, params[1], string);
	amx_StrParam(amx, params[2], rexp);
	if(string && rexp)
	{
		int r=NULL;
		UChar* pattern = (UChar* )rexp;
		OnigErrorInfo einfo;
		r = onig_new(&RegExpr, pattern, pattern + strlen((char* )pattern), ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_PERL, &einfo);
		//logprintf("[REGEX DEBUG]: rexp %s",pattern);
		if(r != ONIG_NORMAL)
		{
			UChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
			onig_error_code_to_str(s, r, &einfo);
			logprintf("[REGEX ERROR]: %s", s);
			onig_free(RegExpr);
			return -1;
		}
		UChar* str = (UChar* )string;
		OnigRegion *region;
		region = onig_region_new();
		r = onig_match(RegExpr, str, str+strlen((char*) str), str, region, ONIG_OPTION_NONE);
		//logprintf("[REGEX DEBUG]: string %s",str);
		onig_region_free(region, 1);
		onig_free(RegExpr);
		//logprintf("[REGEX DEBUG]: return %d",r);
		return r;
	}
    return -1337;
}
コード例 #7
0
regexp_match::regexp_match(const std::string& regexp)
  : reg_(NULL) {
  const UChar* pattern = reinterpret_cast<const UChar*>(regexp.c_str());
  if (ONIG_NORMAL != onig_new(&reg_, pattern, pattern + regexp.size(),
        ONIG_OPTION_DEFAULT, ONIG_ENCODING_UTF8, ONIG_SYNTAX_PERL, NULL)) {
    throw JUBATUS_EXCEPTION(converter_exception("invalid regular expression"));
  }
}
コード例 #8
0
ファイル: regexp.cpp プロジェクト: Gimi/rubinius
  /*
   * This is a primitive so #initialize_copy can work.
   */
  Regexp* Regexp::initialize(STATE, String* pattern, Fixnum* options) {
    const UChar *pat;
    const UChar *end;
    OnigErrorInfo err_info;
    OnigOptionType opts;
    OnigEncoding enc;
    int err, num_names, kcode;

    pat = (UChar*)pattern->byte_address();
    end = pat + pattern->size();

    opts  = options->to_native();
    kcode = opts & KCODE_MASK;
    opts &= OPTION_MASK;

    if(kcode == 0) {
      enc = current_encoding(state);
    } else {
      // Don't attempt to fix the encoding later, it's been specified by the
      // user.
      enc = get_enc_from_kcode(kcode);
      forced_encoding_ = true;
    }

    thread::Mutex::LockGuard lg(state->shared().onig_lock());

    err = onig_new(&this->onig_data, pat, end, opts, enc, ONIG_SYNTAX_RUBY, &err_info);

    if(err != ONIG_NORMAL) {
      UChar onig_err_buf[ONIG_MAX_ERROR_MESSAGE_LEN];
      char err_buf[1024];
      onig_error_code_to_str(onig_err_buf, err, &err_info);
      snprintf(err_buf, 1024, "%s: %s", onig_err_buf, pat);

      Exception::regexp_error(state, err_buf);
      return 0;
    }

    this->source(state, pattern);

    num_names = onig_number_of_names(this->onig_data);

    if(num_names == 0) {
      this->names(state, nil<LookupTable>());
    } else {
      struct _gather_data gd;
      gd.state = state;
      LookupTable* tbl = LookupTable::create(state);
      gd.tbl = tbl;
      onig_foreach_name(this->onig_data, (int (*)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*))_gather_names, (void*)&gd);
      this->names(state, tbl);
    }

    make_managed(state);

    return this;
  }
コード例 #9
0
ファイル: operator.c プロジェクト: XLPE/groonga
static OnigRegex
regexp_compile(grn_ctx *ctx,
               const char *pattern,
               unsigned int pattern_len,
               OnigSyntaxType *syntax)
{
  OnigRegex regex;
  OnigEncoding onig_encoding;
  int onig_result;
  OnigErrorInfo onig_error_info;

  if (ctx->encoding == GRN_ENC_NONE) {
    return NULL;
  }

  switch (ctx->encoding) {
  case GRN_ENC_EUC_JP :
    onig_encoding = ONIG_ENCODING_EUC_JP;
    break;
  case GRN_ENC_UTF8 :
    onig_encoding = ONIG_ENCODING_UTF8;
    break;
  case GRN_ENC_SJIS :
    onig_encoding = ONIG_ENCODING_CP932;
    break;
  case GRN_ENC_LATIN1 :
    onig_encoding = ONIG_ENCODING_ISO_8859_1;
    break;
  case GRN_ENC_KOI8R :
    onig_encoding = ONIG_ENCODING_KOI8_R;
    break;
  default :
    return NULL;
  }

  onig_result = onig_new(&regex,
                         pattern,
                         pattern + pattern_len,
                         ONIG_OPTION_ASCII_RANGE |
                         ONIG_OPTION_MULTILINE,
                         onig_encoding,
                         syntax,
                         &onig_error_info);
  if (onig_result != ONIG_NORMAL) {
    char message[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(message, onig_result, onig_error_info);
    ERR(GRN_INVALID_ARGUMENT,
        "[operator][regexp] "
        "failed to create regular expression object: <%.*s>: %s",
        pattern_len, pattern,
        message);
    return NULL;
  }

  return regex;
}
コード例 #10
0
cell AMX_NATIVE_CALL pawn_regex_search(AMX* amx, cell* params)
{
	regex_t* RegExpr;
	const char *rexp = NULL, *string = NULL;
	cell* addr[2] = {NULL, NULL};
	amx_GetAddr(amx, params[3], &addr[0]);
    amx_GetAddr(amx, params[4], &addr[1]);
	amx_StrParam(amx, params[1], string);
	amx_StrParam(amx, params[2], rexp);
	if(string && rexp)
	{
		int r=NULL;
		UChar* pattern = (UChar* )rexp;
		OnigErrorInfo einfo;
		r = onig_new(&RegExpr, pattern, pattern + strlen((char* )pattern), ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_PERL, &einfo);
		//logprintf("[REGEX DEBUG]: rexp %s",pattern);
		if(r != ONIG_NORMAL)
		{
			UChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
			onig_error_code_to_str(s, r, &einfo);
			logprintf("[REGEX ERROR]: %s", s);
			onig_free(RegExpr);
			return -1;
		}
		UChar* str = (UChar* )string;
		OnigRegion *region;
		region = onig_region_new();
		r = onig_search(RegExpr, str, str+strlen((char*) str), str, str+strlen((char*) str), region, ONIG_OPTION_NONE);
		if(r>=0)
		{
			*addr[0]=r;
			*addr[1]=region->end[region->num_regs-1]-1;
		}
		else if(r==ONIG_MISMATCH)
		{
			*addr[0]=-1;
			*addr[1]=-1;
		}
		else
		{
			UChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
			onig_error_code_to_str(s, r);
			logprintf("[REGEX ERROR]: %s\n", s);
			onig_region_free(region, 1);
			onig_free(RegExpr);
			return -1;
		}
		//logprintf("[REGEX DEBUG]: string %s",str);
		onig_region_free(region, 1);
		onig_free(RegExpr);
		//logprintf("[REGEX DEBUG]: return %d",r);
		return 1;
	}
    return -1337;
}
コード例 #11
0
ファイル: regexp.cpp プロジェクト: DanielVartanov/rubinius
  // Called with the onig_lock held.
  void Regexp::maybe_recompile(STATE, String* string) {
    const UChar *pat;
    const UChar *end;
    OnigEncoding enc;
    OnigErrorInfo err_info;
    int err;

    if(fixed_encoding_) return;

    enc = string->get_encoding_kcode_fallback(state);

    if(enc == onig_data->enc) return;

    pat = (UChar*)source()->byte_address();
    end = pat + source()->byte_size();

    int options = onig_data->options;
    OnigEncoding orig_enc = onig_data->enc;

    err = onig_new(&this->onig_data, pat, end, options,
                   enc, ONIG_SYNTAX_RUBY, &err_info);

    // If it doesn't work out, then abort and reset the encoding back
    // and say that it's forced.
    if(err != ONIG_NORMAL) {

      err = onig_new(&this->onig_data, pat, end, options,
                     orig_enc, ONIG_SYNTAX_RUBY, &err_info);

      // Ok, wtf. Well, no way to proceed now.
      if(err != ONIG_NORMAL) {
        OnigUChar buf[1024];
        onig_error_code_to_str((UChar*)buf, err, &err_info);
        std::cout << "Fatal ONIG error: " << buf << "\n";
        assert(err == ONIG_NORMAL);
      }

      fixed_encoding_ = true;
    }

    make_managed(state);
  }
コード例 #12
0
ファイル: listcap.c プロジェクト: Jin-chan/Onigmo
extern int ex(unsigned char* str, unsigned char* pattern,
              OnigSyntaxType* syntax)
{
  int r;
  unsigned char *start, *range, *end;
  regex_t* reg;
  OnigErrorInfo einfo;
  OnigRegion *region;

  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),
	       ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, syntax, &einfo);
  if (r != ONIG_NORMAL) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r, &einfo);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  fprintf(stderr, "number of captures: %d\n", onig_number_of_captures(reg));
  fprintf(stderr, "number of capture histories: %d\n",
          onig_number_of_capture_histories(reg));

  region = onig_region_new();

  end   = str + strlen((char* )str);
  start = str;
  range = end;
  r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
  if (r >= 0) {
    int i;

    fprintf(stderr, "match at %d\n", r);
    for (i = 0; i < region->num_regs; i++) {
      fprintf(stderr, "%d: (%ld-%ld)\n", i, region->beg[i], region->end[i]);
    }
    fprintf(stderr, "\n");

    r = onig_capture_tree_traverse(region, ONIG_TRAVERSE_CALLBACK_AT_FIRST,
                                   node_callback, (void* )0);
  }
  else if (r == ONIG_MISMATCH) {
    fprintf(stderr, "search fail\n");
  }
  else { /* error */
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r);
    return -1;
  }

  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
  onig_free(reg);
  return 0;
}
コード例 #13
0
ファイル: regexp.c プロジェクト: suharahiromichi/prolog
static int 
regexp_main(char *pat0, char *str0) 
{ 
    int r; 
    unsigned char *start, *range, *end; 
    regex_t* reg; 
    OnigErrorInfo einfo; 
    OnigRegion *region; 
     
    static UChar* pattern; 
    static UChar* str; 
    int i; 
     
    pattern = (UChar* )pat0; 
    str = (UChar* )str0; 
     
    strcpy(data_str, str); 
    for (i = 0; i  NAMES; i ++) { 
        data_rslt[i].n[0] = 0; 
    } 
     
    r = onig_new(&reg, pattern, pattern + strlen((char* )pattern), 
                 ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo); 
    if (r != ONIG_NORMAL) { 
        char s[ONIG_MAX_ERROR_MESSAGE_LEN]; 
        onig_error_code_to_str(s, r, &einfo); 
        return -1; 
    } 
     
    region = onig_region_new(); 
     
    end   = str + strlen((char* )str); 
    start = str; 
    range = end; 
    r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE); 
    if (r = 0) { 
        r = onig_foreach_name(reg, name_callback, (void* )region); 
    } 
    else if (r == ONIG_MISMATCH) { 
        return 1; 
    } 
    else {                                  /* error */ 
        char s[ONIG_MAX_ERROR_MESSAGE_LEN]; 
        onig_error_code_to_str(s, r); 
        return -1; 
    } 
     
    onig_region_free(region, 1); 
    /* 1:free self, 0:free contents only */ 
    onig_free(reg); 
    onig_end(); 
    return 0; 
} 
コード例 #14
0
ファイル: crnl.c プロジェクト: Jin-chan/Onigmo
static int
x0(int no, char* pattern_arg, char* str_arg,
   int start_offset, int expected_from, int expected_to, int backward)
{
  int r;
  unsigned char *start, *range, *end;
  regex_t* reg;
  OnigErrorInfo einfo;
  OnigRegion *region;
  UChar *pattern, *str;

  pattern = (UChar* )pattern_arg;
  str     = (UChar* )str_arg;

  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),
	ONIG_OPTION_NEWLINE_CRLF, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, &einfo);
  if (r != ONIG_NORMAL) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r, &einfo);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  region = onig_region_new();

  end   = str + strlen((char* )str);
  if (backward) {
    start = end + start_offset;
    range = str;
  }
  else {
    start = str + start_offset;
    range = end;
  }
  r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
  if (r >= 0) {
    result(no, region->beg[0], region->end[0], expected_from, expected_to);
  }
  else if (r == ONIG_MISMATCH) {
    result(no, r, -1, expected_from, expected_to);
  }
  else { /* error */
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
  onig_free(reg);
  return 0;
}
コード例 #15
0
ファイル: simple.c プロジェクト: Jin-chan/Onigmo
extern int main(int argc, char* argv[])
{
  int r;
  unsigned char *start, *range, *end;
  regex_t* reg;
  OnigErrorInfo einfo;
  OnigRegion *region;

  static UChar* pattern = (UChar* )"a(.*)b|[e-f]+";
  static UChar* str     = (UChar* )"zzzzaffffffffb";

  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),
	ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
  if (r != ONIG_NORMAL) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r, &einfo);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  region = onig_region_new();

  end   = str + strlen((char* )str);
  start = str;
  range = end;
  r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
  if (r >= 0) {
    int i;

    fprintf(stderr, "match at %d\n", r);
    for (i = 0; i < region->num_regs; i++) {
      fprintf(stderr, "%d: (%ld-%ld)\n", i, region->beg[i], region->end[i]);
    }
    r = 0;
  }
  else if (r == ONIG_MISMATCH) {
    fprintf(stderr, "search fail\n");
    r = -1;
  }
  else { /* error */
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
  onig_free(reg);
  onig_end();
  return r;
}
コード例 #16
0
ファイル: read.c プロジェクト: tanaton/read2ch
static void get_thread(un2ch_t *get, unarray_t *tl, int board_no, MYSQL *mysql)
{
	unstr_t *data = 0;
	unstr_t *moto = 0;
	nich_t *nich = 0;
	size_t i = 0;
	regex_t *reg;
	OnigErrorInfo einfo;
	int r;

	if(get == NULL || tl == NULL){
		return;
	}
	pthread_mutex_lock(&g_onig_mutex);
	r = onig_new(&reg, (UChar *)g_pattern, (UChar *)(g_pattern + strlen(g_pattern)),
			ONIG_OPTION_NONE, ONIG_ENCODING_SJIS, ONIG_SYNTAX_PERL, &einfo);
	pthread_mutex_unlock(&g_onig_mutex);
	if(r != ONIG_NORMAL){
		UChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
		onig_error_code_to_str(s, r, &einfo);
		printf("ERROR: %s\n", s);
		return;
	}

	for(i = 0; i < tl->length; i++){
		nich = unarray_at(tl, i);
		un2ch_set_info(get, nich->server, nich->board, nich->thread);
		moto = unstr_file_get_contents(get->logfile);
		data = un2ch_get_data(get);
		if(unstr_empty(data)){
			printf("error %ld %s/%s/%s\n", get->code, nich->server->data,
					nich->board->data, nich->thread->data);
		} else {
			printf("code:%ld OK %s/%s/%s\n", get->code, nich->server->data,
					nich->board->data, nich->thread->data);
			if((board_no >= 0) && (mysql != NULL)){
				nich->reg = reg;
				nich->board_no = board_no;
				set_mysql_res(data, moto, nich, mysql);
			}
		}
		nich = NULL;
		unstr_delete(2, moto, data);
		/* 4秒止める */
		sleep(4);
	}
	pthread_mutex_lock(&g_onig_mutex);
	onig_free(reg);
	pthread_mutex_unlock(&g_onig_mutex);
}
コード例 #17
0
ファイル: names.c プロジェクト: arki91/oniguruma
extern int main(int argc, char* argv[])
{
  int r;
  unsigned char *start, *range, *end;
  regex_t* reg;
  OnigErrorInfo einfo;
  OnigRegion *region;

  static UChar* pattern = (UChar* )"(?<foo>a*)(?<bar>b*)(?<foo>c*)";
  static UChar* str = (UChar* )"aaabbbbcc";

  OnigEncoding use_encs[] = { ONIG_ENCODING_ASCII };
  onig_initialize(use_encs, sizeof(use_encs)/sizeof(use_encs[0]));

  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),
	ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
  if (r != ONIG_NORMAL) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r, &einfo);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  fprintf(stderr, "number of names: %d\n", onig_number_of_names(reg));

  region = onig_region_new();

  end   = str + strlen((char* )str);
  start = str;
  range = end;
  r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
  if (r >= 0) {
    fprintf(stderr, "match at %d\n\n", r);
    r = onig_foreach_name(reg, name_callback, (void* )region);
  }
  else if (r == ONIG_MISMATCH) {
    fprintf(stderr, "search fail\n");
  }
  else { /* error */
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r);
    return -1;
  }

  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
  onig_free(reg);
  onig_end();
  return 0;
}
コード例 #18
0
ファイル: regexp.cpp プロジェクト: letmefly/edbee-lib
    /// Constructs the OnigRegExp engine
    /// @param pattern the regular expression pattern
    /// @param caseSensitive is the regexp case senstitive
    /// @param syntax the syntax to use
    OnigRegExpEngine( const QString& pattern, bool caseSensitive, RegExp::Syntax syntax )
        : reg_(0)
        , region_(0)
        , pattern_(pattern)
    {
        const QChar* patternChars = pattern.constData();

        OnigSyntaxType* onigSyntax = ONIG_SYNTAX_DEFAULT;
        if( syntax == RegExp::SyntaxFixedString ) { onigSyntax = ONIG_SYNTAX_ASIS; }


        OnigOptionType onigOptions = ONIG_OPTION_NONE|ONIG_OPTION_CAPTURE_GROUP;
        if( !caseSensitive ) { onigOptions = onigOptions | ONIG_OPTION_IGNORECASE;}

        int result = onig_new(&reg_, (OnigUChar*)patternChars, (OnigUChar*)(patternChars + pattern.length()), onigOptions, ONIG_ENCODING_UTF16_LE, ONIG_SYNTAX_DEFAULT, &einfo_);
        valid_ = result == ONIG_NORMAL;
        fillError( result );
    }
コード例 #19
0
ファイル: onig.c プロジェクト: czrocklee/regex_test
void onig_find_all(char* pattern, char* subject, int subject_len, int repeat)
{
	regex_t* reg;
	OnigRegion *region;
	clock_t best_time = 0, time;
	unsigned char *ptr;
	int res, len, found;

	res = onig_new(&reg, (unsigned char *)pattern, (unsigned char *)pattern + strlen((char* )pattern),
		ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, NULL);
	if (res != ONIG_NORMAL) {
		printf("Onig compilation failed\n");
		return;
	}
	region = onig_region_new();
	if (!region) {
		printf("Cannot allocate region\n");
		return;
	}

	do {
		found = 0;
		ptr = (unsigned char *)subject;
		len = subject_len;

		time = clock();
		while (1) {
			res = onig_search(reg, ptr, ptr + len, ptr, ptr + len, region, ONIG_OPTION_NONE);
			if (res < 0)
				break;
			// printf("match: %d %d\n", (ptr - (unsigned char *)subject) + region->beg[0], (ptr - (unsigned char *)subject) + region->end[0]);
			ptr += region->end[0];
			len -= region->end[0];
			found++;
		}
		time = clock() - time;
		if (!best_time || time < best_time)
			best_time = time;
	} while (--repeat > 0);
	printResult("onig", best_time * 1000 / CLOCKS_PER_SEC, found);

	onig_region_free(region, 1);
	onig_free(reg);
}
コード例 #20
0
regexp_splitter::regexp_splitter(const std::string& regexp, int group)
    : reg_(NULL),
      group_(group) {
  if (group < 0) {
    throw JUBATUS_EXCEPTION(converter_exception("'group' must be positive"));
  }

  const UChar* pattern = reinterpret_cast<const UChar*>(regexp.data());
  if (ONIG_NORMAL != onig_new(&reg_, pattern, pattern + regexp.size(),
        ONIG_OPTION_DEFAULT, ONIG_ENCODING_UTF8, ONIG_SYNTAX_PERL, NULL)) {
    throw JUBATUS_EXCEPTION(converter_exception("invalid regular expression"));
  }

  const int num_capture = onig_number_of_captures(reg_);
  if (group > num_capture) {
    std::string msg = "regexp '" + regexp + "' only contains "
        + lexical_cast<std::string>(num_capture)
        + " groups, but 'group' is " + lexical_cast<std::string>(group);
    throw JUBATUS_EXCEPTION(converter_exception(msg));
  }
}
コード例 #21
0
ファイル: lonig.c プロジェクト: henryfung01/GameCode4
static int compile_regex (lua_State *L, const TArgComp *argC, TOnig **pud) {
  TOnig *ud;
  int r;

  ud = (TOnig*)lua_newuserdata (L, sizeof (TOnig));
  memset (ud, 0, sizeof (TOnig));           /* initialize all members to 0 */
  lua_pushvalue (L, LUA_ENVIRONINDEX);
  lua_setmetatable (L, -2);

  r = onig_new(&ud->reg, (CUC)argC->pattern, (CUC)argC->pattern + argC->patlen,
    argC->cflags, (OnigEncoding)argC->locale, (OnigSyntaxType*)argC->syntax,
    &ud->einfo);
  if (r != ONIG_NORMAL)
    return generate_error(L, ud, r);

  if ((ud->region = onig_region_new()) == NULL)
    return luaL_error(L, "`onig_region_new' failed");

  if (pud) *pud = ud;
  return 1;
}
コード例 #22
0
cell AMX_NATIVE_CALL pawn_regex_build(AMX* amx, cell* params)
{
	const char *rexp = NULL;
	amx_StrParam(amx, params[1], rexp);
	if(rexp)
	{
		UChar* pattern = (UChar* )rexp;
		OnigErrorInfo einfo;
		rexpression[TotalExpressions].id = onig_new(&rexpression[TotalExpressions].RegExpr, pattern, pattern + strlen(rexp), ONIG_OPTION_NONE, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, &einfo);
		if(rexpression[TotalExpressions].id != ONIG_NORMAL)
		{
			UChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
			onig_error_code_to_str(s, rexpression[TotalExpressions].id, &einfo);
			logprintf("[REGEX ERROR]: %s | at index %d. regex_exbuild aborted.", s, TotalExpressions);
			onig_free(rexpression[TotalExpressions].RegExpr);
			return -1;
		}
		rexpression[TotalExpressions].zreg = onig_region_new();
		return TotalExpressions++;
	}
    return -1337;
}
コード例 #23
0
ファイル: php_mbregex.c プロジェクト: Distrotech/php-src
/* {{{ php_mbregex_compile_pattern */
static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patlen, OnigOptionType options, OnigEncoding enc, OnigSyntaxType *syntax)
{
	int err_code = 0;
	php_mb_regex_t *retval = NULL, *rc = NULL;
	OnigErrorInfo err_info;
	OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];

	rc = zend_hash_str_find_ptr(&MBREX(ht_rc), (char *)pattern, patlen);
	if (!rc || rc->options != options || rc->enc != enc || rc->syntax != syntax) {
		if ((err_code = onig_new(&retval, (OnigUChar *)pattern, (OnigUChar *)(pattern + patlen), options, enc, syntax, &err_info)) != ONIG_NORMAL) {
			onig_error_code_to_str(err_str, err_code, err_info);
			php_error_docref(NULL, E_WARNING, "mbregex compile err: %s", err_str);
			retval = NULL;
			goto out;
		}
		zend_hash_str_update_ptr(&MBREX(ht_rc), (char *)pattern, patlen, retval);
	} else if (rc) {
		retval = rc;
	}
out:
	return retval;
}
コード例 #24
0
ファイル: onig-module.c プロジェクト: balagopalraj/clearlinux
/* Usage: reg = onig_new (pattern, options, enc, syntax) */
static void do_onig_new (void)
{
   const UChar* pattern;
   const UChar* pattern_end;
   OnigOptionType option;
   OnigEncoding enc;
   OnigSyntaxType *syntax;
   OnigErrorInfo err_info;
   Onig_Type *o;
   int status;

   syntax = ONIG_SYNTAX_PERL;
   if (SLinterp_is_utf8_mode ())
     enc = ONIG_ENCODING_UTF8;
   else
     enc = ONIG_ENCODING_ISO_8859_1;
   option = ONIG_OPTION_DEFAULT;

   switch (SLang_Num_Function_Args)
     {
      default:
	SLang_verror (SL_Usage_Error, "Usage: r = onig_new (pattern [,options [,encoding [,syntax]]])");
	return;

      case 4:
	if (NULL == (syntax = pop_onig_syntax ()))
	  return;
      case 3:
	if (NULL == (enc = pop_onig_encoding ()))
	  return;
      case 2:
	if (-1 == pop_onig_option (&option))
	  return;
      case 1:
	if (-1 == SLang_pop_slstring ((char **)&pattern))
	  return;
     }

   if (NULL == (o = (Onig_Type *) SLcalloc (1, sizeof (Onig_Type))))
     {
	SLfree ((char *)pattern);
	return;
     }

   pattern_end = pattern + strlen ((char *)pattern);

   status = onig_new (&o->re, pattern, pattern_end,
		      option, enc, syntax, &err_info);

   if (status != ONIG_NORMAL)
     {
	throw_onig_error (status, &err_info);
	SLang_free_slstring ((char *)pattern);
	free_onig_type (o);
	return;
     }

   if (NULL == (o->region = onig_region_new ()))
     {
	SLang_verror (slOnig_Error, "failed to allocate a region");
	SLang_free_slstring ((char *)pattern);
	free_onig_type (o);
	return;
     }

   SLang_free_slstring ((char *)pattern);
   (void) push_onig_type (o);	       /* frees it */
}
コード例 #25
0
ファイル: variables.c プロジェクト: yuryfdr/pbqsp
int qspArrayPos(QSPVariant *args, int argsCount, QSP_BOOL isRegExp)
{
    int num, count, ind;
    QSPVar *var;
    QSPVariant *val;
    QSP_CHAR *str;
    OnigUChar *tempBeg, *tempEnd;
    regex_t *onigExp;
    OnigErrorInfo onigInfo;
    QSP_BOOL isString;
    if (qspConvertVariantTo(args, argsCount == 2))
    {
        qspSetError(QSP_ERR_TYPEMISMATCH);
        return -1;
    }
    if (argsCount == 2)
    {
        str = QSP_STR(args[0]);
        ind = 0;
        val = args + 1;
    }
    else
    {
        qspConvertVariantTo(args + 1, QSP_TRUE);
        str = QSP_STR(args[1]);
        ind = QSP_NUM(args[0]);
        val = args + 2;
        if (ind < 0) ind = 0;
    }
    if (!(var = qspVarReferenceWithType(str, QSP_FALSE, &isString))) return -1;
    if (qspConvertVariantTo(val, isRegExp || isString))
    {
        qspSetError(QSP_ERR_TYPEMISMATCH);
        return -1;
    }
    if (isRegExp)
    {
        tempBeg = (OnigUChar *)QSP_PSTR(val);
        tempEnd = (OnigUChar *)qspStrEnd(QSP_PSTR(val));
        if (onig_new(&onigExp, tempBeg, tempEnd, ONIG_OPTION_DEFAULT, QSP_ONIG_ENC, ONIG_SYNTAX_PERL_NG, &onigInfo))
        {
            qspSetError(QSP_ERR_INCORRECTREGEXP);
            return -1;
        }
    }
    count = var->ValsCount;
    if (ind > count) ind = count;
    while (ind <= count)
    {
        if (val->IsStr)
        {
            if (!(ind < count && (str = var->Values[ind].Str))) str = QSP_FMT("");
            if (isRegExp)
            {
                tempBeg = (OnigUChar *)str;
                tempEnd = (OnigUChar *)qspStrEnd(str);
                if (onig_match(onigExp, tempBeg, tempEnd, tempBeg, 0, ONIG_OPTION_NONE) == tempEnd - tempBeg)
                {
                    onig_free(onigExp);
                    return ind;
                }
            }
            else if (!qspStrsComp(str, QSP_PSTR(val)))
                return ind;
        }
        else
        {
            num = (ind < count ? var->Values[ind].Num : 0);
            if (num == QSP_PNUM(val)) return ind;
        }
        ++ind;
    }
    if (isRegExp) onig_free(onigExp);
    return -1;
}
コード例 #26
0
ファイル: sql.c プロジェクト: TeXShop/TeXShop
extern int main(int argc, char* argv[])
{
  static OnigSyntaxType SQLSyntax;

  int r;
  unsigned char *start, *range, *end;
  regex_t* reg;
  OnigErrorInfo einfo;
  OnigRegion *region;

  static UChar* pattern = (UChar* )"\\_%\\\\__zz";
  static UChar* str = (UChar* )"a_abcabcabc\\ppzz";

  onig_set_syntax_op      (&SQLSyntax, ONIG_SYN_OP_VARIABLE_META_CHARACTERS);
  onig_set_syntax_op2     (&SQLSyntax, 0);
  onig_set_syntax_behavior(&SQLSyntax, 0);
  onig_set_syntax_options (&SQLSyntax, ONIG_OPTION_MULTILINE);
  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ESCAPE, (OnigCodePoint )'\\');
  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ANYCHAR, (OnigCodePoint )'_');
  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ANYTIME,
		     ONIG_INEFFECTIVE_META_CHAR);
  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ZERO_OR_ONE_TIME,
		     ONIG_INEFFECTIVE_META_CHAR);
  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ONE_OR_MORE_TIME,
		     ONIG_INEFFECTIVE_META_CHAR);
  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ANYCHAR_ANYTIME,
		     (OnigCodePoint )'%');

  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),
	       ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, &SQLSyntax, &einfo);
  if (r != ONIG_NORMAL) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r, &einfo);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  region = onig_region_new();

  end   = str + strlen((char* )str);
  start = str;
  range = end;
  r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
  if (r >= 0) {
    int i;

    fprintf(stderr, "match at %d\n", r);
    for (i = 0; i < region->num_regs; i++) {
      fprintf(stderr, "%d: (%ld-%ld)\n", i, region->beg[i], region->end[i]);
    }
  }
  else if (r == ONIG_MISMATCH) {
    fprintf(stderr, "search fail\n");
  }
  else { /* error */
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
  onig_free(reg);
  onig_end();
  return 0;
}
コード例 #27
0
ファイル: bregonig.cpp プロジェクト: k-takata/bregonig
bregonig *recompile_onig_ex(bregonig *rxold,
                            pattern_type type, const TCHAR *ptn,
                            const TCHAR *patternp, const TCHAR *patternendp,
                            const TCHAR *prerepp, const TCHAR *prerependp,
                            const TCHAR *optionp, const TCHAR *optionendp,
                            TCHAR *msg)
{
    int flag, compare;
    bregonig *rx;
    OnigOptionType option;
    OnigEncoding enc;
    TRACE0(_T("recompile_onig_ex()\n"));
    TRACE2(_T("patternp: %s, len: %d\n"), patternp, patternendp-patternp);
    TRACE2(_T("prerepp: %s, len: %d\n"), prerepp, prerependp-prerepp);
    TRACE2(_T("optionp: %s, len: %d\n"), optionp, optionendp-optionp);


    compare = compare_pattern(rxold, type, patternp, patternendp,
                              prerepp, prerependp, optionp, optionendp);
    TRACE1(_T("compare: %d\n"), compare);
    if (compare < 0) {
        // need to compile
        delete rxold;
        rxold = NULL;

        if (patternp == NULL
                || ((type == PTN_SUBST || type == PTN_TRANS) && prerepp == NULL)) {
            asc2tcs(msg, "invalid reg parameter", BREGEXP_MAX_ERROR_MESSAGE_LEN);
            return NULL;
        }
    } else {
        // no need to compile
        if (rxold->outp) {
            delete [] rxold->outp;
            rxold->outp = NULL;
        }
        if (rxold->splitp) {
            delete [] rxold->splitp;
            rxold->splitp = NULL;
        }
    }

    parse_option(optionp, optionendp, &option, &enc, &flag);

    if (type == PTN_TRANS) {
        if (compare == 0) {
            // no need to compile
            TRACE1(_T("rxold(1):0x%08x\n"), rxold);
            return rxold;
        }
        rx = trcomp(patternp, patternendp, prerepp, prerependp, flag, msg);
        if (rx == NULL) {
            return NULL;
        }
    } else {
        if (compare == 0) {
            // no need to compile
            TRACE1(_T("rxold(2):0x%08x\n"), rxold);
            return rxold;
        } else if (compare < 0) {
            // pattern string needs to compile.
            rx = new (std::nothrow) bregonig();
            if (rx == NULL) {
                asc2tcs(msg, "out of space regexp", BREGEXP_MAX_ERROR_MESSAGE_LEN);
                return NULL;
            }
            OnigErrorInfo err_info;
            int err_code = onig_new(&rx->reg,
                                    (UChar*) patternp, (UChar*) patternendp,
                                    option, enc, &OnigSyntaxPerl_NG_EX, &err_info);
            if (err_code != ONIG_NORMAL) {
                onig_err_to_bregexp_msg(err_code, &err_info, msg);
                delete rx;
                return NULL;
            }

            rx->nparens = onig_number_of_captures(rx->reg);	//
            rx->pmflags = flag;
        } else {
            // only replace string needs to compile.
            rx = rxold;
        }
        if (rxold != NULL && rxold->repstr != NULL) {
            delete rxold->repstr;
            rxold->repstr = NULL;
        }
        if (type == PTN_SUBST) {						// substitute
            try {
                rx->pmflags |= PMf_SUBSTITUTE;
                rx->repstr = compile_rep(rx, prerepp, prerependp);	// compile replace string
            } catch (std::exception& ex) {
                asc2tcs(msg, ex.what(), BREGEXP_MAX_ERROR_MESSAGE_LEN);
                delete rx;
                return NULL;
            }
        }
    }

    if (ptn != NULL) {
        size_t plen = _tcslen(ptn);
        delete [] rx->parap;
        rx->parap = new (std::nothrow) TCHAR[plen+1];	// parameter copy
        if (rx->parap == NULL) {
            asc2tcs(msg, "precompile out of space", BREGEXP_MAX_ERROR_MESSAGE_LEN);
            delete rx;
            return NULL;
        }
        memcpy(rx->parap, ptn, (plen+1)*sizeof(TCHAR));	// copy include null
        rx->paraendp = rx->parap + plen;
    }

    TCHAR *oldpatternp = rx->patternp;

    if (patternp == NULL) {
        patternp = rx->patternp;
        patternendp = rx->patternendp;
        optionp = rx->optionp;
        optionendp = rx->optionendp;
    }

    /* save pattern, replace and option string */
    ptrdiff_t len1 = patternendp - patternp;
    ptrdiff_t len2 = prerependp - prerepp;
    ptrdiff_t len3 = optionendp - optionp;
    rx->patternp = new (std::nothrow) TCHAR[len1+1 + len2+1 + len3+1];
    if (rx->patternp == NULL) {
        delete rx;
        delete [] oldpatternp;
        return NULL;
    }
    memcpy(rx->patternp, patternp, len1*sizeof(TCHAR));
    rx->patternp[len1] = 0;
    rx->patternendp = rx->patternp + len1;

    rx->prerepp = rx->patternp + len1 + 1;
    memcpy(rx->prerepp, prerepp, len2*sizeof(TCHAR));
    rx->prerepp[len2] = 0;
    rx->prerependp = rx->prerepp + len2;

    rx->optionp = rx->prerepp + len2 + 1;
    memcpy(rx->optionp, optionp, len3*sizeof(TCHAR));
    rx->optionp[len3] = 0;
    rx->optionendp = rx->optionp + len3;


    delete [] oldpatternp;

    TRACE1(_T("rx:0x%08x\n"), rx);
    return rx;
}
コード例 #28
0
/**
  Call the Oniguruma regex match API.

  Same parameters as RegularExpressionMatch, except SyntaxType is required.

  @param String         A pointer to a NULL terminated string to match against the
                        regular expression string specified by Pattern.

  @param Pattern        A pointer to a NULL terminated string that represents the
                        regular expression.
  @param SyntaxType     A pointer to the EFI_REGEX_SYNTAX_TYPE that identifies the
                        regular expression syntax type to use. May be NULL in which
                        case the function will use its default regular expression
                        syntax type.

  @param Result         On return, points to TRUE if String fully matches against
                        the regular expression Pattern using the regular expression
                        SyntaxType. Otherwise, points to FALSE.

  @param Captures       A Pointer to an array of EFI_REGEX_CAPTURE objects to receive
                        the captured groups in the event of a match. The full
                        sub-string match is put in Captures[0], and the results of N
                        capturing groups are put in Captures[1:N]. If Captures is
                        NULL, then this function doesn't allocate the memory for the
                        array and does not build up the elements. It only returns the
                        number of matching patterns in CapturesCount. If Captures is
                        not NULL, this function returns a pointer to an array and
                        builds up the elements in the array. CapturesCount is also
                        updated to the number of matching patterns found. It is the
                        caller's responsibility to free the memory pool in Captures
                        and in each CapturePtr in the array elements.

  @param CapturesCount  On output, CapturesCount is the number of matching patterns
                        found in String. Zero means no matching patterns were found
                        in the string.

  @retval  EFI_SUCCESS       Regex compilation and match completed successfully.
  @retval  EFI_DEVICE_ERROR  Regex compilation failed.

**/
STATIC
EFI_STATUS
OnigurumaMatch (
    IN  CHAR16                *String,
    IN  CHAR16                *Pattern,
    IN  EFI_REGEX_SYNTAX_TYPE *SyntaxType,
    OUT BOOLEAN               *Result,
    OUT EFI_REGEX_CAPTURE     **Captures,     OPTIONAL
    OUT UINTN                 *CapturesCount
)
{
    regex_t         *OnigRegex;
    OnigSyntaxType  *OnigSyntax;
    OnigRegion      *Region;
    INT32           OnigResult;
    OnigErrorInfo   ErrorInfo;
    CHAR8           ErrorMessage[ONIG_MAX_ERROR_MESSAGE_LEN];
    UINT32          Index;
    OnigUChar       *Start;
    EFI_STATUS      Status;


    Status = EFI_SUCCESS;

    //
    // Detemine the internal syntax type
    //
    OnigSyntax = ONIG_SYNTAX_DEFAULT;
    if (CompareGuid (SyntaxType, &gEfiRegexSyntaxTypePosixExtendedGuid)) {
        OnigSyntax = ONIG_SYNTAX_POSIX_EXTENDED;
    } else if (CompareGuid (SyntaxType, &gEfiRegexSyntaxTypePerlGuid)) {
        OnigSyntax = ONIG_SYNTAX_PERL;
    } else {
        DEBUG ((DEBUG_ERROR, "Unsupported regex syntax - using default\n"));
        return EFI_UNSUPPORTED;
    }

    //
    // Compile pattern
    //
    Start = (OnigUChar*)Pattern;
    OnigResult = onig_new (
                     &OnigRegex,
                     Start,
                     Start + onigenc_str_bytelen_null (CHAR16_ENCODING, Start),
                     ONIG_OPTION_DEFAULT,
                     CHAR16_ENCODING,
                     OnigSyntax,
                     &ErrorInfo
                 );

    if (OnigResult != ONIG_NORMAL) {
        onig_error_code_to_str (ErrorMessage, OnigResult, &ErrorInfo);
        DEBUG ((DEBUG_ERROR, "Regex compilation failed: %a\n", ErrorMessage));
        return EFI_DEVICE_ERROR;
    }

    //
    // Try to match
    //
    Start = (OnigUChar*)String;
    Region = onig_region_new ();
    if (Region == NULL) {
        onig_free (OnigRegex);
        return EFI_OUT_OF_RESOURCES;
    }
    OnigResult = onig_search (
                     OnigRegex,
                     Start,
                     Start + onigenc_str_bytelen_null (CHAR16_ENCODING, Start),
                     Start,
                     Start + onigenc_str_bytelen_null (CHAR16_ENCODING, Start),
                     Region,
                     ONIG_OPTION_NONE
                 );

    if (OnigResult >= 0) {
        *Result = TRUE;
    } else {
        *Result = FALSE;
        if (OnigResult != ONIG_MISMATCH) {
            onig_error_code_to_str (ErrorMessage, OnigResult);
            DEBUG ((DEBUG_ERROR, "Regex match failed: %a\n", ErrorMessage));
            onig_region_free (Region, 1);
            onig_free (OnigRegex);
            return EFI_DEVICE_ERROR;
        }
    }

    //
    // If successful, copy out the region (capture) information
    //
    if (*Result && Captures != NULL) {
        *CapturesCount = Region->num_regs;
        *Captures = AllocateZeroPool (*CapturesCount * sizeof(**Captures));
        if (*Captures != NULL) {
            for (Index = 0; Index < *CapturesCount; ++Index) {
                //
                // Region beg/end values represent bytes, not characters
                //
                (*Captures)[Index].Length = (Region->end[Index] - Region->beg[Index]) / sizeof(CHAR16);
                (*Captures)[Index].CapturePtr = AllocateCopyPool (
                                                    ((*Captures)[Index].Length) * sizeof (CHAR16),
                                                    (CHAR16*)((UINTN)String + Region->beg[Index])
                                                );
                if ((*Captures)[Index].CapturePtr == NULL) {
                    Status = EFI_OUT_OF_RESOURCES;
                    break;
                }
            }

            if (EFI_ERROR (Status)) {
                for (Index = 0; Index < *CapturesCount; ++Index) {
                    if ((*Captures)[Index].CapturePtr != NULL) {
                        FreePool ((CHAR16*)(*Captures)[Index].CapturePtr);
                    }
                }
                FreePool (*Captures);
            }
        }
    }

    onig_region_free (Region, 1);
    onig_free (OnigRegex);

    return Status;
}
コード例 #29
0
ファイル: regexp.cpp プロジェクト: DanielVartanov/rubinius
  /*
   * This is a primitive so #initialize_copy can work.
   */
  Regexp* Regexp::initialize(STATE, String* pattern, Fixnum* options) {
    const UChar *pat;
    const UChar *end;
    OnigErrorInfo err_info;
    OnigEncoding enc;

    OnigOptionType opts = options->to_native();

    if(LANGUAGE_18_ENABLED(state)) {
      int kcode = opts & KCODE_MASK;

      pat = (UChar*)pattern->byte_address();
      end = pat + pattern->byte_size();

      if(kcode == 0) {
        enc = pattern->get_encoding_kcode_fallback(state);
      } else {
        // Don't attempt to fix the encoding later, it's been specified by the
        // user.
        enc = get_enc_from_kcode(kcode);
        fixed_encoding_ = true;
      }
    } else {
      fixed_encoding_ = opts & OPTION_FIXEDENCODING;
      no_encoding_    = opts & OPTION_NOENCODING;

      Encoding* source_enc = pattern->encoding(state);

      switch(opts & KCODE_MASK) {
      case KCODE_NONE:
        source_enc = 0;
        no_encoding_ = true;
        break;
      case KCODE_EUC:
        source_enc = Encoding::find(state, "EUC-JP");
        fixed_encoding_ = true;
        break;
      case KCODE_SJIS:
        source_enc = Encoding::find(state, "Windows-31J");
        fixed_encoding_ = true;
        break;
      case KCODE_UTF8:
        source_enc = Encoding::utf8_encoding(state);
        fixed_encoding_ = true;
        break;
      }

      String* converted = pattern->convert_escaped(state, source_enc, fixed_encoding_);

      pat = (UChar*)converted->byte_address();
      end = pat + converted->byte_size();
      enc = source_enc->get_encoding();

      pattern = pattern->string_dup(state);
      pattern->encoding(state, source_enc);
    }

    utilities::thread::Mutex::LockGuard lg(state->shared().onig_lock());

    int err = onig_new(&this->onig_data, pat, end, opts & OPTION_MASK, enc, ONIG_SYNTAX_RUBY, &err_info);

    if(err != ONIG_NORMAL) {
      UChar onig_err_buf[ONIG_MAX_ERROR_MESSAGE_LEN];
      char err_buf[1024];
      onig_error_code_to_str(onig_err_buf, err, &err_info);
      snprintf(err_buf, 1024, "%s: %s", onig_err_buf, pat);

      Exception::regexp_error(state, err_buf);
      return 0;
    }

    this->source(state, pattern);

    int num_names = onig_number_of_names(this->onig_data);

    if(num_names == 0) {
      this->names(state, nil<LookupTable>());
    } else {
      struct _gather_data gd;
      gd.state = state;
      LookupTable* tbl = LookupTable::create(state);
      gd.tbl = tbl;
      onig_foreach_name(this->onig_data, (int (*)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*))_gather_names, (void*)&gd);
      this->names(state, tbl);
    }

    make_managed(state);

    return this;
  }
コード例 #30
0
static void xx(char* pattern, char* str, int from, int to, int mem, int not)
{
  int r;

#ifdef POSIX_TEST
  regex_t reg;
  char buf[200];
  regmatch_t pmatch[25];

  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);
  if (r) {
    regerror(r, &reg, buf, sizeof(buf));
    fprintf(err_file, "ERROR: %s\n", buf);
    nerror++;
    return ;
  }

  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);
  if (r != 0 && r != REG_NOMATCH) {
    regerror(r, &reg, buf, sizeof(buf));
    fprintf(err_file, "ERROR: %s\n", buf);
    nerror++;
    return ;
  }

  if (r == REG_NOMATCH) {
    if (not) {
      fprintf(stdout, "OK(N): /%s/ '%s'\n", pattern, str);
      nsucc++;
    }
    else {
      fprintf(stdout, "FAIL: /%s/ '%s'\n", pattern, str);
      nfail++;
    }
  }
  else {
    if (not) {
      fprintf(stdout, "FAIL(N): /%s/ '%s'\n", pattern, str);
      nfail++;
    }
    else {
      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {
        fprintf(stdout, "OK: /%s/ '%s'\n", pattern, str);
        nsucc++;
      }
      else {
        fprintf(stdout, "FAIL: /%s/ '%s' %d-%d : %d-%d\n", pattern, str,
	        from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);
        nfail++;
      }
    }
  }
  regfree(&reg);

#else
  regex_t* reg;
  OnigErrorInfo einfo;

  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + strlen(pattern)),
	       ONIG_OPTION_DEFAULT, ONIG_ENCODING_EUC_JP, ONIG_SYNTAX_DEFAULT, &einfo);
  if (r) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str((UChar* )s, r, &einfo);
    fprintf(err_file, "ERROR: %s\n", s);
    nerror++;
    return ;
  }

  r = onig_search(reg, (UChar* )str, (UChar* )(str + strlen(str)),
		  (UChar* )str, (UChar* )(str + strlen(str)),
		  region, ONIG_OPTION_NONE);
  if (r < ONIG_MISMATCH) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str((UChar* )s, r);
    fprintf(err_file, "ERROR: %s\n", s);
    nerror++;
    return ;
  }

  if (r == ONIG_MISMATCH) {
    if (not) {
      fprintf(stdout, "OK(N): /%s/ '%s'\n", pattern, str);
      nsucc++;
    }
    else {
      fprintf(stdout, "FAIL: /%s/ '%s'\n", pattern, str);
      nfail++;
    }
  }
  else {
    if (not) {
      fprintf(stdout, "FAIL(N): /%s/ '%s'\n", pattern, str);
      nfail++;
    }
    else {
      if (region->beg[mem] == from && region->end[mem] == to) {
        fprintf(stdout, "OK: /%s/ '%s'\n", pattern, str);
        nsucc++;
      }
      else {
        fprintf(stdout, "FAIL: /%s/ '%s' %d-%d : %d-%d\n", pattern, str,
	        from, to, region->beg[mem], region->end[mem]);
        nfail++;
      }
    }
  }
  onig_free(reg);
#endif
}