From: Karel Zak Date: Thu, 3 May 2012 15:28:44 +0000 (+0200) Subject: lib/strutils: add string_to_bitmask() X-Git-Tag: v2.22-rc1~452 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ef167714e58132b969cfa4c185ae0159705ca0f;p=thirdparty%2Futil-linux.git lib/strutils: add string_to_bitmask() Signed-off-by: Karel Zak --- diff --git a/include/strutils.h b/include/strutils.h index 3134fde9e4..81556e0a0d 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -52,6 +52,9 @@ extern int string_to_idarray(const char *list, int ary[], size_t arysz, extern int string_to_bitarray(const char *list, char *ary, int (*name2bit)(const char *, size_t)); +extern int string_to_bitmask(const char *list, + unsigned long *mask, + long (*name2flag)(const char *, size_t)); extern int parse_range(const char *str, int *lower, int *upper, int def); extern int streq_except_trailing_slash(const char *s1, const char *s2); diff --git a/lib/strutils.c b/lib/strutils.c index 372558acd0..bdcdef3426 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -469,6 +469,49 @@ int string_to_bitarray(const char *list, return 0; } +/* + * LIST ::= [, ] + * + * The is translated to 'id' by name2flag() function and the flags is + * set to the 'mask' +* + * Returns: 0 on success, <0 on error. + */ +int string_to_bitmask(const char *list, + unsigned long *mask, + long (*name2flag)(const char *, size_t)) +{ + const char *begin = NULL, *p; + + if (!list || !name2flag || !mask) + return -EINVAL; + + for (p = list; p && *p; p++) { + const char *end = NULL; + long flag; + + if (!begin) + begin = p; /* begin of the level name */ + if (*p == ',') + end = p; /* terminate the name */ + if (*(p + 1) == '\0') + end = p + 1; /* end of string */ + if (!begin || !end) + continue; + if (end <= begin) + return -1; + + flag = name2flag(begin, end - begin); + if (flag < 0) + return flag; /* error */ + *mask |= flag; + begin = NULL; + if (end && !*end) + break; + } + return 0; +} + /* * Parse the lower and higher values in a string containing * "lower:higher" or "lower-higher" format. Note that either