summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2014-03-09 13:13:48 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-03-09 19:36:35 -0700
commit7991e36c563271eca16863fb46f70440686c304b (patch)
treefcdcafcce6bf3bdffe90a56f19e9b21d6ffb2293
parent5fcb36f5a83a0eb1a45553f8d1c6d1e0e2fb41af (diff)
downloadsubsurface-7991e36c563271eca16863fb46f70440686c304b.tar.gz
Parse basic dive computer sample data
This doesn't yet parse the (less common) "key=value" type sample data, so it's not complete, but the framework for that is in place too. With this, we now parse all the basics, and the most noticeable missing part is the cylinder and weigthsystem data. Lack of cylinder data in particular means that SAC-rates etc don't get calculated, but other than that it looks almost complete - you don't miss the missing event and sample details unless you look for them. I'll get the missing pieces done too, but this basic sample parsing was visually a big step. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--load-git.c92
1 files changed, 91 insertions, 1 deletions
diff --git a/load-git.c b/load-git.c
index 6024cdf3c..be4d7649e 100644
--- a/load-git.c
+++ b/load-git.c
@@ -211,9 +211,99 @@ report_error("Unmatched action '%s'", line);
return -1;
}
-/* FIXME! Samples not parsed */
+static void parse_sample_keyvalue(struct sample *sample, const char *key, const char *value)
+{
+ /* FIXME! Sample key-value pairs not parsed */
+}
+
+/* Parse key=val parts of the samples */
+static char *parse_sample_entry(struct sample *sample, char *line)
+{
+ char *key = line, *val, c;
+
+ while ((c = *line) != 0) {
+ if (isspace(c) || c == '=')
+ break;
+ line++;
+ }
+
+ if (c == '=')
+ *line++ = 0;
+ val = line;
+
+ while ((c = *line) != 0) {
+ if (isspace(c))
+ break;
+ line++;
+ }
+ if (c)
+ *line++ = 0;
+
+ parse_sample_keyvalue(sample, key, val);
+ return line;
+}
+
+static char *parse_sample_unit(struct sample *sample, double val, char *unit)
+{
+ char *end = unit, c;
+
+ /* Skip over the unit */
+ while ((c = *end) != 0) {
+ if (isspace(c)) {
+ *end++ = 0;
+ break;
+ }
+ end++;
+ }
+
+ /* The units are "°C", "m" or "bar", so let's just look at the first character */
+ switch (*unit) {
+ case 'm':
+ sample->depth.mm = rint(1000*val);
+ break;
+ case 'b':
+ sample->cylinderpressure.mbar = rint(1000*val);
+ break;
+ default:
+ sample->temperature.mkelvin = C_to_mkelvin(val);
+ break;
+ }
+
+ return end;
+}
+
static void sample_parser(char *line, struct divecomputer *dc)
{
+ int m,s;
+ struct sample *sample = prepare_sample(dc);
+
+ m = strtol(line, &line, 10);
+ if (*line == ':')
+ s = strtol(line+1, &line, 10);
+ sample->time.seconds = m*60+s;
+
+ for (;;) {
+ char c;
+
+ while (isspace(c = *line))
+ line++;
+ if (!c)
+ break;
+ /* Less common sample entries have a name */
+ if (c >= 'a' && c <= 'z') {
+ line = parse_sample_entry(sample, line);
+ } else {
+ const char *end;
+ double val = ascii_strtod(line, &end);
+ if (end == line) {
+ report_error("Odd sample data: %s", line);
+ break;
+ }
+ line = (char *)end;
+ line = parse_sample_unit(sample, val, line);
+ }
+ }
+ finish_sample(dc);
}
static void parse_dc_airtemp(char *line, struct membuffer *str, void *_dc)