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
 |