home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / GNUSRC.Z / va-pa.h < prev    next >
C/C++ Source or Header  |  1996-02-07  |  2KB  |  59 lines

  1.  
  2. /* Define __gnuc_va_list. */
  3.  
  4. #ifndef __GNUC_VA_LIST
  5. #define __GNUC_VA_LIST
  6.  
  7. #if defined(NeXT)
  8. #define _ANSI_STDARG_H_
  9. #endif
  10.  
  11. typedef double *__gnuc_va_list;
  12. #endif /* not __GNUC_VA_LIST */
  13.  
  14. #ifdef NeXT_PDO
  15. #define NULL_VALIST ((__gnuc_va_list)0)
  16. #endif
  17.  
  18.  
  19. /* If this is for internal libc use, don't define anything but
  20.    __gnuc_va_list.  */
  21. #if defined (_STDARG_H) || defined (_VARARGS_H)
  22. #if __GNUC__ > 1
  23. #define __va_ellipsis ...
  24. #define __gnuc_va_start(AP) ((AP) = (va_list)__builtin_saveregs())
  25. #else
  26. #define va_alist __va_a__, __va_b__, __va_c__, __va_d__
  27. #define __va_ellipsis 
  28. #define __gnuc_va_start(AP)\
  29.   (AP) = (double *) &__va_a__, &__va_b__, &__va_c__, &__va_d__, \
  30.   (AP) = (double *)((char *)(AP) + 4)
  31. #endif /* __GNUC__ > 1 */
  32.  
  33. #ifdef _STDARG_H
  34. #if defined(NeXT_PDO) && defined(va_start)
  35. #undef va_start
  36. #endif
  37. #define va_start(AP,LASTARG) __gnuc_va_start (AP)
  38. #else
  39. /* The ... causes current_function_varargs to be set in cc1.  */
  40. #define va_dcl long va_alist; __va_ellipsis
  41. #define va_start(AP) __gnuc_va_start (AP)
  42. #endif
  43.  
  44. #define va_arg(AP,TYPE)                        \
  45.   (sizeof(TYPE) > 8 ?                        \
  46.    ((AP = (__gnuc_va_list) ((char *)AP - sizeof (int))),    \
  47.     (*((TYPE *) (void *) (*((int *) (AP))))))            \
  48.    :((AP =                            \
  49.       (__gnuc_va_list) ((long)((char *)AP - sizeof (TYPE))    \
  50.             & (sizeof(TYPE) > 4 ? ~0x7 : ~0x3))),    \
  51.      (*((TYPE *) (void *) ((char *)AP + ((8 - sizeof(TYPE)) % 4))))))
  52.  
  53. #ifndef va_end
  54. void va_end (__gnuc_va_list);        /* Defined in libgcc.a */
  55. #endif
  56. #define va_end(AP)
  57.  
  58. #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
  59.