[Pkg-e-commits] [SCM] Enlightenment DR17 graphical layout and animation library branch, upstream-vcs, updated. f5b4e4555670cc3b4a24802eb44d7d47c379bee4

cmarcelo cmarcelo at alioth.debian.org
Fri May 23 22:08:14 UTC 2008


The following commit has been merged in the upstream-vcs branch:
commit 60c1de83cf7e234af78612e6f450ea2642a5bc5a
Author: cmarcelo <cmarcelo>
Date:   Tue Apr 1 21:28:28 2008 +0000

    Edje: support for parsing flag-style values (and combinantions of them) in edje_cc.
    
    For example:
    
        field: FLAG_A FLAG_B FLAG_C;   // at least one flag is needed
    
    And we can assign a bit for each FLAG_*, the result would be the OR between all of them.
    Refactored a bit of parse_enum to re-use code there.

diff --git a/src/bin/edje_cc.h b/src/bin/edje_cc.h
index e616318..99ecb97 100644
--- a/src/bin/edje_cc.h
+++ b/src/bin/edje_cc.h
@@ -87,12 +87,14 @@ int     is_param(int n);
 int     is_num(int n);
 char   *parse_str(int n);
 int     parse_enum(int n, ...);
+int     parse_flags(int n, ...);
 int     parse_int(int n);
 int     parse_int_range(int n, int f, int t);
 int     parse_bool(int n);
 double  parse_float(int n);
 double  parse_float_range(int n, double f, double t);
 void    check_arg_count(int n);
+void    check_min_arg_count(int n);
 
 int     object_handler_num(void);
 int     statement_handler_num(void);
diff --git a/src/bin/edje_cc_parse.c b/src/bin/edje_cc_parse.c
index 6fb729a..e5742a6 100644
--- a/src/bin/edje_cc_parse.c
+++ b/src/bin/edje_cc_parse.c
@@ -786,55 +786,88 @@ parse_str(int n)
    return s;
 }
 
-int
-parse_enum(int n, ...)
+static int
+_parse_enum(char *str, va_list va)
 {
-   char *str;
-   va_list va;
+   va_list va2;
+   va_copy(va2, va); /* iterator for the error message */
 
-   str = evas_list_nth(params, n);
-   if (!str)
-     {
-	fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
-		progname, file_in, line - 1, n + 1);
-	exit(-1);
-     }
-   va_start(va, n);
    for (;;)
      {
 	char *s;
 	int   v;
 
 	s = va_arg(va, char *);
+
+	/* End of the list, nothing matched. */
 	if (!s)
 	  {
 	     fprintf(stderr, "%s: Error. %s:%i token %s not one of:",
 		     progname, file_in, line - 1, str);
-	     va_start(va, n);
-	     s = va_arg(va, char *);
+	     s = va_arg(va2, char *);
 	     while (s)
 	       {
-		  v = va_arg(va, int);
+		  v = va_arg(va2, int);
 		  fprintf(stderr, " %s", s);
-		  s = va_arg(va, char *);
+		  s = va_arg(va2, char *);
 		  if (!s) break;
 	       }
 	     fprintf(stderr, "\n");
+	     va_end(va2);
 	     va_end(va);
 	     exit(-1);
 	  }
+
 	v = va_arg(va, int);
 	if (!strcmp(s, str))
 	  {
+	     va_end(va2);
 	     va_end(va);
 	     return v;
 	  }
      }
-   va_end(va);
    return 0;
 }
 
 int
+parse_enum(int n, ...)
+{
+   char *str;
+   int result;
+   va_list va;
+
+   str = evas_list_nth(params, n);
+   if (!str)
+     {
+	fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
+		progname, file_in, line - 1, n + 1);
+	exit(-1);
+     }
+
+   va_start(va, n);
+   result = _parse_enum(str, va);
+   va_end(va);
+
+   return result;
+}
+
+int
+parse_flags(int n, ...)
+{
+   char *str;
+   Evas_List *lst;
+   int result = 0;
+   va_list va;
+
+   va_start(va, n);
+   for (lst = evas_list_nth_list(params, n); lst != NULL; lst = lst->next)
+     result |= _parse_enum(lst->data, va);
+   va_end(va);
+
+   return result;
+}
+
+int
 parse_int(int n)
 {
    char *str;
@@ -963,6 +996,20 @@ check_arg_count(int required_args)
      }
 }
 
+void
+check_min_arg_count(int min_required_args)
+{
+   int num_args = evas_list_count (params);
+
+   if (num_args < min_required_args)
+     {
+	fprintf(stderr, "%s: Error. %s:%i got %i arguments, "
+		"but expected at least %i\n",
+		progname, file_in, line - 1, num_args, min_required_args);
+	exit(-1);
+     }
+}
+
 /* simple expression parsing stuff */
 
 /*

-- 
Enlightenment DR17 graphical layout and animation library



More information about the Pkg-e-commits mailing list