diff options
Diffstat (limited to 'xmlhelp/source/cxxhelp/util/Decompressor.cxx')
-rw-r--r-- | xmlhelp/source/cxxhelp/util/Decompressor.cxx | 168 |
1 files changed, 7 insertions, 161 deletions
diff --git a/xmlhelp/source/cxxhelp/util/Decompressor.cxx b/xmlhelp/source/cxxhelp/util/Decompressor.cxx index 14bfdd8c6ab2..8a6352c6db08 100644 --- a/xmlhelp/source/cxxhelp/util/Decompressor.cxx +++ b/xmlhelp/source/cxxhelp/util/Decompressor.cxx @@ -30,183 +30,29 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_xmlhelp.hxx" -#include <db/Block.hxx> #include <util/Decompressor.hxx> #include <util/CompressorIterator.hxx> - - using namespace xmlsearch; using namespace xmlsearch::util; - - const sal_Int32 Decompressor::BitsInByte = 8; const sal_Int32 Decompressor::NBits = 32; - -sal_Int32 Decompressor::read( sal_Int32 kBits ) throw( excep::XmlSearchException ) -{ - sal_Int32 shift = BitsInByte - toRead_; - if( kBits <= toRead_ ) - return ( ( readByte_ << shift ) & 0xFF) >>/*>*/ (shift + ( toRead_ -= kBits)); - else - { - sal_Int32 result = toRead_ > 0 ? ( ( readByte_ << shift ) & 0xFF ) >>/*>*/ shift : 0; - for( kBits -= toRead_; kBits >= BitsInByte; kBits -= BitsInByte ) - result = ( result << BitsInByte ) | getNextByte(); - if( kBits > 0 ) - return ( result << kBits ) | ( ( readByte_ = getNextByte() ) >>/*>*/ ( toRead_ = BitsInByte - kBits ) ); - else - { - toRead_ = 0; - return result; - } - } -} - - -sal_Int32 Decompressor::ascendingDecode( sal_Int32 k,sal_Int32 start,sal_Int32* array ) - throw( xmlsearch::excep::XmlSearchException ) -{ - sal_Int32 path = 0, index = 0; - LOOP: - while( true ) - if( read() ) - array[index++] = (start += path | read(k)); - else - for( sal_Int32 cnt = 0;; readByte_ = getNextByte(), toRead_ = BitsInByte ) - while( toRead_-- > 0 ) - if( readByte_ & ( 1 << toRead_ ) ) - { - ++cnt; - sal_Int32 Path = ( (path >>/*>*/ ( k + cnt ) << cnt ) | read( cnt ) ) << k; - if (Path != path) - { - array[index++] = ( start += ( path = Path ) | read( k ) ); - goto LOOP; - } - else - return index; - } - else - ++cnt; -} - - - -void Decompressor::ascDecode( sal_Int32 k,std::vector< sal_Int32 >& array) throw( excep::XmlSearchException ) -{ - for( sal_Int32 path = 0,start = 0; ; ) - if( read() != 0 ) - array.push_back( start += path | read( k ) ); - else - { - sal_Int32 count = countZeroes() + 1; - sal_Int32 saved = path; - path = ( ( path >>/*>*/ ( k + count ) << count) | read( count ) ) << k; - if( path != saved ) // convention for end - array.push_back( start += path | read( k ) ); - else - break; - } -} - - -void Decompressor::decode( sal_Int32 k,std::vector< sal_Int32 >& array) throw( excep::XmlSearchException ) -{ - for( sal_Int32 path = 0; ; ) - if( read() ) - array.push_back( path | read( k ) ); - else - { - sal_Int32 count = countZeroes() + 1; - sal_Int32 saved = path; - path = ( ( path >>/*>*/ ( k + count ) << count ) | read( count ) ) << k; - if( path != saved ) // convention for end - array.push_back( path | read( k ) ); - else - break; - } -} - - - -void Decompressor::decode(sal_Int32 k, sal_Int32* array ) throw( excep::XmlSearchException ) -{ - for( sal_Int32 path = 0,index = 0; ; ) - if( read() ) - array[ index++] = ( path | read( k ) ); - else - { - sal_Int32 count = countZeroes() + 1; - sal_Int32 saved = path; - path = ( ( path >>/*>*/ ( k + count ) << count ) | read( count ) ) << k; - if( path != saved ) // convention for end - array[ index++ ] = ( path | read( k ) ); - else - break; - } -} - - - -sal_Int32 Decompressor::read() throw( excep::XmlSearchException ) -{ - if( toRead_-- > 0 ) - return readByte_ & ( 1 << toRead_ ); - else - { // get next word - toRead_ = BitsInByte - 1; - return ( readByte_ = getNextByte() ) & 0x80; - } -} - - -sal_Int32 Decompressor::countZeroes() throw( excep::XmlSearchException ) -{ - for( sal_Int32 count = 0; ;readByte_ = getNextByte(),toRead_ = BitsInByte ) - while( toRead_-- > 0 ) - if( readByte_ & ( 1 << toRead_ ) ) - return count; - else - ++count; -} - - -bool Decompressor::readNext( sal_Int32 k,CompressorIterator* it) throw( excep::XmlSearchException ) +inline sal_Int32 getInteger_( const sal_Int8* v ) { - if( read() != 0 ) - { - it->value( path_ | read(k) ); - return true; - } - else - for( sal_Int32 count = 1; ; readByte_ = getNextByte(), toRead_ = BitsInByte ) - while( toRead_-- > 0 ) - if( readByte_ & ( 1 << toRead_ ) ) - { - sal_Int32 saved = path_; - path_ = ( (path_ >>/*>*/ ( k + count ) << count ) | read( count ) ) << k; - if( path_ != saved ) - { - it->value( path_ | read( k ) ); - return true; - } - else - return false; - } - else - ++count; + return (((((( v[0]&0xFF ) << 8 ) + | v[1]&0xFF ) << 8 ) + | v[2]&0xFF ) << 8 ) + | v[3]&0xFF; } - - +
sal_Int32 StreamDecompressor::getNextByte() { sal_Int8 a[4]; a[0] = a[1] = a[2] = 0; if( in_->readBytes( &a[3],1 ) != -1 ) - return ::getInteger_( a ); + return getInteger_( a ); else return -1; } |