Cloudy
Spectral Synthesis Code for Astrophysics
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-2025 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 "service.h"
14#include "thirdparty.h"
15
16const char * nWord(const char *chKey,
17 const char *chCard);
18
19class Parser;
20class DepthTable;
21class LineID;
22
23typedef void (*OptionParser)(Parser &);
24
26 const char *name;
28};
29
30bool isBoundaryChar(char c);
31bool isSeparatorChar(char c);
32
33class Symbol {
34public:
37 string value;
38 Symbol(enum tokens t, const string& v) : toktype(t), value(v) {}
39};
40
42class Parser
43{
44 string m_card; // all-caps version of m_card_raw
45 string m_card_raw; // raw input line with all comments stripped
46 string m_card_comment; // input line with visible comments included, used for output
47 long int m_len;
48 long int m_off;
49 bool m_lgEOL;
51 std::map<string,double> m_symtab;
52 std::map<string,size_t> m_uniqueLen;
53public:
54 long int m_nqh;
56
57 explicit Parser(void) : m_Commands(NULL)
58 {
59 init();
60 }
61 explicit Parser(const CloudyCommand *commands) : m_Commands(commands)
62 {
63 init();
64 }
65private:
66 void init()
67 {
68 m_nqh = 0;
69 m_lgDSet = m_lgEOF = false;
70 setline("");
71 if( m_Commands != NULL )
72 {
73 trieNode* root = new trieNode;
74 for( size_t i=0; m_Commands[i].name != NULL; ++i )
75 insertToken(root, m_Commands[i].name);
76 for( size_t i=0; m_Commands[i].name != NULL; ++i )
77 {
78 size_t ul = findUniqueLen(root, m_Commands[i].name);
79 if( ul < 4 )
80 ul = min(strlen(m_Commands[i].name),4);
81 m_uniqueLen[m_Commands[i].name] = ul;
82 }
83 delete root;
84 }
85 }
86 void newlineProcess();
87 bool at_end() const;
88 char current( void ) const
89 {
90 return m_card[m_off];
91 }
92 char current_raw() const;
93 void skip_whitespace();
94 string m_getCommandToken() const;
95 size_t m_getUniqueLen(const string& s2) const
96 {
97 size_t uniqueLen;
98 auto p = m_uniqueLen.find(s2);
99 if( p == m_uniqueLen.end() )
100 uniqueLen = s2.length();
101 else
102 uniqueLen = p->second;
103 return uniqueLen;
104 }
105public:
106 bool getline();
107 void setline(const string& card);
108 void set_point(long int ipnt)
109 {
110 m_off = ipnt;
111 }
112 const char * nWord(const char *chKey) const;
113 bool lgReachedEnd();
114 void showLocation(FILE *io = ioQQQ) const;
115public:
116 long int GetElem( void ) const;
117 double FFmtRead( void );
118 double getNumberPlain( const char *chDesc );
119 double getNumberCheck( const char *chDesc );
120 double getNumberDefault( const char *chDesc, double fdef );
121 double getNumberCheckLogLinNegImplLog( const char *chDesc );
122 double getNumberCheckAlwaysLog( const char *chDesc );
123 double getNumberCheckAlwaysLogLim( const char *chDesc, double flim );
124 double getNumberDefaultAlwaysLog( const char *chDesc, double fdef );
125 double getNumberDefaultNegImplLog( const char *chDesc, double fdef );
126 bool lgEOL(void) const
127 {
128 return m_lgEOL;
129 }
130 void setEOL(bool val)
131 {
132 m_lgEOL = val;
133 }
134 NORETURN void NoNumb(const char *chDesc) const;
135private:
136 int nMatch1(const char *chKey) const
137 {
138 const char *p=chKey;
139
140 while (isspace(*p))
141 ++p;
142
143 for (const char *q=p; *q; ++q)
144 ASSERT(!islower(*q));
145
146 if ( !isBoundaryChar(*p))
147 {
148 const char *c = m_card.c_str();
149 const char *q = ::nWord(p, c);
150 if (NULL == q)
151 return 0;
152 else
153 return q-c+1;
154 }
155 else
156 {
157 // If the keyword starts with a member of the boundary character
158 // set, can't require it to be preceded by one so revert to explicit
159 // matching
160 return ::nMatch(chKey, m_card.c_str());
161 }
162 }
163public:
164 bool nMatch(const char *chKey) const
165 {
166 return nMatch1(chKey) != 0;
167 }
168 bool GetParam(const char *chKey, double *val)
169 {
170 int i = nMatch1(chKey);
171 if (i > 0) {
172 m_off = i-1;
173 *val = FFmtRead();
174 }
175 return i>0;
176 }
177 bool GetRange(const char* chKey, t_wavl& val1, t_wavl& val2)
178 {
179 int i = nMatch1(chKey);
180 if( i > 0 )
181 {
182 m_off = i-1;
183 val1 = getWaveOpt();
184 val2 = getWaveOpt();
185 }
186 return ( i > 0 );
187 }
188 bool nMatchErase(const char *chKey)
189 {
190 const char *p=chKey;
191 while (isspace(*p))
192 ++p;
193 int i = nMatch1(p);
194 bool found = (i != 0);
195 if(found)
196 {
197 const long len = strlen(p);
198 /* erase this keyword, it upsets FFmtRead */
199 for (long j=0; j<len; ++j)
200 {
201 m_card[i+j-1] = ' ';
202 }
203 }
204 return found;
205 }
206 // returns true if a given key is found as the first key after the current position
207 // there must be at least one separator character in front of the key as well as
208 // after the key. chKey must contain the full keyword, but abbreviation to nmin
209 // chars is supported.
210 bool nMatchSkip(const string& chKey, size_t nmin = 4);
211 bool hasCommand(const string& s2);
212 bool peekNextCommand(const string& s2);
213 bool Command(const char *name, OptionParser doOpts)
214 {
215 bool lgFound = hasCommand(name);
216 if ( lgFound )
217 (*doOpts)(*this);
218 return lgFound;
219 }
220 string ClosestMatch(const string& token) const;
221 bool isComment(void) const;
222 bool isVar(void) const;
223 std::string getVarName(void);
224 void doSetVar(void);
225 void echo(void) const;
226 bool last(void) const;
227 int PrintLine(FILE *fp) const
228 {
229 return fprintf( fp, " ==%-.80s==\n", m_card_comment.c_str());
230 }
231 NORETURN void CommandError( void ) const;
232 NORETURN void Error( const char *msg ) const;
233 NORETURN void StringError( ) const;
234 int GetQuote( string& chLabel );
235 const char *StandardEnergyUnit(void) const;
236 string StandardFluxUnit(void) const;
237 string getFirstChunk(long i);
238 string getFirstChunkRaw(long i);
239 string getRawTail()
240 {
241 return m_card_raw.substr(m_off);
242 }
243 void help(FILE *fp) const;
244 t_wavl getWave();
246 LineID getLineID(bool lgAtStart=true);
248 int getElement();
249 void getPairs(vector<double>& a, vector<double> & b);
250 void readList(vector<string>& list, const char *chName);
251 void readLaw(DepthTable& table);
252};
253
254// helper functions for the DataParser class, do not call these directly
255template<typename T>
256inline void getTokenOptionalImpl(istringstream& iss, const string&, T& var)
257{
258 iss >> var;
259 if( iss.fail() )
260 var = T();
261}
262
263// optimized specializations for the most common types
264template<>
265inline void getTokenOptionalImpl(istringstream& iss, const string& s, double& var)
266{
267 FPRead(iss, s, var);
268}
269
270template<>
271inline void getTokenOptionalImpl(istringstream& iss, const string& s, sys_float& var)
272{
273 FPRead(iss, s, var);
274}
275
276template<>
277inline void getTokenOptionalImpl(istringstream& iss, const string& s, long long& var)
278{
279 IntRead(iss, s, var);
280}
281
282template<>
283inline void getTokenOptionalImpl(istringstream& iss, const string& s, unsigned long long& var)
284{
285 IntRead(iss, s, var);
286}
287
288template<>
289inline void getTokenOptionalImpl(istringstream& iss, const string& s, long& var)
290{
291 IntRead(iss, s, var);
292}
293
294template<>
295inline void getTokenOptionalImpl(istringstream& iss, const string& s, unsigned long& var)
296{
297 IntRead(iss, s, var);
298}
299
300template<>
301inline void getTokenOptionalImpl(istringstream& iss, const string& s, int& var)
302{
303 IntRead(iss, s, var);
304}
305
306template<>
307inline void getTokenOptionalImpl(istringstream& iss, const string& s, unsigned int& var)
308{
309 IntRead(iss, s, var);
310}
311
317
319
321 string p_filename;
322 fstream p_io;
324 string p_line;
325 size_t p_nr;
326 istringstream p_ls;
327 bool p_lgEOF;
328
329 void p_open(const string& name, eod_style es, access_scheme as);
330 void p_close();
331 // prepare a recently obtained line for parsing
332 void p_newlineProcess();
333 // returns true if the current line is concidered comment only
334 bool p_isComment() const
335 {
336 if( p_es == ES_NONE || p_es == ES_STARS_ONLY )
337 return ( p_blankLine() || p_line[0] == '#' );
338 else if( p_es == ES_STARS_AND_BLANKS )
339 return ( p_line[0] == '#' );
340 else
342 }
343 // returns true if the line contains only whitespace, possibly followed by a comment
344 // NB NB -- this routine returns false if the comment character is in column 0...
345 // this is needed because comments starting in column 0 may have a different meaning
346 // than blank lines, depending on the value of p_es...
347 bool p_blankLine() const
348 {
349 for( size_t i=0; i < p_line.length(); ++i )
350 {
351 if( i > 0 && p_line[i] == '#' )
352 return true;
353 else if( !isspace(p_line[i]) )
354 return false;
355 }
356 return true;
357 }
358 // get the position on the current line
359 size_t p_pos()
360 {
361 long p = p_ls.tellg();
362 if( p < 0 )
363 return p_line.length();
364 else
365 return size_t(p);
366 }
367 // set the position on the current line (i.e. skip to position p)
368 void p_pos(size_t p)
369 {
370 p_ls.seekg(p);
371 if( p >= p_line.length() )
372 p_ls.setstate(ios_base::eofbit);
373 }
374 // skip whitespace on the current line
375 void p_skipWS()
376 {
377 while( p_ls.good() )
378 {
379 char c = p_ls.peek();
380 if( !isspace(c) )
381 break;
382 (void)p_ls.get();
383 }
384 }
385 bool p_isSeparator(char c)
386 {
387 return ( c == '=' || c == ',' );
388 }
389 // replace separators with spaces
391 {
392 bool lgModified = false;
393 for( size_t i=0; i < p_line.length(); ++i )
394 if( p_isSeparator(p_line[i]) )
395 {
396 p_line[i] = ' ';
397 lgModified = true;
398 }
399 if( lgModified )
400 p_ls.str(p_line);
401 }
402 // helper routine showing where parsing stopped
403 void p_showLocation(size_t p, FILE *io);
404 // this implements reading a quoted string
405 void p_getQuoteOptional(string& str);
406public:
407 // default constructor
408 DataParser() : p_es(ES_INVALID), p_nr(0), p_lgEOF(false) {}
409 // constructor
410 // name: the name of the data file to be read
411 // es: which inline EOD markers are allowed? (see also above)
412 // as: access scheme for searching the data file (see cpu.h)
413 DataParser(const string& name, eod_style es, access_scheme as = AS_DEFAULT)
414 {
415 p_open(name, es, as);
416 }
417 // open data file for parsing, normally done via ctor
418 void open(const string& name, eod_style es, access_scheme as = AS_DEFAULT)
419 {
420 p_close();
421 p_open(name, es, as);
422 }
423 // close data file, normally done via dtor
424 void close()
425 {
426 p_close();
427 }
428 // check whether opening the file succeeded, only relevant for optional access schemes
429 bool isOpen() const { return p_io.is_open(); }
430 // check magic number, aborts if mismatch is found
431 void checkMagic(long i0);
432 void checkMagic(long i0, long i1);
433 void checkMagic(long i0, long i1, long i2);
434 void checkMagic(long i0, long i1, long i2, long i3);
435 // read next non-comment line, returns false on EOF or failure
436 bool getline();
437 // feed a data line to the parser
438 void setline(const string& line)
439 {
440 p_line = line;
442 }
443 // try to read optional token, returns false if operation failed
444 template<typename T>
445 bool getTokenOptional(T& var)
446 {
448 if( p_ls.fail() )
449 return false;
450 else if( !isspace(p_ls.peek()) && !p_ls.eof() )
451 errorAbort("found unrecognized input after token");
452 else
453 return true;
454 }
455 // try to read vector of optional tokens, returns number of tokens read successfully
456 template<typename T>
457 size_t getTokenOptional(T var[], size_t n)
458 {
459 static_assert( !SameType<T,char>::value &&
460 !SameType<T,signed char>:: value &&
462 "Reading C-style strings is not supported, use C++ strings instead." );
463 for( size_t i=0; i < n; ++i )
464 {
465 if( !getTokenOptional(var[i]) )
466 return i;
467 }
468 return n;
469 }
470 // read token, will abort on failure
471 template<typename T>
472 void getToken(T& var)
473 {
474 if( !getTokenOptional(var) )
475 errorAbort("failed to read valid data");
476 }
477 // read vector of tokens, will abort on failure
478 template<typename T>
479 void getToken(T var[], size_t n)
480 {
481 static_assert( !SameType<T,char>::value &&
482 !SameType<T,signed char>:: value &&
484 "Reading C-style strings is not supported, use C++ strings instead." );
485 for( size_t i=0; i < n; ++i )
486 getToken(var[i]);
487 }
488 // read an optional quoted string
489 bool getQuoteOptional(string& str)
490 {
492 if( p_ls.fail() )
493 return false;
494 else if( !isspace(p_ls.peek()) && !p_ls.eof() )
495 errorAbort("found unrecognized input after token");
496 else
497 return true;
498 }
499 // read a quoted string
500 void getQuote(string& str)
501 {
502 if( !getQuoteOptional(str) )
503 errorAbort("failed to read a quoted string");
504 }
505 // read an optional keyword
506 bool getKeywordOptional(string& str)
507 {
508 bool lgSuccess = getTokenOptional(str);
509 caps(str);
510 return lgSuccess;
511 }
512 // read a keyword
513 void getKeyword(string& str)
514 {
515 if( !getKeywordOptional(str) )
516 errorAbort("failed to read a keyword");
517 }
518 // read line label plus wavelength
519 void getLineID(LineID& line, bool lgAtStart=true);
520 // get the current position on the line
521 long getposLine() { return p_pos(); }
522 // skip to a specified position on the line
523 void setposLine(size_t p)
524 {
525 if( p < p_pos() )
526 errorAbort("skipping to requested position failed");
527 p_pos(p);
528 }
529 // skip to the first position just after the next instance of a specified string
530 void skipAfter(const string& s)
531 {
532 auto cp = p_pos();
533 auto p = p_line.substr(cp).find(s);
534 if( p != string::npos )
535 setposLine(cp + p + s.length());
536 else
537 {
538 ostringstream oss;
539 oss << "skipAfter could not find string =" << s << "=";
540 errorAbort(oss.str());
541 }
542 }
543 // returns true if the end of the line is reached
544 bool lgEOL()
545 {
546 // skipping whitespace allows the trailing junk to be shown
547 // correctly by showLocation() if the test for EOL fails...
548 p_skipWS();
549 return p_ls.eof();
550 }
551 // check if EOL is reached and abort if this is not the case
552 void checkEOL()
553 {
554 if( !lgEOL() )
555 errorAbort("found unrecognized input at the end of this line");
556 }
557 // returns true if the end of the file is reached
558 bool lgEOF() const { return p_lgEOF; }
559 // returns true if the current line is an inline end-of-data marker
560 bool lgEODMarker() const;
561 // check if EOD is reached and abort if this is not the case
562 void checkEOD()
563 {
564 if( getline() && !lgEODMarker() )
565 errorAbort("found surplus input at the end of this file");
566 }
567 // get the current position in the stream buffer
568 long getpos() { return p_io.tellg(); }
569 // jump to specific position in the stream buffer (previously returned by getpos())
570 void setpos(long pos) { p_io.seekg(pos, p_io.beg); }
571 // CODE SMELL -- rewind file to the beginning
572 void rewind()
573 {
574 p_io.clear();
575 p_io.seekg(0);
576 p_line.clear();
577 p_nr = 0;
578 p_ls.str("");
579 p_ls.clear();
580 p_lgEOF = false;
581 }
582 // abort with specific error message
583 NORETURN void errorAbort(const string& msg, FILE *io = ioQQQ);
584 // non-fatal warning message
585 void warning(const string& msg, FILE *io = ioQQQ);
586};
587
589template <typename V>
591 const char * const m_keyword;
593public:
594 KeyAction(const char *keyword, const V &action) :
595 m_keyword(keyword), m_action(action) {}
596
597 const char *key(void) const
598 {
599 return m_keyword;
600 }
601 void operator()(realnum *v) const
602 {
603 m_action(v);
604 }
605};
606
608template <typename V>
609inline KeyAction<V> MakeKeyAction(const char *keyword, const V &action)
610{
611 return KeyAction<V>(keyword, action);
612}
613
616{
618public:
619 UnitConverter ( double unit ) : m_unit((realnum)unit) {}
620
621 void operator()( realnum *t ) const
622 {
623 *t *= m_unit;
624 }
625};
626
629template <typename T, typename V>
630bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
631{
632 bool lgFound = false;
633 for (unsigned long option=0; option < nlist; ++option)
634 {
635 if( p.nWord( list[option].key() ) )
636 {
637 list[option]( value );
638 lgFound = true;
639 break;
640 }
641 }
642 return lgFound;
643}
644
648void ParseCosmicRays( Parser &p );
649
653void ParseCosmology( Parser &p );
654
660
661void ParseAbundances(Parser &p);
662
664void ParseDont(Parser &p);
665
669void ParseSave(Parser &p);
670
672 /* true, return rel intensity, false, log of luminosity or intensity I */
673 bool lgLog3,
674 ostringstream& chHeader,
675 long int ipPun
676);
677
679 /* the file we will write to */
680 long int ipPun,
681 ostringstream& chHeader);
682
684 /* the header for the file, a list of identifications */
685 ostringstream& chHeader);
686
688
690void ParseAge(Parser &p);
691
695void ParseAgn(Parser &p);
696
702void ParseBlackbody(Parser &p);
703
707void ParseCompile(Parser &p );
708
710void ParseConstant(Parser &p);
711
715void ParseDLaw(Parser &p );
716
720void ParseTLaw(Parser &p);
721
726void ParseGrain(Parser &p);
727
729void ParseFluc(Parser &p);
730
732void ParseHDEN(Parser &p);
733
738void ParseDatabaseISO(long ipISO, Parser &p);
739
743void ParseDatabaseH2(Parser &p );
744
748void ParseGrid(Parser &p);
749
751void ParseInit(Parser &p);
752
754void ParseInitFile(const string& chName);
755
760void ParseInterp(Parser &p);
761
767void ParseIonParI(Parser &p);
768
774
775void ParseIonParX(Parser &p);
781void ParseIonPar(Parser &p,
782 char chType);
783
787void ParseNorm(Parser &p);
788
792void ParseOptimize(Parser &p);
793
797void ParsePrint(Parser &p );
798
800void ParseRadius(Parser &p);
801
803void ParseSet(Parser &p);
804
810void ParseTable(Parser &p);
811
813void ParseTrace(Parser &p);
814
815/*ParseExtinguish parse the extinguish command */
816void ParseExtinguish( Parser &p );
817
818/*ParseIllumination parse the illumination command */
819void ParseIllumination( Parser &p );
820
821/*ParseCaseB - parse the Case B command */
822void ParseCaseB(Parser &p );
823
825void ParseTest(Parser &p);
826
828void ParseAbsMag(Parser &p);
829
831void ParseBackgrd(Parser &p);
832
834void ParseCoronal(Parser &p);
835
837void ParseElement(Parser &p);
838
844void ParseCMB(double z,
845 long int *nqh);
846
854void ParseF_nu(
855 Parser &p,
856 const char *chType,
857 bool lgNU2);
858
862void ParseGlobule(Parser &p);
863
865void ParseRangeOption(Parser &p);
866
868void ParseMap(Parser &p);
869
871void ParseMetal(Parser &p);
872
873void ParseLineList(Parser &p, vector<LineID>& lines);
874
875void ParsePrtLineSum(Parser &p);
876
879
881void ParseRatio(Parser &p);
882
884void ParseSphere(Parser &p);
885
887void ParseStop(Parser &p);
888
892void ParseCrashDo(Parser &p);
893
894class Option {
895public:
898 union {
899 bool l;
900 long i;
901 double r;
902 };
903 string s;
904 Option(bool val)
905 {
907 l = val;
908 }
909 Option(long val)
910 {
912 i = val;
913 }
914 Option(double val)
915 {
917 r = val;
918 }
919 Option(const string& val, enum Quoted q)
920 {
921 if (q == QUOTED)
923 else
925 s = val;
926 }
927};
928
930{
932public:
933 vector< pair<string, shared_ptr<Option> > > p;
934 Properties() : m_lgDone(false) {}
935 void setDone()
936 {
937 m_lgDone = true;
938 }
939 bool isDone() const
940 {
941 return m_lgDone;
942 }
943};
944
945#endif // _PARSER_H_
FILE * ioQQQ
Definition cddefines.cpp:9
float sys_float
Definition cddefines.h:130
#define NULL
Definition cddefines.h:115
#define ASSERT(exp)
Definition cddefines.h:637
float realnum
Definition cddefines.h:127
int fprintf(const Output &stream, const char *format,...)
Definition service.cpp:1325
void caps(char *chCard)
Definition service.cpp:299
NORETURN void TotalInsanity(void)
Definition service.cpp:1174
long min(int a, long b)
Definition cddefines.h:766
void getKeyword(string &str)
Definition parser.h:513
size_t p_pos()
Definition parser.h:359
void p_replaceSep()
Definition parser.h:390
NORETURN void errorAbort(const string &msg, FILE *io=ioQQQ)
Definition parser.cpp:1470
DataParser(const string &name, eod_style es, access_scheme as=AS_DEFAULT)
Definition parser.h:413
fstream p_io
the name of the data file
Definition parser.h:322
void checkMagic(long i0)
Definition parser.cpp:1271
bool p_lgEOF
stream for reading current line
Definition parser.h:327
void setposLine(size_t p)
Definition parser.h:523
void p_pos(size_t p)
Definition parser.h:368
bool getTokenOptional(T &var)
Definition parser.h:445
void open(const string &name, eod_style es, access_scheme as=AS_DEFAULT)
Definition parser.h:418
bool lgEODMarker() const
Definition parser.cpp:1456
void getLineID(LineID &line, bool lgAtStart=true)
Definition parser.cpp:1344
size_t getTokenOptional(T var[], size_t n)
Definition parser.h:457
bool lgEOL()
Definition parser.h:544
size_t p_nr
the current line being read
Definition parser.h:325
void getQuote(string &str)
Definition parser.h:500
void getToken(T &var)
Definition parser.h:472
string p_filename
Definition parser.h:321
void close()
Definition parser.h:424
istringstream p_ls
number of the line we are parsing
Definition parser.h:326
bool isOpen() const
Definition parser.h:429
bool getKeywordOptional(string &str)
Definition parser.h:506
void setline(const string &line)
Definition parser.h:438
void p_skipWS()
Definition parser.h:375
bool getQuoteOptional(string &str)
Definition parser.h:489
long getpos()
Definition parser.h:568
bool p_isSeparator(char c)
Definition parser.h:385
bool lgEOF() const
Definition parser.h:558
long getposLine()
Definition parser.h:521
void setpos(long pos)
Definition parser.h:570
bool p_blankLine() const
Definition parser.h:347
void p_newlineProcess()
Definition parser.cpp:1214
string p_line
what are the allowed EOD markers?
Definition parser.h:324
void skipAfter(const string &s)
Definition parser.h:530
void rewind()
Definition parser.h:572
void p_getQuoteOptional(string &str)
Definition parser.cpp:1242
void p_open(const string &name, eod_style es, access_scheme as)
have we passed beyond the EOF?
Definition parser.cpp:1189
bool getline()
Definition parser.cpp:1327
void p_showLocation(size_t p, FILE *io)
Definition parser.cpp:1225
DataParser()
Definition parser.h:408
void p_close()
Definition parser.cpp:1199
void checkEOL()
Definition parser.h:552
eod_style p_es
stream for reading data file
Definition parser.h:323
bool p_isComment() const
Definition parser.h:334
void getToken(T var[], size_t n)
Definition parser.h:479
void checkEOD()
Definition parser.h:562
void warning(const string &msg, FILE *io=ioQQQ)
Definition parser.cpp:1486
Definition depth_table.h:8
Definition parser.h:590
const char * key(void) const
Definition parser.h:597
V m_action
Definition parser.h:592
const char *const m_keyword
Definition parser.h:591
void operator()(realnum *v) const
Definition parser.h:601
KeyAction(const char *keyword, const V &action)
Definition parser.h:594
Definition lines.h:15
Opts
Definition parser.h:896
@ BOOL
Definition parser.h:896
@ LONG
Definition parser.h:896
@ STRING
Definition parser.h:896
@ INVALID
Definition parser.h:896
@ OPTION
Definition parser.h:896
@ REAL
Definition parser.h:896
long i
Definition parser.h:900
bool l
Definition parser.h:899
Option(long val)
Definition parser.h:909
string s
Definition parser.h:903
Option(bool val)
Definition parser.h:904
double r
Definition parser.h:901
Quoted
Definition parser.h:897
@ QUOTED
Definition parser.h:897
@ NOTQUOTED
Definition parser.h:897
Option(double val)
Definition parser.h:914
Option(const string &val, enum Quoted q)
Definition parser.h:919
enum Option::Opts opttype
Definition parser.h:43
Symbol getSymbol()
Definition parser.cpp:990
int nMatch1(const char *chKey) const
Definition parser.h:136
Parser(const CloudyCommand *commands)
Definition parser.h:61
long int GetElem(void) const
Definition parser.cpp:402
bool m_lgEOL
Definition parser.h:49
double FFmtRead(void)
Definition parser.cpp:561
bool nMatch(const char *chKey) const
Definition parser.h:164
void showLocation(FILE *io=ioQQQ) const
Definition parser.cpp:156
string m_card
Definition parser.h:44
int getElement()
Definition parser.cpp:902
bool lgReachedEnd()
Definition parser.cpp:150
t_wavl getWaveOpt()
Definition parser.cpp:437
bool Command(const char *name, OptionParser doOpts)
Definition parser.h:213
bool nMatchErase(const char *chKey)
Definition parser.h:188
const char * nWord(const char *chKey) const
Definition parser.cpp:43
bool getline()
Definition parser.cpp:316
bool hasCommand(const string &s2)
Definition parser.cpp:834
void readList(vector< string > &list, const char *chName)
Definition parser.cpp:1115
LineID getLineID(bool lgAtStart=true)
Definition parser.cpp:673
bool peekNextCommand(const string &s2)
Definition parser.cpp:850
void newlineProcess()
Definition parser.cpp:86
bool GetParam(const char *chKey, double *val)
Definition parser.h:168
void set_point(long int ipnt)
Definition parser.h:108
const char * StandardEnergyUnit(void) const
Definition parser.cpp:367
double getNumberCheckAlwaysLog(const char *chDesc)
Definition parser.cpp:516
Parser(void)
Definition parser.h:57
void getPairs(vector< double > &a, vector< double > &b)
Definition parser.cpp:934
std::map< string, size_t > m_uniqueLen
Definition parser.h:52
char current(void) const
Definition parser.h:88
long int m_len
Definition parser.h:47
string getFirstChunk(long i)
Definition parser.cpp:643
bool m_lgDSet
Definition parser.h:55
void skip_whitespace()
Definition parser.cpp:56
int GetQuote(string &chLabel)
Definition parser.cpp:259
bool isComment(void) const
Definition parser.cpp:186
bool last(void) const
Definition parser.cpp:242
bool lgEOL(void) const
Definition parser.h:126
string StandardFluxUnit(void) const
Definition parser.cpp:371
double getNumberPlain(const char *chDesc)
Definition parser.cpp:477
string m_getCommandToken() const
Definition parser.cpp:895
double getNumberCheckLogLinNegImplLog(const char *chDesc)
Definition parser.cpp:499
std::map< string, double > m_symtab
Definition parser.h:51
char current_raw() const
Definition parser.cpp:52
double getNumberCheck(const char *chDesc)
Definition parser.cpp:481
t_wavl getWave()
Definition parser.cpp:468
NORETURN void NoNumb(const char *chDesc) const
Definition parser.cpp:426
double getNumberCheckAlwaysLogLim(const char *chDesc, double flim)
Definition parser.cpp:522
std::string getVarName(void)
Definition parser.cpp:194
void echo(void) const
Definition parser.cpp:235
bool nMatchSkip(const string &chKey, size_t nmin=4)
Definition parser.cpp:61
void setline(const string &card)
Definition parser.cpp:353
double getNumberDefault(const char *chDesc, double fdef)
Definition parser.cpp:490
string ClosestMatch(const string &token) const
Definition parser.cpp:865
bool m_lgEOF
Definition parser.h:55
double getNumberDefaultAlwaysLog(const char *chDesc, double fdef)
Definition parser.cpp:535
const CloudyCommand *const m_Commands
Definition parser.h:50
long int m_nqh
Definition parser.h:54
void init()
Definition parser.h:66
string getFirstChunkRaw(long i)
Definition parser.cpp:658
string m_card_raw
Definition parser.h:45
void setEOL(bool val)
Definition parser.h:130
string getRawTail()
Definition parser.h:239
void doSetVar(void)
Definition parser.cpp:207
NORETURN void StringError() const
Definition parser.cpp:249
NORETURN void CommandError(void) const
Definition parser.cpp:300
size_t m_getUniqueLen(const string &s2) const
Definition parser.h:95
void readLaw(DepthTable &table)
Definition parser.cpp:1142
bool isVar(void) const
Definition parser.cpp:190
int PrintLine(FILE *fp) const
Definition parser.h:227
void help(FILE *fp) const
Definition parser.cpp:375
bool GetRange(const char *chKey, t_wavl &val1, t_wavl &val2)
Definition parser.h:177
long int m_off
Definition parser.h:48
NORETURN void Error(const char *msg) const
Definition parser.cpp:289
double getNumberDefaultNegImplLog(const char *chDesc, double fdef)
Definition parser.cpp:544
bool at_end() const
Definition parser.cpp:48
string m_card_comment
Definition parser.h:46
Properties()
Definition parser.h:934
bool m_lgDone
Definition parser.h:931
void setDone()
Definition parser.h:935
bool isDone() const
Definition parser.h:939
vector< pair< string, shared_ptr< Option > > > p
Definition parser.h:933
Definition parser.h:33
enum tokens toktype
Definition parser.h:36
Symbol(enum tokens t, const string &v)
Definition parser.h:38
tokens
Definition parser.h:35
@ NUMBER
Definition parser.h:35
@ EOSTAT
Definition parser.h:35
@ OPERATOR
Definition parser.h:35
@ ERROR
Definition parser.h:35
@ STRING
Definition parser.h:35
@ NAME
Definition parser.h:35
@ NTOKS
Definition parser.h:35
string value
Definition parser.h:37
void operator()(realnum *t) const
Definition parser.h:621
const realnum m_unit
Definition parser.h:617
UnitConverter(double unit)
Definition parser.h:619
Definition cddefines.h:1299
access_scheme
Definition cpu.h:257
@ AS_DEFAULT
Definition cpu.h:257
#define NORETURN
Definition cpu.h:461
void lines(void)
Definition prt_lines.cpp:56
void parse_save_colden(Parser &p, ostringstream &chHeader)
void ParseSet(Parser &p)
Definition parse_set.cpp:37
void ParseAbsMag(Parser &p)
Definition parse_absmag.cpp:9
void ParseGrain(Parser &p)
Definition parse_grain.cpp:12
void ParseInitFile(const string &chName)
Definition parse_init.cpp:47
void Parse_Save_Line_RT(Parser &p)
Definition save_line.cpp:203
void ParseF_nu(Parser &p, const char *chType, bool lgNU2)
Definition parse_f_nu.cpp:9
void ParseDont(Parser &p)
Definition parse_dont.cpp:28
void getTokenOptionalImpl(istringstream &iss, const string &, T &var)
Definition parser.h:256
void ParseAge(Parser &p)
Definition parse_age.cpp:38
void ParseSphere(Parser &p)
Definition parse_sphere.cpp:9
void ParseLineList(Parser &p, vector< LineID > &lines)
Definition prt_linesum.cpp:14
void ParseGrid(Parser &p)
Definition parse_grid.cpp:10
void ParseAgn(Parser &p)
Definition parse_agn.cpp:10
void ParseTest(Parser &p)
Definition parse_test.cpp:20
void ParseDatabaseH2(Parser &p)
Definition parse_atom_h2.cpp:10
void ParseRadius(Parser &p)
Definition parse_radius.cpp:13
void ParseDatabaseISO(long ipISO, Parser &p)
Definition parse_atom_iso.cpp:16
void ParsePrint(Parser &p)
Definition parse_print.cpp:134
void ParseExtinguish(Parser &p)
Definition parse_extinguish.cpp:9
void ParseRangeOption(Parser &p)
Definition parse_rangeoption.cpp:8
void ParseBlackbody(Parser &p)
Definition parse_blackbody.cpp:11
void ParseMap(Parser &p)
Definition parse_map.cpp:9
void ParseElement(Parser &p)
Definition parse_element.cpp:17
void ParseRatio(Parser &p)
Definition parse_ratio.cpp:10
void ParseNorm(Parser &p)
Definition parse_norm.cpp:10
void ParseCosmology(Parser &p)
Definition parse_cosmology.cpp:9
void ParseInterp(Parser &p)
Definition parse_interp.cpp:11
bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
Definition parser.h:630
void ParseGlobule(Parser &p)
Definition parse_globule.cpp:11
bool isBoundaryChar(char c)
Definition parser.cpp:171
void ParseMetal(Parser &p)
Definition parse_metal.cpp:239
void ParseOptimize(Parser &p)
Definition parse_optimize.cpp:30
void ParseIonParI(Parser &p)
Definition parse_ionpar.cpp:11
void parse_save_average(Parser &p, long int ipPun, ostringstream &chHeader)
Definition save_average.cpp:11
void ParseTable(Parser &p)
Definition parse_table.cpp:94
void ParsePrtLineSum(Parser &p)
Definition prt_linesum.cpp:42
void ParseSave(Parser &p)
Definition parse_save.cpp:85
void ParseTrace(Parser &p)
Definition parse_trace.cpp:11
void ParseFluc(Parser &p)
Definition parse_fluc.cpp:9
void ParseAbundancesNonSolar(Parser &p)
void ParsePowerlawContinuum(Parser &p)
Definition parse_powerlawcontinuum.cpp:10
void ParseAbundances(Parser &p)
Definition parse_abundances.cpp:18
void ParseStop(Parser &p)
Definition parse_stop.cpp:17
const char * nWord(const char *chKey, const char *chCard)
Definition parser.cpp:103
void ParseConstant(Parser &p)
Definition parse_constant.cpp:14
void ParseIonPar(Parser &p, char chType)
Definition parse_ionpar.cpp:20
void ParseInit(Parser &p)
Definition parse_init.cpp:10
KeyAction< V > MakeKeyAction(const char *keyword, const V &action)
Definition parser.h:609
void ParseCrashDo(Parser &p)
Definition parse_crashdo.cpp:51
bool isSeparatorChar(char c)
Definition parser.cpp:181
void ParseBackgrd(Parser &p)
Definition parse_backgrd.cpp:10
void ParseIonParX(Parser &p)
Definition parse_ionpar.cpp:15
void ParseDLaw(Parser &p)
Definition parse_dlaw.cpp:10
void ParseIllumination(Parser &p)
Definition parse_illumination.cpp:11
eod_style
Definition parser.h:318
@ ES_STARS_AND_BLANKS
Definition parser.h:318
@ ES_STARS_ONLY
Definition parser.h:318
@ ES_NONE
Definition parser.h:318
@ ES_INVALID
Definition parser.h:318
void ParseHDEN(Parser &p)
Definition parse_hden.cpp:10
void ParseCosmicRays(Parser &p)
Definition parse_cosmic_rays.cpp:12
void(* OptionParser)(Parser &)
Definition parser.h:23
void ParseCMB(double z, long int *nqh)
Definition parse_CMB.cpp:10
void ParseCompile(Parser &p)
Definition parse_compile.cpp:14
void ParseCaseB(Parser &p)
Definition parse_caseb.cpp:9
void ParseCoronal(Parser &p)
Definition parse_coronal.cpp:14
void parse_save_line(Parser &p, bool lgLog3, ostringstream &chHeader, long int ipPun)
void ParseTLaw(Parser &p)
Definition parse_tlaw.cpp:13
STATIC long int ipPun
Definition save_do.cpp:368
void IntRead(istringstream &iss, const string &s, long long &value)
Definition service.cpp:649
void FPRead(istringstream &iss, const string &s, double &value)
Definition service.cpp:548
Definition parser.h:25
OptionParser action
Definition parser.h:27
const char * name
Definition parser.h:26
Definition cpu.h:446
static const bool value
Definition cpu.h:447
Definition thirdparty.h:517
size_t findUniqueLen(trieNode *root, const string &token)
Definition thirdparty.cpp:5153
void insertToken(trieNode *root, const string &token)
Definition thirdparty.cpp:5129