testCommandLineArguments.cxx 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*=========================================================================
  2. Program: KWSys - Kitware System Library
  3. Module: $RCSfile$
  4. Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
  5. See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even
  7. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  8. PURPOSE. See the above copyright notices for more information.
  9. =========================================================================*/
  10. #include "kwsysPrivate.h"
  11. #include KWSYS_HEADER(CommandLineArguments.hxx)
  12. #include KWSYS_HEADER(ios/iostream)
  13. #include KWSYS_HEADER(stl/vector)
  14. // Work-around CMake dependency scanning limitation. This must
  15. // duplicate the above list of headers.
  16. #if 0
  17. # include "CommandLineArguments.hxx.in"
  18. # include "kwsys_ios_iostream.h.in"
  19. #endif
  20. void* random_ptr = reinterpret_cast<void*>(0x123);
  21. int argument(const char* arg, const char* value, void* call_data)
  22. {
  23. kwsys_ios::cout << "Got argument: \"" << arg << "\" value: \"" << (value?value:"(null)") << "\"" << kwsys_ios::endl;
  24. if ( call_data != random_ptr )
  25. {
  26. kwsys_ios::cerr << "Problem processing call_data" << kwsys_ios::endl;
  27. return 0;
  28. }
  29. return 1;
  30. }
  31. int unknown_argument(const char* argument, void* call_data)
  32. {
  33. kwsys_ios::cout << "Got unknown argument: \"" << argument << "\"" << kwsys_ios::endl;
  34. if ( call_data != random_ptr )
  35. {
  36. kwsys_ios::cerr << "Problem processing call_data" << kwsys_ios::endl;
  37. return 0;
  38. }
  39. return 1;
  40. }
  41. bool CompareTwoItemsOnList(bool i1, bool i2) { return i1 == i2; }
  42. bool CompareTwoItemsOnList(int i1, int i2) { return i1 == i2; }
  43. bool CompareTwoItemsOnList(double i1, double i2) { return i1 == i2; }
  44. bool CompareTwoItemsOnList(const char* i1,
  45. const char* i2) { return strcmp(i1, i2) == 0; }
  46. bool CompareTwoItemsOnList(const kwsys_stl::string& i1,
  47. const kwsys_stl::string& i2) { return i1 == i2; }
  48. int main(int argc, char* argv[])
  49. {
  50. // Example run: ./testCommandLineArguments --some-int-variable 4
  51. // --another-bool-variable --some-bool-variable=yes
  52. // --some-stl-string-variable=foobar --set-bool-arg1 --set-bool-arg2
  53. // --some-string-variable=hello
  54. int res = 0;
  55. kwsys::CommandLineArguments arg;
  56. arg.Initialize(argc, argv);
  57. // For error handling
  58. arg.SetClientData(random_ptr);
  59. arg.SetUnknownArgumentCallback(unknown_argument);
  60. int some_int_variable = 10;
  61. double some_double_variable = 10.10;
  62. char* some_string_variable = 0;
  63. kwsys_stl::string some_stl_string_variable = "";
  64. bool some_bool_variable = false;
  65. bool some_bool_variable1 = false;
  66. bool bool_arg1 = false;
  67. int bool_arg2 = 0;
  68. kwsys_stl::vector<int> numbers_argument;
  69. int valid_numbers[] = { 5, 1, 8, 3, 7, 1, 3, 9, 7, 1 };
  70. kwsys_stl::vector<double> doubles_argument;
  71. double valid_doubles[] = { 12.5, 1.31, 22 };
  72. kwsys_stl::vector<bool> bools_argument;
  73. bool valid_bools[] = { true, true, false };
  74. kwsys_stl::vector<char*> strings_argument;
  75. const char* valid_strings[] = { "andy", "bill", "brad", "ken" };
  76. kwsys_stl::vector<kwsys_stl::string> stl_strings_argument;
  77. kwsys_stl::string valid_stl_strings[] = { "ken", "brad", "bill", "andy" };
  78. typedef kwsys::CommandLineArguments argT;
  79. arg.AddArgument("--some-int-variable", argT::SPACE_ARGUMENT, &some_int_variable, "Set some random int variable");
  80. arg.AddArgument("--some-double-variable", argT::CONCAT_ARGUMENT, &some_double_variable, "Set some random double variable");
  81. arg.AddArgument("--some-string-variable", argT::EQUAL_ARGUMENT, &some_string_variable, "Set some random string variable");
  82. arg.AddArgument("--some-stl-string-variable", argT::EQUAL_ARGUMENT, &some_stl_string_variable, "Set some random stl string variable");
  83. arg.AddArgument("--some-bool-variable", argT::EQUAL_ARGUMENT, &some_bool_variable, "Set some random bool variable");
  84. arg.AddArgument("--another-bool-variable", argT::NO_ARGUMENT, &some_bool_variable1, "Set some random bool variable 1");
  85. arg.AddBooleanArgument("--set-bool-arg1", &bool_arg1, "Test AddBooleanArgument 1");
  86. arg.AddBooleanArgument("--set-bool-arg2", &bool_arg2, "Test AddBooleanArgument 2");
  87. arg.AddArgument("--some-multi-argument", argT::MULTI_ARGUMENT, &numbers_argument, "Some multiple values variable");
  88. arg.AddArgument("-N", argT::SPACE_ARGUMENT, &doubles_argument, "Some explicit multiple values variable");
  89. arg.AddArgument("-BB", argT::CONCAT_ARGUMENT, &bools_argument, "Some explicit multiple values variable");
  90. arg.AddArgument("-SS", argT::EQUAL_ARGUMENT, &strings_argument, "Some explicit multiple values variable");
  91. arg.AddArgument("-SSS", argT::MULTI_ARGUMENT, &stl_strings_argument, "Some explicit multiple values variable");
  92. arg.AddCallback("-A", argT::NO_ARGUMENT, argument, random_ptr, "Some option -A. This option has a multiline comment. It should demonstrate how the code splits lines.");
  93. arg.AddCallback("-B", argT::SPACE_ARGUMENT, argument, random_ptr, "Option -B takes argument with space");
  94. arg.AddCallback("-C", argT::EQUAL_ARGUMENT, argument, random_ptr, "Option -C takes argument after =");
  95. arg.AddCallback("-D", argT::CONCAT_ARGUMENT, argument, random_ptr, "This option takes concatinated argument");
  96. arg.AddCallback("--long1", argT::NO_ARGUMENT, argument, random_ptr, "-A");
  97. arg.AddCallback("--long2", argT::SPACE_ARGUMENT, argument, random_ptr, "-B");
  98. arg.AddCallback("--long3", argT::EQUAL_ARGUMENT, argument, random_ptr, "Same as -C but a bit different");
  99. arg.AddCallback("--long4", argT::CONCAT_ARGUMENT, argument, random_ptr, "-C");
  100. if ( !arg.Parse() )
  101. {
  102. kwsys_ios::cerr << "Problem parsing arguments" << kwsys_ios::endl;
  103. res = 1;
  104. }
  105. kwsys_ios::cout << "Help: " << arg.GetHelp() << kwsys_ios::endl;
  106. kwsys_ios::cout << "Some int variable was set to: " << some_int_variable << kwsys_ios::endl;
  107. kwsys_ios::cout << "Some double variable was set to: " << some_double_variable << kwsys_ios::endl;
  108. if ( some_string_variable && strcmp(some_string_variable, "test string with space") == 0)
  109. {
  110. kwsys_ios::cout << "Some string variable was set to: " << some_string_variable << kwsys_ios::endl;
  111. delete [] some_string_variable;
  112. }
  113. else
  114. {
  115. kwsys_ios::cerr << "Problem setting string variable" << kwsys_ios::endl;
  116. res = 1;
  117. }
  118. size_t cc;
  119. #define CompareTwoLists(list1, list_valid, lsize) \
  120. if ( list1.size() != lsize ) \
  121. { \
  122. kwsys_ios::cerr << "Problem setting " #list1 ". Size is: " << list1.size() \
  123. << " should be: " << lsize << kwsys_ios::endl; \
  124. res = 1; \
  125. } \
  126. else \
  127. { \
  128. kwsys_ios::cout << #list1 " argument set:"; \
  129. for ( cc =0; cc < lsize; ++ cc ) \
  130. { \
  131. kwsys_ios::cout << " " << list1[cc]; \
  132. if ( !CompareTwoItemsOnList(list1[cc], list_valid[cc]) ) \
  133. { \
  134. kwsys_ios::cerr << "Problem setting " #list1 ". Value of " \
  135. << cc << " is: [" << list1[cc] << "] <> [" \
  136. << list_valid[cc] << "]" << kwsys_ios::endl; \
  137. res = 1; \
  138. break; \
  139. } \
  140. } \
  141. kwsys_ios::cout << kwsys_ios::endl; \
  142. }
  143. CompareTwoLists(numbers_argument, valid_numbers, 10);
  144. CompareTwoLists(doubles_argument, valid_doubles, 3);
  145. CompareTwoLists(bools_argument, valid_bools, 3);
  146. CompareTwoLists(strings_argument, valid_strings, 4);
  147. CompareTwoLists(stl_strings_argument, valid_stl_strings, 4);
  148. kwsys_ios::cout << "Some STL String variable was set to: " << some_stl_string_variable.c_str() << kwsys_ios::endl;
  149. kwsys_ios::cout << "Some bool variable was set to: " << some_bool_variable << kwsys_ios::endl;
  150. kwsys_ios::cout << "Some bool variable was set to: " << some_bool_variable1 << kwsys_ios::endl;
  151. kwsys_ios::cout << "bool_arg1 variable was set to: " << bool_arg1 << kwsys_ios::endl;
  152. kwsys_ios::cout << "bool_arg2 variable was set to: " << bool_arg2 << kwsys_ios::endl;
  153. kwsys_ios::cout << kwsys_ios::endl;
  154. for ( cc = 0; cc < strings_argument.size(); ++ cc )
  155. {
  156. delete [] strings_argument[cc];
  157. strings_argument[cc] = 0;
  158. }
  159. return res;
  160. }