@@ -6,15 +6,37 @@ | |||
#include <errno.h> | |||
int BXParser::get() { | |||
int ch = stream_.get(); | |||
if (ch == '\n') { | |||
line_ += 1; | |||
ch_ = 1; | |||
if (dataidx_ < datalen_) { | |||
return buf_[dataidx_++]; | |||
} | |||
dataidx_ = 0; | |||
stream_.read(buf_, sizeof(buf_)); | |||
datalen_ = stream_.gcount(); | |||
if (datalen_ == 0) { | |||
return EOF; | |||
} | |||
return buf_[dataidx_++]; | |||
} | |||
int BXParser::peek() { | |||
if (dataidx_ < datalen_) { | |||
return buf_[dataidx_]; | |||
} else { | |||
ch_ += 1; | |||
return stream_.peek(); | |||
} | |||
} | |||
return ch; | |||
int BXParser::peek2() { | |||
if (dataidx_ + 1 < datalen_) { | |||
return buf_[dataidx_ + 1]; | |||
} else { | |||
stream_.get(); | |||
int ch = stream_.peek(); | |||
stream_.unget(); | |||
return ch; | |||
} | |||
} | |||
BXParser::Operator BXParser::readOperator() { |
@@ -28,10 +28,10 @@ public: | |||
void parse(BXVariables &vars); | |||
void parseList(const BXVariables &vars, std::vector<std::string> &values); | |||
int peek() { return stream_.peek(); } | |||
int peek2() { stream_.get(); int ch = peek(); stream_.unget(); return ch; } | |||
int get(); | |||
void skip(char); | |||
int peek(); | |||
int peek2(); | |||
void skip(char expected); | |||
void skip() { get(); } | |||
int line() const { return line_; } | |||
@@ -62,6 +62,10 @@ private: | |||
int line_; | |||
int ch_; | |||
std::istream &stream_; | |||
char buf_[1024]; | |||
size_t dataidx_ = 0; | |||
size_t datalen_ = 0; | |||
}; | |||
class BXWriter { |