cloudy  trunk
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_
KeyAction::m_action
V m_action
Definition: parser.h:234
ParseCMB
void ParseCMB(double z, long int *nqh)
Definition: parse_CMB.cpp:11
ParseRatio
void ParseRatio(Parser &p)
Definition: parse_ratio.cpp:14
Parser::nMatch
bool nMatch(const char *chKey) const
Definition: parser.h:135
Parser::getVarName
std::string getVarName(void)
Definition: parser.cpp:106
Parser::getRawTail
string getRawTail()
Definition: parser.h:220
Parser::m_len
long int m_len
Definition: parser.h:35
ParseGrid
void ParseGrid(Parser &p)
Definition: parse_grid.cpp:10
Parser::chPoint
char chPoint(void) const
Definition: parser.h:83
Parser::FFmtRead
double FFmtRead(void)
Definition: parser.cpp:353
ParseExtinguish
void ParseExtinguish(Parser &p)
Definition: parse_extinguish.cpp:9
ParseRadius
void ParseRadius(Parser &p)
Definition: parse_radius.cpp:13
Parser::echo
void echo(void) const
Definition: parser.cpp:147
Parser::m_symtab
std::map< string, double > m_symtab
Definition: parser.h:39
Parser::StandardFluxUnit
string StandardFluxUnit(void) const
Definition: parser.cpp:178
ParsePrint
void ParsePrint(Parser &p)
Definition: parse_print.cpp:116
Parser::getNumberDefaultAlwaysLog
double getNumberDefaultAlwaysLog(const char *chDesc, double fdef)
Definition: parser.cpp:327
Parser::isComment
bool isComment(void) const
Definition: parser.cpp:93
ParseAbundances
void ParseAbundances(Parser &p)
Definition: parse_abundances.cpp:14
UnitConverter::UnitConverter
UnitConverter(double unit)
Definition: parser.h:261
ParseCaseB
void ParseCaseB(Parser &p)
Definition: parse_caseb.cpp:9
parse_save_line
void parse_save_line(Parser &p, bool lgLog3, char *chHeader)
Definition: save_line.cpp:33
Parser::m_card
char m_card[INPUT_LINE_LENGTH]
Definition: parser.h:33
Parser::CommandError
NORETURN void CommandError(void) const
Definition: parser.cpp:154
Parser::nWord
const char * nWord(const char *chKey) const
Definition: parser.cpp:30
realnum
float realnum
Definition: cddefines.h:103
ParseInit
void ParseInit(Parser &p)
Definition: parse_init.cpp:9
Parser::nMatch1
int nMatch1(const char *chKey) const
Definition: parser.h:108
ParseBackgrd
void ParseBackgrd(Parser &p)
Definition: parse_backgrd.cpp:11
OptionParser
void(* OptionParser)(Parser &)
Definition: parser.h:21
Parser::GetParam
bool GetParam(const char *chKey, double *val)
Definition: parser.h:139
Parser::StandardEnergyUnit
const char * StandardEnergyUnit(void) const
Definition: parser.cpp:174
ParseDLaw
void ParseDLaw(Parser &p)
Definition: parse_dlaw.cpp:12
ParseBlackbody
void ParseBlackbody(Parser &p)
Definition: parse_blackbody.cpp:13
Parser::m_lgEOF
bool m_lgEOF
Definition: parser.h:42
nWord
const char * nWord(const char *chKey, const char *chCard)
Definition: parser.cpp:37
ParseConstant
void ParseConstant(Parser &p)
Definition: parse_constant.cpp:15
Parser::m_ptr
const char * m_ptr
Definition: parser.h:36
ParseMap
void ParseMap(Parser &p)
Definition: parse_map.cpp:9
KeyAction::key
const char * key(void) const
Definition: parser.h:239
ParseCosmicRays
void ParseCosmicRays(Parser &p)
Definition: parse_cosmic_rays.cpp:13
Parse_Save_Line_RT
void Parse_Save_Line_RT(Parser &p)
Definition: save_line.cpp:291
ParseCrashDo
void ParseCrashDo(Parser &p)
Definition: parse_crashdo.cpp:48
Parser::GetQuote
int GetQuote(char *chLabel, bool lgABORT)
Definition: parser.h:209
ParseNorm
void ParseNorm(Parser &p)
Definition: parse_norm.cpp:10
Parser::getNumberCheckLogLinNegImplLog
double getNumberCheckLogLinNegImplLog(const char *chDesc)
Definition: parser.cpp:291
ParseFluc
void ParseFluc(Parser &p)
Definition: parse_fluc.cpp:8
ASSERT
#define ASSERT(exp)
Definition: cddefines.h:578
ParsePlot
void ParsePlot(Parser &p)
Definition: parse_plot.cpp:16
ParseAtomISO
void ParseAtomISO(long ipISO, Parser &p)
Definition: parse_atom_iso.cpp:17
ParseIonParI
void ParseIonParI(Parser &p)
Definition: parse_ionpar.cpp:11
ParseIlluminate
void ParseIlluminate(Parser &p)
Definition: parse_illuminate.cpp:16
ParseTLaw
void ParseTLaw(Parser &p)
Definition: parse_tlaw.cpp:13
parse_save_average
void parse_save_average(Parser &p, long int ipPun, char *chHeader)
Definition: save_average.cpp:12
KeyAction::operator()
void operator()(realnum *v) const
Definition: parser.h:243
Parser::getWave
double getWave()
Definition: parser.cpp:260
UnitConverter::operator()
void operator()(realnum *t) const
Definition: parser.h:263
Parser::Parser
Parser(void)
Definition: parser.h:44
ParseCosmology
void ParseCosmology(Parser &p)
Definition: parse_cosmology.cpp:12
Parser::doSetVar
void doSetVar(void)
Definition: parser.cpp:119
ParseF_nu
void ParseF_nu(Parser &p, const char *chType, bool lgNU2)
Definition: parse_f_nu.cpp:10
ParseCoronal
void ParseCoronal(Parser &p)
Definition: parse_coronal.cpp:16
CloudyCommand
Definition: parser.h:23
ParseAbsMag
void ParseAbsMag(Parser &p)
Definition: parse_absmag.cpp:9
ParseSphere
void ParseSphere(Parser &p)
Definition: parse_sphere.cpp:9
Parser::help
void help(FILE *fp) const
Definition: parser.cpp:182
ParsePrtLineSum
void ParsePrtLineSum(Parser &p)
Definition: prt_linesum.cpp:20
Parser::m_card_raw
char m_card_raw[INPUT_LINE_LENGTH]
Definition: parser.h:34
UnitConverter::m_unit
const realnum m_unit
Definition: parser.h:259
ParseElement
void ParseElement(Parser &p)
Definition: parse_element.cpp:15
Parser::NoNumb
NORETURN void NoNumb(const char *chDesc) const
Definition: parser.cpp:233
Parser
Definition: parser.h:31
ParseIonParX
void ParseIonParX(Parser &p)
Definition: parse_ionpar.cpp:15
ParseInterp
void ParseInterp(Parser &p)
Definition: parse_interp.cpp:11
Parser::getline
bool getline(void)
Definition: parser.cpp:164
Parser::m_lgEOL
bool m_lgEOL
Definition: parser.h:37
NORETURN
#define NORETURN
Definition: cpu.h:383
Parser::GetRange
bool GetRange(const char *chKey, double *val1, double *val2)
Definition: parser.h:148
ParseDont
void ParseDont(Parser &p)
Definition: parse_dont.cpp:27
ParseRangeOption
void ParseRangeOption(Parser &p)
Definition: parse_rangeoption.cpp:9
nMatch
long nMatch(const char *chKey, const char *chCard)
Definition: service.cpp:451
Parser::isCommandComment
bool isCommandComment(void) const
Definition: parser.cpp:97
GetQuote
int GetQuote(char *chLabel, char *chCard, char *chCardRaw, bool lgABORT)
Definition: service.cpp:513
ParseState
void ParseState(Parser &p)
Definition: parse_state.cpp:10
Parser::getNumberDefaultNegImplLog
double getNumberDefaultNegImplLog(const char *chDesc, double fdef)
Definition: parser.cpp:336
Parser::nMatchErase
bool nMatchErase(const char *chKey)
Definition: parser.h:158
Parser::last
bool last(void) const
Definition: parser.h:200
KeyAction::KeyAction
KeyAction(const char *keyword, const V &action)
Definition: parser.h:236
UnitConverter
Definition: parser.h:257
Parser::newlineProcess
void newlineProcess(void)
Definition: parser.h:59
parse_save_colden
void parse_save_colden(Parser &p, char chHeader[])
Definition: save_colden.cpp:17
Parser::getNumberPlain
double getNumberPlain(const char *chDesc)
Definition: parser.cpp:269
ParseDrive
void ParseDrive(Parser &p)
Definition: parse_drive.cpp:35
Parser::lgEOL
bool lgEOL(void) const
Definition: parser.h:98
Parser::m_lgDSet
bool m_lgDSet
Definition: parser.h:42
ParseStop
void ParseStop(Parser &p)
Definition: parse_stop.cpp:17
Parser::getNumberCheckAlwaysLogLim
double getNumberCheckAlwaysLogLim(const char *chDesc, double flim)
Definition: parser.cpp:314
Parser::getNumberCheck
double getNumberCheck(const char *chDesc)
Definition: parser.cpp:273
Parser::m_nInitFile
long int m_nInitFile
Definition: parser.h:41
CloudyCommand::action
OptionParser action
Definition: parser.h:25
CloudyCommand::name
const char * name
Definition: parser.h:24
ParseMetal
void ParseMetal(Parser &p)
Definition: parse_metal.cpp:12
Parser::GetElem
long int GetElem(void) const
Definition: parser.cpp:209
ParseGlobule
void ParseGlobule(Parser &p)
Definition: parse_globule.cpp:11
KeyAction::m_keyword
const char *const m_keyword
Definition: parser.h:233
ParseSet
void ParseSet(Parser &p)
Definition: parse_set.cpp:44
Parser::init
void init(void)
Definition: parser.h:53
INPUT_LINE_LENGTH
const int INPUT_LINE_LENGTH
Definition: cddefines.h:254
ParsePowerlawContinuum
void ParsePowerlawContinuum(Parser &p)
Definition: parse_powerlawcontinuum.cpp:11
Parser::setline
void setline(const char *const card)
Definition: parser.h:69
parserProcess
bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
Definition: parser.h:272
Parser::getNumberDefault
double getNumberDefault(const char *chDesc, double fdef)
Definition: parser.cpp:282
KeyAction
Definition: parser.h:232
caps
void caps(char *chCard)
Definition: service.cpp:280
Parser::getLineID
void getLineID(char *LabelBuf, realnum *wave)
Definition: parser.cpp:446
isBoundaryChar
bool isBoundaryChar(char c)
Definition: parser.cpp:83
Parser::m_nqh
long int m_nqh
Definition: parser.h:41
Parser::setEOL
void setEOL(bool val)
Definition: parser.h:102
Parser::getNumberCheckAlwaysLog
double getNumberCheckAlwaysLog(const char *chDesc)
Definition: parser.cpp:308
Parser::set_point
void set_point(long int ipnt)
Definition: parser.h:77
ParseTrace
void ParseTrace(Parser &p)
Definition: parse_trace.cpp:11
ParseAtomH2
void ParseAtomH2(Parser &p)
Definition: parse_atom_h2.cpp:13
ParseIonPar
void ParseIonPar(Parser &p, char chType)
Definition: parse_ionpar.cpp:20
ParseTest
void ParseTest(Parser &p)
Definition: parse_test.cpp:11
Parser::Parser
Parser(const CloudyCommand *commands)
Definition: parser.h:48
ParseCompile
void ParseCompile(Parser &p)
Definition: parse_compile.cpp:18
ParseHDEN
void ParseHDEN(Parser &p)
Definition: parse_hden.cpp:11
Parser::strcmp
int strcmp(const char *s2)
Definition: parser.h:177
ParseSave
void ParseSave(Parser &p)
Definition: parse_save.cpp:51
Parser::Command
bool Command(const char *name, OptionParser doOpts)
Definition: parser.h:187
Parser::PrintLine
int PrintLine(FILE *fp) const
Definition: parser.h:204
ParseTable
void ParseTable(Parser &p)
Definition: parse_table.cpp:340
ParseGrain
void ParseGrain(Parser &p)
Definition: parse_grain.cpp:12
Parser::isVar
bool isVar(void) const
Definition: parser.cpp:102
ParseAbundancesNonSolar
void ParseAbundancesNonSolar(Parser &p)
Definition: parse_commands.cpp:810
ParseAgn
void ParseAgn(Parser &p)
Definition: parse_agn.cpp:10
Parser::getCommand
string getCommand(long i)
Definition: parser.h:215
MakeKeyAction
KeyAction< V > MakeKeyAction(const char *keyword, const V &action)
Definition: parser.h:251
Parser::getWaveOpt
double getWaveOpt()
Definition: parser.cpp:244
Parser::m_Commands
const CloudyCommand *const m_Commands
Definition: parser.h:38
ParseOptimize
void ParseOptimize(Parser &p)
Definition: parse_optimize.cpp:29
ParseAge
void ParseAge(Parser &p)
Definition: parse_age.cpp:39