Commit bf1e56ec by Maarten L. Hekkelman

Another attempt

parent 040b4e4f
...@@ -257,7 +257,7 @@ class sac_parser ...@@ -257,7 +257,7 @@ class sac_parser
CIFToken m_lookahead; CIFToken m_lookahead;
std::string m_token_value; std::string m_token_value;
CIFValue mTokenType; CIFValue mTokenType;
std::string m_buffer; // retract buffer, used to be a stack<char> std::vector<int> m_buffer; // retract buffer, used to be a stack<char>
}; };
// -------------------------------------------------------------------- // --------------------------------------------------------------------
......
...@@ -64,13 +64,13 @@ int sac_parser::get_next_char() ...@@ -64,13 +64,13 @@ int sac_parser::get_next_char()
{ {
int result = std::char_traits<char>::eof(); int result = std::char_traits<char>::eof();
if (not m_buffer.empty()) if (m_buffer.empty())
result = m_source.sbumpc();
else
{ {
result = m_buffer.back(); result = m_buffer.back();
m_buffer.pop_back(); m_buffer.pop_back();
} }
else
result = m_source.sbumpc();
// very simple CR/LF translation into LF // very simple CR/LF translation into LF
if (result == '\r') if (result == '\r')
...@@ -81,7 +81,10 @@ int sac_parser::get_next_char() ...@@ -81,7 +81,10 @@ int sac_parser::get_next_char()
result = '\n'; result = '\n';
} }
m_token_value.push_back(static_cast<char>(result)); if (result == std::char_traits<char>::eof())
m_token_value.push_back(0);
else
m_token_value.push_back(std::char_traits<char>::to_char_type(result));
if (result == '\n') if (result == '\n')
++m_line_nr; ++m_line_nr;
...@@ -106,7 +109,7 @@ void sac_parser::retract() ...@@ -106,7 +109,7 @@ void sac_parser::retract()
if (ch == '\n') if (ch == '\n')
--m_line_nr; --m_line_nr;
m_buffer.push_back(ch); m_buffer.push_back(ch == 0 ? std::char_traits<char>::eof() : std::char_traits<char>::to_int_type(ch));
m_token_value.pop_back(); m_token_value.pop_back();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment