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