command_line.cpp 1.2 KB

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