47using std::istream, std::endl;
55 _is(&is), _atEOL(false), _atEOF(false), _prefix(
""), _punct(
"()[]<>|/\\:?.,=+-&^%$#@!`~")
65 _is(&is), _atEOL(false), _atEOF(false), _prefix(errorPrefix), _punct(
"()[]<>|/\\:?.,=+-&^%$#@!`~")
75 return (nc==
'\n'||nc==-1) ;
118 bool quotedString(
false);
119 bool lineCont(
false);
124 bool haveINF(
false) ;
128 if (
_is->eof() ||
_is->fail()) {
134 if (
_is->peek()==
'\n') {
138 while (
_is->peek()==
'#') {
146 if (bufptr >= 63999) {
147 oocoutW(
nullptr, InputArguments)
148 <<
"RooStreamParser::readToken: token length exceeds buffer capacity, terminating token early" << std::endl;
158 if (
_is->eof() ||
_is->fail() ||
c==
'\n') break ;
164 }
else if (!quotedString) {
170 if (
c ==
'.' ||
c==
'-' ||
c==
'+' ||
c==
'/' ||
c==
'\\') {
174 if (cnext==
'I' || cnext==
'i') {
181 haveINF = ((cnext ==
'I' && tmp1 ==
'N' && tmp2 ==
'F') || (cnext ==
'i' && tmp1 ==
'n' && tmp2 ==
'f'));
186 _is->putback(cnext) ;
191 if (
c==
'\\' && cnext==
'\\') {
200 if (
c==
'/' && cnext==
'/') {
209 }
else if (!quotedString) {
218 if (
isPunctChar(
c) && !(
c==
'.' && (isdigit(cnext)||isdigit(cprev)))
219 && !((
c==
'-'||
c==
'+') && isdigit(cnext) && (cprev ==
'e' || cprev ==
'E'))
220 && (!first || !((
c==
'-'||
c==
'+') && (isdigit(cnext)||cnext==
'.'||haveINF)))) {
236 if (
c==
'"' && !first) {
249 if (
_is->eof() ||
_is->bad()) {
255 oocoutW(
nullptr,InputArguments) <<
"RooStreamParser::readToken: closing quote (\") missing" << std::endl ;
266 while ((isspace(
c) ||
c==
'/') &&
c !=
'\n') {
269 if (
_is->peek()==
'/') {
283 if (bufptr==0 && lineCont) {
305 if (
_is->peek() ==
'\n')
309 _is->getline(buffer, nfree,
'\n');
312 char *pcontseq = strstr(buffer,
"\\\\");
314 nfree -= (pcontseq - buffer);
316 _is->getline(pcontseq, nfree,
'\n');
318 char *nextpcontseq = strstr(pcontseq,
"\\\\");
320 nfree -= (nextpcontseq - pcontseq);
321 pcontseq = nextpcontseq;
325 char *pcomment = strstr(buffer,
"//");
330 char *pstart = buffer;
331 while (isspace(*pstart)) {
334 char *pend = buffer + strlen(buffer) - 1;
336 while (isspace(*pend)) {
341 if (
_is->eof() ||
_is->fail()) {
359 if (
_is->peek()!=
'\n') {
365 _is->getline(buffer, nfree,
'\n');
369 char *pcontseq = strstr(buffer,
"\\\\");
371 nfree -= (pcontseq - buffer);
373 _is->getline(pcontseq, nfree,
'\n');
375 char *nextpcontseq = strstr(pcontseq,
"\\\\");
377 nfree -= (nextpcontseq - pcontseq);
378 pcontseq = nextpcontseq;
398 oocoutW(
nullptr,InputArguments) <<
_prefix <<
": parse error, expected '"
399 << expected <<
"'" <<
", got '" << token <<
"'" << std::endl ;
414 if (token.
IsNull())
return true ;
437 if (token.
IsNull())
return true ;
449 char* endptr =
nullptr;
455 oocoutE(
nullptr,InputArguments)<<
_prefix <<
": parse error, cannot convert '"
456 << token <<
"'" <<
" to integer" << std::endl ;
471 if (token.
IsNull())
return true ;
485 strncpy(buffer, token.
Data(), 63999);
486 if (token.
Length() >= 63999) {
487 oocoutW(
nullptr, InputArguments) <<
"RooStreamParser::convertToString: token length exceeds 63999, truncated"
491 int len = strlen(buffer) ;
494 if ((
len) && (buffer[
len-1]==
'"'))
498 ptr=(buffer[0]==
'"') ? buffer+1 : buffer ;
double toDouble(const char *s)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
bool convertToInteger(const TString &token, Int_t &value)
Convert given string to an Int_t.
bool readString(TString &value, bool zapOnError=false)
Read a string token.
void setPunctuation(const TString &punct)
Change list of characters interpreted as punctuation.
bool isPunctChar(char c) const
Check if given char is considered punctuation.
bool expectToken(const TString &expected, bool zapOnError=false)
Read the next token and return true if it is identical to the given 'expected' token.
bool convertToDouble(const TString &token, double &value)
Convert given string to a double. Throws exceptions if the conversion fails.
bool atEOL()
If true, parser is at end of line in stream.
TString readLine()
Read an entire line from the stream and return as TString This method recognizes the use of '\' in th...
bool readDouble(double &value, bool zapOnError=false)
Read the next token and convert it to a double.
TString readToken()
Read one token separated by any of the know punctuation characters This function recognizes and handl...
bool readInteger(Int_t &value, bool zapOnError=false)
Read a token and convert it to an Int_t.
void zapToEnd(bool inclContLines=false)
Eat all characters up to and including then end of the current line.
bool convertToString(const TString &token, TString &string)
Convert given token to a string (i.e. remove eventual quotation marks)
RooStreamParser(std::istream &is)
Construct parser on given input stream.
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
const char * Data() const