diff options
author | Howaner <franzi.moos@googlemail.com> | 2014-09-12 19:13:46 +0200 |
---|---|---|
committer | Howaner <franzi.moos@googlemail.com> | 2014-09-12 19:13:46 +0200 |
commit | 1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f (patch) | |
tree | f7cf72e49a7ca60d10af12ad9ff70910e089b028 /src/StringCompression.cpp | |
parent | Renamed SetWalkSpeed() to SetRelativeWalkSpeed() (diff) | |
parent | Fixed iron ore drop. (diff) | |
download | cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.tar cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.tar.gz cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.tar.bz2 cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.tar.lz cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.tar.xz cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.tar.zst cuberite-1223a24d3c87832c08545e6f3e8e4c51ff1e7e3f.zip |
Diffstat (limited to 'src/StringCompression.cpp')
-rw-r--r-- | src/StringCompression.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/StringCompression.cpp b/src/StringCompression.cpp index 71d64e71e..af9f1687f 100644 --- a/src/StringCompression.cpp +++ b/src/StringCompression.cpp @@ -180,3 +180,65 @@ extern int UncompressStringGZIP(const char * a_Data, size_t a_Length, AString & + +extern int InflateString(const char * a_Data, size_t a_Length, AString & a_Uncompressed) +{ + a_Uncompressed.reserve(a_Length); + + char Buffer[64 KiB]; + z_stream strm; + memset(&strm, 0, sizeof(strm)); + strm.next_in = (Bytef *)a_Data; + strm.avail_in = (uInt)a_Length; + strm.next_out = (Bytef *)Buffer; + strm.avail_out = sizeof(Buffer); + + int res = inflateInit(&strm); // Force GZIP decoding + if (res != Z_OK) + { + LOG("%s: inflation initialization failed: %d (\"%s\").", __FUNCTION__, res, strm.msg); + return res; + } + + for (;;) + { + res = inflate(&strm, Z_NO_FLUSH); + switch (res) + { + case Z_OK: + { + // Some data has been uncompressed. Consume the buffer and continue uncompressing + a_Uncompressed.append(Buffer, sizeof(Buffer) - strm.avail_out); + strm.next_out = (Bytef *)Buffer; + strm.avail_out = sizeof(Buffer); + if (strm.avail_in == 0) + { + // All data has been uncompressed + inflateEnd(&strm); + return Z_OK; + } + break; + } + + case Z_STREAM_END: + { + // Finished uncompressing. Consume the rest of the buffer and return + a_Uncompressed.append(Buffer, sizeof(Buffer) - strm.avail_out); + inflateEnd(&strm); + return Z_OK; + } + + default: + { + // An error has occurred, log it and return the error value + LOG("%s: inflation failed: %d (\"%s\").", __FUNCTION__, res, strm.msg); + inflateEnd(&strm); + return res; + } + } // switch (res) + } // while (true) +} + + + + |