00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <stdlib.h>
00019 #include <errno.h>
00020
00021 #include "flist.h"
00022 #include "str.h"
00023
00024 int flist32_from_str(const char *str, const flist32_t list[],
00025 uint32_t *flags, uint32_t *mask,
00026 char clmod, char delim)
00027 {
00028 char *p, *o, *buf;
00029 int clear = 0;
00030 uint32_t cur_flag;
00031
00032 if (str_isempty(str))
00033 return errno = EINVAL, -1;
00034
00035 buf = p = o = str_dup(str);
00036
00037 while (1) {
00038 p = str_index(p, delim, str_len(p));
00039
00040 while (char_isspace(*o))
00041 o++;
00042
00043 if (p) {
00044 if (o == p) {
00045 p++;
00046 continue;
00047 }
00048
00049 *p++ = '\0';
00050 }
00051
00052 if (*o == clmod)
00053 clear = 1;
00054
00055 cur_flag = flist32_getval(list, o+clear);
00056
00057 if (!cur_flag) {
00058 free(buf);
00059 return errno = ENOENT, -1;
00060 }
00061
00062 if (clear) {
00063 *flags &= ~cur_flag;
00064 *mask |= cur_flag;
00065 } else {
00066 *flags |= cur_flag;
00067 *mask |= cur_flag;
00068 }
00069
00070 if (!p)
00071 break;
00072 else
00073 o = p;
00074 }
00075
00076 free(buf);
00077 return 0;
00078 }