home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 November / PCWorld_2000-11_cd.bin / Software / Topware / devc40 / _SETUP.6 / Group14 / va-clipper.h < prev    next >
C/C++ Source or Header  |  2000-01-21  |  2KB  |  61 lines

  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. typedef __gnuc_va_list 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. /* Copy __gnuc_va_list into another variable of this type.  */
  58. #define __va_copy(dest, src) (dest) = (src)
  59.  
  60. #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
  61.