aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-15 00:53:53 +0200
committerBad Diode <bd@badd10de.dev>2024-06-15 00:53:53 +0200
commit58069c9561cc77f74bc4047ab5f91bdee8bb385c (patch)
treec948b9ec71171d9fcfac583da36ba6663ce5c2a5 /src
parent1d2f07f27aa0862e88ee44c85930284932742fa0 (diff)
downloadbdl-58069c9561cc77f74bc4047ab5f91bdee8bb385c.tar.gz
bdl-58069c9561cc77f74bc4047ab5f91bdee8bb385c.zip
Extract str_from_* functions from the logger
Diffstat (limited to 'src')
-rw-r--r--src/badlib.h212
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
453Str
454str_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
474Str
475str_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
498Str
499str_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
522Str
523str_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
453char 563char
454str_next(Str *s) { 564str_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
1005void 1114void
1006log_int(Logger *l, sz num) { 1115log_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
1025void 1121void
1026log_hex(Logger *l, sz num, sz zeroes) { 1122log_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
1049void 1129void
1050log_bin(Logger *l, sz num, sz zeroes) { 1130log_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
1073void 1137void
1074log_float(Logger *l, f64 num, sz precision) { 1138log_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
1116void 1144void
@@ -1257,7 +1285,7 @@ void
1257log_func_array(Logger *l, void *in) { 1285log_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);