line: provide gpiod_line_bulk_foreach_line()
authorBartosz Golaszewski <bartekgola@gmail.com>
Wed, 4 Oct 2017 07:07:44 +0000 (09:07 +0200)
committerBartosz Golaszewski <bartekgola@gmail.com>
Wed, 4 Oct 2017 07:07:44 +0000 (09:07 +0200)
Add a macro allowing to easily iterate over all lines held by a line
bulk object.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
include/gpiod.h
tests/tests-line.c

index 8c672a9922b288a36753d9f00914b4074b495762..438744fad127b9bac1d0537dbe97b3669d499ede 100644 (file)
@@ -442,6 +442,18 @@ gpiod_line_bulk_num_lines(struct gpiod_line_bulk *bulk)
        return bulk->num_lines;
 }
 
+/**
+ * @brief Iterate over all line handles held by a line bulk object.
+ * @param bulk Line bulk object.
+ * @param line GPIO line handle. On each iteration, the subsequent line handle
+ *             is assigned to this pointer.
+ * @param lineptr Pointer to a GPIO line handle used to store the loop state.
+ */
+#define gpiod_line_bulk_foreach_line(bulk, line, lineptr)              \
+       for ((lineptr) = (bulk)->lines, (line) = *(lineptr);            \
+            (lineptr) <= (bulk)->lines + ((bulk)->num_lines - 1);      \
+            (lineptr)++, (line) = *(lineptr))
+
 /**
  * @}
  *
index b238c9b4140b800404c9f920f1793fe1897225f5..7d4e3e1d206b6183a2751f15e1467c6bbfdc89c7 100644 (file)
@@ -501,3 +501,40 @@ static void line_empty_consumer(void)
 TEST_DEFINE(line_empty_consumer,
            "line request - empty consumer string",
            0, { 8 });
+
+static void line_bulk_foreach(void)
+{
+       static const char *const line_names[] = { "gpio-mockup-A-0",
+                                                 "gpio-mockup-A-1",
+                                                 "gpio-mockup-A-2",
+                                                 "gpio-mockup-A-3" };
+
+       TEST_CLEANUP(test_close_chip) struct gpiod_chip *chip = NULL;
+       struct gpiod_line_bulk bulk = GPIOD_LINE_BULK_INITIALIZER;
+       struct gpiod_line *line, **lineptr;
+       int i;
+
+       chip = gpiod_chip_open(test_chip_path(0));
+       TEST_ASSERT_NOT_NULL(chip);
+
+       for (i = 0; i < 4; i++) {
+               line = gpiod_chip_get_line(chip, i);
+               TEST_ASSERT_NOT_NULL(line);
+
+               gpiod_line_bulk_add(&bulk, line);
+       }
+
+       i = 0;
+       gpiod_line_bulk_foreach_line(&bulk, line, lineptr)
+               TEST_ASSERT_STR_EQ(gpiod_line_name(line), line_names[i++]);
+
+       i = 0;
+       gpiod_line_bulk_foreach_line(&bulk, line, lineptr) {
+               TEST_ASSERT_STR_EQ(gpiod_line_name(line), line_names[i++]);
+               if (i == 2)
+                       break;
+       }
+}
+TEST_DEFINE(line_bulk_foreach,
+           "line bulk - iterate over all lines",
+           TEST_FLAG_NAMED_LINES, { 8 });