q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=ee97c4cf58a1e22137ddcecccaec217183b9d5ed

commit ee97c4cf58a1e22137ddcecccaec217183b9d5ed
Author: Daniel Kolesa <d.kol...@samsung.com>
Date:   Tue Jul 8 15:02:36 2014 +0100

    eolian: preparation for struct support
---
 src/lib/eolian/eo_parser.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 2 deletions(-)

diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 9991850..b84c9ee 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -186,7 +186,15 @@ parse_function_type(Eo_Lexer *ls)
 }
 
 static Eo_Type_Def *
-parse_type_void(Eo_Lexer *ls)
+parse_struct(Eo_Lexer *ls, const char *name)
+{
+   (void)ls;
+   (void)name;
+   return NULL;
+}
+
+static Eo_Type_Def *
+parse_type_struct(Eo_Lexer *ls, Eina_Bool allow_struct, Eina_Bool allow_anon)
 {
    Eina_Bool    has_struct = EINA_FALSE;
    Eo_Type_Def *def;
@@ -225,6 +233,17 @@ parse_type_void(Eo_Lexer *ls)
         }
       case KW_struct:
         eo_lexer_get(ls);
+        if (allow_struct)
+          {
+             if (allow_anon && ls->t.token == '{')
+               return parse_struct(ls, NULL);
+             if (eo_lexer_lookahead(ls) == '{')
+               {
+                  check(ls, TOK_VALUE);
+                  eo_lexer_get(ls);
+                  return parse_struct(ls, NULL);
+               }
+          }
         has_struct = EINA_TRUE;
         break;
       case KW_func:
@@ -278,16 +297,33 @@ parse_ptr:
    return def;
 }
 
+static Eo_Type_Def *
+parse_type_void(Eo_Lexer *ls)
+{
+   return parse_type_struct(ls, EINA_FALSE, EINA_FALSE);
+}
+
 static void
 parse_typedef(Eo_Lexer *ls)
 {
+   int line, column;
+   Eo_Type_Def *ret;
    ls->tmp.typedef_def = calloc(1, sizeof(Eo_Typedef_Def));
    eo_lexer_get(ls);
    check(ls, TOK_VALUE);
    ls->tmp.typedef_def->alias = eina_stringshare_add(ls->t.value);
    eo_lexer_get(ls);
    test_next(ls, ':');
-   ls->tmp.typedef_def->type = parse_type(ls);
+   line = ls->line_number;
+   column = ls->column;
+   ret = parse_type_struct(ls, EINA_TRUE, EINA_TRUE);
+   if (ret->type == EOLIAN_TYPE_VOID)
+     {
+        ls->line_number = line;
+        ls->column = column;
+        eo_lexer_syntax_error(ls, "non-void type expected");
+     }
+   ls->tmp.typedef_def->type = ret;
    ls->tmp.type_def = NULL;
    check_next(ls, ';');
 }
@@ -922,6 +958,13 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
            ls->tmp.typedef_def = NULL;
            break;
         }
+      case KW_struct:
+        {
+           eo_lexer_get(ls);
+           check(ls, TOK_VALUE);
+           eo_lexer_get(ls);
+           parse_struct(ls, NULL);
+        }
       def:
       default:
         eo_lexer_syntax_error(ls, "invalid token");

-- 


Reply via email to