From 5e22771e36b9690abe3949c6f592c4d75bcc038a Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Tue, 21 Sep 2021 15:59:22 -0400 Subject: [PATCH] Fixed printf! It was -O3! --- Makefile | 1 + lib/src/printf.c | 158 ++++++++++++++++++++++------------------------ lib/src/printf.h | 2 +- lib/src/xprintf.c | 3 + 4 files changed, 82 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index 7e8f1b50..e6eae1d8 100755 --- a/Makefile +++ b/Makefile @@ -260,6 +260,7 @@ $(BUILD_DIR)/lib/src/al/%.o: OPT_FLAGS := -O3 $(BUILD_DIR)/lib/src/os/%.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/os/osViMgr.o: OPT_FLAGS := -O2 $(BUILD_DIR)/lib/src/os/osCreatePiManager.o: OPT_FLAGS := -O2 +$(BUILD_DIR)/lib/src/printf.o : OPT_FLAGS := -O3 $(BUILD_DIR)/lib/src/unknown_0C91A0.o : OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0D29F0.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0CDE90.o: OPT_FLAGS := -O1 diff --git a/lib/src/printf.c b/lib/src/printf.c index f2901250..f2b747ef 100644 --- a/lib/src/printf.c +++ b/lib/src/printf.c @@ -14,7 +14,82 @@ const u32 flags_arr[] = { FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAG char _spaces[] = " "; char _zeroes[] = "00000000000000000000000000000000"; -#ifdef NON_MATCHING +static void _Putfld(printf_struct *a0, va_list *args, u8 type, u8 *buff); +//Has Regalloc issues. This is a hybrid of SM64, and libreultra. +//libreultra just doesn't match, but it had some cleaner code +//so I copied it where I could. +s32 _Printf(outfun prout, char *dst, const char *fmt, va_list args) { + printf_struct x; + const u8 *fmt_ptr; + u8 c; + const char *flag_index; + u8 ac[0x20]; // probably a buffer? + x.size = 0; + while (TRUE) { + fmt_ptr = (u8 *) fmt; + while ((c = *fmt_ptr++) > 0) { + if (c == '%') { + fmt_ptr--; + break; + } + } + _PROUT(fmt, fmt_ptr - (u8 *) fmt); + if (c == 0) { + return x.size; + } + fmt = (char *) ++fmt_ptr; + x.flags = 0; + for (; (flag_index = strchr(flags_str, *fmt_ptr)) != NULL; fmt_ptr++) { + x.flags |= flags_arr[flag_index - flags_str]; + } + if (*fmt_ptr == '*') { + x.width = va_arg(args, s32); + if (x.width < 0) { + x.width = -x.width; + x.flags |= FLAGS_MINUS; + } + fmt_ptr++; + } else { + ATOI(x.width, fmt_ptr); + } + if (*fmt_ptr != '.') { + x.precision = -1; + } else { + fmt_ptr++; + if (*fmt_ptr == '*') { + x.precision = va_arg(args, s32); + fmt_ptr++; + } else { + ATOI(x.precision, fmt_ptr); + } + } + if (strchr(length_str, *fmt_ptr) != NULL) { + x.length = *fmt_ptr++; + } else { + x.length = 0; + } + + if (x.length == 'l' && *fmt_ptr == 'l') { + x.length = 'L'; + fmt_ptr++; + } + _Putfld(&x, &args, *fmt_ptr, ac); + x.width -= x.n0 + x.num_leading_zeros + x.part2_len + x.num_mid_zeros + + x.part3_len + x.num_trailing_zeros; + if (!(x.flags & FLAGS_MINUS)) + _PAD(_spaces, x.width); + _PROUT((char *) ac, x.n0); + _PAD(_zeroes, x.num_leading_zeros); + _PROUT(x.buff, x.part2_len); + _PAD(_zeroes, x.num_mid_zeros); + _PROUT((char *) (&x.buff[x.part2_len]), x.part3_len) + _PAD(_zeroes, x.num_trailing_zeros); + if (x.flags & FLAGS_MINUS) + _PAD(_spaces, x.width); + fmt = (char *) fmt_ptr + 1; + } +} + static void _Putfld(printf_struct *a0, va_list *args, u8 type, u8 *buff) { a0->n0 = a0->num_leading_zeros = a0->part2_len = a0->num_mid_zeros = a0->part3_len = a0->num_trailing_zeros = 0; @@ -116,7 +191,7 @@ static void _Putfld(printf_struct *a0, va_list *args, u8 type, u8 *buff) { break; case 'p': - a0->value.s64 = (intptr_t) va_arg(*args, void *); + a0->value.s64 = (long) va_arg(*args, void *); a0->buff = (char *) &buff[a0->n0]; _Litob(a0, 'x'); break; @@ -138,82 +213,3 @@ static void _Putfld(printf_struct *a0, va_list *args, u8 type, u8 *buff) { break; } } -#else -GLOBAL_ASM("lib/asm/non_matchings/unknown_0D43F0/_Putfld.s") -#endif - -#if 1 -s32 _Printf(outfun prout, char *dst, const char *fmt, va_list args) { - printf_struct x; - const u8 *fmt_ptr; - u8 c; - const char *flag_index; - u8 ac[0x20]; // probably a buffer? - x.size = 0; - while (TRUE) { - fmt_ptr = (u8 *) fmt; - while ((c = *fmt_ptr++) > 0) { - if (c == '%') { - fmt_ptr--; - break; - } - } - _PROUT(fmt, fmt_ptr - (u8 *) fmt); - if (c == 0) { - return x.size; - } - fmt = (char *) ++fmt_ptr; - x.flags = 0; - for (; (flag_index = strchr(flags_str, *fmt_ptr)) != NULL; fmt_ptr++) { - x.flags |= flags_arr[flag_index - flags_str]; - } - if (*fmt_ptr == '*') { - x.width = va_arg(args, s32); - if (x.width < 0) { - x.width = -x.width; - x.flags |= FLAGS_MINUS; - } - fmt_ptr++; - } else { - ATOI(x.width, fmt_ptr); - } - if (*fmt_ptr != '.') { - x.precision = -1; - } else { - fmt_ptr++; - if (*fmt_ptr == '*') { - x.precision = va_arg(args, s32); - fmt_ptr++; - } else { - ATOI(x.precision, fmt_ptr); - } - } - if (strchr(length_str, *fmt_ptr) != NULL) { - x.length = *fmt_ptr++; - } else { - x.length = 0; - } - - if (x.length == 'l' && *fmt_ptr == 'l') { - x.length = 'L'; - fmt_ptr++; - } - _Putfld(&x, &args, *fmt_ptr, ac); - x.width -= x.n0 + x.num_leading_zeros + x.part2_len + x.num_mid_zeros - + x.part3_len + x.num_trailing_zeros; - if (!(x.flags & FLAGS_MINUS)) - _PAD(_spaces, x.width); - _PROUT((char *) ac, x.n0); - _PAD(_zeroes, x.num_leading_zeros); - _PROUT(x.buff, x.part2_len); - _PAD(_zeroes, x.num_mid_zeros); - _PROUT((char *) (&x.buff[x.part2_len]), x.part3_len) - _PAD(_zeroes, x.num_trailing_zeros); - if (x.flags & FLAGS_MINUS) - _PAD(_spaces, x.width); - fmt = (char *) fmt_ptr + 1; - } -} -#else -GLOBAL_ASM("lib/asm/non_matchings/unknown_0D43F0/_Printf.s") -#endif diff --git a/lib/src/printf.h b/lib/src/printf.h index cfe81991..58962bf3 100644 --- a/lib/src/printf.h +++ b/lib/src/printf.h @@ -24,7 +24,7 @@ typedef struct { /* 28 */ int width; /* 2c */ unsigned int size; /* 30 */ unsigned int flags; - /* 34 */ char length; + /* 34 */ unsigned char length; } printf_struct; #define isdigit(x) ((x >= '0' && x <= '9')) diff --git a/lib/src/xprintf.c b/lib/src/xprintf.c index 1d8c189f..440a49b9 100644 --- a/lib/src/xprintf.c +++ b/lib/src/xprintf.c @@ -7,6 +7,9 @@ #include "stdarg.h" #include "printf.h" +/** + * This gets called insdie of _PrintF, but it is just hardcoded to return true. + */ char *prout_xprintf(char *dst, const char *src, size_t count) { return TRUE; }