Import: split process_imported_dives() function

Split the process_imported_dives() function in two:
1) process_imported_dives() processes the dives and generates
   a list of dives and trips to be added and removed.
2) add_imported_dives() calls process_imported_dives() and
   does the actual removal / addition of dives and trips.

The goal is to split preparation and actual work, to
make dive import undo-able.

The code adds extra checks to never merge into the same
dive twice, as this would lead to a double-free() bug.
This should in principle never happen, as dives that
compare equal according to is_same_dive() are merged
in the imported-dives list, but perhaps in some pathologival
corner-cases is_same_dive() turns out to be non-transitive.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-12-23 22:08:00 +01:00 committed by Dirk Hohndel
parent fd196f143a
commit 0249e12589
11 changed files with 215 additions and 200 deletions

View file

@ -18,8 +18,12 @@ extern int init_decompression(struct deco_state *ds, struct dive *dive);
/* divelist core logic functions */
extern void process_loaded_dives();
extern void add_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table,
bool prefer_imported, bool downloaded, bool merge_all_trips);
extern void process_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table,
bool prefer_imported, bool downloaded, bool merge_all_trips);
bool prefer_imported, bool downloaded, bool merge_all_trips,
struct dive_table *dives_to_add, struct dive_table *dives_to_remove,
struct trip_table *trips_to_add);
extern char *get_dive_gas_string(const struct dive *dive);
extern struct dive **grow_dive_table(struct dive_table *table);