testCommandLineArguments.cxx 8.0 KB

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