diff options
author | Michael Stone <michael@laptop.org> | 2009-12-19 22:53:06 (GMT) |
---|---|---|
committer | Michael Stone <michael@laptop.org> | 2009-12-19 23:03:17 (GMT) |
commit | 18c9eecc2959a9350ae8adf87e10aef897b5d0d4 (patch) | |
tree | 1146f3f3a3db1d53977d9f6326277990dc86def8 | |
parent | fa5a0ebb2e71b4ca7959481094318f5a62d15f9d (diff) |
Simplify list traversal logic.
-rw-r--r-- | rainbow/nss/nss-rainbow.c | 15 | ||||
-rw-r--r-- | rainbow/nss/slist.h | 53 | ||||
-rw-r--r-- | rainbow/nss/test_slist.c | 3 |
3 files changed, 31 insertions, 40 deletions
diff --git a/rainbow/nss/nss-rainbow.c b/rainbow/nss/nss-rainbow.c index 1f69ac3..6a2125c 100644 --- a/rainbow/nss/nss-rainbow.c +++ b/rainbow/nss/nss-rainbow.c @@ -5,6 +5,7 @@ #include <pwd.h> #include <grp.h> #include <stdint.h> +#include <stddef.h> #include <stdlib.h> #include <stdbool.h> #include <sys/types.h> @@ -286,7 +287,7 @@ gid_to_members_scanner(const struct dirent* d) { bool find_gid(struct gid_row* iter) { if (iter->gid == gid) { g_cur_gid = iter; return 0; } else return 1; } - slist_search(struct gid_row, list, g_gids, found, not_found, &find_gid); + slist_search(struct gid_row, list, g_gids, found, not_found, find_gid); not_found: LET(gr = calloc(1, sizeof(struct gid_row)), !gr, @@ -329,10 +330,10 @@ enum nss_status _nss_rainbow_endgrent(void) { free(member_iter->name); free(member_iter); } - slist_for(struct member_row, list, gid_iter->members, &free_member); + slist_for(struct member_row, list, gid_iter->members, free_member); free(gid_iter); } - slist_for(struct gid_row, list, g_gids, &free_gid); + slist_for(struct gid_row, list, g_gids, free_gid); return NSS_STATUS_SUCCESS; } @@ -366,8 +367,8 @@ fill_group(struct group* result, char* buf, size_t buflen, struct gid_row* gid_i /* count the number of members */ size_t member_count = 0; - void count_member(struct member_row* iter) { member_count++; } - slist_for(struct member_row, list, gid_iter->members, &count_member); + void count_member(struct member_row* iter) { (void) iter; member_count++; } + slist_for(struct member_row, list, gid_iter->members, count_member); /* reserve space for the member-pointers */ size_t member_size = (member_count+1)* sizeof(char*); @@ -381,7 +382,7 @@ fill_group(struct group* result, char* buf, size_t buflen, struct gid_row* gid_i /* fill in the members and swing the pointers */ member_count = 0; slist_while(struct member_row, list, gid_iter->members, out_error, - &fill_member, result, &buf, &buflen, &member_count); + fill_member, result, &buf, &buflen, &member_count); return 0; @@ -432,7 +433,7 @@ _nss_rainbow_getgrgid_r(gid_t gid, struct group *result, char *buf, size_t bufle } slist_search(struct gid_row, list, g_gids, resume, resume, - &find_gid, &gid_iter); + find_gid, &gid_iter); resume: TST(&gid_iter->list == NULL, ret = NSS_STATUS_NOTFOUND, diff --git a/rainbow/nss/slist.h b/rainbow/nss/slist.h index aaccd41..cd031ee 100644 --- a/rainbow/nss/slist.h +++ b/rainbow/nss/slist.h @@ -7,44 +7,33 @@ bool slist_non_null(struct slist* self); size_t slist_length(struct slist* self); void slist_extend(struct slist* self, struct slist* rhs); -/* Definition from kernel/include/list.h */ -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) - -/* Definition from kernel/include/list.h */ -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) +#define container_of(PTR, TYPE, MEMBER) \ + (TYPE *)((char *)(PTR) - ((ptrdiff_t) &((TYPE*)0)->MEMBER)) /* FUN should return false to break iteration. */ /* NB: Comma-swallowing paste of gnu-style named variadic macro argument. */ -#define slist_search(TYPE, MEMBER, PTR, FOUND_LABEL, NOTFOUND_LABEL, FUN, COOKIE...) ({ \ - struct slist *__slist_iter = ((PTR)->MEMBER).next; \ +#define slist_metafor(TYPE, MEMBER, PTR, BODY) { \ + struct slist *__slist_head = &((PTR)->MEMBER); \ + struct slist *__slist_iter = __slist_head->next; \ struct slist *__slist_next; \ - while(__slist_iter != &((PTR)->MEMBER)) { \ + while(__slist_iter != __slist_head) { \ __slist_next = __slist_iter->next; \ TYPE* __value_ptr = container_of(__slist_iter, TYPE, MEMBER); \ - if(!(*(FUN))(__value_ptr, ##COOKIE)) goto FOUND_LABEL; \ + BODY; \ __slist_iter = __slist_next; \ - } \ - goto NOTFOUND_LABEL; }) + } \ +} -#define slist_while(TYPE, MEMBER, PTR, ERR_LABEL, FUN, COOKIE...) ({ \ - struct slist *__slist_iter = ((PTR)->MEMBER).next; \ - struct slist *__slist_next; \ - while(__slist_iter != &((PTR)->MEMBER)) { \ - __slist_next = __slist_iter->next; \ - TYPE* __value_ptr = container_of(__slist_iter, TYPE, MEMBER); \ - if((*(FUN))(__value_ptr, ##COOKIE)) goto ERR_LABEL; \ - __slist_iter = __slist_next; \ - } \ - }) +#define slist_search(TYPE, MEMBER, PTR, FOUND_LABEL, NOTFOUND_LABEL, FUN, \ + COOKIE...) \ + slist_metafor(TYPE, MEMBER, PTR, \ + { if(!(FUN)(__value_ptr, ##COOKIE)) goto FOUND_LABEL; } \ + ) \ + goto NOTFOUND_LABEL; -#define slist_for(TYPE, MEMBER, PTR, FUN, COOKIE...) ({ \ - struct slist *__slist_iter = ((PTR)->MEMBER).next; \ - struct slist *__slist_next; \ - while(__slist_iter != &((PTR)->MEMBER)) { \ - __slist_next = __slist_iter->next; \ - TYPE* __value_ptr = container_of(__slist_iter, TYPE, MEMBER); \ - (*(FUN))(__value_ptr, ##COOKIE); \ - __slist_iter = __slist_next; \ - } }) +#define slist_while(TYPE, MEMBER, PTR, ERR_LABEL, FUN, COOKIE...) \ + slist_metafor(TYPE, MEMBER, PTR, \ + { if((FUN)(__value_ptr, ##COOKIE)) goto ERR_LABEL; }) \ + +#define slist_for(TYPE, MEMBER, PTR, FUN, COOKIE...) \ + slist_metafor(TYPE, MEMBER, PTR, { (FUN)(__value_ptr, ##COOKIE); }) diff --git a/rainbow/nss/test_slist.c b/rainbow/nss/test_slist.c index 66be29d..138adf4 100644 --- a/rainbow/nss/test_slist.c +++ b/rainbow/nss/test_slist.c @@ -1,5 +1,6 @@ #include <stdio.h> #include <stdint.h> +#include <stddef.h> #include <stdbool.h> #include "slist.h" @@ -22,7 +23,7 @@ int find_two(struct node* self) { if (self->id == 2) return 0; else return 1; } -int main(int argc, char** argv) { +int main() { struct node h, a, b, c; node_init(&h); a.id = 0; node_init(&a); a.id = 1; |