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