⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmdsargelement.cc

📁 XMDS is a code generator that integrates equations. You write them down in human readable form in a
💻 CC
字号:
/* 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: xmdsargelement.cc,v 1.11 2004/07/13 08:46:23 paultcochrane Exp $*//*! @file xmdsargelement.cc  @brief Command line argument parsing classes and methods for argument elements  More detailed explanation...*/#include<xmlbasics.h>#include<dom3.h>#include<xmdsutils.h>#include<xmdsclasses.h>// ******************************************************************************// ******************************************************************************//                              xmdsArgElement public// ******************************************************************************// ******************************************************************************extern bool debugFlag;long nxmdsArgElements=0;  //!< Number of xmds argument element objects// ******************************************************************************xmdsArgElement::xmdsArgElement(			       const xmdsSimulation *const yourSimulation,			       const bool& yourVerboseMode,			       const xmdsArgv *const yourArgv) :  xmdsArg(yourArgv),  xmdsElement(yourSimulation,yourVerboseMode) {  if(debugFlag) {    nxmdsArgElements++;    printf("xmdsArgElement::xmdsArgElement\n");    printf("nxmdsArgElements=%li\n",nxmdsArgElements);  }};// ******************************************************************************xmdsArgElement::~xmdsArgElement() {  if(debugFlag) {    nxmdsArgElements--;    printf("xmdsArgElement::~xmdsArgElement\n");    printf("nxmdsArgElements=%li\n",nxmdsArgElements);  }};// ******************************************************************************void xmdsArgElement::processElement(				    const Element *const yourElement) {  if(debugFlag) {    printf("xmdsArgElement::processElement\n");  }  list<XMLString> anXMLStringList;  string aString;  if(verbose()) {    printf("Processing arg element ...\n");  }  // ************************************  // find name  getAssignmentStrings(yourElement,"name",1,1,anXMLStringList);  const xmdsArg* possibleTwin;  if(argv()->getArg(*anXMLStringList.begin(),possibleTwin)) {    sprintf(errorMessage(),"an arg of name '%s' already exists in this argv",anXMLStringList.begin()->c_str());    throw xmdsException(yourElement,errorMessage());  }  // I think by leaving this here, we can check for duplicate names  setName(*anXMLStringList.begin());  XMLString xmltempString = *anXMLStringList.begin();  string nameString = ( string ) xmltempString.c_str();  simulation()->argStruct()->nameList.push_back(nameString);  if(verbose()) {    printf("argument name is '%s'\n",nameString.c_str());  }  // now I need to work out what the short option should be  string testChar;  bool shortOptExists;  for (unsigned long int j=0; j<nameString.length(); j++) {    shortOptExists = false;    testChar = nameString[j];    list<string>::const_iterator ishort = simulation()->argStruct()->shortOptionList.begin();    for (unsigned long int i=0; i<simulation()->argStruct()->shortOptionList.size(); i++) {      if (verbose()) {	printf("Testing %s with %s against %s\n",nameString.c_str(),testChar.c_str(),ishort->c_str());      }      // the short option can't be 'h' since this is used to output the help and usage information      if ((testChar.find(*ishort) != string::npos) || (testChar.find("h") != string::npos)) {	if (verbose()) {	  printf("short option '%s' already exists\n",testChar.c_str());	}	// it exists already, set a flag to go around again.	shortOptExists = true;      }      if (testChar.find(*ishort) == string::npos && shortOptExists) {	sprintf(errorMessage(),		"Haven't been able to make a short option for '%s'.\n"		"Please use another name and retry.\n",		nameString.c_str());	throw xmdsException(yourElement,errorMessage());      }      ishort++;    }    if (!shortOptExists) {      // if get to here without the option turning up, break.      if (verbose()) {	printf("Using %s as short option for %s\n",testChar.c_str(),nameString.c_str());      }      simulation()->argStruct()->shortOptionList.push_back(testChar);      break;    }  }  // ************************************  // find type  getAssignmentStrings(yourElement,"type",1,0,anXMLStringList);  // now biff the XMLStringList into an XMLString and set that to the argument type  XMLString xmltypeString, spaceString;  spaceString = " ";  list<XMLString>::const_iterator iType;  iType = anXMLStringList.begin();  for (unsigned long int i=0; i<anXMLStringList.size(); i++) {    xmltypeString += *iType;    xmltypeString += spaceString;    iType++;  }  string typeString = ( string ) xmltypeString.c_str();  simulation()->argStruct()->typeList.push_back(typeString);  if (debugFlag) {    printf("typeString is: %s\n",typeString.c_str());  }  if (verbose()) {    printf("argument type is '%s'\n",typeString.c_str());  }  // now need to define the conversion function string  // e.g. double -> atof()  if (typeString.find("double") != string::npos) {    // setting type to double    if (verbose()) {      printf("typeString matches 'double': using atof() as type conversion\n");    }    simulation()->argStruct()->typeConversionList.push_back("atof");  }  else if (typeString.find("float") != string::npos) {    // setting type to double anyway...  (should I really do this?)    if (verbose()) {      printf("typeString matches 'float': using atof() as type conversion\n");    }    simulation()->argStruct()->typeConversionList.push_back("atof");  }  else if (typeString.find("string") != string::npos) {    // setting type to string    if (verbose()) {      printf("typeString matches 'string': no need for type conversion\n");    }    simulation()->argStruct()->typeConversionList.push_back("");  }  else if (typeString.find("char") != string::npos) {    // setting type to char *    if (verbose()) {      printf("typeString matches 'char': no need for type conversion\n");    }    simulation()->argStruct()->typeConversionList.push_back("");  }  else if (typeString.find("int") != string::npos) {    // setting type to int    if (verbose()) {      printf("typeString matches 'int': using atoi() as type conversion\n");    }    simulation()->argStruct()->typeConversionList.push_back("atoi");  }  else {    printf("Hmmm, I don't know how your type should be converted\n");    printf("Hoping that double is ok...\n");    simulation()->argStruct()->typeConversionList.push_back("atof");  }  // ************************************  // find default_value  getAssignmentStrings(yourElement,"default_value",1,1,anXMLStringList);  xmltempString = *anXMLStringList.begin();  string defaultValueString = ( string ) xmltempString.c_str();  simulation()->argStruct()->defaultValueList.push_back(defaultValueString);  if (verbose()) {    printf("argument default value is '%s'\n",defaultValueString.c_str());  }};// ******************************************************************************// ******************************************************************************//                              xmdsArgElement private// ******************************************************************************// ******************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -