summaryrefslogtreecommitdiff
path: root/src/lib/eolian/database_expr_api.c
blob: 466bd961d3accbb3b11946db289a1633204a2454 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <Eina.h>
#include "eo_lexer.h"

EAPI Eolian_Expression_Type
eolian_expression_eval(const Eolian_Expression *expr, Eolian_Expression_Mask m,
                       Eina_Value **val)
{
   EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EOLIAN_EXPR_UNKNOWN);
   return database_expr_eval(expr, m, val);
}

static Eolian_Expression_Type
_eval_type(const Eolian_Expression *expr, const Eolian_Type *type,
           Eina_Value **val)
{
   if (!type)
     return EOLIAN_EXPR_UNKNOWN;
   switch (type->type)
     {
      case EOLIAN_TYPE_ALIAS:
        return _eval_type(expr, eolian_type_base_type_get(type), val);
      case EOLIAN_TYPE_POINTER:
        {
           int mask = EOLIAN_MASK_NULL;
           const Eolian_Type *base = eolian_type_base_type_get(type);
           int kw = base->name ? eo_lexer_keyword_str_to_id(base->name) : 0;
           if (kw == KW_char)
             mask |= EOLIAN_MASK_STRING;
           return database_expr_eval(expr, mask, val);
        }
      case EOLIAN_TYPE_CLASS:
        return database_expr_eval(expr, EOLIAN_MASK_NULL, val);
      case EOLIAN_TYPE_REGULAR:
        {
           int  kw = eo_lexer_keyword_str_to_id(type->name);
           if (!kw || kw < KW_byte || kw >= KW_void)
             return EOLIAN_EXPR_UNKNOWN;
           switch (kw)
             {
              case KW_byte:
              case KW_short:
              case KW_int:
              case KW_long:
              case KW_llong:
              case KW_int8:
              case KW_int16:
              case KW_int32:
              case KW_int64:
              case KW_int128:
              case KW_ssize:
              case KW_intptr:
              case KW_ptrdiff:
                return database_expr_eval(expr, EOLIAN_MASK_SINT, val);
              case KW_ubyte:
              case KW_ushort:
              case KW_uint:
              case KW_ulong:
              case KW_ullong:
              case KW_uint8:
              case KW_uint16:
              case KW_uint32:
              case KW_uint64:
              case KW_uint128:
              case KW_size:
              case KW_uintptr:
              case KW_time:
                return database_expr_eval(expr, EOLIAN_MASK_UINT, val);
              case KW_float:
              case KW_double:
              case KW_ldouble:
                return database_expr_eval(expr, EOLIAN_MASK_FLOAT, val);
              case KW_bool:
                return database_expr_eval(expr, EOLIAN_MASK_BOOL, val);
              case KW_char:
                return database_expr_eval(expr, EOLIAN_MASK_CHAR, val);
              default:
                return EOLIAN_EXPR_UNKNOWN;
             }
        }
      default:
        return EOLIAN_EXPR_UNKNOWN;
     }
}

EAPI Eolian_Expression_Type
eolian_expression_eval_type(const Eolian_Expression *expr,
                            const Eolian_Type *type,
                            Eina_Value **val)
{
   EINA_SAFETY_ON_NULL_RETURN_VAL(expr, EOLIAN_EXPR_UNKNOWN);
   return _eval_type(expr, type, val);
}

EAPI Eina_Stringshare *
eolian_expression_value_to_literal(const Eina_Value *v,
                                   Eolian_Expression_Type etp)
{
   EINA_SAFETY_ON_NULL_RETURN_VAL(v, NULL);
   switch (etp)
     {
      case EOLIAN_EXPR_BOOL:
        {
           unsigned char b;
           eina_value_get(v, &b);
           return eina_stringshare_add(b ? "EINA_TRUE" : "EINA_FALSE");
        }
      case EOLIAN_EXPR_NULL:
        return eina_stringshare_add("NULL");
      case EOLIAN_EXPR_CHAR:
        {
           char c;
           eina_value_get(v, &c);
           return eina_stringshare_printf("'%c'", c);
        }
      case EOLIAN_EXPR_STRING:
        {
           char *str = eina_value_to_string(v);
           const char *ret = eina_stringshare_printf("\"%s\"", str);
           free(str);
           return ret;
        }
      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_LDOUBLE:
        {
           char *str = eina_value_to_string(v);
           const char *ret = eina_stringshare_add(str);
           free(str);
           return ret;
        }
      default:
        return NULL;
     }
}