Path: blob/devel/ElmerGUI/netgen/libsrc/general/flags.cpp
3206 views
/**************************************************************************/1/* File: flags.cc */2/* Author: Joachim Schoeberl */3/* Date: 10. Oct. 96 */4/**************************************************************************/56/*7Datatype Flags8*/910#include <mystdlib.h>11#include <myadt.hpp>1213namespace netgen14{15//using namespace netgen;1617Flags :: Flags ()18{19;20}2122Flags :: ~Flags ()23{24DeleteFlags ();25}2627void Flags :: DeleteFlags ()28{29for (int i = 0; i < strflags.Size(); i++)30delete [] strflags[i];31for (int i = 0; i < numlistflags.Size(); i++)32delete numlistflags[i];33strflags.DeleteAll();34numflags.DeleteAll();35defflags.DeleteAll();36strlistflags.DeleteAll();37numlistflags.DeleteAll();38}3940void Flags :: SetFlag (const char * name, const char * val)41{42char * hval = new char[strlen (val) + 1];43strcpy (hval, val);44strflags.Set (name, hval);45}4647void Flags :: SetFlag (const char * name, double val)48{49numflags.Set (name, val);50}5152void Flags :: SetFlag (const char * name)53{54defflags.Set (name, 1);55}565758void Flags :: SetFlag (const char * name, const ARRAY<char*> & val)59{60ARRAY<char*> * strarray = new ARRAY<char*>;61for (int i = 1; i <= val.Size(); i++)62{63strarray->Append (new char[strlen(val.Get(i))+1]);64strcpy (strarray->Last(), val.Get(i));65}66strlistflags.Set (name, strarray);67}6869void Flags :: SetFlag (const char * name, const ARRAY<double> & val)70{71ARRAY<double> * numarray = new ARRAY<double>;72for (int i = 1; i <= val.Size(); i++)73numarray->Append (val.Get(i));74numlistflags.Set (name, numarray);75}767778798081const char *82Flags :: GetStringFlag (const char * name, const char * def) const83{84if (strflags.Used (name))85return strflags.Get(name);86else87return def;88}8990double Flags :: GetNumFlag (const char * name, double def) const91{92if (numflags.Used (name))93return numflags.Get(name);94else95return def;96}9798const double * Flags :: GetNumFlagPtr (const char * name) const99{100if (numflags.Used (name))101return & ((SYMBOLTABLE<double>&)numflags).Elem(name);102else103return NULL;104}105106double * Flags :: GetNumFlagPtr (const char * name)107{108if (numflags.Used (name))109return & ((SYMBOLTABLE<double>&)numflags).Elem(name);110else111return NULL;112}113114bool Flags :: GetDefineFlag (const char * name) const115{116return defflags.Used (name);117}118119120const ARRAY<char*> &121Flags :: GetStringListFlag (const char * name) const122{123if (strlistflags.Used (name))124return *strlistflags.Get(name);125else126{127static ARRAY<char*> hstra(0);128return hstra;129}130}131132const ARRAY<double> &133Flags ::GetNumListFlag (const char * name) const134{135if (numlistflags.Used (name))136return *numlistflags.Get(name);137else138{139static ARRAY<double> hnuma(0);140return hnuma;141}142}143144145bool Flags :: StringFlagDefined (const char * name) const146{147return strflags.Used (name);148}149150bool Flags :: NumFlagDefined (const char * name) const151{152return numflags.Used (name);153}154155bool Flags :: StringListFlagDefined (const char * name) const156{157return strlistflags.Used (name);158}159160bool Flags :: NumListFlagDefined (const char * name) const161{162return numlistflags.Used (name);163}164165166void Flags :: SaveFlags (const char * filename) const167{168int i;169ofstream outfile (filename);170171for (i = 1; i <= strflags.Size(); i++)172outfile << strflags.GetName(i) << " = " << strflags.Get(i) << endl;173for (i = 1; i <= numflags.Size(); i++)174outfile << numflags.GetName(i) << " = " << numflags.Get(i) << endl;175for (i = 1; i <= defflags.Size(); i++)176outfile << defflags.GetName(i) << endl;177}178179180181void Flags :: PrintFlags (ostream & ost) const182{183int i;184185for (i = 1; i <= strflags.Size(); i++)186ost << strflags.GetName(i) << " = " << strflags.Get(i) << endl;187for (i = 1; i <= numflags.Size(); i++)188ost << numflags.GetName(i) << " = " << numflags.Get(i) << endl;189for (i = 1; i <= defflags.Size(); i++)190ost << defflags.GetName(i) << endl;191}192193194void Flags :: LoadFlags (const char * filename)195{196char name[100], str[100];197char ch;198double val;199ifstream infile(filename);200201// (*logout) << "Load flags from " << filename << endl << endl;202while (infile.good())203{204infile >> name;205if (strlen (name) == 0) break;206207if (name[0] == '/' && name[1] == '/')208{209// (*logout) << "comment: ";210ch = 0;211while (ch != '\n' && infile.good())212{213ch = infile.get();214// (*logout) << ch;215}216continue;217}218219// (*logout) << name;220ch = 0;221infile >> ch;222if (ch != '=')223{224// (*logout) << endl;225infile.putback (ch);226SetFlag (name);227}228else229{230infile >> val;231if (!infile.good())232{233infile.clear();234infile >> str;235SetFlag (name, str);236// (*logout) << " = " << str << endl;237}238else239{240SetFlag (name, val);241// (*logout) << " = " << val << endl;242}243}244}245// (*logout) << endl;246}247248249void Flags :: SetCommandLineFlag (const char * st)250{251// cout << "clflag = " << st << endl;252istringstream inst( (char *)st);253// istrstream defined with char * (not const char * ?????)254255char name[100];256double val;257258259if (st[0] != '-')260{261cerr << "flag must start with '-'" << endl;262return;263}264265const char * pos = strchr (st, '=');266267if (!pos)268{269// (cout) << "Add def flag: " << st+1 << endl;270SetFlag (st+1);271}272else273{274// cout << "pos = " << pos << endl;275276strncpy (name, st+1, (pos-st)-1);277name[pos-st-1] = 0;278279// cout << "name = " << name << endl;280281pos++;282char * endptr = NULL;283284val = strtod (pos, &endptr);285286// cout << "val = " << val << endl;287288if (endptr == pos)289{290// (cout) << "Add String Flag: " << name << " = " << pos << endl;291SetFlag (name, pos);292}293else294{295// (cout) << "Add Num Flag: " << name << " = " << val << endl;296SetFlag (name, val);297}298}299300301/*302inst >> name;303(*mycout) << "name = " << name << endl;304305ch = 0;306inst >> ch;307if (ch != '=')308{309SetFlag (name);310}311else312{313inst >> val;314if (!inst.good())315{316inst.clear();317inst >> str;318SetFlag (name, str);319(*mycout) << "str = " << str << endl;320}321else322{323SetFlag (name, val);324(*mycout) << "val = " << val << endl;325}326}327*/328}329}330331332