From 1155ad3f0fb2471163335d1d7c6856a81f495e49 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 1 Sep 2011 16:27:52 -0700 Subject: Add ability to 'save' dives This just generates another xml file. Don't get me wrong: I still don't like xml, but this way we can save in the same format we load things from. Except the save-format is a *lot* cleaner than the abortion that is Suunto or libdivecomputer xml. Don't bother with some crazy xml library crap for saving. Just do it! Signed-off-by: Linus Torvalds --- save-xml.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 save-xml.c (limited to 'save-xml.c') diff --git a/save-xml.c b/save-xml.c new file mode 100644 index 000000000..64254b45e --- /dev/null +++ b/save-xml.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include + +#include "dive.h" + +#define FRACTION(n,x) ((unsigned)(n)/(x)),((unsigned)(n)%(x)) + +static void show_temperature(FILE *f, temperature_t temp, const char *pre, const char *post) +{ + if (temp.mkelvin) { + int mcelsius = temp.mkelvin - 273150; + const char *sign =""; + if (mcelsius < 0) { + sign = "-"; + mcelsius = - mcelsius; + } + fprintf(f, "%s%s%u.%03u%s", pre, sign, FRACTION(mcelsius, 1000), post); + } +} + +static void save_overview(FILE *f, struct dive *dive) +{ + fprintf(f, " %u.%03u m\n", FRACTION(dive->maxdepth.mm, 1000)); + show_temperature(f, dive->airtemp, " ", " C\n"); +} + +static void save_gasmix(FILE *f, struct dive *dive) +{ + int i; + + for (i = 0; i < MAX_MIXES; i++) { + gasmix_t *mix = dive->gasmix+i; + int o2 = mix->o2.permille, he = mix->he.permille; + int n2 = 1000 - o2 - he; + + if (!mix->o2.permille) + return; + fprintf(f, " he.permille) + fprintf(f, " he='%u.%u%%'", FRACTION(he, 10)); + fprintf(f, " n2='%u.%u%%'>\n", FRACTION(n2, 10)); + } +} + +static void save_sample(FILE *f, struct sample *sample) +{ + fprintf(f, " time.seconds,60), + FRACTION(sample->depth.mm, 1000)); + show_temperature(f, sample->temperature, " temp='", " C'"); + if (sample->tankpressure.mbar) { + fprintf(f, " tankpressure='%u.%03u bar'", + FRACTION(sample->tankpressure.mbar, 1000)); + } + fprintf(f, ">\n"); +} + +static void save_dive(FILE *f, struct dive *dive) +{ + int i; + struct tm *tm = gmtime(&dive->when); + + fprintf(f, "\n", + tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900, + tm->tm_hour, tm->tm_min, tm->tm_sec); + save_overview(f, dive); + save_gasmix(f, dive); + for (i = 0; i < dive->samples; i++) + save_sample(f, dive->sample+i); + fprintf(f, "\n"); +} + +#define VERSION 1 + +void save_dives(const char *filename) +{ + int i; + FILE *f = fopen(filename, "w"); + + if (!f) + return; + fprintf(f, "\n\n", VERSION); + for (i = 0; i < dive_table.nr; i++) + save_dive(f, get_dive(i)); + fprintf(f, "\n"); +} -- cgit v1.2.3-70-g09d2