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