From: Linus Torvalds Date: Tue, 21 Aug 2012 22:51:34 +0000 (-0700) Subject: Add helper 'for_each_dive()' dive iterator X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=666538ec7739fe839623bd1b6f9f80ff884ad5a9;p=ext%2Fsubsurface.git Add helper 'for_each_dive()' dive iterator It's an easy thing to do, but the for-loop ends up being pretty ugly, so hide it behind the macro. It would be even prettier with one of the (few) useful C99 features: local for-loop variables. However, gcc needs special command line options, and other compilers may not do it at all. So instead of doing #define for_each_dive(_x) \ for (int _i = 0; ((_x) = get_dive(_i)) != NULL; _i++) we require that the user declare the index iterator too, and the use syntax becomes for_each_dive(idx, dive) { ... use idx/dive here ... } And hey, maybe somebody actually will want to use the index, so maybe that's not all bad. Signed-off-by: Linus Torvalds --- diff --git a/dive.h b/dive.h index 7ceab64..ab854e3 100644 --- a/dive.h +++ b/dive.h @@ -295,6 +295,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); diff --git a/divelist.c b/divelist.c index 3fd53ff..30bd2d8 100644 --- a/divelist.c +++ b/divelist.c @@ -85,7 +85,7 @@ void dump_selection(void) struct dive *dive; printf("currently selected are %d dives:", amount_selected); - for (i = 0; (dive = get_dive(i)) != NULL; i++) { + for_each_dive(i, dive) { if (dive->selected) printf(" %d", i); } diff --git a/info.c b/info.c index 242e4b2..8db6063 100644 --- a/info.c +++ b/info.c @@ -519,7 +519,7 @@ int edit_multi_dive_info(struct dive *single_dive) int i; struct dive *dive; - for (i = 0; (dive = get_dive(i)) != NULL; i++) { + for_each_dive(i, dive) { if (dive == master || !dive->selected) continue; /* copy all "info" fields */ diff --git a/statistics.c b/statistics.c index 0a23f90..b9d2c3b 100644 --- a/statistics.c +++ b/statistics.c @@ -151,7 +151,7 @@ void process_selected_dives(void) memset(&stats_selection, 0, sizeof(stats_selection)); nr = 0; - for (i = 0; (dive = get_dive(i)) != NULL; ++i) { + for_each_dive(i, dive) { if (dive->selected) { process_dive(dive, &stats_selection); nr++;