56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
|
|
// 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 uncompress()
|
|
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);
|
|
uLongf UncompressedSize = (uLongf)a_UncompressedSize; // On some architectures the uLongf is different in size to int, that may be the cause of the -5 error
|
|
int errorcode = uncompress((Bytef*)a_Uncompressed.data(), &UncompressedSize, (const Bytef*)a_Data, a_Length);
|
|
if (errorcode != Z_OK)
|
|
{
|
|
return errorcode;
|
|
}
|
|
a_Uncompressed.resize(UncompressedSize);
|
|
return Z_OK;
|
|
}
|
|
|
|
|
|
|
|
|