]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: add string_add_to_idarray() - parse and add to id list
authorMilan Broz <mbroz@redhat.com>
Thu, 26 Jul 2012 13:52:04 +0000 (15:52 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 26 Jul 2012 14:26:27 +0000 (16:26 +0200)
Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
include/strutils.h
lib/strutils.c

index 57b13fddcdccac55fad9d1e7af3bb690685e3a60..123907fc98e3ebd46f1e9e138aabbacfd34ed938 100644 (file)
@@ -59,6 +59,10 @@ extern char *size_to_human_string(int options, uint64_t bytes);
 
 extern int string_to_idarray(const char *list, int ary[], size_t arysz,
                           int (name2id)(const char *, size_t));
+extern int string_add_to_idarray(const char *list, int ary[],
+                                size_t arysz, int *ary_pos,
+                                int (name2id)(const char *, size_t));
+
 extern int string_to_bitarray(const char *list, char *ary,
                            int (*name2bit)(const char *, size_t));
 
index 036ae06398002eb4f587d418b0a1c4824ceba2e5..5dda1380518e35c9afc6d4eb44a8b1f8c86225e0 100644 (file)
@@ -478,6 +478,33 @@ int string_to_idarray(const char *list, int ary[], size_t arysz,
        return n;
 }
 
+/*
+ * Parses the array like string_to_idarray but if format is "+aaa,bbb"
+ * it adds fields to array instead of replacing them.
+ */
+int string_add_to_idarray(const char *list, int ary[], size_t arysz,
+                       int *ary_pos, int (name2id)(const char *, size_t))
+{
+       const char *list_add;
+       int r;
+
+       if (!list || !*list || !ary_pos ||
+           *ary_pos < 0 || (size_t) *ary_pos > arysz)
+               return -1;
+
+       if (list[0] == '+')
+               list_add = &list[1];
+       else {
+               list_add = list;
+               *ary_pos = 0;
+       }
+
+       r = string_to_idarray(list_add, &ary[*ary_pos], arysz - *ary_pos, name2id);
+       if (r > 0)
+               *ary_pos += r;
+       return r;
+}
+
 /*
  * LIST ::= <item> [, <item>]
  *