Compare commits
8 Commits
2e5163ba33
...
v1.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
| ea689e7357 | |||
| a97b8f742a | |||
| 99902cfa99 | |||
| 7a314a0038 | |||
| f073e5a21f | |||
| 536a1a3b01 | |||
| a6b697dd0e | |||
| c67a448d00 |
+137
@@ -0,0 +1,137 @@
|
||||
// vim:fileencoding=utf-8:foldmethod=marker
|
||||
|
||||
#include "log.h"
|
||||
#include "../base/strings/str8/str8.h"
|
||||
#include "../common/aliases/aliases.h"
|
||||
#include "../common/assert/assert.h"
|
||||
#include "../common/misc/misc_utils.h"
|
||||
#include "../os/file/file.h"
|
||||
#include <time.h>
|
||||
|
||||
#define MIN_LOG_MSG_LENGTH 32
|
||||
#define TIME_BUF_CAPACITY 70
|
||||
|
||||
wapp_intern Str8RO L_BRACKET = wapp_str8_lit_ro("[");
|
||||
wapp_intern Str8RO R_BRACKET_SPACE = wapp_str8_lit_ro("] ");
|
||||
wapp_intern Str8RO R_BRACKET_NEWLINE = wapp_str8_lit_ro("]\n");
|
||||
|
||||
typedef struct {
|
||||
WFile *outlog;
|
||||
WFile *errlog;
|
||||
LogLevel level;
|
||||
|
||||
wapp_misc_utils_reserve_padding(2 * sizeof(WFile *) + sizeof(LogLevel));
|
||||
} LogConfig;
|
||||
|
||||
wapp_intern LogConfig LOG_CONFIG = {
|
||||
.level = WAPP_LOG_DEBUG,
|
||||
};
|
||||
wapp_intern Str8RO LOG_LEVEL_STRINGS[COUNT_LOG_LEVEL] = {
|
||||
[WAPP_LOG_FATAL] = wapp_str8_lit_ro_initialiser_list("fatal "),
|
||||
[WAPP_LOG_CRITICAL] = wapp_str8_lit_ro_initialiser_list("critical "),
|
||||
[WAPP_LOG_ERROR] = wapp_str8_lit_ro_initialiser_list("error "),
|
||||
[WAPP_LOG_WARNING] = wapp_str8_lit_ro_initialiser_list("warning "),
|
||||
[WAPP_LOG_INFO] = wapp_str8_lit_ro_initialiser_list("info "),
|
||||
[WAPP_LOG_DEBUG] = wapp_str8_lit_ro_initialiser_list("debug "),
|
||||
};
|
||||
|
||||
wapp_intern void _get_current_time_string(Str8 *dst);
|
||||
wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level);
|
||||
|
||||
void wapp_log_set_level(LogLevel level) {
|
||||
LOG_CONFIG.level = level;
|
||||
}
|
||||
|
||||
void wapp_log_configure(WFile *outlog, WFile *errlog, LogLevel level) {
|
||||
LOG_CONFIG.outlog = outlog;
|
||||
LOG_CONFIG.errlog = errlog;
|
||||
LOG_CONFIG.level = level;
|
||||
}
|
||||
|
||||
Logger wapp_log_make_logger(Str8 name) {
|
||||
return (Logger){ .name = name };
|
||||
}
|
||||
|
||||
void wapp_log_debug(const Logger *logger, Str8 msg) {
|
||||
wapp_debug_assert(logger != NULL, "`logger` should not be NULL");
|
||||
if (LOG_CONFIG.level < WAPP_LOG_DEBUG) { return; }
|
||||
|
||||
WFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wapp_file_stdout();
|
||||
_write_log_line(fp, logger, msg, WAPP_LOG_DEBUG);
|
||||
}
|
||||
|
||||
void wapp_log_info(const Logger *logger, Str8 msg) {
|
||||
wapp_debug_assert(logger != NULL, "`logger` should not be NULL");
|
||||
if (LOG_CONFIG.level < WAPP_LOG_INFO) { return; }
|
||||
|
||||
WFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wapp_file_stdout();
|
||||
_write_log_line(fp, logger, msg, WAPP_LOG_INFO);
|
||||
}
|
||||
|
||||
void wapp_log_warning(const Logger *logger, Str8 msg) {
|
||||
wapp_debug_assert(logger != NULL, "`logger` should not be NULL");
|
||||
if (LOG_CONFIG.level < WAPP_LOG_WARNING) { return; }
|
||||
|
||||
WFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wapp_file_stdout();
|
||||
_write_log_line(fp, logger, msg, WAPP_LOG_WARNING);
|
||||
}
|
||||
|
||||
void wapp_log_error(const Logger *logger, Str8 msg) {
|
||||
wapp_debug_assert(logger != NULL, "`logger` should not be NULL");
|
||||
if (LOG_CONFIG.level < WAPP_LOG_ERROR) { return; }
|
||||
|
||||
WFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wapp_file_stderr();
|
||||
_write_log_line(fp, logger, msg, WAPP_LOG_ERROR);
|
||||
}
|
||||
|
||||
void wapp_log_critical(const Logger *logger, Str8 msg) {
|
||||
wapp_debug_assert(logger != NULL, "`logger` should not be NULL");
|
||||
if (LOG_CONFIG.level < WAPP_LOG_CRITICAL) { return; }
|
||||
|
||||
WFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wapp_file_stderr();
|
||||
_write_log_line(fp, logger, msg, WAPP_LOG_CRITICAL);
|
||||
}
|
||||
|
||||
void wapp_log_fatal(const Logger *logger, Str8 msg) {
|
||||
wapp_debug_assert(logger != NULL, "`logger` should not be NULL");
|
||||
if (LOG_CONFIG.level < WAPP_LOG_FATAL) { return; }
|
||||
|
||||
WFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wapp_file_stderr();
|
||||
_write_log_line(fp, logger, msg, WAPP_LOG_FATAL);
|
||||
}
|
||||
|
||||
wapp_intern void _get_current_time_string(Str8 *dst) {
|
||||
// TODO (Abdelrahman): Replace with proper date/time utilities
|
||||
char buf[TIME_BUF_CAPACITY];
|
||||
time_t now = time(NULL);
|
||||
struct tm utc;
|
||||
gmtime_r(&now, &utc);
|
||||
strftime(buf, sizeof(buf), "%FT%TZ ", &utc);
|
||||
wapp_str8_copy_cstr_capped(dst, buf);
|
||||
}
|
||||
|
||||
wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level) {
|
||||
Str8 padding = wapp_str8_buf(MIN_LOG_MSG_LENGTH);
|
||||
u32 padding_size = msg.size < MIN_LOG_MSG_LENGTH ? MIN_LOG_MSG_LENGTH - msg.size + 1 : 0;
|
||||
wapp_str8_format(&padding, "%-*s", padding_size, " ");
|
||||
|
||||
Str8 time_str = wapp_str8_buf(TIME_BUF_CAPACITY);
|
||||
_get_current_time_string(&time_str);
|
||||
|
||||
Str8RO **strings = wapp_array(
|
||||
Str8RO *,
|
||||
&time_str,
|
||||
&L_BRACKET,
|
||||
&LOG_LEVEL_STRINGS[level],
|
||||
&R_BRACKET_SPACE,
|
||||
&msg,
|
||||
&padding,
|
||||
&L_BRACKET,
|
||||
&logger->name,
|
||||
&R_BRACKET_NEWLINE
|
||||
);
|
||||
|
||||
for (u64 i = 0; i < wapp_array_count(strings); ++i) {
|
||||
wapp_file_write_str8(strings[i], fp);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// vim:fileencoding=utf-8:foldmethod=marker
|
||||
|
||||
#ifndef LOG_H
|
||||
#define LOG_H
|
||||
|
||||
#include "../os/file/file.h"
|
||||
#include "../base/strings/str8/str8.h"
|
||||
|
||||
typedef enum {
|
||||
WAPP_LOG_FATAL,
|
||||
WAPP_LOG_CRITICAL,
|
||||
WAPP_LOG_ERROR,
|
||||
WAPP_LOG_WARNING,
|
||||
WAPP_LOG_INFO,
|
||||
WAPP_LOG_DEBUG,
|
||||
|
||||
COUNT_LOG_LEVEL,
|
||||
} LogLevel;
|
||||
|
||||
typedef struct {
|
||||
Str8 name;
|
||||
} Logger;
|
||||
|
||||
void wapp_log_set_level(LogLevel level);
|
||||
void wapp_log_configure(WFile *outlog, WFile *errlog, LogLevel level);
|
||||
Logger wapp_log_make_logger(Str8 name);
|
||||
void wapp_log_debug(const Logger *logger, Str8 msg);
|
||||
void wapp_log_info(const Logger *logger, Str8 msg);
|
||||
void wapp_log_warning(const Logger *logger, Str8 msg);
|
||||
void wapp_log_error(const Logger *logger, Str8 msg);
|
||||
void wapp_log_critical(const Logger *logger, Str8 msg);
|
||||
void wapp_log_fatal(const Logger *logger, Str8 msg);
|
||||
|
||||
#endif // !LOG_H
|
||||
@@ -0,0 +1,10 @@
|
||||
// vim:fileencoding=utf-8:foldmethod=marker
|
||||
|
||||
#ifndef WAPP_LOG_C
|
||||
#define WAPP_LOG_C
|
||||
|
||||
#include "log.c"
|
||||
#include "../base/wapp_base.c"
|
||||
#include "../os/wapp_os.c"
|
||||
|
||||
#endif // !WAPP_LOG_C
|
||||
@@ -0,0 +1,11 @@
|
||||
// vim:fileencoding=utf-8:foldmethod=marker
|
||||
|
||||
#ifndef WAPP_LOG_H
|
||||
#define WAPP_LOG_H
|
||||
|
||||
#include "log.h"
|
||||
#include "../common/wapp_common.h"
|
||||
#include "../base/wapp_base.h"
|
||||
#include "../os/wapp_os.h"
|
||||
|
||||
#endif // !WAPP_LOG_H
|
||||
@@ -56,6 +56,16 @@ i64 wapp_file_write(const void *src_buf, WFile *file, u64 byte_count) {
|
||||
return _file_write(src_buf, file, byte_count);
|
||||
}
|
||||
|
||||
u64 wapp_file_read_str8(Str8 *str, WFile *file) {
|
||||
wapp_debug_assert(str != NULL, "`str` should not be NULL.");
|
||||
return wapp_file_read((void *)(str->buf), file, str->size);
|
||||
}
|
||||
|
||||
i64 wapp_file_write_str8(Str8RO *str, WFile *file) {
|
||||
wapp_debug_assert(str != NULL, "`str` should not be NULL.");
|
||||
return wapp_file_write((void *)(str->buf), file, str->size);
|
||||
}
|
||||
|
||||
u64 wapp_file_read_array(GenericArray dst_buf, WFile *file, u64 item_count) {
|
||||
wapp_debug_assert(dst_buf != NULL && file != NULL,
|
||||
"`dst_buf` and `file` should not be NULL.");
|
||||
|
||||
@@ -34,15 +34,26 @@ typedef enum {
|
||||
FILE_SEEK_ORIGIN_COUNT,
|
||||
} FileSeekOrigin;
|
||||
|
||||
// Return value should not be cached as it's not guaranteed to remain the same. Always call
|
||||
// wapp_file_stdin to get the standard input stream
|
||||
wapp_extern WFile *wapp_file_stdin(void);
|
||||
|
||||
// Return value should not be cached as it's not guaranteed to remain the same. Always call
|
||||
// wapp_file_stdout to get the standard output stream
|
||||
wapp_extern WFile *wapp_file_stdout(void);
|
||||
|
||||
// Return value should not be cached as it's not guaranteed to remain the same. Always call
|
||||
// wapp_file_stderr to get the standard error stream
|
||||
wapp_extern WFile *wapp_file_stderr(void);
|
||||
|
||||
WFile *wapp_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode);
|
||||
i64 wapp_file_get_current_position(WFile *file);
|
||||
i64 wapp_file_seek(WFile *file, i64 offset, FileSeekOrigin origin);
|
||||
i64 wapp_file_get_length(WFile *file);
|
||||
u64 wapp_file_read(void *dst_buf, WFile *file, u64 byte_count);
|
||||
i64 wapp_file_write(const void *src_buf, WFile *file, u64 byte_count);
|
||||
u64 wapp_file_read_str8(Str8 *str, WFile *file);
|
||||
i64 wapp_file_write_str8(Str8RO *str, WFile *file);
|
||||
u64 wapp_file_read_array(GenericArray dst_buf, WFile *file, u64 item_count);
|
||||
i64 wapp_file_write_array(const GenericArray src_buf, WFile *file, u64 item_count);
|
||||
i32 wapp_file_flush(WFile *file);
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
BEGIN_C_LINKAGE
|
||||
#endif // !WAPP_PLATFORM_CPP
|
||||
|
||||
// TODO (Abdelrahman): Look into moving away from stdio in the implementation
|
||||
|
||||
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour);
|
||||
void wapp_shell_termcolour_clear_colour(void);
|
||||
|
||||
|
||||
+2
-1
@@ -6,8 +6,9 @@
|
||||
#include "wapp.h"
|
||||
#include "base/wapp_base.c"
|
||||
#include "os/wapp_os.c"
|
||||
#include "log/wapp_log.c"
|
||||
#include "prng/wapp_prng.c"
|
||||
#include "uuid/uuid.c"
|
||||
#include "uuid/wapp_uuid.c"
|
||||
#include "testing/wapp_testing.c"
|
||||
|
||||
#endif // !WAPP_C
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "common/wapp_common.h"
|
||||
#include "base/wapp_base.h"
|
||||
#include "os/wapp_os.h"
|
||||
#include "log/wapp_log.h"
|
||||
#include "prng/wapp_prng.h"
|
||||
#include "uuid/wapp_uuid.h"
|
||||
#include "testing/wapp_testing.h"
|
||||
|
||||
Reference in New Issue
Block a user