[PATCH 11/12] Add event parsing to the git object tree loader

Linus Torvalds torvalds at linux-foundation.org
Sun Mar 9 18:46:56 PDT 2014


From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sun, 9 Mar 2014 15:32:42 -0700
Subject: [PATCH 11/12] 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 at linux-foundation.org>
---
 load-git.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/load-git.c b/load-git.c
index 25a3244fa06a..12a28b37e48e 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); }
-- 
1.8.5.3



More information about the subsurface mailing list