| #ifndef __STDC_FORMAT_MACROS | |
| #define __STDC_FORMAT_MACROS | |
| #endif | |
| #ifndef __STDC_LIMIT_MACROS | |
| #define __STDC_LIMIT_MACROS | |
| #endif | |
| /**************************************************************************************[Options.cc] | |
| Copyright (c) 2008-2010, Niklas Sorensson | |
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and | |
| associated documentation files (the "Software"), to deal in the Software without restriction, | |
| including without limitation the rights to use, copy, modify, merge, publish, distribute, | |
| sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is | |
| furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in all copies or | |
| substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT | |
| NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT | |
| OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| **************************************************************************************************/ | |
| #include "Sort.h" | |
| #include "Options.h" | |
| #include "ParseUtils.h" | |
| using namespace Minisat; | |
| void Minisat::parseOptions(int& argc, char** argv, bool strict) | |
| { | |
| int i, j; | |
| for (i = j = 1; i < argc; i++){ | |
| const char* str = argv[i]; | |
| if (match(str, "--") && match(str, Option::getHelpPrefixString()) && match(str, "help")){ | |
| if (*str == '\0') | |
| printUsageAndExit(argc, argv); | |
| else if (match(str, "-verb")) | |
| printUsageAndExit(argc, argv, true); | |
| } else { | |
| bool parsed_ok = false; | |
| for (int k = 0; !parsed_ok && k < Option::getOptionList().size(); k++){ | |
| parsed_ok = Option::getOptionList()[k]->parse(argv[i]); | |
| // fprintf(stderr, "checking %d: %s against flag <%s> (%s)\n", i, argv[i], Option::getOptionList()[k]->name, parsed_ok ? "ok" : "skip"); | |
| } | |
| if (!parsed_ok){ | |
| if (strict && match(argv[i], "-")) | |
| fprintf(stderr, "ERROR! Unknown flag \"%s\". Use '--%shelp' for help.\n", argv[i], Option::getHelpPrefixString()), exit(1); | |
| else | |
| argv[j++] = argv[i]; | |
| } | |
| } | |
| } | |
| argc -= (i - j); | |
| } | |
| void Minisat::setUsageHelp (const char* str){ Option::getUsageString() = str; } | |
| void Minisat::setHelpPrefixStr (const char* str){ Option::getHelpPrefixString() = str; } | |
| void Minisat::printUsageAndExit (int /*argc*/, char** argv, bool verbose) | |
| { | |
| const char* usage = Option::getUsageString(); | |
| if (usage != NULL) | |
| fprintf(stderr, usage, argv[0]); | |
| sort(Option::getOptionList(), Option::OptionLt()); | |
| const char* prev_cat = NULL; | |
| const char* prev_type = NULL; | |
| for (int i = 0; i < Option::getOptionList().size(); i++){ | |
| const char* cat = Option::getOptionList()[i]->category; | |
| const char* type = Option::getOptionList()[i]->type_name; | |
| if (cat != prev_cat) | |
| fprintf(stderr, "\n%s OPTIONS:\n\n", cat); | |
| else if (type != prev_type) | |
| fprintf(stderr, "\n"); | |
| Option::getOptionList()[i]->help(verbose); | |
| prev_cat = Option::getOptionList()[i]->category; | |
| prev_type = Option::getOptionList()[i]->type_name; | |
| } | |
| fprintf(stderr, "\nHELP OPTIONS:\n\n"); | |
| fprintf(stderr, " --%shelp Print help message.\n", Option::getHelpPrefixString()); | |
| fprintf(stderr, " --%shelp-verb Print verbose help message.\n", Option::getHelpPrefixString()); | |
| fprintf(stderr, "\n"); | |
| exit(0); | |
| } | |