summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2011-10-25 00:29:19 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2011-10-25 01:05:08 -0700
commit5ca49b0460f36ac969b7ef388f586782d584b36d (patch)
treea5f78fbfd004d9823680a752adb32c84799f6b00
parentc4691306c40dedc61110174dde15310c359abb6a (diff)
downloadsubsurface-5ca49b0460f36ac969b7ef388f586782d584b36d.tar.gz
Remember the event names as we encounter them
First step to being able to filter the events that we display in the profile. We could (in theory) walk all the dives in the divelist when we need this data, but it seems much more convenient to have them in an array in one place. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--dive.c1
-rw-r--r--dive.h1
-rw-r--r--profile.c31
3 files changed, 33 insertions, 0 deletions
diff --git a/dive.c b/dive.c
index b57205bc5..ed3908928 100644
--- a/dive.c
+++ b/dive.c
@@ -26,6 +26,7 @@ void add_event(struct dive *dive, int time, int type, int flags, int value, cons
while (*p)
p = &(*p)->next;
*p = ev;
+ remember_event(name);
}
double get_depth_units(unsigned int mm, int *frac, const char **units)
diff --git a/dive.h b/dive.h
index 7c64c21e2..1008e56bf 100644
--- a/dive.h
+++ b/dive.h
@@ -262,6 +262,7 @@ extern void report_error(GError* error);
extern void add_cylinder_description(cylinder_type_t *);
extern void add_people(const char *string);
extern void add_location(const char *string);
+extern void remember_event(const char *eventname);
extern void dive_list_update_dives(void);
extern void flush_divelist(struct dive *dive);
diff --git a/profile.c b/profile.c
index 5dad475bc..11b01b503 100644
--- a/profile.c
+++ b/profile.c
@@ -166,6 +166,37 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t *
cairo_show_text(cr, buffer);
}
+struct ev_select {
+ char *ev_name;
+ gboolean plot_ev;
+};
+static struct ev_select *ev_namelist;
+static int evn_allocated;
+static int evn_used;
+
+void remember_event(const char *eventname)
+{
+ int i=0, len;
+
+ if (!eventname || (len = strlen(eventname)) == 0)
+ return;
+ while (i < evn_used) {
+ if (!strncmp(eventname,ev_namelist[i].ev_name,len))
+ return;
+ i++;
+ }
+ if (evn_used == evn_allocated) {
+ evn_allocated += 10;
+ ev_namelist = realloc(ev_namelist, evn_allocated * sizeof(struct ev_select));
+ if (! ev_namelist)
+ /* we are screwed, but let's just bail out */
+ return;
+ }
+ ev_namelist[evn_used].ev_name = strdup(eventname);
+ ev_namelist[evn_used].plot_ev = TRUE;
+ evn_used++;
+}
+
static void plot_one_event(struct graphics_context *gc, struct plot_info *pi, struct event *event, const text_render_options_t *tro)
{
int i, depth = 0;