void process_all_dives(struct dive *dive, struct dive **prev_dive) { int idx; struct dive *dp; struct tm tm; int current_year = 0; int current_month = 0; int year_iter = 0; int month_iter = 0; int prev_month = 0, prev_year = 0; int trip_iter = 0; dive_trip_t *trip_ptr = 0; unsigned int size; *prev_dive = NULL; memset(&stats, 0, sizeof(stats)); if (dive_table.nr > 0) { stats.shortest_time.seconds = dive_table.dives[0]->duration.seconds; stats.min_depth.mm = dive_table.dives[0]->maxdepth.mm; stats.selection_size = dive_table.nr; } /* allocate sufficient space to hold the worst * case (one dive per year or all dives during * one month) for yearly and monthly statistics*/ free(stats_yearly); free(stats_monthly); free(stats_by_trip); size = sizeof(stats_t) * (dive_table.nr + 1); stats_yearly = malloc(size); stats_monthly = malloc(size); stats_by_trip = malloc(size); if (!stats_yearly || !stats_monthly || !stats_by_trip) return; memset(stats_yearly, 0, size); memset(stats_monthly, 0, size); memset(stats_by_trip, 0, size); stats_yearly[0].is_year = true; /* this relies on the fact that the dives in the dive_table * are in chronological order */ for_each_dive (idx, dp) { if (dive && dp->when == dive->when) { /* that's the one we are showing */ if (idx > 0) *prev_dive = dive_table.dives[idx - 1]; } process_dive(dp, &stats); /* yearly statistics */ utc_mkdate(dp->when, &tm); if (current_year == 0) current_year = tm.tm_year + 1900; if (current_year != tm.tm_year + 1900) { current_year = tm.tm_year + 1900; process_dive(dp, &(stats_yearly[++year_iter])); stats_yearly[year_iter].is_year = true; } else { process_dive(dp, &(stats_yearly[year_iter])); } stats_yearly[year_iter].selection_size++; stats_yearly[year_iter].period = current_year; if (dp->divetrip != NULL) { if (trip_ptr != dp->divetrip) { trip_ptr = dp->divetrip; trip_iter++; } /* stats_by_trip[0] is all the dives combined */ stats_by_trip[0].selection_size++; process_dive(dp, &(stats_by_trip[0])); stats_by_trip[0].is_trip = true; stats_by_trip[0].location = strdup("All (by trip stats)"); process_dive(dp, &(stats_by_trip[trip_iter])); stats_by_trip[trip_iter].selection_size++; stats_by_trip[trip_iter].is_trip = true; stats_by_trip[trip_iter].location = dp->divetrip->location; } /* monthly statistics */ if (current_month == 0) { current_month = tm.tm_mon + 1; } else { if (current_month != tm.tm_mon + 1) current_month = tm.tm_mon + 1; if (prev_month != current_month || prev_year != current_year) month_iter++; } process_dive(dp, &(stats_monthly[month_iter])); stats_monthly[month_iter].selection_size++; stats_monthly[month_iter].period = current_month; prev_month = current_month; prev_year = current_year; } }
static void process_all_dives(struct dive *dive, struct dive **prev_dive) { int idx; struct dive *dp; struct tm tm; int current_year = 0; int current_month = 0; int year_iter = 0; int month_iter = 0; int prev_month = 0, prev_year = 0; unsigned int size; *prev_dive = NULL; memset(&stats, 0, sizeof(stats)); if (dive_table.nr > 0) { stats.shortest_time.seconds = dive_table.dives[0]->duration.seconds; stats.min_depth.mm = dive_table.dives[0]->maxdepth.mm; stats.selection_size = dive_table.nr; } /* allocate sufficient space to hold the worst * case (one dive per year or all dives during * one month) for yearly and monthly statistics*/ if (stats_yearly != NULL) { free(stats_yearly); free(stats_monthly); } size = sizeof(stats_t) * (dive_table.nr + 1); stats_yearly = malloc(size); stats_monthly = malloc(size); if (!stats_yearly || !stats_monthly) return; memset(stats_yearly, 0, size); memset(stats_monthly, 0, size); /* this relies on the fact that the dives in the dive_table * are in chronological order */ for (idx = 0; idx < dive_table.nr; idx++) { dp = dive_table.dives[idx]; if (dive && dp->when == dive->when) { /* that's the one we are showing */ if (idx > 0) *prev_dive = dive_table.dives[idx-1]; } process_dive(dp, &stats); /* yearly statistics */ utc_mkdate(dp->when, &tm); if (current_year == 0) current_year = tm.tm_year + 1900; if (current_year != tm.tm_year + 1900) { current_year = tm.tm_year + 1900; process_dive(dp, &(stats_yearly[++year_iter])); } else { process_dive(dp, &(stats_yearly[year_iter])); } stats_yearly[year_iter].selection_size++; stats_yearly[year_iter].period = current_year; /* monthly statistics */ if (current_month == 0) { current_month = tm.tm_mon + 1; } else { if (current_month != tm.tm_mon + 1) current_month = tm.tm_mon + 1; if (prev_month != current_month || prev_year != current_year) month_iter++; } process_dive(dp, &(stats_monthly[month_iter])); stats_monthly[month_iter].selection_size++; stats_monthly[month_iter].period = current_month; prev_month = current_month; prev_year = current_year; } if (yearly_tree) update_yearly_stats(); }