aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-15 00:02:39 +0200
committerBad Diode <bd@badd10de.dev>2024-06-15 00:02:39 +0200
commitd14873524d41f4c1537d29392f3e4bb234bd6785 (patch)
tree22452ae1e8bbba223e31173acc7c86420275f351 /src
parentf584bc5e4dc7da4ac20306f5072a2b2b01147c4b (diff)
downloadbdl-d14873524d41f4c1537d29392f3e4bb234bd6785.tar.gz
bdl-d14873524d41f4c1537d29392f3e4bb234bd6785.zip
Streamline the creation of default loggers and custom log_fn
Diffstat (limited to 'src')
-rw-r--r--src/badlib.h193
-rw-r--r--src/main.c61
2 files changed, 117 insertions, 137 deletions
diff --git a/src/badlib.h b/src/badlib.h
index bc3312f..837d377 100644
--- a/src/badlib.h
+++ b/src/badlib.h
@@ -921,6 +921,13 @@ platform_free(void *ptr, void *ctx) {
921 free(ptr); 921 free(ptr);
922} 922}
923 923
924Allocator os_allocator = {
925 .malloc = platform_malloc,
926 .calloc = platform_calloc,
927 .realloc = platform_realloc,
928 .free = platform_free,
929};
930
924#include <time.h> 931#include <time.h>
925#include <unistd.h> 932#include <unistd.h>
926 933
@@ -940,20 +947,23 @@ platform_time(void) {
940// Custom logger. 947// Custom logger.
941// 948//
942 949
943#define LOG_BUF_SIZE KB(4) 950// Our custom logging functions for structs and other entities.
951typedef struct Logger Logger;
952typedef void(LogFunc)(Logger *l, void *in);
953
954typedef struct LogFuncMap {
955 Str name;
956 LogFunc *func;
957} LogFuncMap;
944 958
945typedef struct Logger { 959typedef struct Logger {
946 Buf buf; 960 Buf buf;
947 FILE *dest; 961 FILE *dest;
948 Arena *storage; 962 LogFuncMap *func_map;
963 Arena storage;
949} Logger; 964} Logger;
950 965
951void 966void
952log_init(Logger *l) {
953 buf_reserve(&l->buf, LOG_BUF_SIZE, l->storage);
954}
955
956void
957log_flush(Logger *l) { 967log_flush(Logger *l) {
958 if (l->buf.size) { 968 if (l->buf.size) {
959 fprintf(l->dest, "%.*s", (int)l->buf.size, l->buf.mem); 969 fprintf(l->dest, "%.*s", (int)l->buf.size, l->buf.mem);
@@ -965,7 +975,7 @@ void
965log_str(Logger *l, Str str) { 975log_str(Logger *l, Str str) {
966 assert(l); 976 assert(l);
967 Buf *buf = &l->buf; 977 Buf *buf = &l->buf;
968 if (buf->size == 0) log_init(l); 978 assert(buf->mem);
969 while (str.size > 0) { 979 while (str.size > 0) {
970 sz avail = buf->cap - buf->size; 980 sz avail = buf->cap - buf->size;
971 if (avail == 0) { 981 if (avail == 0) {
@@ -974,11 +984,11 @@ log_str(Logger *l, Str str) {
974 assert(avail > 0); 984 assert(avail > 0);
975 } 985 }
976 if (str.size < avail) { 986 if (str.size < avail) {
977 buf_insert(&l->buf, str.mem, str.size, l->storage); 987 buf_insert(&l->buf, str.mem, str.size, &l->storage);
978 str.size = 0; 988 str.size = 0;
979 return; 989 return;
980 } 990 }
981 buf_insert(&l->buf, str.mem, avail, l->storage); 991 buf_insert(&l->buf, str.mem, avail, &l->storage);
982 str.mem += avail; 992 str.mem += avail;
983 str.size -= avail; 993 str.size -= avail;
984 } 994 }
@@ -988,14 +998,14 @@ void
988log_byte(Logger *l, u8 b) { 998log_byte(Logger *l, u8 b) {
989 assert(l); 999 assert(l);
990 Buf *buf = &l->buf; 1000 Buf *buf = &l->buf;
991 if (buf->size == 0) log_init(l); 1001 assert(buf->mem);
992 sz avail = buf->cap - buf->size; 1002 sz avail = buf->cap - buf->size;
993 if (avail == 0) { 1003 if (avail == 0) {
994 log_flush(l); 1004 log_flush(l);
995 avail = buf->cap - buf->size; 1005 avail = buf->cap - buf->size;
996 assert(avail > 0); 1006 assert(avail > 0);
997 } 1007 }
998 buf_insert(&l->buf, &b, 1, l->storage); 1008 buf_insert(&l->buf, &b, 1, &l->storage);
999} 1009}
1000 1010
1001void 1011void
@@ -1111,73 +1121,10 @@ log_float(Logger *l, f64 num, sz precision) {
1111 1121
1112#include <stdarg.h> 1122#include <stdarg.h>
1113 1123
1114typedef struct Vec2 {
1115 sz x, y;
1116} Vec2;
1117
1118typedef void(LogFunc)(Logger *l, void *in);
1119
1120void
1121log_vec2(Logger *l, void *v) {
1122 assert(l);
1123 Vec2 *vec = v;
1124 log_str(l, cstr("Vec2 { x: "));
1125 log_int(l, vec->x);
1126 log_str(l, cstr(", y: "));
1127 log_int(l, vec->y);
1128 log_str(l, cstr(" }"));
1129}
1130
1131void
1132log_func_arena(Logger *l, void *in) {
1133 assert(l);
1134 Arena *val = in;
1135 log_str(l, cstr("Arena{ size: "));
1136 log_int(l, val->size);
1137 log_str(l, cstr(" cap: "));
1138 log_int(l, val->cap);
1139 log_str(l, cstr(" mem: "));
1140 log_hex(l, (ptrsize)val->beg, 16);
1141 log_str(l, cstr(" }"));
1142}
1143
1144void
1145log_func_buf(Logger *l, void *in) {
1146 assert(l);
1147 Buf *val = in;
1148 log_str(l, cstr("Buf{ size: "));
1149 log_int(l, val->size);
1150 log_str(l, cstr(" cap: "));
1151 log_int(l, val->cap);
1152 log_str(l, cstr(" mem: "));
1153 log_hex(l, (ptrsize)val->mem, 16);
1154 log_str(l, cstr(" }"));
1155}
1156
1157void
1158log_func_array(Logger *l, void *in) {
1159 assert(l);
1160 Array *val = in;
1161 log_str(l, cstr("Buf{ size: "));
1162 log_int(l, val->size);
1163 log_str(l, cstr(" mem: "));
1164 log_hex(l, (ptrsize)val->mem, 16);
1165 log_str(l, cstr(" }"));
1166}
1167
1168typedef struct LogFuncMap {
1169 Str name;
1170 LogFunc *func;
1171} LogFuncMap;
1172
1173LogFuncMap log_funcs[] = {
1174 {cstr("Arena"), log_func_arena},
1175 {cstr("Buf"), log_func_buf},
1176 {cstr("Array"), log_func_array},
1177};
1178
1179void 1124void
1180log_print(Logger *l, Str format, ...) { 1125log_print(Logger *l, Str format, ...) {
1126 assert(l);
1127 assert(l->buf.mem);
1181 va_list argp; 1128 va_list argp;
1182 va_start(argp, format); 1129 va_start(argp, format);
1183 va_start(argp, format); 1130 va_start(argp, format);
@@ -1271,9 +1218,9 @@ log_print(Logger *l, Str format, ...) {
1271 format.mem += inc; 1218 format.mem += inc;
1272 format.size -= inc; 1219 format.size -= inc;
1273 void *val = va_arg(argp, void *); 1220 void *val = va_arg(argp, void *);
1274 for (sz i = 0; i < LEN(log_funcs); i++) { 1221 for (sz i = 0; i < array_size(l->func_map); i++) {
1275 if (str_eq(arg, log_funcs[i].name)) { 1222 if (str_eq(arg, l->func_map[i].name)) {
1276 log_funcs[i].func(l, val); 1223 l->func_map[i].func(l, val);
1277 break; 1224 break;
1278 } 1225 }
1279 } 1226 }
@@ -1288,4 +1235,90 @@ log_print(Logger *l, Str format, ...) {
1288 va_end(argp); 1235 va_end(argp);
1289} 1236}
1290 1237
1238void
1239log_func_arena(Logger *l, void *in) {
1240 assert(l);
1241 Arena *val = in;
1242 log_str(l, cstr("Arena{ size: "));
1243 log_int(l, val->size);
1244 log_str(l, cstr(" cap: "));
1245 log_int(l, val->cap);
1246 log_str(l, cstr(" mem: "));
1247 log_hex(l, (ptrsize)val->beg, 16);
1248 log_str(l, cstr(" }"));
1249}
1250
1251void
1252log_func_buf(Logger *l, void *in) {
1253 assert(l);
1254 Buf *val = in;
1255 log_str(l, cstr("Buf{ size: "));
1256 log_int(l, val->size);
1257 log_str(l, cstr(" cap: "));
1258 log_int(l, val->cap);
1259 log_str(l, cstr(" mem: "));
1260 log_hex(l, (ptrsize)val->mem, 16);
1261 log_str(l, cstr(" }"));
1262}
1263
1264void
1265log_func_array(Logger *l, void *in) {
1266 assert(l);
1267 Array *val = in;
1268 log_str(l, cstr("Buf{ size: "));
1269 log_int(l, val->size);
1270 log_str(l, cstr(" mem: "));
1271 log_hex(l, (ptrsize)val->mem, 16);
1272 log_str(l, cstr(" }"));
1273}
1274
1275#define LOG_BUF_SIZE KB(1)
1276#define LOG_MEM_SIZE KB(2)
1277
1278Logger
1279log_init(sz memsize, FILE *dest, Arena arena) {
1280 Logger logger = {
1281 .dest = dest,
1282 .storage = arena,
1283 };
1284 buf_reserve(&logger.buf, memsize, &logger.storage);
1285 return logger;
1286}
1287
1288// Default loggers and convenience macros for printing.
1289Logger logger_inf, logger_err;
1290#define print(format, ...) \
1291 log_print(&logger_inf, (Str){(u8 *)(format), LEN(format) - 1}, __VA_ARGS__)
1292#define println(format, ...) print(format "\n", __VA_ARGS__)
1293#define printerr(format, ...) \
1294 log_print(&logger_err, (Str){(u8 *)(format), LEN(format) - 1}, __VA_ARGS__)
1295#define printerrln(format, ...) printerr(format "\n", __VA_ARGS__)
1296
1297void
1298log_func_register(Logger *l, LogFuncMap map) {
1299 array_push(l->func_map, map, &l->storage);
1300}
1301
1302void
1303log_init_default(void) {
1304 // Allocate and initialize loggers.
1305 Arena arena_inf = arena_create(LOG_MEM_SIZE, os_allocator);
1306 Arena arena_err = arena_create(LOG_MEM_SIZE, os_allocator);
1307 logger_inf = log_init(LOG_BUF_SIZE, stdout, arena_inf);
1308 logger_err = log_init(LOG_BUF_SIZE, stderr, arena_err);
1309
1310 // Register default log_funcs into loggers.
1311 array_init(logger_inf.func_map, 16, &logger_inf.storage);
1312 array_init(logger_err.func_map, 16, &logger_err.storage);
1313 LogFuncMap log_funcs[] = {
1314 {cstr("Arena"), log_func_arena},
1315 {cstr("Buf"), log_func_buf},
1316 {cstr("Array"), log_func_array},
1317 };
1318 for (sz i = 0; i < LEN(log_funcs); i++) {
1319 log_func_register(&logger_inf, log_funcs[i]);
1320 log_func_register(&logger_err, log_funcs[i]);
1321 }
1322}
1323
1291#endif // BADLIB_H 1324#endif // BADLIB_H
diff --git a/src/main.c b/src/main.c
index f5f2065..82d7e8b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -15,18 +15,11 @@ typedef enum ExecMode {
15static ExecMode mode = RUN_NORMAL; 15static ExecMode mode = RUN_NORMAL;
16 16
17#define LEXER_MEM GB(2) 17#define LEXER_MEM GB(2)
18#define LOGGER_MEM MB(1)
19 18
20void 19void
21process_file(Str path) { 20process_file(Str path) {
22 printf("processing: "); 21 printf("processing: ");
23 printstrln(&path); 22 printstrln(&path);
24 Allocator os_allocator = {
25 .malloc = platform_malloc,
26 .calloc = platform_calloc,
27 .realloc = platform_realloc,
28 .free = platform_free,
29 };
30 printf("initialing memory...\n"); 23 printf("initialing memory...\n");
31 Arena lexer_arena = arena_create(LEXER_MEM, os_allocator); 24 Arena lexer_arena = arena_create(LEXER_MEM, os_allocator);
32 printf("reading file...\n"); 25 printf("reading file...\n");
@@ -43,56 +36,10 @@ process_file(Str path) {
43 // printstrln(&line); 36 // printstrln(&line);
44 // } 37 // }
45 38
46 // Testing custom logger functions. 39 log_init_default();
47 Arena logger_arena = arena_create(LOGGER_MEM, os_allocator); 40 println("<<< %x{4} %b{4} %f{2} %s %{Arena} >>>", 123, 3, 1.345,
48 Logger logger_info = { 41 cstr("BOOM!"), &logger_inf.storage);
49 .dest = stdout, 42 printerrln("%s:%d:%d: %s", path, 1, 1, cstr("error: testing string logger"));
50 .storage = &logger_arena,
51 };
52 log_print(&logger_info, cstr("<<< %x{4} %b{4} %f{2} %s %{Vec2} %{Vec2} %{Arena} >>>\n"),
53 123, 3, 1.345, cstr("BOOM!"), &(Vec2){100, 255}, &(Vec2){10, 15}, &logger_arena);
54 // log_print(&logger_info, cstr("<<< %x{4} >>>\n"),
55 // 123);
56 // log_str(&logger_info, cstr("<<< "));
57 // log_int(&logger_info, -1234);
58 // log_str(&logger_info, cstr(" | "));
59 // log_hex(&logger_info, (sz)&logger_info, 16);
60 // log_str(&logger_info, cstr(" | "));
61 // log_hex(&logger_info, 15, 8);
62 // log_str(&logger_info, cstr(" | "));
63 // log_hex(&logger_info, 16, 8);
64 // log_str(&logger_info, cstr(" | "));
65 // log_bin(&logger_info, 15, 8);
66 // log_str(&logger_info, cstr(" | "));
67 // log_bin(&logger_info, 16, 8);
68 // log_str(&logger_info, cstr(" | "));
69 // log_float(&logger_info, 3.1234, 0);
70 // log_str(&logger_info, cstr(" | "));
71 // log_float(&logger_info, 3.14, 4);
72 // log_str(&logger_info, cstr(" | "));
73 // log_float(&logger_info, -0.01415, 8);
74 // log_str(&logger_info, cstr(" | "));
75 // log_float(&logger_info, (f64)0x7ff0000000000000L, 0);
76 // log_str(&logger_info, cstr(" | "));
77 // log_float(&logger_info, (f64)0xfff0000000000000L, 0);
78 // log_str(&logger_info, cstr(" | "));
79 // log_float(&logger_info, (f64)0x7ff8000000000000L, 0);
80 // log_str(&logger_info, cstr(" >>>"));
81 // log_str(&logger_info, cstr("\n"));
82 // log_flush(&logger_info);
83
84 // Logger logger_err = {
85 // .dest = stderr,
86 // .storage = &logger_arena,
87 // };
88 // log_str(&logger_err, path);
89 // log_str(&logger_err, cstr(":1:1:"));
90 // log_str(&logger_err, cstr("error: testing string logger\n"));
91 // log_flush(&logger_err);
92
93 // TODO: add numeric logging
94 // TODO: add custom struct logging
95 // TODO: add a vaargs function with a little dsl
96 43
97 // TODO: run lexer. 44 // TODO: run lexer.
98} 45}