--- mstools/h/varargs.h 2018/08/09 18:20:01 1.1 +++ mstools/h/varargs.h 2018/08/09 18:20:33 1.1.1.2 @@ -25,6 +25,9 @@ typedef char *va_list; #define _VA_LIST_DEFINED #endif + + +#ifdef i386 /* * define a macro to compute the size of a type, variable or expression, * rounded up to the nearest multiple of sizeof(int). This number is its @@ -36,8 +39,34 @@ typedef char *va_list; #define va_dcl va_list va_alist; #define va_start(ap) ap = (va_list)&va_alist -#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) +#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_dcl int va_alist; +#define va_start(ap) ap = (va_list)&va_alist +#define va_arg(ap,t) *((t*)(_va_arg(&(ap),sizeof(t),(t*)0,(t*)0))) +#define va_end(ap) + +#else +#ifdef MIPS +#define va_dcl int va_alist; +#define va_start(list) list = (char *) &va_alist +#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 }