diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/badlib.h | 107 | ||||
-rw-r--r-- | src/main.c | 24 |
2 files changed, 128 insertions, 3 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 | ||
930 | void | 930 | void |
931 | log_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 | |||
943 | void | ||
931 | log_int(Logger *l, sz num) { | 944 | log_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 | ||
963 | void | ||
964 | log_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 | |||
987 | void | ||
988 | log_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 | |||
1011 | void | ||
1012 | log_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 |
@@ -51,8 +51,28 @@ process_file(Str path) { | |||
51 | }; | 51 | }; |
52 | log_str(&logger_info, cstr("<<< ")); | 52 | log_str(&logger_info, cstr("<<< ")); |
53 | log_int(&logger_info, -1234); | 53 | log_int(&logger_info, -1234); |
54 | // log_str(&logger_info, cstr("processing file: ")); | 54 | log_str(&logger_info, cstr(" | ")); |
55 | // log_str(&logger_info, path); | 55 | log_hex(&logger_info, (sz)&logger_info, 16); |
56 | log_str(&logger_info, cstr(" | ")); | ||
57 | log_hex(&logger_info, 15, 8); | ||
58 | log_str(&logger_info, cstr(" | ")); | ||
59 | log_hex(&logger_info, 16, 8); | ||
60 | log_str(&logger_info, cstr(" | ")); | ||
61 | log_bin(&logger_info, 15, 8); | ||
62 | log_str(&logger_info, cstr(" | ")); | ||
63 | log_bin(&logger_info, 16, 8); | ||
64 | log_str(&logger_info, cstr(" | ")); | ||
65 | log_float(&logger_info, 3.1234, 0); | ||
66 | log_str(&logger_info, cstr(" | ")); | ||
67 | log_float(&logger_info, 3.14, 4); | ||
68 | log_str(&logger_info, cstr(" | ")); | ||
69 | log_float(&logger_info, -0.01415, 8); | ||
70 | log_str(&logger_info, cstr(" | ")); | ||
71 | log_float(&logger_info, (f64)0x7ff0000000000000L, 0); | ||
72 | log_str(&logger_info, cstr(" | ")); | ||
73 | log_float(&logger_info, (f64)0xfff0000000000000L, 0); | ||
74 | log_str(&logger_info, cstr(" | ")); | ||
75 | log_float(&logger_info, (f64)0x7ff8000000000000L, 0); | ||
56 | log_str(&logger_info, cstr(" >>>")); | 76 | log_str(&logger_info, cstr(" >>>")); |
57 | log_str(&logger_info, cstr("\n")); | 77 | log_str(&logger_info, cstr("\n")); |
58 | log_flush(&logger_info); | 78 | log_flush(&logger_info); |