summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2014-03-09 15:32:42 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-03-09 19:36:39 -0700
commit6f3be56d8d76b0216f3b9283623d9249547a2d01 (patch)
treeff09a879622519e9e6c7a615f01c8ed27011dd95
parent6ef38967ffa0d8a78193698d29e86ffbab1bb864 (diff)
downloadsubsurface-6f3be56d8d76b0216f3b9283623d9249547a2d01.tar.gz
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 <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--load-git.c44
1 files changed, 42 insertions, 2 deletions
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); }