[augeas-devel] [PATCH 1/3] * src/pathx.c: match functions by name and arity
Raphaël Pinson
raphael.pinson at camptocamp.com
Wed Aug 1 07:15:29 UTC 2012
From: David Lutterkort <lutter at redhat.com>
This makes it possible to have different numbers of arguments for the same
function, e.g. count() and count(nodeset)
---
src/pathx.c | 25 ++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/pathx.c b/src/pathx.c
index c6aa4c4..5b3b76c 100644
--- a/src/pathx.c
+++ b/src/pathx.c
@@ -1347,6 +1347,8 @@ static void check_app(struct expr *expr, struct state *state) {
const struct func *fn = builtin_funcs + f;
if (STRNEQ(expr->func->name, fn->name))
continue;
+ if (expr->func->arity != fn->arity)
+ continue;
int match = 1;
for (int i=0; i < expr->func->arity; i++) {
@@ -1920,11 +1922,13 @@ static void parse_literal(struct state *state) {
static void parse_function_call(struct state *state) {
const struct func *func = NULL;
struct expr *expr = NULL;
- int nargs = 0;
+ int nargs = 0, find = 0;
- for (int i=0; i < ARRAY_CARDINALITY(builtin_funcs); i++) {
- if (looking_at(state, builtin_funcs[i].name, "("))
- func = builtin_funcs + i;
+ for (; find < ARRAY_CARDINALITY(builtin_funcs); find++) {
+ if (looking_at(state, builtin_funcs[find].name, "(")) {
+ func = builtin_funcs + find;
+ break;
+ }
}
if (func == NULL) {
STATE_ERROR(state, PATHX_ENAME);
@@ -1944,7 +1948,18 @@ static void parse_function_call(struct state *state) {
}
}
- if (nargs != func->arity) {
+ int found = 0; /* Whether there is a builtin matching in name and arity */
+ for (int i=find; i < ARRAY_CARDINALITY(builtin_funcs); i++) {
+ if (STRNEQ(func->name, builtin_funcs[i].name))
+ break;
+ if (builtin_funcs[i].arity == nargs) {
+ func = builtin_funcs + i;
+ found = 1;
+ break;
+ }
+ }
+
+ if (! found) {
STATE_ERROR(state, PATHX_EARITY);
return;
}
--
1.7.9.5
More information about the augeas-devel
mailing list