stdarg.mh

来自「开放源码的编译器open watcom 1.6.0版的源代码」· MH 代码 · 共 131 行

MH
131
字号
/***************************************************************************
 * FILE: stdarg.h/cstdarg (Macros for use with variable argument lists)
 *
:include crwat.sp
 *
 * Description: This header is part of the C/C++ standard library. It
 *              contains macros for use in variable length argument
 *              lists.
 ***************************************************************************/
:segment CNAME
#ifndef _CSTDARG_INCLUDED
#define _CSTDARG_INCLUDED

#ifndef __cplusplus
#error the header cstdarg requires C++
#endif
:elsesegment
#ifndef _STDARG_H_INCLUDED
#define _STDARG_H_INCLUDED
:endsegment

:include readonly.sp
::
:: The following segment only appears in stdarg.h.
:segment !CNAME
#ifdef __cplusplus
#include <cstdarg>

using std::va_list;

#else /* __cplusplus not defined */
:endsegment

:segment CNAME
:include cpluspro.sp
:endsegment

#ifndef _COMDEF_H_INCLUDED
 #include <_comdef.h>
#endif

:include valist.sp

:segment CNAME
namespace std {
  typedef __va_list va_list;
}
:elsesegment
typedef __va_list va_list;
:endsegment

#if defined(__AXP__)
 #define _AXP_WORD_SIZE     8
 #define _AXP_FLOAT_SIZE    8
 #define _AXP_FLOAT_REGS    6
 extern void *__builtin_va_start(__va_list*, ...);
 #pragma intrinsic(__builtin_va_start);
 #define va_start(ap,pn) (__builtin_va_start(&ap,pn,1))
 #define va_arg(ap,type) ((ap).__offset+=\
     ((sizeof(type)+_AXP_WORD_SIZE-1)&~(_AXP_WORD_SIZE-1)),\
     (*(type *)((ap).__base+(ap).__offset-\
       ((__builtin_isfloat(type)&&(ap).__offset <=\
         (_AXP_FLOAT_REGS*_AXP_FLOAT_SIZE)) ?\
           (_AXP_FLOAT_REGS*_AXP_FLOAT_SIZE)+_AXP_FLOAT_SIZE :\
             ((sizeof(type)+_AXP_WORD_SIZE-1)&~(_AXP_WORD_SIZE-1))))))
 #define va_end(ap)      ((void)0)
#elif defined(__PPC__)
 #if defined(__NT__)
  #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  #define       _ALIGNIT(ap,t) \
        ((((int)(ap))+(sizeof(t)<8?3:7)) & (sizeof(t)<8?~3:~7))
  #define va_start(ap,v)  ( ap = (__va_list)&v + _INTSIZEOF(v) )
  #define va_arg(ap,t)    ( *(t *)((ap = (char *) (_ALIGNIT(ap, t) + _INTSIZEOF(t))) - _INTSIZEOF(t)) )
  #define va_end(ap)      ( ap = (__va_list)0 )
 #else
  extern void *__builtin_va_start( __va_list * );
  #pragma intrinsic(__builtin_va_start);
  #define va_start(ap,pn) (__builtin_va_start(&ap,pn))
  #define va_arg(ap,type) (__builtin_va_arg(&ap,type))
 #endif
#elif defined(__MIPS__)
 #define _MIPS_WORD_SIZE     4
 extern void *__builtin_va_start(__va_list*, ...);
 #pragma intrinsic(__builtin_va_start);
 #define va_start(ap,pn) (__builtin_va_start(&ap,pn,1))
 #define va_arg(ap,type) ((ap).__offset+=\
     ((sizeof(type)+_MIPS_WORD_SIZE-1)&~(_MIPS_WORD_SIZE-1)),\
     (*(type *)((ap).__base+(ap).__offset-\
       (((sizeof(type)+_MIPS_WORD_SIZE-1)&~(_MIPS_WORD_SIZE-1))))))
 #define va_end(ap)      ((void)0)
#else
 #if defined(__HUGE__) || defined(__SW_ZU)
  #define va_start(ap,pn) ((ap)[0]=(char _WCFAR*)&pn+\
      ((sizeof(pn)+sizeof(int)-1)&~(sizeof(int)-1)),(void)0)
  #define va_arg(ap,type)     ((ap)[0]+=\
      ((sizeof(type)+sizeof(int)-1)&~(sizeof(int)-1)),\
      (*(type _WCFAR*)((ap)[0]-((sizeof(type)+sizeof(int)-1)&~(sizeof(int)-1)))))
  #define va_end(ap)        ((ap)[0]=0,(void)0)
 #else
  #define va_start(ap,pn) ((ap)[0]=(char *)&pn+\
      ((sizeof(pn)+sizeof(int)-1)&~(sizeof(int)-1)),(void)0)
  #define va_arg(ap,type)     ((ap)[0]+=\
      ((sizeof(type)+sizeof(int)-1)&~(sizeof(int)-1)),\
      (*(type *)((ap)[0]-((sizeof(type)+sizeof(int)-1)&~(sizeof(int)-1)))))
  #define va_end(ap)        ((ap)[0]=0,(void)0)
 #endif
#endif

:: define __va_copy even if -za is used
#if defined(__PPC__) || defined(__AXP__)
  #define __va_copy(dest,src) ((dest)=(src),(void)0)
#else
  #define __va_copy(dest,src) ((dest)[0]=(src)[0],(void)0)
#endif

:: Extensions section (C99 va_copy definition)
:include ext.sp
#define va_copy(dest,src) __va_copy(dest,src)
#endif /* End of extensions section. */

:segment CNAME
:include cplusepi.sp
:endsegment

:: This #endif closes the #ifdef __cplusplus in stdarg.h
:segment !CNAME
#endif
:endsegment

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?