Commit | Line | Data |
---|---|---|
bf6d2a71 C |
1 | /* varargs.h for SPUR */ |
2 | ||
3 | /* NB. This is NOT the definition needed for the new ANSI proposed | |
4 | standard */ | |
5 | ||
6 | ||
7 | struct __va_struct { char __regs[20]; }; | |
8 | ||
9 | #define va_alist __va_regs, __va_stack | |
10 | ||
11 | /* In GCC version 2, we want an ellipsis at the end of the declaration | |
12 | of the argument list. GCC version 1 can't parse it. */ | |
13 | ||
14 | #if __GNUC__ > 1 | |
15 | #define __va_ellipsis ... | |
16 | #else | |
17 | #define __va_ellipsis | |
18 | #endif | |
19 | ||
20 | /* The ... causes current_function_varargs to be set in cc1. */ | |
21 | #define va_dcl struct __va_struct __va_regs; int __va_stack; | |
22 | ||
23 | typedef struct { | |
24 | int __pnt; | |
25 | char *__regs; | |
26 | char *__stack; | |
27 | } va_list; | |
28 | ||
29 | #define va_start(pvar) \ | |
30 | ((pvar).__pnt = 0, (pvar).__regs = __va_regs.__regs, \ | |
31 | (pvar).__stack = (char *) &__va_stack) | |
32 | #define va_end(pvar) | |
33 | ||
34 | /* Avoid errors if compiling GCC v2 with GCC v1. */ | |
35 | #if __GNUC__ == 1 | |
36 | #define __extension__ | |
37 | #endif | |
38 | ||
39 | #define va_arg(pvar,type) \ | |
40 | __extension__ \ | |
41 | ({ type __va_result; \ | |
42 | if ((pvar).__pnt >= 20) { \ | |
43 | __va_result = *( (type *) ((pvar).__stack + (pvar).__pnt - 20)); \ | |
44 | (pvar).__pnt += (sizeof(type) + 7) & ~7; \ | |
45 | } \ | |
46 | else if ((pvar).__pnt + sizeof(type) > 20) { \ | |
47 | __va_result = * (type *) (pvar).__stack; \ | |
48 | (pvar).__pnt = 20 + ( (sizeof(type) + 7) & ~7); \ | |
49 | } \ | |
50 | else if (sizeof(type) == 8) { \ | |
51 | union {double d; int i[2];} __u; \ | |
52 | __u.i[0] = *(int *) ((pvar).__regs + (pvar).__pnt); \ | |
53 | __u.i[1] = *(int *) ((pvar).__regs + (pvar).__pnt + 4); \ | |
54 | __va_result = * (type *) &__u; \ | |
55 | (pvar).__pnt += 8; \ | |
56 | } \ | |
57 | else { \ | |
58 | __va_result = * (type *) ((pvar).__regs + (pvar).__pnt); \ | |
59 | (pvar).__pnt += (sizeof(type) + 3) & ~3; \ | |
60 | } \ | |
61 | __va_result; }) |