summaryrefslogtreecommitdiff
path: root/lib/ultralib/include/compiler/ido/stdarg.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ultralib/include/compiler/ido/stdarg.h')
-rw-r--r--lib/ultralib/include/compiler/ido/stdarg.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/ultralib/include/compiler/ido/stdarg.h b/lib/ultralib/include/compiler/ido/stdarg.h
new file mode 100644
index 0000000..62f68e0
--- /dev/null
+++ b/lib/ultralib/include/compiler/ido/stdarg.h
@@ -0,0 +1,33 @@
+#ifndef _STDARG_H
+#define _STDARG_H
+
+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 /* STDARG_H */