yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=ec10caceb89909a4e5890c5ca1d98b337a530d61
commit ec10caceb89909a4e5890c5ca1d98b337a530d61 Author: Yakov Goldberg <[email protected]> Date: Sun Jan 18 12:07:15 2015 +0200 Change CLI options for generation --- src/bin/egui_gui/CMakeLists.txt | 3 +- src/bin/egui_gui/egui_logic.c | 7 +++- src/bin/main.c | 78 ++++++++++++++++++++--------------------- src/lib/generator.c | 64 +++++++++++++++++++++------------ src/lib/generator.h | 3 +- src/lib/gui_widget.c | 30 +++++++++++++++- src/lib/gui_widget.h | 12 +++++++ 7 files changed, 131 insertions(+), 66 deletions(-) diff --git a/src/bin/egui_gui/CMakeLists.txt b/src/bin/egui_gui/CMakeLists.txt index b784c9c..1feb300 100644 --- a/src/bin/egui_gui/CMakeLists.txt +++ b/src/bin/egui_gui/CMakeLists.txt @@ -45,7 +45,8 @@ add_custom_command( OUTPUT egui_layout.c egui_layout.h DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/egui_layout.json ${EGUI_BINARY_BLD}/erigo_cmd COMMENT "Generating gui layout from JSON" - COMMAND ${EGUI_BINARY_BLD}/erigo_cmd -e c -o ./egui_layout ${CMAKE_CURRENT_SOURCE_DIR}/egui_layout.json + COMMAND ${EGUI_BINARY_BLD}/erigo_cmd --gc -o ./egui_layout.c ${CMAKE_CURRENT_SOURCE_DIR}/egui_layout.json + COMMAND ${EGUI_BINARY_BLD}/erigo_cmd --gh -o ./egui_layout.h ${CMAKE_CURRENT_SOURCE_DIR}/egui_layout.json ) ############################ diff --git a/src/bin/egui_gui/egui_logic.c b/src/bin/egui_gui/egui_logic.c index a8a7385..3340d7e 100644 --- a/src/bin/egui_gui/egui_logic.c +++ b/src/bin/egui_gui/egui_logic.c @@ -223,7 +223,12 @@ _on_fs_done(void *data, Evas_Object *obj EINA_UNUSED, void *event) /* FIXME: File exists, check if want to save*/ ERR("can save, but file exists, show confirmation window"); } + char ch_file[PATH_MAX]; gui_context_export_filename_set((Gui_Context *) ctx, filename); + sprintf(ch_file, "%s.c", filename); + gui_context_export_c_filename_set((Gui_Context *) ctx, ch_file); + sprintf(ch_file, "%s.h", filename); + gui_context_export_h_filename_set((Gui_Context *) ctx, ch_file); gui_context_export_path_set((Gui_Context *) ctx, (const char *) parent_dir); int state = -1; eo_do(fs_win->fs_radio_c, state = elm_obj_radio_value_get()); @@ -231,7 +236,7 @@ _on_fs_done(void *data, Evas_Object *obj EINA_UNUSED, void *event) { case 0: { - generator_ctx_source_generate(ctx, GENERATE_C); + generator_ctx_source_generate(ctx, GENERATE_C | GENERATE_H); break; } case 1: diff --git a/src/bin/main.c b/src/bin/main.c index ae409d4..6d47822 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -43,17 +43,33 @@ _generate(const char *in_file, const char *out_path, Generator_Export_Format for { path = out_dir; } - /* if new_project_name is no NULL, we want to put new project name. */ - if (format == GENERATE_JSON) + + gui_context_export_path_set(ctx, path); + + /* When generating c file... */ + if (format & GENERATE_C) { - gui_context_project_path_set(ctx, path); - gui_context_project_filename_set(ctx, out_file); + char out_h_file[PATH_MAX]; + strcpy(out_h_file, out_file); + /* If filename.c was provided, filename.h will be used inside c file. + * If other filename provided just add .h in the end. */ + if (eina_str_has_suffix(out_h_file, ".c")) + { + out_h_file[strlen(out_h_file) - 1] = 'h'; + } + else + { + sprintf(out_h_file, "%s%s", out_h_file, ".h"); + } + gui_context_export_h_filename_set(ctx, out_h_file); + gui_context_export_c_filename_set(ctx, out_file); } - else + /* When generating h file, it will be generated into user provided name. */ + else if (format & GENERATE_H) { - gui_context_export_path_set(ctx, path); - gui_context_export_filename_set(ctx, out_file); + gui_context_export_h_filename_set(ctx, out_file); } + generator_ctx_source_generate(ctx, format); gui_context_del(ctx); free(out_dir); @@ -112,18 +128,22 @@ enum MODE_EXPORT }; +static Generator_Export_Format export_format = GENERATE_NONE; + int main(int argc, char **argv) { - const char *new_filename = NULL, *target_name = NULL; + const char *output_filename = NULL, *target_name = NULL; char *filename = NULL; int mode = MODE_GUI; - Generator_Export_Format export_format = GENERATE_NONE; static struct option long_options[] = { - {"export", required_argument, 0, 'e'}, + {"gc", no_argument, (int *) &export_format, GENERATE_C}, + {"gh", no_argument, (int *) &export_format, GENERATE_H}, + {"gjson", no_argument, (int *) &export_format, GENERATE_JSON}, {"simulate", required_argument, 0, 's'}, + {"output", required_argument, 0, 'o'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; @@ -133,30 +153,9 @@ main(int argc, char **argv) switch (opt) { case 0: break; - case 'e': - { - mode = MODE_EXPORT; - if (!strcmp(optarg, "cpp")) - { - export_format = GENERATE_CPP; - } - else if (!strcmp(optarg, "c")) - { - export_format = GENERATE_C; - } - else if (!strcmp(optarg, "json")) - { - export_format = GENERATE_JSON; - } - else - { - mode = MODE_HELP; - } - break; - } case 'o': { - new_filename = argv[optind - 1]; + output_filename = argv[optind - 1]; break; } case 's': @@ -174,16 +173,17 @@ main(int argc, char **argv) if (mode == MODE_HELP) { - printf("Usage: %s [-h/--help] [-e/--export export_format] [-s/--simulate target_name] [-o OUTFILE] filename\n", argv[0]); + printf("Usage: %s [-h/--help] [--gh|--gc|--gjson] [-s/--simulate target_name] [-o OUTFILE] filename\n", argv[0]); printf(" --help/-h Print this help.\n"); - printf(" -o Provide output filename.\n"); - printf(" --export/-e Export format: (c, cpp, json).\n"); - printf(" - in case of \"json\" format OUTFILE will be generated;\n"); - printf(" - in case of other format, files with all required extensions will be generated.\n"); - printf(" T.e. OUTFILE.cpp/OUTFILE.hh for cpp.\n"); + printf(" --output/-o Provide output filename.\n"); + printf(" --gh Generate C header file [.h]\n"); + printf(" --gc Generate C source file [.c]"); + printf("\n --gjson Generate JSON project file [.egui]"); + printf("\n"); printf(" --simulate/-s Target name: (Desktop, Phone, Tablet).\n"); goto end; } + if (export_format) mode = MODE_EXPORT; if (argc == 1) { @@ -267,7 +267,7 @@ main(int argc, char **argv) } else if (mode == MODE_EXPORT) { - _generate(filename, new_filename, export_format); + _generate(filename, output_filename, export_format); } if (mode == MODE_SIMULATE) elm_shutdown(); diff --git a/src/lib/generator.c b/src/lib/generator.c index 18d5dd8..fa799b1 100644 --- a/src/lib/generator.c +++ b/src/lib/generator.c @@ -706,7 +706,6 @@ static void _ctx_generate(Global_Gen_Context *gl_ctx) { const Gui_Context *ctx = gl_ctx->ctx; - const char *filename = gui_context_export_filename_get(ctx); const Eina_List *itr; Eina_List *wdg_ctxs = NULL; Widget_Context *wdg_ctx; @@ -795,7 +794,7 @@ _ctx_generate(Global_Gen_Context *gl_ctx) "#include <Elementary.h>\n" "#include \"elm_widget_container.h\"\n" "#include \"elm_interface_scrollable.h\"\n" - "#include \"%s.h\"\n\n", filename); + "#include \"%s\"\n\n", gui_context_export_h_filename_get(ctx)); eina_strbuf_append_printf(gl_ctx->c_buf, "static %s_Widgets g_%s;\n\n", @@ -857,9 +856,20 @@ _ctx_generate(Global_Gen_Context *gl_ctx) } /* Generate header file. */ + char *h_macro = strdup(gui_context_export_h_filename_get(ctx)), *p; + p = h_macro; + while (*p) + { + if (*p == '.') *p = '_'; + p++; + } + eina_strbuf_append_printf(gl_ctx->h_buf, "#ifndef _%s_h\n" - "#define _%s_h\n", filename, filename); + "#define _%s_h\n", h_macro, h_macro); + free(h_macro); + h_macro = NULL; + eina_strbuf_append_printf(gl_ctx->h_buf, "#include <Eo.h>\n" "#include <Elementary.h>\n\n"); @@ -917,7 +927,7 @@ _ctx_generate(Global_Gen_Context *gl_ctx) /* Save context into "project" files. */ static void -_ctx_to_file_save(const Gui_Context *ctx) +_ctx_to_file_save(const Gui_Context *ctx, Generator_Export_Format format) { Eina_Strbuf *filename = NULL; FILE *fp = NULL; @@ -939,29 +949,38 @@ _ctx_to_file_save(const Gui_Context *ctx) _ctx_generate(&gl_gen_ctx); filename = eina_strbuf_new(); - eina_strbuf_append_printf(filename, "%s/%s.c", - gui_context_export_path_get(ctx), - gui_context_export_filename_get(ctx)); - fp = fopen(eina_strbuf_string_get(filename), "w+"); - if (!fp) + if (format & GENERATE_C) { - ERR("Can't create file: %s", eina_strbuf_string_get(filename)); - goto end; + eina_strbuf_append_printf(filename, "%s/%s", + gui_context_export_path_get(ctx), + gui_context_export_c_filename_get(ctx)); + + fp = fopen(eina_strbuf_string_get(filename), "w+"); + if (!fp) + { + ERR("Can't create file: %s", eina_strbuf_string_get(filename)); + goto end; + } + fprintf(fp, "%s", eina_strbuf_string_get(gl_gen_ctx.c_buf)); + fclose(fp); } - fprintf(fp, "%s", eina_strbuf_string_get(gl_gen_ctx.c_buf)); - fclose(fp); eina_strbuf_reset(filename); - eina_strbuf_append_printf(filename, "%s/%s.h", - gui_context_export_path_get(ctx), - gui_context_export_filename_get(ctx)); - fp = fopen(eina_strbuf_string_get(filename), "w+"); - if (!fp) + + if (format & GENERATE_H) { - ERR("Can't create file: %s", eina_strbuf_string_get(filename)); - goto end; + eina_strbuf_append_printf(filename, "%s/%s", + gui_context_export_path_get(ctx), + gui_context_export_h_filename_get(ctx)); + fp = fopen(eina_strbuf_string_get(filename), "w+"); + if (!fp) + { + ERR("Can't create file: %s", eina_strbuf_string_get(filename)); + goto end; + } + fprintf(fp, "%s", eina_strbuf_string_get(gl_gen_ctx.h_buf)); + fclose(fp); } - fprintf(fp, "%s", eina_strbuf_string_get(gl_gen_ctx.h_buf)); end: eina_strbuf_free(gl_gen_ctx.c_buf); @@ -971,7 +990,6 @@ end: free(gl_gen_ctx.formatted_project_name); session_del(gl_gen_ctx.session); - if (fp) fclose(fp); eina_strbuf_free(filename); } @@ -990,6 +1008,6 @@ generator_ctx_source_generate(const Gui_Context *ctx, Generator_Export_Format fo funcs->content_set = _content_set_generate; funcs->item_add = _item_add_generate; - _ctx_to_file_save(ctx); + _ctx_to_file_save(ctx, format); } diff --git a/src/lib/generator.h b/src/lib/generator.h index cea4d84..00a45e9 100644 --- a/src/lib/generator.h +++ b/src/lib/generator.h @@ -7,7 +7,8 @@ typedef enum GENERATE_NONE, GENERATE_JSON = 1 << 0, GENERATE_C = 1 << 1, - GENERATE_CPP = 1 << 2 + GENERATE_H = 1 << 2, + GENERATE_CPP = 1 << 3 } Generator_Export_Format; /* Generate sources for context*/ diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c index 41a0773..e1a6478 100644 --- a/src/lib/gui_widget.c +++ b/src/lib/gui_widget.c @@ -143,7 +143,10 @@ struct _Gui_Context Eina_Stringshare *project_name; Eina_Stringshare *project_filename; Eina_Stringshare *project_path; + Eina_Stringshare *export_filename; + Eina_Stringshare *export_c_filename; + Eina_Stringshare *export_h_filename; Eina_Stringshare *export_path; Eina_Stringshare *images_prefix; Eina_Hash *names_hash; /* Handle ids of names in current class: t.e. "elm_button1" */ @@ -434,12 +437,36 @@ gui_context_export_filename_set(Gui_Context *ctx, const char *filename) eina_stringshare_replace(&ctx->export_filename, filename); } +void +gui_context_export_c_filename_set(Gui_Context *ctx, const char *filename) +{ + eina_stringshare_replace(&ctx->export_c_filename, filename); +} + +void +gui_context_export_h_filename_set(Gui_Context *ctx, const char *filename) +{ + eina_stringshare_replace(&ctx->export_h_filename, filename); +} + Eina_Stringshare * gui_context_export_filename_get(const Gui_Context *ctx) { return ctx->export_filename; } +Eina_Stringshare * +gui_context_export_c_filename_get(const Gui_Context *ctx) +{ + return ctx->export_c_filename; +} + +Eina_Stringshare * +gui_context_export_h_filename_get(const Gui_Context *ctx) +{ + return ctx->export_h_filename; +} + void gui_context_export_path_set(Gui_Context *ctx, const char *path) { @@ -559,7 +586,8 @@ gui_context_del(Gui_Context *ctx) eina_stringshare_del(ctx->project_name); eina_stringshare_del(ctx->project_filename); eina_stringshare_del(ctx->export_path); - eina_stringshare_del(ctx->export_filename); + eina_stringshare_del(ctx->export_c_filename); + eina_stringshare_del(ctx->export_h_filename); eina_stringshare_del(ctx->images_prefix); context_array[ctx->id] = NULL; diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h index 4698f90..bdd5402 100644 --- a/src/lib/gui_widget.h +++ b/src/lib/gui_widget.h @@ -219,9 +219,21 @@ gui_context_project_path_get(const Gui_Context *ctx); void gui_context_export_filename_set(Gui_Context *ctx, const char *filename); +void +gui_context_export_h_filename_set(Gui_Context *ctx, const char *filename); + +void +gui_context_export_c_filename_set(Gui_Context *ctx, const char *filename); + Eina_Stringshare * gui_context_export_filename_get(const Gui_Context *ctx); +Eina_Stringshare * +gui_context_export_h_filename_get(const Gui_Context *ctx); + +Eina_Stringshare * +gui_context_export_c_filename_get(const Gui_Context *ctx); + void gui_context_export_path_set(Gui_Context *ctx, const char *path); --
