⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlib.pas

📁 gcc的组建
💻 PAS
📖 第 1 页 / 共 2 页
字号:
begin  Result := code;  if code < 0 then    raise EDecompressionError.Create('error');  //!!end;procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;                      out OutBuf: Pointer; out OutBytes: Integer);var  strm: TZStreamRec;  P: Pointer;begin  FillChar(strm, sizeof(strm), 0);  strm.zalloc := zlibAllocMem;  strm.zfree := zlibFreeMem;  OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;  GetMem(OutBuf, OutBytes);  try    strm.next_in := InBuf;    strm.avail_in := InBytes;    strm.next_out := OutBuf;    strm.avail_out := OutBytes;    CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));    try      while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do      begin        P := OutBuf;        Inc(OutBytes, 256);        ReallocMem(OutBuf, OutBytes);        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));        strm.avail_out := 256;      end;    finally      CCheck(deflateEnd(strm));    end;    ReallocMem(OutBuf, strm.total_out);    OutBytes := strm.total_out;  except    FreeMem(OutBuf);    raise  end;end;procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;  OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);var  strm: TZStreamRec;  P: Pointer;  BufInc: Integer;begin  FillChar(strm, sizeof(strm), 0);  strm.zalloc := zlibAllocMem;  strm.zfree := zlibFreeMem;  BufInc := (InBytes + 255) and not 255;  if OutEstimate = 0 then    OutBytes := BufInc  else    OutBytes := OutEstimate;  GetMem(OutBuf, OutBytes);  try    strm.next_in := InBuf;    strm.avail_in := InBytes;    strm.next_out := OutBuf;    strm.avail_out := OutBytes;    DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));    try      while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do      begin        P := OutBuf;        Inc(OutBytes, BufInc);        ReallocMem(OutBuf, OutBytes);        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));        strm.avail_out := BufInc;      end;    finally      DCheck(inflateEnd(strm));    end;    ReallocMem(OutBuf, strm.total_out);    OutBytes := strm.total_out;  except    FreeMem(OutBuf);    raise  end;end;procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;  const OutBuf: Pointer; BufSize: Integer);var  strm: TZStreamRec;begin  FillChar(strm, sizeof(strm), 0);  strm.zalloc := zlibAllocMem;  strm.zfree := zlibFreeMem;  strm.next_in := InBuf;  strm.avail_in := InBytes;  strm.next_out := OutBuf;  strm.avail_out := BufSize;  DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));  try    if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then      raise EZlibError.CreateRes(@sTargetBufferTooSmall);  finally    DCheck(inflateEnd(strm));  end;end;// TCustomZlibStreamconstructor TCustomZLibStream.Create(Strm: TStream);begin  inherited Create;  FStrm := Strm;  FStrmPos := Strm.Position;  FZRec.zalloc := zlibAllocMem;  FZRec.zfree := zlibFreeMem;end;procedure TCustomZLibStream.Progress(Sender: TObject);begin  if Assigned(FOnProgress) then FOnProgress(Sender);end;// TCompressionStreamconstructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;  Dest: TStream);const  Levels: array [TCompressionLevel] of ShortInt =    (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);begin  inherited Create(Dest);  FZRec.next_out := FBuffer;  FZRec.avail_out := sizeof(FBuffer);  CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));end;destructor TCompressionStream.Destroy;begin  FZRec.next_in := nil;  FZRec.avail_in := 0;  try    if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;    while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)      and (FZRec.avail_out = 0) do    begin      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));      FZRec.next_out := FBuffer;      FZRec.avail_out := sizeof(FBuffer);    end;    if FZRec.avail_out < sizeof(FBuffer) then      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);  finally    deflateEnd(FZRec);  end;  inherited Destroy;end;function TCompressionStream.Read(var Buffer; Count: Longint): Longint;begin  raise ECompressionError.CreateRes(@sInvalidStreamOp);end;function TCompressionStream.Write(const Buffer; Count: Longint): Longint;begin  FZRec.next_in := @Buffer;  FZRec.avail_in := Count;  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;  while (FZRec.avail_in > 0) do  begin    CCheck(deflate(FZRec, 0));    if FZRec.avail_out = 0 then    begin      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));      FZRec.next_out := FBuffer;      FZRec.avail_out := sizeof(FBuffer);      FStrmPos := FStrm.Position;      Progress(Self);    end;  end;  Result := Count;end;function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;begin  if (Offset = 0) and (Origin = soFromCurrent) then    Result := FZRec.total_in  else    raise ECompressionError.CreateRes(@sInvalidStreamOp);end;function TCompressionStream.GetCompressionRate: Single;begin  if FZRec.total_in = 0 then    Result := 0  else    Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;end;// TDecompressionStreamconstructor TDecompressionStream.Create(Source: TStream);begin  inherited Create(Source);  FZRec.next_in := FBuffer;  FZRec.avail_in := 0;  DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));end;destructor TDecompressionStream.Destroy;begin  FStrm.Seek(-FZRec.avail_in, 1);  inflateEnd(FZRec);  inherited Destroy;end;function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;begin  FZRec.next_out := @Buffer;  FZRec.avail_out := Count;  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;  while (FZRec.avail_out > 0) do  begin    if FZRec.avail_in = 0 then    begin      FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));      if FZRec.avail_in = 0 then      begin        Result := Count - FZRec.avail_out;        Exit;      end;      FZRec.next_in := FBuffer;      FStrmPos := FStrm.Position;      Progress(Self);    end;    CCheck(inflate(FZRec, 0));  end;  Result := Count;end;function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;begin  raise EDecompressionError.CreateRes(@sInvalidStreamOp);end;function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;var  I: Integer;  Buf: array [0..4095] of Char;begin  if (Offset = 0) and (Origin = soFromBeginning) then  begin    DCheck(inflateReset(FZRec));    FZRec.next_in := FBuffer;    FZRec.avail_in := 0;    FStrm.Position := 0;    FStrmPos := 0;  end  else if ( (Offset >= 0) and (Origin = soFromCurrent)) or          ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then  begin    if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);    if Offset > 0 then    begin      for I := 1 to Offset div sizeof(Buf) do        ReadBuffer(Buf, sizeof(Buf));      ReadBuffer(Buf, Offset mod sizeof(Buf));    end;  end  else    raise EDecompressionError.CreateRes(@sInvalidStreamOp);  Result := FZRec.total_out;end;end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -