Ok this is a new version with some new command and a CRC32FingerPrint memory test.
Best regards.
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : ZLIB Pack Command
; File Name : ZLIB Pack Command.pb
; File version: 1.1.1
; Programmation : OK
; Programmed by : Guimauve
; Date : 07-07-2011
; Last Update : 26-10-2011
; PureBasic code : 4.60
; Plateform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Additionnal authors :
;
; Thomas (ts-soft) Schulz
; jamirokwai
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Définition des constantes <<<<<
#ZLIB_OK = 0
#ZLIB_STREAM_END = 1
#ZLIB_NEED_DICT = 2
#ZLIB_ERRNO = -1
#ZLIB_STREAM_ERROR = -2
#ZLIB_DATA_ERROR = -3
#ZLIB_MEM_ERROR = -4
#ZLIB_BUF_ERROR = -5
#ZLIB_VERSION_ERROR = -6
#ZLIB_CRC32_ERROR = -15
#ZLIB_NO_COMPRESSION = 0
#ZLIB_BEST_SPEED = 1
#ZLIB_BEST_COMPRESSION = 9
#ZLIB_DEFAULT_COMPRESSION = -1
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Importation des commandes depuis la librairie <<<<<
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
#ZLIB_IMPORT_PATH = #PB_Compiler_Home + "purelibraries/linux/libraries/zlib.a"
CompilerCase #PB_OS_Windows
#ZLIB_IMPORT_PATH = "zlib.lib"
CompilerCase #PB_OS_MacOS
#ZLIB_IMPORT_PATH = "/usr/lib/libz.dylib"
CompilerEndSelect
ImportC #ZLIB_IMPORT_PATH
compress2(*Destination.i, *DestinationLength.i, *Source.i, SourceLength.l, Level.l)
uncompress(*Destination.i, *DestinationLength.i, *Source.i, SourceLength.l)
EndImport
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Compression Zone Mémoire <<<<<
Procedure ZLIB_Private_Compress(*Source.i, SourceLength.l, Level.l)
Shared ZLIB_LAST_ERROR.b
If level < #ZLIB_NO_COMPRESSION Or level > #ZLIB_BEST_COMPRESSION
level = #ZLIB_DEFAULT_COMPRESSION
EndIf
If *Source <> #Null
If SourceLength = #PB_Default
SourceLength = MemorySize(*Source)
EndIf
DestinationLength = SourceLength + 13 + (Int(SourceLength / 100))
*Destination = AllocateMemory(DestinationLength)
If *Destination <> #Null
ZLIB_LAST_ERROR = compress2(*Destination, @DestinationLength, *Source, SourceLength, Level)
If Not ZLIB_LAST_ERROR
*Destination = ReAllocateMemory(*Destination, DestinationLength)
EndIf
EndIf
EndIf
ProcedureReturn *Destination
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Décompression Zone Mémoire <<<<<
Procedure.l ZLIB_Private_Decompress(*Source.i, *Destination.i)
Shared ZLIB_LAST_ERROR.b
Protected SourceLength = MemorySize(*Source)
Protected DestinationLength = MemorySize(*Destination)
ZLIB_LAST_ERROR = uncompress(*Destination, @DestinationLength, *Source, SourceLength)
If Not ZLIB_LAST_ERROR
Result.l = DestinationLength
Else
Result = 0
EndIf
ProcedureReturn Result
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Obtenir la dernière Erreur <<<<<
Procedure.b ZLIB_Private_LastError()
Shared ZLIB_LAST_ERROR.b
ReturnValue.b = ZLIB_LAST_ERROR
ZLIB_LAST_ERROR = #ZLIB_OK
ProcedureReturn ReturnValue
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Création d'un fichier <<<<<
Procedure ZLIB_CreatePack(P_FileName.s)
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
If IsFile(ZLIB_PackFileID) ; Si la librarie à ouvert un fichier sans le refermer, on le referme
CloseFile(ZLIB_PackFileID)
EndIf
ZLIB_PackFileID = CreateFile(#PB_Any, P_FileName)
ProcedureReturn ZLIB_PackFileID
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ourverture d'un fichier pour ajout <<<<<
Procedure ZLIB_AppendPack(P_FileName.s)
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
If IsFile(ZLIB_PackFileID) ; Si la librarie à ouvert un fichier sans le refermer, on le referme
CloseFile(ZLIB_PackFileID)
EndIf
ZLIB_PackFileID = OpenFile(#PB_Any, P_FileName)
FileSeek(ZLIB_PackFileID, Lof(ZLIB_PackFileID))
ZLIB_Last_Error = #ZLIB_OK
ProcedureReturn ZLIB_PackFileID
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ouverture d'un fichier <<<<<
Procedure ZLIB_OpenPack(P_FileName.s)
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
If IsFile(ZLIB_PackFileID)
CloseFile(ZLIB_PackFileID)
EndIf
ZLIB_PackFileID = ReadFile(#PB_Any, P_FileName)
ZLIB_Last_Error = #ZLIB_OK
ProcedureReturn ZLIB_PackFileID
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Fermeture d'un fichier <<<<<
Procedure ZLIB_ClosePack()
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
If ZLIB_MemoryDecompress <> #Null
FreeMemory(ZLIB_MemoryDecompress)
EndIf
If IsFile(ZLIB_PackFileID)
CloseFile(ZLIB_PackFileID)
ZLIB_PackFileID = 0
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un bloc mémoire à l'archive <<<<<
Procedure ZLIB_AddPackMemory(*Source.i, SourceLength.l, level.l = 6)
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
If *Source <> #Null
ZLIB_MemoryCompressed = ZLIB_Private_Compress(*Source, SourceLength, level)
ZLIB_Last_Error = ZLIB_Private_LastError()
MemoryCompressedLength = MemorySize(ZLIB_MemoryCompressed)
WriteLong(ZLIB_PackFileID, MemoryCompressedLength)
WriteLong(ZLIB_PackFileID, CRC32Fingerprint(*Source, SourceLength))
WriteData(ZLIB_PackFileID, ZLIB_MemoryCompressed, MemoryCompressedLength)
If ZLIB_MemoryCompressed <> #Null
FreeMemory(ZLIB_MemoryCompressed)
EndIf
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un fichier à l'archive <<<<<
Procedure ZLIB_AddPackFile(FileName.s, Level.l = 6)
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
File_To_Pack_ID = ReadFile(#PB_Any, FileName)
If IsFile(File_To_Pack_ID)
File_To_Pack_Length = Lof(File_To_Pack_ID)
File_To_Pack_Memory = AllocateMemory(File_To_Pack_Length)
ReadData(File_To_Pack_ID, File_To_Pack_Memory, File_To_Pack_Length)
CloseFile(File_To_Pack_ID)
ZLIB_MemoryCompressed = ZLIB_Private_Compress(File_To_Pack_Memory, File_To_Pack_Length, level)
ZLIB_Last_Error = ZLIB_Private_LastError()
WriteLong(ZLIB_PackFileID, MemorySize(ZLIB_MemoryCompressed))
WriteLong(ZLIB_PackFileID, CRC32Fingerprint(File_To_Pack_Memory, File_To_Pack_Length))
WriteData(ZLIB_PackFileID, ZLIB_MemoryCompressed, MemorySize(ZLIB_MemoryCompressed))
If ZLIB_MemoryCompressed <> #Null
FreeMemory(ZLIB_MemoryCompressed)
EndIf
If File_To_Pack_Memory <> #Null
FreeMemory(File_To_Pack_Memory)
EndIf
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Byte à l'archive <<<<<
Procedure ZLIB_AddPackByte(Value.b, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Byte), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Ascii à l'archive <<<<<
Procedure ZLIB_AddPackAscii(Value.a, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Ascii), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Character à l'archive <<<<<
Procedure ZLIB_AddPackCharacter(Value.c, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Character), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Unicode à l'archive <<<<<
Procedure ZLIB_AddPackUnicode(Value.u, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Unicode), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Word à l'archive <<<<<
Procedure ZLIB_AddPackWord(Value.w, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Word), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Long à l'archive <<<<<
Procedure ZLIB_AddPackLong(Value.l, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Long), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Integer à l'archive <<<<<
Procedure ZLIB_AddPackInteger(Value.i, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Integer), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Quad à l'archive <<<<<
Procedure ZLIB_AddPackQuad(Value.q, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Quad), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Float à l'archive <<<<<
Procedure ZLIB_AddPackFloat(Value.f, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Float), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un Double à l'archive <<<<<
Procedure ZLIB_AddPackDouble(Value.d, level.l = 6)
ZLIB_AddPackMemory(@Value, SizeOf(Double), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajouter un String à l'archive <<<<<
Procedure ZLIB_AddPackString(String.s, level.l = 6)
Max = Len(String)
*Source.i = AllocateMemory(Max * SizeOf(Word))
*SourcePtr.i = *Source
For Index = 1 To Max
PokeW(*SourcePtr, Asc(Mid(String, Index, 1)))
*SourcePtr + SizeOf(Word)
Next
ZLIB_AddPackMemory(*Source, MemorySize(*Source), level)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un fichier <<<<<
Procedure.i ZLIB_NextPackFile()
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
If ZLIB_MemoryDecompress <> #Null
FreeMemory(ZLIB_MemoryDecompress)
EndIf
ZLIB_MemorySize.l = ReadLong(ZLIB_PackFileID)
CRC32.l = ReadLong(ZLIB_PackFileID)
ZLIB_MemoryCompressed = AllocateMemory(ZLIB_MemorySize)
ZLIB_MemoryDecompress = AllocateMemory(ZLIB_MemorySize)
ReadData(ZLIB_PackFileID, ZLIB_MemoryCompressed, ZLIB_MemorySize)
ZLIB_PackFileSize = ZLIB_Private_Decompress(ZLIB_MemoryCompressed, ZLIB_MemoryDecompress)
ZLIB_Last_Error = ZLIB_Private_LastError()
If ZLIB_Last_Error = #ZLIB_OK
If CRC32 <> CRC32Fingerprint(ZLIB_MemoryDecompress, ZLIB_PackFileSize)
ZLIB_Last_Error = #ZLIB_CRC32_ERROR
EndIf
EndIf
If ZLIB_MemoryCompressed <> #Null
FreeMemory(ZLIB_MemoryCompressed)
EndIf
ProcedureReturn ZLIB_MemoryDecompress
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Retourner la taille du dernier fichier décompressé <<<<<
Procedure.l ZLIB_PackFileSize()
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
ProcedureReturn ZLIB_PackFileSize
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Retourner la taille du dernier fichier décompressé <<<<<
Procedure.l ZLIB_PackLastError()
Shared ZLIB_PackFileID, ZLIB_PackFileSize, ZLIB_MemoryDecompress, ZLIB_Last_Error
ProcedureReturn ZLIB_Last_Error
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Byte <<<<<
Procedure.b ZLIB_UnPackByte()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekB(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Ascii <<<<<
Procedure.a ZLIB_UnPackAscii()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekA(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Character <<<<<
Procedure.c ZLIB_UnPackCharacter()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekC(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Unicode <<<<<
Procedure.u ZLIB_UnPackUnicode()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekU(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Word <<<<<
Procedure.w ZLIB_UnPackWord()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekW(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Integer <<<<<
Procedure.i ZLIB_UnPackInteger()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekI(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Long <<<<<
Procedure.l ZLIB_UnPackLong()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekL(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Quad <<<<<
Procedure.q ZLIB_UnPackQuad()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekQ(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Float <<<<<
Procedure.f ZLIB_UnPackFloat()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekF(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un Double <<<<<
Procedure.d ZLIB_UnPackDouble()
Var.i = ZLIB_NextPackFile()
ProcedureReturn PeekD(Var)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Extraire et décompresser un String <<<<<
Procedure.s ZLIB_UnPackString()
*Source.i = ZLIB_NextPackFile()
Max.l = ZLIB_PackFileSize() / SizeOf(Word)
For Index = 1 To Max
String.s = String + Chr(PeekW(*Source))
*Source + SizeOf(Word)
Next
ProcedureReturn String
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<<
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<<
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Now we create an image file then save it on disc to simulate
; creating a pack file with file loaded from a folder somehere.
If CreateImage(0, 256,256)
If StartDrawing(ImageOutput(0))
Box(0, 0, 256,256, $FFFFFF)
DrawingMode(#PB_2DDrawing_Gradient)
BackColor($00FFFF)
FrontColor($FF0000)
LinearGradient(0, 0, 256, 256)
Circle(100, 100, 100)
LinearGradient(350, 100, 250, 100)
Circle(300, 100, 100)
StopDrawing()
EndIf
SaveImage(0, "Texture.bmp")
EndIf
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Now we create the *.zpk file
If ZLIB_CreatePack("Test.zpk")
ZLIB_AddPackByte(125, 9)
ZLIB_AddPackAscii(250, 9)
ZLIB_AddPackCharacter(251, 9)
ZLIB_AddPackUnicode(65000, 9)
ZLIB_AddPackWord(-15000, 9)
ZLIB_ClosePack()
EndIf
If ZLIB_AppendPack("Test.zpk")
ZLIB_AddPackInteger(2147483647, 9)
ZLIB_AddPackLong(2147483640, 9)
ZLIB_AddPackQuad(9223372036854775807, 9)
ZLIB_AddPackFloat(2*#PI, 9)
ZLIB_AddPackDouble(4*#PI, 9)
ZLIB_AddPackString("PureBasic 4.60 Beta 3", 9)
ZLIB_AddPackString("Texture2.bmp", 9) ; The file name is different, it's just for the exemple
ZLIB_AddPackFile("Texture.bmp", 9)
ZLIB_ClosePack()
EndIf
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; And now we open the *.zpk file
If ZLIB_OpenPack("Test.zpk")
Debug ZLIB_UnPackByte()
Debug ZLIB_UnPackAscii()
Debug ZLIB_UnPackCharacter()
Debug ZLIB_UnPackUnicode()
Debug ZLIB_UnPackWord()
Debug ZLIB_UnPackInteger()
Debug ZLIB_UnPackLong()
Debug ZLIB_UnPackQuad()
Debug ZLIB_UnPackFloat()
Debug ZLIB_UnPackDouble()
Debug ZLIB_UnPackString()
FileName.s = ZLIB_UnPackString()
File.i = ZLIB_NextPackFile()
If CreateFile(0, FileName)
WriteData(0, File, MemorySize(File))
CloseFile(0)
EndIf
ZLIB_ClosePack()
EndIf
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<