Update v1.05 für 32 und 64 Bit
- neu: Alle Argumente jetzt als Pointer übergeben
- neu: va_exist(zeiger) - ob parameter existiert
- neu: va_arg_integer(zeiger)
Beispiel (Update v1.05)
Code: Alles auswählen
;EnableExplicit
IncludeFile "valistHelper.pb"
; ***************************************************************************************
;-Beispiel für Addition
Procedure add(args)
Protected zahl, zahlen
; Init Arguments
va_list(zeiger)
; Zeiger auf das erste Argument setzen
va_start(zeiger)
While va_exist(zeiger)
zahl = va_arg_long(zeiger)
zahlen + zahl
Wend
ProcedureReturn zahlen
EndProcedure
; ***************************************************************************************
;-Beispiel für Addition mit übergabe der Anzahl von Argumenten
Procedure addition(anzahl, args)
Protected zahl, zahlen, index
; Init Arguments
va_list(zeiger)
; Zeiger auf das erste Argument setzen
va_start(zeiger)
For index = 1 To anzahl
zahlen + va_arg_long(zeiger)
Next
ProcedureReturn zahlen
EndProcedure
; ***************************************************************************************
;-Beispiel für Text
; Da Purebasic den Type Any nicht kennt muss der Text als Zeiger "@" übergeben werden
Procedure.s concat(args)
Protected text.s, result.s
; Init Arguments
va_list(zeiger)
; Zeiger auf das erste Argument setzen
va_start(zeiger)
While va_exist(zeiger)
text = va_arg_string(zeiger)
result + text
Wend
ProcedureReturn result
EndProcedure
; ***************************************************************************************
;-Beispiel für Variant
Procedure AnyVariant(args)
Protected *variant.variant , zahlen, text.s
; Init Arguments
va_list(zeiger)
; Zeiger auf das erste Argument setzen
va_start(zeiger)
While va_exist(zeiger)
*variant = va_arg_variant(zeiger)
If *variant = 0
Break
EndIf
Select *variant\vt
Case #VT_BSTR
text + PeekS(*variant\bstrVal, #PB_Any, #PB_Unicode)
Case #VT_I4, #VT_UI4
zahlen + *variant\lVal
EndSelect
Wend
Debug "Text: " + text
Debug "Summe: " + Str(zahlen)
EndProcedure
; ***************************************************************************************
; ***************************************************************************************
; UNICODE / ASCII Helper for SysAllocString
Procedure helpSysAllocString(*Value)
ProcedureReturn SysAllocString_(*Value)
EndProcedure
Prototype.l ProtoSysAllocString(Value.p-unicode)
;-T_BSTR
Global T_BSTR.ProtoSysAllocString = @helpSysAllocString()
; ***************************************************************************************
Define.l x,y,z
Define.s a,b,c,d
Debug "Test Addition"
x = 20
y = 80
z = 100
a1 = 0
a2 = 20
a3 = 30
a4 = 40
a5 = 50
Debug add(@x,@y)
Debug add(@a1, @a2, @a3, @a4, @a5)
Debug "Test Concat (Text)"
Debug concat(@"Hallo ", @"Welt")
a.s = "Das "
b.s = "ist "
c.s = ""
d.s = "ein Test"
Debug concat(@a,@b,@c,@d)
Debug "Test Variant"
Define.variant val1, val2, val3, val4
val1\vt = #VT_I4
val1\lVal = 100
val2\vt = #VT_I4
val2\lVal = 200
val3\vt = #VT_BSTR
val3\bstrVal = T_BSTR("Hallo Welt. ")
val4\vt = #VT_BSTR
val4\bstrVal = T_BSTR(":)")
AnyVariant(val1, val2, val3, val4)
Code: Alles auswählen
;-TOP
; Kommentar : Arbeiten mit variablen langen Argumentlisten
; Author : mk-soft
; Second Author :
; Datei : valistHelper.pb
; Version : 1.05
; Erstellt : 19.05.2007
; Geändert : 22.03.2009
;
; Compilermode :
;
; ***************************************************************************************
;- Declaration, Funktionen und Macros
; Argumentenliste
Macro args
*__a = 0, *__b = 0, *__c = 0, *__d = 0, *__e = 0, *__f = 0, *__g = 0, *__h = 0, *__i = 0, *__j = 0, *__k = 0, *__l = 0
EndMacro
; Macro zur Initialisierung
Macro va_list(zeiger)
Define.integer zeiger
EndMacro
; Procedure gibt aktuellen Zeiger zurück und setzt auf das nächste Argument
Procedure va_next(*zeiger.integer)
*zeiger\i + SizeOf(*zeiger)
ProcedureReturn *zeiger\i - SizeOf(*zeiger)
EndProcedure
; Macro zum setzen auf das erste Argument
Macro va_start(zeiger)
zeiger\i = @*__a
EndMacro
Macro va_exist(zeiger)
PeekI(zeiger\i)
EndMacro
; Macros und Funktionen zum auslesen der Arguemnte
Macro va_arg_integer(zeiger)
PeekI(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_quad(zeiger)
PeekQ(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_long(zeiger)
PeekL(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_word(zeiger)
PeekW(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_byte(zeiger)
PeekB(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_double(zeiger)
PeekD(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_float(zeiger)
PeekF(PeekI(va_next(zeiger)))
EndMacro
Macro va_arg_variant(zeiger)
PeekI(va_next(zeiger))
EndMacro
Procedure.s va_arg_string(*zeiger)
Protected *pstr
*pstr = PeekI(va_next(*zeiger))
If *pstr
ProcedureReturn PeekS(*pstr)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure.c va_arg_chr(*zeiger)
Protected *pstr
*pstr = PeekI(va_next(*zeiger))
If *pstr
ProcedureReturn PeekC(*pstr)
Else
ProcedureReturn 0
EndIf
EndProcedure
; ***************************************************************************************
FF
