sources/huffman/huffman.cpp

changeset 76
6de6d9a64ebd
parent 75
5f8a03274d75
child 77
32ef969adeed
--- a/sources/huffman/huffman.cpp	Fri May 15 20:10:44 2015 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-/*
- * Replacement for older Skulltag Launcher Protocol's huffman.cpp
- * 
- * Copyright 2009 Timothy Landers
- * email: code.vortexcortex@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// required for atexit()
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "huffman.h"
-#include "huffcodec.h"
-// #include "i_system.h"
-
-using namespace skulltag;
-// Global Variables
-
-/** Reference to the HuffmanCodec Object that will perform the encoding and decoding. */
-static HuffmanCodec * __codec = NULL;
-
-// Function Implementation
-
-/** Creates and intitializes a HuffmanCodec Object. <br>
- * Also arranges for HUFFMAN_Destruct() to be called upon termination. */
-void HUFFMAN_Construct(){
-	
-	// The exact structure description of a Huffman tree
-	static unsigned char const compatible_huffman_tree[] = {
-		  0,  0,  0,  1,128,  0,  0,  0,  3, 38, 34,  2,  1, 80,  3,110,
-		144, 67,  0,  2,  1, 74,  3,243,142, 37,  2,  3,124, 58,182,  0,
-		  0,  1, 36,  0,  3,221,131,  3,245,163,  1, 35,  3,113, 85,  0,
-		  1, 41,  1, 77,  3,199,130,  0,  1,206,  3,185,153,  3, 70,118,
-		  0,  3,  3,  5,  0,  0,  1, 24,  0,  2,  3,198,190, 63,  2,  3,
-		139,186, 75,  0,  1, 44,  2,  3,240,218, 56,  3, 40, 39,  0,  0,
-		  2,  2,  3,244,247, 81, 65,  0,  3,  9,125,  3, 68, 60,  0,  0,
-		  1, 25,  3,191,138,  3, 86, 17,  0,  1, 23,  3,220,178,  2,  3,
-		165,194, 14,  1,  0,  2,  2,  0,  0,  2,  1,208,  3,150,157,181,
-		  1,222,  2,  3,216,230,211,  0,  2,  2,  3,252,141, 10, 42,  0,
-		  2,  3,134,135,104,  1,103,  3,187,225, 95, 32,  0,  0,  0,  0,
-		  0,  0,  1, 57,  1, 61,  3,183,237,  0,  0,  3,233,234,  3,246,
-		203,  2,  3,250,147, 79,  1,129,  0,  1,  7,  3,143,136,  1, 20,
-		  3,179,148,  0,  0,  0,  3, 28,106,  3,101, 87,  1, 66,  0,  3,
-		180,219,  3,227,241,  0,  1, 26,  1,251,  3,229,214,  3, 54, 69,
-		  0,  0,  0,  0,  0,  3,231,212,  3,156,176,  3, 93, 83,  0,  3,
-		 96,253,  3, 30, 13,  0,  0,  2,  3,175,254, 94,  3,159, 27,  2,
-		  1,  8,  3,204,226, 78,  0,  0,  0,  3,107, 88,  1, 31,  3,137,
-		169,  2,  2,  3,215,145,  6,  4,  1,127,  0,  1, 99,  3,209,217,
-		  0,  3,213,238,  3,177,170,  1,132,  0,  0,  0,  2,  3, 22, 12,
-		114,  2,  2,  3,158,197, 97, 45,  0,  1, 46,  1,112,  3,174,249,
-		  0,  3,224,102,  2,  3,171,151,193,  0,  0,  0,  3, 15, 16,  3,
-		  2,168,  1, 49,  3, 91,146,  0,  1, 48,  3,173, 29,  0,  3, 19,
-		126,  3, 92,242,  0,  0,  0,  0,  0,  0,  3,205,192,  2,  3,235,
-		149,255,  2,  3,223,184,248,  0,  0,  3,108,236,  3,111, 90,  2,
-		  3,117,115, 71,  0,  0,  3, 11, 50,  0,  3,188,119,  1,122,  3,
-		167,162,  1,160,  1,133,  3,123, 21,  0,  0,  2,  1, 59,  2,  3,
-		155,154, 98, 43,  0,  3, 76, 51,  2,  3,201,116, 72,  2,  0,  2,
-		  3,109,100,121,  2,  3,195,232, 18,  1,  0,  2,  0,  1,164,  2,
-		  3,120,189, 73,  0,  1,196,  3,239,210,  3, 64, 62, 89,  0,  0,
-		  1, 33,  2,  3,228,161, 55,  2,  3, 84,152, 47,  0,  0,  2,  3,
-		207,172,140,  3, 82,166,  0,  3, 53,105,  1, 52,  3,202,200
-	};
-
-	// create a HuffmanCodec that is compatible with the previous implementation.
-	__codec = new HuffmanCodec( compatible_huffman_tree, sizeof compatible_huffman_tree );
-	
-	// set up the HuffmanCodec to perform in a backwards compatible fashion.
-	__codec->reversedBytes( true );
-	__codec->allowExpansion( false );
-	
-	// request that the destruct function be called upon exit.
-	// atterm( HUFFMAN_Destruct );
-	atexit( HUFFMAN_Destruct );
-}
-
-/** Releases resources allocated by the HuffmanCodec. */
-void HUFFMAN_Destruct(){
-	delete __codec;
-	__codec = NULL;
-}
-
-/** Applies Huffman encoding to a block of data. */
-void HUFFMAN_Encode(
-	/** in: Pointer to start of data that is to be encoded. */
-	unsigned char const * const inputBuffer,
-	/** out: Pointer to destination buffer where encoded data will be stored. */
-	unsigned char * const outputBuffer,
-	/** in: Number of chars to read from inputBuffer. */
-	int const &inputBufferSize,
-	/**< in+out: Max chars to write into outputBuffer. <br>
-	 * 		Upon return holds the number of chars stored or 0 if an error occurs. */
-	int * outputBufferSize
-){
-	int bytesWritten = __codec->encode( inputBuffer, outputBuffer, inputBufferSize, *outputBufferSize );
-	
-	// expansion occured -- provide backwards compatibility
-	if ( bytesWritten < 0 ){
-		// check buffer sizes
-		if ( *outputBufferSize < (inputBufferSize + 1) ){
-			// outputBuffer too small, return "no bytes written"
-			*outputBufferSize = 0;
-			return;
-		}
-		
-		// perform the unencoded copy
-		for ( int i = 0; i < inputBufferSize; i++ ) outputBuffer[i+1] = inputBuffer[i];
-		// supply the "unencoded" signal and bytesWritten
-		outputBuffer[0] = 0xff;
-		*outputBufferSize = inputBufferSize + 1;
-	} else {
-		// assign the bytesWritten return value
-		*outputBufferSize = bytesWritten;
-	}
-} // end function HUFFMAN_Encode
-
-/** Decodes a block of data that is Huffman encoded. */
-void HUFFMAN_Decode(
-	unsigned char const * const inputBuffer,	/**< in: Pointer to start of data that is to be decoded. */
-	unsigned char * const outputBuffer,			/**< out: Pointer to destination buffer where decoded data will be stored. */
-	int const &inputBufferSize,					/**< in: Number of chars to read from inputBuffer. */
-	int *outputBufferSize						/**< in+out: Max chars to write into outputBuffer. Upon return holds the number of chars stored or 0 if an error occurs. */
-){
-	// check for "unencoded" signal & provide backwards compatibility
-	if ((inputBufferSize > 0) && ((inputBuffer[0]&0xff) == 0xff)){
-		// check buffer sizes
-		if ( *outputBufferSize < (inputBufferSize - 1) ){
-			// outputBuffer too small, return "no bytes written"
-			*outputBufferSize = 0;
-			return;			
-		}
-		
-		// perform the unencoded copy
-		for ( int i = 1; i < inputBufferSize; i++ ) outputBuffer[i-1] = inputBuffer[i];
-		
-		// supply the bytesWritten
-		*outputBufferSize = inputBufferSize - 1;
-	} else {
-		// decode the data
-		*outputBufferSize = __codec->decode( inputBuffer, outputBuffer, inputBufferSize, *outputBufferSize );
-	}
-} // end function HUFFMAN_Decode

mercurial