3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; version 2 of the License.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 #define TONUMBER_uint64(S,E,B) strtoll(S,E,B)
28 #define TONUMBER_uint32(S,E,B) strtol (S,E,B)
30 #define ISNUMBER(TYPE,SHORT) \
31 static inline ALWAYSINLINE bool \
32 isNumber_##SHORT(char const *str,TYPE *res, char end_chr) \
36 *res = ((TYPE)(1)) << TONUMBER_##SHORT(str+1, &err_ptr, 0); \
38 *res = TONUMBER_##SHORT(str, &err_ptr, 0); \
39 return err_ptr>str && *err_ptr==end_chr; \
43 #define LISTPARSER(TYPE,SHORT) \
44 ISNUMBER(TYPE,SHORT) \
46 utilvserver_listparser_ ## SHORT(char const *str, size_t len, \
47 char const **err_ptr, \
51 TYPE (*func)(char const *, size_t)) \
53 if (len==0) len = strlen(str); \
55 char const *ptr = strchr(str, ','); \
60 is_neg = *str=='!' || *str=='~'; \
66 cnt = ptr ? (size_t)(ptr-str) : len; \
67 if (cnt>=len) { cnt=len; len=0; } \
72 else if (strncasecmp(str,"all",cnt)==0 || \
73 strncasecmp(str,"any",cnt)==0) \
75 else if (!isNumber_##SHORT(str, &tmp, str[cnt])) \
76 tmp = (*func)(str,cnt); \
79 if (!is_neg) *flag |= tmp; \
84 if (err_ptr) *err_ptr = str; \
85 if (err_len) *err_len = cnt; \
93 if (err_ptr) *err_ptr = 0; \
94 if (err_len) *err_len = 0; \