command_line.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * Copyright (c) 2012-2020 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/dbartolini/crown/blob/master/LICENSE
  4. */
  5. #include "core/command_line.h"
  6. #include "core/strings/string.inl"
  7. namespace crown
  8. {
  9. static bool is_shortopt(const char* arg, char shortopt)
  10. {
  11. return shortopt != '\0'
  12. && strlen32(arg) > 1
  13. && arg[0] == '-'
  14. && arg[1] == shortopt
  15. ;
  16. }
  17. static bool is_longopt(const char* arg, const char* longopt)
  18. {
  19. return longopt != NULL
  20. && strlen32(arg) > 2
  21. && arg[0] == '-'
  22. && arg[1] == '-'
  23. && strcmp(&arg[2], longopt) == 0
  24. ;
  25. }
  26. static int find_option(int argc, const char** argv, const char* longopt, char shortopt)
  27. {
  28. for (int i = 0; i < argc; ++i)
  29. {
  30. if (is_longopt(argv[i], longopt) || is_shortopt(argv[i], shortopt))
  31. return i;
  32. }
  33. return argc;
  34. }
  35. CommandLine::CommandLine(int argc, const char** argv)
  36. : _argc(argc)
  37. , _argv(argv)
  38. {
  39. }
  40. const char* CommandLine::get_parameter(int i, const char* longopt, char shortopt)
  41. {
  42. int argc = find_option(_argc, _argv, longopt, shortopt);
  43. return argc + i < _argc ? _argv[argc + i + 1] : NULL;
  44. }
  45. bool CommandLine::has_option(const char* longopt, char shortopt)
  46. {
  47. return find_option(_argc, _argv, longopt, shortopt) < _argc;
  48. }
  49. } // namespace crown