Arcane  v3.15.3.0
Documentation développeur
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:
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), m_args(), m_argc(argc), m_argv(argv), m_need_destroy(false)
51 {
52 }
53
54 Impl(const StringList& aargs)
55 : m_nb_ref(0), m_args(aargs), m_argc(nullptr), m_argv(nullptr), m_need_destroy(true)
56 {
57 Integer nb_arg = aargs.count();
58 m_argc_orig = new int;
59 m_argc = m_argc_orig;
60 *m_argc = nb_arg+1;
61
62 m_argv_orig = new char**;
63 char*** argv = m_argv_orig;
64 *argv = new char*[nb_arg+1];
65 m_argv0 = ::strdup("arcane");
66 (*argv)[0] = m_argv0;
67 for(Integer i=0; i<nb_arg; ++i )
68 (*argv)[i+1] = (char*)m_args[i].localstr();
69 m_argv = argv;
70 }
71
72 Impl()
73 : m_nb_ref(0), m_args(), m_argc(nullptr), m_argv(nullptr), m_need_destroy(true)
74 {
75 m_argc_orig = new int;
76 m_argc = m_argc_orig;
77 *m_argc = 1;
78
79 m_argv_orig = new char**;
80 char*** argv = m_argv_orig;
81 *argv = new char*[1];
82 m_argv0 = ::strdup("arcane");
83 (*argv)[0] = m_argv0;
84 m_argv = argv;
85 }
86 ~Impl()
87 {
88 if (m_need_destroy){
89 delete m_argc_orig;
90 if (m_argv_orig)
91 delete[] (*m_argv_orig);
92 delete m_argv_orig;
93 ::free(m_argv0);
94 }
95 }
96 public:
97 void addReference() { ++m_nb_ref; }
98 void removeReference()
99 {
100 // Décrémente et retourne la valeur d'avant.
101 // Si elle vaut 1, cela signifie qu'on n'a plus de références
102 // sur l'objet et qu'il faut le détruire.
103 Int32 v = std::atomic_fetch_add(&m_nb_ref,-1);
104 if (v==1)
105 delete this;
106 }
107 void parseParameters(const CommandLineArguments& command_line_args)
108 {
109 // On ne récupère que les arguments du style:
110 // -A,x=b,y=c
111 StringList args;
112 command_line_args.fillArgs(args);
113 for( Integer i=0, n=args.count(); i<n; ++i ){
114 String arg = args[i];
115 if (!arg.startsWith("-A,"))
116 continue;
117 String arg_value = arg.substring(3);
118 if (arg_value.null() || arg_value.empty())
119 continue;
120 UniqueArray<String> values;
121 arg_value.split(values,',');
122 for( const auto& x : values ){
123 m_parameter_list.addParameterLine(x);
124 }
125 }
126 }
127 String getParameter(const String& param_name)
128 {
129 return m_parameter_list.getParameterOrNull(param_name);
130 }
131
132 void fillParameters(StringList& param_names,StringList& values) const
133 {
134 m_parameter_list.fillParameters(param_names,values);
135 }
136
137 public:
138 std::atomic<Int32> m_nb_ref;
139 StringList m_args;
140 int* m_argc;
141 char*** m_argv;
142 int* m_argc_orig = nullptr;
143 char*** m_argv_orig = nullptr;
144 char* m_argv0 = nullptr;
145 bool m_need_destroy;
146 ParameterList m_parameter_list;
147};
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
152CommandLineArguments::
153CommandLineArguments(int* argc,char*** argv)
154: m_p(new Impl(argc,argv))
155{
156 m_p->parseParameters(*this);
157}
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162CommandLineArguments::
163CommandLineArguments()
164: m_p(new Impl())
165{
166 m_p->parseParameters(*this);
167}
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172CommandLineArguments::
173CommandLineArguments(const StringList& aargs)
174: m_p(new Impl(aargs))
175{
176 m_p->parseParameters(*this);
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
182CommandLineArguments::
183CommandLineArguments(const CommandLineArguments& rhs)
184: m_p(rhs.m_p)
185{
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190
191CommandLineArguments& CommandLineArguments::
192operator=(const CommandLineArguments& rhs)
193{
194 m_p = rhs.m_p;
195 return (*this);
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200
201CommandLineArguments::
202~CommandLineArguments()
203{
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209int* CommandLineArguments::
210commandLineArgc() const
211{
212 return m_p->m_argc;
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218char*** CommandLineArguments::
219commandLineArgv() const
220{
221 return m_p->m_argv;
222}
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
229{
230 int nargc = *m_p->m_argc;
231 char** nargv = *m_p->m_argv;
232 aargs.resize(nargc);
233 for( int i=0; i<nargc; ++i )
234 aargs[i] = nargv[i];
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
241getParameter(const String& param_name) const
242{
243 return m_p->getParameter(param_name);
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
250addParameterLine(const String& line)
251{
252 m_p->m_parameter_list.addParameterLine(line);
253}
254
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257
260{
261 m_p->fillParameters(param_names,values);
262}
263
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
268parameters() const
269{
270 return m_p->m_parameter_list;
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
275
276} // End namespace Arcane
277
278/*---------------------------------------------------------------------------*/
279/*---------------------------------------------------------------------------*/
280
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.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Liste de paramètres.
void fillParameters(StringList &param_names, StringList &values) const
Récupère la liste des paramètres et leur valeur.
bool addParameterLine(const String &line)
Analyse la ligne line.
String getParameterOrNull(const String &param_name) const
Récupère le paramètre de nom param_name.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:599