home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / include / stdarg.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-20  |  5.1 KB  |  155 lines

  1. #if (defined(__IBMC__) || defined(__IBMCPP__))
  2. #pragma info( none )
  3. #ifndef __CHKHDR__
  4.    #pragma info( none )
  5. #endif
  6. #pragma info( restore )
  7. #endif
  8.  
  9. #ifndef __stdarg_h
  10.    #define __stdarg_h
  11.  
  12.    #ifdef __cplusplus
  13.       extern "C" {
  14.    #endif
  15.  
  16.    #ifndef  _LNK_CONV
  17.      #ifdef _M_I386
  18.          #define  _LNK_CONV   _Optlink
  19.      #else
  20.        #define  _LNK_CONV
  21.      #endif
  22.    #endif
  23.  
  24.    /********************************************************************/
  25.    /*  <stdarg.h> header file                                          */
  26.    /*                                                                  */
  27.    /*  VisualAge for C++ for Windows, Version 3.5                      */
  28.    /*    Licensed Material - Property of IBM                           */
  29.    /*                                                                  */
  30.    /*  5801-ARR and Other Materials                                    */
  31.    /*                                                                  */
  32.    /*  (c) Copyright IBM Corp 1991, 1996. All rights reserved.         */
  33.    /*                                                                  */
  34.    /********************************************************************/
  35.  
  36.    #ifdef _M_I386
  37.       typedef char *va_list;
  38.  
  39.       #define __nextword(base)   (((unsigned)(sizeof(base))+3U)&~(3U))
  40.  
  41.       #ifdef __cplusplus
  42.          #define va_start(ap, last) ap = __vastart(last);
  43.       #else
  44.          #define va_start(ap, last) ap = ((va_list)&last) + __nextword(last)
  45.       #endif
  46.       #define va_arg(ap, type) ((type *) ((ap += (int) __nextword(type)) - __nextword(type)))[0]
  47.       #define va_end(ap)       ap = 0
  48.    #else
  49.       /* WPOS ABI compliant definition */
  50.       #if (defined(__IBMC__) || defined( __IBMCPP__ ))
  51.  
  52.          #ifndef __def_va_list
  53.          #define __def_va_list
  54.          typedef struct __va_list_struct {
  55.             char gpr;
  56.             char fpr;
  57.             char reserved[2];
  58.             char *input_arg_area;
  59.             char *reg_save_area;
  60.          } __va_list[1];
  61.          #endif
  62.  
  63.          extern void _Builtin __vastart(void *);
  64.          extern void* __va_arg(void*, int);
  65.  
  66.          #define __va_start(ap,fmt) __vastart(&ap)
  67.          #define __va_arg(ap,t)  (*((t*)__va_arg(ap,__builtin_va_arg_incr((t *)0))))
  68.          #define __va_end(ap)
  69.  
  70.          #define va_start __va_start
  71.          #define va_arg   __va_arg
  72.          #define va_end   __va_end
  73.  
  74.          typedef __va_list va_list;
  75.       #else
  76.  
  77.          #ifndef __def_va_list
  78.             #define __def_va_list
  79.             /* The definitions for vararg processing are copied from  */
  80.             /* Metaware header file.                                  */
  81.             typedef struct {
  82.             #ifdef _NEW_ABI
  83.                /* The one that is going to be documented in the ABI:
  84.                * gpr -- index into the array of 8 GPRs stored in the register
  85.                *        save area; gpr=0 corresponds to r3, gpr=1 to r4, etc.
  86.                * fpr -- index into the array of 8 FPRs stored in the
  87.                *        register save area; fpr=0 corresponds to f1, fpr=1
  88.                *        to f2, etc.
  89.                * input_arg_area -- location in input argument area which
  90.                *        may have the next var arg that was passed in memory.
  91.                * reg_save_area -- where r3:r10 and f1:f8 (if saved) are stored.
  92.                */
  93.                char gpr;
  94.                char fpr;
  95.                char reserved[2];
  96.                char *input_arg_area;
  97.                char *reg_save_area;
  98.             #else
  99.                /* vararg_usage_info -- is break down to as follow. Each
  100.                * field initially record the number of "known" register
  101.                * and "memory" argument (before the "...").
  102.                * 4 -- number of word used in General Argument Registers.
  103.                * 4 -- number of double used in Floating Point Argument Registers.
  104.                * 24 --  number of bytes passed in overflow area.
  105.                */
  106.                unsigned long vararg_usage_info;
  107.                unsigned long *overflow_area;
  108.                unsigned long *arg_save_area;
  109.             #endif
  110.                } __va_list[1];
  111.          #endif
  112.  
  113.          #ifdef _NEW_ABI
  114.          #   ifdef __FSOFT
  115.          #       define __VA_INFO_CLASS  4
  116.          #   else
  117.          #       define __VA_INFO_CLASS  3
  118.          #   endif
  119.          #else
  120.          #   define __VA_INFO_CLASS      2
  121.          #endif
  122.  
  123.          extern void __builtin_va_info(void*);
  124.          extern void* __va_arg(void*, int);
  125.  
  126.          #define __va_start(ap,fmt) __builtin_va_info(&ap)
  127.          #define __va_arg(ap,t)      (*((t*)__va_arg(ap,_INFO(t,__VA_INFO_CLASS))))
  128.          #define __va_end(ap)
  129.  
  130.  
  131.          #define va_start __va_start
  132.          #define va_arg   __va_arg
  133.          #define va_end   __va_end
  134.  
  135.          typedef __va_list va_list;
  136.  
  137.       #endif
  138.  
  139.    #endif
  140.  
  141.    #ifdef __cplusplus
  142.       }
  143.    #endif
  144.  
  145. #endif
  146.  
  147. #if (defined(__IBMC__) || defined(__IBMCPP__))
  148. #pragma info( none )
  149. #ifndef __CHKHDR__
  150.    #pragma info( restore )
  151. #endif
  152. #pragma info( restore )
  153. #endif
  154.  
  155.