From 20c9cd497cef9fab46f1e24eebe5fa98dc04a444 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 25 Jul 2020 17:21:43 +0200 Subject: Make rcgen use getoptpp and add strip-path argument. --- plugin/Makefile.mingw32.in | 2 +- plugingui/Makefile.am | 12 ++-- plugingui/rcgen.cc | 143 ++++++++++++++++++++++++++++++++++++++------- test/uitests/Makefile.am | 6 +- 4 files changed, 133 insertions(+), 30 deletions(-) diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in index bf52e04..fad7960 100644 --- a/plugin/Makefile.mingw32.in +++ b/plugin/Makefile.mingw32.in @@ -174,7 +174,7 @@ RES = \ ../COPYING all: - g++ @top_srcdir@/plugingui/rcgen.cc -o @top_srcdir@/plugingui/rcgen + g++ -I@top_srcdir@/getoptpp @top_srcdir@/plugingui/rcgen.cc -o @top_srcdir@/plugingui/rcgen (cd @top_srcdir@/plugingui; ./rcgen $(RES) > resource_data.cc) g++ $(CXXFLAGS) @top_srcdir@/plugingui/resource_data.cc -c gcc $(CFLAGS) $(DBG_CFLAGS) @top_srcdir@/hugin/hugin.c -c diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am index f208f43..cb49d53 100644 --- a/plugingui/Makefile.am +++ b/plugingui/Makefile.am @@ -37,8 +37,8 @@ rcgen_verbose = $(rcgen_verbose_@AM_V@) rcgen_verbose_ = $(rcgen_verbose_@AM_DEFAULT_V@) rcgen_verbose_0 = @echo " RCGEN "$@; -resource_data.cc: rcgen $(RES) - $(rcgen_verbose)./rcgen -d $(top_srcdir)/plugingui $(RES) > $(top_srcdir)/plugingui/resource_data.cc +$(top_builddir)/plugingui/resource_data.cc: rcgen$(EXEEXT) $(RES) + $(rcgen_verbose)./rcgen$(EXEEXT) -d $(top_srcdir)/plugingui -o $@ $(RES) libdggui_la_CPPFLAGS = \ $(DEBUG_FLAGS) \ @@ -100,7 +100,6 @@ nodist_libdggui_la_SOURCES = \ progressbar.cc \ resamplingframecontent.cc \ resource.cc \ - resource_data.cc \ sampleselectionframecontent.cc \ scrollbar.cc \ slider.cc \ @@ -119,7 +118,8 @@ nodist_libdggui_la_SOURCES = \ visualizerframecontent.cc \ widget.cc \ window.cc \ - lodepng/lodepng.cpp + lodepng/lodepng.cpp \ + $(top_builddir)/plugingui/resource_data.cc if ENABLE_X11 nodist_libdggui_la_SOURCES += \ @@ -185,7 +185,9 @@ plugingui_SOURCES = \ testmain.cc \ $(top_srcdir)/hugin/hugin.c -rcgen_SOURCES = rcgen.cc +rcgen_CXXFLAGS = -I$(top_srcdir)/getoptpp +rcgen_SOURCES = \ + rcgen.cc EXTRA_DIST = \ $(nodist_libdggui_la_SOURCES) \ diff --git a/plugingui/rcgen.cc b/plugingui/rcgen.cc index f4d7fe6..f7b5590 100644 --- a/plugingui/rcgen.cc +++ b/plugingui/rcgen.cc @@ -27,35 +27,138 @@ #include #include #include +#include + +#include + +std::string usage(const std::string& name, bool brief = false) +{ + std::ostringstream output; + output << + "Usage: " << name << " [options]\n"; + if(!brief) + { + output << + "\n" + "Create resource file from list of input files.\n" + "\n"; + } + return output.str(); +} int main(int argc, char *argv[]) { - printf("/* This file is autogenerated by rcgen. Do not modify! */\n"); - printf("#include \"resource_data.h\"\n"); - printf("\n"); - printf("const rc_data_t rc_data[] =\n"); - printf("{\n"); + bool verbose{false}; + std::vector stripPrefixes; + std::string dirRoot; + std::string outfile; + + dg::Options opt; + + opt.add("strip-path", required_argument, 's', + "Strip supplied path prefix from resource names.", + [&]() + { + stripPrefixes.push_back(optarg); + return 0; + }); + + opt.add("dir-root", required_argument, 'd', + "Change to supplied root dir before reading files.", + [&]() + { + dirRoot = optarg; + return 0; + }); + + opt.add("output", required_argument, 'o', + "Write output to specificed file, defaults to stdout.", + [&]() + { + outfile = optarg; + return 0; + }); + + opt.add("verbose", no_argument, 'v', + "Print verbose output during processing.", + [&]() + { + verbose = true; + return 0; + }); + + opt.add("help", no_argument, 'h', + "Print this message and exit.", + [&]() + { + std::cout << usage(argv[0]); + std::cout << "Options:\n"; + opt.help(); + exit(0); + return 0; + }); + + if(opt.process(argc, argv) != 0) + { + return 1; + } + + FILE* out = stdout; + if(!outfile.empty()) + { + out = fopen(outfile.data(), "wb"); + if(!out) + { + fprintf(stderr, "Could not write to file '%s' - quitting\n", + outfile.data()); + return 1; + + } + } - int i = 1; + fprintf(out, "/* This file is autogenerated by rcgen. Do not modify! */\n"); + fprintf(out, "#include \"resource_data.h\"\n"); + fprintf(out, "\n"); + fprintf(out, "const rc_data_t rc_data[] =\n"); + fprintf(out, "{\n"); - if(argc > 2 && std::string(argv[1]) == "-d") + if(!dirRoot.empty()) { - if(chdir(argv[2])) + if(verbose) + { + fprintf(stderr, "Change to dir: %s\n", dirRoot.data()); + } + + if(chdir(dirRoot.data())) { return 1; } - i += 2; } - while(i < argc) + for(const auto& arg : opt.arguments()) { - printf(" {\n \":%s\", ", argv[i]); + std::string resourceName = arg; + for(const auto& stripPrefix : stripPrefixes) + { + if(stripPrefix == resourceName.substr(0, stripPrefix.length())) + { + resourceName = resourceName.substr(stripPrefix.length()); + break; + } + } + + fprintf(out, " {\n \":%s\", ", resourceName.data()); + + if(verbose) + { + fprintf(stderr, "Process: %s\n", arg.data()); + } std::string data; - FILE *fp = fopen(argv[i], "rb"); + FILE *fp = fopen(arg.data(), "rb"); if(!fp) { - fprintf(stderr, "Could not read file '%s' - quitting\n", argv[i]); + fprintf(stderr, "Could not read file '%s' - quitting\n", arg.data()); return 1; } @@ -67,23 +170,21 @@ int main(int argc, char *argv[]) } fclose(fp); - printf("%d,\n \"", (int)data.length()); + fprintf(out, "%d,\n \"", (int)data.length()); for(std::size_t j = 0; j < data.length(); ++j) { if((j != 0) && (j % 16) == 0) { - printf("\"\n \""); + fprintf(out, "\"\n \""); } - printf("\\%o", (unsigned char)data[j]); + fprintf(out, "\\%o", (unsigned char)data[j]); } - printf("\"\n },\n"); - - ++i; + fprintf(out, "\"\n },\n"); } - printf(" { \"\", 0, 0 }\n"); - printf("};\n"); + fprintf(out, " { \"\", 0, 0 }\n"); + fprintf(out, "};\n"); return 0; } diff --git a/test/uitests/Makefile.am b/test/uitests/Makefile.am index 39571e2..a5e6d01 100644 --- a/test/uitests/Makefile.am +++ b/test/uitests/Makefile.am @@ -55,8 +55,8 @@ rcgen_verbose = $(rcgen_verbose_@AM_V@) rcgen_verbose_ = $(rcgen_verbose_@AM_DEFAULT_V@) rcgen_verbose_0 = @echo " RCGEN "$@; -benchmarktest_resource_data.cc: $(top_builddir)/plugingui/rcgen $(RES) - $(rcgen_verbose)$(top_builddir)/plugingui/rcgen -d $(top_srcdir)/test/uitests $(RES) > $(top_srcdir)/test/uitests/benchmarktest_resource_data.cc +$(top_builddir)/test/uitests/benchmarktest_resource_data.cc: $(top_builddir)/plugingui/rcgen $(RES) + $(rcgen_verbose)$(top_builddir)/plugingui/rcgen$(EXEEXT) -d $(top_srcdir)/test/uitests -o $@ $(RES) benchmarktest_LDADD = \ $(top_builddir)/plugingui/libdggui.la \ @@ -67,7 +67,7 @@ benchmarktest_CXXFLAGS = \ -I$(top_srcdir)/hugin benchmarktest_SOURCES = \ benchmarktest.cc \ - benchmarktest_resource_data.cc \ + $(top_builddir)/test/uitests/benchmarktest_resource_data.cc \ $(top_srcdir)/hugin/hugin.c powerwidgettest_LDADD = \ -- cgit v1.2.3