summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2023-08-15 18:21:42 +0100
committerGitHub <noreply@github.com>2023-08-15 10:21:42 -0700
commita2deca64d24427d6856dc5e7fc43bde4b1641a43 (patch)
treeb6566ff3648a5fdab02c57c21b1bb9fab1294ccd /include
parentf19df74c6ee597f01c3d7def1fdef105d9bdef92 (diff)
aprintf OK (#51)
* m_pause OK * yeah now it's OK lol * refactor * refactor 2 * m_controller OK * format * fix size comment in game * refactor 3 * refactor 4 * refactor 5 * add unused macro * aprintf OK
Diffstat (limited to 'include')
-rw-r--r--include/libc/stdarg.h46
-rw-r--r--include/libc64/aprintf.h7
2 files changed, 51 insertions, 2 deletions
diff --git a/include/libc/stdarg.h b/include/libc/stdarg.h
new file mode 100644
index 0000000..77b8b88
--- /dev/null
+++ b/include/libc/stdarg.h
@@ -0,0 +1,46 @@
+#ifndef STDARG_H
+#define STDARG_H
+
+#include "ultra64.h"
+
+// When building with GCC, use the official vaarg macros to avoid warnings
+// and possibly bad codegen.
+#ifdef __GNUC__
+#define va_list __builtin_va_list
+#define va_start __builtin_va_start
+#define va_arg __builtin_va_arg
+#define va_end __builtin_va_end
+#else
+
+typedef char *va_list;
+#define _FP 1
+#define _INT 0
+#define _STRUCT 2
+
+#define _VA_FP_SAVE_AREA 0x10
+#define _VA_ALIGN(p, a) (((unsigned int)(((char *)p) + ((a) > 4 ? (a) : 4) - 1)) & -((a) > 4 ? (a) : 4))
+#define va_start(vp, parmN) (vp = ((va_list)&parmN + sizeof(parmN)))
+
+#define __va_stack_arg(list, mode) \
+ ( \
+ ((list) = (char *)_VA_ALIGN(list, __builtin_alignof(mode)) + \
+ _VA_ALIGN(sizeof(mode), 4)), \
+ (((char *)list) - (_VA_ALIGN(sizeof(mode), 4) - sizeof(mode))))
+
+#define __va_double_arg(list, mode) \
+ ( \
+ (((long)list & 0x1) /* 1 byte aligned? */ \
+ ? (list = (char *)((long)list + 7), (char *)((long)list - 6 - _VA_FP_SAVE_AREA)) \
+ : (((long)list & 0x2) /* 2 byte aligned? */ \
+ ? (list = (char *)((long)list + 10), (char *)((long)list - 24 - _VA_FP_SAVE_AREA)) \
+ : __va_stack_arg(list, mode))))
+
+#define va_arg(list, mode) ((mode *)(((__builtin_classof(mode) == _FP && \
+ __builtin_alignof(mode) == sizeof(double)) \
+ ? __va_double_arg(list, mode) \
+ : __va_stack_arg(list, mode))))[-1]
+#define va_end(__list)
+
+#endif /* __GNUC__ */
+
+#endif /* STDARG_H */
diff --git a/include/libc64/aprintf.h b/include/libc64/aprintf.h
index 282caa3..2477117 100644
--- a/include/libc64/aprintf.h
+++ b/include/libc64/aprintf.h
@@ -2,8 +2,11 @@
#define LIBC64_APRINTF_H
#include "ultra64.h"
+#include "lib/ultralib/src/libc/xstdio.h"
-// void vaprintf();
-// void aprintf();
+typedef void* (*PrintCallback)(void*, const char*, size_t);
+
+s32 vaprintf(PrintCallback* pfn, const char* fmt, va_list ap);
+s32 aprintf(PrintCallback* func, const char* fmt, ...);
#endif