Emu?
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

90 lines
2.8 KiB

/* main.cpp
*
* The big, magical entry point.
*/
#include <iostream>
#include "cxxopts.hpp"
#include "version.h"
cxxopts::ParseResult parseCmdLine(int argc, char **argv) {
try {
cxxopts::Options options(argv[0]);
options.positional_help("CORE FILENAME")
.show_positional_help();
options.add_options("Hidden")
("c,core", "the core that should be used", cxxopts::value<std::string>())
("f,filename", "the path to the ROM", cxxopts::value<std::string>())
("positional", "", cxxopts::value<std::vector<std::string>>())
;
options.add_options()
("h,help", "shows this help screen and exits")
("l,list-cores", "shows a list of all supported cores and exits")
("V,version", "displays the version information and exits");
options.add_options("Video")
("s,scale", "sets the default window scaling", cxxopts::value<int>()->default_value("1"));
options.parse_positional({"core", "filename", "positional"});
auto result = options.parse(argc, argv);
if(result.count("help")) {
// Icky hack. As far as I can tell there's no other way of hiding
// unwanted/positional arguments using cxxopts.
std::cout << options.help({
"",
"Video"
}) << std::endl;
exit(0);
}
return result;
} catch(cxxopts::argument_incorrect_type &ex) {
std::cerr << "Invalid argument type (" << ex.what() << ")" << std::endl;
exit(1);
} catch(cxxopts::missing_argument_exception &ex) {
std::cerr << ex.what() << std::endl;
exit(1);
} catch(cxxopts::OptionException &ex) {
std::cerr << "Error parsing arguments (" << ex.what() << ")" << std::endl;
exit(1);
}
}
int main(int argc, char **argv) {
#ifndef GIT_FOUND
const char *windowTitle = PRODUCT_NAME;
#else
#ifndef GIT_TAG
const char *windowTitle = PRODUCT_NAME " (" GIT_BRANCH "@" GIT_REVISION ")";
#else
const char *windowTitle = PRODUCT_NAME " " GIT_TAG;
#endif // GIT_TAG
#endif // GIT_FOUND
auto opts = parseCmdLine(argc, argv);
if(!opts.count("core") || !opts.count("filename")) {
std::cerr << "The name of the core and the filename must be specified!\n\n"
<< "Please see the usage information (" << argv[0] << " -h) for more information." << std::endl;
return 1;
}
if(opts.count("version")) {
std::cout << windowTitle << std::endl;
return 0;
}
std::cout << "scale: " << opts["scale"].as<int>()
<< "\ncore: " << opts["core"].as<std::string>()
<< "\nfile: " << opts["filename"].as<std::string>()
<< std::endl;
return 0;
}