vargs.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************************************
  2.  *       *
  3.  *    N O T I C E       *
  4.  *       *
  5.  *       Copyright Abandoned, 1987, Fred Fish       *
  6.  *       *
  7.  *       *
  8.  * This previously copyrighted work has been placed into the  public     *
  9.  * domain by  the  author  and  may be freely used for any purpose,     *
  10.  * private or commercial.       *
  11.  *       *
  12.  * Because of the number of inquiries I was receiving about the  use     *
  13.  * of this product in commercially developed works I have decided to     *
  14.  * simply make it public domain to further its unrestricted use. I     *
  15.  * specifically  would  be  most happy to see this material become a     *
  16.  * part of the standard Unix distributions by AT&T and the  Berkeley     *
  17.  * Computer  Science  Research Group, and a standard part of the GNU     *
  18.  * system from the Free Software Foundation.       *
  19.  *       *
  20.  * I would appreciate it, as a courtesy, if this notice is  left  in     *
  21.  * all copies and derivative works.  Thank you.       *
  22.  *       *
  23.  * The author makes no warranty of any kind  with respect  to  this     *
  24.  * product  and  explicitly disclaims any implied warranties of mer-     *
  25.  * chantability or fitness for any particular purpose.       *
  26.  *       *
  27.  ******************************************************************************
  28.  */
  29. /*
  30.  *  FILE
  31.  *
  32.  * vargs.h    include file for environments without varargs.h
  33.  *
  34.  *  SCCS
  35.  *
  36.  * @(#)vargs.h 1.2 5/8/88
  37.  *
  38.  *  SYNOPSIS
  39.  *
  40.  * #include "vargs.h"
  41.  *
  42.  *  DESCRIPTION
  43.  *
  44.  * This file implements a varargs macro set for use in those
  45.  * environments where there is no system supplied varargs.  This
  46.  * generally works because systems which don't supply a varargs
  47.  * package are precisely those which don't strictly need a varargs
  48.  * package.  Using this one then allows us to minimize source
  49.  * code changes.  So in some sense, this is a "portable" varargs
  50.  * since it is only used for convenience, when it is not strictly
  51.  * needed.
  52.  *
  53.  */
  54. /*
  55.  * These macros allow us to rebuild an argument list on the stack
  56.  * given only a va_list.  We can use these to fake a function like
  57.  * vfprintf, which gets a fixed number of arguments, the last of
  58.  * which is a va_list, by rebuilding a stack and calling the variable
  59.  * argument form fprintf. Of course this only works when vfprintf
  60.  * is not available in the host environment, and thus is not available
  61.  * for fprintf to call (which would give us an infinite loop).
  62.  *
  63.  * Note that ARGS_TYPE is a long, which lets us get several bytes
  64.  * at a time while also preventing lots of "possible pointer alignment
  65.  * problem" messages from lint.  The messages are valid, because this
  66.  * IS nonportable, but then we should only be using it in very
  67.  * nonrestrictive environments, and using the real varargs where it
  68.  * really counts.
  69.  *
  70.  */
  71. #define ARG0 a0
  72. #define ARG1 a1
  73. #define ARG2 a2
  74. #define ARG3 a3
  75. #define ARG4 a4
  76. #define ARG5 a5
  77. #define ARG6 a6
  78. #define ARG7 a7
  79. #define ARG8 a8
  80. #define ARG9 a9
  81. #define ARGS_TYPE long
  82. #define ARGS_LIST ARG0,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8,ARG9
  83. #define ARGS_DCL auto ARGS_TYPE ARGS_LIST
  84. /*
  85.  * A pointer of type "va_list" points to a section of memory
  86.  * containing an array of variable sized arguments of unknown
  87.  * number.  This pointer is initialized by the va_start
  88.  * macro to point to the first byte of the first argument.
  89.  * We can then use it to walk through the argument list by
  90.  * incrementing it by the size of the argument being referenced.
  91.  */
  92. typedef char *va_list;
  93. /*
  94.  * The first variable argument overlays va_alist, which is
  95.  * nothing more than a "handle" which allows us to get the
  96.  * address of the first argument on the stack.  Note that
  97.  * by definition, the va_dcl macro includes the terminating
  98.  * semicolon, which makes use of va_dcl in the source code
  99.  * appear to be missing a semicolon.
  100.  */
  101. #define va_dcl ARGS_TYPE va_alist;
  102. /*
  103.  * The va_start macro takes a variable of type "va_list" and
  104.  * initializes it.  In our case, it initializes a local variable
  105.  * of type "pointer to char" to point to the first argument on
  106.  * the stack.
  107.  */
  108. #define va_start(list) list = (char *) &va_alist
  109. /*
  110.  * The va_end macro is a null operation for our use.
  111.  */
  112. #define va_end(list)
  113. /*
  114.  * The va_arg macro is the tricky one.  This one takes
  115.  * a va_list as the first argument, and a type as the second
  116.  * argument, and returns a value of the appropriate type
  117.  * while advancing the va_list to the following argument.
  118.  * For our case, we first increment the va_list arg by the
  119.  * size of the type being recovered, cast the result to
  120.  * a pointer of the appropriate type, and then dereference
  121.  * that pointer as an array to get the previous arg (which
  122.  * is the one we wanted.
  123.  */
  124. #define va_arg(list,type) ((type *) (list += sizeof (type)))[-1]