int cli_pcre_compile(struct cli_pcre_data *pd, long long unsigned match_limit, long long unsigned match_limit_recursion, unsigned int options, int opt_override) { int errornum, erroffset; pcre2_general_context *gctx; pcre2_compile_context *cctx; if (!pd || !pd->expression) { cli_errmsg("cli_pcre_compile: NULL pd or NULL pd->expression\n"); return CL_ENULLARG; } gctx = pcre2_general_context_create(cli_pcre_malloc, cli_pcre_free, NULL); if (!gctx) { cli_errmsg("cli_pcre_compile: Unable to allocate memory for general context\n"); return CL_EMEM; } cctx = pcre2_compile_context_create(gctx); if (!cctx) { cli_errmsg("cli_pcre_compile: Unable to allocate memory for compile context\n"); pcre2_general_context_free(gctx); return CL_EMEM; } /* compile the pcre2 regex last arg is charset, allow for options override */ if (opt_override) pd->re = pcre2_compile(pd->expression, PCRE2_ZERO_TERMINATED, options, &errornum, &erroffset, cctx); /* pd->re handled by pcre2 -> call pcre_free() -> calls free() */ else pd->re = pcre2_compile(pd->expression, PCRE2_ZERO_TERMINATED, pd->options, &errornum, &erroffset, cctx); /* pd->re handled by pcre2 -> call pcre_free() -> calls free() */ if (pd->re == NULL) { PCRE2_UCHAR errmsg[256]; pcre2_get_error_message(errornum, errmsg, sizeof(errmsg)); cli_errmsg("cli_pcre_compile: PCRE2 compilation failed at offset %d: %s\n", erroffset, errmsg); pcre2_compile_context_free(cctx); pcre2_general_context_free(gctx); return CL_EMALFDB; } /* setup matching context and set the match limits */ pd->mctx = pcre2_match_context_create(gctx); if (!pd->mctx) { cli_errmsg("cli_pcre_compile: Unable to allocate memory for match context\n"); pcre2_compile_context_free(cctx); pcre2_general_context_free(gctx); return CL_EMEM; } pcre2_set_match_limit(pd->mctx, match_limit); pcre2_set_recursion_limit(pd->mctx, match_limit_recursion); /* non-dynamic allocated fields set by caller */ pcre2_compile_context_free(cctx); pcre2_general_context_free(gctx); return CL_SUCCESS; }
{ if( ptr ) hb_xfree( ptr ); } #endif HB_CALL_ON_STARTUP_BEGIN( _hb_regex_init_ ) #if defined( HB_HAS_PCRE2 ) /* detect UTF-8 support. * In BCC builds this code also forces linking newer PCRE versions * then the one included in BCC RTL. */ if( pcre2_config( PCRE2_CONFIG_UNICODE, &s_iUTF8Enabled ) != 0 ) s_iUTF8Enabled = 0; s_re_ctxg = pcre2_general_context_create( hb_pcre2_grab, hb_pcre2_free, NULL ); s_re_ctxc = pcre2_compile_context_create( s_re_ctxg ); s_re_ctxm = pcre2_match_context_create( s_re_ctxg ); hb_vmAtExit( hb_pcre2_exit, NULL ); #elif defined( HB_HAS_PCRE ) /* detect UTF-8 support. * In BCC builds this code also forces linking newer PCRE versions * then the one included in BCC RTL. */ if( pcre_config( PCRE_CONFIG_UTF8, &s_iUTF8Enabled ) != 0 ) s_iUTF8Enabled = 0; pcre_malloc = hb_pcre_grab; pcre_free = hb_pcre_free; pcre_stack_malloc = hb_pcre_grab;