diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..054095e --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# IDEs +.vs/ +.idea/ + +# Build Artifacts +*.exe +*.dll +*.lib +*.exp +*.a +*.so + +# Trash +*.pb.cfg +*.pbi.cfg +*.pbf.cfg +*.7z +*.zip diff --git a/YASS13.pbp b/YASS13.pbp new file mode 100644 index 0000000..edac9dd --- /dev/null +++ b/YASS13.pbp @@ -0,0 +1,40 @@ + + + +
+ +
+
+ + + +
+
+ + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+
diff --git a/core/commons/HashMap/HashMap.pbi b/core/commons/HashMap/HashMap.pbi index 04a5ee9..09795d7 100644 --- a/core/commons/HashMap/HashMap.pbi +++ b/core/commons/HashMap/HashMap.pbi @@ -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 diff --git a/core/commons/HashMap/_ChainedHashMap.pbi b/core/commons/HashMap/_ChainedHashMap.pbi index abb95c3..d1156b9 100644 --- a/core/commons/HashMap/_ChainedHashMap.pbi +++ b/core/commons/HashMap/_ChainedHashMap.pbi @@ -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 diff --git a/core/server/Server.pb b/core/server/Server.pb new file mode 100644 index 0000000..02006fc --- /dev/null +++ b/core/server/Server.pb @@ -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 :)" diff --git a/core/server/VersionInfo.rc b/core/server/VersionInfo.rc new file mode 100644 index 0000000..b5f83bb --- /dev/null +++ b/core/server/VersionInfo.rc @@ -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 diff --git a/core/server/test/Object.pbi b/core/server/test/Object.pbi new file mode 100644 index 0000000..3ae66ba --- /dev/null +++ b/core/server/test/Object.pbi @@ -0,0 +1,9 @@ + + +Structure YassObject + + id.s + +EndStructure + +