summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2014-06-26 12:02:19 +0100
committerDaniel Kolesa <d.kolesa@samsung.com>2014-06-30 17:20:39 +0100
commit4f4eba4fe424c8e3cbc3de11c0fd244cb870e089 (patch)
tree5710188bb8cab782d49fa07d9a206724d0d261a7
parent4e79b279777287447d93540d6e19a02ac057f190 (diff)
downloadefl-4f4eba4fe424c8e3cbc3de11c0fd244cb870e089.tar.gz
eolian: support for C type translation in eo lexer
-rw-r--r--src/lib/eolian/eo_lexer.c20
-rw-r--r--src/lib/eolian/eo_lexer.h9
-rw-r--r--src/lib/eolian/eo_parser.c4
3 files changed, 31 insertions, 2 deletions
diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index 23c0c10ae1..575588987c 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -26,6 +26,13 @@ static const char * const tokens[] =
KEYWORDS
};
+static const char * const ctypes[] =
+{
+ "char", "unsigned char", "signed char", "short", "unsigned short",
+ "int", "unsigned int", "long", "unsigned long", "long long",
+ "unsigned long long"
+};
+
#undef KW
#undef KWAT
@@ -408,6 +415,19 @@ eo_lexer_keyword_str_get(int kw)
return tokens[kw + 2];
}
+Eina_Bool
+eo_lexer_is_type_keyword(int kw)
+{
+ return (kw >= KW_char && kw <= KW_ullong);
+}
+
+const char *
+eo_lexer_get_c_type(int kw)
+{
+ if (!eo_lexer_is_type_keyword(kw)) return NULL;
+ return ctypes[kw - KW_char];
+}
+
static int _init_counter = 0;
int
diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h
index b8188b2545..0b176d2560 100644
--- a/src/lib/eolian/eo_lexer.h
+++ b/src/lib/eolian/eo_lexer.h
@@ -16,11 +16,16 @@ enum Tokens
#define KEYWORDS KW(class), KW(const), KW(private), KW(protected), \
KW(return), KW(signed), KW(struct), KW(unsigned), KW(virtual), \
+ \
KW(abstract), KW(constructor), KW(constructors), KW(data), \
KW(destructor), KW(eo_prefix), KW(events), KW(get), KW(implements), \
KW(interface), KW(keys), KW(legacy), KW(legacy_prefix), KW(methods), \
KW(mixin), KW(params), KW(properties), KW(set), KW(type), KW(values), \
- KWAT(in), KWAT(inout), KWAT(nonull), KWAT(out), KWAT(own), KWAT(warn_unused)
+ KWAT(in), KWAT(inout), KWAT(nonull), KWAT(out), KWAT(own), \
+ KWAT(warn_unused), \
+ \
+ KW(char), KW(uchar), KW(schar), KW(short), KW(ushort), KW(int), KW(uint), \
+ KW(long), KW(ulong), KW(llong), KW(ullong)
#define KW(x) KW_##x
#define KWAT(x) KW_at_##x
@@ -88,6 +93,8 @@ void eo_lexer_lex_error (Eo_Lexer *ls, const char *msg, int token);
void eo_lexer_syntax_error (Eo_Lexer *ls, const char *msg);
void eo_lexer_token_to_str (int token, char *buf);
const char *eo_lexer_keyword_str_get(int kw);
+Eina_Bool eo_lexer_is_type_keyword(int kw);
+const char *eo_lexer_get_c_type (int kw);
extern int _eo_lexer_log_dom;
#ifdef CRITICAL
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 69c45695de..fa71d55ef5 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -150,6 +150,7 @@ parse_name_list(Eo_Lexer *ls)
static void
parse_type_sub(Eo_Lexer *ls, Eina_Strbuf *buf, Eina_Bool *has_ptr)
{
+ const char *ctype;
if (has_ptr) *has_ptr = EINA_FALSE;
switch (ls->t.kw)
{
@@ -178,7 +179,8 @@ parse_type_sub(Eo_Lexer *ls, Eina_Strbuf *buf, Eina_Bool *has_ptr)
break;
}
check(ls, TOK_VALUE);
- eina_strbuf_append(buf, ls->t.value);
+ ctype = eo_lexer_get_c_type(ls->t.kw);
+ eina_strbuf_append(buf, ctype ? ctype : ls->t.value);
eo_lexer_get(ls);
parse_ptr:
if (ls->t.token != '*') return;