Merge branch 'trips' of git://git.hohndel.org/subsurface

Merge the initial 'track trips explicitly' code from Dirk Hohndel.

Fix up trivial conflicts in save-xml.c due to the new 'is_attribute'
flag.

* 'trips' of git://git.hohndel.org/subsurface:
  Fix an issue with trips that have dives from multiple input files
  Some simple test dives for the trips code
  First cut of explicit trip tracking
This commit is contained in:
Linus Torvalds 2012-08-27 15:36:27 -07:00
commit c89f88378a
8 changed files with 289 additions and 75 deletions

View file

@ -39,6 +39,11 @@ void record_dive(struct dive *dive)
dive_table.nr = nr+1;
}
void record_trip(struct dive *trip)
{
dive_trip_list = insert_trip(trip, dive_trip_list);
}
static void delete_dive_renumber(struct dive **dives, int i, int nr)
{
struct dive *dive = dives[i];
@ -156,7 +161,7 @@ const struct units IMPERIAL_units = {
/*
* Dive info as it is being built up..
*/
static struct dive *cur_dive;
static struct dive *cur_dive, *cur_trip = NULL;
static struct sample *cur_sample;
static struct {
int active;
@ -535,6 +540,17 @@ static void get_index(char *buffer, void *_i)
free(buffer);
}
static void get_tripflag(char *buffer, void *_tf)
{
tripflag_t *tf = _tf;
tripflag_t i;
*tf = TF_NONE;
for (i = NO_TRIP; i < NUM_TRIPFLAGS; i++)
if(! strcmp(buffer, tripflag_names[i]))
*tf = i;
}
static void centibar(char *buffer, void *_pressure)
{
pressure_t *pressure = _pressure;
@ -1062,6 +1078,8 @@ static void try_to_fill_dive(struct dive **divep, const char *name, char *buf)
if (MATCH(".number", get_index, &dive->number))
return;
if (MATCH(".tripflag", get_tripflag, &dive->tripflag))
return;
if (MATCH(".date", divedate, &dive->when))
return;
if (MATCH(".time", divetime, &dive->when))
@ -1138,6 +1156,27 @@ static void try_to_fill_dive(struct dive **divep, const char *name, char *buf)
nonmatch("dive", name, buf);
}
/* We're in the top-level trip xml. Try to convert whatever value to a trip value */
static void try_to_fill_trip(struct dive **divep, const char *name, char *buf)
{
int len = strlen(name);
start_match("trip", name, buf);
struct dive *dive = *divep;
if (MATCH(".date", divedate, &dive->when)) {
dive->when = utc_mktime(&cur_tm);
return;
}
if (MATCH(".location", utf8_string, &dive->location))
return;
if (MATCH(".notes", utf8_string, &dive->notes))
return;
nonmatch("trip", name, buf);
}
/*
* File boundaries are dive boundaries. But sometimes there are
* multiple dives per file, so there can be other events too that
@ -1162,6 +1201,22 @@ static void dive_end(void)
cur_ws_index = 0;
}
static void trip_start(void)
{
if (cur_trip)
return;
cur_trip = alloc_dive();
memset(&cur_tm, 0, sizeof(cur_tm));
}
static void trip_end(void)
{
if (!cur_trip)
return;
record_trip(cur_trip);
cur_trip = NULL;
}
static void event_start(void)
{
memset(&cur_event, 0, sizeof(cur_event));
@ -1225,6 +1280,10 @@ static void entry(const char *name, int size, const char *raw)
try_to_fill_sample(cur_sample, name, buf);
return;
}
if (cur_trip) {
try_to_fill_trip(&cur_trip, name, buf);
return;
}
if (cur_dive) {
try_to_fill_dive(&cur_dive, name, buf);
return;
@ -1350,6 +1409,7 @@ static struct nesting {
} nesting[] = {
{ "dive", dive_start, dive_end },
{ "Dive", dive_start, dive_end },
{ "trip", trip_start, trip_end },
{ "sample", sample_start, sample_end },
{ "waypoint", sample_start, sample_end },
{ "SAMPLE", sample_start, sample_end },