Parser: split out name-comparison from match() function

The match() function in parse-xml.c calls a very specific callback,
which doesn't take a context-parameter. To be able to call other
callbacks, split out the actual name-comparison.

Moreover, remove the "plen" parameter, as this was called with
strlen(pattern) in all cases anyway. Replace the old logic which
potentially accessed a byte beyond the end of name with a simply
classical C-style loop.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-08-19 16:25:36 +02:00 committed by Dirk Hohndel
parent 2de8e70ab0
commit 59a68fe9b5

View file

@ -468,19 +468,21 @@ static void event_divemode(char *buffer, int *value)
}
}
/* Compare a pattern with a name, whereby the name may end in '\0' or '.'. */
static int match_name(const char *pattern, const char *name)
{
while (*pattern == *name && *pattern) {
pattern++;
name++;
}
return *pattern == '\0' && (*name == '\0' || *name == '.');
}
typedef void (*matchfn_t)(char *buffer, void *);
static int match(const char *pattern, int plen,
const char *name,
static int match(const char *pattern, const char *name,
matchfn_t fn, char *buf, void *data)
{
switch (name[plen]) {
case '\0':
case '.':
break;
default:
return 0;
}
if (memcmp(pattern, name, plen))
if (!match_name(pattern, name))
return 0;
fn(buf, data);
return 1;
@ -489,7 +491,7 @@ static int match(const char *pattern, int plen,
#define MATCH(pattern, fn, dest) ({ \
/* Silly type compatibility test */ \
if (0) (fn)("test", dest); \
match(pattern, strlen(pattern), name, (matchfn_t) (fn), buf, dest); })
match(pattern, name, (matchfn_t) (fn), buf, dest); })
static void get_index(char *buffer, int *i)
{