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