Exemplo n.º 1
0
zstreambuf::~zstreambuf()
{
    switch( m_state ) {
    case STATE_DEFLATING:
        DeflateEnd();
        break;
    case STATE_INFLATING:
        InflateEnd();
        break;
    default:
        break;
    }
}
Exemplo n.º 2
0
Arquivo: zlib.c Projeto: DQNEO/minigit
void Deflate(FILE *input_file, FILE *output_file) {
  z_stream stream;
  DeflateInit(&stream);
  int flush = Z_NO_FLUSH;
  int ret = Z_OK;
  do {
    stream.avail_in = fread(input_buf, 1, sizeof(input_buf), input_file);
    if (ferror(input_file) != 0) {
      ERROR("failed to read from file");
    } else if (feof(input_file) != 0) {
      // 入力が尽きれば deflate() の第 2 引数を Z_FINISH に切り替えます.
      flush = Z_FINISH;
    }
    stream.next_in = input_buf;
    do {
      // 出力バッファを再設定して圧縮の続きをおこないます.
      stream.next_out = output_buf;
      stream.avail_out = sizeof(output_buf);
      ret = deflate(&stream, flush);
      if (ret == Z_STREAM_ERROR) {
        ERROR("%s", stream.msg);
      }
      fwrite(output_buf, sizeof(output_buf) - stream.avail_out,
          1, output_file);
      if (ferror(output_file) != 0) {
        ERROR("failed to write into file");
      }
    } while ((stream.avail_out == 0) && (ret != Z_STREAM_END));
    if (stream.avail_in != 0) {
      ERROR("unexpected bytes in input buffer");
    }
  } while (flush != Z_FINISH);
  if (ret != Z_STREAM_END) {
    ERROR("failed to finish deflate");
  }
  if (fflush(output_file) != 0) {
    ERROR("failed to flush output file");
  }
  DeflateEnd(&stream);
}