cloudy trunk
Loading...
Searching...
No Matches
parser.h
Go to the documentation of this file.
1/* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2 * others. For conditions of distribution and use see copyright notice in license.txt */
3
4#ifndef PARSER_H_
5#define PARSER_H_
6
12
13#include <stdio.h>
14#include <map>
15
16const char * nWord(const char *chKey,
17 const char *chCard);
18
19class Parser;
20
21typedef void (*OptionParser)(Parser &);
22
24 const char *name;
26};
27
28bool isBoundaryChar(char c);
29
31class Parser
32{
35 long int m_len;
36 const char * m_ptr;
37 bool m_lgEOL;
39 std::map<string,double> m_symtab;
40public:
41 long int m_nqh, m_nInitFile;
43
44 explicit Parser(void) : m_Commands(NULL)
45 {
46 init();
47 }
48 explicit Parser(const CloudyCommand *commands) : m_Commands(commands)
49 {
50 init();
51 }
52private:
53 void init(void)
54 {
55 m_nqh = m_nInitFile = 0;
56 m_lgDSet = m_lgEOF = false;
57 setline("");
58 }
59 void newlineProcess(void)
60 {
64 m_ptr = m_card;
65 m_lgEOL = false;
66 }
67public:
68 bool getline(void);
69 void setline(const char * const card)
70 {
72 ASSERT(strlen(card) < (unsigned) INPUT_LINE_LENGTH);
73 strncpy(m_card_raw,card,INPUT_LINE_LENGTH);
75 }
76
77 void set_point(long int ipnt)
78 {
79 m_ptr = m_card+ipnt;
80 }
81 const char * nWord(const char *chKey) const;
82private:
83 char chPoint( void ) const
84 {
85 return *m_ptr;
86 }
87public:
88 long int GetElem( void ) const;
89 double FFmtRead( void );
90 double getNumberPlain( const char *chDesc );
91 double getNumberCheck( const char *chDesc );
92 double getNumberDefault( const char *chDesc, double fdef );
93 double getNumberCheckLogLinNegImplLog( const char *chDesc );
94 double getNumberCheckAlwaysLog( const char *chDesc );
95 double getNumberCheckAlwaysLogLim( const char *chDesc, double flim );
96 double getNumberDefaultAlwaysLog( const char *chDesc, double fdef );
97 double getNumberDefaultNegImplLog( const char *chDesc, double fdef );
98 bool lgEOL(void) const
99 {
100 return m_lgEOL;
101 }
102 void setEOL(bool val)
103 {
104 m_lgEOL = val;
105 }
106 NORETURN void NoNumb(const char *chDesc) const;
107private:
108 int nMatch1(const char *chKey) const
109 {
110 const char *p=chKey;
111
112 while (isspace(*p))
113 ++p;
114
115 for (const char *q=p; *q; ++q)
116 ASSERT(!islower(*q));
117
118 if ( !isBoundaryChar(*p))
119 {
120 const char *q = ::nWord(p, m_card);
121 if (NULL == q)
122 return 0;
123 else
124 return q-m_card+1;
125 }
126 else
127 {
128 // If the keyword starts with a member of the boundary character
129 // set, can't require it to be preceded by one so revert to explicit
130 // matching
131 return ::nMatch(chKey, m_card);
132 }
133 }
134public:
135 bool nMatch(const char *chKey) const
136 {
137 return nMatch1(chKey) != 0;
138 }
139 bool GetParam(const char *chKey, double *val)
140 {
141 int i = nMatch1(chKey);
142 if (i > 0) {
143 m_ptr = m_card+i-1;
144 *val = FFmtRead();
145 }
146 return i>0;
147 }
148 bool GetRange(const char *chKey, double *val1, double *val2)
149 {
150 int i = nMatch1(chKey);
151 if (i > 0) {
152 m_ptr = m_card+i-1;
153 *val1 = FFmtRead();
154 *val2 = FFmtRead();
155 }
156 return i>0;
157 }
158 bool nMatchErase(const char *chKey)
159 {
160 const char *p=chKey;
161 while (isspace(*p))
162 ++p;
163 int i = nMatch1(p);
164 bool found = (i != 0);
165 if(found)
166 {
167 char *ptr = m_card+i-1;
168 const long len = strlen(p);
169 /* erase this keyword, it upsets FFmtRead */
170 for (long i=0; i<len; ++i)
171 {
172 ptr[i] = ' ';
173 }
174 }
175 return found;
176 }
177 int strcmp(const char *s2)
178 {
179 size_t len = strlen(s2);
180 int val = ::strncmp(m_card, s2, len);
181 if (val == 0)
182 {
183 m_ptr = m_card+len;
184 }
185 return val;
186 }
187 bool Command(const char *name, OptionParser doOpts)
188 {
189 bool lgFound = (this->strcmp(name) == 0);
190 if ( lgFound )
191 (*doOpts)(*this);
192 return lgFound;
193 }
194 bool isComment(void) const;
195 bool isCommandComment(void) const;
196 bool isVar(void) const;
197 std::string getVarName(void);
198 void doSetVar(void);
199 void echo(void) const;
200 bool last(void) const
201 {
202 return m_lgEOF || m_card[0] == ' ';
203 }
204 int PrintLine(FILE *fp) const
205 {
206 return fprintf( fp, " ==%-.80s==\n", m_card_raw);
207 }
208 NORETURN void CommandError(void) const;
209 int GetQuote( char *chLabel, bool lgABORT )
210 {
211 return ::GetQuote(chLabel, m_card, m_card_raw, lgABORT);
212 }
213 const char *StandardEnergyUnit(void) const;
214 string StandardFluxUnit(void) const;
215 string getCommand(long i)
216 {
217 m_ptr = m_card+i;
218 return string(m_card).substr(0,i);
219 }
220 string getRawTail()
221 {
222 return string(m_card_raw+(m_ptr-m_card));
223 }
224 void help(FILE *fp) const;
225 double getWave();
226 double getWaveOpt();
227 void getLineID(char *LabelBuf, realnum *wave);
228};
229
231template <typename V>
233 const char * const m_keyword;
235public:
236 KeyAction(const char *keyword, const V &action) :
237 m_keyword(keyword), m_action(action) {}
238
239 const char *key(void) const
240 {
241 return m_keyword;
242 }
243 void operator()(realnum *v) const
244 {
245 m_action(v);
246 }
247};
248
250template <typename V>
251inline KeyAction<V> MakeKeyAction(const char *keyword, const V &action)
252{
253 return KeyAction<V>(keyword, action);
254}
255
258{
260public:
261 UnitConverter ( double unit ) : m_unit((realnum)unit) {}
262
263 void operator()( realnum *t ) const
264 {
265 *t *= m_unit;
266 }
267};
268
271template <typename T, typename V>
272bool parserProcess(Parser &p, T *list,
273 unsigned long nlist, V *value)
274{
275 bool lgFound = false;
276 for (unsigned long option=0; option < nlist; ++option)
277 {
278 if( p.nWord( list[option].key() ) )
279 {
280 list[option]( value );
281 lgFound = true;
282 break;
283 }
284 }
285 return lgFound;
286}
287
291void ParseCosmicRays( Parser &p );
292
296void ParseCosmology( Parser &p );
297
303
304void ParseAbundances(Parser &p);
305
307void ParseDont(Parser &p);
308
312void ParseSave(Parser &p);
313
314void parse_save_line(Parser &p,
315 /* true, return rel intensity, false, log of luminosity or intensity I */
316 bool lgLog3,
317 char *chHeader);
318
320 Parser &p,
321 /* the file we will write to */
322 long int ipPun,
323 char *chHeader);
324
326 Parser &p,
327 /* the header for the file, a list of identifications */
328 char chHeader[] );
329
331
333void ParseAge(Parser &p);
334
338void ParseAgn(Parser &p);
339
343void ParseState(Parser &p);
344
350void ParseBlackbody(Parser &p);
351
355void ParseCompile(Parser &p );
356
358void ParseConstant(Parser &p);
359
363void ParseDLaw(Parser &p );
364
368void ParseTLaw(Parser &p);
369
373void ParseDrive(Parser &p );
374
379void ParseGrain(Parser &p);
380
382void ParseFluc(Parser &p);
383
385void ParseHDEN(Parser &p);
386
391void ParseAtomISO(long ipISO, Parser &p);
392
396void ParseAtomH2(Parser &p );
397
401void ParseGrid(Parser &p);
402
404void ParseInit(Parser &p);
405
410void ParseInterp(Parser &p);
411
417void ParseIonParI(Parser &p);
418
424
425void ParseIonParX(Parser &p);
431void ParseIonPar(Parser &p,
432 char chType);
433
437void ParseNorm(Parser &p);
438
442void ParseOptimize(Parser &p);
443
447void ParsePrint(Parser &p );
448
450void ParseRadius(Parser &p);
451
453void ParseSet(Parser &p);
454
460void ParseTable(Parser &p);
461
463void ParseTrace(Parser &p);
464
465/*ParseExtinguish parse the extinguish command */
466void ParseExtinguish( Parser &p );
467
468/*ParseIlluminate parse the illuminate command */
469void ParseIlluminate( Parser &p );
470
471/*ParseCaseB - parse the Case B command */
472void ParseCaseB(Parser &p );
473
475void ParseTest(Parser &p);
476
478void ParseAbsMag(Parser &p);
479
481void ParseBackgrd(Parser &p);
482
484void ParseCoronal(Parser &p);
485
487void ParseElement(Parser &p);
488
494void ParseCMB(double z,
495 long int *nqh);
496
504void ParseF_nu(
505 Parser &p,
506 const char *chType,
507 bool lgNU2);
508
512void ParseGlobule(Parser &p);
513
515void ParseRangeOption(Parser &p);
516
518void ParseMap(Parser &p);
519
521void ParseMetal(Parser &p);
522
523void ParsePrtLineSum(Parser &p);
524
526void ParsePlot(Parser &p);
527
530
532void ParseRatio(Parser &p);
533
535void ParseSphere(Parser &p);
536
538void ParseStop(Parser &p);
539
543void ParseCrashDo(Parser &p);
544
545
546#endif // _PARSER_H_
#define ASSERT(exp)
Definition cddefines.h:578
const int INPUT_LINE_LENGTH
Definition cddefines.h:254
float realnum
Definition cddefines.h:103
void caps(char *chCard)
Definition service.cpp:280
const char * key(void) const
Definition parser.h:239
V m_action
Definition parser.h:234
const char *const m_keyword
Definition parser.h:233
void operator()(realnum *v) const
Definition parser.h:243
KeyAction(const char *keyword, const V &action)
Definition parser.h:236
bool getline(void)
Definition parser.cpp:164
int nMatch1(const char *chKey) const
Definition parser.h:108
Parser(const CloudyCommand *commands)
Definition parser.h:48
long int GetElem(void) const
Definition parser.cpp:209
bool m_lgEOL
Definition parser.h:37
double FFmtRead(void)
Definition parser.cpp:353
bool nMatch(const char *chKey) const
Definition parser.h:135
void init(void)
Definition parser.h:53
void setline(const char *const card)
Definition parser.h:69
bool Command(const char *name, OptionParser doOpts)
Definition parser.h:187
bool nMatchErase(const char *chKey)
Definition parser.h:158
const char * nWord(const char *chKey) const
Definition parser.cpp:30
const char * m_ptr
Definition parser.h:36
double getWaveOpt()
Definition parser.cpp:244
bool GetParam(const char *chKey, double *val)
Definition parser.h:139
void set_point(long int ipnt)
Definition parser.h:77
const char * StandardEnergyUnit(void) const
Definition parser.cpp:174
double getNumberCheckAlwaysLog(const char *chDesc)
Definition parser.cpp:308
int strcmp(const char *s2)
Definition parser.h:177
bool GetRange(const char *chKey, double *val1, double *val2)
Definition parser.h:148
Parser(void)
Definition parser.h:44
bool isCommandComment(void) const
Definition parser.cpp:97
long int m_len
Definition parser.h:35
char m_card[INPUT_LINE_LENGTH]
Definition parser.h:33
bool m_lgDSet
Definition parser.h:42
void getLineID(char *LabelBuf, realnum *wave)
Definition parser.cpp:446
bool isComment(void) const
Definition parser.cpp:93
bool last(void) const
Definition parser.h:200
bool lgEOL(void) const
Definition parser.h:98
string StandardFluxUnit(void) const
Definition parser.cpp:178
double getNumberPlain(const char *chDesc)
Definition parser.cpp:269
double getNumberCheckLogLinNegImplLog(const char *chDesc)
Definition parser.cpp:291
std::map< string, double > m_symtab
Definition parser.h:39
double getNumberCheck(const char *chDesc)
Definition parser.cpp:273
NORETURN void NoNumb(const char *chDesc) const
Definition parser.cpp:233
double getNumberCheckAlwaysLogLim(const char *chDesc, double flim)
Definition parser.cpp:314
std::string getVarName(void)
Definition parser.cpp:106
void echo(void) const
Definition parser.cpp:147
double getWave()
Definition parser.cpp:260
char m_card_raw[INPUT_LINE_LENGTH]
Definition parser.h:34
long int m_nInitFile
Definition parser.h:41
double getNumberDefault(const char *chDesc, double fdef)
Definition parser.cpp:282
bool m_lgEOF
Definition parser.h:42
int GetQuote(char *chLabel, bool lgABORT)
Definition parser.h:209
string getCommand(long i)
Definition parser.h:215
double getNumberDefaultAlwaysLog(const char *chDesc, double fdef)
Definition parser.cpp:327
const CloudyCommand *const m_Commands
Definition parser.h:38
long int m_nqh
Definition parser.h:41
void setEOL(bool val)
Definition parser.h:102
string getRawTail()
Definition parser.h:220
void doSetVar(void)
Definition parser.cpp:119
void newlineProcess(void)
Definition parser.h:59
NORETURN void CommandError(void) const
Definition parser.cpp:154
bool isVar(void) const
Definition parser.cpp:102
int PrintLine(FILE *fp) const
Definition parser.h:204
void help(FILE *fp) const
Definition parser.cpp:182
char chPoint(void) const
Definition parser.h:83
double getNumberDefaultNegImplLog(const char *chDesc, double fdef)
Definition parser.cpp:336
void operator()(realnum *t) const
Definition parser.h:263
const realnum m_unit
Definition parser.h:259
UnitConverter(double unit)
Definition parser.h:261
#define NORETURN
Definition cpu.h:383
void ParseSet(Parser &p)
Definition parse_set.cpp:44
void ParseAbsMag(Parser &p)
void ParseGrain(Parser &p)
void Parse_Save_Line_RT(Parser &p)
void ParseF_nu(Parser &p, const char *chType, bool lgNU2)
void ParseDont(Parser &p)
void ParseAge(Parser &p)
Definition parse_age.cpp:39
void ParseSphere(Parser &p)
void ParseGrid(Parser &p)
void ParseAgn(Parser &p)
Definition parse_agn.cpp:10
void ParseTest(Parser &p)
void ParseRadius(Parser &p)
void ParsePrint(Parser &p)
void ParseExtinguish(Parser &p)
void ParseRangeOption(Parser &p)
void ParseBlackbody(Parser &p)
void ParseMap(Parser &p)
Definition parse_map.cpp:9
void ParseElement(Parser &p)
void ParseRatio(Parser &p)
void ParseState(Parser &p)
void ParseNorm(Parser &p)
void ParseCosmology(Parser &p)
void ParseInterp(Parser &p)
void parse_save_line(Parser &p, bool lgLog3, char *chHeader)
Definition save_line.cpp:33
bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
Definition parser.h:272
void ParseGlobule(Parser &p)
bool isBoundaryChar(char c)
Definition parser.cpp:83
void ParseMetal(Parser &p)
void ParseOptimize(Parser &p)
void ParseIonParI(Parser &p)
void ParseTable(Parser &p)
void ParsePrtLineSum(Parser &p)
void ParseSave(Parser &p)
void ParseTrace(Parser &p)
void ParseFluc(Parser &p)
Definition parse_fluc.cpp:8
void ParseAtomISO(long ipISO, Parser &p)
void ParseAbundancesNonSolar(Parser &p)
void ParsePowerlawContinuum(Parser &p)
void ParsePlot(Parser &p)
void ParseAbundances(Parser &p)
void ParseStop(Parser &p)
const char * nWord(const char *chKey, const char *chCard)
Definition parser.cpp:37
void ParseConstant(Parser &p)
void parse_save_colden(Parser &p, char chHeader[])
void ParseIonPar(Parser &p, char chType)
void ParseIlluminate(Parser &p)
void ParseInit(Parser &p)
Definition parse_init.cpp:9
KeyAction< V > MakeKeyAction(const char *keyword, const V &action)
Definition parser.h:251
void ParseCrashDo(Parser &p)
void ParseBackgrd(Parser &p)
void ParseIonParX(Parser &p)
void parse_save_average(Parser &p, long int ipPun, char *chHeader)
void ParseDLaw(Parser &p)
void ParseAtomH2(Parser &p)
void ParseHDEN(Parser &p)
void ParseCosmicRays(Parser &p)
void(* OptionParser)(Parser &)
Definition parser.h:21
void ParseCMB(double z, long int *nqh)
Definition parse_CMB.cpp:11
void ParseCompile(Parser &p)
void ParseCaseB(Parser &p)
void ParseCoronal(Parser &p)
void ParseDrive(Parser &p)
void ParseTLaw(Parser &p)
OptionParser action
Definition parser.h:25
const char * name
Definition parser.h:24