/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} |