Compare commits

..

No commits in common. "d2724f2417d8a01a994463031d8d9ee285a76775" and "1b38bd967838b3b27cb100430080f0d00831e907" have entirely different histories.

3 changed files with 208 additions and 325 deletions

View File

@ -9,11 +9,16 @@ execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process( execute_process(
COMMAND git log -1 --pretty=%B COMMAND git log -1 --pretty=%B
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_MSG OUTPUT_VARIABLE GIT_COMMIT_MSG
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
# Hacky way to get environment variables
execute_process(
COMMAND bash -c "echo $VIM"
OUTPUT_VARIABLE ISVIM
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
find_package(SDL2 REQUIRED) find_package(SDL2 REQUIRED)
@ -28,3 +33,5 @@ string(REPLACE "\n" "\\n" GIT_COMMIT_MSG "${GIT_COMMIT_MSG}")
target_compile_definitions(${PROJECT_NAME} PRIVATE target_compile_definitions(${PROJECT_NAME} PRIVATE
"-DGIT_COMMIT_MSG=\"${GIT_COMMIT_MSG}\"") "-DGIT_COMMIT_MSG=\"${GIT_COMMIT_MSG}\"")
target_compile_definitions(${PROJECT_NAME} PRIVATE "-DISVIM=${ISVIM}")

View File

@ -1,70 +1,62 @@
#include "ceev.h" #include "ceev.h"
int usage() { int usage() {
std::cout << "Usage:"; std::cout << "Usage:";
std::cout << "\n\t"; std::cout << "\n\t";
std::cout << GET_PROGRAM_NAME() << " [" << cyan("command") << "] <" std::cout << GET_PROGRAM_NAME() << " [" << cyan("command") << "] <" << bright_green("options") << ">\n";
<< bright_green("options") << ">\n"; std::cout << "\n";
std::cout << "\n"; std::cout << "Run `" << GET_PROGRAM_NAME() << bright_green(" --help") << "' for more information.\n" << std::endl;
std::cout << "Run `" << GET_PROGRAM_NAME() << bright_green(" --help") return 1;
<< "' for more information.\n"
<< std::endl;
return 1;
} }
int show_help() { int show_help() {
std::cout << GET_PROGRAM_NAME() << " [" << cyan("command") << "] <" std::cout << GET_PROGRAM_NAME() << " [" << cyan("command") << "] <" << bright_green("options") << ">\n";
<< bright_green("options") << ">\n"; std::cout << "\n";
std::cout << "\n"; std::cout << "Usage:";
std::cout << "Usage:"; // ceev init
// ceev init std::cout << "\n*\t";
std::cout << "\n*\t"; std::cout << GET_PROGRAM_NAME() << cyan(" init ") << "<" << bright_green("--force") << ">\n";
std::cout << GET_PROGRAM_NAME() << cyan(" init ") << "<" std::cout << "\t\t";
<< bright_green("--force") << ">\n"; std::cout << "Creates the CeeV file system. Can only be used ";
std::cout << "\t\t"; std::cout << "if the current folder is empty,";
std::cout << "Creates the CeeV file system. Can only be used "; std::cout << "\n\t\tor when run with `" << bright_green("--force") << "'";
std::cout << "if the current folder is empty,"; // ceev build
std::cout << "\n\t\tor when run with `" << bright_green("--force") << "'"; std::cout << "\n*\t";
// ceev build std::cout << GET_PROGRAM_NAME() << cyan(" build") << "\n";
std::cout << "\n*\t"; std::cout << "\t\t";
std::cout << GET_PROGRAM_NAME() << cyan(" build") << "\n"; std::cout << "Not yet implemented";
std::cout << "\t\t"; // ceev run
std::cout << "Not yet implemented"; std::cout << "\n*\t";
// ceev run std::cout << GET_PROGRAM_NAME() << cyan(" run") << "\n";
std::cout << "\n*\t"; std::cout << "\t\t";
std::cout << GET_PROGRAM_NAME() << cyan(" run") << "\n"; std::cout << "Not yet implemented";
std::cout << "\t\t"; // ceev clean
std::cout << "Not yet implemented"; std::cout << "\n*\t";
// ceev clean std::cout << GET_PROGRAM_NAME() << cyan(" clean") << "\n";
std::cout << "\n*\t"; std::cout << "\t\t";
std::cout << GET_PROGRAM_NAME() << cyan(" clean") << "\n"; std::cout << "Not yet implemented";
std::cout << "\t\t"; // ceev devel
std::cout << "Not yet implemented"; std::cout << "\n*\t";
// ceev devel std::cout << GET_PROGRAM_NAME() << cyan(" devel ") << "<" << bright_green("--help") << ">\n";
std::cout << "\n*\t"; std::cout << "\t\t";
std::cout << GET_PROGRAM_NAME() << cyan(" devel ") << "<" std::cout << "Supplementary command for development information";
<< bright_green("--help") << ">\n"; // ceev --help
std::cout << "\t\t"; std::cout << "\n*\t";
std::cout << "Supplementary command for development information"; std::cout << GET_PROGRAM_NAME() << cyan(" --help") << "/" << cyan("-h") << "\n";
// ceev --help std::cout << "\t\t";
std::cout << "\n*\t"; std::cout << "This help page.";
std::cout << GET_PROGRAM_NAME() << cyan(" --help") << "/" << cyan("-h") // ceev --version
<< "\n"; std::cout << "\n*\t";
std::cout << "\t\t"; std::cout << GET_PROGRAM_NAME() << cyan(" --version") << "/" << cyan("-v") << "\n";
std::cout << "This help page."; std::cout << "\t\t";
// ceev --version std::cout << "Get the current version.";
std::cout << "\n*\t"; std::cout << std::endl;
std::cout << GET_PROGRAM_NAME() << cyan(" --version") << "/" << cyan("-v") return 0;
<< "\n";
std::cout << "\t\t";
std::cout << "Get the current version.";
std::cout << std::endl;
return 0;
} }
int show_version() { int show_version() {
std::cout << "CeeV version " << __ceev_version << '\n'; std::cout << "CeeV version " << __ceev_version << '\n';
return 0; return 0;
} }
bool replace(std::string& str, const std::string& from, const std::string& to) { bool replace(std::string& str, const std::string& from, const std::string& to) {
@ -76,275 +68,164 @@ bool replace(std::string& str, const std::string& from, const std::string& to) {
} }
static std::string query_author() { static std::string query_author() {
std::string author; std::string author;
std::cout << "Author: "; std::cout << "Author: ";
std::getline(std::cin, author); std::getline(std::cin, author);
return author; return author;
}
struct config_data get_config() {
fs::path config_path = fs::current_path();
std::string line;
struct config_data data;
std::ifstream config(config_path / ".ceev" / CONFIG_FILENAME);
if (!config) {
std::cerr << bg_red(bold("ERROR")) << ": Could not open config\n";
std::cerr << "Run `ceev init' to create a new project." << std::endl;
return data;
}
while (std::getline(config, line)) {
std::istringstream iss(line);
std::string key;
if (!std::getline(iss, key, '='))
continue;
std::string value;
if (!std::getline(iss, value))
continue;
if (key == "name")
data.name = value;
if (key == "version")
data.version = value;
if (key == "author")
data.author = value;
if (key == "email")
data.email = value;
}
config.close();
return data;
} }
int create_fs(std::deque<std::string> args) { int create_fs(std::deque<std::string> args) {
fs::path cwd = fs::current_path(); fs::path cwd = fs::current_path();
if (!fs::is_empty(cwd) && if (!fs::is_empty(cwd) && ((!args.empty() && args[0] != "--force") || args.empty())) {
((!args.empty() && args[0] != "--force") || args.empty())) { std::cerr << bg_red(bold("ERROR")) << ": Folder not empty.\n" <<
std::cerr << bg_red(bold("ERROR")) << ": Folder not empty.\n" "Run the command with `--force' to run anyways" << std::endl;
<< "Run the command with `--force' to run anyways" << std::endl; return 1;
return 1; }
} fs::create_directory(cwd.string() + "/.ceev", cwd);
fs::create_directory(cwd / ".ceev", cwd); fs::create_directory(cwd.string() + "/src", cwd);
fs::create_directory(cwd / "src", cwd); std::ofstream config(cwd.string() + "/.ceev/" + CONFIG_FILENAME);
std::ofstream config(cwd / ".ceev/" / CONFIG_FILENAME); std::string directory = cwd.string().substr(cwd.parent_path().string().length() + 1);
std::string directory = std::cout << "Initializing project...\n";
cwd.string().substr(cwd.parent_path().string().length() + 1); std::cout << "You can change this information later by editing .ceev/" << CONFIG_FILENAME << "\n";
std::cout << "Initializing project...\n"; std::string project_name;
std::cout << "You can change this information later by editing .ceev/" std::cout << "Project name [" << directory << "]: ";
<< CONFIG_FILENAME << "\n"; std::getline(std::cin, project_name);
std::string project_name; if (project_name == "") project_name = directory;
std::cout << "Project name [" << directory << "]: "; config << "name=" << project_name << '\n';
std::getline(std::cin, project_name); std::string version;
if (project_name == "") std::cout << "Version [0.0.1]: ";
project_name = directory; std::getline(std::cin, version);
config << "name=" << project_name << '\n'; if (version == "") version = "0.0.1";
std::string version; config << "version=" << version << '\n';
std::cout << "Version [0.0.1]: "; std::string author = query_author();
std::getline(std::cin, version); if (author == "") {
if (version == "") std::cerr << bg_red(bold("ERROR")) << ": Author cannot be empty.\n";
version = "0.0.1"; author = query_author();
config << "version=" << version << '\n'; }
std::string author = query_author(); config << "author=" << author << '\n';
if (author == "") { std::string email;
std::cerr << bg_red(bold("ERROR")) << ": Author cannot be empty.\n"; while (author.find(' ') != std::string::npos)
author = query_author(); replace(author, " ", ".");
} std::cout << "Email [" << author << "@example.org]: ";
config << "author=" << author << '\n'; std::getline(std::cin, email);
std::string email; if (email == "") email = author + "@example.org";
while (author.find(' ') != std::string::npos) config << "email=" << email << '\n';
replace(author, " ", "."); config.close();
std::cout << "Email [" << author << "@example.org]: "; return 0;
std::getline(std::cin, email);
if (email == "")
email = author + "@example.org";
config << "email=" << email << '\n';
config.close();
return 0;
} }
int build_project(std::deque<std::string> args) { int build_project(std::deque<std::string> args) {
std::cout << "Building project..." << std::endl; std::cout << "Building project..." << std::endl;
return 0; return 0;
} }
int run_project(std::deque<std::string> args) { int run_project(std::deque<std::string> args) {
struct config_data data = get_config(); std::ifstream config(".ceev/config");
std::cout << "Name: " << data.name << '\n'; if (!config) {
std::cout << "Version: " << data.version << '\n'; std::cerr << bg_red(bold("ERROR")) << ": Could not open config\n";
std::cout << "Author: " << data.author << '\n'; std::cerr << "Run `ceev init' to create a new project." << std::endl;
std::cout << "Email: " << data.email << '\n'; return 1;
std::cout << "Running project..." << std::endl; }
return 0; std::string line;
struct config_data data;
while (std::getline(config, line)) {
std::istringstream iss(line);
std::string key;
if (!std::getline(iss, key, '=')) continue;
std::string value;
if (!std::getline(iss, value)) continue;
if (key == "name") data.name = value;
if (key == "version") data.version = value;
if (key == "author") data.author = value;
if (key == "email") data.email = value;
}
config.close();
std::cout << "Name: " << data.name << '\n';
std::cout << "Version: " << data.version << '\n';
std::cout << "Author: " << data.author << '\n';
std::cout << "Email: " << data.email << '\n';
std::cout << "Running project..." << std::endl;
return 0;
} }
int clean_project(std::deque<std::string> args) { int clean_project(std::deque<std::string> args) {
std::cout << "Cleaning project..." << std::endl; std::cout << "Cleaning project..." << std::endl;
return 0; return 0;
} }
int devel(std::deque<std::string> args) { int devel(std::deque<std::string> args) {
if (args.empty()) { if (args.empty()) {
std::cout << bg_red(bold("ERROR")) << ": No subcommands given." std::cout << bg_red(bold("ERROR")) << ": No subcommands given." << std::endl;
<< std::endl; devel_help();
devel_help(); return 1;
return 1; }
} std::string a1 = args[0];
std::string a1 = args[0]; args.pop_front();
args.pop_front(); if (a1 == "commitinfo") return devel_commitinfo();
if (a1 == "commitinfo") std::string kw;
return devel_commitinfo(); if (a1.substr(0, 2) == "--") {
if (a1 == "roadmap") kw = a1.substr(2);
return devel_roadmap(); if (kw == "help") return devel_help();
if (a1 == "sdl2") }
return devel_sdl2(args); if (a1.substr(0, 1) == "-") {
kw = a1.substr(1);
std::string kw; if (kw == "h") return devel_help();
if (a1.substr(0, 2) == "--") { }
kw = a1.substr(2); std::cerr << bg_red(bold("ERROR")) << ": Unknown command `" << bright_magenta(a1) << "'\n" << std::endl;
if (kw == "help") devel_help();
return devel_help(); return 1;
}
if (a1.substr(0, 1) == "-") {
kw = a1.substr(1);
if (kw == "h")
return devel_help();
}
std::cerr << bg_red(bold("ERROR")) << ": Unknown command `"
<< bright_magenta(a1) << "'\n"
<< std::endl;
devel_help();
return 1;
} }
int devel_help() { int devel_help() {
std::cout << "Usage:"; std::cout << "Usage:\n";
// ceev devel roadmap // ceev devel roadmap
std::cout << "\n*\t"; std::cout << "\n*\t";
std::cout << GET_PROGRAM_NAME() << " devel " << cyan("roadmap") << "\n"; std::cout << GET_PROGRAM_NAME() << " devel " << cyan("roadmap") << "\n";
std::cout << "\t\t"; std::cout << "\t\t";
std::cout << "Get the current roadmap."; std::cout << "Get the current roadmap.\n";
// ceev devel commitinfo // ceev devel commitinfo
std::cout << "\n*\t"; std::cout << "\n*\t";
std::cout << GET_PROGRAM_NAME() << " devel " << cyan("commitinfo") << "\n"; std::cout << GET_PROGRAM_NAME() << " devel " << cyan("commitinfo") << "\n";
std::cout << "\t\t"; std::cout << "\t\t";
std::cout << "Get info about the latest commit."; std::cout << "Get info about the latest commit.\n";
// ceev devel sdl2 // ceev devel --help
std::cout << "\n*\t"; std::cout << "\n*\t";
std::cout << GET_PROGRAM_NAME() << " devel " << cyan("sdl2") << "\n"; std::cout << GET_PROGRAM_NAME() << " devel " << cyan("--help") << "/" << cyan("-h") << "\n";
std::cout << "\t\t"; std::cout << "\t\t";
std::cout << "Tests of SDL2"; std::cout << "This help page.\n";
// ceev devel --help return 0;
std::cout << "\n*\t";
std::cout << GET_PROGRAM_NAME() << " devel " << cyan("--help") << "/"
<< cyan("-h") << "\n";
std::cout << "\t\t";
std::cout << "This help page.";
std::cout << std::endl;
return 0;
} }
int devel_commitinfo() { int devel_commitinfo() {
std::cout << "CeeV build " << bright_cyan(bold(GIT_COMMIT_HASH)) << "\n\n"; std::cout << "CeeV build " << bright_cyan(bold(GIT_COMMIT_HASH)) << "\n\n";
std::cout << "Commit message:\n"; std::cout << "Commit message:\n";
std::cout << bright_cyan(bold(GIT_COMMIT_MSG)) << std::endl; std::cout << bright_cyan(bold(GIT_COMMIT_MSG)) << std::endl;
return 0; return 0;
}
int devel_roadmap() {
std::cout << "CeeV roadmap:\n";
std::cout << "*" << bg_bright_green("INPROG")
<< ":\tGet a working SDL prototype.\n";
std::cout << "*" << bg_yellow(green("TODO"))
<< " :\tMake a language parser.\n";
std::cout << "*" << bg_yellow(green("TODO"))
<< " :\tMake a language compiler.\n";
std::cout << "*" << bg_yellow(green("TODO")) << " :\tTest the language.\n";
std::cout << "*" << bg_green(bold("STATUS")) << ": ";
std::cout << "SDL is currently blocking, the rest depends on SDL to be in a "
"prototype stage, at least."
<< std::endl;
return 0;
}
int devel_sdl2(std::deque<std::string> args) {
struct config_data data = get_config();
if (data.name == "" &&
(args.empty() || args[0] != "--use-defaults" || args[0] != "-D")) {
return 1;
}
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Window *window = nullptr;
SDL_Surface *screen_surface = nullptr;
SDL_Surface *img_surface = nullptr;
return 0;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << bg_red(bold("ERROR"))
<< ": SDL could not initialize! SDL_Error: " << SDL_GetError()
<< std::endl;
return 1;
}
window = SDL_CreateWindow(data.name.c_str(), SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH,
SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == nullptr) {
std::cerr << bg_red(bold("ERROR"))
<< ": Window could not be created! SDL_Error: " << SDL_GetError()
<< std::endl;
return 1;
}
screen_surface = SDL_GetWindowSurface(window);
SDL_FillRect(screen_surface, nullptr,
SDL_MapRGB(screen_surface->format, 0xFF, 0xFF, 0xFF));
screen_surface = SDL_GetWindowSurface(window);
SDL_FillRect(screen_surface, nullptr,
SDL_MapRGB(screen_surface->format, 0xFF, 0xFF, 0xFF));
SDL_UpdateWindowSurface(window);
// hack to make it stay open
SDL_Event e;
bool quit = false;
while (!quit) {
while (SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
quit = true;
}
}
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc <= 1) { if (argc <= 1) {
return usage(); return usage();
} }
std::deque<std::string> args; std::deque<std::string> args;
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++) args.push_back(std::string(argv[i]));
args.push_back(std::string(argv[i])); std::string a1 = std::string(args[0]);
std::string a1 = std::string(args[0]); // XXX: Is this really needed?
// XXX: Is this really needed? std::transform(a1.begin(), a1.end(), a1.begin(), [](unsigned char c){return std::tolower(c);});
std::transform(a1.begin(), a1.end(), a1.begin(), args.pop_front();
[](unsigned char c) { return std::tolower(c); }); if (a1 == "init") {
args.pop_front(); return create_fs(args);
if (a1 == "init") { }
return create_fs(args); if (a1 == "build") return build_project(args);
} if (a1 == "run") return run_project(args);
if (a1 == "build") if (a1 == "clean") return clean_project(args);
return build_project(args); if (a1 == "devel") return devel(args);
if (a1 == "run") std::string kw;
return run_project(args); if (a1.substr(0, 2) == "--") {
if (a1 == "clean") kw = a1.substr(2);
return clean_project(args); if (kw == "version") return show_version();
if (a1 == "devel") if (kw == "help") return show_help();
return devel(args); }
std::string kw; if (a1.substr(0, 1) == "-") {
if (a1.substr(0, 2) == "--") { // TODO: Although not yet needed, add support for multiparams, like `ceev -hv'
kw = a1.substr(2); // True, that doesn't make sense, that's why it's not yet needed.
if (kw == "version") kw = a1.substr(1);
return show_version(); if (kw == "v") return show_version();
if (kw == "help") if (kw == "h") return show_help();
return show_help(); }
} std::cerr << bg_red(bold("ERROR")) << ": Unknown command `" << bright_magenta(a1) << "'\n" << std::endl;
if (a1.substr(0, 1) == "-") { return usage();
// TODO: Although not yet needed, add support for multiparams, like `ceev
// -hv' True, that doesn't make sense, that's why it's not yet needed.
kw = a1.substr(1);
if (kw == "v")
return show_version();
if (kw == "h")
return show_help();
}
std::cerr << bg_red(bold("ERROR")) << ": Unknown command `"
<< bright_magenta(a1) << "'\n"
<< std::endl;
return usage();
} }

View File

@ -1,6 +1,5 @@
#pragma once #pragma once
#include <SDL2/SDL.h>
#include <algorithm> #include <algorithm>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
@ -10,8 +9,6 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include "colors.h"
#ifndef __ceev_version #ifndef __ceev_version
#define __ceev_version "0.1.1-devel" #define __ceev_version "0.1.1-devel"
#endif #endif
@ -39,10 +36,10 @@
namespace fs = std::filesystem; namespace fs = std::filesystem;
struct config_data { struct config_data {
std::string name = ""; std::string name = "";
std::string version = ""; std::string version = "";
std::string author = ""; std::string author = "";
std::string email = ""; std::string email = "";
}; };
int usage(); int usage();
int show_help(); int show_help();
@ -55,6 +52,4 @@ int clean_project(std::deque<std::string> args);
int devel(std::deque<std::string> args); int devel(std::deque<std::string> args);
int devel_help(); int devel_help();
int devel_commitinfo(); int devel_commitinfo();
int devel_roadmap();
int devel_sdl2(std::deque<std::string> args);
int main(int argc, char **argv); int main(int argc, char **argv);