aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-07-18 19:31:59 +0200
committerGravatar Lubomir I. Ivanov <neolit123@gmail.com>2018-07-19 02:43:08 +0300
commit325b8bba35c339d626071b3feedbc6140774a725 (patch)
tree9f10fbd96cec6dcd3a64e6580438f03ccd8a1943 /core
parentb51e616b6a2af91f63cfa32d641d5898b10314ff (diff)
downloadsubsurface-325b8bba35c339d626071b3feedbc6140774a725.tar.gz
Undo: remember deleted trip in UndoRemoveDivesFromTrip::undo()
If the last dive of a trip is removed, the trip is deleted. On redo the dive is added to a non existing trip, leading to a segfault. Therefore, keep a copy of the trip to reinstate it on redo. Note: this cannot work for a sequence of multiple commands. One would have to rewrite the whole undo-history. Nevertheless, let's do this as a stop-gap measure. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core')
-rw-r--r--core/dive.h1
-rw-r--r--core/divelist.c13
2 files changed, 14 insertions, 0 deletions
diff --git a/core/dive.h b/core/dive.h
index 1b58eef4c..569232a38 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -507,6 +507,7 @@ extern void delete_single_dive(int idx);
extern void add_single_dive(int idx, struct dive *dive);
extern void insert_trip(dive_trip_t **trip);
+extern struct dive_trip *clone_empty_trip(struct dive_trip *trip);
extern const struct units SI_units, IMPERIAL_units;
diff --git a/core/divelist.c b/core/divelist.c
index 7291de23e..a9b793517 100644
--- a/core/divelist.c
+++ b/core/divelist.c
@@ -727,6 +727,19 @@ void insert_trip(dive_trip_t **dive_trip_p)
#endif
}
+/* create a copy of a dive trip, but don't add any dives. */
+dive_trip_t *clone_empty_trip(dive_trip_t *trip)
+{
+ dive_trip_t *copy = malloc(sizeof(struct dive_trip));
+ *copy = *trip;
+ copy->location = copy_string(trip->location);
+ copy->notes = copy_string(trip->notes);
+ copy->nrdives = 0;
+ copy->next = NULL;
+ copy->dives = NULL;
+ return copy;
+}
+
static void delete_trip(dive_trip_t *trip)
{
dive_trip_t **p, *tmp;