rework logging to be more optimised, and some minor improvements.

removed function definitions and opted for using macros instead.
It now does not have a set limit when it comes to printing (at least,
it's the stdc's limit again). However, it is now no longer possible to
use a character pointer to print information to the screen.
This commit is contained in:
2025-06-12 18:09:23 +02:00
parent e6ffe785cd
commit 7dd464349f
5 changed files with 31 additions and 69 deletions

View File

@@ -1,69 +1,17 @@
// Copyright (c) 2025 Quinn
// Licensed under the MIT Licence. See LICENSE for details
#pragma once
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include "util/atrb.h"
#define ERROR_STR_PRE(v) #v
#define ERROR_STR(v) ERROR_STR_PRE(v)
#define ERROR_BUF_SIZE 128
#define debug(s, ...) printf("\033[95m" __FILE__ ":" ERROR_STR(__LINE__) ": [DBG]: " s "\033[0m\n", ##__VA_ARGS__)
#define info(s, ...) printf(__FILE__ ":" ERROR_STR(__LINE__) ": [INF]: " s "\n", ##__VA_ARGS__)
#define warn(s, ...) fprintf(stderr, "\033[93m" __FILE__ ":" ERROR_STR(__LINE__) ": [WAR]: " s "\033[0m\n", ##__VA_ARGS__)
#define error(s, ...) fprintf(stderr, "\033[91m" __FILE__ ":" ERROR_STR(__LINE__) ": [ERR]: " s "\033[0m\n", ##__VA_ARGS__)
atrb_nonnull(1) atrb_format(printf, 1, 2) static inline void debug(char const*, ...);
atrb_nonnull(1) atrb_format(printf, 1, 2) static inline void info(char const*, ...);
atrb_nonnull(1) atrb_format(printf, 1, 2) static inline void warn(char const*, ...);
atrb_nonnull(1) atrb_format(printf, 1, 2) static inline void error(char const*, ...);
atrb_nonnull(1) atrb_format(printf, 1, 2) atrb_noreturn static inline void fatal(char const*, ...);
atrb_nonnull(2) static inline void error_callback(int err, char const* const msg);
// macro to write fmt vardiac args to buf
#define WRITE_VA_ARGS(buf, fmt) \
{ \
va_list args; \
va_start(args, fmt); \
vsnprintf(buf, ERROR_BUF_SIZE, fmt, args); \
va_end(args); \
};
// prints a '\n' suffixed debug msg to stdout with a maximum buf size of @ref ERROR_BUF_SIZE
void debug(char const* restrict fmt, ...) {
char buf[ERROR_BUF_SIZE] = {0};
WRITE_VA_ARGS(buf, fmt);
printf("\033[95mD: \"%s\"\033[0m\n", buf); // reduced parameter use by not using fprintf
}
// prints a '\n' suffixed info msg to stdout with a maximum buf size of @ref ERROR_BUF_SIZE
void info(char const* fmt, ...) {
char buf[ERROR_BUF_SIZE] = {0};
WRITE_VA_ARGS(buf, fmt);
printf("I: \"%s\"\n", buf);
}
// prints a '\n' suffixed warn msg to stderr with a maximum buf size of @ref ERROR_BUF_SIZE
void warn(char const* fmt, ...) {
char buf[ERROR_BUF_SIZE] = {0};
WRITE_VA_ARGS(buf, fmt);
fprintf(stderr, "\033[93mW: \"%s\"\033[0m\n", buf);
}
// prints a '\n' suffixed error msg to stderr with a maximum buf size of @ref ERROR_BUF_SIZE
void error(char const* fmt, ...) {
char buf[ERROR_BUF_SIZE] = {0};
WRITE_VA_ARGS(buf, fmt);
fprintf(stderr, "\033[91mE: \"%s\"\033[0m\n", buf);
}
// prints a '\n' suffixed fatal msg to stderr with a maximum buf size of @ref ERROR_BUF_SIZE and immediately aborts execution
void fatal(char const* fmt, ...) {
char buf[ERROR_BUF_SIZE] = {0};
WRITE_VA_ARGS(buf, fmt);
fprintf(stderr, "\033[101mF: \"%s\"\033[0m\n", buf);
abort();
}
// callback for GLFW errors
void error_callback(int err, char const* const msg) {
fprintf(stderr, "\033[91mE: glfw returned (%i); \"%s\"\033[0m\n", err, msg);
}
#undef WRITE_VA_ARGS
#define fatal(s, ...) \
do { \
printf("\033[101m" __FILE__ ":" ERROR_STR(__LINE__) ": [FAT]: " s "\033[0m\n", ##__VA_ARGS__); \
abort(); \
} while (0)

View File

@@ -6,6 +6,7 @@
#include <GLFW/glfw3.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "../error.h"

View File

@@ -4,6 +4,7 @@
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "../error.h"

View File

@@ -6,6 +6,7 @@
#include <GLFW/glfw3.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "../error.h"
@@ -46,11 +47,16 @@ int window_init(void) {
glfwSetKeyCallback(win, key_callback);
// print the OpenGL version information
debug("version info:");
debug("\tvendor: %s", glGetString(GL_VENDOR));
debug("\trenderer: %s", glGetString(GL_RENDERER));
debug("\tversion: %s", glGetString(GL_VERSION));
debug("\tshading lang: %s", glGetString(GL_SHADING_LANGUAGE_VERSION));
debug(
"version info:\n"
"\tvendor: %s\n"
"\trenderer: %s\n"
"\tversion: %s\n"
"\tshading lang: %s\n",
glGetString(GL_VENDOR),
glGetString(GL_RENDERER),
glGetString(GL_VERSION),
glGetString(GL_SHADING_LANGUAGE_VERSION));
return 0;
}

View File

@@ -5,6 +5,7 @@
#undef GLAD_GL_IMPLEMENTATION
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <stdlib.h>
#include "error.h"
@@ -15,6 +16,11 @@
#define WIN_DEFAULT_WIDTH 640
#define WIN_DEFAULT_HEIGHT 480
// callback for GLFW errors
static void error_callback(int err, char const* const msg) {
fprintf(stderr, "\033[91mE: glfw returned (%i); \"%s\"\033[0m\n", err, msg);
}
static inline int init(void) {
glfwSetErrorCallback(error_callback);
glfwInitHint(GLFW_JOYSTICK_HAT_BUTTONS, GLFW_FALSE); // disable joystick buttons
@@ -31,7 +37,7 @@ static inline void quit(void) {
int main(int argc, char** argv) {
(void)argc, (void)argv;
printf("debug: [DBG], info: [INF], warning: [WAR], error: [ERR], fatal: [FAT]\n");
if (init()) fatal("failed to initialize!");
window_loop();