mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Added PureBasic example
This commit is contained in:
		
							
								
								
									
										203
									
								
								samples/PureBasic/Memory.pbi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								samples/PureBasic/Memory.pbi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | ||||
|  | ||||
| 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 | ||||
		Reference in New Issue
	
	Block a user