dynamic-debug has several __sections, each with <vecname>,
num_<vecname>, and it iterates over these with a 2-index for-loop.
These loops are fiddly with the 2 names.

We have only 2 such loops now, but are getting more soon; lets
embed/abstract the fiddlyness in the for_subvec() macro, and avoid
repeating it going forward.

Signed-off-by: Jim Cromie <jim.cro...@gmail.com>
---
 lib/dynamic_debug.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index d5572712ce55..94f6c8fd787b 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -128,6 +128,21 @@ do {                                                       
        \
 #define v3pr_info(fmt, ...)    vnpr_info(3, fmt, ##__VA_ARGS__)
 #define v4pr_info(fmt, ...)    vnpr_info(4, fmt, ##__VA_ARGS__)
 
+
+/*
+ * simplify a repeated for-loop pattern walking N steps in a T _vec
+ * member inside a struct _box.  It expects int i and T *_sp to be
+ * declared in the caller.
+ * @_i:  caller provided counter.
+ * @_sp: cursor into _vec, to examine each item.
+ * @_box: ptr to a struct containing @_vec member
+ * @_vec: name of a sub-struct member in _box, with array-ref and length
+ */
+#define for_subvec(_i, _sp, _box, _vec)                                       \
+       for ((_i) = 0, (_sp) = (_box)->_vec;                           \
+            (_i) < (_box)->num_##_vec;                                \
+            (_i)++, (_sp)++)
+
 static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
 {
        /* trim any trailing newlines */
@@ -156,7 +171,7 @@ static struct ddebug_class_map 
*ddebug_find_valid_class(struct ddebug_table cons
        struct ddebug_class_map *map;
        int i, idx;
 
-       for (map = dt->classes, i = 0; i < dt->num_classes; i++, map++) {
+       for_subvec(i, map, dt, classes) {
                idx = match_string(map->class_names, map->length, class_string);
                if (idx >= 0) {
                        *class_id = idx + map->base;
@@ -1221,8 +1236,7 @@ static void ddebug_attach_module_classes(struct 
ddebug_table *dt, struct _ddebug
         * the builtin/modular classmap vector/section.  Save the start
         * and length of the subrange at its edges.
         */
-       for (cm = di->classes, i = 0; i < di->num_classes; i++, cm++) {
-
+       for_subvec(i, cm, di, classes) {
                if (!strcmp(cm->mod_name, dt->mod_name)) {
                        if (!nc) {
                                v2pr_info("start subrange, class[%d]: module:%s 
base:%d len:%d ty:%d\n",
-- 
2.49.0

Reply via email to