X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fcore%2Futil%2FCommandLine.cpp;h=42dfd176b3e71b8ec7490eeb0fbfd64553ced883;hb=5a6cba5fde2b2f538a7515f8293cc0a8d9589dfa;hp=74c34e1461cde32c1cd9d8f0263c217577203ae0;hpb=2032c82d206dd40e35d118242272417431094823;p=anna.git diff --git a/source/core/util/CommandLine.cpp b/source/core/util/CommandLine.cpp index 74c34e1..42dfd17 100644 --- a/source/core/util/CommandLine.cpp +++ b/source/core/util/CommandLine.cpp @@ -1,37 +1,9 @@ -// ANNA - Anna is Not Nothingness Anymore -// -// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo -// -// http://redmine.teslayout.com/projects/anna-suite -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Authors: eduardo.ramos.testillano@gmail.com -// cisco.tierra@gmail.com +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // #include @@ -52,7 +24,7 @@ using namespace anna; // (1) Verifica que la opcion no haya sido registrada previamente. //-------------------------------------------------------------------------------- void CommandLine::add(const char* argumentExpression, Argument::Type type, const char* comment, const bool needValue) -throw() { +{ Guard guard(a_mutex, "CommandLine::add"); std::string arg1 = "", arg2 = ""; @@ -89,12 +61,23 @@ throw() { a_arguments.push_back(new Variable(arg1, arg2, type, comment, needValue)); } +void CommandLine::initialize(const char** argv, const int argc, int positionalArguments) +noexcept(false) { + if (argc < 1) throw RuntimeException("Provided argc < 1 as command-line argv size !", ANNA_FILE_LOCATION); + if (positionalArguments < 0) throw RuntimeException("Provided negative number of positional arguments as command-line initializer", ANNA_FILE_LOCATION); + if (positionalArguments > (argc-1)) throw RuntimeException("Provided positional arguments > (argc - 1) as command-line initializer", ANNA_FILE_LOCATION); + a_positionalArguments = positionalArguments; + a_argv = argv; + a_argc = argc; + a_wasParsed = false; +} + //-------------------------------------------------------------------------------- // Verifica que todos los argumentos declarados como obligatorios estan en la // linea de comandos. //-------------------------------------------------------------------------------- void CommandLine::verify() -throw(RuntimeException) { +noexcept(false) { if(a_argv == NULL) throw RuntimeException("CommandLine was not initialized", ANNA_FILE_LOCATION); @@ -120,7 +103,7 @@ throw(RuntimeException) { // Si el arguemento solicitado no esta en la LC y es opcional devolvera NULL. //-------------------------------------------------------------------------------- const char* CommandLine::getValue(const char* argumentExpression, const bool exitOnFault) -throw() { +{ const char* result = NULL; const Variable* argument = NULL; bool error = true; @@ -159,7 +142,7 @@ throw() { // Auxiliary function: // Returns first no-leading hyphen position -int removeLeadingHyphens(std::string &argv) throw() { +int removeLeadingHyphens(std::string &argv) { int startPos = -1; // Move until no hyphen: for (int i=0; i < argv.size(); i++) @@ -186,10 +169,10 @@ int removeLeadingHyphens(std::string &argv) throw() { // Analize command line to store the arguments //-------------------------------------------------------------------------------- bool CommandLine::analize() -throw() { +{ Variable* variable; bool result = true; - int i = 1; + int i = a_positionalArguments + 1; string aux; if(a_wasParsed == true) // already analyzed @@ -229,7 +212,7 @@ throw() { } const CommandLine::Variable* CommandLine::search(const char *argumentExpression) const -throw() { +{ if (!argumentExpression) return NULL; std::string name1, name2, arg; @@ -255,7 +238,7 @@ throw() { } string CommandLine::Variable::getHelpExpression() const -throw() { +{ std::string long_name, short_name, result = ""; int s1 = a_name1.size(); @@ -283,9 +266,9 @@ throw() { } void CommandLine::printUsage() const -throw() { +{ int i, maxi(a_arguments.size()); - cout << "Use: " << a_argv [0] << " "; + cout << "Usage: " << a_argv [0] << " "; for(i = 0; i < maxi; i ++) cout << a_arguments [i]->asString() << " "; @@ -299,7 +282,7 @@ throw() { } string CommandLine::Variable::asString() const -throw() { +{ string result; result = ((a_type == Argument::Optional) ? "[ " : ""); result += getHelpExpression(); @@ -310,11 +293,14 @@ throw() { } string CommandLine::asString() const -throw() { +{ string result = "Provided command-line parameters:\n\n"; vector ::const_iterator ii, maxii; const char *value; + for(int pos = 1; pos <= a_positionalArguments; pos++) + result += anna::functions::asString("Positional argument [%d]: %s\n", pos, getPositional(pos)); + for(ii = a_arguments.begin(), maxii = a_arguments.end(); ii != maxii; ii ++) { value = (*ii)->getValue(); @@ -329,11 +315,14 @@ throw() { return result; } -xml::Node* CommandLine::asXML(xml::Node* parent) const throw() { +xml::Node* CommandLine::asXML(xml::Node* parent) const { xml::Node* result = parent->createChild("CommandLine"); vector ::const_iterator ii, maxii; const char *value; + for(int pos = 1; pos <= a_positionalArguments; pos++) + result->createAttribute(anna::functions::asString("PositionalArgument_%d", pos).c_str(), getPositional(pos)); + for(ii = a_arguments.begin(), maxii = a_arguments.end(); ii != maxii; ii ++) { value = (*ii)->getValue();