--- mstools/h/stdarg.h 2018/08/09 18:20:01 1.1 +++ mstools/h/stdarg.h 2018/08/09 18:20:30 1.1.1.2 @@ -23,12 +23,43 @@ typedef char * va_list; #define _VA_LIST_DEFINED #endif +#ifdef i386 + #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 ) +#endif + +#ifdef M_MRX000 +#define va_start(ap,v) _va_start(&(ap),0) +#define va_arg(ap,t) *((t*)(_va_arg(&(ap),sizeof(t),(t*)0,(t*)0))) +#define va_end(ap) +#else + +#ifdef MIPS + +#define va_start(ap,v) ap = (va_list)&v + sizeof(v) +#define va_end(list) +#define va_arg(list, mode) ((mode *)(list =\ + (char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) &\ + (__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1] + +/* +++++++++++++++++++++++++++++++++++++++++++ + Because of parameter passing conventions in C: + use mode=int for char, and short types + use mode=double for float types + use a pointer for array types + +++++++++++++++++++++++++++++++++++++++++++ */ + + +#endif +#endif + + + #ifdef __cplusplus } #endif