Arcane  v3.14.10.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-2022 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-2022 */
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 */
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 ~Impl()
72 {
73 if (m_need_destroy){
74 delete m_argc_orig;
75 if (m_argv_orig)
76 delete[] (*m_argv_orig);
77 delete m_argv_orig;
78 ::free(m_argv0);
79 }
80 }
81 public:
82 void addReference() { ++m_nb_ref; }
83 void removeReference()
84 {
85 // Décrémente et retourne la valeur d'avant.
86 // Si elle vaut 1, cela signifie qu'on n'a plus de références
87 // sur l'objet et qu'il faut le détruire.
88 Int32 v = std::atomic_fetch_add(&m_nb_ref,-1);
89 if (v==1)
90 delete this;
91 }
92 void parseParameters(const CommandLineArguments& command_line_args)
93 {
94 // On ne récupère que les arguments du style:
95 // -A,x=b,y=c
96 StringList args;
97 command_line_args.fillArgs(args);
98 for( Integer i=0, n=args.count(); i<n; ++i ){
99 String arg = args[i];
100 if (!arg.startsWith("-A,"))
101 continue;
102 String arg_value = arg.substring(3);
103 if (arg_value.null() || arg_value.empty())
104 continue;
105 UniqueArray<String> values;
106 arg_value.split(values,',');
107 for( const auto& x : values ){
108 m_parameter_list.addParameterLine(x);
109 }
110 }
111 }
112 String getParameter(const String& param_name)
113 {
114 return m_parameter_list.getParameterOrNull(param_name);
115 }
116
117 void fillParameters(StringList& param_names,StringList& values) const
118 {
119 m_parameter_list.fillParameters(param_names,values);
120 }
121
122 public:
123 std::atomic<Int32> m_nb_ref;
124 StringList m_args;
125 int* m_argc; //!< Nombre d'arguments de la ligne de commande
126 char*** m_argv; //!< Tableau des arguments de la ligne de commande
127 int* m_argc_orig = nullptr;
128 char*** m_argv_orig = nullptr;
129 char* m_argv0 = nullptr;
130 bool m_need_destroy;
131 ParameterList m_parameter_list;
132};
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
138CommandLineArguments(int* argc,char*** argv)
139: m_p(new Impl(argc,argv))
140{
141 m_p->parseParameters(*this);
142}
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
149: m_p(new Impl(aargs))
150{
151 m_p->parseParameters(*this);
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
158CommandLineArguments(const CommandLineArguments& rhs)
159: m_p(rhs.m_p)
160{
161}
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166CommandLineArguments& CommandLineArguments::
167operator=(const CommandLineArguments& rhs)
168{
169 m_p = rhs.m_p;
170 return (*this);
171}
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
176CommandLineArguments::
177~CommandLineArguments()
178{
179}
180
181/*---------------------------------------------------------------------------*/
182/*---------------------------------------------------------------------------*/
183
184int* CommandLineArguments::
185commandLineArgc() const
186{
187 return m_p->m_argc;
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193char*** CommandLineArguments::
194commandLineArgv() const
195{
196 return m_p->m_argv;
197}
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
201
203fillArgs(StringList& aargs) const
204{
205 int nargc = *m_p->m_argc;
206 char** nargv = *m_p->m_argv;
207 aargs.resize(nargc);
208 for( int i=0; i<nargc; ++i )
209 aargs[i] = nargv[i];
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
216getParameter(const String& param_name) const
217{
218 return m_p->getParameter(param_name);
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
225addParameterLine(const String& line)
226{
227 m_p->m_parameter_list.addParameterLine(line);
228}
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
234fillParameters(StringList& param_names,StringList& values) const
235{
236 m_p->fillParameters(param_names,values);
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
243parameters() const
244{
245 return m_p->m_parameter_list;
246}
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251} // End namespace Arcane
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255
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.
const ParameterList & parameters() const
Liste des paramètres.
void addParameterLine(const String &line)
Ajoute un paramètre.
CommandLineArguments(int *argc, char ***argv)
Créé une instance à partir des arguments (argc,argv)
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.
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:667