mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
204 lines
4.5 KiB
Plaintext
204 lines
4.5 KiB
Plaintext
|
|
Structure Memory_Operation
|
|
Src_Offset.q
|
|
Src_Size.q
|
|
|
|
Dst_Offset.q
|
|
Dst_Size.q
|
|
|
|
Copy_Size.q
|
|
EndStructure
|
|
|
|
; #### Cuts the Offset's / Sizes of the memory operation to prevent memory violations
|
|
Procedure Memory_Operation_Check(*Memory_Operation.Memory_Operation)
|
|
Protected Temp.q
|
|
|
|
If *Memory_Operation\Src_Offset < 0
|
|
*Memory_Operation\Copy_Size + *Memory_Operation\Src_Offset
|
|
*Memory_Operation\Dst_Offset - *Memory_Operation\Src_Offset
|
|
*Memory_Operation\Src_Offset - *Memory_Operation\Src_Offset
|
|
EndIf
|
|
|
|
If *Memory_Operation\Dst_Offset < 0
|
|
*Memory_Operation\Copy_Size + *Memory_Operation\Dst_Offset
|
|
*Memory_Operation\Src_Offset - *Memory_Operation\Dst_Offset
|
|
*Memory_Operation\Dst_Offset - *Memory_Operation\Dst_Offset
|
|
EndIf
|
|
|
|
Temp = *Memory_Operation\Src_Size - *Memory_Operation\Src_Offset
|
|
If *Memory_Operation\Copy_Size > Temp
|
|
*Memory_Operation\Copy_Size = Temp
|
|
EndIf
|
|
|
|
Temp = *Memory_Operation\Dst_Size - *Memory_Operation\Dst_Offset
|
|
If *Memory_Operation\Copy_Size > Temp
|
|
*Memory_Operation\Copy_Size = Temp
|
|
EndIf
|
|
|
|
If *Memory_Operation\Copy_Size < 0
|
|
*Memory_Operation\Copy_Size = 0
|
|
EndIf
|
|
|
|
ProcedureReturn #True
|
|
EndProcedure
|
|
|
|
; #### Fills a *Destination with a specified amount of data.
|
|
; #### It cuts everything, to prevent memory violations
|
|
Procedure Memory_Range_Fill(Ascii.a, Fill_Size.q, *Dst, Dst_Offset.q, Dst_Size.q=-1)
|
|
Protected Temp.q
|
|
|
|
If Not *Dst
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
If Dst_Size = -1
|
|
Dst_Size.q = MemorySize(*Dst)
|
|
EndIf
|
|
|
|
If Dst_Offset < 0
|
|
Fill_Size + Dst_Offset
|
|
Dst_Offset - Dst_Offset
|
|
EndIf
|
|
|
|
Temp = Dst_Size - Dst_Offset
|
|
If Fill_Size > Temp
|
|
Fill_Size = Temp
|
|
EndIf
|
|
|
|
If Fill_Size > 0
|
|
FillMemory(*Dst+Dst_Offset, Fill_Size, Ascii)
|
|
EndIf
|
|
|
|
ProcedureReturn #True
|
|
EndProcedure
|
|
|
|
; #### Copies a specified amount of data (Copy_Size) from the source to the destination.
|
|
; #### It cuts everything, to prevent memory violations
|
|
Procedure Memory_Range_Copy(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1)
|
|
Protected Temp.q
|
|
If Not *Src
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
If Not *Dst
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
If Src_Size = -1
|
|
Src_Size.q = MemorySize(*Src)
|
|
EndIf
|
|
If Dst_Size = -1
|
|
Dst_Size.q = MemorySize(*Dst)
|
|
EndIf
|
|
|
|
If Src_Offset < 0
|
|
Copy_Size + Src_Offset
|
|
Dst_Offset - Src_Offset
|
|
Src_Offset - Src_Offset
|
|
EndIf
|
|
|
|
If Dst_Offset < 0
|
|
Copy_Size + Dst_Offset
|
|
Src_Offset - Dst_Offset
|
|
Dst_Offset - Dst_Offset
|
|
EndIf
|
|
|
|
Temp = Src_Size - Src_Offset
|
|
If Copy_Size > Temp
|
|
Copy_Size = Temp
|
|
EndIf
|
|
|
|
Temp = Dst_Size - Dst_Offset
|
|
If Copy_Size > Temp
|
|
Copy_Size = Temp
|
|
EndIf
|
|
|
|
If Copy_Size > 0
|
|
CopyMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size)
|
|
EndIf
|
|
|
|
ProcedureReturn #True
|
|
EndProcedure
|
|
|
|
; #### Copies (MoveMemory) a specified amount of data (Copy_Size) from the source to the destination.
|
|
; #### It cuts everything, to prevent memory violations
|
|
Procedure Memory_Range_Move(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1)
|
|
Protected Temp.q
|
|
If Not *Src
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
If Not *Dst
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
If Src_Size = -1
|
|
Src_Size.q = MemorySize(*Src)
|
|
EndIf
|
|
If Dst_Size = -1
|
|
Dst_Size.q = MemorySize(*Dst)
|
|
EndIf
|
|
|
|
If Src_Offset < 0
|
|
Copy_Size + Src_Offset
|
|
Dst_Offset - Src_Offset
|
|
Src_Offset - Src_Offset
|
|
EndIf
|
|
|
|
If Dst_Offset < 0
|
|
Copy_Size + Dst_Offset
|
|
Src_Offset - Dst_Offset
|
|
Dst_Offset - Dst_Offset
|
|
EndIf
|
|
|
|
Temp = Src_Size - Src_Offset
|
|
If Copy_Size > Temp
|
|
Copy_Size = Temp
|
|
EndIf
|
|
|
|
Temp = Dst_Size - Dst_Offset
|
|
If Copy_Size > Temp
|
|
Copy_Size = Temp
|
|
EndIf
|
|
|
|
If Copy_Size > 0
|
|
MoveMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size)
|
|
EndIf
|
|
|
|
ProcedureReturn #True
|
|
EndProcedure
|
|
|
|
; #### Mirrors the memory, usable for little/big endian switching
|
|
Procedure Memory_Mirror(*Memory, Memory_Size)
|
|
Protected Elements, i
|
|
Protected Temp.a, *A.Ascii, *B.Ascii
|
|
|
|
If Not *Memory
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
If Memory_Size < 1
|
|
ProcedureReturn #True
|
|
EndIf
|
|
|
|
Elements = Memory_Size/2
|
|
*A = *Memory
|
|
*B = *Memory + Memory_Size - 1
|
|
|
|
For i = 0 To Elements - 1
|
|
Temp = *A\a
|
|
*A\a = *B\a
|
|
*B\a = Temp
|
|
*A + 1
|
|
*B - 1
|
|
Next
|
|
|
|
ProcedureReturn #True
|
|
EndProcedure
|
|
; IDE Options = PureBasic 5.31 (Windows - x64)
|
|
; CursorPosition = 190
|
|
; FirstLine = 177
|
|
; Folding = -
|
|
; EnableXP
|
|
; DisableDebugger
|