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.


SVN revision: 34168
This commit is contained in:
Caio Marcelo de Oliveira Filho 2008-04-01 21:28:28 +00:00
parent 368f148fef
commit 20df0987d1
2 changed files with 80 additions and 31 deletions

View File

@ -87,12 +87,14 @@ int is_param(int n);
int is_num(int n); int is_num(int n);
char *parse_str(int n); char *parse_str(int n);
int parse_enum(int n, ...); int parse_enum(int n, ...);
int parse_flags(int n, ...);
int parse_int(int n); int parse_int(int n);
int parse_int_range(int n, int f, int t); int parse_int_range(int n, int f, int t);
int parse_bool(int n); int parse_bool(int n);
double parse_float(int n); double parse_float(int n);
double parse_float_range(int n, double f, double t); double parse_float_range(int n, double f, double t);
void check_arg_count(int n); void check_arg_count(int n);
void check_min_arg_count(int n);
int object_handler_num(void); int object_handler_num(void);
int statement_handler_num(void); int statement_handler_num(void);

View File

@ -786,10 +786,54 @@ parse_str(int n)
return s; return s;
} }
static int
_parse_enum(char *str, va_list va)
{
va_list va2;
va_copy(va2, va); /* iterator for the error message */
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);
s = va_arg(va2, char *);
while (s)
{
v = va_arg(va2, int);
fprintf(stderr, " %s", s);
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;
}
}
return 0;
}
int int
parse_enum(int n, ...) parse_enum(int n, ...)
{ {
char *str; char *str;
int result;
va_list va; va_list va;
str = evas_list_nth(params, n); str = evas_list_nth(params, n);
@ -799,39 +843,28 @@ parse_enum(int n, ...)
progname, file_in, line - 1, n + 1); progname, file_in, line - 1, n + 1);
exit(-1); exit(-1);
} }
va_start(va, n);
for (;;)
{
char *s;
int v;
s = va_arg(va, char *); va_start(va, n);
if (!s) result = _parse_enum(str, va);
{
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 *);
while (s)
{
v = va_arg(va, int);
fprintf(stderr, " %s", s);
s = va_arg(va, char *);
if (!s) break;
}
fprintf(stderr, "\n");
va_end(va);
exit(-1);
}
v = va_arg(va, int);
if (!strcmp(s, str))
{
va_end(va);
return v;
}
}
va_end(va); va_end(va);
return 0;
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 int
@ -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 */ /* simple expression parsing stuff */
/* /*