]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Add helper 'for_each_dive()' dive iterator
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 21 Aug 2012 22:51:34 +0000 (15:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 21 Aug 2012 22:51:34 +0000 (15:51 -0700)
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 <torvalds@linux-foundation.org>
dive.h
divelist.c
info.c
statistics.c

diff --git a/dive.h b/dive.h
index 7ceab643ad2f1a4ced9661867266ca1ee6ffce06..ab854e37e6c6d49bfe43b6533322cd9facd11c4f 100644 (file)
--- 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);
index 3fd53ffa5309e1f5a65a98241d421209627417fb..30bd2d8e97b9024383e3e961457bae46ae06d356 100644 (file)
@@ -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 242e4b24d5823bfb580c23e86af974316fabbaeb..8db606344e7394ecbe44d5dbc961788d669c0dce 100644 (file)
--- 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 */
index 0a23f9022901fec121fe1ea56a90effe5605ba68..b9d2c3b95d19c57f96b2a353e274d9bb4304c301 100644 (file)
@@ -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++;