6
#include "eolian_database.h"
8
EOLIAN_API Eolian_Object_Scope
9
eolian_function_scope_get(const Eolian_Function *fid, Eolian_Function_Type ftype)
11
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EOLIAN_SCOPE_UNKNOWN);
12
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EOLIAN_SCOPE_UNKNOWN);
13
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EOLIAN_SCOPE_UNKNOWN);
17
if (fid->type != EOLIAN_METHOD)
18
return EOLIAN_SCOPE_UNKNOWN;
19
return fid->get_scope;
21
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
22
return EOLIAN_SCOPE_UNKNOWN;
23
return fid->get_scope;
25
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
26
return EOLIAN_SCOPE_UNKNOWN;
27
return fid->set_scope;
29
return EOLIAN_SCOPE_UNKNOWN;
33
EOLIAN_API Eolian_Function_Type
34
eolian_function_type_get(const Eolian_Function *fid)
36
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EOLIAN_UNRESOLVED);
41
_get_c_prefix(const Eolian_Function *foo_id, char *buf)
43
if (foo_id->klass->c_prefix)
44
return foo_id->klass->c_prefix;
45
strcpy(buf, foo_id->klass->base.c_name);
46
eina_str_tolower(&buf);
51
_get_abbreviated_name(const char *prefix, const char *fname)
53
Eina_Strbuf *buf = eina_strbuf_new();
55
const char *last_p = strrchr(prefix, '_');
56
last_p = (last_p) ? (last_p + 1) : prefix;
58
const char *tmp = strstr(fname, last_p);
59
int len = strlen(last_p);
62
((tmp == fname) || (*(tmp - 1) == '_')) &&
63
((*(tmp + len) == '\0') || (*(tmp + len) == '_')))
65
int plen = strlen(prefix);
68
if ((plen >= len) && !strncmp(prefix + plen - len, fname, len))
70
eina_strbuf_append_n(buf, prefix, plen - len);
74
if (eina_strbuf_length_get(buf) == 0)
75
eina_strbuf_append_printf(buf, "%s_", prefix);
76
eina_strbuf_append(buf, fname);
78
char *ret = eina_strbuf_string_steal(buf);
79
eina_strbuf_free(buf);
83
EOLIAN_API Eina_Stringshare *
84
eolian_function_full_c_name_get(const Eolian_Function *foo_id,
85
Eolian_Function_Type ftype)
89
const char *prefix = (ftype != EOLIAN_FUNCTION_POINTER) ? _get_c_prefix(foo_id, tbuf): tbuf;
94
const char *funcn = eolian_function_name_get(foo_id);
95
Eina_Strbuf *buf = eina_strbuf_new();
96
Eina_Stringshare *ret;
98
char *abbr = _get_abbreviated_name(prefix, funcn);
99
eina_strbuf_append(buf, abbr);
102
if ((ftype == EOLIAN_PROP_GET) || (ftype == EOLIAN_PROPERTY))
103
eina_strbuf_append(buf, "_get");
104
else if (ftype == EOLIAN_PROP_SET)
105
eina_strbuf_append(buf, "_set");
107
ret = eina_stringshare_add(eina_strbuf_string_get(buf));
108
eina_strbuf_free(buf);
112
EOLIAN_API const Eolian_Implement *
113
eolian_function_implement_get(const Eolian_Function *fid)
115
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
120
eolian_function_is_static(const Eolian_Function *fid)
122
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
123
return fid->is_static;
127
eolian_function_is_constructor(const Eolian_Function *fid, const Eolian_Class *klass)
129
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
130
Eina_Stringshare *s = eina_stringshare_ref(klass->base.name);
131
Eina_Bool r = !!eina_list_search_sorted_list
132
(fid->ctor_of, EINA_COMPARE_CB(strcmp), s);
133
eina_stringshare_del(s);
138
_get_prop_keys(const Eolian_Function *fid, Eolian_Function_Type ftype)
140
Eina_List *l = fid->prop_keys_get;
141
if (ftype == EOLIAN_PROP_SET) l = fid->prop_keys_set;
142
if (!l) return fid->prop_keys;
147
_get_prop_values(const Eolian_Function *fid, Eolian_Function_Type ftype)
149
Eina_List *l = fid->prop_values_get;
150
if (ftype == EOLIAN_PROP_SET) l = fid->prop_values_set;
151
if (!l) return fid->prop_values;
155
EOLIAN_API Eina_Iterator *
156
eolian_property_keys_get(const Eolian_Function *fid, Eolian_Function_Type ftype)
159
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
160
if (ftype != EOLIAN_PROP_GET && ftype != EOLIAN_PROP_SET)
162
l = _get_prop_keys(fid, ftype);
163
return (l ? eina_list_iterator_new(l) : NULL);
166
EOLIAN_API Eina_Iterator *
167
eolian_property_values_get(const Eolian_Function *fid, Eolian_Function_Type ftype)
170
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
171
if (ftype != EOLIAN_PROP_GET && ftype != EOLIAN_PROP_SET)
173
l = _get_prop_values(fid, ftype);
174
return (l ? eina_list_iterator_new(l) : NULL);
177
EOLIAN_API Eina_Iterator *
178
eolian_function_parameters_get(const Eolian_Function *fid)
180
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
181
if (fid->type != EOLIAN_METHOD && fid->type != EOLIAN_FUNCTION_POINTER)
183
return (fid->params ? eina_list_iterator_new(fid->params) : NULL);
186
EOLIAN_API const Eolian_Type *
187
eolian_function_return_type_get(const Eolian_Function *fid, Eolian_Function_Type ftype)
189
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
190
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, NULL);
191
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, NULL);
195
case EOLIAN_FUNCTION_POINTER:
196
if (fid->type != ftype)
198
return fid->get_ret_type;
199
case EOLIAN_PROP_GET:
200
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
202
return fid->get_ret_type;
203
case EOLIAN_PROP_SET:
204
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
206
return fid->set_ret_type;
212
EOLIAN_API const Eolian_Expression *
213
eolian_function_return_default_value_get(const Eolian_Function *fid, Eolian_Function_Type ftype)
215
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
216
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, NULL);
217
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, NULL);
221
case EOLIAN_FUNCTION_POINTER:
222
if (fid->type != ftype)
224
return fid->get_ret_val;
225
case EOLIAN_PROP_GET:
226
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
228
return fid->get_ret_val;
229
case EOLIAN_PROP_SET:
230
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
232
return fid->set_ret_val;
238
EOLIAN_API const Eolian_Documentation *
239
eolian_function_return_documentation_get(const Eolian_Function *fid, Eolian_Function_Type ftype)
241
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
242
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, NULL);
243
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, NULL);
247
case EOLIAN_FUNCTION_POINTER:
248
if (fid->type != ftype)
250
return fid->get_return_doc;
251
case EOLIAN_PROP_GET:
252
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
254
return fid->get_return_doc;
255
case EOLIAN_PROP_SET:
256
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
258
return fid->set_return_doc;
265
eolian_function_return_allow_unused(const Eolian_Function *fid,
266
Eolian_Function_Type ftype)
268
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_TRUE);
269
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EINA_TRUE);
270
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EINA_TRUE);
274
case EOLIAN_FUNCTION_POINTER:
275
if (fid->type != ftype)
277
return !fid->get_return_no_unused;
278
case EOLIAN_PROP_GET:
279
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
281
return !fid->get_return_no_unused;
282
case EOLIAN_PROP_SET:
283
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
285
return !fid->set_return_no_unused;
292
eolian_function_return_is_by_ref(const Eolian_Function *fid,
293
Eolian_Function_Type ftype)
295
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
296
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EINA_FALSE);
297
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EINA_FALSE);
301
case EOLIAN_FUNCTION_POINTER:
302
if (fid->type != ftype)
304
return fid->get_return_by_ref;
305
case EOLIAN_PROP_GET:
306
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
308
return fid->get_return_by_ref;
309
case EOLIAN_PROP_SET:
310
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
312
return fid->set_return_by_ref;
319
eolian_function_return_is_move(const Eolian_Function *fid,
320
Eolian_Function_Type ftype)
322
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
323
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EINA_FALSE);
324
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EINA_FALSE);
328
case EOLIAN_FUNCTION_POINTER:
329
if (fid->type != ftype)
331
return fid->get_return_move;
332
case EOLIAN_PROP_GET:
333
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
335
return fid->get_return_move;
336
case EOLIAN_PROP_SET:
337
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
339
return fid->set_return_move;
345
EOLIAN_API Eina_Stringshare *
346
eolian_function_return_c_type_get(const Eolian_Function *fid,
347
Eolian_Function_Type ftype)
349
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
350
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, NULL);
351
EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, NULL);
352
const Eolian_Type *tp = NULL;
353
Eina_Bool by_ref = EINA_FALSE;
357
case EOLIAN_FUNCTION_POINTER:
358
if (fid->type != ftype)
360
tp = fid->get_ret_type;
361
by_ref = fid->get_return_by_ref;
363
case EOLIAN_PROP_GET:
364
if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
366
tp = fid->get_ret_type;
367
by_ref = fid->get_return_by_ref;
369
case EOLIAN_PROP_SET:
370
if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
372
tp = fid->set_ret_type;
373
by_ref = fid->set_return_by_ref;
378
Eina_Strbuf *buf = eina_strbuf_new();
379
database_type_to_str(tp, buf, NULL, EOLIAN_C_TYPE_RETURN, by_ref);
380
Eina_Stringshare *ret = eina_stringshare_add(eina_strbuf_string_get(buf));
381
eina_strbuf_free(buf);
386
eolian_function_object_is_const(const Eolian_Function *fid)
388
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
389
return fid->obj_is_const;
392
EOLIAN_API const Eolian_Class *
393
eolian_function_class_get(const Eolian_Function *fid)
395
EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);