mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Abstract out dive/sample allocation a bit
We're going to start to want to allocate dives and samples for the libdivecomputer import too, so let's clean things up a bit for that. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d45db9fac7
commit
aa416e3c96
3 changed files with 64 additions and 49 deletions
71
dive.c
71
dive.c
|
@ -3,6 +3,51 @@
|
||||||
|
|
||||||
#include "dive.h"
|
#include "dive.h"
|
||||||
|
|
||||||
|
struct dive *alloc_dive(void)
|
||||||
|
{
|
||||||
|
const int initial_samples = 5;
|
||||||
|
unsigned int size;
|
||||||
|
struct dive *dive;
|
||||||
|
|
||||||
|
size = dive_size(initial_samples);
|
||||||
|
dive = malloc(size);
|
||||||
|
if (!dive)
|
||||||
|
exit(1);
|
||||||
|
memset(dive, 0, size);
|
||||||
|
dive->alloc_samples = initial_samples;
|
||||||
|
return dive;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sample *prepare_sample(struct dive **divep)
|
||||||
|
{
|
||||||
|
struct dive *dive = *divep;
|
||||||
|
if (dive) {
|
||||||
|
int nr = dive->samples;
|
||||||
|
int alloc_samples = dive->alloc_samples;
|
||||||
|
struct sample *sample;
|
||||||
|
if (nr >= alloc_samples) {
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
|
alloc_samples = (alloc_samples * 3)/2 + 10;
|
||||||
|
size = dive_size(alloc_samples);
|
||||||
|
dive = realloc(dive, size);
|
||||||
|
if (!dive)
|
||||||
|
return NULL;
|
||||||
|
dive->alloc_samples = alloc_samples;
|
||||||
|
*divep = dive;
|
||||||
|
}
|
||||||
|
sample = dive->sample + nr;
|
||||||
|
memset(sample, 0, sizeof(*sample));
|
||||||
|
return sample;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void finish_sample(struct dive *dive, struct sample *sample)
|
||||||
|
{
|
||||||
|
dive->samples++;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* So when we re-calculate maxdepth and meandepth, we will
|
* So when we re-calculate maxdepth and meandepth, we will
|
||||||
* not override the old numbers if they are close to the
|
* not override the old numbers if they are close to the
|
||||||
|
@ -133,24 +178,15 @@ struct dive *fixup_dive(struct dive *dive)
|
||||||
#define MERGE_MAX(res, a, b, n) res->n = MAX(a->n, b->n)
|
#define MERGE_MAX(res, a, b, n) res->n = MAX(a->n, b->n)
|
||||||
#define MERGE_MIN(res, a, b, n) res->n = (a->n)?(b->n)?MIN(a->n, b->n):(a->n):(b->n)
|
#define MERGE_MIN(res, a, b, n) res->n = (a->n)?(b->n)?MIN(a->n, b->n):(a->n):(b->n)
|
||||||
|
|
||||||
static int alloc_samples;
|
|
||||||
|
|
||||||
static struct dive *add_sample(struct sample *sample, int time, struct dive *dive)
|
static struct dive *add_sample(struct sample *sample, int time, struct dive *dive)
|
||||||
{
|
{
|
||||||
int nr = dive->samples;
|
struct sample *p = prepare_sample(&dive);
|
||||||
struct sample *d;
|
|
||||||
|
|
||||||
if (nr >= alloc_samples) {
|
if (!p)
|
||||||
alloc_samples = (alloc_samples + 64) * 3 / 2;
|
|
||||||
dive = realloc(dive, dive_size(alloc_samples));
|
|
||||||
if (!dive)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
*p = *sample;
|
||||||
dive->samples = nr+1;
|
p->time.seconds = time;
|
||||||
d = dive->sample + nr;
|
finish_sample(dive, p);
|
||||||
|
|
||||||
*d = *sample;
|
|
||||||
d->time.seconds = time;
|
|
||||||
return dive;
|
return dive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,15 +310,12 @@ struct dive *try_to_merge(struct dive *a, struct dive *b)
|
||||||
if (a->when != b->when)
|
if (a->when != b->when)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
alloc_samples = 5;
|
res = alloc_dive();
|
||||||
res = malloc(dive_size(alloc_samples));
|
|
||||||
if (!res)
|
|
||||||
return NULL;
|
|
||||||
memset(res, 0, dive_size(alloc_samples));
|
|
||||||
|
|
||||||
res->when = a->when;
|
res->when = a->when;
|
||||||
res->location = merge_text(a->location, b->location);
|
res->location = merge_text(a->location, b->location);
|
||||||
res->notes = merge_text(a->notes, b->notes);
|
res->notes = merge_text(a->notes, b->notes);
|
||||||
|
MERGE_MAX(res, a, b, number);
|
||||||
MERGE_MAX(res, a, b, maxdepth.mm);
|
MERGE_MAX(res, a, b, maxdepth.mm);
|
||||||
res->meandepth.mm = 0;
|
res->meandepth.mm = 0;
|
||||||
MERGE_MAX(res, a, b, duration.seconds);
|
MERGE_MAX(res, a, b, duration.seconds);
|
||||||
|
|
8
dive.h
8
dive.h
|
@ -137,7 +137,7 @@ struct dive {
|
||||||
depth_t visibility;
|
depth_t visibility;
|
||||||
temperature_t airtemp, watertemp;
|
temperature_t airtemp, watertemp;
|
||||||
cylinder_t cylinder[MAX_CYLINDERS];
|
cylinder_t cylinder[MAX_CYLINDERS];
|
||||||
int samples;
|
int samples, alloc_samples;
|
||||||
struct sample sample[];
|
struct sample sample[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -193,6 +193,12 @@ static inline unsigned int dive_size(int samples)
|
||||||
return sizeof(struct dive) + samples*sizeof(struct sample);
|
return sizeof(struct dive) + samples*sizeof(struct sample);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern struct dive *alloc_dive(void);
|
||||||
|
extern void record_dive(struct dive *dive);
|
||||||
|
|
||||||
|
extern struct sample *prepare_sample(struct dive **divep);
|
||||||
|
extern void finish_sample(struct dive *dive, struct sample *sample);
|
||||||
|
|
||||||
extern struct dive *fixup_dive(struct dive *dive);
|
extern struct dive *fixup_dive(struct dive *dive);
|
||||||
extern struct dive *try_to_merge(struct dive *a, struct dive *b);
|
extern struct dive *try_to_merge(struct dive *a, struct dive *b);
|
||||||
|
|
||||||
|
|
32
parse-xml.c
32
parse-xml.c
|
@ -16,7 +16,7 @@ struct dive_table dive_table;
|
||||||
/*
|
/*
|
||||||
* Add a dive into the dive_table array
|
* Add a dive into the dive_table array
|
||||||
*/
|
*/
|
||||||
static void record_dive(struct dive *dive)
|
void record_dive(struct dive *dive)
|
||||||
{
|
{
|
||||||
int nr = dive_table.nr, allocated = dive_table.allocated;
|
int nr = dive_table.nr, allocated = dive_table.allocated;
|
||||||
struct dive **dives = dive_table.dives;
|
struct dive **dives = dive_table.dives;
|
||||||
|
@ -90,7 +90,6 @@ const struct units IMPERIAL_units = {
|
||||||
/*
|
/*
|
||||||
* Dive info as it is being built up..
|
* Dive info as it is being built up..
|
||||||
*/
|
*/
|
||||||
static int alloc_samples;
|
|
||||||
static struct dive *dive;
|
static struct dive *dive;
|
||||||
static struct sample *sample;
|
static struct sample *sample;
|
||||||
static struct tm tm;
|
static struct tm tm;
|
||||||
|
@ -984,17 +983,9 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
|
||||||
*/
|
*/
|
||||||
static void dive_start(void)
|
static void dive_start(void)
|
||||||
{
|
{
|
||||||
unsigned int size;
|
|
||||||
|
|
||||||
if (dive)
|
if (dive)
|
||||||
return;
|
return;
|
||||||
|
dive = alloc_dive();
|
||||||
alloc_samples = 5;
|
|
||||||
size = dive_size(alloc_samples);
|
|
||||||
dive = malloc(size);
|
|
||||||
if (!dive)
|
|
||||||
exit(1);
|
|
||||||
memset(dive, 0, size);
|
|
||||||
memset(&tm, 0, sizeof(tm));
|
memset(&tm, 0, sizeof(tm));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1143,22 +1134,7 @@ static void cylinder_end(void)
|
||||||
|
|
||||||
static void sample_start(void)
|
static void sample_start(void)
|
||||||
{
|
{
|
||||||
int nr;
|
sample = prepare_sample(&dive);
|
||||||
|
|
||||||
if (!dive)
|
|
||||||
return;
|
|
||||||
nr = dive->samples;
|
|
||||||
if (nr >= alloc_samples) {
|
|
||||||
unsigned int size;
|
|
||||||
|
|
||||||
alloc_samples = (alloc_samples * 3)/2 + 10;
|
|
||||||
size = dive_size(alloc_samples);
|
|
||||||
dive = realloc(dive, size);
|
|
||||||
if (!dive)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sample = dive->sample + nr;
|
|
||||||
memset(sample, 0, sizeof(*sample));
|
|
||||||
event_index = 0;
|
event_index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1167,8 +1143,8 @@ static void sample_end(void)
|
||||||
if (!dive)
|
if (!dive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
finish_sample(dive, sample);
|
||||||
sample = NULL;
|
sample = NULL;
|
||||||
dive->samples++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void entry(const char *name, int size, const char *raw)
|
static void entry(const char *name, int size, const char *raw)
|
||||||
|
|
Loading…
Add table
Reference in a new issue