1 | /* GNU C varargs and stdargs support for Clipper. */ |
---|
2 | |
---|
3 | /* Define __gnuc_va_list. */ |
---|
4 | |
---|
5 | #ifndef __GNUC_VA_LIST |
---|
6 | #define __GNUC_VA_LIST |
---|
7 | |
---|
8 | typedef struct |
---|
9 | { |
---|
10 | int __va_ap; /* pointer to stack args */ |
---|
11 | void *__va_reg[4]; /* pointer to r0,f0,r1,f1 */ |
---|
12 | int __va_num; /* number of args processed */ |
---|
13 | } __gnuc_va_list; |
---|
14 | #endif /* not __GNUC_VA_LIST */ |
---|
15 | |
---|
16 | |
---|
17 | #if defined (_STDARG_H) || defined (_VARARGS_H) |
---|
18 | #define va_list __gnuc_va_list |
---|
19 | #define __va_list __gnuc_va_list /* acc compatibility */ |
---|
20 | |
---|
21 | #define _VA_LIST |
---|
22 | #define _VA_LIST_ |
---|
23 | #define _SYS_INT_STDARG_H /* acc compatibility */ |
---|
24 | |
---|
25 | /* Call __builtin_next_arg even though we aren't using its value, so that |
---|
26 | we can verify that LASTARG is correct. */ |
---|
27 | #ifdef _STDARG_H |
---|
28 | #define va_start(AP,LASTARG) \ |
---|
29 | (__builtin_next_arg (LASTARG), \ |
---|
30 | (AP) = *(va_list *)__builtin_saveregs(), \ |
---|
31 | (AP).__va_num = __builtin_args_info (0), \ |
---|
32 | (AP).__va_ap += __builtin_args_info (1)) |
---|
33 | #else |
---|
34 | #define va_alist __builtin_va_alist |
---|
35 | /* The ... causes current_function_varargs to be set in cc1. */ |
---|
36 | #define va_dcl va_list __builtin_va_alist; ... |
---|
37 | #define va_start(AP) \ |
---|
38 | ((AP) = *(va_list *)__builtin_saveregs(), \ |
---|
39 | (AP).__va_num = __builtin_args_info (0)) |
---|
40 | #endif /* _STDARG_H */ |
---|
41 | |
---|
42 | /* round to alignment of `type' but keep a least integer alignment */ |
---|
43 | #define __va_round(AP,TYPE) \ |
---|
44 | ((AP).__va_ap = ((AP).__va_ap + __alignof__ (TYPE) - 1 ) & \ |
---|
45 | ~(__alignof__ (TYPE) - 1), \ |
---|
46 | ((AP).__va_ap = ((AP).__va_ap + sizeof (int) - 1) & ~(sizeof (int) - 1))) |
---|
47 | |
---|
48 | #define va_arg(AP, TYPE) \ |
---|
49 | (*((AP).__va_num < 2 && __builtin_classify_type (* (TYPE *)0) < 12 \ |
---|
50 | ? (__builtin_classify_type (* (TYPE *)0) == 8 \ |
---|
51 | ? ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ + 1]) \ |
---|
52 | : ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ ])) \ |
---|
53 | : ((AP).__va_num++, __va_round (AP,TYPE), ((TYPE *)((AP).__va_ap))++))) |
---|
54 | |
---|
55 | #define va_end(AP) ((void) 0) |
---|
56 | |
---|
57 | #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ |
---|