diff --git a/src/args.c b/src/args.c index 4e7dce4..17708c2 100644 --- a/src/args.c +++ b/src/args.c @@ -5,6 +5,7 @@ #include "args.h" #include "config.h" +#include "logs.h" void print_help(int status_code) { puts(PACKAGE " " VERSION "\n\n" @@ -26,12 +27,12 @@ void print_help(int status_code) { } void invalid_arg(char *arg) { - fprintf(stderr, "invalid argument: '%s'\n\n", arg); + log_error("invalid argument: '%s'", arg); print_help(EXIT_FAILURE); } void invalid_value(char *arg, char *value) { - fprintf(stderr, "invalid value for argument '%s': '%s'\n\n", arg, value); + log_error("invalid value for argument '%s': '%s'", arg, value); print_help(EXIT_FAILURE); } @@ -95,7 +96,7 @@ Parameters parse_args(int argc, char **argv) { } if (params.frag_path == 0) { - fprintf(stderr, "required argument -f/--frag\n\n"); + log_error("required argument -f/--frag"); exit(EXIT_FAILURE); } diff --git a/src/file.c b/src/file.c index 55e7868..16b9d06 100644 --- a/src/file.c +++ b/src/file.c @@ -4,6 +4,7 @@ #include #include +#include "logs.h" #include "types.h" time_t get_file_time(File file) { @@ -23,6 +24,7 @@ void update_file(File *file) { if (file->content != 0) { free(file->content); } + log_info("Reading '%s'...", file->path); // init empty file file->content = 0; file->error = false; @@ -31,6 +33,7 @@ void update_file(File *file) { FILE *file_pointer = fopen(file->path, "rb"); if (!file_pointer) { file->error = true; + log_error("Cannot open file '%s'", file->path); return; } // read file length @@ -42,6 +45,7 @@ void update_file(File *file) { if (!file->content) { file->error = true; fclose(file_pointer); + log_error("Cannot read file '%s'", file->path); return; } // read file diff --git a/src/forge.c b/src/forge.c index 9dd6d88..30d2338 100644 --- a/src/forge.c +++ b/src/forge.c @@ -1,15 +1,15 @@ #include #include -#include #include #include "file.h" +#include "logs.h" #include "shaders.h" #include "types.h" #include "window.h" void error_callback(int error, const char *description) { - fprintf(stderr, "Error %d: %s\n", error, description); + log_error("[GLFW] %d: %s", error, description); close_window(0, true); exit(EXIT_FAILURE); } @@ -45,7 +45,6 @@ void forge_run(Parameters params) { File fragment_shader = read_file(params.frag_path); if (fragment_shader.error) { - fprintf(stderr, "Cannot read file\n"); exit(EXIT_FAILURE); } @@ -54,7 +53,6 @@ void forge_run(Parameters params) { ShaderProgram program = init_program(fragment_shader); if (program.error) { - fprintf(stderr, "Failed to compile shaders\n"); close_window(window, true); exit(EXIT_FAILURE); } diff --git a/src/logs.h b/src/logs.h new file mode 100644 index 0000000..f478624 --- /dev/null +++ b/src/logs.h @@ -0,0 +1,29 @@ +#include + +#ifndef LOG_H +#define LOG_H + +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_YELLOW "\x1b[33m" +#define ANSI_COLOR_BLUE "\x1b[34m" +#define ANSI_COLOR_MAGENTA "\x1b[35m" +#define ANSI_COLOR_CYAN "\x1b[36m" +#define ANSI_COLOR_RESET "\x1b[0m" + +#define log_debug(format, ...) \ + fprintf(stderr, ANSI_COLOR_MAGENTA "[DEBUG] " format ANSI_COLOR_RESET \ + "\n" __VA_OPT__(, ) __VA_ARGS__) +#define log_success(format, ...) \ + fprintf(stdout, ANSI_COLOR_GREEN "[SUCCESS] " format ANSI_COLOR_RESET \ + "\n" __VA_OPT__(, ) __VA_ARGS__) +#define log_info(format, ...) \ + fprintf(stdout, "[INFO] " format "\n" __VA_OPT__(, ) __VA_ARGS__) +#define log_warn(format, ...) \ + fprintf(stderr, ANSI_COLOR_YELLOW "[WARN] " format ANSI_COLOR_RESET \ + "\n" __VA_OPT__(, ) __VA_ARGS__) +#define log_error(format, ...) \ + fprintf(stderr, ANSI_COLOR_RED "[ERROR] " format ANSI_COLOR_RESET \ + "\n" __VA_OPT__(, ) __VA_ARGS__) + +#endif \ No newline at end of file diff --git a/src/shaders.c b/src/shaders.c index 0d1cea1..bb340c6 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -1,15 +1,17 @@ #include #include #include -#include #include "constants.h" +#include "logs.h" #include "types.h" bool compile_shader(GLuint shader_id, char *name, char *source_code) { GLint status_params; char log[1024]; + log_info("Compiling '%s'...", name); + // update shader source code glShaderSource(shader_id, 1, (const GLchar **)&source_code, NULL); @@ -21,9 +23,9 @@ bool compile_shader(GLuint shader_id, char *name, char *source_code) { glGetShaderInfoLog(shader_id, 1024, NULL, (GLchar *)&log); if (status_params == GL_FALSE) { - fprintf(stderr, "Failed to compile shader '%s'\n%s\n", name, log); + log_error("Failed to compile\n%s", log); } else { - fprintf(stdout, "Compiled shader '%s'\n", name); + log_success("Compilation successful"); } return status_params == GL_TRUE; @@ -72,6 +74,8 @@ ShaderProgram init_program(File fragment_shader) { glVertexAttribPointer(program.vpos_location, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, pos)); + log_success("Program initialized"); + return program; } @@ -84,6 +88,8 @@ void update_program(ShaderProgram program, File fragment_shader) { if (result) { // re-link program glLinkProgram(program.program); + + log_success("Program updated"); } } diff --git a/src/window.c b/src/window.c index d3d3069..eb03727 100644 --- a/src/window.c +++ b/src/window.c @@ -5,21 +5,24 @@ #include #include "config.h" +#include "logs.h" #include "types.h" #define GLAD_GL_IMPLEMENTATION #include void init_glfw(void (*error_callback)(int, const char *)) { + log_info("[GLFW] Initializing..."); + // set errors handler glfwSetErrorCallback(error_callback); // print current GLFW version - fprintf(stdout, "[GLFW] %s\n", glfwGetVersionString()); + log_info("[GLFW] %s", glfwGetVersionString()); // init GLFW if (!glfwInit()) { - fprintf(stderr, "[GLFW] Initialization failed\n"); + log_error("[GLFW] Initialization failed"); exit(EXIT_FAILURE); } @@ -27,6 +30,8 @@ void init_glfw(void (*error_callback)(int, const char *)) { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + log_success("[GLFS] Initialized..."); } GLFWmonitor *get_monitor(unsigned char screen_index) { @@ -36,8 +41,8 @@ GLFWmonitor *get_monitor(unsigned char screen_index) { // check selected monitor availability if (screen_index >= count) { - fprintf(stderr, "Screen %d is out of range [0-%d]\n", screen_index, - count - 1); + log_error("[GLFW] Screen %d is out of range [0-%d]", screen_index, + count - 1); glfwTerminate(); exit(EXIT_FAILURE); } @@ -47,6 +52,9 @@ GLFWmonitor *get_monitor(unsigned char screen_index) { GLFWwindow *create_window(GLFWmonitor *monitor, void (*key_callback)(Window *, int, int, int, int)) { + + log_info("[GLFW] Creating window..."); + // Window related hints glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwWindowHint(GLFW_FOCUSED, GLFW_FALSE); @@ -59,7 +67,7 @@ GLFWwindow *create_window(GLFWmonitor *monitor, // handle window creation fail if (!window) { - fprintf(stderr, "[GLFW] Window or context creation failed\n"); + log_error("[GLFW] Window or context creation failed"); glfwTerminate(); exit(EXIT_FAILURE); } @@ -69,6 +77,8 @@ GLFWwindow *create_window(GLFWmonitor *monitor, // hide cursor glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); + log_success("[GLFW] Window created"); + return window; } @@ -117,8 +127,10 @@ Context get_window_context(Window *window) { void close_window(Window *window, bool hard) { if (hard) { + log_info("[GLFW] Terminating library..."); glfwTerminate(); } else { + log_info("[GLFW] Closing window..."); glfwSetWindowShouldClose(window, GLFW_TRUE); } }