Cva_Arg

Macro to obtain the next argument from a variadic argument list object.

Syntax
   variable = Cva_Arg ( argument_list, datatype )

Parameters
   argument_list
      Cva_List data type variable to access for next value
   datatype
      The datatype of the next value in the variable argument list 
      argument_list

Description
   The Cva_Arg macro allows the use of a variable number of arguments 
   within a function:
      * 	Cva_Arg returns the current argument in the list, argument_list, 
        with an expected data type of datatype.
      * 	Before first Cva_Arg use, argument_list must be initialized with 
        the command Cva_Start or Cva_Copy.
      * 	Cva_Arg automatically increments argument_list to the next 
        argument within the list after obtaining the value of the current 
        argument.

Example
   '' Example of a simple custom printf
   Sub myprintf cdecl(ByRef formatstring As String, ...)
      Dim As Cva_List args

      '' Initialize the cva_list object to first var-arg
      Cva_Start( args, formatstring )

      '' For each char in format string...
      Dim As UByte Ptr p = StrPtr(formatstring)
      Dim As Integer todo = Len(formatstring)
      While (todo > 0)
         Dim As Integer char = *p
         p += 1
         todo -= 1

         '' Is it a format char?
         If (char = Asc("%")) Then
            If (todo = 0) Then
               '' % at the end
               Print "%";
               Exit While
            End If

            '' The next char should tell the type
            char = *p
            p += 1
            todo -= 1

            '' Print var-arg, depending on the type
            Select Case char
            '' integer?
            Case Asc("i")
               Print Str(Cva_Arg(args, Integer));

            '' long integer? (64-bit)
            Case Asc("l")
               Print Str(Cva_Arg(args, LongInt));

            '' single or double?
            '' Note: because the C ABI, all singles passed on
            '' var-args are converted to doubles.
            Case Asc( "f" ), Asc( "d" )
               Print Str(Cva_Arg(args, Double));

            '' string?
            Case Asc("s")
               '' Strings are passed byval, so the length is unknown
               Print *Cva_Arg(args, ZString Ptr);

            End Select

         '' Ordinary char, just print as-is
         Else
            Print Chr( char );
         End If
      Wend

      Cva_End( args )

   End Sub

   Dim As String s = "bar"

   myprintf(!"integer=%i, longint=%l single=%f, double=%d, string=%s, string=%s\n", _
          1, 1ll Shl 32, 2.2, 3.3, "foo", s)

Version
   * Since fbc 1.07.0

Dialect Differences
   * Not available in the -lang qb dialect unless referenced with the 
     alias __cva_arg.

Differences from QB
   * New to FreeBASIC

See also
   * ... (Ellipsis)
   * Cva_Copy
   * Cva_End
   * Cva_List
   * Cva_Start

