Update .gitignore, _ChainedHashMap.pbi, HashMap.pbi, and 4 more files
This commit is contained in:
@@ -1,8 +1,23 @@
|
||||
|
||||
#YASS13_HashMap_Type = "Chained"
|
||||
|
||||
; Common prototypes every hashmap implementation must match.
|
||||
Prototype.i HashMapProto_Create(SizePower.b)
|
||||
Prototype.i HashMapProto_GetByHash(*Map, Hash.q)
|
||||
Prototype.b HashMapProto_OverwriteByHash(*Map, *Data, Hash.q, *FreeingCallback = #Null)
|
||||
Prototype HashMapProto_DeleteByHash(*Map, Hash.q)
|
||||
Prototype HashMapProto_Free(*Map)
|
||||
Prototype HashMapProto_FreeCallback(*Data)
|
||||
|
||||
CompilerIf #YASS13_HashMap_Type = "Chained"
|
||||
|
||||
XIncludeFile "./_ChainedHashMap.pbi"
|
||||
|
||||
Global HashMap_Create.HashMapProto_Create = ChainedHashMap::@Create()
|
||||
Global HashMap_GetByHash.HashMapProto_GetByHash = ChainedHashMap::@GetByHash()
|
||||
Global HashMap_OverwriteByHash.HashMapProto_OverwriteByHash = ChainedHashMap::@OverwriteByHash()
|
||||
Global HashMap_DeleteByHash.HashMapProto_DeleteByHash = ChainedHashMap::@DeleteByHash()
|
||||
Global HashMap_Free.HashMapProto_Free = ChainedHashMap::@Free()
|
||||
Global HashMap_NoopFree.HashMapProto_FreeCallback = ChainedHashMap::@NoopFree()
|
||||
CompilerElse
|
||||
CompilerError("You must defined a valid core hashmap type !")
|
||||
CompilerError("You must defined a valid core hashmap type !")
|
||||
CompilerEndIf
|
||||
|
||||
@@ -1,121 +1,131 @@
|
||||
|
||||
EnableExplicit
|
||||
DeclareModule ChainedHashMap
|
||||
EnableExplicit
|
||||
|
||||
#HashMap_InitialPower = 9
|
||||
#HashMap_InsertIterations = 100000
|
||||
#InitialPower = 9
|
||||
#InsertIterations = 100000
|
||||
|
||||
;{
|
||||
Structure Bucket
|
||||
*BucketData
|
||||
*Next.Bucket
|
||||
Hash.q
|
||||
EndStructure
|
||||
|
||||
Structure ChainedHashMapBucket
|
||||
*BucketData
|
||||
*Next.ChainedHashMapBucket
|
||||
Hash.q
|
||||
EndStructure
|
||||
Structure HashMap
|
||||
EntryCount.i
|
||||
Capacity.i
|
||||
SizePower.a
|
||||
*Buckets.Bucket[0]
|
||||
EndStructure
|
||||
|
||||
Structure ChainedHashMap
|
||||
EntryCount.i
|
||||
Capacity.i
|
||||
SizePower.a
|
||||
*Buckets.ChainedHashMapBucket[0]
|
||||
EndStructure
|
||||
Prototype CbFree(*Data)
|
||||
|
||||
Declare.i Create(SizePower.b)
|
||||
Declare.i GetByHash(*CHM.HashMap, Hash.q)
|
||||
Declare.b OverwriteByHash(*CHM.HashMap, *Data, Hash.q, *FreeingCallback.CbFree = #Null)
|
||||
Declare DeleteByHash(*CHM.HashMap, Hash.q)
|
||||
Declare Free(*CHM.HashMap)
|
||||
Declare NoopFree(*Data)
|
||||
EndDeclareModule
|
||||
|
||||
Prototype CbFree(*Data)
|
||||
Module ChainedHashMap
|
||||
EnableExplicit
|
||||
|
||||
Procedure.l MakeBitMask(BitCount.b)
|
||||
EnableASM
|
||||
MOV eax, $00000001
|
||||
MOV cl, BitCount
|
||||
SHL eax, cl
|
||||
DEC eax
|
||||
ProcedureReturn
|
||||
DisableASM
|
||||
EndProcedure
|
||||
Procedure.l MakeBitMask(BitCount.b)
|
||||
EnableASM
|
||||
MOV eax, $00000001
|
||||
MOV cl, BitCount
|
||||
SHL eax, cl
|
||||
DEC eax
|
||||
ProcedureReturn
|
||||
DisableASM
|
||||
EndProcedure
|
||||
|
||||
Procedure.i CHM_Create(SizePower.b)
|
||||
Protected *CHM.ChainedHashMap = AllocateMemory(SizeOf(ChainedHashMap) + (SizeOf(Integer) * (MakeBitMask(SizePower) + 1)))
|
||||
|
||||
If *CHM <> #Null
|
||||
*CHM\EntryCount = 0
|
||||
*CHM\SizePower = SizePower
|
||||
|
||||
Protected iBucket
|
||||
For iBucket = 0 To MakeBitMask(SizePower)
|
||||
*CHM\Buckets[iBucket] = #Null
|
||||
Next
|
||||
EndIf
|
||||
|
||||
ProcedureReturn *CHM
|
||||
EndProcedure
|
||||
Procedure.i Create(SizePower.b)
|
||||
Protected *CHM.HashMap = AllocateMemory(SizeOf(HashMap) + (SizeOf(Integer) * (MakeBitMask(SizePower) + 1)))
|
||||
|
||||
Procedure.i CHM_GetByHash(*CHM.ChainedHashMap, Hash.q)
|
||||
If *CHM <> #Null
|
||||
Protected *CurrentBucket.ChainedHashMapBucket = *CHM\Buckets[(Hash & MakeBitMask(*CHM\SizePower))]
|
||||
|
||||
While *CurrentBucket <> #Null
|
||||
If *CurrentBucket\Hash = Hash
|
||||
ProcedureReturn *CurrentBucket\BucketData
|
||||
EndIf
|
||||
*CurrentBucket = *CurrentBucket\Next
|
||||
Wend
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #Null
|
||||
EndProcedure
|
||||
If *CHM <> #Null
|
||||
*CHM\EntryCount = 0
|
||||
*CHM\SizePower = SizePower
|
||||
|
||||
Procedure.b CHM_OverwriteByHash(*CHM.ChainedHashMap, *Data, Hash.q, *FreeingCallback.CbFree = #Null)
|
||||
If *CHM <> #Null
|
||||
Protected *PreviousBucket.ChainedHashMapBucket = #Null
|
||||
Protected *CurrentBucket.ChainedHashMapBucket = *CHM\Buckets[(Hash & MakeBitMask(*CHM\SizePower))]
|
||||
|
||||
; We iterate over the bucket chain until we find a collision or an in-between.
|
||||
While *CurrentBucket <> #Null
|
||||
If *CurrentBucket\Hash >= Hash
|
||||
Break
|
||||
EndIf
|
||||
*PreviousBucket = *CurrentBucket
|
||||
*CurrentBucket = *CurrentBucket\Next
|
||||
Wend
|
||||
|
||||
If *CurrentBucket = #Null Or *CurrentBucket\Hash <> Hash
|
||||
; We either reached the end of the list, or no buckets was in the current slot.
|
||||
; Or, we have an in-between, or we are at the start of the list.
|
||||
Protected *NewBucket.ChainedHashMapBucket = AllocateMemory(SizeOf(ChainedHashMapBucket))
|
||||
|
||||
If *NewBucket <> #Null
|
||||
*NewBucket\Next = *CurrentBucket
|
||||
*NewBucket\BucketData = *Data
|
||||
*NewBucket\Hash = Hash
|
||||
|
||||
If *PreviousBucket <> #Null
|
||||
; In-between, or we are at the start of the List.
|
||||
*PreviousBucket\Next = *NewBucket
|
||||
Else
|
||||
; Start of the list.
|
||||
*CHM\Buckets[(Hash & MakeBitMask(*CHM\SizePower))] = *NewBucket
|
||||
Protected iBucket
|
||||
For iBucket = 0 To MakeBitMask(SizePower)
|
||||
*CHM\Buckets[iBucket] = #Null
|
||||
Next
|
||||
EndIf
|
||||
|
||||
ProcedureReturn *CHM
|
||||
EndProcedure
|
||||
|
||||
Procedure.i GetByHash(*CHM.HashMap, Hash.q)
|
||||
If *CHM <> #Null
|
||||
Protected *CurrentBucket.Bucket = *CHM\Buckets[(Hash & MakeBitMask(*CHM\SizePower))]
|
||||
|
||||
While *CurrentBucket <> #Null
|
||||
If *CurrentBucket\Hash = Hash
|
||||
ProcedureReturn *CurrentBucket\BucketData
|
||||
EndIf
|
||||
|
||||
*CHM\EntryCount = *CHM\EntryCount + 1
|
||||
*CurrentBucket = *CurrentBucket\Next
|
||||
Wend
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #Null
|
||||
EndProcedure
|
||||
|
||||
Procedure.b OverwriteByHash(*CHM.HashMap, *Data, Hash.q, *FreeingCallback.CbFree = #Null)
|
||||
If *CHM <> #Null
|
||||
Protected *PreviousBucket.Bucket = #Null
|
||||
Protected *CurrentBucket.Bucket = *CHM\Buckets[(Hash & MakeBitMask(*CHM\SizePower))]
|
||||
|
||||
; We iterate over the bucket chain until we find a collision or an in-between.
|
||||
While *CurrentBucket <> #Null
|
||||
If *CurrentBucket\Hash >= Hash
|
||||
Break
|
||||
EndIf
|
||||
*PreviousBucket = *CurrentBucket
|
||||
*CurrentBucket = *CurrentBucket\Next
|
||||
Wend
|
||||
|
||||
If *CurrentBucket = #Null Or *CurrentBucket\Hash <> Hash
|
||||
; We either reached the end of the list, or no buckets was in the current slot.
|
||||
; Or, we have an in-between, or we are at the start of the list.
|
||||
Protected *NewBucket.Bucket = AllocateMemory(SizeOf(Bucket))
|
||||
|
||||
If *NewBucket <> #Null
|
||||
*NewBucket\Next = *CurrentBucket
|
||||
*NewBucket\BucketData = *Data
|
||||
*NewBucket\Hash = Hash
|
||||
|
||||
If *PreviousBucket <> #Null
|
||||
; In-between, or we are at the start of the List.
|
||||
*PreviousBucket\Next = *NewBucket
|
||||
Else
|
||||
; Start of the list.
|
||||
*CHM\Buckets[(Hash & MakeBitMask(*CHM\SizePower))] = *NewBucket
|
||||
EndIf
|
||||
|
||||
*CHM\EntryCount = *CHM\EntryCount + 1
|
||||
ProcedureReturn #True
|
||||
EndIf
|
||||
ElseIf *FreeingCallback <> #Null
|
||||
; Handling collision.
|
||||
CallFunctionFast(*FreeingCallback, *CurrentBucket\BucketData)
|
||||
*CurrentBucket\BucketData = *Data
|
||||
ProcedureReturn #True
|
||||
EndIf
|
||||
ElseIf *FreeingCallback <> #Null
|
||||
; Handling collision.
|
||||
CallFunctionFast(*FreeingCallback, *CurrentBucket\BucketData)
|
||||
*CurrentBucket\BucketData = *Data
|
||||
ProcedureReturn #True
|
||||
; Implied else: Handling collision while forbidden to overwrite => doing nothing.
|
||||
EndIf
|
||||
; Implied else: Handling collision while forbidden to overwrite => doing nothing.
|
||||
EndIf
|
||||
|
||||
ProcedureReturn #False
|
||||
EndProcedure
|
||||
|
||||
Procedure CHM_DeleteByHash(*CHM.ChainedHashMap, Hash.q)
|
||||
|
||||
EndProcedure
|
||||
ProcedureReturn #False
|
||||
EndProcedure
|
||||
|
||||
Procedure CHM_Free(*CHM.ChainedHashMap)
|
||||
|
||||
EndProcedure
|
||||
Procedure DeleteByHash(*CHM.HashMap, Hash.q)
|
||||
|
||||
Procedure NoopFree(*Data) : EndProcedure
|
||||
EndProcedure
|
||||
|
||||
Procedure Free(*CHM.HashMap)
|
||||
|
||||
EndProcedure
|
||||
|
||||
Procedure NoopFree(*Data) : EndProcedure
|
||||
EndModule
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
|
||||
;- Compiler Directives
|
||||
EnableExplicit
|
||||
|
||||
|
||||
XIncludeFile "../Commons/HashMap/HashMap.pbi"
|
||||
|
||||
|
||||
|
||||
|
||||
If Not OpenConsole("YASS13")
|
||||
DebuggerError("Failed to open console !")
|
||||
End 1
|
||||
EndIf
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Debug "Done :)"
|
||||
@@ -0,0 +1,136 @@
|
||||
// Documentation:
|
||||
// * https://docs.microsoft.com/en-us/windows/win32/api/verrsrc/ns-verrsrc-vs_fixedfileinfo
|
||||
// * https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
|
||||
|
||||
// File Flags
|
||||
#if !defined(VS_FF_DEBUG)
|
||||
#define VS_FF_DEBUG 0x00000001L
|
||||
#endif
|
||||
#if !defined(VS_FF_PRERELEASE)
|
||||
#define VS_FF_PRERELEASE 0x00000002L
|
||||
#endif
|
||||
#if !defined(VS_FF_PATCHED)
|
||||
#define VS_FF_PATCHED 0x00000004L
|
||||
#endif
|
||||
#if !defined(VS_FF_PRIVATEBUILD)
|
||||
#define VS_FF_PRIVATEBUILD 0x00000008L
|
||||
#endif
|
||||
#if !defined(VS_FF_INFOINFERRED)
|
||||
#define VS_FF_INFOINFERRED 0x00000010L
|
||||
#endif
|
||||
#if !defined(VS_FF_SPECIALBUILD)
|
||||
#define VS_FF_SPECIALBUILD 0x00000020L
|
||||
#endif
|
||||
|
||||
// File OS
|
||||
#if !defined(VOS_UNKNOWN)
|
||||
#define VOS_UNKNOWN 0x00000000L
|
||||
#endif
|
||||
#if !defined(VOS_DOS)
|
||||
#define VOS_DOS 0x00010000L
|
||||
#endif
|
||||
#if !defined(VOS_OS216)
|
||||
#define VOS_OS216 0x00020000L
|
||||
#endif
|
||||
#if !defined(VOS_OS232)
|
||||
#define VOS_OS232 0x00030000L
|
||||
#endif
|
||||
#if !defined(VOS_NT)
|
||||
#define VOS_NT 0x00040000L
|
||||
#endif
|
||||
#if !defined(VOS_WINCE)
|
||||
#define VOS_WINCE 0x00050000L
|
||||
#endif
|
||||
|
||||
#if !defined(VOS__BASE)
|
||||
#define VOS__BASE 0x00000000L
|
||||
#endif
|
||||
#if !defined(VOS__WINDOWS16)
|
||||
#define VOS__WINDOWS16 0x00000001L
|
||||
#endif
|
||||
#if !defined(VOS__PM16)
|
||||
#define VOS__PM16 0x00000002L
|
||||
#endif
|
||||
#if !defined(VOS__PM32)
|
||||
#define VOS__PM32 0x00000003L
|
||||
#endif
|
||||
#if !defined(VOS__WINDOWS32)
|
||||
#define VOS__WINDOWS32 0x00000004L
|
||||
#endif
|
||||
|
||||
#if !defined(VOS_DOS_WINDOWS16)
|
||||
#define VOS_DOS_WINDOWS16 0x00010001L
|
||||
#endif
|
||||
#if !defined(VOS_DOS_WINDOWS32)
|
||||
#define VOS_DOS_WINDOWS32 0x00010004L
|
||||
#endif
|
||||
#if !defined(VOS_OS216_PM16)
|
||||
#define VOS_OS216_PM16 0x00020002L
|
||||
#endif
|
||||
#if !defined(VOS_OS232_PM32)
|
||||
#define VOS_OS232_PM32 0x00030003L
|
||||
#endif
|
||||
#if !defined(VOS_NT_WINDOWS32)
|
||||
#define VOS_NT_WINDOWS32 0x00040004L
|
||||
#endif
|
||||
|
||||
// File type
|
||||
#if !defined(VFT_UNKNOWN)
|
||||
#define VFT_UNKNOWN 0x00000000L
|
||||
#endif
|
||||
#if !defined(VFT_APP)
|
||||
#define VFT_APP 0x00000001L
|
||||
#endif
|
||||
#if !defined(VFT_DLL)
|
||||
#define VFT_DLL 0x00000002L
|
||||
#endif
|
||||
#if !defined(VFT_DRV)
|
||||
#define VFT_DRV 0x00000003L
|
||||
#endif
|
||||
#if !defined(VFT_FONT)
|
||||
#define VFT_FONT 0x00000004L
|
||||
#endif
|
||||
#if !defined(VFT_VXD)
|
||||
#define VFT_VXD 0x00000005L
|
||||
#endif
|
||||
#if !defined(VFT_STATIC_LIB)
|
||||
#define VFT_STATIC_LIB 0x00000007L
|
||||
#endif
|
||||
|
||||
// Relative to the .pb/.pbp file
|
||||
//IDI_ICON1 ICON ".\\Resources\\Icons\\lscom-v2-text-01.ico"
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION 3,0,0,0
|
||||
PRODUCTVERSION 3,0,0,0
|
||||
//FILEFLAGSMASK 0x3fL
|
||||
//FILEFLAGS 0x0L
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
//FILESUBTYPE 0x0L
|
||||
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "000004b0"
|
||||
BEGIN
|
||||
//VALUE "Comments", "\0"
|
||||
VALUE "CompanyName", "NibblePoker\0"
|
||||
VALUE "FileDescription", "PEArch CLI Utility\0"
|
||||
VALUE "FileVersion", "3.0.0.0\0"
|
||||
VALUE "InternalName", "PEArch\0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2026\0"
|
||||
//VALUE "LegalTrademarks", "\0"
|
||||
VALUE "OriginalFilename", "PEArch.exe\0"
|
||||
//VALUE "PrivateBuild", "\0"
|
||||
VALUE "ProductName", "PEArch\0"
|
||||
VALUE "ProductVersion", "3.0.0.0\0"
|
||||
//VALUE "SpecialBuild", "\0"
|
||||
// Website https://github.com/aziascreations/PB-PEArch
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x0000, 0x4b0
|
||||
END
|
||||
END
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
|
||||
Structure YassObject
|
||||
|
||||
id.s
|
||||
|
||||
EndStructure
|
||||
|
||||
|
||||
Reference in New Issue
Block a user