diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-15 00:02:39 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-15 00:02:39 +0200 |
commit | d14873524d41f4c1537d29392f3e4bb234bd6785 (patch) | |
tree | 22452ae1e8bbba223e31173acc7c86420275f351 /src | |
parent | f584bc5e4dc7da4ac20306f5072a2b2b01147c4b (diff) | |
download | bdl-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.h | 193 | ||||
-rw-r--r-- | src/main.c | 61 |
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 | ||
924 | Allocator 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. |
951 | typedef struct Logger Logger; | ||
952 | typedef void(LogFunc)(Logger *l, void *in); | ||
953 | |||
954 | typedef struct LogFuncMap { | ||
955 | Str name; | ||
956 | LogFunc *func; | ||
957 | } LogFuncMap; | ||
944 | 958 | ||
945 | typedef struct Logger { | 959 | typedef 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 | ||
951 | void | 966 | void |
952 | log_init(Logger *l) { | ||
953 | buf_reserve(&l->buf, LOG_BUF_SIZE, l->storage); | ||
954 | } | ||
955 | |||
956 | void | ||
957 | log_flush(Logger *l) { | 967 | log_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 | |||
965 | log_str(Logger *l, Str str) { | 975 | log_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 | |||
988 | log_byte(Logger *l, u8 b) { | 998 | log_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 | ||
1001 | void | 1011 | void |
@@ -1111,73 +1121,10 @@ log_float(Logger *l, f64 num, sz precision) { | |||
1111 | 1121 | ||
1112 | #include <stdarg.h> | 1122 | #include <stdarg.h> |
1113 | 1123 | ||
1114 | typedef struct Vec2 { | ||
1115 | sz x, y; | ||
1116 | } Vec2; | ||
1117 | |||
1118 | typedef void(LogFunc)(Logger *l, void *in); | ||
1119 | |||
1120 | void | ||
1121 | log_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 | |||
1131 | void | ||
1132 | log_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 | |||
1144 | void | ||
1145 | log_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 | |||
1157 | void | ||
1158 | log_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 | |||
1168 | typedef struct LogFuncMap { | ||
1169 | Str name; | ||
1170 | LogFunc *func; | ||
1171 | } LogFuncMap; | ||
1172 | |||
1173 | LogFuncMap log_funcs[] = { | ||
1174 | {cstr("Arena"), log_func_arena}, | ||
1175 | {cstr("Buf"), log_func_buf}, | ||
1176 | {cstr("Array"), log_func_array}, | ||
1177 | }; | ||
1178 | |||
1179 | void | 1124 | void |
1180 | log_print(Logger *l, Str format, ...) { | 1125 | log_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 | ||
1238 | void | ||
1239 | log_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 | |||
1251 | void | ||
1252 | log_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 | |||
1264 | void | ||
1265 | log_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 | |||
1278 | Logger | ||
1279 | log_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. | ||
1289 | Logger 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 | |||
1297 | void | ||
1298 | log_func_register(Logger *l, LogFuncMap map) { | ||
1299 | array_push(l->func_map, map, &l->storage); | ||
1300 | } | ||
1301 | |||
1302 | void | ||
1303 | log_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 |
@@ -15,18 +15,11 @@ typedef enum ExecMode { | |||
15 | static ExecMode mode = RUN_NORMAL; | 15 | static 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 | ||
20 | void | 19 | void |
21 | process_file(Str path) { | 20 | process_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 | } |