Arcane  v4.1.2.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CommandLineArguments.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Arguments de la ligne de commande. */
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 /*!
39 * \brief Paramètres de la ligne de commande.
40 *
41 * Ils sont récupérés via l'option '-A' de la ligne de commande
42 * et sont de la forme -A,x=y,a=b.
43 */
44 class NameValuePair
45 {
46 public:
47 NameValuePair(const String& n,const String& v) : name(n), value(v){}
48 String name;
49 String value;
50 };
51 public:
52 Impl(int* argc,char*** argv)
53 : m_nb_ref(0)
54 , m_args()
55 , m_argc(argc)
56 , m_argv(argv)
57 , m_need_destroy(false)
58 , m_need_help(false)
59 {
60 }
61
62 Impl(const StringList& aargs)
63 : m_nb_ref(0)
64 , m_args(aargs)
65 , m_argc(nullptr)
66 , m_argv(nullptr)
67 , m_need_destroy(true)
68 , m_need_help(false)
69 {
70 Integer nb_arg = aargs.count();
71 m_argc_orig = new int;
72 m_argc = m_argc_orig;
73 *m_argc = nb_arg+1;
74
75 m_argv_orig = new char**;
76 char*** argv = m_argv_orig;
77 *argv = new char*[nb_arg+1];
78 m_argv0 = ::strdup("arcane");
79 (*argv)[0] = m_argv0;
80 for(Integer i=0; i<nb_arg; ++i )
81 (*argv)[i+1] = (char*)m_args[i].localstr();
82 m_argv = argv;
83 }
84
85 Impl()
86 : m_nb_ref(0)
87 , m_args()
88 , m_argc(nullptr)
89 , m_argv(nullptr)
90 , m_need_destroy(true)
91 , m_need_help(false)
92 {
93 m_argc_orig = new int;
94 m_argc = m_argc_orig;
95 *m_argc = 1;
96
97 m_argv_orig = new char**;
98 char*** argv = m_argv_orig;
99 *argv = new char*[1];
100 m_argv0 = ::strdup("arcane");
101 (*argv)[0] = m_argv0;
102 m_argv = argv;
103 }
104 ~Impl()
105 {
106 if (m_need_destroy){
107 delete m_argc_orig;
108 if (m_argv_orig)
109 delete[] (*m_argv_orig);
110 delete m_argv_orig;
111 ::free(m_argv0);
112 }
113 }
114 public:
115 void addReference() { ++m_nb_ref; }
116 void removeReference()
117 {
118 // Décrémente et retourne la valeur d'avant.
119 // Si elle vaut 1, cela signifie qu'on n'a plus de références
120 // sur l'objet et qu'il faut le détruire.
121 Int32 v = std::atomic_fetch_add(&m_nb_ref,-1);
122 if (v==1)
123 delete this;
124 }
125 void parseParameters(const CommandLineArguments& command_line_args)
126 {
127 // On ne récupère que les arguments du style:
128 // -A,x=b,y=c
129 StringList args;
130 command_line_args.fillArgs(args);
131 if (args.count() == 1) {
132 m_need_help = true;
133 return;
134 }
135 for (Integer i = 0, n = args.count(); i < n; ++i) {
136 String arg = args[i];
137 if (arg.startsWith("-h") || arg.startsWith("--help")) {
138 m_need_help = true;
139 // TODO AH : Voir pour faire une aide : "-h=module".
140 continue;
141 }
142 if (!arg.startsWith("-A,"))
143 continue;
144 String arg_value = arg.substring(3);
145 if (arg_value.null() || arg_value.empty())
146 continue;
147 UniqueArray<String> values;
148 arg_value.split(values,',');
149 for( const auto& x : values ){
150 m_parameter_list.addParameterLine(x);
151 }
152 }
153 }
154 String getParameter(const String& param_name)
155 {
156 return m_parameter_list.getParameterOrNull(param_name);
157 }
158
159 void fillParameters(StringList& param_names,StringList& values) const
160 {
161 m_parameter_list.fillParameters(param_names,values);
162 }
163
164 bool needHelp() const
165 {
166 return m_need_help;
167 }
168
169 public:
170 std::atomic<Int32> m_nb_ref;
171 StringList m_args;
172 int* m_argc; //!< Nombre d'arguments de la ligne de commande
173 char*** m_argv; //!< Tableau des arguments de la ligne de commande
174 int* m_argc_orig = nullptr;
175 char*** m_argv_orig = nullptr;
176 char* m_argv0 = nullptr;
177 bool m_need_destroy;
178 bool m_need_help;
179 ParameterList m_parameter_list;
180};
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185CommandLineArguments::
186CommandLineArguments(int* argc,char*** argv)
187: m_p(new Impl(argc,argv))
188{
189 m_p->parseParameters(*this);
190}
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
195CommandLineArguments::
196CommandLineArguments()
197: m_p(new Impl())
198{
199 m_p->parseParameters(*this);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205CommandLineArguments::
206CommandLineArguments(const StringList& aargs)
207: m_p(new Impl(aargs))
208{
209 m_p->parseParameters(*this);
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215CommandLineArguments::
216CommandLineArguments(const CommandLineArguments& rhs)
217: m_p(rhs.m_p)
218{
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224CommandLineArguments& CommandLineArguments::
225operator=(const CommandLineArguments& rhs)
226{
227 m_p = rhs.m_p;
228 return (*this);
229}
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
234CommandLineArguments::
235~CommandLineArguments()
236{
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242int* CommandLineArguments::
243commandLineArgc() const
244{
245 return m_p->m_argc;
246}
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251char*** CommandLineArguments::
252commandLineArgv() const
253{
254 return m_p->m_argv;
255}
256
257/*---------------------------------------------------------------------------*/
258/*---------------------------------------------------------------------------*/
259
261fillArgs(StringList& aargs) const
262{
263 int nargc = *m_p->m_argc;
264 char** nargv = *m_p->m_argv;
265 aargs.resize(nargc);
266 for( int i=0; i<nargc; ++i )
267 aargs[i] = nargv[i];
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
274getParameter(const String& param_name) const
275{
276 return m_p->getParameter(param_name);
277}
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
281
283addParameterLine(const String& line)
284{
285 m_p->m_parameter_list.addParameterLine(line);
286}
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290
292fillParameters(StringList& param_names,StringList& values) const
293{
294 m_p->fillParameters(param_names,values);
295}
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
299
301parameters() const
302{
303 return m_p->m_parameter_list;
304}
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
310needHelp() const
311{
312 return m_p->needHelp();
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318} // End namespace Arcane
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
Integer count() const
Nombre d'éléments de la collection.
int * m_argc
Nombre d'arguments de la ligne de commande.
char *** m_argv
Tableau des arguments de la ligne de commande.
const ParameterList & parameters() const
Liste des paramètres.
void addParameterLine(const String &line)
Ajoute un paramètre.
bool needHelp() const
Méthode permettant de savoir si l'utilisateur a demandé de l'aide dans la ligne de commande.
void fillArgs(StringList &args) const
Remplit args avec arguments de la ligne de commande.
String getParameter(const String &param_name) const
Récupère le paramètre de nom param_name.
void fillParameters(StringList &param_names, StringList &values) const
Récupère la liste des paramètres et leur valeur.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:509
std::int32_t Int32
Type entier signé sur 32 bits.