cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
13 #include <stdio.h>
14 #include <map>
15 
16 const char * nWord(const char *chKey,
17  const char *chCard);
18 
19 class Parser;
20 
21 typedef void (*OptionParser)(Parser &);
22 
23 struct CloudyCommand {
24  const char *name;
26 };
27 
28 bool isBoundaryChar(char c);
29 
31 class Parser
32 {
35  long int m_len;
36  const char * m_ptr;
37  bool m_lgEOL;
38  const CloudyCommand * const m_Commands;
39  std::map<string,double> m_symtab;
40 public:
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  }
52 private:
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  {
62  ::caps(m_card);
64  m_ptr = m_card;
65  m_lgEOL = false;
66  }
67 public:
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;
82 private:
83  char chPoint( void ) const
84  {
85  return *m_ptr;
86  }
87 public:
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;
107 private:
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  }
134 public:
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 
231 template <typename V>
232 class KeyAction {
233  const char * const m_keyword;
235 public:
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 
250 template <typename V>
251 inline KeyAction<V> MakeKeyAction(const char *keyword, const V &action)
252 {
253  return KeyAction<V>(keyword, action);
254 }
255 
258 {
260 public:
261  UnitConverter ( double unit ) : m_unit((realnum)unit) {}
262 
263  void operator()( realnum *t ) const
264  {
265  *t *= m_unit;
266  }
267 };
268 
271 template <typename T, typename V>
272 bool 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 
291 void ParseCosmicRays( Parser &p );
292 
296 void ParseCosmology( Parser &p );
297 
303 
304 void ParseAbundances(Parser &p);
305 
307 void ParseDont(Parser &p);
308 
312 void ParseSave(Parser &p);
313 
314 void parse_save_line(Parser &p,
315  /* true, return rel intensity, false, log of luminosity or intensity I */
316  bool lgLog3,
317  char *chHeader);
318 
319 void parse_save_average(
320  Parser &p,
321  /* the file we will write to */
322  long int ipPun,
323  char *chHeader);
324 
325 void parse_save_colden(
326  Parser &p,
327  /* the header for the file, a list of identifications */
328  char chHeader[] );
329 
330 void Parse_Save_Line_RT(Parser &p);
331 
333 void ParseAge(Parser &p);
334 
338 void ParseAgn(Parser &p);
339 
343 void ParseState(Parser &p);
344 
350 void ParseBlackbody(Parser &p);
351 
355 void ParseCompile(Parser &p );
356 
358 void ParseConstant(Parser &p);
359 
363 void ParseDLaw(Parser &p );
364 
368 void ParseTLaw(Parser &p);
369 
373 void ParseDrive(Parser &p );
374 
379 void ParseGrain(Parser &p);
380 
382 void ParseFluc(Parser &p);
383 
385 void ParseHDEN(Parser &p);
386 
391 void ParseAtomISO(long ipISO, Parser &p);
392 
396 void ParseAtomH2(Parser &p );
397 
401 void ParseGrid(Parser &p);
402 
404 void ParseInit(Parser &p);
405 
410 void ParseInterp(Parser &p);
411 
417 void ParseIonParI(Parser &p);
418 
425 void ParseIonParX(Parser &p);
431 void ParseIonPar(Parser &p,
432  char chType);
433 
437 void ParseNorm(Parser &p);
438 
442 void ParseOptimize(Parser &p);
443 
447 void ParsePrint(Parser &p );
448 
450 void ParseRadius(Parser &p);
451 
453 void ParseSet(Parser &p);
454 
460 void ParseTable(Parser &p);
461 
463 void ParseTrace(Parser &p);
464 
465 /*ParseExtinguish parse the extinguish command */
466 void ParseExtinguish( Parser &p );
467 
468 /*ParseIlluminate parse the illuminate command */
469 void ParseIlluminate( Parser &p );
470 
471 /*ParseCaseB - parse the Case B command */
472 void ParseCaseB(Parser &p );
473 
475 void ParseTest(Parser &p);
476 
478 void ParseAbsMag(Parser &p);
479 
481 void ParseBackgrd(Parser &p);
482 
484 void ParseCoronal(Parser &p);
485 
487 void ParseElement(Parser &p);
488 
494 void ParseCMB(double z,
495  long int *nqh);
496 
504 void ParseF_nu(
505  Parser &p,
506  const char *chType,
507  bool lgNU2);
508 
512 void ParseGlobule(Parser &p);
513 
515 void ParseRangeOption(Parser &p);
516 
518 void ParseMap(Parser &p);
519 
521 void ParseMetal(Parser &p);
522 
523 void ParsePrtLineSum(Parser &p);
524 
526 void ParsePlot(Parser &p);
527 
530 
532 void ParseRatio(Parser &p);
533 
535 void ParseSphere(Parser &p);
536 
538 void ParseStop(Parser &p);
539 
543 void ParseCrashDo(Parser &p);
544 
545 
546 #endif // _PARSER_H_
void ParseState(Parser &p)
Definition: parse_state.cpp:10
void Parse_Save_Line_RT(Parser &p)
Definition: save_line.cpp:291
void setEOL(bool val)
Definition: parser.h:102
bool nMatch(const char *chKey) const
Definition: parser.h:135
void ParseHDEN(Parser &p)
Definition: parse_hden.cpp:11
void ParseAgn(Parser &p)
Definition: parse_agn.cpp:10
const realnum m_unit
Definition: parser.h:259
void(* OptionParser)(Parser &)
Definition: parser.h:21
void ParseDont(Parser &p)
Definition: parse_dont.cpp:27
void echo(void) const
Definition: parser.cpp:147
double FFmtRead(void)
Definition: parser.cpp:353
void ParseAge(Parser &p)
Definition: parse_age.cpp:39
#define NORETURN
Definition: cpu.h:370
void ParsePlot(Parser &p)
Definition: parse_plot.cpp:16
void ParseBlackbody(Parser &p)
void parse_save_colden(Parser &p, char chHeader[])
Definition: save_colden.cpp:17
void setline(const char *const card)
Definition: parser.h:69
double getNumberCheckLogLinNegImplLog(const char *chDesc)
Definition: parser.cpp:291
Parser(void)
Definition: parser.h:44
bool m_lgEOL
Definition: parser.h:37
void ParseBackgrd(Parser &p)
bool Command(const char *name, OptionParser doOpts)
Definition: parser.h:187
long int m_nqh
Definition: parser.h:41
void operator()(realnum *t) const
Definition: parser.h:263
string getCommand(long i)
Definition: parser.h:215
void getLineID(char *LabelBuf, realnum *wave)
Definition: parser.cpp:446
void ParseExtinguish(Parser &p)
void ParseTable(Parser &p)
long nMatch(const char *chKey, const char *chCard)
Definition: service.cpp:451
void ParseSet(Parser &p)
Definition: parse_set.cpp:44
char m_card[INPUT_LINE_LENGTH]
Definition: parser.h:33
void ParseAtomH2(Parser &p)
bool isCommandComment(void) const
Definition: parser.cpp:97
void ParseRatio(Parser &p)
Definition: parse_ratio.cpp:14
void ParseConstant(Parser &p)
double getNumberDefaultAlwaysLog(const char *chDesc, double fdef)
Definition: parser.cpp:327
bool nMatchErase(const char *chKey)
Definition: parser.h:158
void ParseIonPar(Parser &p, char chType)
void ParseCrashDo(Parser &p)
bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
Definition: parser.h:272
void ParseStop(Parser &p)
Definition: parse_stop.cpp:17
double getWave()
Definition: parser.cpp:260
void ParseAbundancesNonSolar(Parser &p)
void ParseSave(Parser &p)
Definition: parse_save.cpp:51
void ParseGrid(Parser &p)
Definition: parse_grid.cpp:10
const char * name
Definition: parser.h:24
bool isBoundaryChar(char c)
Definition: parser.cpp:83
void ParseDLaw(Parser &p)
Definition: parse_dlaw.cpp:12
Definition: parser.h:31
void ParseRangeOption(Parser &p)
void ParsePrint(Parser &p)
double getNumberPlain(const char *chDesc)
Definition: parser.cpp:269
void ParseSphere(Parser &p)
Definition: parse_sphere.cpp:9
void ParseMap(Parser &p)
Definition: parse_map.cpp:9
char m_card_raw[INPUT_LINE_LENGTH]
Definition: parser.h:33
void ParseIlluminate(Parser &p)
long int m_nInitFile
Definition: parser.h:41
int GetQuote(char *chLabel, bool lgABORT)
Definition: parser.h:209
int GetQuote(char *chLabel, char *chCard, char *chCardRaw, bool lgABORT)
Definition: service.cpp:513
void ParseCosmology(Parser &p)
void ParseCompile(Parser &p)
OptionParser action
Definition: parser.h:25
void ParseTest(Parser &p)
Definition: parse_test.cpp:11
string StandardFluxUnit(void) const
Definition: parser.cpp:178
void ParseGlobule(Parser &p)
void ParseCaseB(Parser &p)
Definition: parse_caseb.cpp:9
string getRawTail()
Definition: parser.h:220
bool m_lgDSet
Definition: parser.h:42
void set_point(long int ipnt)
Definition: parser.h:77
void ParseF_nu(Parser &p, const char *chType, bool lgNU2)
Definition: parse_f_nu.cpp:10
void ParseIonParX(Parser &p)
void operator()(realnum *v) const
Definition: parser.h:243
void ParseAtomISO(long ipISO, Parser &p)
void ParseAbsMag(Parser &p)
Definition: parse_absmag.cpp:9
float realnum
Definition: cddefines.h:107
const char * StandardEnergyUnit(void) const
Definition: parser.cpp:174
bool last(void) const
Definition: parser.h:200
const int INPUT_LINE_LENGTH
Definition: cddefines.h:258
char chPoint(void) const
Definition: parser.h:83
void ParseFluc(Parser &p)
Definition: parse_fluc.cpp:8
void ParseNorm(Parser &p)
Definition: parse_norm.cpp:10
void ParseCMB(double z, long int *nqh)
Definition: parse_CMB.cpp:11
NORETURN void NoNumb(const char *chDesc) const
Definition: parser.cpp:233
long int GetElem(void) const
Definition: parser.cpp:209
const char * nWord(const char *chKey) const
Definition: parser.cpp:30
int nMatch1(const char *chKey) const
Definition: parser.h:108
void ParseDrive(Parser &p)
Definition: parse_drive.cpp:35
bool isVar(void) const
Definition: parser.cpp:102
const char * nWord(const char *chKey, const char *chCard)
Definition: parser.cpp:37
void ParseTrace(Parser &p)
Definition: parse_trace.cpp:11
int strcmp(const char *s2)
Definition: parser.h:177
void newlineProcess(void)
Definition: parser.h:59
long int m_len
Definition: parser.h:35
void ParseInit(Parser &p)
Definition: parse_init.cpp:9
void ParseGrain(Parser &p)
Definition: parse_grain.cpp:12
void ParsePrtLineSum(Parser &p)
Definition: prt_linesum.cpp:20
void ParsePowerlawContinuum(Parser &p)
bool getline(void)
Definition: parser.cpp:164
double getNumberCheckAlwaysLogLim(const char *chDesc, double flim)
Definition: parser.cpp:314
void help(FILE *fp) const
Definition: parser.cpp:182
void ParseIonParI(Parser &p)
#define ASSERT(exp)
Definition: cddefines.h:582
KeyAction< V > MakeKeyAction(const char *keyword, const V &action)
Definition: parser.h:251
KeyAction(const char *keyword, const V &action)
Definition: parser.h:236
bool GetParam(const char *chKey, double *val)
Definition: parser.h:139
double getNumberCheckAlwaysLog(const char *chDesc)
Definition: parser.cpp:308
void ParseRadius(Parser &p)
Parser(const CloudyCommand *commands)
Definition: parser.h:48
const CloudyCommand *const m_Commands
Definition: parser.h:38
double getNumberDefault(const char *chDesc, double fdef)
Definition: parser.cpp:282
void ParseTLaw(Parser &p)
Definition: parse_tlaw.cpp:13
bool lgEOL(void) const
Definition: parser.h:98
void ParseCosmicRays(Parser &p)
NORETURN void CommandError(void) const
Definition: parser.cpp:154
const char *const m_keyword
Definition: parser.h:233
void ParseOptimize(Parser &p)
int PrintLine(FILE *fp) const
Definition: parser.h:204
void parse_save_line(Parser &p, bool lgLog3, char *chHeader)
Definition: save_line.cpp:33
void parse_save_average(Parser &p, long int ipPun, char *chHeader)
std::string getVarName(void)
Definition: parser.cpp:106
void caps(char *chCard)
Definition: service.cpp:280
void init(void)
Definition: parser.h:53
bool m_lgEOF
Definition: parser.h:42
void ParseMetal(Parser &p)
Definition: parse_metal.cpp:12
bool GetRange(const char *chKey, double *val1, double *val2)
Definition: parser.h:148
UnitConverter(double unit)
Definition: parser.h:261
void doSetVar(void)
Definition: parser.cpp:119
double getNumberDefaultNegImplLog(const char *chDesc, double fdef)
Definition: parser.cpp:336
double getWaveOpt()
Definition: parser.cpp:244
std::map< string, double > m_symtab
Definition: parser.h:39
void ParseCoronal(Parser &p)
const char * key(void) const
Definition: parser.h:239
void ParseElement(Parser &p)
V m_action
Definition: parser.h:234
bool isComment(void) const
Definition: parser.cpp:93
void ParseInterp(Parser &p)
const char * m_ptr
Definition: parser.h:36
void ParseAbundances(Parser &p)
double getNumberCheck(const char *chDesc)
Definition: parser.cpp:273