#pragma once #include #include #include inline bool gzipInflate(const std::string& compressedBytes, std::string& uncompressedBytes) { if (compressedBytes.empty()) { uncompressedBytes = compressedBytes; return true; } uncompressedBytes.clear(); unsigned half_length = compressedBytes.size() / 2; z_stream strm{}; // The following line is nolint because we're declaring away constness. // It's not clear why the input buffers on zlib aren't const, so this is a // bit of a cheat for the moment strm.next_in = (Bytef*)compressedBytes.data(); // NOLINT strm.avail_in = compressedBytes.size(); strm.total_out = 0; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; bool done = false; if (inflateInit2(&strm, (16 + MAX_WBITS)) != Z_OK) { return false; } while (!done) { // If our output buffer is too small if (strm.total_out >= uncompressedBytes.size()) { uncompressedBytes.resize(uncompressedBytes.size() + half_length); } strm.next_out = (Bytef*)(uncompressedBytes.data() + strm.total_out); // NOLINT strm.avail_out = ((uLong)uncompressedBytes.size() - strm.total_out); // NOLINT // Inflate another chunk. int err = inflate(&strm, Z_SYNC_FLUSH); if (err == Z_STREAM_END) { done = true; } else if (err != Z_OK) { break; } } return inflateEnd(&strm) == Z_OK; }