00001 /***************************************************************************** 00002 * Project: BaBar detector at the SLAC PEP-II B-factory 00003 * Package: RooRarFit 00004 * File: $Id: rarStrParser.cc,v 1.9 2011/06/16 13:18:50 fwilson Exp $ 00005 * Authors: Lei Zhang 00006 * History: 00007 * 00008 * Copyright (C) 2005-2012, University of California, Riverside 00009 *****************************************************************************/ 00010 00011 // -- CLASS DESCRIPTION [RooRarFit] -- 00012 // This class provides String Parser class for RooRarFit 00014 // 00015 // BEGIN_HTML 00016 // This class provides String Parser class for RooRarFit 00017 // END_HTML 00018 // 00019 00020 #include "RooRarFit/rarVersion.hh" 00021 00022 #include "Riostream.h" 00023 00024 #include "TObjString.h" 00025 #include "RooFitCore/RooArgList.hh" 00026 #include "RooFitCore/RooRealVar.hh" 00027 #include "RooFitCore/RooStringVar.hh" 00028 00029 #include "RooRarFit/rarStrParser.hh" 00030 00031 ClassImp(rarStrParser) 00032 ; 00033 00035 rarStrParser::rarStrParser() 00036 : _str("") 00037 { 00038 init(); 00039 } 00040 00044 rarStrParser::rarStrParser(const char *str) 00045 : _str(str) 00046 { 00047 init(); 00048 } 00049 00050 00054 rarStrParser::rarStrParser(const TString str) 00055 : _str(str) 00056 { 00057 init(); 00058 } 00059 00063 rarStrParser::rarStrParser(const rarStrParser& aParser) 00064 : TObject(aParser) 00065 { 00066 _str=aParser._str; 00067 // go through tokens and copy them 00068 for (Int_t i=0; i<((rarStrParser&)aParser).nArgs(); i++) 00069 _strs.Add(new TObjString(((rarStrParser&)aParser)[i])); 00070 } 00071 00072 rarStrParser::~rarStrParser() 00073 { 00074 _strs.Delete(); 00075 } 00076 00080 void rarStrParser::operator=(const char *str) 00081 { 00082 _str=str; 00083 init(); 00084 } 00085 00089 void rarStrParser::operator=(const TString str) 00090 { 00091 rarStrParser::operator=(str.Data()); 00092 } 00093 00097 void rarStrParser::operator=(const RooStringVar str) 00098 { 00099 rarStrParser::operator=(str.getVal()); 00100 } 00101 00106 TString &rarStrParser::operator[](const Int_t idx) 00107 { 00108 TObjString *retVal=(TObjString*)_strs.At(idx); 00109 if (retVal) return retVal->String(); 00110 return _str; 00111 } 00112 00116 void rarStrParser::Remove(const Int_t idx) 00117 { 00118 TObject *val=_strs.At(idx); 00119 if (val) { 00120 _strs.Remove(val); 00121 delete val; 00122 } 00123 } 00124 00130 Bool_t rarStrParser::Have(const TString token) { 00131 return (Index(token)<0) ? kFALSE : kTRUE; 00132 } 00133 00139 Int_t rarStrParser::Index(const TString token) { 00140 Int_t index(-1); 00141 for (Int_t i=0; i<nArgs(); i++) 00142 if (token==operator[](i)) return i; 00143 return index; 00144 } 00145 00150 void rarStrParser::init() 00151 { 00152 // reset index and parsed string objs 00153 _idx=0; 00154 _strs.Delete(); 00155 TObjString *objStr(0); 00156 while (objStr=nextToken()) { 00157 _strs.Add(objStr); 00158 } 00159 } 00160 00172 TObjString *rarStrParser::nextToken() 00173 { 00174 Int_t nIdx(0); 00175 if (_idx>=_str.Length()) return 0; 00176 while (' '==_str[_idx] || '\t'==_str[_idx] || '\n'==_str[_idx]) { 00177 _idx++; 00178 if (_idx>=_str.Length()) return 0; 00179 } 00180 if ('"'==_str[_idx]) { 00181 _idx++; 00182 nIdx=_str.Index("\"", _idx); 00183 if(nIdx<0) return 0; 00184 } else { 00185 nIdx=_str.Index(" ", _idx); 00186 if(nIdx<0) nIdx=_str.Length(); 00187 } 00188 //cout<<"in Parser "<<nIdx<<" "<<_idx<<" "<<_str(_idx, nIdx-_idx)<<endl; 00189 TString substr=_str(_idx, nIdx-_idx); 00190 TObjString *subStr=new TObjString(substr); 00191 _idx=nIdx; 00192 if (_idx<_str.Length()) 00193 if ('"'==_str[_idx]) _idx++; 00194 00195 return subStr; 00196 }