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