/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
//
// RooStreamParser is a utility class to parse istreams into tokens and optionally
// convert them into basic types (double,int,string)
// 
// The general tokenizing philosophy is that there are two kinds of tokens: value
// and punctuation. The former are variable length, the latter always
// one character. A token is terminated if one of the following conditions
// occur
//         - space character found (' ',tab,newline)
//         - change of token type (value -> punctuation or vv)
//         - end of fixed-length token (punctuation only)
//         - start or end of quoted string
//
// The parser is aware of floating point notation and will assign leading
// minus signs, decimal points etc to a value token when this is obvious
// from the context. The definition of what is punctuation can be redefined.
//


#include "RooFit.h"

#include "Riostream.h"
#include "Riostream.h"
#include <stdlib.h>
#include <ctype.h>

#ifndef _WIN32
#include <strings.h>
#endif

#include "RooStreamParser.h"
#include "RooMsgService.h"
#include "RooNumber.h"


using namespace std;

ClassImp(RooStreamParser)


//_____________________________________________________________________________
RooStreamParser::RooStreamParser(istream& is) : 
  _is(&is), _atEOL(kFALSE), _atEOF(kFALSE), _prefix(""), _punct("()[]<>|/\\:?.,=+-&^%$#@!`~")
{
  // Construct parser on given input stream
}


//_____________________________________________________________________________
RooStreamParser::RooStreamParser(istream& is, const TString& errorPrefix) : 
  _is(&is), _atEOL(kFALSE), _atEOF(kFALSE), _prefix(errorPrefix), _punct("()[]<>|/\\:?.,=+-&^%$#@!`~")
{
  // Construct parser on given input stream. Use given errorPrefix to 
  // prefix any parsing error messages
}



//_____________________________________________________________________________
RooStreamParser::~RooStreamParser()
{
  // Destructor
}



//_____________________________________________________________________________
Bool_t RooStreamParser::atEOL() 
{ 
  // If true, parser is at end of line in stream

  Int_t nc(_is->peek()) ; 
  return (nc=='\n'||nc==-1) ; 
}



//_____________________________________________________________________________
void RooStreamParser::setPunctuation(const TString& punct) 
{
  // Change list of characters interpreted as punctuation

  _punct = punct ;
}



//_____________________________________________________________________________
Bool_t RooStreamParser::isPunctChar(char c) const 
{
  // Check if given char is considered punctuation

  const char* punct = _punct.Data() ;
  for (int i=0 ; i<_punct.Length() ; i++)
    if (punct[i] == c) {
      return kTRUE ;
    }
  return kFALSE ;
}



//_____________________________________________________________________________
TString RooStreamParser::readToken() 
{
  // Read one token separated by any of the know punctuation characters
  // This function recognizes and handles comment lines in the istream (those
  // starting with '#', quoted strings ("") the content of which is not tokenized
  // and '+-.' characters that are part of a floating point numbers and are exempt
  // from being interpreted as a token separator in case '+-.' are defined as
  // token separators.

  // Smart tokenizer. Absorb white space and token must be either punctuation or alphanum
  Bool_t first(kTRUE), quotedString(kFALSE), lineCont(kFALSE) ;
  char buffer[10240], c(0), cnext, cprev=' ' ;
  Bool_t haveINF(kFALSE) ;
  Int_t bufptr(0) ;

  // Check for end of file 
   if (_is->eof() || _is->fail()) {
     _atEOF = kTRUE ;
     return TString("") ;
   }

  //Ignore leading newline
  if (_is->peek()=='\n') {
    _is->get(c) ;

    // If new line starts with #, zap it    
    while (_is->peek()=='#') {
      zapToEnd(kFALSE) ;
      _is->get(c) ; // absorb newline
    }
  }

  while(1) {
    // Buffer overflow protection
    if (bufptr>=10239) {
      oocoutW((TObject*)0,InputArguments) << "RooStreamParser::readToken: token length exceeds buffer capacity, terminating token early" << endl ;
      break ;
    }

    // Read next char
    _is->get(c) ;



    // Terminate at EOF, EOL or trouble
    if (_is->eof() || _is->fail() || c=='\n') break ;

    // Terminate as SPACE, unless we haven't seen any non-SPACE yet
    if (isspace(c)) {
      if (first) 
	continue ; 
      else 
	if (!quotedString) {
	  break ;
	}
    }

    // If '-' or '/' see what the next character is
    if (c == '.' || c=='-' || c=='+' || c=='/' || c=='\\') {
      _is->get(cnext) ;


      if (cnext=='I' || cnext=='i') {
	char tmp1,tmp2 ;
	_is->get(tmp1) ;
	_is->get(tmp2) ;
	_is->putback(tmp2) ;
	_is->putback(tmp1) ;
	haveINF = ((cnext=='I' && tmp1 == 'N' && tmp2 == 'F') || (cnext=='i' && tmp1 == 'n' && tmp2 == 'f')) ;
      } else {
	haveINF = kFALSE ;
      }

      _is->putback(cnext) ;
    }


    // Check for line continuation marker
    if (c=='\\' && cnext=='\\') {
      // Kill rest of line including endline marker
      zapToEnd(kFALSE) ;
      _is->get(c) ;
      lineCont=kTRUE ;
      break ;
    }

    // Stop if begin of comments is encountered
    if (c=='/' && cnext=='/') {
      zapToEnd(kFALSE) ;
      break ;
    }

    // Special handling of quoted strings
    if (c=='"') {
      if (first) {
	quotedString=kTRUE ;		
      } else if (!quotedString) {
	// Terminate current token. Next token will be quoted string
	_is->putback('"') ;
	break ;
      }
    }

    if (!quotedString) {
      // Decide if next char is punctuation (exempt - and . that are part of floating point numbers, or +/- preceding INF)
      if (isPunctChar(c) && !(c=='.' && (isdigit(cnext)||isdigit(cprev))) 
	  && (!first || !((c=='-'||c=='+') && (isdigit(cnext)||cnext=='.'||haveINF)))) {

	if (first) {
	  // Make this a one-char punctuation token
	  buffer[bufptr++]=c ;
	  break ;
	} else {
	  // Put back punct. char and terminate current alphanum token
	  _is->putback(c) ;
	  break ;
	} 
      }       
    } else {
      // Inside quoted string conventional tokenizing rules do not apply

      // Terminate token on closing quote
      if (c=='"' && !first) {
	buffer[bufptr++]=c ;	
	quotedString=kFALSE ;
	break ;
      }
    }

    // Store in buffer
    buffer[bufptr++]=c ;
    first=kFALSE ;
    cprev=c ;
  }

  if (_is->eof() || _is->bad()) {
    _atEOF = kTRUE ;
  }

  // Check if closing quote was encountered
  if (quotedString) {
    oocoutW((TObject*)0,InputArguments) << "RooStreamParser::readToken: closing quote (\") missing" << endl ;
  }

  // Absorb trailing white space or absorb rest of line if // is encountered
  if (c=='\n') {
    if (!lineCont) {
      _is->putback(c) ;
    }
  } else {
    c = _is->peek() ;

    while ((isspace(c) || c=='/') && c != '\n') {
      if (c=='/') {
	_is->get(c) ;
	if (_is->peek()=='/') {
	  zapToEnd(kFALSE) ;	
	} else {
	  _is->putback('/') ;
	}
	break ;
      } else {
	_is->get(c) ;
	c = _is->peek() ;
      }
    }
  }

  // If no token was read line is continued, return first token on next line
  if (bufptr==0 && lineCont) {
    return readToken() ;
  }
  
  // Zero terminate buffer and convert to TString
  buffer[bufptr]=0 ;
  return TString(buffer) ;
}



//_____________________________________________________________________________
TString RooStreamParser::readLine() 
{
  // Read an entire line from the stream and return as TString
  // This method recognizes the use of '\\' in the istream 
  // as line continuation token.

  char c,buffer[10240] ;
  Int_t nfree(10239) ; 
  
  if (_is->peek()=='\n') _is->get(c) ;

  // Read till end of line
  _is->getline(buffer,nfree,'\n') ;

  // Look for eventual continuation line sequence  
  char *pcontseq = strstr(buffer,"\\\\") ;
  if (pcontseq) nfree -= (pcontseq-buffer) ;
  while(pcontseq) {
    _is->getline(pcontseq,nfree,'\n') ;

    char* nextpcontseq = strstr(pcontseq,"\\\\") ;
    if (nextpcontseq) nfree -= (nextpcontseq-pcontseq) ;
    pcontseq = nextpcontseq ;
  }    

  // Chop eventual comments
  char *pcomment = strstr(buffer,"//") ;
  if (pcomment) *pcomment=0 ;

  // Chop leading and trailing space
  char *pstart=buffer ;
  while (isspace(*pstart)) {
    pstart++ ;
  }
  char *pend=buffer+strlen(buffer)-1 ;
  if (pend>pstart)
    while (isspace(*pend)) { *pend--=0 ; }

  if (_is->eof() || _is->fail()) {
    _atEOF = kTRUE ;
  }

  // Convert to TString
  return TString(pstart) ;
}



//_____________________________________________________________________________
void RooStreamParser::zapToEnd(Bool_t inclContLines) 
{
  // Eat all characters up to and including then end of the
  // current line. If inclContLines is kTRUE, all continuation lines
  // marked by the '\\' token are zapped as well

  // Skip over everything until the end of the current line
  if (_is->peek()!='\n') {

    char buffer[10240] ;
    Int_t nfree(10239) ; 

    // Read till end of line
    _is->getline(buffer,nfree,'\n') ;

    if (inclContLines) {
      // Look for eventual continuation line sequence  
      char *pcontseq = strstr(buffer,"\\\\") ;
      if (pcontseq) nfree -= (pcontseq-buffer) ;
      while(pcontseq) {
	_is->getline(pcontseq,nfree,'\n') ;
	
	char* nextpcontseq = strstr(pcontseq,"\\\\") ;
	if (nextpcontseq) nfree -= (nextpcontseq-pcontseq) ;
	pcontseq = nextpcontseq ;
      }    
    }

    // Put back newline character in stream buffer
   _is->putback('\n') ;
  }
}



//_____________________________________________________________________________
Bool_t RooStreamParser::expectToken(const TString& expected, Bool_t zapOnError) 
{
  // Read the next token and return kTRUE if it is identical to the given 'expected' token.

  TString token(readToken()) ;

  Bool_t error=token.CompareTo(expected) ;
  if (error && !_prefix.IsNull()) {
    oocoutW((TObject*)0,InputArguments) << _prefix << ": parse error, expected '" 
					<< expected << "'" << ", got '" << token << "'" << endl ;
    if (zapOnError) zapToEnd(kTRUE) ;
  }
  return error ;
}



//_____________________________________________________________________________
Bool_t RooStreamParser::readDouble(Double_t& value, Bool_t /*zapOnError*/) 
{
  // Read the next token and convert it to a Double_t. Returns true
  // if an error occurred in reading or conversion

  TString token(readToken()) ;
  if (token.IsNull()) return kTRUE ;
  return convertToDouble(token,value) ;
  
}



//_____________________________________________________________________________
Bool_t RooStreamParser::convertToDouble(const TString& token, Double_t& value) 
{
  // Convert given string to a double. Return true if the conversion fails.

  char* endptr = 0;
  const char* data=token.Data() ;

  // Handle +/- infinity cases, (token is guaranteed to be >1 char long)
  if (!strcasecmp(data,"inf") || !strcasecmp(data+1,"inf")) {
    value = (data[0]=='-') ? -RooNumber::infinity() : RooNumber::infinity() ;
    return kFALSE ;
  }

  value = strtod(data,&endptr) ;
  Bool_t error = (endptr-data!=token.Length()) ;

  if (error && !_prefix.IsNull()) {
    oocoutE((TObject*)0,InputArguments) << _prefix << ": parse error, cannot convert '" 
					<< token << "'" << " to double precision" <<  endl ;
  }
  return error ;
}



//_____________________________________________________________________________
Bool_t RooStreamParser::readInteger(Int_t& value, Bool_t /*zapOnError*/) 
{
  // Read a token and convert it to an Int_t. Returns true
  // if an error occurred in reading or conversion

  TString token(readToken()) ;
  if (token.IsNull()) return kTRUE ;
  return convertToInteger(token,value) ;
}



//_____________________________________________________________________________
Bool_t RooStreamParser::convertToInteger(const TString& token, Int_t& value) 
{
  // Convert given string to an Int_t. Returns true if an error
  // occurred in conversion

  char* endptr = 0;
  const char* data=token.Data() ;
  value = strtol(data,&endptr,10) ;
  Bool_t error = (endptr-data!=token.Length()) ;

  if (error && !_prefix.IsNull()) {
    oocoutE((TObject*)0,InputArguments)<< _prefix << ": parse error, cannot convert '" 
				       << token << "'" << " to integer" <<  endl ;
  }
  return error ;
}



//_____________________________________________________________________________
Bool_t RooStreamParser::readString(TString& value, Bool_t /*zapOnError*/) 
{
  // Read a string token. Returns true if an error occurred in reading
  // or conversion.  If a the read token is enclosed in quotation
  // marks those are stripped in the returned value

  TString token(readToken()) ;
  if (token.IsNull()) return kTRUE ;
  return convertToString(token,value) ;
}



//_____________________________________________________________________________
Bool_t RooStreamParser::convertToString(const TString& token, TString& string) 
{
  // Convert given token to a string (i.e. remove eventual quotation marks)

  // Transport to buffer 
  char buffer[10240],*ptr ;
  strncpy(buffer,token.Data(),10239) ;
  if (token.Length()>=10239) {
    oocoutW((TObject*)0,InputArguments) << "RooStreamParser::convertToString: token length exceeds 1023, truncated" << endl ;
    buffer[10239]=0 ;
  }
  int len = strlen(buffer) ;

  // Remove trailing quote if any
  if ((len) && (buffer[len-1]=='"'))
    buffer[len-1]=0 ;

  // Skip leading quote, if present
  ptr=(buffer[0]=='"') ? buffer+1 : buffer ;

  string = ptr ;
  return kFALSE ;
}
 RooStreamParser.cxx:1
 RooStreamParser.cxx:2
 RooStreamParser.cxx:3
 RooStreamParser.cxx:4
 RooStreamParser.cxx:5
 RooStreamParser.cxx:6
 RooStreamParser.cxx:7
 RooStreamParser.cxx:8
 RooStreamParser.cxx:9
 RooStreamParser.cxx:10
 RooStreamParser.cxx:11
 RooStreamParser.cxx:12
 RooStreamParser.cxx:13
 RooStreamParser.cxx:14
 RooStreamParser.cxx:15
 RooStreamParser.cxx:16
 RooStreamParser.cxx:17
 RooStreamParser.cxx:18
 RooStreamParser.cxx:19
 RooStreamParser.cxx:20
 RooStreamParser.cxx:21
 RooStreamParser.cxx:22
 RooStreamParser.cxx:23
 RooStreamParser.cxx:24
 RooStreamParser.cxx:25
 RooStreamParser.cxx:26
 RooStreamParser.cxx:27
 RooStreamParser.cxx:28
 RooStreamParser.cxx:29
 RooStreamParser.cxx:30
 RooStreamParser.cxx:31
 RooStreamParser.cxx:32
 RooStreamParser.cxx:33
 RooStreamParser.cxx:34
 RooStreamParser.cxx:35
 RooStreamParser.cxx:36
 RooStreamParser.cxx:37
 RooStreamParser.cxx:38
 RooStreamParser.cxx:39
 RooStreamParser.cxx:40
 RooStreamParser.cxx:41
 RooStreamParser.cxx:42
 RooStreamParser.cxx:43
 RooStreamParser.cxx:44
 RooStreamParser.cxx:45
 RooStreamParser.cxx:46
 RooStreamParser.cxx:47
 RooStreamParser.cxx:48
 RooStreamParser.cxx:49
 RooStreamParser.cxx:50
 RooStreamParser.cxx:51
 RooStreamParser.cxx:52
 RooStreamParser.cxx:53
 RooStreamParser.cxx:54
 RooStreamParser.cxx:55
 RooStreamParser.cxx:56
 RooStreamParser.cxx:57
 RooStreamParser.cxx:58
 RooStreamParser.cxx:59
 RooStreamParser.cxx:60
 RooStreamParser.cxx:61
 RooStreamParser.cxx:62
 RooStreamParser.cxx:63
 RooStreamParser.cxx:64
 RooStreamParser.cxx:65
 RooStreamParser.cxx:66
 RooStreamParser.cxx:67
 RooStreamParser.cxx:68
 RooStreamParser.cxx:69
 RooStreamParser.cxx:70
 RooStreamParser.cxx:71
 RooStreamParser.cxx:72
 RooStreamParser.cxx:73
 RooStreamParser.cxx:74
 RooStreamParser.cxx:75
 RooStreamParser.cxx:76
 RooStreamParser.cxx:77
 RooStreamParser.cxx:78
 RooStreamParser.cxx:79
 RooStreamParser.cxx:80
 RooStreamParser.cxx:81
 RooStreamParser.cxx:82
 RooStreamParser.cxx:83
 RooStreamParser.cxx:84
 RooStreamParser.cxx:85
 RooStreamParser.cxx:86
 RooStreamParser.cxx:87
 RooStreamParser.cxx:88
 RooStreamParser.cxx:89
 RooStreamParser.cxx:90
 RooStreamParser.cxx:91
 RooStreamParser.cxx:92
 RooStreamParser.cxx:93
 RooStreamParser.cxx:94
 RooStreamParser.cxx:95
 RooStreamParser.cxx:96
 RooStreamParser.cxx:97
 RooStreamParser.cxx:98
 RooStreamParser.cxx:99
 RooStreamParser.cxx:100
 RooStreamParser.cxx:101
 RooStreamParser.cxx:102
 RooStreamParser.cxx:103
 RooStreamParser.cxx:104
 RooStreamParser.cxx:105
 RooStreamParser.cxx:106
 RooStreamParser.cxx:107
 RooStreamParser.cxx:108
 RooStreamParser.cxx:109
 RooStreamParser.cxx:110
 RooStreamParser.cxx:111
 RooStreamParser.cxx:112
 RooStreamParser.cxx:113
 RooStreamParser.cxx:114
 RooStreamParser.cxx:115
 RooStreamParser.cxx:116
 RooStreamParser.cxx:117
 RooStreamParser.cxx:118
 RooStreamParser.cxx:119
 RooStreamParser.cxx:120
 RooStreamParser.cxx:121
 RooStreamParser.cxx:122
 RooStreamParser.cxx:123
 RooStreamParser.cxx:124
 RooStreamParser.cxx:125
 RooStreamParser.cxx:126
 RooStreamParser.cxx:127
 RooStreamParser.cxx:128
 RooStreamParser.cxx:129
 RooStreamParser.cxx:130
 RooStreamParser.cxx:131
 RooStreamParser.cxx:132
 RooStreamParser.cxx:133
 RooStreamParser.cxx:134
 RooStreamParser.cxx:135
 RooStreamParser.cxx:136
 RooStreamParser.cxx:137
 RooStreamParser.cxx:138
 RooStreamParser.cxx:139
 RooStreamParser.cxx:140
 RooStreamParser.cxx:141
 RooStreamParser.cxx:142
 RooStreamParser.cxx:143
 RooStreamParser.cxx:144
 RooStreamParser.cxx:145
 RooStreamParser.cxx:146
 RooStreamParser.cxx:147
 RooStreamParser.cxx:148
 RooStreamParser.cxx:149
 RooStreamParser.cxx:150
 RooStreamParser.cxx:151
 RooStreamParser.cxx:152
 RooStreamParser.cxx:153
 RooStreamParser.cxx:154
 RooStreamParser.cxx:155
 RooStreamParser.cxx:156
 RooStreamParser.cxx:157
 RooStreamParser.cxx:158
 RooStreamParser.cxx:159
 RooStreamParser.cxx:160
 RooStreamParser.cxx:161
 RooStreamParser.cxx:162
 RooStreamParser.cxx:163
 RooStreamParser.cxx:164
 RooStreamParser.cxx:165
 RooStreamParser.cxx:166
 RooStreamParser.cxx:167
 RooStreamParser.cxx:168
 RooStreamParser.cxx:169
 RooStreamParser.cxx:170
 RooStreamParser.cxx:171
 RooStreamParser.cxx:172
 RooStreamParser.cxx:173
 RooStreamParser.cxx:174
 RooStreamParser.cxx:175
 RooStreamParser.cxx:176
 RooStreamParser.cxx:177
 RooStreamParser.cxx:178
 RooStreamParser.cxx:179
 RooStreamParser.cxx:180
 RooStreamParser.cxx:181
 RooStreamParser.cxx:182
 RooStreamParser.cxx:183
 RooStreamParser.cxx:184
 RooStreamParser.cxx:185
 RooStreamParser.cxx:186
 RooStreamParser.cxx:187
 RooStreamParser.cxx:188
 RooStreamParser.cxx:189
 RooStreamParser.cxx:190
 RooStreamParser.cxx:191
 RooStreamParser.cxx:192
 RooStreamParser.cxx:193
 RooStreamParser.cxx:194
 RooStreamParser.cxx:195
 RooStreamParser.cxx:196
 RooStreamParser.cxx:197
 RooStreamParser.cxx:198
 RooStreamParser.cxx:199
 RooStreamParser.cxx:200
 RooStreamParser.cxx:201
 RooStreamParser.cxx:202
 RooStreamParser.cxx:203
 RooStreamParser.cxx:204
 RooStreamParser.cxx:205
 RooStreamParser.cxx:206
 RooStreamParser.cxx:207
 RooStreamParser.cxx:208
 RooStreamParser.cxx:209
 RooStreamParser.cxx:210
 RooStreamParser.cxx:211
 RooStreamParser.cxx:212
 RooStreamParser.cxx:213
 RooStreamParser.cxx:214
 RooStreamParser.cxx:215
 RooStreamParser.cxx:216
 RooStreamParser.cxx:217
 RooStreamParser.cxx:218
 RooStreamParser.cxx:219
 RooStreamParser.cxx:220
 RooStreamParser.cxx:221
 RooStreamParser.cxx:222
 RooStreamParser.cxx:223
 RooStreamParser.cxx:224
 RooStreamParser.cxx:225
 RooStreamParser.cxx:226
 RooStreamParser.cxx:227
 RooStreamParser.cxx:228
 RooStreamParser.cxx:229
 RooStreamParser.cxx:230
 RooStreamParser.cxx:231
 RooStreamParser.cxx:232
 RooStreamParser.cxx:233
 RooStreamParser.cxx:234
 RooStreamParser.cxx:235
 RooStreamParser.cxx:236
 RooStreamParser.cxx:237
 RooStreamParser.cxx:238
 RooStreamParser.cxx:239
 RooStreamParser.cxx:240
 RooStreamParser.cxx:241
 RooStreamParser.cxx:242
 RooStreamParser.cxx:243
 RooStreamParser.cxx:244
 RooStreamParser.cxx:245
 RooStreamParser.cxx:246
 RooStreamParser.cxx:247
 RooStreamParser.cxx:248
 RooStreamParser.cxx:249
 RooStreamParser.cxx:250
 RooStreamParser.cxx:251
 RooStreamParser.cxx:252
 RooStreamParser.cxx:253
 RooStreamParser.cxx:254
 RooStreamParser.cxx:255
 RooStreamParser.cxx:256
 RooStreamParser.cxx:257
 RooStreamParser.cxx:258
 RooStreamParser.cxx:259
 RooStreamParser.cxx:260
 RooStreamParser.cxx:261
 RooStreamParser.cxx:262
 RooStreamParser.cxx:263
 RooStreamParser.cxx:264
 RooStreamParser.cxx:265
 RooStreamParser.cxx:266
 RooStreamParser.cxx:267
 RooStreamParser.cxx:268
 RooStreamParser.cxx:269
 RooStreamParser.cxx:270
 RooStreamParser.cxx:271
 RooStreamParser.cxx:272
 RooStreamParser.cxx:273
 RooStreamParser.cxx:274
 RooStreamParser.cxx:275
 RooStreamParser.cxx:276
 RooStreamParser.cxx:277
 RooStreamParser.cxx:278
 RooStreamParser.cxx:279
 RooStreamParser.cxx:280
 RooStreamParser.cxx:281
 RooStreamParser.cxx:282
 RooStreamParser.cxx:283
 RooStreamParser.cxx:284
 RooStreamParser.cxx:285
 RooStreamParser.cxx:286
 RooStreamParser.cxx:287
 RooStreamParser.cxx:288
 RooStreamParser.cxx:289
 RooStreamParser.cxx:290
 RooStreamParser.cxx:291
 RooStreamParser.cxx:292
 RooStreamParser.cxx:293
 RooStreamParser.cxx:294
 RooStreamParser.cxx:295
 RooStreamParser.cxx:296
 RooStreamParser.cxx:297
 RooStreamParser.cxx:298
 RooStreamParser.cxx:299
 RooStreamParser.cxx:300
 RooStreamParser.cxx:301
 RooStreamParser.cxx:302
 RooStreamParser.cxx:303
 RooStreamParser.cxx:304
 RooStreamParser.cxx:305
 RooStreamParser.cxx:306
 RooStreamParser.cxx:307
 RooStreamParser.cxx:308
 RooStreamParser.cxx:309
 RooStreamParser.cxx:310
 RooStreamParser.cxx:311
 RooStreamParser.cxx:312
 RooStreamParser.cxx:313
 RooStreamParser.cxx:314
 RooStreamParser.cxx:315
 RooStreamParser.cxx:316
 RooStreamParser.cxx:317
 RooStreamParser.cxx:318
 RooStreamParser.cxx:319
 RooStreamParser.cxx:320
 RooStreamParser.cxx:321
 RooStreamParser.cxx:322
 RooStreamParser.cxx:323
 RooStreamParser.cxx:324
 RooStreamParser.cxx:325
 RooStreamParser.cxx:326
 RooStreamParser.cxx:327
 RooStreamParser.cxx:328
 RooStreamParser.cxx:329
 RooStreamParser.cxx:330
 RooStreamParser.cxx:331
 RooStreamParser.cxx:332
 RooStreamParser.cxx:333
 RooStreamParser.cxx:334
 RooStreamParser.cxx:335
 RooStreamParser.cxx:336
 RooStreamParser.cxx:337
 RooStreamParser.cxx:338
 RooStreamParser.cxx:339
 RooStreamParser.cxx:340
 RooStreamParser.cxx:341
 RooStreamParser.cxx:342
 RooStreamParser.cxx:343
 RooStreamParser.cxx:344
 RooStreamParser.cxx:345
 RooStreamParser.cxx:346
 RooStreamParser.cxx:347
 RooStreamParser.cxx:348
 RooStreamParser.cxx:349
 RooStreamParser.cxx:350
 RooStreamParser.cxx:351
 RooStreamParser.cxx:352
 RooStreamParser.cxx:353
 RooStreamParser.cxx:354
 RooStreamParser.cxx:355
 RooStreamParser.cxx:356
 RooStreamParser.cxx:357
 RooStreamParser.cxx:358
 RooStreamParser.cxx:359
 RooStreamParser.cxx:360
 RooStreamParser.cxx:361
 RooStreamParser.cxx:362
 RooStreamParser.cxx:363
 RooStreamParser.cxx:364
 RooStreamParser.cxx:365
 RooStreamParser.cxx:366
 RooStreamParser.cxx:367
 RooStreamParser.cxx:368
 RooStreamParser.cxx:369
 RooStreamParser.cxx:370
 RooStreamParser.cxx:371
 RooStreamParser.cxx:372
 RooStreamParser.cxx:373
 RooStreamParser.cxx:374
 RooStreamParser.cxx:375
 RooStreamParser.cxx:376
 RooStreamParser.cxx:377
 RooStreamParser.cxx:378
 RooStreamParser.cxx:379
 RooStreamParser.cxx:380
 RooStreamParser.cxx:381
 RooStreamParser.cxx:382
 RooStreamParser.cxx:383
 RooStreamParser.cxx:384
 RooStreamParser.cxx:385
 RooStreamParser.cxx:386
 RooStreamParser.cxx:387
 RooStreamParser.cxx:388
 RooStreamParser.cxx:389
 RooStreamParser.cxx:390
 RooStreamParser.cxx:391
 RooStreamParser.cxx:392
 RooStreamParser.cxx:393
 RooStreamParser.cxx:394
 RooStreamParser.cxx:395
 RooStreamParser.cxx:396
 RooStreamParser.cxx:397
 RooStreamParser.cxx:398
 RooStreamParser.cxx:399
 RooStreamParser.cxx:400
 RooStreamParser.cxx:401
 RooStreamParser.cxx:402
 RooStreamParser.cxx:403
 RooStreamParser.cxx:404
 RooStreamParser.cxx:405
 RooStreamParser.cxx:406
 RooStreamParser.cxx:407
 RooStreamParser.cxx:408
 RooStreamParser.cxx:409
 RooStreamParser.cxx:410
 RooStreamParser.cxx:411
 RooStreamParser.cxx:412
 RooStreamParser.cxx:413
 RooStreamParser.cxx:414
 RooStreamParser.cxx:415
 RooStreamParser.cxx:416
 RooStreamParser.cxx:417
 RooStreamParser.cxx:418
 RooStreamParser.cxx:419
 RooStreamParser.cxx:420
 RooStreamParser.cxx:421
 RooStreamParser.cxx:422
 RooStreamParser.cxx:423
 RooStreamParser.cxx:424
 RooStreamParser.cxx:425
 RooStreamParser.cxx:426
 RooStreamParser.cxx:427
 RooStreamParser.cxx:428
 RooStreamParser.cxx:429
 RooStreamParser.cxx:430
 RooStreamParser.cxx:431
 RooStreamParser.cxx:432
 RooStreamParser.cxx:433
 RooStreamParser.cxx:434
 RooStreamParser.cxx:435
 RooStreamParser.cxx:436
 RooStreamParser.cxx:437
 RooStreamParser.cxx:438
 RooStreamParser.cxx:439
 RooStreamParser.cxx:440
 RooStreamParser.cxx:441
 RooStreamParser.cxx:442
 RooStreamParser.cxx:443
 RooStreamParser.cxx:444
 RooStreamParser.cxx:445
 RooStreamParser.cxx:446
 RooStreamParser.cxx:447
 RooStreamParser.cxx:448
 RooStreamParser.cxx:449
 RooStreamParser.cxx:450
 RooStreamParser.cxx:451
 RooStreamParser.cxx:452
 RooStreamParser.cxx:453
 RooStreamParser.cxx:454
 RooStreamParser.cxx:455
 RooStreamParser.cxx:456
 RooStreamParser.cxx:457
 RooStreamParser.cxx:458
 RooStreamParser.cxx:459
 RooStreamParser.cxx:460
 RooStreamParser.cxx:461
 RooStreamParser.cxx:462
 RooStreamParser.cxx:463
 RooStreamParser.cxx:464
 RooStreamParser.cxx:465
 RooStreamParser.cxx:466
 RooStreamParser.cxx:467
 RooStreamParser.cxx:468
 RooStreamParser.cxx:469
 RooStreamParser.cxx:470
 RooStreamParser.cxx:471
 RooStreamParser.cxx:472
 RooStreamParser.cxx:473
 RooStreamParser.cxx:474
 RooStreamParser.cxx:475
 RooStreamParser.cxx:476
 RooStreamParser.cxx:477
 RooStreamParser.cxx:478
 RooStreamParser.cxx:479
 RooStreamParser.cxx:480
 RooStreamParser.cxx:481
 RooStreamParser.cxx:482
 RooStreamParser.cxx:483
 RooStreamParser.cxx:484
 RooStreamParser.cxx:485
 RooStreamParser.cxx:486
 RooStreamParser.cxx:487
 RooStreamParser.cxx:488
 RooStreamParser.cxx:489
 RooStreamParser.cxx:490
 RooStreamParser.cxx:491
 RooStreamParser.cxx:492
 RooStreamParser.cxx:493
 RooStreamParser.cxx:494
 RooStreamParser.cxx:495
 RooStreamParser.cxx:496
 RooStreamParser.cxx:497
 RooStreamParser.cxx:498
 RooStreamParser.cxx:499
 RooStreamParser.cxx:500
 RooStreamParser.cxx:501
 RooStreamParser.cxx:502
 RooStreamParser.cxx:503
 RooStreamParser.cxx:504
 RooStreamParser.cxx:505
 RooStreamParser.cxx:506
 RooStreamParser.cxx:507
 RooStreamParser.cxx:508
 RooStreamParser.cxx:509
 RooStreamParser.cxx:510
 RooStreamParser.cxx:511
 RooStreamParser.cxx:512
 RooStreamParser.cxx:513
 RooStreamParser.cxx:514