diff options
author | Andreas Bille <abi@openoffice.org> | 2001-05-08 11:05:06 +0000 |
---|---|---|
committer | Andreas Bille <abi@openoffice.org> | 2001-05-08 11:05:06 +0000 |
commit | 90660540b0b7c7dd5f317469d0eadb320c3e6e02 (patch) | |
tree | 6060e18085e57476879dab4cc52bbb20d99bdf0c | |
parent | b62e52a1289f4c4f14f517958fdc09151c4ac20c (diff) |
Initial revision
Utilities for XmlSearch engine
-rw-r--r-- | xmlhelp/source/cxxhelp/util/Decompressor.cxx | 253 | ||||
-rw-r--r-- | xmlhelp/source/cxxhelp/util/IndexAccessor.cxx | 178 | ||||
-rw-r--r-- | xmlhelp/source/cxxhelp/util/makefile.mk | 89 |
3 files changed, 520 insertions, 0 deletions
diff --git a/xmlhelp/source/cxxhelp/util/Decompressor.cxx b/xmlhelp/source/cxxhelp/util/Decompressor.cxx new file mode 100644 index 000000000000..d422450baa90 --- /dev/null +++ b/xmlhelp/source/cxxhelp/util/Decompressor.cxx @@ -0,0 +1,253 @@ +/************************************************************************* + * + * $RCSfile: Decompressor.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: abi $ $Date: 2001-05-08 12:05:06 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _XMLSEARCH_UTIL_DECOMPRESSOR_HXX_ +#include <util/Decompressor.hxx> +#endif + +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; +} + + +#ifndef _XMLSEARCH_UTIL_COMPRESSORITERATOR_HXX_ +#include <util/CompressorIterator.hxx> +#endif + + +bool Decompressor::readNext( sal_Int32 k,CompressorIterator* it) throw( excep::XmlSearchException ) +{ + 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; +} + + + + +// extern sal_Int32 getInteger_( const sal_Int8* ); + + +#ifndef _XMLSEARCH_DB_BLOCK_HXX_ +#include <db/Block.hxx> +#endif + + +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 ); + else + return -1; +} diff --git a/xmlhelp/source/cxxhelp/util/IndexAccessor.cxx b/xmlhelp/source/cxxhelp/util/IndexAccessor.cxx new file mode 100644 index 000000000000..66c9ac376edd --- /dev/null +++ b/xmlhelp/source/cxxhelp/util/IndexAccessor.cxx @@ -0,0 +1,178 @@ +/************************************************************************* + * + * $RCSfile: IndexAccessor.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: abi $ $Date: 2001-05-08 12:05:06 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifdef ABIDEBUG +#include <abidebug.hxx> +#endif +#ifndef _XMLSEARCH_UTIL_INDEXACCESSOR_HXX_ +#include <util/IndexAccessor.hxx> +#endif +#ifndef _OSL_FILE_HXX_ +#include <osl/file.hxx> +#endif +#ifndef _XMLEARCH_UTIL_RANDOMACCESSSTREAM_HXX_ +#include <util/RandomAccessStream.hxx> +#endif + +using namespace xmlsearch::util; + + +class RandomAccessStreamImpl + : public RandomAccessStream +{ +public: + + RandomAccessStreamImpl( const rtl::OUString& aPath,const rtl::OUString& how ) + : file_( aPath ) + { + sal_uInt32 flags = 0; + const sal_Unicode* bla = how.getStr(); + + for( int i = 0; i < how.getLength(); ++i ) + if( bla[i] == sal_Unicode( 'r' ) ) + flags |= Read; + else if( bla[i] == sal_Unicode( 'w' ) ) + flags |= Write; + else if( bla[i] == sal_Unicode( 'c' ) ) + flags |= Create; + + + if( file_.open( flags ) != osl::FileBase::E_None ) + { + file_.close(); + } + } + + ~RandomAccessStreamImpl() + { + close(); + } + + virtual void seek( sal_Int32 pos ) + { + file_.setPos( Pos_Absolut,sal_uInt64( pos ) ); + } + + virtual sal_Int32 readBytes( sal_Int8* data,sal_Int32 num ) + { + sal_uInt64 nbytesread; + file_.read( (void*)(data), sal_uInt64(num),nbytesread ); + return sal_Int32( nbytesread ); + } + + virtual void writeBytes( sal_Int8*, sal_Int32 ) + { + // Do nothing by now + } + + virtual sal_Int32 length() + { + osl::DirectoryItem aItem; + osl::FileStatus aStatus( FileStatusMask_FileSize ); + osl::DirectoryItem::get( file_,aItem ); + aItem.getFileStatus( aStatus ); + return sal_Int32( aStatus.getFileSize() ); + } + + virtual void close() + { + file_.close(); + } + + +private: + + osl::File file_; +}; + + + +RandomAccessStreamImpl Dic( rtl::OUString::createFromAscii( "//./home/ab106281/work/index/DICTIONARY" ), + rtl::OUString::createFromAscii( "how" ) ); + + +RandomAccessStream* theFile() +{ + return &Dic; +} + + + +RandomAccessStream* IndexAccessor::getStream( const rtl::OUString& fileName,const rtl::OUString& how ) +{ + return new RandomAccessStreamImpl( dirName_ + fileName, how ); +} + + +sal_Int32 IndexAccessor::readByteArray( sal_Int8*& out,const rtl::OUString& fileName ) +{ + RandomAccessStream* in = getStream( fileName,rtl::OUString::createFromAscii("r") ); + sal_Int32 n; + delete[] out; + out = new sal_Int8[ n = in->length() ]; + in->readBytes( out,n ); + delete in; + return n; +} + + + + + diff --git a/xmlhelp/source/cxxhelp/util/makefile.mk b/xmlhelp/source/cxxhelp/util/makefile.mk new file mode 100644 index 000000000000..c9d27cb86699 --- /dev/null +++ b/xmlhelp/source/cxxhelp/util/makefile.mk @@ -0,0 +1,89 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1 $ +# +# last change: $Author: abi $ $Date: 2001-05-08 12:05:06 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +PRJ=..$/..$/.. + +PRJNAME= xmlhelp +TARGET= jautil +AUTOSEG= TRUE + +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +.IF "$(header)" == "" + +SLOFILES=\ + $(SLO)$/Decompressor.obj \ + $(SLO)$/IndexAccessor.obj +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + |