Update v1.03 -> Update v1.04
Problem mit Unterstrukturen und Arrays gelöst. Beim anlegen der Strukturen jetzt mit "EndStruct(strukturname)" beenden. Bei EndStruct(...) Strukturname immer klein schreiben! Wichtig da der Compiler intern immer alles nach klein umwandelt.
Update v1.09
- compatible mit X86 und X64
Code: Alles auswählen
;-TOP
; Comment : CopyStructure with Strings and Arrays
; Author : mk-soft
; Second Author :
; File : CopyStructure.pb
; Version : 1.09
; Create :
; Update : 28.03.2009
;
; Compilermode :
;
; ***************************************************************************************
;- Macros EndStruct to create help functions
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
; X86 Processor
Macro EndStruct(StructureName) ; <- name of structure allways lowercase
EndStructure
Procedure ___dummy_#StructureName()
Protected dummy.StructureName
EndProcedure
Procedure ___addr_#StructureName()
!MOV eax, dword s_#StructureName
ProcedureReturn
EndProcedure
EndMacro
CompilerElse
; X64 Processor
Macro EndStruct(StructureName) ; <- name of structure allways lowercase
EndStructure
Procedure ___dummy_#StructureName()
Protected dummy.StructureName
EndProcedure
Procedure ___addr_#StructureName()
!MOV rax, qword s_#StructureName
ProcedureReturn
EndProcedure
EndMacro
CompilerEndIf
Macro GetStruct(StructureName)
___addr_#StructureName()
EndMacro
; ***************************************************************************************
; Recursive function
Procedure SubCopyStructure(*Scoure, *Desk, StructAdress, Offset)
Protected adress, loop, ofs, size, subStruct, count, *s1.string , *s2.string
Repeat
adress = PeekI(StructAdress)
If adress = -1
Break
EndIf
If adress = -2
loop = PeekI(StructAdress+SizeOf(adress)) -1
ofs = PeekI(StructAdress+SizeOf(adress)*2)
size = PeekI(StructAdress+SizeOf(adress)*3)
subStruct = PeekI(StructAdress+SizeOf(adress)*4)
For count = 0 To loop
SubCopyStructure(*Scoure, *Desk, subStruct, ofs +(count*size))
Next
StructAdress + SizeOf(adress)*5
Else
*s1 = *Scoure + adress + Offset
*s2 = *Desk + adress + Offset
PokeI(*s2, 0)
*s2\s = *s1\s
StructAdress + SizeOf(adress)
EndIf
ForEver
EndProcedure
; Main function
Procedure CopyStructure(*Scoure, *Desk, Size, StructAdress)
CopyMemory(*Scoure, *Desk, Size)
SubCopyStructure(*Scoure, *Desk, StructAdress, 0)
EndProcedure
; ***************************************************************************************
; Recursive function
Procedure SubListStructureStrings(*Scoure, List List.i(), StructAdress, Offset)
Protected adress, loop, ofs, size, subStruct, count, *s1.string , *s2.string
Repeat
adress = PeekI(StructAdress)
If adress = -1
Break
EndIf
If adress = -2
loop = PeekI(StructAdress+SizeOf(adress)) -1
ofs = PeekI(StructAdress+SizeOf(adress)*2)
size = PeekI(StructAdress+SizeOf(adress)*3)
subStruct = PeekI(StructAdress+SizeOf(adress)*4)
For count = 0 To loop
SubListStructureStrings(*Scoure, List(), subStruct, ofs +(count*size))
Next
StructAdress + SizeOf(adress)*5
Else
AddElement(List())
List() = *Scoure + adress + Offset
StructAdress + SizeOf(adress)
EndIf
ForEver
EndProcedure
; Function Get Strings
Procedure.s GetStructureStrings(*Scoure, StructAdress, Separator.s = ";")
Protected NewList List.i()
Protected *s1.string, result.s
SubListStructureStrings(*Scoure, List(), StructAdress, 0)
ForEach List()
*s1 = List()
result + *s1\s + Separator
Next
ProcedureReturn result
EndProcedure
; Function Set Strings
Procedure SetStructureStrings(*Scoure, StructAdress, Strings.s, Separator.s = ";")
Protected NewList List.i()
Protected *s1.string, count
SubListStructureStrings(*Scoure, List(), StructAdress, 0)
count = 1
ForEach List()
*s1 = List()
*s1\s = StringField(Strings, count, Separator)
count + 1
Next
EndProcedure
; Function Clear Strings
Procedure ClearStructureStrings(*Scoure, StructAdress)
Protected NewList List.i()
Protected *s1.string, count
SubListStructureStrings(*Scoure, List(), StructAdress, 0)
count = 1
ForEach List()
*s1 = List()
*s1\s = ""
count + 1
Next
EndProcedure
; ***************************************************************************************
Procedure FreeStructureMemory(*PointerToStructure, StructAdress)
ClearStructureStrings(*PointerToStructure, StructAdress)
FreeMemory(*PointerToStructure)
EndProcedure
; ***************************************************************************************
;- Test structure
Structure soso
s1.s
s2.s
EndStructure
Structure udttest
w1.w
w2.w
l1.l
l2.l
s1.s
s2.s
d1.d
d2.d
s3.soso[2]
EndStruct(udttest) ; <- NEU : Erstellt eine Hilfsfuntion , Strukturname immer klein schreiben
; Test
Global quell.udttest
Global ziel.udttest
With quell
\s1 = "Hallo Welt"
\s2 = "Daten 1"
\s3[0]\s1 = ";)"
\s3[1]\s2 = ":wink:"
EndWith
Debug "Quelldaten"
With quell
Debug \s1
Debug \s2
Debug \s3[0]\s1
Debug \s3[1]\s2
EndWith
Debug "-------------------"
CopyStructure(quell, ziel, SizeOf(udttest), GetStruct(udtTest))
Debug "Zieldaten"
With ziel
Debug \s1
Debug \s2
Debug \s3[0]\s1
Debug \s3[1]\s2
EndWith
Debug "-------------------"
With quell
\s1 = "Hallo Welt"
\s2 = "Quelldaten geändert"
\s3[0]\s1 = ";) ---"
\s3[1]\s2 = ":evil:"
EndWith
With ziel
\s1 = "Hallo Welt"
\s2 = "Zieldaten geändert"
\s3[0]\s1 = ";) ***"
\s3[1]\s2 = ":allright:"
EndWith
Debug "Quelldaten neu"
With quell
Debug \s1
Debug \s2
Debug \s3[0]\s1
Debug \s3[1]\s2
EndWith
Debug "-------------------"
Debug "Zieldaten neu"
With ziel
Debug \s1
Debug \s2
Debug \s3[0]\s1
Debug \s3[1]\s2
EndWith
Debug "-------------------"
Debug "Get all strings"
temp.s = GetStructureStrings(quell, GetStruct(udtTest), #TAB$)
Debug temp
Debug "Upercase all strings"
temp.s = UCase(temp)
SetStructureStrings(quell, GetStruct(udtTest), temp, #TAB$)
Debug GetStructureStrings(quell, GetStruct(udtTest), #TAB$)
Debug "Delete all strings"
ClearStructureStrings(quell, GetStruct(udtTest))
Debug GetStructureStrings(quell, GetStruct(udtTest), #TAB$)
Debug "-------------------"
Debug "Free structure memory"
*mem.udttest = AllocateMemory(SizeOf(udttest))
FreeStructureMemory(*mem, GetStruct(udtTest))
