#include-once
;===============================================================================
; Function Name:   _ByteArrayCreate($sSTRUCT, $iELEMENTS=2)
; Description:     Erstellt eine Bytearray-Struktur
;                  $aBYTE[0] enthält die Variable, die an einen Dll-Aufruf zu übergeben wäre
; Parameter(s):    $sSTRUCT     String der Struktur
;                  $iELEMENTS   Anzahl der Elemente des Bytearray
; Return Value(s): das erstellte Bytearray
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================
Func _ByteArray_Create($sSTRUCT, $iELEMENTS=2)
	Local $SIZE = DllStructGetSize(DllStructCreate($sSTRUCT, 1))
	Local $aBYTE[$iELEMENTS +1]
	$aBYTE[0] = DllStructCreate('byte[' & $SIZE *$iELEMENTS & "]")
	Local $ptr = DllStructGetPtr($aBYTE[0])
	For $i = 0 To $iELEMENTS -1
		$aBYTE[$i+1] = DllStructCreate($sSTRUCT, $ptr + $i*$SIZE)
	Next
	Return $aBYTE
EndFunc  ;==>_ByteArray_Create

;===============================================================================
; Function Name:   _PtrArray_Create($sSTRUCT, $iELEMENTS=2)
; Description:     Erstellt eine Pointerarray-Struktur
; Parameter(s):    $sSTRUCT     String der Struktur
;                  $iELEMENTS   Anzahl der Elemente des Pointerarray
; Return Value(s): das erstellte Pointerarray
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================
Func _PtrArray_Create($sSTRUCT, $iELEMENTS=2)
	Local $struct = 'ptr[' & $iELEMENTS & '];'
	For $i = 1 To $iELEMENTS
		$struct &= $sSTRUCT & ';'
	Next
	Local $aPTR = DllStructCreate($struct)
	For $i = 1 To $iELEMENTS
		DllStructSetData($aPTR, 1, DllStructGetPtr($aPTR, $i+1), $i)
	Next
	Return $aPTR
EndFunc  ;==>_PtrArray_Create

;===============================================================================
; Function Name:   _PtrArray_SetData(ByRef $tSTRUCT, $sDATA, $sDELIM=Default)
; Description:     Füllt ein Pointerarray mit Daten
; Parameter(s):    $tSTRUCT    die Pointerstruktur
;                  $sDATA      die zu setzenden Daten, getrennt durch $sDELIM
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================
Func _PtrArray_SetData(ByRef $tSTRUCT, $sDATA, $sDELIM=Default)
	If IsKeyword($sDELIM) Then $sDELIM = Opt('GUIDataSeparatorChar')
	Local $aData = StringSplit($sDATA, $sDELIM)
	For $i = 1 To $aData[0]
		If $aData[$i] = '' Then ContinueLoop
		DllStructSetData($tSTRUCT, $i+1, $aData[$i])
	Next
EndFunc  ;==>_PtrArray_SetData

;===============================================================================
; Function Name:   _PtrArray_GetData(ByRef $aPTR, $sStructType, $iElements=-1, $iRetType=0, $sDelim=Default)
; Description:     Einen od. alle Werte eines Pointerarray ausgeben, (in Console, String, Array),
;                  verweisende Pointer werden als 'Pointer' ausgegeben
; Parameter(s):    $aPTR        das Pointerarray
;                  $sStructType String mit dem Typ der verwendeten Struktur
;                  $iElements   1-basierter Index des zu lesenden Elements, -1(Standard) = alle
;                  $iRetType    Rückgabe als: 0=Console (Standard), 1=Trennzeichenbasierter String, 2=Array
;                  $sDelim      Trennzeichen, mit -1 od. Default Zeichen von Opt('GUIDataSeparatorChar')
; Return Value(s): Gelesene Daten in gewähltem Rückgabetyp
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================
Func _PtrArray_GetData(ByRef $aPTR, $sStructType, $iElements=-1, $iRetType=0, $sDelim=Default)
	Local $sOut = '', $iCount = 1, $structPtr, $currPtr, $structRead
	If IsKeyword($sDelim) Or $sDelim = -1 Then $sDelim = Opt('GUIDataSeparatorChar')
	While True
		DllStructGetData($aPTR, 1, $iCount)
		If @error Then ExitLoop
		$iCount += 1
	WEnd
	$structPtr = DllStructCreate("ptr[" & $iCount -1 & "];", DllStructGetPtr($aPTR, 1))
	If $iElements < 1 Then
		For $i = 1 To $iCount -1
			$currPtr = DllStructGetData($structPtr, 1, $i)
			$structRead = DllStructCreate($sStructType, $currPtr)
			$sRead = DllStructGetData($structRead, 1)
			If IsPtr($sRead) Then $sRead = 'Pointer'
			$sOut &= $sRead & $sDelim
		Next
	Else
		$currPtr = DllStructGetData($structPtr, 1, $iElements)
		$structRead = DllStructCreate($sStructType, $currPtr)
		$sRead = DllStructGetData($structRead, 1)
		If IsPtr($sRead) Then $sRead = 'Pointer'
		$sOut &= $sRead & $sDelim
	EndIf
	Switch $iRetType
		Case 0 ; ==> console
			Return ConsoleWrite(StringTrimRight($sOut, StringLen($sDelim)) & @CRLF)
		Case 1 ; ==> delimited string
			Return StringTrimRight($sOut, StringLen($sDelim))
		Case Else ; ==> array
			Return StringSplit(StringTrimRight($sOut, StringLen($sDelim)), $sDelim, 3)
	EndSwitch
EndFunc  ;==>_PtrArray_GetData

;===============================================================================
; Function Name:   _StructGetValue(ByRef $tSTRUCT, $iRetType=0, $sDelim=-1)
; Description:     Ausgabe aller Werte einer Struktur (in Console, String, Array),
;                  verweisende Pointer werden als 'Pointer' ausgegeben
; Parameter(s):    $tSTRUCT        Struktur aus der die Daten gelesen werden
;                  $iRetType       Rückgabe als: 0=Console (Standard), 1=Trennzeichenbasierter String, 2=Array
;                  $sDelim         Trennzeichen, mit -1 od. Default Zeichen von Opt('GUIDataSeparatorChar')
; Return Value(s): Gelesene Daten in gewähltem Rückgabetyp
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================
Func _Struct_GetValue(ByRef $tSTRUCT, $iRetType=0, $sDelim=-1)
	Local $sOut = '', $sRead, $i = 1
	If IsKeyword($sDelim) Or $sDelim = -1 Then $sDelim = Opt('GUIDataSeparatorChar')
	While True
		$sRead = DllStructGetData($tSTRUCT, $i)
		If @error Then ExitLoop
		If IsPtr($sRead) Then $sRead = 'Pointer'
		$sOut &= $sRead & $sDelim
		$i += 1
	WEnd
	Switch $iRetType
		Case 0 ; ==> console
			Return ConsoleWrite(StringTrimRight($sOut, StringLen($sDelim)) & @CRLF)
		Case 1 ; ==> delimited string
			Return StringTrimRight($sOut, StringLen($sDelim))
		Case Else ; ==> array
			Return StringSplit(StringTrimRight($sOut, StringLen($sDelim)), $sDelim, 3)
	EndSwitch
EndFunc  ;==>_Struct_GetValue
