From: Enlightenment C. <no...@cv...> - 2008-04-01 21:28:31
|
Enlightenment CVS committal Author : cmarcelo Project : e17 Module : libs/edje Dir : e17/libs/edje/src/bin Modified Files: edje_cc.h edje_cc_parse.c Log Message: 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. =================================================================== RCS file: /cvs/e/e17/libs/edje/src/bin/edje_cc.h,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- edje_cc.h 24 Mar 2008 08:22:00 -0000 1.30 +++ edje_cc.h 1 Apr 2008 21:28:28 -0000 1.31 @@ -87,12 +87,14 @@ 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); =================================================================== RCS file: /cvs/e/e17/libs/edje/src/bin/edje_cc_parse.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -3 -r1.48 -r1.49 --- edje_cc_parse.c 27 Aug 2007 11:28:30 -0000 1.48 +++ edje_cc_parse.c 1 Apr 2008 21:28:28 -0000 1.49 @@ -786,55 +786,88 @@ 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; @@ -959,6 +992,20 @@ { fprintf(stderr, "%s: Error. %s:%i got %i arguments, but expected %i\n", progname, file_in, line - 1, num_args, required_args); + exit(-1); + } +} + +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); } } |