00001 #ifndef __J2K__LZH__LZBuffer_CPP__ 00002 #define __J2K__LZH__LZBuffer_CPP__ 00003 00004 inline LZBuffer::LZBuffer() 00005 { 00006 buf = new BYTE[ LZBUFSIZE ]; 00007 bufPos = 0; 00008 } 00009 00010 inline LZBuffer::~LZBuffer() 00011 { 00012 delete [] buf; 00013 } 00014 00015 inline int LZBuffer::_wrap( LZPOS pos ) 00016 { 00017 return ( pos & LZBUFMASK ); 00018 } 00019 00020 inline int LZBuffer::_distance( int diff ) 00021 { 00022 return ( diff & LZBUFMASK ); 00023 } 00024 00025 inline void LZBuffer::_toBuf( BYTE c ) 00026 { 00027 buf[ _wrap( bufPos++ ) ] = c; 00028 } 00029 00030 inline void LZBuffer::_toBuf( const BYTE* src, size_t sz ) 00031 { 00032 assert( sz < LZBUFSIZE ); 00033 int begin = _wrap( bufPos ); 00034 int end = begin + sz; 00035 00036 if ( end > LZBUFSIZE ) 00037 { 00038 size_t left = LZBUFSIZE - begin; 00039 memcpy( buf + begin, src, left ); 00040 memcpy( buf, src + left, sz - left ); 00041 } 00042 else 00043 { 00044 memcpy( buf + begin, src, sz ); 00045 } 00046 00047 bufPos += sz; 00048 } 00049 00050 inline void LZBuffer::_bufCpy( BYTE* dst, int pos, size_t sz ) 00051 { 00052 assert( sz < LZBUFSIZE ); 00053 int begin = _wrap( pos ); 00054 int end = begin + sz; 00055 00056 if ( end > LZBUFSIZE ) 00057 { 00058 size_t left = LZBUFSIZE - begin; 00059 memcpy( dst, buf + begin, left ); 00060 memcpy( dst + left, buf, sz - left ); 00061 } 00062 else 00063 { 00064 memcpy( dst, buf + begin, sz ); 00065 } 00066 } 00067 00068 inline int LZBuffer::_nMatch( int pos, const BYTE* p, int nLimit ) 00069 { 00070 assert( nLimit < LZBUFSIZE ); 00071 int begin = pos; 00072 if ( LZBUFSIZE - begin >= nLimit ) 00073 { 00074 for ( int i = 0; i < nLimit ; i++ ) 00075 if ( buf[ begin + i ] != p[ i ] ) 00076 return i; 00077 00078 return nLimit; 00079 00080 } 00081 else 00082 { 00083 for ( int i = begin; i < LZBUFSIZE ; i++ ) 00084 if ( buf[ i ] != p[ i - begin ] ) 00085 return i - begin; 00086 00087 int shift = LZBUFSIZE - begin; 00088 int n = nLimit - shift; 00089 00090 for( i = 0; i < n ; i++ ) 00091 if( buf[ i ] != p[ shift + i ] ) 00092 return shift + i; 00093 00094 return nLimit; 00095 } 00096 } 00097 00098 #endif