Initial commit

This commit is contained in:
Maxwell 2025-04-11 16:46:03 +10:00
commit ac17ed2067
3 changed files with 157 additions and 0 deletions

4
Bobfile Normal file
View File

@ -0,0 +1,4 @@
compiler "g++";
binary "bob";
source "src/main.cpp";
compile;

BIN
bob Executable file

Binary file not shown.

153
src/main.cpp Normal file
View File

@ -0,0 +1,153 @@
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <filesystem>
using namespace std;
string version = "0.0.1";
bool isDebug = false;
void error(string input) {
cout << "\033[31mError: \033[39m" << input << endl;
}
void debug(string input) {
if (isDebug) cout << "\033[35mDebug: \033[39m" << input << endl;
}
void log(string input) {
cout << "\033[37mInfo: \033[39m" << input << endl;
}
int compile(string compiler, string source, string binary) {
string cmd = compiler + " " + source + " -o " + binary;
log("Compiling with command " + cmd);
return system(cmd.c_str());
}
int main(int argc, char* argv[]) {
string bobfile;
bool bobfileLock = false;
for (int i = 1; i < argc; i++) {
string currentArg = argv[i];
if (currentArg == "--version") {
cout << version << endl;
return 0;
} else if (currentArg == "--help") {
cout << "bob" << endl;
cout << "Bob is a builder frontend for C and C++." << endl;
cout << "Create a Bobfile and follow the documentation online." << endl;
cout << "Then, run 'bob' and build your project!" << endl;
cout << "Arguments:" << endl;
cout << " (filename) Specify a custom bobfile location" << endl;
cout << " --help Print out this message" << endl;
cout << " --debug Get debug info for bug hunting" << endl;
cout << " --version Get Bob's version number" << endl;
return 0;
} else if (currentArg == "--debug") {
isDebug = true;
} else if (currentArg.substr(0,2) == "--") {
error("Argument " + currentArg + " not understood");
return 1;
} else {
if (!bobfileLock) {
if (!filesystem::exists(currentArg)) {
error("Couldn't find the file " + currentArg);
return 1;
}
bobfile = currentArg;
bobfileLock = true;
}
}
}
if (bobfile.empty()) {
if (!filesystem::exists("Bobfile")) {
error("Please provide an argument, or write a Bobfile in the current directory.");
return 0;
} else {
bobfile = "Bobfile";
}
}
log("Using bobfile " + bobfile);
ifstream file(bobfile);
string content;
string line;
while (getline(file, line)) {
content += line;
}
debug("Bobfile content: " + content);
vector<vector<string>> parsed;
vector<string> buffera;
string bufferb;
bool isString = false;
debug("Parsing...");
for (long unsigned int i = 0; i < content.size(); i++) {
if (content[i] == '"') {
debug("String time");
isString = !isString;
if (!isString && !bufferb.empty()) {
buffera.push_back(bufferb);
bufferb.clear();
}
} else if (content[i] == ';') {
debug("Next term...");
parsed.push_back(buffera);
buffera.clear();
} else if (content[i] == ' ') {
if (!isString) {
debug("Next thing...");
buffera.push_back(bufferb);
bufferb.clear();
}
} else {
bufferb += content[i];
}
}
buffera.push_back(bufferb);
parsed.push_back(buffera);
if (isDebug) {
debug("Finished parsing bobfile. Contents:");
for (long unsigned int i = 0; i < parsed.size(); i++) {
for (long unsigned int j = 0; j < parsed[i].size(); j++) {
cout << parsed[i][j] << " ";
}
cout << endl;
}
}
string compiler;
string binary;
string source;
string editingTarget;
for (int i = 0; i < parsed.size(); i++) {
for (int j = 0; j < parsed[i].size(); j++) {
debug("Token is " + parsed[i][j]);
if (j == 0) {
if (parsed[i][j] == "compile") {
compile(compiler, source, binary);
break;
}
editingTarget = parsed[i][j];
debug("Editing target set to " + editingTarget);
} else {
if (editingTarget == "compiler") {
debug("Setting compiler");
compiler = parsed[i][j];
} else if (editingTarget == "binary") {
debug("Setting binary");
binary = parsed[i][j];
} else if (editingTarget == "source") {
debug("Setting source");
source = parsed[i][j];
}
}
}
}
return 0;
}