* parser function has now to set a 'bool *' arg to signal errors
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Sun, 24 Apr 2005 20:23:11 +0000 (20:23 +0000)
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Sun, 24 Apr 2005 20:23:11 +0000 (20:23 +0000)
* when 'mask' argument is null, the special modifiers like '~', '!' or
  'any' are not allowed

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

util-vserver/lib/listparser.hc

index bc35153..3cf6cb9 100644 (file)
   utilvserver_listparser_ ## SHORT(char const *str, size_t len,                \
                                   char const **err_ptr,                \
                                   size_t *err_len,                     \
-                                  TYPE *flag,                          \
-                                  TYPE *mask,                          \
-                                  TYPE (*func)(char const *, size_t))  \
+                                  TYPE * const flag,                   \
+                                  TYPE * const mask,                   \
+                                  TYPE (*func)(char const *,           \
+                                               size_t, bool *))        \
   {                                                                    \
     if (len==0) len = strlen(str);                                     \
     for (;len>0;) {                                                    \
@@ -58,9 +59,9 @@
       size_t           cnt;                                            \
       TYPE             tmp = 0;                                        \
       bool             is_neg     = false;                             \
-      bool             allow_zero = true;                              \
+      bool             failed     = false;                             \
                                                                        \
-      while (len>0 && (*str=='!' || *str=='~')) {                      \
+      while (mask!=0 && len>0 && (*str=='!' || *str=='~')) {           \
        is_neg = !is_neg;                                               \
        ++str;                                                          \
        --len;                                                          \
       else len-=(cnt+1);                                               \
                                                                        \
       if (cnt==0)                                                      \
-       allow_zero = false;                                             \
-      else if (strncasecmp(str,"all",cnt)==0 ||                                \
-              strncasecmp(str,"any",cnt)==0)                           \
+       failed = true;                                                  \
+      else if (mask!=0 &&                                              \
+              (strncasecmp(str,"all",cnt)==0 ||                        \
+               strncasecmp(str,"any",cnt)==0))                         \
        tmp = ~(TYPE)(0);                                               \
-      else if (strncasecmp(str,"none",cnt)==0) {}                      \
-      else if (!isNumber_##SHORT(&str, &cnt, &tmp, str[cnt])) {                \
-       tmp        = (*func)(str,cnt);                                  \
-       allow_zero = false;                                             \
-      }                                                                        \
+      else if (mask!=0 && strncasecmp(str,"none",cnt)==0) {}           \
+      else if (!isNumber_##SHORT(&str, &cnt, &tmp, str[cnt]))          \
+       tmp = (*func)(str,cnt, &failed);                                \
                                                                        \
-      if (tmp!=0 || allow_zero) {                                      \
+      if (!failed) {                                                   \
        if (!is_neg) *flag |=  tmp;                                     \
        else         *flag &= ~tmp;                                     \
-       *mask |= tmp;                                                   \
+       if (mask!=0) *mask |=  tmp;                                     \
       }                                                                        \
       else {                                                           \
        if (err_ptr) *err_ptr = str;                                    \