void zip::decompress(buffer& compressed, buffer& uncompressed) { fstream out(COMPRESSED, ios::out|ios::trunc); if ( !out ) throw(streamException(out.rdstate())); if ( out.write(compressed.get_base(), compressed.content_sz()) == 0 ) throw(streamException(out.rdstate())); out.close(); system(form("gzip -cd %s > %s", COMPRESSED, UNCOMPRESSED)); fstream in(UNCOMPRESSED, ios::in); if ( !in ) throw(streamException(in.rdstate())); int x = bytes(in); uncompressed.expand_chunk(x); if ( in.read(uncompressed.get_base(), x) == 0 || x != in.gcount() ) throw(streamException(in.rdstate())); uncompressed.set_content_sz(x); in.close(); return; }
void zip::compress(const buffer& uncompressed, buffer& compressed) { //////////////////////////////////////// // code for testing. I know it is slow. //////////////////////////////////////// fstream out(UNCOMPRESSED, ios::out|ios::trunc); if ( !out ) throw(streamException(out.rdstate())); if ( out.write(uncompressed.get_base(), uncompressed.content_sz()) == 0 ) throw(streamException(out.rdstate())); out.close(); system(form("gzip -c %s > %s", UNCOMPRESSED, COMPRESSED)); fstream in(COMPRESSED, ios::in); if ( !in ) throw(streamException(in.rdstate())); int x = bytes(in); compressed.expand_chunk(x); if ( in.read(compressed.get_base(), x) == 0 || x != in.gcount() ) throw(streamException(in.rdstate())); compressed.set_content_sz(x); in.close(); return; }