diff options
author | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2012-02-16 14:42:35 +0100 |
---|---|---|
committer | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2012-02-16 14:42:35 +0100 |
commit | 423f49d175d8db6283232bd8bdc106e26bdcff4d (patch) | |
tree | 5c5cc58d1061c91d2cb39021853ce72ab59839ae /source/StringCompression.cpp | |
parent | Chunks are properly saved before being unloaded now (diff) | |
download | cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.tar cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.tar.gz cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.tar.bz2 cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.tar.lz cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.tar.xz cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.tar.zst cuberite-423f49d175d8db6283232bd8bdc106e26bdcff4d.zip |
Diffstat (limited to '')
-rw-r--r-- | source/StringCompression.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/StringCompression.cpp b/source/StringCompression.cpp new file mode 100644 index 000000000..d21248fac --- /dev/null +++ b/source/StringCompression.cpp @@ -0,0 +1,54 @@ +
+// StringCompression.cpp
+
+// Implements the wrapping functions for compression and decompression using AString as their data
+
+#include "Globals.h"
+#include "StringCompression.h"
+#include "zlib.h"
+
+
+
+
+
+/// Compresses a_Data into a_Compressed; return Z_XXX error constants same as zlib's compress2()
+int CompressString(const char * a_Data, int a_Length, AString & a_Compressed)
+{
+ uLongf CompressedSize = compressBound(a_Length);
+
+ // HACK: We're assuming that AString returns its internal buffer in its data() call and we're overwriting that buffer!
+ // It saves us one allocation and one memcpy of the entire compressed data
+ // It may not work on some STL implementations! (Confirmed working on MSVC 2008 & 2010)
+ a_Compressed.resize(CompressedSize);
+ int errorcode = compress2( (Bytef*)a_Compressed.data(), &CompressedSize, (const Bytef*)a_Data, a_Length, Z_DEFAULT_COMPRESSION);
+ if (errorcode != Z_OK)
+ {
+ return errorcode;
+ }
+ a_Compressed.resize(CompressedSize);
+ return Z_OK;
+}
+
+
+
+
+
+/// Uncompresses a_Data into a_Decompressed; returns Z_XXX error constants same as zlib's decompress()
+int UncompressString(const char * a_Data, int a_Length, AString & a_Uncompressed, int a_UncompressedSize)
+{
+ // HACK: We're assuming that AString returns its internal buffer in its data() call and we're overwriting that buffer!
+ // It saves us one allocation and one memcpy of the entire compressed data
+ // It may not work on some STL implementations! (Confirmed working on MSVC 2008 & 2010)
+ a_Uncompressed.resize(a_UncompressedSize);
+ int errorcode = uncompress((Bytef*)a_Uncompressed.data(), (uLongf *)&a_UncompressedSize, (const Bytef*)a_Data, a_Length);
+ if (errorcode != Z_OK)
+ {
+ return errorcode;
+ }
+ a_Uncompressed.resize(a_UncompressedSize);
+ return Z_OK;
+}
+
+
+
+
|