ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
vtkCommandOptions.cxx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkCommandOptions.cxx
5 
6  Copyright (c) Kitware, Inc.
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 #include "vtkCommandOptions.h"
17 #include "vtkObjectFactory.h"
18 
19 #include <sstream>
20 #include <string>
21 #include <vtksys/CommandLineArguments.hxx>
22 #include <vtksys/SystemTools.hxx>
23 
24 //----------------------------------------------------------------------------
25 //****************************************************************************
26 class vtkCommandOptionsInternal
27 {
28 public:
29  vtksys::CommandLineArguments CMD;
30 };
31 //****************************************************************************
32 //----------------------------------------------------------------------------
33 
34 //----------------------------------------------------------------------------
36 
37 //----------------------------------------------------------------------------
39 {
40  this->ProcessType = EVERYBODY;
41  // Initialize vtksys::CommandLineArguments
42  this->Internals = new vtkCommandOptionsInternal();
43  this->Internals->CMD.SetUnknownArgumentCallback(vtkCommandOptions::UnknownArgumentHandler);
44  this->Internals->CMD.SetClientData(this);
45  this->UnknownArgument = 0;
46  this->HelpSelected = 0;
47 
48  this->ErrorMessage = 0;
49  this->Argc = 0;
50  this->Argv = 0;
51  this->ApplicationPath = 0;
52 
53  this->XMLConfigFile = 0;
54 
56  this->XMLParser->SetPVOptions(this);
57 }
58 
59 //----------------------------------------------------------------------------
61 {
62  this->SetXMLConfigFile(nullptr);
63 
64  // Remove internals
65  this->SetUnknownArgument(nullptr);
66  this->SetErrorMessage(nullptr);
67  this->CleanArgcArgv();
68  delete this->Internals;
69 
70  this->SetApplicationPath(nullptr);
71 
72  if (this->XMLParser)
73  {
74  this->XMLParser->Delete();
75  this->XMLParser = nullptr;
76  }
77 }
78 
79 //----------------------------------------------------------------------------
81 {
82  int width = vtksys::SystemTools::GetTerminalWidth();
83  if (width < 9)
84  {
85  width = 80;
86  }
87 
88  this->Internals->CMD.SetLineLength(width);
89  this->Internals->CMD.SetLineLength(300);
90 
91  return this->Internals->CMD.GetHelp();
92 }
93 
94 //----------------------------------------------------------------------------
96 {
97 }
98 
99 //----------------------------------------------------------------------------
100 int vtkCommandOptions::PostProcess(int, const char* const*)
101 {
102  return 1;
103 }
104 
105 //----------------------------------------------------------------------------
106 int vtkCommandOptions::WrongArgument(const char* argument)
107 {
108  // if the unknown file is a config file then it is OK
109  if (this->XMLConfigFile && strcmp(argument, this->XMLConfigFile) == 0)
110  {
111  // if the UnknownArgument is the XMLConfigFile then set the
112  // UnknownArgument to null as it really is not Unknown anymore.
113  if (this->UnknownArgument && (strcmp(this->UnknownArgument, this->XMLConfigFile) == 0))
114  {
115  this->SetUnknownArgument(0);
116  }
117  return 1;
118  }
119 
120  return 0;
121 }
122 
123 //----------------------------------------------------------------------------
125 {
126  return this->Internals->CMD.GetArgv0();
127 }
128 
129 //----------------------------------------------------------------------------
131 {
132  this->XMLParser->SetFileName(fname);
133  this->XMLParser->Parse();
134  this->SetXMLConfigFile(fname);
135  return 1;
136 }
137 
138 //----------------------------------------------------------------------------
139 int vtkCommandOptions::Parse(int argc, const char* const argv[])
140 {
141  this->Internals->CMD.Initialize(argc, argv);
142  this->Initialize();
143  this->AddBooleanArgument("--help", "/?", &this->HelpSelected,
144  "Displays available command line arguments.", vtkCommandOptions::EVERYBODY);
145 
146  // First get options from the xml file
147  for (int i = 0; i < argc; ++i)
148  {
149  std::string arg = argv[i];
150  if (arg.size() > 4 && arg.find(".pvx") == (arg.size() - 4))
151  {
152  if (!this->LoadXMLConfigFile(arg.c_str()))
153  {
154  return 0;
155  }
156  }
157  }
158  // now get options from the command line
159  int res1 = this->Internals->CMD.Parse();
160  int res2 = this->PostProcess(argc, argv);
161  // cout << "Res1: " << res1 << " Res2: " << res2 << endl;
162  this->CleanArgcArgv();
163  this->Internals->CMD.GetRemainingArguments(&this->Argc, &this->Argv);
164  this->ComputeApplicationPath();
165 
166  return res1 && res2;
167 }
168 
169 //----------------------------------------------------------------------------
171 {
172  int cc;
173  if (this->Argv)
174  {
175  for (cc = 0; cc < this->Argc; cc++)
176  {
177  delete[] this->Argv[cc];
178  }
179  delete[] this->Argv;
180  this->Argv = 0;
181  }
182 }
183 //----------------------------------------------------------------------------
185  const char* longarg, const char* shortarg, const char* help, int type)
186 {
187  // if it is for xml or not for the current process do nothing
188  if ((type & XMLONLY) || !(type & this->ProcessType || type == vtkCommandOptions::EVERYBODY))
189  {
190  return;
191  }
192  // Add a callback for the deprecated argument handling
193  this->Internals->CMD.AddCallback(longarg, vtksys::CommandLineArguments::NO_ARGUMENT,
194  vtkCommandOptions::DeprecatedArgumentHandler, this, help);
195  if (shortarg)
196  {
197  this->Internals->CMD.AddCallback(shortarg, vtksys::CommandLineArguments::NO_ARGUMENT,
198  vtkCommandOptions::DeprecatedArgumentHandler, this, help);
199  }
200 }
201 
202 //----------------------------------------------------------------------------
203 int vtkCommandOptions::DeprecatedArgument(const char* argument)
204 {
205  std::ostringstream str;
206  str << " " << this->Internals->CMD.GetHelp(argument);
207  str << ends;
208  this->SetErrorMessage(str.str().c_str());
209  return 0;
210 }
211 
212 //----------------------------------------------------------------------------
214  const char* longarg, const char* shortarg, int* var, const char* help, int type)
215 {
216  // add the argument to the XML parser
217  this->XMLParser->AddBooleanArgument(longarg, var, type);
218  if (type & XMLONLY)
219  {
220  return;
221  }
222  // if the process type matches then add the argument to the command line
223  if (type & this->ProcessType || type == vtkCommandOptions::EVERYBODY)
224  {
225  this->Internals->CMD.AddBooleanArgument(longarg, var, help);
226  if (shortarg)
227  {
228  this->Internals->CMD.AddBooleanArgument(shortarg, var, longarg);
229  }
230  }
231 }
232 
233 //----------------------------------------------------------------------------
235  const char* longarg, const char* shortarg, int* var, const char* help, int type)
236 {
237  this->XMLParser->AddArgument(longarg, var, type);
238  if (type & XMLONLY)
239  {
240  return;
241  }
242  if (type & this->ProcessType || type == vtkCommandOptions::EVERYBODY)
243  {
244  typedef vtksys::CommandLineArguments argT;
245  this->Internals->CMD.AddArgument(longarg, argT::EQUAL_ARGUMENT, var, help);
246  if (shortarg)
247  {
248  this->Internals->CMD.AddArgument(shortarg, argT::EQUAL_ARGUMENT, var, longarg);
249  }
250  }
251 }
252 
253 //----------------------------------------------------------------------------
255  const char* longarg, const char* shortarg, char** var, const char* help, int type)
256 {
257  this->XMLParser->AddArgument(longarg, var, type);
258  if (type & XMLONLY)
259  {
260  return;
261  }
262  if (type & this->ProcessType || type == vtkCommandOptions::EVERYBODY)
263  {
264  typedef vtksys::CommandLineArguments argT;
265  this->Internals->CMD.AddArgument(longarg, argT::EQUAL_ARGUMENT, var, help);
266  if (shortarg)
267  {
268  this->Internals->CMD.AddArgument(shortarg, argT::EQUAL_ARGUMENT, var, longarg);
269  }
270  }
271 }
272 
273 //----------------------------------------------------------------------------
274 void vtkCommandOptions::AddCallback(const char* longarg, const char* shortarg,
275  vtkCommandOptions::CallbackType callback, void* call_data, const char* help, int type)
276 {
277  if (type & XMLONLY)
278  {
279  vtkErrorMacro("Callback arguments cannot be processed through XML.");
280  return;
281  }
282 
283  if (type & this->ProcessType || type == vtkCommandOptions::EVERYBODY)
284  {
285  typedef vtksys::CommandLineArguments argT;
286  this->Internals->CMD.AddCallback(longarg, argT::EQUAL_ARGUMENT, callback, call_data, help);
287  if (shortarg)
288  {
289  this->Internals->CMD.AddCallback(
290  shortarg, argT::EQUAL_ARGUMENT, callback, call_data, longarg);
291  }
292  }
293 }
294 
295 //----------------------------------------------------------------------------
296 int vtkCommandOptions::UnknownArgumentHandler(const char* argument, void* call_data)
297 {
298  vtkCommandOptions* self = static_cast<vtkCommandOptions*>(call_data);
299  if (self)
300  {
301  self->SetUnknownArgument(argument);
302  return self->WrongArgument(argument);
303  }
304  return 0;
305 }
306 
307 //----------------------------------------------------------------------------
308 int vtkCommandOptions::DeprecatedArgumentHandler(const char* argument, const char*, void* call_data)
309 {
310  // cout << "UnknownArgumentHandler: " << argument << endl;
311  vtkCommandOptions* self = static_cast<vtkCommandOptions*>(call_data);
312  if (self)
313  {
314  return self->DeprecatedArgument(argument);
315  }
316  return 0;
317 }
318 
319 //----------------------------------------------------------------------------
320 void vtkCommandOptions::GetRemainingArguments(int* argc, char*** argv)
321 {
322  *argc = this->Argc;
323  *argv = this->Argv;
324 }
325 
326 //----------------------------------------------------------------------------
328 {
329  return this->Internals->CMD.GetLastArgument();
330 }
331 
332 //----------------------------------------------------------------------------
334 {
335  this->SetApplicationPath(nullptr);
336 
337  std::string argv0 = this->GetArgv0();
338  if (argv0.size())
339  {
340  if (argv0.rfind('/') != std::string::npos || argv0.rfind('\\') != std::string::npos)
341  {
342  // is a relative/absolute path, compute it based on cwd
343  argv0 = vtksys::SystemTools::CollapseFullPath(argv0.c_str());
344  }
345  else
346  {
347  // no path separator found, search PATH for it
348  argv0 = vtksys::SystemTools::FindProgram(argv0.c_str()).c_str();
349  }
350  this->SetApplicationPath(argv0.c_str());
351  }
352 }
353 
354 //----------------------------------------------------------------------------
355 void vtkCommandOptions::PrintSelf(ostream& os, vtkIndent indent)
356 {
357  this->Superclass::PrintSelf(os, indent);
358  os << indent << "XMLConfigFile: " << (this->XMLConfigFile ? this->XMLConfigFile : "(none)")
359  << endl;
360  os << indent << "UnknownArgument: " << (this->UnknownArgument ? this->UnknownArgument : "(none)")
361  << endl;
362  os << indent << "ErrorMessage: " << (this->ErrorMessage ? this->ErrorMessage : "(none)") << endl;
363  os << indent << "HelpSelected: " << this->HelpSelected << endl;
364  os << indent << "ApplicationPath: " << (this->ApplicationPath ? this->ApplicationPath : "(none)")
365  << endl;
366 }
std::function< void(std::shared_ptr< core::Tensor >)> callback
int width
char type
void AddArgument(const char *longarg, int *var, int type=0)
void AddBooleanArgument(const char *longarg, int *var, int type=0)
void SetPVOptions(vtkCommandOptions *o)
static vtkCommandOptionsXMLParser * New()
const char * GetHelp()
virtual int PostProcess(int argc, const char *const *argv)
virtual int DeprecatedArgument(const char *argument)
void PrintSelf(ostream &os, vtkIndent indent) override
void AddBooleanArgument(const char *longarg, const char *shortarg, int *var, const char *help, int type=EVERYBODY)
void AddCallback(const char *longarg, const char *shortarg, CallbackType callback, void *call_data, const char *help, int type=EVERYBODY)
void AddDeprecatedArgument(const char *longarg, const char *shortarg, const char *help, int type=EVERYBODY)
int LoadXMLConfigFile(const char *)
vtkCommandOptionsXMLParser * XMLParser
~vtkCommandOptions() override
void AddArgument(const char *longarg, const char *shortarg, int *var, const char *help, int type=EVERYBODY)
void GetRemainingArguments(int *argc, char **argv[])
int(* CallbackType)(const char *argument, const char *value, void *call_data)
virtual void Initialize()
int Parse(int argc, const char *const argv[])
const char * GetArgv0()
virtual int WrongArgument(const char *argument)
QTextStream & endl(QTextStream &stream)
Definition: QtCompat.h:718
vtkStandardNewMacro(vtkCommandOptions)