From 6f3be56d8d76b0216f3b9283623d9249547a2d01 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 9 Mar 2014 15:32:42 -0700 Subject: Add event parsing to the git object tree loader This makes us parse everything we save, and I can load my XML file, save it as a git file, load that git file, save it as a new XML file, and the end result is identical. Well... *ALMOST* identical. We currently don't save the dive computer nickname and serial/firmware information in the git repository, so that does get lost in translation. But all the actual dive data is there. NOTE! I have currently only worked with my own dive files. They are reasonably complex and complete, and do have a lot of the interesting cases covered (like multiple dive computers etc), but there's no CCR information, and all the dives are in trips, so this does need more testing. It's at the very least very close. Signed-off-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- load-git.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'load-git.c') diff --git a/load-git.c b/load-git.c index a8304a0af..e80a72d58 100644 --- a/load-git.c +++ b/load-git.c @@ -503,9 +503,49 @@ static void parse_dc_time(char *line, struct membuffer *str, void *_dc) static void parse_dc_watertemp(char *line, struct membuffer *str, void *_dc) { struct divecomputer *dc = _dc; dc->watertemp = get_temperature(line); } -/* FIXME! Events not parsed */ +static void parse_event_keyvalue(void *_event, const char *key, const char *value) +{ + struct event *event = _event; + int val = atoi(value); + + if (!strcmp(key, "type")) { + event->type = val; + } else if (!strcmp(key, "flags")) { + event->flags = val; + } else if (!strcmp(key, "value")) { + event->value = val; + } else if (!strcmp(key, "name")) { + /* We get the name from the string handling */ + } else + report_error("Unexpected event key/value pair (%s/%s)", key, value); +} + static void parse_dc_event(char *line, struct membuffer *str, void *_dc) -{ } +{ + int m, s; + const char *name; + struct divecomputer *dc = _dc; + struct event event = { 0 }; + + m = strtol(line, &line, 10); + if (*line == ':') + s = strtol(line+1, &line, 10); + event.time.seconds = m*60+s; + + for (;;) { + char c; + while (isspace(c = *line)) + line++; + if (!c) + break; + line = parse_keyvalue_entry(parse_event_keyvalue, &event, line); + } + + name = ""; + if (str->len) + name = mb_cstring(str); + add_event(dc, event.time.seconds, event.type, event.flags, event.value, name); +} static void parse_trip_date(char *line, struct membuffer *str, void *_trip) { dive_trip_t *trip = _trip; update_date(&trip->when, line); } -- cgit v1.2.3-70-g09d2