Browse Source

faster BXParser

master
Martin Dørum 3 years ago
parent
commit
b5d5151640
2 changed files with 35 additions and 9 deletions
  1. 28
    6
      src/BXParser.cc
  2. 7
    3
      src/BXParser.h

+ 28
- 6
src/BXParser.cc View File

@@ -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() {

+ 7
- 3
src/BXParser.h View File

@@ -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 {

Loading…
Cancel
Save