config.cc 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* vim: set ts=2 et sw=2 tw=80: */
  3. /* This Source Code Form is subject to the terms of the Mozilla Public
  4. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  6. #include "config.h"
  7. #include <cstdlib>
  8. #include <queue>
  9. #include <string>
  10. bool ConfigEntryBase::ParseInternal(std::queue<const char *> &args,
  11. std::vector<int> &out) {
  12. if (args.empty()) return false;
  13. char *endptr;
  14. out.push_back(strtol(args.front(), &endptr, 10));
  15. args.pop();
  16. return !*endptr;
  17. }
  18. bool ConfigEntryBase::ParseInternal(std::queue<const char *> &args,
  19. std::string &out) {
  20. if (args.empty()) return false;
  21. out = args.front();
  22. args.pop();
  23. return true;
  24. }
  25. bool ConfigEntryBase::ParseInternal(std::queue<const char *> &args, int &out) {
  26. if (args.empty()) return false;
  27. char *endptr;
  28. out = strtol(args.front(), &endptr, 10);
  29. args.pop();
  30. return !*endptr;
  31. }
  32. bool ConfigEntryBase::ParseInternal(std::queue<const char *> &args, bool &out) {
  33. out = true;
  34. return true;
  35. }
  36. std::string Config::XformFlag(const std::string &arg) {
  37. if (arg.empty()) return "";
  38. if (arg[0] != '-') return "";
  39. return arg.substr(1);
  40. }
  41. Config::Status Config::ParseArgs(int argc, char **argv) {
  42. std::queue<const char *> args;
  43. for (int i = 1; i < argc; ++i) {
  44. args.push(argv[i]);
  45. }
  46. while (!args.empty()) {
  47. auto e = entries_.find(XformFlag(args.front()));
  48. args.pop();
  49. if (e == entries_.end()) {
  50. return kUnknownFlag;
  51. }
  52. if (!e->second->Parse(args)) return kMalformedArgument;
  53. }
  54. return kOK;
  55. }