q66 pushed a commit to branch master.

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

commit 3a8e08f74751a2cc0927b15c1ebf9fc6f56410fc
Author: Daniel Kolesa <[email protected]>
Date:   Fri Nov 21 14:12:40 2014 +0000

    eolian: one func for filling in namespaces
---
 src/lib/eolian/eo_parser.c | 81 ++++++++++++++++++++--------------------------
 1 file changed, 35 insertions(+), 46 deletions(-)

diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index c45e79d..e343f73 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -188,46 +188,30 @@ parse_name_list(Eo_Lexer *ls, Eina_List **out)
    pop_strbuf(ls);
 }
 
-#define NAMESPACE_PARSE(def, dname) \
-   char *full_name = strdup(dname); \
-   char *name = full_name, *dot = full_name; \
-   def->full_name = dname; \
-   do \
-     { \
-        dot = strchr(dot, '.'); \
-        if (dot) \
-          { \
-             *dot = '\0'; \
-             def->namespaces = eina_list_append(def->namespaces, \
-                                               eina_stringshare_add(name)); \
-             ++dot; \
-             name = dot; \
-          } \
-     } \
-   while (dot); \
-   def->name = eina_stringshare_add(name); \
-   free(full_name);
-
-static void
-_fill_type_name(Eolian_Type *tp, const char *type_name)
-{
-   NAMESPACE_PARSE(tp, type_name)
-}
-
-static void
-_fill_variable_name(Eolian_Variable *var, const char *var_name)
-{
-   NAMESPACE_PARSE(var, var_name)
-}
-
 static void
-_fill_class_name(Eolian_Class *cl, const char *cl_name)
+_fill_name(const char *input, Eina_Stringshare **full_name,
+           Eina_Stringshare **name, Eina_List **namespaces)
 {
-   NAMESPACE_PARSE(cl, cl_name)
+   char *fname = strdup(input);
+   char *sname = fname, *dot = fname;
+   *full_name = input;
+   do
+     {
+        dot = strchr(dot, '.');
+        if (dot)
+          {
+             *dot = '\0';
+             *namespaces = eina_list_append(*namespaces,
+                                            eina_stringshare_add(sname));
+             ++dot;
+             sname = dot;
+          }
+     }
+   while (dot);
+   *name = eina_stringshare_add(sname);
+   free(fname);
 }
 
-#undef NAMESPACE_PARSE
-
 static Eolian_Expression *
 push_expr(Eo_Lexer *ls)
 {
@@ -562,7 +546,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
    int bline = ls->line_number, bcolumn = ls->column;
    Eolian_Type *def = push_type(ls);
    def->is_extern = is_extern;
-   if (name) _fill_type_name(def, name);
+   if (name) _fill_name(name, &def->full_name, &def->name, &def->namespaces);
    def->type = EOLIAN_TYPE_STRUCT;
    def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free));
    def->freefunc = freefunc;
@@ -627,7 +611,7 @@ parse_enum(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
    int bline = ls->line_number, bcolumn = ls->column;
    Eolian_Type *def = push_type(ls);
    def->is_extern = is_extern;
-   _fill_type_name(def, name);
+   _fill_name(name, &def->full_name, &def->name, &def->namespaces);
    def->type = EOLIAN_TYPE_ENUM;
    def->fields = eina_hash_string_small_new(EINA_FREE_CB(_enum_field_free));
    check_next(ls, '{');
@@ -888,7 +872,7 @@ parse_type_named_void(Eo_Lexer *ls, Eina_Bool allow_named)
            def->base.line = line;
            def->base.column = col;
            pop_str(ls);
-           _fill_type_name(def, sname);
+           _fill_name(sname, &def->full_name, &def->name, &def->namespaces);
            goto parse_ptr;
         }
       case KW_func:
@@ -913,7 +897,8 @@ parse_type_named_void(Eo_Lexer *ls, Eina_Bool allow_named)
         ctype = eo_lexer_get_c_type(ls->t.kw);
         if (ctype)
           {
-             _fill_type_name(def, eina_stringshare_ref(ls->t.value.s));
+             _fill_name(eina_stringshare_ref(ls->t.value.s), &def->full_name,
+                        &def->name, &def->namespaces);
              eo_lexer_get(ls);
              if (tpid >= KW_accessor)
                {
@@ -964,7 +949,8 @@ parse_type_named_void(Eo_Lexer *ls, Eina_Bool allow_named)
                   free(fnm);
                   def->type = EOLIAN_TYPE_CLASS;
                }
-             _fill_type_name(def, eina_stringshare_add(nm));
+             _fill_name(eina_stringshare_add(nm), &def->full_name, &def->name,
+                        &def->namespaces);
              pop_strbuf(ls);
           }
      }
@@ -1010,7 +996,8 @@ parse_typedef(Eo_Lexer *ls)
    def->base.line = ls->line_number;
    def->base.column = ls->column;
    parse_name(ls, buf);
-   _fill_type_name(def, eina_stringshare_add(eina_strbuf_string_get(buf)));
+   _fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)),
+              &def->full_name, &def->name, &def->namespaces);
    Eolian_Type *tp = (Eolian_Type*)eina_hash_find(_aliases, def->full_name);
    if (tp)
      {
@@ -1053,7 +1040,8 @@ parse_variable(Eo_Lexer *ls, Eina_Bool global)
    def->base.line = ls->line_number;
    def->base.column = ls->column;
    parse_name(ls, buf);
-   _fill_variable_name(def, eina_stringshare_add(eina_strbuf_string_get(buf)));
+   _fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)),
+              &def->full_name, &def->name, &def->namespaces);
    check_next(ls, ':');
    def->base_type = parse_type(ls);
    pop_type(ls);
@@ -1877,8 +1865,9 @@ parse_class(Eo_Lexer *ls, Eolian_Class_Type type)
         eo_lexer_syntax_error(ls, "class and file names differ");
      }
    eo_lexer_context_pop(ls);
-   _fill_class_name(ls->tmp.kls, eina_stringshare_add(eina_strbuf_string_get
-      (buf)));
+   _fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)),
+              &ls->tmp.kls->full_name, &ls->tmp.kls->name,
+              &ls->tmp.kls->namespaces);
    pop_strbuf(ls);
    if (ls->t.token != '{')
      {
@@ -1966,7 +1955,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
                 def->type = EOLIAN_TYPE_STRUCT_OPAQUE;
                 def->freefunc = freefunc;
                 pop_str(ls);
-                _fill_type_name(def, name);
+                _fill_name(name, &def->full_name, &def->name, 
&def->namespaces);
                 eo_lexer_get(ls);
                 if (ls->t.token == TOK_COMMENT)
                   {

-- 


Reply via email to