Add dedicated functions for iterating over gadgets, configs, bindigs and functions to avoid direct access to fields of this structures. Change definitons of usbg_for_each_* macros to use new functions. Signed-off-by: Krzysztof Opasiak <k.opasiak@xxxxxxxxxxx> --- include/usbg/usbg.h | 80 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/usbg.c | 40 ++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 4 deletions(-) diff --git a/include/usbg/usbg.h b/include/usbg/usbg.h index ba7b1f5..e44468f 100644 --- a/include/usbg/usbg.h +++ b/include/usbg/usbg.h @@ -542,25 +542,97 @@ extern void usbg_set_net_qmult(struct function *f, int qmult); * @def usbg_for_each_gadget(g, s) * Iterates over each gadget */ -#define usbg_for_each_gadget(g, s) TAILQ_FOREACH(g, &s->gadgets, gnode) +#define usbg_for_each_gadget(g, s) \ + for(g = usbg_get_first_gadget(s); \ + g != NULL; \ + g = usbg_get_next_gadget(g)) /** * @def usbg_for_each_function(f, g) * Iterates over each function */ -#define usbg_for_each_function(f, g) TAILQ_FOREACH(f, &g->functions, fnode) +#define usbg_for_each_function(f, g) \ + for (f = usbg_get_first_function(g); \ + f != NULL; \ + f = usbg_get_next_function(f)) /** * @def usbg_for_each_config(c, g) * Iterates over each config */ -#define usbg_for_each_config(c, g) TAILQ_FOREACH(c, &g->configs, cnode) +#define usbg_for_each_config(c, g) \ + for (c = usbg_get_first_config(g); \ + c != NULL; \ + c = usbg_get_next_config(c)) /** * @def usbg_for_each_binding(b, c) * Iterates over each binding */ -#define usbg_for_each_binding(b, c) TAILQ_FOREACH(b, &c->bindings, bnode) +#define usbg_for_each_binding(b, c) \ + for (b = usbg_get_first_binding(c); \ + b != NULL; \ + b = usbg_get_next_binding(b)) + +/** + * @brief Get first gadget in gadget list + * @param s State of library + * @return Pointer to gadget or NULL if list is empty. + * @note Gadgets are sorted in strings (name) order + */ +extern struct gadget *usbg_get_first_gadget(struct state *s); + +/** + * @brief Get first function in function list + * @param g Pointer of gadget + * @return Pointer to function or NULL if list is empty. + * @note Functions are sorted in strings (name) order + */ +extern struct function *usbg_get_first_function(struct gadget *g); + +/** + * @brief Get first config in config list + * @param g Pointer of gadget + * @return Pointer to configuration or NULL if list is empty. + * @note Configs are sorted in strings (name) order + */ +extern struct config *usbg_get_first_config(struct gadget *g); + +/** + * @brief Get first binding in binding list + * @param C Pointer to configuration + * @return Pointer to binding or NULL if list is empty. + * @note Bindings are sorted in strings (name) order + */ +extern struct binding *usbg_get_first_binding(struct config *c); + +/** + * @brief Get the next gadget on a list. + * @pram g Pointer to current gadget + * @return Next gadget or NULL if end of list. + */ +extern struct gadget *usbg_get_next_gadget(struct gadget *g); + +/** + * @brief Get the next function on a list. + * @pram g Pointer to current function + * @return Next function or NULL if end of list. + */ +extern struct function *usbg_get_next_function(struct function *f); + +/** + * @brief Get the next config on a list. + * @pram g Pointer to current config + * @return Next config or NULL if end of list. + */ +extern struct config *usbg_get_next_config(struct config *c); + +/** + * @brief Get the next binding on a list. + * @pram g Pointer to current binding + * @return Next binding or NULL if end of list. + */ +extern struct binding *usbg_get_next_binding(struct binding *b); /** * @} diff --git a/src/usbg.c b/src/usbg.c index b13b0cb..198515f 100644 --- a/src/usbg.c +++ b/src/usbg.c @@ -1030,3 +1030,43 @@ void usbg_set_net_qmult(struct function *f, int qmult) f->attr.net.qmult = qmult; usbg_write_dec(f->path, f->name, "qmult", qmult); } + +struct gadget *usbg_get_first_gadget(struct state *s) +{ + return s ? TAILQ_FIRST(&s->gadgets) : NULL; +} + +struct function *usbg_get_first_function(struct gadget *g) +{ + return g ? TAILQ_FIRST(&g->functions) : NULL; +} + +struct config *usbg_get_first_config(struct gadget *g) +{ + return g ? TAILQ_FIRST(&g->configs) : NULL; +} + +struct binding *usbg_get_first_binding(struct config *c) +{ + return c ? TAILQ_FIRST(&c->bindings) : NULL; +} + +struct gadget *usbg_get_next_gadget(struct gadget *g) +{ + return g ? TAILQ_NEXT(g, gnode) : NULL; +} + +struct function *usbg_get_next_function(struct function *f) +{ + return f ? TAILQ_NEXT(f, fnode) : NULL; +} + +struct config *usbg_get_next_config(struct config *c) +{ + return c ? TAILQ_NEXT(c, cnode) : NULL; +} + +struct binding *usbg_get_next_binding(struct binding *b) +{ + return b ? TAILQ_NEXT(b, bnode) : NULL; +} -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html