added regexp free routines, replaced regexp mode string with symbol

This commit is contained in:
Olof Hagsand 2019-05-29 14:17:30 +00:00
parent 5706703ab4
commit 2ae9529a3e
10 changed files with 115 additions and 35 deletions

View file

@ -640,8 +640,8 @@ static const map_str2int datastore_cache_map[] = {
{NULL, -1}
};
/*! How to generate and show CLI syntax: VARS|ALL
* @see clixon-config@<date>.yang CLICON_CLI_GENMODEL_TYPE
/*! Which datastore cache method to use
* @see clixon-config@<date>.yang CLICON_DATASTORE_CACHE
*/
enum datastore_cache
clicon_datastore_cache(clicon_handle h)
@ -654,6 +654,25 @@ clicon_datastore_cache(clicon_handle h)
return clicon_str2int(datastore_cache_map, str);
}
static const map_str2int yang_regexp_map[] = {
{"posix", REGEXP_POSIX},
{"libxml2", REGEXP_LIBXML2},
{NULL, -1}
};
/*! Which Yang regexp/pattern engine to use
* @see clixon-config@<date>.yang CLICON_YANG_REGEXP
*/
enum regexp_mode
clicon_yang_regexp(clicon_handle h)
{
char *str;
if ((str = clicon_option_str(h, "CLICON_YANG_REGEXP")) == NULL)
return REGEXP_POSIX;
else
return clicon_str2int(yang_regexp_map, str);
}
/*---------------------------------------------------------------------
* Specific option access functions for non-yang options

View file

@ -218,21 +218,21 @@ regex_compile(clicon_handle h,
char *regexp,
void **recomp)
{
int retval = -1;
char *mode;
char *posix = NULL; /* Transform to posix regex */
int retval = -1;
char *posix = NULL; /* Transform to posix regex */
mode = clicon_yang_regexp(h);
if (strcmp(mode, "posix") == 0){
switch (clicon_yang_regexp(h)){
case REGEXP_POSIX:
if (regexp_xsd2posix(regexp, &posix) < 0)
goto done;
retval = cligen_regex_posix_compile(posix, recomp);
}
else if (strcmp(mode, "libxml2") == 0)
break;
case REGEXP_LIBXML2:
retval = cligen_regex_libxml2_compile(regexp, recomp);
else{
clicon_err(OE_CFG, 0, "clicon_yang_regexp invalid value: %s", mode);
goto done;
break;
default:
clicon_err(OE_CFG, 0, "clicon_yang_regexp invalid value: %d", clicon_yang_regexp(h));
break;
}
/* retval from fns above */
done:
@ -242,7 +242,9 @@ regex_compile(clicon_handle h,
}
/*! Execution of (pre-compiled) regular expression / pattern
* @param[in] h Clicon handle
* @param[in] h Clicon handle
* @param[in] recomp Compiled regular expression
* @param[in] string Content string to match
*/
int
regex_exec(clicon_handle h,
@ -250,15 +252,43 @@ regex_exec(clicon_handle h,
char *string)
{
int retval = -1;
char *mode;
mode = clicon_yang_regexp(h);
if (strcmp(mode, "posix") == 0)
switch (clicon_yang_regexp(h)){
case REGEXP_POSIX:
retval = cligen_regex_posix_exec(recomp, string);
else if (strcmp(mode, "libxml2") == 0)
break;
case REGEXP_LIBXML2:
retval = cligen_regex_libxml2_exec(recomp, string);
else{
clicon_err(OE_CFG, 0, "clicon_yang_regexp invalid value: %s", mode);
break;
default:
clicon_err(OE_CFG, 0, "clicon_yang_regexp invalid value: %d",
clicon_yang_regexp(h));
goto done;
}
/* retval from fns above */
done:
return retval;
}
/*! Free of (pre-compiled) regular expression / pattern
* @param[in] h Clicon handle
* @param[in] recomp Compiled regular expression
*/
int
regex_free(clicon_handle h,
void *recomp)
{
int retval = -1;
switch (clicon_yang_regexp(h)){
case REGEXP_POSIX:
retval = cligen_regex_posix_free(recomp);
break;
case REGEXP_LIBXML2:
retval = cligen_regex_libxml2_free(recomp);
break;
default:
clicon_err(OE_CFG, 0, "clicon_yang_regexp invalid value: %d", clicon_yang_regexp(h));
goto done;
}
/* retval from fns above */

View file

@ -61,6 +61,7 @@ struct yang_type_cache{
LENGTH|RANGE. Can be a vector if multiple
ranges*/
cvec *yc_patterns; /* list of regexp, if cvec_len() > 0 */
int yc_rxmode; /* need to store mode for freeing since handle may not be available */
cvec *yc_regexps; /* list of _compiled_ regexp, if cvec_len() > 0 */
uint8_t yc_fraction; /* Fraction digits for decimal64 (if
YANG_OPTIONS_FRACTION_DIGITS */

View file

@ -155,6 +155,7 @@ yang_builtin(char *type)
}
/*! Set type cache for yang type
* @param[in] rxmode Kludge to know which regexp engine is used
*/
int
yang_type_cache_set(yang_type_cache **ycache0,
@ -162,6 +163,7 @@ yang_type_cache_set(yang_type_cache **ycache0,
int options,
cvec *cvv,
cvec *patterns,
int rxmode,
cvec *regexps,
uint8_t fraction)
{
@ -187,6 +189,7 @@ yang_type_cache_set(yang_type_cache **ycache0,
clicon_err(OE_UNIX, errno, "cvec_dup");
goto done;
}
ycache->yc_rxmode = rxmode;
if (regexps && (ycache->yc_regexps = cvec_dup(regexps)) == NULL){
clicon_err(OE_UNIX, errno, "cvec_dup");
goto done;
@ -206,6 +209,7 @@ yang_type_cache_get(yang_type_cache *ycache,
int *options,
cvec **cvv,
cvec *patterns,
int *rxmode,
cvec *regexps,
uint8_t *fraction)
{
@ -228,6 +232,8 @@ yang_type_cache_get(yang_type_cache *ycache,
while ((cv = cvec_each(ycache->yc_regexps, cv)) != NULL)
cvec_append_var(regexps, cv);
}
if (rxmode)
*rxmode = ycache->yc_rxmode;
if (fraction)
*fraction = ycache->yc_fraction;
retval = 0;
@ -243,6 +249,7 @@ yang_type_cache_cp(yang_type_cache **ycnew,
int options;
cvec *cvv;
cvec *patterns = NULL;
int rxmode;
cvec *regexps = NULL;
uint8_t fraction;
yang_stmt *resolved;
@ -255,8 +262,8 @@ yang_type_cache_cp(yang_type_cache **ycnew,
clicon_err(OE_UNIX, errno, "cvec_new");
goto done;
}
yang_type_cache_get(ycold, &resolved, &options, &cvv, patterns, regexps, &fraction);
if (yang_type_cache_set(ycnew, resolved, options, cvv, patterns, regexps, fraction) < 0)
yang_type_cache_get(ycold, &resolved, &options, &cvv, patterns, &rxmode, regexps, &fraction);
if (yang_type_cache_set(ycnew, resolved, options, cvv, patterns, rxmode, regexps, fraction) < 0)
goto done;
retval = 0;
done:
@ -270,12 +277,29 @@ yang_type_cache_cp(yang_type_cache **ycnew,
int
yang_type_cache_free(yang_type_cache *ycache)
{
cg_var *cv;
if (ycache->yc_cvv)
cvec_free(ycache->yc_cvv);
if (ycache->yc_patterns)
cvec_free(ycache->yc_patterns);
if (ycache->yc_regexps)
if (ycache->yc_regexps){
cv = NULL;
while ((cv = cvec_each(ycache->yc_regexps, cv)) != NULL){
/* need to store mode since clicon_handle is not available */
switch (ycache->yc_rxmode){
case REGEXP_POSIX:
cligen_regex_posix_free(cv_void_get(cv));
break;
case REGEXP_LIBXML2:
cligen_regex_libxml2_free(cv_void_get(cv));
break;
default:
break;
}
}
cvec_free(ycache->yc_regexps);
}
free(ycache);
return 0;
}
@ -304,8 +328,6 @@ compile_pattern2regexp(clicon_handle h,
pcv = NULL;
while ((pcv = cvec_each(patterns, pcv)) != NULL){
if (cv_type_get(pcv) == CGV_VOID)
continue; /* already compiled */
pattern = cv_string_get(pcv);
/* Compile yang pattern. handle necessary to select regex engine */
if ((ret = regex_compile(h, pattern, &re)) < 0)
@ -380,7 +402,7 @@ ys_resolve_type(yang_stmt *ys,
*/
if (yang_type_cache_set(&ys->ys_typecache,
resolved, options, cvv,
patterns, regexps,
patterns, clicon_yang_regexp(h), regexps,
fraction) < 0)
goto done;
retval = 0;
@ -1169,7 +1191,7 @@ yang_type_resolve(yang_stmt *yorig,
/* Cache does not work for eg string length 32? */
if (/*!yang_builtin(type) &&*/ ytype->ys_typecache != NULL){
if (yang_type_cache_get(ytype->ys_typecache, yrestype,
options, cvv, patterns, regexps, fraction) < 0)
options, cvv, patterns, NULL, regexps, fraction) < 0)
goto done;
goto ok;
}