clean
git-svn-id: https://svn.code.sf.net/p/kolmck/code@115 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
This commit is contained in:
parent
9b9f4acc81
commit
96b1bebc36
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user