1 // ANNA - Anna is Not 'N' Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // https://bitbucket.org/testillano/anna
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
17 // * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_core_util_CommandLine_hpp
38 #define anna_core_util_CommandLine_hpp
44 #include <anna/core/functions.hpp>
45 #include <anna/core/Singleton.hpp>
49 class RuntimeException;
57 Facilita la recogida de parametros desde la linea de comandos. Tambien
58 verifica que todos los parametros necesarios han sido indicados por el
61 class CommandLine : public Singleton <CommandLine> {
64 Define los tipos de argumento
67 struct Argument { enum Type { Mandatory = 0, Optional}; };
71 @return la lista de cadenas indicadas en la linea de comandos al ejecutar este programa.
72 Mientras que no invoquemos al metodo #initialize devolvera NULL.
74 const char** getArgv() const throw() { return a_argv; }
77 @return El numero de parametros indicados en la linea de comandos al ejecutar este programa.
79 int getArgc() const throw() { return a_argc; }
85 Establece la informacion necesaria para analizar la linea de comandos
86 indicada por el usuario. Debe invocarse antes que cualquier otro metodo
87 relacionado con la obtencion/comprobacion de valor de la linea de comandos.
89 Recibe una copia de los parametros que los recibidos por el metodo 'main'.
91 @param argv Conjunto de cadenas que se reciben de la linea de comandos.
92 @param argc Numero de cadenas recibidas.
94 void initialize(const char** argv, const int argc) throw() {
101 Registra un argumentName que sera recocido por nuestra aplicacion.
103 Se pueden indicar tantos argumentNames como sea necesario.
105 @param argumentName Nombre del argumento.
106 @param type Tipo de argumento. Ver Variable#Type.
107 @param comment Explicacion acerca de cometido de este argumento.
108 @param needValue Indica si el parametro que estamos definido debe tener un
109 valor adicional. Por ejemplo un parametro "usuario" deberia tener un valor adicional
110 que sea el valor que toma.
112 void add(const char* argumentName, Argument::Type type, const char* comment, const bool needValue = true) throw();
115 Obtiene el valor asociado al argumento recibido como parametro.
116 El valor devuelto puede ser NULL en caso de que el argumento no sea
117 obligatorio y no este en la linea de comandos.
118 Si el argumento es obligatorio y no este en la linea de comandos o
119 no tiene valor asociado la ejecucion del programa TERMINA inmediatamente.
121 @param argumentName Nombre del argumento del que deseamos obtener el valor.
122 @param exitOnFault Indica el funcionamiento del metodo en caso de que el
123 argumento solicitado no halla sido indicado. Si el parametro no existe
124 si vale @em true la aplicacion terminara, si vale @em false devolvera NULL.
126 @return Valor asociadoal argumento recibido como parametro. Puede ser NULL.
128 const char* getValue(const char* argumentName, const bool exitOnFault = true) throw();
131 Obtiene el valor asociado al argumento recibido, pero convirtiendo a
132 numero el valor obtenido por #getValue.
134 @param argumentName Nombre del argumento del que deseamos obtener el valor.
136 @return Valor numerico del valor devuelto por #getValue.
138 int getIntegerValue(const char* argumentName) throw() { return atoi(getValue(argumentName)); }
141 Comprueba si el argumento recibido como parametro estña presente en la linea de
144 @param argumentName Nombre del argumento del que deseamos obtener el valor.
146 @return true si el argumento esta en la linea de comandos y false en otro caso.
148 bool exists(const char* argumentName) throw() { return (getValue(argumentName, false) != NULL) ? true : false; }
151 Comprueba la linea de comandos del programa para verificar que coincide con los argumentos
152 registrados por nuestra aplicacion:
154 @li Verifica que los parametros obligatorios estan en la linea de comandos.
155 @li Verifica que los valores de los argumento son correctos de forma que si un parametro
156 debe llevar un valor asociado este esta presente y que si no debe llevarlo no esta.
157 El orden en que aparezcan los argumento en la linea de comandos es indiferente a la hora de
158 hacer las comprobacion.
160 Si hay algun fallo en la linea de comandos establecida al ejecutar el programa visualiza un
161 resumen con los parametros soportados y la ejecucion del programa finaliza.
163 void verify() throw(RuntimeException);
167 Class string representation
168 \return String with relevant information for this instance.
170 std::string asString() const throw();
173 Class xml representation
174 \param parent Parent XML node on which hold this instance information.
175 \return XML document with relevant information for this instance.
177 xml::Node* asXML(xml::Node* parent) const throw();
186 Variable(const char* name, const Argument::Type type, const char* comment, const bool needValue = true) :
187 a_name(name), a_type(type), a_comment(comment), a_needValue(needValue),
188 a_isOn(false), a_value(NULL) {
190 virtual ~Variable() { if(a_value) free(a_value); }
193 const std::string& getName() const throw() { return a_name; }
194 const char* getValue() const throw() { return a_value; }
195 const char* getComment() const throw() { return a_comment; }
196 bool getNeedValue() const throw() { return a_needValue; }
197 bool getIsOn() const throw() { return a_isOn; }
198 Argument::Type getType() const throw() { return a_type; }
201 void setValue(const char* value) throw() { a_value = (value == NULL) ? NULL : strdup(value); }
202 void setIsOn(const bool isOn) throw() { a_isOn = isOn; }
205 std::string asString() const throw();
209 const char* a_comment;
211 Argument::Type a_type;
219 std::vector <Variable*> a_arguments;
221 CommandLine() : a_argv(NULL), a_argc(0) {;}
223 bool analize() throw();
224 const Variable* search(const char *argumentName) const throw();
225 void printUsage() const throw();
227 friend class Singleton <CommandLine>;