/** Add specified analysis to the analysis list with given args and * DataSetList. */ int AnalysisList::AddAnalysis(DispatchObject::DispatchAllocatorType Alloc, ArgList& argIn, DataSetList* DSLin, DataFileList* DFLin) { Analysis* ana = (Analysis*)Alloc(); // Attempt to set up analysis if (ana->Setup( argIn, DSLin, DFLin, debug_) != Analysis::OK) { mprinterr("Error: Could not setup analysis [%s]\n", argIn.Command()); delete ana; return 1; } analysisList_.push_back( ana ); analysisCmd_.push_back( argIn.ArgLine() ); analysisStatus_.push_back( SETUP ); if (argIn.CheckForMoreArgs()) return 1; return 0; }
// ActionList::AddAction() int ActionList::AddAction(DispatchObject::DispatchAllocatorType Alloc, ArgList& argIn, TopologyList* PFL, DataSetList* DSL, DataFileList* DFL) { int err = 0; if (actionsAreSilent_) SetWorldSilent( true ); Action* act = (Action*)Alloc(); // Attempt to initialize action if ( act->Init( argIn, PFL, DSL, DFL, debug_ ) != Action::OK ) { mprinterr("Error: Could not initialize action [%s]\n", argIn.Command()); delete act; err = 1; } else { actionlist_.push_back( act ); actioncmd_.push_back( argIn.ArgLine() ); actionAlloc_.push_back( Alloc ); actionstatus_.push_back( INIT ); if (argIn.CheckForMoreArgs()) err = 1; } if (actionsAreSilent_) SetWorldSilent( false ); return err; }
/** Replace all variables in given ArgList with their values. */ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& DSL, int debug) { if (debug > 0) mprintf("DEBUG: Before variable replacement: [%s]\n", argIn.ArgLine()); ArgList modCmd = argIn; for (int n = 0; n < modCmd.Nargs(); n++) { size_t pos = modCmd[n].find("$"); while (pos != std::string::npos) { // Argument is/contains a variable. Find first non-alphanumeric char size_t len = 1; for (size_t pos1 = pos+1; pos1 < modCmd[n].size(); pos1++, len++) if (!isalnum(modCmd[n][pos1])) break; std::string var_in_arg = modCmd[n].substr(pos, len); // See if variable occurs in CurrentVars_ Varray::const_iterator vp = CurrentVars_.begin(); for (; vp != CurrentVars_.end(); ++vp) if (vp->first == var_in_arg) break; // If found replace with value from CurrentVars_ if (vp != CurrentVars_.end()) { if (debug > 0) mprintf("DEBUG: Replaced variable '%s' with value '%s'\n", var_in_arg.c_str(), vp->second.c_str()); std::string arg = modCmd[n]; arg.replace(pos, vp->first.size(), vp->second); modCmd.ChangeArg(n, arg); } else { // Not found in CurrentVars_; see if this is a DataSet. for (size_t pos1 = pos+len; pos1 < modCmd[n].size(); pos1++, len++) if (!isalnum(modCmd[n][pos1]) && modCmd[n][pos1] != '[' && modCmd[n][pos1] != ':' && modCmd[n][pos1] != ']' && modCmd[n][pos1] != '_' && modCmd[n][pos1] != '-' && modCmd[n][pos1] != '%') break; var_in_arg = modCmd[n].substr(pos+1, len-1); DataSet* ds = DSL.GetDataSet( var_in_arg ); if (ds == 0) { mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); return ArgList(); } else { if (ds->Type() != DataSet::STRING && ds->Group() != DataSet::SCALAR_1D) { mprinterr("Error: Only 1D data sets supported.\n"); return ArgList(); } if (ds->Size() < 1) { mprinterr("Error: Set is empty.\n"); return ArgList(); } if (ds->Size() > 1) mprintf("Warning: Only using first value.\n"); std::string value; if (ds->Type() == DataSet::STRING) value = (*((DataSet_string*)ds))[0]; else value = doubleToString(((DataSet_1D*)ds)->Dval(0)); if (debug > 0) mprintf("DEBUG: Replaced variable '$%s' with value '%s' from DataSet '%s'\n", var_in_arg.c_str(), value.c_str(), ds->legend()); std::string arg = modCmd[n]; arg.replace(pos, var_in_arg.size()+1, value); modCmd.ChangeArg(n, arg); } } pos = modCmd[n].find("$"); } // END loop over this argument } return modCmd; }