diff --git a/Parser.cc b/Parser.cc index e1063fe..304d2b2 100644 --- a/Parser.cc +++ b/Parser.cc @@ -47,13 +47,13 @@ bool Parser::write(const string & fname) writeDefine(header, "I_NAMESPACE", m_namespace); } writeDefine(header, "I_CLASSNAME", m_classname); - refptr tokenlist = buildTokenList(); - writeDefine(header, "I_TOKENLIST", *tokenlist); + setReplacement("token_list", buildTokenList()); header << endl; writeTmpl(header, (char *) tmpl_parser_h, tmpl_parser_h_len); /* write the body */ - writeDefine(body, "I_HEADER_NAME", string("\"") + header_fname + "\""); + setReplacement("header_name", + new string(string("\"") + header_fname + "\"")); body << endl; writeTmpl(body, (char *) tmpl_parser_cc, tmpl_parser_cc_len); @@ -81,7 +81,7 @@ bool Parser::writeTmpl(std::ostream & out, char * dat, int len) { out.write(data, ovector[0]); } - out << getTmplReplacement(string(data, ovector[2], + out << *getReplacement(string(data, ovector[2], ovector[3] - ovector[2])); if (ovector[1] < newline - data) { @@ -97,8 +97,13 @@ bool Parser::writeTmpl(std::ostream & out, char * dat, int len) } } -std::string Parser::getTmplReplacement(const std::string & name) +refptr Parser::getReplacement(const std::string & name) { + if (m_replacements.find(name) != m_replacements.end()) + { + return m_replacements[name]; + } + return new string(""); } refptr Parser::buildTokenList() diff --git a/Parser.h b/Parser.h index f63025b..d888213 100644 --- a/Parser.h +++ b/Parser.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "refptr.h" #include "TokenDefinition.h" @@ -24,7 +25,11 @@ class Parser } bool write(const std::string & fname); bool writeTmpl(std::ostream & out, char * dat, int len); - std::string getTmplReplacement(const std::string & name); + refptr getReplacement(const std::string & name); + void setReplacement(const std::string & name, refptr val) + { + m_replacements[name] = val; + } bool parseInputFile(char * buff, int size); void setClassName(const std::string & cn) { m_classname = cn; } @@ -44,6 +49,7 @@ class Parser std::string m_classname; std::string m_namespace; std::string m_extension; + std::map< std::string, refptr > m_replacements; }; #endif diff --git a/tmpl/parser.cc b/tmpl/parser.cc index 9579764..9d06744 100644 --- a/tmpl/parser.cc +++ b/tmpl/parser.cc @@ -5,7 +5,7 @@ #include #include -#include I_HEADER_NAME +#include {%header_name%} using namespace std; @@ -52,7 +52,7 @@ bool I_CLASSNAME::parse(istream & i) pcre * re; pcre_extra * re_extra; } tokens[] = { - I_TOKENLIST + {%token_list%} }; if (sizeof(tokens)/sizeof(tokens[0]) == 0)