diff options
author | Mike Frysinger <vapier@gentoo.org> | 2010-11-15 05:38:46 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2010-11-15 05:38:46 -0500 |
commit | 3e4c9f860008656c46818b84ecd372649d0f79da (patch) | |
tree | 22d55b67a0833966134bcade3858cb0b39b465f2 | |
parent | scrub generated m4 files before rebuilding autotools (diff) | |
download | sandbox-3e4c9f860008656c46818b84ecd372649d0f79da.tar.gz sandbox-3e4c9f860008656c46818b84ecd372649d0f79da.tar.bz2 sandbox-3e4c9f860008656c46818b84ecd372649d0f79da.zip |
tests: generalize flag parsing to handle AT_* flags better
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | tests/test-skel-0.c | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/tests/test-skel-0.c b/tests/test-skel-0.c index d8aa0b3..7fe38c0 100644 --- a/tests/test-skel-0.c +++ b/tests/test-skel-0.c @@ -9,33 +9,24 @@ const char *color_red = "\033[31;01m"; # define CONFIG 1 #endif -int f_get_flags(const char *str_flags) +struct flags { + const char *name; + int val; +}; + +static int _get_flags(const char *str_flags, const struct flags flags[], size_t num_flags) { const char *delim = "|"; char *tok = strtok(strdup(str_flags), delim); - struct { - const char *name; - int val; - } const flags[] = { - PAIR(O_APPEND) - PAIR(O_CREAT) - PAIR(O_DIRECTORY) - PAIR(O_EXCL) - PAIR(O_NOCTTY) - PAIR(O_NOFOLLOW) - PAIR(O_RDONLY) - PAIR(O_RDWR) - PAIR(O_TRUNC) - PAIR(O_WRONLY) - }; - int i, ret = 0; + int ret = 0; + size_t i; while (tok) { - for (i = 0; i < ARRAY_SIZE(flags); ++i) + for (i = 0; i < num_flags; ++i) if (!strcmp(tok, flags[i].name)) { ret |= flags[i].val; break; } - if (i == ARRAY_SIZE(flags)) { + if (i == num_flags) { int a; sscanf(tok, "%i", &a); ret |= a; @@ -44,6 +35,24 @@ int f_get_flags(const char *str_flags) } return ret; } +#define _get_flags(s, f) _get_flags(s, f, ARRAY_SIZE(f)) + +int f_get_flags(const char *str_flags) +{ + const struct flags flags[] = { + PAIR(O_APPEND) + PAIR(O_CREAT) + PAIR(O_DIRECTORY) + PAIR(O_EXCL) + PAIR(O_NOCTTY) + PAIR(O_NOFOLLOW) + PAIR(O_RDONLY) + PAIR(O_RDWR) + PAIR(O_TRUNC) + PAIR(O_WRONLY) + }; + return _get_flags(str_flags, flags); +} const char *f_get_file(const char *str_file) { @@ -55,13 +64,13 @@ const char *f_get_file(const char *str_file) int at_get_flags(const char *str_flags) { - if (!strcmp(str_flags, "AT_SYMLINK_NOFOLLOW")) - return AT_SYMLINK_NOFOLLOW; - else { - int flags = 0; - sscanf(str_flags, "%i", &flags); - return flags; - } + const struct flags flags[] = { + PAIR(AT_SYMLINK_NOFOLLOW) + PAIR(AT_REMOVEDIR) + PAIR(AT_SYMLINK_FOLLOW) + PAIR(AT_EACCESS) + }; + return _get_flags(str_flags, flags); } int at_get_fd(const char *str_dirfd) |