summaryrefslogtreecommitdiffstats
path: root/dive.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2014-07-12 12:48:27 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-07-12 12:56:03 -0700
commit74616cdddfd0f46822be8708f7bad0038fdca526 (patch)
treeab24dfa4a16d1dac1e7c5381ba5fb1c60fe4613b /dive.c
parentf9b18b9bfbdd3ef89750cd9b231d57df550db28b (diff)
downloadsubsurface-74616cdddfd0f46822be8708f7bad0038fdca526.tar.gz
Rename event: correctly replace event with new one
I don't like that the event structure includes the variable length array. That really makes it a pain to change the name of an event (on the flip side, freeing events is easier I guess). Anyway, to correctly rename an event we need to actually remove the event from the correct dc and then add a new event with the new name. The previous code was insane (it only worked if the new name was of smaller or equal length, otherwise it had a beautiful buffer overflow). And of course we need to do this both for the current_dive and the displayed_dive. Fixes #616 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'dive.c')
-rw-r--r--dive.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/dive.c b/dive.c
index 1dd943e48..e228ecb20 100644
--- a/dive.c
+++ b/dive.c
@@ -75,6 +75,29 @@ void remove_event(struct event* event)
}
}
+/* since the name is an array as part of the structure (how silly is that?) we
+ * have to actually remove the existing event and replace it with a new one.
+ * WARNING, WARNING... this may end up freeing event in case that event is indeed
+ * WARNING, WARNING... part of this divecomputer on this dive! */
+void update_event_name(struct dive *d, struct event* event, char *name)
+{
+ if (!d || !event)
+ return;
+ struct divecomputer *dc = get_dive_dc(d, dc_number);
+ if (!dc)
+ return;
+ struct event **removep = &dc->events;
+ struct event *remove;
+ while ((*removep)->next && !same_event(*removep, event))
+ removep = &(*removep)->next;
+ if (!same_event(*removep, event))
+ return;
+ remove = *removep;
+ *removep = (*removep)->next;
+ add_event(dc, event->time.seconds, event->type, event->flags, event->value, name);
+ free(remove);
+}
+
/* this returns a pointer to static variable - so use it right away after calling */
struct gasmix *get_gasmix_from_event(struct event *ev)
{