7
#include "eolian_database.h"
10
eolian_expression_eval(const Eolian_Expression *expr, Eolian_Expression_Mask m)
13
err.type = EOLIAN_EXPR_UNKNOWN;
14
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, err);
15
return database_expr_eval(NULL, (Eolian_Expression *)expr, m, NULL, NULL);
19
eolian_expression_eval_fill(const Eolian_Expression *expr,
20
Eolian_Expression_Mask m, Eolian_Value *val)
22
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EINA_FALSE);
23
Eolian_Value ret = database_expr_eval(NULL, (Eolian_Expression *)expr, m,
25
if (ret.type == EOLIAN_EXPR_UNKNOWN)
32
_append_char_escaped(Eina_Strbuf *buf, char c)
36
case '\'': eina_strbuf_append(buf, "\\\'"); break;
37
case '\"': eina_strbuf_append(buf, "\\\""); break;
38
case '\?': eina_strbuf_append(buf, "\\\?"); break;
39
case '\\': eina_strbuf_append(buf, "\\\\"); break;
40
case '\a': eina_strbuf_append(buf, "\\a"); break;
41
case '\b': eina_strbuf_append(buf, "\\b"); break;
42
case '\f': eina_strbuf_append(buf, "\\f"); break;
43
case '\n': eina_strbuf_append(buf, "\\n"); break;
44
case '\r': eina_strbuf_append(buf, "\\r"); break;
45
case '\t': eina_strbuf_append(buf, "\\t"); break;
46
case '\v': eina_strbuf_append(buf, "\\v"); break;
48
if ((c < 32) || (c > 126))
49
eina_strbuf_append_printf(buf, "\\x%X", (unsigned char)c);
51
eina_strbuf_append_char(buf, c);
57
_number_to_str(const Eolian_Value *v, Eina_Strbuf *buf)
62
eina_strbuf_append_printf(buf, "%d", v->value.i); break;
63
case EOLIAN_EXPR_UINT:
64
eina_strbuf_append_printf(buf, "%uU", v->value.u); break;
65
case EOLIAN_EXPR_LONG:
66
eina_strbuf_append_printf(buf, "%ldL", v->value.l); break;
67
case EOLIAN_EXPR_ULONG:
68
eina_strbuf_append_printf(buf, "%luUL", v->value.ul); break;
69
case EOLIAN_EXPR_LLONG:
70
eina_strbuf_append_printf(buf, "%ldLL", (long)v->value.ll); break;
71
case EOLIAN_EXPR_ULLONG:
72
eina_strbuf_append_printf(buf, "%luULL", (unsigned long)v->value.ull);
74
case EOLIAN_EXPR_FLOAT:
75
eina_strbuf_append_printf(buf, "%ff", v->value.f); break;
76
case EOLIAN_EXPR_DOUBLE:
77
eina_strbuf_append_printf(buf, "%f", v->value.d); break;
83
EOLIAN_API Eina_Stringshare *
84
eolian_expression_value_to_literal(const Eolian_Value *val)
86
EINA_SAFETY_ON_NULL_RETURN_VAL(val, NULL);
89
case EOLIAN_EXPR_BOOL:
90
return eina_stringshare_add(val->value.b ? "EINA_TRUE"
92
case EOLIAN_EXPR_NULL:
93
return eina_stringshare_add("NULL");
94
case EOLIAN_EXPR_CHAR:
96
char c = val->value.c;
97
Eina_Strbuf *buf = eina_strbuf_new();
99
eina_strbuf_append_char(buf, '\'');
100
_append_char_escaped(buf, c);
101
eina_strbuf_append_char(buf, '\'');
102
ret = eina_stringshare_add(eina_strbuf_string_get(buf));
103
eina_strbuf_free(buf);
106
case EOLIAN_EXPR_STRING:
109
char *c = (char*)val->value.s;
110
Eina_Strbuf *buf = eina_strbuf_new();
111
eina_strbuf_append_char(buf, '\"');
112
while (*c) _append_char_escaped(buf, *(c++));
113
eina_strbuf_append_char(buf, '\"');
114
ret = eina_stringshare_add(eina_strbuf_string_get(buf));
115
eina_strbuf_free(buf);
118
case EOLIAN_EXPR_INT:
119
case EOLIAN_EXPR_UINT:
120
case EOLIAN_EXPR_LONG:
121
case EOLIAN_EXPR_ULONG:
122
case EOLIAN_EXPR_LLONG:
123
case EOLIAN_EXPR_ULLONG:
124
case EOLIAN_EXPR_FLOAT:
125
case EOLIAN_EXPR_DOUBLE:
128
Eina_Strbuf *buf = eina_strbuf_new();
129
_number_to_str(val, buf);
130
ret = eina_stringshare_add(eina_strbuf_string_get(buf));
131
eina_strbuf_free(buf);
139
static const char *_binops[] = {
140
"+", "-", "*", "/", "%",
141
"==", "!=", ">", "<", ">=", "<=",
143
"&", "|", "^", "<<", ">>"
146
static const char *_unops[] = {
151
_expr_serialize(const Eolian_Expression *expr, Eina_Strbuf *buf, Eina_Bool outer)
155
case EOLIAN_EXPR_UNKNOWN:
157
case EOLIAN_EXPR_INT:
158
case EOLIAN_EXPR_UINT:
159
case EOLIAN_EXPR_LONG:
160
case EOLIAN_EXPR_ULONG:
161
case EOLIAN_EXPR_LLONG:
162
case EOLIAN_EXPR_ULLONG:
163
case EOLIAN_EXPR_FLOAT:
164
case EOLIAN_EXPR_DOUBLE:
165
case EOLIAN_EXPR_STRING:
166
case EOLIAN_EXPR_CHAR:
170
v.value = expr->value;
171
const char *x = eolian_expression_value_to_literal(&v);
174
eina_strbuf_append(buf, x);
175
eina_stringshare_del(x);
178
case EOLIAN_EXPR_NULL:
179
eina_strbuf_append(buf, "null");
181
case EOLIAN_EXPR_BOOL:
182
eina_strbuf_append(buf, expr->value.b ? "true" : "false");
184
case EOLIAN_EXPR_NAME:
186
eina_strbuf_append(buf, expr->value.s);
189
case EOLIAN_EXPR_UNARY:
190
eina_strbuf_append(buf, _unops[expr->unop]);
191
_expr_serialize(expr->expr, buf, EINA_FALSE);
193
case EOLIAN_EXPR_BINARY:
195
eina_strbuf_append_char(buf, '(');
196
_expr_serialize(expr->lhs, buf, EINA_FALSE);
197
eina_strbuf_append_printf(buf, " %s ", _binops[expr->binop]);
198
_expr_serialize(expr->rhs, buf, EINA_FALSE);
200
eina_strbuf_append_char(buf, ')');
208
EOLIAN_API Eina_Stringshare *
209
eolian_expression_serialize(const Eolian_Expression *expr)
211
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, NULL);
212
Eina_Strbuf *buf = eina_strbuf_new();
213
if (!_expr_serialize(expr, buf, EINA_TRUE))
215
eina_strbuf_free(buf);
218
const char *ret = eina_stringshare_add(eina_strbuf_string_get(buf));
219
eina_strbuf_free(buf);
223
EOLIAN_API Eolian_Expression_Type
224
eolian_expression_type_get(const Eolian_Expression *expr)
226
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EOLIAN_EXPR_UNKNOWN);
230
EOLIAN_API Eolian_Binary_Operator
231
eolian_expression_binary_operator_get(const Eolian_Expression *expr)
233
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EOLIAN_BINOP_INVALID);
234
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type == EOLIAN_EXPR_BINARY,
235
EOLIAN_BINOP_INVALID);
239
EOLIAN_API const Eolian_Expression *
240
eolian_expression_binary_lhs_get(const Eolian_Expression *expr)
242
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, NULL);
243
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type == EOLIAN_EXPR_BINARY, NULL);
247
EOLIAN_API const Eolian_Expression *
248
eolian_expression_binary_rhs_get(const Eolian_Expression *expr)
250
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, NULL);
251
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type == EOLIAN_EXPR_BINARY, NULL);
255
EOLIAN_API Eolian_Unary_Operator
256
eolian_expression_unary_operator_get(const Eolian_Expression *expr)
258
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EOLIAN_UNOP_INVALID);
259
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type == EOLIAN_EXPR_UNARY,
260
EOLIAN_UNOP_INVALID);
264
EOLIAN_API const Eolian_Expression *
265
eolian_expression_unary_expression_get(const Eolian_Expression *expr)
267
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, NULL);
268
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type == EOLIAN_EXPR_UNARY, NULL);
272
EOLIAN_API Eolian_Value
273
eolian_expression_value_get(const Eolian_Expression *expr)
276
v.type = EOLIAN_EXPR_UNKNOWN;
277
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, v);
278
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type != EOLIAN_EXPR_UNKNOWN
279
&& expr->type != EOLIAN_EXPR_BINARY
280
&& expr->type != EOLIAN_EXPR_UNARY, v);
282
v.value = expr->value;
287
eolian_expression_value_get_fill(const Eolian_Expression *expr, Eolian_Value *val)
289
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EINA_FALSE);
290
EINA_SAFETY_ON_FALSE_RETURN_VAL(expr->type != EOLIAN_EXPR_UNKNOWN
291
&& expr->type != EOLIAN_EXPR_BINARY
292
&& expr->type != EOLIAN_EXPR_UNARY, EINA_FALSE);
293
val->type = expr->type;
294
val->value = expr->value;