/** @file
    This header, <stdarg.h>, declares type va_list and defines macros: va_start, va_arg, va_end;
    for advancing through a list of arguments whose number and types are not known to the
    called function when it is translated.

    A function may be called with a variable number of arguments of varying types.
    The rightmost argument plays a special role in the access mechanism, and will
    be designated paramN in this and subsequent descriptions.

    The type va_list is a type suitable for holding information needed by the
    macros va_start, va_arg, and va_end.  If access to the varying arguments
    is desired, the called function shall declare an object (referred to as ap
    in these descriptions) having type va_list.  The object ap may be passed as
    an argument to another function; if the receiving function invokes the va_arg macro
    with parameter ap, the value of ap in the calling function becomes indeterminate
    and must be passed to the va_end macro prior to any further reference to ap.

    The va_start and va_arg macros must be implemented as macros, not as actual
    functions.  The va_start and va_end macros must be invoked in the
    function accepting a varying number of arguments, if access to the varying
    arguments is desired.

    Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
    This program and the accompanying materials are licensed and made available under
    the terms and conditions of the BSD License that accompanies this distribution.
    The full text of the license may be found at
    http://opensource.org/licenses/bsd-license.

    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _STDARG_H
#define _STDARG_H
#include  <sys/EfiCdefs.h>

/** @{
    The type va_list is a type suitable for holding information needed by the
    macros va_start, va_arg, and va_end.

    Depending upon compiler or CPU architecture, different definitions are required.
**/
#if defined(__GNUC__)
typedef __builtin_va_list   va_list;
#else
#define va_list   VA_LIST
#endif
/*@}*/

/** @{
    The va_start macro must be invoked before any access to the unnamed arguments.
    The va_start macro initializes ap for subsequent use by va_arg and va_end.

    Synopsys: void va_start(va_list ap, paramN);

    @param  ap      An object of type va_list that is to be initialized such
                    that subsequent successive invocations of va_arg will
                    return the values of the parameters following paramN.

    @param  paramN  The parameter paramN is the identifier of the rightmost
                    parameter in the variable parameter list in the function
                    definition (the one just before the ,...).  If the
                    parameter parmN is declared with the register storage
                    class, with a function of array type, or with a type that
                    is not compatible with the type that results after
                    application of the default argument promotions, the
                    behavior is undefined.
**/
#if defined(__GNUC__)
#define va_start    __builtin_va_start
#else
#define va_start    VA_START
#endif
/*@}*/

/** @{
    The va_arg macro expands to an expression that has the type and value of
    the next argument in the call.  The parameter ap shall be the same as the
    va_list ap initialized by va_start.  Each invocation of va_arg modifies ap
    so that the values of successive arguments are returned in turn.  The
    parameter type is a type name specified such that the type of a pointer to
    an object that has the specified type can be obtained simply by postfixing
    a * to type.  If there is no actual next argument, or if type is not
    compatible with the type of the actual next argument (as promoted
    according to the default argument promotions), the behavior is undefined.

    Synopsys: type va_arg(va_list ap, type);

    @param  ap    An object of type va_list that was initialized by a prior
                  invocation of va_start.

    @param  type  A type name specifying the type of the parameter to be retrieved.

    @return       The first invocation of the va_arg macro after that of the
                  va_start macro returns the value of the argument after that
                  specified by paramN.  Successive invocations return the values
                  of the remaining arguments in succession.
**/
#if defined(__GNUC__)
#define va_arg        __builtin_va_arg
#else
#define va_arg        VA_ARG
#endif
/*@}*/

/** @{
    The va_end macro facillitates a normal return from the function whose
    variable argument list was referred to by the expansion of va_start that
    initialized the va_list ap.

    Synopsys: void va_end(va_list ap);

    The va_end macro may modify ap so that it is no longer usable (without an
    intervening invocation of va_start).  If there is no corresponding
    invocation of the va_start macro, or if the va_end macro is not invoked
    before the return, the behavior is undefined.

    @param  ap    An object of type va_list, initialized by a prior
                  invocation of va_start, that will no longer be referenced.
**/
#if defined(__GNUC__)
#define va_end              __builtin_va_end
#else
#define va_end              VA_END
#endif
/*@}*/

/** @{
    For BSD compatibility.
**/
#if defined(__GNUC__)
#define va_copy         __builtin_va_copy
#else
#define va_copy(s,d)      (s) = (d)
#endif
/*@}*/

/** Provide a generic version of the compiler-dependent __va_copy macro.
    Some software, such as Python 2.7.2, relies upon the existence of __va_copy.
    If this macro is not defined, it just assigns one va_list item to another.
    This breaks for compiler environments that define va_list as an array or structure.
**/
#ifndef __va_copy
  #define __va_copy       va_copy
#endif

#endif  /* _STDARG_H */
