]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: add string_to_bitmask()
authorKarel Zak <kzak@redhat.com>
Thu, 3 May 2012 15:28:44 +0000 (17:28 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 3 May 2012 15:28:44 +0000 (17:28 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
include/strutils.h
lib/strutils.c

index 3134fde9e428efc6da9b89a8e07a22c1f4e9d5c8..81556e0a0d4be2957c9d816f1f11b5853abfa4d2 100644 (file)
@@ -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);
index 372558acd0bf80f771953034bbb3a5648b02acd5..bdcdef3426aa4a2536983037937e6837747af129 100644 (file)
@@ -469,6 +469,49 @@ int string_to_bitarray(const char *list,
        return 0;
 }
 
+/*
+ * LIST ::= <item> [, <item>]
+ *
+ * The <item> 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