From cb7393f0e4f28808535f7759b7e4a51d5b397ea8 Mon Sep 17 00:00:00 2001 From: Christian Spielberger Date: Tue, 22 Jun 2021 09:46:25 +0200 Subject: [PATCH] fmt: support different separators for parameter parsing --- include/re_fmt.h | 2 ++ src/fmt/prm.c | 25 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/include/re_fmt.h b/include/re_fmt.h index bb08344dd..cf599d072 100644 --- a/include/re_fmt.h +++ b/include/re_fmt.h @@ -141,6 +141,8 @@ typedef void (fmt_param_h)(const struct pl *name, const struct pl *val, void *arg); bool fmt_param_exists(const struct pl *pl, const char *pname); +bool fmt_param_sep_get(const struct pl *pl, const char *pname, char sep, + struct pl *val); bool fmt_param_get(const struct pl *pl, const char *pname, struct pl *val); void fmt_param_apply(const struct pl *pl, fmt_param_h *ph, void *arg); diff --git a/src/fmt/prm.c b/src/fmt/prm.c index 9ddcb156b..a55a492dd 100644 --- a/src/fmt/prm.c +++ b/src/fmt/prm.c @@ -38,15 +38,17 @@ bool fmt_param_exists(const struct pl *pl, const char *pname) /** - * Fetch a semicolon separated parameter from a PL string + * Fetch parameter from a PL string. The separator can be specified * * @param pl PL string to search * @param pname Parameter name + * @param sep Separator * @param val Parameter value, set on return * * @return true if found, false if not found */ -bool fmt_param_get(const struct pl *pl, const char *pname, struct pl *val) +bool fmt_param_sep_get(const struct pl *pl, const char *pname, char sep, + struct pl *val) { struct pl semi; char expr[128]; @@ -55,8 +57,8 @@ bool fmt_param_get(const struct pl *pl, const char *pname, struct pl *val) return false; (void)re_snprintf(expr, sizeof(expr), - "[;]*[ \t\r\n]*%s[ \t\r\n]*=[ \t\r\n]*[~ \t\r\n;]+", - pname); + "[%c]*[ \t\r\n]*%s[ \t\r\n]*=[ \t\r\n]*[~ \t\r\n%c]+", + sep, pname, sep); if (re_regex(pl->p, pl->l, expr, &semi, NULL, NULL, NULL, val)) return false; @@ -65,6 +67,21 @@ bool fmt_param_get(const struct pl *pl, const char *pname, struct pl *val) } +/** + * Fetch a semicolon separated parameter from a PL string + * + * @param pl PL string to search + * @param pname Parameter name + * @param val Parameter value, set on return + * + * @return true if found, false if not found + */ +bool fmt_param_get(const struct pl *pl, const char *pname, struct pl *val) +{ + return fmt_param_sep_get(pl, pname, ';', val); +} + + /** * Apply a function handler for each semicolon separated parameter *