aboutsummaryrefslogtreecommitdiffstats
path: root/src/badlib.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-14 20:05:50 +0200
committerBad Diode <bd@badd10de.dev>2024-06-14 20:05:50 +0200
commitf343f6f13f470915f971f3ca9361ff267960ca6a (patch)
tree9133ba12cb40e231403c9248d6d3e6e2d6143194 /src/badlib.h
parentf90a2480e2a4198fdc94e4635f6f86dffdbe253a (diff)
downloadbdl-f343f6f13f470915f971f3ca9361ff267960ca6a.tar.gz
bdl-f343f6f13f470915f971f3ca9361ff267960ca6a.zip
Add more logging functions
Diffstat (limited to 'src/badlib.h')
-rw-r--r--src/badlib.h107
1 files changed, 106 insertions, 1 deletions
diff --git a/src/badlib.h b/src/badlib.h
index f0f71aa..8ce4634 100644
--- a/src/badlib.h
+++ b/src/badlib.h
@@ -928,10 +928,24 @@ log_str(Logger *l, Str str) {
928} 928}
929 929
930void 930void
931log_byte(Logger *l, u8 b) {
932 assert(l);
933 Buf *buf = &l->buf;
934 sz avail = buf->cap - buf->size;
935 if (avail == 0) {
936 log_flush(l);
937 avail = buf->cap - buf->size;
938 assert(avail > 0);
939 }
940 buf_insert(&l->buf, &b, 1, l->storage);
941}
942
943void
931log_int(Logger *l, sz num) { 944log_int(Logger *l, sz num) {
945 assert(l);
932 u8 tmp[64]; 946 u8 tmp[64];
933 u8 *end = tmp + sizeof(tmp); 947 u8 *end = tmp + sizeof(tmp);
934 u8 *beg = tmp; 948 u8 *beg = end;
935 sz t = num > 0 ? num : -num; 949 sz t = num > 0 ? num : -num;
936 do { 950 do {
937 *--beg = '0' + t % 10; 951 *--beg = '0' + t % 10;
@@ -946,4 +960,95 @@ log_int(Logger *l, sz num) {
946 log_str(l, parsed); 960 log_str(l, parsed);
947} 961}
948 962
963void
964log_hex(Logger *l, sz num, sz zeroes) {
965 assert(l);
966 char char_map[] = "0123456789abcdef";
967 log_str(l, cstr("0x"));
968 u8 tmp[64];
969 zeroes = MIN((sz)sizeof(ptrsize) * 2, zeroes);
970 u8 *end = tmp + sizeof(tmp);
971 u8 *beg = end;
972 sz t = num > 0 ? num : -num;
973 do {
974 *--beg = char_map[t % 16];
975 } while (t /= 16);
976 zeroes -= end - beg;
977 while (zeroes-- > 0) {
978 *--beg = '0';
979 }
980 Str parsed = {
981 .mem = beg,
982 .size = end - beg,
983 };
984 log_str(l, parsed);
985}
986
987void
988log_bin(Logger *l, sz num, sz zeroes) {
989 assert(l);
990 char char_map[] = "01";
991 log_str(l, cstr("0b"));
992 u8 tmp[64];
993 zeroes = MIN((sz)sizeof(ptrsize) * 2, zeroes);
994 u8 *end = tmp + sizeof(tmp);
995 u8 *beg = end;
996 sz t = num > 0 ? num : -num;
997 do {
998 *--beg = char_map[t % 2];
999 } while (t /= 2);
1000 zeroes -= end - beg;
1001 while (zeroes-- > 0) {
1002 *--beg = '0';
1003 }
1004 Str parsed = {
1005 .mem = beg,
1006 .size = end - beg,
1007 };
1008 log_str(l, parsed);
1009}
1010
1011void
1012log_float(Logger *l, f64 num, sz precision) {
1013 assert(l);
1014 if (num == 0x7ff0000000000000L) {
1015 log_str(l, cstr("inf"));
1016 return;
1017 }
1018 if (num == 0xfff0000000000000L) {
1019 log_str(l, cstr("-inf"));
1020 return;
1021 }
1022 if (num == 0x7ff8000000000000L) {
1023 log_str(l, cstr("nan"));
1024 return;
1025 }
1026 if (precision == 0) {
1027 num += 0.5;
1028 sz integral = num;
1029 log_int(l, integral);
1030 return;
1031 }
1032 sz prec = 1;
1033 while (precision > 0) {
1034 prec *= 10;
1035 precision--;
1036 }
1037 if (num < 0) {
1038 log_byte(l, '-');
1039 num = -num;
1040 }
1041 num += 0.5 / prec;
1042 sz integral = num;
1043 sz fractional = (num - integral) * prec;
1044 log_int(l, integral);
1045 log_byte(l, '.');
1046 for (sz i = prec / 10; i > 1; i /= 10) {
1047 if (i > fractional) {
1048 log_byte(l, '0');
1049 }
1050 }
1051 log_int(l, fractional);
1052}
1053
949#endif // BADLIB_H 1054#endif // BADLIB_H