From 1155ad3f0fb2471163335d1d7c6856a81f495e49 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 1 Sep 2011 16:27:52 -0700 Subject: [PATCH] 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 --- Makefile | 5 ++- dive.h | 2 ++ main.c | 2 +- save-xml.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 save-xml.c diff --git a/Makefile b/Makefile index 4a86ebf..6e6732e 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC=gcc CFLAGS=-Wall -Wno-pointer-sign -g -OBJS=main.o profile.o info.o divelist.o parse-xml.o +OBJS=main.o profile.o info.o divelist.o parse-xml.o save-xml.o divelog: $(OBJS) $(CC) $(LDLAGS) -o divelog $(OBJS) \ @@ -11,6 +11,9 @@ divelog: $(OBJS) parse-xml.o: parse-xml.c dive.h $(CC) $(CFLAGS) -c `xml2-config --cflags` parse-xml.c +save-xml.o: save-xml.c dive.h + $(CC) $(CFLAGS) -c save-xml.c + main.o: main.c dive.h display.h $(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0` -c main.c diff --git a/dive.h b/dive.h index bce1fe6..15a357f 100644 --- a/dive.h +++ b/dive.h @@ -133,4 +133,6 @@ static inline struct dive *get_dive(unsigned int nr) extern void parse_xml_init(void); extern void parse_xml_file(const char *filename); +void save_dives(const char *filename); + #endif /* DIVE_H */ diff --git a/main.c b/main.c index 186088b..96eca19 100644 --- a/main.c +++ b/main.c @@ -96,7 +96,7 @@ static void file_save(GtkWidget *w, gpointer data) if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - printf("Save: '%s'\n", filename); + save_dives(filename); g_free(filename); } gtk_widget_destroy(dialog); diff --git a/save-xml.c b/save-xml.c new file mode 100644 index 0000000..64254b4 --- /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"); +} -- 2.45.2