summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2014-06-24 17:15:17 +0100
committerDaniel Kolesa <d.kolesa@samsung.com>2014-06-30 17:20:06 +0100
commitc0576cee73382fc833d7eecf13b365321cbf365d (patch)
treeb7f7503d50d5958fcb0aec3002eaace9dcd187b1
parent1674d967d2137903b6430ff84b03bb2fd052dcf1 (diff)
downloadefl-c0576cee73382fc833d7eecf13b365321cbf365d.tar.gz
eolian: new API: eolian_function_full_c_name_get - reduces duplication of code
-rw-r--r--src/bin/eolian/common_funcs.c44
-rw-r--r--src/bin/eolian/common_funcs.h2
-rw-r--r--src/bin/eolian/eo_generator.c6
-rw-r--r--src/lib/eolian/Eolian.h13
-rw-r--r--src/lib/eolian/eolian_database.c34
5 files changed, 56 insertions, 43 deletions
diff --git a/src/bin/eolian/common_funcs.c b/src/bin/eolian/common_funcs.c
index 5dd20f2805..e9fdca691d 100644
--- a/src/bin/eolian/common_funcs.c
+++ b/src/bin/eolian/common_funcs.c
@@ -50,7 +50,8 @@ _class_env_create(const Eolian_Class class, const char *over_classname, _eolian_
void
_class_func_env_create(const Eolian_Class class, const char *funcname, Eolian_Function_Type ftype, _eolian_class_func_vars *env)
{
- char *p, *ret;
+ char *p;
+ const char *ret;
const char *suffix = "";
const char *legacy = NULL;
Eolian_Function funcid = eolian_class_function_find_by_name(class, funcname, ftype);
@@ -72,15 +73,15 @@ _class_func_env_create(const Eolian_Class class, const char *funcname, Eolian_Fu
p = strncpy(env->upper_func, funcname, PATH_MAX - 1);
eina_str_toupper(&p);
- ret = _func_name_dedup(tmp_env.upper_eo_prefix, funcname);
+ ret = eolian_function_full_c_name_get(funcid, tmp_env.upper_eo_prefix);
sprintf(p = env->upper_eo_func, "%s%s", ret, suffix);
eina_str_toupper(&p);
- free(ret);
+ eina_stringshare_del(ret);
- ret = _func_name_dedup(tmp_env.lower_eo_prefix, funcname);
+ ret = eolian_function_full_c_name_get(funcid, tmp_env.lower_eo_prefix);
sprintf(p = env->lower_eo_func, "%s%s", ret, suffix);
eina_str_tolower(&p);
- free(ret);
+ eina_stringshare_del(ret);
env->legacy_func[0] = '\0';
if (legacy && !strcmp(legacy, "null")) goto end;
@@ -164,36 +165,3 @@ _source_desc_get(const char *str)
eina_strbuf_free(part);
return ret;
}
-
-char *
-_func_name_dedup(const char *classn, const char *funcn)
-{
- const char *last_p = strrchr(classn, '_');
- const char *func_p = strchr(funcn, '_');
- Eina_Strbuf *buf = eina_strbuf_new();
- int len;
- char *ret;
-
- if (!last_p) last_p = classn;
- else last_p++;
- if (!func_p) len = strlen(funcn);
- else len = func_p - funcn;
-
- if ((int)strlen(last_p) != len || strncmp(last_p, funcn, len))
- {
- eina_strbuf_append(buf, classn);
- eina_strbuf_append_char(buf, '_');
- eina_strbuf_append(buf, funcn);
- ret = eina_strbuf_string_steal(buf);
- eina_strbuf_free(buf);
- return ret;
- }
-
- if (last_p != classn)
- eina_strbuf_append_n(buf, classn, last_p - classn); /* includes _ */
-
- eina_strbuf_append(buf, funcn);
- ret = eina_strbuf_string_steal(buf);
- eina_strbuf_free(buf);
- return ret;
-}
diff --git a/src/bin/eolian/common_funcs.h b/src/bin/eolian/common_funcs.h
index ca510efb1f..ff98d7d508 100644
--- a/src/bin/eolian/common_funcs.h
+++ b/src/bin/eolian/common_funcs.h
@@ -66,6 +66,4 @@ void _class_env_create(const Eolian_Class class, const char *over_classname, _eo
void _class_func_env_create(const Eolian_Class class, const char *funcname, Eolian_Function_Type ftype EINA_UNUSED, _eolian_class_func_vars *env);
-char *_func_name_dedup(const char *classn, const char *funcn);
-
#endif
diff --git a/src/bin/eolian/eo_generator.c b/src/bin/eolian/eo_generator.c
index 1eb4fbd50f..afea024025 100644
--- a/src/bin/eolian/eo_generator.c
+++ b/src/bin/eolian/eo_generator.c
@@ -597,8 +597,8 @@ eo_source_end_generate(const Eolian_Class class, Eina_Strbuf *buf)
Eolian_Function_Type ftype;
Eolian_Function fnid = NULL;
const char *funcname = NULL;
+ const char *ret;
char *tp = implname;
- char *ret;
if (eolian_implement_information_get(impl_desc, &impl_class, &fnid, &ftype))
{
@@ -616,7 +616,7 @@ eo_source_end_generate(const Eolian_Class class, Eina_Strbuf *buf)
goto end;
}
- ret = _func_name_dedup(impl_env.lower_eo_prefix, funcname);
+ ret = eolian_function_full_c_name_get(fnid, impl_env.lower_eo_prefix);
switch (ftype)
{
case EOLIAN_PROP_SET: case EOLIAN_PROP_GET: case EOLIAN_PROPERTY:
@@ -640,7 +640,7 @@ eo_source_end_generate(const Eolian_Class class, Eina_Strbuf *buf)
eo_bind_func_generate(class, fnid, ftype, str_bodyf, &impl_env);
break;
}
- free(ret);
+ eina_stringshare_del(ret);
}
//Constructors
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index 33d8fc0715..c5cd27b268 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -382,6 +382,19 @@ EAPI Eolian_Function_Scope eolian_function_scope_get(Eolian_Function function_id
EAPI const char *eolian_function_name_get(Eolian_Function function_id);
/*
+ * @brief Returns the full C name of a function (with prefix). It's here
+ * because the C API names are deduplicated (prefix of function and suffix
+ * of prefix merge if applicable) and this helps generators not write the
+ * same code over and over.
+ *
+ * @param[in] function_id Id of the function
+ * @return the function name
+ *
+ * @ingroup Eolian
+ */
+EAPI const char *eolian_function_full_c_name_get(Eolian_Function function_id, const char *prefix);
+
+/*
* @brief Find a function in a class by its name and type
*
* @param[in] klass the class
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index cd70bf8e75..f1f97fcbd4 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -677,6 +677,40 @@ eolian_function_name_get(Eolian_Function function_id)
return fid->name;
}
+EAPI const char *
+eolian_function_full_c_name_get(Eolian_Function foo_id, const char *prefix)
+{
+ const char *funcn = eolian_function_name_get(foo_id);
+ const char *last_p = strrchr(prefix, '_');
+ const char *func_p = strchr(funcn, '_');
+ Eina_Strbuf *buf = eina_strbuf_new();
+ Eina_Stringshare *ret;
+ int len;
+
+ if (!last_p) last_p = prefix;
+ else last_p++;
+ if (!func_p) len = strlen(funcn);
+ else len = func_p - funcn;
+
+ if ((int)strlen(last_p) != len || strncmp(last_p, funcn, len))
+ {
+ eina_strbuf_append(buf, prefix);
+ eina_strbuf_append_char(buf, '_');
+ eina_strbuf_append(buf, funcn);
+ ret = eina_stringshare_add(eina_strbuf_string_get(buf));
+ eina_strbuf_free(buf);
+ return ret;
+ }
+
+ if (last_p != prefix)
+ eina_strbuf_append_n(buf, prefix, last_p - prefix); /* includes _ */
+
+ eina_strbuf_append(buf, funcn);
+ ret = eina_stringshare_add(eina_strbuf_string_get(buf));
+ eina_strbuf_free(buf);
+ return ret;
+}
+
Eina_Bool
database_function_set_as_virtual_pure(Eolian_Function function_id, Eolian_Function_Type ftype)
{