From 4f4eba4fe424c8e3cbc3de11c0fd244cb870e089 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 26 Jun 2014 12:02:19 +0100 Subject: [PATCH] eolian: support for C type translation in eo lexer --- src/lib/eolian/eo_lexer.c | 20 ++++++++++++++++++++ src/lib/eolian/eo_lexer.h | 9 ++++++++- src/lib/eolian/eo_parser.c | 4 +++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index 23c0c10..5755889 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 b8188b25..0b176d2 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 69c4569..fa71d55 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; -- 2.7.4