From: Milan Broz Date: Thu, 26 Jul 2012 13:52:04 +0000 (+0200) Subject: lib/strutils: add string_add_to_idarray() - parse and add to id list X-Git-Tag: v2.22-rc1~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5077b5180c58dec734d1c1a8d19c8632496a864;p=thirdparty%2Futil-linux.git lib/strutils: add string_add_to_idarray() - parse and add to id list Signed-off-by: Milan Broz Signed-off-by: Karel Zak --- diff --git a/include/strutils.h b/include/strutils.h index 57b13fddcd..123907fc98 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -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)); diff --git a/lib/strutils.c b/lib/strutils.c index 036ae06398..5dda138051 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -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 ::= [, ] *