| /build |
| SRCS = src/BBBParser.cc src/SourceFile.cc src/main.cc | |||||
| HDRS = src/BBBParser.h src/SourceFile.h | |||||
| BUILD = build | |||||
| OBJS = $(patsubst %,$(BUILD)/%.o,$(SRCS)) | |||||
| CFLAGS = -g | |||||
| $(BUILD)/%.cc.o: %.cc $(HDRS) | |||||
| @mkdir -p $(@D) | |||||
| $(CXX) $(CFLAGS) -c $< -o $@ | |||||
| $(BUILD)/bbbuild: $(OBJS) | |||||
| @mkdir -p $(@D) | |||||
| $(CXX) $(LDFLAGS) -o $@ $^ $(LDLIBS) | |||||
| .PHONY: clean | |||||
| clean: | |||||
| rm -rf $(BUILD) |
| #include "SourceFile.h" | |||||
| #include <iostream> | |||||
| #include <fstream> | |||||
| #include <sstream> | |||||
| static bool startsWith(const std::string &a, const std::string &b, std::string &after) { | |||||
| if (a.size() < b.size()) | |||||
| return false; | |||||
| for (size_t i = 0; i < b.size(); ++i) { | |||||
| if (a[i] != b[i]) | |||||
| return false; | |||||
| } | |||||
| after = a.substr(b.size()); | |||||
| return true; | |||||
| } | |||||
| static void parseParts(std::vector<std::string> &vec, const std::string &str) { | |||||
| std::istringstream ss(str); | |||||
| std::string part; | |||||
| while (ss >> part) { | |||||
| vec.push_back(part); | |||||
| } | |||||
| } | |||||
| SourceFile::SourceFile(std::string dir, std::string name): | |||||
| dir_(std::move(dir)), name_(std::move(name)) { | |||||
| std::ifstream file(dir_ + "/" + name_); | |||||
| std::string line; | |||||
| std::string content; | |||||
| while (std::getline(file, line)) { | |||||
| if (line.size() < 4) continue; | |||||
| if (line[0] != '/' || line[1] != '/' || line[2] != '#') continue; | |||||
| if (startsWith(line, "//# pkgs:", content)) { | |||||
| parseParts(pkgs_, content); | |||||
| } else if (startsWith(line, "//# cflags:", content)) { | |||||
| parseParts(pkgs_, content); | |||||
| } else if (startsWith(line, "//# ldflags:", content)) { | |||||
| parseParts(pkgs_, content); | |||||
| } | |||||
| } | |||||
| } |
| #pragma once | |||||
| #include <vector> | |||||
| #include <string> | |||||
| class SourceFile { | |||||
| public: | |||||
| SourceFile(std::string dir, std::string name); | |||||
| private: | |||||
| std::string dir_; | |||||
| std::string name_; | |||||
| std::vector<std::string> pkgs_; | |||||
| std::vector<std::string> cflags_; | |||||
| std::vector<std::string> ldflags_; | |||||
| }; |
| #include <unistd.h> | |||||
| #include <fstream> | |||||
| #include "SourceFile.h" | |||||
| #include "BBBParser.h" | |||||
| void readDir(std::string dir, std::vector<SourceFile> sources) { | |||||
| } | |||||
| int main(int argc, char **argv) { | |||||
| std::ifstream file("test.bbb"); | |||||
| BBBParser parser(file, BBBParser::FLAG_NONE); | |||||
| BBBParser::Variables vars; | |||||
| parser.parse(vars); | |||||
| std::cout << "\nVariables found:\n"; | |||||
| for (auto &kv: vars) { | |||||
| std::cout << kv.first << ":\n"; | |||||
| for (auto &val: kv.second) { | |||||
| std::cout << "\t'" << val << "'\n"; | |||||
| } | |||||
| } | |||||
| } |
| hello = "How are "you" my person" this\ is\ another "and a third" | |||||
| "this is a fourth" = no | |||||
| nope = ${hello} |