static Eina_Bool _expr_serialize(const Eolian_Expression *expr, Eina_Strbuf *buf, Eina_Bool outer) { switch (expr->type) { case EOLIAN_EXPR_UNKNOWN: return EINA_FALSE; case EOLIAN_EXPR_INT: case EOLIAN_EXPR_UINT: case EOLIAN_EXPR_LONG: case EOLIAN_EXPR_ULONG: case EOLIAN_EXPR_LLONG: case EOLIAN_EXPR_ULLONG: case EOLIAN_EXPR_FLOAT: case EOLIAN_EXPR_DOUBLE: case EOLIAN_EXPR_STRING: case EOLIAN_EXPR_CHAR: { Eolian_Value *v = (Eolian_Value*)&expr->type; const char *x = eolian_expression_value_to_literal(v); if (!x) return EINA_FALSE; eina_strbuf_append(buf, x); eina_stringshare_del(x); break; } case EOLIAN_EXPR_NULL: eina_strbuf_append(buf, "null"); break; case EOLIAN_EXPR_BOOL: eina_strbuf_append(buf, expr->value.b ? "true" : "false"); break; case EOLIAN_EXPR_NAME: case EOLIAN_EXPR_ENUM: { if (expr->type == EOLIAN_EXPR_ENUM) eina_strbuf_append(buf, "enum "); eina_strbuf_append(buf, expr->value.s); break; } case EOLIAN_EXPR_UNARY: eina_strbuf_append(buf, _unops[expr->unop]); _expr_serialize(expr->expr, buf, EINA_FALSE); break; case EOLIAN_EXPR_BINARY: if (!outer) eina_strbuf_append_char(buf, '('); _expr_serialize(expr->lhs, buf, EINA_FALSE); eina_strbuf_append_printf(buf, " %s ", _binops[expr->binop]); _expr_serialize(expr->rhs, buf, EINA_FALSE); if (!outer) eina_strbuf_append_char(buf, ')'); break; default: return EINA_FALSE; } return EINA_TRUE; }
EAPI Eina_Stringshare * eolian_expression_serialize(const Eolian_Expression *expr) { EINA_SAFETY_ON_NULL_RETURN_VAL(expr, NULL); Eina_Strbuf *buf = eina_strbuf_new(); if (!_expr_serialize(expr, buf, EINA_TRUE)) { eina_strbuf_free(buf); return NULL; } const char *ret = eina_stringshare_add(eina_strbuf_string_get(buf)); eina_strbuf_free(buf); return ret; }