X-Git-Url: http://git.tdb.fi/?p=ext%2Fsubsurface.git;a=blobdiff_plain;f=dive.h;h=dffe7532587ef28dd8e50e0e2543fb719549fa7f;hp=7ceab643ad2f1a4ced9661867266ca1ee6ffce06;hb=HEAD;hpb=e46688d694d33f445ecb2368541898613af0f3b3 diff --git a/dive.h b/dive.h index 7ceab64..dffe753 100644 --- a/dive.h +++ b/dive.h @@ -95,6 +95,7 @@ typedef struct { extern gboolean cylinder_none(void *_data); extern gboolean no_cylinders(cylinder_t *cyl); extern gboolean cylinders_equal(cylinder_t *cyl1, cylinder_t *cyl2); +extern void copy_cylinders(cylinder_t *cyl1, cylinder_t *cyl2); extern gboolean no_weightsystems(weightsystem_t *ws); extern gboolean weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2); @@ -234,8 +235,12 @@ struct event { #define W_IDX_PRIMARY 0 #define W_IDX_SECONDARY 1 +typedef enum { TF_NONE, NO_TRIP, IN_TRIP, NUM_TRIPFLAGS } tripflag_t; +extern const char *tripflag_names[NUM_TRIPFLAGS]; + struct dive { int number; + tripflag_t tripflag; int selected; time_t when; char *location; @@ -256,6 +261,58 @@ struct dive { struct sample sample[]; }; +extern GList *dive_trip_list; +extern gboolean autogroup; +/* random threashold: three days without diving -> new trip + * this works very well for people who usually dive as part of a trip and don't + * regularly dive at a local facility; this is why trips are an optional feature */ +#define TRIP_THRESHOLD 3600*24*3 + +#define UNGROUPED_DIVE(_dive) ((_dive)->tripflag == NO_TRIP) +#define DIVE_IN_TRIP(_dive) ((_dive)->tripflag == IN_TRIP) +#define NEXT_TRIP(_entry, _list) ((_entry) ? g_list_next(_entry) : (_list)) +#define PREV_TRIP(_entry, _list) ((_entry) ? g_list_previous(_entry) : g_list_last(_list)) +#define DIVE_TRIP(_trip) ((struct dive *)(_trip)->data) +#define DIVE_FITS_TRIP(_dive, _dive_trip) ((_dive_trip)->when - TRIP_THRESHOLD <= (_dive)->when) + +static inline int dive_date_cmp(gconstpointer _a, gconstpointer _b) { + return ((struct dive *)(_a))->when - ((struct dive *)(_b))->when; +} + +#define FIND_TRIP(_trip, _list) g_list_find_custom((_list), (_trip), dive_date_cmp) + +#ifdef DEBUG_TRIP +static void dump_trip_list(void) +{ + GList *p = NULL; + int i=0; + while ((p = NEXT_TRIP(p, dive_trip_list))) { + struct tm *tm = gmtime(&DIVE_TRIP(p)->when); + printf("trip %d to \"%s\" on %04u-%02u-%02u\n", ++i, DIVE_TRIP(p)->location, + tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday); + } + printf("-----\n"); +} +#endif + +/* insert the trip into the list - but ensure you don't have two trips + * for the same date; but if you have, make sure you don't keep the + * one with less information */ +static inline GList *insert_trip(struct dive *_trip, GList *_list) +{ + GList *result = FIND_TRIP(_trip, _list); + if (result) { + if (! DIVE_TRIP(result)->location) + DIVE_TRIP(result)->location = _trip->location; + } else { + result = g_list_insert_sorted((_list), (_trip), dive_date_cmp); + } +#ifdef DEBUG_TRIP + dump_trip_list(); +#endif + return result; +} + /* * We keep our internal data in well-specified units, but * the input and output may come in some random format. This @@ -295,6 +352,16 @@ static inline struct dive *get_dive(unsigned int nr) return dive_table.dives[nr]; } +/* + * Iterate over each dive, with the first parameter being the index + * iterator variable, and the second one being the dive one. + * + * I don't think anybody really wants the index, and we could make + * it local to the for-loop, but that would make us requires C99. + */ +#define for_each_dive(_i,_x) \ + for ((_i) = 0; ((_x) = get_dive(_i)) != NULL; (_i)++) + extern void parse_xml_init(void); extern void parse_xml_buffer(const char *url, const char *buf, int size, GError **error); extern void set_filename(const char *filename);