diff options
author | Daniel Kolesa <d.kolesa@samsung.com> | 2014-06-24 17:15:17 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@samsung.com> | 2014-06-30 17:20:06 +0100 |
commit | c0576cee73382fc833d7eecf13b365321cbf365d (patch) | |
tree | b7f7503d50d5958fcb0aec3002eaace9dcd187b1 | |
parent | 1674d967d2137903b6430ff84b03bb2fd052dcf1 (diff) | |
download | efl-c0576cee73382fc833d7eecf13b365321cbf365d.tar.gz |
eolian: new API: eolian_function_full_c_name_get - reduces duplication of code
-rw-r--r-- | src/bin/eolian/common_funcs.c | 44 | ||||
-rw-r--r-- | src/bin/eolian/common_funcs.h | 2 | ||||
-rw-r--r-- | src/bin/eolian/eo_generator.c | 6 | ||||
-rw-r--r-- | src/lib/eolian/Eolian.h | 13 | ||||
-rw-r--r-- | src/lib/eolian/eolian_database.c | 34 |
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) { |