Fixed printf! It was -O3!

This commit is contained in:
Ryan Myers
2021-09-21 15:59:22 -04:00
parent ac78d8e651
commit 5e22771e36
4 changed files with 82 additions and 82 deletions
+1
View File
@@ -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
+77 -81
View File
@@ -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
+1 -1
View File
@@ -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'))
+3
View File
@@ -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;
}