zlib compress/uncompress banks

BlitzMax Forums/BlitzMax Programming/zlib compress/uncompress banks

Here's some old'n'crusty code...
Rem
	Compress() example
End Rem

Strict

Local SFile:String = RequestFile("Source File")
Local DFile:String = RequestFile("Destination PAK", "pak", True)

CompressFile(SFile, DFile)

SFile = RequestFile("Source PAK", "pak")
DFile = RequestFile("Destination File", "", True)

DeCompressFile(SFile, DFile)

End


Function CompressFile(SourceFileName:String, DestFileName:String)
	Local SourceBank:TBank, DestBank:TBank
	Local SourceFileStream:TStream, DestFileStream:TStream
	Local SourceFileSize:Int, DestBankSize:Int
	
	If ExtractExt(DestFileName).ToLower() <> "pak" Then DestFileName :+ ".pak"
	
	SourceFileSize = FileSize(SourceFileName)
	SourceBank = CreateBank(SourceFileSize)
	
	SourceFileStream = OpenStream(SourceFileName, True, False)
	If SourceFileStream = Null Then  RuntimeError "Couldn't open source file ~q" + SourceFileName + "~q" 
	
	ReadBank(SourceBank, SourceFileStream, 0, SourceFileSize)
	
	CloseStream SourceFileStream
	
	DestBankSize = Ceil(SourceFileSize * 1.001) + 12
	DestBank = CreateBank(DestBankSize)

	compress(DestBank.Buf(), DestBankSize, SourceBank.Buf(), SourceFileSize)

	'DestBank.Resize(DestBankSize)
	
	DestFileStream = WriteStream(DestFileName)
	If DestFileStream = Null Then  RuntimeError "Couldn't create destination file ~q" + DestFileName + "~q"
	
	WriteInt DestFileStream, SourceFileSize
	WriteBank(DestBank, DestFileStream, 0, DestBankSize)
	
	CloseStream DestFileStream
End Function

Function DeCompressFile(SourceFileName:String, DestFileName:String)
	Local SourceBank:TBank, DestBank:TBank
	Local SourceFileStream:TStream, DestFileStream:TStream
	Local SourceFileSize:Int, DestBankSize:Int
	
	If ExtractExt(SourceFileName).ToLower() <> "pak" Then RuntimeError "Source file is not a PAK file"
	
	SourceFileSize = FileSize(SourceFileName) - 4
	SourceBank = CreateBank(SourceFileSize)
	
	SourceFileStream = OpenStream(SourceFileName, True, False)
	If SourceFileStream = Null Then  RuntimeError "Couldn't open source file ~q" + SourceFileName + "~q" 
	
	DestBankSize = ReadInt(SourceFileStream)
	ReadBank(SourceBank, SourceFileStream, 0, SourceFileSize)
	
	CloseStream SourceFileStream

	DestBank = CreateBank(DestBankSize)

	uncompress(DestBank.Buf(), DestBankSize, SourceBank.Buf(), SourceFileSize)
	
	DestFileStream = WriteStream(DestFileName)
	If DestFileStream = Null Then  RuntimeError "Couldn't create destination file ~q" + DestFileName + "~q"
	
	WriteBank(DestBank, DestFileStream, 0, DestBankSize)
	
	CloseStream DestFileStream
End Function

...and it seems to still work too. Always a bonus!