/* Return the number of times the regular expression "regexp_cstr" * uniquely matches against the input string "s". */ static unsigned long regcount(const char* regexp_cstr, Tcl_Obj* s) { int regexec_rv = 0; int index = 0; int index_max = 0; unsigned long rv = 0; Tcl_Obj* regexp_cstr_obj = NULL; Tcl_RegExp regexp = NULL; struct Tcl_RegExpInfo info = {0}; /* Get "regexp_cstr" as a Tcl string object. */ regexp_cstr_obj = Tcl_NewStringObj(regexp_cstr, strlen(regexp_cstr)); Tcl_IncrRefCount(regexp_cstr_obj); /* Compile the regular expression. */ regexp = Tcl_GetRegExpFromObj(NULL, regexp_cstr_obj, TCL_REG_ADVANCED | TCL_REG_NOCASE | TCL_REG_NEWLINE); if (!regexp) { fprintf(stderr, "*** Error: Tcl_GetRegExpFromObj: failed"); exit(1); } /* Iterate over each match. */ index = 0; index_max = Tcl_GetCharLength(s); while (index < index_max) { /* Test for a match. */ regexec_rv = Tcl_RegExpExecObj(NULL, regexp, s, index, 1, 0); if (regexec_rv == -1) { fprintf(stderr, "*** Error: Tcl_RegExpExecObj: failed"); exit(1); } if (regexec_rv == 0) { /* No matches. */ break; } /* Get the match information. */ Tcl_RegExpGetInfo(regexp, &info); /* Advance curr. */ index += info.matches[0].end; /* Increment the match count. */ ++rv; } /* Clean up. Note that "regexp" is owned by "regexp_cstr_obj" so * it does not need explicit clean up. */ Tcl_DecrRefCount(regexp_cstr_obj); return rv; }
int Tcl_RegExpMatchObj( Tcl_Interp *interp, /* Used for error reporting. May be NULL. */ Tcl_Obj *textObj, /* Object containing the String to search. */ Tcl_Obj *patternObj) /* Regular expression to match against * string. */ { Tcl_RegExp re; re = Tcl_GetRegExpFromObj(interp, patternObj, TCL_REG_ADVANCED | TCL_REG_NOSUB); if (re == NULL) { return -1; } return Tcl_RegExpExecObj(interp, re, textObj, 0 /* offset */, 0 /* nmatches */, 0 /* flags */); }