2012-02-16 13:42:35 +00:00
// 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 ;
}
2012-03-07 11:28:24 +00:00
/// Uncompresses a_Data into a_Decompressed; returns Z_XXX error constants same as zlib's uncompress()
2012-02-16 13:42:35 +00:00
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 );
2012-04-04 14:36:52 +00:00
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 );
2012-02-16 13:42:35 +00:00
if ( errorcode != Z_OK )
{
return errorcode ;
}
2012-04-04 14:36:52 +00:00
a_Uncompressed . resize ( UncompressedSize );
2012-02-16 13:42:35 +00:00
return Z_OK ;
}