 92c59963f8
			
		
	
	
		92c59963f8
		
	
	
	
	
		
			
			git-svn-id: http://mc-server.googlecode.com/svn/trunk@606 0a769ca7-a7f5-676a-18bf-c427514a06d6
		
			
				
	
	
		
			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;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |