#include #include #include #include #include #include void wrap_string(std::istream& input, std::ostream& output, const std::string& variable_name) { output << "const std::string " << variable_name << "{\n"; std::string line; while (std::getline(input, line)) { boost::replace_all(line, "\\", "\\\\"); boost::replace_all(line, "\"", "\\\""); output << " \"" << line; if (!input.eof()) output << "\\n"; output << "\"\n"; } output << "};\n"; } int main(int argc, char* argv[]) { namespace po = boost::program_options; po::options_description desc("Allowed options"); desc.add_options() ("help", "show help") ("output", po::value(), "output file") ("namespace", po::value(), "namespace to use") ("input-string,S", po::value>(), "files to parse as strings") ("input-code,C", po::value>(), "files to parse as code"); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); if (vm.count("help")) { std::cout << desc << std::endl; return 1; } if (!vm.count("output")) { std::cerr << "Output file not set" << std::endl; return 1; } std::ofstream output(vm["output"].as(), std::ios::out); if (vm.count("namespace")) output << "namespace " << vm["namespace"].as() << " {\n"; if (vm.count("input-string")) for (auto& filename: vm["input-string"].as>()) { std::ifstream input(filename, std::ios::in); std::string variable_name = boost::replace_all_copy(filename, ".", "_"); boost::replace_all(variable_name, "~", ""); wrap_string(input, output, variable_name); input.close(); } if (vm.count("input-code")) for (auto& filename: vm["input-code"].as>()) { std::ifstream input(filename, std::ios::in); output << std::string{(std::istreambuf_iterator(input)), std::istreambuf_iterator()} << std::endl; input.close(); } if (vm.count("namespace")) output << "}\n"; output.close(); return 0; }