|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #pragma once
-
- #include <unordered_map>
- #include <vector>
- #include <string>
- #include <iostream>
- #include <exception>
-
- #include "bufio.h"
-
- struct BXParseError: std::exception {
- BXParseError(std::string msg): message(msg) {}
- std::string message;
-
- const char *what() const noexcept override {
- return message.c_str();
- }
- };
-
- using BXVariables = std::unordered_map<std::string, std::vector<std::string>>;
-
- class BXParser {
- public:
- static const int FLAG_NONE = 0;
- static const int FLAG_ONE_LINE = 1 << 0;
-
- BXParser(bufio::IStream &stream, int flags = FLAG_NONE, int line = 1, int ch = 1):
- flags_(flags), line_(line), ch_(ch), buf_(stream) {}
-
- void parse(BXVariables &vars);
- void parseList(const BXVariables &vars, std::vector<std::string> &values);
-
- int get();
- int peek(size_t count = 1) { return buf_.peek(count); }
- void skip(char expected);
- void skip() { get(); }
-
- int line() const { return line_; }
- int ch() const { return ch_; }
-
- private:
- enum class Operator {
- COLON_EQUALS,
- PLUS_EQUALS,
- EQUALS_PLUS,
- BAR_EQUALS,
- NONE,
- };
-
- [[noreturn]] void error(std::string);
-
- Operator readOperator();
- void skipWhitespaceLine();
- void skipWhitespace();
-
- char parseEscape();
- void parseExpansion(const BXVariables &vars, std::vector<std::string> &values);
- void parseQuotedExpansion(const BXVariables &vars, std::string &content);
- void parseQuotedString(const BXVariables &vars, std::string &content);
- bool parseString(const BXVariables &vars, std::string &content, int sep = -1);
- bool parseIdentifier(std::string &content);
-
- int flags_;
- int line_;
- int ch_;
-
- bufio::IBuf<> buf_;
- };
-
- class BXWriter {
- public:
- BXWriter(bufio::OStream &stream): buf_(stream) {}
-
- void write(const BXVariables &vars);
-
- private:
- void newline();
- void escape(const std::string &str);
-
- bufio::OBuf<> buf_;
- };
|