patch: fix fmt/param functions, add fmt_param_exists()

This commit is contained in:
Alfred E. Heggestad 2012-03-01 20:27:57 +00:00
parent 793ead14ee
commit 3791d0fbf9
2 changed files with 50 additions and 11 deletions

View file

@ -133,5 +133,6 @@ void hexdump(FILE *f, const void *p, size_t len);
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_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);

View file

@ -7,6 +7,36 @@
#include <re_fmt.h>
/**
* Check if a semicolon separated parameter is present
*
* @param pl PL string to search
* @param pname Parameter name
*
* @return true if found, false if not found
*/
bool fmt_param_exists(const struct pl *pl, const char *pname)
{
struct pl semi, eop;
char expr[128];
if (!pl || !pname)
return false;
(void)re_snprintf(expr, sizeof(expr),
"[;]*[ \t\r\n]*%s[ \t\r\n;=]*",
pname);
if (re_regex(pl->p, pl->l, expr, &semi, NULL, &eop))
return false;
if (!eop.l && eop.p < pl->p + pl->l)
return false;
return semi.l > 0 || pl->p == semi.p;
}
/**
* Fetch a semicolon separated parameter from a PL string
*
@ -18,14 +48,20 @@
*/
bool fmt_param_get(const struct pl *pl, const char *pname, struct pl *val)
{
struct pl semi;
char expr[128];
if (!pl)
if (!pl || !pname)
return false;
(void)re_snprintf(expr, sizeof(expr), "%s[=]*[^;]*", pname);
(void)re_snprintf(expr, sizeof(expr),
"[;]*[ \t\r\n]*%s[ \t\r\n]*=[ \t\r\n]*[~ \t\r\n;]+",
pname);
return 0 == re_regex(pl->p, pl->l, expr, NULL, val);
if (re_regex(pl->p, pl->l, expr, &semi, NULL, NULL, NULL, val))
return false;
return semi.l > 0 || pl->p == semi.p;
}
@ -38,21 +74,23 @@ 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)
{
size_t i;
struct pl prmv, prm, semi, name, val;
if (!pl || !ph)
return;
for (i=0; i<pl->l; ) {
struct pl lws, name, eq, val, s;
prmv = *pl;
lws.l = eq.l = s.l = val.l = 0;
if (re_regex(&pl->p[i], pl->l - i, "[ ]*[^;=]+[=]*[^;]*[;]*",
&lws, &name, &eq, &val, &s))
while (!re_regex(prmv.p, prmv.l, "[ \t\r\n]*[~;]+[;]*",
NULL, &prm, &semi)) {
pl_advance(&prmv, semi.p + semi.l - prmv.p);
if (re_regex(prm.p, prm.l,
"[^ \t\r\n=]+[ \t\r\n]*[=]*[ \t\r\n]*[~ \t\r\n]*",
&name, NULL, NULL, NULL, &val))
break;
ph(&name, &val, arg);
i += (lws.l + name.l + eq.l + val.l + s.l);
}
}