コード例 #1
0
ファイル: test.c プロジェクト: georgekola/tre
int main(int argc, char *argv[]){
    char *regex=argv[1];
    char *haystack=argv[2];

    
    regex_t preg;	  /* Compiled pattern to search for. */

    //errcode = tre_regcomp(&preg, regexp, comp_flags);
    int search_str_len=strlen(regex);
    int cflags= REG_ICASE;
    ret = tre_compile(&preg, (const tre_char_t *)regex, search_str_len, cflags);
    //extern int
    //    tre_reganexec(const regex_t *preg, const char *string, size_t len,
    //            regamatch_t *match, regaparams_t params, int eflags);
    tre_reganexec(&preg,haystack,strlen(haystack));

    int errcode;
    regamatch_t match;
    regmatch_t pmatch[1];
    memset(&match, 0, sizeof(match));
    regaparams_t match_params;
    memset(&match_params,0,sizeof(match_params));


}
コード例 #2
0
ファイル: ltre.c プロジェクト: michaeltalyansky/lrexlib
static int generic_atfind (lua_State *L, int tfind) {
  int res;
  TArgExec argE;
  TPosix *ud;
  regaparams_t argP;
  regamatch_t res_match;

  checkarg_atfind (L, &argE, &ud, &argP);
  if (argE.startoffset > (int)argE.textlen)
    return lua_pushnil(L), 1;

  argE.text += argE.startoffset;
  res_match.nmatch = ALG_NSUB(ud) + 1;
  res_match.pmatch = ud->match;

  /* execute the search */
  res = tre_reganexec (&ud->r, argE.text, argE.textlen - argE.startoffset,
                   &res_match, argP, argE.eflags);
  if (ALG_ISMATCH (res)) {
    ALG_PUSHOFFSETS (L, ud, argE.startoffset, 0);
    if (tfind)
      push_substring_table (L, ud, argE.text);
    else
      push_offset_table (L, ud, argE.startoffset);
    /* set values in the dictionary part of the table */
    set_int_field (L, "cost", res_match.cost);
    set_int_field (L, "num_ins", res_match.num_ins);
    set_int_field (L, "num_del", res_match.num_del);
    set_int_field (L, "num_subst", res_match.num_subst);
    return 3;
  }
  else if (ALG_NOMATCH (res))
    return lua_pushnil (L), 1;
  else
    return generate_error (L, ud, res);
}
コード例 #3
0
ファイル: regexec.c プロジェクト: 4sp1r3/tre
int
tre_regaexec(const regex_t *preg, const char *str,
	 regamatch_t *match, regaparams_t params, int eflags)
{
  return tre_reganexec(preg, str, (unsigned)-1, match, params, eflags);
}
コード例 #4
0
ファイル: tre.c プロジェクト: junegunn/tre-ruby
static VALUE
tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params,
		VALUE ignore_case, VALUE multi_line, int num_captures, VALUE repeat) {

	// Compile once
	regex_t preg;
	tre_compile_regex(&preg, pattern, ignore_case, multi_line);

	// Build regaparams
	regaparams_t aparams;
	tre_build_aparams(&aparams, params);

	// Match data
	regamatch_t match;
	regmatch_t pmatch[num_captures + 1];
	// memset(&match, 0, sizeof(match));
	match.nmatch = num_captures + 1;
	match.pmatch = pmatch;

	// Scan
	VALUE arr = rb_ary_new();
	long char_offset_acc = char_offset;
	// rb_global_variable(&arr);

	while (1) {
		// Get substring to start with
		long char_len = CHAR_LENGTH(string) - char_offset;
		if (char_len <= 0) break;
		string = rb_str_substr(string, char_offset, char_len);

		int result = tre_reganexec(&preg, StringValuePtr(string), 
											RSTRING_LEN(string), &match, aparams, 0);

		if (result == REG_NOMATCH) break;

		// Fill in array with ranges
		VALUE subarr;
		if (match.nmatch == 1) 
			subarr = arr;	// Faking.. kind of.
		else {
			subarr = rb_ary_new();
			// rb_global_variable(&subarr);
		}

		unsigned int i;
		for (i = 0; i < match.nmatch; ++i)
			// No match
			if (match.pmatch[i].rm_so == -1)
				rb_ary_push(subarr, Qnil);
			// Match => Range
			else {
				VALUE range = rb_range_new(
						LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_so) ),
						LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_eo) ),
						1);
				// rb_global_variable(&range);

				rb_ary_push(subarr, range);
			}
		if (match.nmatch > 1) rb_ary_push(arr, subarr);

		// Stop or proceed
		if (repeat == Qfalse)
			break;
		else {
			char_offset = BYTE_TO_CHAR(string, match.pmatch[0].rm_eo);
			if (char_offset == 0) char_offset = 1; // Weird case
			char_offset_acc += char_offset;
		}
	}

	// Free once
	tre_regfree(&preg);

	return arr;
}