#ifndef __TMrbTemplate_h__
#define __TMrbTemplate_h__
namespace std {} using namespace std;
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>
#include "Rtypes.h"
#include "TObject.h"
#include "TList.h"
#include "TString.h"
#include "TObjString.h"
#include "TSystem.h"
#include "TRegexp.h"
#include "TMrbNamedX.h"
#include "TMrbLofNamedX.h"
#include "TMrbString.h"
class TMrbTemplate : public TObject {
public:
enum EMrbTagWordStatus { kTagError = BIT(0),
kNoTag = BIT(1),
kTagOK = BIT(2),
kTagNotFound = BIT(3),
kEOF = BIT(4)
};
public:
TMrbTemplate();
~TMrbTemplate() {
this->Close();
fCodeBuffer.Delete();
fExpansionBuffer.Delete();
fLofCodeSegments.Delete();
};
TMrbTemplate(const TMrbTemplate &) : TObject() {};
Bool_t Open(const Char_t * TemplateFile, TMrbLofNamedX * LofTagWords);
inline void Close() { if (fIsActive) {
fTemplStream.close();
fTemplStream.clear();
fIsActive = kFALSE;
}
};
TMrbNamedX * Next(TString & Line, Bool_t ForceNextLine = kTRUE);
TString & Encode(TString & Line, const Char_t * TagReplacement);
Bool_t InitializeCode(const Char_t * Prefix = NULL);
Bool_t Substitute(const Char_t * ArgName, const Char_t * ArgValue);
Bool_t Substitute(const Char_t * ArgName, Int_t ArgValue, Int_t ArgBase = 10);
Bool_t Substitute(const Char_t * ArgName, Double_t ArgValue);
Bool_t ExpandPathName();
Bool_t WriteCode(ostream & Out);
const Char_t * CopyCode(TString & CodeString, const Char_t * Seperator = " ");
inline Bool_t HasCode() const { return(fCodeBuffer.First() != NULL); };
inline Bool_t IsExpanded() const { return(fExpansionBuffer.First() != NULL); };
Bool_t ReadCodeFromFile(const Char_t * TemplateFile, TMrbLofNamedX * LofTagWords);
Bool_t FindCode(Int_t TagIndex);
Bool_t PrintCode() const;
inline EMrbTagWordStatus Status() const { return(fTagStatus); };
inline Bool_t IsError() const { return((fTagStatus & (kTagError | kTagNotFound)) != 0); };
inline Bool_t IsEof() const { return((fTagStatus & kEOF) != 0); };
inline Bool_t IsOk() const { return((fTagStatus & (kNoTag | kTagOK)) != 0); };
inline Bool_t HasOtherTags() const { return(fHasOtherTags); };
inline TMrbLofNamedX * GetTagWords() { return fLofTagWords; };
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
protected:
Bool_t TestIfBeginOrEndOfCode();
TObjString * TestIfInCodeSegment(TObjString * Code, Bool_t & InSegmentFlag, TString & Label, Bool_t & ErrorFlag);
protected:
Bool_t fIsActive;
Bool_t fHasOtherTags;
Bool_t fInIfClause;
Bool_t fVerbose;
TString fTemplateFile;
ifstream fTemplStream;
Int_t fLineCount;
TString fOrigLine;
TString fExpandedLine;
Int_t fTagStart;
Int_t fTagEnd;
EMrbTagWordStatus fTagStatus;
TMrbNamedX fTag;
TMrbString fPrefix;
TList fCodeBuffer;
TList fExpansionBuffer;
TList fLofCodeSegments;
TMrbLofNamedX * fLofTagWords;
ClassDef(TMrbTemplate, 0)
};
#endif