summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2014-06-24 13:45:51 +0100
committerDaniel Kolesa <d.kolesa@samsung.com>2014-06-30 17:20:06 +0100
commit7a8ef6d02a9cec717c6064debf8702742f882a23 (patch)
treec9dbb8c1a5b5b0b96f3c43255f3fc453af3d1d48
parent18c6f486f62ce30cceec90450f9b83486e4237c4 (diff)
downloadefl-7a8ef6d02a9cec717c6064debf8702742f882a23.tar.gz
eolian: introducing support for .eot files
.eot files are similar to .eo, but they can't contain classes; all .eot files found in include paths are parsed and information is added into the database. They're there for typedefs and eventually also enums, structs and constants. @feature
-rw-r--r--src/bin/eolian/main.c2
-rw-r--r--src/lib/eolian/Eolian.h29
-rw-r--r--src/lib/eolian/eo_parser.c22
-rw-r--r--src/lib/eolian/eo_parser.h4
-rw-r--r--src/lib/eolian/eolian_database.c52
5 files changed, 86 insertions, 23 deletions
diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c
index 7aa7c82d74..9b93d7eab6 100644
--- a/src/bin/eolian/main.c
+++ b/src/bin/eolian/main.c
@@ -321,6 +321,8 @@ int main(int argc, char **argv)
goto end;
}
+ eolian_all_eot_files_parse();
+
const char *filename;
EINA_LIST_FOREACH(files4gen, itr, filename)
{
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index 3fd1381ace..33d8fc0715 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -120,12 +120,23 @@ typedef enum
* all the information related to this class.
*
* @param[in] filename Name of the file to parse.
+ * @see eolian_eot_file_parse
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_eo_file_parse(const char *filename);
/*
+ * @brief Parse a given .eot file and fill the database.
+ *
+ * @param[in] filename Name of the file to parse.
+ * @see eolian_eo_file_parse
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Bool eolian_eot_file_parse(const char *filepath);
+
+/*
* @brief Init Eolian.
*
* @ingroup Eolian
@@ -140,7 +151,7 @@ EAPI int eolian_init(void);
EAPI int eolian_shutdown(void);
/*
- * @brief Scan the given directory and search for .eo files.
+ * @brief Scan the given directory and search for .eo and .eot files.
*
* The found files are just open to extract the class name.
*
@@ -152,18 +163,32 @@ EAPI int eolian_shutdown(void);
EAPI Eina_Bool eolian_directory_scan(const char *dir);
/*
- * @brief Force parsing of all the files located in the directories
+ * @brief Force parsing of all the .eo files located in the directories
* given in eolian_directory_scan..
*
* @return EINA_TRUE on success, EINA_FALSE otherwise.
*
* @see eolian_directory_scan
+ * @see eolian_all_eot_files_parse
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_all_eo_files_parse();
/*
+ * @brief Force parsing of all the .eot files located in the directories
+ * given in eolian_directory_scan..
+ *
+ * @return EINA_TRUE on success, EINA_FALSE otherwise.
+ *
+ * @see eolian_directory_scan
+ * @see eolian_all_eo_files_parse
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Bool eolian_all_eot_files_parse();
+
+/*
* @brief Show information about a given class.
*
* If klass is NULL, this function will print information of
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index d30ee08281..6016656164 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -859,20 +859,24 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
}
static void
-parse_unit(Eo_Lexer *ls)
+parse_unit(Eo_Lexer *ls, Eina_Bool eot)
{
switch (ls->t.kw)
{
case KW_abstract:
+ if (eot) goto def;
parse_class(ls, EINA_TRUE, EOLIAN_CLASS_ABSTRACT);
goto found_class;
case KW_class:
+ if (eot) goto def;
parse_class(ls, EINA_TRUE, EOLIAN_CLASS_REGULAR);
goto found_class;
case KW_mixin:
+ if (eot) goto def;
parse_class(ls, EINA_FALSE, EOLIAN_CLASS_MIXIN);
goto found_class;
case KW_interface:
+ if (eot) goto def;
parse_class(ls, EINA_FALSE, EOLIAN_CLASS_INTERFACE);
goto found_class;
case KW_type:
@@ -882,6 +886,7 @@ parse_unit(Eo_Lexer *ls)
ls->tmp.type_def = NULL;
break;
}
+ def:
default:
eo_lexer_syntax_error(ls, "invalid token");
break;
@@ -893,10 +898,10 @@ found_class:
}
static void
-parse_chunk(Eo_Lexer *ls)
+parse_chunk(Eo_Lexer *ls, Eina_Bool eot)
{
while (ls->t.token != TOK_EOF)
- parse_unit(ls);
+ parse_unit(ls, eot);
}
static char *_accessor_type_str[ACCESSOR_TYPE_LAST] = { "setter", "getter" };
@@ -1039,11 +1044,11 @@ eo_parser_dump(Eo_Lexer *ls)
}
Eina_Bool
-eo_parser_walk(Eo_Lexer *ls)
+eo_parser_walk(Eo_Lexer *ls, Eina_Bool eot)
{
if (!setjmp(ls->err_jmp))
{
- parse_chunk(ls);
+ parse_chunk(ls, eot);
return EINA_TRUE;
}
return EINA_FALSE;
@@ -1256,7 +1261,7 @@ _db_fill_type(Eo_Type_Def *type_def)
}
Eina_Bool
-eo_parser_database_fill(const char *filename)
+eo_parser_database_fill(const char *filename, Eina_Bool eot)
{
Eina_List *k;
Eo_Node *nd;
@@ -1272,12 +1277,14 @@ eo_parser_database_fill(const char *filename)
/* read first token */
eo_lexer_get(ls);
- if (!eo_parser_walk(ls))
+ if (!eo_parser_walk(ls, eot))
{
eo_lexer_free(ls);
return EINA_FALSE;
}
+ if (eot) goto nodeloop;
+
EINA_LIST_FOREACH(ls->nodes, k, nd) if (nd->type == NODE_CLASS)
{
has_class = EINA_TRUE;
@@ -1291,6 +1298,7 @@ eo_parser_database_fill(const char *filename)
return EINA_FALSE;
}
+nodeloop:
EINA_LIST_FOREACH(ls->nodes, k, nd)
{
switch (nd->type)
diff --git a/src/lib/eolian/eo_parser.h b/src/lib/eolian/eo_parser.h
index 4d0d048f7c..acd339c84a 100644
--- a/src/lib/eolian/eo_parser.h
+++ b/src/lib/eolian/eo_parser.h
@@ -3,8 +3,8 @@
#include "eo_lexer.h"
-Eina_Bool eo_parser_walk (Eo_Lexer *ls);
void eo_parser_dump (Eo_Lexer *ls);
-Eina_Bool eo_parser_database_fill(const char *filename);
+Eina_Bool eo_parser_walk (Eo_Lexer *ls, Eina_Bool eot);
+Eina_Bool eo_parser_database_fill(const char *filename, Eina_Bool eot);
#endif /* __EO_PARSER_H__ */ \ No newline at end of file
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index e2facec045..83654fd456 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -17,6 +17,7 @@
static Eina_List *_classes = NULL;
static Eina_Hash *_types = NULL;
static Eina_Hash *_filenames = NULL; /* Hash: filename without extension -> full path */
+static Eina_Hash *_tfilenames = NULL;
static int _database_init_count = 0;
typedef struct
@@ -177,6 +178,7 @@ database_init()
eina_init();
_types = eina_hash_stringshared_new(_type_hash_free_cb);
_filenames = eina_hash_string_small_new(free);
+ _tfilenames = eina_hash_string_small_new(free);
return ++_database_init_count;
}
@@ -197,6 +199,7 @@ database_shutdown()
_class_del((_Class_Desc *)class);
eina_hash_free(_types);
eina_hash_free(_filenames);
+ eina_hash_free(_tfilenames);
eina_shutdown();
}
return _database_init_count;
@@ -1368,6 +1371,16 @@ eolian_show(const Eolian_Class class)
}
#define EO_SUFFIX ".eo"
+#define EOT_SUFFIX ".eot"
+#define EO_SCAN_BODY(suffix, hash) \
+if (eina_str_has_suffix(file, suffix)) \
+ { \
+ int len = strlen(file); \
+ int idx = len - 1; \
+ while (idx >= 0 && file[idx] != '/' && file[idx] != '\\') idx--; \
+ eina_hash_add(hash, eina_stringshare_add_length(file+idx+1, len - idx - sizeof(suffix)), strdup(file)); \
+ }
+
EAPI Eina_Bool
eolian_directory_scan(const char *dir)
{
@@ -1375,17 +1388,10 @@ eolian_directory_scan(const char *dir)
char *file;
/* Get all files from directory. Not recursively!!! */
Eina_Iterator *dir_files = eina_file_ls(dir);
- EINA_ITERATOR_FOREACH(dir_files, file)
- {
- if (eina_str_has_suffix(file, EO_SUFFIX))
- {
- int len = strlen(file);
- int idx = len - 1;
- while (idx >= 0 && file[idx] != '/' && file[idx] != '\\') idx--;
- eina_hash_add(_filenames, eina_stringshare_add_length(file+idx+1, len - idx - sizeof(EO_SUFFIX)), strdup(file));
- }
- }
+ EINA_ITERATOR_FOREACH(dir_files, file) EO_SCAN_BODY(EO_SUFFIX, _filenames);
eina_iterator_free(dir_files);
+ dir_files = eina_file_ls(dir);
+ EINA_ITERATOR_FOREACH(dir_files, file) EO_SCAN_BODY(EOT_SUFFIX, _tfilenames);
return EINA_TRUE;
}
@@ -1405,7 +1411,14 @@ _eolian_class_to_filename(const char *filename)
return ret;
}
-EAPI Eina_Bool eolian_eo_file_parse(const char *filepath)
+EAPI Eina_Bool
+eolian_eot_file_parse(const char *filepath)
+{
+ return eo_parser_database_fill(filepath, EINA_TRUE);
+}
+
+EAPI Eina_Bool
+eolian_eo_file_parse(const char *filepath)
{
const Eina_List *itr;
Eolian_Class class = eolian_class_find_by_file(filepath);
@@ -1413,7 +1426,7 @@ EAPI Eina_Bool eolian_eo_file_parse(const char *filepath)
Eolian_Implement impl;
if (!class)
{
- if (!eo_parser_database_fill(filepath)) return EINA_FALSE;
+ if (!eo_parser_database_fill(filepath, EINA_FALSE)) return EINA_FALSE;
class = eolian_class_find_by_file(filepath);
if (!class)
{
@@ -1456,6 +1469,21 @@ EAPI Eina_Bool eolian_eo_file_parse(const char *filepath)
return EINA_TRUE;
}
+static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
+{
+ Eina_Bool *ret = fdata;
+ if (*ret) *ret = eolian_eot_file_parse(data);
+ return *ret;
+}
+
+EAPI Eina_Bool
+eolian_all_eot_files_parse()
+{
+ Eina_Bool ret = EINA_TRUE;
+ eina_hash_foreach(_tfilenames, _tfile_parse, &ret);
+ return ret;
+}
+
static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata)
{
Eina_Bool *ret = fdata;