commandline.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. * Copyright 2010-2013 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef BX_COMMANDLINE_H_HEADER_GUARD
  6. #define BX_COMMANDLINE_H_HEADER_GUARD
  7. #include "bx.h"
  8. #include "string.h"
  9. namespace bx
  10. {
  11. class CommandLine
  12. {
  13. public:
  14. CommandLine(int _argc, char const* const* _argv)
  15. : m_argc(_argc)
  16. , m_argv(_argv)
  17. {
  18. }
  19. const char* findOption(const char* _long, const char* _default) const
  20. {
  21. const char* result = find('\0', _long, 1);
  22. return result == NULL ? _default : result;
  23. }
  24. const char* findOption(const char _short, const char* _long, const char* _default) const
  25. {
  26. const char* result = find(_short, _long, 1);
  27. return result == NULL ? _default : result;
  28. }
  29. const char* findOption(const char* _long, int _numParams = 1) const
  30. {
  31. const char* result = find('\0', _long, _numParams);
  32. return result;
  33. }
  34. const char* findOption(const char _short, const char* _long = NULL, int _numParams = 1) const
  35. {
  36. const char* result = find(_short, _long, _numParams);
  37. return result;
  38. }
  39. bool hasArg(const char _short, const char* _long = NULL) const
  40. {
  41. const char* arg = findOption(_short, _long, 0);
  42. return NULL != arg;
  43. }
  44. bool hasArg(const char* _long) const
  45. {
  46. const char* arg = findOption('\0', _long, 0);
  47. return NULL != arg;
  48. }
  49. bool hasArg(const char*& _value, const char _short, const char* _long = NULL) const
  50. {
  51. const char* arg = findOption(_short, _long, 1);
  52. _value = arg;
  53. return NULL != arg;
  54. }
  55. bool hasArg(int& _value, const char _short, const char* _long = NULL) const
  56. {
  57. const char* arg = findOption(_short, _long, 1);
  58. if (NULL != arg)
  59. {
  60. _value = atoi(arg);
  61. return true;
  62. }
  63. return false;
  64. }
  65. bool hasArg(unsigned int& _value, const char _short, const char* _long = NULL) const
  66. {
  67. const char* arg = findOption(_short, _long, 1);
  68. if (NULL != arg)
  69. {
  70. _value = atoi(arg);
  71. return true;
  72. }
  73. return false;
  74. }
  75. bool hasArg(float& _value, const char _short, const char* _long = NULL) const
  76. {
  77. const char* arg = findOption(_short, _long, 1);
  78. if (NULL != arg)
  79. {
  80. _value = float(atof(arg));
  81. return true;
  82. }
  83. return false;
  84. }
  85. bool hasArg(double& _value, const char _short, const char* _long = NULL) const
  86. {
  87. const char* arg = findOption(_short, _long, 1);
  88. if (NULL != arg)
  89. {
  90. _value = atof(arg);
  91. return true;
  92. }
  93. return false;
  94. }
  95. bool hasArg(bool& _value, const char _short, const char* _long = NULL) const
  96. {
  97. const char* arg = findOption(_short, _long, 1);
  98. if (NULL != arg)
  99. {
  100. if ('0' == *arg || (0 == stricmp(arg, "false") ) )
  101. {
  102. _value = false;
  103. }
  104. else if ('0' != *arg || (0 == stricmp(arg, "true") ) )
  105. {
  106. _value = true;
  107. }
  108. return true;
  109. }
  110. return false;
  111. }
  112. private:
  113. const char* find(const char _short, const char* _long, int _numParams) const
  114. {
  115. for (int ii = 0; ii < m_argc; ++ii)
  116. {
  117. const char* arg = m_argv[ii];
  118. if ('-' == *arg)
  119. {
  120. ++arg;
  121. if (_short == *arg)
  122. {
  123. if (1 == strlen(arg) )
  124. {
  125. if (0 == _numParams)
  126. {
  127. return "";
  128. }
  129. else if (ii+_numParams < m_argc
  130. && '-' != *m_argv[ii+1] )
  131. {
  132. return m_argv[ii+1];
  133. }
  134. return NULL;
  135. }
  136. }
  137. else if (NULL != _long
  138. && '-' == *arg
  139. && 0 == stricmp(arg+1, _long) )
  140. {
  141. if (0 == _numParams)
  142. {
  143. return "";
  144. }
  145. else if (ii+_numParams < m_argc
  146. && '-' != *m_argv[ii+1] )
  147. {
  148. return m_argv[ii+1];
  149. }
  150. return NULL;
  151. }
  152. }
  153. }
  154. return NULL;
  155. }
  156. int m_argc;
  157. char const* const* m_argv;
  158. };
  159. } // namespace bx
  160. #endif /// BX_COMMANDLINE_H_HEADER_GUARD