// Parses options specified in the first line of the file with 'filename'. // Returns: success? // On success, public member variables shall contain interpreted program // parameters. bool Options::ParseConfigFile(string filename, bool validate /* = true */) { // avoid endless recursion! //printf("Parsing: '%s'...\n", filename.c_str()); if (parsedConfigFiles.find(filename) != parsedConfigFiles.end()) { fprintf(stderr, "Cyclic list of configuration files is not allowed!\nStopping at file named: '%s'.\n", filename.c_str()); return true; } const int MAX_LINE_LEN = 1024; char line[MAX_LINE_LEN+1] = {0}; FILE* in = fopen(filename.c_str(), "r+t"); if (!in) { fprintf(stderr, "Failed to open config file named: '%s'.\n", filename.c_str()); return false; } fgets(line, MAX_LINE_LEN, in); fclose(in); // add this file to read config files set parsedConfigFiles.insert(filename); CmdLineParser cmdline = cmdline_prototype; if (!cmdline.Parse(line, true)) { fprintf(stderr, "Syntax error in config file: '%s'. \n", filename.c_str()); return false; } Store(cmdline); return validate ? Validate() : true; }
int main(int argc, const char **argv) { char xmlfile[1024]; char configfile[1024]; char platform[128]; bool rebuild = false; bool packages = false; bool compression = false; bool resources = false; bool unified = false; bool dirs = false; u8 alignment = ALIGN_32; memset(configfile, '\0', 1024); memcpy(configfile, "config.xml", strlen("config.xml")); CmdLineParser *parser = new CmdLineParser(12); parser->Add("i", "input", false, false, true, SetXmlFile, xmlfile); parser->Add("p", "platform", false, false, true, SetPlatformString, platform); parser->Add("r", "rebuild", true, false, false, Rebuild, &rebuild); parser->Add("k", "packages", true, false, false, EnablePackages, &packages); parser->Add("a", "alignment", true, false, true, SetAlignment, &alignment); parser->Add("c", "compress", true, false, false, EnableCompression, &compression); parser->Add("d", "add_resources", true, false, false, EnablePackageResources, &resources); parser->Add("t", "tree", true, false, true, RebuildDirectoryTree, &dirs); parser->Add("v", "verbose", true, false, false, EnableVerboseMode, &gVerbose); parser->Add("q", "quiet", true, false, false, EnableQuietMode, &gQuiet); parser->Add("f", "config", true, false, true, SetConfigFile, &configfile); parser->Add("u", "unify", true, false, false, EnablePackageUnified, &unified); fprintf(stdout, "Seed Exporter (c) Danny Angelo Carminati Grein 2008\n"); if (!parser->Parse(argc, argv, true)) { fprintf(stdout, "\nusage: %s -i [input xml] -p [platform] [params]\n\n", argv[0]); fprintf(stdout, "PARAMS\n"); fprintf(stdout, "\t\t-f, --config\tUse this config file as config.xml\n"); fprintf(stdout, "\t\t-r, --rebuild\tRebuild all files.\n"); fprintf(stdout, "\t\t-k, --packages\tCreate group packages.\n"); fprintf(stdout, "\t\t-d, --add_resources\tAdd resources to the package files.\n"); fprintf(stdout, "\t\t-u, --unify\tUnify packages in one output only.\n"); fprintf(stdout, "\t\t-a [value], --alignment [value]\tOutput data alignment.\n"); fprintf(stdout, "\t\t-c, --compress\tEnable output data compression.\n"); fprintf(stdout, "\t\t-t, --tree\tBuild directory structure only (not implemented!)\n"); fprintf(stdout, "\t\t-v, --verbose\tVerbose mode.\n"); fprintf(stdout, "\t\t-q, --quiet\tQuiet mode.\n"); fprintf(stdout, "\n"); return EXIT_FAILURE; } e->bfsExeName = bfs::path(argv[0]); e->Process(configfile, xmlfile, platform, rebuild, packages, alignment, compression, resources, unified); return EXIT_SUCCESS; }
// Parses the command line given in a form the main() function received it. // Returns: success? // On success, public member variables shall contain interpreted // (validated) program parameters. bool Options::ParseCmdLine(int argc, char* argv[]) { // zeroth, ensure fallback to the defaults.. Reset(); // first, try to read options from the default configuration file.. FILE* in = fopen(INPUT, "r"); if (in) { fclose(in); ParseConfigFile(INPUT, false); } // than, update those options with options from command-line.. // ..and user-specified config files.. CmdLineParser cmdline = cmdline_prototype; if (!cmdline.Parse(argc, argv)) { fprintf(stderr, "Command line syntax error!\n"); fprintf(stderr, "Type '%s --help' for more information. \n", argv[0]); return false; } Store(cmdline); // at last, validate all stored options.. return Validate(); }