Cva_Arg

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

Syntax
	variable = Cva_Arg ( argument_list, DataTypedatatype )

Parameters
	argument_list
		KeyPgCvaListCva_List data type variable to access for next value
	datatype
		The DataType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 KeyPgCvaStartCva_Start or KeyPgCvaCopy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, 1ll Shl 32, 2.2, 3.3, "foo", s)

Version
	* Since fbc 1.07.0

Dialect Differences
	* Not available in the CompilerOptlang-lang qb dialect unless referenced with the 
	  alias __cva_arg.

Differences from QB
	* New to FreeBASIC

See also
	* KeyPgDots... (Ellipsis)
	* KeyPgCvaCopyCva_Copy
	* KeyPgCvaEndCva_End
	* KeyPgCvaListCva_List
	* KeyPgCvaStartCva_Start

