mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-19 14:25:27 +00:00
Make add_single_dive() grow the divelist allocation if necessary
We only made sure the divelist allocation was big enough in "record_dive_to_table()", but add_single_dive() can add entries too. Now, in practice that never bit anybody, since (a) we allocate extra entries anyway, and it would be very unusual that the divelist table was exactly full (b) most "malloc()" implementations end up having their own slop on top of that (c) add_single_dive() was only used for merging dives, which actually ends up removing more divex than it adds (but it does add one first) but when I'm starting to split dives, this will be a bigger issue in practice. And it was wrong. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
b80079c37f
commit
b5b7bdda81
3 changed files with 20 additions and 10 deletions
17
divelist.c
17
divelist.c
|
@ -767,9 +767,26 @@ void delete_single_dive(int idx)
|
|||
free(dive);
|
||||
}
|
||||
|
||||
struct dive **grow_dive_table(struct dive_table *table)
|
||||
{
|
||||
int nr = table->nr, allocated = table->allocated;
|
||||
struct dive **dives = table->dives;
|
||||
|
||||
if (nr >= allocated) {
|
||||
allocated = (nr + 32) * 3 / 2;
|
||||
dives = realloc(dives, allocated * sizeof(struct dive *));
|
||||
if (!dives)
|
||||
exit(1);
|
||||
table->dives = dives;
|
||||
table->allocated = allocated;
|
||||
}
|
||||
return dives;
|
||||
}
|
||||
|
||||
void add_single_dive(int idx, struct dive *dive)
|
||||
{
|
||||
int i;
|
||||
grow_dive_table(&dive_table);
|
||||
dive_table.nr++;
|
||||
if (dive->selected)
|
||||
amount_selected++;
|
||||
|
|
|
@ -22,6 +22,7 @@ extern char *get_dive_gas_string(struct dive *dive);
|
|||
|
||||
extern dive_trip_t *find_trip_by_idx(int idx);
|
||||
|
||||
struct dive **grow_dive_table(struct dive_table *table);
|
||||
extern int trip_has_selected_dives(dive_trip_t *trip);
|
||||
extern void get_dive_gas(struct dive *dive, int *o2_p, int *he_p, int *o2low_p);
|
||||
extern int get_divenr(struct dive *dive);
|
||||
|
|
12
parse-xml.c
12
parse-xml.c
|
@ -67,17 +67,9 @@ void clear_table(struct dive_table *table)
|
|||
void record_dive_to_table(struct dive *dive, struct dive_table *table)
|
||||
{
|
||||
assert(table != NULL);
|
||||
int nr = table->nr, allocated = table->allocated;
|
||||
struct dive **dives = table->dives;
|
||||
struct dive **dives = grow_dive_table(table);
|
||||
int nr = table->nr;
|
||||
|
||||
if (nr >= allocated) {
|
||||
allocated = (nr + 32) * 3 / 2;
|
||||
dives = realloc(dives, allocated * sizeof(struct dive *));
|
||||
if (!dives)
|
||||
exit(1);
|
||||
table->dives = dives;
|
||||
table->allocated = allocated;
|
||||
}
|
||||
dives[nr] = fixup_dive(dive);
|
||||
table->nr = nr + 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue