summaryrefslogtreecommitdiffstats
path: root/core/parse-xml.c
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-08-19 16:12:16 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-08-30 13:32:09 -0700
commit2de8e70ab04b0cc254a1d04f31e7e02db57743fa (patch)
tree993cfc264185847bb4f3e45139ae5ccbd26dbb2d /core/parse-xml.c
parent1515b9496b161ec3619a47306adb2e9124cfe594 (diff)
downloadsubsurface-2de8e70ab04b0cc254a1d04f31e7e02db57743fa.tar.gz
Parser: move match() into core/parse-xml.c
The match() function compares a pattern with a name with a twist: The name may either end in '\0' or '.'. If pattern and name match, a parsing function is called on a buffer and a destination value. The result of the parsing is not checked. This seems awfully XML-specific and therefore move the function from the general parse.c to the specialized parse-xml.c unit and make it of local linkage. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core/parse-xml.c')
-rw-r--r--core/parse-xml.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/core/parse-xml.c b/core/parse-xml.c
index 1f31d69d7..5cdf577bc 100644
--- a/core/parse-xml.c
+++ b/core/parse-xml.c
@@ -468,6 +468,24 @@ static void event_divemode(char *buffer, int *value)
}
}
+typedef void (*matchfn_t)(char *buffer, void *);
+static int match(const char *pattern, int plen,
+ 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))
+ return 0;
+ fn(buf, data);
+ return 1;
+}
+
#define MATCH(pattern, fn, dest) ({ \
/* Silly type compatibility test */ \
if (0) (fn)("test", dest); \