improved error-detection for the '^' prefix
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Wed, 28 Apr 2004 18:04:16 +0000 (18:04 +0000)
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Wed, 28 Apr 2004 18:04:16 +0000 (18:04 +0000)
added support for 'none'
allow '0'

git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1516 94cd875c-1c1d-0410-91d2-eb244daf1a30

util-vserver/lib/listparser.hc

index 140b5f2..bc35153 100644 (file)
 
 #define ISNUMBER(TYPE,SHORT)                                           \
   static inline ALWAYSINLINE bool                                      \
-  isNumber_##SHORT(char const *str,TYPE *res, char end_chr)            \
+  isNumber_##SHORT(char const **str,size_t *len,TYPE *res,char end_chr) \
   {                                                                    \
     char       *err_ptr;                                               \
-    if (*str=='^')                                                     \
-      *res = ((TYPE)(1)) << TONUMBER_##SHORT(str+1, &err_ptr, 0);      \
+    if (**str=='^') {                                                  \
+      *res = ((TYPE)(1)) << TONUMBER_##SHORT(++*str, &err_ptr, 0);     \
+      if (len) --*len;                                                 \
+    }                                                                  \
     else                                                               \
-      *res = TONUMBER_##SHORT(str, &err_ptr, 0);                       \
-    return err_ptr>str && *err_ptr==end_chr;                           \
+      *res = TONUMBER_##SHORT(*str, &err_ptr, 0);                      \
+    return err_ptr>*str && *err_ptr==end_chr;                          \
   }
 
 
     for (;len>0;) {                                                    \
       char const       *ptr = strchr(str, ',');                        \
       size_t           cnt;                                            \
-      TYPE             tmp;                                            \
-      bool             is_neg;                                         \
-                                                                       \
-      is_neg = *str=='!' || *str=='~';                                 \
-      if (is_neg) {                                                    \
+      TYPE             tmp = 0;                                        \
+      bool             is_neg     = false;                             \
+      bool             allow_zero = true;                              \
+                                                                       \
+      while (len>0 && (*str=='!' || *str=='~')) {                      \
+       is_neg = !is_neg;                                               \
        ++str;                                                          \
        --len;                                                          \
       }                                                                        \
       if (cnt>=len) { cnt=len; len=0; }                                        \
       else len-=(cnt+1);                                               \
                                                                        \
-      if (cnt==0)                                                      \
-       tmp = 0;                                                        \
+      if (cnt==0)                                                      \
+       allow_zero = false;                                             \
       else if (strncasecmp(str,"all",cnt)==0 ||                                \
               strncasecmp(str,"any",cnt)==0)                           \
        tmp = ~(TYPE)(0);                                               \
-      else if (!isNumber_##SHORT(str, &tmp, str[cnt]))                 \
-       tmp = (*func)(str,cnt);                                         \
+      else if (strncasecmp(str,"none",cnt)==0) {}                      \
+      else if (!isNumber_##SHORT(&str, &cnt, &tmp, str[cnt])) {                \
+       tmp        = (*func)(str,cnt);                                  \
+       allow_zero = false;                                             \
+      }                                                                        \
                                                                        \
-      if (tmp!=0) {                                                    \
+      if (tmp!=0 || allow_zero) {                                      \
        if (!is_neg) *flag |=  tmp;                                     \
        else         *flag &= ~tmp;                                     \
        *mask |= tmp;                                                   \