Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/general/flags.cpp
3206 views
1
/**************************************************************************/
2
/* File: flags.cc */
3
/* Author: Joachim Schoeberl */
4
/* Date: 10. Oct. 96 */
5
/**************************************************************************/
6
7
/*
8
Datatype Flags
9
*/
10
11
#include <mystdlib.h>
12
#include <myadt.hpp>
13
14
namespace netgen
15
{
16
//using namespace netgen;
17
18
Flags :: Flags ()
19
{
20
;
21
}
22
23
Flags :: ~Flags ()
24
{
25
DeleteFlags ();
26
}
27
28
void Flags :: DeleteFlags ()
29
{
30
for (int i = 0; i < strflags.Size(); i++)
31
delete [] strflags[i];
32
for (int i = 0; i < numlistflags.Size(); i++)
33
delete numlistflags[i];
34
strflags.DeleteAll();
35
numflags.DeleteAll();
36
defflags.DeleteAll();
37
strlistflags.DeleteAll();
38
numlistflags.DeleteAll();
39
}
40
41
void Flags :: SetFlag (const char * name, const char * val)
42
{
43
char * hval = new char[strlen (val) + 1];
44
strcpy (hval, val);
45
strflags.Set (name, hval);
46
}
47
48
void Flags :: SetFlag (const char * name, double val)
49
{
50
numflags.Set (name, val);
51
}
52
53
void Flags :: SetFlag (const char * name)
54
{
55
defflags.Set (name, 1);
56
}
57
58
59
void Flags :: SetFlag (const char * name, const ARRAY<char*> & val)
60
{
61
ARRAY<char*> * strarray = new ARRAY<char*>;
62
for (int i = 1; i <= val.Size(); i++)
63
{
64
strarray->Append (new char[strlen(val.Get(i))+1]);
65
strcpy (strarray->Last(), val.Get(i));
66
}
67
strlistflags.Set (name, strarray);
68
}
69
70
void Flags :: SetFlag (const char * name, const ARRAY<double> & val)
71
{
72
ARRAY<double> * numarray = new ARRAY<double>;
73
for (int i = 1; i <= val.Size(); i++)
74
numarray->Append (val.Get(i));
75
numlistflags.Set (name, numarray);
76
}
77
78
79
80
81
82
const char *
83
Flags :: GetStringFlag (const char * name, const char * def) const
84
{
85
if (strflags.Used (name))
86
return strflags.Get(name);
87
else
88
return def;
89
}
90
91
double Flags :: GetNumFlag (const char * name, double def) const
92
{
93
if (numflags.Used (name))
94
return numflags.Get(name);
95
else
96
return def;
97
}
98
99
const double * Flags :: GetNumFlagPtr (const char * name) const
100
{
101
if (numflags.Used (name))
102
return & ((SYMBOLTABLE<double>&)numflags).Elem(name);
103
else
104
return NULL;
105
}
106
107
double * Flags :: GetNumFlagPtr (const char * name)
108
{
109
if (numflags.Used (name))
110
return & ((SYMBOLTABLE<double>&)numflags).Elem(name);
111
else
112
return NULL;
113
}
114
115
bool Flags :: GetDefineFlag (const char * name) const
116
{
117
return defflags.Used (name);
118
}
119
120
121
const ARRAY<char*> &
122
Flags :: GetStringListFlag (const char * name) const
123
{
124
if (strlistflags.Used (name))
125
return *strlistflags.Get(name);
126
else
127
{
128
static ARRAY<char*> hstra(0);
129
return hstra;
130
}
131
}
132
133
const ARRAY<double> &
134
Flags ::GetNumListFlag (const char * name) const
135
{
136
if (numlistflags.Used (name))
137
return *numlistflags.Get(name);
138
else
139
{
140
static ARRAY<double> hnuma(0);
141
return hnuma;
142
}
143
}
144
145
146
bool Flags :: StringFlagDefined (const char * name) const
147
{
148
return strflags.Used (name);
149
}
150
151
bool Flags :: NumFlagDefined (const char * name) const
152
{
153
return numflags.Used (name);
154
}
155
156
bool Flags :: StringListFlagDefined (const char * name) const
157
{
158
return strlistflags.Used (name);
159
}
160
161
bool Flags :: NumListFlagDefined (const char * name) const
162
{
163
return numlistflags.Used (name);
164
}
165
166
167
void Flags :: SaveFlags (const char * filename) const
168
{
169
int i;
170
ofstream outfile (filename);
171
172
for (i = 1; i <= strflags.Size(); i++)
173
outfile << strflags.GetName(i) << " = " << strflags.Get(i) << endl;
174
for (i = 1; i <= numflags.Size(); i++)
175
outfile << numflags.GetName(i) << " = " << numflags.Get(i) << endl;
176
for (i = 1; i <= defflags.Size(); i++)
177
outfile << defflags.GetName(i) << endl;
178
}
179
180
181
182
void Flags :: PrintFlags (ostream & ost) const
183
{
184
int i;
185
186
for (i = 1; i <= strflags.Size(); i++)
187
ost << strflags.GetName(i) << " = " << strflags.Get(i) << endl;
188
for (i = 1; i <= numflags.Size(); i++)
189
ost << numflags.GetName(i) << " = " << numflags.Get(i) << endl;
190
for (i = 1; i <= defflags.Size(); i++)
191
ost << defflags.GetName(i) << endl;
192
}
193
194
195
void Flags :: LoadFlags (const char * filename)
196
{
197
char name[100], str[100];
198
char ch;
199
double val;
200
ifstream infile(filename);
201
202
// (*logout) << "Load flags from " << filename << endl << endl;
203
while (infile.good())
204
{
205
infile >> name;
206
if (strlen (name) == 0) break;
207
208
if (name[0] == '/' && name[1] == '/')
209
{
210
// (*logout) << "comment: ";
211
ch = 0;
212
while (ch != '\n' && infile.good())
213
{
214
ch = infile.get();
215
// (*logout) << ch;
216
}
217
continue;
218
}
219
220
// (*logout) << name;
221
ch = 0;
222
infile >> ch;
223
if (ch != '=')
224
{
225
// (*logout) << endl;
226
infile.putback (ch);
227
SetFlag (name);
228
}
229
else
230
{
231
infile >> val;
232
if (!infile.good())
233
{
234
infile.clear();
235
infile >> str;
236
SetFlag (name, str);
237
// (*logout) << " = " << str << endl;
238
}
239
else
240
{
241
SetFlag (name, val);
242
// (*logout) << " = " << val << endl;
243
}
244
}
245
}
246
// (*logout) << endl;
247
}
248
249
250
void Flags :: SetCommandLineFlag (const char * st)
251
{
252
// cout << "clflag = " << st << endl;
253
istringstream inst( (char *)st);
254
// istrstream defined with char * (not const char * ?????)
255
256
char name[100];
257
double val;
258
259
260
if (st[0] != '-')
261
{
262
cerr << "flag must start with '-'" << endl;
263
return;
264
}
265
266
const char * pos = strchr (st, '=');
267
268
if (!pos)
269
{
270
// (cout) << "Add def flag: " << st+1 << endl;
271
SetFlag (st+1);
272
}
273
else
274
{
275
// cout << "pos = " << pos << endl;
276
277
strncpy (name, st+1, (pos-st)-1);
278
name[pos-st-1] = 0;
279
280
// cout << "name = " << name << endl;
281
282
pos++;
283
char * endptr = NULL;
284
285
val = strtod (pos, &endptr);
286
287
// cout << "val = " << val << endl;
288
289
if (endptr == pos)
290
{
291
// (cout) << "Add String Flag: " << name << " = " << pos << endl;
292
SetFlag (name, pos);
293
}
294
else
295
{
296
// (cout) << "Add Num Flag: " << name << " = " << val << endl;
297
SetFlag (name, val);
298
}
299
}
300
301
302
/*
303
inst >> name;
304
(*mycout) << "name = " << name << endl;
305
306
ch = 0;
307
inst >> ch;
308
if (ch != '=')
309
{
310
SetFlag (name);
311
}
312
else
313
{
314
inst >> val;
315
if (!inst.good())
316
{
317
inst.clear();
318
inst >> str;
319
SetFlag (name, str);
320
(*mycout) << "str = " << str << endl;
321
}
322
else
323
{
324
SetFlag (name, val);
325
(*mycout) << "val = " << val << endl;
326
}
327
}
328
*/
329
}
330
}
331
332