Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
CommandLineArguments.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CommandLineArguments.cc (C) 2000-2025 */
9/* */
10/* Command line arguments. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/common/CommandLineArguments.h"
15
16#include "arccore/base/String.h"
17#include "arccore/base/PlatformUtils.h"
18
19#include "arccore/common/List.h"
20#include "arccore/common/ParameterList.h"
21
22#include <atomic>
23#include <map>
24#include <cstring>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
36{
37 public:
38
45 class NameValuePair
46 {
47 public:
48
49 NameValuePair(const String& n, const String& v)
50 : name(n)
51 , value(v)
52 {}
53 String name;
54 String value;
55 };
56
57 public:
58
59 Impl(int* argc, char*** argv)
60 : m_nb_ref(0)
61 , m_args()
62 , m_argc(argc)
63 , m_argv(argv)
64 , m_need_destroy(false)
65 , m_need_help(false)
66 {
67 }
68
69 Impl(const StringList& aargs)
70 : m_nb_ref(0)
71 , m_args(aargs)
72 , m_argc(nullptr)
73 , m_argv(nullptr)
74 , m_need_destroy(true)
75 , m_need_help(false)
76 {
77 Integer nb_arg = aargs.count();
78 m_argc_orig = new int;
79 m_argc = m_argc_orig;
80 *m_argc = nb_arg + 1;
81
82 m_argv_orig = new char**;
83 char*** argv = m_argv_orig;
84 *argv = new char*[nb_arg + 1];
85 m_argv0 = ::strdup("arcane");
86 (*argv)[0] = m_argv0;
87 for (Integer i = 0; i < nb_arg; ++i)
88 (*argv)[i + 1] = (char*)m_args[i].localstr();
89 m_argv = argv;
90 }
91
92 Impl()
93 : m_nb_ref(0)
94 , m_args()
95 , m_argc(nullptr)
96 , m_argv(nullptr)
97 , m_need_destroy(true)
98 , m_need_help(false)
99 {
100 m_argc_orig = new int;
101 m_argc = m_argc_orig;
102 *m_argc = 1;
103
104 m_argv_orig = new char**;
105 char*** argv = m_argv_orig;
106 *argv = new char*[1];
107 m_argv0 = ::strdup("arcane");
108 (*argv)[0] = m_argv0;
109 m_argv = argv;
110 }
111 ~Impl()
112 {
113 if (m_need_destroy) {
114 delete m_argc_orig;
115 if (m_argv_orig)
116 delete[] (*m_argv_orig);
117 delete m_argv_orig;
118 ::free(m_argv0);
119 }
120 }
121
122 public:
123
124 void addReference() { ++m_nb_ref; }
125 void removeReference()
126 {
127 // Decrements and returns the previous value.
128 // If it equals 1, it means there are no more references
129 // on the object and it must be destroyed.
130 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
131 if (v == 1)
132 delete this;
133 }
134 void parseParameters(const CommandLineArguments& command_line_args)
135 {
136 // We only retrieve arguments of the style:
137 // -A,x=b,y=c
138 StringList args;
139 command_line_args.fillArgs(args);
140 if (args.count() == 1) {
141 m_need_help = true;
142 return;
143 }
144 for (Integer i = 0, n = args.count(); i < n; ++i) {
145 String arg = args[i];
146 if (arg.startsWith("-h") || arg.startsWith("--help")) {
147 m_need_help = true;
148 // TODO AH : See how to provide help: "-h=module".
149 continue;
150 }
151 if (!arg.startsWith("-A,"))
152 continue;
153 String arg_value = arg.substring(3);
154 if (arg_value.null() || arg_value.empty())
155 continue;
156 UniqueArray<String> values;
157 arg_value.split(values, ',');
158 for (const auto& x : values) {
159 m_parameter_list.addParameterLine(x);
160 }
161 }
162 }
163 String getParameter(const String& param_name)
164 {
165 return m_parameter_list.getParameterOrNull(param_name);
166 }
167
168 void fillParameters(StringList& param_names, StringList& values) const
169 {
170 m_parameter_list.fillParameters(param_names, values);
171 }
172
173 bool needHelp() const
174 {
175 return m_need_help;
176 }
177
178 public:
179
180 std::atomic<Int32> m_nb_ref;
181 StringList m_args;
182 int* m_argc;
183 char*** m_argv;
184 int* m_argc_orig = nullptr;
185 char*** m_argv_orig = nullptr;
186 char* m_argv0 = nullptr;
187 bool m_need_destroy;
188 bool m_need_help;
189 ParameterList m_parameter_list;
190};
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
196CommandLineArguments(int* argc, char*** argv)
197: m_p(new Impl(argc, argv))
198{
199 m_p->parseParameters(*this);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
207: m_p(new Impl())
208{
209 m_p->parseParameters(*this);
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
217: m_p(new Impl(aargs))
218{
219 m_p->parseParameters(*this);
220}
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224
227: m_p(rhs.m_p)
228{
229}
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
234CommandLineArguments& CommandLineArguments::
235operator=(const CommandLineArguments& rhs)
236{
237 m_p = rhs.m_p;
238 return (*this);
239}
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
244CommandLineArguments::
245~CommandLineArguments()
246{
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252int* CommandLineArguments::
253commandLineArgc() const
254{
255 return m_p->m_argc;
256}
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
261char*** CommandLineArguments::
262commandLineArgv() const
263{
264 return m_p->m_argv;
265}
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
271fillArgs(StringList& aargs) const
272{
273 int nargc = *m_p->m_argc;
274 char** nargv = *m_p->m_argv;
275 aargs.resize(nargc);
276 for (int i = 0; i < nargc; ++i)
277 aargs[i] = nargv[i];
278}
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
284getParameter(const String& param_name) const
285{
286 return m_p->getParameter(param_name);
287}
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291
293addParameterLine(const String& line)
294{
295 m_p->m_parameter_list.addParameterLine(line);
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
302fillParameters(StringList& param_names, StringList& values) const
303{
304 m_p->fillParameters(param_names, values);
305}
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
311parameters() const
312{
313 return m_p->m_parameter_list;
314}
315
316/*---------------------------------------------------------------------------*/
317/*---------------------------------------------------------------------------*/
318
320needHelp() const
321{
322 return m_p->needHelp();
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
328} // End namespace Arcane
329
330/*---------------------------------------------------------------------------*/
331/*---------------------------------------------------------------------------*/
Integer count() const
Number of elements in the collection.
int * m_argc
Number of command line arguments.
char *** m_argv
Array of command line arguments.
const ParameterList & parameters() const
List of parameters.
void addParameterLine(const String &line)
Adds a parameter.
CommandLineArguments(int *argc, char ***argv)
Create an instance from the arguments (argc,argv).
bool needHelp() const
Method to determine if the user requested help on the command line.
void fillArgs(StringList &args) const
Fills args with command line arguments.
String getParameter(const String &param_name) const
Retrieves the parameter with name param_name.
void fillParameters(StringList &param_names, StringList &values) const
Retrieves the list of parameters and their values.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.
List< String > StringList
Unicode string list.
Definition UtilsTypes.h:509
std::int32_t Int32
Signed integer type of 32 bits.