git-svn-id: https://svn.code.sf.net/p/kolmck/code@115 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
This commit is contained in:
dkolmck 2014-12-03 08:32:41 +00:00
parent 9b9f4acc81
commit 96b1bebc36

View File

@ -29,7 +29,7 @@
* (C) GMax 2004. email: gmax@loving.ru *
*****************************************************************************}
unit KolZLibBzip;
unit KOLZLibBzip;
interface
@ -143,9 +143,9 @@ type
function gZipCompressStream(inStream, outStream: PStream; var gzHdr: TgzipHeader; level: TZCompressionLevel = zcDefault; strategy: TZCompressionStrategy = zcsDefault): Integer; overload;
function gZipCompressStream(inStream, outStream: PStream; level: TZCompressionLevel = zcDefault; strategy: TZCompressionStrategy = zcsDefault): Integer; overload;
function gZipDecompressStreamHeader(inStream: PStream; var gzHdr: TgzipHeader): Integer;
function gZipDecompressStreamBody(inStream, outStream: PStream): Integer;
function gZipDecompressStreamBody(inStream, outStream: PStream; const aCheckCRC: Boolean = True): Integer;
function gZipDecompressStream(inStream, outStream: PStream; var gzHdr: TgzipHeader): Integer;
function gZipDecompressString(const S: String): String;
function gZipDecompressString(const S: String; const useheaders: Boolean = True; const aCheckCRC: Boolean = True): String;
{*******************************************************}
{ }
@ -1191,7 +1191,9 @@ var
begin
iBuffer := nil;
oBuffer := nil;
{$IFDEF USE_EXCEPTIONS}
Result := Z_MEM_ERROR;
{$ENDIF}
try
GetMem(iBuffer, gzBufferSize);
GetMem(oBuffer, gzBufferSize);
@ -1486,7 +1488,7 @@ begin
end;
end;
function gZipDecompressStreamBody(inStream, outStream: PStream): Integer;
function gZipDecompressStreamBody(inStream, outStream: PStream; const aCheckCRC: Boolean = True): Integer;
var
iBuffer,
oBuffer : PChar; //Array [0..gzBufferSize-1] of Char;
@ -1529,7 +1531,9 @@ var
begin
iBuffer := nil;
oBuffer := nil;
{$IFDEF USE_EXCEPTIONS}
Result := Z_MEM_ERROR;
{$ENDIF}
try
GetMem(iBuffer, gzBufferSize);
GetMem(oBuffer, gzBufferSize);
@ -1551,7 +1555,7 @@ begin
// gzread()
// DoProgressEvent;
startCRC := PChar(oBuffer);
zStream.next_out := PChar(oBuffer);
zStream.next_out := PChar(oBuffer);
zStream.avail_out := gzBufferSize;
// rSize := 0;
Result := Z_OK;
@ -1565,85 +1569,99 @@ begin
Result := inflate(zStream, Z_NO_FLUSH);
if (Result = Z_STREAM_END) then begin
{ Check CRC and original size }
fCrc := crc32(fCrc, PChar(StartCRC), (zStream.next_out - startCRC));
fCrc := crc32(fCrc, PChar(StartCRC), (zStream.next_out - startCRC));
startCRC := zStream.next_out;
fileCRC := gz_getLong;
fileCRC := gz_getLong;
fileSize := gz_getLong;
if (fCrc <> fileCRC) then
{$IFDEF USE_EXCEPTIONS}
if aCheckCRC and (fCrc <> fileCRC) then
{$IFDEF USE_EXCEPTIONS}
ZDecompressCheck(Z_CRC_ERROR)
{$ELSE}
{$ELSE}
Result := Z_CRC_ERROR
{$ENDIF}
else
if (Cardinal(zStream.total_out) <> fileSize) then
{$IFDEF USE_EXCEPTIONS}
ZDecompressCheck(Z_SIZE_ERROR)
{$ELSE}
Result := Z_SIZE_ERROR
{$ENDIF}
else begin
if zStream.avail_in > 0 then inStream.Seek(-zStream.avail_in, spCurrent);
fEOF := True;
end;
{$ENDIF}
else if aCheckCRC and (Cardinal(zStream.total_out) <> fileSize) then
{$IFDEF USE_EXCEPTIONS}
ZDecompressCheck(Z_SIZE_ERROR)
{$ELSE}
Result := Z_SIZE_ERROR
{$ENDIF}
else begin
if (zStream.avail_in > 0) then
inStream.Seek(-zStream.avail_in, spCurrent);
fEOF := True;
end;
end;
if (Result <> Z_OK) or (fEOF) then break;
if (Result <> Z_OK) or (fEOF) then
break;
end; // while zStream.avail_out<>0
// end of gzread()
{$IFDEF USE_EXCEPTIONS}
ZDecompressCheck(Result);
{$ELSE}
if Result < 0 then Exit;
{$ENDIF}
{$IFDEF USE_EXCEPTIONS}
DecompressCheck(Result);
{$ELSE}
if (Result < 0) then
Exit;
{$ENDIF}
fCrc := crc32(fCrc, PChar(oBuffer), (zStream.next_out - startCRC));
rSize := gzBufferSize - zStream.avail_out;
{$IFDEF USE_EXCEPTIONS}
if rSize < 0 then ZDecompressCheck(rSize);
{$ELSE}
if rSize <= 0 then break;
{$ENDIF}
{$IFDEF USE_EXCEPTIONS}
if (rSize < 0) then
ZDecompressCheck(rSize);
{$ELSE}
if (rSize <= 0) then
break;
{$ENDIF}
wSize := outStream.Write(oBuffer^, rSize);
{$IFDEF USE_EXCEPTIONS}
if (rSize <> wSize) then ZDecompressCheck(Z_WRITE_ERROR);
{$ELSE}
{$IFDEF USE_EXCEPTIONS}
if (rSize <> wSize) then
ZDecompressCheck(Z_WRITE_ERROR);
{$ELSE}
if (rSize <> wSize) then begin
Result := Z_WRITE_ERROR;
Exit;
end;
{$ENDIF}
{$ENDIF}
end;
if Result = Z_STREAM_END then Result := Z_OK;
if (Result = Z_STREAM_END) then
Result := Z_OK;
finally
inflateEnd(zStream);
if Assigned(iBuffer) then FreeMem(iBuffer);
if Assigned(oBuffer) then FreeMem(oBuffer);
if Assigned(iBuffer) then
FreeMem(iBuffer);
if Assigned(oBuffer) then
FreeMem(oBuffer);
end;
end;
function gZipDecompressStream(inStream, outStream: PStream; var gzHdr: TgzipHeader): Integer;
begin
Result := gZipDecompressStreamHeader(inStream, gzHdr);
if (Result >= 0) then
if (Result >= Z_OK) then
Result := gZipDecompressStreamBody(inStream, outStream);
end;
function gZipDecompressString(const S: String): String;
function gZipDecompressString(const S: String; const useheaders: Boolean = True; const aCheckCRC: Boolean = True): String;
var
Rslt: Integer;
gzHdr: TgzipHeader;
inStream: PStream;
outStream: PStream;
begin
Result := '';
Result := '';
inStream := NewExMemoryStream(@S[1], Length(S));
Rslt := gZipDecompressStreamHeader(inStream, gzHdr);
if (Rslt >= 0) then begin
// unpack head
if useheaders then
Rslt := gZipDecompressStreamHeader(inStream, gzHdr)
else
Rslt := Z_OK;
// unpack body
if (Rslt >= Z_OK) then begin
outStream := NewMemoryStream;
Rslt := gZipDecompressStreamBody(inStream, outStream);
if (Rslt >= 0) then begin
Rslt := gZipDecompressStreamBody(inStream, outStream, aCheckCRC);
if not useheaders or (Rslt >= Z_OK) then begin
outStream.Position := 0;
Result := outStream.ReadStrLen(outStream.Size);
end;
@ -1744,7 +1762,9 @@ begin
strm.bzalloc := bzip2AllocMem;
strm.bzfree := bzip2FreeMem;
BufInc := (InBytes + 255) and not 255;
{$IFDEF USE_EXCEPTIONS}
Result := BZ_OK;
{$ENDIF}
if OutEstimate = 0 then
OutBytes := BufInc
else