diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-15 00:53:53 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-15 00:53:53 +0200 |
commit | 58069c9561cc77f74bc4047ab5f91bdee8bb385c (patch) | |
tree | c948b9ec71171d9fcfac583da36ba6663ce5c2a5 /src | |
parent | 1d2f07f27aa0862e88ee44c85930284932742fa0 (diff) | |
download | bdl-58069c9561cc77f74bc4047ab5f91bdee8bb385c.tar.gz bdl-58069c9561cc77f74bc4047ab5f91bdee8bb385c.zip |
Extract str_from_* functions from the logger
Diffstat (limited to 'src')
-rw-r--r-- | src/badlib.h | 212 |
1 files changed, 120 insertions, 92 deletions
diff --git a/src/badlib.h b/src/badlib.h index 496f106..6207ecf 100644 --- a/src/badlib.h +++ b/src/badlib.h | |||
@@ -4,6 +4,7 @@ | |||
4 | // TODO: | 4 | // TODO: |
5 | // - Add string operations. | 5 | // - Add string operations. |
6 | // - sub | 6 | // - sub |
7 | // - delete | ||
7 | // - Add math operations for vectors and matrices. | 8 | // - Add math operations for vectors and matrices. |
8 | // - Can we remove the PlatformAPI function pointers and just use extern | 9 | // - Can we remove the PlatformAPI function pointers and just use extern |
9 | // references? | 10 | // references? |
@@ -11,7 +12,6 @@ | |||
11 | // - Sort arrays / linked lists with custom functions? | 12 | // - Sort arrays / linked lists with custom functions? |
12 | // - Implement binary search for searching into an array: | 13 | // - Implement binary search for searching into an array: |
13 | // SearchResult find_array(Array haystack, Array needle). | 14 | // SearchResult find_array(Array haystack, Array needle). |
14 | // - Move logger functions to str_from_int, str_from_float etc. | ||
15 | // - Logger functions for hash map, arrays and growable arrays (print the entire | 15 | // - Logger functions for hash map, arrays and growable arrays (print the entire |
16 | // thing or at least a small range). | 16 | // thing or at least a small range). |
17 | // | 17 | // |
@@ -450,6 +450,116 @@ str_insert(Str orig, Str value, sz position, Arena *a) { | |||
450 | // }; | 450 | // }; |
451 | // } | 451 | // } |
452 | 452 | ||
453 | Str | ||
454 | str_from_int(sz num, Arena *a) { | ||
455 | u8 tmp[64]; | ||
456 | u8 *end = tmp + sizeof(tmp); | ||
457 | u8 *beg = end; | ||
458 | sz t = num > 0 ? num : -num; | ||
459 | do { | ||
460 | *--beg = '0' + t % 10; | ||
461 | } while (t /= 10); | ||
462 | if (num < 0) { | ||
463 | *--beg = '-'; | ||
464 | } | ||
465 | sz num_size = end - beg; | ||
466 | Str parsed = { | ||
467 | .mem = arena_malloc(num_size, a), | ||
468 | .size = num_size, | ||
469 | }; | ||
470 | memcpy(parsed.mem, beg, num_size); | ||
471 | return parsed; | ||
472 | } | ||
473 | |||
474 | Str | ||
475 | str_from_hex(sz num, sz zeroes, Arena *a) { | ||
476 | char char_map[] = "0123456789abcdef"; | ||
477 | u8 tmp[64]; | ||
478 | zeroes = MIN((sz)sizeof(ptrsize) * 2, zeroes); | ||
479 | u8 *end = tmp + sizeof(tmp); | ||
480 | u8 *beg = end; | ||
481 | sz t = num > 0 ? num : -num; | ||
482 | do { | ||
483 | *--beg = char_map[t % 16]; | ||
484 | } while (t /= 16); | ||
485 | zeroes -= end - beg; | ||
486 | while (zeroes-- > 0) { | ||
487 | *--beg = '0'; | ||
488 | } | ||
489 | sz num_size = end - beg; | ||
490 | Str parsed = { | ||
491 | .mem = arena_malloc(num_size, a), | ||
492 | .size = num_size, | ||
493 | }; | ||
494 | memcpy(parsed.mem, beg, num_size); | ||
495 | return parsed; | ||
496 | } | ||
497 | |||
498 | Str | ||
499 | str_from_bin(sz num, sz zeroes, Arena *a) { | ||
500 | char char_map[] = "01"; | ||
501 | u8 tmp[64]; | ||
502 | zeroes = MIN((sz)sizeof(ptrsize) * 2, zeroes); | ||
503 | u8 *end = tmp + sizeof(tmp); | ||
504 | u8 *beg = end; | ||
505 | sz t = num > 0 ? num : -num; | ||
506 | do { | ||
507 | *--beg = char_map[t % 2]; | ||
508 | } while (t /= 2); | ||
509 | zeroes -= end - beg; | ||
510 | while (zeroes-- > 0) { | ||
511 | *--beg = '0'; | ||
512 | } | ||
513 | sz num_size = end - beg; | ||
514 | Str parsed = { | ||
515 | .mem = arena_malloc(num_size, a), | ||
516 | .size = num_size, | ||
517 | }; | ||
518 | memcpy(parsed.mem, beg, num_size); | ||
519 | return parsed; | ||
520 | } | ||
521 | |||
522 | Str | ||
523 | str_from_float(f64 num, sz precision, Arena *a) { | ||
524 | if (num == 0x7ff0000000000000L) { | ||
525 | return cstr("inf"); | ||
526 | } | ||
527 | if (num == 0xfff0000000000000L) { | ||
528 | return cstr("-inf"); | ||
529 | } | ||
530 | if (num == 0x7ff8000000000000L) { | ||
531 | return cstr("nan"); | ||
532 | } | ||
533 | if (precision == 0) { | ||
534 | num += 0.5; | ||
535 | sz integral = num; | ||
536 | return str_from_int(integral, a); | ||
537 | } | ||
538 | Str parsed = {0}; | ||
539 | sz prec = 1; | ||
540 | while (precision > 0) { | ||
541 | prec *= 10; | ||
542 | precision--; | ||
543 | } | ||
544 | if (num < 0) { | ||
545 | parsed = str_concat(parsed, cstr("-"), a); | ||
546 | num = -num; | ||
547 | } | ||
548 | num += 0.5 / prec; | ||
549 | sz integral = num; | ||
550 | sz fractional = (num - integral) * prec; | ||
551 | |||
552 | parsed = str_concat(parsed, str_from_int(integral, a), a); | ||
553 | parsed = str_concat(parsed, cstr("."), a); | ||
554 | for (sz i = prec / 10; i > 1; i /= 10) { | ||
555 | if (i > fractional) { | ||
556 | parsed = str_concat(parsed, cstr("0"), a); | ||
557 | } | ||
558 | } | ||
559 | parsed = str_concat(parsed, str_from_int(fractional, a), a); | ||
560 | return parsed; | ||
561 | } | ||
562 | |||
453 | char | 563 | char |
454 | str_next(Str *s) { | 564 | str_next(Str *s) { |
455 | assert(s->mem); | 565 | assert(s->mem); |
@@ -1001,116 +1111,34 @@ log_byte(Logger *l, u8 b) { | |||
1001 | } | 1111 | } |
1002 | buf_insert(&l->buf, &b, 1, &l->storage); | 1112 | buf_insert(&l->buf, &b, 1, &l->storage); |
1003 | } | 1113 | } |
1004 | |||
1005 | void | 1114 | void |
1006 | log_int(Logger *l, sz num) { | 1115 | log_int(Logger *l, sz num) { |
1007 | assert(l); | 1116 | assert(l); |
1008 | u8 tmp[64]; | 1117 | Arena scratch = l->storage; |
1009 | u8 *end = tmp + sizeof(tmp); | 1118 | log_str(l, str_from_int(num, &scratch)); |
1010 | u8 *beg = end; | ||
1011 | sz t = num > 0 ? num : -num; | ||
1012 | do { | ||
1013 | *--beg = '0' + t % 10; | ||
1014 | } while (t /= 10); | ||
1015 | if (num < 0) { | ||
1016 | *--beg = '-'; | ||
1017 | } | ||
1018 | Str parsed = { | ||
1019 | .mem = beg, | ||
1020 | .size = end - beg, | ||
1021 | }; | ||
1022 | log_str(l, parsed); | ||
1023 | } | 1119 | } |
1024 | 1120 | ||
1025 | void | 1121 | void |
1026 | log_hex(Logger *l, sz num, sz zeroes) { | 1122 | log_hex(Logger *l, sz num, sz zeroes) { |
1027 | assert(l); | 1123 | assert(l); |
1028 | char char_map[] = "0123456789abcdef"; | ||
1029 | log_str(l, cstr("0x")); | 1124 | log_str(l, cstr("0x")); |
1030 | u8 tmp[64]; | 1125 | Arena scratch = l->storage; |
1031 | zeroes = MIN((sz)sizeof(ptrsize) * 2, zeroes); | 1126 | log_str(l, str_from_hex(num, zeroes, &scratch)); |
1032 | u8 *end = tmp + sizeof(tmp); | ||
1033 | u8 *beg = end; | ||
1034 | sz t = num > 0 ? num : -num; | ||
1035 | do { | ||
1036 | *--beg = char_map[t % 16]; | ||
1037 | } while (t /= 16); | ||
1038 | zeroes -= end - beg; | ||
1039 | while (zeroes-- > 0) { | ||
1040 | *--beg = '0'; | ||
1041 | } | ||
1042 | Str parsed = { | ||
1043 | .mem = beg, | ||
1044 | .size = end - beg, | ||
1045 | }; | ||
1046 | log_str(l, parsed); | ||
1047 | } | 1127 | } |
1048 | 1128 | ||
1049 | void | 1129 | void |
1050 | log_bin(Logger *l, sz num, sz zeroes) { | 1130 | log_bin(Logger *l, sz num, sz zeroes) { |
1051 | assert(l); | 1131 | assert(l); |
1052 | char char_map[] = "01"; | ||
1053 | log_str(l, cstr("0b")); | 1132 | log_str(l, cstr("0b")); |
1054 | u8 tmp[64]; | 1133 | Arena scratch = l->storage; |
1055 | zeroes = MIN((sz)sizeof(ptrsize) * 2, zeroes); | 1134 | log_str(l, str_from_bin(num, zeroes, &scratch)); |
1056 | u8 *end = tmp + sizeof(tmp); | ||
1057 | u8 *beg = end; | ||
1058 | sz t = num > 0 ? num : -num; | ||
1059 | do { | ||
1060 | *--beg = char_map[t % 2]; | ||
1061 | } while (t /= 2); | ||
1062 | zeroes -= end - beg; | ||
1063 | while (zeroes-- > 0) { | ||
1064 | *--beg = '0'; | ||
1065 | } | ||
1066 | Str parsed = { | ||
1067 | .mem = beg, | ||
1068 | .size = end - beg, | ||
1069 | }; | ||
1070 | log_str(l, parsed); | ||
1071 | } | 1135 | } |
1072 | 1136 | ||
1073 | void | 1137 | void |
1074 | log_float(Logger *l, f64 num, sz precision) { | 1138 | log_float(Logger *l, f64 num, sz precision) { |
1075 | assert(l); | 1139 | assert(l); |
1076 | if (num == 0x7ff0000000000000L) { | 1140 | Arena scratch = l->storage; |
1077 | log_str(l, cstr("inf")); | 1141 | log_str(l, str_from_float(num, precision, &scratch)); |
1078 | return; | ||
1079 | } | ||
1080 | if (num == 0xfff0000000000000L) { | ||
1081 | log_str(l, cstr("-inf")); | ||
1082 | return; | ||
1083 | } | ||
1084 | if (num == 0x7ff8000000000000L) { | ||
1085 | log_str(l, cstr("nan")); | ||
1086 | return; | ||
1087 | } | ||
1088 | if (precision == 0) { | ||
1089 | num += 0.5; | ||
1090 | sz integral = num; | ||
1091 | log_int(l, integral); | ||
1092 | return; | ||
1093 | } | ||
1094 | sz prec = 1; | ||
1095 | while (precision > 0) { | ||
1096 | prec *= 10; | ||
1097 | precision--; | ||
1098 | } | ||
1099 | if (num < 0) { | ||
1100 | log_byte(l, '-'); | ||
1101 | num = -num; | ||
1102 | } | ||
1103 | num += 0.5 / prec; | ||
1104 | sz integral = num; | ||
1105 | sz fractional = (num - integral) * prec; | ||
1106 | log_int(l, integral); | ||
1107 | log_byte(l, '.'); | ||
1108 | for (sz i = prec / 10; i > 1; i /= 10) { | ||
1109 | if (i > fractional) { | ||
1110 | log_byte(l, '0'); | ||
1111 | } | ||
1112 | } | ||
1113 | log_int(l, fractional); | ||
1114 | } | 1142 | } |
1115 | 1143 | ||
1116 | void | 1144 | void |
@@ -1257,7 +1285,7 @@ void | |||
1257 | log_func_array(Logger *l, void *in) { | 1285 | log_func_array(Logger *l, void *in) { |
1258 | assert(l); | 1286 | assert(l); |
1259 | Array *val = in; | 1287 | Array *val = in; |
1260 | log_str(l, cstr("Buf{ size: ")); | 1288 | log_str(l, cstr("Array{ size: ")); |
1261 | log_int(l, val->size); | 1289 | log_int(l, val->size); |
1262 | log_str(l, cstr(" mem: ")); | 1290 | log_str(l, cstr(" mem: ")); |
1263 | log_hex(l, (ptrsize)val->mem, 16); | 1291 | log_hex(l, (ptrsize)val->mem, 16); |