/* Copyright (C) 2000-2004 Code contributed by Greg Collecutt, Joseph Hope and Paul Cochrane This file is part of xmds. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* $Id: xmdsargv.cc,v 1.9 2004/07/13 05:29:38 paultcochrane Exp $ */ /*! @file xmdsargv.cc @brief Command line argument vector parsing classes and methods More detailed explanation... */ #include #include #include #include extern bool debugFlag; // ****************************************************************************** // ****************************************************************************** // xmdsArgv Public // ****************************************************************************** // ****************************************************************************** // ****************************************************************************** xmdsArgv::xmdsArgv( const xmdsSimulation *const yourSimulation, const bool& yourVerboseMode) : xmdsElement(yourSimulation,yourVerboseMode) { if(debugFlag) { printf("xmdsArgv::xmdsArgv\n"); } }; // ****************************************************************************** xmdsArgv::~xmdsArgv() { if(debugFlag) { printf("xmdsArgv::~xmdsArgv\n"); } // destroy xmdsArgs, since they are not managed by the xmdsElement class for(list::const_iterator ppxmdsArg = myArgsList.begin(); ppxmdsArg != myArgsList.end(); ppxmdsArg++) { delete (*ppxmdsArg); } }; // ****************************************************************************** void xmdsArgv::processElement( const Element *const yourElement) { if(debugFlag) { printf("xmdsArgv::processElement\n"); } if(verbose()) { printf("Processing argv element ...\n"); } list anXMLStringList; // ************************************ // find and process arg elements // ************************************ const NodeList* candidateElements; candidateElements = yourElement->getElementsByTagName("arg",0); if(candidateElements->length()==0) { throw xmdsException(yourElement,"at least one argument expected"); } for(unsigned long i=0; ilength(); i++) { const Element* nextElement = dynamic_cast(candidateElements->item(i)); xmdsElement* newxmdsArgElement = createxmdsArgElement(); newxmdsArgElement->processElement(nextElement); } }; // ****************************************************************************** void xmdsArgv::processArgs( const list& argNamesList, const unsigned long& space) const { if(debugFlag) { printf("xmdsArgv::processArgs\n"); } for(list::const_iterator pXMLString = argNamesList.begin(); pXMLString != argNamesList.end(); pXMLString++) { const xmdsArg* nextArg; if(!getArg(*pXMLString,nextArg)) { sprintf(errorMessage(),"Arg '%s' unknown",pXMLString->c_str()); throw xmdsException(errorMessage()); } for(list::const_iterator pXMLString2 = argNamesList.begin(); pXMLString2 != pXMLString; pXMLString2++) { if(*pXMLString == *pXMLString2) { sprintf(errorMessage(),"Duplicate arg '%s'",pXMLString->c_str()); throw xmdsException(errorMessage()); } } if(verbose()) { printf("adding arg '%s' to accessible args list\n",pXMLString->c_str()); } } }; // ****************************************************************************** bool xmdsArgv::getArg( const XMLString& argName, const xmdsArg*& theArg) const { if(debugFlag) { printf("xmdsArgv::getArg\n"); } theArg=0; for(list::const_iterator ppxmdsArg = myArgsList.begin(); ppxmdsArg != myArgsList.end(); ppxmdsArg++) { if(*(*ppxmdsArg)->name()==argName) { theArg = *ppxmdsArg; return 1; } } return 0; }; // ****************************************************************************** void xmdsArgv::argNames( list& argNamesList) const { if(debugFlag) { printf("xmdsArgv::argNames\n"); } argNamesList.clear(); for(list::const_iterator ppxmdsArg = myArgsList.begin(); ppxmdsArg != myArgsList.end(); ppxmdsArg++) { argNamesList.push_back(*(*ppxmdsArg)->name()); } }; // ****************************************************************************** xmdsArg* xmdsArgv::createxmdsArg() { if(debugFlag) { printf("xmdsArgv::createxmdsArg\n"); } xmdsArg* newArg = new xmdsArg(this); myArgsList.push_back(newArg); return newArg; }; // ****************************************************************************** // ****************************************************************************** // xmdsArgv protected // ****************************************************************************** // ****************************************************************************** // ****************************************************************************** // ****************************************************************************** // xmdsArgv private // ****************************************************************************** // ****************************************************************************** // ****************************************************************************** xmdsArgElement* xmdsArgv::createxmdsArgElement() { if(debugFlag) { printf("xmdsArgv::createxmdsArgElement\n"); } xmdsArgElement* newArgElement = new xmdsArgElement(simulation(),verbose(),this); myArgsList.push_back(newArgElement); return newArgElement; };