zstreambuf::~zstreambuf() { switch( m_state ) { case STATE_DEFLATING: DeflateEnd(); break; case STATE_INFLATING: InflateEnd(); break; default: break; } }
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); }