static void RegExp_set(KonohaContext *kctx, kRegExp *re, kString *ptns, kString *opts) { const char *ptn = S_text(ptns); const char *opt = S_text(opts); kRegExp_setOptions(re, opt); KFieldSet(re, re->pattern, ptns); re->reg = pcre_regmalloc(kctx, ptns); int cflags = pcre_ParseComplflags(kctx, opt); if(!kString_is(ASCII, ptns)) { /* Add 'u' option when the pattern is multibyte string. */ cflags |= PCRE_UTF8; } pcre_regcomp(kctx, re->reg, ptn, cflags); re->eflags = pcre_ParseExecflags(kctx, opt); }
/********************************************************************* * * Function : compile_pattern * * Description : Compiles a host, domain or TAG pattern. * * Parameters : * 1 : pattern = The pattern to compile. * 2 : anchoring = How the regex should be modified * before compilation. Can be either * one of NO_ANCHORING, LEFT_ANCHORED, * RIGHT_ANCHORED or RIGHT_ANCHORED_HOST. * 3 : url = In case of failures, the spec member is * logged and the structure freed. * 4 : regex = Where the compiled regex should be stored. * * Returns : JB_ERR_OK - Success * JB_ERR_MEMORY - Out of memory * JB_ERR_PARSE - Cannot parse regex * *********************************************************************/ static jb_err compile_pattern(const char *pattern, enum regex_anchoring anchoring, struct pattern_spec *url, regex_t **regex) { int errcode; char rebuf[BUFFER_SIZE]; const char *fmt = NULL; assert(pattern); assert(strlen(pattern) < sizeof(rebuf) - 2); if (pattern[0] == '\0') { *regex = NULL; return JB_ERR_OK; } switch (anchoring) { case NO_ANCHORING: fmt = "%s"; break; case RIGHT_ANCHORED: fmt = "%s$"; break; case RIGHT_ANCHORED_HOST: fmt = "%s\\.?$"; break; case LEFT_ANCHORED: fmt = "^%s"; break; default: log_error(LOG_LEVEL_FATAL, "Invalid anchoring in compile_pattern %d", anchoring); } *regex = zalloc(sizeof(**regex)); if (NULL == *regex) { free_pattern_spec(url); return JB_ERR_MEMORY; } snprintf(rebuf, sizeof(rebuf), fmt, pattern); errcode = pcre_regcomp(*regex, rebuf, (REG_EXTENDED|REG_NOSUB|REG_ICASE)); if (errcode) { size_t errlen = pcre_regerror(errcode, *regex, rebuf, sizeof(rebuf)); if (errlen > (sizeof(rebuf) - (size_t)1)) { errlen = sizeof(rebuf) - (size_t)1; } rebuf[errlen] = '\0'; log_error(LOG_LEVEL_ERROR, "error compiling %s from %s: %s", pattern, url->spec, rebuf); free_pattern_spec(url); return JB_ERR_PARSE; } return JB_ERR_OK; }