pax_global_header00006660000000000000000000000064115402517630014516gustar00rootroot0000000000000052 comment=a834f87bad3543b2a0331cef7202c15ded4245be clucene-core-2.3.3.4/000077500000000000000000000000001154025176300142315ustar00rootroot00000000000000clucene-core-2.3.3.4/.gitattributes000066400000000000000000000000331154025176300171200ustar00rootroot00000000000000french_utf8.txt crlf=input clucene-core-2.3.3.4/.gitignore000066400000000000000000000004061154025176300162210ustar00rootroot00000000000000# git-ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ obj bin msvc build ~$*clucene-core-2.3.3.4/APACHE.license000066400000000000000000000261351154025176300165250ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. clucene-core-2.3.3.4/AUTHORS000066400000000000000000000022501154025176300153000ustar00rootroot00000000000000As with most development projects, contributions come from many people and in many forms. The CLucene project would like to thank it's many contributors. Omissions are merely accidental, please e-mail ustramooner@users.sourceforge.net if you have been left out or a contribution is not mentioned. CLucene was originally ported to C++ by Ben van Klinken (ustramooner@users.sourceforge.net) from Doug Cutting's popular java search engine, Lucene (see http://lucene.apache.org). Here is a list of contributors. Please send me an email at ustramooner@users.sourceforge.net if I have left you out. Doug Cutting cutting@users.sourceforge.net John Wheeler j_wheeler@users.sourceforge.net Robert G. Ristroph rgristroph@users.sourceforge.net David Rushby woodsplitter@users.sourceforge.net Jimmy Pritts jpritts@sdf.lonestar.org Peter Edwards peter@dragonstaff.co.uk Jorge Sabater Redondo jsabater@elderecho.com Daniel Glassey danglassey@ntlworld.com Peter Gladkikh batyi@mail.ru Pedja amigo@max3d.com Peter Hodges hodges.peter@gmail.com Itamar Syn-Hershko synhershko@users.sourceforge.net clucene-core-2.3.3.4/CMakeLists.txt000066400000000000000000000131061154025176300167720ustar00rootroot00000000000000PROJECT (clucene) #Rules for version: #MAJOR and MINOR versions are purely political (tracks JLucene compatibility) #REVISION version MUST be revised if the headers or compatibility change #PATCH should be 0 unless a patch is made that doesn't affect the public signature (i.e. clients don't need to re-compile). SET(CLUCENE_VERSION_MAJOR "2") SET(CLUCENE_VERSION_MINOR "3") SET(CLUCENE_VERSION_REVISION "3") SET(CLUCENE_VERSION_PATCH "4") # SOVERSION information #Must be incremented for releases if the api is not backwards compatible SET(CLUCENE_SOVERSION "1") MATH(EXPR CLUCENE_INT_VERSION "(${CLUCENE_VERSION_MAJOR} * 1000000) + (${CLUCENE_VERSION_MINOR} * 10000) + (${CLUCENE_VERSION_REVISION} * 100) + (${CLUCENE_VERSION_PATCH} * 1)" ) SET(CLUCENE_VERSION "${CLUCENE_VERSION_MAJOR}.${CLUCENE_VERSION_MINOR}.${CLUCENE_VERSION_REVISION}.${CLUCENE_VERSION_PATCH}") #CMake 2.6+ is recommended to an improved Boost module CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0 FATAL_ERROR) if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) #set various platform specific global options if(WIN32) set(CMAKE_DEBUG_POSTFIX "d") endif(WIN32) # include specific modules set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") #define options... Include (CLuceneDocs) Include (FindThreads) IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) ELSE(NOT CMAKE_BUILD_TYPE) MESSAGE( "Compiling as ${CMAKE_BUILD_TYPE}" ) ENDIF(NOT CMAKE_BUILD_TYPE) OPTION(ENABLE_DEBUG "enable debug support" OFF) OPTION(ENABLE_MMAP "enable mmap support (experimental)" OFF) OPTION(DISABLE_MULTITHREADING "disable multithreading - remove all locking code" OFF) OPTION(ENABLE_DMALLOC "enable dmalloc memory leak checker" OFF) OPTION(ENABLE_ASCII_MODE "enable ascii support" OFF) SET(ENABLE_ANSI_MODE OFF) IF(CMAKE_COMPILER_IS_GNUCXX) SET(ENABLE_ANSI_MODE ON) #exceptions: IF(MINGW OR CYGWIN) SET(ENABLE_ANSI_MODE OFF) ENDIF(MINGW OR CYGWIN) ENDIF(CMAKE_COMPILER_IS_GNUCXX) OPTION(ENABLE_ANSI_MODE "compile with -ansi flag" ${ENABLE_ANSI_MODE}) OPTION(LUCENE_USE_INTERNAL_CHAR_FUNCTIONS "use internal character functions. required to run tests correctly" ON) OPTION(ENABLE_PACKAGING "create build scripts for creating clucene packages" OFF) OPTION(BUILD_STATIC_LIBRARIES "create targets for building static libraries" OFF) OPTION(BUILD_CONTRIBS "create targets for building the clucene-contribs" OFF) OPTION(BUILD_CONTRIBS_LIB "create targets for building the clucene-contribs-lib" OFF) SET(LUCENE_SYS_INCLUDES "" CACHE PATH "location for non-system independent files. defaults to CMAKE_INSTALL_PREFIX. see INSTALL documentation for further information." ) #install path options SET(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" ) SET(LIB_DESTINATION "lib${LIB_SUFFIX}") SET ( ENABLE_COMPILE_TESTS_VALUE ON ) IF ( MSVC_IDE ) #this is annoying... SET ( ENABLE_COMPILE_TESTS_VALUE OFF ) ENDIF( MSVC_IDE ) OPTION(ENABLE_COMPILE_TESTS "enable various projects that test alternative build switches" ${ENABLE_COMPILE_TESTS_VALUE}) #check flags... INCLUDE (TestCXXAcceptsFlag) IF ( CMAKE_COMPILER_IS_GNUCC ) CHECK_CXX_ACCEPTS_FLAG(-pg GccFlagPg) IF ( GccFlagPg ) OPTION(ENABLE_GPROF "turn on gprof profiling support" OFF) IF ( ENABLE_GPROF ) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pg") ENDIF ( ENABLE_GPROF ) ENDIF ( GccFlagPg ) IF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) ENDIF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") IF( ENABLE_ANSI_MODE ) SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi") ENDIF ( ENABLE_ANSI_MODE ) ENDIF(CMAKE_COMPILER_IS_GNUCC) #Single output directory for building all executables and libraries. SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE PATH "Executable Output Directory" FORCE) SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE PATH "Library Output Directory" FORCE) #add tests ENABLE_TESTING() ADD_TEST(SimpleTest ${EXECUTABLE_OUTPUT_PATH}/cl_test ) #use single output directory INCLUDE_DIRECTORIES( ${clucene_SOURCE_DIR}/src/shared ) INCLUDE_DIRECTORIES( ${clucene_BINARY_DIR}/src/shared ) INCLUDE_DIRECTORIES( ${clucene_SOURCE_DIR}/src/core ) #set boost path. we need src/ext to be defined before this works... Include (CLuceneBoost) GET_BOOST_INCLUDE_PATH(_CL_BOOST_INCLUDE_PATH) INCLUDE_DIRECTORIES( ${_CL_BOOST_INCLUDE_PATH} ) #include the projects ADD_SUBDIRECTORY (src/ext) ADD_SUBDIRECTORY (src/shared) ADD_SUBDIRECTORY (src/core) ADD_SUBDIRECTORY (src/test) ADD_SUBDIRECTORY (src/demo EXCLUDE_FROM_ALL) IF ( BUILD_CONTRIBS ) ADD_SUBDIRECTORY (src/contribs EXCLUDE_FROM_ALL) SET(BUILD_CONTRIBS_LIB 1) ENDIF ( BUILD_CONTRIBS ) IF ( BUILD_CONTRIBS_LIB ) ADD_SUBDIRECTORY (src/contribs-lib EXCLUDE_FROM_ALL) ENDIF ( BUILD_CONTRIBS_LIB ) #add uninstall command CONFIGURE_FILE( "${CMAKE_MODULE_PATH}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") #this must go last... IF (ENABLE_PACKAGING) INCLUDE(CreateClucenePackages) ENDIF ( ENABLE_PACKAGING) clucene-core-2.3.3.4/COPYING000066400000000000000000000121601154025176300152640ustar00rootroot00000000000000License The CLucene code is split into two sections for licensing reasons. The 'Core' is strictly dual licensed Apache 2 and LGPL. The CLucene Contributions code could not be licensed under Apache because of the subcomponents it uses. CLUCENE CORE: The CLucene Core Library uses a dual license strategy for the source code. These licenses are the GNU Lesser General Public License (LGPL) and the Apache License (Version 2.0). Users can choose the license they wish to distribute their software under. This means that you do not need to abide by *both* licenses, but rather than you can choose the license which most suits your needs. For details of these licenses see APACHE.license and LGPL.license in the root of the source distribution. Some components of CLucene Core use other licenses. See the CLUCENE CORE SUBCOMPONENTS section for details. We understand that these licenses are compatible with LGPL and/or Apache v2, but please consult with a lawyer to be certain of this. To rephrase the licensing and to make it perfectly clear: CLucene is distributed under the GNU Lesser General Public License (LGPL) *or* the Apache License, Version 2.0 However, we are an open source project, and we encourage users to participate fully in the free software community by contributing their code back to the project. Dual licensing of the CLucene source code provides open and free access to the technology both for the GPL community and for other developers or companies that cannot use the GPL license. You can freely modify, extend, and improve the CLucene source code. The only question is whether or not you must provide the source code and contribute modifications to the community. The GNU and Apache licenses allow different ranges of flexibility in this regard, but in the end, regardless of the license used, we highly recommend that you submit any bugs, incompatibilities or added features. Note that this same license does *not* apply to the CLucene Contributions package. You should read the COPYING file in that directory or package for more information. CLUCENE CORE SUBCOMPONENTS: CLucene includes a number of subcomponents with separate copyright notices and license terms. Your use of the source code for the these subcomponents is subject to the terms and conditions of the following licenses. For the src\CLucene\util\MD5Digester.cpp component: /* * This is work is derived from material Copyright RSA Data Security, Inc. * * The RSA copyright statement and Licence for that original material is * included below. This is followed by the Apache copyright statement and * licence for the modifications made to that material. */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ the cmake/MacroCheckGccVisibility.cmake and MacroEnsureVersion.cmake components: # # Copyright (c) 2006, Alexander Neundorf # Copyright (c) 2006, Laurent Montel, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. the src/core/util/Compress.cpp component: /* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.3, July 18th, 2005 Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly jloup@gzip.org Mark Adler madler@alumni.caltech.edu */ CLUCENE CONTRIBUTIONS CODE: PorterStemmer code: couldn't find license. This component is deprecated and will be removed very soon. Snowball code: needs to be researched. clucene-core-2.3.3.4/ChangeLog000066400000000000000000000034151154025176300160060ustar00rootroot00000000000000Removed jstreams namespace. Sorry, I couldn't think of a way to nicely deprecate jstreams. version 0.9.23: Changes: * Static object fields have been changed to method accessors (SortField::FIELDDOC now chould be accessed as SortField::FIELDDOC(), for example). Classes changed: FieldCache, ScoreDocComparator, This was necessary for creating static libraries work on certain platforms. * Folders were reorganised, this seems like a good time to do it * Some deprecated functions were removed. * moved platform configuration type code and utility code into 'shared' project. This enables tests to be built with a shared library on windows * Moved moved of the platform specific logic into cmake in order to reduce #ifdefs in code (i love cmake!) * added contributions code into the trunk. this will hopefully mean more exposure to the contributions. need to make clear about the licensing still, though. * Deletor::Array was renamed to Deletor::vArray. * re-worked the install location for system-dependent files (clucene-config.h). this was a confusing issue, and i think it's better to stick to the standards rather than push the more compatible (in my opinion) way of doing things. this one has been getting so many complaints from downstream. however, LUCENE_SYS_INCLUDES is available to install the clucene-config.h type files into the library directory (or any other place). Here is a summary of changes that you'll need to look at for this release: * Action deprecated features. Some features that were deprecated for a long time have now been finally removed. * fix things that may affect you, such as the LUCENE_SYS_INCLUDES change, and the reorganisation of code (install locations are still the same though). Also autotools removals may affect your work, depending on how you use clucene. clucene-core-2.3.3.4/INSTALL000066400000000000000000000260261154025176300152700ustar00rootroot00000000000000* There are packages available for most linux distributions through the usual channels. * The Clucene Sourceforge website also has some distributions available. Also in this document is information how to build from source, troubleshooting, performance, and how to create a new distribution. Building from source: -------------------- Dependencies: * CMake version 2.4.2 or later. * A functioning and fairly new C++ compiler. We test mostly on GCC and Visual Studio 6+. Anything other than that may not work. * Something to unzip/untar the source code. Build instructions: 1.) Download the latest sourcecode from http://www.sourceforge.net/projects/clucene [Choose stable if you want the 'time tested' version of code. However, often the unstable version will suite your needs more since it is newer and has had more work put into it. The decision is up to you.] 2.) Unpack the tarball/zip/bzip/whatever 3.) Open a command prompt, terminal window, or cygwin session. 4.) Change directory into the root of the sourcecode (from now on referred to as ) # cd 5.) Create and change directory into an 'out-of-source' directory for your build. [This is by far the easiest way to build, it has the benefit of being able to create different types of builds in the same source-tree.] # mkdir /build-name # cd /build-name 6.) Configure using cmake. This can be done many different ways, but the basic syntax is # cmake [-G "Script name"] .. [Where "Script name" is the name of the scripts to build (e.g. Visual Studio 8 2005). A list of supported build scripts can be found by] # cmake --help 7.) You can configure several options such as the build type, debugging information, mmap support, etc, by using the CMake GUI or by calling # ccmake .. Make sure you call configure again if you make any changes. 8.) Start the build. This depends on which build script you specified, but it would be something like # make or # nmake Or open the solution files with your IDE. [You can also specify to just build a certain target (such as cl_test, cl_demo, clucene-core (shared library), clucene-core-static (static library).] 9.) The binary files will be available in build-name/bin 10.)Test the code. (After building the tests - this is done by default, or by calling make cl_test) # ctest -V 11.)At this point you can install the library: # make install [There are options to do this from the IDE, but I find it easier to create a distribution (see instructions below) and install that instead.] or # make cl_demo [This creates the demo application, which demonstrates a simple text indexing and searching]. or Adjust build values using ccmake or the Cmake GUI and rebuild. 12.)Now you can develop your own code. This is beyond the scope of this document. Read the README for information about documentation or to get help on the mailinglist. Other platforms: ---------------- Some platforms require specific actions to get cmake working. Here are some general tips: Solaris: I had problems when using the standard stl library. Using the -stlport4 switch worked. Had to specify compiler from the command line: cmake -DCXX_COMPILER=xxx -stlport4 Building Performance -------------------- Use of ccache will speed up build times a lot. I found it easiest to add the /usr/lib/ccache directory to the beginning of your paths. This works for most common compilers. PATH=/usr/lib/ccache:$PATH Note: you must do this BEFORE you configure the path, since you cannot change the compiler path after it is configured. Installing: ----------- CLucene is installed in CMAKE_INSTALL_PREFIX by default. CLucene used to put config headers next to the library. this was done because these headers are generated and are relevant to the library. CMAKE_INSTALL_PREFIX was for system-independent files. the idea is that you could have several versions of the library installed (ascii version, ucs2 version, multithread, etc) and have only one set of headers. in version 0.9.24+ we allow this feature, but you have to use LUCENE_SYS_INCLUDES to specify where to install these files. Troubleshooting: ---------------- 'Too many open files' Some platforms don't provide enough file handles to run CLucene properly. To solve this, increase the open file limit: On Solaris: ulimit -n 1024 set rlim_fd_cur=1024 GDB - GNU debugging tool (linux only) ------------------------ If you get an error, try doing this. More information on GDB can be found on the internet #gdb bin/cl_test # gdb> run when gdb shows a crash run # gdb> bt a backtrace will be printed. This may help to solve any problems. Code layout -------------- File locations: * clucene-config.h is required and is distributed next to the library, so that multiple libraries can exist on the same machine, but use the same header files. * _HeaderFile.h files are private, and are not to be used or distributed by anything besides the clucene-core library. * _clucene-config.h should NOT be used, it is also internal * HeaderFile.h are public and are distributed and the classes within should be exported using CLUCENE_EXPORT. * The exception to the internal/public conventions is if you use the static library. In this case the internal symbols will be available (this is the way the tests program tests internal code). However this is not recommended. Memory management ------------------ Memory in CLucene has been a bit of a difficult thing to manage because of the unclear specification about who owns what memory. This was mostly a result of CLucene's java-esque coding style resulting from porting from java to c++ without too much re-writing of the API. However, CLucene is slowly improving in this respect and we try and follow these development and coding rules (though we dont guarantee that they are all met at this stage): 1. Whenever possible the caller must create the object that is being filled. For example: IndexReader->getDocument(id, document); As opposed to the old method of document = IndexReader->getDocument(id); 2. Clone always returns a new object that must be cleaned up manually. Questions: 1. What should be the convention for an object taking ownership of memory? Some documenting is available on this, but not much Working with valgrind ---------------------- Valgrind reports memory leaks and memory problems. Tests should always pass valgrind before being passed. #valgrind --leak-check=full Memory leak tracking with dmalloc --------------------------------- dmalloc (http://dmalloc.com/) is also a nice tool for finding memory leaks. To enable, set the ENABLE_DMALLOC flag to ON in cmake. You will of course have to have the dmalloc lib installed for this to work. The cl_test file will by default print a low number of errors and leaks into the dmalloc.log.txt file (however, this has a tendency to print false positives). You can override this by setting your environment variable DMALLOC_OPTIONS. See http://dmalloc.com/ or dmalloc --usage for more information on how to use dmalloc For example: # DMALLOC_OPTIONS=medium,log=dmalloc.log.txt # export DMALLOC_OPTIONS UPDATE: when i upgrade my machine to Ubuntu 9.04, dmalloc stopped working (caused clucene to crash). Performance with callgrind -------------------------- Really simple valgrind --tool=callgrind this will create a file like callgrind.out.12345. you can open this with kcachegrind or some tool like that. Performance with gprof ---------------------- Note: I recommend callgrind, it works much better. Compile with gprof turned on (ENABLE_GPROF in cmake gui or using ccmake). I've found (at least on windows cygwin) that gprof wasn't working over dll boundaries, running the cl_test-pedantic monolithic build worked better. This is typically what I use to produce some meaningful output after a -pg compiled application has exited: # gprof bin/cl_test-pedantic.exe gmon.out >gprof.txt Code coverage with gcov ----------------------- To create a code coverage report of the test, you can use gcov. Here are the steps I followed to create a nice html report. You'll need the lcov package installed to generate html. Also, I recommend using an out-of-source build directory as there are lots of files that will be generated. NOTE: you must have lcov installed for this to work * It is normally recommended to compile with no optimisations, so change CMAKE_BUILD_TYPE to Debug. * I have created a cl_test-gcov target which contains the necessary gcc switches already. So all you need to do is # make test-gcov If everything goes well, there will be a directory called code-coverage containing the report. If you want to do this process manually, then: # lcov --directory ./src/test/CMakeFiles/cl_test-gcov.dir/__/core/CLucene -c -o clucene-coverage.info # lcov --remove clucene-coverage.info "/usr/*" > clucene-coverage.clean # genhtml -o clucene-coverage clucene-coverage.clean If both those commands pass, then there will be a clucene coverage report in the clucene-coverage directory. Benchmarks ---------- Very little benchmarking has been done on clucene. Andi Vajda posted some limited statistics on the clucene list a while ago with the following results. There are 250 HTML files under $JAVA_HOME/docs/api/java/util for about 6108kb of HTML text. org.apache.lucene.demo.IndexFiles with java and gcj: on mac os x 10.3.1 (panther) powerbook g4 1ghz 1gb: . running with java 1.4.1_01-99 : 20379 ms . running with gcj 3.3.2 -O2 : 17842 ms . running clucene 0.8.9's demo : 9930 ms I recently did some more tests and came up with these rough tests: 663mb (797 files) of Guttenberg texts on a Pentium 4 running Windows XP with 1 GB of RAM. Indexing max 100,000 fields - Jlucene: 646453ms. peak mem usage ~72mb, avg ~14mb ram - Clucene: 232141. peak mem usage ~60, avg ~4mb ram Searching indexing using 10,000 single word queries - Jlucene: ~60078ms and used ~13mb ram - Clucene: ~48359ms and used ~4.2mb ram Distribution ------------ CPack is used for creating distributions. * Create a out-of-source build as per usual * Make sure the version number is correct (see /CMakeList.txt, right at the top of the file) * Make sure you are compiling in the correct release mode (check ccmake or the cmake gui) * Make sure you enable ENABLE_PACKAGING (check ccmake or the cmake gui) * Next, check that the package is compliant using several tests (must be done from a linux terminal, or cygwin): # cd /build-name # ../dist-check.sh * Make sure the source directory is clean. Make sure there are no unknown svn files: # svn stat .. * Run the tests to make sure that the code is ok (documented above) * If all tests pass, then run # make package for the binary package (and header files). This will only create a tar.gz package. and/or # make package_source for the source package. This will create a ZIP on windows, and tar.bz2 and tar.gz packages on other platforms. There are also options for create RPM, Cygwin, NSIS, Debian packages, etc. It depends on your version of CPack. Call # cpack --help to get a list of generators. Then create a special package by calling # cpack -G CPackConfig.cmake clucene-core-2.3.3.4/LGPL.license000066400000000000000000000607061154025176300163440ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. ------------------------------------------------------------------------------- Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. ------------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. ------------------------------------------------------------------------------- 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ------------------------------------------------------------------------------- Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. ------------------------------------------------------------------------------- 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. ------------------------------------------------------------------------------- 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. ------------------------------------------------------------------------------- 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. ------------------------------------------------------------------------------- 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS clucene-core-2.3.3.4/NEWS000066400000000000000000000000001154025176300147160ustar00rootroot00000000000000clucene-core-2.3.3.4/README000066400000000000000000000037561154025176300151240ustar00rootroot00000000000000CLucene README ============== ------------------------------------------------------ CLucene is a C++ port of Lucene. It is a high-performance, full-featured text search engine written in C++. CLucene is faster than lucene as it is written in C++. ------------------------------------------------------ CLucene has contributions from many, see AUTHORS CLucene is distributed under the GNU Lesser General Public License (LGPL) *or* the Apache License, Version 2.0 See the LGPL.license and APACHE.license for the respective license information. Read COPYING for more about the license. Installation ------------ Read the INSTALL file Mailing List ------------ Questions and discussion should be directed to the CLucene mailing list at clucene-developers@lists.sourceforge.net Find subscription instructions at http://lists.sourceforge.net/lists/listinfo/clucene-developers Suggestions and bug reports can be made on our bug tracking database (http://sourceforge.net/tracker/?group_id=80013&atid=558446) The latest version ------------------ Details of the latest version can be found on the CLucene sourceforge project web site: http://www.sourceforge.net/projects/clucene Documentation ------------- You can build your own documentation by running 'make DoxygenDoc' from your 'out-of-source' cmake-configured build directory. CLucene is a very close port of Java Lucene, so you can also try looking at the Java Docs on http://lucene.apache.org/java/ There is an online version (which won't be as up to date as if you build your own) at http://clucene.sourceforge.net/doc/html/ Acknowledgments ---------------- The Apache Lucene project is the basis for this software, so the biggest acknoledgment goes to that project. We wish to acknowledge the following copyrighted works that make up portions of the CLucene software: This software contains code derived from the RSA Data Security Inc. MD5 Message-Digest Algorithm. CLucene relies heavily on the use of cmake to provide a stable build environment. clucene-core-2.3.3.4/README.PACKAGE000066400000000000000000000007521154025176300161470ustar00rootroot00000000000000CLucene is a C++ port of the popular Apache Lucene search engine (http://lucene.apache.org/java). It is released under LGPL or the Apache License. CLucene aims to be a high-speed alternative to Java Lucene, its API is very similar to that of the Java version. CLucene has recently been brought up to date with Lucene 2.3.2. It contains most of the same functionality as the Java version. This package contains the files necessary for running applications that use the libclucene library. clucene-core-2.3.3.4/REQUESTS000066400000000000000000000002611154025176300154260ustar00rootroot00000000000000The todo list has been moved to the tracker at http://sourceforge.net/tracker/?func=browse&group_id=80013&atid=558449 You need to be logged into sourceforge to view this list. clucene-core-2.3.3.4/cmake/000077500000000000000000000000001154025176300153115ustar00rootroot00000000000000clucene-core-2.3.3.4/cmake/CLuceneBoost.cmake000066400000000000000000000015521154025176300206430ustar00rootroot00000000000000#Locate Boost libs. Windows users: make sure BOOST_ROOT and BOOST_PATH are set correctly on your environment. #See the site FAQ for more details. MACRO (GET_BOOST_INCLUDE_PATH path) #todo: allow this to fall back on a local distributed copy, so user doesn't have to d/l Boost seperately SET(Boost_USE_MULTITHREAD ON) FIND_PACKAGE( Boost ) #todo: limit Boost version? #todo: use COMPONENTS threads to locate boost_threads without breaking the current support IF(Boost_FOUND) IF (NOT _boost_IN_CACHE) MESSAGE( "Boost found" ) message(STATUS "Boost_INCLUDE_DIR : ${Boost_INCLUDE_DIR}") ENDIF (NOT _boost_IN_CACHE) SET(${path} ${Boost_INCLUDE_DIRS} ) ELSE() MESSAGE( "Boost not found, using local: ${clucene_SOURCE_DIR}/src/ext" ) SET(${path} ${clucene_SOURCE_DIR}/src/ext ) ENDIF() ENDMACRO (GET_BOOST_INCLUDE_PATH path) clucene-core-2.3.3.4/cmake/CLuceneDocs.cmake000066400000000000000000000124671154025176300204540ustar00rootroot00000000000000# - CLuceneDocs.cmake # This file provides support for building the CLucene Documentation. # To build the documention, you will have to enable it # and then do the equivalent of "make doc". OPTION(ENABLE_CLDOCS "Build the clucene documentation." OFF) MACRO(SET_YESNO) FOREACH(param ${ARGV}) IF ( ${param} ) SET(${param} "YES") ELSE ( ${param} ) SET(${param} "NO") ENDIF ( ${param} ) ENDFOREACH(param) ENDMACRO(SET_YESNO) MACRO(SET_BLANK) FOREACH(param ${ARGV}) IF ( NOT ${param} ) SET(${param} "") ENDIF ( NOT ${param} ) ENDFOREACH(param) ENDMACRO(SET_BLANK) IF (ENABLE_CLDOCS) OPTION(CLDOCS_HTML_HELP "Doxygen should compile HTML into a Help file (CHM)." NO) OPTION(CLDOCS_HTML "Doxygen should build HTML documentation." YES) OPTION(CLDOCS_XML "Doxygen should build XML documentation." NO) OPTION(CLDOCS_RTF "Doxygen should build RTF documentation." NO) OPTION(CLDOCS_MAN "Doxygen should build man documentation." NO) OPTION(CLDOCS_TAGFILE "Doxygen should build a tagfile." NO) OPTION(CLDOCS_LATEX "Doxygen should build Latex documentation." NO ) MARK_AS_ADVANCED( CLDOCS_HTML_HELP CLDOCS_LATEX CLDOCS_XML CLDOCS_HTML CLDOCS_RTF CLDOCS_MAN CLDOCS_TAGFILE ) # # Check for the tools # FIND_PACKAGE(Doxygen) IF ( DOXYGEN_FOUND ) # This creates a new target to build documentation. # It runs ${DOXYGEN_EXECUTABLE} which is the full path and executable to # Doxygen on your system, set by the FindDoxygen.cmake module # (called by FindDocumentation.cmake). # It runs the final generated Doxyfile against it. # The DOT_PATH is substituted into the Doxyfile. ADD_CUSTOM_TARGET(doc ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/doc/doxyfile ) IF ( CLDOCS_HTML_HELP ) IF ( NOT CLDOCS_HTML ) MESSAGE ( FATAL_ERROR "CLDOCS_HTML is required to buidl CLDOCS_HTML_HELP" ) ENDIF ( NOT CLDOCS_HTML ) FIND_PACKAGE(HTMLHelp) IF ( NOT HTML_HELP_COMPILER ) MESSAGE(FATAL_ERROR "HTML Help compiler not found, turn CLDOCS_HTML_HELP off to proceed") ENDIF ( NOT HTML_HELP_COMPILER ) #make cygwin work with hhc... IF ( CYGWIN ) EXECUTE_PROCESS ( COMMAND cygpath "${HTML_HELP_COMPILER}" OUTPUT_VARIABLE HTML_HELP_COMPILER_EX ) STRING ( REPLACE "\n" "" HTML_HELP_COMPILER_EX ${HTML_HELP_COMPILER_EX} ) STRING ( REPLACE "\r" "" HTML_HELP_COMPILER_EX ${HTML_HELP_COMPILER_EX} ) SET ( HTML_HELP_COMPILER_EX "\"${HTML_HELP_COMPILER_EX}\"" ) ELSE ( CYGWIN ) SET ( HTML_HELP_COMPILER_EX ${HTML_HELP_COMPILER} ) ENDIF ( CYGWIN ) ENDIF ( CLDOCS_HTML_HELP ) IF ( CLDOCS_LATEX ) FIND_PACKAGE(LATEX) IF ( NOT LATEX_COMPILER ) MESSAGE(FATAL_ERROR "Latex compiler not found, turn CLDOCS_LATEX off to proceed") ENDIF ( NOT LATEX_COMPILER ) ENDIF ( CLDOCS_LATEX ) FIND_PACKAGE(Perl) IF ( DOXYGEN_DOT_EXECUTABLE ) SET ( HAVE_DOT "YES" ) ELSE ( DOXYGEN_DOT_EXECUTABLE ) SET ( HAVE_DOT "NO" ) ENDIF ( DOXYGEN_DOT_EXECUTABLE ) #doxygen expects YES/NO parameters SET_YESNO( CLDOCS_HTML_HELP CLDOCS_LATEX CLDOCS_XML CLDOCS_HTML CLDOCS_RTF CLDOCS_MAN ) #empty out paths if not found SET_BLANK( PERL_EXECUTABLE DOXYGEN_DOT_EXECUTABLE HTML_HELP_COMPILER LATEX_COMPILER ) IF ( CLDOCS_TAGFILE ) SET ( CLDOCS_TAGFILE_LOCATION "${PROJECT_BINARY_DIR}/doc/tag/clucene.tag" ) ENDIF ( CLDOCS_TAGFILE ) # This processes our Doxyfile.cmake and substitutes paths to generate a final Doxyfile CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/doc/Doxyfile.cmake ${PROJECT_BINARY_DIR}/doc/doxyfile ) CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/doc/helpheader.htm.cmake ${PROJECT_BINARY_DIR}/doc/helpheader.htm ) CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/doc/helpfooter.htm.cmake ${PROJECT_BINARY_DIR}/doc/helpfooter.htm ) CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/doc/doxygen.css.cmake ${PROJECT_BINARY_DIR}/doc/html/doxygen.css ) #create a target for tar.gz html help FIND_PACKAGE(UnixCommands) IF ( TAR AND GZIP ) ADD_CUSTOM_TARGET(doc-tarz COMMAND "${TAR}" "-cf" "doc/clucene-core-doc.tar" "${PROJECT_BINARY_DIR}/doc/html/" COMMAND "${GZIP}" "doc/clucene-core-doc.tar" #DEPENDS doc-doxygen ) ENDIF ( TAR AND GZIP ) #install man if it was built IF ( CLDOCS_MAN ) INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/doc/man/ DESTINATION man) ENDIF ( CLDOCS_MAN ) ELSE ( DOXYGEN_FOUND ) MESSAGE(FATAL_ERROR "Doxygen not found, turn ENABLE_CLDOCS off to proceed") ENDIF ( DOXYGEN_FOUND ) ENDIF (ENABLE_CLDOCS) clucene-core-2.3.3.4/cmake/CreateClucenePackages.cmake000066400000000000000000000071441154025176300224620ustar00rootroot00000000000000#Creates all the relevant packages #Rules for version: #MAJOR and MINOR versions are purely political #REVISION version MUST be revised if the headers or compatibility change #PATCH should be 0 unless a patch is made that doesn't affect the public signature (i.e. clients don't need to re-compile). SET(CPACK_PACKAGE_VERSION_MAJOR ${CLUCENE_VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${CLUCENE_VERSION_MINOR}) SET(CPACK_PACKAGE_VERSION_REVISION ${CLUCENE_VERSION_REVISION}) SET(CPACK_PACKAGE_VERSION_PATCH ${CLUCENE_VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION ${CLUCENE_VERSION}) SET(CPACK_PACKAGE_SOVERSION ${CLUCENE_SOVERSION}) SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "library for full-featured text search engine (runtime)") SET(CPACK_PACKAGE_VENDOR "Ben van Klinken") SET(CPACK_PACKAGE_CONTACT "clucene-developers@lists.sourceforge.net") SET(CPACK_PACKAGE_NAME "libclucene1") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.PACKAGE") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CLucene - a C++ search engine, ported from the popular Apache Lucene") SET(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.PACKAGE") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/README.PACKAGE") #so, what are we going to install? SET(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};clucene-core;ALL;/" "${CMAKE_BINARY_DIR};clucene-shared;ALL;/") SET(CPACK_COMPONENTS_ALL development runtime) SET(CPACK_GENERATOR "TGZ") SET(CPACK_PACKAGE_FILE_NAME "clucene-core-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}") IF(WIN32 AND NOT UNIX) SET(CPACK_SOURCE_GENERATOR "ZIP") ELSE(WIN32 AND NOT UNIX) SET(CPACK_SOURCE_GENERATOR "TBZ2;TGZ") ENDIF(WIN32 AND NOT UNIX) SET(CPACK_SOURCE_PACKAGE_FILE_NAME "clucene-core-${CPACK_PACKAGE_VERSION}-Source") #specific packaging requirements: SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.4), libgcc1 (>= 1:4.1.1-21), libstdc++6 (>= 4.1.1-21), zlib1g") SET(CPACK_DEBIAN_PACKAGE_SECTION "libs") SET(CPACK_RPM_PACKAGE_LICENSE "Apache 2.0") SET(CPACK_RPM_PACKAGE_GROUP "libs") SET(CPACK_RPM_PACKAGE_REQUIRES "libz") #don't include the current binary dir. get_filename_component(clucene_BINARY_DIR_name ${clucene_BINARY_DIR} NAME) SET(CPACK_SOURCE_IGNORE_FILES "/\\\\.svn/" "/\\\\.git/" "\\\\.swp$" "\\\\.#;/#" ".*~" ".*\\\\.tmp" ".*\\\\.save" "/${clucene_BINARY_DIR_name}/" ) IF(WIN32 AND NOT UNIX) # There is a bug in NSI that does not handle full unix paths properly. Make # sure there is at least one set of four (4) backlasshes. SET(CPACK_GENERATOR "${CPACK_GENERATOR};NSIS") #SET(CPACK_PACKAGE_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\\\InstallIcon.bmp") #SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\MyExecutable.exe") SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} CLucene Core Library") SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\clucene.sourceforge.net") SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\clucene.sourceforge.net") SET(CPACK_NSIS_CONTACT "clucene-developers@lists.sourceforge.net") #SET(CPACK_NSIS_MODIFY_PATH ON) ELSE(WIN32 AND NOT UNIX) # SET(CPACK_STRIP_FILES "bin/xxx") SET(CPACK_SOURCE_STRIP_FILES "") ENDIF(WIN32 AND NOT UNIX) #SET(CPACK_PACKAGE_EXECUTABLES "MyExecutable" "My Executable") ADD_CUSTOM_TARGET(dist-package COMMAND rsync -avP -e ssh ${CPACK_PACKAGE_FILE_NAME}.* ustramooner@frs.sourceforge.net:uploads/ # DEPENDS package ) ADD_CUSTOM_TARGET(dist-package_source COMMAND rsync -avP -e ssh ${CPACK_SOURCE_PACKAGE_FILE_NAME}.* ustramooner@frs.sourceforge.net:uploads/ # DEPENDS package_source ) #this must be last INCLUDE(CPack) clucene-core-2.3.3.4/cmake/DefineOptions.cmake000066400000000000000000000040301154025176300210560ustar00rootroot00000000000000#define global options, this makes it easy to use ccmake, or the cmake gui MACRO (DEFINE_OPTIONS extraOptions extraLibs) IF(ENABLE_DEBUG) SET (${extraOptions} "${${extraOptions}} -D_DEBUG") ENDIF(ENABLE_DEBUG) IF(ENABLE_MMAP) SET (${extraOptions} "${${extraOptions}} -DLUCENE_FS_MMAP") ENDIF(ENABLE_MMAP) IF(ENABLE_DMALLOC) SET (${extraOptions} "${${extraOptions}} -DDMALLOC") IF ( DISABLE_MULTITHREADING ) SET (${extraLibs} ${${extraLibs}} "dmalloccxx") ELSE( DISABLE_MULTITHREADING ) SET (${extraLibs} ${${extraLibs}} "dmallocthcxx") ENDIF ( DISABLE_MULTITHREADING ) ENDIF(ENABLE_DMALLOC) IF(DISABLE_MULTITHREADING) SET (${extraOptions} "${${extraOptions}} -D_CL_DISABLE_MULTITHREADING") ELSE(DISABLE_MULTITHREADING) SET(${extraOptions} "${${extraOptions}} -D_REENTRANT") ENDIF(DISABLE_MULTITHREADING) IF(ENABLE_ASCII_MODE) SET (${extraOptions} "${${extraOptions}} -D_ASCII") ELSE(ENABLE_ASCII_MODE) SET (${extraOptions} "${${extraOptions}} -D_UCS2") SET (${extraOptions} "${${extraOptions}} -D_UNICODE") ENDIF(ENABLE_ASCII_MODE) IF ( MSVC80 OR MSVC90) #todo: remove this once crt functions are fixed... SET (${extraOptions} "${${extraOptions}} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE") ENDIF ( MSVC80 OR MSVC90 ) IF(CYGWIN) ADD_DEFINITIONS(-D__LARGE64_FILES) ENDIF(CYGWIN) # calm mdown msvc IF(MSVC) IF ( NOT MSVC60 ) #ADD_DEFINITIONS(-wd4251) # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2' #ADD_DEFINITIONS(-wd4275) # non DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' #ADD_DEFINITIONS(-wd4309) # 'conversion' : truncation of constant value #ADD_DEFINITIONS(-wd4503) # decorated name length exceeded #ADD_DEFINITIONS(-wd4786) # identifier was truncated to '255' characters in the debug information ENDIF ( NOT MSVC60 ) ENDIF(MSVC) ENDMACRO (DEFINE_OPTIONS) clucene-core-2.3.3.4/cmake/Toolchain-g++32.cmake000066400000000000000000000012661154025176300207570ustar00rootroot00000000000000# Cross compiling from linux using g++-multilib to create 32 bit output # On ubuntu, you'll need to install the packages: g++-multilib gcc-multilib # # Use of this file: # cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-g++32.cmake .. SET(CMAKE_CXX_FLAGS "-m32") SET(CMAKE_C_FLAGS "-m32") SET(CMAKE_EXE_LINKER_FLAGS "-m32") SET(CMAKE_MODULE_LINKER_FLAGS "-m32") # here is the target environment located SET(CMAKE_FIND_ROOT_PATH /usr/lib32 ) # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search # programs in the host environment set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) clucene-core-2.3.3.4/cmake/Toolchain-llvm.cmake000066400000000000000000000002721154025176300212040ustar00rootroot00000000000000# Use of this file: # cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-llvm.cmake .. # which compilers to use for C and C++ SET(CMAKE_C_COMPILER clang) SET(CMAKE_CXX_COMPILER clang++) clucene-core-2.3.3.4/cmake/Toolchain-mingw32.cmake000066400000000000000000000022461154025176300215230ustar00rootroot00000000000000# Cross compiling from linux using mingw32 tools # On ubuntu, you'll need to install the packages: mingw32, mingw32-binutils, mingw32-runtime # # Use of this file: # cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake -C ../cmake/Define-mingw32.cmake .. # the name of the target operating system SET(CMAKE_SYSTEM_NAME Windows) # which compilers to use for C and C++ SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc) SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++) # here is the target environment located SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc /home/alex/mingw-install ) INCLUDE_DIRECTORIES(/usr/lib/gcc/i586-mingw32msvc/4.2.1-sjlj/include/c++) # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search # programs in the host environment set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(_CL_HAVE_GCCVISIBILITYPATCH 0) SET(_CL_HAVE_NAMESPACES_EXITCODE 0) SET(_CL_HAVE_NO_SNPRINTF_BUG_EXITCODE 0) SET(_CL_HAVE_NO_SNWPRINTF_BUG_EXITCODE 0) SET(LUCENE_STATIC_CONSTANT_SYNTAX_EXITCODE 1) SET(_CL_HAVE_TRY_BLOCKS_EXITCODE 0) clucene-core-2.3.3.4/cmake/cmake_uninstall.cmake.in000066400000000000000000000015631154025176300220760ustar00rootroot00000000000000IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(EXISTS "${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF("${rm_retval}" STREQUAL 0) ELSE("${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" STREQUAL 0) #ELSE(EXISTS "${file}") # MESSAGE(STATUS "File \"${file}\" does not exist.") ENDIF(EXISTS "${file}") ENDFOREACH(file) clucene-core-2.3.3.4/dist-test.sh000077500000000000000000000201521154025176300165100ustar00rootroot00000000000000#!/bin/bash #Check compliance with Coding standards... #where to keep the temp files... TMP=disttest function usage { echo "usage: ../dist-test.sh [all | " echo " " echo " " echo " " echo " ]" echo " ]" echo " ]" echo " ]" echo " ]" exit 1; } t_all=0 t_env=0 t_c_all=0 t_inline=0 t_compile=0 t_c_h=0 t_license=0 t_ifdefs=0 t_exports=0 FAIL=0 if [ $# -eq 0 ]; then usage else while [ "$1" != "" ]; do if [ "$1" == "all" ]; then t_all=1 elif [ "$1" == "env" ]; then t_env=1 elif [ "$1" == "c_all" ]; then t_c_all=1 elif [ "$1" == "inline" ]; then t_inline=1 elif [ "$1" == "compile" ]; then t_compile=1 elif [ "$1" == "c_header" ]; then t_c_h=1 elif [ "$1" == "license" ]; then t_license=1 elif [ "$1" == "ifdefs" ]; then t_ifdefs=1 elif [ "$1" == "exports" ]; then t_exports=1 else usage fi shift done fi if [ $t_all -eq 1 ]; then t_env=1 t_c_all=1 t_c_h=1 t_inline=1 t_compile=1 t_license=1 t_ifdefs=1 t_exports=1 fi #check to see that no #ifdefs exist in headers that don't belong function checkForIfdefs { I=0 grep "#if" $1| grep -v "_UCS2" |grep -v "_CL_HAVE_" |grep -v "_ASCII" |grep -v "_WIN32"|grep -v "_MSC_"|grep -v "__MINGW32__" |grep -v "_WIN64" | while read line; do I=`expr $I + 1` if [ $I -gt 1 ]; then echo $1 might have invalid ifdef: $line fi done } if [ $t_env -eq 1 ]; then rm -fdr $TMP 2>/dev/null mkdir $TMP #create header file for testing of symbols in headers. echo "#include \"CLucene/StdHeader.h"\" >$TMP/pub-headers.cpp #iterate all headers for H in `find ../src/shared/CLucene| grep "\.h$"` `find ../src/core/CLucene| grep "\.h$"`; do BH=`basename "$H"` DN=`dirname "$H"` if [ "${BH:0:1}" != "_" ]; then DH=`dirname "${H:3}"` if [ "${H:7}" != "core/CLucene/util/Reader.h" ]; then #move headers somewhere to compile mkdir -p "$TMP/$DH" 2>/dev/null ln -s "`cd "$DN" && pwd`/$BH" "$TMP/${H:3}" 2>/dev/null #create pub-headers.cpp echo "#include \"${H:7}\"" >>$TMP/pub-headers.cpp fi fi done echo "int main(){return 0;}" >>$TMP/pub-headers.cpp fi ################################################ #now the environment is finished being setup... ################################################ echo "Starting tests..." if [ $t_c_h -eq 1 ] || [ $t_ifdefs -eq 1 ] || [ $t_exports -eq 1 ]; then for H in `find $TMP/src | grep "\.h$"`; do BH=`basename "$H"` DH=`dirname "${H:3}"` if [ $t_ifdefs -eq 1 ]; then checkForIfdefs $H fi #check that all classes are exported if [ $t_exports -eq 1 ]; then if [ "${H:0:1}" == "_" ]; then #internal headers... none must be exported XX=`awk '/^[ \t]*(class|struct)/ { print $line }' $H| grep -v ";$"| grep -v CLUCENE_EXPORT| grep -v CLUCENE_INLINE_EXPORT| grep -v CLUCENE_SHARED_EXPORT| grep -v CLUCENE_SHARED_INLINE_EXPORT` if [ "$XX" == "" ]; then echo "$H is internal but has exported class: $XX" echo "" FAIL=1 fi else #external headers... all must be exported XX=`awk '/^[ \t]*(class|struct)/ { print $line }' $H| grep -v ";$"| grep -v CLUCENE_EXPORT| grep -v CLUCENE_INLINE_EXPORT| grep -v CLUCENE_SHARED_EXPORT| grep -v CLUCENE_SHARED_INLINE_EXPORT` if [ "$XX" != "" ]; then echo "$H has unexported class: $XX" echo "" FAIL=1 fi fi fi #test that each header compiles independently... if [ $t_c_h -eq 1 ]; then echo "#include \"CLucene/StdHeader.h"\" >$TMP/pub-header.cpp echo "#include \"$H"\" >>$TMP/pub-header.cpp echo "int main(){ return 0; }" >>"$TMP/pub-header.cpp" ERROR=`g++ -I. -I$TMP/src/shared -I./src/shared -I../src/ext -I$TMP/src/core $TMP/pub-header.cpp` if [ $? -ne 0 ]; then echo "" echo "$H doesn't compile seperately..." echo $ERROR FAIL=1; fi fi done if [ $t_ifdefs -eq 1 ]; then echo "Not all ifdefs are invalid, you have to figure it out for yourself :-)" echo "If defs in classes which change depending on a user setting can cause big problems due to offset changes" echo "for example:" echo "class X {" echo " #ifdef _DEBUG" echo " int x;" echo " #endif" echo " int y;" echo "}" echo "If the library is compiled with _DEBUG, and then a user calls y without _DEBUG defined, unexpected behaviour will occur" fi fi #iterate all our code... if [ $t_license -eq 1 ]; then for H in `find ../src`; do BH=`basename "$H"` BH_len=${#BH} if [ "${BH:BH_len-2}" == ".h" ] || [ "${BH:BH_len-2}" == ".c" ] || [ "${BH:BH_len-4}" == ".cpp" ]; then #snowball has its own license... if [ "echo $H|grep 'snowball/src_c'" != "" ]; then continue fi #snowball has its own license... if [ "echo $H|grep 'libstemmer'" != "" ]; then continue fi #zlib has its own license... if [ "echo $H|grep 'CLucene/util/zlib'" != "" ]; then continue fi if [ "`awk '/\* Copyright \(C\) [0-9]*-[0-9]* .*$/ { print $line }' $H`" == "" ]; then if [ "`awk '/\* Copyright [0-9]*-[0-9]* .*$/ { print $line }' $H`" == "" ]; then echo "$H ($BH) has invalid license" FAIL=1 fi fi fi done fi #test if headers can compile together by themselves: if [ $t_c_all -eq 1 ]; then g++ -I$TMP/src -I../src/ext -I$TMP/src/shared -I$TMP/src/core $TMP/pub-headers.cpp -I./src/shared fi if [ $t_inline -eq 1 ]; then if [ ! -d "./doc" ]; then echo "Couldn't find docs, run:" echo "# cmake -DENABLE_CLDOCS:BOOLEAN=TRUE ." echo "# make doc" echo "and then try again" exit 1 fi INLINES=0 grep -c "\[inline" doc/html/*.html|grep -v ":0$"|grep -v "util"|grep -v "jstreams" | while read line; do #ignore some actual inlines... if [ "doc/html/classlucene_1_1index_1_1Term.html:1" == $line ]; then continue; fi if [ "doc/html/classlucene_1_1search_1_1Similarity.html:1" == $line ]; then continue; fi if [ "doc/html/classlucene_1_1store_1_1BufferedIndexInput.html:1" == $line ]; then continue; fi if [ $INLINES -eq 0 ]; then echo "These files report inline code:" INLINES=1 FAIL=1 fi echo $line done fi if [ $t_compile -eq 1 ]; then #compile serperately make cl_test if [ $? -ne 0 ]; then FAIL=1; fi echo "Undefines for shared lib:" nm -u --demangle bin/libclucene-shared.so |grep -E "lucene::" echo "Undefines for core lib:" nm -u --demangle bin/libclucene-core.so |grep -E "lucene::"|grep -v "lucene::util::Misc" |grep -v "lucene::util::mutex" |grep -v "lucene::util::StringBuffer"|grep -v "lucene::util::shared_condition" #compile together make test-all if [ $? -ne 0 ]; then FAIL=1; fi fi if [ $FAIL == 1 ]; then echo "There were errors, please correct them and re-run" exit 1 fi exit 0 clucene-core-2.3.3.4/doc/000077500000000000000000000000001154025176300147765ustar00rootroot00000000000000clucene-core-2.3.3.4/doc/Doxyfile.cmake000066400000000000000000000207741154025176300175750ustar00rootroot00000000000000# Doxyfile 1.2.18 #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- PROJECT_NAME = CLucene-core PROJECT_NUMBER = @CPACK_PACKAGE_VERSION@ OUTPUT_DIRECTORY = @PROJECT_BINARY_DIR@/doc OUTPUT_LANGUAGE = English EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = INTERNAL_DOCS = NO STRIP_CODE_COMMENTS = YES CASE_SENSE_NAMES = YES SHORT_NAMES = NO HIDE_SCOPE_NAMES = NO VERBATIM_HEADERS = YES SHOW_INCLUDE_FILES = YES JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ALIASES = "memory=\par Memory management:\n" ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = @PROJECT_BINARY_DIR@/doc/doxygen.warnings.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = @PROJECT_SOURCE_DIR@/src/core/CLucene INPUT += @PROJECT_SOURCE_DIR@/src/shared/CLucene FILE_PATTERNS = *.h RECURSIVE = YES #EXCLUDE = mem.h bufferedstream.h fileinputstream.h stringreader.h Misc.h LuceneThreads.h jstreamconfig.h EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = "**/config/**" \ "**/.svn/**" \ "**/debug/**" \ "_*.h" EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = @CLDOCS_HTML@ HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = @PROJECT_BINARY_DIR@/doc/helpheader.htm HTML_FOOTER = @PROJECT_BINARY_DIR@/doc/helpfooter.htm HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = @CLDOCS_HTML_HELP@ CHM_FILE = ../clucene.chm HHC_LOCATION = @HTML_HELP_COMPILER_EX@ GENERATE_CHI = YES BINARY_TOC = YES TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = @CLDOCS_LATEX@ LATEX_OUTPUT = latex LATEX_CMD_NAME = @LATEX_COMPILER@ MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = @CLDOCS_RTF@ RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = @CLDOCS_MAN@ MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = @CLDOCS_XML@ XML_SCHEMA = XML_DTD = #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = @PROJECT_SOURCE_DIR@/src/core INCLUDE_PATH += @PROJECT_SOURCE_DIR@/src/shared INCLUDE_PATH += @PROJECT_BINARY_DIR@/src/shared INCLUDE_FILE_PATTERNS = PREDEFINED = "_MSC_VER=1400" PREDEFINED += "WIN32" PREDEFINED += "_CL_DISABLE_MULTITHREADING" PREDEFINED += "_CL_DEPRECATED(x)=" #namespaces PREDEFINED += "CL_NS(sub)=lucene::sub" PREDEFINED += "CL_NS2(sub,sub2)=lucene::sub:sub2" PREDEFINED += "CL_NS_DEF(sub)=namespace lucene{ namespace sub{" PREDEFINED += "CL_NS_DEF2(sub,sub2)=namespace lucene{ namespace sub{ namespace sub2 {" PREDEFINED += "CL_NS_END=}}" PREDEFINED += "CL_NS_END2=}}}" PREDEFINED += "CL_NS_USE(sub)=using namespace lucene::sub" PREDEFINED += "CL_NS_USE2(sub,sub2)=using namespace lucene::sub::sub2" PREDEFINED += "CL_NS_STD(func)=std::func" PREDEFINED += "CL_NS_HASHING(func)=std::func" EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = @CLDOCS_TAGFILE_LOCATION@ ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = @PERL_EXECUTABLE@ #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = @HAVE_DOT@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = @DOXYGEN_DOT_EXECUTABLE@ DOTFILE_DIRS = GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO clucene-core-2.3.3.4/doc/coding standards.txt000066400000000000000000000075051154025176300207550ustar00rootroot00000000000000Coding Style ------------ CLucene follows a hybrid coding style. Because of the nature of the code being a java port, there are naturally some java like syntax. * Never use CL_NS_USE(x) in a header file (use CL_NS(x):: for each class), it defeats the purpose of namespaces. * Use CL_NS_USE(x) in .cpp files if there are more than a few usages of that namespace. Headers: * _headername.h headers are private, and will not be distributed. Don't include these files from public headers. * The shared library is not distributed, except for: SharedHeader.h and clucene-config.h * Keep _ifdef's in public headers to an absolute minimum. * Public headers should contain only classes that are exported (class CLUCENE_EXPORT classname). * All classes should have a destructor, the destructor should be virtual if there is any chance of the class being overridden Documentation: Although CLucene documentation is not complete, it would be nice to see documentation created for new files. We used doxygen to create documentation. 2 basic formats of documentation are: /** documentation must have ** to be included */ void function(); void function2(); //< can also document functions retrospectively by adding < /** * You can also document memory with the special @memory alias. * @memory you must delete data returned from this function using _CLDELETE */ Object createObject(); Cross platform specifics: * Use macros provided in shared project. This applies to data types and functions * static const int32_t x=1; Should be coded as: Use LUCENE_STATIC_CONSTANT (int32_t, x=1). Else it is not portable. * Static objects should not be initialised in the class header. ( class x{ static object a; }; ). This will not work everywhere. Instead use a getter. class x{ static object* a; public: static Object* getA(); static void CLUCENE_LOCAL _shutdown(); }; Then in the implementation code Object* x::a = NULL; Object* x::getA(){ if ( a == NULL ) x::a = _CLNEW Object; return a; } void x::_shutdown(){ _CLDELETE(a); } In CLucene/StdHeader.cpp, add x::_shutdown() to the list _lucene_shutdown function. * This is bad: class x{ LUCENE_STATIC_CONSTANT(int32_t, x=1) void func( int32_t value=x); }; This will fail on some platforms. It is better to do: int32_t value=-1 (-1 should be some logical value, not necessarily -1). then in the implementation, check if -1 and default to the x static constant. * Try and use the functions in util/Array.h instead of Void Map/List functions. Void Map/List will be deprecated for public access * Most compilers don't complain about this (in normal mode), but we require pedantic mode behaviour. Some important things for this are: 1. Initialise variables in correct order as in the class class x{ int a; int b; x(): b(12), a(11) //THIS IS WRONG! a is initialised after b. { } }; Good development tips --------------------- When developing, use the available clucene debugging tools: * _CND_DEBUG - condition debugging, an 'assert' type system (or configure with --enable-cnddebug) Good performance tips: ---------------------- CLucene has a lot of new changes to help improve performance. Some of them are still being tuned... MSVC profiling tutorial: http://webserver.tc.cornell.edu/services/edu/topics/Performance/Profiling/more.asp For GCC see gprof you can enable gprof by configuring with ENABLE_GPROF Developing ---------- When developing, please keep in mind cross-platform issues and also character set issues (unicode/ascii). Hint: To do a quick test to see if the code compiles run this command from the root directory of clucene. It will compile all the CLucene code monolithically. % test-pedantic This will do a quick compile then run all the clucene tests. clucene-core-2.3.3.4/doc/doxygen.css.cmake000066400000000000000000000120301154025176300202400ustar00rootroot00000000000000H1 { text-align: center; font-family: Arial, Helvetica, sans-serif; } H2 { font-family: Geneva, Arial, Helvetica, sans-serif; } CAPTION { font-weight: bold } DIV.qindex { width: 100%; background-color: #eeeeff; border: 4px solid #eeeeff; text-align: center; margin-bottom: 2px } A.qindex { text-decoration: none; font-weight: bold; } A.qindex:hover { text-decoration: none; background-color: #ddddff } A.qindexHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff } A.qindexHL:hover { text-decoration: none; background-color: #6666cc } A.qindexRef { text-decoration: none; font-weight: bold; } A.qindexRef:hover { text-decoration: none; background-color: #ddddff } A.qindexRefHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff } A.qindexRefHL:hover { text-decoration: none; background-color: #6666cc } A.el { text-decoration: none; font-weight: bold } A.elRef { font-weight: bold } A.code { text-decoration: none; font-weight: normal; color: #4444ee } A.codeRef { font-weight: normal; color: #4444ee } A:hover { text-decoration: none; background-color: #f2f2ff } DL.el { margin-left: -1cm } DIV.fragment { width: 98%; border: 1px solid #CCCCCC; background-color: #f5f5f5; padding-left: 4px; margin: 4px; } DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } TD.md { background-color: #f2f2ff; font-weight: bold; } TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } BODY { background: white; color: black; margin-right: 20px; margin-left: 20px; } TD.indexkey { background-color: #eeeeff; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } TD.indexvalue { background-color: #eeeeff; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px } TR.memlist { background-color: #f0f0f0; } P.formulaDsp { text-align: center; } IMG.formulaDsp { } IMG.formulaInl { vertical-align: middle; } SPAN.keyword { color: #008000 } SPAN.keywordtype { color: #604020 } SPAN.keywordflow { color: #e08000 } SPAN.comment { color: #800000 } SPAN.preprocessor { color: #806020 } SPAN.stringliteral { color: #002080 } SPAN.charliteral { color: #008080 } .mdTable { border: 1px solid #868686; background-color: #f2f2ff; } .mdRow { padding: 8px 20px; } .mdescLeft { font-size: smaller; font-family: Arial, Helvetica, sans-serif; background-color: #FAFAFA; padding-left: 8px; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { font-size: smaller; font-family: Arial, Helvetica, sans-serif; font-style: italic; background-color: #FAFAFA; padding-left: 4px; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; padding-bottom: 0px; padding-right: 8px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; } .memItemRight { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 13px; } clucene-core-2.3.3.4/doc/helpfooter.htm.cmake000066400000000000000000000001451154025176300207360ustar00rootroot00000000000000

clucene.sourceforge.net

clucene-core-2.3.3.4/doc/helpheader.htm.cmake000066400000000000000000000010611154025176300206660ustar00rootroot00000000000000 CLucene API Documentation (Version @CPACK_PACKAGE_VERSION@)

CLucene - a full-featured, c++ search engine
API Documentation


clucene-core-2.3.3.4/src/000077500000000000000000000000001154025176300150205ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/000077500000000000000000000000001154025176300174075ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/000077500000000000000000000000001154025176300207255ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/000077500000000000000000000000001154025176300225505ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/LanguageBasedAnalyzer.cpp000066400000000000000000000043411154025176300274460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "LanguageBasedAnalyzer.h" #include "CLucene/analysis/cjk/CJKAnalyzer.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/analysis/standard/StandardTokenizer.h" #include "CLucene/analysis/standard/StandardFilter.h" #include "CLucene/snowball/SnowballFilter.h" CL_NS_USE(util) CL_NS_USE2(analysis,cjk) CL_NS_USE2(analysis,standard) CL_NS_USE2(analysis,snowball) CL_NS_DEF(analysis) LanguageBasedAnalyzer::LanguageBasedAnalyzer(const TCHAR* language, bool stem) { if ( language == NULL ) _tcsncpy(lang,LUCENE_BLANK_STRING,100); else _tcsncpy(lang,language,100); this->stem = stem; } LanguageBasedAnalyzer::~LanguageBasedAnalyzer(){ } void LanguageBasedAnalyzer::setLanguage(const TCHAR* language){ _tcsncpy(lang,language,100); } void LanguageBasedAnalyzer::setStem(bool stem){ this->stem = stem; } TokenStream* LanguageBasedAnalyzer::tokenStream(const TCHAR* fieldName, Reader* reader) { TokenStream* ret = NULL; if ( _tcscmp(lang, _T("cjk"))==0 ){ ret = _CLNEW CL_NS2(analysis,cjk)::CJKTokenizer(reader); }else{ BufferedReader* bufferedReader = reader->__asBufferedReader(); if ( bufferedReader == NULL ) ret = _CLNEW StandardTokenizer( _CLNEW FilteredBufferedReader(reader, false), true ); else ret = _CLNEW StandardTokenizer(bufferedReader); ret = _CLNEW StandardFilter(ret,true); if ( stem ) ret = _CLNEW SnowballFilter(ret,lang, true); //todo: should check whether snowball supports the language if ( stem ) //hmm... this could be configured seperately from stem ret = _CLNEW ISOLatin1AccentFilter(ret, true); //todo: this should really only be applied to latin languages... //lower case after the latin1 filter ret = _CLNEW LowerCaseFilter(ret,true); } //todo: could add a stop filter based on the language - need to fix the stoplist loader first return ret; } CL_NS_END clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/LanguageBasedAnalyzer.h000066400000000000000000000016471154025176300271210ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_languagebasedanalyzer_ #define _lucene_analysis_languagebasedanalyzer_ #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF(analysis) class CLUCENE_CONTRIBS_EXPORT LanguageBasedAnalyzer: public CL_NS(analysis)::Analyzer{ TCHAR lang[100]; bool stem; public: LanguageBasedAnalyzer(const TCHAR* language=NULL, bool stem=true); ~LanguageBasedAnalyzer(); void setLanguage(const TCHAR* language); void setStem(bool stem); TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); }; CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/PorterStemmer.cpp000066400000000000000000000165771154025176300261040ustar00rootroot00000000000000/* This is the Porter stemming algorithm, originally written by Martin Porter. It may be regarded as cononical, in that it follows the algorithm presented in Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14, no. 3, pp 130-137, See also http://www.tartarus.org/~martin/PorterStemmer Modified by "Hemant Muthiyan" email: hemant_muthiyan@yahoo.co.in */ #include "CLucene/_ApiHeader.h" #include "PorterStemmer.h" CL_NS_DEF(analysis) bool PorterStemmer::cons(size_t i) { switch (b[i]) { case 'a': case 'e': case 'i': case 'o': case 'u': return false; case 'y': return (i==k0) ? true : !cons(i-1); default: return true; } } int32_t PorterStemmer::m() { int32_t n = 0; size_t i = k0; while(true) { if (i > j) return n; if (! cons(i)) break; i++; } i++; while(true) { while(true) { if (i > j) return n; if (cons(i)) break; i++; } i++; n++; while(true) { if (i > j) return n; if (! cons(i)) break; i++; } i++; } } bool PorterStemmer::vowelinstem() { for (size_t i = k0; i <= j; i++) if (! cons(i)) return true; return false; } /* doublec(j) is true <=> j,(j-1) contain a double consonant. */ bool PorterStemmer::doublec(size_t j) { if (j < k0+1) return false; if (b[j] != b[j-1]) return false; return cons(j); } /* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonant and also if the second c is not w,x or y. this is used when trying to restore an e at the end of a short word. e.g. cav(e), lov(e), hop(e), crim(e), but snow, box, tray. */ bool PorterStemmer::cvc(size_t i) { if (i < k0+2 || !cons(i) || cons(i-1) || !cons(i-2)) return false; else { int32_t ch = b[i]; if (ch == 'w' || ch == 'x' || ch == 'y') return false; } return true; } bool PorterStemmer::ends(TCHAR *s) { size_t l = _tcslen(s); size_t o = k-l+1; if (o < k0) return false; for (size_t i = 0; i < l; i++) if (b[o+i] != s[i]) return false; j = (l > k) ? 0 : k-l; return true; } void PorterStemmer::setto(const TCHAR *s) { size_t l = _tcslen(s); size_t o = j+1; for (size_t i = 0; i < l; i++) b[o+i] = s[i]; k = j+l; dirty = true; } void PorterStemmer::r(const TCHAR *s) { if (m() > 0) setto(s); } void PorterStemmer::step1() { if (b[k] == _T('s')) { if (ends(_T("sses"))) k -= 2; else if (ends(_T("ies"))) setto(_T("i")); else if (b[k-1] != _T('s')) k--; } if (ends(_T("eed"))) { if (m() > 0) k--; } else if ((ends(_T("ed")) || ends(_T("ing"))) && vowelinstem()) { k = j; if (ends(_T("at"))) setto(_T("ate")); else if (ends(_T("bl"))) setto(_T("ble")); else if (ends(_T("iz"))) setto(_T("ize")); else if (doublec(k)) { int32_t ch = b[k--]; if (ch == _T('l') || ch == _T('s') || ch == _T('z')) k++; } else if (m() == 1 && cvc(k)) setto(_T("e")); } } void PorterStemmer::step2() { if (ends(_T("y")) && vowelinstem()) { b[k] = 'i'; dirty = true; } } void PorterStemmer::step3() { if (k == k0) return; /* For Bug 1 */ switch (b[k-1]) { case 'a': if (ends(_T("ational"))) { r(_T("ate")); break; } if (ends(_T("tional"))) { r(_T("tion")); break; } break; case 'c': if (ends(_T("enci"))) { r(_T("ence")); break; } if (ends(_T("anci"))) { r(_T("ance")); break; } break; case 'e': if (ends(_T("izer"))) { r(_T("ize")); break; } break; case 'l': if (ends(_T("bli"))) { r(_T("ble")); break; } if (ends(_T("alli"))) { r(_T("al")); break; } if (ends(_T("entli"))) { r(_T("ent")); break; } if (ends(_T("eli"))) { r(_T("e")); break; } if (ends(_T("ousli"))) { r(_T("ous")); break; } break; case 'o': if (ends(_T("ization"))) { r(_T("ize")); break; } if (ends(_T("ation"))) { r(_T("ate")); break; } if (ends(_T("ator"))) { r(_T("ate")); break; } break; case 's': if (ends(_T("alism"))) { r(_T("al")); break; } if (ends(_T("iveness"))) { r(_T("ive")); break; } if (ends(_T("fulness"))) { r(_T("ful")); break; } if (ends(_T("ousness"))) { r(_T("ous")); break; } break; case 't': if (ends(_T("aliti"))) { r(_T("al")); break; } if (ends(_T("iviti"))) { r(_T("ive")); break; } if (ends(_T("biliti"))) { r(_T("ble")); break; } break; case 'g': if (ends(_T("logi"))) { r(_T("log")); break; } } } void PorterStemmer::step4() { switch (b[k]) { case 'e': if (ends(_T("icate"))) { r(_T("ic")); break; } if (ends(_T("ative"))) { r(LUCENE_BLANK_STRING); break; } if (ends(_T("alize"))) { r(_T("al")); break; } break; case 'i': if (ends(_T("iciti"))) { r(_T("ic")); break; } break; case 'l': if (ends(_T("ical"))) { r(_T("ic")); break; } if (ends(_T("ful"))) { r(LUCENE_BLANK_STRING); break; } break; case 's': if (ends(_T("ness"))) { r(LUCENE_BLANK_STRING); break; } break; } } void PorterStemmer::step5() { if (k == k0) return; /* for Bug 1 */ switch (b[k-1]) { case 'a': if (ends(_T("al"))) break; return; case 'c': if (ends(_T("ance"))) break; if (ends(_T("ence"))) break; return; case 'e': if (ends(_T("er"))) break; return; case 'i': if (ends(_T("ic"))) break; return; case 'l': if (ends(_T("able"))) break; if (ends(_T("ible"))) break; return; case 'n': if (ends(_T("ant"))) break; if (ends(_T("ement"))) break; if (ends(_T("ment"))) break; /* element etc. not stripped before the m */ if (ends(_T("ent"))) break; return; case 'o': if (ends(_T("ion")) && j >= 0 && (b[j] == 's' || b[j] == 't')) break; /* j >= 0 fixes Bug 2 */ if (ends(_T("ou"))) break; return; /* takes care of -ous */ case 's': if (ends(_T("ism"))) break; return; case 't': if (ends(_T("ate"))) break; if (ends(_T("iti"))) break; return; case 'u': if (ends(_T("ous"))) break; return; case 'v': if (ends(_T("ive"))) break; return; case 'z': if (ends(_T("ize"))) break; return; default: return; } if (m() > 1) k = j; } void PorterStemmer::step6() { j = k; if (b[k] == 'e') { int32_t a = m(); if (a > 1 || a == 1 && !cvc(k-1)) k--; } if (b[k] == 'l' && doublec(k) && m() > 1) k--; } PorterStemmer::PorterStemmer(TCHAR *Text) { b = Text; i = _tcslen(b); dirty = false; } PorterStemmer::~PorterStemmer(){ b = NULL; } int32_t PorterStemmer::getResultLength() { return i; } bool PorterStemmer::stem() { //i = strlen(b); k = i -1; k0 = 0; if (k > k0+1) { step1(); step2(); step3(); step4(); step5(); step6(); } // Also, a word is considered dirty if we lopped off letters // Thanks to Ifigenia Vairelles for pointing this out. if (i != k+1) dirty = true; i = k+1; return dirty; } const TCHAR* PorterStemmer::getResultBuffer() { return b; } CL_NS_END clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/PorterStemmer.h000066400000000000000000000073101154025176300255320ustar00rootroot00000000000000/* This is the Porter stemming algorithm, originally written by Martin Porter. It may be regarded as cononical, in that it follows the algorithm presented in Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14, no. 3, pp 130-137, See also http://www.tartarus.org/~martin/PorterStemmer Modified by "Hemant Muthiyan" email: hemant_muthiyan@yahoo.co.in The Porter stemmer should be regarded as ‘frozen’, that is, strictly defined, and not amenable to further modification. As a stemmer, it is slightly inferior to the Snowball English or Porter2 stemmer, which derives from it, and which is subjected to occasional improvements. For practical work, therefore, the new Snowball stemmer is recommended. The Porter stemmer is appropriate to IR research work involving stemming where the experiments need to be exactly repeatable. */ #ifndef _lucene_analysis_PorterStemmer_ #define _lucene_analysis_PorterStemmer_ CL_NS_DEF(analysis) class CLUCENE_CONTRIBS_EXPORT PorterStemmer { private: TCHAR *b; size_t i, /* offset into b */ j, k, k0; bool dirty; //private static final int32_t EXTRA = 1; /* cons(i) is true <=> b[i] is a consonant. */ private: bool cons(size_t i); /* m() measures the number of consonant sequences between k0 and j. if c is a consonant sequence and v a vowel sequence, and <..> indicates arbitrary presence, gives 0 vc gives 1 vcvc gives 2 vcvcvc gives 3 .... */ int32_t m(); /* vowelinstem() is true <=> k0,...j contains a vowel */ bool vowelinstem(); /* doublec(j) is true <=> j,(j-1) contain a double consonant. */ bool doublec(size_t j); /* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonant and also if the second c is not w,x or y. this is used when trying to restore an e at the end of a short word. e.g. cav(e), lov(e), hop(e), crim(e), but snow, box, tray. */ bool cvc(size_t i); bool ends(TCHAR *s); /* setto(s) sets (j+1),...k to the characters in the string s, readjusting k. */ void setto(const TCHAR *s); /* r(s) is used further down. */ void r(const TCHAR *s); /* step1() gets rid of plurals and -ed or -ing. e.g. caresses -> caress ponies -> poni ties -> ti caress -> caress cats -> cat feed -> feed agreed -> agree disabled -> disable matting -> mat mating -> mate meeting -> meet milling -> mill messing -> mess meetings -> meet */ void step1(); /* step2() turns terminal y to i when there is another vowel in the stem. */ void step2(); /* step3() maps double suffices to single ones. so -ization ( = -ize plus -ation) maps to -ize etc. note that the string before the suffix must give m() > 0. */ void step3(); /* step4() deals with -ic-, -full, -ness etc. similar strategy to step3. */ void step4(); /* step5() takes off -ant, -ence etc., in context vcvc. */ void step5(); /* step6() removes a final -e if m() > 1. */ void step6(); public: PorterStemmer(TCHAR *Text); ~PorterStemmer(); /** * Returns the length of the word resulting from the stemming process. */ int32_t getResultLength(); bool stem(); /** * Returns a reference to a character buffer containing the results of * the stemming process. You also need to consult getResultLength() * to determine the length of the result. */ const TCHAR* getResultBuffer(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/cjk/000077500000000000000000000000001154025176300233175ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/cjk/CJKAnalyzer.cpp000066400000000000000000000136551154025176300261520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CJKAnalyzer.h" #include "CLucene/util/CLStreams.h" CL_NS_DEF2(analysis,cjk) CL_NS_USE(analysis) CL_NS_USE(util) const TCHAR* CJKTokenizer::tokenTypeSingle = _T("single"); const TCHAR* CJKTokenizer::tokenTypeDouble = _T("double"); CJKTokenizer::CJKTokenizer(Reader* in): Tokenizer(in) { tokenType = Token::getDefaultType(); offset = 0; bufferIndex = 0; dataLen = 0; preIsTokened = false; ignoreSurrogates = true; } CL_NS(analysis)::Token* CJKTokenizer::next(Token* token){ /** how many character(s) has been stored in buffer */ int32_t length = 0; /** the position used to create Token */ int32_t start = offset; while (true) { /** current character */ clunichar c; int charlen = 1; offset++; if (bufferIndex >= dataLen) { dataLen = input->read(ioBuffer, 1, LUCENE_IO_BUFFER_SIZE); bufferIndex = 0; } if (dataLen == -1) { if (length > 0) { if (preIsTokened == true) { length = 0; preIsTokened = false; } break; } else { return NULL; } } else { //get current character c = ioBuffer[bufferIndex++]; } //to support surrogates, we'll need to convert the incoming utf16 into //ucs4(c variable). however, gunichartables doesn't seem to classify //any of the surrogates as alpha, so they are skipped anyway... //so for now we just convert to ucs4 so that we dont corrupt the input. if ( c >= 0xd800 || c <= 0xdfff ){ clunichar c2 = ioBuffer[bufferIndex]; if ( c2 >= 0xdc00 && c2 <= 0xdfff ){ bufferIndex++; offset++; charlen=2; c = (((c & 0x03ffL) << 10) | ((c2 & 0x03ffL) << 0)) + 0x00010000L; } } //if the current character is ASCII or Extend ASCII if ((c <= 0xFF) //is BASIC_LATIN || (c>=0xFF00 && c<=0xFFEF) //ascii >0x74 cast to unsigned... ) { if (c >= 0xFF00) { //todo: test this... only happens on platforms where char is signed, i think... /** convert HALFWIDTH_AND_FULLWIDTH_FORMS to BASIC_LATIN */ c -= 0xFEE0; } // if the current character is a letter or "_" "+" "#" if (_istalnum(c) || ((c == '_') || (c == '+') || (c == '#')) ) { if (length == 0) { // "javaC1C2C3C4linux"
// ^--: the current character begin to token the ASCII // letter start = offset - 1; } else if (tokenType == tokenTypeDouble) { // "javaC1C2C3C4linux"
// ^--: the previous non-ASCII // : the current character offset-=charlen; bufferIndex-=charlen; tokenType = tokenTypeSingle; if (preIsTokened == true) { // there is only one non-ASCII has been stored length = 0; preIsTokened = false; break; } else { break; } } // store the LowerCase(c) in the buffer buffer[length++] = _totlower((TCHAR)c); tokenType = tokenTypeSingle; // break the procedure if buffer overflowed! if (length == LUCENE_MAX_WORD_LEN) { break; } } else if (length > 0) { if (preIsTokened == true) { length = 0; preIsTokened = false; } else { break; } } } else { // non-ASCII letter, eg."C1C2C3C4" if ( _istalpha(c) || (!ignoreSurrogates && c>=0x10000) ) { if (length == 0) { start = offset - 1; if ( c < 0x00010000L ) buffer[length++] = (TCHAR)c; else{ clunichar ucs4 = c - 0x00010000L; buffer[length++] = (TCHAR)((ucs4 >> 10) & 0x3ff) | 0xd800; buffer[length++] = (TCHAR)((ucs4 >> 0) & 0x3ff) | 0xdc00; } tokenType = tokenTypeDouble; } else { if (tokenType == tokenTypeSingle) { offset-=charlen; bufferIndex-=charlen; //return the previous ASCII characters break; } else { if ( c < 0x00010000L ) buffer[length++] = (TCHAR)c; else{ clunichar ucs4 = c - 0x00010000L; buffer[length++] = (TCHAR)((ucs4 >> 10) & 0x3ff) | 0xd800; buffer[length++] = (TCHAR)((ucs4 >> 0) & 0x3ff) | 0xdc00; } tokenType = tokenTypeDouble; if (length >= 2) { offset-=charlen; bufferIndex-=charlen; preIsTokened = true; break; } } } } else if (length > 0) { if (preIsTokened == true) { // empty the buffer length = 0; preIsTokened = false; } else { break; } } } } buffer[length]='\0'; token->set(buffer,start, start+length, tokenType); return token; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/cjk/CJKAnalyzer.h000066400000000000000000000056231154025176300256130ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_cjk_cjkanalyzer_ #define _lucene_analysis_cjk_cjkanalyzer_ #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF2(analysis,cjk) /** * CJKTokenizer was modified from StopTokenizer which does a decent job for * most European languages. It performs other token methods for double-byte * Characters: the token will return at each two charactors with overlap match.
* Example: "java C1C2C3C4" will be segment to: "java" "C1C2" "C2C3" "C3C4" it * also need filter filter zero length token ""
* for Digit: digit, '+', '#' will token as letter
* for more info on Asia language(Chinese Japanese Korean) text segmentation: * please search google * * @author Che, Dong */ class CLUCENE_CONTRIBS_EXPORT CJKTokenizer: public CL_NS(analysis)::Tokenizer { private: /** word offset, used to imply which character(in ) is parsed */ int32_t offset; /** the index used only for ioBuffer */ int32_t bufferIndex; /** data length */ int32_t dataLen; /** * character buffer, store the characters which are used to compose
* the returned Token */ TCHAR buffer[LUCENE_MAX_WORD_LEN]; /** * I/O buffer, used to store the content of the input(one of the
* members of Tokenizer) */ const TCHAR* ioBuffer; /** word type: single=>ASCII double=>non-ASCII word=>default */ const TCHAR* tokenType; static const TCHAR* tokenTypeSingle; static const TCHAR* tokenTypeDouble; /** * tag: previous character is a cached double-byte character "C1C2C3C4" * ----(set the C1 isTokened) C1C2 "C2C3C4" ----(set the C2 isTokened) * C1C2 C2C3 "C3C4" ----(set the C3 isTokened) "C1C2 C2C3 C3C4" */ bool preIsTokened; bool ignoreSurrogates; public: /** * Construct a token stream processing the given input. * * @param in I/O reader */ CJKTokenizer(CL_NS(util)::Reader* in); /** * Returns the next token in the stream, or null at EOS. * See http://java.sun.com/j2se/1.3/docs/api/java/lang/Character.UnicodeBlock.html * for detail. * * @return Token * * @throws java.io.IOException - throw IOException when read error
* hanppened in the InputStream * */ CL_NS(analysis)::Token* next(CL_NS(analysis)::Token* token); bool getIgnoreSurrogates(){ return ignoreSurrogates; }; void setIgnoreSurrogates(bool ignoreSurrogates){ this->ignoreSurrogates = ignoreSurrogates; }; }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/000077500000000000000000000000001154025176300231405ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/GermanAnalyzer.cpp000066400000000000000000000130231154025176300265620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/util/CLStreams.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/analysis/standard/StandardTokenizer.h" #include "CLucene/analysis/standard/StandardFilter.h" #include "CLucene/util/StringBuffer.h" #include "GermanAnalyzer.h" #include "GermanStemmer.h" #include "GermanStemFilter.h" CL_NS_USE(analysis) CL_NS_USE2(analysis,de) CL_NS_USE2(analysis,standard) const TCHAR GermanAnalyzer_DASZ[] = { 0x64, 0x61, 0xdf }; const TCHAR GermanAnalyzer_FUER[] = { 0x66, 0xfc, 0x72 }; const TCHAR* GermanAnalyzer_GERMAN_STOP_WORDS[] = { _T("einer"), _T("eine"), _T("eines"), _T("einem"), _T("einen"), _T("der"), _T("die"), _T("das"), _T("dass"), GermanAnalyzer_DASZ, _T("du"), _T("er"), _T("sie"), _T("es"), _T("was"), _T("wer"), _T("wie"), _T("wir"), _T("und"), _T("oder"), _T("ohne"), _T("mit"), _T("am"), _T("im"),_T("in"), _T("aus"), _T("auf"), _T("ist"), _T("sein"), _T("war"), _T("wird"), _T("ihr"), _T("ihre"), _T("ihres"), _T("als"), GermanAnalyzer_FUER, _T("von"), _T("mit"), _T("dich"), _T("dir"), _T("mich"), _T("mir"), _T("mein"), _T("sein"), _T("kein"), _T("durch"), _T("wegen"), _T("wird") }; CL_NS(util)::ConstValueArray GermanAnalyzer::GERMAN_STOP_WORDS( GermanAnalyzer_GERMAN_STOP_WORDS, 48 ); class GermanAnalyzer::SavedStreams : public TokenStream { public: StandardTokenizer* tokenStream; TokenStream* filteredTokenStream; SavedStreams():tokenStream(NULL), filteredTokenStream(NULL) { } void close(){} Token* next(Token* token) {return NULL;} }; GermanAnalyzer::GermanAnalyzer() { exclusionSet = NULL; stopSet = _CLNEW CLTCSetList; StopFilter::fillStopTable(stopSet, GERMAN_STOP_WORDS.values); } GermanAnalyzer::GermanAnalyzer(const TCHAR** stopwords) { exclusionSet = NULL; stopSet = _CLNEW CLTCSetList; StopFilter::fillStopTable(stopSet, stopwords); } GermanAnalyzer::GermanAnalyzer(CL_NS(analysis)::CLTCSetList* stopwords) { exclusionSet = NULL; stopSet = stopwords; } GermanAnalyzer::GermanAnalyzer(const char* stopwordsFile, const char* enc) { exclusionSet = NULL; stopSet = WordlistLoader::getWordSet(stopwordsFile, enc); } GermanAnalyzer::GermanAnalyzer(CL_NS(util)::Reader* stopwordsReader, const bool deleteReader) { exclusionSet = NULL; stopSet = WordlistLoader::getWordSet(stopwordsReader, NULL, deleteReader); } GermanAnalyzer::~GermanAnalyzer() { _CLLDELETE(stopSet); _CLLDELETE(exclusionSet); } void GermanAnalyzer::setStemExclusionTable(const TCHAR** exclusionlist) { if (exclusionSet != NULL) { exclusionSet->clear(); } else { exclusionSet = _CLNEW CLTCSetList; } CL_NS(analysis)::StopFilter::fillStopTable(exclusionSet, exclusionlist); } void GermanAnalyzer::setStemExclusionTable(CL_NS(analysis)::CLTCSetList* exclusionlist) { if (exclusionSet != exclusionlist) { _CLLDELETE(exclusionSet); exclusionSet = exclusionlist; } } void GermanAnalyzer::setStemExclusionTable(const char* exclusionlistFile, const char* enc) { exclusionSet = WordlistLoader::getWordSet(exclusionlistFile, enc, exclusionSet); } void GermanAnalyzer::setStemExclusionTable(CL_NS(util)::Reader* exclusionlistReader, const bool deleteReader) { exclusionSet = WordlistLoader::getWordSet(exclusionlistReader, exclusionSet, deleteReader); } TokenStream* GermanAnalyzer::tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { TokenStream* result; CL_NS(util)::BufferedReader* bufferedReader = reader->__asBufferedReader(); if ( bufferedReader == NULL ) result = _CLNEW StandardTokenizer( _CLNEW CL_NS(util)::FilteredBufferedReader(reader, false), true ); else result = _CLNEW StandardTokenizer(bufferedReader); result = _CLNEW StandardFilter(result, true); result = _CLNEW LowerCaseFilter(result, true); result = _CLNEW StopFilter(result, true, stopSet); result = _CLNEW GermanStemFilter(result, true, exclusionSet); return result; } TokenStream* GermanAnalyzer::reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { SavedStreams* streams = reinterpret_cast(getPreviousTokenStream()); if (streams == NULL) { streams = _CLNEW SavedStreams(); CL_NS(util)::BufferedReader* bufferedReader = reader->__asBufferedReader(); if ( bufferedReader == NULL ) streams->tokenStream = _CLNEW StandardTokenizer( _CLNEW CL_NS(util)::FilteredBufferedReader(reader, false), true ); else streams->tokenStream = _CLNEW StandardTokenizer(bufferedReader); streams->filteredTokenStream = _CLNEW StandardFilter(streams->tokenStream, true); streams->filteredTokenStream = _CLNEW LowerCaseFilter(streams->filteredTokenStream, true); streams->filteredTokenStream = _CLNEW StopFilter(streams->filteredTokenStream, true, stopSet); streams->filteredTokenStream = _CLNEW GermanStemFilter(streams->filteredTokenStream, true, exclusionSet); setPreviousTokenStream(streams); } else streams->tokenStream->reset(reader); return streams->filteredTokenStream; } clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/GermanAnalyzer.h000066400000000000000000000061141154025176300262320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_de_GermanAnalyzer #define _lucene_analysis_de_GermanAnalyzer CL_NS_DEF2(analysis,de) /** * Analyzer for German language. Supports an external list of stopwords (words that * will not be indexed at all) and an external list of exclusions (word that will * not be stemmed, but indexed). * A default set of stopwords is used unless an alternative list is specified, the * exclusion list is empty by default. * * * @version $Id: GermanAnalyzer.java 564236 2007-08-09 15:21:19Z gsingers $ */ class CLUCENE_CONTRIBS_EXPORT GermanAnalyzer : public CL_NS(analysis)::Analyzer { public: /** * List of typical german stopwords. */ static CL_NS(util)::ConstValueArray GERMAN_STOP_WORDS; private: class SavedStreams; /** * Contains the stopwords used with the StopFilter. */ CL_NS(analysis)::CLTCSetList* stopSet; /** * Contains words that should be indexed but not stemmed. */ CL_NS(analysis)::CLTCSetList* exclusionSet; public: /** * Builds an analyzer with the default stop words * (GERMAN_STOP_WORDS). */ GermanAnalyzer(); /** * Builds an analyzer with the given stop words. */ GermanAnalyzer(const TCHAR** stopWords); /** * Builds an analyzer with the given stop words. */ GermanAnalyzer(CL_NS(analysis)::CLTCSetList* stopwords); /** * Builds an analyzer with the given stop words. */ GermanAnalyzer(const char* stopwordsFile, const char* enc = NULL); /** * Builds an analyzer with the given stop words. */ GermanAnalyzer(CL_NS(util)::Reader* stopwordsReader, const bool deleteReader = false); /** */ virtual ~GermanAnalyzer(); /** * Builds an exclusionlist from an array of Strings. */ void setStemExclusionTable(const TCHAR** exclusionlist); /** * Builds an exclusionlist from a Hashtable. */ void setStemExclusionTable(CL_NS(analysis)::CLTCSetList* exclusionlist); /** * Builds an exclusionlist from the words contained in the given file. */ void setStemExclusionTable(const char* exclusionlistFile, const char* enc = NULL); /** * Builds an exclusionlist from the words contained in the given file. */ void setStemExclusionTable(CL_NS(util)::Reader* exclusionlistReader, const bool deleteReader = false); /** * Creates a TokenStream which tokenizes all the text in the provided Reader. * * @return A TokenStream build from a StandardTokenizer filtered with * StandardFilter, LowerCaseFilter, StopFilter, GermanStemFilter */ virtual TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); virtual TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/GermanStemFilter.cpp000066400000000000000000000037441154025176300270640ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/util/StringBuffer.h" #include "GermanStemmer.h" #include "GermanStemFilter.h" CL_NS_USE(analysis) CL_NS_USE2(analysis,de) GermanStemFilter::GermanStemFilter(TokenStream* in, bool deleteTS) : TokenFilter(in, deleteTS) { stemmer = _CLNEW GermanStemmer(); exclusionSet = NULL; } GermanStemFilter::GermanStemFilter(TokenStream* in, bool deleteTS, CLTCSetList* exclusionSet) : TokenFilter(in, deleteTS) { stemmer = _CLNEW GermanStemmer(); this->exclusionSet = exclusionSet; } Token* GermanStemFilter::next(Token* t) { if (input->next(t) == NULL) { return NULL; } else if (exclusionSet != NULL && exclusionSet->find(t->termBuffer()) != exclusionSet->end()) { // Check the exclusiontable return t; } else { TCHAR* s = stemmer->stem(t->termBuffer(), t->termLength()); // If not stemmed, dont waste the time creating a new token if (_tcscmp(s, t->termBuffer()) != 0) { t->setText(s); } return t; } } void GermanStemFilter::setStemmer(GermanStemmer* stemmer) { if (stemmer != NULL && this->stemmer != stemmer) { _CLLDELETE(this->stemmer); this->stemmer = stemmer; } } /** * Set an alternative exclusion list for this filter. */ void GermanStemFilter::setExclusionSet(CLTCSetList* exclusionSet) { if (this->exclusionSet != exclusionSet) { _CLLDELETE(exclusionSet); this->exclusionSet = exclusionSet; } } clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/GermanStemFilter.h000066400000000000000000000031711154025176300265230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_de_GermanStemFilter #define _lucene_analysis_de_GermanStemFilter CL_NS_DEF2(analysis,de) /** * A filter that stems German words. It supports a table of words that should * not be stemmed at all. The stemmer used can be changed at runtime after the * filter object is created (as long as it is a GermanStemmer). */ class CLUCENE_CONTRIBS_EXPORT GermanStemFilter : public CL_NS(analysis)::TokenFilter { private: /** * The actual token in the input stream. */ CL_NS(analysis)::Token* token; GermanStemmer* stemmer; CL_NS(analysis)::CLTCSetList* exclusionSet; public: GermanStemFilter(TokenStream* in, bool deleteTS = false); /** * Builds a GermanStemFilter that uses an exclusiontable. */ GermanStemFilter(TokenStream* in, bool deleteTS, CL_NS(analysis)::CLTCSetList* exclusionSet); /** * @return Returns the next token in the stream, or null at EOS */ virtual Token* next(Token* t); /** * Set a alternative/custom GermanStemmer for this filter. */ void setStemmer(GermanStemmer* stemmer); /** * Set an alternative exclusion list for this filter. */ void setExclusionSet(CL_NS(analysis)::CLTCSetList* exclusionSet); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/GermanStemmer.cpp000066400000000000000000000162331154025176300264170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/util/StringBuffer.h" #include "GermanStemmer.h" CL_NS_USE(util) CL_NS_USE2(analysis,de) GermanStemmer::GermanStemmer() : sb() { } TCHAR* GermanStemmer::stem(const TCHAR* term, size_t length) { if (length < 0) { length = _tcslen(term); } // Reset the StringBuffer. sb.clear(); sb.append(term, length); if (!isStemmable(sb.getBuffer(), sb.length())) return sb.giveBuffer(); // Stemming starts here... substitute(sb); strip(sb); optimize(sb); resubstitute(sb); removeParticleDenotion(sb); return sb.giveBuffer(); } bool GermanStemmer::isStemmable(const TCHAR* term, size_t length) const { if (length < 0) { length = _tcslen(term); } for (size_t c = 0; c < length; c++) { if (_istalpha(term[c]) == 0) return false; } return true; } void GermanStemmer::strip(StringBuffer& buffer) { bool doMore = true; while ( doMore && buffer.length() > 3 ) { if ( ( buffer.length() + substCount > 5 ) && buffer.substringEquals( buffer.length() - 2, buffer.length(), _T("nd"), 2 ) ) { buffer.deleteChars( buffer.length() - 2, buffer.length() ); } else if ( ( buffer.length() + substCount > 4 ) && buffer.substringEquals( buffer.length() - 2, buffer.length(), _T("em"), 2 ) ) { buffer.deleteChars( buffer.length() - 2, buffer.length() ); } else if ( ( buffer.length() + substCount > 4 ) && buffer.substringEquals( buffer.length() - 2, buffer.length(), _T("er"), 2 ) ) { buffer.deleteChars( buffer.length() - 2, buffer.length() ); } else if ( buffer.charAt( buffer.length() - 1 ) == _T('e') ) { buffer.deleteCharAt( buffer.length() - 1 ); } else if ( buffer.charAt( buffer.length() - 1 ) == _T('s') ) { buffer.deleteCharAt( buffer.length() - 1 ); } else if ( buffer.charAt( buffer.length() - 1 ) == _T('n') ) { buffer.deleteCharAt( buffer.length() - 1 ); } // "t" occurs only as suffix of verbs. else if ( buffer.charAt( buffer.length() - 1 ) == _T('t') ) { buffer.deleteCharAt( buffer.length() - 1 ); } else { doMore = false; } } } void GermanStemmer::optimize(StringBuffer& buffer) { // Additional step for female plurals of professions and inhabitants. if ( buffer.length() > 5 && buffer.substringEquals( buffer.length() - 5, buffer.length(), _T("erin*"), 5 ) ) { buffer.deleteCharAt( buffer.length() -1 ); strip( buffer ); } // Additional step for irregular plural nouns like "Matrizen -> Matrix". if ( buffer.charAt( buffer.length() - 1 ) == ( _T('z') ) ) { buffer.setCharAt( buffer.length() - 1, _T('x') ); } } void GermanStemmer::removeParticleDenotion(StringBuffer& buffer) { if ( buffer.length() > 4 ) { for ( size_t c = 0; c < buffer.length() - 3; c++ ) { if ( buffer.substringEquals( c, c + 4, _T("gege"), 4 ) ) { buffer.deleteChars( c, c + 2 ); return; } } } } void GermanStemmer::substitute(StringBuffer& buffer) { substCount = 0; for ( size_t i = 0; i < buffer.length(); i++ ) { #ifdef _UCS2 TCHAR c = buffer.charAt(i); #else unsigned char c = buffer.charAt(i); #endif // Replace the second char of a pair of the equal characters with an asterisk if ( i > 0 && c == buffer.charAt ( i - 1 ) ) { buffer.setCharAt( i, _T('*') ); } // Substitute Umlauts. else if ( c == 0xe4 ) { buffer.setCharAt( i, _T('a') ); } else if ( c == 0xf6 ) { buffer.setCharAt( i, _T('o') ); } else if ( c == 0xfc ) { buffer.setCharAt( i, _T('u') ); } // Fix bug so that 'ß' at the end of a word is replaced. else if ( c == 0xdf ) { buffer.setCharAt( i, _T('s') ); buffer.insert( i + 1, _T('s') ); substCount++; } // Take care that at least one character is left left side from the current one if ( i < buffer.length() - 1 ) { // Masking several common character combinations with an token if ( ( i < buffer.length() - 2 ) && c == _T('s') && buffer.charAt( i + 1 ) == _T('c') && buffer.charAt( i + 2 ) == _T('h') ) { buffer.setCharAt( i, _T('$') ); buffer.deleteChars( i + 1, i + 3 ); substCount =+ 2; } else if ( c == _T('c') && buffer.charAt( i + 1 ) == _T('h') ) { buffer.setCharAt( i, 0xa7 ); // section sign in UTF-16 buffer.deleteCharAt( i + 1 ); substCount++; } else if ( c == _T('e') && buffer.charAt( i + 1 ) == _T('i') ) { buffer.setCharAt( i, _T('%') ); buffer.deleteCharAt( i + 1 ); substCount++; } else if ( c == _T('i') && buffer.charAt( i + 1 ) == _T('e') ) { buffer.setCharAt( i, _T('&') ); buffer.deleteCharAt( i + 1 ); substCount++; } else if ( c == _T('i') && buffer.charAt( i + 1 ) == _T('g') ) { buffer.setCharAt( i, _T('#') ); buffer.deleteCharAt( i + 1 ); substCount++; } else if ( c == _T('s') && buffer.charAt( i + 1 ) == _T('t') ) { buffer.setCharAt( i, _T('!') ); buffer.deleteCharAt( i + 1 ); substCount++; } } } } void GermanStemmer::resubstitute(StringBuffer& buffer) { for ( size_t i = 0; i < buffer.length(); i++ ) { #ifdef _UCS2 TCHAR c = buffer.charAt(i); #else unsigned char c = buffer.charAt(i); #endif if ( c == _T('*') ) { buffer.setCharAt( i, buffer.charAt( i - 1 ) ); } else if ( c == _T('$') ) { buffer.setCharAt( i, 's' ); buffer.insert( i + 1, _T("ch"), 2 ); } else if ( c == 0xa7 ) { // section sign in UTF-16 buffer.setCharAt( i, _T('c') ); buffer.insert( i + 1, _T('h') ); } else if ( c == _T('%') ) { buffer.setCharAt( i, _T('e') ); buffer.insert( i + 1, _T('i') ); } else if ( c == _T('&') ) { buffer.setCharAt( i, _T('i') ); buffer.insert( i + 1, _T('e') ); } else if ( c == _T('#') ) { buffer.setCharAt( i, _T('i') ); buffer.insert( i + 1, _T('g') ); } else if ( c == _T('!') ) { buffer.setCharAt( i, _T('s') ); buffer.insert( i + 1, _T('t') ); } } } clucene-core-2.3.3.4/src/contribs-lib/CLucene/analysis/de/GermanStemmer.h000066400000000000000000000060121154025176300260560ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_de_GermanStemmer #define _lucene_analysis_de_GermanStemmer CL_CLASS_DEF(util,StringBuffer) CL_NS_DEF2(analysis,de) /** * A stemmer for German words. The algorithm is based on the report * "A Fast and Simple Stemming Algorithm for German Words" by Jörg * Caumanns (joerg.caumanns at isst.fhg.de). */ class CLUCENE_CONTRIBS_EXPORT GermanStemmer { private: /** * Buffer for the terms while stemming them. */ CL_NS(util)::StringBuffer sb; /** * Amount of characters that are removed with substitute() while stemming. */ int substCount; public: /** */ GermanStemmer(); /** * Stemms the given term to an unique discriminator. * * @param term The term that should be stemmed. * @return Discriminator for term */ TCHAR* stem(const TCHAR* term, size_t length = -1); private: /** * Checks if a term could be stemmed. * * @return true if, and only if, the given term consists in letters. */ bool isStemmable(const TCHAR* term, size_t length = -1) const; /** * suffix stripping (stemming) on the current term. The stripping is reduced * to the seven "base" suffixes "e", "s", "n", "t", "em", "er" and * "nd", * from which all regular suffixes are build of. The simplification causes * some overstemming, and way more irregular stems, but still provides unique. * discriminators in the most of those cases. * The algorithm is context free, except of the length restrictions. */ void strip(CL_NS(util)::StringBuffer& buffer); /** * Does some optimizations on the term. This optimisations are * contextual. */ void optimize(CL_NS(util)::StringBuffer& buffer); /** * Removes a particle denotion ("ge") from a term. */ void removeParticleDenotion(CL_NS(util)::StringBuffer& buffer); /** * Do some substitutions for the term to reduce overstemming: * * - Substitute Umlauts with their corresponding vowel: äöü -> aou, * "ß" is substituted by "ss" * - Substitute a second char of a pair of equal characters with * an asterisk: ?? -> ?* * - Substitute some common character combinations with a token: * sch/ch/ei/ie/ig/st -> $/§/%/&/#/! */ void substitute(CL_NS(util)::StringBuffer& buffer); /** * Undoes the changes made by substitute(). That are character pairs and * character combinations. Umlauts will remain as their corresponding vowel, * as "ß" remains as "ss". */ void resubstitute(CL_NS(util)::StringBuffer& buffer); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/000077500000000000000000000000001154025176300232235ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Encoder.cpp000066400000000000000000000012431154025176300253060ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "Encoder.h" clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Encoder.h000066400000000000000000000024631154025176300247600ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_encoder_ #define _lucene_search_highlight_encoder_ CL_NS_DEF2(search,highlight) /** * Encodes original text. The Encoder works with the Formatter to generate the output. * */ class CLUCENE_CONTRIBS_EXPORT Encoder:LUCENE_BASE { public: /** Virtual destructor */ virtual ~Encoder(){ } /** * @param originalText The section of text being output */ virtual TCHAR* encodeText(TCHAR* originalText) = 0; }; /** * Simple {@link Encoder} implementation that does not modify the output * @author Nicko Cadell * */ class DefaultEncoder: public Encoder { public: TCHAR* encodeText(TCHAR* originalText) { return STRDUP_TtoT(originalText); } }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Formatter.cpp000066400000000000000000000012441154025176300256730ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "Formatter.h" clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Formatter.h000066400000000000000000000024771154025176300253510ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_formatter_ #define _lucene_search_highlight_formatter_ CL_NS_DEF2(search,highlight) class TokenGroup; /** * Processes terms found in the original text, typically by applying some form * of mark-up to highlight terms in HTML search results pages. * */ class CLUCENE_CONTRIBS_EXPORT Formatter:LUCENE_BASE { public: /** Virtual destructor */ virtual ~Formatter(){ } /** * @param originalText The section of text being considered for markup * @param tokenGroup contains one or several overlapping Tokens along with * their scores and positions. */ virtual TCHAR* highlightTerm(const TCHAR* originalTermText, const TokenGroup* tokenGroup) = 0; }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Fragmenter.cpp000066400000000000000000000012461154025176300260240ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "Fragmenter.h" clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Fragmenter.h000066400000000000000000000026571154025176300255000ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_fragmenter_ #define _lucene_search_highlight_fragmenter_ CL_CLASS_DEF(analysis, Token) CL_NS_DEF2(search,highlight) /** * Implements the policy for breaking text into multiple fragments for consideration * by the {@link Highlighter} class. A sophisticated implementation may do this on the basis * of detecting end of sentences in the text. */ class CLUCENE_CONTRIBS_EXPORT Fragmenter:LUCENE_BASE { public: /** Virtual destructor */ virtual ~Fragmenter(){ } /** * Initializes the Fragmenter * @param originalText */ virtual void start(const TCHAR* originalText) = 0; /** * Test to see if this token from the stream should be held in a new TextFragment * @param nextToken */ virtual bool isNewFragment(const CL_NS(analysis)::Token * nextToken) = 0; }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/HighlightScorer.h000066400000000000000000000033671154025176300264720ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_highlighterscorer_ #define _lucene_search_highlight_highlighterscorer_ CL_CLASS_DEF(analysis, Token) //#include "TextFragment.h" CL_NS_DEF2(search,highlight) class TextFragment; /** * Adds to the score for a fragment based on its tokens */ class CLUCENE_CONTRIBS_EXPORT HighlightScorer:LUCENE_BASE { public: virtual ~HighlightScorer(){ } /** * called when a new fragment is started for consideration * @param newFragment */ virtual void startFragment(TextFragment* newFragment) = 0; /** * Called for each token in the current fragment * @param token The token to be scored * @return a score which is passed to the Highlighter class to influence the mark-up of the text * (this return value is NOT used to score the fragment) */ virtual float_t getTokenScore(CL_NS(analysis)::Token* token) = 0; /** * Called when the highlighter has no more tokens for the current fragment - the scorer returns * the weighting it has derived for the most recent fragment, typically based on the tokens * passed to getTokenScore(). * */ virtual float_t getFragmentScore() = 0; }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Highlighter.cpp000066400000000000000000000341041154025176300261670ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "Highlighter.h" #include "TokenGroup.h" #include "Encoder.h" #include "Scorer.h" #include "Formatter.h" #include "HighlightScorer.h" #include "Fragmenter.h" #include "TextFragment.h" #include "SimpleFragmenter.h" #include "SimpleHTMLFormatter.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/util/PriorityQueue.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/CLStreams.h" CL_NS_DEF2(search,highlight) CL_NS_USE(analysis) CL_NS_USE(util) class FragmentQueue : public CL_NS(util)::PriorityQueue > { public: FragmentQueue(int32_t size) { initialize(size, true); } protected: bool lessThan(TextFragment * fragA, TextFragment * fragB) { if (fragA->getScore() == fragB->getScore()) return fragA->getFragNum() > fragB->getFragNum(); else return fragA->getScore() < fragB->getScore(); } }; Highlighter::Highlighter(HighlightScorer * fragmentScorer): delete_textFragmenter(true), delete_fragmentScorer(false), delete_formatter(true), delete_encoder(true) { maxDocBytesToAnalyze = DEFAULT_MAX_DOC_BYTES_TO_ANALYZE; _textFragmenter = _CLNEW SimpleFragmenter(); _fragmentScorer = fragmentScorer; _formatter = _CLNEW SimpleHTMLFormatter(); _encoder = _CLNEW DefaultEncoder(); } Highlighter::Highlighter(Formatter * formatter, HighlightScorer * fragmentScorer): delete_textFragmenter(true), delete_fragmentScorer(false), delete_formatter(false), delete_encoder(true) { maxDocBytesToAnalyze = DEFAULT_MAX_DOC_BYTES_TO_ANALYZE; _textFragmenter = _CLNEW SimpleFragmenter(); _fragmentScorer = fragmentScorer; _formatter = formatter; _encoder = _CLNEW DefaultEncoder(); } Highlighter::Highlighter(Formatter * formatter, Encoder* encoder, HighlightScorer * fragmentScorer): delete_textFragmenter(true), delete_fragmentScorer(false), delete_formatter(false), delete_encoder(false) { maxDocBytesToAnalyze = DEFAULT_MAX_DOC_BYTES_TO_ANALYZE; _textFragmenter = _CLNEW SimpleFragmenter(); _fragmentScorer = fragmentScorer; _formatter = formatter; _encoder = encoder; } Highlighter::~Highlighter() { if ( delete_textFragmenter ) _CLDELETE ( _textFragmenter ); if ( delete_fragmentScorer ) _CLDELETE(_fragmentScorer); if( delete_formatter ) _CLDELETE(_formatter); if ( delete_encoder ) _CLDELETE(_encoder); } TCHAR* Highlighter::getBestFragment(TokenStream * tokenStream, const TCHAR* text) { TCHAR** results = getBestFragments(tokenStream,text, 1); TCHAR* result = 0; if (results[0] != NULL ) result = stringDuplicate(results[0]); _CLDELETE_CARRAY_ALL(results); return result; } /** * Highlights chosen terms in a text, extracting the most relevant section. * This is a convenience method that calls * {@link #getBestFragment(TokenStream, const TCHAR*)} * * @param analyzer the analyzer that will be used to split text * into chunks * @param text text to highlight terms in * @param fieldName Name of field used to influence analyzer's tokenization policy * * @return highlighted text fragment or NULL if no terms found */ TCHAR* Highlighter::getBestFragment(Analyzer* analyzer, const TCHAR* fieldName, const TCHAR* text) { TokenStream* tokenStream = analyzer->tokenStream(fieldName, _CLNEW StringReader(text)); return getBestFragment(tokenStream, text); } TCHAR** Highlighter::getBestFragments( TokenStream * tokenStream, const TCHAR* text, int32_t maxNumFragments) { maxNumFragments = cl_max((int32_t)1, maxNumFragments); //sanity check StringBuffer buffer; TextFragment** frags = getBestTextFragments(&buffer,tokenStream,text, true,maxNumFragments); //Get text std::vector fragTexts; for (uint32_t i=0; frags[i]!=NULL; i++) { TextFragment* f = frags[i]; if ((f != NULL) && (f->getScore() > 0)) { fragTexts.push_back(f->toString(&buffer)); } _CLDELETE(f); } _CLDELETE_ARRAY(frags); size_t l = fragTexts.size(); TCHAR** ret = _CL_NEWARRAY(TCHAR*,l+1); for ( size_t j=0;j 0) { result.append(separator); } result.append(sections[i]); } _CLDELETE_CARRAY_ALL(sections); return result.toString(); } TextFragment** Highlighter::getBestTextFragments( StringBuffer* writeTo, TokenStream * tokenStream, const TCHAR* text, bool mergeContiguousFragments, int32_t maxNumFragments) { CLArrayList docFrags(false); TextFragment* currentFrag = _CLNEW TextFragment(writeTo->length(), docFrags.size()); _fragmentScorer->startFragment(currentFrag); docFrags.push_back(currentFrag); FragmentQueue fragQueue(maxNumFragments); try { int32_t startOffset; int32_t endOffset; int32_t lastEndOffset = 0; _textFragmenter->start(text); TCHAR substringBuffer[LUCENE_MAX_WORD_LEN]; TokenGroup* tokenGroup=_CLNEW TokenGroup(); TCHAR buffer[LUCENE_MAX_FIELD_LEN+1]; Token token; while ( tokenStream->next(&token) ) { if((tokenGroup->getNumTokens()>0)&&(tokenGroup->isDistinct(&token))){ //the current token is distinct from previous tokens - // markup the cached token group info startOffset = tokenGroup->getStartOffset(); endOffset = tokenGroup->getEndOffset(); _tcsncpy(substringBuffer,text+startOffset,endOffset-startOffset); substringBuffer[endOffset-startOffset]=_T('\0'); TCHAR* encoded = _encoder->encodeText(substringBuffer); TCHAR* markedUpText=_formatter->highlightTerm(encoded, tokenGroup); _CLDELETE_CARRAY(encoded); //store any whitespace etc from between this and last group if (startOffset > lastEndOffset){ int len = startOffset-lastEndOffset; if ( len > LUCENE_MAX_FIELD_LEN ) len = LUCENE_MAX_FIELD_LEN; _tcsncpy(buffer,text+lastEndOffset,len); buffer[len]=_T('\0'); TCHAR* encoded = _encoder->encodeText(buffer); writeTo->append(encoded); _CLDELETE_CARRAY(encoded); } writeTo->append(markedUpText); lastEndOffset=endOffset; tokenGroup->clear(); _CLDELETE_CARRAY(markedUpText); //check if current token marks the start of a new fragment if (_textFragmenter->isNewFragment(&token)) { currentFrag->setScore(_fragmentScorer->getFragmentScore()); //record stats for a new fragment currentFrag->setTextEndPos( writeTo->length() ); currentFrag =_CLNEW TextFragment(writeTo->length(), docFrags.size()); _fragmentScorer->startFragment(currentFrag); docFrags.push_back(currentFrag); } } // does query contain current token? float_t score=_fragmentScorer->getTokenScore(&token); //TCHAR* highlightedTerm = _formatter->highlightTerm(&substringBuffer, token->termText(), score, startOffset); //newText->append(highlightedTerm); //_CLDELETE_CARRAY(highlightedTerm); //_CLDELETE(token); tokenGroup->addToken(&token,_fragmentScorer->getTokenScore(&token)); if(lastEndOffset>maxDocBytesToAnalyze) { break; } } currentFrag->setScore(_fragmentScorer->getFragmentScore()); if(tokenGroup->getNumTokens()>0) { //flush the accumulated text (same code as in above loop) startOffset = tokenGroup->getStartOffset(); endOffset = tokenGroup->getEndOffset(); _tcsncpy(substringBuffer,text+startOffset,endOffset-startOffset); substringBuffer[endOffset-startOffset]=_T('\0'); TCHAR* encoded = _encoder->encodeText(substringBuffer); TCHAR* markedUpText=_formatter->highlightTerm(encoded, tokenGroup); _CLDELETE_CARRAY(encoded); //store any whitespace etc from between this and last group if (startOffset > lastEndOffset){ int len = startOffset-lastEndOffset; if ( len > LUCENE_MAX_FIELD_LEN ) len = LUCENE_MAX_FIELD_LEN; _tcsncpy(buffer,text+lastEndOffset,len); buffer[len]=_T('\0'); TCHAR* encoded = _encoder->encodeText(buffer); writeTo->append(encoded); _CLDELETE_CARRAY(encoded); } writeTo->append(markedUpText); lastEndOffset=endOffset; _CLDELETE_CARRAY(markedUpText); } // append text after end of last token //if (lastEndOffset < (int32_t)_tcslen(text)) //newText->append(text+lastEndOffset); currentFrag->setTextEndPos(writeTo->length()); //sort the most relevant sections of the text while (docFrags.size() > 0) { //for (TextFragmentList::iterator i = docFrags.begin(); i != docFrags.end(); i++) //{ currentFrag = (TextFragment*) docFrags[0]; docFrags.remove(0); //If you are running with a version of Lucene before 11th Sept 03 // you do not have PriorityQueue.insert() - so uncomment the code below /*if (currentFrag->getScore() >= minScore) { fragQueue.put(currentFrag); if (fragQueue.size() > maxNumFragments) { // if hit queue overfull _CLLDELETE(fragQueue.pop()); // remove lowest in hit queue minScore = ((TextFragment *) fragQueue.top())->getScore(); // reset minScore } } else { _CLDELETE(currentFrag); }*/ //The above code caused a problem as a result of Christoph Goller's 11th Sept 03 //fix to PriorityQueue. The correct method to use here is the new "insert" method // USE ABOVE CODE IF THIS DOES NOT COMPILE! if ( !fragQueue.insert(currentFrag) ) _CLDELETE(currentFrag); //todo: check this } //return the most relevant fragments int32_t fragsLen = fragQueue.size(); TextFragment** frags = _CL_NEWARRAY(TextFragment*,fragsLen+1); for ( int32_t i=0;i fragTexts; for (int32_t i = 0; i < fragsLen; i++) { TextFragment* tf = frags[i]; if ((tf != NULL) && (tf->getScore() > 0)) fragTexts.push_back(tf); else _CLDELETE(tf); } _CLDELETE_ARRAY(frags); frags = _CL_NEWARRAY(TextFragment*,fragTexts.size()+1); fragTexts.toArray_nullTerminated(frags); } _CLDELETE(tokenGroup); //_CLDELETE(newText); return frags; } _CLFINALLY( if (tokenStream) { try { tokenStream->close(); } catch (...) { } } ) } void Highlighter::_mergeContiguousFragments(TextFragment** frag, int32_t fragsLen) { bool mergingStillBeingDone; if ( frag[0] != NULL ) do { mergingStillBeingDone = false; //initialise loop control flag //for each fragment, scan other frags looking for contiguous blocks for (int32_t i=0; ifollows(frag[x])) { frag1 = frag[x]; frag1Num = x; frag2 = frag[i]; frag2Num = i; } else if (frag[x]->follows(frag[i])) { frag1 = frag[i]; frag1Num = i; frag2 = frag[x]; frag2Num = x; } //merging required.. if (frag1 != NULL) { if (frag1->getScore() > frag2->getScore()) { bestScoringFragNum = frag1Num; worstScoringFragNum = frag2Num; } else { bestScoringFragNum = frag2Num; worstScoringFragNum = frag1Num; } frag1->merge(frag2); frag[worstScoringFragNum]= NULL; mergingStillBeingDone = true; frag[bestScoringFragNum]=frag1; _CLDELETE(frag2); } } } } while (mergingStillBeingDone); } int32_t Highlighter::getMaxDocBytesToAnalyze() { return maxDocBytesToAnalyze; } void Highlighter::setMaxDocBytesToAnalyze(int32_t byteCount) { maxDocBytesToAnalyze = byteCount; } Fragmenter * Highlighter::getTextFragmenter() { return _textFragmenter; } void Highlighter::setTextFragmenter(Fragmenter * fragmenter) { if ( delete_textFragmenter ){ _CLDELETE(_textFragmenter); delete_textFragmenter = false; } _textFragmenter = fragmenter; } HighlightScorer * Highlighter::getFragmentScorer() { return _fragmentScorer; } void Highlighter::setFragmentScorer(HighlightScorer * scorer) { if ( delete_fragmentScorer ){ delete_fragmentScorer = false; _CLDELETE(scorer); } _fragmentScorer = scorer; } Encoder* Highlighter::getEncoder() { return _encoder; } void Highlighter::setEncoder(Encoder* encoder) { if ( delete_encoder ){ _CLDELETE(encoder); delete_encoder = false; } this->_encoder = encoder; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Highlighter.h000066400000000000000000000167461154025176300256500ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_highlighter_ #define _lucene_search_highlight_highlighter_ CL_CLASS_DEF(util, StringBuffer) //#include "CLucene/util/VoidList.h" CL_CLASS_DEF2(search,highlight,Formatter) CL_CLASS_DEF2(search,highlight,Encoder) CL_CLASS_DEF2(search,highlight,HighlightScorer) CL_CLASS_DEF2(search,highlight,Fragmenter) CL_CLASS_DEF2(search,highlight,TextFragment) CL_CLASS_DEF(analysis, TokenStream) CL_CLASS_DEF(analysis, Analyzer) //#include "HighlightScorer.h" //#include "SimpleFragmenter.h" //#include "TextFragment.h" CL_NS_DEF2(search,highlight) /** * Class used to markup highlighted terms found in the best sections of a * text, using configurable {@link Fragmenter}, {@link Scorer}, {@link Formatter}, * and tokenizers. * {@link Encoder} and tokenizers. */ class CLUCENE_CONTRIBS_EXPORT Highlighter :LUCENE_BASE { private: int32_t maxDocBytesToAnalyze; Formatter * _formatter; bool delete_formatter; Encoder* _encoder; bool delete_encoder; Fragmenter * _textFragmenter; bool delete_textFragmenter; HighlightScorer * _fragmentScorer; bool delete_fragmentScorer; /** Improves readability of a score-sorted list of TextFragments by merging any fragments * that were contiguous in the original text into one larger fragment with the correct order. * This will leave a "null" in the array entry for the lesser scored fragment. * * @param frag An array of document fragments in descending score */ void _mergeContiguousFragments(TextFragment** frag, int32_t fragsLen); public: LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_MAX_DOC_BYTES_TO_ANALYZE=50*1024); /** * Constructs a Highlighter object with the provided scorer. The HighlightScorer object is owned * by the Highlighter object, and it will freed in the destructor. */ Highlighter(HighlightScorer * fragmentScorer); Highlighter(Formatter * formatter, HighlightScorer * fragmentScorer); Highlighter(Formatter * formatter, Encoder* encoder, HighlightScorer * fragmentScorer); /** * Destructor for Highlighter. It deletes the owned HighlightScorer, formatter and textFragmenter. */ ~Highlighter(); /** * Highlights chosen terms in a text, extracting the most relevant section. * The document text is analysed in chunks to record hit statistics * across the document. After accumulating stats, the fragment with the highest score * is returned * * @param tokenStream a stream of tokens identified in the text parameter, including offset information. * This is typically produced by an analyzer re-parsing a document's * text. Some work may be done on retrieving TokenStreams more efficently * by adding support for storing original text position data in the Lucene * index but this support is not currently available (as of Lucene 1.4 rc2). * @param text text to highlight terms in * * @return highlighted text fragment or null if no terms found */ TCHAR* getBestFragment(CL_NS(analysis)::TokenStream * tokenStream, const TCHAR* text); /** * Highlights chosen terms in a text, extracting the most relevant section. * This is a convenience method that calls * {@link #getBestFragment(TokenStream, const TCHAR*)} * * @param analyzer the analyzer that will be used to split text * into chunks * @param text text to highlight terms in * @param fieldName Name of field used to influence analyzer's tokenization policy * * @return highlighted text fragment or null if no terms found */ TCHAR* getBestFragment(CL_NS(analysis)::Analyzer* analyzer, const TCHAR* fieldName, const TCHAR* text); /** * Highlights chosen terms in a text, extracting the most relevant sections. * This is a convenience method that calls * {@link #getBestFragments(TokenStream, const TCHAR*, int)} * * @param analyzer the analyzer that will be used to split text * into chunks * @param text text to highlight terms in * @param maxNumFragments the maximum number of fragments. * * @return highlighted text fragments (between 0 and maxNumFragments number of fragments) */ TCHAR** getBestFragments( CL_NS(analysis)::Analyzer* analyzer, const TCHAR* text, int32_t maxNumFragments); /** * Highlights chosen terms in a text, extracting the most relevant sections. * The document text is analysed in chunks to record hit statistics * across the document. After accumulating stats, the fragments with the highest scores * are returned as an array of strings in order of score (contiguous fragments are merged into * one in their original order to improve readability) * * @param text text to highlight terms in * @param maxNumFragments the maximum number of fragments. * * @return highlighted text fragments (between 0 and maxNumFragments number of fragments) */ TCHAR** getBestFragments( CL_NS(analysis)::TokenStream * tokenStream, const TCHAR* text, int32_t maxNumFragments); /** * Low level api to get the most relevant (formatted) sections of the document. * This method has been made public to allow visibility of score information held in TextFragment objects. * Thanks to Jason Calabrese for help in redefining the interface. * @param tokenStream * @param text * @param maxNumFragments * @param mergeContiguousFragments */ TextFragment** getBestTextFragments( CL_NS(util)::StringBuffer* writeTo, CL_NS(analysis)::TokenStream * tokenStream, const TCHAR* text, bool mergeContiguousFragments, int32_t maxNumFragments); /** * Highlights terms in the text , extracting the most relevant sections * and concatenating the chosen fragments with a separator (typically "..."). * The document text is analysed in chunks to record hit statistics * across the document. After accumulating stats, the fragments with the highest scores * are returned in order as "separator" delimited strings. * * @param text text to highlight terms in * @param maxNumFragments the maximum number of fragments. * @param separator the separator used to intersperse the document fragments (typically "...") * * @return highlighted text */ TCHAR* getBestFragments( CL_NS(analysis)::TokenStream * tokenStream, const TCHAR* text, int32_t maxNumFragments, const TCHAR* separator); /** * @return the maximum number of bytes to be tokenized per doc */ int32_t getMaxDocBytesToAnalyze(); /** * @param byteCount the maximum number of bytes to be tokenized per doc * (This can improve performance with large documents) */ void setMaxDocBytesToAnalyze(int32_t byteCount); /** */ Fragmenter * getTextFragmenter(); /** * @param fragmenter */ void setTextFragmenter(Fragmenter * fragmenter); /** * @return Object used to score each text fragment */ HighlightScorer * getFragmentScorer(); /** * @param HighlightScorer */ void setFragmentScorer(HighlightScorer * scorer); Encoder* getEncoder(); void setEncoder(Encoder* encoder); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/QueryScorer.cpp000066400000000000000000000061741154025176300262220ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "QueryScorer.h" #include "WeightedTerm.h" #include "QueryTermExtractor.h" #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF2(search,highlight) CL_NS_USE(index) CL_NS_USE(analysis) QueryScorer::QueryScorer(const Query * query): _termsToFind(false,true), _uniqueTermsInFragment(true) { WeightedTerm** _weighted_terms = QueryTermExtractor::getTerms(query); initialize(_weighted_terms); _CLDELETE_ARRAY(_weighted_terms); } QueryScorer::~QueryScorer() { } /* QueryScorer(Query* query, CL_NS(index)::IndexReader* reader, const TCHAR* fieldName) { WeightedTerm** _weighted_terms = QueryTermExtractor.getIdfWeightedTerms(query, reader, fieldName); initialize(_weighted_terms); }*/ QueryScorer::QueryScorer(WeightedTerm** weightedTerms) { initialize(weightedTerms); } void QueryScorer::initialize(WeightedTerm** weightedTerms) { _currentTextFragment = NULL; _totalScore = 0; _maxTermWeight = 0; // Copy external weighted terms int i=0; while ( weightedTerms[i] != NULL ){ const WeightedTerm* existingTerm=_termsToFind.get(weightedTerms[i]->getTerm()); if( (existingTerm==NULL) ||(existingTerm->getWeight()getWeight()) ) { //if a term is defined more than once, always use the highest scoring weight WeightedTerm* term = weightedTerms[i]; _termsToFind.put(term->getTerm(), term); _maxTermWeight=cl_max(_maxTermWeight,weightedTerms[i]->getWeight()); }else _CLDELETE(weightedTerms[i]); i++; } } void QueryScorer::startFragment(TextFragment * newFragment) { _uniqueTermsInFragment.clear(); _currentTextFragment=newFragment; _totalScore=0; } float_t QueryScorer::getTokenScore(Token * token) { const TCHAR* termText=token->termBuffer(); const WeightedTerm* queryTerm = _termsToFind.get(termText); if(queryTerm==NULL) { //not a query term - return return 0; } //found a query term - is it unique in this doc? if(_uniqueTermsInFragment.find((TCHAR*)termText)==_uniqueTermsInFragment.end()) { _totalScore+=queryTerm->getWeight(); TCHAR* owned_term = stringDuplicate(termText); _uniqueTermsInFragment.insert(owned_term); } return queryTerm->getWeight(); } /** * * @return The highest weighted term (useful for passing to GradientFormatter to set * top end of coloring scale. */ float_t QueryScorer::getMaxTermWeight() { return _maxTermWeight; } float_t QueryScorer::getFragmentScore(){ return _totalScore; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/QueryScorer.h000066400000000000000000000066441154025176300256710ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_queryscorer_ #define _lucene_search_highlight_queryscorer_ CL_CLASS_DEF(index, IndexReader) CL_CLASS_DEF(search, Query) //#include "CLucene/search/SearchHeader.h" //#include "TextFragment.h" #include "HighlightScorer.h" CL_NS_DEF2(search,highlight) class WeightedTerm; class QueryTermExtractor; class TextFragment; /** * {@link Scorer} implementation which scores text fragments by the number of unique query terms found. * This class uses the {@link QueryTermExtractor} class to process determine the query terms and * their boosts to be used. */ //TODO: provide option to boost score of fragments near beginning of document // based on fragment.getFragNum() class CLUCENE_CONTRIBS_EXPORT QueryScorer : public HighlightScorer { private: TextFragment * _currentTextFragment; CL_NS(util)::CLHashSet _uniqueTermsInFragment; float_t _totalScore; float_t _maxTermWeight; CL_NS(util)::CLHashMap > _termsToFind; public: /** * * @param query a Lucene query (ideally rewritten using query.rewrite * before being passed to this class and the searcher) */ QueryScorer(const Query * query); /** * * @param query a Lucene query (ideally rewritten using query.rewrite * before being passed to this class and the searcher) * @param reader used to compute IDF which can be used to a) score selected fragments better * b) use graded highlights eg set font color intensity * @param fieldName the field on which Inverse Document Frequency (IDF) calculations are based */ QueryScorer(const Query* query, CL_NS(index)::IndexReader* reader, const TCHAR* fieldName); QueryScorer(WeightedTerm** weightedTerms); ~QueryScorer(); /* (non-Javadoc) * @see org.apache.lucene.search.highlight.FragmentScorer#startFragment(org.apache.lucene.search.highlight.TextFragment) */ void startFragment(TextFragment* newFragment); /* (non-Javadoc) * @see org.apache.lucene.search.highlight.FragmentScorer#scoreToken(org.apache.lucene.analysis.Token) */ float_t getTokenScore(CL_NS(analysis)::Token * token); /* (non-Javadoc) * @see org.apache.lucene.search.highlight.FragmentScorer#endFragment(org.apache.lucene.search.highlight.TextFragment) */ float_t getFragmentScore(); /* (non-Javadoc) * @see org.apache.lucene.search.highlight.FragmentScorer#allFragmentsProcessed() */ void allFragmentsProcessed(); /** * * @return The highest weighted term (useful for passing to GradientFormatter to set * top end of coloring scale. */ float_t getMaxTermWeight(); private: void initialize(WeightedTerm** weightedTerms); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/QueryTermExtractor.cpp000066400000000000000000000106061154025176300275630ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "QueryTermExtractor.h" #include "CLucene/search/Query.h" #include "CLucene/search/BooleanQuery.h" #include "CLucene/search/TermQuery.h" #include "CLucene/search/PhraseQuery.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/Term.h" CL_NS_DEF2(search,highlight) CL_NS_USE(index) WeightedTerm** QueryTermExtractor::getTerms(const Query * query, bool prohibited, const TCHAR* fieldName) { WeightedTermList terms(false); getTerms(query,&terms,prohibited,fieldName); // Return extracted terms WeightedTerm** ret = _CL_NEWARRAY(WeightedTerm*,terms.size()+1); terms.toArray_nullTerminated(ret); return ret; } void QueryTermExtractor::getTerms(const Query * query, WeightedTermList * terms, bool prohibited, const TCHAR* fieldName) { if (query->instanceOf( BooleanQuery::getClassName() )) { getTermsFromBooleanQuery((BooleanQuery *) query, terms, prohibited, fieldName); } // FilteredQuery not implemented yet // else if (query->instanceOf( FilteredQuery::getClassName() )) // getTermsFromFilteredQuery((FilteredQuery *) query, terms); else { TermSet nonWeightedTerms; query->extractTerms(&nonWeightedTerms); for (TermSet::iterator iter = nonWeightedTerms.begin(); iter != nonWeightedTerms.end(); iter++) { Term * term = (Term *)(*iter); if ( fieldName == NULL || term->field() == fieldName ) terms->insert(_CLNEW WeightedTerm(query->getBoost(), term->text())); _CLLDECDELETE( term ); } } } /** * Extracts all terms texts of a given Query into an array of WeightedTerms * * @param query Query to extract term texts from * @param reader used to compute IDF which can be used to a) score selected fragments better * b) use graded highlights eg chaning intensity of font color * @param fieldName the field on which Inverse Document Frequency (IDF) calculations are based * @return an array of the terms used in a query, plus their weights. */ WeightedTerm** QueryTermExtractor::getIdfWeightedTerms(const Query* query, IndexReader* reader, const TCHAR* fieldName) { WeightedTermList terms(true); getTerms(query,&terms,false,fieldName); int32_t totalNumDocs=reader->numDocs(); WeightedTermList::iterator itr = terms.begin(); while ( itr != terms.end() ) { try { Term* term = _CLNEW Term(fieldName,(*itr)->getTerm()); int32_t docFreq=reader->docFreq(term); _CLDECDELETE(term); //IDF algorithm taken from DefaultSimilarity class float_t idf=(float_t)(log(totalNumDocs/(float_t)(docFreq+1)) + 1.0); (*itr)->setWeight((*itr)->getWeight() * idf); }catch (CLuceneError& e){ if ( e.number()!=CL_ERR_IO ) throw e; } itr++; } // Return extracted terms WeightedTerm** ret = _CL_NEWARRAY(WeightedTerm*,terms.size()+1); terms.toArray_nullTerminated(ret); return ret; } void QueryTermExtractor::getTermsFromBooleanQuery(const BooleanQuery * query, WeightedTermList * terms, bool prohibited, const TCHAR* fieldName) { uint32_t numClauses = query->getClauseCount(); BooleanClause** queryClauses = _CL_NEWARRAY(BooleanClause*,numClauses); query->getClauses(queryClauses); for (uint32_t i = 0; i < numClauses; i++) { if (prohibited || !queryClauses[i]->prohibited){ Query* qry = queryClauses[i]->getQuery(); getTerms(qry, terms, prohibited, fieldName); } } _CLDELETE_ARRAY(queryClauses); } // FilteredQuery not implemented yet // void QueryTermExtractor::getTermsFromFilteredQuery(const FilteredQuery * query, WeightedTermList * terms, bool prohibited) // { // getTerms(query->getQuery(), terms, prohibited); // } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/QueryTermExtractor.h000066400000000000000000000063711154025176300272340ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_querytermextractor_ #define _lucene_search_highlight_querytermextractor_ CL_CLASS_DEF(search, Query) CL_CLASS_DEF(search, BooleanQuery) CL_CLASS_DEF(search, PhraseQuery) CL_CLASS_DEF(search, TermQuery) CL_CLASS_DEF(index, IndexReader) CL_CLASS_DEF(index, Term) #include "WeightedTerm.h" CL_NS_DEF2(search,highlight) /** * Utility class used to extract the terms used in a query, plus any weights. * This class will not find terms for MultiTermQuery, RangeQuery and PrefixQuery classes * so the caller must pass a rewritten query (see Query.rewrite) to obtain a list of * expanded terms. * */ class CLUCENE_CONTRIBS_EXPORT QueryTermExtractor { QueryTermExtractor(){ } public: /** * Extracts all terms texts of a given Query into an returned array of WeightedTerms * * @param query Query to extract term texts from * @param prohibited true to extract "prohibited" terms, too * @param fieldName field name used for filtering query terms, MUST be interned prior to this call * @return an array of the terms used in a query, plus their weights.Memory owned by the caller */ static WeightedTerm** getTerms(const Query *query, bool prohibited = false, const TCHAR* fieldName = NULL); /** * Extracts all terms texts of a given Query into an array of WeightedTerms * * @param query Query to extract term texts from * @param reader used to compute IDF which can be used to a) score selected fragments better * b) use graded highlights eg chaning intensity of font color * @param fieldName the field on which Inverse Document Frequency (IDF) calculations are based * @return an array of the terms used in a query, plus their weights. */ static WeightedTerm** getIdfWeightedTerms(const Query* query, CL_NS(index)::IndexReader* reader, const TCHAR* fieldName); /** * Extracts all terms texts of a given Query into given array of WeightedTerms * * @param query Query to extract term texts from * @param prohibited true to extract "prohibited" terms, too * @param fieldName field name used for filtering query terms, MUST be interned prior to this call * @return an array of the terms used in a query, plus their weights.Memory owned by the caller */ static void getTerms(const Query * query, WeightedTermList*, bool prohibited = false, const TCHAR* fieldName = NULL); static void getTermsFromBooleanQuery(const BooleanQuery * query, WeightedTermList* terms, bool prohibited, const TCHAR* fieldName); // static void getTermsFromFilteredQuery(const FilteredQuery * query, WeightedTermList* terms); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/Scorer.h000066400000000000000000000032701154025176300246330ustar00rootroot00000000000000#ifndef _lucene_search_highlight_scorer_h_ #define _lucene_search_highlight_scorer_h_ /** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //#include CL_NS_USE(analysis) /** * Adds to the score for a fragment based on its tokens */ namespace lucene { namespace search { namespace highlight { class TextFragment; class CLUCENE_CONTRIBS_EXPORT Scorer { public: virtual ~Scorer(){}; /** * called when a new fragment is started for consideration * @param newFragment */ virtual void startFragment(TextFragment * newFragment) = 0; /** * Called for each token in the current fragment * @param token The token to be scored * @return a score which is passed to the TermHighlighter class to influence the mark-up of the text * (this return value is NOT used to score the fragment) */ virtual float_t getTokenScore(Token * token) = 0; /** * Called when the highlighter has no more tokens for the current fragment - the scorer will typically * call setScore() on the fragment passed in startFragment to record total info * */ virtual float_t getFragmentScore() = 0; }; }}} #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/SimpleFragmenter.cpp000066400000000000000000000025311154025176300271740ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "SimpleFragmenter.h" #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF2(search,highlight) CL_NS_USE(analysis) SimpleFragmenter::SimpleFragmenter(int32_t fragmentSize) : _fragmentSize(fragmentSize), _currentNumFrags(0) { } SimpleFragmenter::~SimpleFragmenter(){ } void SimpleFragmenter::start(const TCHAR*) { _currentNumFrags=1; } bool SimpleFragmenter::isNewFragment(const Token * token) { bool isNewFrag= token->endOffset()>=(_fragmentSize*_currentNumFrags); if (isNewFrag) { _currentNumFrags++; } return isNewFrag; } int32_t SimpleFragmenter::getFragmentSize() const { return _fragmentSize; } void SimpleFragmenter::setFragmentSize(int32_t size) { _fragmentSize = size; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/SimpleFragmenter.h000066400000000000000000000034411154025176300266420ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_simplefragmenter_ #define _lucene_search_highlight_simplefragmenter_ #include "Fragmenter.h" CL_NS_DEF2(search,highlight) /** * {@link Fragmenter} implementation which breaks text up into same-size * fragments with no concerns over spotting sentence boundaries. */ class CLUCENE_CONTRIBS_EXPORT SimpleFragmenter:public Fragmenter { private: LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_FRAGMENT_SIZE =100 ); int32_t _currentNumFrags; int32_t _fragmentSize; public: /** * * @param fragmentSize size in bytes of each fragment */ SimpleFragmenter(int32_t fragmentSize = DEFAULT_FRAGMENT_SIZE); ~SimpleFragmenter(); /* (non-Javadoc) * @see org.apache.lucene.search.highlight.TextFragmenter#start(const TCHAR*) */ void start(const TCHAR* originalText); /* (non-Javadoc) * @see org.apache.lucene.search.highlight.TextFragmenter#isNewFragment(org.apache.lucene.analysis.Token) */ bool isNewFragment(const CL_NS(analysis)::Token * token); /** * @return size in bytes of each fragment */ int32_t getFragmentSize() const; /** * @param size size in bytes of each fragment */ void setFragmentSize(int32_t size); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/SimpleHTMLEncoder.cpp000066400000000000000000000033121154025176300271440ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "SimpleHTMLEncoder.h" #include "Formatter.h" #include "CLucene/util/StringBuffer.h" CL_NS_DEF2(search,highlight) SimpleHTMLEncoder::SimpleHTMLEncoder(void) { } SimpleHTMLEncoder::~SimpleHTMLEncoder(void) { } TCHAR* SimpleHTMLEncoder::encodeText(TCHAR* originalText) { return htmlEncode(originalText); } TCHAR* SimpleHTMLEncoder::htmlEncode(TCHAR* plainText) { size_t plainTextLen = _tcslen(plainText); if (plainText == NULL || plainTextLen == 0) { return STRDUP_TtoT(_T("")); } CL_NS(util)::StringBuffer result(plainTextLen); for (int32_t index=0; index': result.append(_T(">")); break; default: if (ch < 128) result.appendChar(ch); else{ result.append(_T("&#")); result.appendInt(ch); result.append(_T(";")); } } } return result.toString(); } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/SimpleHTMLEncoder.h000066400000000000000000000021641154025176300266150ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_simplehtmlencoder_ #define _lucene_search_highlight_simplehtmlencoder_ #include "Encoder.h" CL_NS_DEF2(search,highlight) /** * Simple {@link Encoder} implementation to escape text for HTML output * */ class CLUCENE_CONTRIBS_EXPORT SimpleHTMLEncoder:public Encoder { public: SimpleHTMLEncoder(void); ~SimpleHTMLEncoder(void); TCHAR* encodeText(TCHAR* originalText); /** * Encode string into HTML */ static TCHAR* htmlEncode(TCHAR* plainText) ; }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/SimpleHTMLFormatter.cpp000066400000000000000000000027351154025176300275400ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "SimpleHTMLFormatter.h" #include "TokenGroup.h" #include "CLucene/util/StringBuffer.h" CL_NS_DEF2(search,highlight) CL_NS_USE(util) SimpleHTMLFormatter::SimpleHTMLFormatter(const TCHAR* preTag, const TCHAR* postTag): _preTag(stringDuplicate(preTag)), _postTag(stringDuplicate(postTag)) { } SimpleHTMLFormatter::SimpleHTMLFormatter() { _preTag = stringDuplicate(_T("")); _postTag = stringDuplicate(_T("")); } SimpleHTMLFormatter::~SimpleHTMLFormatter() { _CLDELETE_CARRAY(_preTag); _CLDELETE_CARRAY(_postTag); } TCHAR* SimpleHTMLFormatter::highlightTerm(const TCHAR* originalText, const TokenGroup* tokenGroup) { if(tokenGroup->getTotalScore()>0){ StringBuffer sb; sb.append(_preTag); sb.append(originalText); sb.append(_postTag); return sb.toString(); } return stringDuplicate(originalText); } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/SimpleHTMLFormatter.h000066400000000000000000000031011154025176300271710ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_simplehtmlformatter_ #define _lucene_search_highlight_simplehtmlformatter_ #include "Formatter.h" CL_NS_DEF2(search,highlight) /** * Simple {@link Formatter} implementation to highlight terms with a pre and post tag * */ class CLUCENE_CONTRIBS_EXPORT SimpleHTMLFormatter :public Formatter { private: TCHAR* _preTag; TCHAR* _postTag; public: ~SimpleHTMLFormatter(); SimpleHTMLFormatter(const TCHAR* preTag, const TCHAR* postTag); /** * Default constructor uses HTML: <B> tags to markup terms * **/ SimpleHTMLFormatter(); /** * Returns the original text enclosed in _preTag and _postTag, if the score is greater * than 0. Otherwise, it returns the original text. * It doesn't use the stemmed text nor the startOffset. * It allocates memory for the returned text, and it has to be freed by the caller. */ TCHAR* highlightTerm(const TCHAR* originalText, const TokenGroup* tokenGroup); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/TextFragment.cpp000066400000000000000000000036151154025176300263440ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "TextFragment.h" #include "CLucene/util/StringBuffer.h" CL_NS_DEF2(search,highlight) CL_NS_USE(util) TextFragment::TextFragment(int32_t textStartPos, int32_t fragNum) { _textStartPos = textStartPos; _textEndPos=0; _fragNum = fragNum; } TextFragment::~TextFragment(){ } void TextFragment::setScore(float_t score) { _score=score; } float_t TextFragment::getScore() const { return _score; } /** * @param frag2 Fragment to be merged into this one */ void TextFragment::merge(const TextFragment * frag2) { _textEndPos = frag2->_textEndPos; _score=cl_max(_score,frag2->_score); } /** * @param fragment * @return true if this fragment follows the one passed */ bool TextFragment::follows(const TextFragment * fragment) const { return _textStartPos == fragment->_textEndPos; } /** * @return the fragment sequence number */ int32_t TextFragment::getFragNum() const { return _fragNum; } /* Returns the marked-up text for this text fragment */ TCHAR* TextFragment::toString(StringBuffer* buffer) { TCHAR* ret = _CL_NEWARRAY(TCHAR,_textEndPos-_textStartPos+1); _tcsncpy(ret,buffer->getBuffer()+_textStartPos,_textEndPos-_textStartPos); ret[_textEndPos-_textStartPos]=_T('\0'); return ret; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/TextFragment.h000066400000000000000000000044451154025176300260130ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_textfragment_ #define _lucene_search_highlight_textfragment_ CL_CLASS_DEF(util, StringBuffer) //#include "CLucene/util/VoidList.h" CL_NS_DEF2(search,highlight) /** * Low-level class used to record information about a section of a document * with a score. */ class CLUCENE_CONTRIBS_EXPORT TextFragment:LUCENE_BASE { int32_t _fragNum; int32_t _textStartPos; int32_t _textEndPos; float_t _score; public: TextFragment(int32_t textStartPos, int32_t fragNum); ~TextFragment(); void setScore(float_t score); float_t getScore() const; int32_t textEndPos(){ return _textEndPos; } void setTextEndPos(int32_t val){ _textEndPos = val; } /** * @param frag2 Fragment to be merged into this one */ void merge(const TextFragment * frag2); /** * @param fragment * @return true if this fragment follows the one passed */ bool follows(const TextFragment * fragment) const; /** * @return the fragment sequence number */ int32_t getFragNum() const; /* Returns the marked-up text for this text fragment */ TCHAR* toString(CL_NS(util)::StringBuffer* buffer); /** * Compare weighted terms, according to the term text. * @todo Do we have to take boost factors into account */ class Compare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: //todo: this should be more efficient, but will be using a hash table soon, anyway bool operator()( TextFragment* t1, TextFragment* t2 ) const; size_t operator()( TextFragment* t ) const; }; }; /** * Text fragment list. */ //typedef CL_NS(util)::CLSetList > TextFragmentList; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/TokenGroup.cpp000066400000000000000000000047441154025176300260350ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "TokenGroup.h" #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF2(search,highlight) CL_NS_USE(analysis) TokenGroup::TokenGroup(void) { numTokens=0; startOffset=0; endOffset=0; tokens = new Token[MAX_NUM_TOKENS_PER_GROUP]; } TokenGroup::~TokenGroup(void) { delete[] tokens; } void TokenGroup::addToken(Token* token, float_t score) { if(numTokens < MAX_NUM_TOKENS_PER_GROUP) { if(numTokens==0) { startOffset=token->startOffset(); endOffset=token->endOffset(); } else { startOffset=cl_min(startOffset,token->startOffset()); endOffset=cl_max(endOffset,token->endOffset()); } tokens[numTokens].set(token->termBuffer(),token->startOffset(),token->endOffset(),token->type());; scores[numTokens]=score; numTokens++; } } CL_NS(analysis)::Token& TokenGroup::getToken(int32_t index) { return tokens[index]; } float_t TokenGroup::getScore(int32_t index) const { return scores[index]; } int32_t TokenGroup::getEndOffset() const { return endOffset; } int32_t TokenGroup::getNumTokens() const { return numTokens; } int32_t TokenGroup::getStartOffset() const { return startOffset; } float_t TokenGroup::getTotalScore() const { float_t total=0; for (int32_t i = 0; i < numTokens; i++) { total+=scores[i]; } return total; } /*void addToken(CL_NS(analysis)::Token* token, float_t score) { if(numTokens < MAX_NUM_TOKENS_PER_GROUP) { if(numTokens==0) { startOffset=token->startOffset(); endOffset=token->endOffset(); } else { startOffset=min(startOffset,token->startOffset()); endOffset=max(endOffset,token->endOffset()); } tokens[numTokens]=token; scores[numTokens]=score; numTokens++; } }*/ bool TokenGroup::isDistinct(CL_NS(analysis)::Token* token) const { return token->startOffset() > endOffset; } void TokenGroup::clear() { numTokens=0; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/TokenGroup.h000066400000000000000000000037031154025176300254740ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_tokengroup_ #define _lucene_search_highlight_tokengroup_ CL_CLASS_DEF(analysis, Token) CL_NS_DEF2(search,highlight) /** * One, or several overlapping tokens, along with the score(s) and the * scope of the original text */ class CLUCENE_CONTRIBS_EXPORT TokenGroup: LUCENE_BASE { LUCENE_STATIC_CONSTANT(int32_t,MAX_NUM_TOKENS_PER_GROUP=50); CL_NS(analysis)::Token* tokens; float_t scores[MAX_NUM_TOKENS_PER_GROUP]; int32_t numTokens; int32_t startOffset; int32_t endOffset; public: TokenGroup(void); ~TokenGroup(void); void addToken(CL_NS(analysis)::Token* token, float_t score); /** * * @param index a value between 0 and numTokens -1 * @return the "n"th token */ CL_NS(analysis)::Token& getToken(int32_t index); /** * * @param index a value between 0 and numTokens -1 * @return the "n"th score */ float_t getScore(int32_t index) const; /** * @return the end position in the original text */ int32_t getEndOffset() const; /** * @return the number of tokens in this group */ int32_t getNumTokens() const; /** * @return the start position in the original text */ int32_t getStartOffset() const; /** * @return all tokens' scores summed up */ float_t getTotalScore() const; bool isDistinct(CL_NS(analysis)::Token* token) const; void clear(); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/TokenSources.cpp000066400000000000000000000157361154025176300263670ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "TokenSources.h" #include "CLucene/util/VoidList.h" #include "CLucene/util/CLStreams.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/TermVector.h" #include "CLucene/document/Document.h" CL_NS_DEF2(search,highlight) CL_NS_USE(analysis) CL_NS_USE(index) CL_NS_USE(util) ///Compares the Token for their order class TokenOrderCompare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: bool operator()( Token* t1, Token* t2 ) const{ if(t1->startOffset()>t2->startOffset()) return false; if(t1->startOffset()startOffset()) return true; return true; } }; TokenSources::TokenSources(void) { } TokenSources::~TokenSources(void) { } TokenStream* TokenSources::getAnyTokenStream(IndexReader* reader,int32_t docId, TCHAR* field, Analyzer* analyzer) { TokenStream* ts=NULL; TermFreqVector* tfv=reader->getTermFreqVector(docId,field); if(tfv!=NULL) { TermPositionVector* tmp = tfv->__asTermPositionVector(); if ( tmp != NULL ) ts=getTokenStream(tmp); } //No token info stored so fall back to analyzing raw content if(ts==NULL) { ts=getTokenStream(reader,docId,field,analyzer); } return ts; } TokenStream* TokenSources::getTokenStream(TermPositionVector* tpv) { //assumes the worst and makes no assumptions about token position sequences. return getTokenStream(tpv,false); } TokenStream* TokenSources::getTokenStream(TermPositionVector* tpv, bool tokenPositionsGuaranteedContiguous) { //an object used to iterate across an array of tokens /*class StoredTokenStream extends TokenStream { Token tokens[]; int32_t currentToken=0; StoredTokenStream(Token tokens[]) { this.tokens=tokens; } public Token next() { if(currentToken>=tokens.length) { return NULL; } return tokens[currentToken++]; } } */ //code to reconstruct the original sequence of Tokens const ArrayBase* terms = tpv->getTerms(); const ArrayBase* freq=tpv->getTermFrequencies(); size_t totalTokens=0; for (int32_t i = 0; i < freq->length; i++) totalTokens+=freq->values[i]; Token** tokensInOriginalOrder=NULL; CLSetList* unsortedTokens = NULL; for (int32_t t = 0; t < freq->length; t++) { const ArrayBase* offsets=tpv->getOffsets(t); if(offsets==NULL) return NULL; const ArrayBase* pos=NULL; if(tokenPositionsGuaranteedContiguous) { //try get the token position info to speed up assembly of tokens into sorted sequence pos=tpv->getTermPositions(t); } if ( tokensInOriginalOrder != NULL ) tokensInOriginalOrder = _CL_NEWARRAY(Token*, totalTokens+1); if(pos==NULL) { //tokens NOT stored with positions or not guaranteed contiguous - must add to list and sort later if(unsortedTokens==NULL) unsortedTokens=_CLNEW CLSetList(false); for (int32_t tp=0; tp < offsets->length; tp++) { unsortedTokens->insert(_CLNEW Token(terms->values[t], (*offsets)[tp]->getStartOffset(), (*offsets)[tp]->getEndOffset())); } } else { //We have positions stored and a guarantee that the token position information is contiguous // This may be fast BUT wont work if Tokenizers used which create >1 token in same position or // creates jumps in position numbers - this code would fail under those circumstances //tokens stored with positions - can use this to index straight into sorted array for (int32_t tp = 0; tp < pos->length; tp++) { tokensInOriginalOrder[(*pos)[tp]]=_CLNEW Token(terms->values[t], (*offsets)[tp]->getStartOffset(), (*offsets)[tp]->getEndOffset()); } } } //If the field has been stored without position data we must perform a sort if(unsortedTokens!=NULL) { if ( totalTokenssize() ){ _CLDELETE_ARRAY(tokensInOriginalOrder); tokensInOriginalOrder = _CL_NEWARRAY(Token*,unsortedTokens->size()+1); } //the list has already sorted our items //todo:check that this is true... unsortedTokens->toArray_nullTerminated(tokensInOriginalOrder); return _CLNEW StoredTokenStream(tokensInOriginalOrder,unsortedTokens->size()); }else return _CLNEW StoredTokenStream(tokensInOriginalOrder,totalTokens); } TokenStream* TokenSources::getTokenStream(IndexReader* reader,int32_t docId, TCHAR* field) { TermFreqVector* tfv=reader->getTermFreqVector(docId,field); if(tfv==NULL) { TCHAR buf[250]; _sntprintf(buf,250,_T("%s in doc #%d does not have any term position data stored"),field,docId); _CLTHROWT(CL_ERR_IllegalArgument,buf); return NULL; } TermPositionVector* tmp = NULL; tmp = tfv->__asTermPositionVector(); if ( tmp != NULL ){ return getTokenStream(tmp); }else{ TCHAR buf[250]; _sntprintf(buf,250,_T("%s in doc #%d does not have any term position data stored"),field,docId); _CLTHROWT(CL_ERR_IllegalArgument,buf); return NULL; } } //convenience method TokenStream* TokenSources::getTokenStream(IndexReader* reader,int32_t docId, TCHAR* field,Analyzer* analyzer) { CL_NS(document)::Document doc; reader->document(docId, doc); const TCHAR* contents=doc.get(field); if(contents==NULL) { TCHAR buf[250]; _sntprintf(buf,250,_T("Field %s in document #%d is not stored and cannot be analyzed"),field,docId); _CLTHROWT(CL_ERR_IllegalArgument,buf); return NULL; } return analyzer->tokenStream(field,_CLNEW StringReader(contents)); } TokenSources::StoredTokenStream::StoredTokenStream(CL_NS(analysis)::Token** tokens, size_t len) { currentToken = 0; this->tokens=tokens; this->length = len; } CL_NS(analysis)::Token* TokenSources::StoredTokenStream::next(CL_NS(analysis)::Token* token) { if(currentToken>=length) { return NULL; } Token* t = tokens[currentToken++]; token->set(t->termBuffer(),t->startOffset(),t->endOffset(),t->type());; return token; } void TokenSources::StoredTokenStream::close(){ } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/TokenSources.h000066400000000000000000000074431154025176300260300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_highlight_tokensources_ #define _lucene_search_highlight_tokensources_ #include "CLucene/analysis/AnalysisHeader.h" CL_CLASS_DEF(index, IndexReader) CL_CLASS_DEF(index, TermPositionVector) //#include "CLucene/index/IndexReader.h" //#include "CLucene/index/TermVector.h" CL_NS_DEF2(search,highlight) class CLUCENE_CONTRIBS_EXPORT TokenSources: LUCENE_BASE { //an object used to iterate across an array of tokens class StoredTokenStream:public CL_NS(analysis)::TokenStream { public: CL_NS(analysis)::Token** tokens; size_t length; int32_t currentToken; StoredTokenStream(CL_NS(analysis)::Token** tokens, size_t len); CL_NS(analysis)::Token* next(CL_NS(analysis)::Token* token); void close(); }; public: TokenSources(void); ~TokenSources(void); /** * A convenience method that tries a number of approaches to getting a token stream. * The cost of finding there are no termVectors in the index is minimal (1000 invocations still * registers 0 ms). So this "lazy" (flexible?) approach to coding is probably acceptable * @param reader * @param docId * @param field * @param analyzer * @return null if field not stored correctly * @throws IOException */ static CL_NS(analysis)::TokenStream* getAnyTokenStream(CL_NS(index)::IndexReader* reader,int32_t docId, TCHAR* field, CL_NS(analysis)::Analyzer* analyzer); static CL_NS(analysis)::TokenStream* getTokenStream(CL_NS(index)::TermPositionVector* tpv); /** * Low level api. * Returns a token stream or null if no offset info available in index. * This can be used to feed the highlighter with a pre-parsed token stream * * In my tests the speeds to recreate 1000 token streams using this method are: * - with TermVector offset only data stored - 420 milliseconds * - with TermVector offset AND position data stored - 271 milliseconds * (nb timings for TermVector with position data are based on a tokenizer with contiguous * positions - no overlaps or gaps) * The cost of not using TermPositionVector to store * pre-parsed content and using an analyzer to re-parse the original content: * - reanalyzing the original content - 980 milliseconds * * The re-analyze timings will typically vary depending on - * 1) The complexity of the analyzer code (timings above were using a * stemmer/lowercaser/stopword combo) * 2) The number of other fields (Lucene reads ALL fields off the disk * when accessing just one document field - can cost dear!) * 3) Use of compression on field storage - could be faster cos of compression (less disk IO) * or slower (more CPU burn) depending on the content. * * @param tpv * @param tokenPositionsGuaranteedContiguous true if the token position numbers have no overlaps or gaps. If looking * to eek out the last drops of performance, set to true. If in doubt, set to false. */ static CL_NS(analysis)::TokenStream* getTokenStream(CL_NS(index)::TermPositionVector* tpv, bool tokenPositionsGuaranteedContiguous); static CL_NS(analysis)::TokenStream* getTokenStream(CL_NS(index)::IndexReader* reader,int32_t docId, TCHAR* field); //convenience method static CL_NS(analysis)::TokenStream* getTokenStream(CL_NS(index)::IndexReader* reader,int32_t docId, TCHAR* field,CL_NS(analysis)::Analyzer* analyzer); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/WeightedTerm.cpp000066400000000000000000000045211154025176300263210ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_ApiHeader.h" #include "WeightedTerm.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/Misc.h" CL_NS_DEF2(search,highlight) WeightedTerm::WeightedTerm (float_t weight,const TCHAR* term) { _weight=weight; _term = stringDuplicate(term); cachedHashCode = 0; } WeightedTerm::~WeightedTerm() { _CLDELETE_CARRAY(_term); } WeightedTerm::WeightedTerm(const WeightedTerm& other) { _weight = other.getWeight(); _term = STRDUP_TtoT(other.getTerm()); } WeightedTerm* WeightedTerm::clone() const{ return _CLNEW WeightedTerm(*this); } /** * @return the term value (stemmed) */ const TCHAR* WeightedTerm::getTerm() const { return _term; } /** * @return the weight associated with this term */ float_t WeightedTerm::getWeight() const { return _weight; } /** * @param term the term value (stemmed) */ void WeightedTerm::setTerm(TCHAR* term) { _CLDELETE_CARRAY(this->_term); this->_term = STRDUP_TtoT(_term); cachedHashCode = 0; } /** * @param weight the weight associated with this term */ void WeightedTerm::setWeight(float_t weight) { this->_weight = _weight; cachedHashCode = 0; } size_t WeightedTerm::hashCode(){ if ( cachedHashCode == 0 ){ cachedHashCode = ( CL_NS(util)::Misc::thashCode(this->_term) ^ CL_NS(search)::Similarity::floatToByte(_weight) ); } return cachedHashCode; } bool WeightedTerm::Compare::operator()( WeightedTerm* t1, WeightedTerm* t2 ) const{ int r = _tcscmp(t1->getTerm(), t2->getTerm()); if ( r < 0 ) return true; else if ( r == 0 ) return t1->getWeight() < t2->getWeight(); else return false; } size_t WeightedTerm::Compare::operator()( WeightedTerm* t ) const{ return t->hashCode(); } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/highlighter/WeightedTerm.h000066400000000000000000000041351154025176300257670ustar00rootroot00000000000000/** * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _lucene_search_highlight_weightedterm_ #define _lucene_search_highlight_weightedterm_ //#include "CLucene/util/VoidList.h" CL_NS_DEF2(search,highlight) /** Lightweight class to hold term and a weight value used for scoring this term */ class CLUCENE_CONTRIBS_EXPORT WeightedTerm:LUCENE_BASE { private: float_t _weight; // multiplier TCHAR* _term; //stemmed form size_t cachedHashCode; WeightedTerm(const WeightedTerm& other); public: WeightedTerm (float_t weight,const TCHAR* term); ~WeightedTerm(); /** * @return the term value (stemmed) */ const TCHAR* getTerm() const; /** * @return the weight associated with this term */ float_t getWeight() const ; /** * @param term the term value (stemmed) */ void setTerm(TCHAR* term); /** * @param weight the weight associated with this term */ void setWeight(float_t weight); size_t hashCode(); WeightedTerm* clone() const; /** * Compare weighted terms, according to the term text. * @todo Do we have to take boost factors into account */ class Compare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: //todo: this should be more efficient, but will be using a hash table soon, anyway bool operator()( WeightedTerm* t1, WeightedTerm* t2 ) const; size_t operator()( WeightedTerm* t ) const; }; }; /** CLHashSet of WeightedTerm */ typedef CL_NS(util)::CLHashSet > WeightedTermList; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/000077500000000000000000000000001154025176300225465ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/SNOWBALL_README000066400000000000000000000065271154025176300247410ustar00rootroot00000000000000libstemmer_c ============ This document pertains to the C version of the libstemmer distribution, available for download from: http://snowball.tartarus.org/dist/libstemmer_c.tgz Compiling the library ===================== A simple makefile is provided for Unix style systems. On such systems, it should be possible simply to run "make", and the file "libstemmer.o" and the example program "stemwords" will be generated. If this doesn't work on your system, you need to write your own build system (or call the compiler directly). The files to compile are all contained in the "libstemmer", "runtime" and "src_c" directories, and the public header file is contained in the "include" directory. Using the library ================= The library provides a simple C API. Essentially, a new stemmer can be obtained by using "sb_stemmer_new". "sb_stemmer_stem" is then used to stem a word, "sb_stemmer_length" returns the stemmed length of the last word processed, and "sb_stemmer_delete" is used to delete a stemmer. Creating a stemmer is a relatively expensive operation - the expected usage pattern is that a new stemmer is created when needed, used to stem many words, and deleted after some time. Stemmers are re-entrant, but not threadsafe. In other words, if you wish to access the same stemmer object from multiple threads, you must ensure that all access is protected by a mutex or similar device. libstemmer does not currently incorporate any mechanism for caching the results of stemming operations. Such caching can greatly increase the performance of a stemmer under certain situations, so suitable patches will be considered for inclusion. The standard libstemmer sources contain an algorithm for each of the supported languages. The algorithm may be selected using the english name of the language, or using the 2 or 3 letter ISO 639 language codes. In addition, the traditional "Porter" stemming algorithm for english is included for backwards compatibility purposes, but we recommend use of the "English" stemmer in preference for new projects. (Some minor algorithms which are included only as curiosities in the snowball website, such as the Lovins stemmer and the Kraaij Pohlmann stemmer, are not included in the standard libstemmer sources. These are not really supported by the snowball project, but it would be possible to compile a modified libstemmer library containing these if desired.) The stemwords example ===================== The stemwords example program allows you to run any of the stemmers compiled into the libstemmer library on a sample vocabulary. For details on how to use it, run it with the "-h" command line option. Using the library in a larger system ==================================== If you are incorporating the library into the build system of a larger program, I recommend copying the unpacked tarball without modification into a subdirectory of the sources of your program. Future versions of the library are intended to keep the same structure, so this will keep the work required to move to a new version of the library to a minimum. As an additional convenience, the list of source and header files used in the library is detailed in mkinc.mak - a file which is in a suitable format for inclusion by a Makefile. By including this file in your build system, you can link the snowball system into your program with a few extra rules. clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/Snowball.cpp000066400000000000000000000100351154025176300250320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "SnowballAnalyzer.h" #include "SnowballFilter.h" #include "CLucene/util/Misc.h" #include "CLucene/util/CLStreams.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/analysis/standard/StandardTokenizer.h" #include "CLucene/analysis/standard/StandardFilter.h" CL_NS_USE(analysis) CL_NS_USE(util) CL_NS_USE2(analysis,standard) CL_NS_DEF2(analysis,snowball) /** Builds the named analyzer with no stop words. */ SnowballAnalyzer::SnowballAnalyzer(const TCHAR* language) { this->language = STRDUP_TtoT(language); stopSet = NULL; } SnowballAnalyzer::~SnowballAnalyzer(){ _CLDELETE_CARRAY(language); if ( stopSet != NULL ) _CLDELETE(stopSet); } /** Builds the named analyzer with the given stop words. */ SnowballAnalyzer::SnowballAnalyzer(const TCHAR* language, const TCHAR** stopWords) { this->language = STRDUP_TtoT(language); stopSet = _CLNEW CLTCSetList(true); StopFilter::fillStopTable(stopSet,stopWords); } TokenStream* SnowballAnalyzer::tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { return this->tokenStream(fieldName,reader,false); } /** Constructs a {@link StandardTokenizer} filtered by a {@link StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}. */ TokenStream* SnowballAnalyzer::tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader, bool deleteReader) { BufferedReader* bufferedReader = reader->__asBufferedReader(); TokenStream* result; if ( bufferedReader == NULL ) result = _CLNEW StandardTokenizer( _CLNEW FilteredBufferedReader(reader, deleteReader), true ); else result = _CLNEW StandardTokenizer(bufferedReader, deleteReader); result = _CLNEW StandardFilter(result, true); result = _CLNEW CL_NS(analysis)::LowerCaseFilter(result, true); if (stopSet != NULL) result = _CLNEW CL_NS(analysis)::StopFilter(result, true, stopSet); result = _CLNEW SnowballFilter(result, language, true); return result; } /** Construct the named stemming filter. * * @param in the input tokens to stem * @param name the name of a stemmer */ SnowballFilter::SnowballFilter(TokenStream* in, const TCHAR* language, bool deleteTS): TokenFilter(in,deleteTS) { TCHAR tlang[50]; char lang[50]; _tcsncpy(tlang,language,50); _tcslwr(tlang); STRCPY_TtoA(lang,tlang,50); stemmer = sb_stemmer_new(lang, NULL); //use utf8 encoding if ( stemmer == NULL ){ _CLTHROWA(CL_ERR_IllegalArgument, "language not available for stemming\n"); //todo: richer error } } SnowballFilter::~SnowballFilter(){ sb_stemmer_delete(stemmer); } /** Returns the next input Token, after being stemmed */ Token* SnowballFilter::next(Token* token){ if (input->next(token) == NULL) return NULL; unsigned char uctext[LUCENE_MAX_WORD_LEN]; TCHAR tchartext[LUCENE_MAX_WORD_LEN]; #ifdef _UCS2 char utf8text[LUCENE_MAX_WORD_LEN]; size_t len = lucene_wcstoutf8(utf8text,token->termBuffer(),LUCENE_MAX_WORD_LEN); memcpy(uctext,utf8text,len); uctext[len]='\0'; #else const char* tmp = token->termText(); int len = token->termTextLength(); for (int i=0;iset(tchartext,token->startOffset(), token->endOffset(), token->type()); return token; } CL_NS_END2 clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/SnowballAnalyzer.h000066400000000000000000000032071154025176300262100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_snowball_analyser_ #define _lucene_analysis_snowball_analyser_ #include "CLucene/analysis/AnalysisHeader.h" CL_CLASS_DEF(util,BufferedReader) CL_NS_DEF2(analysis,snowball) /** Filters {@link StandardTokenizer} with {@link StandardFilter}, {@link * LowerCaseFilter}, {@link StopFilter} and {@link SnowballFilter}. * * Available stemmers are listed in {@link net.sf.snowball.ext}. The name of a * stemmer is the part of the class name before "Stemmer", e.g., the stemmer in * {@link EnglishStemmer} is named "English". */ class CLUCENE_CONTRIBS_EXPORT SnowballAnalyzer: public Analyzer { TCHAR* language; CLTCSetList* stopSet; public: /** Builds the named analyzer with no stop words. */ SnowballAnalyzer(const TCHAR* language=_T("english")); /** Builds the named analyzer with the given stop words. */ SnowballAnalyzer(const TCHAR* language, const TCHAR** stopWords); ~SnowballAnalyzer(); /** Constructs a {@link StandardTokenizer} filtered by a {@link StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}. */ TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader, bool deleteReader); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/SnowballFilter.h000066400000000000000000000024711154025176300256520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_snowball_filter_ #define _lucene_analysis_snowball_filter_ #include "CLucene/analysis/AnalysisHeader.h" #include "libstemmer.h" CL_NS_DEF2(analysis,snowball) /** A filter that stems words using a Snowball-generated stemmer. * * Available stemmers are listed in {@link net.sf.snowball.ext}. The name of a * stemmer is the part of the class name before "Stemmer", e.g., the stemmer in * {@link EnglishStemmer} is named "English". * * Note: todo: This is not thread safe... */ class CLUCENE_CONTRIBS_EXPORT SnowballFilter: public TokenFilter { struct sb_stemmer * stemmer; public: /** Construct the named stemming filter. * * @param in the input tokens to stem * @param name the name of a stemmer */ SnowballFilter(TokenStream* in, const TCHAR* language, bool deleteTS); ~SnowballFilter(); /** Returns the next input Token, after being stemmed */ Token* next(Token* token); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/include/000077500000000000000000000000001154025176300241715ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/include/libstemmer.h000066400000000000000000000056731154025176300265200ustar00rootroot00000000000000#ifndef LIBSTEMMER_INCLUDE_LIBSTEMMER_H #define LIBSTEMMER_INCLUDE_LIBSTEMMER_H /* Make header file work when included from C++ */ #ifdef __cplusplus extern "C" { #endif struct sb_stemmer; typedef unsigned char sb_symbol; /* FIXME - should be able to get a version number for each stemming * algorithm (which will be incremented each time the output changes). */ /** Returns an array of the names of the available stemming algorithms. * Note that these are the canonical names - aliases (ie, other names for * the same algorithm) will not be included in the list. * The list is terminated with a null pointer. * * The list must not be modified in any way. */ const char ** sb_stemmer_list(void); /** Create a new stemmer object, using the specified algorithm, for the * specified character encoding. * * All algorithms will usually be available in UTF-8, but may also be * available in other character encodings. * * @param algorithm The algorithm name. This is either the english * name of the algorithm, or the 2 or 3 letter ISO 639 codes for the * language. Note that case is significant in this parameter - the * value should be supplied in lower case. * * @param charenc The character encoding. NULL may be passed as * this value, in which case UTF-8 encoding will be assumed. Otherwise, * the argument may be one of "UTF_8", "ISO_8859_1" (ie, Latin 1), * "CP850" (ie, MS-DOS Latin 1) or "KOI8_R" (Russian). Note that * case is significant in this parameter. * * @return NULL if the specified algorithm is not recognised, or the * algorithm is not available for the requested encoding. Otherwise, * returns a pointer to a newly created stemmer for the requested algorithm. * The returned pointer must be deleted by calling sb_stemmer_delete(). * * @note NULL will also be returned if an out of memory error occurs. */ struct sb_stemmer * sb_stemmer_new(const char * algorithm, const char * charenc); /** Delete a stemmer object. * * This frees all resources allocated for the stemmer. After calling * this function, the supplied stemmer may no longer be used in any way. * * It is safe to pass a null pointer to this function - this will have * no effect. */ void sb_stemmer_delete(struct sb_stemmer * stemmer); /** Stem a word. * * The return value is owned by the stemmer - it must not be freed or * modified, and it will become invalid when the stemmer is called again, * or if the stemmer is freed. * * The length of the return value can be obtained using sb_stemmer_length(). * * If an out-of-memory error occurs, this will return NULL. */ const sb_symbol * sb_stemmer_stem(struct sb_stemmer * stemmer, const sb_symbol * word, int size); /** Get the length of the result of the last stemmed word. * This should not be called before sb_stemmer_stem() has been called. */ int sb_stemmer_length(struct sb_stemmer * stemmer); #ifdef __cplusplus } #endif #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/libstemmer.h000066400000000000000000000055441154025176300250720ustar00rootroot00000000000000 /* Make header file work when included from C++ */ #ifdef __cplusplus extern "C" { #endif struct sb_stemmer; typedef unsigned char sb_symbol; /* FIXME - should be able to get a version number for each stemming * algorithm (which will be incremented each time the output changes). */ /** Returns an array of the names of the available stemming algorithms. * Note that these are the canonical names - aliases (ie, other names for * the same algorithm) will not be included in the list. * The list is terminated with a null pointer. * * The list must not be modified in any way. */ const char ** sb_stemmer_list(void); /** Create a new stemmer object, using the specified algorithm, for the * specified character encoding. * * All algorithms will usually be available in UTF-8, but may also be * available in other character encodings. * * @param algorithm The algorithm name. This is either the english * name of the algorithm, or the 2 or 3 letter ISO 639 codes for the * language. Note that case is significant in this parameter - the * value should be supplied in lower case. * * @param charenc The character encoding. NULL may be passed as * this value, in which case UTF-8 encoding will be assumed. Otherwise, * the argument may be one of "UTF_8", "ISO_8859_1" (ie, Latin 1), * "CP850" (ie, MS-DOS Latin 1) or "KOI8_R" (Russian). Note that * case is significant in this parameter. * * @return NULL if the specified algorithm is not recognised, or the * algorithm is not available for the requested encoding. Otherwise, * returns a pointer to a newly created stemmer for the requested algorithm. * The returned pointer must be deleted by calling sb_stemmer_delete(). * * @note NULL will also be returned if an out of memory error occurs. */ struct sb_stemmer * sb_stemmer_new(const char * algorithm, const char * charenc); /** Delete a stemmer object. * * This frees all resources allocated for the stemmer. After calling * this function, the supplied stemmer may no longer be used in any way. * * It is safe to pass a null pointer to this function - this will have * no effect. */ void sb_stemmer_delete(struct sb_stemmer * stemmer); /** Stem a word. * * The return value is owned by the stemmer - it must not be freed or * modified, and it will become invalid when the stemmer is called again, * or if the stemmer is freed. * * The length of the return value can be obtained using sb_stemmer_length(). * * If an out-of-memory error occurs, this will return NULL. */ const sb_symbol * sb_stemmer_stem(struct sb_stemmer * stemmer, const sb_symbol * word, int size); /** Get the length of the result of the last stemmed word. * This should not be called before sb_stemmer_stem() has been called. */ int sb_stemmer_length(struct sb_stemmer * stemmer); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/libstemmer/000077500000000000000000000000001154025176300247115ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/libstemmer/libstemmer.c000066400000000000000000000041661154025176300272270ustar00rootroot00000000000000 #include #include #include "../include/libstemmer.h" #include "../runtime/api.h" #include "modules.h" struct sb_stemmer { struct SN_env * (*create)(void); void (*close)(struct SN_env *); int (*stem)(struct SN_env *); struct SN_env * env; }; extern const char ** sb_stemmer_list(void) { return algorithm_names; } static stemmer_encoding sb_getenc(const char * charenc) { struct stemmer_encoding * encoding; if (charenc == NULL) return ENC_UTF_8; for (encoding = encodings; encoding->name != 0; encoding++) { if (strcmp(encoding->name, charenc) == 0) break; } if (encoding->name == NULL) return ENC_UNKNOWN; return encoding->enc; } extern struct sb_stemmer * sb_stemmer_new(const char * algorithm, const char * charenc) { stemmer_encoding enc; struct stemmer_modules * module; struct sb_stemmer * stemmer = (struct sb_stemmer *) malloc(sizeof(struct sb_stemmer)); if (stemmer == NULL) return NULL; enc = sb_getenc(charenc); if (enc == ENC_UNKNOWN) return NULL; for (module = modules; module->name != 0; module++) { if (strcmp(module->name, algorithm) == 0 && module->enc == enc) break; } if (module->name == NULL) return NULL; stemmer->create = module->create; stemmer->close = module->close; stemmer->stem = module->stem; stemmer->env = stemmer->create(); if (stemmer->env == NULL) { sb_stemmer_delete(stemmer); return NULL; } return stemmer; } void sb_stemmer_delete(struct sb_stemmer * stemmer) { if (stemmer == 0) return; if (stemmer->close == 0) return; stemmer->close(stemmer->env); stemmer->close = 0; free(stemmer); } const sb_symbol * sb_stemmer_stem(struct sb_stemmer * stemmer, const sb_symbol * word, int size) { int ret; if (SN_set_current(stemmer->env, size, word)) { stemmer->env->l = 0; return NULL; } ret = stemmer->stem(stemmer->env); if (ret < 0) return NULL; stemmer->env->p[stemmer->env->l] = 0; return stemmer->env->p; } int sb_stemmer_length(struct sb_stemmer * stemmer) { return stemmer->env->l; } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/libstemmer/modules.h000066400000000000000000000247531154025176300265450ustar00rootroot00000000000000#ifndef LIBSTEMMER_MODULES_H #define LIBSTEMMER_MODULES_H /* libstemmer/modules.h: List of stemming modules. * * This file is generated by mkmodules.pl from a list of module names. * Do not edit manually. * * Modules included by this file are: danish, dutch, english, finnish, french, * german, italian, norwegian, porter, portuguese, russian, spanish, swedish */ #include "../src_c/stem_ISO_8859_1_danish.h" #include "../src_c/stem_UTF_8_danish.h" #include "../src_c/stem_ISO_8859_1_dutch.h" #include "../src_c/stem_UTF_8_dutch.h" #include "../src_c/stem_ISO_8859_1_english.h" #include "../src_c/stem_UTF_8_english.h" #include "../src_c/stem_ISO_8859_1_finnish.h" #include "../src_c/stem_UTF_8_finnish.h" #include "../src_c/stem_ISO_8859_1_french.h" #include "../src_c/stem_UTF_8_french.h" #include "../src_c/stem_ISO_8859_1_german.h" #include "../src_c/stem_UTF_8_german.h" #include "../src_c/stem_ISO_8859_1_italian.h" #include "../src_c/stem_UTF_8_italian.h" #include "../src_c/stem_ISO_8859_1_norwegian.h" #include "../src_c/stem_UTF_8_norwegian.h" #include "../src_c/stem_ISO_8859_1_porter.h" #include "../src_c/stem_UTF_8_porter.h" #include "../src_c/stem_ISO_8859_1_portuguese.h" #include "../src_c/stem_UTF_8_portuguese.h" #include "../src_c/stem_KOI8_R_russian.h" #include "../src_c/stem_UTF_8_russian.h" #include "../src_c/stem_ISO_8859_1_spanish.h" #include "../src_c/stem_UTF_8_spanish.h" #include "../src_c/stem_ISO_8859_1_swedish.h" #include "../src_c/stem_UTF_8_swedish.h" typedef enum { ENC_UNKNOWN, ENC_ISO_8859_1, ENC_KOI8_R, ENC_UTF_8, } stemmer_encoding; struct stemmer_encoding { const char * name; stemmer_encoding enc; }; static struct stemmer_encoding encodings[] = { {"ISO_8859_1", ENC_ISO_8859_1}, {"KOI8_R", ENC_KOI8_R}, {"UTF_8", ENC_UTF_8}, {0,0} }; struct stemmer_modules { const char * name; stemmer_encoding enc; struct SN_env * (*create)(void); void (*close)(struct SN_env *); int (*stem)(struct SN_env *); }; static struct stemmer_modules modules[] = { {"da", ENC_ISO_8859_1, danish_ISO_8859_1_create_env, danish_ISO_8859_1_close_env, danish_ISO_8859_1_stem}, {"da", ENC_UTF_8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem}, {"dan", ENC_ISO_8859_1, danish_ISO_8859_1_create_env, danish_ISO_8859_1_close_env, danish_ISO_8859_1_stem}, {"dan", ENC_UTF_8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem}, {"danish", ENC_ISO_8859_1, danish_ISO_8859_1_create_env, danish_ISO_8859_1_close_env, danish_ISO_8859_1_stem}, {"danish", ENC_UTF_8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem}, {"de", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem}, {"de", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem}, {"deu", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem}, {"deu", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem}, {"dut", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem}, {"dut", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem}, {"dutch", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem}, {"dutch", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem}, {"en", ENC_ISO_8859_1, english_ISO_8859_1_create_env, english_ISO_8859_1_close_env, english_ISO_8859_1_stem}, {"en", ENC_UTF_8, english_UTF_8_create_env, english_UTF_8_close_env, english_UTF_8_stem}, {"eng", ENC_ISO_8859_1, english_ISO_8859_1_create_env, english_ISO_8859_1_close_env, english_ISO_8859_1_stem}, {"eng", ENC_UTF_8, english_UTF_8_create_env, english_UTF_8_close_env, english_UTF_8_stem}, {"english", ENC_ISO_8859_1, english_ISO_8859_1_create_env, english_ISO_8859_1_close_env, english_ISO_8859_1_stem}, {"english", ENC_UTF_8, english_UTF_8_create_env, english_UTF_8_close_env, english_UTF_8_stem}, {"es", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem}, {"es", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem}, {"esl", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem}, {"esl", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem}, {"fi", ENC_ISO_8859_1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem}, {"fi", ENC_UTF_8, finnish_UTF_8_create_env, finnish_UTF_8_close_env, finnish_UTF_8_stem}, {"fin", ENC_ISO_8859_1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem}, {"fin", ENC_UTF_8, finnish_UTF_8_create_env, finnish_UTF_8_close_env, finnish_UTF_8_stem}, {"finnish", ENC_ISO_8859_1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem}, {"finnish", ENC_UTF_8, finnish_UTF_8_create_env, finnish_UTF_8_close_env, finnish_UTF_8_stem}, {"fr", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem}, {"fr", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem}, {"fra", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem}, {"fra", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem}, {"fre", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem}, {"fre", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem}, {"french", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem}, {"french", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem}, {"ger", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem}, {"ger", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem}, {"german", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem}, {"german", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem}, {"it", ENC_ISO_8859_1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem}, {"it", ENC_UTF_8, italian_UTF_8_create_env, italian_UTF_8_close_env, italian_UTF_8_stem}, {"ita", ENC_ISO_8859_1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem}, {"ita", ENC_UTF_8, italian_UTF_8_create_env, italian_UTF_8_close_env, italian_UTF_8_stem}, {"italian", ENC_ISO_8859_1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem}, {"italian", ENC_UTF_8, italian_UTF_8_create_env, italian_UTF_8_close_env, italian_UTF_8_stem}, {"nl", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem}, {"nl", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem}, {"nld", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem}, {"nld", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem}, {"no", ENC_ISO_8859_1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem}, {"no", ENC_UTF_8, norwegian_UTF_8_create_env, norwegian_UTF_8_close_env, norwegian_UTF_8_stem}, {"nor", ENC_ISO_8859_1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem}, {"nor", ENC_UTF_8, norwegian_UTF_8_create_env, norwegian_UTF_8_close_env, norwegian_UTF_8_stem}, {"norwegian", ENC_ISO_8859_1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem}, {"norwegian", ENC_UTF_8, norwegian_UTF_8_create_env, norwegian_UTF_8_close_env, norwegian_UTF_8_stem}, {"por", ENC_ISO_8859_1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem}, {"por", ENC_UTF_8, portuguese_UTF_8_create_env, portuguese_UTF_8_close_env, portuguese_UTF_8_stem}, {"porter", ENC_ISO_8859_1, porter_ISO_8859_1_create_env, porter_ISO_8859_1_close_env, porter_ISO_8859_1_stem}, {"porter", ENC_UTF_8, porter_UTF_8_create_env, porter_UTF_8_close_env, porter_UTF_8_stem}, {"portuguese", ENC_ISO_8859_1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem}, {"portuguese", ENC_UTF_8, portuguese_UTF_8_create_env, portuguese_UTF_8_close_env, portuguese_UTF_8_stem}, {"pt", ENC_ISO_8859_1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem}, {"pt", ENC_UTF_8, portuguese_UTF_8_create_env, portuguese_UTF_8_close_env, portuguese_UTF_8_stem}, {"ru", ENC_KOI8_R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem}, {"ru", ENC_UTF_8, russian_UTF_8_create_env, russian_UTF_8_close_env, russian_UTF_8_stem}, {"rus", ENC_KOI8_R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem}, {"rus", ENC_UTF_8, russian_UTF_8_create_env, russian_UTF_8_close_env, russian_UTF_8_stem}, {"russian", ENC_KOI8_R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem}, {"russian", ENC_UTF_8, russian_UTF_8_create_env, russian_UTF_8_close_env, russian_UTF_8_stem}, {"spa", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem}, {"spa", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem}, {"spanish", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem}, {"spanish", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem}, {"sv", ENC_ISO_8859_1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem}, {"sv", ENC_UTF_8, swedish_UTF_8_create_env, swedish_UTF_8_close_env, swedish_UTF_8_stem}, {"swe", ENC_ISO_8859_1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem}, {"swe", ENC_UTF_8, swedish_UTF_8_create_env, swedish_UTF_8_close_env, swedish_UTF_8_stem}, {"swedish", ENC_ISO_8859_1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem}, {"swedish", ENC_UTF_8, swedish_UTF_8_create_env, swedish_UTF_8_close_env, swedish_UTF_8_stem}, {0,0,0,0,0} }; static const char * algorithm_names[] = { "danish", "dutch", "english", "finnish", "french", "german", "italian", "norwegian", "porter", "portuguese", "russian", "spanish", "swedish", 0 }; #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/runtime/000077500000000000000000000000001154025176300242315ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/runtime/api.c000066400000000000000000000026761154025176300251610ustar00rootroot00000000000000 #include /* for calloc, free */ #include "header.h" extern struct SN_env * SN_create_env(int S_size, int I_size, int B_size) { struct SN_env * z = (struct SN_env *) calloc(1, sizeof(struct SN_env)); if (z == NULL) return NULL; z->p = create_s(); if (z->p == NULL) goto error; if (S_size) { int i; z->S = (symbol * *) calloc(S_size, sizeof(symbol *)); if (z->S == NULL) goto error; for (i = 0; i < S_size; i++) { z->S[i] = create_s(); if (z->S[i] == NULL) goto error; } z->S_size = S_size; } if (I_size) { z->I = (int *) calloc(I_size, sizeof(int)); if (z->I == NULL) goto error; z->I_size = I_size; } if (B_size) { z->B = (symbol *) calloc(B_size, sizeof(symbol)); if (z->B == NULL) goto error; z->B_size = B_size; } return z; error: SN_close_env(z); return NULL; } extern void SN_close_env(struct SN_env * z) { if (z == NULL) return; if (z->S_size) { int i; for (i = 0; i < z->S_size; i++) { lose_s(z->S[i]); } free(z->S); } if (z->I_size) free(z->I); if (z->B_size) free(z->B); if (z->p) lose_s(z->p); free(z); } extern int SN_set_current(struct SN_env * z, int size, const symbol * s) { int err = replace_s(z, 0, z->l, size, s, NULL); z->c = 0; return err; } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/runtime/api.h000066400000000000000000000015401154025176300251530ustar00rootroot00000000000000#ifndef LIBSTEMMER_RUNTIME_API_H #define LIBSTEMMER_RUNTIME_API_H typedef unsigned char symbol; /* Or replace 'char' above with 'short' for 16 bit characters. More precisely, replace 'char' with whatever type guarantees the character width you need. Note however that sizeof(symbol) should divide HEAD, defined in header.h as 2*sizeof(int), without remainder, otherwise there is an alignment problem. In the unlikely event of a problem here, consult Martin Porter. */ struct SN_env { symbol * p; int c; int a; int l; int lb; int bra; int ket; int S_size; int I_size; int B_size; symbol * * S; int * I; symbol * B; }; extern struct SN_env * SN_create_env(int S_size, int I_size, int B_size); extern void SN_close_env(struct SN_env * z); extern int SN_set_current(struct SN_env * z, int size, const symbol * s); #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/runtime/header.h000066400000000000000000000044641154025176300256420ustar00rootroot00000000000000#ifndef LIBSTEMMER_RUNTIME_HEADER_H #define LIBSTEMMER_RUNTIME_HEADER_H #include #include "api.h" #define MAXINT INT_MAX #define MININT INT_MIN #define HEAD 2*sizeof(int) #define SIZE(p) ((int *)(p))[-1] #define SET_SIZE(p, n) ((int *)(p))[-1] = n #define CAPACITY(p) ((int *)(p))[-2] struct among { int s_size; /* number of chars in string */ symbol * s; /* search string */ int substring_i;/* index to longest matching substring */ int result; /* result of the lookup */ int (* function)(struct SN_env *); }; extern symbol * create_s(void); extern void lose_s(symbol * p); extern int skip_utf8(const symbol * p, int c, int lb, int l, int n); extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max); extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max); extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max); extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max); extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max); extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max); extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max); extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max); extern int eq_s(struct SN_env * z, int s_size, symbol * s); extern int eq_s_b(struct SN_env * z, int s_size, symbol * s); extern int eq_v(struct SN_env * z, symbol * p); extern int eq_v_b(struct SN_env * z, symbol * p); extern int find_among(struct SN_env * z, struct among * v, int v_size); extern int find_among_b(struct SN_env * z, struct among * v, int v_size); extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjustment); extern int slice_from_s(struct SN_env * z, int s_size, symbol * s); extern int slice_from_v(struct SN_env * z, symbol * p); extern int slice_del(struct SN_env * z); extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s); extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p); extern symbol * slice_to(struct SN_env * z, symbol * p); extern symbol * assign_to(struct SN_env * z, symbol * p); extern void debug(struct SN_env * z, int number, int line_count); #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/runtime/utilities.c000066400000000000000000000304561154025176300264200ustar00rootroot00000000000000 #include #include #include #include "header.h" #define unless(C) if(!(C)) #define CREATE_SIZE 1 extern symbol * create_s(void) { symbol * p; void * mem = malloc(HEAD + (CREATE_SIZE + 1) * sizeof(symbol)); if (mem == NULL) return NULL; p = (symbol *) (HEAD + (char *) mem); CAPACITY(p) = CREATE_SIZE; SET_SIZE(p, CREATE_SIZE); return p; } extern void lose_s(symbol * p) { if (p == NULL) return; free((char *) p - HEAD); } /* new_p = X_skip_utf8(p, c, lb, l, n); skips n characters forwards from p + c if n +ve, or n characters backwards from p +c - 1 if n -ve. new_p is the new position, or 0 on failure. -- used to implement hop and next in the utf8 case. */ extern int skip_utf8(const symbol * p, int c, int lb, int l, int n) { int b; if (n >= 0) { for (; n > 0; n--) { if (c >= l) return -1; b = p[c++]; if (b >= 0xC0) { /* 1100 0000 */ while (c < l) { b = p[c]; if (b >= 0xC0 || b < 0x80) break; /* break unless b is 10------ */ c++; } } } } else { for (; n < 0; n++) { if (c <= lb) return -1; b = p[--c]; if (b >= 0x80) { /* 1000 0000 */ while (c > lb) { b = p[c]; if (b >= 0xC0) break; /* 1100 0000 */ c--; } } } } return c; } /* Code for character groupings: utf8 cases */ static int get_utf8(const symbol * p, int c, int l, int * slot) { int b0, b1; if (c >= l) return 0; b0 = p[c++]; if (b0 < 0xC0 || c == l) { /* 1100 0000 */ * slot = b0; return 1; } b1 = p[c++]; if (b0 < 0xE0 || c == l) { /* 1110 0000 */ * slot = (b0 & 0x1F) << 6 | (b1 & 0x3F); return 2; } * slot = (b0 & 0xF) << 12 | (b1 & 0x3F) << 6 | (*p & 0x3F); return 3; } static int get_b_utf8(const symbol * p, int c, int lb, int * slot) { int b0, b1; if (c <= lb) return 0; b0 = p[--c]; if (b0 < 0x80 || c == lb) { /* 1000 0000 */ * slot = b0; return 1; } b1 = p[--c]; if (b1 >= 0xC0 || c == lb) { /* 1100 0000 */ * slot = (b1 & 0x1F) << 6 | (b0 & 0x3F); return 2; } * slot = (*p & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F); return 3; } extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) { int ch; int w = get_utf8(z->p, z->c, z->l, & ch); unless (w) return 0; if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c += w; return 1; } extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) { int ch; int w = get_b_utf8(z->p, z->c, z->lb, & ch); unless (w) return 0; if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c -= w; return 1; } extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) { int ch; int w = get_utf8(z->p, z->c, z->l, & ch); unless (w) return 0; unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c += w; return 1; } extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) { int ch; int w = get_b_utf8(z->p, z->c, z->lb, & ch); unless (w) return 0; unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c -= w; return 1; } /* Code for character groupings: non-utf8 cases */ extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max) { int ch; if (z->c >= z->l) return 0; ch = z->p[z->c]; if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c++; return 1; } extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) { int ch; if (z->c <= z->lb) return 0; ch = z->p[z->c - 1]; if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c--; return 1; } extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max) { int ch; if (z->c >= z->l) return 0; ch = z->p[z->c]; unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c++; return 1; } extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) { int ch; if (z->c <= z->lb) return 0; ch = z->p[z->c - 1]; unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; z->c--; return 1; } extern int eq_s(struct SN_env * z, int s_size, symbol * s) { if (z->l - z->c < s_size || memcmp(z->p + z->c, s, s_size * sizeof(symbol)) != 0) return 0; z->c += s_size; return 1; } extern int eq_s_b(struct SN_env * z, int s_size, symbol * s) { if (z->c - z->lb < s_size || memcmp(z->p + z->c - s_size, s, s_size * sizeof(symbol)) != 0) return 0; z->c -= s_size; return 1; } extern int eq_v(struct SN_env * z, symbol * p) { return eq_s(z, SIZE(p), p); } extern int eq_v_b(struct SN_env * z, symbol * p) { return eq_s_b(z, SIZE(p), p); } extern int find_among(struct SN_env * z, struct among * v, int v_size) { int i = 0; int j = v_size; int c = z->c; int l = z->l; symbol * q = z->p + c; struct among * w; int common_i = 0; int common_j = 0; int first_key_inspected = 0; while(1) { int k = i + ((j - i) >> 1); int diff = 0; int common = common_i < common_j ? common_i : common_j; /* smaller */ w = v + k; { int i; for (i = common; i < w->s_size; i++) { if (c + common == l) { diff = -1; break; } diff = q[common] - w->s[i]; if (diff != 0) break; common++; } } if (diff < 0) { j = k; common_j = common; } else { i = k; common_i = common; } if (j - i <= 1) { if (i > 0) break; /* v->s has been inspected */ if (j == i) break; /* only one item in v */ /* - but now we need to go round once more to get v->s inspected. This looks messy, but is actually the optimal approach. */ if (first_key_inspected) break; first_key_inspected = 1; } } while(1) { w = v + i; if (common_i >= w->s_size) { z->c = c + w->s_size; if (w->function == 0) return w->result; { int res = w->function(z); z->c = c + w->s_size; if (res) return w->result; } } i = w->substring_i; if (i < 0) return 0; } } /* find_among_b is for backwards processing. Same comments apply */ extern int find_among_b(struct SN_env * z, struct among * v, int v_size) { int i = 0; int j = v_size; int c = z->c; int lb = z->lb; symbol * q = z->p + c - 1; struct among * w; int common_i = 0; int common_j = 0; int first_key_inspected = 0; while(1) { int k = i + ((j - i) >> 1); int diff = 0; int common = common_i < common_j ? common_i : common_j; w = v + k; { int i; for (i = w->s_size - 1 - common; i >= 0; i--) { if (c - common == lb) { diff = -1; break; } diff = q[- common] - w->s[i]; if (diff != 0) break; common++; } } if (diff < 0) { j = k; common_j = common; } else { i = k; common_i = common; } if (j - i <= 1) { if (i > 0) break; if (j == i) break; if (first_key_inspected) break; first_key_inspected = 1; } } while(1) { w = v + i; if (common_i >= w->s_size) { z->c = c - w->s_size; if (w->function == 0) return w->result; { int res = w->function(z); z->c = c - w->s_size; if (res) return w->result; } } i = w->substring_i; if (i < 0) return 0; } } /* Increase the size of the buffer pointed to by p to at least n symbols. * If insufficient memory, returns NULL and frees the old buffer. */ static symbol * increase_size(symbol * p, int n) { symbol * q; int new_size = n + 20; void * mem = realloc((char *) p - HEAD, HEAD + (new_size + 1) * sizeof(symbol)); if (mem == NULL) { lose_s(p); return NULL; } q = (symbol *) (HEAD + (char *)mem); CAPACITY(q) = new_size; return q; } /* to replace symbols between c_bra and c_ket in z->p by the s_size symbols at s. Returns 0 on success, -1 on error. Also, frees z->p (and sets it to NULL) on error. */ extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjptr) { int adjustment; int len; if (z->p == NULL) { z->p = create_s(); if (z->p == NULL) return -1; } adjustment = s_size - (c_ket - c_bra); len = SIZE(z->p); if (adjustment != 0) { if (adjustment + len > CAPACITY(z->p)) { z->p = increase_size(z->p, adjustment + len); if (z->p == NULL) return -1; } memmove(z->p + c_ket + adjustment, z->p + c_ket, (len - c_ket) * sizeof(symbol)); SET_SIZE(z->p, adjustment + len); z->l += adjustment; if (z->c >= c_ket) z->c += adjustment; else if (z->c > c_bra) z->c = c_bra; } unless (s_size == 0) memmove(z->p + c_bra, s, s_size * sizeof(symbol)); if (adjptr != NULL) *adjptr = adjustment; return 0; } static int slice_check(struct SN_env * z) { if (z->bra < 0 || z->bra > z->ket || z->ket > z->l || z->p == NULL || z->l > SIZE(z->p)) /* this line could be removed */ { #if 0 fprintf(stderr, "faulty slice operation:\n"); debug(z, -1, 0); #endif return -1; } return 0; } extern int slice_from_s(struct SN_env * z, int s_size, symbol * s) { if (slice_check(z)) return -1; return replace_s(z, z->bra, z->ket, s_size, s, NULL); } extern int slice_from_v(struct SN_env * z, symbol * p) { return slice_from_s(z, SIZE(p), p); } extern int slice_del(struct SN_env * z) { return slice_from_s(z, 0, 0); } extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s) { int adjustment; if (replace_s(z, bra, ket, s_size, s, &adjustment)) return -1; if (bra <= z->bra) z->bra += adjustment; if (bra <= z->ket) z->ket += adjustment; return 0; } extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p) { int adjustment; if (replace_s(z, bra, ket, SIZE(p), p, &adjustment)) return -1; if (bra <= z->bra) z->bra += adjustment; if (bra <= z->ket) z->ket += adjustment; return 0; } extern symbol * slice_to(struct SN_env * z, symbol * p) { if (slice_check(z)) { lose_s(p); return NULL; } { int len = z->ket - z->bra; if (CAPACITY(p) < len) { p = increase_size(p, len); if (p == NULL) return NULL; } memmove(p, z->p + z->bra, len * sizeof(symbol)); SET_SIZE(p, len); } return p; } extern symbol * assign_to(struct SN_env * z, symbol * p) { int len = z->l; if (CAPACITY(p) < len) { p = increase_size(p, len); if (p == NULL) return NULL; } memmove(p, z->p, len * sizeof(symbol)); SET_SIZE(p, len); return p; } #if 0 extern void debug(struct SN_env * z, int number, int line_count) { int i; int limit = SIZE(z->p); /*if (number >= 0) printf("%3d (line %4d): '", number, line_count);*/ if (number >= 0) printf("%3d (line %4d): [%d]'", number, line_count,limit); for (i = 0; i <= limit; i++) { if (z->lb == i) printf("{"); if (z->bra == i) printf("["); if (z->c == i) printf("|"); if (z->ket == i) printf("]"); if (z->l == i) printf("}"); if (i < limit) { int ch = z->p[i]; if (ch == 0) ch = '#'; printf("%c", ch); } } printf("'\n"); } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/snowball.version000066400000000000000000000000121154025176300257670ustar00rootroot00000000000000May 2005 clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/000077500000000000000000000000001154025176300236375ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_danish.c000066400000000000000000000252751154025176300277430ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int danish_ISO_8859_1_stem(struct SN_env * z); static int r_undouble(struct SN_env * z); static int r_other_suffix(struct SN_env * z); static int r_consonant_pair(struct SN_env * z); static int r_main_suffix(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * danish_ISO_8859_1_create_env(void); extern void danish_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_0[3] = { 'h', 'e', 'd' }; static symbol s_0_1[5] = { 'e', 't', 'h', 'e', 'd' }; static symbol s_0_2[4] = { 'e', 'r', 'e', 'd' }; static symbol s_0_3[1] = { 'e' }; static symbol s_0_4[5] = { 'e', 'r', 'e', 'd', 'e' }; static symbol s_0_5[4] = { 'e', 'n', 'd', 'e' }; static symbol s_0_6[6] = { 'e', 'r', 'e', 'n', 'd', 'e' }; static symbol s_0_7[3] = { 'e', 'n', 'e' }; static symbol s_0_8[4] = { 'e', 'r', 'n', 'e' }; static symbol s_0_9[3] = { 'e', 'r', 'e' }; static symbol s_0_10[2] = { 'e', 'n' }; static symbol s_0_11[5] = { 'h', 'e', 'd', 'e', 'n' }; static symbol s_0_12[4] = { 'e', 'r', 'e', 'n' }; static symbol s_0_13[2] = { 'e', 'r' }; static symbol s_0_14[5] = { 'h', 'e', 'd', 'e', 'r' }; static symbol s_0_15[4] = { 'e', 'r', 'e', 'r' }; static symbol s_0_16[1] = { 's' }; static symbol s_0_17[4] = { 'h', 'e', 'd', 's' }; static symbol s_0_18[2] = { 'e', 's' }; static symbol s_0_19[5] = { 'e', 'n', 'd', 'e', 's' }; static symbol s_0_20[7] = { 'e', 'r', 'e', 'n', 'd', 'e', 's' }; static symbol s_0_21[4] = { 'e', 'n', 'e', 's' }; static symbol s_0_22[5] = { 'e', 'r', 'n', 'e', 's' }; static symbol s_0_23[4] = { 'e', 'r', 'e', 's' }; static symbol s_0_24[3] = { 'e', 'n', 's' }; static symbol s_0_25[6] = { 'h', 'e', 'd', 'e', 'n', 's' }; static symbol s_0_26[5] = { 'e', 'r', 'e', 'n', 's' }; static symbol s_0_27[3] = { 'e', 'r', 's' }; static symbol s_0_28[3] = { 'e', 't', 's' }; static symbol s_0_29[5] = { 'e', 'r', 'e', 't', 's' }; static symbol s_0_30[2] = { 'e', 't' }; static symbol s_0_31[4] = { 'e', 'r', 'e', 't' }; static struct among a_0[32] = { /* 0 */ { 3, s_0_0, -1, 1, 0}, /* 1 */ { 5, s_0_1, 0, 1, 0}, /* 2 */ { 4, s_0_2, -1, 1, 0}, /* 3 */ { 1, s_0_3, -1, 1, 0}, /* 4 */ { 5, s_0_4, 3, 1, 0}, /* 5 */ { 4, s_0_5, 3, 1, 0}, /* 6 */ { 6, s_0_6, 5, 1, 0}, /* 7 */ { 3, s_0_7, 3, 1, 0}, /* 8 */ { 4, s_0_8, 3, 1, 0}, /* 9 */ { 3, s_0_9, 3, 1, 0}, /* 10 */ { 2, s_0_10, -1, 1, 0}, /* 11 */ { 5, s_0_11, 10, 1, 0}, /* 12 */ { 4, s_0_12, 10, 1, 0}, /* 13 */ { 2, s_0_13, -1, 1, 0}, /* 14 */ { 5, s_0_14, 13, 1, 0}, /* 15 */ { 4, s_0_15, 13, 1, 0}, /* 16 */ { 1, s_0_16, -1, 2, 0}, /* 17 */ { 4, s_0_17, 16, 1, 0}, /* 18 */ { 2, s_0_18, 16, 1, 0}, /* 19 */ { 5, s_0_19, 18, 1, 0}, /* 20 */ { 7, s_0_20, 19, 1, 0}, /* 21 */ { 4, s_0_21, 18, 1, 0}, /* 22 */ { 5, s_0_22, 18, 1, 0}, /* 23 */ { 4, s_0_23, 18, 1, 0}, /* 24 */ { 3, s_0_24, 16, 1, 0}, /* 25 */ { 6, s_0_25, 24, 1, 0}, /* 26 */ { 5, s_0_26, 24, 1, 0}, /* 27 */ { 3, s_0_27, 16, 1, 0}, /* 28 */ { 3, s_0_28, 16, 1, 0}, /* 29 */ { 5, s_0_29, 28, 1, 0}, /* 30 */ { 2, s_0_30, -1, 1, 0}, /* 31 */ { 4, s_0_31, 30, 1, 0} }; static symbol s_1_0[2] = { 'g', 'd' }; static symbol s_1_1[2] = { 'd', 't' }; static symbol s_1_2[2] = { 'g', 't' }; static symbol s_1_3[2] = { 'k', 't' }; static struct among a_1[4] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0}, /* 2 */ { 2, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0} }; static symbol s_2_0[2] = { 'i', 'g' }; static symbol s_2_1[3] = { 'l', 'i', 'g' }; static symbol s_2_2[4] = { 'e', 'l', 'i', 'g' }; static symbol s_2_3[3] = { 'e', 'l', 's' }; static symbol s_2_4[4] = { 'l', 0xF8, 's', 't' }; static struct among a_2[5] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 3, s_2_1, 0, 1, 0}, /* 2 */ { 4, s_2_2, 1, 1, 0}, /* 3 */ { 3, s_2_3, -1, 1, 0}, /* 4 */ { 4, s_2_4, -1, 2, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 }; static unsigned char g_s_ending[] = { 239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 }; static symbol s_0[] = { 's', 't' }; static symbol s_1[] = { 'i', 'g' }; static symbol s_2[] = { 'l', 0xF8, 's' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; { int c_test = z->c; /* test, line 33 */ { int c = z->c + 3; if (0 > c || c > z->l) return 0; z->c = c; /* hop, line 33 */ } z->I[1] = z->c; /* setmark x, line 33 */ z->c = c_test; } while(1) { /* goto, line 34 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 248))) goto lab0; z->c = c; break; lab0: z->c = c; if (z->c >= z->l) return 0; z->c++; /* goto, line 34 */ } while(1) { /* gopast, line 34 */ if (!(out_grouping(z, g_v, 97, 248))) goto lab1; break; lab1: if (z->c >= z->l) return 0; z->c++; /* gopast, line 34 */ } z->I[0] = z->c; /* setmark p1, line 34 */ /* try, line 35 */ if (!(z->I[0] < z->I[1])) goto lab2; z->I[0] = z->I[1]; lab2: return 1; } static int r_main_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 41 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 41 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 41 */ among_var = find_among_b(z, a_0, 32); /* substring, line 41 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 41 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 48 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b(z, g_s_ending, 97, 229))) return 0; { int ret; ret = slice_del(z); /* delete, line 50 */ if (ret < 0) return ret; } break; } return 1; } static int r_consonant_pair(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 55 */ { int m3; /* setlimit, line 56 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 56 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 56 */ if (!(find_among_b(z, a_1, 4))) { z->lb = m3; return 0; } /* substring, line 56 */ z->bra = z->c; /* ], line 56 */ z->lb = m3; } z->c = z->l - m_test; } if (z->c <= z->lb) return 0; z->c--; /* next, line 62 */ z->bra = z->c; /* ], line 62 */ { int ret; ret = slice_del(z); /* delete, line 62 */ if (ret < 0) return ret; } return 1; } static int r_other_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* do, line 66 */ z->ket = z->c; /* [, line 66 */ if (!(eq_s_b(z, 2, s_0))) goto lab0; z->bra = z->c; /* ], line 66 */ if (!(eq_s_b(z, 2, s_1))) goto lab0; { int ret; ret = slice_del(z); /* delete, line 66 */ if (ret < 0) return ret; } lab0: z->c = z->l - m; } { int m3; /* setlimit, line 67 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 67 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 67 */ among_var = find_among_b(z, a_2, 5); /* substring, line 67 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 67 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 70 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* do, line 70 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab1; /* call consonant_pair, line 70 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } break; case 2: { int ret; ret = slice_from_s(z, 3, s_2); /* <-, line 72 */ if (ret < 0) return ret; } break; } return 1; } static int r_undouble(struct SN_env * z) { { int m3; /* setlimit, line 76 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 76 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 76 */ if (!(out_grouping_b(z, g_v, 97, 248))) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 76 */ z->S[0] = slice_to(z, z->S[0]); /* -> ch, line 76 */ if (z->S[0] == 0) return -1; /* -> ch, line 76 */ z->lb = m3; } if (!(eq_v_b(z, z->S[0]))) return 0; /* name ch, line 77 */ { int ret; ret = slice_del(z); /* delete, line 78 */ if (ret < 0) return ret; } return 1; } extern int danish_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 84 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 84 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 85 */ { int m = z->l - z->c; (void) m; /* do, line 86 */ { int ret = r_main_suffix(z); if (ret == 0) goto lab1; /* call main_suffix, line 86 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 87 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab2; /* call consonant_pair, line 87 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 88 */ { int ret = r_other_suffix(z); if (ret == 0) goto lab3; /* call other_suffix, line 88 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 89 */ { int ret = r_undouble(z); if (ret == 0) goto lab4; /* call undouble, line 89 */ if (ret < 0) return ret; } lab4: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * danish_ISO_8859_1_create_env(void) { return SN_create_env(1, 2, 0); } extern void danish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_danish.h000066400000000000000000000005051154025176300277350ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * danish_ISO_8859_1_create_env(void); extern void danish_ISO_8859_1_close_env(struct SN_env * z); extern int danish_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_dutch.c000066400000000000000000000474561154025176300276110ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int dutch_ISO_8859_1_stem(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_undouble(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_en_ending(struct SN_env * z); static int r_e_ending(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * dutch_ISO_8859_1_create_env(void); extern void dutch_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_1[1] = { 0xE1 }; static symbol s_0_2[1] = { 0xE4 }; static symbol s_0_3[1] = { 0xE9 }; static symbol s_0_4[1] = { 0xEB }; static symbol s_0_5[1] = { 0xED }; static symbol s_0_6[1] = { 0xEF }; static symbol s_0_7[1] = { 0xF3 }; static symbol s_0_8[1] = { 0xF6 }; static symbol s_0_9[1] = { 0xFA }; static symbol s_0_10[1] = { 0xFC }; static struct among a_0[11] = { /* 0 */ { 0, 0, -1, 6, 0}, /* 1 */ { 1, s_0_1, 0, 1, 0}, /* 2 */ { 1, s_0_2, 0, 1, 0}, /* 3 */ { 1, s_0_3, 0, 2, 0}, /* 4 */ { 1, s_0_4, 0, 2, 0}, /* 5 */ { 1, s_0_5, 0, 3, 0}, /* 6 */ { 1, s_0_6, 0, 3, 0}, /* 7 */ { 1, s_0_7, 0, 4, 0}, /* 8 */ { 1, s_0_8, 0, 4, 0}, /* 9 */ { 1, s_0_9, 0, 5, 0}, /* 10 */ { 1, s_0_10, 0, 5, 0} }; static symbol s_1_1[1] = { 'I' }; static symbol s_1_2[1] = { 'Y' }; static struct among a_1[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 1, s_1_1, 0, 2, 0}, /* 2 */ { 1, s_1_2, 0, 1, 0} }; static symbol s_2_0[2] = { 'd', 'd' }; static symbol s_2_1[2] = { 'k', 'k' }; static symbol s_2_2[2] = { 't', 't' }; static struct among a_2[3] = { /* 0 */ { 2, s_2_0, -1, -1, 0}, /* 1 */ { 2, s_2_1, -1, -1, 0}, /* 2 */ { 2, s_2_2, -1, -1, 0} }; static symbol s_3_0[3] = { 'e', 'n', 'e' }; static symbol s_3_1[2] = { 's', 'e' }; static symbol s_3_2[2] = { 'e', 'n' }; static symbol s_3_3[5] = { 'h', 'e', 'd', 'e', 'n' }; static symbol s_3_4[1] = { 's' }; static struct among a_3[5] = { /* 0 */ { 3, s_3_0, -1, 2, 0}, /* 1 */ { 2, s_3_1, -1, 3, 0}, /* 2 */ { 2, s_3_2, -1, 2, 0}, /* 3 */ { 5, s_3_3, 2, 1, 0}, /* 4 */ { 1, s_3_4, -1, 3, 0} }; static symbol s_4_0[3] = { 'e', 'n', 'd' }; static symbol s_4_1[2] = { 'i', 'g' }; static symbol s_4_2[3] = { 'i', 'n', 'g' }; static symbol s_4_3[4] = { 'l', 'i', 'j', 'k' }; static symbol s_4_4[4] = { 'b', 'a', 'a', 'r' }; static symbol s_4_5[3] = { 'b', 'a', 'r' }; static struct among a_4[6] = { /* 0 */ { 3, s_4_0, -1, 1, 0}, /* 1 */ { 2, s_4_1, -1, 2, 0}, /* 2 */ { 3, s_4_2, -1, 1, 0}, /* 3 */ { 4, s_4_3, -1, 3, 0}, /* 4 */ { 4, s_4_4, -1, 4, 0}, /* 5 */ { 3, s_4_5, -1, 5, 0} }; static symbol s_5_0[2] = { 'a', 'a' }; static symbol s_5_1[2] = { 'e', 'e' }; static symbol s_5_2[2] = { 'o', 'o' }; static symbol s_5_3[2] = { 'u', 'u' }; static struct among a_5[4] = { /* 0 */ { 2, s_5_0, -1, -1, 0}, /* 1 */ { 2, s_5_1, -1, -1, 0}, /* 2 */ { 2, s_5_2, -1, -1, 0}, /* 3 */ { 2, s_5_3, -1, -1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static unsigned char g_v_I[] = { 1, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static unsigned char g_v_j[] = { 17, 67, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static symbol s_0[] = { 'a' }; static symbol s_1[] = { 'e' }; static symbol s_2[] = { 'i' }; static symbol s_3[] = { 'o' }; static symbol s_4[] = { 'u' }; static symbol s_5[] = { 'y' }; static symbol s_6[] = { 'Y' }; static symbol s_7[] = { 'i' }; static symbol s_8[] = { 'I' }; static symbol s_9[] = { 'y' }; static symbol s_10[] = { 'Y' }; static symbol s_11[] = { 'y' }; static symbol s_12[] = { 'i' }; static symbol s_13[] = { 'e' }; static symbol s_14[] = { 'g', 'e', 'm' }; static symbol s_15[] = { 'h', 'e', 'i', 'd' }; static symbol s_16[] = { 'h', 'e', 'i', 'd' }; static symbol s_17[] = { 'c' }; static symbol s_18[] = { 'e', 'n' }; static symbol s_19[] = { 'i', 'g' }; static symbol s_20[] = { 'e' }; static symbol s_21[] = { 'e' }; static int r_prelude(struct SN_env * z) { int among_var; { int c_test = z->c; /* test, line 42 */ while(1) { /* repeat, line 42 */ int c = z->c; z->bra = z->c; /* [, line 43 */ among_var = find_among(z, a_0, 11); /* substring, line 43 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 43 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_0); /* <-, line 45 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 47 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 49 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 51 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 53 */ if (ret < 0) return ret; } break; case 6: if (z->c >= z->l) goto lab0; z->c++; /* next, line 54 */ break; } continue; lab0: z->c = c; break; } z->c = c_test; } { int c = z->c; /* try, line 57 */ z->bra = z->c; /* [, line 57 */ if (!(eq_s(z, 1, s_5))) { z->c = c; goto lab1; } z->ket = z->c; /* ], line 57 */ { int ret; ret = slice_from_s(z, 1, s_6); /* <-, line 57 */ if (ret < 0) return ret; } lab1: ; } while(1) { /* repeat, line 58 */ int c = z->c; while(1) { /* goto, line 58 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 232))) goto lab3; z->bra = z->c; /* [, line 59 */ { int c = z->c; /* or, line 59 */ if (!(eq_s(z, 1, s_7))) goto lab5; z->ket = z->c; /* ], line 59 */ if (!(in_grouping(z, g_v, 97, 232))) goto lab5; { int ret; ret = slice_from_s(z, 1, s_8); /* <-, line 59 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = c; if (!(eq_s(z, 1, s_9))) goto lab3; z->ket = z->c; /* ], line 60 */ { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 60 */ if (ret < 0) return ret; } } lab4: z->c = c; break; lab3: z->c = c; if (z->c >= z->l) goto lab2; z->c++; /* goto, line 58 */ } continue; lab2: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; while(1) { /* gopast, line 69 */ if (!(in_grouping(z, g_v, 97, 232))) goto lab0; break; lab0: if (z->c >= z->l) return 0; z->c++; /* gopast, line 69 */ } while(1) { /* gopast, line 69 */ if (!(out_grouping(z, g_v, 97, 232))) goto lab1; break; lab1: if (z->c >= z->l) return 0; z->c++; /* gopast, line 69 */ } z->I[0] = z->c; /* setmark p1, line 69 */ /* try, line 70 */ if (!(z->I[0] < 3)) goto lab2; z->I[0] = 3; lab2: while(1) { /* gopast, line 71 */ if (!(in_grouping(z, g_v, 97, 232))) goto lab3; break; lab3: if (z->c >= z->l) return 0; z->c++; /* gopast, line 71 */ } while(1) { /* gopast, line 71 */ if (!(out_grouping(z, g_v, 97, 232))) goto lab4; break; lab4: if (z->c >= z->l) return 0; z->c++; /* gopast, line 71 */ } z->I[1] = z->c; /* setmark p2, line 71 */ return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 75 */ int c = z->c; z->bra = z->c; /* [, line 77 */ among_var = find_among(z, a_1, 3); /* substring, line 77 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 77 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_11); /* <-, line 78 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_12); /* <-, line 79 */ if (ret < 0) return ret; } break; case 3: if (z->c >= z->l) goto lab0; z->c++; /* next, line 80 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_undouble(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 91 */ if (!(find_among_b(z, a_2, 3))) return 0; /* among, line 91 */ z->c = z->l - m_test; } z->ket = z->c; /* [, line 91 */ if (z->c <= z->lb) return 0; z->c--; /* next, line 91 */ z->bra = z->c; /* ], line 91 */ { int ret; ret = slice_del(z); /* delete, line 91 */ if (ret < 0) return ret; } return 1; } static int r_e_ending(struct SN_env * z) { z->B[0] = 0; /* unset e_found, line 95 */ z->ket = z->c; /* [, line 96 */ if (!(eq_s_b(z, 1, s_13))) return 0; z->bra = z->c; /* ], line 96 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 96 */ if (ret < 0) return ret; } { int m_test = z->l - z->c; /* test, line 96 */ if (!(out_grouping_b(z, g_v, 97, 232))) return 0; z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 96 */ if (ret < 0) return ret; } z->B[0] = 1; /* set e_found, line 97 */ { int ret = r_undouble(z); if (ret == 0) return 0; /* call undouble, line 98 */ if (ret < 0) return ret; } return 1; } static int r_en_ending(struct SN_env * z) { { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 102 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* and, line 102 */ if (!(out_grouping_b(z, g_v, 97, 232))) return 0; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* not, line 102 */ if (!(eq_s_b(z, 3, s_14))) goto lab0; return 0; lab0: z->c = z->l - m; } } { int ret; ret = slice_del(z); /* delete, line 102 */ if (ret < 0) return ret; } { int ret = r_undouble(z); if (ret == 0) return 0; /* call undouble, line 103 */ if (ret < 0) return ret; } return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* do, line 107 */ z->ket = z->c; /* [, line 108 */ among_var = find_among_b(z, a_3, 5); /* substring, line 108 */ if (!(among_var)) goto lab0; z->bra = z->c; /* ], line 108 */ switch(among_var) { case 0: goto lab0; case 1: { int ret = r_R1(z); if (ret == 0) goto lab0; /* call R1, line 110 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_15); /* <-, line 110 */ if (ret < 0) return ret; } break; case 2: { int ret = r_en_ending(z); if (ret == 0) goto lab0; /* call en_ending, line 113 */ if (ret < 0) return ret; } break; case 3: { int ret = r_R1(z); if (ret == 0) goto lab0; /* call R1, line 116 */ if (ret < 0) return ret; } if (!(out_grouping_b(z, g_v_j, 97, 232))) goto lab0; { int ret; ret = slice_del(z); /* delete, line 116 */ if (ret < 0) return ret; } break; } lab0: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 120 */ { int ret = r_e_ending(z); if (ret == 0) goto lab1; /* call e_ending, line 120 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 122 */ z->ket = z->c; /* [, line 122 */ if (!(eq_s_b(z, 4, s_16))) goto lab2; z->bra = z->c; /* ], line 122 */ { int ret = r_R2(z); if (ret == 0) goto lab2; /* call R2, line 122 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 122 */ if (!(eq_s_b(z, 1, s_17))) goto lab3; goto lab2; lab3: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 122 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 123 */ if (!(eq_s_b(z, 2, s_18))) goto lab2; z->bra = z->c; /* ], line 123 */ { int ret = r_en_ending(z); if (ret == 0) goto lab2; /* call en_ending, line 123 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 126 */ z->ket = z->c; /* [, line 127 */ among_var = find_among_b(z, a_4, 6); /* substring, line 127 */ if (!(among_var)) goto lab4; z->bra = z->c; /* ], line 127 */ switch(among_var) { case 0: goto lab4; case 1: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 129 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 129 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* or, line 130 */ z->ket = z->c; /* [, line 130 */ if (!(eq_s_b(z, 2, s_19))) goto lab6; z->bra = z->c; /* ], line 130 */ { int ret = r_R2(z); if (ret == 0) goto lab6; /* call R2, line 130 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 130 */ if (!(eq_s_b(z, 1, s_20))) goto lab7; goto lab6; lab7: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 130 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_undouble(z); if (ret == 0) goto lab4; /* call undouble, line 130 */ if (ret < 0) return ret; } } lab5: break; case 2: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 133 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 133 */ if (!(eq_s_b(z, 1, s_21))) goto lab8; goto lab4; lab8: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } break; case 3: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 136 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 136 */ if (ret < 0) return ret; } { int ret = r_e_ending(z); if (ret == 0) goto lab4; /* call e_ending, line 136 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 139 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 139 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 142 */ if (ret < 0) return ret; } if (!(z->B[0])) goto lab4; /* Boolean test e_found, line 142 */ { int ret; ret = slice_del(z); /* delete, line 142 */ if (ret < 0) return ret; } break; } lab4: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 146 */ if (!(out_grouping_b(z, g_v_I, 73, 232))) goto lab9; { int m_test = z->l - z->c; /* test, line 148 */ if (!(find_among_b(z, a_5, 4))) goto lab9; /* among, line 149 */ if (!(out_grouping_b(z, g_v, 97, 232))) goto lab9; z->c = z->l - m_test; } z->ket = z->c; /* [, line 152 */ if (z->c <= z->lb) goto lab9; z->c--; /* next, line 152 */ z->bra = z->c; /* ], line 152 */ { int ret; ret = slice_del(z); /* delete, line 152 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } return 1; } extern int dutch_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 159 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 159 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 160 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 160 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 161 */ { int m = z->l - z->c; (void) m; /* do, line 162 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab2; /* call standard_suffix, line 162 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 163 */ { int ret = r_postlude(z); if (ret == 0) goto lab3; /* call postlude, line 163 */ if (ret < 0) return ret; } lab3: z->c = c; } return 1; } extern struct SN_env * dutch_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); } extern void dutch_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_dutch.h000066400000000000000000000005021154025176300275730ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * dutch_ISO_8859_1_create_env(void); extern void dutch_ISO_8859_1_close_env(struct SN_env * z); extern int dutch_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_english.c000066400000000000000000001115051154025176300301160ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int english_ISO_8859_1_stem(struct SN_env * z); static int r_exception2(struct SN_env * z); static int r_exception1(struct SN_env * z); static int r_Step_5(struct SN_env * z); static int r_Step_4(struct SN_env * z); static int r_Step_3(struct SN_env * z); static int r_Step_2(struct SN_env * z); static int r_Step_1c(struct SN_env * z); static int r_Step_1b(struct SN_env * z); static int r_Step_1a(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_shortv(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * english_ISO_8859_1_create_env(void); extern void english_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_0[6] = { 'c', 'o', 'm', 'm', 'u', 'n' }; static symbol s_0_1[5] = { 'g', 'e', 'n', 'e', 'r' }; static struct among a_0[2] = { /* 0 */ { 6, s_0_0, -1, -1, 0}, /* 1 */ { 5, s_0_1, -1, -1, 0} }; static symbol s_1_0[1] = { '\'' }; static symbol s_1_1[3] = { '\'', 's', '\'' }; static symbol s_1_2[2] = { '\'', 's' }; static struct among a_1[3] = { /* 0 */ { 1, s_1_0, -1, 1, 0}, /* 1 */ { 3, s_1_1, 0, 1, 0}, /* 2 */ { 2, s_1_2, -1, 1, 0} }; static symbol s_2_0[3] = { 'i', 'e', 'd' }; static symbol s_2_1[1] = { 's' }; static symbol s_2_2[3] = { 'i', 'e', 's' }; static symbol s_2_3[4] = { 's', 's', 'e', 's' }; static symbol s_2_4[2] = { 's', 's' }; static symbol s_2_5[2] = { 'u', 's' }; static struct among a_2[6] = { /* 0 */ { 3, s_2_0, -1, 2, 0}, /* 1 */ { 1, s_2_1, -1, 3, 0}, /* 2 */ { 3, s_2_2, 1, 2, 0}, /* 3 */ { 4, s_2_3, 1, 1, 0}, /* 4 */ { 2, s_2_4, 1, -1, 0}, /* 5 */ { 2, s_2_5, 1, -1, 0} }; static symbol s_3_1[2] = { 'b', 'b' }; static symbol s_3_2[2] = { 'd', 'd' }; static symbol s_3_3[2] = { 'f', 'f' }; static symbol s_3_4[2] = { 'g', 'g' }; static symbol s_3_5[2] = { 'b', 'l' }; static symbol s_3_6[2] = { 'm', 'm' }; static symbol s_3_7[2] = { 'n', 'n' }; static symbol s_3_8[2] = { 'p', 'p' }; static symbol s_3_9[2] = { 'r', 'r' }; static symbol s_3_10[2] = { 'a', 't' }; static symbol s_3_11[2] = { 't', 't' }; static symbol s_3_12[2] = { 'i', 'z' }; static struct among a_3[13] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_3_1, 0, 2, 0}, /* 2 */ { 2, s_3_2, 0, 2, 0}, /* 3 */ { 2, s_3_3, 0, 2, 0}, /* 4 */ { 2, s_3_4, 0, 2, 0}, /* 5 */ { 2, s_3_5, 0, 1, 0}, /* 6 */ { 2, s_3_6, 0, 2, 0}, /* 7 */ { 2, s_3_7, 0, 2, 0}, /* 8 */ { 2, s_3_8, 0, 2, 0}, /* 9 */ { 2, s_3_9, 0, 2, 0}, /* 10 */ { 2, s_3_10, 0, 1, 0}, /* 11 */ { 2, s_3_11, 0, 2, 0}, /* 12 */ { 2, s_3_12, 0, 1, 0} }; static symbol s_4_0[2] = { 'e', 'd' }; static symbol s_4_1[3] = { 'e', 'e', 'd' }; static symbol s_4_2[3] = { 'i', 'n', 'g' }; static symbol s_4_3[4] = { 'e', 'd', 'l', 'y' }; static symbol s_4_4[5] = { 'e', 'e', 'd', 'l', 'y' }; static symbol s_4_5[5] = { 'i', 'n', 'g', 'l', 'y' }; static struct among a_4[6] = { /* 0 */ { 2, s_4_0, -1, 2, 0}, /* 1 */ { 3, s_4_1, 0, 1, 0}, /* 2 */ { 3, s_4_2, -1, 2, 0}, /* 3 */ { 4, s_4_3, -1, 2, 0}, /* 4 */ { 5, s_4_4, 3, 1, 0}, /* 5 */ { 5, s_4_5, -1, 2, 0} }; static symbol s_5_0[4] = { 'a', 'n', 'c', 'i' }; static symbol s_5_1[4] = { 'e', 'n', 'c', 'i' }; static symbol s_5_2[3] = { 'o', 'g', 'i' }; static symbol s_5_3[2] = { 'l', 'i' }; static symbol s_5_4[3] = { 'b', 'l', 'i' }; static symbol s_5_5[4] = { 'a', 'b', 'l', 'i' }; static symbol s_5_6[4] = { 'a', 'l', 'l', 'i' }; static symbol s_5_7[5] = { 'f', 'u', 'l', 'l', 'i' }; static symbol s_5_8[6] = { 'l', 'e', 's', 's', 'l', 'i' }; static symbol s_5_9[5] = { 'o', 'u', 's', 'l', 'i' }; static symbol s_5_10[5] = { 'e', 'n', 't', 'l', 'i' }; static symbol s_5_11[5] = { 'a', 'l', 'i', 't', 'i' }; static symbol s_5_12[6] = { 'b', 'i', 'l', 'i', 't', 'i' }; static symbol s_5_13[5] = { 'i', 'v', 'i', 't', 'i' }; static symbol s_5_14[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_5_15[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_5_16[5] = { 'a', 'l', 'i', 's', 'm' }; static symbol s_5_17[5] = { 'a', 't', 'i', 'o', 'n' }; static symbol s_5_18[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' }; static symbol s_5_19[4] = { 'i', 'z', 'e', 'r' }; static symbol s_5_20[4] = { 'a', 't', 'o', 'r' }; static symbol s_5_21[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' }; static symbol s_5_22[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' }; static symbol s_5_23[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' }; static struct among a_5[24] = { /* 0 */ { 4, s_5_0, -1, 3, 0}, /* 1 */ { 4, s_5_1, -1, 2, 0}, /* 2 */ { 3, s_5_2, -1, 13, 0}, /* 3 */ { 2, s_5_3, -1, 16, 0}, /* 4 */ { 3, s_5_4, 3, 12, 0}, /* 5 */ { 4, s_5_5, 4, 4, 0}, /* 6 */ { 4, s_5_6, 3, 8, 0}, /* 7 */ { 5, s_5_7, 3, 14, 0}, /* 8 */ { 6, s_5_8, 3, 15, 0}, /* 9 */ { 5, s_5_9, 3, 10, 0}, /* 10 */ { 5, s_5_10, 3, 5, 0}, /* 11 */ { 5, s_5_11, -1, 8, 0}, /* 12 */ { 6, s_5_12, -1, 12, 0}, /* 13 */ { 5, s_5_13, -1, 11, 0}, /* 14 */ { 6, s_5_14, -1, 1, 0}, /* 15 */ { 7, s_5_15, 14, 7, 0}, /* 16 */ { 5, s_5_16, -1, 8, 0}, /* 17 */ { 5, s_5_17, -1, 7, 0}, /* 18 */ { 7, s_5_18, 17, 6, 0}, /* 19 */ { 4, s_5_19, -1, 6, 0}, /* 20 */ { 4, s_5_20, -1, 7, 0}, /* 21 */ { 7, s_5_21, -1, 11, 0}, /* 22 */ { 7, s_5_22, -1, 9, 0}, /* 23 */ { 7, s_5_23, -1, 10, 0} }; static symbol s_6_0[5] = { 'i', 'c', 'a', 't', 'e' }; static symbol s_6_1[5] = { 'a', 't', 'i', 'v', 'e' }; static symbol s_6_2[5] = { 'a', 'l', 'i', 'z', 'e' }; static symbol s_6_3[5] = { 'i', 'c', 'i', 't', 'i' }; static symbol s_6_4[4] = { 'i', 'c', 'a', 'l' }; static symbol s_6_5[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_6_6[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_6_7[3] = { 'f', 'u', 'l' }; static symbol s_6_8[4] = { 'n', 'e', 's', 's' }; static struct among a_6[9] = { /* 0 */ { 5, s_6_0, -1, 4, 0}, /* 1 */ { 5, s_6_1, -1, 6, 0}, /* 2 */ { 5, s_6_2, -1, 3, 0}, /* 3 */ { 5, s_6_3, -1, 4, 0}, /* 4 */ { 4, s_6_4, -1, 4, 0}, /* 5 */ { 6, s_6_5, -1, 1, 0}, /* 6 */ { 7, s_6_6, 5, 2, 0}, /* 7 */ { 3, s_6_7, -1, 5, 0}, /* 8 */ { 4, s_6_8, -1, 5, 0} }; static symbol s_7_0[2] = { 'i', 'c' }; static symbol s_7_1[4] = { 'a', 'n', 'c', 'e' }; static symbol s_7_2[4] = { 'e', 'n', 'c', 'e' }; static symbol s_7_3[4] = { 'a', 'b', 'l', 'e' }; static symbol s_7_4[4] = { 'i', 'b', 'l', 'e' }; static symbol s_7_5[3] = { 'a', 't', 'e' }; static symbol s_7_6[3] = { 'i', 'v', 'e' }; static symbol s_7_7[3] = { 'i', 'z', 'e' }; static symbol s_7_8[3] = { 'i', 't', 'i' }; static symbol s_7_9[2] = { 'a', 'l' }; static symbol s_7_10[3] = { 'i', 's', 'm' }; static symbol s_7_11[3] = { 'i', 'o', 'n' }; static symbol s_7_12[2] = { 'e', 'r' }; static symbol s_7_13[3] = { 'o', 'u', 's' }; static symbol s_7_14[3] = { 'a', 'n', 't' }; static symbol s_7_15[3] = { 'e', 'n', 't' }; static symbol s_7_16[4] = { 'm', 'e', 'n', 't' }; static symbol s_7_17[5] = { 'e', 'm', 'e', 'n', 't' }; static struct among a_7[18] = { /* 0 */ { 2, s_7_0, -1, 1, 0}, /* 1 */ { 4, s_7_1, -1, 1, 0}, /* 2 */ { 4, s_7_2, -1, 1, 0}, /* 3 */ { 4, s_7_3, -1, 1, 0}, /* 4 */ { 4, s_7_4, -1, 1, 0}, /* 5 */ { 3, s_7_5, -1, 1, 0}, /* 6 */ { 3, s_7_6, -1, 1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 3, s_7_8, -1, 1, 0}, /* 9 */ { 2, s_7_9, -1, 1, 0}, /* 10 */ { 3, s_7_10, -1, 1, 0}, /* 11 */ { 3, s_7_11, -1, 2, 0}, /* 12 */ { 2, s_7_12, -1, 1, 0}, /* 13 */ { 3, s_7_13, -1, 1, 0}, /* 14 */ { 3, s_7_14, -1, 1, 0}, /* 15 */ { 3, s_7_15, -1, 1, 0}, /* 16 */ { 4, s_7_16, 15, 1, 0}, /* 17 */ { 5, s_7_17, 16, 1, 0} }; static symbol s_8_0[1] = { 'e' }; static symbol s_8_1[1] = { 'l' }; static struct among a_8[2] = { /* 0 */ { 1, s_8_0, -1, 1, 0}, /* 1 */ { 1, s_8_1, -1, 2, 0} }; static symbol s_9_0[7] = { 's', 'u', 'c', 'c', 'e', 'e', 'd' }; static symbol s_9_1[7] = { 'p', 'r', 'o', 'c', 'e', 'e', 'd' }; static symbol s_9_2[6] = { 'e', 'x', 'c', 'e', 'e', 'd' }; static symbol s_9_3[7] = { 'c', 'a', 'n', 'n', 'i', 'n', 'g' }; static symbol s_9_4[6] = { 'i', 'n', 'n', 'i', 'n', 'g' }; static symbol s_9_5[7] = { 'e', 'a', 'r', 'r', 'i', 'n', 'g' }; static symbol s_9_6[7] = { 'h', 'e', 'r', 'r', 'i', 'n', 'g' }; static symbol s_9_7[6] = { 'o', 'u', 't', 'i', 'n', 'g' }; static struct among a_9[8] = { /* 0 */ { 7, s_9_0, -1, -1, 0}, /* 1 */ { 7, s_9_1, -1, -1, 0}, /* 2 */ { 6, s_9_2, -1, -1, 0}, /* 3 */ { 7, s_9_3, -1, -1, 0}, /* 4 */ { 6, s_9_4, -1, -1, 0}, /* 5 */ { 7, s_9_5, -1, -1, 0}, /* 6 */ { 7, s_9_6, -1, -1, 0}, /* 7 */ { 6, s_9_7, -1, -1, 0} }; static symbol s_10_0[5] = { 'a', 'n', 'd', 'e', 's' }; static symbol s_10_1[5] = { 'a', 't', 'l', 'a', 's' }; static symbol s_10_2[4] = { 'b', 'i', 'a', 's' }; static symbol s_10_3[6] = { 'c', 'o', 's', 'm', 'o', 's' }; static symbol s_10_4[5] = { 'd', 'y', 'i', 'n', 'g' }; static symbol s_10_5[5] = { 'e', 'a', 'r', 'l', 'y' }; static symbol s_10_6[6] = { 'g', 'e', 'n', 't', 'l', 'y' }; static symbol s_10_7[4] = { 'h', 'o', 'w', 'e' }; static symbol s_10_8[4] = { 'i', 'd', 'l', 'y' }; static symbol s_10_9[5] = { 'l', 'y', 'i', 'n', 'g' }; static symbol s_10_10[4] = { 'n', 'e', 'w', 's' }; static symbol s_10_11[4] = { 'o', 'n', 'l', 'y' }; static symbol s_10_12[6] = { 's', 'i', 'n', 'g', 'l', 'y' }; static symbol s_10_13[5] = { 's', 'k', 'i', 'e', 's' }; static symbol s_10_14[4] = { 's', 'k', 'i', 's' }; static symbol s_10_15[3] = { 's', 'k', 'y' }; static symbol s_10_16[5] = { 't', 'y', 'i', 'n', 'g' }; static symbol s_10_17[4] = { 'u', 'g', 'l', 'y' }; static struct among a_10[18] = { /* 0 */ { 5, s_10_0, -1, -1, 0}, /* 1 */ { 5, s_10_1, -1, -1, 0}, /* 2 */ { 4, s_10_2, -1, -1, 0}, /* 3 */ { 6, s_10_3, -1, -1, 0}, /* 4 */ { 5, s_10_4, -1, 3, 0}, /* 5 */ { 5, s_10_5, -1, 9, 0}, /* 6 */ { 6, s_10_6, -1, 7, 0}, /* 7 */ { 4, s_10_7, -1, -1, 0}, /* 8 */ { 4, s_10_8, -1, 6, 0}, /* 9 */ { 5, s_10_9, -1, 4, 0}, /* 10 */ { 4, s_10_10, -1, -1, 0}, /* 11 */ { 4, s_10_11, -1, 10, 0}, /* 12 */ { 6, s_10_12, -1, 11, 0}, /* 13 */ { 5, s_10_13, -1, 2, 0}, /* 14 */ { 4, s_10_14, -1, 1, 0}, /* 15 */ { 3, s_10_15, -1, -1, 0}, /* 16 */ { 5, s_10_16, -1, 5, 0}, /* 17 */ { 4, s_10_17, -1, 8, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1 }; static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 }; static unsigned char g_valid_LI[] = { 55, 141, 2 }; static symbol s_0[] = { '\'' }; static symbol s_1[] = { 'y' }; static symbol s_2[] = { 'Y' }; static symbol s_3[] = { 'y' }; static symbol s_4[] = { 'Y' }; static symbol s_5[] = { 's', 's' }; static symbol s_6[] = { 'i', 'e' }; static symbol s_7[] = { 'i' }; static symbol s_8[] = { 'e', 'e' }; static symbol s_9[] = { 'e' }; static symbol s_10[] = { 'e' }; static symbol s_11[] = { 'y' }; static symbol s_12[] = { 'Y' }; static symbol s_13[] = { 'i' }; static symbol s_14[] = { 't', 'i', 'o', 'n' }; static symbol s_15[] = { 'e', 'n', 'c', 'e' }; static symbol s_16[] = { 'a', 'n', 'c', 'e' }; static symbol s_17[] = { 'a', 'b', 'l', 'e' }; static symbol s_18[] = { 'e', 'n', 't' }; static symbol s_19[] = { 'i', 'z', 'e' }; static symbol s_20[] = { 'a', 't', 'e' }; static symbol s_21[] = { 'a', 'l' }; static symbol s_22[] = { 'f', 'u', 'l' }; static symbol s_23[] = { 'o', 'u', 's' }; static symbol s_24[] = { 'i', 'v', 'e' }; static symbol s_25[] = { 'b', 'l', 'e' }; static symbol s_26[] = { 'l' }; static symbol s_27[] = { 'o', 'g' }; static symbol s_28[] = { 'f', 'u', 'l' }; static symbol s_29[] = { 'l', 'e', 's', 's' }; static symbol s_30[] = { 't', 'i', 'o', 'n' }; static symbol s_31[] = { 'a', 't', 'e' }; static symbol s_32[] = { 'a', 'l' }; static symbol s_33[] = { 'i', 'c' }; static symbol s_34[] = { 's' }; static symbol s_35[] = { 't' }; static symbol s_36[] = { 'l' }; static symbol s_37[] = { 's', 'k', 'i' }; static symbol s_38[] = { 's', 'k', 'y' }; static symbol s_39[] = { 'd', 'i', 'e' }; static symbol s_40[] = { 'l', 'i', 'e' }; static symbol s_41[] = { 't', 'i', 'e' }; static symbol s_42[] = { 'i', 'd', 'l' }; static symbol s_43[] = { 'g', 'e', 'n', 't', 'l' }; static symbol s_44[] = { 'u', 'g', 'l', 'i' }; static symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' }; static symbol s_46[] = { 'o', 'n', 'l', 'i' }; static symbol s_47[] = { 's', 'i', 'n', 'g', 'l' }; static symbol s_48[] = { 'Y' }; static symbol s_49[] = { 'y' }; static int r_prelude(struct SN_env * z) { z->B[0] = 0; /* unset Y_found, line 26 */ { int c = z->c; /* do, line 27 */ z->bra = z->c; /* [, line 27 */ if (!(eq_s(z, 1, s_0))) goto lab0; z->ket = z->c; /* ], line 27 */ { int ret; ret = slice_del(z); /* delete, line 27 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 28 */ z->bra = z->c; /* [, line 28 */ if (!(eq_s(z, 1, s_1))) goto lab1; z->ket = z->c; /* ], line 28 */ if (!(in_grouping(z, g_v, 97, 121))) goto lab1; { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 28 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 28 */ lab1: z->c = c; } { int c = z->c; /* do, line 29 */ while(1) { /* repeat, line 29 */ int c = z->c; while(1) { /* goto, line 29 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 121))) goto lab4; z->bra = z->c; /* [, line 29 */ if (!(eq_s(z, 1, s_3))) goto lab4; z->ket = z->c; /* ], line 29 */ z->c = c; break; lab4: z->c = c; if (z->c >= z->l) goto lab3; z->c++; /* goto, line 29 */ } { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 29 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 29 */ continue; lab3: z->c = c; break; } z->c = c; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; { int c = z->c; /* do, line 35 */ { int c = z->c; /* or, line 40 */ if (!(find_among(z, a_0, 2))) goto lab2; /* among, line 36 */ goto lab1; lab2: z->c = c; while(1) { /* gopast, line 40 */ if (!(in_grouping(z, g_v, 97, 121))) goto lab3; break; lab3: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 40 */ } while(1) { /* gopast, line 40 */ if (!(out_grouping(z, g_v, 97, 121))) goto lab4; break; lab4: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 40 */ } } lab1: z->I[0] = z->c; /* setmark p1, line 41 */ while(1) { /* gopast, line 42 */ if (!(in_grouping(z, g_v, 97, 121))) goto lab5; break; lab5: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 42 */ } while(1) { /* gopast, line 42 */ if (!(out_grouping(z, g_v, 97, 121))) goto lab6; break; lab6: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 42 */ } z->I[1] = z->c; /* setmark p2, line 42 */ lab0: z->c = c; } return 1; } static int r_shortv(struct SN_env * z) { { int m = z->l - z->c; (void) m; /* or, line 50 */ if (!(out_grouping_b(z, g_v_WXY, 89, 121))) goto lab1; if (!(in_grouping_b(z, g_v, 97, 121))) goto lab1; if (!(out_grouping_b(z, g_v, 97, 121))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(out_grouping_b(z, g_v, 97, 121))) return 0; if (!(in_grouping_b(z, g_v, 97, 121))) return 0; if (z->c > z->lb) return 0; /* atlimit, line 51 */ } lab0: return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_Step_1a(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* try, line 58 */ z->ket = z->c; /* [, line 59 */ among_var = find_among_b(z, a_1, 3); /* substring, line 59 */ if (!(among_var)) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 59 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab0; } case 1: { int ret; ret = slice_del(z); /* delete, line 61 */ if (ret < 0) return ret; } break; } lab0: ; } z->ket = z->c; /* [, line 64 */ among_var = find_among_b(z, a_2, 6); /* substring, line 64 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 64 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 2, s_5); /* <-, line 65 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 67 */ if (z->c <= z->lb) goto lab2; z->c--; /* next, line 67 */ if (z->c > z->lb) goto lab2; /* atlimit, line 67 */ { int ret; ret = slice_from_s(z, 2, s_6); /* <-, line 67 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = z->l - m; { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 67 */ if (ret < 0) return ret; } } lab1: break; case 3: if (z->c <= z->lb) return 0; z->c--; /* next, line 68 */ while(1) { /* gopast, line 68 */ if (!(in_grouping_b(z, g_v, 97, 121))) goto lab3; break; lab3: if (z->c <= z->lb) return 0; z->c--; /* gopast, line 68 */ } { int ret; ret = slice_del(z); /* delete, line 68 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_1b(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 74 */ among_var = find_among_b(z, a_4, 6); /* substring, line 74 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 74 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 76 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 2, s_8); /* <-, line 76 */ if (ret < 0) return ret; } break; case 2: { int m_test = z->l - z->c; /* test, line 79 */ while(1) { /* gopast, line 79 */ if (!(in_grouping_b(z, g_v, 97, 121))) goto lab0; break; lab0: if (z->c <= z->lb) return 0; z->c--; /* gopast, line 79 */ } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 79 */ if (ret < 0) return ret; } { int m_test = z->l - z->c; /* test, line 80 */ among_var = find_among_b(z, a_3, 13); /* substring, line 80 */ if (!(among_var)) return 0; z->c = z->l - m_test; } switch(among_var) { case 0: return 0; case 1: { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 82 */ z->c = c; } if (ret < 0) return ret; } break; case 2: z->ket = z->c; /* [, line 85 */ if (z->c <= z->lb) return 0; z->c--; /* next, line 85 */ z->bra = z->c; /* ], line 85 */ { int ret; ret = slice_del(z); /* delete, line 85 */ if (ret < 0) return ret; } break; case 3: if (z->c != z->I[0]) return 0; /* atmark, line 86 */ { int m_test = z->l - z->c; /* test, line 86 */ { int ret = r_shortv(z); if (ret == 0) return 0; /* call shortv, line 86 */ if (ret < 0) return ret; } z->c = z->l - m_test; } { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 86 */ z->c = c; } if (ret < 0) return ret; } break; } break; } return 1; } static int r_Step_1c(struct SN_env * z) { z->ket = z->c; /* [, line 93 */ { int m = z->l - z->c; (void) m; /* or, line 93 */ if (!(eq_s_b(z, 1, s_11))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_12))) return 0; } lab0: z->bra = z->c; /* ], line 93 */ if (!(out_grouping_b(z, g_v, 97, 121))) return 0; { int m = z->l - z->c; (void) m; /* not, line 94 */ if (z->c > z->lb) goto lab2; /* atlimit, line 94 */ return 0; lab2: z->c = z->l - m; } { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 95 */ if (ret < 0) return ret; } return 1; } static int r_Step_2(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 99 */ among_var = find_among_b(z, a_5, 24); /* substring, line 99 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 99 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 99 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 4, s_14); /* <-, line 100 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 4, s_15); /* <-, line 101 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 4, s_16); /* <-, line 102 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 4, s_17); /* <-, line 103 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 3, s_18); /* <-, line 104 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 3, s_19); /* <-, line 106 */ if (ret < 0) return ret; } break; case 7: { int ret; ret = slice_from_s(z, 3, s_20); /* <-, line 108 */ if (ret < 0) return ret; } break; case 8: { int ret; ret = slice_from_s(z, 2, s_21); /* <-, line 110 */ if (ret < 0) return ret; } break; case 9: { int ret; ret = slice_from_s(z, 3, s_22); /* <-, line 111 */ if (ret < 0) return ret; } break; case 10: { int ret; ret = slice_from_s(z, 3, s_23); /* <-, line 113 */ if (ret < 0) return ret; } break; case 11: { int ret; ret = slice_from_s(z, 3, s_24); /* <-, line 115 */ if (ret < 0) return ret; } break; case 12: { int ret; ret = slice_from_s(z, 3, s_25); /* <-, line 117 */ if (ret < 0) return ret; } break; case 13: if (!(eq_s_b(z, 1, s_26))) return 0; { int ret; ret = slice_from_s(z, 2, s_27); /* <-, line 118 */ if (ret < 0) return ret; } break; case 14: { int ret; ret = slice_from_s(z, 3, s_28); /* <-, line 119 */ if (ret < 0) return ret; } break; case 15: { int ret; ret = slice_from_s(z, 4, s_29); /* <-, line 120 */ if (ret < 0) return ret; } break; case 16: if (!(in_grouping_b(z, g_valid_LI, 99, 116))) return 0; { int ret; ret = slice_del(z); /* delete, line 121 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_3(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 126 */ among_var = find_among_b(z, a_6, 9); /* substring, line 126 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 126 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 126 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 4, s_30); /* <-, line 127 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 3, s_31); /* <-, line 128 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 2, s_32); /* <-, line 129 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 2, s_33); /* <-, line 131 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } break; case 6: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 135 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 135 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_4(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 140 */ among_var = find_among_b(z, a_7, 18); /* substring, line 140 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 140 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 140 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 144 */ if (!(eq_s_b(z, 1, s_34))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_35))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 144 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_5(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 149 */ among_var = find_among_b(z, a_8, 2); /* substring, line 149 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 149 */ switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* or, line 150 */ { int ret = r_R2(z); if (ret == 0) goto lab1; /* call R2, line 150 */ if (ret < 0) return ret; } goto lab0; lab1: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 150 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 150 */ { int ret = r_shortv(z); if (ret == 0) goto lab2; /* call shortv, line 150 */ if (ret < 0) return ret; } return 0; lab2: z->c = z->l - m; } } lab0: { int ret; ret = slice_del(z); /* delete, line 150 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 151 */ if (ret < 0) return ret; } if (!(eq_s_b(z, 1, s_36))) return 0; { int ret; ret = slice_del(z); /* delete, line 151 */ if (ret < 0) return ret; } break; } return 1; } static int r_exception2(struct SN_env * z) { z->ket = z->c; /* [, line 157 */ if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 157 */ z->bra = z->c; /* ], line 157 */ if (z->c > z->lb) return 0; /* atlimit, line 157 */ return 1; } static int r_exception1(struct SN_env * z) { int among_var; z->bra = z->c; /* [, line 169 */ among_var = find_among(z, a_10, 18); /* substring, line 169 */ if (!(among_var)) return 0; z->ket = z->c; /* ], line 169 */ if (z->c < z->l) return 0; /* atlimit, line 169 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 3, s_37); /* <-, line 173 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 3, s_38); /* <-, line 174 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 3, s_39); /* <-, line 175 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 3, s_40); /* <-, line 176 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 3, s_41); /* <-, line 177 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 3, s_42); /* <-, line 181 */ if (ret < 0) return ret; } break; case 7: { int ret; ret = slice_from_s(z, 5, s_43); /* <-, line 182 */ if (ret < 0) return ret; } break; case 8: { int ret; ret = slice_from_s(z, 4, s_44); /* <-, line 183 */ if (ret < 0) return ret; } break; case 9: { int ret; ret = slice_from_s(z, 5, s_45); /* <-, line 184 */ if (ret < 0) return ret; } break; case 10: { int ret; ret = slice_from_s(z, 4, s_46); /* <-, line 185 */ if (ret < 0) return ret; } break; case 11: { int ret; ret = slice_from_s(z, 5, s_47); /* <-, line 186 */ if (ret < 0) return ret; } break; } return 1; } static int r_postlude(struct SN_env * z) { if (!(z->B[0])) return 0; /* Boolean test Y_found, line 202 */ while(1) { /* repeat, line 202 */ int c = z->c; while(1) { /* goto, line 202 */ int c = z->c; z->bra = z->c; /* [, line 202 */ if (!(eq_s(z, 1, s_48))) goto lab1; z->ket = z->c; /* ], line 202 */ z->c = c; break; lab1: z->c = c; if (z->c >= z->l) goto lab0; z->c++; /* goto, line 202 */ } { int ret; ret = slice_from_s(z, 1, s_49); /* <-, line 202 */ if (ret < 0) return ret; } continue; lab0: z->c = c; break; } return 1; } extern int english_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* or, line 206 */ { int ret = r_exception1(z); if (ret == 0) goto lab1; /* call exception1, line 206 */ if (ret < 0) return ret; } goto lab0; lab1: z->c = c; { int c = z->c; /* not, line 207 */ { int c = z->c + 3; if (0 > c || c > z->l) goto lab3; z->c = c; /* hop, line 207 */ } goto lab2; lab3: z->c = c; } goto lab0; lab2: z->c = c; { int c = z->c; /* do, line 208 */ { int ret = r_prelude(z); if (ret == 0) goto lab4; /* call prelude, line 208 */ if (ret < 0) return ret; } lab4: z->c = c; } { int c = z->c; /* do, line 209 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab5; /* call mark_regions, line 209 */ if (ret < 0) return ret; } lab5: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 210 */ { int m = z->l - z->c; (void) m; /* do, line 212 */ { int ret = r_Step_1a(z); if (ret == 0) goto lab6; /* call Step_1a, line 212 */ if (ret < 0) return ret; } lab6: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* or, line 214 */ { int ret = r_exception2(z); if (ret == 0) goto lab8; /* call exception2, line 214 */ if (ret < 0) return ret; } goto lab7; lab8: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 216 */ { int ret = r_Step_1b(z); if (ret == 0) goto lab9; /* call Step_1b, line 216 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 217 */ { int ret = r_Step_1c(z); if (ret == 0) goto lab10; /* call Step_1c, line 217 */ if (ret < 0) return ret; } lab10: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 219 */ { int ret = r_Step_2(z); if (ret == 0) goto lab11; /* call Step_2, line 219 */ if (ret < 0) return ret; } lab11: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 220 */ { int ret = r_Step_3(z); if (ret == 0) goto lab12; /* call Step_3, line 220 */ if (ret < 0) return ret; } lab12: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 221 */ { int ret = r_Step_4(z); if (ret == 0) goto lab13; /* call Step_4, line 221 */ if (ret < 0) return ret; } lab13: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 223 */ { int ret = r_Step_5(z); if (ret == 0) goto lab14; /* call Step_5, line 223 */ if (ret < 0) return ret; } lab14: z->c = z->l - m; } } lab7: z->c = z->lb; { int c = z->c; /* do, line 226 */ { int ret = r_postlude(z); if (ret == 0) goto lab15; /* call postlude, line 226 */ if (ret < 0) return ret; } lab15: z->c = c; } } lab0: return 1; } extern struct SN_env * english_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); } extern void english_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_english.h000066400000000000000000000005101154025176300301140ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * english_ISO_8859_1_create_env(void); extern void english_ISO_8859_1_close_env(struct SN_env * z); extern int english_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_finnish.c000066400000000000000000000613221154025176300301240ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int finnish_ISO_8859_1_stem(struct SN_env * z); static int r_tidy(struct SN_env * z); static int r_other_endings(struct SN_env * z); static int r_t_plural(struct SN_env * z); static int r_i_plural(struct SN_env * z); static int r_case_ending(struct SN_env * z); static int r_VI(struct SN_env * z); static int r_LONG(struct SN_env * z); static int r_possessive(struct SN_env * z); static int r_particle_etc(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * finnish_ISO_8859_1_create_env(void); extern void finnish_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_0[2] = { 'p', 'a' }; static symbol s_0_1[3] = { 's', 't', 'i' }; static symbol s_0_2[4] = { 'k', 'a', 'a', 'n' }; static symbol s_0_3[3] = { 'h', 'a', 'n' }; static symbol s_0_4[3] = { 'k', 'i', 'n' }; static symbol s_0_5[3] = { 'h', 0xE4, 'n' }; static symbol s_0_6[4] = { 'k', 0xE4, 0xE4, 'n' }; static symbol s_0_7[2] = { 'k', 'o' }; static symbol s_0_8[2] = { 'p', 0xE4 }; static symbol s_0_9[2] = { 'k', 0xF6 }; static struct among a_0[10] = { /* 0 */ { 2, s_0_0, -1, 1, 0}, /* 1 */ { 3, s_0_1, -1, 2, 0}, /* 2 */ { 4, s_0_2, -1, 1, 0}, /* 3 */ { 3, s_0_3, -1, 1, 0}, /* 4 */ { 3, s_0_4, -1, 1, 0}, /* 5 */ { 3, s_0_5, -1, 1, 0}, /* 6 */ { 4, s_0_6, -1, 1, 0}, /* 7 */ { 2, s_0_7, -1, 1, 0}, /* 8 */ { 2, s_0_8, -1, 1, 0}, /* 9 */ { 2, s_0_9, -1, 1, 0} }; static symbol s_1_0[3] = { 'l', 'l', 'a' }; static symbol s_1_1[2] = { 'n', 'a' }; static symbol s_1_2[3] = { 's', 's', 'a' }; static symbol s_1_3[2] = { 't', 'a' }; static symbol s_1_4[3] = { 'l', 't', 'a' }; static symbol s_1_5[3] = { 's', 't', 'a' }; static struct among a_1[6] = { /* 0 */ { 3, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0}, /* 2 */ { 3, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0}, /* 4 */ { 3, s_1_4, 3, -1, 0}, /* 5 */ { 3, s_1_5, 3, -1, 0} }; static symbol s_2_0[3] = { 'l', 'l', 0xE4 }; static symbol s_2_1[2] = { 'n', 0xE4 }; static symbol s_2_2[3] = { 's', 's', 0xE4 }; static symbol s_2_3[2] = { 't', 0xE4 }; static symbol s_2_4[3] = { 'l', 't', 0xE4 }; static symbol s_2_5[3] = { 's', 't', 0xE4 }; static struct among a_2[6] = { /* 0 */ { 3, s_2_0, -1, -1, 0}, /* 1 */ { 2, s_2_1, -1, -1, 0}, /* 2 */ { 3, s_2_2, -1, -1, 0}, /* 3 */ { 2, s_2_3, -1, -1, 0}, /* 4 */ { 3, s_2_4, 3, -1, 0}, /* 5 */ { 3, s_2_5, 3, -1, 0} }; static symbol s_3_0[3] = { 'l', 'l', 'e' }; static symbol s_3_1[3] = { 'i', 'n', 'e' }; static struct among a_3[2] = { /* 0 */ { 3, s_3_0, -1, -1, 0}, /* 1 */ { 3, s_3_1, -1, -1, 0} }; static symbol s_4_0[3] = { 'n', 's', 'a' }; static symbol s_4_1[3] = { 'm', 'm', 'e' }; static symbol s_4_2[3] = { 'n', 'n', 'e' }; static symbol s_4_3[2] = { 'n', 'i' }; static symbol s_4_4[2] = { 's', 'i' }; static symbol s_4_5[2] = { 'a', 'n' }; static symbol s_4_6[2] = { 'e', 'n' }; static symbol s_4_7[2] = { 0xE4, 'n' }; static symbol s_4_8[3] = { 'n', 's', 0xE4 }; static struct among a_4[9] = { /* 0 */ { 3, s_4_0, -1, 3, 0}, /* 1 */ { 3, s_4_1, -1, 3, 0}, /* 2 */ { 3, s_4_2, -1, 3, 0}, /* 3 */ { 2, s_4_3, -1, 2, 0}, /* 4 */ { 2, s_4_4, -1, 1, 0}, /* 5 */ { 2, s_4_5, -1, 4, 0}, /* 6 */ { 2, s_4_6, -1, 6, 0}, /* 7 */ { 2, s_4_7, -1, 5, 0}, /* 8 */ { 3, s_4_8, -1, 3, 0} }; static symbol s_5_0[2] = { 'a', 'a' }; static symbol s_5_1[2] = { 'e', 'e' }; static symbol s_5_2[2] = { 'i', 'i' }; static symbol s_5_3[2] = { 'o', 'o' }; static symbol s_5_4[2] = { 'u', 'u' }; static symbol s_5_5[2] = { 0xE4, 0xE4 }; static symbol s_5_6[2] = { 0xF6, 0xF6 }; static struct among a_5[7] = { /* 0 */ { 2, s_5_0, -1, -1, 0}, /* 1 */ { 2, s_5_1, -1, -1, 0}, /* 2 */ { 2, s_5_2, -1, -1, 0}, /* 3 */ { 2, s_5_3, -1, -1, 0}, /* 4 */ { 2, s_5_4, -1, -1, 0}, /* 5 */ { 2, s_5_5, -1, -1, 0}, /* 6 */ { 2, s_5_6, -1, -1, 0} }; static symbol s_6_0[1] = { 'a' }; static symbol s_6_1[3] = { 'l', 'l', 'a' }; static symbol s_6_2[2] = { 'n', 'a' }; static symbol s_6_3[3] = { 's', 's', 'a' }; static symbol s_6_4[2] = { 't', 'a' }; static symbol s_6_5[3] = { 'l', 't', 'a' }; static symbol s_6_6[3] = { 's', 't', 'a' }; static symbol s_6_7[3] = { 't', 't', 'a' }; static symbol s_6_8[3] = { 'l', 'l', 'e' }; static symbol s_6_9[3] = { 'i', 'n', 'e' }; static symbol s_6_10[3] = { 'k', 's', 'i' }; static symbol s_6_11[1] = { 'n' }; static symbol s_6_12[3] = { 'h', 'a', 'n' }; static symbol s_6_13[3] = { 'd', 'e', 'n' }; static symbol s_6_14[4] = { 's', 'e', 'e', 'n' }; static symbol s_6_15[3] = { 'h', 'e', 'n' }; static symbol s_6_16[4] = { 't', 't', 'e', 'n' }; static symbol s_6_17[3] = { 'h', 'i', 'n' }; static symbol s_6_18[4] = { 's', 'i', 'i', 'n' }; static symbol s_6_19[3] = { 'h', 'o', 'n' }; static symbol s_6_20[3] = { 'h', 0xE4, 'n' }; static symbol s_6_21[3] = { 'h', 0xF6, 'n' }; static symbol s_6_22[1] = { 0xE4 }; static symbol s_6_23[3] = { 'l', 'l', 0xE4 }; static symbol s_6_24[2] = { 'n', 0xE4 }; static symbol s_6_25[3] = { 's', 's', 0xE4 }; static symbol s_6_26[2] = { 't', 0xE4 }; static symbol s_6_27[3] = { 'l', 't', 0xE4 }; static symbol s_6_28[3] = { 's', 't', 0xE4 }; static symbol s_6_29[3] = { 't', 't', 0xE4 }; static struct among a_6[30] = { /* 0 */ { 1, s_6_0, -1, 8, 0}, /* 1 */ { 3, s_6_1, 0, -1, 0}, /* 2 */ { 2, s_6_2, 0, -1, 0}, /* 3 */ { 3, s_6_3, 0, -1, 0}, /* 4 */ { 2, s_6_4, 0, -1, 0}, /* 5 */ { 3, s_6_5, 4, -1, 0}, /* 6 */ { 3, s_6_6, 4, -1, 0}, /* 7 */ { 3, s_6_7, 4, 9, 0}, /* 8 */ { 3, s_6_8, -1, -1, 0}, /* 9 */ { 3, s_6_9, -1, -1, 0}, /* 10 */ { 3, s_6_10, -1, -1, 0}, /* 11 */ { 1, s_6_11, -1, 7, 0}, /* 12 */ { 3, s_6_12, 11, 1, 0}, /* 13 */ { 3, s_6_13, 11, -1, r_VI}, /* 14 */ { 4, s_6_14, 11, -1, r_LONG}, /* 15 */ { 3, s_6_15, 11, 2, 0}, /* 16 */ { 4, s_6_16, 11, -1, r_VI}, /* 17 */ { 3, s_6_17, 11, 3, 0}, /* 18 */ { 4, s_6_18, 11, -1, r_VI}, /* 19 */ { 3, s_6_19, 11, 4, 0}, /* 20 */ { 3, s_6_20, 11, 5, 0}, /* 21 */ { 3, s_6_21, 11, 6, 0}, /* 22 */ { 1, s_6_22, -1, 8, 0}, /* 23 */ { 3, s_6_23, 22, -1, 0}, /* 24 */ { 2, s_6_24, 22, -1, 0}, /* 25 */ { 3, s_6_25, 22, -1, 0}, /* 26 */ { 2, s_6_26, 22, -1, 0}, /* 27 */ { 3, s_6_27, 26, -1, 0}, /* 28 */ { 3, s_6_28, 26, -1, 0}, /* 29 */ { 3, s_6_29, 26, 9, 0} }; static symbol s_7_0[3] = { 'e', 'j', 'a' }; static symbol s_7_1[3] = { 'm', 'm', 'a' }; static symbol s_7_2[4] = { 'i', 'm', 'm', 'a' }; static symbol s_7_3[3] = { 'm', 'p', 'a' }; static symbol s_7_4[4] = { 'i', 'm', 'p', 'a' }; static symbol s_7_5[3] = { 'm', 'm', 'i' }; static symbol s_7_6[4] = { 'i', 'm', 'm', 'i' }; static symbol s_7_7[3] = { 'm', 'p', 'i' }; static symbol s_7_8[4] = { 'i', 'm', 'p', 'i' }; static symbol s_7_9[3] = { 'e', 'j', 0xE4 }; static symbol s_7_10[3] = { 'm', 'm', 0xE4 }; static symbol s_7_11[4] = { 'i', 'm', 'm', 0xE4 }; static symbol s_7_12[3] = { 'm', 'p', 0xE4 }; static symbol s_7_13[4] = { 'i', 'm', 'p', 0xE4 }; static struct among a_7[14] = { /* 0 */ { 3, s_7_0, -1, -1, 0}, /* 1 */ { 3, s_7_1, -1, 1, 0}, /* 2 */ { 4, s_7_2, 1, -1, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0}, /* 4 */ { 4, s_7_4, 3, -1, 0}, /* 5 */ { 3, s_7_5, -1, 1, 0}, /* 6 */ { 4, s_7_6, 5, -1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 4, s_7_8, 7, -1, 0}, /* 9 */ { 3, s_7_9, -1, -1, 0}, /* 10 */ { 3, s_7_10, -1, 1, 0}, /* 11 */ { 4, s_7_11, 10, -1, 0}, /* 12 */ { 3, s_7_12, -1, 1, 0}, /* 13 */ { 4, s_7_13, 12, -1, 0} }; static symbol s_8_0[1] = { 'i' }; static symbol s_8_1[1] = { 'j' }; static struct among a_8[2] = { /* 0 */ { 1, s_8_0, -1, -1, 0}, /* 1 */ { 1, s_8_1, -1, -1, 0} }; static symbol s_9_0[3] = { 'm', 'm', 'a' }; static symbol s_9_1[4] = { 'i', 'm', 'm', 'a' }; static struct among a_9[2] = { /* 0 */ { 3, s_9_0, -1, 1, 0}, /* 1 */ { 4, s_9_1, 0, -1, 0} }; static unsigned char g_AEI[] = { 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 }; static unsigned char g_V1[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 }; static unsigned char g_V2[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 }; static unsigned char g_particle_end[] = { 17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 }; static symbol s_0[] = { 'k' }; static symbol s_1[] = { 'k', 's', 'e' }; static symbol s_2[] = { 'k', 's', 'i' }; static symbol s_3[] = { 'i' }; static symbol s_4[] = { 'a' }; static symbol s_5[] = { 'e' }; static symbol s_6[] = { 'i' }; static symbol s_7[] = { 'o' }; static symbol s_8[] = { 0xE4 }; static symbol s_9[] = { 0xF6 }; static symbol s_10[] = { 'i', 'e' }; static symbol s_11[] = { 'e' }; static symbol s_12[] = { 'p', 'o' }; static symbol s_13[] = { 't' }; static symbol s_14[] = { 'p', 'o' }; static symbol s_15[] = { 'j' }; static symbol s_16[] = { 'o' }; static symbol s_17[] = { 'u' }; static symbol s_18[] = { 'o' }; static symbol s_19[] = { 'j' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; while(1) { /* goto, line 46 */ int c = z->c; if (!(in_grouping(z, g_V1, 97, 246))) goto lab0; z->c = c; break; lab0: z->c = c; if (z->c >= z->l) return 0; z->c++; /* goto, line 46 */ } while(1) { /* gopast, line 46 */ if (!(out_grouping(z, g_V1, 97, 246))) goto lab1; break; lab1: if (z->c >= z->l) return 0; z->c++; /* gopast, line 46 */ } z->I[0] = z->c; /* setmark p1, line 46 */ while(1) { /* goto, line 47 */ int c = z->c; if (!(in_grouping(z, g_V1, 97, 246))) goto lab2; z->c = c; break; lab2: z->c = c; if (z->c >= z->l) return 0; z->c++; /* goto, line 47 */ } while(1) { /* gopast, line 47 */ if (!(out_grouping(z, g_V1, 97, 246))) goto lab3; break; lab3: if (z->c >= z->l) return 0; z->c++; /* gopast, line 47 */ } z->I[1] = z->c; /* setmark p2, line 47 */ return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_particle_etc(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 55 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 55 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 55 */ among_var = find_among_b(z, a_0, 10); /* substring, line 55 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 55 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: if (!(in_grouping_b(z, g_particle_end, 97, 246))) return 0; break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 64 */ if (ret < 0) return ret; } break; } { int ret; ret = slice_del(z); /* delete, line 66 */ if (ret < 0) return ret; } return 1; } static int r_possessive(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 69 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 69 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 69 */ among_var = find_among_b(z, a_4, 9); /* substring, line 69 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 69 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* not, line 72 */ if (!(eq_s_b(z, 1, s_0))) goto lab0; return 0; lab0: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 72 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 74 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 74 */ if (!(eq_s_b(z, 3, s_1))) return 0; z->bra = z->c; /* ], line 74 */ { int ret; ret = slice_from_s(z, 3, s_2); /* <-, line 74 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 78 */ if (ret < 0) return ret; } break; case 4: if (!(find_among_b(z, a_1, 6))) return 0; /* among, line 81 */ { int ret; ret = slice_del(z); /* delete, line 81 */ if (ret < 0) return ret; } break; case 5: if (!(find_among_b(z, a_2, 6))) return 0; /* among, line 83 */ { int ret; ret = slice_del(z); /* delete, line 84 */ if (ret < 0) return ret; } break; case 6: if (!(find_among_b(z, a_3, 2))) return 0; /* among, line 86 */ { int ret; ret = slice_del(z); /* delete, line 86 */ if (ret < 0) return ret; } break; } return 1; } static int r_LONG(struct SN_env * z) { if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 91 */ return 1; } static int r_VI(struct SN_env * z) { if (!(eq_s_b(z, 1, s_3))) return 0; if (!(in_grouping_b(z, g_V2, 97, 246))) return 0; return 1; } static int r_case_ending(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 96 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 96 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 96 */ among_var = find_among_b(z, a_6, 30); /* substring, line 96 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 96 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: if (!(eq_s_b(z, 1, s_4))) return 0; break; case 2: if (!(eq_s_b(z, 1, s_5))) return 0; break; case 3: if (!(eq_s_b(z, 1, s_6))) return 0; break; case 4: if (!(eq_s_b(z, 1, s_7))) return 0; break; case 5: if (!(eq_s_b(z, 1, s_8))) return 0; break; case 6: if (!(eq_s_b(z, 1, s_9))) return 0; break; case 7: { int m = z->l - z->c; (void) m; /* try, line 111 */ { int m = z->l - z->c; (void) m; /* and, line 113 */ { int m = z->l - z->c; (void) m; /* or, line 112 */ { int ret = r_LONG(z); if (ret == 0) goto lab2; /* call LONG, line 111 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m; goto lab0; } } lab1: z->c = z->l - m; if (z->c <= z->lb) { z->c = z->l - m; goto lab0; } z->c--; /* next, line 113 */ } z->bra = z->c; /* ], line 113 */ lab0: ; } break; case 8: if (!(in_grouping_b(z, g_V1, 97, 246))) return 0; if (!(out_grouping_b(z, g_V1, 97, 246))) return 0; break; case 9: if (!(eq_s_b(z, 1, s_11))) return 0; break; } { int ret; ret = slice_del(z); /* delete, line 138 */ if (ret < 0) return ret; } z->B[0] = 1; /* set ending_removed, line 139 */ return 1; } static int r_other_endings(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 142 */ int m = z->l - z->c; (void) m; if (z->c < z->I[1]) return 0; z->c = z->I[1]; /* tomark, line 142 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 142 */ among_var = find_among_b(z, a_7, 14); /* substring, line 142 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 142 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* not, line 146 */ if (!(eq_s_b(z, 2, s_12))) goto lab0; return 0; lab0: z->c = z->l - m; } break; } { int ret; ret = slice_del(z); /* delete, line 151 */ if (ret < 0) return ret; } return 1; } static int r_i_plural(struct SN_env * z) { { int m3; /* setlimit, line 154 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 154 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 154 */ if (!(find_among_b(z, a_8, 2))) { z->lb = m3; return 0; } /* substring, line 154 */ z->bra = z->c; /* ], line 154 */ z->lb = m3; } { int ret; ret = slice_del(z); /* delete, line 158 */ if (ret < 0) return ret; } return 1; } static int r_t_plural(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 161 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 161 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 162 */ if (!(eq_s_b(z, 1, s_13))) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 162 */ { int m_test = z->l - z->c; /* test, line 162 */ if (!(in_grouping_b(z, g_V1, 97, 246))) { z->lb = m3; return 0; } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 163 */ if (ret < 0) return ret; } z->lb = m3; } { int m3; /* setlimit, line 165 */ int m = z->l - z->c; (void) m; if (z->c < z->I[1]) return 0; z->c = z->I[1]; /* tomark, line 165 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 165 */ among_var = find_among_b(z, a_9, 2); /* substring, line 165 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 165 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* not, line 167 */ if (!(eq_s_b(z, 2, s_14))) goto lab0; return 0; lab0: z->c = z->l - m; } break; } { int ret; ret = slice_del(z); /* delete, line 170 */ if (ret < 0) return ret; } return 1; } static int r_tidy(struct SN_env * z) { { int m3; /* setlimit, line 173 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 173 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 174 */ { int m = z->l - z->c; (void) m; /* and, line 174 */ { int ret = r_LONG(z); if (ret == 0) goto lab0; /* call LONG, line 174 */ if (ret < 0) return ret; } z->c = z->l - m; z->ket = z->c; /* [, line 174 */ if (z->c <= z->lb) goto lab0; z->c--; /* next, line 174 */ z->bra = z->c; /* ], line 174 */ { int ret; ret = slice_del(z); /* delete, line 174 */ if (ret < 0) return ret; } } lab0: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 175 */ z->ket = z->c; /* [, line 175 */ if (!(in_grouping_b(z, g_AEI, 97, 228))) goto lab1; z->bra = z->c; /* ], line 175 */ if (!(out_grouping_b(z, g_V1, 97, 246))) goto lab1; { int ret; ret = slice_del(z); /* delete, line 175 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 176 */ z->ket = z->c; /* [, line 176 */ if (!(eq_s_b(z, 1, s_15))) goto lab2; z->bra = z->c; /* ], line 176 */ { int m = z->l - z->c; (void) m; /* or, line 176 */ if (!(eq_s_b(z, 1, s_16))) goto lab4; goto lab3; lab4: z->c = z->l - m; if (!(eq_s_b(z, 1, s_17))) goto lab2; } lab3: { int ret; ret = slice_del(z); /* delete, line 176 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 177 */ z->ket = z->c; /* [, line 177 */ if (!(eq_s_b(z, 1, s_18))) goto lab5; z->bra = z->c; /* ], line 177 */ if (!(eq_s_b(z, 1, s_19))) goto lab5; { int ret; ret = slice_del(z); /* delete, line 177 */ if (ret < 0) return ret; } lab5: z->c = z->l - m; } z->lb = m3; } while(1) { /* goto, line 179 */ int m = z->l - z->c; (void) m; if (!(out_grouping_b(z, g_V1, 97, 246))) goto lab6; z->c = z->l - m; break; lab6: z->c = z->l - m; if (z->c <= z->lb) return 0; z->c--; /* goto, line 179 */ } z->ket = z->c; /* [, line 179 */ if (z->c <= z->lb) return 0; z->c--; /* next, line 179 */ z->bra = z->c; /* ], line 179 */ z->S[0] = slice_to(z, z->S[0]); /* -> x, line 179 */ if (z->S[0] == 0) return -1; /* -> x, line 179 */ if (!(eq_v_b(z, z->S[0]))) return 0; /* name x, line 179 */ { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } return 1; } extern int finnish_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 185 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 185 */ if (ret < 0) return ret; } lab0: z->c = c; } z->B[0] = 0; /* unset ending_removed, line 186 */ z->lb = z->c; z->c = z->l; /* backwards, line 187 */ { int m = z->l - z->c; (void) m; /* do, line 188 */ { int ret = r_particle_etc(z); if (ret == 0) goto lab1; /* call particle_etc, line 188 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 189 */ { int ret = r_possessive(z); if (ret == 0) goto lab2; /* call possessive, line 189 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 190 */ { int ret = r_case_ending(z); if (ret == 0) goto lab3; /* call case_ending, line 190 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 191 */ { int ret = r_other_endings(z); if (ret == 0) goto lab4; /* call other_endings, line 191 */ if (ret < 0) return ret; } lab4: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* or, line 192 */ if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 192 */ { int m = z->l - z->c; (void) m; /* do, line 192 */ { int ret = r_i_plural(z); if (ret == 0) goto lab7; /* call i_plural, line 192 */ if (ret < 0) return ret; } lab7: z->c = z->l - m; } goto lab5; lab6: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 192 */ { int ret = r_t_plural(z); if (ret == 0) goto lab8; /* call t_plural, line 192 */ if (ret < 0) return ret; } lab8: z->c = z->l - m; } } lab5: { int m = z->l - z->c; (void) m; /* do, line 193 */ { int ret = r_tidy(z); if (ret == 0) goto lab9; /* call tidy, line 193 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * finnish_ISO_8859_1_create_env(void) { return SN_create_env(1, 2, 1); } extern void finnish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_finnish.h000066400000000000000000000005101154025176300301210ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * finnish_ISO_8859_1_create_env(void); extern void finnish_ISO_8859_1_close_env(struct SN_env * z); extern int finnish_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_french.c000066400000000000000000001325431154025176300277370ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int french_ISO_8859_1_stem(struct SN_env * z); static int r_un_accent(struct SN_env * z); static int r_un_double(struct SN_env * z); static int r_residual_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_i_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * french_ISO_8859_1_create_env(void); extern void french_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_1[1] = { 'I' }; static symbol s_0_2[1] = { 'U' }; static symbol s_0_3[1] = { 'Y' }; static struct among a_0[4] = { /* 0 */ { 0, 0, -1, 4, 0}, /* 1 */ { 1, s_0_1, 0, 1, 0}, /* 2 */ { 1, s_0_2, 0, 2, 0}, /* 3 */ { 1, s_0_3, 0, 3, 0} }; static symbol s_1_0[3] = { 'i', 'q', 'U' }; static symbol s_1_1[3] = { 'a', 'b', 'l' }; static symbol s_1_2[3] = { 'I', 0xE8, 'r' }; static symbol s_1_3[3] = { 'i', 0xE8, 'r' }; static symbol s_1_4[3] = { 'e', 'u', 's' }; static symbol s_1_5[2] = { 'i', 'v' }; static struct among a_1[6] = { /* 0 */ { 3, s_1_0, -1, 3, 0}, /* 1 */ { 3, s_1_1, -1, 3, 0}, /* 2 */ { 3, s_1_2, -1, 4, 0}, /* 3 */ { 3, s_1_3, -1, 4, 0}, /* 4 */ { 3, s_1_4, -1, 2, 0}, /* 5 */ { 2, s_1_5, -1, 1, 0} }; static symbol s_2_0[2] = { 'i', 'c' }; static symbol s_2_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_2_2[2] = { 'i', 'v' }; static struct among a_2[3] = { /* 0 */ { 2, s_2_0, -1, 2, 0}, /* 1 */ { 4, s_2_1, -1, 1, 0}, /* 2 */ { 2, s_2_2, -1, 3, 0} }; static symbol s_3_0[4] = { 'i', 'q', 'U', 'e' }; static symbol s_3_1[6] = { 'a', 't', 'r', 'i', 'c', 'e' }; static symbol s_3_2[4] = { 'a', 'n', 'c', 'e' }; static symbol s_3_3[4] = { 'e', 'n', 'c', 'e' }; static symbol s_3_4[5] = { 'l', 'o', 'g', 'i', 'e' }; static symbol s_3_5[4] = { 'a', 'b', 'l', 'e' }; static symbol s_3_6[4] = { 'i', 's', 'm', 'e' }; static symbol s_3_7[4] = { 'e', 'u', 's', 'e' }; static symbol s_3_8[4] = { 'i', 's', 't', 'e' }; static symbol s_3_9[3] = { 'i', 'v', 'e' }; static symbol s_3_10[2] = { 'i', 'f' }; static symbol s_3_11[5] = { 'u', 's', 'i', 'o', 'n' }; static symbol s_3_12[5] = { 'a', 't', 'i', 'o', 'n' }; static symbol s_3_13[5] = { 'u', 't', 'i', 'o', 'n' }; static symbol s_3_14[5] = { 'a', 't', 'e', 'u', 'r' }; static symbol s_3_15[5] = { 'i', 'q', 'U', 'e', 's' }; static symbol s_3_16[7] = { 'a', 't', 'r', 'i', 'c', 'e', 's' }; static symbol s_3_17[5] = { 'a', 'n', 'c', 'e', 's' }; static symbol s_3_18[5] = { 'e', 'n', 'c', 'e', 's' }; static symbol s_3_19[6] = { 'l', 'o', 'g', 'i', 'e', 's' }; static symbol s_3_20[5] = { 'a', 'b', 'l', 'e', 's' }; static symbol s_3_21[5] = { 'i', 's', 'm', 'e', 's' }; static symbol s_3_22[5] = { 'e', 'u', 's', 'e', 's' }; static symbol s_3_23[5] = { 'i', 's', 't', 'e', 's' }; static symbol s_3_24[4] = { 'i', 'v', 'e', 's' }; static symbol s_3_25[3] = { 'i', 'f', 's' }; static symbol s_3_26[6] = { 'u', 's', 'i', 'o', 'n', 's' }; static symbol s_3_27[6] = { 'a', 't', 'i', 'o', 'n', 's' }; static symbol s_3_28[6] = { 'u', 't', 'i', 'o', 'n', 's' }; static symbol s_3_29[6] = { 'a', 't', 'e', 'u', 'r', 's' }; static symbol s_3_30[5] = { 'm', 'e', 'n', 't', 's' }; static symbol s_3_31[6] = { 'e', 'm', 'e', 'n', 't', 's' }; static symbol s_3_32[9] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't', 's' }; static symbol s_3_33[4] = { 'i', 't', 0xE9, 's' }; static symbol s_3_34[4] = { 'm', 'e', 'n', 't' }; static symbol s_3_35[5] = { 'e', 'm', 'e', 'n', 't' }; static symbol s_3_36[8] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't' }; static symbol s_3_37[6] = { 'a', 'm', 'm', 'e', 'n', 't' }; static symbol s_3_38[6] = { 'e', 'm', 'm', 'e', 'n', 't' }; static symbol s_3_39[3] = { 'a', 'u', 'x' }; static symbol s_3_40[4] = { 'e', 'a', 'u', 'x' }; static symbol s_3_41[3] = { 'e', 'u', 'x' }; static symbol s_3_42[3] = { 'i', 't', 0xE9 }; static struct among a_3[43] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 6, s_3_1, -1, 2, 0}, /* 2 */ { 4, s_3_2, -1, 1, 0}, /* 3 */ { 4, s_3_3, -1, 5, 0}, /* 4 */ { 5, s_3_4, -1, 3, 0}, /* 5 */ { 4, s_3_5, -1, 1, 0}, /* 6 */ { 4, s_3_6, -1, 1, 0}, /* 7 */ { 4, s_3_7, -1, 11, 0}, /* 8 */ { 4, s_3_8, -1, 1, 0}, /* 9 */ { 3, s_3_9, -1, 8, 0}, /* 10 */ { 2, s_3_10, -1, 8, 0}, /* 11 */ { 5, s_3_11, -1, 4, 0}, /* 12 */ { 5, s_3_12, -1, 2, 0}, /* 13 */ { 5, s_3_13, -1, 4, 0}, /* 14 */ { 5, s_3_14, -1, 2, 0}, /* 15 */ { 5, s_3_15, -1, 1, 0}, /* 16 */ { 7, s_3_16, -1, 2, 0}, /* 17 */ { 5, s_3_17, -1, 1, 0}, /* 18 */ { 5, s_3_18, -1, 5, 0}, /* 19 */ { 6, s_3_19, -1, 3, 0}, /* 20 */ { 5, s_3_20, -1, 1, 0}, /* 21 */ { 5, s_3_21, -1, 1, 0}, /* 22 */ { 5, s_3_22, -1, 11, 0}, /* 23 */ { 5, s_3_23, -1, 1, 0}, /* 24 */ { 4, s_3_24, -1, 8, 0}, /* 25 */ { 3, s_3_25, -1, 8, 0}, /* 26 */ { 6, s_3_26, -1, 4, 0}, /* 27 */ { 6, s_3_27, -1, 2, 0}, /* 28 */ { 6, s_3_28, -1, 4, 0}, /* 29 */ { 6, s_3_29, -1, 2, 0}, /* 30 */ { 5, s_3_30, -1, 15, 0}, /* 31 */ { 6, s_3_31, 30, 6, 0}, /* 32 */ { 9, s_3_32, 31, 12, 0}, /* 33 */ { 4, s_3_33, -1, 7, 0}, /* 34 */ { 4, s_3_34, -1, 15, 0}, /* 35 */ { 5, s_3_35, 34, 6, 0}, /* 36 */ { 8, s_3_36, 35, 12, 0}, /* 37 */ { 6, s_3_37, 34, 13, 0}, /* 38 */ { 6, s_3_38, 34, 14, 0}, /* 39 */ { 3, s_3_39, -1, 10, 0}, /* 40 */ { 4, s_3_40, 39, 9, 0}, /* 41 */ { 3, s_3_41, -1, 1, 0}, /* 42 */ { 3, s_3_42, -1, 7, 0} }; static symbol s_4_0[3] = { 'i', 'r', 'a' }; static symbol s_4_1[2] = { 'i', 'e' }; static symbol s_4_2[4] = { 'i', 's', 's', 'e' }; static symbol s_4_3[7] = { 'i', 's', 's', 'a', 'n', 't', 'e' }; static symbol s_4_4[1] = { 'i' }; static symbol s_4_5[4] = { 'i', 'r', 'a', 'i' }; static symbol s_4_6[2] = { 'i', 'r' }; static symbol s_4_7[4] = { 'i', 'r', 'a', 's' }; static symbol s_4_8[3] = { 'i', 'e', 's' }; static symbol s_4_9[4] = { 0xEE, 'm', 'e', 's' }; static symbol s_4_10[5] = { 'i', 's', 's', 'e', 's' }; static symbol s_4_11[8] = { 'i', 's', 's', 'a', 'n', 't', 'e', 's' }; static symbol s_4_12[4] = { 0xEE, 't', 'e', 's' }; static symbol s_4_13[2] = { 'i', 's' }; static symbol s_4_14[5] = { 'i', 'r', 'a', 'i', 's' }; static symbol s_4_15[6] = { 'i', 's', 's', 'a', 'i', 's' }; static symbol s_4_16[6] = { 'i', 'r', 'i', 'o', 'n', 's' }; static symbol s_4_17[7] = { 'i', 's', 's', 'i', 'o', 'n', 's' }; static symbol s_4_18[5] = { 'i', 'r', 'o', 'n', 's' }; static symbol s_4_19[6] = { 'i', 's', 's', 'o', 'n', 's' }; static symbol s_4_20[7] = { 'i', 's', 's', 'a', 'n', 't', 's' }; static symbol s_4_21[2] = { 'i', 't' }; static symbol s_4_22[5] = { 'i', 'r', 'a', 'i', 't' }; static symbol s_4_23[6] = { 'i', 's', 's', 'a', 'i', 't' }; static symbol s_4_24[6] = { 'i', 's', 's', 'a', 'n', 't' }; static symbol s_4_25[7] = { 'i', 'r', 'a', 'I', 'e', 'n', 't' }; static symbol s_4_26[8] = { 'i', 's', 's', 'a', 'I', 'e', 'n', 't' }; static symbol s_4_27[5] = { 'i', 'r', 'e', 'n', 't' }; static symbol s_4_28[6] = { 'i', 's', 's', 'e', 'n', 't' }; static symbol s_4_29[5] = { 'i', 'r', 'o', 'n', 't' }; static symbol s_4_30[2] = { 0xEE, 't' }; static symbol s_4_31[5] = { 'i', 'r', 'i', 'e', 'z' }; static symbol s_4_32[6] = { 'i', 's', 's', 'i', 'e', 'z' }; static symbol s_4_33[4] = { 'i', 'r', 'e', 'z' }; static symbol s_4_34[5] = { 'i', 's', 's', 'e', 'z' }; static struct among a_4[35] = { /* 0 */ { 3, s_4_0, -1, 1, 0}, /* 1 */ { 2, s_4_1, -1, 1, 0}, /* 2 */ { 4, s_4_2, -1, 1, 0}, /* 3 */ { 7, s_4_3, -1, 1, 0}, /* 4 */ { 1, s_4_4, -1, 1, 0}, /* 5 */ { 4, s_4_5, 4, 1, 0}, /* 6 */ { 2, s_4_6, -1, 1, 0}, /* 7 */ { 4, s_4_7, -1, 1, 0}, /* 8 */ { 3, s_4_8, -1, 1, 0}, /* 9 */ { 4, s_4_9, -1, 1, 0}, /* 10 */ { 5, s_4_10, -1, 1, 0}, /* 11 */ { 8, s_4_11, -1, 1, 0}, /* 12 */ { 4, s_4_12, -1, 1, 0}, /* 13 */ { 2, s_4_13, -1, 1, 0}, /* 14 */ { 5, s_4_14, 13, 1, 0}, /* 15 */ { 6, s_4_15, 13, 1, 0}, /* 16 */ { 6, s_4_16, -1, 1, 0}, /* 17 */ { 7, s_4_17, -1, 1, 0}, /* 18 */ { 5, s_4_18, -1, 1, 0}, /* 19 */ { 6, s_4_19, -1, 1, 0}, /* 20 */ { 7, s_4_20, -1, 1, 0}, /* 21 */ { 2, s_4_21, -1, 1, 0}, /* 22 */ { 5, s_4_22, 21, 1, 0}, /* 23 */ { 6, s_4_23, 21, 1, 0}, /* 24 */ { 6, s_4_24, -1, 1, 0}, /* 25 */ { 7, s_4_25, -1, 1, 0}, /* 26 */ { 8, s_4_26, -1, 1, 0}, /* 27 */ { 5, s_4_27, -1, 1, 0}, /* 28 */ { 6, s_4_28, -1, 1, 0}, /* 29 */ { 5, s_4_29, -1, 1, 0}, /* 30 */ { 2, s_4_30, -1, 1, 0}, /* 31 */ { 5, s_4_31, -1, 1, 0}, /* 32 */ { 6, s_4_32, -1, 1, 0}, /* 33 */ { 4, s_4_33, -1, 1, 0}, /* 34 */ { 5, s_4_34, -1, 1, 0} }; static symbol s_5_0[1] = { 'a' }; static symbol s_5_1[3] = { 'e', 'r', 'a' }; static symbol s_5_2[4] = { 'a', 's', 's', 'e' }; static symbol s_5_3[4] = { 'a', 'n', 't', 'e' }; static symbol s_5_4[2] = { 0xE9, 'e' }; static symbol s_5_5[2] = { 'a', 'i' }; static symbol s_5_6[4] = { 'e', 'r', 'a', 'i' }; static symbol s_5_7[2] = { 'e', 'r' }; static symbol s_5_8[2] = { 'a', 's' }; static symbol s_5_9[4] = { 'e', 'r', 'a', 's' }; static symbol s_5_10[4] = { 0xE2, 'm', 'e', 's' }; static symbol s_5_11[5] = { 'a', 's', 's', 'e', 's' }; static symbol s_5_12[5] = { 'a', 'n', 't', 'e', 's' }; static symbol s_5_13[4] = { 0xE2, 't', 'e', 's' }; static symbol s_5_14[3] = { 0xE9, 'e', 's' }; static symbol s_5_15[3] = { 'a', 'i', 's' }; static symbol s_5_16[5] = { 'e', 'r', 'a', 'i', 's' }; static symbol s_5_17[4] = { 'i', 'o', 'n', 's' }; static symbol s_5_18[6] = { 'e', 'r', 'i', 'o', 'n', 's' }; static symbol s_5_19[7] = { 'a', 's', 's', 'i', 'o', 'n', 's' }; static symbol s_5_20[5] = { 'e', 'r', 'o', 'n', 's' }; static symbol s_5_21[4] = { 'a', 'n', 't', 's' }; static symbol s_5_22[2] = { 0xE9, 's' }; static symbol s_5_23[3] = { 'a', 'i', 't' }; static symbol s_5_24[5] = { 'e', 'r', 'a', 'i', 't' }; static symbol s_5_25[3] = { 'a', 'n', 't' }; static symbol s_5_26[5] = { 'a', 'I', 'e', 'n', 't' }; static symbol s_5_27[7] = { 'e', 'r', 'a', 'I', 'e', 'n', 't' }; static symbol s_5_28[5] = { 0xE8, 'r', 'e', 'n', 't' }; static symbol s_5_29[6] = { 'a', 's', 's', 'e', 'n', 't' }; static symbol s_5_30[5] = { 'e', 'r', 'o', 'n', 't' }; static symbol s_5_31[2] = { 0xE2, 't' }; static symbol s_5_32[2] = { 'e', 'z' }; static symbol s_5_33[3] = { 'i', 'e', 'z' }; static symbol s_5_34[5] = { 'e', 'r', 'i', 'e', 'z' }; static symbol s_5_35[6] = { 'a', 's', 's', 'i', 'e', 'z' }; static symbol s_5_36[4] = { 'e', 'r', 'e', 'z' }; static symbol s_5_37[1] = { 0xE9 }; static struct among a_5[38] = { /* 0 */ { 1, s_5_0, -1, 3, 0}, /* 1 */ { 3, s_5_1, 0, 2, 0}, /* 2 */ { 4, s_5_2, -1, 3, 0}, /* 3 */ { 4, s_5_3, -1, 3, 0}, /* 4 */ { 2, s_5_4, -1, 2, 0}, /* 5 */ { 2, s_5_5, -1, 3, 0}, /* 6 */ { 4, s_5_6, 5, 2, 0}, /* 7 */ { 2, s_5_7, -1, 2, 0}, /* 8 */ { 2, s_5_8, -1, 3, 0}, /* 9 */ { 4, s_5_9, 8, 2, 0}, /* 10 */ { 4, s_5_10, -1, 3, 0}, /* 11 */ { 5, s_5_11, -1, 3, 0}, /* 12 */ { 5, s_5_12, -1, 3, 0}, /* 13 */ { 4, s_5_13, -1, 3, 0}, /* 14 */ { 3, s_5_14, -1, 2, 0}, /* 15 */ { 3, s_5_15, -1, 3, 0}, /* 16 */ { 5, s_5_16, 15, 2, 0}, /* 17 */ { 4, s_5_17, -1, 1, 0}, /* 18 */ { 6, s_5_18, 17, 2, 0}, /* 19 */ { 7, s_5_19, 17, 3, 0}, /* 20 */ { 5, s_5_20, -1, 2, 0}, /* 21 */ { 4, s_5_21, -1, 3, 0}, /* 22 */ { 2, s_5_22, -1, 2, 0}, /* 23 */ { 3, s_5_23, -1, 3, 0}, /* 24 */ { 5, s_5_24, 23, 2, 0}, /* 25 */ { 3, s_5_25, -1, 3, 0}, /* 26 */ { 5, s_5_26, -1, 3, 0}, /* 27 */ { 7, s_5_27, 26, 2, 0}, /* 28 */ { 5, s_5_28, -1, 2, 0}, /* 29 */ { 6, s_5_29, -1, 3, 0}, /* 30 */ { 5, s_5_30, -1, 2, 0}, /* 31 */ { 2, s_5_31, -1, 3, 0}, /* 32 */ { 2, s_5_32, -1, 2, 0}, /* 33 */ { 3, s_5_33, 32, 2, 0}, /* 34 */ { 5, s_5_34, 33, 2, 0}, /* 35 */ { 6, s_5_35, 33, 3, 0}, /* 36 */ { 4, s_5_36, 32, 2, 0}, /* 37 */ { 1, s_5_37, -1, 2, 0} }; static symbol s_6_0[1] = { 'e' }; static symbol s_6_1[4] = { 'I', 0xE8, 'r', 'e' }; static symbol s_6_2[4] = { 'i', 0xE8, 'r', 'e' }; static symbol s_6_3[3] = { 'i', 'o', 'n' }; static symbol s_6_4[3] = { 'I', 'e', 'r' }; static symbol s_6_5[3] = { 'i', 'e', 'r' }; static symbol s_6_6[1] = { 0xEB }; static struct among a_6[7] = { /* 0 */ { 1, s_6_0, -1, 3, 0}, /* 1 */ { 4, s_6_1, 0, 2, 0}, /* 2 */ { 4, s_6_2, 0, 2, 0}, /* 3 */ { 3, s_6_3, -1, 1, 0}, /* 4 */ { 3, s_6_4, -1, 2, 0}, /* 5 */ { 3, s_6_5, -1, 2, 0}, /* 6 */ { 1, s_6_6, -1, 4, 0} }; static symbol s_7_0[3] = { 'e', 'l', 'l' }; static symbol s_7_1[4] = { 'e', 'i', 'l', 'l' }; static symbol s_7_2[3] = { 'e', 'n', 'n' }; static symbol s_7_3[3] = { 'o', 'n', 'n' }; static symbol s_7_4[3] = { 'e', 't', 't' }; static struct among a_7[5] = { /* 0 */ { 3, s_7_0, -1, -1, 0}, /* 1 */ { 4, s_7_1, -1, -1, 0}, /* 2 */ { 3, s_7_2, -1, -1, 0}, /* 3 */ { 3, s_7_3, -1, -1, 0}, /* 4 */ { 3, s_7_4, -1, -1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 130, 103, 8, 5 }; static unsigned char g_keep_with_s[] = { 1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static symbol s_0[] = { 'u' }; static symbol s_1[] = { 'U' }; static symbol s_2[] = { 'i' }; static symbol s_3[] = { 'I' }; static symbol s_4[] = { 'y' }; static symbol s_5[] = { 'Y' }; static symbol s_6[] = { 'y' }; static symbol s_7[] = { 'Y' }; static symbol s_8[] = { 'q' }; static symbol s_9[] = { 'u' }; static symbol s_10[] = { 'U' }; static symbol s_11[] = { 'i' }; static symbol s_12[] = { 'u' }; static symbol s_13[] = { 'y' }; static symbol s_14[] = { 'i', 'c' }; static symbol s_15[] = { 'i', 'q', 'U' }; static symbol s_16[] = { 'l', 'o', 'g' }; static symbol s_17[] = { 'u' }; static symbol s_18[] = { 'e', 'n', 't' }; static symbol s_19[] = { 'a', 't' }; static symbol s_20[] = { 'e', 'u', 'x' }; static symbol s_21[] = { 'i' }; static symbol s_22[] = { 'a', 'b', 'l' }; static symbol s_23[] = { 'i', 'q', 'U' }; static symbol s_24[] = { 'a', 't' }; static symbol s_25[] = { 'i', 'c' }; static symbol s_26[] = { 'i', 'q', 'U' }; static symbol s_27[] = { 'e', 'a', 'u' }; static symbol s_28[] = { 'a', 'l' }; static symbol s_29[] = { 'e', 'u', 'x' }; static symbol s_30[] = { 'a', 'n', 't' }; static symbol s_31[] = { 'e', 'n', 't' }; static symbol s_32[] = { 'e' }; static symbol s_33[] = { 's' }; static symbol s_34[] = { 's' }; static symbol s_35[] = { 't' }; static symbol s_36[] = { 'i' }; static symbol s_37[] = { 'g', 'u' }; static symbol s_38[] = { 0xE9 }; static symbol s_39[] = { 0xE8 }; static symbol s_40[] = { 'e' }; static symbol s_41[] = { 'Y' }; static symbol s_42[] = { 'i' }; static symbol s_43[] = { 0xE7 }; static symbol s_44[] = { 'c' }; static int r_prelude(struct SN_env * z) { while(1) { /* repeat, line 38 */ int c = z->c; while(1) { /* goto, line 38 */ int c = z->c; { int c = z->c; /* or, line 44 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab3; z->bra = z->c; /* [, line 40 */ { int c = z->c; /* or, line 40 */ if (!(eq_s(z, 1, s_0))) goto lab5; z->ket = z->c; /* ], line 40 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab5; { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 40 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = c; if (!(eq_s(z, 1, s_2))) goto lab6; z->ket = z->c; /* ], line 41 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab6; { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 41 */ if (ret < 0) return ret; } goto lab4; lab6: z->c = c; if (!(eq_s(z, 1, s_4))) goto lab3; z->ket = z->c; /* ], line 42 */ { int ret; ret = slice_from_s(z, 1, s_5); /* <-, line 42 */ if (ret < 0) return ret; } } lab4: goto lab2; lab3: z->c = c; z->bra = z->c; /* [, line 45 */ if (!(eq_s(z, 1, s_6))) goto lab7; z->ket = z->c; /* ], line 45 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab7; { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 45 */ if (ret < 0) return ret; } goto lab2; lab7: z->c = c; if (!(eq_s(z, 1, s_8))) goto lab1; z->bra = z->c; /* [, line 47 */ if (!(eq_s(z, 1, s_9))) goto lab1; z->ket = z->c; /* ], line 47 */ { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 47 */ if (ret < 0) return ret; } } lab2: z->c = c; break; lab1: z->c = c; if (z->c >= z->l) goto lab0; z->c++; /* goto, line 38 */ } continue; lab0: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 56 */ { int c = z->c; /* or, line 57 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab2; if (!(in_grouping(z, g_v, 97, 251))) goto lab2; if (z->c >= z->l) goto lab2; z->c++; /* next, line 57 */ goto lab1; lab2: z->c = c; if (z->c >= z->l) goto lab0; z->c++; /* next, line 57 */ while(1) { /* gopast, line 57 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab3; break; lab3: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 57 */ } } lab1: z->I[0] = z->c; /* setmark pV, line 58 */ lab0: z->c = c; } { int c = z->c; /* do, line 60 */ while(1) { /* gopast, line 61 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab5; break; lab5: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 61 */ } while(1) { /* gopast, line 61 */ if (!(out_grouping(z, g_v, 97, 251))) goto lab6; break; lab6: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 61 */ } z->I[1] = z->c; /* setmark p1, line 61 */ while(1) { /* gopast, line 62 */ if (!(in_grouping(z, g_v, 97, 251))) goto lab7; break; lab7: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 62 */ } while(1) { /* gopast, line 62 */ if (!(out_grouping(z, g_v, 97, 251))) goto lab8; break; lab8: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 62 */ } z->I[2] = z->c; /* setmark p2, line 62 */ lab4: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 66 */ int c = z->c; z->bra = z->c; /* [, line 68 */ among_var = find_among(z, a_0, 4); /* substring, line 68 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 68 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_11); /* <-, line 69 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_12); /* <-, line 70 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 71 */ if (ret < 0) return ret; } break; case 4: if (z->c >= z->l) goto lab0; z->c++; /* next, line 72 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 83 */ among_var = find_among_b(z, a_3, 43); /* substring, line 83 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 83 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 87 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 87 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 90 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 90 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 91 */ z->ket = z->c; /* [, line 91 */ if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 91 */ { int m = z->l - z->c; (void) m; /* or, line 91 */ { int ret = r_R2(z); if (ret == 0) goto lab2; /* call R2, line 91 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 91 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_15); /* <-, line 91 */ if (ret < 0) return ret; } } lab1: lab0: ; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 95 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_16); /* <-, line 95 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 98 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_17); /* <-, line 98 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 101 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_18); /* <-, line 101 */ if (ret < 0) return ret; } break; case 6: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 105 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 105 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 106 */ z->ket = z->c; /* [, line 107 */ among_var = find_among_b(z, a_1, 6); /* substring, line 107 */ if (!(among_var)) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 107 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab3; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 108 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 108 */ if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 108 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 108 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 109 */ { int ret = r_R2(z); if (ret == 0) goto lab5; /* call R2, line 109 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 109 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R1, line 109 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_20); /* <-, line 109 */ if (ret < 0) return ret; } } lab4: break; case 3: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 111 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 111 */ if (ret < 0) return ret; } break; case 4: { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call RV, line 113 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_21); /* <-, line 113 */ if (ret < 0) return ret; } break; } lab3: ; } break; case 7: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 120 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 120 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 121 */ z->ket = z->c; /* [, line 122 */ among_var = find_among_b(z, a_2, 3); /* substring, line 122 */ if (!(among_var)) { z->c = z->l - m; goto lab6; } z->bra = z->c; /* ], line 122 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab6; } case 1: { int m = z->l - z->c; (void) m; /* or, line 123 */ { int ret = r_R2(z); if (ret == 0) goto lab8; /* call R2, line 123 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 123 */ if (ret < 0) return ret; } goto lab7; lab8: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_22); /* <-, line 123 */ if (ret < 0) return ret; } } lab7: break; case 2: { int m = z->l - z->c; (void) m; /* or, line 124 */ { int ret = r_R2(z); if (ret == 0) goto lab10; /* call R2, line 124 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 124 */ if (ret < 0) return ret; } goto lab9; lab10: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_23); /* <-, line 124 */ if (ret < 0) return ret; } } lab9: break; case 3: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R2, line 125 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 125 */ if (ret < 0) return ret; } break; } lab6: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 132 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 132 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 133 */ z->ket = z->c; /* [, line 133 */ if (!(eq_s_b(z, 2, s_24))) { z->c = z->l - m; goto lab11; } z->bra = z->c; /* ], line 133 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab11; } /* call R2, line 133 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 133 */ if (!(eq_s_b(z, 2, s_25))) { z->c = z->l - m; goto lab11; } z->bra = z->c; /* ], line 133 */ { int m = z->l - z->c; (void) m; /* or, line 133 */ { int ret = r_R2(z); if (ret == 0) goto lab13; /* call R2, line 133 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } goto lab12; lab13: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_26); /* <-, line 133 */ if (ret < 0) return ret; } } lab12: lab11: ; } break; case 9: { int ret; ret = slice_from_s(z, 3, s_27); /* <-, line 135 */ if (ret < 0) return ret; } break; case 10: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 136 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 2, s_28); /* <-, line 136 */ if (ret < 0) return ret; } break; case 11: { int m = z->l - z->c; (void) m; /* or, line 138 */ { int ret = r_R2(z); if (ret == 0) goto lab15; /* call R2, line 138 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 138 */ if (ret < 0) return ret; } goto lab14; lab15: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 138 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_29); /* <-, line 138 */ if (ret < 0) return ret; } } lab14: break; case 12: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 141 */ if (ret < 0) return ret; } if (!(out_grouping_b(z, g_v, 97, 251))) return 0; { int ret; ret = slice_del(z); /* delete, line 141 */ if (ret < 0) return ret; } break; case 13: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 146 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_30); /* <-, line 146 */ if (ret < 0) return ret; } return 0; /* fail, line 146 */ break; case 14: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 147 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_31); /* <-, line 147 */ if (ret < 0) return ret; } return 0; /* fail, line 147 */ break; case 15: { int m_test = z->l - z->c; /* test, line 149 */ if (!(in_grouping_b(z, g_v, 97, 251))) return 0; { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 149 */ if (ret < 0) return ret; } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 149 */ if (ret < 0) return ret; } return 0; /* fail, line 149 */ break; } return 1; } static int r_i_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 154 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 154 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 155 */ among_var = find_among_b(z, a_4, 35); /* substring, line 155 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 155 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: if (!(out_grouping_b(z, g_v, 97, 251))) { z->lb = m3; return 0; } { int ret; ret = slice_del(z); /* delete, line 161 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 165 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 165 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 166 */ among_var = find_among_b(z, a_5, 38); /* substring, line 166 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 166 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret = r_R2(z); if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 168 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 168 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 176 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 181 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 182 */ z->ket = z->c; /* [, line 182 */ if (!(eq_s_b(z, 1, s_32))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 182 */ { int ret; ret = slice_del(z); /* delete, line 182 */ if (ret < 0) return ret; } lab0: ; } break; } z->lb = m3; } return 1; } static int r_residual_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* try, line 190 */ z->ket = z->c; /* [, line 190 */ if (!(eq_s_b(z, 1, s_33))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 190 */ { int m_test = z->l - z->c; /* test, line 190 */ if (!(out_grouping_b(z, g_keep_with_s, 97, 232))) { z->c = z->l - m; goto lab0; } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 190 */ if (ret < 0) return ret; } lab0: ; } { int m3; /* setlimit, line 191 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 191 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 192 */ among_var = find_among_b(z, a_6, 7); /* substring, line 192 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 192 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret = r_R2(z); if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 193 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* or, line 193 */ if (!(eq_s_b(z, 1, s_34))) goto lab2; goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 1, s_35))) { z->lb = m3; return 0; } } lab1: { int ret; ret = slice_del(z); /* delete, line 193 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_36); /* <-, line 195 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 196 */ if (ret < 0) return ret; } break; case 4: if (!(eq_s_b(z, 2, s_37))) { z->lb = m3; return 0; } { int ret; ret = slice_del(z); /* delete, line 197 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_un_double(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 203 */ if (!(find_among_b(z, a_7, 5))) return 0; /* among, line 203 */ z->c = z->l - m_test; } z->ket = z->c; /* [, line 203 */ if (z->c <= z->lb) return 0; z->c--; /* next, line 203 */ z->bra = z->c; /* ], line 203 */ { int ret; ret = slice_del(z); /* delete, line 203 */ if (ret < 0) return ret; } return 1; } static int r_un_accent(struct SN_env * z) { { int i = 1; while(1) { /* atleast, line 207 */ if (!(out_grouping_b(z, g_v, 97, 251))) goto lab0; i--; continue; lab0: break; } if (i > 0) return 0; } z->ket = z->c; /* [, line 208 */ { int m = z->l - z->c; (void) m; /* or, line 208 */ if (!(eq_s_b(z, 1, s_38))) goto lab2; goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 1, s_39))) return 0; } lab1: z->bra = z->c; /* ], line 208 */ { int ret; ret = slice_from_s(z, 1, s_40); /* <-, line 208 */ if (ret < 0) return ret; } return 1; } extern int french_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 214 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 214 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 215 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 215 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 216 */ { int m = z->l - z->c; (void) m; /* do, line 218 */ { int m = z->l - z->c; (void) m; /* or, line 228 */ { int m = z->l - z->c; (void) m; /* and, line 224 */ { int m = z->l - z->c; (void) m; /* or, line 220 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab6; /* call standard_suffix, line 220 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_i_verb_suffix(z); if (ret == 0) goto lab7; /* call i_verb_suffix, line 221 */ if (ret < 0) return ret; } goto lab5; lab7: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab4; /* call verb_suffix, line 222 */ if (ret < 0) return ret; } } lab5: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* try, line 225 */ z->ket = z->c; /* [, line 225 */ { int m = z->l - z->c; (void) m; /* or, line 225 */ if (!(eq_s_b(z, 1, s_41))) goto lab10; z->bra = z->c; /* ], line 225 */ { int ret; ret = slice_from_s(z, 1, s_42); /* <-, line 225 */ if (ret < 0) return ret; } goto lab9; lab10: z->c = z->l - m; if (!(eq_s_b(z, 1, s_43))) { z->c = z->l - m; goto lab8; } z->bra = z->c; /* ], line 226 */ { int ret; ret = slice_from_s(z, 1, s_44); /* <-, line 226 */ if (ret < 0) return ret; } } lab9: lab8: ; } } goto lab3; lab4: z->c = z->l - m; { int ret = r_residual_suffix(z); if (ret == 0) goto lab2; /* call residual_suffix, line 229 */ if (ret < 0) return ret; } } lab3: lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 234 */ { int ret = r_un_double(z); if (ret == 0) goto lab11; /* call un_double, line 234 */ if (ret < 0) return ret; } lab11: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 235 */ { int ret = r_un_accent(z); if (ret == 0) goto lab12; /* call un_accent, line 235 */ if (ret < 0) return ret; } lab12: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 237 */ { int ret = r_postlude(z); if (ret == 0) goto lab13; /* call postlude, line 237 */ if (ret < 0) return ret; } lab13: z->c = c; } return 1; } extern struct SN_env * french_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); } extern void french_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_french.h000066400000000000000000000005051154025176300277340ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * french_ISO_8859_1_create_env(void); extern void french_ISO_8859_1_close_env(struct SN_env * z); extern int french_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_german.c000066400000000000000000000401401154025176300277320ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int german_ISO_8859_1_stem(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * german_ISO_8859_1_create_env(void); extern void german_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_1[1] = { 'U' }; static symbol s_0_2[1] = { 'Y' }; static symbol s_0_3[1] = { 0xE4 }; static symbol s_0_4[1] = { 0xF6 }; static symbol s_0_5[1] = { 0xFC }; static struct among a_0[6] = { /* 0 */ { 0, 0, -1, 6, 0}, /* 1 */ { 1, s_0_1, 0, 2, 0}, /* 2 */ { 1, s_0_2, 0, 1, 0}, /* 3 */ { 1, s_0_3, 0, 3, 0}, /* 4 */ { 1, s_0_4, 0, 4, 0}, /* 5 */ { 1, s_0_5, 0, 5, 0} }; static symbol s_1_0[1] = { 'e' }; static symbol s_1_1[2] = { 'e', 'm' }; static symbol s_1_2[2] = { 'e', 'n' }; static symbol s_1_3[3] = { 'e', 'r', 'n' }; static symbol s_1_4[2] = { 'e', 'r' }; static symbol s_1_5[1] = { 's' }; static symbol s_1_6[2] = { 'e', 's' }; static struct among a_1[7] = { /* 0 */ { 1, s_1_0, -1, 1, 0}, /* 1 */ { 2, s_1_1, -1, 1, 0}, /* 2 */ { 2, s_1_2, -1, 1, 0}, /* 3 */ { 3, s_1_3, -1, 1, 0}, /* 4 */ { 2, s_1_4, -1, 1, 0}, /* 5 */ { 1, s_1_5, -1, 2, 0}, /* 6 */ { 2, s_1_6, 5, 1, 0} }; static symbol s_2_0[2] = { 'e', 'n' }; static symbol s_2_1[2] = { 'e', 'r' }; static symbol s_2_2[2] = { 's', 't' }; static symbol s_2_3[3] = { 'e', 's', 't' }; static struct among a_2[4] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 2, s_2_1, -1, 1, 0}, /* 2 */ { 2, s_2_2, -1, 2, 0}, /* 3 */ { 3, s_2_3, 2, 1, 0} }; static symbol s_3_0[2] = { 'i', 'g' }; static symbol s_3_1[4] = { 'l', 'i', 'c', 'h' }; static struct among a_3[2] = { /* 0 */ { 2, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0} }; static symbol s_4_0[3] = { 'e', 'n', 'd' }; static symbol s_4_1[2] = { 'i', 'g' }; static symbol s_4_2[3] = { 'u', 'n', 'g' }; static symbol s_4_3[4] = { 'l', 'i', 'c', 'h' }; static symbol s_4_4[4] = { 'i', 's', 'c', 'h' }; static symbol s_4_5[2] = { 'i', 'k' }; static symbol s_4_6[4] = { 'h', 'e', 'i', 't' }; static symbol s_4_7[4] = { 'k', 'e', 'i', 't' }; static struct among a_4[8] = { /* 0 */ { 3, s_4_0, -1, 1, 0}, /* 1 */ { 2, s_4_1, -1, 2, 0}, /* 2 */ { 3, s_4_2, -1, 1, 0}, /* 3 */ { 4, s_4_3, -1, 3, 0}, /* 4 */ { 4, s_4_4, -1, 2, 0}, /* 5 */ { 2, s_4_5, -1, 2, 0}, /* 6 */ { 4, s_4_6, -1, 3, 0}, /* 7 */ { 4, s_4_7, -1, 4, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 }; static unsigned char g_s_ending[] = { 117, 30, 5 }; static unsigned char g_st_ending[] = { 117, 30, 4 }; static symbol s_0[] = { 0xDF }; static symbol s_1[] = { 's', 's' }; static symbol s_2[] = { 'u' }; static symbol s_3[] = { 'U' }; static symbol s_4[] = { 'y' }; static symbol s_5[] = { 'Y' }; static symbol s_6[] = { 'y' }; static symbol s_7[] = { 'u' }; static symbol s_8[] = { 'a' }; static symbol s_9[] = { 'o' }; static symbol s_10[] = { 'u' }; static symbol s_11[] = { 'i', 'g' }; static symbol s_12[] = { 'e' }; static symbol s_13[] = { 'e' }; static symbol s_14[] = { 'e', 'r' }; static symbol s_15[] = { 'e', 'n' }; static int r_prelude(struct SN_env * z) { { int c_test = z->c; /* test, line 30 */ while(1) { /* repeat, line 30 */ int c = z->c; { int c = z->c; /* or, line 33 */ z->bra = z->c; /* [, line 32 */ if (!(eq_s(z, 1, s_0))) goto lab2; z->ket = z->c; /* ], line 32 */ { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 32 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = c; if (z->c >= z->l) goto lab0; z->c++; /* next, line 33 */ } lab1: continue; lab0: z->c = c; break; } z->c = c_test; } while(1) { /* repeat, line 36 */ int c = z->c; while(1) { /* goto, line 36 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 252))) goto lab4; z->bra = z->c; /* [, line 37 */ { int c = z->c; /* or, line 37 */ if (!(eq_s(z, 1, s_2))) goto lab6; z->ket = z->c; /* ], line 37 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab6; { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 37 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = c; if (!(eq_s(z, 1, s_4))) goto lab4; z->ket = z->c; /* ], line 38 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab4; { int ret; ret = slice_from_s(z, 1, s_5); /* <-, line 38 */ if (ret < 0) return ret; } } lab5: z->c = c; break; lab4: z->c = c; if (z->c >= z->l) goto lab3; z->c++; /* goto, line 36 */ } continue; lab3: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; { int c_test = z->c; /* test, line 47 */ { int c = z->c + 3; if (0 > c || c > z->l) return 0; z->c = c; /* hop, line 47 */ } z->I[2] = z->c; /* setmark x, line 47 */ z->c = c_test; } while(1) { /* gopast, line 49 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab0; break; lab0: if (z->c >= z->l) return 0; z->c++; /* gopast, line 49 */ } while(1) { /* gopast, line 49 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab1; break; lab1: if (z->c >= z->l) return 0; z->c++; /* gopast, line 49 */ } z->I[0] = z->c; /* setmark p1, line 49 */ /* try, line 50 */ if (!(z->I[0] < z->I[2])) goto lab2; z->I[0] = z->I[2]; lab2: while(1) { /* gopast, line 51 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab3; break; lab3: if (z->c >= z->l) return 0; z->c++; /* gopast, line 51 */ } while(1) { /* gopast, line 51 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab4; break; lab4: if (z->c >= z->l) return 0; z->c++; /* gopast, line 51 */ } z->I[1] = z->c; /* setmark p2, line 51 */ return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 55 */ int c = z->c; z->bra = z->c; /* [, line 57 */ among_var = find_among(z, a_0, 6); /* substring, line 57 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 57 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_6); /* <-, line 58 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 59 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_8); /* <-, line 60 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_9); /* <-, line 61 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 62 */ if (ret < 0) return ret; } break; case 6: if (z->c >= z->l) goto lab0; z->c++; /* next, line 63 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* do, line 74 */ z->ket = z->c; /* [, line 75 */ among_var = find_among_b(z, a_1, 7); /* substring, line 75 */ if (!(among_var)) goto lab0; z->bra = z->c; /* ], line 75 */ { int ret = r_R1(z); if (ret == 0) goto lab0; /* call R1, line 75 */ if (ret < 0) return ret; } switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_del(z); /* delete, line 77 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b(z, g_s_ending, 98, 116))) goto lab0; { int ret; ret = slice_del(z); /* delete, line 80 */ if (ret < 0) return ret; } break; } lab0: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 84 */ z->ket = z->c; /* [, line 85 */ among_var = find_among_b(z, a_2, 4); /* substring, line 85 */ if (!(among_var)) goto lab1; z->bra = z->c; /* ], line 85 */ { int ret = r_R1(z); if (ret == 0) goto lab1; /* call R1, line 85 */ if (ret < 0) return ret; } switch(among_var) { case 0: goto lab1; case 1: { int ret; ret = slice_del(z); /* delete, line 87 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b(z, g_st_ending, 98, 116))) goto lab1; { int c = z->c - 3; if (z->lb > c || c > z->l) goto lab1; z->c = c; /* hop, line 90 */ } { int ret; ret = slice_del(z); /* delete, line 90 */ if (ret < 0) return ret; } break; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 94 */ z->ket = z->c; /* [, line 95 */ among_var = find_among_b(z, a_4, 8); /* substring, line 95 */ if (!(among_var)) goto lab2; z->bra = z->c; /* ], line 95 */ { int ret = r_R2(z); if (ret == 0) goto lab2; /* call R2, line 95 */ if (ret < 0) return ret; } switch(among_var) { case 0: goto lab2; case 1: { int ret; ret = slice_del(z); /* delete, line 97 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 98 */ z->ket = z->c; /* [, line 98 */ if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 98 */ { int m = z->l - z->c; (void) m; /* not, line 98 */ if (!(eq_s_b(z, 1, s_12))) goto lab4; { z->c = z->l - m; goto lab3; } lab4: z->c = z->l - m; } { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 98 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 98 */ if (ret < 0) return ret; } lab3: ; } break; case 2: { int m = z->l - z->c; (void) m; /* not, line 101 */ if (!(eq_s_b(z, 1, s_13))) goto lab5; goto lab2; lab5: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 101 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 104 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 105 */ z->ket = z->c; /* [, line 106 */ { int m = z->l - z->c; (void) m; /* or, line 106 */ if (!(eq_s_b(z, 2, s_14))) goto lab8; goto lab7; lab8: z->c = z->l - m; if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab6; } } lab7: z->bra = z->c; /* ], line 106 */ { int ret = r_R1(z); if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R1, line 106 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 106 */ if (ret < 0) return ret; } lab6: ; } break; case 4: { int ret; ret = slice_del(z); /* delete, line 110 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 111 */ z->ket = z->c; /* [, line 112 */ among_var = find_among_b(z, a_3, 2); /* substring, line 112 */ if (!(among_var)) { z->c = z->l - m; goto lab9; } z->bra = z->c; /* ], line 112 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab9; } /* call R2, line 112 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab9; } case 1: { int ret; ret = slice_del(z); /* delete, line 114 */ if (ret < 0) return ret; } break; } lab9: ; } break; } lab2: z->c = z->l - m; } return 1; } extern int german_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 125 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 125 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 126 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 126 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 127 */ { int m = z->l - z->c; (void) m; /* do, line 128 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab2; /* call standard_suffix, line 128 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 129 */ { int ret = r_postlude(z); if (ret == 0) goto lab3; /* call postlude, line 129 */ if (ret < 0) return ret; } lab3: z->c = c; } return 1; } extern struct SN_env * german_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); } extern void german_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_german.h000066400000000000000000000005051154025176300277400ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * german_ISO_8859_1_create_env(void); extern void german_ISO_8859_1_close_env(struct SN_env * z); extern int german_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_italian.c000066400000000000000000001136441154025176300301140ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int italian_ISO_8859_1_stem(struct SN_env * z); static int r_vowel_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_attached_pronoun(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * italian_ISO_8859_1_create_env(void); extern void italian_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_1[2] = { 'q', 'u' }; static symbol s_0_2[1] = { 0xE1 }; static symbol s_0_3[1] = { 0xE9 }; static symbol s_0_4[1] = { 0xED }; static symbol s_0_5[1] = { 0xF3 }; static symbol s_0_6[1] = { 0xFA }; static struct among a_0[7] = { /* 0 */ { 0, 0, -1, 7, 0}, /* 1 */ { 2, s_0_1, 0, 6, 0}, /* 2 */ { 1, s_0_2, 0, 1, 0}, /* 3 */ { 1, s_0_3, 0, 2, 0}, /* 4 */ { 1, s_0_4, 0, 3, 0}, /* 5 */ { 1, s_0_5, 0, 4, 0}, /* 6 */ { 1, s_0_6, 0, 5, 0} }; static symbol s_1_1[1] = { 'I' }; static symbol s_1_2[1] = { 'U' }; static struct among a_1[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 1, s_1_1, 0, 1, 0}, /* 2 */ { 1, s_1_2, 0, 2, 0} }; static symbol s_2_0[2] = { 'l', 'a' }; static symbol s_2_1[4] = { 'c', 'e', 'l', 'a' }; static symbol s_2_2[6] = { 'g', 'l', 'i', 'e', 'l', 'a' }; static symbol s_2_3[4] = { 'm', 'e', 'l', 'a' }; static symbol s_2_4[4] = { 't', 'e', 'l', 'a' }; static symbol s_2_5[4] = { 'v', 'e', 'l', 'a' }; static symbol s_2_6[2] = { 'l', 'e' }; static symbol s_2_7[4] = { 'c', 'e', 'l', 'e' }; static symbol s_2_8[6] = { 'g', 'l', 'i', 'e', 'l', 'e' }; static symbol s_2_9[4] = { 'm', 'e', 'l', 'e' }; static symbol s_2_10[4] = { 't', 'e', 'l', 'e' }; static symbol s_2_11[4] = { 'v', 'e', 'l', 'e' }; static symbol s_2_12[2] = { 'n', 'e' }; static symbol s_2_13[4] = { 'c', 'e', 'n', 'e' }; static symbol s_2_14[6] = { 'g', 'l', 'i', 'e', 'n', 'e' }; static symbol s_2_15[4] = { 'm', 'e', 'n', 'e' }; static symbol s_2_16[4] = { 's', 'e', 'n', 'e' }; static symbol s_2_17[4] = { 't', 'e', 'n', 'e' }; static symbol s_2_18[4] = { 'v', 'e', 'n', 'e' }; static symbol s_2_19[2] = { 'c', 'i' }; static symbol s_2_20[2] = { 'l', 'i' }; static symbol s_2_21[4] = { 'c', 'e', 'l', 'i' }; static symbol s_2_22[6] = { 'g', 'l', 'i', 'e', 'l', 'i' }; static symbol s_2_23[4] = { 'm', 'e', 'l', 'i' }; static symbol s_2_24[4] = { 't', 'e', 'l', 'i' }; static symbol s_2_25[4] = { 'v', 'e', 'l', 'i' }; static symbol s_2_26[3] = { 'g', 'l', 'i' }; static symbol s_2_27[2] = { 'm', 'i' }; static symbol s_2_28[2] = { 's', 'i' }; static symbol s_2_29[2] = { 't', 'i' }; static symbol s_2_30[2] = { 'v', 'i' }; static symbol s_2_31[2] = { 'l', 'o' }; static symbol s_2_32[4] = { 'c', 'e', 'l', 'o' }; static symbol s_2_33[6] = { 'g', 'l', 'i', 'e', 'l', 'o' }; static symbol s_2_34[4] = { 'm', 'e', 'l', 'o' }; static symbol s_2_35[4] = { 't', 'e', 'l', 'o' }; static symbol s_2_36[4] = { 'v', 'e', 'l', 'o' }; static struct among a_2[37] = { /* 0 */ { 2, s_2_0, -1, -1, 0}, /* 1 */ { 4, s_2_1, 0, -1, 0}, /* 2 */ { 6, s_2_2, 0, -1, 0}, /* 3 */ { 4, s_2_3, 0, -1, 0}, /* 4 */ { 4, s_2_4, 0, -1, 0}, /* 5 */ { 4, s_2_5, 0, -1, 0}, /* 6 */ { 2, s_2_6, -1, -1, 0}, /* 7 */ { 4, s_2_7, 6, -1, 0}, /* 8 */ { 6, s_2_8, 6, -1, 0}, /* 9 */ { 4, s_2_9, 6, -1, 0}, /* 10 */ { 4, s_2_10, 6, -1, 0}, /* 11 */ { 4, s_2_11, 6, -1, 0}, /* 12 */ { 2, s_2_12, -1, -1, 0}, /* 13 */ { 4, s_2_13, 12, -1, 0}, /* 14 */ { 6, s_2_14, 12, -1, 0}, /* 15 */ { 4, s_2_15, 12, -1, 0}, /* 16 */ { 4, s_2_16, 12, -1, 0}, /* 17 */ { 4, s_2_17, 12, -1, 0}, /* 18 */ { 4, s_2_18, 12, -1, 0}, /* 19 */ { 2, s_2_19, -1, -1, 0}, /* 20 */ { 2, s_2_20, -1, -1, 0}, /* 21 */ { 4, s_2_21, 20, -1, 0}, /* 22 */ { 6, s_2_22, 20, -1, 0}, /* 23 */ { 4, s_2_23, 20, -1, 0}, /* 24 */ { 4, s_2_24, 20, -1, 0}, /* 25 */ { 4, s_2_25, 20, -1, 0}, /* 26 */ { 3, s_2_26, 20, -1, 0}, /* 27 */ { 2, s_2_27, -1, -1, 0}, /* 28 */ { 2, s_2_28, -1, -1, 0}, /* 29 */ { 2, s_2_29, -1, -1, 0}, /* 30 */ { 2, s_2_30, -1, -1, 0}, /* 31 */ { 2, s_2_31, -1, -1, 0}, /* 32 */ { 4, s_2_32, 31, -1, 0}, /* 33 */ { 6, s_2_33, 31, -1, 0}, /* 34 */ { 4, s_2_34, 31, -1, 0}, /* 35 */ { 4, s_2_35, 31, -1, 0}, /* 36 */ { 4, s_2_36, 31, -1, 0} }; static symbol s_3_0[4] = { 'a', 'n', 'd', 'o' }; static symbol s_3_1[4] = { 'e', 'n', 'd', 'o' }; static symbol s_3_2[2] = { 'a', 'r' }; static symbol s_3_3[2] = { 'e', 'r' }; static symbol s_3_4[2] = { 'i', 'r' }; static struct among a_3[5] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0}, /* 2 */ { 2, s_3_2, -1, 2, 0}, /* 3 */ { 2, s_3_3, -1, 2, 0}, /* 4 */ { 2, s_3_4, -1, 2, 0} }; static symbol s_4_0[2] = { 'i', 'c' }; static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_4_2[2] = { 'o', 's' }; static symbol s_4_3[2] = { 'i', 'v' }; static struct among a_4[4] = { /* 0 */ { 2, s_4_0, -1, -1, 0}, /* 1 */ { 4, s_4_1, -1, -1, 0}, /* 2 */ { 2, s_4_2, -1, -1, 0}, /* 3 */ { 2, s_4_3, -1, 1, 0} }; static symbol s_5_0[2] = { 'i', 'c' }; static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_5_2[2] = { 'i', 'v' }; static struct among a_5[3] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 2, s_5_2, -1, 1, 0} }; static symbol s_6_0[3] = { 'i', 'c', 'a' }; static symbol s_6_1[5] = { 'l', 'o', 'g', 'i', 'a' }; static symbol s_6_2[3] = { 'o', 's', 'a' }; static symbol s_6_3[4] = { 'i', 's', 't', 'a' }; static symbol s_6_4[3] = { 'i', 'v', 'a' }; static symbol s_6_5[4] = { 'a', 'n', 'z', 'a' }; static symbol s_6_6[4] = { 'e', 'n', 'z', 'a' }; static symbol s_6_7[3] = { 'i', 'c', 'e' }; static symbol s_6_8[6] = { 'a', 't', 'r', 'i', 'c', 'e' }; static symbol s_6_9[4] = { 'i', 'c', 'h', 'e' }; static symbol s_6_10[5] = { 'l', 'o', 'g', 'i', 'e' }; static symbol s_6_11[5] = { 'a', 'b', 'i', 'l', 'e' }; static symbol s_6_12[5] = { 'i', 'b', 'i', 'l', 'e' }; static symbol s_6_13[6] = { 'u', 's', 'i', 'o', 'n', 'e' }; static symbol s_6_14[6] = { 'a', 'z', 'i', 'o', 'n', 'e' }; static symbol s_6_15[6] = { 'u', 'z', 'i', 'o', 'n', 'e' }; static symbol s_6_16[5] = { 'a', 't', 'o', 'r', 'e' }; static symbol s_6_17[3] = { 'o', 's', 'e' }; static symbol s_6_18[4] = { 'a', 'n', 't', 'e' }; static symbol s_6_19[5] = { 'm', 'e', 'n', 't', 'e' }; static symbol s_6_20[6] = { 'a', 'm', 'e', 'n', 't', 'e' }; static symbol s_6_21[4] = { 'i', 's', 't', 'e' }; static symbol s_6_22[3] = { 'i', 'v', 'e' }; static symbol s_6_23[4] = { 'a', 'n', 'z', 'e' }; static symbol s_6_24[4] = { 'e', 'n', 'z', 'e' }; static symbol s_6_25[3] = { 'i', 'c', 'i' }; static symbol s_6_26[6] = { 'a', 't', 'r', 'i', 'c', 'i' }; static symbol s_6_27[4] = { 'i', 'c', 'h', 'i' }; static symbol s_6_28[5] = { 'a', 'b', 'i', 'l', 'i' }; static symbol s_6_29[5] = { 'i', 'b', 'i', 'l', 'i' }; static symbol s_6_30[4] = { 'i', 's', 'm', 'i' }; static symbol s_6_31[6] = { 'u', 's', 'i', 'o', 'n', 'i' }; static symbol s_6_32[6] = { 'a', 'z', 'i', 'o', 'n', 'i' }; static symbol s_6_33[6] = { 'u', 'z', 'i', 'o', 'n', 'i' }; static symbol s_6_34[5] = { 'a', 't', 'o', 'r', 'i' }; static symbol s_6_35[3] = { 'o', 's', 'i' }; static symbol s_6_36[4] = { 'a', 'n', 't', 'i' }; static symbol s_6_37[6] = { 'a', 'm', 'e', 'n', 't', 'i' }; static symbol s_6_38[6] = { 'i', 'm', 'e', 'n', 't', 'i' }; static symbol s_6_39[4] = { 'i', 's', 't', 'i' }; static symbol s_6_40[3] = { 'i', 'v', 'i' }; static symbol s_6_41[3] = { 'i', 'c', 'o' }; static symbol s_6_42[4] = { 'i', 's', 'm', 'o' }; static symbol s_6_43[3] = { 'o', 's', 'o' }; static symbol s_6_44[6] = { 'a', 'm', 'e', 'n', 't', 'o' }; static symbol s_6_45[6] = { 'i', 'm', 'e', 'n', 't', 'o' }; static symbol s_6_46[3] = { 'i', 'v', 'o' }; static symbol s_6_47[3] = { 'i', 't', 0xE0 }; static symbol s_6_48[4] = { 'i', 's', 't', 0xE0 }; static symbol s_6_49[4] = { 'i', 's', 't', 0xE8 }; static symbol s_6_50[4] = { 'i', 's', 't', 0xEC }; static struct among a_6[51] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 5, s_6_1, -1, 3, 0}, /* 2 */ { 3, s_6_2, -1, 1, 0}, /* 3 */ { 4, s_6_3, -1, 1, 0}, /* 4 */ { 3, s_6_4, -1, 9, 0}, /* 5 */ { 4, s_6_5, -1, 1, 0}, /* 6 */ { 4, s_6_6, -1, 5, 0}, /* 7 */ { 3, s_6_7, -1, 1, 0}, /* 8 */ { 6, s_6_8, 7, 1, 0}, /* 9 */ { 4, s_6_9, -1, 1, 0}, /* 10 */ { 5, s_6_10, -1, 3, 0}, /* 11 */ { 5, s_6_11, -1, 1, 0}, /* 12 */ { 5, s_6_12, -1, 1, 0}, /* 13 */ { 6, s_6_13, -1, 4, 0}, /* 14 */ { 6, s_6_14, -1, 2, 0}, /* 15 */ { 6, s_6_15, -1, 4, 0}, /* 16 */ { 5, s_6_16, -1, 2, 0}, /* 17 */ { 3, s_6_17, -1, 1, 0}, /* 18 */ { 4, s_6_18, -1, 1, 0}, /* 19 */ { 5, s_6_19, -1, 1, 0}, /* 20 */ { 6, s_6_20, 19, 7, 0}, /* 21 */ { 4, s_6_21, -1, 1, 0}, /* 22 */ { 3, s_6_22, -1, 9, 0}, /* 23 */ { 4, s_6_23, -1, 1, 0}, /* 24 */ { 4, s_6_24, -1, 5, 0}, /* 25 */ { 3, s_6_25, -1, 1, 0}, /* 26 */ { 6, s_6_26, 25, 1, 0}, /* 27 */ { 4, s_6_27, -1, 1, 0}, /* 28 */ { 5, s_6_28, -1, 1, 0}, /* 29 */ { 5, s_6_29, -1, 1, 0}, /* 30 */ { 4, s_6_30, -1, 1, 0}, /* 31 */ { 6, s_6_31, -1, 4, 0}, /* 32 */ { 6, s_6_32, -1, 2, 0}, /* 33 */ { 6, s_6_33, -1, 4, 0}, /* 34 */ { 5, s_6_34, -1, 2, 0}, /* 35 */ { 3, s_6_35, -1, 1, 0}, /* 36 */ { 4, s_6_36, -1, 1, 0}, /* 37 */ { 6, s_6_37, -1, 6, 0}, /* 38 */ { 6, s_6_38, -1, 6, 0}, /* 39 */ { 4, s_6_39, -1, 1, 0}, /* 40 */ { 3, s_6_40, -1, 9, 0}, /* 41 */ { 3, s_6_41, -1, 1, 0}, /* 42 */ { 4, s_6_42, -1, 1, 0}, /* 43 */ { 3, s_6_43, -1, 1, 0}, /* 44 */ { 6, s_6_44, -1, 6, 0}, /* 45 */ { 6, s_6_45, -1, 6, 0}, /* 46 */ { 3, s_6_46, -1, 9, 0}, /* 47 */ { 3, s_6_47, -1, 8, 0}, /* 48 */ { 4, s_6_48, -1, 1, 0}, /* 49 */ { 4, s_6_49, -1, 1, 0}, /* 50 */ { 4, s_6_50, -1, 1, 0} }; static symbol s_7_0[4] = { 'i', 's', 'c', 'a' }; static symbol s_7_1[4] = { 'e', 'n', 'd', 'a' }; static symbol s_7_2[3] = { 'a', 't', 'a' }; static symbol s_7_3[3] = { 'i', 't', 'a' }; static symbol s_7_4[3] = { 'u', 't', 'a' }; static symbol s_7_5[3] = { 'a', 'v', 'a' }; static symbol s_7_6[3] = { 'e', 'v', 'a' }; static symbol s_7_7[3] = { 'i', 'v', 'a' }; static symbol s_7_8[6] = { 'e', 'r', 'e', 'b', 'b', 'e' }; static symbol s_7_9[6] = { 'i', 'r', 'e', 'b', 'b', 'e' }; static symbol s_7_10[4] = { 'i', 's', 'c', 'e' }; static symbol s_7_11[4] = { 'e', 'n', 'd', 'e' }; static symbol s_7_12[3] = { 'a', 'r', 'e' }; static symbol s_7_13[3] = { 'e', 'r', 'e' }; static symbol s_7_14[3] = { 'i', 'r', 'e' }; static symbol s_7_15[4] = { 'a', 's', 's', 'e' }; static symbol s_7_16[3] = { 'a', 't', 'e' }; static symbol s_7_17[5] = { 'a', 'v', 'a', 't', 'e' }; static symbol s_7_18[5] = { 'e', 'v', 'a', 't', 'e' }; static symbol s_7_19[5] = { 'i', 'v', 'a', 't', 'e' }; static symbol s_7_20[3] = { 'e', 't', 'e' }; static symbol s_7_21[5] = { 'e', 'r', 'e', 't', 'e' }; static symbol s_7_22[5] = { 'i', 'r', 'e', 't', 'e' }; static symbol s_7_23[3] = { 'i', 't', 'e' }; static symbol s_7_24[6] = { 'e', 'r', 'e', 's', 't', 'e' }; static symbol s_7_25[6] = { 'i', 'r', 'e', 's', 't', 'e' }; static symbol s_7_26[3] = { 'u', 't', 'e' }; static symbol s_7_27[4] = { 'e', 'r', 'a', 'i' }; static symbol s_7_28[4] = { 'i', 'r', 'a', 'i' }; static symbol s_7_29[4] = { 'i', 's', 'c', 'i' }; static symbol s_7_30[4] = { 'e', 'n', 'd', 'i' }; static symbol s_7_31[4] = { 'e', 'r', 'e', 'i' }; static symbol s_7_32[4] = { 'i', 'r', 'e', 'i' }; static symbol s_7_33[4] = { 'a', 's', 's', 'i' }; static symbol s_7_34[3] = { 'a', 't', 'i' }; static symbol s_7_35[3] = { 'i', 't', 'i' }; static symbol s_7_36[6] = { 'e', 'r', 'e', 's', 't', 'i' }; static symbol s_7_37[6] = { 'i', 'r', 'e', 's', 't', 'i' }; static symbol s_7_38[3] = { 'u', 't', 'i' }; static symbol s_7_39[3] = { 'a', 'v', 'i' }; static symbol s_7_40[3] = { 'e', 'v', 'i' }; static symbol s_7_41[3] = { 'i', 'v', 'i' }; static symbol s_7_42[4] = { 'i', 's', 'c', 'o' }; static symbol s_7_43[4] = { 'a', 'n', 'd', 'o' }; static symbol s_7_44[4] = { 'e', 'n', 'd', 'o' }; static symbol s_7_45[4] = { 'Y', 'a', 'm', 'o' }; static symbol s_7_46[4] = { 'i', 'a', 'm', 'o' }; static symbol s_7_47[5] = { 'a', 'v', 'a', 'm', 'o' }; static symbol s_7_48[5] = { 'e', 'v', 'a', 'm', 'o' }; static symbol s_7_49[5] = { 'i', 'v', 'a', 'm', 'o' }; static symbol s_7_50[5] = { 'e', 'r', 'e', 'm', 'o' }; static symbol s_7_51[5] = { 'i', 'r', 'e', 'm', 'o' }; static symbol s_7_52[6] = { 'a', 's', 's', 'i', 'm', 'o' }; static symbol s_7_53[4] = { 'a', 'm', 'm', 'o' }; static symbol s_7_54[4] = { 'e', 'm', 'm', 'o' }; static symbol s_7_55[6] = { 'e', 'r', 'e', 'm', 'm', 'o' }; static symbol s_7_56[6] = { 'i', 'r', 'e', 'm', 'm', 'o' }; static symbol s_7_57[4] = { 'i', 'm', 'm', 'o' }; static symbol s_7_58[3] = { 'a', 'n', 'o' }; static symbol s_7_59[6] = { 'i', 's', 'c', 'a', 'n', 'o' }; static symbol s_7_60[5] = { 'a', 'v', 'a', 'n', 'o' }; static symbol s_7_61[5] = { 'e', 'v', 'a', 'n', 'o' }; static symbol s_7_62[5] = { 'i', 'v', 'a', 'n', 'o' }; static symbol s_7_63[6] = { 'e', 'r', 'a', 'n', 'n', 'o' }; static symbol s_7_64[6] = { 'i', 'r', 'a', 'n', 'n', 'o' }; static symbol s_7_65[3] = { 'o', 'n', 'o' }; static symbol s_7_66[6] = { 'i', 's', 'c', 'o', 'n', 'o' }; static symbol s_7_67[5] = { 'a', 'r', 'o', 'n', 'o' }; static symbol s_7_68[5] = { 'e', 'r', 'o', 'n', 'o' }; static symbol s_7_69[5] = { 'i', 'r', 'o', 'n', 'o' }; static symbol s_7_70[8] = { 'e', 'r', 'e', 'b', 'b', 'e', 'r', 'o' }; static symbol s_7_71[8] = { 'i', 'r', 'e', 'b', 'b', 'e', 'r', 'o' }; static symbol s_7_72[6] = { 'a', 's', 's', 'e', 'r', 'o' }; static symbol s_7_73[6] = { 'e', 's', 's', 'e', 'r', 'o' }; static symbol s_7_74[6] = { 'i', 's', 's', 'e', 'r', 'o' }; static symbol s_7_75[3] = { 'a', 't', 'o' }; static symbol s_7_76[3] = { 'i', 't', 'o' }; static symbol s_7_77[3] = { 'u', 't', 'o' }; static symbol s_7_78[3] = { 'a', 'v', 'o' }; static symbol s_7_79[3] = { 'e', 'v', 'o' }; static symbol s_7_80[3] = { 'i', 'v', 'o' }; static symbol s_7_81[2] = { 'a', 'r' }; static symbol s_7_82[2] = { 'i', 'r' }; static symbol s_7_83[3] = { 'e', 'r', 0xE0 }; static symbol s_7_84[3] = { 'i', 'r', 0xE0 }; static symbol s_7_85[3] = { 'e', 'r', 0xF2 }; static symbol s_7_86[3] = { 'i', 'r', 0xF2 }; static struct among a_7[87] = { /* 0 */ { 4, s_7_0, -1, 1, 0}, /* 1 */ { 4, s_7_1, -1, 1, 0}, /* 2 */ { 3, s_7_2, -1, 1, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0}, /* 4 */ { 3, s_7_4, -1, 1, 0}, /* 5 */ { 3, s_7_5, -1, 1, 0}, /* 6 */ { 3, s_7_6, -1, 1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 6, s_7_8, -1, 1, 0}, /* 9 */ { 6, s_7_9, -1, 1, 0}, /* 10 */ { 4, s_7_10, -1, 1, 0}, /* 11 */ { 4, s_7_11, -1, 1, 0}, /* 12 */ { 3, s_7_12, -1, 1, 0}, /* 13 */ { 3, s_7_13, -1, 1, 0}, /* 14 */ { 3, s_7_14, -1, 1, 0}, /* 15 */ { 4, s_7_15, -1, 1, 0}, /* 16 */ { 3, s_7_16, -1, 1, 0}, /* 17 */ { 5, s_7_17, 16, 1, 0}, /* 18 */ { 5, s_7_18, 16, 1, 0}, /* 19 */ { 5, s_7_19, 16, 1, 0}, /* 20 */ { 3, s_7_20, -1, 1, 0}, /* 21 */ { 5, s_7_21, 20, 1, 0}, /* 22 */ { 5, s_7_22, 20, 1, 0}, /* 23 */ { 3, s_7_23, -1, 1, 0}, /* 24 */ { 6, s_7_24, -1, 1, 0}, /* 25 */ { 6, s_7_25, -1, 1, 0}, /* 26 */ { 3, s_7_26, -1, 1, 0}, /* 27 */ { 4, s_7_27, -1, 1, 0}, /* 28 */ { 4, s_7_28, -1, 1, 0}, /* 29 */ { 4, s_7_29, -1, 1, 0}, /* 30 */ { 4, s_7_30, -1, 1, 0}, /* 31 */ { 4, s_7_31, -1, 1, 0}, /* 32 */ { 4, s_7_32, -1, 1, 0}, /* 33 */ { 4, s_7_33, -1, 1, 0}, /* 34 */ { 3, s_7_34, -1, 1, 0}, /* 35 */ { 3, s_7_35, -1, 1, 0}, /* 36 */ { 6, s_7_36, -1, 1, 0}, /* 37 */ { 6, s_7_37, -1, 1, 0}, /* 38 */ { 3, s_7_38, -1, 1, 0}, /* 39 */ { 3, s_7_39, -1, 1, 0}, /* 40 */ { 3, s_7_40, -1, 1, 0}, /* 41 */ { 3, s_7_41, -1, 1, 0}, /* 42 */ { 4, s_7_42, -1, 1, 0}, /* 43 */ { 4, s_7_43, -1, 1, 0}, /* 44 */ { 4, s_7_44, -1, 1, 0}, /* 45 */ { 4, s_7_45, -1, 1, 0}, /* 46 */ { 4, s_7_46, -1, 1, 0}, /* 47 */ { 5, s_7_47, -1, 1, 0}, /* 48 */ { 5, s_7_48, -1, 1, 0}, /* 49 */ { 5, s_7_49, -1, 1, 0}, /* 50 */ { 5, s_7_50, -1, 1, 0}, /* 51 */ { 5, s_7_51, -1, 1, 0}, /* 52 */ { 6, s_7_52, -1, 1, 0}, /* 53 */ { 4, s_7_53, -1, 1, 0}, /* 54 */ { 4, s_7_54, -1, 1, 0}, /* 55 */ { 6, s_7_55, 54, 1, 0}, /* 56 */ { 6, s_7_56, 54, 1, 0}, /* 57 */ { 4, s_7_57, -1, 1, 0}, /* 58 */ { 3, s_7_58, -1, 1, 0}, /* 59 */ { 6, s_7_59, 58, 1, 0}, /* 60 */ { 5, s_7_60, 58, 1, 0}, /* 61 */ { 5, s_7_61, 58, 1, 0}, /* 62 */ { 5, s_7_62, 58, 1, 0}, /* 63 */ { 6, s_7_63, -1, 1, 0}, /* 64 */ { 6, s_7_64, -1, 1, 0}, /* 65 */ { 3, s_7_65, -1, 1, 0}, /* 66 */ { 6, s_7_66, 65, 1, 0}, /* 67 */ { 5, s_7_67, 65, 1, 0}, /* 68 */ { 5, s_7_68, 65, 1, 0}, /* 69 */ { 5, s_7_69, 65, 1, 0}, /* 70 */ { 8, s_7_70, -1, 1, 0}, /* 71 */ { 8, s_7_71, -1, 1, 0}, /* 72 */ { 6, s_7_72, -1, 1, 0}, /* 73 */ { 6, s_7_73, -1, 1, 0}, /* 74 */ { 6, s_7_74, -1, 1, 0}, /* 75 */ { 3, s_7_75, -1, 1, 0}, /* 76 */ { 3, s_7_76, -1, 1, 0}, /* 77 */ { 3, s_7_77, -1, 1, 0}, /* 78 */ { 3, s_7_78, -1, 1, 0}, /* 79 */ { 3, s_7_79, -1, 1, 0}, /* 80 */ { 3, s_7_80, -1, 1, 0}, /* 81 */ { 2, s_7_81, -1, 1, 0}, /* 82 */ { 2, s_7_82, -1, 1, 0}, /* 83 */ { 3, s_7_83, -1, 1, 0}, /* 84 */ { 3, s_7_84, -1, 1, 0}, /* 85 */ { 3, s_7_85, -1, 1, 0}, /* 86 */ { 3, s_7_86, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2, 1 }; static unsigned char g_AEIO[] = { 17, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2 }; static unsigned char g_CG[] = { 17 }; static symbol s_0[] = { 0xE0 }; static symbol s_1[] = { 0xE8 }; static symbol s_2[] = { 0xEC }; static symbol s_3[] = { 0xF2 }; static symbol s_4[] = { 0xF9 }; static symbol s_5[] = { 'q', 'U' }; static symbol s_6[] = { 'u' }; static symbol s_7[] = { 'U' }; static symbol s_8[] = { 'i' }; static symbol s_9[] = { 'I' }; static symbol s_10[] = { 'i' }; static symbol s_11[] = { 'u' }; static symbol s_12[] = { 'e' }; static symbol s_13[] = { 'i', 'c' }; static symbol s_14[] = { 'l', 'o', 'g' }; static symbol s_15[] = { 'u' }; static symbol s_16[] = { 'e', 'n', 't', 'e' }; static symbol s_17[] = { 'a', 't' }; static symbol s_18[] = { 'a', 't' }; static symbol s_19[] = { 'i', 'c' }; static symbol s_20[] = { 'i' }; static symbol s_21[] = { 'h' }; static int r_prelude(struct SN_env * z) { int among_var; { int c_test = z->c; /* test, line 35 */ while(1) { /* repeat, line 35 */ int c = z->c; z->bra = z->c; /* [, line 36 */ among_var = find_among(z, a_0, 7); /* substring, line 36 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 36 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_0); /* <-, line 37 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 38 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 39 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 40 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 41 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 2, s_5); /* <-, line 42 */ if (ret < 0) return ret; } break; case 7: if (z->c >= z->l) goto lab0; z->c++; /* next, line 43 */ break; } continue; lab0: z->c = c; break; } z->c = c_test; } while(1) { /* repeat, line 46 */ int c = z->c; while(1) { /* goto, line 46 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 249))) goto lab2; z->bra = z->c; /* [, line 47 */ { int c = z->c; /* or, line 47 */ if (!(eq_s(z, 1, s_6))) goto lab4; z->ket = z->c; /* ], line 47 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab4; { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 47 */ if (ret < 0) return ret; } goto lab3; lab4: z->c = c; if (!(eq_s(z, 1, s_8))) goto lab2; z->ket = z->c; /* ], line 48 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab2; { int ret; ret = slice_from_s(z, 1, s_9); /* <-, line 48 */ if (ret < 0) return ret; } } lab3: z->c = c; break; lab2: z->c = c; if (z->c >= z->l) goto lab1; z->c++; /* goto, line 46 */ } continue; lab1: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 58 */ { int c = z->c; /* or, line 60 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab2; { int c = z->c; /* or, line 59 */ if (!(out_grouping(z, g_v, 97, 249))) goto lab4; while(1) { /* gopast, line 59 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab5; break; lab5: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 59 */ } goto lab3; lab4: z->c = c; if (!(in_grouping(z, g_v, 97, 249))) goto lab2; while(1) { /* gopast, line 59 */ if (!(out_grouping(z, g_v, 97, 249))) goto lab6; break; lab6: if (z->c >= z->l) goto lab2; z->c++; /* gopast, line 59 */ } } lab3: goto lab1; lab2: z->c = c; if (!(out_grouping(z, g_v, 97, 249))) goto lab0; { int c = z->c; /* or, line 61 */ if (!(out_grouping(z, g_v, 97, 249))) goto lab8; while(1) { /* gopast, line 61 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab9; break; lab9: if (z->c >= z->l) goto lab8; z->c++; /* gopast, line 61 */ } goto lab7; lab8: z->c = c; if (!(in_grouping(z, g_v, 97, 249))) goto lab0; if (z->c >= z->l) goto lab0; z->c++; /* next, line 61 */ } lab7: ; } lab1: z->I[0] = z->c; /* setmark pV, line 62 */ lab0: z->c = c; } { int c = z->c; /* do, line 64 */ while(1) { /* gopast, line 65 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab11; break; lab11: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 65 */ } while(1) { /* gopast, line 65 */ if (!(out_grouping(z, g_v, 97, 249))) goto lab12; break; lab12: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 65 */ } z->I[1] = z->c; /* setmark p1, line 65 */ while(1) { /* gopast, line 66 */ if (!(in_grouping(z, g_v, 97, 249))) goto lab13; break; lab13: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 66 */ } while(1) { /* gopast, line 66 */ if (!(out_grouping(z, g_v, 97, 249))) goto lab14; break; lab14: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 66 */ } z->I[2] = z->c; /* setmark p2, line 66 */ lab10: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 70 */ int c = z->c; z->bra = z->c; /* [, line 72 */ among_var = find_among(z, a_1, 3); /* substring, line 72 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 72 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 73 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_11); /* <-, line 74 */ if (ret < 0) return ret; } break; case 3: if (z->c >= z->l) goto lab0; z->c++; /* next, line 75 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_attached_pronoun(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 87 */ if (!(find_among_b(z, a_2, 37))) return 0; /* substring, line 87 */ z->bra = z->c; /* ], line 87 */ among_var = find_among_b(z, a_3, 5); /* among, line 97 */ if (!(among_var)) return 0; { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 97 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 98 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_12); /* <-, line 99 */ if (ret < 0) return ret; } break; } return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 104 */ among_var = find_among_b(z, a_6, 51); /* substring, line 104 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 104 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 111 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 111 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 113 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 113 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 114 */ z->ket = z->c; /* [, line 114 */ if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 114 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 114 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 114 */ if (ret < 0) return ret; } lab0: ; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 117 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_14); /* <-, line 117 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 119 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_15); /* <-, line 119 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 121 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_16); /* <-, line 121 */ if (ret < 0) return ret; } break; case 6: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 123 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 123 */ if (ret < 0) return ret; } break; case 7: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 125 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 125 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 126 */ z->ket = z->c; /* [, line 127 */ among_var = find_among_b(z, a_4, 4); /* substring, line 127 */ if (!(among_var)) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 127 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 127 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab1; } case 1: z->ket = z->c; /* [, line 128 */ if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 128 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 128 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 128 */ if (ret < 0) return ret; } break; } lab1: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 134 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 134 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 135 */ z->ket = z->c; /* [, line 136 */ among_var = find_among_b(z, a_5, 3); /* substring, line 136 */ if (!(among_var)) { z->c = z->l - m; goto lab2; } z->bra = z->c; /* ], line 136 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab2; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 137 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 137 */ if (ret < 0) return ret; } break; } lab2: ; } break; case 9: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 142 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 142 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 143 */ z->ket = z->c; /* [, line 143 */ if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 143 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 143 */ if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 143 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } lab3: ; } break; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 148 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 148 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 149 */ among_var = find_among_b(z, a_7, 87); /* substring, line 149 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 149 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret; ret = slice_del(z); /* delete, line 163 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_vowel_suffix(struct SN_env * z) { { int m = z->l - z->c; (void) m; /* try, line 171 */ z->ket = z->c; /* [, line 172 */ if (!(in_grouping_b(z, g_AEIO, 97, 242))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 172 */ { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 172 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 172 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 173 */ if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 173 */ { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 173 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 173 */ if (ret < 0) return ret; } lab0: ; } { int m = z->l - z->c; (void) m; /* try, line 175 */ z->ket = z->c; /* [, line 176 */ if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 176 */ if (!(in_grouping_b(z, g_CG, 99, 103))) { z->c = z->l - m; goto lab1; } { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call RV, line 176 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 176 */ if (ret < 0) return ret; } lab1: ; } return 1; } extern int italian_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 182 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 182 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 183 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 183 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 184 */ { int m = z->l - z->c; (void) m; /* do, line 185 */ { int ret = r_attached_pronoun(z); if (ret == 0) goto lab2; /* call attached_pronoun, line 185 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 186 */ { int m = z->l - z->c; (void) m; /* or, line 186 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab5; /* call standard_suffix, line 186 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab3; /* call verb_suffix, line 186 */ if (ret < 0) return ret; } } lab4: lab3: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 187 */ { int ret = r_vowel_suffix(z); if (ret == 0) goto lab6; /* call vowel_suffix, line 187 */ if (ret < 0) return ret; } lab6: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 189 */ { int ret = r_postlude(z); if (ret == 0) goto lab7; /* call postlude, line 189 */ if (ret < 0) return ret; } lab7: z->c = c; } return 1; } extern struct SN_env * italian_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); } extern void italian_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_italian.h000066400000000000000000000005101154025176300301040ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * italian_ISO_8859_1_create_env(void); extern void italian_ISO_8859_1_close_env(struct SN_env * z); extern int italian_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_norwegian.c000066400000000000000000000223231154025176300304550ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int norwegian_ISO_8859_1_stem(struct SN_env * z); static int r_other_suffix(struct SN_env * z); static int r_consonant_pair(struct SN_env * z); static int r_main_suffix(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * norwegian_ISO_8859_1_create_env(void); extern void norwegian_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_0[1] = { 'a' }; static symbol s_0_1[1] = { 'e' }; static symbol s_0_2[3] = { 'e', 'd', 'e' }; static symbol s_0_3[4] = { 'a', 'n', 'd', 'e' }; static symbol s_0_4[4] = { 'e', 'n', 'd', 'e' }; static symbol s_0_5[3] = { 'a', 'n', 'e' }; static symbol s_0_6[3] = { 'e', 'n', 'e' }; static symbol s_0_7[6] = { 'h', 'e', 't', 'e', 'n', 'e' }; static symbol s_0_8[4] = { 'e', 'r', 't', 'e' }; static symbol s_0_9[2] = { 'e', 'n' }; static symbol s_0_10[5] = { 'h', 'e', 't', 'e', 'n' }; static symbol s_0_11[2] = { 'a', 'r' }; static symbol s_0_12[2] = { 'e', 'r' }; static symbol s_0_13[5] = { 'h', 'e', 't', 'e', 'r' }; static symbol s_0_14[1] = { 's' }; static symbol s_0_15[2] = { 'a', 's' }; static symbol s_0_16[2] = { 'e', 's' }; static symbol s_0_17[4] = { 'e', 'd', 'e', 's' }; static symbol s_0_18[5] = { 'e', 'n', 'd', 'e', 's' }; static symbol s_0_19[4] = { 'e', 'n', 'e', 's' }; static symbol s_0_20[7] = { 'h', 'e', 't', 'e', 'n', 'e', 's' }; static symbol s_0_21[3] = { 'e', 'n', 's' }; static symbol s_0_22[6] = { 'h', 'e', 't', 'e', 'n', 's' }; static symbol s_0_23[3] = { 'e', 'r', 's' }; static symbol s_0_24[3] = { 'e', 't', 's' }; static symbol s_0_25[2] = { 'e', 't' }; static symbol s_0_26[3] = { 'h', 'e', 't' }; static symbol s_0_27[3] = { 'e', 'r', 't' }; static symbol s_0_28[3] = { 'a', 's', 't' }; static struct among a_0[29] = { /* 0 */ { 1, s_0_0, -1, 1, 0}, /* 1 */ { 1, s_0_1, -1, 1, 0}, /* 2 */ { 3, s_0_2, 1, 1, 0}, /* 3 */ { 4, s_0_3, 1, 1, 0}, /* 4 */ { 4, s_0_4, 1, 1, 0}, /* 5 */ { 3, s_0_5, 1, 1, 0}, /* 6 */ { 3, s_0_6, 1, 1, 0}, /* 7 */ { 6, s_0_7, 6, 1, 0}, /* 8 */ { 4, s_0_8, 1, 3, 0}, /* 9 */ { 2, s_0_9, -1, 1, 0}, /* 10 */ { 5, s_0_10, 9, 1, 0}, /* 11 */ { 2, s_0_11, -1, 1, 0}, /* 12 */ { 2, s_0_12, -1, 1, 0}, /* 13 */ { 5, s_0_13, 12, 1, 0}, /* 14 */ { 1, s_0_14, -1, 2, 0}, /* 15 */ { 2, s_0_15, 14, 1, 0}, /* 16 */ { 2, s_0_16, 14, 1, 0}, /* 17 */ { 4, s_0_17, 16, 1, 0}, /* 18 */ { 5, s_0_18, 16, 1, 0}, /* 19 */ { 4, s_0_19, 16, 1, 0}, /* 20 */ { 7, s_0_20, 19, 1, 0}, /* 21 */ { 3, s_0_21, 14, 1, 0}, /* 22 */ { 6, s_0_22, 21, 1, 0}, /* 23 */ { 3, s_0_23, 14, 1, 0}, /* 24 */ { 3, s_0_24, 14, 1, 0}, /* 25 */ { 2, s_0_25, -1, 1, 0}, /* 26 */ { 3, s_0_26, 25, 1, 0}, /* 27 */ { 3, s_0_27, -1, 3, 0}, /* 28 */ { 3, s_0_28, -1, 1, 0} }; static symbol s_1_0[2] = { 'd', 't' }; static symbol s_1_1[2] = { 'v', 't' }; static struct among a_1[2] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0} }; static symbol s_2_0[3] = { 'l', 'e', 'g' }; static symbol s_2_1[4] = { 'e', 'l', 'e', 'g' }; static symbol s_2_2[2] = { 'i', 'g' }; static symbol s_2_3[3] = { 'e', 'i', 'g' }; static symbol s_2_4[3] = { 'l', 'i', 'g' }; static symbol s_2_5[4] = { 'e', 'l', 'i', 'g' }; static symbol s_2_6[3] = { 'e', 'l', 's' }; static symbol s_2_7[3] = { 'l', 'o', 'v' }; static symbol s_2_8[4] = { 'e', 'l', 'o', 'v' }; static symbol s_2_9[4] = { 's', 'l', 'o', 'v' }; static symbol s_2_10[7] = { 'h', 'e', 't', 's', 'l', 'o', 'v' }; static struct among a_2[11] = { /* 0 */ { 3, s_2_0, -1, 1, 0}, /* 1 */ { 4, s_2_1, 0, 1, 0}, /* 2 */ { 2, s_2_2, -1, 1, 0}, /* 3 */ { 3, s_2_3, 2, 1, 0}, /* 4 */ { 3, s_2_4, 2, 1, 0}, /* 5 */ { 4, s_2_5, 4, 1, 0}, /* 6 */ { 3, s_2_6, -1, 1, 0}, /* 7 */ { 3, s_2_7, -1, 1, 0}, /* 8 */ { 4, s_2_8, 7, 1, 0}, /* 9 */ { 4, s_2_9, 7, 1, 0}, /* 10 */ { 7, s_2_10, 9, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 }; static unsigned char g_s_ending[] = { 119, 125, 149, 1 }; static symbol s_0[] = { 'k' }; static symbol s_1[] = { 'e', 'r' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; { int c_test = z->c; /* test, line 30 */ { int c = z->c + 3; if (0 > c || c > z->l) return 0; z->c = c; /* hop, line 30 */ } z->I[1] = z->c; /* setmark x, line 30 */ z->c = c_test; } while(1) { /* goto, line 31 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 248))) goto lab0; z->c = c; break; lab0: z->c = c; if (z->c >= z->l) return 0; z->c++; /* goto, line 31 */ } while(1) { /* gopast, line 31 */ if (!(out_grouping(z, g_v, 97, 248))) goto lab1; break; lab1: if (z->c >= z->l) return 0; z->c++; /* gopast, line 31 */ } z->I[0] = z->c; /* setmark p1, line 31 */ /* try, line 32 */ if (!(z->I[0] < z->I[1])) goto lab2; z->I[0] = z->I[1]; lab2: return 1; } static int r_main_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 38 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 38 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 38 */ among_var = find_among_b(z, a_0, 29); /* substring, line 38 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 38 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 44 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 46 */ if (!(in_grouping_b(z, g_s_ending, 98, 122))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_0))) return 0; if (!(out_grouping_b(z, g_v, 97, 248))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 46 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 48 */ if (ret < 0) return ret; } break; } return 1; } static int r_consonant_pair(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 53 */ { int m3; /* setlimit, line 54 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 54 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 54 */ if (!(find_among_b(z, a_1, 2))) { z->lb = m3; return 0; } /* substring, line 54 */ z->bra = z->c; /* ], line 54 */ z->lb = m3; } z->c = z->l - m_test; } if (z->c <= z->lb) return 0; z->c--; /* next, line 59 */ z->bra = z->c; /* ], line 59 */ { int ret; ret = slice_del(z); /* delete, line 59 */ if (ret < 0) return ret; } return 1; } static int r_other_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 63 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 63 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 63 */ among_var = find_among_b(z, a_2, 11); /* substring, line 63 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 63 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 67 */ if (ret < 0) return ret; } break; } return 1; } extern int norwegian_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 74 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 74 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 75 */ { int m = z->l - z->c; (void) m; /* do, line 76 */ { int ret = r_main_suffix(z); if (ret == 0) goto lab1; /* call main_suffix, line 76 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 77 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab2; /* call consonant_pair, line 77 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 78 */ { int ret = r_other_suffix(z); if (ret == 0) goto lab3; /* call other_suffix, line 78 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * norwegian_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 0); } extern void norwegian_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_norwegian.h000066400000000000000000000005161154025176300304620ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * norwegian_ISO_8859_1_create_env(void); extern void norwegian_ISO_8859_1_close_env(struct SN_env * z); extern int norwegian_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_porter.c000066400000000000000000000577431154025176300300150ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int porter_ISO_8859_1_stem(struct SN_env * z); static int r_Step_5b(struct SN_env * z); static int r_Step_5a(struct SN_env * z); static int r_Step_4(struct SN_env * z); static int r_Step_3(struct SN_env * z); static int r_Step_2(struct SN_env * z); static int r_Step_1c(struct SN_env * z); static int r_Step_1b(struct SN_env * z); static int r_Step_1a(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_shortv(struct SN_env * z); extern struct SN_env * porter_ISO_8859_1_create_env(void); extern void porter_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_0[1] = { 's' }; static symbol s_0_1[3] = { 'i', 'e', 's' }; static symbol s_0_2[4] = { 's', 's', 'e', 's' }; static symbol s_0_3[2] = { 's', 's' }; static struct among a_0[4] = { /* 0 */ { 1, s_0_0, -1, 3, 0}, /* 1 */ { 3, s_0_1, 0, 2, 0}, /* 2 */ { 4, s_0_2, 0, 1, 0}, /* 3 */ { 2, s_0_3, 0, -1, 0} }; static symbol s_1_1[2] = { 'b', 'b' }; static symbol s_1_2[2] = { 'd', 'd' }; static symbol s_1_3[2] = { 'f', 'f' }; static symbol s_1_4[2] = { 'g', 'g' }; static symbol s_1_5[2] = { 'b', 'l' }; static symbol s_1_6[2] = { 'm', 'm' }; static symbol s_1_7[2] = { 'n', 'n' }; static symbol s_1_8[2] = { 'p', 'p' }; static symbol s_1_9[2] = { 'r', 'r' }; static symbol s_1_10[2] = { 'a', 't' }; static symbol s_1_11[2] = { 't', 't' }; static symbol s_1_12[2] = { 'i', 'z' }; static struct among a_1[13] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_1_1, 0, 2, 0}, /* 2 */ { 2, s_1_2, 0, 2, 0}, /* 3 */ { 2, s_1_3, 0, 2, 0}, /* 4 */ { 2, s_1_4, 0, 2, 0}, /* 5 */ { 2, s_1_5, 0, 1, 0}, /* 6 */ { 2, s_1_6, 0, 2, 0}, /* 7 */ { 2, s_1_7, 0, 2, 0}, /* 8 */ { 2, s_1_8, 0, 2, 0}, /* 9 */ { 2, s_1_9, 0, 2, 0}, /* 10 */ { 2, s_1_10, 0, 1, 0}, /* 11 */ { 2, s_1_11, 0, 2, 0}, /* 12 */ { 2, s_1_12, 0, 1, 0} }; static symbol s_2_0[2] = { 'e', 'd' }; static symbol s_2_1[3] = { 'e', 'e', 'd' }; static symbol s_2_2[3] = { 'i', 'n', 'g' }; static struct among a_2[3] = { /* 0 */ { 2, s_2_0, -1, 2, 0}, /* 1 */ { 3, s_2_1, 0, 1, 0}, /* 2 */ { 3, s_2_2, -1, 2, 0} }; static symbol s_3_0[4] = { 'a', 'n', 'c', 'i' }; static symbol s_3_1[4] = { 'e', 'n', 'c', 'i' }; static symbol s_3_2[4] = { 'a', 'b', 'l', 'i' }; static symbol s_3_3[3] = { 'e', 'l', 'i' }; static symbol s_3_4[4] = { 'a', 'l', 'l', 'i' }; static symbol s_3_5[5] = { 'o', 'u', 's', 'l', 'i' }; static symbol s_3_6[5] = { 'e', 'n', 't', 'l', 'i' }; static symbol s_3_7[5] = { 'a', 'l', 'i', 't', 'i' }; static symbol s_3_8[6] = { 'b', 'i', 'l', 'i', 't', 'i' }; static symbol s_3_9[5] = { 'i', 'v', 'i', 't', 'i' }; static symbol s_3_10[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_3_11[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_3_12[5] = { 'a', 'l', 'i', 's', 'm' }; static symbol s_3_13[5] = { 'a', 't', 'i', 'o', 'n' }; static symbol s_3_14[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' }; static symbol s_3_15[4] = { 'i', 'z', 'e', 'r' }; static symbol s_3_16[4] = { 'a', 't', 'o', 'r' }; static symbol s_3_17[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' }; static symbol s_3_18[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' }; static symbol s_3_19[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' }; static struct among a_3[20] = { /* 0 */ { 4, s_3_0, -1, 3, 0}, /* 1 */ { 4, s_3_1, -1, 2, 0}, /* 2 */ { 4, s_3_2, -1, 4, 0}, /* 3 */ { 3, s_3_3, -1, 6, 0}, /* 4 */ { 4, s_3_4, -1, 9, 0}, /* 5 */ { 5, s_3_5, -1, 12, 0}, /* 6 */ { 5, s_3_6, -1, 5, 0}, /* 7 */ { 5, s_3_7, -1, 10, 0}, /* 8 */ { 6, s_3_8, -1, 14, 0}, /* 9 */ { 5, s_3_9, -1, 13, 0}, /* 10 */ { 6, s_3_10, -1, 1, 0}, /* 11 */ { 7, s_3_11, 10, 8, 0}, /* 12 */ { 5, s_3_12, -1, 10, 0}, /* 13 */ { 5, s_3_13, -1, 8, 0}, /* 14 */ { 7, s_3_14, 13, 7, 0}, /* 15 */ { 4, s_3_15, -1, 7, 0}, /* 16 */ { 4, s_3_16, -1, 8, 0}, /* 17 */ { 7, s_3_17, -1, 13, 0}, /* 18 */ { 7, s_3_18, -1, 11, 0}, /* 19 */ { 7, s_3_19, -1, 12, 0} }; static symbol s_4_0[5] = { 'i', 'c', 'a', 't', 'e' }; static symbol s_4_1[5] = { 'a', 't', 'i', 'v', 'e' }; static symbol s_4_2[5] = { 'a', 'l', 'i', 'z', 'e' }; static symbol s_4_3[5] = { 'i', 'c', 'i', 't', 'i' }; static symbol s_4_4[4] = { 'i', 'c', 'a', 'l' }; static symbol s_4_5[3] = { 'f', 'u', 'l' }; static symbol s_4_6[4] = { 'n', 'e', 's', 's' }; static struct among a_4[7] = { /* 0 */ { 5, s_4_0, -1, 2, 0}, /* 1 */ { 5, s_4_1, -1, 3, 0}, /* 2 */ { 5, s_4_2, -1, 1, 0}, /* 3 */ { 5, s_4_3, -1, 2, 0}, /* 4 */ { 4, s_4_4, -1, 2, 0}, /* 5 */ { 3, s_4_5, -1, 3, 0}, /* 6 */ { 4, s_4_6, -1, 3, 0} }; static symbol s_5_0[2] = { 'i', 'c' }; static symbol s_5_1[4] = { 'a', 'n', 'c', 'e' }; static symbol s_5_2[4] = { 'e', 'n', 'c', 'e' }; static symbol s_5_3[4] = { 'a', 'b', 'l', 'e' }; static symbol s_5_4[4] = { 'i', 'b', 'l', 'e' }; static symbol s_5_5[3] = { 'a', 't', 'e' }; static symbol s_5_6[3] = { 'i', 'v', 'e' }; static symbol s_5_7[3] = { 'i', 'z', 'e' }; static symbol s_5_8[3] = { 'i', 't', 'i' }; static symbol s_5_9[2] = { 'a', 'l' }; static symbol s_5_10[3] = { 'i', 's', 'm' }; static symbol s_5_11[3] = { 'i', 'o', 'n' }; static symbol s_5_12[2] = { 'e', 'r' }; static symbol s_5_13[3] = { 'o', 'u', 's' }; static symbol s_5_14[3] = { 'a', 'n', 't' }; static symbol s_5_15[3] = { 'e', 'n', 't' }; static symbol s_5_16[4] = { 'm', 'e', 'n', 't' }; static symbol s_5_17[5] = { 'e', 'm', 'e', 'n', 't' }; static symbol s_5_18[2] = { 'o', 'u' }; static struct among a_5[19] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 4, s_5_2, -1, 1, 0}, /* 3 */ { 4, s_5_3, -1, 1, 0}, /* 4 */ { 4, s_5_4, -1, 1, 0}, /* 5 */ { 3, s_5_5, -1, 1, 0}, /* 6 */ { 3, s_5_6, -1, 1, 0}, /* 7 */ { 3, s_5_7, -1, 1, 0}, /* 8 */ { 3, s_5_8, -1, 1, 0}, /* 9 */ { 2, s_5_9, -1, 1, 0}, /* 10 */ { 3, s_5_10, -1, 1, 0}, /* 11 */ { 3, s_5_11, -1, 2, 0}, /* 12 */ { 2, s_5_12, -1, 1, 0}, /* 13 */ { 3, s_5_13, -1, 1, 0}, /* 14 */ { 3, s_5_14, -1, 1, 0}, /* 15 */ { 3, s_5_15, -1, 1, 0}, /* 16 */ { 4, s_5_16, 15, 1, 0}, /* 17 */ { 5, s_5_17, 16, 1, 0}, /* 18 */ { 2, s_5_18, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1 }; static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 }; static symbol s_0[] = { 's', 's' }; static symbol s_1[] = { 'i' }; static symbol s_2[] = { 'e', 'e' }; static symbol s_3[] = { 'e' }; static symbol s_4[] = { 'e' }; static symbol s_5[] = { 'y' }; static symbol s_6[] = { 'Y' }; static symbol s_7[] = { 'i' }; static symbol s_8[] = { 't', 'i', 'o', 'n' }; static symbol s_9[] = { 'e', 'n', 'c', 'e' }; static symbol s_10[] = { 'a', 'n', 'c', 'e' }; static symbol s_11[] = { 'a', 'b', 'l', 'e' }; static symbol s_12[] = { 'e', 'n', 't' }; static symbol s_13[] = { 'e' }; static symbol s_14[] = { 'i', 'z', 'e' }; static symbol s_15[] = { 'a', 't', 'e' }; static symbol s_16[] = { 'a', 'l' }; static symbol s_17[] = { 'a', 'l' }; static symbol s_18[] = { 'f', 'u', 'l' }; static symbol s_19[] = { 'o', 'u', 's' }; static symbol s_20[] = { 'i', 'v', 'e' }; static symbol s_21[] = { 'b', 'l', 'e' }; static symbol s_22[] = { 'a', 'l' }; static symbol s_23[] = { 'i', 'c' }; static symbol s_24[] = { 's' }; static symbol s_25[] = { 't' }; static symbol s_26[] = { 'e' }; static symbol s_27[] = { 'l' }; static symbol s_28[] = { 'l' }; static symbol s_29[] = { 'y' }; static symbol s_30[] = { 'Y' }; static symbol s_31[] = { 'y' }; static symbol s_32[] = { 'Y' }; static symbol s_33[] = { 'Y' }; static symbol s_34[] = { 'y' }; static int r_shortv(struct SN_env * z) { if (!(out_grouping_b(z, g_v_WXY, 89, 121))) return 0; if (!(in_grouping_b(z, g_v, 97, 121))) return 0; if (!(out_grouping_b(z, g_v, 97, 121))) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_Step_1a(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 25 */ among_var = find_among_b(z, a_0, 4); /* substring, line 25 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 25 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 2, s_0); /* <-, line 26 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 27 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 29 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_1b(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 34 */ among_var = find_among_b(z, a_2, 3); /* substring, line 34 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 34 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 35 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 2, s_2); /* <-, line 35 */ if (ret < 0) return ret; } break; case 2: { int m_test = z->l - z->c; /* test, line 38 */ while(1) { /* gopast, line 38 */ if (!(in_grouping_b(z, g_v, 97, 121))) goto lab0; break; lab0: if (z->c <= z->lb) return 0; z->c--; /* gopast, line 38 */ } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 38 */ if (ret < 0) return ret; } { int m_test = z->l - z->c; /* test, line 39 */ among_var = find_among_b(z, a_1, 13); /* substring, line 39 */ if (!(among_var)) return 0; z->c = z->l - m_test; } switch(among_var) { case 0: return 0; case 1: { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */ z->c = c; } if (ret < 0) return ret; } break; case 2: z->ket = z->c; /* [, line 44 */ if (z->c <= z->lb) return 0; z->c--; /* next, line 44 */ z->bra = z->c; /* ], line 44 */ { int ret; ret = slice_del(z); /* delete, line 44 */ if (ret < 0) return ret; } break; case 3: if (z->c != z->I[0]) return 0; /* atmark, line 45 */ { int m_test = z->l - z->c; /* test, line 45 */ { int ret = r_shortv(z); if (ret == 0) return 0; /* call shortv, line 45 */ if (ret < 0) return ret; } z->c = z->l - m_test; } { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */ z->c = c; } if (ret < 0) return ret; } break; } break; } return 1; } static int r_Step_1c(struct SN_env * z) { z->ket = z->c; /* [, line 52 */ { int m = z->l - z->c; (void) m; /* or, line 52 */ if (!(eq_s_b(z, 1, s_5))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_6))) return 0; } lab0: z->bra = z->c; /* ], line 52 */ while(1) { /* gopast, line 53 */ if (!(in_grouping_b(z, g_v, 97, 121))) goto lab2; break; lab2: if (z->c <= z->lb) return 0; z->c--; /* gopast, line 53 */ } { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 54 */ if (ret < 0) return ret; } return 1; } static int r_Step_2(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 58 */ among_var = find_among_b(z, a_3, 20); /* substring, line 58 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 58 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 58 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 4, s_8); /* <-, line 59 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 4, s_9); /* <-, line 60 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 4, s_10); /* <-, line 61 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 4, s_11); /* <-, line 62 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 3, s_12); /* <-, line 63 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 64 */ if (ret < 0) return ret; } break; case 7: { int ret; ret = slice_from_s(z, 3, s_14); /* <-, line 66 */ if (ret < 0) return ret; } break; case 8: { int ret; ret = slice_from_s(z, 3, s_15); /* <-, line 68 */ if (ret < 0) return ret; } break; case 9: { int ret; ret = slice_from_s(z, 2, s_16); /* <-, line 69 */ if (ret < 0) return ret; } break; case 10: { int ret; ret = slice_from_s(z, 2, s_17); /* <-, line 71 */ if (ret < 0) return ret; } break; case 11: { int ret; ret = slice_from_s(z, 3, s_18); /* <-, line 72 */ if (ret < 0) return ret; } break; case 12: { int ret; ret = slice_from_s(z, 3, s_19); /* <-, line 74 */ if (ret < 0) return ret; } break; case 13: { int ret; ret = slice_from_s(z, 3, s_20); /* <-, line 76 */ if (ret < 0) return ret; } break; case 14: { int ret; ret = slice_from_s(z, 3, s_21); /* <-, line 77 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_3(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 82 */ among_var = find_among_b(z, a_4, 7); /* substring, line 82 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 82 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 82 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 2, s_22); /* <-, line 83 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 2, s_23); /* <-, line 85 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 87 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_4(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 92 */ among_var = find_among_b(z, a_5, 19); /* substring, line 92 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 92 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 92 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 95 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 96 */ if (!(eq_s_b(z, 1, s_24))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_25))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 96 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_5a(struct SN_env * z) { z->ket = z->c; /* [, line 101 */ if (!(eq_s_b(z, 1, s_26))) return 0; z->bra = z->c; /* ], line 101 */ { int m = z->l - z->c; (void) m; /* or, line 102 */ { int ret = r_R2(z); if (ret == 0) goto lab1; /* call R2, line 102 */ if (ret < 0) return ret; } goto lab0; lab1: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 102 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 102 */ { int ret = r_shortv(z); if (ret == 0) goto lab2; /* call shortv, line 102 */ if (ret < 0) return ret; } return 0; lab2: z->c = z->l - m; } } lab0: { int ret; ret = slice_del(z); /* delete, line 103 */ if (ret < 0) return ret; } return 1; } static int r_Step_5b(struct SN_env * z) { z->ket = z->c; /* [, line 107 */ if (!(eq_s_b(z, 1, s_27))) return 0; z->bra = z->c; /* ], line 107 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 108 */ if (ret < 0) return ret; } if (!(eq_s_b(z, 1, s_28))) return 0; { int ret; ret = slice_del(z); /* delete, line 109 */ if (ret < 0) return ret; } return 1; } extern int porter_ISO_8859_1_stem(struct SN_env * z) { z->B[0] = 0; /* unset Y_found, line 115 */ { int c = z->c; /* do, line 116 */ z->bra = z->c; /* [, line 116 */ if (!(eq_s(z, 1, s_29))) goto lab0; z->ket = z->c; /* ], line 116 */ { int ret; ret = slice_from_s(z, 1, s_30); /* <-, line 116 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 116 */ lab0: z->c = c; } { int c = z->c; /* do, line 117 */ while(1) { /* repeat, line 117 */ int c = z->c; while(1) { /* goto, line 117 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 121))) goto lab3; z->bra = z->c; /* [, line 117 */ if (!(eq_s(z, 1, s_31))) goto lab3; z->ket = z->c; /* ], line 117 */ z->c = c; break; lab3: z->c = c; if (z->c >= z->l) goto lab2; z->c++; /* goto, line 117 */ } { int ret; ret = slice_from_s(z, 1, s_32); /* <-, line 117 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 117 */ continue; lab2: z->c = c; break; } z->c = c; } z->I[0] = z->l; z->I[1] = z->l; { int c = z->c; /* do, line 121 */ while(1) { /* gopast, line 122 */ if (!(in_grouping(z, g_v, 97, 121))) goto lab5; break; lab5: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 122 */ } while(1) { /* gopast, line 122 */ if (!(out_grouping(z, g_v, 97, 121))) goto lab6; break; lab6: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 122 */ } z->I[0] = z->c; /* setmark p1, line 122 */ while(1) { /* gopast, line 123 */ if (!(in_grouping(z, g_v, 97, 121))) goto lab7; break; lab7: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 123 */ } while(1) { /* gopast, line 123 */ if (!(out_grouping(z, g_v, 97, 121))) goto lab8; break; lab8: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 123 */ } z->I[1] = z->c; /* setmark p2, line 123 */ lab4: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 126 */ { int m = z->l - z->c; (void) m; /* do, line 127 */ { int ret = r_Step_1a(z); if (ret == 0) goto lab9; /* call Step_1a, line 127 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 128 */ { int ret = r_Step_1b(z); if (ret == 0) goto lab10; /* call Step_1b, line 128 */ if (ret < 0) return ret; } lab10: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 129 */ { int ret = r_Step_1c(z); if (ret == 0) goto lab11; /* call Step_1c, line 129 */ if (ret < 0) return ret; } lab11: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 130 */ { int ret = r_Step_2(z); if (ret == 0) goto lab12; /* call Step_2, line 130 */ if (ret < 0) return ret; } lab12: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 131 */ { int ret = r_Step_3(z); if (ret == 0) goto lab13; /* call Step_3, line 131 */ if (ret < 0) return ret; } lab13: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 132 */ { int ret = r_Step_4(z); if (ret == 0) goto lab14; /* call Step_4, line 132 */ if (ret < 0) return ret; } lab14: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 133 */ { int ret = r_Step_5a(z); if (ret == 0) goto lab15; /* call Step_5a, line 133 */ if (ret < 0) return ret; } lab15: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 134 */ { int ret = r_Step_5b(z); if (ret == 0) goto lab16; /* call Step_5b, line 134 */ if (ret < 0) return ret; } lab16: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 137 */ if (!(z->B[0])) goto lab17; /* Boolean test Y_found, line 137 */ while(1) { /* repeat, line 137 */ int c = z->c; while(1) { /* goto, line 137 */ int c = z->c; z->bra = z->c; /* [, line 137 */ if (!(eq_s(z, 1, s_33))) goto lab19; z->ket = z->c; /* ], line 137 */ z->c = c; break; lab19: z->c = c; if (z->c >= z->l) goto lab18; z->c++; /* goto, line 137 */ } { int ret; ret = slice_from_s(z, 1, s_34); /* <-, line 137 */ if (ret < 0) return ret; } continue; lab18: z->c = c; break; } lab17: z->c = c; } return 1; } extern struct SN_env * porter_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); } extern void porter_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_porter.h000066400000000000000000000005051154025176300300020ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * porter_ISO_8859_1_create_env(void); extern void porter_ISO_8859_1_close_env(struct SN_env * z); extern int porter_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_portuguese.c000066400000000000000000001102461154025176300306700ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int portuguese_ISO_8859_1_stem(struct SN_env * z); static int r_residual_form(struct SN_env * z); static int r_residual_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * portuguese_ISO_8859_1_create_env(void); extern void portuguese_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_1[1] = { 0xE3 }; static symbol s_0_2[1] = { 0xF5 }; static struct among a_0[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 1, s_0_1, 0, 1, 0}, /* 2 */ { 1, s_0_2, 0, 2, 0} }; static symbol s_1_1[2] = { 'a', '~' }; static symbol s_1_2[2] = { 'o', '~' }; static struct among a_1[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_1_1, 0, 1, 0}, /* 2 */ { 2, s_1_2, 0, 2, 0} }; static symbol s_2_0[2] = { 'i', 'c' }; static symbol s_2_1[2] = { 'a', 'd' }; static symbol s_2_2[2] = { 'o', 's' }; static symbol s_2_3[2] = { 'i', 'v' }; static struct among a_2[4] = { /* 0 */ { 2, s_2_0, -1, -1, 0}, /* 1 */ { 2, s_2_1, -1, -1, 0}, /* 2 */ { 2, s_2_2, -1, -1, 0}, /* 3 */ { 2, s_2_3, -1, 1, 0} }; static symbol s_3_0[4] = { 'a', 'n', 't', 'e' }; static symbol s_3_1[4] = { 'a', 'v', 'e', 'l' }; static symbol s_3_2[4] = { 0xED, 'v', 'e', 'l' }; static struct among a_3[3] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0}, /* 2 */ { 4, s_3_2, -1, 1, 0} }; static symbol s_4_0[2] = { 'i', 'c' }; static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_4_2[2] = { 'i', 'v' }; static struct among a_4[3] = { /* 0 */ { 2, s_4_0, -1, 1, 0}, /* 1 */ { 4, s_4_1, -1, 1, 0}, /* 2 */ { 2, s_4_2, -1, 1, 0} }; static symbol s_5_0[3] = { 'i', 'c', 'a' }; static symbol s_5_1[5] = { 0xE2, 'n', 'c', 'i', 'a' }; static symbol s_5_2[5] = { 0xEA, 'n', 'c', 'i', 'a' }; static symbol s_5_3[3] = { 'i', 'r', 'a' }; static symbol s_5_4[5] = { 'a', 'd', 'o', 'r', 'a' }; static symbol s_5_5[3] = { 'o', 's', 'a' }; static symbol s_5_6[4] = { 'i', 's', 't', 'a' }; static symbol s_5_7[3] = { 'i', 'v', 'a' }; static symbol s_5_8[3] = { 'e', 'z', 'a' }; static symbol s_5_9[5] = { 'l', 'o', 'g', 0xED, 'a' }; static symbol s_5_10[5] = { 'i', 'd', 'a', 'd', 'e' }; static symbol s_5_11[4] = { 'a', 'n', 't', 'e' }; static symbol s_5_12[5] = { 'm', 'e', 'n', 't', 'e' }; static symbol s_5_13[6] = { 'a', 'm', 'e', 'n', 't', 'e' }; static symbol s_5_14[4] = { 0xE1, 'v', 'e', 'l' }; static symbol s_5_15[4] = { 0xED, 'v', 'e', 'l' }; static symbol s_5_16[5] = { 'u', 'c', 'i', 0xF3, 'n' }; static symbol s_5_17[3] = { 'i', 'c', 'o' }; static symbol s_5_18[4] = { 'i', 's', 'm', 'o' }; static symbol s_5_19[3] = { 'o', 's', 'o' }; static symbol s_5_20[6] = { 'a', 'm', 'e', 'n', 't', 'o' }; static symbol s_5_21[6] = { 'i', 'm', 'e', 'n', 't', 'o' }; static symbol s_5_22[3] = { 'i', 'v', 'o' }; static symbol s_5_23[5] = { 'a', 0xE7, 'a', '~', 'o' }; static symbol s_5_24[4] = { 'a', 'd', 'o', 'r' }; static symbol s_5_25[4] = { 'i', 'c', 'a', 's' }; static symbol s_5_26[6] = { 0xEA, 'n', 'c', 'i', 'a', 's' }; static symbol s_5_27[4] = { 'i', 'r', 'a', 's' }; static symbol s_5_28[6] = { 'a', 'd', 'o', 'r', 'a', 's' }; static symbol s_5_29[4] = { 'o', 's', 'a', 's' }; static symbol s_5_30[5] = { 'i', 's', 't', 'a', 's' }; static symbol s_5_31[4] = { 'i', 'v', 'a', 's' }; static symbol s_5_32[4] = { 'e', 'z', 'a', 's' }; static symbol s_5_33[6] = { 'l', 'o', 'g', 0xED, 'a', 's' }; static symbol s_5_34[6] = { 'i', 'd', 'a', 'd', 'e', 's' }; static symbol s_5_35[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' }; static symbol s_5_36[6] = { 'a', 'd', 'o', 'r', 'e', 's' }; static symbol s_5_37[5] = { 'a', 'n', 't', 'e', 's' }; static symbol s_5_38[6] = { 'a', 0xE7, 'o', '~', 'e', 's' }; static symbol s_5_39[4] = { 'i', 'c', 'o', 's' }; static symbol s_5_40[5] = { 'i', 's', 'm', 'o', 's' }; static symbol s_5_41[4] = { 'o', 's', 'o', 's' }; static symbol s_5_42[7] = { 'a', 'm', 'e', 'n', 't', 'o', 's' }; static symbol s_5_43[7] = { 'i', 'm', 'e', 'n', 't', 'o', 's' }; static symbol s_5_44[4] = { 'i', 'v', 'o', 's' }; static struct among a_5[45] = { /* 0 */ { 3, s_5_0, -1, 1, 0}, /* 1 */ { 5, s_5_1, -1, 1, 0}, /* 2 */ { 5, s_5_2, -1, 4, 0}, /* 3 */ { 3, s_5_3, -1, 9, 0}, /* 4 */ { 5, s_5_4, -1, 1, 0}, /* 5 */ { 3, s_5_5, -1, 1, 0}, /* 6 */ { 4, s_5_6, -1, 1, 0}, /* 7 */ { 3, s_5_7, -1, 8, 0}, /* 8 */ { 3, s_5_8, -1, 1, 0}, /* 9 */ { 5, s_5_9, -1, 2, 0}, /* 10 */ { 5, s_5_10, -1, 7, 0}, /* 11 */ { 4, s_5_11, -1, 1, 0}, /* 12 */ { 5, s_5_12, -1, 6, 0}, /* 13 */ { 6, s_5_13, 12, 5, 0}, /* 14 */ { 4, s_5_14, -1, 1, 0}, /* 15 */ { 4, s_5_15, -1, 1, 0}, /* 16 */ { 5, s_5_16, -1, 3, 0}, /* 17 */ { 3, s_5_17, -1, 1, 0}, /* 18 */ { 4, s_5_18, -1, 1, 0}, /* 19 */ { 3, s_5_19, -1, 1, 0}, /* 20 */ { 6, s_5_20, -1, 1, 0}, /* 21 */ { 6, s_5_21, -1, 1, 0}, /* 22 */ { 3, s_5_22, -1, 8, 0}, /* 23 */ { 5, s_5_23, -1, 1, 0}, /* 24 */ { 4, s_5_24, -1, 1, 0}, /* 25 */ { 4, s_5_25, -1, 1, 0}, /* 26 */ { 6, s_5_26, -1, 4, 0}, /* 27 */ { 4, s_5_27, -1, 9, 0}, /* 28 */ { 6, s_5_28, -1, 1, 0}, /* 29 */ { 4, s_5_29, -1, 1, 0}, /* 30 */ { 5, s_5_30, -1, 1, 0}, /* 31 */ { 4, s_5_31, -1, 8, 0}, /* 32 */ { 4, s_5_32, -1, 1, 0}, /* 33 */ { 6, s_5_33, -1, 2, 0}, /* 34 */ { 6, s_5_34, -1, 7, 0}, /* 35 */ { 7, s_5_35, -1, 3, 0}, /* 36 */ { 6, s_5_36, -1, 1, 0}, /* 37 */ { 5, s_5_37, -1, 1, 0}, /* 38 */ { 6, s_5_38, -1, 1, 0}, /* 39 */ { 4, s_5_39, -1, 1, 0}, /* 40 */ { 5, s_5_40, -1, 1, 0}, /* 41 */ { 4, s_5_41, -1, 1, 0}, /* 42 */ { 7, s_5_42, -1, 1, 0}, /* 43 */ { 7, s_5_43, -1, 1, 0}, /* 44 */ { 4, s_5_44, -1, 8, 0} }; static symbol s_6_0[3] = { 'a', 'd', 'a' }; static symbol s_6_1[3] = { 'i', 'd', 'a' }; static symbol s_6_2[2] = { 'i', 'a' }; static symbol s_6_3[4] = { 'a', 'r', 'i', 'a' }; static symbol s_6_4[4] = { 'e', 'r', 'i', 'a' }; static symbol s_6_5[4] = { 'i', 'r', 'i', 'a' }; static symbol s_6_6[3] = { 'a', 'r', 'a' }; static symbol s_6_7[3] = { 'e', 'r', 'a' }; static symbol s_6_8[3] = { 'i', 'r', 'a' }; static symbol s_6_9[3] = { 'a', 'v', 'a' }; static symbol s_6_10[4] = { 'a', 's', 's', 'e' }; static symbol s_6_11[4] = { 'e', 's', 's', 'e' }; static symbol s_6_12[4] = { 'i', 's', 's', 'e' }; static symbol s_6_13[4] = { 'a', 's', 't', 'e' }; static symbol s_6_14[4] = { 'e', 's', 't', 'e' }; static symbol s_6_15[4] = { 'i', 's', 't', 'e' }; static symbol s_6_16[2] = { 'e', 'i' }; static symbol s_6_17[4] = { 'a', 'r', 'e', 'i' }; static symbol s_6_18[4] = { 'e', 'r', 'e', 'i' }; static symbol s_6_19[4] = { 'i', 'r', 'e', 'i' }; static symbol s_6_20[2] = { 'a', 'm' }; static symbol s_6_21[3] = { 'i', 'a', 'm' }; static symbol s_6_22[5] = { 'a', 'r', 'i', 'a', 'm' }; static symbol s_6_23[5] = { 'e', 'r', 'i', 'a', 'm' }; static symbol s_6_24[5] = { 'i', 'r', 'i', 'a', 'm' }; static symbol s_6_25[4] = { 'a', 'r', 'a', 'm' }; static symbol s_6_26[4] = { 'e', 'r', 'a', 'm' }; static symbol s_6_27[4] = { 'i', 'r', 'a', 'm' }; static symbol s_6_28[4] = { 'a', 'v', 'a', 'm' }; static symbol s_6_29[2] = { 'e', 'm' }; static symbol s_6_30[4] = { 'a', 'r', 'e', 'm' }; static symbol s_6_31[4] = { 'e', 'r', 'e', 'm' }; static symbol s_6_32[4] = { 'i', 'r', 'e', 'm' }; static symbol s_6_33[5] = { 'a', 's', 's', 'e', 'm' }; static symbol s_6_34[5] = { 'e', 's', 's', 'e', 'm' }; static symbol s_6_35[5] = { 'i', 's', 's', 'e', 'm' }; static symbol s_6_36[3] = { 'a', 'd', 'o' }; static symbol s_6_37[3] = { 'i', 'd', 'o' }; static symbol s_6_38[4] = { 'a', 'n', 'd', 'o' }; static symbol s_6_39[4] = { 'e', 'n', 'd', 'o' }; static symbol s_6_40[4] = { 'i', 'n', 'd', 'o' }; static symbol s_6_41[5] = { 'a', 'r', 'a', '~', 'o' }; static symbol s_6_42[5] = { 'e', 'r', 'a', '~', 'o' }; static symbol s_6_43[5] = { 'i', 'r', 'a', '~', 'o' }; static symbol s_6_44[2] = { 'a', 'r' }; static symbol s_6_45[2] = { 'e', 'r' }; static symbol s_6_46[2] = { 'i', 'r' }; static symbol s_6_47[2] = { 'a', 's' }; static symbol s_6_48[4] = { 'a', 'd', 'a', 's' }; static symbol s_6_49[4] = { 'i', 'd', 'a', 's' }; static symbol s_6_50[3] = { 'i', 'a', 's' }; static symbol s_6_51[5] = { 'a', 'r', 'i', 'a', 's' }; static symbol s_6_52[5] = { 'e', 'r', 'i', 'a', 's' }; static symbol s_6_53[5] = { 'i', 'r', 'i', 'a', 's' }; static symbol s_6_54[4] = { 'a', 'r', 'a', 's' }; static symbol s_6_55[4] = { 'e', 'r', 'a', 's' }; static symbol s_6_56[4] = { 'i', 'r', 'a', 's' }; static symbol s_6_57[4] = { 'a', 'v', 'a', 's' }; static symbol s_6_58[2] = { 'e', 's' }; static symbol s_6_59[5] = { 'a', 'r', 'd', 'e', 's' }; static symbol s_6_60[5] = { 'e', 'r', 'd', 'e', 's' }; static symbol s_6_61[5] = { 'i', 'r', 'd', 'e', 's' }; static symbol s_6_62[4] = { 'a', 'r', 'e', 's' }; static symbol s_6_63[4] = { 'e', 'r', 'e', 's' }; static symbol s_6_64[4] = { 'i', 'r', 'e', 's' }; static symbol s_6_65[5] = { 'a', 's', 's', 'e', 's' }; static symbol s_6_66[5] = { 'e', 's', 's', 'e', 's' }; static symbol s_6_67[5] = { 'i', 's', 's', 'e', 's' }; static symbol s_6_68[5] = { 'a', 's', 't', 'e', 's' }; static symbol s_6_69[5] = { 'e', 's', 't', 'e', 's' }; static symbol s_6_70[5] = { 'i', 's', 't', 'e', 's' }; static symbol s_6_71[2] = { 'i', 's' }; static symbol s_6_72[3] = { 'a', 'i', 's' }; static symbol s_6_73[3] = { 'e', 'i', 's' }; static symbol s_6_74[5] = { 'a', 'r', 'e', 'i', 's' }; static symbol s_6_75[5] = { 'e', 'r', 'e', 'i', 's' }; static symbol s_6_76[5] = { 'i', 'r', 'e', 'i', 's' }; static symbol s_6_77[5] = { 0xE1, 'r', 'e', 'i', 's' }; static symbol s_6_78[5] = { 0xE9, 'r', 'e', 'i', 's' }; static symbol s_6_79[5] = { 0xED, 'r', 'e', 'i', 's' }; static symbol s_6_80[6] = { 0xE1, 's', 's', 'e', 'i', 's' }; static symbol s_6_81[6] = { 0xE9, 's', 's', 'e', 'i', 's' }; static symbol s_6_82[6] = { 0xED, 's', 's', 'e', 'i', 's' }; static symbol s_6_83[5] = { 0xE1, 'v', 'e', 'i', 's' }; static symbol s_6_84[4] = { 0xED, 'e', 'i', 's' }; static symbol s_6_85[6] = { 'a', 'r', 0xED, 'e', 'i', 's' }; static symbol s_6_86[6] = { 'e', 'r', 0xED, 'e', 'i', 's' }; static symbol s_6_87[6] = { 'i', 'r', 0xED, 'e', 'i', 's' }; static symbol s_6_88[4] = { 'a', 'd', 'o', 's' }; static symbol s_6_89[4] = { 'i', 'd', 'o', 's' }; static symbol s_6_90[4] = { 'a', 'm', 'o', 's' }; static symbol s_6_91[6] = { 0xE1, 'r', 'a', 'm', 'o', 's' }; static symbol s_6_92[6] = { 0xE9, 'r', 'a', 'm', 'o', 's' }; static symbol s_6_93[6] = { 0xED, 'r', 'a', 'm', 'o', 's' }; static symbol s_6_94[6] = { 0xE1, 'v', 'a', 'm', 'o', 's' }; static symbol s_6_95[5] = { 0xED, 'a', 'm', 'o', 's' }; static symbol s_6_96[7] = { 'a', 'r', 0xED, 'a', 'm', 'o', 's' }; static symbol s_6_97[7] = { 'e', 'r', 0xED, 'a', 'm', 'o', 's' }; static symbol s_6_98[7] = { 'i', 'r', 0xED, 'a', 'm', 'o', 's' }; static symbol s_6_99[4] = { 'e', 'm', 'o', 's' }; static symbol s_6_100[6] = { 'a', 'r', 'e', 'm', 'o', 's' }; static symbol s_6_101[6] = { 'e', 'r', 'e', 'm', 'o', 's' }; static symbol s_6_102[6] = { 'i', 'r', 'e', 'm', 'o', 's' }; static symbol s_6_103[7] = { 0xE1, 's', 's', 'e', 'm', 'o', 's' }; static symbol s_6_104[7] = { 0xEA, 's', 's', 'e', 'm', 'o', 's' }; static symbol s_6_105[7] = { 0xED, 's', 's', 'e', 'm', 'o', 's' }; static symbol s_6_106[4] = { 'i', 'm', 'o', 's' }; static symbol s_6_107[5] = { 'a', 'r', 'm', 'o', 's' }; static symbol s_6_108[5] = { 'e', 'r', 'm', 'o', 's' }; static symbol s_6_109[5] = { 'i', 'r', 'm', 'o', 's' }; static symbol s_6_110[4] = { 0xE1, 'm', 'o', 's' }; static symbol s_6_111[4] = { 'a', 'r', 0xE1, 's' }; static symbol s_6_112[4] = { 'e', 'r', 0xE1, 's' }; static symbol s_6_113[4] = { 'i', 'r', 0xE1, 's' }; static symbol s_6_114[2] = { 'e', 'u' }; static symbol s_6_115[2] = { 'i', 'u' }; static symbol s_6_116[2] = { 'o', 'u' }; static symbol s_6_117[3] = { 'a', 'r', 0xE1 }; static symbol s_6_118[3] = { 'e', 'r', 0xE1 }; static symbol s_6_119[3] = { 'i', 'r', 0xE1 }; static struct among a_6[120] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 3, s_6_1, -1, 1, 0}, /* 2 */ { 2, s_6_2, -1, 1, 0}, /* 3 */ { 4, s_6_3, 2, 1, 0}, /* 4 */ { 4, s_6_4, 2, 1, 0}, /* 5 */ { 4, s_6_5, 2, 1, 0}, /* 6 */ { 3, s_6_6, -1, 1, 0}, /* 7 */ { 3, s_6_7, -1, 1, 0}, /* 8 */ { 3, s_6_8, -1, 1, 0}, /* 9 */ { 3, s_6_9, -1, 1, 0}, /* 10 */ { 4, s_6_10, -1, 1, 0}, /* 11 */ { 4, s_6_11, -1, 1, 0}, /* 12 */ { 4, s_6_12, -1, 1, 0}, /* 13 */ { 4, s_6_13, -1, 1, 0}, /* 14 */ { 4, s_6_14, -1, 1, 0}, /* 15 */ { 4, s_6_15, -1, 1, 0}, /* 16 */ { 2, s_6_16, -1, 1, 0}, /* 17 */ { 4, s_6_17, 16, 1, 0}, /* 18 */ { 4, s_6_18, 16, 1, 0}, /* 19 */ { 4, s_6_19, 16, 1, 0}, /* 20 */ { 2, s_6_20, -1, 1, 0}, /* 21 */ { 3, s_6_21, 20, 1, 0}, /* 22 */ { 5, s_6_22, 21, 1, 0}, /* 23 */ { 5, s_6_23, 21, 1, 0}, /* 24 */ { 5, s_6_24, 21, 1, 0}, /* 25 */ { 4, s_6_25, 20, 1, 0}, /* 26 */ { 4, s_6_26, 20, 1, 0}, /* 27 */ { 4, s_6_27, 20, 1, 0}, /* 28 */ { 4, s_6_28, 20, 1, 0}, /* 29 */ { 2, s_6_29, -1, 1, 0}, /* 30 */ { 4, s_6_30, 29, 1, 0}, /* 31 */ { 4, s_6_31, 29, 1, 0}, /* 32 */ { 4, s_6_32, 29, 1, 0}, /* 33 */ { 5, s_6_33, 29, 1, 0}, /* 34 */ { 5, s_6_34, 29, 1, 0}, /* 35 */ { 5, s_6_35, 29, 1, 0}, /* 36 */ { 3, s_6_36, -1, 1, 0}, /* 37 */ { 3, s_6_37, -1, 1, 0}, /* 38 */ { 4, s_6_38, -1, 1, 0}, /* 39 */ { 4, s_6_39, -1, 1, 0}, /* 40 */ { 4, s_6_40, -1, 1, 0}, /* 41 */ { 5, s_6_41, -1, 1, 0}, /* 42 */ { 5, s_6_42, -1, 1, 0}, /* 43 */ { 5, s_6_43, -1, 1, 0}, /* 44 */ { 2, s_6_44, -1, 1, 0}, /* 45 */ { 2, s_6_45, -1, 1, 0}, /* 46 */ { 2, s_6_46, -1, 1, 0}, /* 47 */ { 2, s_6_47, -1, 1, 0}, /* 48 */ { 4, s_6_48, 47, 1, 0}, /* 49 */ { 4, s_6_49, 47, 1, 0}, /* 50 */ { 3, s_6_50, 47, 1, 0}, /* 51 */ { 5, s_6_51, 50, 1, 0}, /* 52 */ { 5, s_6_52, 50, 1, 0}, /* 53 */ { 5, s_6_53, 50, 1, 0}, /* 54 */ { 4, s_6_54, 47, 1, 0}, /* 55 */ { 4, s_6_55, 47, 1, 0}, /* 56 */ { 4, s_6_56, 47, 1, 0}, /* 57 */ { 4, s_6_57, 47, 1, 0}, /* 58 */ { 2, s_6_58, -1, 1, 0}, /* 59 */ { 5, s_6_59, 58, 1, 0}, /* 60 */ { 5, s_6_60, 58, 1, 0}, /* 61 */ { 5, s_6_61, 58, 1, 0}, /* 62 */ { 4, s_6_62, 58, 1, 0}, /* 63 */ { 4, s_6_63, 58, 1, 0}, /* 64 */ { 4, s_6_64, 58, 1, 0}, /* 65 */ { 5, s_6_65, 58, 1, 0}, /* 66 */ { 5, s_6_66, 58, 1, 0}, /* 67 */ { 5, s_6_67, 58, 1, 0}, /* 68 */ { 5, s_6_68, 58, 1, 0}, /* 69 */ { 5, s_6_69, 58, 1, 0}, /* 70 */ { 5, s_6_70, 58, 1, 0}, /* 71 */ { 2, s_6_71, -1, 1, 0}, /* 72 */ { 3, s_6_72, 71, 1, 0}, /* 73 */ { 3, s_6_73, 71, 1, 0}, /* 74 */ { 5, s_6_74, 73, 1, 0}, /* 75 */ { 5, s_6_75, 73, 1, 0}, /* 76 */ { 5, s_6_76, 73, 1, 0}, /* 77 */ { 5, s_6_77, 73, 1, 0}, /* 78 */ { 5, s_6_78, 73, 1, 0}, /* 79 */ { 5, s_6_79, 73, 1, 0}, /* 80 */ { 6, s_6_80, 73, 1, 0}, /* 81 */ { 6, s_6_81, 73, 1, 0}, /* 82 */ { 6, s_6_82, 73, 1, 0}, /* 83 */ { 5, s_6_83, 73, 1, 0}, /* 84 */ { 4, s_6_84, 73, 1, 0}, /* 85 */ { 6, s_6_85, 84, 1, 0}, /* 86 */ { 6, s_6_86, 84, 1, 0}, /* 87 */ { 6, s_6_87, 84, 1, 0}, /* 88 */ { 4, s_6_88, -1, 1, 0}, /* 89 */ { 4, s_6_89, -1, 1, 0}, /* 90 */ { 4, s_6_90, -1, 1, 0}, /* 91 */ { 6, s_6_91, 90, 1, 0}, /* 92 */ { 6, s_6_92, 90, 1, 0}, /* 93 */ { 6, s_6_93, 90, 1, 0}, /* 94 */ { 6, s_6_94, 90, 1, 0}, /* 95 */ { 5, s_6_95, 90, 1, 0}, /* 96 */ { 7, s_6_96, 95, 1, 0}, /* 97 */ { 7, s_6_97, 95, 1, 0}, /* 98 */ { 7, s_6_98, 95, 1, 0}, /* 99 */ { 4, s_6_99, -1, 1, 0}, /*100 */ { 6, s_6_100, 99, 1, 0}, /*101 */ { 6, s_6_101, 99, 1, 0}, /*102 */ { 6, s_6_102, 99, 1, 0}, /*103 */ { 7, s_6_103, 99, 1, 0}, /*104 */ { 7, s_6_104, 99, 1, 0}, /*105 */ { 7, s_6_105, 99, 1, 0}, /*106 */ { 4, s_6_106, -1, 1, 0}, /*107 */ { 5, s_6_107, -1, 1, 0}, /*108 */ { 5, s_6_108, -1, 1, 0}, /*109 */ { 5, s_6_109, -1, 1, 0}, /*110 */ { 4, s_6_110, -1, 1, 0}, /*111 */ { 4, s_6_111, -1, 1, 0}, /*112 */ { 4, s_6_112, -1, 1, 0}, /*113 */ { 4, s_6_113, -1, 1, 0}, /*114 */ { 2, s_6_114, -1, 1, 0}, /*115 */ { 2, s_6_115, -1, 1, 0}, /*116 */ { 2, s_6_116, -1, 1, 0}, /*117 */ { 3, s_6_117, -1, 1, 0}, /*118 */ { 3, s_6_118, -1, 1, 0}, /*119 */ { 3, s_6_119, -1, 1, 0} }; static symbol s_7_0[1] = { 'a' }; static symbol s_7_1[1] = { 'i' }; static symbol s_7_2[1] = { 'o' }; static symbol s_7_3[2] = { 'o', 's' }; static symbol s_7_4[1] = { 0xE1 }; static symbol s_7_5[1] = { 0xED }; static symbol s_7_6[1] = { 0xF3 }; static struct among a_7[7] = { /* 0 */ { 1, s_7_0, -1, 1, 0}, /* 1 */ { 1, s_7_1, -1, 1, 0}, /* 2 */ { 1, s_7_2, -1, 1, 0}, /* 3 */ { 2, s_7_3, -1, 1, 0}, /* 4 */ { 1, s_7_4, -1, 1, 0}, /* 5 */ { 1, s_7_5, -1, 1, 0}, /* 6 */ { 1, s_7_6, -1, 1, 0} }; static symbol s_8_0[1] = { 'e' }; static symbol s_8_1[1] = { 0xE7 }; static symbol s_8_2[1] = { 0xE9 }; static symbol s_8_3[1] = { 0xEA }; static struct among a_8[4] = { /* 0 */ { 1, s_8_0, -1, 1, 0}, /* 1 */ { 1, s_8_1, -1, 2, 0}, /* 2 */ { 1, s_8_2, -1, 1, 0}, /* 3 */ { 1, s_8_3, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 12, 2 }; static symbol s_0[] = { 'a', '~' }; static symbol s_1[] = { 'o', '~' }; static symbol s_2[] = { 0xE3 }; static symbol s_3[] = { 0xF5 }; static symbol s_4[] = { 'l', 'o', 'g' }; static symbol s_5[] = { 'u' }; static symbol s_6[] = { 'e', 'n', 't', 'e' }; static symbol s_7[] = { 'a', 't' }; static symbol s_8[] = { 'a', 't' }; static symbol s_9[] = { 'e' }; static symbol s_10[] = { 'i', 'r' }; static symbol s_11[] = { 'u' }; static symbol s_12[] = { 'g' }; static symbol s_13[] = { 'i' }; static symbol s_14[] = { 'c' }; static symbol s_15[] = { 'c' }; static symbol s_16[] = { 'i' }; static symbol s_17[] = { 'c' }; static int r_prelude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 36 */ int c = z->c; z->bra = z->c; /* [, line 37 */ among_var = find_among(z, a_0, 3); /* substring, line 37 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 37 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 2, s_0); /* <-, line 38 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 39 */ if (ret < 0) return ret; } break; case 3: if (z->c >= z->l) goto lab0; z->c++; /* next, line 40 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 50 */ { int c = z->c; /* or, line 52 */ if (!(in_grouping(z, g_v, 97, 250))) goto lab2; { int c = z->c; /* or, line 51 */ if (!(out_grouping(z, g_v, 97, 250))) goto lab4; while(1) { /* gopast, line 51 */ if (!(in_grouping(z, g_v, 97, 250))) goto lab5; break; lab5: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 51 */ } goto lab3; lab4: z->c = c; if (!(in_grouping(z, g_v, 97, 250))) goto lab2; while(1) { /* gopast, line 51 */ if (!(out_grouping(z, g_v, 97, 250))) goto lab6; break; lab6: if (z->c >= z->l) goto lab2; z->c++; /* gopast, line 51 */ } } lab3: goto lab1; lab2: z->c = c; if (!(out_grouping(z, g_v, 97, 250))) goto lab0; { int c = z->c; /* or, line 53 */ if (!(out_grouping(z, g_v, 97, 250))) goto lab8; while(1) { /* gopast, line 53 */ if (!(in_grouping(z, g_v, 97, 250))) goto lab9; break; lab9: if (z->c >= z->l) goto lab8; z->c++; /* gopast, line 53 */ } goto lab7; lab8: z->c = c; if (!(in_grouping(z, g_v, 97, 250))) goto lab0; if (z->c >= z->l) goto lab0; z->c++; /* next, line 53 */ } lab7: ; } lab1: z->I[0] = z->c; /* setmark pV, line 54 */ lab0: z->c = c; } { int c = z->c; /* do, line 56 */ while(1) { /* gopast, line 57 */ if (!(in_grouping(z, g_v, 97, 250))) goto lab11; break; lab11: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 57 */ } while(1) { /* gopast, line 57 */ if (!(out_grouping(z, g_v, 97, 250))) goto lab12; break; lab12: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 57 */ } z->I[1] = z->c; /* setmark p1, line 57 */ while(1) { /* gopast, line 58 */ if (!(in_grouping(z, g_v, 97, 250))) goto lab13; break; lab13: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 58 */ } while(1) { /* gopast, line 58 */ if (!(out_grouping(z, g_v, 97, 250))) goto lab14; break; lab14: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 58 */ } z->I[2] = z->c; /* setmark p2, line 58 */ lab10: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 62 */ int c = z->c; z->bra = z->c; /* [, line 63 */ among_var = find_among(z, a_1, 3); /* substring, line 63 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 63 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 64 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 65 */ if (ret < 0) return ret; } break; case 3: if (z->c >= z->l) goto lab0; z->c++; /* next, line 66 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 77 */ among_var = find_among_b(z, a_5, 45); /* substring, line 77 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 77 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 93 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 93 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 98 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_4); /* <-, line 98 */ if (ret < 0) return ret; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 102 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_5); /* <-, line 102 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 106 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_6); /* <-, line 106 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 110 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 110 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 111 */ z->ket = z->c; /* [, line 112 */ among_var = find_among_b(z, a_2, 4); /* substring, line 112 */ if (!(among_var)) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 112 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 112 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 112 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab0; } case 1: z->ket = z->c; /* [, line 113 */ if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 113 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 113 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 113 */ if (ret < 0) return ret; } break; } lab0: ; } break; case 6: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 122 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 122 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 123 */ z->ket = z->c; /* [, line 124 */ among_var = find_among_b(z, a_3, 3); /* substring, line 124 */ if (!(among_var)) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 124 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab1; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 127 */ if (ret < 0) return ret; } break; } lab1: ; } break; case 7: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 134 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 134 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 135 */ z->ket = z->c; /* [, line 136 */ among_var = find_among_b(z, a_4, 3); /* substring, line 136 */ if (!(among_var)) { z->c = z->l - m; goto lab2; } z->bra = z->c; /* ], line 136 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab2; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 139 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 139 */ if (ret < 0) return ret; } break; } lab2: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 146 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 146 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 147 */ z->ket = z->c; /* [, line 148 */ if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 148 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 148 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 148 */ if (ret < 0) return ret; } lab3: ; } break; case 9: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 153 */ if (ret < 0) return ret; } if (!(eq_s_b(z, 1, s_9))) return 0; { int ret; ret = slice_from_s(z, 2, s_10); /* <-, line 154 */ if (ret < 0) return ret; } break; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 159 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 159 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 160 */ among_var = find_among_b(z, a_6, 120); /* substring, line 160 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 160 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_residual_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 184 */ among_var = find_among_b(z, a_7, 7); /* substring, line 184 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 184 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 187 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 187 */ if (ret < 0) return ret; } break; } return 1; } static int r_residual_form(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 192 */ among_var = find_among_b(z, a_8, 4); /* substring, line 192 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 192 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 194 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 194 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 194 */ { int m = z->l - z->c; (void) m; /* or, line 194 */ if (!(eq_s_b(z, 1, s_11))) goto lab1; z->bra = z->c; /* ], line 194 */ { int m_test = z->l - z->c; /* test, line 194 */ if (!(eq_s_b(z, 1, s_12))) goto lab1; z->c = z->l - m_test; } goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_13))) return 0; z->bra = z->c; /* ], line 195 */ { int m_test = z->l - z->c; /* test, line 195 */ if (!(eq_s_b(z, 1, s_14))) return 0; z->c = z->l - m_test; } } lab0: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 195 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 195 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_15); /* <-, line 196 */ if (ret < 0) return ret; } break; } return 1; } extern int portuguese_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 202 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 202 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 203 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 203 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 204 */ { int m = z->l - z->c; (void) m; /* do, line 205 */ { int m = z->l - z->c; (void) m; /* or, line 209 */ { int m = z->l - z->c; (void) m; /* and, line 207 */ { int m = z->l - z->c; (void) m; /* or, line 206 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab6; /* call standard_suffix, line 206 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab4; /* call verb_suffix, line 206 */ if (ret < 0) return ret; } } lab5: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 207 */ z->ket = z->c; /* [, line 207 */ if (!(eq_s_b(z, 1, s_16))) goto lab7; z->bra = z->c; /* ], line 207 */ { int m_test = z->l - z->c; /* test, line 207 */ if (!(eq_s_b(z, 1, s_17))) goto lab7; z->c = z->l - m_test; } { int ret = r_RV(z); if (ret == 0) goto lab7; /* call RV, line 207 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 207 */ if (ret < 0) return ret; } lab7: z->c = z->l - m; } } goto lab3; lab4: z->c = z->l - m; { int ret = r_residual_suffix(z); if (ret == 0) goto lab2; /* call residual_suffix, line 209 */ if (ret < 0) return ret; } } lab3: lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 211 */ { int ret = r_residual_form(z); if (ret == 0) goto lab8; /* call residual_form, line 211 */ if (ret < 0) return ret; } lab8: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 213 */ { int ret = r_postlude(z); if (ret == 0) goto lab9; /* call postlude, line 213 */ if (ret < 0) return ret; } lab9: z->c = c; } return 1; } extern struct SN_env * portuguese_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); } extern void portuguese_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_portuguese.h000066400000000000000000000005211154025176300306670ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * portuguese_ISO_8859_1_create_env(void); extern void portuguese_ISO_8859_1_close_env(struct SN_env * z); extern int portuguese_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_spanish.c000066400000000000000000001152671154025176300301430ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int spanish_ISO_8859_1_stem(struct SN_env * z); static int r_residual_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_y_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_attached_pronoun(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); extern struct SN_env * spanish_ISO_8859_1_create_env(void); extern void spanish_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_1[1] = { 0xE1 }; static symbol s_0_2[1] = { 0xE9 }; static symbol s_0_3[1] = { 0xED }; static symbol s_0_4[1] = { 0xF3 }; static symbol s_0_5[1] = { 0xFA }; static struct among a_0[6] = { /* 0 */ { 0, 0, -1, 6, 0}, /* 1 */ { 1, s_0_1, 0, 1, 0}, /* 2 */ { 1, s_0_2, 0, 2, 0}, /* 3 */ { 1, s_0_3, 0, 3, 0}, /* 4 */ { 1, s_0_4, 0, 4, 0}, /* 5 */ { 1, s_0_5, 0, 5, 0} }; static symbol s_1_0[2] = { 'l', 'a' }; static symbol s_1_1[4] = { 's', 'e', 'l', 'a' }; static symbol s_1_2[2] = { 'l', 'e' }; static symbol s_1_3[2] = { 'm', 'e' }; static symbol s_1_4[2] = { 's', 'e' }; static symbol s_1_5[2] = { 'l', 'o' }; static symbol s_1_6[4] = { 's', 'e', 'l', 'o' }; static symbol s_1_7[3] = { 'l', 'a', 's' }; static symbol s_1_8[5] = { 's', 'e', 'l', 'a', 's' }; static symbol s_1_9[3] = { 'l', 'e', 's' }; static symbol s_1_10[3] = { 'l', 'o', 's' }; static symbol s_1_11[5] = { 's', 'e', 'l', 'o', 's' }; static symbol s_1_12[3] = { 'n', 'o', 's' }; static struct among a_1[13] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 4, s_1_1, 0, -1, 0}, /* 2 */ { 2, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0}, /* 4 */ { 2, s_1_4, -1, -1, 0}, /* 5 */ { 2, s_1_5, -1, -1, 0}, /* 6 */ { 4, s_1_6, 5, -1, 0}, /* 7 */ { 3, s_1_7, -1, -1, 0}, /* 8 */ { 5, s_1_8, 7, -1, 0}, /* 9 */ { 3, s_1_9, -1, -1, 0}, /* 10 */ { 3, s_1_10, -1, -1, 0}, /* 11 */ { 5, s_1_11, 10, -1, 0}, /* 12 */ { 3, s_1_12, -1, -1, 0} }; static symbol s_2_0[4] = { 'a', 'n', 'd', 'o' }; static symbol s_2_1[5] = { 'i', 'e', 'n', 'd', 'o' }; static symbol s_2_2[5] = { 'y', 'e', 'n', 'd', 'o' }; static symbol s_2_3[4] = { 0xE1, 'n', 'd', 'o' }; static symbol s_2_4[5] = { 'i', 0xE9, 'n', 'd', 'o' }; static symbol s_2_5[2] = { 'a', 'r' }; static symbol s_2_6[2] = { 'e', 'r' }; static symbol s_2_7[2] = { 'i', 'r' }; static symbol s_2_8[2] = { 0xE1, 'r' }; static symbol s_2_9[2] = { 0xE9, 'r' }; static symbol s_2_10[2] = { 0xED, 'r' }; static struct among a_2[11] = { /* 0 */ { 4, s_2_0, -1, 6, 0}, /* 1 */ { 5, s_2_1, -1, 6, 0}, /* 2 */ { 5, s_2_2, -1, 7, 0}, /* 3 */ { 4, s_2_3, -1, 2, 0}, /* 4 */ { 5, s_2_4, -1, 1, 0}, /* 5 */ { 2, s_2_5, -1, 6, 0}, /* 6 */ { 2, s_2_6, -1, 6, 0}, /* 7 */ { 2, s_2_7, -1, 6, 0}, /* 8 */ { 2, s_2_8, -1, 3, 0}, /* 9 */ { 2, s_2_9, -1, 4, 0}, /* 10 */ { 2, s_2_10, -1, 5, 0} }; static symbol s_3_0[2] = { 'i', 'c' }; static symbol s_3_1[2] = { 'a', 'd' }; static symbol s_3_2[2] = { 'o', 's' }; static symbol s_3_3[2] = { 'i', 'v' }; static struct among a_3[4] = { /* 0 */ { 2, s_3_0, -1, -1, 0}, /* 1 */ { 2, s_3_1, -1, -1, 0}, /* 2 */ { 2, s_3_2, -1, -1, 0}, /* 3 */ { 2, s_3_3, -1, 1, 0} }; static symbol s_4_0[4] = { 'a', 'b', 'l', 'e' }; static symbol s_4_1[4] = { 'i', 'b', 'l', 'e' }; static symbol s_4_2[4] = { 'a', 'n', 't', 'e' }; static struct among a_4[3] = { /* 0 */ { 4, s_4_0, -1, 1, 0}, /* 1 */ { 4, s_4_1, -1, 1, 0}, /* 2 */ { 4, s_4_2, -1, 1, 0} }; static symbol s_5_0[2] = { 'i', 'c' }; static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_5_2[2] = { 'i', 'v' }; static struct among a_5[3] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 2, s_5_2, -1, 1, 0} }; static symbol s_6_0[3] = { 'i', 'c', 'a' }; static symbol s_6_1[5] = { 'a', 'n', 'c', 'i', 'a' }; static symbol s_6_2[5] = { 'e', 'n', 'c', 'i', 'a' }; static symbol s_6_3[5] = { 'a', 'd', 'o', 'r', 'a' }; static symbol s_6_4[3] = { 'o', 's', 'a' }; static symbol s_6_5[4] = { 'i', 's', 't', 'a' }; static symbol s_6_6[3] = { 'i', 'v', 'a' }; static symbol s_6_7[4] = { 'a', 'n', 'z', 'a' }; static symbol s_6_8[5] = { 'l', 'o', 'g', 0xED, 'a' }; static symbol s_6_9[4] = { 'i', 'd', 'a', 'd' }; static symbol s_6_10[4] = { 'a', 'b', 'l', 'e' }; static symbol s_6_11[4] = { 'i', 'b', 'l', 'e' }; static symbol s_6_12[4] = { 'a', 'n', 't', 'e' }; static symbol s_6_13[5] = { 'm', 'e', 'n', 't', 'e' }; static symbol s_6_14[6] = { 'a', 'm', 'e', 'n', 't', 'e' }; static symbol s_6_15[5] = { 'a', 'c', 'i', 0xF3, 'n' }; static symbol s_6_16[5] = { 'u', 'c', 'i', 0xF3, 'n' }; static symbol s_6_17[3] = { 'i', 'c', 'o' }; static symbol s_6_18[4] = { 'i', 's', 'm', 'o' }; static symbol s_6_19[3] = { 'o', 's', 'o' }; static symbol s_6_20[7] = { 'a', 'm', 'i', 'e', 'n', 't', 'o' }; static symbol s_6_21[7] = { 'i', 'm', 'i', 'e', 'n', 't', 'o' }; static symbol s_6_22[3] = { 'i', 'v', 'o' }; static symbol s_6_23[4] = { 'a', 'd', 'o', 'r' }; static symbol s_6_24[4] = { 'i', 'c', 'a', 's' }; static symbol s_6_25[6] = { 'a', 'n', 'c', 'i', 'a', 's' }; static symbol s_6_26[6] = { 'e', 'n', 'c', 'i', 'a', 's' }; static symbol s_6_27[6] = { 'a', 'd', 'o', 'r', 'a', 's' }; static symbol s_6_28[4] = { 'o', 's', 'a', 's' }; static symbol s_6_29[5] = { 'i', 's', 't', 'a', 's' }; static symbol s_6_30[4] = { 'i', 'v', 'a', 's' }; static symbol s_6_31[5] = { 'a', 'n', 'z', 'a', 's' }; static symbol s_6_32[6] = { 'l', 'o', 'g', 0xED, 'a', 's' }; static symbol s_6_33[6] = { 'i', 'd', 'a', 'd', 'e', 's' }; static symbol s_6_34[5] = { 'a', 'b', 'l', 'e', 's' }; static symbol s_6_35[5] = { 'i', 'b', 'l', 'e', 's' }; static symbol s_6_36[7] = { 'a', 'c', 'i', 'o', 'n', 'e', 's' }; static symbol s_6_37[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' }; static symbol s_6_38[6] = { 'a', 'd', 'o', 'r', 'e', 's' }; static symbol s_6_39[5] = { 'a', 'n', 't', 'e', 's' }; static symbol s_6_40[4] = { 'i', 'c', 'o', 's' }; static symbol s_6_41[5] = { 'i', 's', 'm', 'o', 's' }; static symbol s_6_42[4] = { 'o', 's', 'o', 's' }; static symbol s_6_43[8] = { 'a', 'm', 'i', 'e', 'n', 't', 'o', 's' }; static symbol s_6_44[8] = { 'i', 'm', 'i', 'e', 'n', 't', 'o', 's' }; static symbol s_6_45[4] = { 'i', 'v', 'o', 's' }; static struct among a_6[46] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 5, s_6_1, -1, 2, 0}, /* 2 */ { 5, s_6_2, -1, 5, 0}, /* 3 */ { 5, s_6_3, -1, 2, 0}, /* 4 */ { 3, s_6_4, -1, 1, 0}, /* 5 */ { 4, s_6_5, -1, 1, 0}, /* 6 */ { 3, s_6_6, -1, 9, 0}, /* 7 */ { 4, s_6_7, -1, 1, 0}, /* 8 */ { 5, s_6_8, -1, 3, 0}, /* 9 */ { 4, s_6_9, -1, 8, 0}, /* 10 */ { 4, s_6_10, -1, 1, 0}, /* 11 */ { 4, s_6_11, -1, 1, 0}, /* 12 */ { 4, s_6_12, -1, 2, 0}, /* 13 */ { 5, s_6_13, -1, 7, 0}, /* 14 */ { 6, s_6_14, 13, 6, 0}, /* 15 */ { 5, s_6_15, -1, 2, 0}, /* 16 */ { 5, s_6_16, -1, 4, 0}, /* 17 */ { 3, s_6_17, -1, 1, 0}, /* 18 */ { 4, s_6_18, -1, 1, 0}, /* 19 */ { 3, s_6_19, -1, 1, 0}, /* 20 */ { 7, s_6_20, -1, 1, 0}, /* 21 */ { 7, s_6_21, -1, 1, 0}, /* 22 */ { 3, s_6_22, -1, 9, 0}, /* 23 */ { 4, s_6_23, -1, 2, 0}, /* 24 */ { 4, s_6_24, -1, 1, 0}, /* 25 */ { 6, s_6_25, -1, 2, 0}, /* 26 */ { 6, s_6_26, -1, 5, 0}, /* 27 */ { 6, s_6_27, -1, 2, 0}, /* 28 */ { 4, s_6_28, -1, 1, 0}, /* 29 */ { 5, s_6_29, -1, 1, 0}, /* 30 */ { 4, s_6_30, -1, 9, 0}, /* 31 */ { 5, s_6_31, -1, 1, 0}, /* 32 */ { 6, s_6_32, -1, 3, 0}, /* 33 */ { 6, s_6_33, -1, 8, 0}, /* 34 */ { 5, s_6_34, -1, 1, 0}, /* 35 */ { 5, s_6_35, -1, 1, 0}, /* 36 */ { 7, s_6_36, -1, 2, 0}, /* 37 */ { 7, s_6_37, -1, 4, 0}, /* 38 */ { 6, s_6_38, -1, 2, 0}, /* 39 */ { 5, s_6_39, -1, 2, 0}, /* 40 */ { 4, s_6_40, -1, 1, 0}, /* 41 */ { 5, s_6_41, -1, 1, 0}, /* 42 */ { 4, s_6_42, -1, 1, 0}, /* 43 */ { 8, s_6_43, -1, 1, 0}, /* 44 */ { 8, s_6_44, -1, 1, 0}, /* 45 */ { 4, s_6_45, -1, 9, 0} }; static symbol s_7_0[2] = { 'y', 'a' }; static symbol s_7_1[2] = { 'y', 'e' }; static symbol s_7_2[3] = { 'y', 'a', 'n' }; static symbol s_7_3[3] = { 'y', 'e', 'n' }; static symbol s_7_4[5] = { 'y', 'e', 'r', 'o', 'n' }; static symbol s_7_5[5] = { 'y', 'e', 'n', 'd', 'o' }; static symbol s_7_6[2] = { 'y', 'o' }; static symbol s_7_7[3] = { 'y', 'a', 's' }; static symbol s_7_8[3] = { 'y', 'e', 's' }; static symbol s_7_9[4] = { 'y', 'a', 'i', 's' }; static symbol s_7_10[5] = { 'y', 'a', 'm', 'o', 's' }; static symbol s_7_11[2] = { 'y', 0xF3 }; static struct among a_7[12] = { /* 0 */ { 2, s_7_0, -1, 1, 0}, /* 1 */ { 2, s_7_1, -1, 1, 0}, /* 2 */ { 3, s_7_2, -1, 1, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0}, /* 4 */ { 5, s_7_4, -1, 1, 0}, /* 5 */ { 5, s_7_5, -1, 1, 0}, /* 6 */ { 2, s_7_6, -1, 1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 3, s_7_8, -1, 1, 0}, /* 9 */ { 4, s_7_9, -1, 1, 0}, /* 10 */ { 5, s_7_10, -1, 1, 0}, /* 11 */ { 2, s_7_11, -1, 1, 0} }; static symbol s_8_0[3] = { 'a', 'b', 'a' }; static symbol s_8_1[3] = { 'a', 'd', 'a' }; static symbol s_8_2[3] = { 'i', 'd', 'a' }; static symbol s_8_3[3] = { 'a', 'r', 'a' }; static symbol s_8_4[4] = { 'i', 'e', 'r', 'a' }; static symbol s_8_5[2] = { 0xED, 'a' }; static symbol s_8_6[4] = { 'a', 'r', 0xED, 'a' }; static symbol s_8_7[4] = { 'e', 'r', 0xED, 'a' }; static symbol s_8_8[4] = { 'i', 'r', 0xED, 'a' }; static symbol s_8_9[2] = { 'a', 'd' }; static symbol s_8_10[2] = { 'e', 'd' }; static symbol s_8_11[2] = { 'i', 'd' }; static symbol s_8_12[3] = { 'a', 's', 'e' }; static symbol s_8_13[4] = { 'i', 'e', 's', 'e' }; static symbol s_8_14[4] = { 'a', 's', 't', 'e' }; static symbol s_8_15[4] = { 'i', 's', 't', 'e' }; static symbol s_8_16[2] = { 'a', 'n' }; static symbol s_8_17[4] = { 'a', 'b', 'a', 'n' }; static symbol s_8_18[4] = { 'a', 'r', 'a', 'n' }; static symbol s_8_19[5] = { 'i', 'e', 'r', 'a', 'n' }; static symbol s_8_20[3] = { 0xED, 'a', 'n' }; static symbol s_8_21[5] = { 'a', 'r', 0xED, 'a', 'n' }; static symbol s_8_22[5] = { 'e', 'r', 0xED, 'a', 'n' }; static symbol s_8_23[5] = { 'i', 'r', 0xED, 'a', 'n' }; static symbol s_8_24[2] = { 'e', 'n' }; static symbol s_8_25[4] = { 'a', 's', 'e', 'n' }; static symbol s_8_26[5] = { 'i', 'e', 's', 'e', 'n' }; static symbol s_8_27[4] = { 'a', 'r', 'o', 'n' }; static symbol s_8_28[5] = { 'i', 'e', 'r', 'o', 'n' }; static symbol s_8_29[4] = { 'a', 'r', 0xE1, 'n' }; static symbol s_8_30[4] = { 'e', 'r', 0xE1, 'n' }; static symbol s_8_31[4] = { 'i', 'r', 0xE1, 'n' }; static symbol s_8_32[3] = { 'a', 'd', 'o' }; static symbol s_8_33[3] = { 'i', 'd', 'o' }; static symbol s_8_34[4] = { 'a', 'n', 'd', 'o' }; static symbol s_8_35[5] = { 'i', 'e', 'n', 'd', 'o' }; static symbol s_8_36[2] = { 'a', 'r' }; static symbol s_8_37[2] = { 'e', 'r' }; static symbol s_8_38[2] = { 'i', 'r' }; static symbol s_8_39[2] = { 'a', 's' }; static symbol s_8_40[4] = { 'a', 'b', 'a', 's' }; static symbol s_8_41[4] = { 'a', 'd', 'a', 's' }; static symbol s_8_42[4] = { 'i', 'd', 'a', 's' }; static symbol s_8_43[4] = { 'a', 'r', 'a', 's' }; static symbol s_8_44[5] = { 'i', 'e', 'r', 'a', 's' }; static symbol s_8_45[3] = { 0xED, 'a', 's' }; static symbol s_8_46[5] = { 'a', 'r', 0xED, 'a', 's' }; static symbol s_8_47[5] = { 'e', 'r', 0xED, 'a', 's' }; static symbol s_8_48[5] = { 'i', 'r', 0xED, 'a', 's' }; static symbol s_8_49[2] = { 'e', 's' }; static symbol s_8_50[4] = { 'a', 's', 'e', 's' }; static symbol s_8_51[5] = { 'i', 'e', 's', 'e', 's' }; static symbol s_8_52[5] = { 'a', 'b', 'a', 'i', 's' }; static symbol s_8_53[5] = { 'a', 'r', 'a', 'i', 's' }; static symbol s_8_54[6] = { 'i', 'e', 'r', 'a', 'i', 's' }; static symbol s_8_55[4] = { 0xED, 'a', 'i', 's' }; static symbol s_8_56[6] = { 'a', 'r', 0xED, 'a', 'i', 's' }; static symbol s_8_57[6] = { 'e', 'r', 0xED, 'a', 'i', 's' }; static symbol s_8_58[6] = { 'i', 'r', 0xED, 'a', 'i', 's' }; static symbol s_8_59[5] = { 'a', 's', 'e', 'i', 's' }; static symbol s_8_60[6] = { 'i', 'e', 's', 'e', 'i', 's' }; static symbol s_8_61[6] = { 'a', 's', 't', 'e', 'i', 's' }; static symbol s_8_62[6] = { 'i', 's', 't', 'e', 'i', 's' }; static symbol s_8_63[3] = { 0xE1, 'i', 's' }; static symbol s_8_64[3] = { 0xE9, 'i', 's' }; static symbol s_8_65[5] = { 'a', 'r', 0xE9, 'i', 's' }; static symbol s_8_66[5] = { 'e', 'r', 0xE9, 'i', 's' }; static symbol s_8_67[5] = { 'i', 'r', 0xE9, 'i', 's' }; static symbol s_8_68[4] = { 'a', 'd', 'o', 's' }; static symbol s_8_69[4] = { 'i', 'd', 'o', 's' }; static symbol s_8_70[4] = { 'a', 'm', 'o', 's' }; static symbol s_8_71[6] = { 0xE1, 'b', 'a', 'm', 'o', 's' }; static symbol s_8_72[6] = { 0xE1, 'r', 'a', 'm', 'o', 's' }; static symbol s_8_73[7] = { 'i', 0xE9, 'r', 'a', 'm', 'o', 's' }; static symbol s_8_74[5] = { 0xED, 'a', 'm', 'o', 's' }; static symbol s_8_75[7] = { 'a', 'r', 0xED, 'a', 'm', 'o', 's' }; static symbol s_8_76[7] = { 'e', 'r', 0xED, 'a', 'm', 'o', 's' }; static symbol s_8_77[7] = { 'i', 'r', 0xED, 'a', 'm', 'o', 's' }; static symbol s_8_78[4] = { 'e', 'm', 'o', 's' }; static symbol s_8_79[6] = { 'a', 'r', 'e', 'm', 'o', 's' }; static symbol s_8_80[6] = { 'e', 'r', 'e', 'm', 'o', 's' }; static symbol s_8_81[6] = { 'i', 'r', 'e', 'm', 'o', 's' }; static symbol s_8_82[6] = { 0xE1, 's', 'e', 'm', 'o', 's' }; static symbol s_8_83[7] = { 'i', 0xE9, 's', 'e', 'm', 'o', 's' }; static symbol s_8_84[4] = { 'i', 'm', 'o', 's' }; static symbol s_8_85[4] = { 'a', 'r', 0xE1, 's' }; static symbol s_8_86[4] = { 'e', 'r', 0xE1, 's' }; static symbol s_8_87[4] = { 'i', 'r', 0xE1, 's' }; static symbol s_8_88[2] = { 0xED, 's' }; static symbol s_8_89[3] = { 'a', 'r', 0xE1 }; static symbol s_8_90[3] = { 'e', 'r', 0xE1 }; static symbol s_8_91[3] = { 'i', 'r', 0xE1 }; static symbol s_8_92[3] = { 'a', 'r', 0xE9 }; static symbol s_8_93[3] = { 'e', 'r', 0xE9 }; static symbol s_8_94[3] = { 'i', 'r', 0xE9 }; static symbol s_8_95[2] = { 'i', 0xF3 }; static struct among a_8[96] = { /* 0 */ { 3, s_8_0, -1, 2, 0}, /* 1 */ { 3, s_8_1, -1, 2, 0}, /* 2 */ { 3, s_8_2, -1, 2, 0}, /* 3 */ { 3, s_8_3, -1, 2, 0}, /* 4 */ { 4, s_8_4, -1, 2, 0}, /* 5 */ { 2, s_8_5, -1, 2, 0}, /* 6 */ { 4, s_8_6, 5, 2, 0}, /* 7 */ { 4, s_8_7, 5, 2, 0}, /* 8 */ { 4, s_8_8, 5, 2, 0}, /* 9 */ { 2, s_8_9, -1, 2, 0}, /* 10 */ { 2, s_8_10, -1, 2, 0}, /* 11 */ { 2, s_8_11, -1, 2, 0}, /* 12 */ { 3, s_8_12, -1, 2, 0}, /* 13 */ { 4, s_8_13, -1, 2, 0}, /* 14 */ { 4, s_8_14, -1, 2, 0}, /* 15 */ { 4, s_8_15, -1, 2, 0}, /* 16 */ { 2, s_8_16, -1, 2, 0}, /* 17 */ { 4, s_8_17, 16, 2, 0}, /* 18 */ { 4, s_8_18, 16, 2, 0}, /* 19 */ { 5, s_8_19, 16, 2, 0}, /* 20 */ { 3, s_8_20, 16, 2, 0}, /* 21 */ { 5, s_8_21, 20, 2, 0}, /* 22 */ { 5, s_8_22, 20, 2, 0}, /* 23 */ { 5, s_8_23, 20, 2, 0}, /* 24 */ { 2, s_8_24, -1, 1, 0}, /* 25 */ { 4, s_8_25, 24, 2, 0}, /* 26 */ { 5, s_8_26, 24, 2, 0}, /* 27 */ { 4, s_8_27, -1, 2, 0}, /* 28 */ { 5, s_8_28, -1, 2, 0}, /* 29 */ { 4, s_8_29, -1, 2, 0}, /* 30 */ { 4, s_8_30, -1, 2, 0}, /* 31 */ { 4, s_8_31, -1, 2, 0}, /* 32 */ { 3, s_8_32, -1, 2, 0}, /* 33 */ { 3, s_8_33, -1, 2, 0}, /* 34 */ { 4, s_8_34, -1, 2, 0}, /* 35 */ { 5, s_8_35, -1, 2, 0}, /* 36 */ { 2, s_8_36, -1, 2, 0}, /* 37 */ { 2, s_8_37, -1, 2, 0}, /* 38 */ { 2, s_8_38, -1, 2, 0}, /* 39 */ { 2, s_8_39, -1, 2, 0}, /* 40 */ { 4, s_8_40, 39, 2, 0}, /* 41 */ { 4, s_8_41, 39, 2, 0}, /* 42 */ { 4, s_8_42, 39, 2, 0}, /* 43 */ { 4, s_8_43, 39, 2, 0}, /* 44 */ { 5, s_8_44, 39, 2, 0}, /* 45 */ { 3, s_8_45, 39, 2, 0}, /* 46 */ { 5, s_8_46, 45, 2, 0}, /* 47 */ { 5, s_8_47, 45, 2, 0}, /* 48 */ { 5, s_8_48, 45, 2, 0}, /* 49 */ { 2, s_8_49, -1, 1, 0}, /* 50 */ { 4, s_8_50, 49, 2, 0}, /* 51 */ { 5, s_8_51, 49, 2, 0}, /* 52 */ { 5, s_8_52, -1, 2, 0}, /* 53 */ { 5, s_8_53, -1, 2, 0}, /* 54 */ { 6, s_8_54, -1, 2, 0}, /* 55 */ { 4, s_8_55, -1, 2, 0}, /* 56 */ { 6, s_8_56, 55, 2, 0}, /* 57 */ { 6, s_8_57, 55, 2, 0}, /* 58 */ { 6, s_8_58, 55, 2, 0}, /* 59 */ { 5, s_8_59, -1, 2, 0}, /* 60 */ { 6, s_8_60, -1, 2, 0}, /* 61 */ { 6, s_8_61, -1, 2, 0}, /* 62 */ { 6, s_8_62, -1, 2, 0}, /* 63 */ { 3, s_8_63, -1, 2, 0}, /* 64 */ { 3, s_8_64, -1, 1, 0}, /* 65 */ { 5, s_8_65, 64, 2, 0}, /* 66 */ { 5, s_8_66, 64, 2, 0}, /* 67 */ { 5, s_8_67, 64, 2, 0}, /* 68 */ { 4, s_8_68, -1, 2, 0}, /* 69 */ { 4, s_8_69, -1, 2, 0}, /* 70 */ { 4, s_8_70, -1, 2, 0}, /* 71 */ { 6, s_8_71, 70, 2, 0}, /* 72 */ { 6, s_8_72, 70, 2, 0}, /* 73 */ { 7, s_8_73, 70, 2, 0}, /* 74 */ { 5, s_8_74, 70, 2, 0}, /* 75 */ { 7, s_8_75, 74, 2, 0}, /* 76 */ { 7, s_8_76, 74, 2, 0}, /* 77 */ { 7, s_8_77, 74, 2, 0}, /* 78 */ { 4, s_8_78, -1, 1, 0}, /* 79 */ { 6, s_8_79, 78, 2, 0}, /* 80 */ { 6, s_8_80, 78, 2, 0}, /* 81 */ { 6, s_8_81, 78, 2, 0}, /* 82 */ { 6, s_8_82, 78, 2, 0}, /* 83 */ { 7, s_8_83, 78, 2, 0}, /* 84 */ { 4, s_8_84, -1, 2, 0}, /* 85 */ { 4, s_8_85, -1, 2, 0}, /* 86 */ { 4, s_8_86, -1, 2, 0}, /* 87 */ { 4, s_8_87, -1, 2, 0}, /* 88 */ { 2, s_8_88, -1, 2, 0}, /* 89 */ { 3, s_8_89, -1, 2, 0}, /* 90 */ { 3, s_8_90, -1, 2, 0}, /* 91 */ { 3, s_8_91, -1, 2, 0}, /* 92 */ { 3, s_8_92, -1, 2, 0}, /* 93 */ { 3, s_8_93, -1, 2, 0}, /* 94 */ { 3, s_8_94, -1, 2, 0}, /* 95 */ { 2, s_8_95, -1, 2, 0} }; static symbol s_9_0[1] = { 'a' }; static symbol s_9_1[1] = { 'e' }; static symbol s_9_2[1] = { 'o' }; static symbol s_9_3[2] = { 'o', 's' }; static symbol s_9_4[1] = { 0xE1 }; static symbol s_9_5[1] = { 0xE9 }; static symbol s_9_6[1] = { 0xED }; static symbol s_9_7[1] = { 0xF3 }; static struct among a_9[8] = { /* 0 */ { 1, s_9_0, -1, 1, 0}, /* 1 */ { 1, s_9_1, -1, 2, 0}, /* 2 */ { 1, s_9_2, -1, 1, 0}, /* 3 */ { 2, s_9_3, -1, 1, 0}, /* 4 */ { 1, s_9_4, -1, 1, 0}, /* 5 */ { 1, s_9_5, -1, 2, 0}, /* 6 */ { 1, s_9_6, -1, 1, 0}, /* 7 */ { 1, s_9_7, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 10 }; static symbol s_0[] = { 'a' }; static symbol s_1[] = { 'e' }; static symbol s_2[] = { 'i' }; static symbol s_3[] = { 'o' }; static symbol s_4[] = { 'u' }; static symbol s_5[] = { 'i', 'e', 'n', 'd', 'o' }; static symbol s_6[] = { 'a', 'n', 'd', 'o' }; static symbol s_7[] = { 'a', 'r' }; static symbol s_8[] = { 'e', 'r' }; static symbol s_9[] = { 'i', 'r' }; static symbol s_10[] = { 'u' }; static symbol s_11[] = { 'i', 'c' }; static symbol s_12[] = { 'l', 'o', 'g' }; static symbol s_13[] = { 'u' }; static symbol s_14[] = { 'e', 'n', 't', 'e' }; static symbol s_15[] = { 'a', 't' }; static symbol s_16[] = { 'a', 't' }; static symbol s_17[] = { 'u' }; static symbol s_18[] = { 'u' }; static symbol s_19[] = { 'g' }; static symbol s_20[] = { 'u' }; static symbol s_21[] = { 'g' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 37 */ { int c = z->c; /* or, line 39 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab2; { int c = z->c; /* or, line 38 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab4; while(1) { /* gopast, line 38 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab5; break; lab5: if (z->c >= z->l) goto lab4; z->c++; /* gopast, line 38 */ } goto lab3; lab4: z->c = c; if (!(in_grouping(z, g_v, 97, 252))) goto lab2; while(1) { /* gopast, line 38 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab6; break; lab6: if (z->c >= z->l) goto lab2; z->c++; /* gopast, line 38 */ } } lab3: goto lab1; lab2: z->c = c; if (!(out_grouping(z, g_v, 97, 252))) goto lab0; { int c = z->c; /* or, line 40 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab8; while(1) { /* gopast, line 40 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab9; break; lab9: if (z->c >= z->l) goto lab8; z->c++; /* gopast, line 40 */ } goto lab7; lab8: z->c = c; if (!(in_grouping(z, g_v, 97, 252))) goto lab0; if (z->c >= z->l) goto lab0; z->c++; /* next, line 40 */ } lab7: ; } lab1: z->I[0] = z->c; /* setmark pV, line 41 */ lab0: z->c = c; } { int c = z->c; /* do, line 43 */ while(1) { /* gopast, line 44 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab11; break; lab11: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 44 */ } while(1) { /* gopast, line 44 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab12; break; lab12: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 44 */ } z->I[1] = z->c; /* setmark p1, line 44 */ while(1) { /* gopast, line 45 */ if (!(in_grouping(z, g_v, 97, 252))) goto lab13; break; lab13: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 45 */ } while(1) { /* gopast, line 45 */ if (!(out_grouping(z, g_v, 97, 252))) goto lab14; break; lab14: if (z->c >= z->l) goto lab10; z->c++; /* gopast, line 45 */ } z->I[2] = z->c; /* setmark p2, line 45 */ lab10: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 49 */ int c = z->c; z->bra = z->c; /* [, line 50 */ among_var = find_among(z, a_0, 6); /* substring, line 50 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 50 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_0); /* <-, line 51 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 52 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 53 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 54 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 55 */ if (ret < 0) return ret; } break; case 6: if (z->c >= z->l) goto lab0; z->c++; /* next, line 57 */ break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_attached_pronoun(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 68 */ if (!(find_among_b(z, a_1, 13))) return 0; /* substring, line 68 */ z->bra = z->c; /* ], line 68 */ among_var = find_among_b(z, a_2, 11); /* substring, line 72 */ if (!(among_var)) return 0; { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 72 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: z->bra = z->c; /* ], line 73 */ { int ret; ret = slice_from_s(z, 5, s_5); /* <-, line 73 */ if (ret < 0) return ret; } break; case 2: z->bra = z->c; /* ], line 74 */ { int ret; ret = slice_from_s(z, 4, s_6); /* <-, line 74 */ if (ret < 0) return ret; } break; case 3: z->bra = z->c; /* ], line 75 */ { int ret; ret = slice_from_s(z, 2, s_7); /* <-, line 75 */ if (ret < 0) return ret; } break; case 4: z->bra = z->c; /* ], line 76 */ { int ret; ret = slice_from_s(z, 2, s_8); /* <-, line 76 */ if (ret < 0) return ret; } break; case 5: z->bra = z->c; /* ], line 77 */ { int ret; ret = slice_from_s(z, 2, s_9); /* <-, line 77 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_del(z); /* delete, line 81 */ if (ret < 0) return ret; } break; case 7: if (!(eq_s_b(z, 1, s_10))) return 0; { int ret; ret = slice_del(z); /* delete, line 82 */ if (ret < 0) return ret; } break; } return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 87 */ among_var = find_among_b(z, a_6, 46); /* substring, line 87 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 87 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 99 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 99 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 105 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 105 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 106 */ z->ket = z->c; /* [, line 106 */ if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 106 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 106 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 106 */ if (ret < 0) return ret; } lab0: ; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 111 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_12); /* <-, line 111 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 115 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 115 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 119 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_14); /* <-, line 119 */ if (ret < 0) return ret; } break; case 6: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 123 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 123 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 124 */ z->ket = z->c; /* [, line 125 */ among_var = find_among_b(z, a_3, 4); /* substring, line 125 */ if (!(among_var)) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 125 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 125 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 125 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab1; } case 1: z->ket = z->c; /* [, line 126 */ if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 126 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 126 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 126 */ if (ret < 0) return ret; } break; } lab1: ; } break; case 7: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 135 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 135 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 136 */ z->ket = z->c; /* [, line 137 */ among_var = find_among_b(z, a_4, 3); /* substring, line 137 */ if (!(among_var)) { z->c = z->l - m; goto lab2; } z->bra = z->c; /* ], line 137 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab2; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 140 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 140 */ if (ret < 0) return ret; } break; } lab2: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 147 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 147 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 148 */ z->ket = z->c; /* [, line 149 */ among_var = find_among_b(z, a_5, 3); /* substring, line 149 */ if (!(among_var)) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 149 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab3; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 152 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 152 */ if (ret < 0) return ret; } break; } lab3: ; } break; case 9: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 159 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 159 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 160 */ z->ket = z->c; /* [, line 161 */ if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m; goto lab4; } z->bra = z->c; /* ], line 161 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab4; } /* call R2, line 161 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 161 */ if (ret < 0) return ret; } lab4: ; } break; } return 1; } static int r_y_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 168 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 168 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 168 */ among_var = find_among_b(z, a_7, 12); /* substring, line 168 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 168 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: if (!(eq_s_b(z, 1, s_17))) return 0; { int ret; ret = slice_del(z); /* delete, line 171 */ if (ret < 0) return ret; } break; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 176 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 176 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 176 */ among_var = find_among_b(z, a_8, 96); /* substring, line 176 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 176 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* try, line 179 */ if (!(eq_s_b(z, 1, s_18))) { z->c = z->l - m; goto lab0; } { int m_test = z->l - z->c; /* test, line 179 */ if (!(eq_s_b(z, 1, s_19))) { z->c = z->l - m; goto lab0; } z->c = z->l - m_test; } lab0: ; } z->bra = z->c; /* ], line 179 */ { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 200 */ if (ret < 0) return ret; } break; } return 1; } static int r_residual_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 205 */ among_var = find_among_b(z, a_9, 8); /* substring, line 205 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 205 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 208 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 208 */ if (ret < 0) return ret; } break; case 2: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 210 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 210 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 210 */ z->ket = z->c; /* [, line 210 */ if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 210 */ { int m_test = z->l - z->c; /* test, line 210 */ if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab0; } z->c = z->l - m_test; } { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 210 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 210 */ if (ret < 0) return ret; } lab0: ; } break; } return 1; } extern int spanish_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 216 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 216 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 217 */ { int m = z->l - z->c; (void) m; /* do, line 218 */ { int ret = r_attached_pronoun(z); if (ret == 0) goto lab1; /* call attached_pronoun, line 218 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 219 */ { int m = z->l - z->c; (void) m; /* or, line 219 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab4; /* call standard_suffix, line 219 */ if (ret < 0) return ret; } goto lab3; lab4: z->c = z->l - m; { int ret = r_y_verb_suffix(z); if (ret == 0) goto lab5; /* call y_verb_suffix, line 220 */ if (ret < 0) return ret; } goto lab3; lab5: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab2; /* call verb_suffix, line 221 */ if (ret < 0) return ret; } } lab3: lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 223 */ { int ret = r_residual_suffix(z); if (ret == 0) goto lab6; /* call residual_suffix, line 223 */ if (ret < 0) return ret; } lab6: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 225 */ { int ret = r_postlude(z); if (ret == 0) goto lab7; /* call postlude, line 225 */ if (ret < 0) return ret; } lab7: z->c = c; } return 1; } extern struct SN_env * spanish_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); } extern void spanish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_spanish.h000066400000000000000000000005101154025176300301300ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * spanish_ISO_8859_1_create_env(void); extern void spanish_ISO_8859_1_close_env(struct SN_env * z); extern int spanish_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_swedish.c000066400000000000000000000233751154025176300301420ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int swedish_ISO_8859_1_stem(struct SN_env * z); static int r_other_suffix(struct SN_env * z); static int r_consonant_pair(struct SN_env * z); static int r_main_suffix(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * swedish_ISO_8859_1_create_env(void); extern void swedish_ISO_8859_1_close_env(struct SN_env * z); static symbol s_0_0[1] = { 'a' }; static symbol s_0_1[4] = { 'a', 'r', 'n', 'a' }; static symbol s_0_2[4] = { 'e', 'r', 'n', 'a' }; static symbol s_0_3[7] = { 'h', 'e', 't', 'e', 'r', 'n', 'a' }; static symbol s_0_4[4] = { 'o', 'r', 'n', 'a' }; static symbol s_0_5[2] = { 'a', 'd' }; static symbol s_0_6[1] = { 'e' }; static symbol s_0_7[3] = { 'a', 'd', 'e' }; static symbol s_0_8[4] = { 'a', 'n', 'd', 'e' }; static symbol s_0_9[4] = { 'a', 'r', 'n', 'e' }; static symbol s_0_10[3] = { 'a', 'r', 'e' }; static symbol s_0_11[4] = { 'a', 's', 't', 'e' }; static symbol s_0_12[2] = { 'e', 'n' }; static symbol s_0_13[5] = { 'a', 'n', 'd', 'e', 'n' }; static symbol s_0_14[4] = { 'a', 'r', 'e', 'n' }; static symbol s_0_15[5] = { 'h', 'e', 't', 'e', 'n' }; static symbol s_0_16[3] = { 'e', 'r', 'n' }; static symbol s_0_17[2] = { 'a', 'r' }; static symbol s_0_18[2] = { 'e', 'r' }; static symbol s_0_19[5] = { 'h', 'e', 't', 'e', 'r' }; static symbol s_0_20[2] = { 'o', 'r' }; static symbol s_0_21[1] = { 's' }; static symbol s_0_22[2] = { 'a', 's' }; static symbol s_0_23[5] = { 'a', 'r', 'n', 'a', 's' }; static symbol s_0_24[5] = { 'e', 'r', 'n', 'a', 's' }; static symbol s_0_25[5] = { 'o', 'r', 'n', 'a', 's' }; static symbol s_0_26[2] = { 'e', 's' }; static symbol s_0_27[4] = { 'a', 'd', 'e', 's' }; static symbol s_0_28[5] = { 'a', 'n', 'd', 'e', 's' }; static symbol s_0_29[3] = { 'e', 'n', 's' }; static symbol s_0_30[5] = { 'a', 'r', 'e', 'n', 's' }; static symbol s_0_31[6] = { 'h', 'e', 't', 'e', 'n', 's' }; static symbol s_0_32[4] = { 'e', 'r', 'n', 's' }; static symbol s_0_33[2] = { 'a', 't' }; static symbol s_0_34[5] = { 'a', 'n', 'd', 'e', 't' }; static symbol s_0_35[3] = { 'h', 'e', 't' }; static symbol s_0_36[3] = { 'a', 's', 't' }; static struct among a_0[37] = { /* 0 */ { 1, s_0_0, -1, 1, 0}, /* 1 */ { 4, s_0_1, 0, 1, 0}, /* 2 */ { 4, s_0_2, 0, 1, 0}, /* 3 */ { 7, s_0_3, 2, 1, 0}, /* 4 */ { 4, s_0_4, 0, 1, 0}, /* 5 */ { 2, s_0_5, -1, 1, 0}, /* 6 */ { 1, s_0_6, -1, 1, 0}, /* 7 */ { 3, s_0_7, 6, 1, 0}, /* 8 */ { 4, s_0_8, 6, 1, 0}, /* 9 */ { 4, s_0_9, 6, 1, 0}, /* 10 */ { 3, s_0_10, 6, 1, 0}, /* 11 */ { 4, s_0_11, 6, 1, 0}, /* 12 */ { 2, s_0_12, -1, 1, 0}, /* 13 */ { 5, s_0_13, 12, 1, 0}, /* 14 */ { 4, s_0_14, 12, 1, 0}, /* 15 */ { 5, s_0_15, 12, 1, 0}, /* 16 */ { 3, s_0_16, -1, 1, 0}, /* 17 */ { 2, s_0_17, -1, 1, 0}, /* 18 */ { 2, s_0_18, -1, 1, 0}, /* 19 */ { 5, s_0_19, 18, 1, 0}, /* 20 */ { 2, s_0_20, -1, 1, 0}, /* 21 */ { 1, s_0_21, -1, 2, 0}, /* 22 */ { 2, s_0_22, 21, 1, 0}, /* 23 */ { 5, s_0_23, 22, 1, 0}, /* 24 */ { 5, s_0_24, 22, 1, 0}, /* 25 */ { 5, s_0_25, 22, 1, 0}, /* 26 */ { 2, s_0_26, 21, 1, 0}, /* 27 */ { 4, s_0_27, 26, 1, 0}, /* 28 */ { 5, s_0_28, 26, 1, 0}, /* 29 */ { 3, s_0_29, 21, 1, 0}, /* 30 */ { 5, s_0_30, 29, 1, 0}, /* 31 */ { 6, s_0_31, 29, 1, 0}, /* 32 */ { 4, s_0_32, 21, 1, 0}, /* 33 */ { 2, s_0_33, -1, 1, 0}, /* 34 */ { 5, s_0_34, -1, 1, 0}, /* 35 */ { 3, s_0_35, -1, 1, 0}, /* 36 */ { 3, s_0_36, -1, 1, 0} }; static symbol s_1_0[2] = { 'd', 'd' }; static symbol s_1_1[2] = { 'g', 'd' }; static symbol s_1_2[2] = { 'n', 'n' }; static symbol s_1_3[2] = { 'd', 't' }; static symbol s_1_4[2] = { 'g', 't' }; static symbol s_1_5[2] = { 'k', 't' }; static symbol s_1_6[2] = { 't', 't' }; static struct among a_1[7] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0}, /* 2 */ { 2, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0}, /* 4 */ { 2, s_1_4, -1, -1, 0}, /* 5 */ { 2, s_1_5, -1, -1, 0}, /* 6 */ { 2, s_1_6, -1, -1, 0} }; static symbol s_2_0[2] = { 'i', 'g' }; static symbol s_2_1[3] = { 'l', 'i', 'g' }; static symbol s_2_2[3] = { 'e', 'l', 's' }; static symbol s_2_3[5] = { 'f', 'u', 'l', 'l', 't' }; static symbol s_2_4[4] = { 'l', 0xF6, 's', 't' }; static struct among a_2[5] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 3, s_2_1, 0, 1, 0}, /* 2 */ { 3, s_2_2, -1, 1, 0}, /* 3 */ { 5, s_2_3, -1, 3, 0}, /* 4 */ { 4, s_2_4, -1, 2, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32 }; static unsigned char g_s_ending[] = { 119, 127, 149 }; static symbol s_0[] = { 'l', 0xF6, 's' }; static symbol s_1[] = { 'f', 'u', 'l', 'l' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; { int c_test = z->c; /* test, line 29 */ { int c = z->c + 3; if (0 > c || c > z->l) return 0; z->c = c; /* hop, line 29 */ } z->I[1] = z->c; /* setmark x, line 29 */ z->c = c_test; } while(1) { /* goto, line 30 */ int c = z->c; if (!(in_grouping(z, g_v, 97, 246))) goto lab0; z->c = c; break; lab0: z->c = c; if (z->c >= z->l) return 0; z->c++; /* goto, line 30 */ } while(1) { /* gopast, line 30 */ if (!(out_grouping(z, g_v, 97, 246))) goto lab1; break; lab1: if (z->c >= z->l) return 0; z->c++; /* gopast, line 30 */ } z->I[0] = z->c; /* setmark p1, line 30 */ /* try, line 31 */ if (!(z->I[0] < z->I[1])) goto lab2; z->I[0] = z->I[1]; lab2: return 1; } static int r_main_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 37 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 37 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 37 */ among_var = find_among_b(z, a_0, 37); /* substring, line 37 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 37 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 44 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b(z, g_s_ending, 98, 121))) return 0; { int ret; ret = slice_del(z); /* delete, line 46 */ if (ret < 0) return ret; } break; } return 1; } static int r_consonant_pair(struct SN_env * z) { { int m3; /* setlimit, line 50 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 50 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* and, line 52 */ if (!(find_among_b(z, a_1, 7))) { z->lb = m3; return 0; } /* among, line 51 */ z->c = z->l - m; z->ket = z->c; /* [, line 52 */ if (z->c <= z->lb) { z->lb = m3; return 0; } z->c--; /* next, line 52 */ z->bra = z->c; /* ], line 52 */ { int ret; ret = slice_del(z); /* delete, line 52 */ if (ret < 0) return ret; } } z->lb = m3; } return 1; } static int r_other_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 55 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 55 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 56 */ among_var = find_among_b(z, a_2, 5); /* substring, line 56 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 56 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret; ret = slice_del(z); /* delete, line 57 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 3, s_0); /* <-, line 58 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 4, s_1); /* <-, line 59 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } extern int swedish_ISO_8859_1_stem(struct SN_env * z) { { int c = z->c; /* do, line 66 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 66 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 67 */ { int m = z->l - z->c; (void) m; /* do, line 68 */ { int ret = r_main_suffix(z); if (ret == 0) goto lab1; /* call main_suffix, line 68 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 69 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab2; /* call consonant_pair, line 69 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 70 */ { int ret = r_other_suffix(z); if (ret == 0) goto lab3; /* call other_suffix, line 70 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * swedish_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 0); } extern void swedish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_ISO_8859_1_swedish.h000066400000000000000000000005101154025176300301310ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * swedish_ISO_8859_1_create_env(void); extern void swedish_ISO_8859_1_close_env(struct SN_env * z); extern int swedish_ISO_8859_1_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_KOI8_R_russian.c000066400000000000000000000542561154025176300276060ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int russian_KOI8_R_stem(struct SN_env * z); static int r_tidy_up(struct SN_env * z); static int r_derivational(struct SN_env * z); static int r_noun(struct SN_env * z); static int r_verb(struct SN_env * z); static int r_reflexive(struct SN_env * z); static int r_adjectival(struct SN_env * z); static int r_adjective(struct SN_env * z); static int r_perfective_gerund(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * russian_KOI8_R_create_env(void); extern void russian_KOI8_R_close_env(struct SN_env * z); static symbol s_0_0[3] = { 0xD7, 0xDB, 0xC9 }; static symbol s_0_1[4] = { 0xC9, 0xD7, 0xDB, 0xC9 }; static symbol s_0_2[4] = { 0xD9, 0xD7, 0xDB, 0xC9 }; static symbol s_0_3[1] = { 0xD7 }; static symbol s_0_4[2] = { 0xC9, 0xD7 }; static symbol s_0_5[2] = { 0xD9, 0xD7 }; static symbol s_0_6[5] = { 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 }; static symbol s_0_7[6] = { 0xC9, 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 }; static symbol s_0_8[6] = { 0xD9, 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 }; static struct among a_0[9] = { /* 0 */ { 3, s_0_0, -1, 1, 0}, /* 1 */ { 4, s_0_1, 0, 2, 0}, /* 2 */ { 4, s_0_2, 0, 2, 0}, /* 3 */ { 1, s_0_3, -1, 1, 0}, /* 4 */ { 2, s_0_4, 3, 2, 0}, /* 5 */ { 2, s_0_5, 3, 2, 0}, /* 6 */ { 5, s_0_6, -1, 1, 0}, /* 7 */ { 6, s_0_7, 6, 2, 0}, /* 8 */ { 6, s_0_8, 6, 2, 0} }; static symbol s_1_0[2] = { 0xC0, 0xC0 }; static symbol s_1_1[2] = { 0xC5, 0xC0 }; static symbol s_1_2[2] = { 0xCF, 0xC0 }; static symbol s_1_3[2] = { 0xD5, 0xC0 }; static symbol s_1_4[2] = { 0xC5, 0xC5 }; static symbol s_1_5[2] = { 0xC9, 0xC5 }; static symbol s_1_6[2] = { 0xCF, 0xC5 }; static symbol s_1_7[2] = { 0xD9, 0xC5 }; static symbol s_1_8[2] = { 0xC9, 0xC8 }; static symbol s_1_9[2] = { 0xD9, 0xC8 }; static symbol s_1_10[3] = { 0xC9, 0xCD, 0xC9 }; static symbol s_1_11[3] = { 0xD9, 0xCD, 0xC9 }; static symbol s_1_12[2] = { 0xC5, 0xCA }; static symbol s_1_13[2] = { 0xC9, 0xCA }; static symbol s_1_14[2] = { 0xCF, 0xCA }; static symbol s_1_15[2] = { 0xD9, 0xCA }; static symbol s_1_16[2] = { 0xC5, 0xCD }; static symbol s_1_17[2] = { 0xC9, 0xCD }; static symbol s_1_18[2] = { 0xCF, 0xCD }; static symbol s_1_19[2] = { 0xD9, 0xCD }; static symbol s_1_20[3] = { 0xC5, 0xC7, 0xCF }; static symbol s_1_21[3] = { 0xCF, 0xC7, 0xCF }; static symbol s_1_22[2] = { 0xC1, 0xD1 }; static symbol s_1_23[2] = { 0xD1, 0xD1 }; static symbol s_1_24[3] = { 0xC5, 0xCD, 0xD5 }; static symbol s_1_25[3] = { 0xCF, 0xCD, 0xD5 }; static struct among a_1[26] = { /* 0 */ { 2, s_1_0, -1, 1, 0}, /* 1 */ { 2, s_1_1, -1, 1, 0}, /* 2 */ { 2, s_1_2, -1, 1, 0}, /* 3 */ { 2, s_1_3, -1, 1, 0}, /* 4 */ { 2, s_1_4, -1, 1, 0}, /* 5 */ { 2, s_1_5, -1, 1, 0}, /* 6 */ { 2, s_1_6, -1, 1, 0}, /* 7 */ { 2, s_1_7, -1, 1, 0}, /* 8 */ { 2, s_1_8, -1, 1, 0}, /* 9 */ { 2, s_1_9, -1, 1, 0}, /* 10 */ { 3, s_1_10, -1, 1, 0}, /* 11 */ { 3, s_1_11, -1, 1, 0}, /* 12 */ { 2, s_1_12, -1, 1, 0}, /* 13 */ { 2, s_1_13, -1, 1, 0}, /* 14 */ { 2, s_1_14, -1, 1, 0}, /* 15 */ { 2, s_1_15, -1, 1, 0}, /* 16 */ { 2, s_1_16, -1, 1, 0}, /* 17 */ { 2, s_1_17, -1, 1, 0}, /* 18 */ { 2, s_1_18, -1, 1, 0}, /* 19 */ { 2, s_1_19, -1, 1, 0}, /* 20 */ { 3, s_1_20, -1, 1, 0}, /* 21 */ { 3, s_1_21, -1, 1, 0}, /* 22 */ { 2, s_1_22, -1, 1, 0}, /* 23 */ { 2, s_1_23, -1, 1, 0}, /* 24 */ { 3, s_1_24, -1, 1, 0}, /* 25 */ { 3, s_1_25, -1, 1, 0} }; static symbol s_2_0[2] = { 0xC5, 0xCD }; static symbol s_2_1[2] = { 0xCE, 0xCE }; static symbol s_2_2[2] = { 0xD7, 0xDB }; static symbol s_2_3[3] = { 0xC9, 0xD7, 0xDB }; static symbol s_2_4[3] = { 0xD9, 0xD7, 0xDB }; static symbol s_2_5[1] = { 0xDD }; static symbol s_2_6[2] = { 0xC0, 0xDD }; static symbol s_2_7[3] = { 0xD5, 0xC0, 0xDD }; static struct among a_2[8] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 2, s_2_1, -1, 1, 0}, /* 2 */ { 2, s_2_2, -1, 1, 0}, /* 3 */ { 3, s_2_3, 2, 2, 0}, /* 4 */ { 3, s_2_4, 2, 2, 0}, /* 5 */ { 1, s_2_5, -1, 1, 0}, /* 6 */ { 2, s_2_6, 5, 1, 0}, /* 7 */ { 3, s_2_7, 6, 2, 0} }; static symbol s_3_0[2] = { 0xD3, 0xD1 }; static symbol s_3_1[2] = { 0xD3, 0xD8 }; static struct among a_3[2] = { /* 0 */ { 2, s_3_0, -1, 1, 0}, /* 1 */ { 2, s_3_1, -1, 1, 0} }; static symbol s_4_0[1] = { 0xC0 }; static symbol s_4_1[2] = { 0xD5, 0xC0 }; static symbol s_4_2[2] = { 0xCC, 0xC1 }; static symbol s_4_3[3] = { 0xC9, 0xCC, 0xC1 }; static symbol s_4_4[3] = { 0xD9, 0xCC, 0xC1 }; static symbol s_4_5[2] = { 0xCE, 0xC1 }; static symbol s_4_6[3] = { 0xC5, 0xCE, 0xC1 }; static symbol s_4_7[3] = { 0xC5, 0xD4, 0xC5 }; static symbol s_4_8[3] = { 0xC9, 0xD4, 0xC5 }; static symbol s_4_9[3] = { 0xCA, 0xD4, 0xC5 }; static symbol s_4_10[4] = { 0xC5, 0xCA, 0xD4, 0xC5 }; static symbol s_4_11[4] = { 0xD5, 0xCA, 0xD4, 0xC5 }; static symbol s_4_12[2] = { 0xCC, 0xC9 }; static symbol s_4_13[3] = { 0xC9, 0xCC, 0xC9 }; static symbol s_4_14[3] = { 0xD9, 0xCC, 0xC9 }; static symbol s_4_15[1] = { 0xCA }; static symbol s_4_16[2] = { 0xC5, 0xCA }; static symbol s_4_17[2] = { 0xD5, 0xCA }; static symbol s_4_18[1] = { 0xCC }; static symbol s_4_19[2] = { 0xC9, 0xCC }; static symbol s_4_20[2] = { 0xD9, 0xCC }; static symbol s_4_21[2] = { 0xC5, 0xCD }; static symbol s_4_22[2] = { 0xC9, 0xCD }; static symbol s_4_23[2] = { 0xD9, 0xCD }; static symbol s_4_24[1] = { 0xCE }; static symbol s_4_25[2] = { 0xC5, 0xCE }; static symbol s_4_26[2] = { 0xCC, 0xCF }; static symbol s_4_27[3] = { 0xC9, 0xCC, 0xCF }; static symbol s_4_28[3] = { 0xD9, 0xCC, 0xCF }; static symbol s_4_29[2] = { 0xCE, 0xCF }; static symbol s_4_30[3] = { 0xC5, 0xCE, 0xCF }; static symbol s_4_31[3] = { 0xCE, 0xCE, 0xCF }; static symbol s_4_32[2] = { 0xC0, 0xD4 }; static symbol s_4_33[3] = { 0xD5, 0xC0, 0xD4 }; static symbol s_4_34[2] = { 0xC5, 0xD4 }; static symbol s_4_35[3] = { 0xD5, 0xC5, 0xD4 }; static symbol s_4_36[2] = { 0xC9, 0xD4 }; static symbol s_4_37[2] = { 0xD1, 0xD4 }; static symbol s_4_38[2] = { 0xD9, 0xD4 }; static symbol s_4_39[2] = { 0xD4, 0xD8 }; static symbol s_4_40[3] = { 0xC9, 0xD4, 0xD8 }; static symbol s_4_41[3] = { 0xD9, 0xD4, 0xD8 }; static symbol s_4_42[3] = { 0xC5, 0xDB, 0xD8 }; static symbol s_4_43[3] = { 0xC9, 0xDB, 0xD8 }; static symbol s_4_44[2] = { 0xCE, 0xD9 }; static symbol s_4_45[3] = { 0xC5, 0xCE, 0xD9 }; static struct among a_4[46] = { /* 0 */ { 1, s_4_0, -1, 2, 0}, /* 1 */ { 2, s_4_1, 0, 2, 0}, /* 2 */ { 2, s_4_2, -1, 1, 0}, /* 3 */ { 3, s_4_3, 2, 2, 0}, /* 4 */ { 3, s_4_4, 2, 2, 0}, /* 5 */ { 2, s_4_5, -1, 1, 0}, /* 6 */ { 3, s_4_6, 5, 2, 0}, /* 7 */ { 3, s_4_7, -1, 1, 0}, /* 8 */ { 3, s_4_8, -1, 2, 0}, /* 9 */ { 3, s_4_9, -1, 1, 0}, /* 10 */ { 4, s_4_10, 9, 2, 0}, /* 11 */ { 4, s_4_11, 9, 2, 0}, /* 12 */ { 2, s_4_12, -1, 1, 0}, /* 13 */ { 3, s_4_13, 12, 2, 0}, /* 14 */ { 3, s_4_14, 12, 2, 0}, /* 15 */ { 1, s_4_15, -1, 1, 0}, /* 16 */ { 2, s_4_16, 15, 2, 0}, /* 17 */ { 2, s_4_17, 15, 2, 0}, /* 18 */ { 1, s_4_18, -1, 1, 0}, /* 19 */ { 2, s_4_19, 18, 2, 0}, /* 20 */ { 2, s_4_20, 18, 2, 0}, /* 21 */ { 2, s_4_21, -1, 1, 0}, /* 22 */ { 2, s_4_22, -1, 2, 0}, /* 23 */ { 2, s_4_23, -1, 2, 0}, /* 24 */ { 1, s_4_24, -1, 1, 0}, /* 25 */ { 2, s_4_25, 24, 2, 0}, /* 26 */ { 2, s_4_26, -1, 1, 0}, /* 27 */ { 3, s_4_27, 26, 2, 0}, /* 28 */ { 3, s_4_28, 26, 2, 0}, /* 29 */ { 2, s_4_29, -1, 1, 0}, /* 30 */ { 3, s_4_30, 29, 2, 0}, /* 31 */ { 3, s_4_31, 29, 1, 0}, /* 32 */ { 2, s_4_32, -1, 1, 0}, /* 33 */ { 3, s_4_33, 32, 2, 0}, /* 34 */ { 2, s_4_34, -1, 1, 0}, /* 35 */ { 3, s_4_35, 34, 2, 0}, /* 36 */ { 2, s_4_36, -1, 2, 0}, /* 37 */ { 2, s_4_37, -1, 2, 0}, /* 38 */ { 2, s_4_38, -1, 2, 0}, /* 39 */ { 2, s_4_39, -1, 1, 0}, /* 40 */ { 3, s_4_40, 39, 2, 0}, /* 41 */ { 3, s_4_41, 39, 2, 0}, /* 42 */ { 3, s_4_42, -1, 1, 0}, /* 43 */ { 3, s_4_43, -1, 2, 0}, /* 44 */ { 2, s_4_44, -1, 1, 0}, /* 45 */ { 3, s_4_45, 44, 2, 0} }; static symbol s_5_0[1] = { 0xC0 }; static symbol s_5_1[2] = { 0xC9, 0xC0 }; static symbol s_5_2[2] = { 0xD8, 0xC0 }; static symbol s_5_3[1] = { 0xC1 }; static symbol s_5_4[1] = { 0xC5 }; static symbol s_5_5[2] = { 0xC9, 0xC5 }; static symbol s_5_6[2] = { 0xD8, 0xC5 }; static symbol s_5_7[2] = { 0xC1, 0xC8 }; static symbol s_5_8[2] = { 0xD1, 0xC8 }; static symbol s_5_9[3] = { 0xC9, 0xD1, 0xC8 }; static symbol s_5_10[1] = { 0xC9 }; static symbol s_5_11[2] = { 0xC5, 0xC9 }; static symbol s_5_12[2] = { 0xC9, 0xC9 }; static symbol s_5_13[3] = { 0xC1, 0xCD, 0xC9 }; static symbol s_5_14[3] = { 0xD1, 0xCD, 0xC9 }; static symbol s_5_15[4] = { 0xC9, 0xD1, 0xCD, 0xC9 }; static symbol s_5_16[1] = { 0xCA }; static symbol s_5_17[2] = { 0xC5, 0xCA }; static symbol s_5_18[3] = { 0xC9, 0xC5, 0xCA }; static symbol s_5_19[2] = { 0xC9, 0xCA }; static symbol s_5_20[2] = { 0xCF, 0xCA }; static symbol s_5_21[2] = { 0xC1, 0xCD }; static symbol s_5_22[2] = { 0xC5, 0xCD }; static symbol s_5_23[3] = { 0xC9, 0xC5, 0xCD }; static symbol s_5_24[2] = { 0xCF, 0xCD }; static symbol s_5_25[2] = { 0xD1, 0xCD }; static symbol s_5_26[3] = { 0xC9, 0xD1, 0xCD }; static symbol s_5_27[1] = { 0xCF }; static symbol s_5_28[1] = { 0xD1 }; static symbol s_5_29[2] = { 0xC9, 0xD1 }; static symbol s_5_30[2] = { 0xD8, 0xD1 }; static symbol s_5_31[1] = { 0xD5 }; static symbol s_5_32[2] = { 0xC5, 0xD7 }; static symbol s_5_33[2] = { 0xCF, 0xD7 }; static symbol s_5_34[1] = { 0xD8 }; static symbol s_5_35[1] = { 0xD9 }; static struct among a_5[36] = { /* 0 */ { 1, s_5_0, -1, 1, 0}, /* 1 */ { 2, s_5_1, 0, 1, 0}, /* 2 */ { 2, s_5_2, 0, 1, 0}, /* 3 */ { 1, s_5_3, -1, 1, 0}, /* 4 */ { 1, s_5_4, -1, 1, 0}, /* 5 */ { 2, s_5_5, 4, 1, 0}, /* 6 */ { 2, s_5_6, 4, 1, 0}, /* 7 */ { 2, s_5_7, -1, 1, 0}, /* 8 */ { 2, s_5_8, -1, 1, 0}, /* 9 */ { 3, s_5_9, 8, 1, 0}, /* 10 */ { 1, s_5_10, -1, 1, 0}, /* 11 */ { 2, s_5_11, 10, 1, 0}, /* 12 */ { 2, s_5_12, 10, 1, 0}, /* 13 */ { 3, s_5_13, 10, 1, 0}, /* 14 */ { 3, s_5_14, 10, 1, 0}, /* 15 */ { 4, s_5_15, 14, 1, 0}, /* 16 */ { 1, s_5_16, -1, 1, 0}, /* 17 */ { 2, s_5_17, 16, 1, 0}, /* 18 */ { 3, s_5_18, 17, 1, 0}, /* 19 */ { 2, s_5_19, 16, 1, 0}, /* 20 */ { 2, s_5_20, 16, 1, 0}, /* 21 */ { 2, s_5_21, -1, 1, 0}, /* 22 */ { 2, s_5_22, -1, 1, 0}, /* 23 */ { 3, s_5_23, 22, 1, 0}, /* 24 */ { 2, s_5_24, -1, 1, 0}, /* 25 */ { 2, s_5_25, -1, 1, 0}, /* 26 */ { 3, s_5_26, 25, 1, 0}, /* 27 */ { 1, s_5_27, -1, 1, 0}, /* 28 */ { 1, s_5_28, -1, 1, 0}, /* 29 */ { 2, s_5_29, 28, 1, 0}, /* 30 */ { 2, s_5_30, 28, 1, 0}, /* 31 */ { 1, s_5_31, -1, 1, 0}, /* 32 */ { 2, s_5_32, -1, 1, 0}, /* 33 */ { 2, s_5_33, -1, 1, 0}, /* 34 */ { 1, s_5_34, -1, 1, 0}, /* 35 */ { 1, s_5_35, -1, 1, 0} }; static symbol s_6_0[3] = { 0xCF, 0xD3, 0xD4 }; static symbol s_6_1[4] = { 0xCF, 0xD3, 0xD4, 0xD8 }; static struct among a_6[2] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 4, s_6_1, -1, 1, 0} }; static symbol s_7_0[4] = { 0xC5, 0xCA, 0xDB, 0xC5 }; static symbol s_7_1[1] = { 0xCE }; static symbol s_7_2[1] = { 0xD8 }; static symbol s_7_3[3] = { 0xC5, 0xCA, 0xDB }; static struct among a_7[4] = { /* 0 */ { 4, s_7_0, -1, 1, 0}, /* 1 */ { 1, s_7_1, -1, 2, 0}, /* 2 */ { 1, s_7_2, -1, 3, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0} }; static unsigned char g_v[] = { 35, 130, 34, 18 }; static symbol s_0[] = { 0xC1 }; static symbol s_1[] = { 0xD1 }; static symbol s_2[] = { 0xC1 }; static symbol s_3[] = { 0xD1 }; static symbol s_4[] = { 0xC1 }; static symbol s_5[] = { 0xD1 }; static symbol s_6[] = { 0xCE }; static symbol s_7[] = { 0xCE }; static symbol s_8[] = { 0xCE }; static symbol s_9[] = { 0xC9 }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; { int c = z->c; /* do, line 63 */ while(1) { /* gopast, line 64 */ if (!(in_grouping(z, g_v, 192, 220))) goto lab1; break; lab1: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 64 */ } z->I[0] = z->c; /* setmark pV, line 64 */ while(1) { /* gopast, line 64 */ if (!(out_grouping(z, g_v, 192, 220))) goto lab2; break; lab2: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 64 */ } while(1) { /* gopast, line 65 */ if (!(in_grouping(z, g_v, 192, 220))) goto lab3; break; lab3: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 65 */ } while(1) { /* gopast, line 65 */ if (!(out_grouping(z, g_v, 192, 220))) goto lab4; break; lab4: if (z->c >= z->l) goto lab0; z->c++; /* gopast, line 65 */ } z->I[1] = z->c; /* setmark p2, line 65 */ lab0: z->c = c; } return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_perfective_gerund(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 74 */ among_var = find_among_b(z, a_0, 9); /* substring, line 74 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 74 */ switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* or, line 78 */ if (!(eq_s_b(z, 1, s_0))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_1))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 78 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 85 */ if (ret < 0) return ret; } break; } return 1; } static int r_adjective(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 90 */ among_var = find_among_b(z, a_1, 26); /* substring, line 90 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 90 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 99 */ if (ret < 0) return ret; } break; } return 1; } static int r_adjectival(struct SN_env * z) { int among_var; { int ret = r_adjective(z); if (ret == 0) return 0; /* call adjective, line 104 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 111 */ z->ket = z->c; /* [, line 112 */ among_var = find_among_b(z, a_2, 8); /* substring, line 112 */ if (!(among_var)) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 112 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab0; } case 1: { int m = z->l - z->c; (void) m; /* or, line 117 */ if (!(eq_s_b(z, 1, s_2))) goto lab2; goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 1, s_3))) { z->c = z->l - m; goto lab0; } } lab1: { int ret; ret = slice_del(z); /* delete, line 117 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 124 */ if (ret < 0) return ret; } break; } lab0: ; } return 1; } static int r_reflexive(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 131 */ among_var = find_among_b(z, a_3, 2); /* substring, line 131 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 131 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 134 */ if (ret < 0) return ret; } break; } return 1; } static int r_verb(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 139 */ among_var = find_among_b(z, a_4, 46); /* substring, line 139 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 139 */ switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* or, line 145 */ if (!(eq_s_b(z, 1, s_4))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_5))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 145 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 153 */ if (ret < 0) return ret; } break; } return 1; } static int r_noun(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 162 */ among_var = find_among_b(z, a_5, 36); /* substring, line 162 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 162 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 169 */ if (ret < 0) return ret; } break; } return 1; } static int r_derivational(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 178 */ among_var = find_among_b(z, a_6, 2); /* substring, line 178 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 178 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 178 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 181 */ if (ret < 0) return ret; } break; } return 1; } static int r_tidy_up(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 186 */ among_var = find_among_b(z, a_7, 4); /* substring, line 186 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 186 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 190 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 191 */ if (!(eq_s_b(z, 1, s_6))) return 0; z->bra = z->c; /* ], line 191 */ if (!(eq_s_b(z, 1, s_7))) return 0; { int ret; ret = slice_del(z); /* delete, line 191 */ if (ret < 0) return ret; } break; case 2: if (!(eq_s_b(z, 1, s_8))) return 0; { int ret; ret = slice_del(z); /* delete, line 194 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 196 */ if (ret < 0) return ret; } break; } return 1; } extern int russian_KOI8_R_stem(struct SN_env * z) { { int c = z->c; /* do, line 203 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 203 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 204 */ { int m3; /* setlimit, line 204 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 204 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 205 */ { int m = z->l - z->c; (void) m; /* or, line 206 */ { int ret = r_perfective_gerund(z); if (ret == 0) goto lab3; /* call perfective_gerund, line 206 */ if (ret < 0) return ret; } goto lab2; lab3: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* try, line 207 */ { int ret = r_reflexive(z); if (ret == 0) { z->c = z->l - m; goto lab4; } /* call reflexive, line 207 */ if (ret < 0) return ret; } lab4: ; } { int m = z->l - z->c; (void) m; /* or, line 208 */ { int ret = r_adjectival(z); if (ret == 0) goto lab6; /* call adjectival, line 208 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_verb(z); if (ret == 0) goto lab7; /* call verb, line 208 */ if (ret < 0) return ret; } goto lab5; lab7: z->c = z->l - m; { int ret = r_noun(z); if (ret == 0) goto lab1; /* call noun, line 208 */ if (ret < 0) return ret; } } lab5: ; } lab2: lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* try, line 211 */ z->ket = z->c; /* [, line 211 */ if (!(eq_s_b(z, 1, s_9))) { z->c = z->l - m; goto lab8; } z->bra = z->c; /* ], line 211 */ { int ret; ret = slice_del(z); /* delete, line 211 */ if (ret < 0) return ret; } lab8: ; } { int m = z->l - z->c; (void) m; /* do, line 214 */ { int ret = r_derivational(z); if (ret == 0) goto lab9; /* call derivational, line 214 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 215 */ { int ret = r_tidy_up(z); if (ret == 0) goto lab10; /* call tidy_up, line 215 */ if (ret < 0) return ret; } lab10: z->c = z->l - m; } z->lb = m3; } z->c = z->lb; return 1; } extern struct SN_env * russian_KOI8_R_create_env(void) { return SN_create_env(0, 2, 0); } extern void russian_KOI8_R_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_KOI8_R_russian.h000066400000000000000000000004741154025176300276040ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * russian_KOI8_R_create_env(void); extern void russian_KOI8_R_close_env(struct SN_env * z); extern int russian_KOI8_R_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_danish.c000066400000000000000000000256071154025176300272600ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int danish_UTF_8_stem(struct SN_env * z); static int r_undouble(struct SN_env * z); static int r_other_suffix(struct SN_env * z); static int r_consonant_pair(struct SN_env * z); static int r_main_suffix(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * danish_UTF_8_create_env(void); extern void danish_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[3] = { 'h', 'e', 'd' }; static symbol s_0_1[5] = { 'e', 't', 'h', 'e', 'd' }; static symbol s_0_2[4] = { 'e', 'r', 'e', 'd' }; static symbol s_0_3[1] = { 'e' }; static symbol s_0_4[5] = { 'e', 'r', 'e', 'd', 'e' }; static symbol s_0_5[4] = { 'e', 'n', 'd', 'e' }; static symbol s_0_6[6] = { 'e', 'r', 'e', 'n', 'd', 'e' }; static symbol s_0_7[3] = { 'e', 'n', 'e' }; static symbol s_0_8[4] = { 'e', 'r', 'n', 'e' }; static symbol s_0_9[3] = { 'e', 'r', 'e' }; static symbol s_0_10[2] = { 'e', 'n' }; static symbol s_0_11[5] = { 'h', 'e', 'd', 'e', 'n' }; static symbol s_0_12[4] = { 'e', 'r', 'e', 'n' }; static symbol s_0_13[2] = { 'e', 'r' }; static symbol s_0_14[5] = { 'h', 'e', 'd', 'e', 'r' }; static symbol s_0_15[4] = { 'e', 'r', 'e', 'r' }; static symbol s_0_16[1] = { 's' }; static symbol s_0_17[4] = { 'h', 'e', 'd', 's' }; static symbol s_0_18[2] = { 'e', 's' }; static symbol s_0_19[5] = { 'e', 'n', 'd', 'e', 's' }; static symbol s_0_20[7] = { 'e', 'r', 'e', 'n', 'd', 'e', 's' }; static symbol s_0_21[4] = { 'e', 'n', 'e', 's' }; static symbol s_0_22[5] = { 'e', 'r', 'n', 'e', 's' }; static symbol s_0_23[4] = { 'e', 'r', 'e', 's' }; static symbol s_0_24[3] = { 'e', 'n', 's' }; static symbol s_0_25[6] = { 'h', 'e', 'd', 'e', 'n', 's' }; static symbol s_0_26[5] = { 'e', 'r', 'e', 'n', 's' }; static symbol s_0_27[3] = { 'e', 'r', 's' }; static symbol s_0_28[3] = { 'e', 't', 's' }; static symbol s_0_29[5] = { 'e', 'r', 'e', 't', 's' }; static symbol s_0_30[2] = { 'e', 't' }; static symbol s_0_31[4] = { 'e', 'r', 'e', 't' }; static struct among a_0[32] = { /* 0 */ { 3, s_0_0, -1, 1, 0}, /* 1 */ { 5, s_0_1, 0, 1, 0}, /* 2 */ { 4, s_0_2, -1, 1, 0}, /* 3 */ { 1, s_0_3, -1, 1, 0}, /* 4 */ { 5, s_0_4, 3, 1, 0}, /* 5 */ { 4, s_0_5, 3, 1, 0}, /* 6 */ { 6, s_0_6, 5, 1, 0}, /* 7 */ { 3, s_0_7, 3, 1, 0}, /* 8 */ { 4, s_0_8, 3, 1, 0}, /* 9 */ { 3, s_0_9, 3, 1, 0}, /* 10 */ { 2, s_0_10, -1, 1, 0}, /* 11 */ { 5, s_0_11, 10, 1, 0}, /* 12 */ { 4, s_0_12, 10, 1, 0}, /* 13 */ { 2, s_0_13, -1, 1, 0}, /* 14 */ { 5, s_0_14, 13, 1, 0}, /* 15 */ { 4, s_0_15, 13, 1, 0}, /* 16 */ { 1, s_0_16, -1, 2, 0}, /* 17 */ { 4, s_0_17, 16, 1, 0}, /* 18 */ { 2, s_0_18, 16, 1, 0}, /* 19 */ { 5, s_0_19, 18, 1, 0}, /* 20 */ { 7, s_0_20, 19, 1, 0}, /* 21 */ { 4, s_0_21, 18, 1, 0}, /* 22 */ { 5, s_0_22, 18, 1, 0}, /* 23 */ { 4, s_0_23, 18, 1, 0}, /* 24 */ { 3, s_0_24, 16, 1, 0}, /* 25 */ { 6, s_0_25, 24, 1, 0}, /* 26 */ { 5, s_0_26, 24, 1, 0}, /* 27 */ { 3, s_0_27, 16, 1, 0}, /* 28 */ { 3, s_0_28, 16, 1, 0}, /* 29 */ { 5, s_0_29, 28, 1, 0}, /* 30 */ { 2, s_0_30, -1, 1, 0}, /* 31 */ { 4, s_0_31, 30, 1, 0} }; static symbol s_1_0[2] = { 'g', 'd' }; static symbol s_1_1[2] = { 'd', 't' }; static symbol s_1_2[2] = { 'g', 't' }; static symbol s_1_3[2] = { 'k', 't' }; static struct among a_1[4] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0}, /* 2 */ { 2, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0} }; static symbol s_2_0[2] = { 'i', 'g' }; static symbol s_2_1[3] = { 'l', 'i', 'g' }; static symbol s_2_2[4] = { 'e', 'l', 'i', 'g' }; static symbol s_2_3[3] = { 'e', 'l', 's' }; static symbol s_2_4[5] = { 'l', 0xC3, 0xB8, 's', 't' }; static struct among a_2[5] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 3, s_2_1, 0, 1, 0}, /* 2 */ { 4, s_2_2, 1, 1, 0}, /* 3 */ { 3, s_2_3, -1, 1, 0}, /* 4 */ { 5, s_2_4, -1, 2, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 }; static unsigned char g_s_ending[] = { 239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 }; static symbol s_0[] = { 's', 't' }; static symbol s_1[] = { 'i', 'g' }; static symbol s_2[] = { 'l', 0xC3, 0xB8, 's' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; { int c_test = z->c; /* test, line 33 */ { int c = skip_utf8(z->p, z->c, 0, z->l, + 3); if (c < 0) return 0; z->c = c; /* hop, line 33 */ } z->I[1] = z->c; /* setmark x, line 33 */ z->c = c_test; } while(1) { /* goto, line 34 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 248))) goto lab0; z->c = c; break; lab0: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* goto, line 34 */ } } while(1) { /* gopast, line 34 */ if (!(out_grouping_U(z, g_v, 97, 248))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 34 */ } } z->I[0] = z->c; /* setmark p1, line 34 */ /* try, line 35 */ if (!(z->I[0] < z->I[1])) goto lab2; z->I[0] = z->I[1]; lab2: return 1; } static int r_main_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 41 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 41 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 41 */ among_var = find_among_b(z, a_0, 32); /* substring, line 41 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 41 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 48 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b_U(z, g_s_ending, 97, 229))) return 0; { int ret; ret = slice_del(z); /* delete, line 50 */ if (ret < 0) return ret; } break; } return 1; } static int r_consonant_pair(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 55 */ { int m3; /* setlimit, line 56 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 56 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 56 */ if (!(find_among_b(z, a_1, 4))) { z->lb = m3; return 0; } /* substring, line 56 */ z->bra = z->c; /* ], line 56 */ z->lb = m3; } z->c = z->l - m_test; } { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 62 */ } z->bra = z->c; /* ], line 62 */ { int ret; ret = slice_del(z); /* delete, line 62 */ if (ret < 0) return ret; } return 1; } static int r_other_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* do, line 66 */ z->ket = z->c; /* [, line 66 */ if (!(eq_s_b(z, 2, s_0))) goto lab0; z->bra = z->c; /* ], line 66 */ if (!(eq_s_b(z, 2, s_1))) goto lab0; { int ret; ret = slice_del(z); /* delete, line 66 */ if (ret < 0) return ret; } lab0: z->c = z->l - m; } { int m3; /* setlimit, line 67 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 67 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 67 */ among_var = find_among_b(z, a_2, 5); /* substring, line 67 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 67 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 70 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* do, line 70 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab1; /* call consonant_pair, line 70 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } break; case 2: { int ret; ret = slice_from_s(z, 4, s_2); /* <-, line 72 */ if (ret < 0) return ret; } break; } return 1; } static int r_undouble(struct SN_env * z) { { int m3; /* setlimit, line 76 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 76 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 76 */ if (!(out_grouping_b_U(z, g_v, 97, 248))) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 76 */ z->S[0] = slice_to(z, z->S[0]); /* -> ch, line 76 */ if (z->S[0] == 0) return -1; /* -> ch, line 76 */ z->lb = m3; } if (!(eq_v_b(z, z->S[0]))) return 0; /* name ch, line 77 */ { int ret; ret = slice_del(z); /* delete, line 78 */ if (ret < 0) return ret; } return 1; } extern int danish_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 84 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 84 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 85 */ { int m = z->l - z->c; (void) m; /* do, line 86 */ { int ret = r_main_suffix(z); if (ret == 0) goto lab1; /* call main_suffix, line 86 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 87 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab2; /* call consonant_pair, line 87 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 88 */ { int ret = r_other_suffix(z); if (ret == 0) goto lab3; /* call other_suffix, line 88 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 89 */ { int ret = r_undouble(z); if (ret == 0) goto lab4; /* call undouble, line 89 */ if (ret < 0) return ret; } lab4: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * danish_UTF_8_create_env(void) { return SN_create_env(1, 2, 0); } extern void danish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_danish.h000066400000000000000000000004661154025176300272610ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * danish_UTF_8_create_env(void); extern void danish_UTF_8_close_env(struct SN_env * z); extern int danish_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_dutch.c000066400000000000000000000507601154025176300271170ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int dutch_UTF_8_stem(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_undouble(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_en_ending(struct SN_env * z); static int r_e_ending(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * dutch_UTF_8_create_env(void); extern void dutch_UTF_8_close_env(struct SN_env * z); static symbol s_0_1[2] = { 0xC3, 0xA1 }; static symbol s_0_2[2] = { 0xC3, 0xA4 }; static symbol s_0_3[2] = { 0xC3, 0xA9 }; static symbol s_0_4[2] = { 0xC3, 0xAB }; static symbol s_0_5[2] = { 0xC3, 0xAD }; static symbol s_0_6[2] = { 0xC3, 0xAF }; static symbol s_0_7[2] = { 0xC3, 0xB3 }; static symbol s_0_8[2] = { 0xC3, 0xB6 }; static symbol s_0_9[2] = { 0xC3, 0xBA }; static symbol s_0_10[2] = { 0xC3, 0xBC }; static struct among a_0[11] = { /* 0 */ { 0, 0, -1, 6, 0}, /* 1 */ { 2, s_0_1, 0, 1, 0}, /* 2 */ { 2, s_0_2, 0, 1, 0}, /* 3 */ { 2, s_0_3, 0, 2, 0}, /* 4 */ { 2, s_0_4, 0, 2, 0}, /* 5 */ { 2, s_0_5, 0, 3, 0}, /* 6 */ { 2, s_0_6, 0, 3, 0}, /* 7 */ { 2, s_0_7, 0, 4, 0}, /* 8 */ { 2, s_0_8, 0, 4, 0}, /* 9 */ { 2, s_0_9, 0, 5, 0}, /* 10 */ { 2, s_0_10, 0, 5, 0} }; static symbol s_1_1[1] = { 'I' }; static symbol s_1_2[1] = { 'Y' }; static struct among a_1[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 1, s_1_1, 0, 2, 0}, /* 2 */ { 1, s_1_2, 0, 1, 0} }; static symbol s_2_0[2] = { 'd', 'd' }; static symbol s_2_1[2] = { 'k', 'k' }; static symbol s_2_2[2] = { 't', 't' }; static struct among a_2[3] = { /* 0 */ { 2, s_2_0, -1, -1, 0}, /* 1 */ { 2, s_2_1, -1, -1, 0}, /* 2 */ { 2, s_2_2, -1, -1, 0} }; static symbol s_3_0[3] = { 'e', 'n', 'e' }; static symbol s_3_1[2] = { 's', 'e' }; static symbol s_3_2[2] = { 'e', 'n' }; static symbol s_3_3[5] = { 'h', 'e', 'd', 'e', 'n' }; static symbol s_3_4[1] = { 's' }; static struct among a_3[5] = { /* 0 */ { 3, s_3_0, -1, 2, 0}, /* 1 */ { 2, s_3_1, -1, 3, 0}, /* 2 */ { 2, s_3_2, -1, 2, 0}, /* 3 */ { 5, s_3_3, 2, 1, 0}, /* 4 */ { 1, s_3_4, -1, 3, 0} }; static symbol s_4_0[3] = { 'e', 'n', 'd' }; static symbol s_4_1[2] = { 'i', 'g' }; static symbol s_4_2[3] = { 'i', 'n', 'g' }; static symbol s_4_3[4] = { 'l', 'i', 'j', 'k' }; static symbol s_4_4[4] = { 'b', 'a', 'a', 'r' }; static symbol s_4_5[3] = { 'b', 'a', 'r' }; static struct among a_4[6] = { /* 0 */ { 3, s_4_0, -1, 1, 0}, /* 1 */ { 2, s_4_1, -1, 2, 0}, /* 2 */ { 3, s_4_2, -1, 1, 0}, /* 3 */ { 4, s_4_3, -1, 3, 0}, /* 4 */ { 4, s_4_4, -1, 4, 0}, /* 5 */ { 3, s_4_5, -1, 5, 0} }; static symbol s_5_0[2] = { 'a', 'a' }; static symbol s_5_1[2] = { 'e', 'e' }; static symbol s_5_2[2] = { 'o', 'o' }; static symbol s_5_3[2] = { 'u', 'u' }; static struct among a_5[4] = { /* 0 */ { 2, s_5_0, -1, -1, 0}, /* 1 */ { 2, s_5_1, -1, -1, 0}, /* 2 */ { 2, s_5_2, -1, -1, 0}, /* 3 */ { 2, s_5_3, -1, -1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static unsigned char g_v_I[] = { 1, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static unsigned char g_v_j[] = { 17, 67, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static symbol s_0[] = { 'a' }; static symbol s_1[] = { 'e' }; static symbol s_2[] = { 'i' }; static symbol s_3[] = { 'o' }; static symbol s_4[] = { 'u' }; static symbol s_5[] = { 'y' }; static symbol s_6[] = { 'Y' }; static symbol s_7[] = { 'i' }; static symbol s_8[] = { 'I' }; static symbol s_9[] = { 'y' }; static symbol s_10[] = { 'Y' }; static symbol s_11[] = { 'y' }; static symbol s_12[] = { 'i' }; static symbol s_13[] = { 'e' }; static symbol s_14[] = { 'g', 'e', 'm' }; static symbol s_15[] = { 'h', 'e', 'i', 'd' }; static symbol s_16[] = { 'h', 'e', 'i', 'd' }; static symbol s_17[] = { 'c' }; static symbol s_18[] = { 'e', 'n' }; static symbol s_19[] = { 'i', 'g' }; static symbol s_20[] = { 'e' }; static symbol s_21[] = { 'e' }; static int r_prelude(struct SN_env * z) { int among_var; { int c_test = z->c; /* test, line 42 */ while(1) { /* repeat, line 42 */ int c = z->c; z->bra = z->c; /* [, line 43 */ among_var = find_among(z, a_0, 11); /* substring, line 43 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 43 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_0); /* <-, line 45 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 47 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 49 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 51 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 53 */ if (ret < 0) return ret; } break; case 6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 54 */ } break; } continue; lab0: z->c = c; break; } z->c = c_test; } { int c = z->c; /* try, line 57 */ z->bra = z->c; /* [, line 57 */ if (!(eq_s(z, 1, s_5))) { z->c = c; goto lab1; } z->ket = z->c; /* ], line 57 */ { int ret; ret = slice_from_s(z, 1, s_6); /* <-, line 57 */ if (ret < 0) return ret; } lab1: ; } while(1) { /* repeat, line 58 */ int c = z->c; while(1) { /* goto, line 58 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 232))) goto lab3; z->bra = z->c; /* [, line 59 */ { int c = z->c; /* or, line 59 */ if (!(eq_s(z, 1, s_7))) goto lab5; z->ket = z->c; /* ], line 59 */ if (!(in_grouping_U(z, g_v, 97, 232))) goto lab5; { int ret; ret = slice_from_s(z, 1, s_8); /* <-, line 59 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = c; if (!(eq_s(z, 1, s_9))) goto lab3; z->ket = z->c; /* ], line 60 */ { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 60 */ if (ret < 0) return ret; } } lab4: z->c = c; break; lab3: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab2; z->c = c; /* goto, line 58 */ } } continue; lab2: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; while(1) { /* gopast, line 69 */ if (!(in_grouping_U(z, g_v, 97, 232))) goto lab0; break; lab0: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 69 */ } } while(1) { /* gopast, line 69 */ if (!(out_grouping_U(z, g_v, 97, 232))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 69 */ } } z->I[0] = z->c; /* setmark p1, line 69 */ /* try, line 70 */ if (!(z->I[0] < 3)) goto lab2; z->I[0] = 3; lab2: while(1) { /* gopast, line 71 */ if (!(in_grouping_U(z, g_v, 97, 232))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 71 */ } } while(1) { /* gopast, line 71 */ if (!(out_grouping_U(z, g_v, 97, 232))) goto lab4; break; lab4: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 71 */ } } z->I[1] = z->c; /* setmark p2, line 71 */ return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 75 */ int c = z->c; z->bra = z->c; /* [, line 77 */ among_var = find_among(z, a_1, 3); /* substring, line 77 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 77 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_11); /* <-, line 78 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_12); /* <-, line 79 */ if (ret < 0) return ret; } break; case 3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 80 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_undouble(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 91 */ if (!(find_among_b(z, a_2, 3))) return 0; /* among, line 91 */ z->c = z->l - m_test; } z->ket = z->c; /* [, line 91 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 91 */ } z->bra = z->c; /* ], line 91 */ { int ret; ret = slice_del(z); /* delete, line 91 */ if (ret < 0) return ret; } return 1; } static int r_e_ending(struct SN_env * z) { z->B[0] = 0; /* unset e_found, line 95 */ z->ket = z->c; /* [, line 96 */ if (!(eq_s_b(z, 1, s_13))) return 0; z->bra = z->c; /* ], line 96 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 96 */ if (ret < 0) return ret; } { int m_test = z->l - z->c; /* test, line 96 */ if (!(out_grouping_b_U(z, g_v, 97, 232))) return 0; z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 96 */ if (ret < 0) return ret; } z->B[0] = 1; /* set e_found, line 97 */ { int ret = r_undouble(z); if (ret == 0) return 0; /* call undouble, line 98 */ if (ret < 0) return ret; } return 1; } static int r_en_ending(struct SN_env * z) { { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 102 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* and, line 102 */ if (!(out_grouping_b_U(z, g_v, 97, 232))) return 0; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* not, line 102 */ if (!(eq_s_b(z, 3, s_14))) goto lab0; return 0; lab0: z->c = z->l - m; } } { int ret; ret = slice_del(z); /* delete, line 102 */ if (ret < 0) return ret; } { int ret = r_undouble(z); if (ret == 0) return 0; /* call undouble, line 103 */ if (ret < 0) return ret; } return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* do, line 107 */ z->ket = z->c; /* [, line 108 */ among_var = find_among_b(z, a_3, 5); /* substring, line 108 */ if (!(among_var)) goto lab0; z->bra = z->c; /* ], line 108 */ switch(among_var) { case 0: goto lab0; case 1: { int ret = r_R1(z); if (ret == 0) goto lab0; /* call R1, line 110 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_15); /* <-, line 110 */ if (ret < 0) return ret; } break; case 2: { int ret = r_en_ending(z); if (ret == 0) goto lab0; /* call en_ending, line 113 */ if (ret < 0) return ret; } break; case 3: { int ret = r_R1(z); if (ret == 0) goto lab0; /* call R1, line 116 */ if (ret < 0) return ret; } if (!(out_grouping_b_U(z, g_v_j, 97, 232))) goto lab0; { int ret; ret = slice_del(z); /* delete, line 116 */ if (ret < 0) return ret; } break; } lab0: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 120 */ { int ret = r_e_ending(z); if (ret == 0) goto lab1; /* call e_ending, line 120 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 122 */ z->ket = z->c; /* [, line 122 */ if (!(eq_s_b(z, 4, s_16))) goto lab2; z->bra = z->c; /* ], line 122 */ { int ret = r_R2(z); if (ret == 0) goto lab2; /* call R2, line 122 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 122 */ if (!(eq_s_b(z, 1, s_17))) goto lab3; goto lab2; lab3: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 122 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 123 */ if (!(eq_s_b(z, 2, s_18))) goto lab2; z->bra = z->c; /* ], line 123 */ { int ret = r_en_ending(z); if (ret == 0) goto lab2; /* call en_ending, line 123 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 126 */ z->ket = z->c; /* [, line 127 */ among_var = find_among_b(z, a_4, 6); /* substring, line 127 */ if (!(among_var)) goto lab4; z->bra = z->c; /* ], line 127 */ switch(among_var) { case 0: goto lab4; case 1: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 129 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 129 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* or, line 130 */ z->ket = z->c; /* [, line 130 */ if (!(eq_s_b(z, 2, s_19))) goto lab6; z->bra = z->c; /* ], line 130 */ { int ret = r_R2(z); if (ret == 0) goto lab6; /* call R2, line 130 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 130 */ if (!(eq_s_b(z, 1, s_20))) goto lab7; goto lab6; lab7: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 130 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_undouble(z); if (ret == 0) goto lab4; /* call undouble, line 130 */ if (ret < 0) return ret; } } lab5: break; case 2: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 133 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 133 */ if (!(eq_s_b(z, 1, s_21))) goto lab8; goto lab4; lab8: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } break; case 3: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 136 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 136 */ if (ret < 0) return ret; } { int ret = r_e_ending(z); if (ret == 0) goto lab4; /* call e_ending, line 136 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 139 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 139 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) goto lab4; /* call R2, line 142 */ if (ret < 0) return ret; } if (!(z->B[0])) goto lab4; /* Boolean test e_found, line 142 */ { int ret; ret = slice_del(z); /* delete, line 142 */ if (ret < 0) return ret; } break; } lab4: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 146 */ if (!(out_grouping_b_U(z, g_v_I, 73, 232))) goto lab9; { int m_test = z->l - z->c; /* test, line 148 */ if (!(find_among_b(z, a_5, 4))) goto lab9; /* among, line 149 */ if (!(out_grouping_b_U(z, g_v, 97, 232))) goto lab9; z->c = z->l - m_test; } z->ket = z->c; /* [, line 152 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) goto lab9; z->c = c; /* next, line 152 */ } z->bra = z->c; /* ], line 152 */ { int ret; ret = slice_del(z); /* delete, line 152 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } return 1; } extern int dutch_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 159 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 159 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 160 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 160 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 161 */ { int m = z->l - z->c; (void) m; /* do, line 162 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab2; /* call standard_suffix, line 162 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 163 */ { int ret = r_postlude(z); if (ret == 0) goto lab3; /* call postlude, line 163 */ if (ret < 0) return ret; } lab3: z->c = c; } return 1; } extern struct SN_env * dutch_UTF_8_create_env(void) { return SN_create_env(0, 2, 1); } extern void dutch_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_dutch.h000066400000000000000000000004631154025176300271170ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * dutch_UTF_8_create_env(void); extern void dutch_UTF_8_close_env(struct SN_env * z); extern int dutch_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_english.c000066400000000000000000001133451154025176300274400ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int english_UTF_8_stem(struct SN_env * z); static int r_exception2(struct SN_env * z); static int r_exception1(struct SN_env * z); static int r_Step_5(struct SN_env * z); static int r_Step_4(struct SN_env * z); static int r_Step_3(struct SN_env * z); static int r_Step_2(struct SN_env * z); static int r_Step_1c(struct SN_env * z); static int r_Step_1b(struct SN_env * z); static int r_Step_1a(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_shortv(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * english_UTF_8_create_env(void); extern void english_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[6] = { 'c', 'o', 'm', 'm', 'u', 'n' }; static symbol s_0_1[5] = { 'g', 'e', 'n', 'e', 'r' }; static struct among a_0[2] = { /* 0 */ { 6, s_0_0, -1, -1, 0}, /* 1 */ { 5, s_0_1, -1, -1, 0} }; static symbol s_1_0[1] = { '\'' }; static symbol s_1_1[3] = { '\'', 's', '\'' }; static symbol s_1_2[2] = { '\'', 's' }; static struct among a_1[3] = { /* 0 */ { 1, s_1_0, -1, 1, 0}, /* 1 */ { 3, s_1_1, 0, 1, 0}, /* 2 */ { 2, s_1_2, -1, 1, 0} }; static symbol s_2_0[3] = { 'i', 'e', 'd' }; static symbol s_2_1[1] = { 's' }; static symbol s_2_2[3] = { 'i', 'e', 's' }; static symbol s_2_3[4] = { 's', 's', 'e', 's' }; static symbol s_2_4[2] = { 's', 's' }; static symbol s_2_5[2] = { 'u', 's' }; static struct among a_2[6] = { /* 0 */ { 3, s_2_0, -1, 2, 0}, /* 1 */ { 1, s_2_1, -1, 3, 0}, /* 2 */ { 3, s_2_2, 1, 2, 0}, /* 3 */ { 4, s_2_3, 1, 1, 0}, /* 4 */ { 2, s_2_4, 1, -1, 0}, /* 5 */ { 2, s_2_5, 1, -1, 0} }; static symbol s_3_1[2] = { 'b', 'b' }; static symbol s_3_2[2] = { 'd', 'd' }; static symbol s_3_3[2] = { 'f', 'f' }; static symbol s_3_4[2] = { 'g', 'g' }; static symbol s_3_5[2] = { 'b', 'l' }; static symbol s_3_6[2] = { 'm', 'm' }; static symbol s_3_7[2] = { 'n', 'n' }; static symbol s_3_8[2] = { 'p', 'p' }; static symbol s_3_9[2] = { 'r', 'r' }; static symbol s_3_10[2] = { 'a', 't' }; static symbol s_3_11[2] = { 't', 't' }; static symbol s_3_12[2] = { 'i', 'z' }; static struct among a_3[13] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_3_1, 0, 2, 0}, /* 2 */ { 2, s_3_2, 0, 2, 0}, /* 3 */ { 2, s_3_3, 0, 2, 0}, /* 4 */ { 2, s_3_4, 0, 2, 0}, /* 5 */ { 2, s_3_5, 0, 1, 0}, /* 6 */ { 2, s_3_6, 0, 2, 0}, /* 7 */ { 2, s_3_7, 0, 2, 0}, /* 8 */ { 2, s_3_8, 0, 2, 0}, /* 9 */ { 2, s_3_9, 0, 2, 0}, /* 10 */ { 2, s_3_10, 0, 1, 0}, /* 11 */ { 2, s_3_11, 0, 2, 0}, /* 12 */ { 2, s_3_12, 0, 1, 0} }; static symbol s_4_0[2] = { 'e', 'd' }; static symbol s_4_1[3] = { 'e', 'e', 'd' }; static symbol s_4_2[3] = { 'i', 'n', 'g' }; static symbol s_4_3[4] = { 'e', 'd', 'l', 'y' }; static symbol s_4_4[5] = { 'e', 'e', 'd', 'l', 'y' }; static symbol s_4_5[5] = { 'i', 'n', 'g', 'l', 'y' }; static struct among a_4[6] = { /* 0 */ { 2, s_4_0, -1, 2, 0}, /* 1 */ { 3, s_4_1, 0, 1, 0}, /* 2 */ { 3, s_4_2, -1, 2, 0}, /* 3 */ { 4, s_4_3, -1, 2, 0}, /* 4 */ { 5, s_4_4, 3, 1, 0}, /* 5 */ { 5, s_4_5, -1, 2, 0} }; static symbol s_5_0[4] = { 'a', 'n', 'c', 'i' }; static symbol s_5_1[4] = { 'e', 'n', 'c', 'i' }; static symbol s_5_2[3] = { 'o', 'g', 'i' }; static symbol s_5_3[2] = { 'l', 'i' }; static symbol s_5_4[3] = { 'b', 'l', 'i' }; static symbol s_5_5[4] = { 'a', 'b', 'l', 'i' }; static symbol s_5_6[4] = { 'a', 'l', 'l', 'i' }; static symbol s_5_7[5] = { 'f', 'u', 'l', 'l', 'i' }; static symbol s_5_8[6] = { 'l', 'e', 's', 's', 'l', 'i' }; static symbol s_5_9[5] = { 'o', 'u', 's', 'l', 'i' }; static symbol s_5_10[5] = { 'e', 'n', 't', 'l', 'i' }; static symbol s_5_11[5] = { 'a', 'l', 'i', 't', 'i' }; static symbol s_5_12[6] = { 'b', 'i', 'l', 'i', 't', 'i' }; static symbol s_5_13[5] = { 'i', 'v', 'i', 't', 'i' }; static symbol s_5_14[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_5_15[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_5_16[5] = { 'a', 'l', 'i', 's', 'm' }; static symbol s_5_17[5] = { 'a', 't', 'i', 'o', 'n' }; static symbol s_5_18[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' }; static symbol s_5_19[4] = { 'i', 'z', 'e', 'r' }; static symbol s_5_20[4] = { 'a', 't', 'o', 'r' }; static symbol s_5_21[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' }; static symbol s_5_22[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' }; static symbol s_5_23[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' }; static struct among a_5[24] = { /* 0 */ { 4, s_5_0, -1, 3, 0}, /* 1 */ { 4, s_5_1, -1, 2, 0}, /* 2 */ { 3, s_5_2, -1, 13, 0}, /* 3 */ { 2, s_5_3, -1, 16, 0}, /* 4 */ { 3, s_5_4, 3, 12, 0}, /* 5 */ { 4, s_5_5, 4, 4, 0}, /* 6 */ { 4, s_5_6, 3, 8, 0}, /* 7 */ { 5, s_5_7, 3, 14, 0}, /* 8 */ { 6, s_5_8, 3, 15, 0}, /* 9 */ { 5, s_5_9, 3, 10, 0}, /* 10 */ { 5, s_5_10, 3, 5, 0}, /* 11 */ { 5, s_5_11, -1, 8, 0}, /* 12 */ { 6, s_5_12, -1, 12, 0}, /* 13 */ { 5, s_5_13, -1, 11, 0}, /* 14 */ { 6, s_5_14, -1, 1, 0}, /* 15 */ { 7, s_5_15, 14, 7, 0}, /* 16 */ { 5, s_5_16, -1, 8, 0}, /* 17 */ { 5, s_5_17, -1, 7, 0}, /* 18 */ { 7, s_5_18, 17, 6, 0}, /* 19 */ { 4, s_5_19, -1, 6, 0}, /* 20 */ { 4, s_5_20, -1, 7, 0}, /* 21 */ { 7, s_5_21, -1, 11, 0}, /* 22 */ { 7, s_5_22, -1, 9, 0}, /* 23 */ { 7, s_5_23, -1, 10, 0} }; static symbol s_6_0[5] = { 'i', 'c', 'a', 't', 'e' }; static symbol s_6_1[5] = { 'a', 't', 'i', 'v', 'e' }; static symbol s_6_2[5] = { 'a', 'l', 'i', 'z', 'e' }; static symbol s_6_3[5] = { 'i', 'c', 'i', 't', 'i' }; static symbol s_6_4[4] = { 'i', 'c', 'a', 'l' }; static symbol s_6_5[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_6_6[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_6_7[3] = { 'f', 'u', 'l' }; static symbol s_6_8[4] = { 'n', 'e', 's', 's' }; static struct among a_6[9] = { /* 0 */ { 5, s_6_0, -1, 4, 0}, /* 1 */ { 5, s_6_1, -1, 6, 0}, /* 2 */ { 5, s_6_2, -1, 3, 0}, /* 3 */ { 5, s_6_3, -1, 4, 0}, /* 4 */ { 4, s_6_4, -1, 4, 0}, /* 5 */ { 6, s_6_5, -1, 1, 0}, /* 6 */ { 7, s_6_6, 5, 2, 0}, /* 7 */ { 3, s_6_7, -1, 5, 0}, /* 8 */ { 4, s_6_8, -1, 5, 0} }; static symbol s_7_0[2] = { 'i', 'c' }; static symbol s_7_1[4] = { 'a', 'n', 'c', 'e' }; static symbol s_7_2[4] = { 'e', 'n', 'c', 'e' }; static symbol s_7_3[4] = { 'a', 'b', 'l', 'e' }; static symbol s_7_4[4] = { 'i', 'b', 'l', 'e' }; static symbol s_7_5[3] = { 'a', 't', 'e' }; static symbol s_7_6[3] = { 'i', 'v', 'e' }; static symbol s_7_7[3] = { 'i', 'z', 'e' }; static symbol s_7_8[3] = { 'i', 't', 'i' }; static symbol s_7_9[2] = { 'a', 'l' }; static symbol s_7_10[3] = { 'i', 's', 'm' }; static symbol s_7_11[3] = { 'i', 'o', 'n' }; static symbol s_7_12[2] = { 'e', 'r' }; static symbol s_7_13[3] = { 'o', 'u', 's' }; static symbol s_7_14[3] = { 'a', 'n', 't' }; static symbol s_7_15[3] = { 'e', 'n', 't' }; static symbol s_7_16[4] = { 'm', 'e', 'n', 't' }; static symbol s_7_17[5] = { 'e', 'm', 'e', 'n', 't' }; static struct among a_7[18] = { /* 0 */ { 2, s_7_0, -1, 1, 0}, /* 1 */ { 4, s_7_1, -1, 1, 0}, /* 2 */ { 4, s_7_2, -1, 1, 0}, /* 3 */ { 4, s_7_3, -1, 1, 0}, /* 4 */ { 4, s_7_4, -1, 1, 0}, /* 5 */ { 3, s_7_5, -1, 1, 0}, /* 6 */ { 3, s_7_6, -1, 1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 3, s_7_8, -1, 1, 0}, /* 9 */ { 2, s_7_9, -1, 1, 0}, /* 10 */ { 3, s_7_10, -1, 1, 0}, /* 11 */ { 3, s_7_11, -1, 2, 0}, /* 12 */ { 2, s_7_12, -1, 1, 0}, /* 13 */ { 3, s_7_13, -1, 1, 0}, /* 14 */ { 3, s_7_14, -1, 1, 0}, /* 15 */ { 3, s_7_15, -1, 1, 0}, /* 16 */ { 4, s_7_16, 15, 1, 0}, /* 17 */ { 5, s_7_17, 16, 1, 0} }; static symbol s_8_0[1] = { 'e' }; static symbol s_8_1[1] = { 'l' }; static struct among a_8[2] = { /* 0 */ { 1, s_8_0, -1, 1, 0}, /* 1 */ { 1, s_8_1, -1, 2, 0} }; static symbol s_9_0[7] = { 's', 'u', 'c', 'c', 'e', 'e', 'd' }; static symbol s_9_1[7] = { 'p', 'r', 'o', 'c', 'e', 'e', 'd' }; static symbol s_9_2[6] = { 'e', 'x', 'c', 'e', 'e', 'd' }; static symbol s_9_3[7] = { 'c', 'a', 'n', 'n', 'i', 'n', 'g' }; static symbol s_9_4[6] = { 'i', 'n', 'n', 'i', 'n', 'g' }; static symbol s_9_5[7] = { 'e', 'a', 'r', 'r', 'i', 'n', 'g' }; static symbol s_9_6[7] = { 'h', 'e', 'r', 'r', 'i', 'n', 'g' }; static symbol s_9_7[6] = { 'o', 'u', 't', 'i', 'n', 'g' }; static struct among a_9[8] = { /* 0 */ { 7, s_9_0, -1, -1, 0}, /* 1 */ { 7, s_9_1, -1, -1, 0}, /* 2 */ { 6, s_9_2, -1, -1, 0}, /* 3 */ { 7, s_9_3, -1, -1, 0}, /* 4 */ { 6, s_9_4, -1, -1, 0}, /* 5 */ { 7, s_9_5, -1, -1, 0}, /* 6 */ { 7, s_9_6, -1, -1, 0}, /* 7 */ { 6, s_9_7, -1, -1, 0} }; static symbol s_10_0[5] = { 'a', 'n', 'd', 'e', 's' }; static symbol s_10_1[5] = { 'a', 't', 'l', 'a', 's' }; static symbol s_10_2[4] = { 'b', 'i', 'a', 's' }; static symbol s_10_3[6] = { 'c', 'o', 's', 'm', 'o', 's' }; static symbol s_10_4[5] = { 'd', 'y', 'i', 'n', 'g' }; static symbol s_10_5[5] = { 'e', 'a', 'r', 'l', 'y' }; static symbol s_10_6[6] = { 'g', 'e', 'n', 't', 'l', 'y' }; static symbol s_10_7[4] = { 'h', 'o', 'w', 'e' }; static symbol s_10_8[4] = { 'i', 'd', 'l', 'y' }; static symbol s_10_9[5] = { 'l', 'y', 'i', 'n', 'g' }; static symbol s_10_10[4] = { 'n', 'e', 'w', 's' }; static symbol s_10_11[4] = { 'o', 'n', 'l', 'y' }; static symbol s_10_12[6] = { 's', 'i', 'n', 'g', 'l', 'y' }; static symbol s_10_13[5] = { 's', 'k', 'i', 'e', 's' }; static symbol s_10_14[4] = { 's', 'k', 'i', 's' }; static symbol s_10_15[3] = { 's', 'k', 'y' }; static symbol s_10_16[5] = { 't', 'y', 'i', 'n', 'g' }; static symbol s_10_17[4] = { 'u', 'g', 'l', 'y' }; static struct among a_10[18] = { /* 0 */ { 5, s_10_0, -1, -1, 0}, /* 1 */ { 5, s_10_1, -1, -1, 0}, /* 2 */ { 4, s_10_2, -1, -1, 0}, /* 3 */ { 6, s_10_3, -1, -1, 0}, /* 4 */ { 5, s_10_4, -1, 3, 0}, /* 5 */ { 5, s_10_5, -1, 9, 0}, /* 6 */ { 6, s_10_6, -1, 7, 0}, /* 7 */ { 4, s_10_7, -1, -1, 0}, /* 8 */ { 4, s_10_8, -1, 6, 0}, /* 9 */ { 5, s_10_9, -1, 4, 0}, /* 10 */ { 4, s_10_10, -1, -1, 0}, /* 11 */ { 4, s_10_11, -1, 10, 0}, /* 12 */ { 6, s_10_12, -1, 11, 0}, /* 13 */ { 5, s_10_13, -1, 2, 0}, /* 14 */ { 4, s_10_14, -1, 1, 0}, /* 15 */ { 3, s_10_15, -1, -1, 0}, /* 16 */ { 5, s_10_16, -1, 5, 0}, /* 17 */ { 4, s_10_17, -1, 8, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1 }; static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 }; static unsigned char g_valid_LI[] = { 55, 141, 2 }; static symbol s_0[] = { '\'' }; static symbol s_1[] = { 'y' }; static symbol s_2[] = { 'Y' }; static symbol s_3[] = { 'y' }; static symbol s_4[] = { 'Y' }; static symbol s_5[] = { 's', 's' }; static symbol s_6[] = { 'i', 'e' }; static symbol s_7[] = { 'i' }; static symbol s_8[] = { 'e', 'e' }; static symbol s_9[] = { 'e' }; static symbol s_10[] = { 'e' }; static symbol s_11[] = { 'y' }; static symbol s_12[] = { 'Y' }; static symbol s_13[] = { 'i' }; static symbol s_14[] = { 't', 'i', 'o', 'n' }; static symbol s_15[] = { 'e', 'n', 'c', 'e' }; static symbol s_16[] = { 'a', 'n', 'c', 'e' }; static symbol s_17[] = { 'a', 'b', 'l', 'e' }; static symbol s_18[] = { 'e', 'n', 't' }; static symbol s_19[] = { 'i', 'z', 'e' }; static symbol s_20[] = { 'a', 't', 'e' }; static symbol s_21[] = { 'a', 'l' }; static symbol s_22[] = { 'f', 'u', 'l' }; static symbol s_23[] = { 'o', 'u', 's' }; static symbol s_24[] = { 'i', 'v', 'e' }; static symbol s_25[] = { 'b', 'l', 'e' }; static symbol s_26[] = { 'l' }; static symbol s_27[] = { 'o', 'g' }; static symbol s_28[] = { 'f', 'u', 'l' }; static symbol s_29[] = { 'l', 'e', 's', 's' }; static symbol s_30[] = { 't', 'i', 'o', 'n' }; static symbol s_31[] = { 'a', 't', 'e' }; static symbol s_32[] = { 'a', 'l' }; static symbol s_33[] = { 'i', 'c' }; static symbol s_34[] = { 's' }; static symbol s_35[] = { 't' }; static symbol s_36[] = { 'l' }; static symbol s_37[] = { 's', 'k', 'i' }; static symbol s_38[] = { 's', 'k', 'y' }; static symbol s_39[] = { 'd', 'i', 'e' }; static symbol s_40[] = { 'l', 'i', 'e' }; static symbol s_41[] = { 't', 'i', 'e' }; static symbol s_42[] = { 'i', 'd', 'l' }; static symbol s_43[] = { 'g', 'e', 'n', 't', 'l' }; static symbol s_44[] = { 'u', 'g', 'l', 'i' }; static symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' }; static symbol s_46[] = { 'o', 'n', 'l', 'i' }; static symbol s_47[] = { 's', 'i', 'n', 'g', 'l' }; static symbol s_48[] = { 'Y' }; static symbol s_49[] = { 'y' }; static int r_prelude(struct SN_env * z) { z->B[0] = 0; /* unset Y_found, line 26 */ { int c = z->c; /* do, line 27 */ z->bra = z->c; /* [, line 27 */ if (!(eq_s(z, 1, s_0))) goto lab0; z->ket = z->c; /* ], line 27 */ { int ret; ret = slice_del(z); /* delete, line 27 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 28 */ z->bra = z->c; /* [, line 28 */ if (!(eq_s(z, 1, s_1))) goto lab1; z->ket = z->c; /* ], line 28 */ if (!(in_grouping_U(z, g_v, 97, 121))) goto lab1; { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 28 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 28 */ lab1: z->c = c; } { int c = z->c; /* do, line 29 */ while(1) { /* repeat, line 29 */ int c = z->c; while(1) { /* goto, line 29 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 121))) goto lab4; z->bra = z->c; /* [, line 29 */ if (!(eq_s(z, 1, s_3))) goto lab4; z->ket = z->c; /* ], line 29 */ z->c = c; break; lab4: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab3; z->c = c; /* goto, line 29 */ } } { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 29 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 29 */ continue; lab3: z->c = c; break; } z->c = c; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; { int c = z->c; /* do, line 35 */ { int c = z->c; /* or, line 40 */ if (!(find_among(z, a_0, 2))) goto lab2; /* among, line 36 */ goto lab1; lab2: z->c = c; while(1) { /* gopast, line 40 */ if (!(in_grouping_U(z, g_v, 97, 121))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 40 */ } } while(1) { /* gopast, line 40 */ if (!(out_grouping_U(z, g_v, 97, 121))) goto lab4; break; lab4: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 40 */ } } } lab1: z->I[0] = z->c; /* setmark p1, line 41 */ while(1) { /* gopast, line 42 */ if (!(in_grouping_U(z, g_v, 97, 121))) goto lab5; break; lab5: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 42 */ } } while(1) { /* gopast, line 42 */ if (!(out_grouping_U(z, g_v, 97, 121))) goto lab6; break; lab6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 42 */ } } z->I[1] = z->c; /* setmark p2, line 42 */ lab0: z->c = c; } return 1; } static int r_shortv(struct SN_env * z) { { int m = z->l - z->c; (void) m; /* or, line 50 */ if (!(out_grouping_b_U(z, g_v_WXY, 89, 121))) goto lab1; if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab1; if (!(out_grouping_b_U(z, g_v, 97, 121))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(out_grouping_b_U(z, g_v, 97, 121))) return 0; if (!(in_grouping_b_U(z, g_v, 97, 121))) return 0; if (z->c > z->lb) return 0; /* atlimit, line 51 */ } lab0: return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_Step_1a(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* try, line 58 */ z->ket = z->c; /* [, line 59 */ among_var = find_among_b(z, a_1, 3); /* substring, line 59 */ if (!(among_var)) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 59 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab0; } case 1: { int ret; ret = slice_del(z); /* delete, line 61 */ if (ret < 0) return ret; } break; } lab0: ; } z->ket = z->c; /* [, line 64 */ among_var = find_among_b(z, a_2, 6); /* substring, line 64 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 64 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 2, s_5); /* <-, line 65 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 67 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) goto lab2; z->c = c; /* next, line 67 */ } if (z->c > z->lb) goto lab2; /* atlimit, line 67 */ { int ret; ret = slice_from_s(z, 2, s_6); /* <-, line 67 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = z->l - m; { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 67 */ if (ret < 0) return ret; } } lab1: break; case 3: { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 68 */ } while(1) { /* gopast, line 68 */ if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* gopast, line 68 */ } } { int ret; ret = slice_del(z); /* delete, line 68 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_1b(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 74 */ among_var = find_among_b(z, a_4, 6); /* substring, line 74 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 74 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 76 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 2, s_8); /* <-, line 76 */ if (ret < 0) return ret; } break; case 2: { int m_test = z->l - z->c; /* test, line 79 */ while(1) { /* gopast, line 79 */ if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab0; break; lab0: { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* gopast, line 79 */ } } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 79 */ if (ret < 0) return ret; } { int m_test = z->l - z->c; /* test, line 80 */ among_var = find_among_b(z, a_3, 13); /* substring, line 80 */ if (!(among_var)) return 0; z->c = z->l - m_test; } switch(among_var) { case 0: return 0; case 1: { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 82 */ z->c = c; } if (ret < 0) return ret; } break; case 2: z->ket = z->c; /* [, line 85 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 85 */ } z->bra = z->c; /* ], line 85 */ { int ret; ret = slice_del(z); /* delete, line 85 */ if (ret < 0) return ret; } break; case 3: if (z->c != z->I[0]) return 0; /* atmark, line 86 */ { int m_test = z->l - z->c; /* test, line 86 */ { int ret = r_shortv(z); if (ret == 0) return 0; /* call shortv, line 86 */ if (ret < 0) return ret; } z->c = z->l - m_test; } { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 86 */ z->c = c; } if (ret < 0) return ret; } break; } break; } return 1; } static int r_Step_1c(struct SN_env * z) { z->ket = z->c; /* [, line 93 */ { int m = z->l - z->c; (void) m; /* or, line 93 */ if (!(eq_s_b(z, 1, s_11))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_12))) return 0; } lab0: z->bra = z->c; /* ], line 93 */ if (!(out_grouping_b_U(z, g_v, 97, 121))) return 0; { int m = z->l - z->c; (void) m; /* not, line 94 */ if (z->c > z->lb) goto lab2; /* atlimit, line 94 */ return 0; lab2: z->c = z->l - m; } { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 95 */ if (ret < 0) return ret; } return 1; } static int r_Step_2(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 99 */ among_var = find_among_b(z, a_5, 24); /* substring, line 99 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 99 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 99 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 4, s_14); /* <-, line 100 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 4, s_15); /* <-, line 101 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 4, s_16); /* <-, line 102 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 4, s_17); /* <-, line 103 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 3, s_18); /* <-, line 104 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 3, s_19); /* <-, line 106 */ if (ret < 0) return ret; } break; case 7: { int ret; ret = slice_from_s(z, 3, s_20); /* <-, line 108 */ if (ret < 0) return ret; } break; case 8: { int ret; ret = slice_from_s(z, 2, s_21); /* <-, line 110 */ if (ret < 0) return ret; } break; case 9: { int ret; ret = slice_from_s(z, 3, s_22); /* <-, line 111 */ if (ret < 0) return ret; } break; case 10: { int ret; ret = slice_from_s(z, 3, s_23); /* <-, line 113 */ if (ret < 0) return ret; } break; case 11: { int ret; ret = slice_from_s(z, 3, s_24); /* <-, line 115 */ if (ret < 0) return ret; } break; case 12: { int ret; ret = slice_from_s(z, 3, s_25); /* <-, line 117 */ if (ret < 0) return ret; } break; case 13: if (!(eq_s_b(z, 1, s_26))) return 0; { int ret; ret = slice_from_s(z, 2, s_27); /* <-, line 118 */ if (ret < 0) return ret; } break; case 14: { int ret; ret = slice_from_s(z, 3, s_28); /* <-, line 119 */ if (ret < 0) return ret; } break; case 15: { int ret; ret = slice_from_s(z, 4, s_29); /* <-, line 120 */ if (ret < 0) return ret; } break; case 16: if (!(in_grouping_b_U(z, g_valid_LI, 99, 116))) return 0; { int ret; ret = slice_del(z); /* delete, line 121 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_3(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 126 */ among_var = find_among_b(z, a_6, 9); /* substring, line 126 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 126 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 126 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 4, s_30); /* <-, line 127 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 3, s_31); /* <-, line 128 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 2, s_32); /* <-, line 129 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 2, s_33); /* <-, line 131 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } break; case 6: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 135 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 135 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_4(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 140 */ among_var = find_among_b(z, a_7, 18); /* substring, line 140 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 140 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 140 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 144 */ if (!(eq_s_b(z, 1, s_34))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_35))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 144 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_5(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 149 */ among_var = find_among_b(z, a_8, 2); /* substring, line 149 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 149 */ switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* or, line 150 */ { int ret = r_R2(z); if (ret == 0) goto lab1; /* call R2, line 150 */ if (ret < 0) return ret; } goto lab0; lab1: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 150 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 150 */ { int ret = r_shortv(z); if (ret == 0) goto lab2; /* call shortv, line 150 */ if (ret < 0) return ret; } return 0; lab2: z->c = z->l - m; } } lab0: { int ret; ret = slice_del(z); /* delete, line 150 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 151 */ if (ret < 0) return ret; } if (!(eq_s_b(z, 1, s_36))) return 0; { int ret; ret = slice_del(z); /* delete, line 151 */ if (ret < 0) return ret; } break; } return 1; } static int r_exception2(struct SN_env * z) { z->ket = z->c; /* [, line 157 */ if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 157 */ z->bra = z->c; /* ], line 157 */ if (z->c > z->lb) return 0; /* atlimit, line 157 */ return 1; } static int r_exception1(struct SN_env * z) { int among_var; z->bra = z->c; /* [, line 169 */ among_var = find_among(z, a_10, 18); /* substring, line 169 */ if (!(among_var)) return 0; z->ket = z->c; /* ], line 169 */ if (z->c < z->l) return 0; /* atlimit, line 169 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 3, s_37); /* <-, line 173 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 3, s_38); /* <-, line 174 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 3, s_39); /* <-, line 175 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 3, s_40); /* <-, line 176 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 3, s_41); /* <-, line 177 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 3, s_42); /* <-, line 181 */ if (ret < 0) return ret; } break; case 7: { int ret; ret = slice_from_s(z, 5, s_43); /* <-, line 182 */ if (ret < 0) return ret; } break; case 8: { int ret; ret = slice_from_s(z, 4, s_44); /* <-, line 183 */ if (ret < 0) return ret; } break; case 9: { int ret; ret = slice_from_s(z, 5, s_45); /* <-, line 184 */ if (ret < 0) return ret; } break; case 10: { int ret; ret = slice_from_s(z, 4, s_46); /* <-, line 185 */ if (ret < 0) return ret; } break; case 11: { int ret; ret = slice_from_s(z, 5, s_47); /* <-, line 186 */ if (ret < 0) return ret; } break; } return 1; } static int r_postlude(struct SN_env * z) { if (!(z->B[0])) return 0; /* Boolean test Y_found, line 202 */ while(1) { /* repeat, line 202 */ int c = z->c; while(1) { /* goto, line 202 */ int c = z->c; z->bra = z->c; /* [, line 202 */ if (!(eq_s(z, 1, s_48))) goto lab1; z->ket = z->c; /* ], line 202 */ z->c = c; break; lab1: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* goto, line 202 */ } } { int ret; ret = slice_from_s(z, 1, s_49); /* <-, line 202 */ if (ret < 0) return ret; } continue; lab0: z->c = c; break; } return 1; } extern int english_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* or, line 206 */ { int ret = r_exception1(z); if (ret == 0) goto lab1; /* call exception1, line 206 */ if (ret < 0) return ret; } goto lab0; lab1: z->c = c; { int c = z->c; /* not, line 207 */ { int c = skip_utf8(z->p, z->c, 0, z->l, + 3); if (c < 0) goto lab3; z->c = c; /* hop, line 207 */ } goto lab2; lab3: z->c = c; } goto lab0; lab2: z->c = c; { int c = z->c; /* do, line 208 */ { int ret = r_prelude(z); if (ret == 0) goto lab4; /* call prelude, line 208 */ if (ret < 0) return ret; } lab4: z->c = c; } { int c = z->c; /* do, line 209 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab5; /* call mark_regions, line 209 */ if (ret < 0) return ret; } lab5: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 210 */ { int m = z->l - z->c; (void) m; /* do, line 212 */ { int ret = r_Step_1a(z); if (ret == 0) goto lab6; /* call Step_1a, line 212 */ if (ret < 0) return ret; } lab6: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* or, line 214 */ { int ret = r_exception2(z); if (ret == 0) goto lab8; /* call exception2, line 214 */ if (ret < 0) return ret; } goto lab7; lab8: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 216 */ { int ret = r_Step_1b(z); if (ret == 0) goto lab9; /* call Step_1b, line 216 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 217 */ { int ret = r_Step_1c(z); if (ret == 0) goto lab10; /* call Step_1c, line 217 */ if (ret < 0) return ret; } lab10: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 219 */ { int ret = r_Step_2(z); if (ret == 0) goto lab11; /* call Step_2, line 219 */ if (ret < 0) return ret; } lab11: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 220 */ { int ret = r_Step_3(z); if (ret == 0) goto lab12; /* call Step_3, line 220 */ if (ret < 0) return ret; } lab12: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 221 */ { int ret = r_Step_4(z); if (ret == 0) goto lab13; /* call Step_4, line 221 */ if (ret < 0) return ret; } lab13: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 223 */ { int ret = r_Step_5(z); if (ret == 0) goto lab14; /* call Step_5, line 223 */ if (ret < 0) return ret; } lab14: z->c = z->l - m; } } lab7: z->c = z->lb; { int c = z->c; /* do, line 226 */ { int ret = r_postlude(z); if (ret == 0) goto lab15; /* call postlude, line 226 */ if (ret < 0) return ret; } lab15: z->c = c; } } lab0: return 1; } extern struct SN_env * english_UTF_8_create_env(void) { return SN_create_env(0, 2, 1); } extern void english_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_english.h000066400000000000000000000004711154025176300274400ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * english_UTF_8_create_env(void); extern void english_UTF_8_close_env(struct SN_env * z); extern int english_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_finnish.c000066400000000000000000000627341154025176300274520ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int finnish_UTF_8_stem(struct SN_env * z); static int r_tidy(struct SN_env * z); static int r_other_endings(struct SN_env * z); static int r_t_plural(struct SN_env * z); static int r_i_plural(struct SN_env * z); static int r_case_ending(struct SN_env * z); static int r_VI(struct SN_env * z); static int r_LONG(struct SN_env * z); static int r_possessive(struct SN_env * z); static int r_particle_etc(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * finnish_UTF_8_create_env(void); extern void finnish_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[2] = { 'p', 'a' }; static symbol s_0_1[3] = { 's', 't', 'i' }; static symbol s_0_2[4] = { 'k', 'a', 'a', 'n' }; static symbol s_0_3[3] = { 'h', 'a', 'n' }; static symbol s_0_4[3] = { 'k', 'i', 'n' }; static symbol s_0_5[4] = { 'h', 0xC3, 0xA4, 'n' }; static symbol s_0_6[6] = { 'k', 0xC3, 0xA4, 0xC3, 0xA4, 'n' }; static symbol s_0_7[2] = { 'k', 'o' }; static symbol s_0_8[3] = { 'p', 0xC3, 0xA4 }; static symbol s_0_9[3] = { 'k', 0xC3, 0xB6 }; static struct among a_0[10] = { /* 0 */ { 2, s_0_0, -1, 1, 0}, /* 1 */ { 3, s_0_1, -1, 2, 0}, /* 2 */ { 4, s_0_2, -1, 1, 0}, /* 3 */ { 3, s_0_3, -1, 1, 0}, /* 4 */ { 3, s_0_4, -1, 1, 0}, /* 5 */ { 4, s_0_5, -1, 1, 0}, /* 6 */ { 6, s_0_6, -1, 1, 0}, /* 7 */ { 2, s_0_7, -1, 1, 0}, /* 8 */ { 3, s_0_8, -1, 1, 0}, /* 9 */ { 3, s_0_9, -1, 1, 0} }; static symbol s_1_0[3] = { 'l', 'l', 'a' }; static symbol s_1_1[2] = { 'n', 'a' }; static symbol s_1_2[3] = { 's', 's', 'a' }; static symbol s_1_3[2] = { 't', 'a' }; static symbol s_1_4[3] = { 'l', 't', 'a' }; static symbol s_1_5[3] = { 's', 't', 'a' }; static struct among a_1[6] = { /* 0 */ { 3, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0}, /* 2 */ { 3, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0}, /* 4 */ { 3, s_1_4, 3, -1, 0}, /* 5 */ { 3, s_1_5, 3, -1, 0} }; static symbol s_2_0[4] = { 'l', 'l', 0xC3, 0xA4 }; static symbol s_2_1[3] = { 'n', 0xC3, 0xA4 }; static symbol s_2_2[4] = { 's', 's', 0xC3, 0xA4 }; static symbol s_2_3[3] = { 't', 0xC3, 0xA4 }; static symbol s_2_4[4] = { 'l', 't', 0xC3, 0xA4 }; static symbol s_2_5[4] = { 's', 't', 0xC3, 0xA4 }; static struct among a_2[6] = { /* 0 */ { 4, s_2_0, -1, -1, 0}, /* 1 */ { 3, s_2_1, -1, -1, 0}, /* 2 */ { 4, s_2_2, -1, -1, 0}, /* 3 */ { 3, s_2_3, -1, -1, 0}, /* 4 */ { 4, s_2_4, 3, -1, 0}, /* 5 */ { 4, s_2_5, 3, -1, 0} }; static symbol s_3_0[3] = { 'l', 'l', 'e' }; static symbol s_3_1[3] = { 'i', 'n', 'e' }; static struct among a_3[2] = { /* 0 */ { 3, s_3_0, -1, -1, 0}, /* 1 */ { 3, s_3_1, -1, -1, 0} }; static symbol s_4_0[3] = { 'n', 's', 'a' }; static symbol s_4_1[3] = { 'm', 'm', 'e' }; static symbol s_4_2[3] = { 'n', 'n', 'e' }; static symbol s_4_3[2] = { 'n', 'i' }; static symbol s_4_4[2] = { 's', 'i' }; static symbol s_4_5[2] = { 'a', 'n' }; static symbol s_4_6[2] = { 'e', 'n' }; static symbol s_4_7[3] = { 0xC3, 0xA4, 'n' }; static symbol s_4_8[4] = { 'n', 's', 0xC3, 0xA4 }; static struct among a_4[9] = { /* 0 */ { 3, s_4_0, -1, 3, 0}, /* 1 */ { 3, s_4_1, -1, 3, 0}, /* 2 */ { 3, s_4_2, -1, 3, 0}, /* 3 */ { 2, s_4_3, -1, 2, 0}, /* 4 */ { 2, s_4_4, -1, 1, 0}, /* 5 */ { 2, s_4_5, -1, 4, 0}, /* 6 */ { 2, s_4_6, -1, 6, 0}, /* 7 */ { 3, s_4_7, -1, 5, 0}, /* 8 */ { 4, s_4_8, -1, 3, 0} }; static symbol s_5_0[2] = { 'a', 'a' }; static symbol s_5_1[2] = { 'e', 'e' }; static symbol s_5_2[2] = { 'i', 'i' }; static symbol s_5_3[2] = { 'o', 'o' }; static symbol s_5_4[2] = { 'u', 'u' }; static symbol s_5_5[4] = { 0xC3, 0xA4, 0xC3, 0xA4 }; static symbol s_5_6[4] = { 0xC3, 0xB6, 0xC3, 0xB6 }; static struct among a_5[7] = { /* 0 */ { 2, s_5_0, -1, -1, 0}, /* 1 */ { 2, s_5_1, -1, -1, 0}, /* 2 */ { 2, s_5_2, -1, -1, 0}, /* 3 */ { 2, s_5_3, -1, -1, 0}, /* 4 */ { 2, s_5_4, -1, -1, 0}, /* 5 */ { 4, s_5_5, -1, -1, 0}, /* 6 */ { 4, s_5_6, -1, -1, 0} }; static symbol s_6_0[1] = { 'a' }; static symbol s_6_1[3] = { 'l', 'l', 'a' }; static symbol s_6_2[2] = { 'n', 'a' }; static symbol s_6_3[3] = { 's', 's', 'a' }; static symbol s_6_4[2] = { 't', 'a' }; static symbol s_6_5[3] = { 'l', 't', 'a' }; static symbol s_6_6[3] = { 's', 't', 'a' }; static symbol s_6_7[3] = { 't', 't', 'a' }; static symbol s_6_8[3] = { 'l', 'l', 'e' }; static symbol s_6_9[3] = { 'i', 'n', 'e' }; static symbol s_6_10[3] = { 'k', 's', 'i' }; static symbol s_6_11[1] = { 'n' }; static symbol s_6_12[3] = { 'h', 'a', 'n' }; static symbol s_6_13[3] = { 'd', 'e', 'n' }; static symbol s_6_14[4] = { 's', 'e', 'e', 'n' }; static symbol s_6_15[3] = { 'h', 'e', 'n' }; static symbol s_6_16[4] = { 't', 't', 'e', 'n' }; static symbol s_6_17[3] = { 'h', 'i', 'n' }; static symbol s_6_18[4] = { 's', 'i', 'i', 'n' }; static symbol s_6_19[3] = { 'h', 'o', 'n' }; static symbol s_6_20[4] = { 'h', 0xC3, 0xA4, 'n' }; static symbol s_6_21[4] = { 'h', 0xC3, 0xB6, 'n' }; static symbol s_6_22[2] = { 0xC3, 0xA4 }; static symbol s_6_23[4] = { 'l', 'l', 0xC3, 0xA4 }; static symbol s_6_24[3] = { 'n', 0xC3, 0xA4 }; static symbol s_6_25[4] = { 's', 's', 0xC3, 0xA4 }; static symbol s_6_26[3] = { 't', 0xC3, 0xA4 }; static symbol s_6_27[4] = { 'l', 't', 0xC3, 0xA4 }; static symbol s_6_28[4] = { 's', 't', 0xC3, 0xA4 }; static symbol s_6_29[4] = { 't', 't', 0xC3, 0xA4 }; static struct among a_6[30] = { /* 0 */ { 1, s_6_0, -1, 8, 0}, /* 1 */ { 3, s_6_1, 0, -1, 0}, /* 2 */ { 2, s_6_2, 0, -1, 0}, /* 3 */ { 3, s_6_3, 0, -1, 0}, /* 4 */ { 2, s_6_4, 0, -1, 0}, /* 5 */ { 3, s_6_5, 4, -1, 0}, /* 6 */ { 3, s_6_6, 4, -1, 0}, /* 7 */ { 3, s_6_7, 4, 9, 0}, /* 8 */ { 3, s_6_8, -1, -1, 0}, /* 9 */ { 3, s_6_9, -1, -1, 0}, /* 10 */ { 3, s_6_10, -1, -1, 0}, /* 11 */ { 1, s_6_11, -1, 7, 0}, /* 12 */ { 3, s_6_12, 11, 1, 0}, /* 13 */ { 3, s_6_13, 11, -1, r_VI}, /* 14 */ { 4, s_6_14, 11, -1, r_LONG}, /* 15 */ { 3, s_6_15, 11, 2, 0}, /* 16 */ { 4, s_6_16, 11, -1, r_VI}, /* 17 */ { 3, s_6_17, 11, 3, 0}, /* 18 */ { 4, s_6_18, 11, -1, r_VI}, /* 19 */ { 3, s_6_19, 11, 4, 0}, /* 20 */ { 4, s_6_20, 11, 5, 0}, /* 21 */ { 4, s_6_21, 11, 6, 0}, /* 22 */ { 2, s_6_22, -1, 8, 0}, /* 23 */ { 4, s_6_23, 22, -1, 0}, /* 24 */ { 3, s_6_24, 22, -1, 0}, /* 25 */ { 4, s_6_25, 22, -1, 0}, /* 26 */ { 3, s_6_26, 22, -1, 0}, /* 27 */ { 4, s_6_27, 26, -1, 0}, /* 28 */ { 4, s_6_28, 26, -1, 0}, /* 29 */ { 4, s_6_29, 26, 9, 0} }; static symbol s_7_0[3] = { 'e', 'j', 'a' }; static symbol s_7_1[3] = { 'm', 'm', 'a' }; static symbol s_7_2[4] = { 'i', 'm', 'm', 'a' }; static symbol s_7_3[3] = { 'm', 'p', 'a' }; static symbol s_7_4[4] = { 'i', 'm', 'p', 'a' }; static symbol s_7_5[3] = { 'm', 'm', 'i' }; static symbol s_7_6[4] = { 'i', 'm', 'm', 'i' }; static symbol s_7_7[3] = { 'm', 'p', 'i' }; static symbol s_7_8[4] = { 'i', 'm', 'p', 'i' }; static symbol s_7_9[4] = { 'e', 'j', 0xC3, 0xA4 }; static symbol s_7_10[4] = { 'm', 'm', 0xC3, 0xA4 }; static symbol s_7_11[5] = { 'i', 'm', 'm', 0xC3, 0xA4 }; static symbol s_7_12[4] = { 'm', 'p', 0xC3, 0xA4 }; static symbol s_7_13[5] = { 'i', 'm', 'p', 0xC3, 0xA4 }; static struct among a_7[14] = { /* 0 */ { 3, s_7_0, -1, -1, 0}, /* 1 */ { 3, s_7_1, -1, 1, 0}, /* 2 */ { 4, s_7_2, 1, -1, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0}, /* 4 */ { 4, s_7_4, 3, -1, 0}, /* 5 */ { 3, s_7_5, -1, 1, 0}, /* 6 */ { 4, s_7_6, 5, -1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 4, s_7_8, 7, -1, 0}, /* 9 */ { 4, s_7_9, -1, -1, 0}, /* 10 */ { 4, s_7_10, -1, 1, 0}, /* 11 */ { 5, s_7_11, 10, -1, 0}, /* 12 */ { 4, s_7_12, -1, 1, 0}, /* 13 */ { 5, s_7_13, 12, -1, 0} }; static symbol s_8_0[1] = { 'i' }; static symbol s_8_1[1] = { 'j' }; static struct among a_8[2] = { /* 0 */ { 1, s_8_0, -1, -1, 0}, /* 1 */ { 1, s_8_1, -1, -1, 0} }; static symbol s_9_0[3] = { 'm', 'm', 'a' }; static symbol s_9_1[4] = { 'i', 'm', 'm', 'a' }; static struct among a_9[2] = { /* 0 */ { 3, s_9_0, -1, 1, 0}, /* 1 */ { 4, s_9_1, 0, -1, 0} }; static unsigned char g_AEI[] = { 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 }; static unsigned char g_V1[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 }; static unsigned char g_V2[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 }; static unsigned char g_particle_end[] = { 17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 }; static symbol s_0[] = { 'k' }; static symbol s_1[] = { 'k', 's', 'e' }; static symbol s_2[] = { 'k', 's', 'i' }; static symbol s_3[] = { 'i' }; static symbol s_4[] = { 'a' }; static symbol s_5[] = { 'e' }; static symbol s_6[] = { 'i' }; static symbol s_7[] = { 'o' }; static symbol s_8[] = { 0xC3, 0xA4 }; static symbol s_9[] = { 0xC3, 0xB6 }; static symbol s_10[] = { 'i', 'e' }; static symbol s_11[] = { 'e' }; static symbol s_12[] = { 'p', 'o' }; static symbol s_13[] = { 't' }; static symbol s_14[] = { 'p', 'o' }; static symbol s_15[] = { 'j' }; static symbol s_16[] = { 'o' }; static symbol s_17[] = { 'u' }; static symbol s_18[] = { 'o' }; static symbol s_19[] = { 'j' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; while(1) { /* goto, line 46 */ int c = z->c; if (!(in_grouping_U(z, g_V1, 97, 246))) goto lab0; z->c = c; break; lab0: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* goto, line 46 */ } } while(1) { /* gopast, line 46 */ if (!(out_grouping_U(z, g_V1, 97, 246))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 46 */ } } z->I[0] = z->c; /* setmark p1, line 46 */ while(1) { /* goto, line 47 */ int c = z->c; if (!(in_grouping_U(z, g_V1, 97, 246))) goto lab2; z->c = c; break; lab2: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* goto, line 47 */ } } while(1) { /* gopast, line 47 */ if (!(out_grouping_U(z, g_V1, 97, 246))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 47 */ } } z->I[1] = z->c; /* setmark p2, line 47 */ return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_particle_etc(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 55 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 55 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 55 */ among_var = find_among_b(z, a_0, 10); /* substring, line 55 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 55 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: if (!(in_grouping_b_U(z, g_particle_end, 97, 246))) return 0; break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 64 */ if (ret < 0) return ret; } break; } { int ret; ret = slice_del(z); /* delete, line 66 */ if (ret < 0) return ret; } return 1; } static int r_possessive(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 69 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 69 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 69 */ among_var = find_among_b(z, a_4, 9); /* substring, line 69 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 69 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* not, line 72 */ if (!(eq_s_b(z, 1, s_0))) goto lab0; return 0; lab0: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 72 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 74 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 74 */ if (!(eq_s_b(z, 3, s_1))) return 0; z->bra = z->c; /* ], line 74 */ { int ret; ret = slice_from_s(z, 3, s_2); /* <-, line 74 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 78 */ if (ret < 0) return ret; } break; case 4: if (!(find_among_b(z, a_1, 6))) return 0; /* among, line 81 */ { int ret; ret = slice_del(z); /* delete, line 81 */ if (ret < 0) return ret; } break; case 5: if (!(find_among_b(z, a_2, 6))) return 0; /* among, line 83 */ { int ret; ret = slice_del(z); /* delete, line 84 */ if (ret < 0) return ret; } break; case 6: if (!(find_among_b(z, a_3, 2))) return 0; /* among, line 86 */ { int ret; ret = slice_del(z); /* delete, line 86 */ if (ret < 0) return ret; } break; } return 1; } static int r_LONG(struct SN_env * z) { if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 91 */ return 1; } static int r_VI(struct SN_env * z) { if (!(eq_s_b(z, 1, s_3))) return 0; if (!(in_grouping_b_U(z, g_V2, 97, 246))) return 0; return 1; } static int r_case_ending(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 96 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 96 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 96 */ among_var = find_among_b(z, a_6, 30); /* substring, line 96 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 96 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: if (!(eq_s_b(z, 1, s_4))) return 0; break; case 2: if (!(eq_s_b(z, 1, s_5))) return 0; break; case 3: if (!(eq_s_b(z, 1, s_6))) return 0; break; case 4: if (!(eq_s_b(z, 1, s_7))) return 0; break; case 5: if (!(eq_s_b(z, 2, s_8))) return 0; break; case 6: if (!(eq_s_b(z, 2, s_9))) return 0; break; case 7: { int m = z->l - z->c; (void) m; /* try, line 111 */ { int m = z->l - z->c; (void) m; /* and, line 113 */ { int m = z->l - z->c; (void) m; /* or, line 112 */ { int ret = r_LONG(z); if (ret == 0) goto lab2; /* call LONG, line 111 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m; goto lab0; } } lab1: z->c = z->l - m; { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) { z->c = z->l - m; goto lab0; } z->c = c; /* next, line 113 */ } } z->bra = z->c; /* ], line 113 */ lab0: ; } break; case 8: if (!(in_grouping_b_U(z, g_V1, 97, 246))) return 0; if (!(out_grouping_b_U(z, g_V1, 97, 246))) return 0; break; case 9: if (!(eq_s_b(z, 1, s_11))) return 0; break; } { int ret; ret = slice_del(z); /* delete, line 138 */ if (ret < 0) return ret; } z->B[0] = 1; /* set ending_removed, line 139 */ return 1; } static int r_other_endings(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 142 */ int m = z->l - z->c; (void) m; if (z->c < z->I[1]) return 0; z->c = z->I[1]; /* tomark, line 142 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 142 */ among_var = find_among_b(z, a_7, 14); /* substring, line 142 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 142 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* not, line 146 */ if (!(eq_s_b(z, 2, s_12))) goto lab0; return 0; lab0: z->c = z->l - m; } break; } { int ret; ret = slice_del(z); /* delete, line 151 */ if (ret < 0) return ret; } return 1; } static int r_i_plural(struct SN_env * z) { { int m3; /* setlimit, line 154 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 154 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 154 */ if (!(find_among_b(z, a_8, 2))) { z->lb = m3; return 0; } /* substring, line 154 */ z->bra = z->c; /* ], line 154 */ z->lb = m3; } { int ret; ret = slice_del(z); /* delete, line 158 */ if (ret < 0) return ret; } return 1; } static int r_t_plural(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 161 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 161 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 162 */ if (!(eq_s_b(z, 1, s_13))) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 162 */ { int m_test = z->l - z->c; /* test, line 162 */ if (!(in_grouping_b_U(z, g_V1, 97, 246))) { z->lb = m3; return 0; } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 163 */ if (ret < 0) return ret; } z->lb = m3; } { int m3; /* setlimit, line 165 */ int m = z->l - z->c; (void) m; if (z->c < z->I[1]) return 0; z->c = z->I[1]; /* tomark, line 165 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 165 */ among_var = find_among_b(z, a_9, 2); /* substring, line 165 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 165 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* not, line 167 */ if (!(eq_s_b(z, 2, s_14))) goto lab0; return 0; lab0: z->c = z->l - m; } break; } { int ret; ret = slice_del(z); /* delete, line 170 */ if (ret < 0) return ret; } return 1; } static int r_tidy(struct SN_env * z) { { int m3; /* setlimit, line 173 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 173 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 174 */ { int m = z->l - z->c; (void) m; /* and, line 174 */ { int ret = r_LONG(z); if (ret == 0) goto lab0; /* call LONG, line 174 */ if (ret < 0) return ret; } z->c = z->l - m; z->ket = z->c; /* [, line 174 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) goto lab0; z->c = c; /* next, line 174 */ } z->bra = z->c; /* ], line 174 */ { int ret; ret = slice_del(z); /* delete, line 174 */ if (ret < 0) return ret; } } lab0: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 175 */ z->ket = z->c; /* [, line 175 */ if (!(in_grouping_b_U(z, g_AEI, 97, 228))) goto lab1; z->bra = z->c; /* ], line 175 */ if (!(out_grouping_b_U(z, g_V1, 97, 246))) goto lab1; { int ret; ret = slice_del(z); /* delete, line 175 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 176 */ z->ket = z->c; /* [, line 176 */ if (!(eq_s_b(z, 1, s_15))) goto lab2; z->bra = z->c; /* ], line 176 */ { int m = z->l - z->c; (void) m; /* or, line 176 */ if (!(eq_s_b(z, 1, s_16))) goto lab4; goto lab3; lab4: z->c = z->l - m; if (!(eq_s_b(z, 1, s_17))) goto lab2; } lab3: { int ret; ret = slice_del(z); /* delete, line 176 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 177 */ z->ket = z->c; /* [, line 177 */ if (!(eq_s_b(z, 1, s_18))) goto lab5; z->bra = z->c; /* ], line 177 */ if (!(eq_s_b(z, 1, s_19))) goto lab5; { int ret; ret = slice_del(z); /* delete, line 177 */ if (ret < 0) return ret; } lab5: z->c = z->l - m; } z->lb = m3; } while(1) { /* goto, line 179 */ int m = z->l - z->c; (void) m; if (!(out_grouping_b_U(z, g_V1, 97, 246))) goto lab6; z->c = z->l - m; break; lab6: z->c = z->l - m; { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* goto, line 179 */ } } z->ket = z->c; /* [, line 179 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 179 */ } z->bra = z->c; /* ], line 179 */ z->S[0] = slice_to(z, z->S[0]); /* -> x, line 179 */ if (z->S[0] == 0) return -1; /* -> x, line 179 */ if (!(eq_v_b(z, z->S[0]))) return 0; /* name x, line 179 */ { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } return 1; } extern int finnish_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 185 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 185 */ if (ret < 0) return ret; } lab0: z->c = c; } z->B[0] = 0; /* unset ending_removed, line 186 */ z->lb = z->c; z->c = z->l; /* backwards, line 187 */ { int m = z->l - z->c; (void) m; /* do, line 188 */ { int ret = r_particle_etc(z); if (ret == 0) goto lab1; /* call particle_etc, line 188 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 189 */ { int ret = r_possessive(z); if (ret == 0) goto lab2; /* call possessive, line 189 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 190 */ { int ret = r_case_ending(z); if (ret == 0) goto lab3; /* call case_ending, line 190 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 191 */ { int ret = r_other_endings(z); if (ret == 0) goto lab4; /* call other_endings, line 191 */ if (ret < 0) return ret; } lab4: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* or, line 192 */ if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 192 */ { int m = z->l - z->c; (void) m; /* do, line 192 */ { int ret = r_i_plural(z); if (ret == 0) goto lab7; /* call i_plural, line 192 */ if (ret < 0) return ret; } lab7: z->c = z->l - m; } goto lab5; lab6: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 192 */ { int ret = r_t_plural(z); if (ret == 0) goto lab8; /* call t_plural, line 192 */ if (ret < 0) return ret; } lab8: z->c = z->l - m; } } lab5: { int m = z->l - z->c; (void) m; /* do, line 193 */ { int ret = r_tidy(z); if (ret == 0) goto lab9; /* call tidy, line 193 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * finnish_UTF_8_create_env(void) { return SN_create_env(1, 2, 1); } extern void finnish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_finnish.h000066400000000000000000000004711154025176300274450ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * finnish_UTF_8_create_env(void); extern void finnish_UTF_8_close_env(struct SN_env * z); extern int finnish_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_french.c000066400000000000000000001343341154025176300272550ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int french_UTF_8_stem(struct SN_env * z); static int r_un_accent(struct SN_env * z); static int r_un_double(struct SN_env * z); static int r_residual_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_i_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * french_UTF_8_create_env(void); extern void french_UTF_8_close_env(struct SN_env * z); static symbol s_0_1[1] = { 'I' }; static symbol s_0_2[1] = { 'U' }; static symbol s_0_3[1] = { 'Y' }; static struct among a_0[4] = { /* 0 */ { 0, 0, -1, 4, 0}, /* 1 */ { 1, s_0_1, 0, 1, 0}, /* 2 */ { 1, s_0_2, 0, 2, 0}, /* 3 */ { 1, s_0_3, 0, 3, 0} }; static symbol s_1_0[3] = { 'i', 'q', 'U' }; static symbol s_1_1[3] = { 'a', 'b', 'l' }; static symbol s_1_2[4] = { 'I', 0xC3, 0xA8, 'r' }; static symbol s_1_3[4] = { 'i', 0xC3, 0xA8, 'r' }; static symbol s_1_4[3] = { 'e', 'u', 's' }; static symbol s_1_5[2] = { 'i', 'v' }; static struct among a_1[6] = { /* 0 */ { 3, s_1_0, -1, 3, 0}, /* 1 */ { 3, s_1_1, -1, 3, 0}, /* 2 */ { 4, s_1_2, -1, 4, 0}, /* 3 */ { 4, s_1_3, -1, 4, 0}, /* 4 */ { 3, s_1_4, -1, 2, 0}, /* 5 */ { 2, s_1_5, -1, 1, 0} }; static symbol s_2_0[2] = { 'i', 'c' }; static symbol s_2_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_2_2[2] = { 'i', 'v' }; static struct among a_2[3] = { /* 0 */ { 2, s_2_0, -1, 2, 0}, /* 1 */ { 4, s_2_1, -1, 1, 0}, /* 2 */ { 2, s_2_2, -1, 3, 0} }; static symbol s_3_0[4] = { 'i', 'q', 'U', 'e' }; static symbol s_3_1[6] = { 'a', 't', 'r', 'i', 'c', 'e' }; static symbol s_3_2[4] = { 'a', 'n', 'c', 'e' }; static symbol s_3_3[4] = { 'e', 'n', 'c', 'e' }; static symbol s_3_4[5] = { 'l', 'o', 'g', 'i', 'e' }; static symbol s_3_5[4] = { 'a', 'b', 'l', 'e' }; static symbol s_3_6[4] = { 'i', 's', 'm', 'e' }; static symbol s_3_7[4] = { 'e', 'u', 's', 'e' }; static symbol s_3_8[4] = { 'i', 's', 't', 'e' }; static symbol s_3_9[3] = { 'i', 'v', 'e' }; static symbol s_3_10[2] = { 'i', 'f' }; static symbol s_3_11[5] = { 'u', 's', 'i', 'o', 'n' }; static symbol s_3_12[5] = { 'a', 't', 'i', 'o', 'n' }; static symbol s_3_13[5] = { 'u', 't', 'i', 'o', 'n' }; static symbol s_3_14[5] = { 'a', 't', 'e', 'u', 'r' }; static symbol s_3_15[5] = { 'i', 'q', 'U', 'e', 's' }; static symbol s_3_16[7] = { 'a', 't', 'r', 'i', 'c', 'e', 's' }; static symbol s_3_17[5] = { 'a', 'n', 'c', 'e', 's' }; static symbol s_3_18[5] = { 'e', 'n', 'c', 'e', 's' }; static symbol s_3_19[6] = { 'l', 'o', 'g', 'i', 'e', 's' }; static symbol s_3_20[5] = { 'a', 'b', 'l', 'e', 's' }; static symbol s_3_21[5] = { 'i', 's', 'm', 'e', 's' }; static symbol s_3_22[5] = { 'e', 'u', 's', 'e', 's' }; static symbol s_3_23[5] = { 'i', 's', 't', 'e', 's' }; static symbol s_3_24[4] = { 'i', 'v', 'e', 's' }; static symbol s_3_25[3] = { 'i', 'f', 's' }; static symbol s_3_26[6] = { 'u', 's', 'i', 'o', 'n', 's' }; static symbol s_3_27[6] = { 'a', 't', 'i', 'o', 'n', 's' }; static symbol s_3_28[6] = { 'u', 't', 'i', 'o', 'n', 's' }; static symbol s_3_29[6] = { 'a', 't', 'e', 'u', 'r', 's' }; static symbol s_3_30[5] = { 'm', 'e', 'n', 't', 's' }; static symbol s_3_31[6] = { 'e', 'm', 'e', 'n', 't', 's' }; static symbol s_3_32[9] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't', 's' }; static symbol s_3_33[5] = { 'i', 't', 0xC3, 0xA9, 's' }; static symbol s_3_34[4] = { 'm', 'e', 'n', 't' }; static symbol s_3_35[5] = { 'e', 'm', 'e', 'n', 't' }; static symbol s_3_36[8] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't' }; static symbol s_3_37[6] = { 'a', 'm', 'm', 'e', 'n', 't' }; static symbol s_3_38[6] = { 'e', 'm', 'm', 'e', 'n', 't' }; static symbol s_3_39[3] = { 'a', 'u', 'x' }; static symbol s_3_40[4] = { 'e', 'a', 'u', 'x' }; static symbol s_3_41[3] = { 'e', 'u', 'x' }; static symbol s_3_42[4] = { 'i', 't', 0xC3, 0xA9 }; static struct among a_3[43] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 6, s_3_1, -1, 2, 0}, /* 2 */ { 4, s_3_2, -1, 1, 0}, /* 3 */ { 4, s_3_3, -1, 5, 0}, /* 4 */ { 5, s_3_4, -1, 3, 0}, /* 5 */ { 4, s_3_5, -1, 1, 0}, /* 6 */ { 4, s_3_6, -1, 1, 0}, /* 7 */ { 4, s_3_7, -1, 11, 0}, /* 8 */ { 4, s_3_8, -1, 1, 0}, /* 9 */ { 3, s_3_9, -1, 8, 0}, /* 10 */ { 2, s_3_10, -1, 8, 0}, /* 11 */ { 5, s_3_11, -1, 4, 0}, /* 12 */ { 5, s_3_12, -1, 2, 0}, /* 13 */ { 5, s_3_13, -1, 4, 0}, /* 14 */ { 5, s_3_14, -1, 2, 0}, /* 15 */ { 5, s_3_15, -1, 1, 0}, /* 16 */ { 7, s_3_16, -1, 2, 0}, /* 17 */ { 5, s_3_17, -1, 1, 0}, /* 18 */ { 5, s_3_18, -1, 5, 0}, /* 19 */ { 6, s_3_19, -1, 3, 0}, /* 20 */ { 5, s_3_20, -1, 1, 0}, /* 21 */ { 5, s_3_21, -1, 1, 0}, /* 22 */ { 5, s_3_22, -1, 11, 0}, /* 23 */ { 5, s_3_23, -1, 1, 0}, /* 24 */ { 4, s_3_24, -1, 8, 0}, /* 25 */ { 3, s_3_25, -1, 8, 0}, /* 26 */ { 6, s_3_26, -1, 4, 0}, /* 27 */ { 6, s_3_27, -1, 2, 0}, /* 28 */ { 6, s_3_28, -1, 4, 0}, /* 29 */ { 6, s_3_29, -1, 2, 0}, /* 30 */ { 5, s_3_30, -1, 15, 0}, /* 31 */ { 6, s_3_31, 30, 6, 0}, /* 32 */ { 9, s_3_32, 31, 12, 0}, /* 33 */ { 5, s_3_33, -1, 7, 0}, /* 34 */ { 4, s_3_34, -1, 15, 0}, /* 35 */ { 5, s_3_35, 34, 6, 0}, /* 36 */ { 8, s_3_36, 35, 12, 0}, /* 37 */ { 6, s_3_37, 34, 13, 0}, /* 38 */ { 6, s_3_38, 34, 14, 0}, /* 39 */ { 3, s_3_39, -1, 10, 0}, /* 40 */ { 4, s_3_40, 39, 9, 0}, /* 41 */ { 3, s_3_41, -1, 1, 0}, /* 42 */ { 4, s_3_42, -1, 7, 0} }; static symbol s_4_0[3] = { 'i', 'r', 'a' }; static symbol s_4_1[2] = { 'i', 'e' }; static symbol s_4_2[4] = { 'i', 's', 's', 'e' }; static symbol s_4_3[7] = { 'i', 's', 's', 'a', 'n', 't', 'e' }; static symbol s_4_4[1] = { 'i' }; static symbol s_4_5[4] = { 'i', 'r', 'a', 'i' }; static symbol s_4_6[2] = { 'i', 'r' }; static symbol s_4_7[4] = { 'i', 'r', 'a', 's' }; static symbol s_4_8[3] = { 'i', 'e', 's' }; static symbol s_4_9[5] = { 0xC3, 0xAE, 'm', 'e', 's' }; static symbol s_4_10[5] = { 'i', 's', 's', 'e', 's' }; static symbol s_4_11[8] = { 'i', 's', 's', 'a', 'n', 't', 'e', 's' }; static symbol s_4_12[5] = { 0xC3, 0xAE, 't', 'e', 's' }; static symbol s_4_13[2] = { 'i', 's' }; static symbol s_4_14[5] = { 'i', 'r', 'a', 'i', 's' }; static symbol s_4_15[6] = { 'i', 's', 's', 'a', 'i', 's' }; static symbol s_4_16[6] = { 'i', 'r', 'i', 'o', 'n', 's' }; static symbol s_4_17[7] = { 'i', 's', 's', 'i', 'o', 'n', 's' }; static symbol s_4_18[5] = { 'i', 'r', 'o', 'n', 's' }; static symbol s_4_19[6] = { 'i', 's', 's', 'o', 'n', 's' }; static symbol s_4_20[7] = { 'i', 's', 's', 'a', 'n', 't', 's' }; static symbol s_4_21[2] = { 'i', 't' }; static symbol s_4_22[5] = { 'i', 'r', 'a', 'i', 't' }; static symbol s_4_23[6] = { 'i', 's', 's', 'a', 'i', 't' }; static symbol s_4_24[6] = { 'i', 's', 's', 'a', 'n', 't' }; static symbol s_4_25[7] = { 'i', 'r', 'a', 'I', 'e', 'n', 't' }; static symbol s_4_26[8] = { 'i', 's', 's', 'a', 'I', 'e', 'n', 't' }; static symbol s_4_27[5] = { 'i', 'r', 'e', 'n', 't' }; static symbol s_4_28[6] = { 'i', 's', 's', 'e', 'n', 't' }; static symbol s_4_29[5] = { 'i', 'r', 'o', 'n', 't' }; static symbol s_4_30[3] = { 0xC3, 0xAE, 't' }; static symbol s_4_31[5] = { 'i', 'r', 'i', 'e', 'z' }; static symbol s_4_32[6] = { 'i', 's', 's', 'i', 'e', 'z' }; static symbol s_4_33[4] = { 'i', 'r', 'e', 'z' }; static symbol s_4_34[5] = { 'i', 's', 's', 'e', 'z' }; static struct among a_4[35] = { /* 0 */ { 3, s_4_0, -1, 1, 0}, /* 1 */ { 2, s_4_1, -1, 1, 0}, /* 2 */ { 4, s_4_2, -1, 1, 0}, /* 3 */ { 7, s_4_3, -1, 1, 0}, /* 4 */ { 1, s_4_4, -1, 1, 0}, /* 5 */ { 4, s_4_5, 4, 1, 0}, /* 6 */ { 2, s_4_6, -1, 1, 0}, /* 7 */ { 4, s_4_7, -1, 1, 0}, /* 8 */ { 3, s_4_8, -1, 1, 0}, /* 9 */ { 5, s_4_9, -1, 1, 0}, /* 10 */ { 5, s_4_10, -1, 1, 0}, /* 11 */ { 8, s_4_11, -1, 1, 0}, /* 12 */ { 5, s_4_12, -1, 1, 0}, /* 13 */ { 2, s_4_13, -1, 1, 0}, /* 14 */ { 5, s_4_14, 13, 1, 0}, /* 15 */ { 6, s_4_15, 13, 1, 0}, /* 16 */ { 6, s_4_16, -1, 1, 0}, /* 17 */ { 7, s_4_17, -1, 1, 0}, /* 18 */ { 5, s_4_18, -1, 1, 0}, /* 19 */ { 6, s_4_19, -1, 1, 0}, /* 20 */ { 7, s_4_20, -1, 1, 0}, /* 21 */ { 2, s_4_21, -1, 1, 0}, /* 22 */ { 5, s_4_22, 21, 1, 0}, /* 23 */ { 6, s_4_23, 21, 1, 0}, /* 24 */ { 6, s_4_24, -1, 1, 0}, /* 25 */ { 7, s_4_25, -1, 1, 0}, /* 26 */ { 8, s_4_26, -1, 1, 0}, /* 27 */ { 5, s_4_27, -1, 1, 0}, /* 28 */ { 6, s_4_28, -1, 1, 0}, /* 29 */ { 5, s_4_29, -1, 1, 0}, /* 30 */ { 3, s_4_30, -1, 1, 0}, /* 31 */ { 5, s_4_31, -1, 1, 0}, /* 32 */ { 6, s_4_32, -1, 1, 0}, /* 33 */ { 4, s_4_33, -1, 1, 0}, /* 34 */ { 5, s_4_34, -1, 1, 0} }; static symbol s_5_0[1] = { 'a' }; static symbol s_5_1[3] = { 'e', 'r', 'a' }; static symbol s_5_2[4] = { 'a', 's', 's', 'e' }; static symbol s_5_3[4] = { 'a', 'n', 't', 'e' }; static symbol s_5_4[3] = { 0xC3, 0xA9, 'e' }; static symbol s_5_5[2] = { 'a', 'i' }; static symbol s_5_6[4] = { 'e', 'r', 'a', 'i' }; static symbol s_5_7[2] = { 'e', 'r' }; static symbol s_5_8[2] = { 'a', 's' }; static symbol s_5_9[4] = { 'e', 'r', 'a', 's' }; static symbol s_5_10[5] = { 0xC3, 0xA2, 'm', 'e', 's' }; static symbol s_5_11[5] = { 'a', 's', 's', 'e', 's' }; static symbol s_5_12[5] = { 'a', 'n', 't', 'e', 's' }; static symbol s_5_13[5] = { 0xC3, 0xA2, 't', 'e', 's' }; static symbol s_5_14[4] = { 0xC3, 0xA9, 'e', 's' }; static symbol s_5_15[3] = { 'a', 'i', 's' }; static symbol s_5_16[5] = { 'e', 'r', 'a', 'i', 's' }; static symbol s_5_17[4] = { 'i', 'o', 'n', 's' }; static symbol s_5_18[6] = { 'e', 'r', 'i', 'o', 'n', 's' }; static symbol s_5_19[7] = { 'a', 's', 's', 'i', 'o', 'n', 's' }; static symbol s_5_20[5] = { 'e', 'r', 'o', 'n', 's' }; static symbol s_5_21[4] = { 'a', 'n', 't', 's' }; static symbol s_5_22[3] = { 0xC3, 0xA9, 's' }; static symbol s_5_23[3] = { 'a', 'i', 't' }; static symbol s_5_24[5] = { 'e', 'r', 'a', 'i', 't' }; static symbol s_5_25[3] = { 'a', 'n', 't' }; static symbol s_5_26[5] = { 'a', 'I', 'e', 'n', 't' }; static symbol s_5_27[7] = { 'e', 'r', 'a', 'I', 'e', 'n', 't' }; static symbol s_5_28[6] = { 0xC3, 0xA8, 'r', 'e', 'n', 't' }; static symbol s_5_29[6] = { 'a', 's', 's', 'e', 'n', 't' }; static symbol s_5_30[5] = { 'e', 'r', 'o', 'n', 't' }; static symbol s_5_31[3] = { 0xC3, 0xA2, 't' }; static symbol s_5_32[2] = { 'e', 'z' }; static symbol s_5_33[3] = { 'i', 'e', 'z' }; static symbol s_5_34[5] = { 'e', 'r', 'i', 'e', 'z' }; static symbol s_5_35[6] = { 'a', 's', 's', 'i', 'e', 'z' }; static symbol s_5_36[4] = { 'e', 'r', 'e', 'z' }; static symbol s_5_37[2] = { 0xC3, 0xA9 }; static struct among a_5[38] = { /* 0 */ { 1, s_5_0, -1, 3, 0}, /* 1 */ { 3, s_5_1, 0, 2, 0}, /* 2 */ { 4, s_5_2, -1, 3, 0}, /* 3 */ { 4, s_5_3, -1, 3, 0}, /* 4 */ { 3, s_5_4, -1, 2, 0}, /* 5 */ { 2, s_5_5, -1, 3, 0}, /* 6 */ { 4, s_5_6, 5, 2, 0}, /* 7 */ { 2, s_5_7, -1, 2, 0}, /* 8 */ { 2, s_5_8, -1, 3, 0}, /* 9 */ { 4, s_5_9, 8, 2, 0}, /* 10 */ { 5, s_5_10, -1, 3, 0}, /* 11 */ { 5, s_5_11, -1, 3, 0}, /* 12 */ { 5, s_5_12, -1, 3, 0}, /* 13 */ { 5, s_5_13, -1, 3, 0}, /* 14 */ { 4, s_5_14, -1, 2, 0}, /* 15 */ { 3, s_5_15, -1, 3, 0}, /* 16 */ { 5, s_5_16, 15, 2, 0}, /* 17 */ { 4, s_5_17, -1, 1, 0}, /* 18 */ { 6, s_5_18, 17, 2, 0}, /* 19 */ { 7, s_5_19, 17, 3, 0}, /* 20 */ { 5, s_5_20, -1, 2, 0}, /* 21 */ { 4, s_5_21, -1, 3, 0}, /* 22 */ { 3, s_5_22, -1, 2, 0}, /* 23 */ { 3, s_5_23, -1, 3, 0}, /* 24 */ { 5, s_5_24, 23, 2, 0}, /* 25 */ { 3, s_5_25, -1, 3, 0}, /* 26 */ { 5, s_5_26, -1, 3, 0}, /* 27 */ { 7, s_5_27, 26, 2, 0}, /* 28 */ { 6, s_5_28, -1, 2, 0}, /* 29 */ { 6, s_5_29, -1, 3, 0}, /* 30 */ { 5, s_5_30, -1, 2, 0}, /* 31 */ { 3, s_5_31, -1, 3, 0}, /* 32 */ { 2, s_5_32, -1, 2, 0}, /* 33 */ { 3, s_5_33, 32, 2, 0}, /* 34 */ { 5, s_5_34, 33, 2, 0}, /* 35 */ { 6, s_5_35, 33, 3, 0}, /* 36 */ { 4, s_5_36, 32, 2, 0}, /* 37 */ { 2, s_5_37, -1, 2, 0} }; static symbol s_6_0[1] = { 'e' }; static symbol s_6_1[5] = { 'I', 0xC3, 0xA8, 'r', 'e' }; static symbol s_6_2[5] = { 'i', 0xC3, 0xA8, 'r', 'e' }; static symbol s_6_3[3] = { 'i', 'o', 'n' }; static symbol s_6_4[3] = { 'I', 'e', 'r' }; static symbol s_6_5[3] = { 'i', 'e', 'r' }; static symbol s_6_6[2] = { 0xC3, 0xAB }; static struct among a_6[7] = { /* 0 */ { 1, s_6_0, -1, 3, 0}, /* 1 */ { 5, s_6_1, 0, 2, 0}, /* 2 */ { 5, s_6_2, 0, 2, 0}, /* 3 */ { 3, s_6_3, -1, 1, 0}, /* 4 */ { 3, s_6_4, -1, 2, 0}, /* 5 */ { 3, s_6_5, -1, 2, 0}, /* 6 */ { 2, s_6_6, -1, 4, 0} }; static symbol s_7_0[3] = { 'e', 'l', 'l' }; static symbol s_7_1[4] = { 'e', 'i', 'l', 'l' }; static symbol s_7_2[3] = { 'e', 'n', 'n' }; static symbol s_7_3[3] = { 'o', 'n', 'n' }; static symbol s_7_4[3] = { 'e', 't', 't' }; static struct among a_7[5] = { /* 0 */ { 3, s_7_0, -1, -1, 0}, /* 1 */ { 4, s_7_1, -1, -1, 0}, /* 2 */ { 3, s_7_2, -1, -1, 0}, /* 3 */ { 3, s_7_3, -1, -1, 0}, /* 4 */ { 3, s_7_4, -1, -1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 130, 103, 8, 5 }; static unsigned char g_keep_with_s[] = { 1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 }; static symbol s_0[] = { 'u' }; static symbol s_1[] = { 'U' }; static symbol s_2[] = { 'i' }; static symbol s_3[] = { 'I' }; static symbol s_4[] = { 'y' }; static symbol s_5[] = { 'Y' }; static symbol s_6[] = { 'y' }; static symbol s_7[] = { 'Y' }; static symbol s_8[] = { 'q' }; static symbol s_9[] = { 'u' }; static symbol s_10[] = { 'U' }; static symbol s_11[] = { 'i' }; static symbol s_12[] = { 'u' }; static symbol s_13[] = { 'y' }; static symbol s_14[] = { 'i', 'c' }; static symbol s_15[] = { 'i', 'q', 'U' }; static symbol s_16[] = { 'l', 'o', 'g' }; static symbol s_17[] = { 'u' }; static symbol s_18[] = { 'e', 'n', 't' }; static symbol s_19[] = { 'a', 't' }; static symbol s_20[] = { 'e', 'u', 'x' }; static symbol s_21[] = { 'i' }; static symbol s_22[] = { 'a', 'b', 'l' }; static symbol s_23[] = { 'i', 'q', 'U' }; static symbol s_24[] = { 'a', 't' }; static symbol s_25[] = { 'i', 'c' }; static symbol s_26[] = { 'i', 'q', 'U' }; static symbol s_27[] = { 'e', 'a', 'u' }; static symbol s_28[] = { 'a', 'l' }; static symbol s_29[] = { 'e', 'u', 'x' }; static symbol s_30[] = { 'a', 'n', 't' }; static symbol s_31[] = { 'e', 'n', 't' }; static symbol s_32[] = { 'e' }; static symbol s_33[] = { 's' }; static symbol s_34[] = { 's' }; static symbol s_35[] = { 't' }; static symbol s_36[] = { 'i' }; static symbol s_37[] = { 'g', 'u' }; static symbol s_38[] = { 0xC3, 0xA9 }; static symbol s_39[] = { 0xC3, 0xA8 }; static symbol s_40[] = { 'e' }; static symbol s_41[] = { 'Y' }; static symbol s_42[] = { 'i' }; static symbol s_43[] = { 0xC3, 0xA7 }; static symbol s_44[] = { 'c' }; static int r_prelude(struct SN_env * z) { while(1) { /* repeat, line 38 */ int c = z->c; while(1) { /* goto, line 38 */ int c = z->c; { int c = z->c; /* or, line 44 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab3; z->bra = z->c; /* [, line 40 */ { int c = z->c; /* or, line 40 */ if (!(eq_s(z, 1, s_0))) goto lab5; z->ket = z->c; /* ], line 40 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab5; { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 40 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = c; if (!(eq_s(z, 1, s_2))) goto lab6; z->ket = z->c; /* ], line 41 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab6; { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 41 */ if (ret < 0) return ret; } goto lab4; lab6: z->c = c; if (!(eq_s(z, 1, s_4))) goto lab3; z->ket = z->c; /* ], line 42 */ { int ret; ret = slice_from_s(z, 1, s_5); /* <-, line 42 */ if (ret < 0) return ret; } } lab4: goto lab2; lab3: z->c = c; z->bra = z->c; /* [, line 45 */ if (!(eq_s(z, 1, s_6))) goto lab7; z->ket = z->c; /* ], line 45 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab7; { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 45 */ if (ret < 0) return ret; } goto lab2; lab7: z->c = c; if (!(eq_s(z, 1, s_8))) goto lab1; z->bra = z->c; /* [, line 47 */ if (!(eq_s(z, 1, s_9))) goto lab1; z->ket = z->c; /* ], line 47 */ { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 47 */ if (ret < 0) return ret; } } lab2: z->c = c; break; lab1: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* goto, line 38 */ } } continue; lab0: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 56 */ { int c = z->c; /* or, line 57 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab2; if (!(in_grouping_U(z, g_v, 97, 251))) goto lab2; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab2; z->c = c; /* next, line 57 */ } goto lab1; lab2: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 57 */ } while(1) { /* gopast, line 57 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 57 */ } } } lab1: z->I[0] = z->c; /* setmark pV, line 58 */ lab0: z->c = c; } { int c = z->c; /* do, line 60 */ while(1) { /* gopast, line 61 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab5; break; lab5: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 61 */ } } while(1) { /* gopast, line 61 */ if (!(out_grouping_U(z, g_v, 97, 251))) goto lab6; break; lab6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 61 */ } } z->I[1] = z->c; /* setmark p1, line 61 */ while(1) { /* gopast, line 62 */ if (!(in_grouping_U(z, g_v, 97, 251))) goto lab7; break; lab7: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 62 */ } } while(1) { /* gopast, line 62 */ if (!(out_grouping_U(z, g_v, 97, 251))) goto lab8; break; lab8: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 62 */ } } z->I[2] = z->c; /* setmark p2, line 62 */ lab4: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 66 */ int c = z->c; z->bra = z->c; /* [, line 68 */ among_var = find_among(z, a_0, 4); /* substring, line 68 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 68 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_11); /* <-, line 69 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_12); /* <-, line 70 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 71 */ if (ret < 0) return ret; } break; case 4: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 72 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 83 */ among_var = find_among_b(z, a_3, 43); /* substring, line 83 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 83 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 87 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 87 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 90 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 90 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 91 */ z->ket = z->c; /* [, line 91 */ if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 91 */ { int m = z->l - z->c; (void) m; /* or, line 91 */ { int ret = r_R2(z); if (ret == 0) goto lab2; /* call R2, line 91 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 91 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_15); /* <-, line 91 */ if (ret < 0) return ret; } } lab1: lab0: ; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 95 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_16); /* <-, line 95 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 98 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_17); /* <-, line 98 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 101 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_18); /* <-, line 101 */ if (ret < 0) return ret; } break; case 6: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 105 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 105 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 106 */ z->ket = z->c; /* [, line 107 */ among_var = find_among_b(z, a_1, 6); /* substring, line 107 */ if (!(among_var)) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 107 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab3; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 108 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 108 */ if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 108 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 108 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 109 */ { int ret = r_R2(z); if (ret == 0) goto lab5; /* call R2, line 109 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 109 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R1, line 109 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_20); /* <-, line 109 */ if (ret < 0) return ret; } } lab4: break; case 3: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 111 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 111 */ if (ret < 0) return ret; } break; case 4: { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call RV, line 113 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_21); /* <-, line 113 */ if (ret < 0) return ret; } break; } lab3: ; } break; case 7: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 120 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 120 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 121 */ z->ket = z->c; /* [, line 122 */ among_var = find_among_b(z, a_2, 3); /* substring, line 122 */ if (!(among_var)) { z->c = z->l - m; goto lab6; } z->bra = z->c; /* ], line 122 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab6; } case 1: { int m = z->l - z->c; (void) m; /* or, line 123 */ { int ret = r_R2(z); if (ret == 0) goto lab8; /* call R2, line 123 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 123 */ if (ret < 0) return ret; } goto lab7; lab8: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_22); /* <-, line 123 */ if (ret < 0) return ret; } } lab7: break; case 2: { int m = z->l - z->c; (void) m; /* or, line 124 */ { int ret = r_R2(z); if (ret == 0) goto lab10; /* call R2, line 124 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 124 */ if (ret < 0) return ret; } goto lab9; lab10: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_23); /* <-, line 124 */ if (ret < 0) return ret; } } lab9: break; case 3: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R2, line 125 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 125 */ if (ret < 0) return ret; } break; } lab6: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 132 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 132 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 133 */ z->ket = z->c; /* [, line 133 */ if (!(eq_s_b(z, 2, s_24))) { z->c = z->l - m; goto lab11; } z->bra = z->c; /* ], line 133 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab11; } /* call R2, line 133 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 133 */ if (!(eq_s_b(z, 2, s_25))) { z->c = z->l - m; goto lab11; } z->bra = z->c; /* ], line 133 */ { int m = z->l - z->c; (void) m; /* or, line 133 */ { int ret = r_R2(z); if (ret == 0) goto lab13; /* call R2, line 133 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 133 */ if (ret < 0) return ret; } goto lab12; lab13: z->c = z->l - m; { int ret; ret = slice_from_s(z, 3, s_26); /* <-, line 133 */ if (ret < 0) return ret; } } lab12: lab11: ; } break; case 9: { int ret; ret = slice_from_s(z, 3, s_27); /* <-, line 135 */ if (ret < 0) return ret; } break; case 10: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 136 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 2, s_28); /* <-, line 136 */ if (ret < 0) return ret; } break; case 11: { int m = z->l - z->c; (void) m; /* or, line 138 */ { int ret = r_R2(z); if (ret == 0) goto lab15; /* call R2, line 138 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 138 */ if (ret < 0) return ret; } goto lab14; lab15: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 138 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_29); /* <-, line 138 */ if (ret < 0) return ret; } } lab14: break; case 12: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 141 */ if (ret < 0) return ret; } if (!(out_grouping_b_U(z, g_v, 97, 251))) return 0; { int ret; ret = slice_del(z); /* delete, line 141 */ if (ret < 0) return ret; } break; case 13: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 146 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_30); /* <-, line 146 */ if (ret < 0) return ret; } return 0; /* fail, line 146 */ break; case 14: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 147 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_31); /* <-, line 147 */ if (ret < 0) return ret; } return 0; /* fail, line 147 */ break; case 15: { int m_test = z->l - z->c; /* test, line 149 */ if (!(in_grouping_b_U(z, g_v, 97, 251))) return 0; { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 149 */ if (ret < 0) return ret; } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 149 */ if (ret < 0) return ret; } return 0; /* fail, line 149 */ break; } return 1; } static int r_i_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 154 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 154 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 155 */ among_var = find_among_b(z, a_4, 35); /* substring, line 155 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 155 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: if (!(out_grouping_b_U(z, g_v, 97, 251))) { z->lb = m3; return 0; } { int ret; ret = slice_del(z); /* delete, line 161 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 165 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 165 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 166 */ among_var = find_among_b(z, a_5, 38); /* substring, line 166 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 166 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret = r_R2(z); if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 168 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 168 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 176 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 181 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 182 */ z->ket = z->c; /* [, line 182 */ if (!(eq_s_b(z, 1, s_32))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 182 */ { int ret; ret = slice_del(z); /* delete, line 182 */ if (ret < 0) return ret; } lab0: ; } break; } z->lb = m3; } return 1; } static int r_residual_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* try, line 190 */ z->ket = z->c; /* [, line 190 */ if (!(eq_s_b(z, 1, s_33))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 190 */ { int m_test = z->l - z->c; /* test, line 190 */ if (!(out_grouping_b_U(z, g_keep_with_s, 97, 232))) { z->c = z->l - m; goto lab0; } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 190 */ if (ret < 0) return ret; } lab0: ; } { int m3; /* setlimit, line 191 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 191 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 192 */ among_var = find_among_b(z, a_6, 7); /* substring, line 192 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 192 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret = r_R2(z); if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 193 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* or, line 193 */ if (!(eq_s_b(z, 1, s_34))) goto lab2; goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 1, s_35))) { z->lb = m3; return 0; } } lab1: { int ret; ret = slice_del(z); /* delete, line 193 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_36); /* <-, line 195 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 196 */ if (ret < 0) return ret; } break; case 4: if (!(eq_s_b(z, 2, s_37))) { z->lb = m3; return 0; } { int ret; ret = slice_del(z); /* delete, line 197 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_un_double(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 203 */ if (!(find_among_b(z, a_7, 5))) return 0; /* among, line 203 */ z->c = z->l - m_test; } z->ket = z->c; /* [, line 203 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 203 */ } z->bra = z->c; /* ], line 203 */ { int ret; ret = slice_del(z); /* delete, line 203 */ if (ret < 0) return ret; } return 1; } static int r_un_accent(struct SN_env * z) { { int i = 1; while(1) { /* atleast, line 207 */ if (!(out_grouping_b_U(z, g_v, 97, 251))) goto lab0; i--; continue; lab0: break; } if (i > 0) return 0; } z->ket = z->c; /* [, line 208 */ { int m = z->l - z->c; (void) m; /* or, line 208 */ if (!(eq_s_b(z, 2, s_38))) goto lab2; goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 2, s_39))) return 0; } lab1: z->bra = z->c; /* ], line 208 */ { int ret; ret = slice_from_s(z, 1, s_40); /* <-, line 208 */ if (ret < 0) return ret; } return 1; } extern int french_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 214 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 214 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 215 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 215 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 216 */ { int m = z->l - z->c; (void) m; /* do, line 218 */ { int m = z->l - z->c; (void) m; /* or, line 228 */ { int m = z->l - z->c; (void) m; /* and, line 224 */ { int m = z->l - z->c; (void) m; /* or, line 220 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab6; /* call standard_suffix, line 220 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_i_verb_suffix(z); if (ret == 0) goto lab7; /* call i_verb_suffix, line 221 */ if (ret < 0) return ret; } goto lab5; lab7: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab4; /* call verb_suffix, line 222 */ if (ret < 0) return ret; } } lab5: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* try, line 225 */ z->ket = z->c; /* [, line 225 */ { int m = z->l - z->c; (void) m; /* or, line 225 */ if (!(eq_s_b(z, 1, s_41))) goto lab10; z->bra = z->c; /* ], line 225 */ { int ret; ret = slice_from_s(z, 1, s_42); /* <-, line 225 */ if (ret < 0) return ret; } goto lab9; lab10: z->c = z->l - m; if (!(eq_s_b(z, 2, s_43))) { z->c = z->l - m; goto lab8; } z->bra = z->c; /* ], line 226 */ { int ret; ret = slice_from_s(z, 1, s_44); /* <-, line 226 */ if (ret < 0) return ret; } } lab9: lab8: ; } } goto lab3; lab4: z->c = z->l - m; { int ret = r_residual_suffix(z); if (ret == 0) goto lab2; /* call residual_suffix, line 229 */ if (ret < 0) return ret; } } lab3: lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 234 */ { int ret = r_un_double(z); if (ret == 0) goto lab11; /* call un_double, line 234 */ if (ret < 0) return ret; } lab11: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 235 */ { int ret = r_un_accent(z); if (ret == 0) goto lab12; /* call un_accent, line 235 */ if (ret < 0) return ret; } lab12: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 237 */ { int ret = r_postlude(z); if (ret == 0) goto lab13; /* call postlude, line 237 */ if (ret < 0) return ret; } lab13: z->c = c; } return 1; } extern struct SN_env * french_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); } extern void french_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_french.h000066400000000000000000000004661154025176300272600ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * french_UTF_8_create_env(void); extern void french_UTF_8_close_env(struct SN_env * z); extern int french_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_german.c000066400000000000000000000412161154025176300272550ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int german_UTF_8_stem(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * german_UTF_8_create_env(void); extern void german_UTF_8_close_env(struct SN_env * z); static symbol s_0_1[1] = { 'U' }; static symbol s_0_2[1] = { 'Y' }; static symbol s_0_3[2] = { 0xC3, 0xA4 }; static symbol s_0_4[2] = { 0xC3, 0xB6 }; static symbol s_0_5[2] = { 0xC3, 0xBC }; static struct among a_0[6] = { /* 0 */ { 0, 0, -1, 6, 0}, /* 1 */ { 1, s_0_1, 0, 2, 0}, /* 2 */ { 1, s_0_2, 0, 1, 0}, /* 3 */ { 2, s_0_3, 0, 3, 0}, /* 4 */ { 2, s_0_4, 0, 4, 0}, /* 5 */ { 2, s_0_5, 0, 5, 0} }; static symbol s_1_0[1] = { 'e' }; static symbol s_1_1[2] = { 'e', 'm' }; static symbol s_1_2[2] = { 'e', 'n' }; static symbol s_1_3[3] = { 'e', 'r', 'n' }; static symbol s_1_4[2] = { 'e', 'r' }; static symbol s_1_5[1] = { 's' }; static symbol s_1_6[2] = { 'e', 's' }; static struct among a_1[7] = { /* 0 */ { 1, s_1_0, -1, 1, 0}, /* 1 */ { 2, s_1_1, -1, 1, 0}, /* 2 */ { 2, s_1_2, -1, 1, 0}, /* 3 */ { 3, s_1_3, -1, 1, 0}, /* 4 */ { 2, s_1_4, -1, 1, 0}, /* 5 */ { 1, s_1_5, -1, 2, 0}, /* 6 */ { 2, s_1_6, 5, 1, 0} }; static symbol s_2_0[2] = { 'e', 'n' }; static symbol s_2_1[2] = { 'e', 'r' }; static symbol s_2_2[2] = { 's', 't' }; static symbol s_2_3[3] = { 'e', 's', 't' }; static struct among a_2[4] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 2, s_2_1, -1, 1, 0}, /* 2 */ { 2, s_2_2, -1, 2, 0}, /* 3 */ { 3, s_2_3, 2, 1, 0} }; static symbol s_3_0[2] = { 'i', 'g' }; static symbol s_3_1[4] = { 'l', 'i', 'c', 'h' }; static struct among a_3[2] = { /* 0 */ { 2, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0} }; static symbol s_4_0[3] = { 'e', 'n', 'd' }; static symbol s_4_1[2] = { 'i', 'g' }; static symbol s_4_2[3] = { 'u', 'n', 'g' }; static symbol s_4_3[4] = { 'l', 'i', 'c', 'h' }; static symbol s_4_4[4] = { 'i', 's', 'c', 'h' }; static symbol s_4_5[2] = { 'i', 'k' }; static symbol s_4_6[4] = { 'h', 'e', 'i', 't' }; static symbol s_4_7[4] = { 'k', 'e', 'i', 't' }; static struct among a_4[8] = { /* 0 */ { 3, s_4_0, -1, 1, 0}, /* 1 */ { 2, s_4_1, -1, 2, 0}, /* 2 */ { 3, s_4_2, -1, 1, 0}, /* 3 */ { 4, s_4_3, -1, 3, 0}, /* 4 */ { 4, s_4_4, -1, 2, 0}, /* 5 */ { 2, s_4_5, -1, 2, 0}, /* 6 */ { 4, s_4_6, -1, 3, 0}, /* 7 */ { 4, s_4_7, -1, 4, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 }; static unsigned char g_s_ending[] = { 117, 30, 5 }; static unsigned char g_st_ending[] = { 117, 30, 4 }; static symbol s_0[] = { 0xC3, 0x9F }; static symbol s_1[] = { 's', 's' }; static symbol s_2[] = { 'u' }; static symbol s_3[] = { 'U' }; static symbol s_4[] = { 'y' }; static symbol s_5[] = { 'Y' }; static symbol s_6[] = { 'y' }; static symbol s_7[] = { 'u' }; static symbol s_8[] = { 'a' }; static symbol s_9[] = { 'o' }; static symbol s_10[] = { 'u' }; static symbol s_11[] = { 'i', 'g' }; static symbol s_12[] = { 'e' }; static symbol s_13[] = { 'e' }; static symbol s_14[] = { 'e', 'r' }; static symbol s_15[] = { 'e', 'n' }; static int r_prelude(struct SN_env * z) { { int c_test = z->c; /* test, line 30 */ while(1) { /* repeat, line 30 */ int c = z->c; { int c = z->c; /* or, line 33 */ z->bra = z->c; /* [, line 32 */ if (!(eq_s(z, 2, s_0))) goto lab2; z->ket = z->c; /* ], line 32 */ { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 32 */ if (ret < 0) return ret; } goto lab1; lab2: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 33 */ } } lab1: continue; lab0: z->c = c; break; } z->c = c_test; } while(1) { /* repeat, line 36 */ int c = z->c; while(1) { /* goto, line 36 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 252))) goto lab4; z->bra = z->c; /* [, line 37 */ { int c = z->c; /* or, line 37 */ if (!(eq_s(z, 1, s_2))) goto lab6; z->ket = z->c; /* ], line 37 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab6; { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 37 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = c; if (!(eq_s(z, 1, s_4))) goto lab4; z->ket = z->c; /* ], line 38 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab4; { int ret; ret = slice_from_s(z, 1, s_5); /* <-, line 38 */ if (ret < 0) return ret; } } lab5: z->c = c; break; lab4: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab3; z->c = c; /* goto, line 36 */ } } continue; lab3: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; { int c_test = z->c; /* test, line 47 */ { int c = skip_utf8(z->p, z->c, 0, z->l, + 3); if (c < 0) return 0; z->c = c; /* hop, line 47 */ } z->I[2] = z->c; /* setmark x, line 47 */ z->c = c_test; } while(1) { /* gopast, line 49 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab0; break; lab0: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 49 */ } } while(1) { /* gopast, line 49 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 49 */ } } z->I[0] = z->c; /* setmark p1, line 49 */ /* try, line 50 */ if (!(z->I[0] < z->I[2])) goto lab2; z->I[0] = z->I[2]; lab2: while(1) { /* gopast, line 51 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 51 */ } } while(1) { /* gopast, line 51 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab4; break; lab4: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 51 */ } } z->I[1] = z->c; /* setmark p2, line 51 */ return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 55 */ int c = z->c; z->bra = z->c; /* [, line 57 */ among_var = find_among(z, a_0, 6); /* substring, line 57 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 57 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_6); /* <-, line 58 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 59 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_8); /* <-, line 60 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_9); /* <-, line 61 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 62 */ if (ret < 0) return ret; } break; case 6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 63 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; { int m = z->l - z->c; (void) m; /* do, line 74 */ z->ket = z->c; /* [, line 75 */ among_var = find_among_b(z, a_1, 7); /* substring, line 75 */ if (!(among_var)) goto lab0; z->bra = z->c; /* ], line 75 */ { int ret = r_R1(z); if (ret == 0) goto lab0; /* call R1, line 75 */ if (ret < 0) return ret; } switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_del(z); /* delete, line 77 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b_U(z, g_s_ending, 98, 116))) goto lab0; { int ret; ret = slice_del(z); /* delete, line 80 */ if (ret < 0) return ret; } break; } lab0: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 84 */ z->ket = z->c; /* [, line 85 */ among_var = find_among_b(z, a_2, 4); /* substring, line 85 */ if (!(among_var)) goto lab1; z->bra = z->c; /* ], line 85 */ { int ret = r_R1(z); if (ret == 0) goto lab1; /* call R1, line 85 */ if (ret < 0) return ret; } switch(among_var) { case 0: goto lab1; case 1: { int ret; ret = slice_del(z); /* delete, line 87 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b_U(z, g_st_ending, 98, 116))) goto lab1; { int c = skip_utf8(z->p, z->c, z->lb, z->l, - 3); if (c < 0) goto lab1; z->c = c; /* hop, line 90 */ } { int ret; ret = slice_del(z); /* delete, line 90 */ if (ret < 0) return ret; } break; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 94 */ z->ket = z->c; /* [, line 95 */ among_var = find_among_b(z, a_4, 8); /* substring, line 95 */ if (!(among_var)) goto lab2; z->bra = z->c; /* ], line 95 */ { int ret = r_R2(z); if (ret == 0) goto lab2; /* call R2, line 95 */ if (ret < 0) return ret; } switch(among_var) { case 0: goto lab2; case 1: { int ret; ret = slice_del(z); /* delete, line 97 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 98 */ z->ket = z->c; /* [, line 98 */ if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 98 */ { int m = z->l - z->c; (void) m; /* not, line 98 */ if (!(eq_s_b(z, 1, s_12))) goto lab4; { z->c = z->l - m; goto lab3; } lab4: z->c = z->l - m; } { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 98 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 98 */ if (ret < 0) return ret; } lab3: ; } break; case 2: { int m = z->l - z->c; (void) m; /* not, line 101 */ if (!(eq_s_b(z, 1, s_13))) goto lab5; goto lab2; lab5: z->c = z->l - m; } { int ret; ret = slice_del(z); /* delete, line 101 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 104 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 105 */ z->ket = z->c; /* [, line 106 */ { int m = z->l - z->c; (void) m; /* or, line 106 */ if (!(eq_s_b(z, 2, s_14))) goto lab8; goto lab7; lab8: z->c = z->l - m; if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab6; } } lab7: z->bra = z->c; /* ], line 106 */ { int ret = r_R1(z); if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R1, line 106 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 106 */ if (ret < 0) return ret; } lab6: ; } break; case 4: { int ret; ret = slice_del(z); /* delete, line 110 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 111 */ z->ket = z->c; /* [, line 112 */ among_var = find_among_b(z, a_3, 2); /* substring, line 112 */ if (!(among_var)) { z->c = z->l - m; goto lab9; } z->bra = z->c; /* ], line 112 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab9; } /* call R2, line 112 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab9; } case 1: { int ret; ret = slice_del(z); /* delete, line 114 */ if (ret < 0) return ret; } break; } lab9: ; } break; } lab2: z->c = z->l - m; } return 1; } extern int german_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 125 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 125 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 126 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 126 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 127 */ { int m = z->l - z->c; (void) m; /* do, line 128 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab2; /* call standard_suffix, line 128 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 129 */ { int ret = r_postlude(z); if (ret == 0) goto lab3; /* call postlude, line 129 */ if (ret < 0) return ret; } lab3: z->c = c; } return 1; } extern struct SN_env * german_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); } extern void german_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_german.h000066400000000000000000000004661154025176300272640ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * german_UTF_8_create_env(void); extern void german_UTF_8_close_env(struct SN_env * z); extern int german_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_italian.c000066400000000000000000001156521154025176300274330ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int italian_UTF_8_stem(struct SN_env * z); static int r_vowel_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_attached_pronoun(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * italian_UTF_8_create_env(void); extern void italian_UTF_8_close_env(struct SN_env * z); static symbol s_0_1[2] = { 'q', 'u' }; static symbol s_0_2[2] = { 0xC3, 0xA1 }; static symbol s_0_3[2] = { 0xC3, 0xA9 }; static symbol s_0_4[2] = { 0xC3, 0xAD }; static symbol s_0_5[2] = { 0xC3, 0xB3 }; static symbol s_0_6[2] = { 0xC3, 0xBA }; static struct among a_0[7] = { /* 0 */ { 0, 0, -1, 7, 0}, /* 1 */ { 2, s_0_1, 0, 6, 0}, /* 2 */ { 2, s_0_2, 0, 1, 0}, /* 3 */ { 2, s_0_3, 0, 2, 0}, /* 4 */ { 2, s_0_4, 0, 3, 0}, /* 5 */ { 2, s_0_5, 0, 4, 0}, /* 6 */ { 2, s_0_6, 0, 5, 0} }; static symbol s_1_1[1] = { 'I' }; static symbol s_1_2[1] = { 'U' }; static struct among a_1[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 1, s_1_1, 0, 1, 0}, /* 2 */ { 1, s_1_2, 0, 2, 0} }; static symbol s_2_0[2] = { 'l', 'a' }; static symbol s_2_1[4] = { 'c', 'e', 'l', 'a' }; static symbol s_2_2[6] = { 'g', 'l', 'i', 'e', 'l', 'a' }; static symbol s_2_3[4] = { 'm', 'e', 'l', 'a' }; static symbol s_2_4[4] = { 't', 'e', 'l', 'a' }; static symbol s_2_5[4] = { 'v', 'e', 'l', 'a' }; static symbol s_2_6[2] = { 'l', 'e' }; static symbol s_2_7[4] = { 'c', 'e', 'l', 'e' }; static symbol s_2_8[6] = { 'g', 'l', 'i', 'e', 'l', 'e' }; static symbol s_2_9[4] = { 'm', 'e', 'l', 'e' }; static symbol s_2_10[4] = { 't', 'e', 'l', 'e' }; static symbol s_2_11[4] = { 'v', 'e', 'l', 'e' }; static symbol s_2_12[2] = { 'n', 'e' }; static symbol s_2_13[4] = { 'c', 'e', 'n', 'e' }; static symbol s_2_14[6] = { 'g', 'l', 'i', 'e', 'n', 'e' }; static symbol s_2_15[4] = { 'm', 'e', 'n', 'e' }; static symbol s_2_16[4] = { 's', 'e', 'n', 'e' }; static symbol s_2_17[4] = { 't', 'e', 'n', 'e' }; static symbol s_2_18[4] = { 'v', 'e', 'n', 'e' }; static symbol s_2_19[2] = { 'c', 'i' }; static symbol s_2_20[2] = { 'l', 'i' }; static symbol s_2_21[4] = { 'c', 'e', 'l', 'i' }; static symbol s_2_22[6] = { 'g', 'l', 'i', 'e', 'l', 'i' }; static symbol s_2_23[4] = { 'm', 'e', 'l', 'i' }; static symbol s_2_24[4] = { 't', 'e', 'l', 'i' }; static symbol s_2_25[4] = { 'v', 'e', 'l', 'i' }; static symbol s_2_26[3] = { 'g', 'l', 'i' }; static symbol s_2_27[2] = { 'm', 'i' }; static symbol s_2_28[2] = { 's', 'i' }; static symbol s_2_29[2] = { 't', 'i' }; static symbol s_2_30[2] = { 'v', 'i' }; static symbol s_2_31[2] = { 'l', 'o' }; static symbol s_2_32[4] = { 'c', 'e', 'l', 'o' }; static symbol s_2_33[6] = { 'g', 'l', 'i', 'e', 'l', 'o' }; static symbol s_2_34[4] = { 'm', 'e', 'l', 'o' }; static symbol s_2_35[4] = { 't', 'e', 'l', 'o' }; static symbol s_2_36[4] = { 'v', 'e', 'l', 'o' }; static struct among a_2[37] = { /* 0 */ { 2, s_2_0, -1, -1, 0}, /* 1 */ { 4, s_2_1, 0, -1, 0}, /* 2 */ { 6, s_2_2, 0, -1, 0}, /* 3 */ { 4, s_2_3, 0, -1, 0}, /* 4 */ { 4, s_2_4, 0, -1, 0}, /* 5 */ { 4, s_2_5, 0, -1, 0}, /* 6 */ { 2, s_2_6, -1, -1, 0}, /* 7 */ { 4, s_2_7, 6, -1, 0}, /* 8 */ { 6, s_2_8, 6, -1, 0}, /* 9 */ { 4, s_2_9, 6, -1, 0}, /* 10 */ { 4, s_2_10, 6, -1, 0}, /* 11 */ { 4, s_2_11, 6, -1, 0}, /* 12 */ { 2, s_2_12, -1, -1, 0}, /* 13 */ { 4, s_2_13, 12, -1, 0}, /* 14 */ { 6, s_2_14, 12, -1, 0}, /* 15 */ { 4, s_2_15, 12, -1, 0}, /* 16 */ { 4, s_2_16, 12, -1, 0}, /* 17 */ { 4, s_2_17, 12, -1, 0}, /* 18 */ { 4, s_2_18, 12, -1, 0}, /* 19 */ { 2, s_2_19, -1, -1, 0}, /* 20 */ { 2, s_2_20, -1, -1, 0}, /* 21 */ { 4, s_2_21, 20, -1, 0}, /* 22 */ { 6, s_2_22, 20, -1, 0}, /* 23 */ { 4, s_2_23, 20, -1, 0}, /* 24 */ { 4, s_2_24, 20, -1, 0}, /* 25 */ { 4, s_2_25, 20, -1, 0}, /* 26 */ { 3, s_2_26, 20, -1, 0}, /* 27 */ { 2, s_2_27, -1, -1, 0}, /* 28 */ { 2, s_2_28, -1, -1, 0}, /* 29 */ { 2, s_2_29, -1, -1, 0}, /* 30 */ { 2, s_2_30, -1, -1, 0}, /* 31 */ { 2, s_2_31, -1, -1, 0}, /* 32 */ { 4, s_2_32, 31, -1, 0}, /* 33 */ { 6, s_2_33, 31, -1, 0}, /* 34 */ { 4, s_2_34, 31, -1, 0}, /* 35 */ { 4, s_2_35, 31, -1, 0}, /* 36 */ { 4, s_2_36, 31, -1, 0} }; static symbol s_3_0[4] = { 'a', 'n', 'd', 'o' }; static symbol s_3_1[4] = { 'e', 'n', 'd', 'o' }; static symbol s_3_2[2] = { 'a', 'r' }; static symbol s_3_3[2] = { 'e', 'r' }; static symbol s_3_4[2] = { 'i', 'r' }; static struct among a_3[5] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0}, /* 2 */ { 2, s_3_2, -1, 2, 0}, /* 3 */ { 2, s_3_3, -1, 2, 0}, /* 4 */ { 2, s_3_4, -1, 2, 0} }; static symbol s_4_0[2] = { 'i', 'c' }; static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_4_2[2] = { 'o', 's' }; static symbol s_4_3[2] = { 'i', 'v' }; static struct among a_4[4] = { /* 0 */ { 2, s_4_0, -1, -1, 0}, /* 1 */ { 4, s_4_1, -1, -1, 0}, /* 2 */ { 2, s_4_2, -1, -1, 0}, /* 3 */ { 2, s_4_3, -1, 1, 0} }; static symbol s_5_0[2] = { 'i', 'c' }; static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_5_2[2] = { 'i', 'v' }; static struct among a_5[3] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 2, s_5_2, -1, 1, 0} }; static symbol s_6_0[3] = { 'i', 'c', 'a' }; static symbol s_6_1[5] = { 'l', 'o', 'g', 'i', 'a' }; static symbol s_6_2[3] = { 'o', 's', 'a' }; static symbol s_6_3[4] = { 'i', 's', 't', 'a' }; static symbol s_6_4[3] = { 'i', 'v', 'a' }; static symbol s_6_5[4] = { 'a', 'n', 'z', 'a' }; static symbol s_6_6[4] = { 'e', 'n', 'z', 'a' }; static symbol s_6_7[3] = { 'i', 'c', 'e' }; static symbol s_6_8[6] = { 'a', 't', 'r', 'i', 'c', 'e' }; static symbol s_6_9[4] = { 'i', 'c', 'h', 'e' }; static symbol s_6_10[5] = { 'l', 'o', 'g', 'i', 'e' }; static symbol s_6_11[5] = { 'a', 'b', 'i', 'l', 'e' }; static symbol s_6_12[5] = { 'i', 'b', 'i', 'l', 'e' }; static symbol s_6_13[6] = { 'u', 's', 'i', 'o', 'n', 'e' }; static symbol s_6_14[6] = { 'a', 'z', 'i', 'o', 'n', 'e' }; static symbol s_6_15[6] = { 'u', 'z', 'i', 'o', 'n', 'e' }; static symbol s_6_16[5] = { 'a', 't', 'o', 'r', 'e' }; static symbol s_6_17[3] = { 'o', 's', 'e' }; static symbol s_6_18[4] = { 'a', 'n', 't', 'e' }; static symbol s_6_19[5] = { 'm', 'e', 'n', 't', 'e' }; static symbol s_6_20[6] = { 'a', 'm', 'e', 'n', 't', 'e' }; static symbol s_6_21[4] = { 'i', 's', 't', 'e' }; static symbol s_6_22[3] = { 'i', 'v', 'e' }; static symbol s_6_23[4] = { 'a', 'n', 'z', 'e' }; static symbol s_6_24[4] = { 'e', 'n', 'z', 'e' }; static symbol s_6_25[3] = { 'i', 'c', 'i' }; static symbol s_6_26[6] = { 'a', 't', 'r', 'i', 'c', 'i' }; static symbol s_6_27[4] = { 'i', 'c', 'h', 'i' }; static symbol s_6_28[5] = { 'a', 'b', 'i', 'l', 'i' }; static symbol s_6_29[5] = { 'i', 'b', 'i', 'l', 'i' }; static symbol s_6_30[4] = { 'i', 's', 'm', 'i' }; static symbol s_6_31[6] = { 'u', 's', 'i', 'o', 'n', 'i' }; static symbol s_6_32[6] = { 'a', 'z', 'i', 'o', 'n', 'i' }; static symbol s_6_33[6] = { 'u', 'z', 'i', 'o', 'n', 'i' }; static symbol s_6_34[5] = { 'a', 't', 'o', 'r', 'i' }; static symbol s_6_35[3] = { 'o', 's', 'i' }; static symbol s_6_36[4] = { 'a', 'n', 't', 'i' }; static symbol s_6_37[6] = { 'a', 'm', 'e', 'n', 't', 'i' }; static symbol s_6_38[6] = { 'i', 'm', 'e', 'n', 't', 'i' }; static symbol s_6_39[4] = { 'i', 's', 't', 'i' }; static symbol s_6_40[3] = { 'i', 'v', 'i' }; static symbol s_6_41[3] = { 'i', 'c', 'o' }; static symbol s_6_42[4] = { 'i', 's', 'm', 'o' }; static symbol s_6_43[3] = { 'o', 's', 'o' }; static symbol s_6_44[6] = { 'a', 'm', 'e', 'n', 't', 'o' }; static symbol s_6_45[6] = { 'i', 'm', 'e', 'n', 't', 'o' }; static symbol s_6_46[3] = { 'i', 'v', 'o' }; static symbol s_6_47[4] = { 'i', 't', 0xC3, 0xA0 }; static symbol s_6_48[5] = { 'i', 's', 't', 0xC3, 0xA0 }; static symbol s_6_49[5] = { 'i', 's', 't', 0xC3, 0xA8 }; static symbol s_6_50[5] = { 'i', 's', 't', 0xC3, 0xAC }; static struct among a_6[51] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 5, s_6_1, -1, 3, 0}, /* 2 */ { 3, s_6_2, -1, 1, 0}, /* 3 */ { 4, s_6_3, -1, 1, 0}, /* 4 */ { 3, s_6_4, -1, 9, 0}, /* 5 */ { 4, s_6_5, -1, 1, 0}, /* 6 */ { 4, s_6_6, -1, 5, 0}, /* 7 */ { 3, s_6_7, -1, 1, 0}, /* 8 */ { 6, s_6_8, 7, 1, 0}, /* 9 */ { 4, s_6_9, -1, 1, 0}, /* 10 */ { 5, s_6_10, -1, 3, 0}, /* 11 */ { 5, s_6_11, -1, 1, 0}, /* 12 */ { 5, s_6_12, -1, 1, 0}, /* 13 */ { 6, s_6_13, -1, 4, 0}, /* 14 */ { 6, s_6_14, -1, 2, 0}, /* 15 */ { 6, s_6_15, -1, 4, 0}, /* 16 */ { 5, s_6_16, -1, 2, 0}, /* 17 */ { 3, s_6_17, -1, 1, 0}, /* 18 */ { 4, s_6_18, -1, 1, 0}, /* 19 */ { 5, s_6_19, -1, 1, 0}, /* 20 */ { 6, s_6_20, 19, 7, 0}, /* 21 */ { 4, s_6_21, -1, 1, 0}, /* 22 */ { 3, s_6_22, -1, 9, 0}, /* 23 */ { 4, s_6_23, -1, 1, 0}, /* 24 */ { 4, s_6_24, -1, 5, 0}, /* 25 */ { 3, s_6_25, -1, 1, 0}, /* 26 */ { 6, s_6_26, 25, 1, 0}, /* 27 */ { 4, s_6_27, -1, 1, 0}, /* 28 */ { 5, s_6_28, -1, 1, 0}, /* 29 */ { 5, s_6_29, -1, 1, 0}, /* 30 */ { 4, s_6_30, -1, 1, 0}, /* 31 */ { 6, s_6_31, -1, 4, 0}, /* 32 */ { 6, s_6_32, -1, 2, 0}, /* 33 */ { 6, s_6_33, -1, 4, 0}, /* 34 */ { 5, s_6_34, -1, 2, 0}, /* 35 */ { 3, s_6_35, -1, 1, 0}, /* 36 */ { 4, s_6_36, -1, 1, 0}, /* 37 */ { 6, s_6_37, -1, 6, 0}, /* 38 */ { 6, s_6_38, -1, 6, 0}, /* 39 */ { 4, s_6_39, -1, 1, 0}, /* 40 */ { 3, s_6_40, -1, 9, 0}, /* 41 */ { 3, s_6_41, -1, 1, 0}, /* 42 */ { 4, s_6_42, -1, 1, 0}, /* 43 */ { 3, s_6_43, -1, 1, 0}, /* 44 */ { 6, s_6_44, -1, 6, 0}, /* 45 */ { 6, s_6_45, -1, 6, 0}, /* 46 */ { 3, s_6_46, -1, 9, 0}, /* 47 */ { 4, s_6_47, -1, 8, 0}, /* 48 */ { 5, s_6_48, -1, 1, 0}, /* 49 */ { 5, s_6_49, -1, 1, 0}, /* 50 */ { 5, s_6_50, -1, 1, 0} }; static symbol s_7_0[4] = { 'i', 's', 'c', 'a' }; static symbol s_7_1[4] = { 'e', 'n', 'd', 'a' }; static symbol s_7_2[3] = { 'a', 't', 'a' }; static symbol s_7_3[3] = { 'i', 't', 'a' }; static symbol s_7_4[3] = { 'u', 't', 'a' }; static symbol s_7_5[3] = { 'a', 'v', 'a' }; static symbol s_7_6[3] = { 'e', 'v', 'a' }; static symbol s_7_7[3] = { 'i', 'v', 'a' }; static symbol s_7_8[6] = { 'e', 'r', 'e', 'b', 'b', 'e' }; static symbol s_7_9[6] = { 'i', 'r', 'e', 'b', 'b', 'e' }; static symbol s_7_10[4] = { 'i', 's', 'c', 'e' }; static symbol s_7_11[4] = { 'e', 'n', 'd', 'e' }; static symbol s_7_12[3] = { 'a', 'r', 'e' }; static symbol s_7_13[3] = { 'e', 'r', 'e' }; static symbol s_7_14[3] = { 'i', 'r', 'e' }; static symbol s_7_15[4] = { 'a', 's', 's', 'e' }; static symbol s_7_16[3] = { 'a', 't', 'e' }; static symbol s_7_17[5] = { 'a', 'v', 'a', 't', 'e' }; static symbol s_7_18[5] = { 'e', 'v', 'a', 't', 'e' }; static symbol s_7_19[5] = { 'i', 'v', 'a', 't', 'e' }; static symbol s_7_20[3] = { 'e', 't', 'e' }; static symbol s_7_21[5] = { 'e', 'r', 'e', 't', 'e' }; static symbol s_7_22[5] = { 'i', 'r', 'e', 't', 'e' }; static symbol s_7_23[3] = { 'i', 't', 'e' }; static symbol s_7_24[6] = { 'e', 'r', 'e', 's', 't', 'e' }; static symbol s_7_25[6] = { 'i', 'r', 'e', 's', 't', 'e' }; static symbol s_7_26[3] = { 'u', 't', 'e' }; static symbol s_7_27[4] = { 'e', 'r', 'a', 'i' }; static symbol s_7_28[4] = { 'i', 'r', 'a', 'i' }; static symbol s_7_29[4] = { 'i', 's', 'c', 'i' }; static symbol s_7_30[4] = { 'e', 'n', 'd', 'i' }; static symbol s_7_31[4] = { 'e', 'r', 'e', 'i' }; static symbol s_7_32[4] = { 'i', 'r', 'e', 'i' }; static symbol s_7_33[4] = { 'a', 's', 's', 'i' }; static symbol s_7_34[3] = { 'a', 't', 'i' }; static symbol s_7_35[3] = { 'i', 't', 'i' }; static symbol s_7_36[6] = { 'e', 'r', 'e', 's', 't', 'i' }; static symbol s_7_37[6] = { 'i', 'r', 'e', 's', 't', 'i' }; static symbol s_7_38[3] = { 'u', 't', 'i' }; static symbol s_7_39[3] = { 'a', 'v', 'i' }; static symbol s_7_40[3] = { 'e', 'v', 'i' }; static symbol s_7_41[3] = { 'i', 'v', 'i' }; static symbol s_7_42[4] = { 'i', 's', 'c', 'o' }; static symbol s_7_43[4] = { 'a', 'n', 'd', 'o' }; static symbol s_7_44[4] = { 'e', 'n', 'd', 'o' }; static symbol s_7_45[4] = { 'Y', 'a', 'm', 'o' }; static symbol s_7_46[4] = { 'i', 'a', 'm', 'o' }; static symbol s_7_47[5] = { 'a', 'v', 'a', 'm', 'o' }; static symbol s_7_48[5] = { 'e', 'v', 'a', 'm', 'o' }; static symbol s_7_49[5] = { 'i', 'v', 'a', 'm', 'o' }; static symbol s_7_50[5] = { 'e', 'r', 'e', 'm', 'o' }; static symbol s_7_51[5] = { 'i', 'r', 'e', 'm', 'o' }; static symbol s_7_52[6] = { 'a', 's', 's', 'i', 'm', 'o' }; static symbol s_7_53[4] = { 'a', 'm', 'm', 'o' }; static symbol s_7_54[4] = { 'e', 'm', 'm', 'o' }; static symbol s_7_55[6] = { 'e', 'r', 'e', 'm', 'm', 'o' }; static symbol s_7_56[6] = { 'i', 'r', 'e', 'm', 'm', 'o' }; static symbol s_7_57[4] = { 'i', 'm', 'm', 'o' }; static symbol s_7_58[3] = { 'a', 'n', 'o' }; static symbol s_7_59[6] = { 'i', 's', 'c', 'a', 'n', 'o' }; static symbol s_7_60[5] = { 'a', 'v', 'a', 'n', 'o' }; static symbol s_7_61[5] = { 'e', 'v', 'a', 'n', 'o' }; static symbol s_7_62[5] = { 'i', 'v', 'a', 'n', 'o' }; static symbol s_7_63[6] = { 'e', 'r', 'a', 'n', 'n', 'o' }; static symbol s_7_64[6] = { 'i', 'r', 'a', 'n', 'n', 'o' }; static symbol s_7_65[3] = { 'o', 'n', 'o' }; static symbol s_7_66[6] = { 'i', 's', 'c', 'o', 'n', 'o' }; static symbol s_7_67[5] = { 'a', 'r', 'o', 'n', 'o' }; static symbol s_7_68[5] = { 'e', 'r', 'o', 'n', 'o' }; static symbol s_7_69[5] = { 'i', 'r', 'o', 'n', 'o' }; static symbol s_7_70[8] = { 'e', 'r', 'e', 'b', 'b', 'e', 'r', 'o' }; static symbol s_7_71[8] = { 'i', 'r', 'e', 'b', 'b', 'e', 'r', 'o' }; static symbol s_7_72[6] = { 'a', 's', 's', 'e', 'r', 'o' }; static symbol s_7_73[6] = { 'e', 's', 's', 'e', 'r', 'o' }; static symbol s_7_74[6] = { 'i', 's', 's', 'e', 'r', 'o' }; static symbol s_7_75[3] = { 'a', 't', 'o' }; static symbol s_7_76[3] = { 'i', 't', 'o' }; static symbol s_7_77[3] = { 'u', 't', 'o' }; static symbol s_7_78[3] = { 'a', 'v', 'o' }; static symbol s_7_79[3] = { 'e', 'v', 'o' }; static symbol s_7_80[3] = { 'i', 'v', 'o' }; static symbol s_7_81[2] = { 'a', 'r' }; static symbol s_7_82[2] = { 'i', 'r' }; static symbol s_7_83[4] = { 'e', 'r', 0xC3, 0xA0 }; static symbol s_7_84[4] = { 'i', 'r', 0xC3, 0xA0 }; static symbol s_7_85[4] = { 'e', 'r', 0xC3, 0xB2 }; static symbol s_7_86[4] = { 'i', 'r', 0xC3, 0xB2 }; static struct among a_7[87] = { /* 0 */ { 4, s_7_0, -1, 1, 0}, /* 1 */ { 4, s_7_1, -1, 1, 0}, /* 2 */ { 3, s_7_2, -1, 1, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0}, /* 4 */ { 3, s_7_4, -1, 1, 0}, /* 5 */ { 3, s_7_5, -1, 1, 0}, /* 6 */ { 3, s_7_6, -1, 1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 6, s_7_8, -1, 1, 0}, /* 9 */ { 6, s_7_9, -1, 1, 0}, /* 10 */ { 4, s_7_10, -1, 1, 0}, /* 11 */ { 4, s_7_11, -1, 1, 0}, /* 12 */ { 3, s_7_12, -1, 1, 0}, /* 13 */ { 3, s_7_13, -1, 1, 0}, /* 14 */ { 3, s_7_14, -1, 1, 0}, /* 15 */ { 4, s_7_15, -1, 1, 0}, /* 16 */ { 3, s_7_16, -1, 1, 0}, /* 17 */ { 5, s_7_17, 16, 1, 0}, /* 18 */ { 5, s_7_18, 16, 1, 0}, /* 19 */ { 5, s_7_19, 16, 1, 0}, /* 20 */ { 3, s_7_20, -1, 1, 0}, /* 21 */ { 5, s_7_21, 20, 1, 0}, /* 22 */ { 5, s_7_22, 20, 1, 0}, /* 23 */ { 3, s_7_23, -1, 1, 0}, /* 24 */ { 6, s_7_24, -1, 1, 0}, /* 25 */ { 6, s_7_25, -1, 1, 0}, /* 26 */ { 3, s_7_26, -1, 1, 0}, /* 27 */ { 4, s_7_27, -1, 1, 0}, /* 28 */ { 4, s_7_28, -1, 1, 0}, /* 29 */ { 4, s_7_29, -1, 1, 0}, /* 30 */ { 4, s_7_30, -1, 1, 0}, /* 31 */ { 4, s_7_31, -1, 1, 0}, /* 32 */ { 4, s_7_32, -1, 1, 0}, /* 33 */ { 4, s_7_33, -1, 1, 0}, /* 34 */ { 3, s_7_34, -1, 1, 0}, /* 35 */ { 3, s_7_35, -1, 1, 0}, /* 36 */ { 6, s_7_36, -1, 1, 0}, /* 37 */ { 6, s_7_37, -1, 1, 0}, /* 38 */ { 3, s_7_38, -1, 1, 0}, /* 39 */ { 3, s_7_39, -1, 1, 0}, /* 40 */ { 3, s_7_40, -1, 1, 0}, /* 41 */ { 3, s_7_41, -1, 1, 0}, /* 42 */ { 4, s_7_42, -1, 1, 0}, /* 43 */ { 4, s_7_43, -1, 1, 0}, /* 44 */ { 4, s_7_44, -1, 1, 0}, /* 45 */ { 4, s_7_45, -1, 1, 0}, /* 46 */ { 4, s_7_46, -1, 1, 0}, /* 47 */ { 5, s_7_47, -1, 1, 0}, /* 48 */ { 5, s_7_48, -1, 1, 0}, /* 49 */ { 5, s_7_49, -1, 1, 0}, /* 50 */ { 5, s_7_50, -1, 1, 0}, /* 51 */ { 5, s_7_51, -1, 1, 0}, /* 52 */ { 6, s_7_52, -1, 1, 0}, /* 53 */ { 4, s_7_53, -1, 1, 0}, /* 54 */ { 4, s_7_54, -1, 1, 0}, /* 55 */ { 6, s_7_55, 54, 1, 0}, /* 56 */ { 6, s_7_56, 54, 1, 0}, /* 57 */ { 4, s_7_57, -1, 1, 0}, /* 58 */ { 3, s_7_58, -1, 1, 0}, /* 59 */ { 6, s_7_59, 58, 1, 0}, /* 60 */ { 5, s_7_60, 58, 1, 0}, /* 61 */ { 5, s_7_61, 58, 1, 0}, /* 62 */ { 5, s_7_62, 58, 1, 0}, /* 63 */ { 6, s_7_63, -1, 1, 0}, /* 64 */ { 6, s_7_64, -1, 1, 0}, /* 65 */ { 3, s_7_65, -1, 1, 0}, /* 66 */ { 6, s_7_66, 65, 1, 0}, /* 67 */ { 5, s_7_67, 65, 1, 0}, /* 68 */ { 5, s_7_68, 65, 1, 0}, /* 69 */ { 5, s_7_69, 65, 1, 0}, /* 70 */ { 8, s_7_70, -1, 1, 0}, /* 71 */ { 8, s_7_71, -1, 1, 0}, /* 72 */ { 6, s_7_72, -1, 1, 0}, /* 73 */ { 6, s_7_73, -1, 1, 0}, /* 74 */ { 6, s_7_74, -1, 1, 0}, /* 75 */ { 3, s_7_75, -1, 1, 0}, /* 76 */ { 3, s_7_76, -1, 1, 0}, /* 77 */ { 3, s_7_77, -1, 1, 0}, /* 78 */ { 3, s_7_78, -1, 1, 0}, /* 79 */ { 3, s_7_79, -1, 1, 0}, /* 80 */ { 3, s_7_80, -1, 1, 0}, /* 81 */ { 2, s_7_81, -1, 1, 0}, /* 82 */ { 2, s_7_82, -1, 1, 0}, /* 83 */ { 4, s_7_83, -1, 1, 0}, /* 84 */ { 4, s_7_84, -1, 1, 0}, /* 85 */ { 4, s_7_85, -1, 1, 0}, /* 86 */ { 4, s_7_86, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2, 1 }; static unsigned char g_AEIO[] = { 17, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2 }; static unsigned char g_CG[] = { 17 }; static symbol s_0[] = { 0xC3, 0xA0 }; static symbol s_1[] = { 0xC3, 0xA8 }; static symbol s_2[] = { 0xC3, 0xAC }; static symbol s_3[] = { 0xC3, 0xB2 }; static symbol s_4[] = { 0xC3, 0xB9 }; static symbol s_5[] = { 'q', 'U' }; static symbol s_6[] = { 'u' }; static symbol s_7[] = { 'U' }; static symbol s_8[] = { 'i' }; static symbol s_9[] = { 'I' }; static symbol s_10[] = { 'i' }; static symbol s_11[] = { 'u' }; static symbol s_12[] = { 'e' }; static symbol s_13[] = { 'i', 'c' }; static symbol s_14[] = { 'l', 'o', 'g' }; static symbol s_15[] = { 'u' }; static symbol s_16[] = { 'e', 'n', 't', 'e' }; static symbol s_17[] = { 'a', 't' }; static symbol s_18[] = { 'a', 't' }; static symbol s_19[] = { 'i', 'c' }; static symbol s_20[] = { 'i' }; static symbol s_21[] = { 'h' }; static int r_prelude(struct SN_env * z) { int among_var; { int c_test = z->c; /* test, line 35 */ while(1) { /* repeat, line 35 */ int c = z->c; z->bra = z->c; /* [, line 36 */ among_var = find_among(z, a_0, 7); /* substring, line 36 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 36 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 2, s_0); /* <-, line 37 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 38 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 2, s_2); /* <-, line 39 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 2, s_3); /* <-, line 40 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 2, s_4); /* <-, line 41 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 2, s_5); /* <-, line 42 */ if (ret < 0) return ret; } break; case 7: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 43 */ } break; } continue; lab0: z->c = c; break; } z->c = c_test; } while(1) { /* repeat, line 46 */ int c = z->c; while(1) { /* goto, line 46 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2; z->bra = z->c; /* [, line 47 */ { int c = z->c; /* or, line 47 */ if (!(eq_s(z, 1, s_6))) goto lab4; z->ket = z->c; /* ], line 47 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab4; { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 47 */ if (ret < 0) return ret; } goto lab3; lab4: z->c = c; if (!(eq_s(z, 1, s_8))) goto lab2; z->ket = z->c; /* ], line 48 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2; { int ret; ret = slice_from_s(z, 1, s_9); /* <-, line 48 */ if (ret < 0) return ret; } } lab3: z->c = c; break; lab2: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab1; z->c = c; /* goto, line 46 */ } } continue; lab1: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 58 */ { int c = z->c; /* or, line 60 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2; { int c = z->c; /* or, line 59 */ if (!(out_grouping_U(z, g_v, 97, 249))) goto lab4; while(1) { /* gopast, line 59 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab5; break; lab5: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 59 */ } } goto lab3; lab4: z->c = c; if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2; while(1) { /* gopast, line 59 */ if (!(out_grouping_U(z, g_v, 97, 249))) goto lab6; break; lab6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab2; z->c = c; /* gopast, line 59 */ } } } lab3: goto lab1; lab2: z->c = c; if (!(out_grouping_U(z, g_v, 97, 249))) goto lab0; { int c = z->c; /* or, line 61 */ if (!(out_grouping_U(z, g_v, 97, 249))) goto lab8; while(1) { /* gopast, line 61 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab9; break; lab9: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab8; z->c = c; /* gopast, line 61 */ } } goto lab7; lab8: z->c = c; if (!(in_grouping_U(z, g_v, 97, 249))) goto lab0; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 61 */ } } lab7: ; } lab1: z->I[0] = z->c; /* setmark pV, line 62 */ lab0: z->c = c; } { int c = z->c; /* do, line 64 */ while(1) { /* gopast, line 65 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab11; break; lab11: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 65 */ } } while(1) { /* gopast, line 65 */ if (!(out_grouping_U(z, g_v, 97, 249))) goto lab12; break; lab12: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 65 */ } } z->I[1] = z->c; /* setmark p1, line 65 */ while(1) { /* gopast, line 66 */ if (!(in_grouping_U(z, g_v, 97, 249))) goto lab13; break; lab13: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 66 */ } } while(1) { /* gopast, line 66 */ if (!(out_grouping_U(z, g_v, 97, 249))) goto lab14; break; lab14: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 66 */ } } z->I[2] = z->c; /* setmark p2, line 66 */ lab10: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 70 */ int c = z->c; z->bra = z->c; /* [, line 72 */ among_var = find_among(z, a_1, 3); /* substring, line 72 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 72 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_10); /* <-, line 73 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_11); /* <-, line 74 */ if (ret < 0) return ret; } break; case 3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 75 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_attached_pronoun(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 87 */ if (!(find_among_b(z, a_2, 37))) return 0; /* substring, line 87 */ z->bra = z->c; /* ], line 87 */ among_var = find_among_b(z, a_3, 5); /* among, line 97 */ if (!(among_var)) return 0; { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 97 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 98 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_12); /* <-, line 99 */ if (ret < 0) return ret; } break; } return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 104 */ among_var = find_among_b(z, a_6, 51); /* substring, line 104 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 104 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 111 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 111 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 113 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 113 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 114 */ z->ket = z->c; /* [, line 114 */ if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 114 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 114 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 114 */ if (ret < 0) return ret; } lab0: ; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 117 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_14); /* <-, line 117 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 119 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_15); /* <-, line 119 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 121 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_16); /* <-, line 121 */ if (ret < 0) return ret; } break; case 6: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 123 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 123 */ if (ret < 0) return ret; } break; case 7: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 125 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 125 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 126 */ z->ket = z->c; /* [, line 127 */ among_var = find_among_b(z, a_4, 4); /* substring, line 127 */ if (!(among_var)) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 127 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 127 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab1; } case 1: z->ket = z->c; /* [, line 128 */ if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 128 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 128 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 128 */ if (ret < 0) return ret; } break; } lab1: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 134 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 134 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 135 */ z->ket = z->c; /* [, line 136 */ among_var = find_among_b(z, a_5, 3); /* substring, line 136 */ if (!(among_var)) { z->c = z->l - m; goto lab2; } z->bra = z->c; /* ], line 136 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab2; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 137 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 137 */ if (ret < 0) return ret; } break; } lab2: ; } break; case 9: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 142 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 142 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 143 */ z->ket = z->c; /* [, line 143 */ if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 143 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 143 */ if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 143 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } lab3: ; } break; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 148 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 148 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 149 */ among_var = find_among_b(z, a_7, 87); /* substring, line 149 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 149 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret; ret = slice_del(z); /* delete, line 163 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_vowel_suffix(struct SN_env * z) { { int m = z->l - z->c; (void) m; /* try, line 171 */ z->ket = z->c; /* [, line 172 */ if (!(in_grouping_b_U(z, g_AEIO, 97, 242))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 172 */ { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 172 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 172 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 173 */ if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 173 */ { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 173 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 173 */ if (ret < 0) return ret; } lab0: ; } { int m = z->l - z->c; (void) m; /* try, line 175 */ z->ket = z->c; /* [, line 176 */ if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 176 */ if (!(in_grouping_b_U(z, g_CG, 99, 103))) { z->c = z->l - m; goto lab1; } { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call RV, line 176 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 176 */ if (ret < 0) return ret; } lab1: ; } return 1; } extern int italian_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 182 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 182 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 183 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 183 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 184 */ { int m = z->l - z->c; (void) m; /* do, line 185 */ { int ret = r_attached_pronoun(z); if (ret == 0) goto lab2; /* call attached_pronoun, line 185 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 186 */ { int m = z->l - z->c; (void) m; /* or, line 186 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab5; /* call standard_suffix, line 186 */ if (ret < 0) return ret; } goto lab4; lab5: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab3; /* call verb_suffix, line 186 */ if (ret < 0) return ret; } } lab4: lab3: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 187 */ { int ret = r_vowel_suffix(z); if (ret == 0) goto lab6; /* call vowel_suffix, line 187 */ if (ret < 0) return ret; } lab6: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 189 */ { int ret = r_postlude(z); if (ret == 0) goto lab7; /* call postlude, line 189 */ if (ret < 0) return ret; } lab7: z->c = c; } return 1; } extern struct SN_env * italian_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); } extern void italian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_italian.h000066400000000000000000000004711154025176300274300ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * italian_UTF_8_create_env(void); extern void italian_UTF_8_close_env(struct SN_env * z); extern int italian_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_norwegian.c000066400000000000000000000226211154025176300277740ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int norwegian_UTF_8_stem(struct SN_env * z); static int r_other_suffix(struct SN_env * z); static int r_consonant_pair(struct SN_env * z); static int r_main_suffix(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * norwegian_UTF_8_create_env(void); extern void norwegian_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[1] = { 'a' }; static symbol s_0_1[1] = { 'e' }; static symbol s_0_2[3] = { 'e', 'd', 'e' }; static symbol s_0_3[4] = { 'a', 'n', 'd', 'e' }; static symbol s_0_4[4] = { 'e', 'n', 'd', 'e' }; static symbol s_0_5[3] = { 'a', 'n', 'e' }; static symbol s_0_6[3] = { 'e', 'n', 'e' }; static symbol s_0_7[6] = { 'h', 'e', 't', 'e', 'n', 'e' }; static symbol s_0_8[4] = { 'e', 'r', 't', 'e' }; static symbol s_0_9[2] = { 'e', 'n' }; static symbol s_0_10[5] = { 'h', 'e', 't', 'e', 'n' }; static symbol s_0_11[2] = { 'a', 'r' }; static symbol s_0_12[2] = { 'e', 'r' }; static symbol s_0_13[5] = { 'h', 'e', 't', 'e', 'r' }; static symbol s_0_14[1] = { 's' }; static symbol s_0_15[2] = { 'a', 's' }; static symbol s_0_16[2] = { 'e', 's' }; static symbol s_0_17[4] = { 'e', 'd', 'e', 's' }; static symbol s_0_18[5] = { 'e', 'n', 'd', 'e', 's' }; static symbol s_0_19[4] = { 'e', 'n', 'e', 's' }; static symbol s_0_20[7] = { 'h', 'e', 't', 'e', 'n', 'e', 's' }; static symbol s_0_21[3] = { 'e', 'n', 's' }; static symbol s_0_22[6] = { 'h', 'e', 't', 'e', 'n', 's' }; static symbol s_0_23[3] = { 'e', 'r', 's' }; static symbol s_0_24[3] = { 'e', 't', 's' }; static symbol s_0_25[2] = { 'e', 't' }; static symbol s_0_26[3] = { 'h', 'e', 't' }; static symbol s_0_27[3] = { 'e', 'r', 't' }; static symbol s_0_28[3] = { 'a', 's', 't' }; static struct among a_0[29] = { /* 0 */ { 1, s_0_0, -1, 1, 0}, /* 1 */ { 1, s_0_1, -1, 1, 0}, /* 2 */ { 3, s_0_2, 1, 1, 0}, /* 3 */ { 4, s_0_3, 1, 1, 0}, /* 4 */ { 4, s_0_4, 1, 1, 0}, /* 5 */ { 3, s_0_5, 1, 1, 0}, /* 6 */ { 3, s_0_6, 1, 1, 0}, /* 7 */ { 6, s_0_7, 6, 1, 0}, /* 8 */ { 4, s_0_8, 1, 3, 0}, /* 9 */ { 2, s_0_9, -1, 1, 0}, /* 10 */ { 5, s_0_10, 9, 1, 0}, /* 11 */ { 2, s_0_11, -1, 1, 0}, /* 12 */ { 2, s_0_12, -1, 1, 0}, /* 13 */ { 5, s_0_13, 12, 1, 0}, /* 14 */ { 1, s_0_14, -1, 2, 0}, /* 15 */ { 2, s_0_15, 14, 1, 0}, /* 16 */ { 2, s_0_16, 14, 1, 0}, /* 17 */ { 4, s_0_17, 16, 1, 0}, /* 18 */ { 5, s_0_18, 16, 1, 0}, /* 19 */ { 4, s_0_19, 16, 1, 0}, /* 20 */ { 7, s_0_20, 19, 1, 0}, /* 21 */ { 3, s_0_21, 14, 1, 0}, /* 22 */ { 6, s_0_22, 21, 1, 0}, /* 23 */ { 3, s_0_23, 14, 1, 0}, /* 24 */ { 3, s_0_24, 14, 1, 0}, /* 25 */ { 2, s_0_25, -1, 1, 0}, /* 26 */ { 3, s_0_26, 25, 1, 0}, /* 27 */ { 3, s_0_27, -1, 3, 0}, /* 28 */ { 3, s_0_28, -1, 1, 0} }; static symbol s_1_0[2] = { 'd', 't' }; static symbol s_1_1[2] = { 'v', 't' }; static struct among a_1[2] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0} }; static symbol s_2_0[3] = { 'l', 'e', 'g' }; static symbol s_2_1[4] = { 'e', 'l', 'e', 'g' }; static symbol s_2_2[2] = { 'i', 'g' }; static symbol s_2_3[3] = { 'e', 'i', 'g' }; static symbol s_2_4[3] = { 'l', 'i', 'g' }; static symbol s_2_5[4] = { 'e', 'l', 'i', 'g' }; static symbol s_2_6[3] = { 'e', 'l', 's' }; static symbol s_2_7[3] = { 'l', 'o', 'v' }; static symbol s_2_8[4] = { 'e', 'l', 'o', 'v' }; static symbol s_2_9[4] = { 's', 'l', 'o', 'v' }; static symbol s_2_10[7] = { 'h', 'e', 't', 's', 'l', 'o', 'v' }; static struct among a_2[11] = { /* 0 */ { 3, s_2_0, -1, 1, 0}, /* 1 */ { 4, s_2_1, 0, 1, 0}, /* 2 */ { 2, s_2_2, -1, 1, 0}, /* 3 */ { 3, s_2_3, 2, 1, 0}, /* 4 */ { 3, s_2_4, 2, 1, 0}, /* 5 */ { 4, s_2_5, 4, 1, 0}, /* 6 */ { 3, s_2_6, -1, 1, 0}, /* 7 */ { 3, s_2_7, -1, 1, 0}, /* 8 */ { 4, s_2_8, 7, 1, 0}, /* 9 */ { 4, s_2_9, 7, 1, 0}, /* 10 */ { 7, s_2_10, 9, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 }; static unsigned char g_s_ending[] = { 119, 125, 149, 1 }; static symbol s_0[] = { 'k' }; static symbol s_1[] = { 'e', 'r' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; { int c_test = z->c; /* test, line 30 */ { int c = skip_utf8(z->p, z->c, 0, z->l, + 3); if (c < 0) return 0; z->c = c; /* hop, line 30 */ } z->I[1] = z->c; /* setmark x, line 30 */ z->c = c_test; } while(1) { /* goto, line 31 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 248))) goto lab0; z->c = c; break; lab0: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* goto, line 31 */ } } while(1) { /* gopast, line 31 */ if (!(out_grouping_U(z, g_v, 97, 248))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 31 */ } } z->I[0] = z->c; /* setmark p1, line 31 */ /* try, line 32 */ if (!(z->I[0] < z->I[1])) goto lab2; z->I[0] = z->I[1]; lab2: return 1; } static int r_main_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 38 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 38 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 38 */ among_var = find_among_b(z, a_0, 29); /* substring, line 38 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 38 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 44 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 46 */ if (!(in_grouping_b_U(z, g_s_ending, 98, 122))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_0))) return 0; if (!(out_grouping_b_U(z, g_v, 97, 248))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 46 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 48 */ if (ret < 0) return ret; } break; } return 1; } static int r_consonant_pair(struct SN_env * z) { { int m_test = z->l - z->c; /* test, line 53 */ { int m3; /* setlimit, line 54 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 54 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 54 */ if (!(find_among_b(z, a_1, 2))) { z->lb = m3; return 0; } /* substring, line 54 */ z->bra = z->c; /* ], line 54 */ z->lb = m3; } z->c = z->l - m_test; } { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 59 */ } z->bra = z->c; /* ], line 59 */ { int ret; ret = slice_del(z); /* delete, line 59 */ if (ret < 0) return ret; } return 1; } static int r_other_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 63 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 63 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 63 */ among_var = find_among_b(z, a_2, 11); /* substring, line 63 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 63 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 67 */ if (ret < 0) return ret; } break; } return 1; } extern int norwegian_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 74 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 74 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 75 */ { int m = z->l - z->c; (void) m; /* do, line 76 */ { int ret = r_main_suffix(z); if (ret == 0) goto lab1; /* call main_suffix, line 76 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 77 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab2; /* call consonant_pair, line 77 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 78 */ { int ret = r_other_suffix(z); if (ret == 0) goto lab3; /* call other_suffix, line 78 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * norwegian_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); } extern void norwegian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_norwegian.h000066400000000000000000000004771154025176300300060ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * norwegian_UTF_8_create_env(void); extern void norwegian_UTF_8_close_env(struct SN_env * z); extern int norwegian_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_porter.c000066400000000000000000000612601154025176300273200ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int porter_UTF_8_stem(struct SN_env * z); static int r_Step_5b(struct SN_env * z); static int r_Step_5a(struct SN_env * z); static int r_Step_4(struct SN_env * z); static int r_Step_3(struct SN_env * z); static int r_Step_2(struct SN_env * z); static int r_Step_1c(struct SN_env * z); static int r_Step_1b(struct SN_env * z); static int r_Step_1a(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_shortv(struct SN_env * z); extern struct SN_env * porter_UTF_8_create_env(void); extern void porter_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[1] = { 's' }; static symbol s_0_1[3] = { 'i', 'e', 's' }; static symbol s_0_2[4] = { 's', 's', 'e', 's' }; static symbol s_0_3[2] = { 's', 's' }; static struct among a_0[4] = { /* 0 */ { 1, s_0_0, -1, 3, 0}, /* 1 */ { 3, s_0_1, 0, 2, 0}, /* 2 */ { 4, s_0_2, 0, 1, 0}, /* 3 */ { 2, s_0_3, 0, -1, 0} }; static symbol s_1_1[2] = { 'b', 'b' }; static symbol s_1_2[2] = { 'd', 'd' }; static symbol s_1_3[2] = { 'f', 'f' }; static symbol s_1_4[2] = { 'g', 'g' }; static symbol s_1_5[2] = { 'b', 'l' }; static symbol s_1_6[2] = { 'm', 'm' }; static symbol s_1_7[2] = { 'n', 'n' }; static symbol s_1_8[2] = { 'p', 'p' }; static symbol s_1_9[2] = { 'r', 'r' }; static symbol s_1_10[2] = { 'a', 't' }; static symbol s_1_11[2] = { 't', 't' }; static symbol s_1_12[2] = { 'i', 'z' }; static struct among a_1[13] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_1_1, 0, 2, 0}, /* 2 */ { 2, s_1_2, 0, 2, 0}, /* 3 */ { 2, s_1_3, 0, 2, 0}, /* 4 */ { 2, s_1_4, 0, 2, 0}, /* 5 */ { 2, s_1_5, 0, 1, 0}, /* 6 */ { 2, s_1_6, 0, 2, 0}, /* 7 */ { 2, s_1_7, 0, 2, 0}, /* 8 */ { 2, s_1_8, 0, 2, 0}, /* 9 */ { 2, s_1_9, 0, 2, 0}, /* 10 */ { 2, s_1_10, 0, 1, 0}, /* 11 */ { 2, s_1_11, 0, 2, 0}, /* 12 */ { 2, s_1_12, 0, 1, 0} }; static symbol s_2_0[2] = { 'e', 'd' }; static symbol s_2_1[3] = { 'e', 'e', 'd' }; static symbol s_2_2[3] = { 'i', 'n', 'g' }; static struct among a_2[3] = { /* 0 */ { 2, s_2_0, -1, 2, 0}, /* 1 */ { 3, s_2_1, 0, 1, 0}, /* 2 */ { 3, s_2_2, -1, 2, 0} }; static symbol s_3_0[4] = { 'a', 'n', 'c', 'i' }; static symbol s_3_1[4] = { 'e', 'n', 'c', 'i' }; static symbol s_3_2[4] = { 'a', 'b', 'l', 'i' }; static symbol s_3_3[3] = { 'e', 'l', 'i' }; static symbol s_3_4[4] = { 'a', 'l', 'l', 'i' }; static symbol s_3_5[5] = { 'o', 'u', 's', 'l', 'i' }; static symbol s_3_6[5] = { 'e', 'n', 't', 'l', 'i' }; static symbol s_3_7[5] = { 'a', 'l', 'i', 't', 'i' }; static symbol s_3_8[6] = { 'b', 'i', 'l', 'i', 't', 'i' }; static symbol s_3_9[5] = { 'i', 'v', 'i', 't', 'i' }; static symbol s_3_10[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_3_11[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; static symbol s_3_12[5] = { 'a', 'l', 'i', 's', 'm' }; static symbol s_3_13[5] = { 'a', 't', 'i', 'o', 'n' }; static symbol s_3_14[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' }; static symbol s_3_15[4] = { 'i', 'z', 'e', 'r' }; static symbol s_3_16[4] = { 'a', 't', 'o', 'r' }; static symbol s_3_17[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' }; static symbol s_3_18[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' }; static symbol s_3_19[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' }; static struct among a_3[20] = { /* 0 */ { 4, s_3_0, -1, 3, 0}, /* 1 */ { 4, s_3_1, -1, 2, 0}, /* 2 */ { 4, s_3_2, -1, 4, 0}, /* 3 */ { 3, s_3_3, -1, 6, 0}, /* 4 */ { 4, s_3_4, -1, 9, 0}, /* 5 */ { 5, s_3_5, -1, 12, 0}, /* 6 */ { 5, s_3_6, -1, 5, 0}, /* 7 */ { 5, s_3_7, -1, 10, 0}, /* 8 */ { 6, s_3_8, -1, 14, 0}, /* 9 */ { 5, s_3_9, -1, 13, 0}, /* 10 */ { 6, s_3_10, -1, 1, 0}, /* 11 */ { 7, s_3_11, 10, 8, 0}, /* 12 */ { 5, s_3_12, -1, 10, 0}, /* 13 */ { 5, s_3_13, -1, 8, 0}, /* 14 */ { 7, s_3_14, 13, 7, 0}, /* 15 */ { 4, s_3_15, -1, 7, 0}, /* 16 */ { 4, s_3_16, -1, 8, 0}, /* 17 */ { 7, s_3_17, -1, 13, 0}, /* 18 */ { 7, s_3_18, -1, 11, 0}, /* 19 */ { 7, s_3_19, -1, 12, 0} }; static symbol s_4_0[5] = { 'i', 'c', 'a', 't', 'e' }; static symbol s_4_1[5] = { 'a', 't', 'i', 'v', 'e' }; static symbol s_4_2[5] = { 'a', 'l', 'i', 'z', 'e' }; static symbol s_4_3[5] = { 'i', 'c', 'i', 't', 'i' }; static symbol s_4_4[4] = { 'i', 'c', 'a', 'l' }; static symbol s_4_5[3] = { 'f', 'u', 'l' }; static symbol s_4_6[4] = { 'n', 'e', 's', 's' }; static struct among a_4[7] = { /* 0 */ { 5, s_4_0, -1, 2, 0}, /* 1 */ { 5, s_4_1, -1, 3, 0}, /* 2 */ { 5, s_4_2, -1, 1, 0}, /* 3 */ { 5, s_4_3, -1, 2, 0}, /* 4 */ { 4, s_4_4, -1, 2, 0}, /* 5 */ { 3, s_4_5, -1, 3, 0}, /* 6 */ { 4, s_4_6, -1, 3, 0} }; static symbol s_5_0[2] = { 'i', 'c' }; static symbol s_5_1[4] = { 'a', 'n', 'c', 'e' }; static symbol s_5_2[4] = { 'e', 'n', 'c', 'e' }; static symbol s_5_3[4] = { 'a', 'b', 'l', 'e' }; static symbol s_5_4[4] = { 'i', 'b', 'l', 'e' }; static symbol s_5_5[3] = { 'a', 't', 'e' }; static symbol s_5_6[3] = { 'i', 'v', 'e' }; static symbol s_5_7[3] = { 'i', 'z', 'e' }; static symbol s_5_8[3] = { 'i', 't', 'i' }; static symbol s_5_9[2] = { 'a', 'l' }; static symbol s_5_10[3] = { 'i', 's', 'm' }; static symbol s_5_11[3] = { 'i', 'o', 'n' }; static symbol s_5_12[2] = { 'e', 'r' }; static symbol s_5_13[3] = { 'o', 'u', 's' }; static symbol s_5_14[3] = { 'a', 'n', 't' }; static symbol s_5_15[3] = { 'e', 'n', 't' }; static symbol s_5_16[4] = { 'm', 'e', 'n', 't' }; static symbol s_5_17[5] = { 'e', 'm', 'e', 'n', 't' }; static symbol s_5_18[2] = { 'o', 'u' }; static struct among a_5[19] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 4, s_5_2, -1, 1, 0}, /* 3 */ { 4, s_5_3, -1, 1, 0}, /* 4 */ { 4, s_5_4, -1, 1, 0}, /* 5 */ { 3, s_5_5, -1, 1, 0}, /* 6 */ { 3, s_5_6, -1, 1, 0}, /* 7 */ { 3, s_5_7, -1, 1, 0}, /* 8 */ { 3, s_5_8, -1, 1, 0}, /* 9 */ { 2, s_5_9, -1, 1, 0}, /* 10 */ { 3, s_5_10, -1, 1, 0}, /* 11 */ { 3, s_5_11, -1, 2, 0}, /* 12 */ { 2, s_5_12, -1, 1, 0}, /* 13 */ { 3, s_5_13, -1, 1, 0}, /* 14 */ { 3, s_5_14, -1, 1, 0}, /* 15 */ { 3, s_5_15, -1, 1, 0}, /* 16 */ { 4, s_5_16, 15, 1, 0}, /* 17 */ { 5, s_5_17, 16, 1, 0}, /* 18 */ { 2, s_5_18, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1 }; static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 }; static symbol s_0[] = { 's', 's' }; static symbol s_1[] = { 'i' }; static symbol s_2[] = { 'e', 'e' }; static symbol s_3[] = { 'e' }; static symbol s_4[] = { 'e' }; static symbol s_5[] = { 'y' }; static symbol s_6[] = { 'Y' }; static symbol s_7[] = { 'i' }; static symbol s_8[] = { 't', 'i', 'o', 'n' }; static symbol s_9[] = { 'e', 'n', 'c', 'e' }; static symbol s_10[] = { 'a', 'n', 'c', 'e' }; static symbol s_11[] = { 'a', 'b', 'l', 'e' }; static symbol s_12[] = { 'e', 'n', 't' }; static symbol s_13[] = { 'e' }; static symbol s_14[] = { 'i', 'z', 'e' }; static symbol s_15[] = { 'a', 't', 'e' }; static symbol s_16[] = { 'a', 'l' }; static symbol s_17[] = { 'a', 'l' }; static symbol s_18[] = { 'f', 'u', 'l' }; static symbol s_19[] = { 'o', 'u', 's' }; static symbol s_20[] = { 'i', 'v', 'e' }; static symbol s_21[] = { 'b', 'l', 'e' }; static symbol s_22[] = { 'a', 'l' }; static symbol s_23[] = { 'i', 'c' }; static symbol s_24[] = { 's' }; static symbol s_25[] = { 't' }; static symbol s_26[] = { 'e' }; static symbol s_27[] = { 'l' }; static symbol s_28[] = { 'l' }; static symbol s_29[] = { 'y' }; static symbol s_30[] = { 'Y' }; static symbol s_31[] = { 'y' }; static symbol s_32[] = { 'Y' }; static symbol s_33[] = { 'Y' }; static symbol s_34[] = { 'y' }; static int r_shortv(struct SN_env * z) { if (!(out_grouping_b_U(z, g_v_WXY, 89, 121))) return 0; if (!(in_grouping_b_U(z, g_v, 97, 121))) return 0; if (!(out_grouping_b_U(z, g_v, 97, 121))) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_Step_1a(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 25 */ among_var = find_among_b(z, a_0, 4); /* substring, line 25 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 25 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 2, s_0); /* <-, line 26 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 27 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 29 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_1b(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 34 */ among_var = find_among_b(z, a_2, 3); /* substring, line 34 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 34 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 35 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 2, s_2); /* <-, line 35 */ if (ret < 0) return ret; } break; case 2: { int m_test = z->l - z->c; /* test, line 38 */ while(1) { /* gopast, line 38 */ if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab0; break; lab0: { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* gopast, line 38 */ } } z->c = z->l - m_test; } { int ret; ret = slice_del(z); /* delete, line 38 */ if (ret < 0) return ret; } { int m_test = z->l - z->c; /* test, line 39 */ among_var = find_among_b(z, a_1, 13); /* substring, line 39 */ if (!(among_var)) return 0; z->c = z->l - m_test; } switch(among_var) { case 0: return 0; case 1: { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */ z->c = c; } if (ret < 0) return ret; } break; case 2: z->ket = z->c; /* [, line 44 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* next, line 44 */ } z->bra = z->c; /* ], line 44 */ { int ret; ret = slice_del(z); /* delete, line 44 */ if (ret < 0) return ret; } break; case 3: if (z->c != z->I[0]) return 0; /* atmark, line 45 */ { int m_test = z->l - z->c; /* test, line 45 */ { int ret = r_shortv(z); if (ret == 0) return 0; /* call shortv, line 45 */ if (ret < 0) return ret; } z->c = z->l - m_test; } { int ret; { int c = z->c; ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */ z->c = c; } if (ret < 0) return ret; } break; } break; } return 1; } static int r_Step_1c(struct SN_env * z) { z->ket = z->c; /* [, line 52 */ { int m = z->l - z->c; (void) m; /* or, line 52 */ if (!(eq_s_b(z, 1, s_5))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_6))) return 0; } lab0: z->bra = z->c; /* ], line 52 */ while(1) { /* gopast, line 53 */ if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab2; break; lab2: { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) return 0; z->c = c; /* gopast, line 53 */ } } { int ret; ret = slice_from_s(z, 1, s_7); /* <-, line 54 */ if (ret < 0) return ret; } return 1; } static int r_Step_2(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 58 */ among_var = find_among_b(z, a_3, 20); /* substring, line 58 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 58 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 58 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 4, s_8); /* <-, line 59 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 4, s_9); /* <-, line 60 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 4, s_10); /* <-, line 61 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 4, s_11); /* <-, line 62 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 3, s_12); /* <-, line 63 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 64 */ if (ret < 0) return ret; } break; case 7: { int ret; ret = slice_from_s(z, 3, s_14); /* <-, line 66 */ if (ret < 0) return ret; } break; case 8: { int ret; ret = slice_from_s(z, 3, s_15); /* <-, line 68 */ if (ret < 0) return ret; } break; case 9: { int ret; ret = slice_from_s(z, 2, s_16); /* <-, line 69 */ if (ret < 0) return ret; } break; case 10: { int ret; ret = slice_from_s(z, 2, s_17); /* <-, line 71 */ if (ret < 0) return ret; } break; case 11: { int ret; ret = slice_from_s(z, 3, s_18); /* <-, line 72 */ if (ret < 0) return ret; } break; case 12: { int ret; ret = slice_from_s(z, 3, s_19); /* <-, line 74 */ if (ret < 0) return ret; } break; case 13: { int ret; ret = slice_from_s(z, 3, s_20); /* <-, line 76 */ if (ret < 0) return ret; } break; case 14: { int ret; ret = slice_from_s(z, 3, s_21); /* <-, line 77 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_3(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 82 */ among_var = find_among_b(z, a_4, 7); /* substring, line 82 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 82 */ { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 82 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_from_s(z, 2, s_22); /* <-, line 83 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 2, s_23); /* <-, line 85 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 87 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_4(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 92 */ among_var = find_among_b(z, a_5, 19); /* substring, line 92 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 92 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 92 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 95 */ if (ret < 0) return ret; } break; case 2: { int m = z->l - z->c; (void) m; /* or, line 96 */ if (!(eq_s_b(z, 1, s_24))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_25))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 96 */ if (ret < 0) return ret; } break; } return 1; } static int r_Step_5a(struct SN_env * z) { z->ket = z->c; /* [, line 101 */ if (!(eq_s_b(z, 1, s_26))) return 0; z->bra = z->c; /* ], line 101 */ { int m = z->l - z->c; (void) m; /* or, line 102 */ { int ret = r_R2(z); if (ret == 0) goto lab1; /* call R2, line 102 */ if (ret < 0) return ret; } goto lab0; lab1: z->c = z->l - m; { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 102 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* not, line 102 */ { int ret = r_shortv(z); if (ret == 0) goto lab2; /* call shortv, line 102 */ if (ret < 0) return ret; } return 0; lab2: z->c = z->l - m; } } lab0: { int ret; ret = slice_del(z); /* delete, line 103 */ if (ret < 0) return ret; } return 1; } static int r_Step_5b(struct SN_env * z) { z->ket = z->c; /* [, line 107 */ if (!(eq_s_b(z, 1, s_27))) return 0; z->bra = z->c; /* ], line 107 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 108 */ if (ret < 0) return ret; } if (!(eq_s_b(z, 1, s_28))) return 0; { int ret; ret = slice_del(z); /* delete, line 109 */ if (ret < 0) return ret; } return 1; } extern int porter_UTF_8_stem(struct SN_env * z) { z->B[0] = 0; /* unset Y_found, line 115 */ { int c = z->c; /* do, line 116 */ z->bra = z->c; /* [, line 116 */ if (!(eq_s(z, 1, s_29))) goto lab0; z->ket = z->c; /* ], line 116 */ { int ret; ret = slice_from_s(z, 1, s_30); /* <-, line 116 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 116 */ lab0: z->c = c; } { int c = z->c; /* do, line 117 */ while(1) { /* repeat, line 117 */ int c = z->c; while(1) { /* goto, line 117 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 121))) goto lab3; z->bra = z->c; /* [, line 117 */ if (!(eq_s(z, 1, s_31))) goto lab3; z->ket = z->c; /* ], line 117 */ z->c = c; break; lab3: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab2; z->c = c; /* goto, line 117 */ } } { int ret; ret = slice_from_s(z, 1, s_32); /* <-, line 117 */ if (ret < 0) return ret; } z->B[0] = 1; /* set Y_found, line 117 */ continue; lab2: z->c = c; break; } z->c = c; } z->I[0] = z->l; z->I[1] = z->l; { int c = z->c; /* do, line 121 */ while(1) { /* gopast, line 122 */ if (!(in_grouping_U(z, g_v, 97, 121))) goto lab5; break; lab5: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 122 */ } } while(1) { /* gopast, line 122 */ if (!(out_grouping_U(z, g_v, 97, 121))) goto lab6; break; lab6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 122 */ } } z->I[0] = z->c; /* setmark p1, line 122 */ while(1) { /* gopast, line 123 */ if (!(in_grouping_U(z, g_v, 97, 121))) goto lab7; break; lab7: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 123 */ } } while(1) { /* gopast, line 123 */ if (!(out_grouping_U(z, g_v, 97, 121))) goto lab8; break; lab8: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 123 */ } } z->I[1] = z->c; /* setmark p2, line 123 */ lab4: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 126 */ { int m = z->l - z->c; (void) m; /* do, line 127 */ { int ret = r_Step_1a(z); if (ret == 0) goto lab9; /* call Step_1a, line 127 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 128 */ { int ret = r_Step_1b(z); if (ret == 0) goto lab10; /* call Step_1b, line 128 */ if (ret < 0) return ret; } lab10: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 129 */ { int ret = r_Step_1c(z); if (ret == 0) goto lab11; /* call Step_1c, line 129 */ if (ret < 0) return ret; } lab11: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 130 */ { int ret = r_Step_2(z); if (ret == 0) goto lab12; /* call Step_2, line 130 */ if (ret < 0) return ret; } lab12: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 131 */ { int ret = r_Step_3(z); if (ret == 0) goto lab13; /* call Step_3, line 131 */ if (ret < 0) return ret; } lab13: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 132 */ { int ret = r_Step_4(z); if (ret == 0) goto lab14; /* call Step_4, line 132 */ if (ret < 0) return ret; } lab14: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 133 */ { int ret = r_Step_5a(z); if (ret == 0) goto lab15; /* call Step_5a, line 133 */ if (ret < 0) return ret; } lab15: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 134 */ { int ret = r_Step_5b(z); if (ret == 0) goto lab16; /* call Step_5b, line 134 */ if (ret < 0) return ret; } lab16: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 137 */ if (!(z->B[0])) goto lab17; /* Boolean test Y_found, line 137 */ while(1) { /* repeat, line 137 */ int c = z->c; while(1) { /* goto, line 137 */ int c = z->c; z->bra = z->c; /* [, line 137 */ if (!(eq_s(z, 1, s_33))) goto lab19; z->ket = z->c; /* ], line 137 */ z->c = c; break; lab19: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab18; z->c = c; /* goto, line 137 */ } } { int ret; ret = slice_from_s(z, 1, s_34); /* <-, line 137 */ if (ret < 0) return ret; } continue; lab18: z->c = c; break; } lab17: z->c = c; } return 1; } extern struct SN_env * porter_UTF_8_create_env(void) { return SN_create_env(0, 2, 1); } extern void porter_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_porter.h000066400000000000000000000004661154025176300273260ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * porter_UTF_8_create_env(void); extern void porter_UTF_8_close_env(struct SN_env * z); extern int porter_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_portuguese.c000066400000000000000000001124161154025176300302070ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int portuguese_UTF_8_stem(struct SN_env * z); static int r_residual_form(struct SN_env * z); static int r_residual_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); static int r_prelude(struct SN_env * z); extern struct SN_env * portuguese_UTF_8_create_env(void); extern void portuguese_UTF_8_close_env(struct SN_env * z); static symbol s_0_1[2] = { 0xC3, 0xA3 }; static symbol s_0_2[2] = { 0xC3, 0xB5 }; static struct among a_0[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_0_1, 0, 1, 0}, /* 2 */ { 2, s_0_2, 0, 2, 0} }; static symbol s_1_1[2] = { 'a', '~' }; static symbol s_1_2[2] = { 'o', '~' }; static struct among a_1[3] = { /* 0 */ { 0, 0, -1, 3, 0}, /* 1 */ { 2, s_1_1, 0, 1, 0}, /* 2 */ { 2, s_1_2, 0, 2, 0} }; static symbol s_2_0[2] = { 'i', 'c' }; static symbol s_2_1[2] = { 'a', 'd' }; static symbol s_2_2[2] = { 'o', 's' }; static symbol s_2_3[2] = { 'i', 'v' }; static struct among a_2[4] = { /* 0 */ { 2, s_2_0, -1, -1, 0}, /* 1 */ { 2, s_2_1, -1, -1, 0}, /* 2 */ { 2, s_2_2, -1, -1, 0}, /* 3 */ { 2, s_2_3, -1, 1, 0} }; static symbol s_3_0[4] = { 'a', 'n', 't', 'e' }; static symbol s_3_1[4] = { 'a', 'v', 'e', 'l' }; static symbol s_3_2[5] = { 0xC3, 0xAD, 'v', 'e', 'l' }; static struct among a_3[3] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0}, /* 2 */ { 5, s_3_2, -1, 1, 0} }; static symbol s_4_0[2] = { 'i', 'c' }; static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_4_2[2] = { 'i', 'v' }; static struct among a_4[3] = { /* 0 */ { 2, s_4_0, -1, 1, 0}, /* 1 */ { 4, s_4_1, -1, 1, 0}, /* 2 */ { 2, s_4_2, -1, 1, 0} }; static symbol s_5_0[3] = { 'i', 'c', 'a' }; static symbol s_5_1[6] = { 0xC3, 0xA2, 'n', 'c', 'i', 'a' }; static symbol s_5_2[6] = { 0xC3, 0xAA, 'n', 'c', 'i', 'a' }; static symbol s_5_3[3] = { 'i', 'r', 'a' }; static symbol s_5_4[5] = { 'a', 'd', 'o', 'r', 'a' }; static symbol s_5_5[3] = { 'o', 's', 'a' }; static symbol s_5_6[4] = { 'i', 's', 't', 'a' }; static symbol s_5_7[3] = { 'i', 'v', 'a' }; static symbol s_5_8[3] = { 'e', 'z', 'a' }; static symbol s_5_9[6] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a' }; static symbol s_5_10[5] = { 'i', 'd', 'a', 'd', 'e' }; static symbol s_5_11[4] = { 'a', 'n', 't', 'e' }; static symbol s_5_12[5] = { 'm', 'e', 'n', 't', 'e' }; static symbol s_5_13[6] = { 'a', 'm', 'e', 'n', 't', 'e' }; static symbol s_5_14[5] = { 0xC3, 0xA1, 'v', 'e', 'l' }; static symbol s_5_15[5] = { 0xC3, 0xAD, 'v', 'e', 'l' }; static symbol s_5_16[6] = { 'u', 'c', 'i', 0xC3, 0xB3, 'n' }; static symbol s_5_17[3] = { 'i', 'c', 'o' }; static symbol s_5_18[4] = { 'i', 's', 'm', 'o' }; static symbol s_5_19[3] = { 'o', 's', 'o' }; static symbol s_5_20[6] = { 'a', 'm', 'e', 'n', 't', 'o' }; static symbol s_5_21[6] = { 'i', 'm', 'e', 'n', 't', 'o' }; static symbol s_5_22[3] = { 'i', 'v', 'o' }; static symbol s_5_23[6] = { 'a', 0xC3, 0xA7, 'a', '~', 'o' }; static symbol s_5_24[4] = { 'a', 'd', 'o', 'r' }; static symbol s_5_25[4] = { 'i', 'c', 'a', 's' }; static symbol s_5_26[7] = { 0xC3, 0xAA, 'n', 'c', 'i', 'a', 's' }; static symbol s_5_27[4] = { 'i', 'r', 'a', 's' }; static symbol s_5_28[6] = { 'a', 'd', 'o', 'r', 'a', 's' }; static symbol s_5_29[4] = { 'o', 's', 'a', 's' }; static symbol s_5_30[5] = { 'i', 's', 't', 'a', 's' }; static symbol s_5_31[4] = { 'i', 'v', 'a', 's' }; static symbol s_5_32[4] = { 'e', 'z', 'a', 's' }; static symbol s_5_33[7] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a', 's' }; static symbol s_5_34[6] = { 'i', 'd', 'a', 'd', 'e', 's' }; static symbol s_5_35[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' }; static symbol s_5_36[6] = { 'a', 'd', 'o', 'r', 'e', 's' }; static symbol s_5_37[5] = { 'a', 'n', 't', 'e', 's' }; static symbol s_5_38[7] = { 'a', 0xC3, 0xA7, 'o', '~', 'e', 's' }; static symbol s_5_39[4] = { 'i', 'c', 'o', 's' }; static symbol s_5_40[5] = { 'i', 's', 'm', 'o', 's' }; static symbol s_5_41[4] = { 'o', 's', 'o', 's' }; static symbol s_5_42[7] = { 'a', 'm', 'e', 'n', 't', 'o', 's' }; static symbol s_5_43[7] = { 'i', 'm', 'e', 'n', 't', 'o', 's' }; static symbol s_5_44[4] = { 'i', 'v', 'o', 's' }; static struct among a_5[45] = { /* 0 */ { 3, s_5_0, -1, 1, 0}, /* 1 */ { 6, s_5_1, -1, 1, 0}, /* 2 */ { 6, s_5_2, -1, 4, 0}, /* 3 */ { 3, s_5_3, -1, 9, 0}, /* 4 */ { 5, s_5_4, -1, 1, 0}, /* 5 */ { 3, s_5_5, -1, 1, 0}, /* 6 */ { 4, s_5_6, -1, 1, 0}, /* 7 */ { 3, s_5_7, -1, 8, 0}, /* 8 */ { 3, s_5_8, -1, 1, 0}, /* 9 */ { 6, s_5_9, -1, 2, 0}, /* 10 */ { 5, s_5_10, -1, 7, 0}, /* 11 */ { 4, s_5_11, -1, 1, 0}, /* 12 */ { 5, s_5_12, -1, 6, 0}, /* 13 */ { 6, s_5_13, 12, 5, 0}, /* 14 */ { 5, s_5_14, -1, 1, 0}, /* 15 */ { 5, s_5_15, -1, 1, 0}, /* 16 */ { 6, s_5_16, -1, 3, 0}, /* 17 */ { 3, s_5_17, -1, 1, 0}, /* 18 */ { 4, s_5_18, -1, 1, 0}, /* 19 */ { 3, s_5_19, -1, 1, 0}, /* 20 */ { 6, s_5_20, -1, 1, 0}, /* 21 */ { 6, s_5_21, -1, 1, 0}, /* 22 */ { 3, s_5_22, -1, 8, 0}, /* 23 */ { 6, s_5_23, -1, 1, 0}, /* 24 */ { 4, s_5_24, -1, 1, 0}, /* 25 */ { 4, s_5_25, -1, 1, 0}, /* 26 */ { 7, s_5_26, -1, 4, 0}, /* 27 */ { 4, s_5_27, -1, 9, 0}, /* 28 */ { 6, s_5_28, -1, 1, 0}, /* 29 */ { 4, s_5_29, -1, 1, 0}, /* 30 */ { 5, s_5_30, -1, 1, 0}, /* 31 */ { 4, s_5_31, -1, 8, 0}, /* 32 */ { 4, s_5_32, -1, 1, 0}, /* 33 */ { 7, s_5_33, -1, 2, 0}, /* 34 */ { 6, s_5_34, -1, 7, 0}, /* 35 */ { 7, s_5_35, -1, 3, 0}, /* 36 */ { 6, s_5_36, -1, 1, 0}, /* 37 */ { 5, s_5_37, -1, 1, 0}, /* 38 */ { 7, s_5_38, -1, 1, 0}, /* 39 */ { 4, s_5_39, -1, 1, 0}, /* 40 */ { 5, s_5_40, -1, 1, 0}, /* 41 */ { 4, s_5_41, -1, 1, 0}, /* 42 */ { 7, s_5_42, -1, 1, 0}, /* 43 */ { 7, s_5_43, -1, 1, 0}, /* 44 */ { 4, s_5_44, -1, 8, 0} }; static symbol s_6_0[3] = { 'a', 'd', 'a' }; static symbol s_6_1[3] = { 'i', 'd', 'a' }; static symbol s_6_2[2] = { 'i', 'a' }; static symbol s_6_3[4] = { 'a', 'r', 'i', 'a' }; static symbol s_6_4[4] = { 'e', 'r', 'i', 'a' }; static symbol s_6_5[4] = { 'i', 'r', 'i', 'a' }; static symbol s_6_6[3] = { 'a', 'r', 'a' }; static symbol s_6_7[3] = { 'e', 'r', 'a' }; static symbol s_6_8[3] = { 'i', 'r', 'a' }; static symbol s_6_9[3] = { 'a', 'v', 'a' }; static symbol s_6_10[4] = { 'a', 's', 's', 'e' }; static symbol s_6_11[4] = { 'e', 's', 's', 'e' }; static symbol s_6_12[4] = { 'i', 's', 's', 'e' }; static symbol s_6_13[4] = { 'a', 's', 't', 'e' }; static symbol s_6_14[4] = { 'e', 's', 't', 'e' }; static symbol s_6_15[4] = { 'i', 's', 't', 'e' }; static symbol s_6_16[2] = { 'e', 'i' }; static symbol s_6_17[4] = { 'a', 'r', 'e', 'i' }; static symbol s_6_18[4] = { 'e', 'r', 'e', 'i' }; static symbol s_6_19[4] = { 'i', 'r', 'e', 'i' }; static symbol s_6_20[2] = { 'a', 'm' }; static symbol s_6_21[3] = { 'i', 'a', 'm' }; static symbol s_6_22[5] = { 'a', 'r', 'i', 'a', 'm' }; static symbol s_6_23[5] = { 'e', 'r', 'i', 'a', 'm' }; static symbol s_6_24[5] = { 'i', 'r', 'i', 'a', 'm' }; static symbol s_6_25[4] = { 'a', 'r', 'a', 'm' }; static symbol s_6_26[4] = { 'e', 'r', 'a', 'm' }; static symbol s_6_27[4] = { 'i', 'r', 'a', 'm' }; static symbol s_6_28[4] = { 'a', 'v', 'a', 'm' }; static symbol s_6_29[2] = { 'e', 'm' }; static symbol s_6_30[4] = { 'a', 'r', 'e', 'm' }; static symbol s_6_31[4] = { 'e', 'r', 'e', 'm' }; static symbol s_6_32[4] = { 'i', 'r', 'e', 'm' }; static symbol s_6_33[5] = { 'a', 's', 's', 'e', 'm' }; static symbol s_6_34[5] = { 'e', 's', 's', 'e', 'm' }; static symbol s_6_35[5] = { 'i', 's', 's', 'e', 'm' }; static symbol s_6_36[3] = { 'a', 'd', 'o' }; static symbol s_6_37[3] = { 'i', 'd', 'o' }; static symbol s_6_38[4] = { 'a', 'n', 'd', 'o' }; static symbol s_6_39[4] = { 'e', 'n', 'd', 'o' }; static symbol s_6_40[4] = { 'i', 'n', 'd', 'o' }; static symbol s_6_41[5] = { 'a', 'r', 'a', '~', 'o' }; static symbol s_6_42[5] = { 'e', 'r', 'a', '~', 'o' }; static symbol s_6_43[5] = { 'i', 'r', 'a', '~', 'o' }; static symbol s_6_44[2] = { 'a', 'r' }; static symbol s_6_45[2] = { 'e', 'r' }; static symbol s_6_46[2] = { 'i', 'r' }; static symbol s_6_47[2] = { 'a', 's' }; static symbol s_6_48[4] = { 'a', 'd', 'a', 's' }; static symbol s_6_49[4] = { 'i', 'd', 'a', 's' }; static symbol s_6_50[3] = { 'i', 'a', 's' }; static symbol s_6_51[5] = { 'a', 'r', 'i', 'a', 's' }; static symbol s_6_52[5] = { 'e', 'r', 'i', 'a', 's' }; static symbol s_6_53[5] = { 'i', 'r', 'i', 'a', 's' }; static symbol s_6_54[4] = { 'a', 'r', 'a', 's' }; static symbol s_6_55[4] = { 'e', 'r', 'a', 's' }; static symbol s_6_56[4] = { 'i', 'r', 'a', 's' }; static symbol s_6_57[4] = { 'a', 'v', 'a', 's' }; static symbol s_6_58[2] = { 'e', 's' }; static symbol s_6_59[5] = { 'a', 'r', 'd', 'e', 's' }; static symbol s_6_60[5] = { 'e', 'r', 'd', 'e', 's' }; static symbol s_6_61[5] = { 'i', 'r', 'd', 'e', 's' }; static symbol s_6_62[4] = { 'a', 'r', 'e', 's' }; static symbol s_6_63[4] = { 'e', 'r', 'e', 's' }; static symbol s_6_64[4] = { 'i', 'r', 'e', 's' }; static symbol s_6_65[5] = { 'a', 's', 's', 'e', 's' }; static symbol s_6_66[5] = { 'e', 's', 's', 'e', 's' }; static symbol s_6_67[5] = { 'i', 's', 's', 'e', 's' }; static symbol s_6_68[5] = { 'a', 's', 't', 'e', 's' }; static symbol s_6_69[5] = { 'e', 's', 't', 'e', 's' }; static symbol s_6_70[5] = { 'i', 's', 't', 'e', 's' }; static symbol s_6_71[2] = { 'i', 's' }; static symbol s_6_72[3] = { 'a', 'i', 's' }; static symbol s_6_73[3] = { 'e', 'i', 's' }; static symbol s_6_74[5] = { 'a', 'r', 'e', 'i', 's' }; static symbol s_6_75[5] = { 'e', 'r', 'e', 'i', 's' }; static symbol s_6_76[5] = { 'i', 'r', 'e', 'i', 's' }; static symbol s_6_77[6] = { 0xC3, 0xA1, 'r', 'e', 'i', 's' }; static symbol s_6_78[6] = { 0xC3, 0xA9, 'r', 'e', 'i', 's' }; static symbol s_6_79[6] = { 0xC3, 0xAD, 'r', 'e', 'i', 's' }; static symbol s_6_80[7] = { 0xC3, 0xA1, 's', 's', 'e', 'i', 's' }; static symbol s_6_81[7] = { 0xC3, 0xA9, 's', 's', 'e', 'i', 's' }; static symbol s_6_82[7] = { 0xC3, 0xAD, 's', 's', 'e', 'i', 's' }; static symbol s_6_83[6] = { 0xC3, 0xA1, 'v', 'e', 'i', 's' }; static symbol s_6_84[5] = { 0xC3, 0xAD, 'e', 'i', 's' }; static symbol s_6_85[7] = { 'a', 'r', 0xC3, 0xAD, 'e', 'i', 's' }; static symbol s_6_86[7] = { 'e', 'r', 0xC3, 0xAD, 'e', 'i', 's' }; static symbol s_6_87[7] = { 'i', 'r', 0xC3, 0xAD, 'e', 'i', 's' }; static symbol s_6_88[4] = { 'a', 'd', 'o', 's' }; static symbol s_6_89[4] = { 'i', 'd', 'o', 's' }; static symbol s_6_90[4] = { 'a', 'm', 'o', 's' }; static symbol s_6_91[7] = { 0xC3, 0xA1, 'r', 'a', 'm', 'o', 's' }; static symbol s_6_92[7] = { 0xC3, 0xA9, 'r', 'a', 'm', 'o', 's' }; static symbol s_6_93[7] = { 0xC3, 0xAD, 'r', 'a', 'm', 'o', 's' }; static symbol s_6_94[7] = { 0xC3, 0xA1, 'v', 'a', 'm', 'o', 's' }; static symbol s_6_95[6] = { 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_6_96[8] = { 'a', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_6_97[8] = { 'e', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_6_98[8] = { 'i', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_6_99[4] = { 'e', 'm', 'o', 's' }; static symbol s_6_100[6] = { 'a', 'r', 'e', 'm', 'o', 's' }; static symbol s_6_101[6] = { 'e', 'r', 'e', 'm', 'o', 's' }; static symbol s_6_102[6] = { 'i', 'r', 'e', 'm', 'o', 's' }; static symbol s_6_103[8] = { 0xC3, 0xA1, 's', 's', 'e', 'm', 'o', 's' }; static symbol s_6_104[8] = { 0xC3, 0xAA, 's', 's', 'e', 'm', 'o', 's' }; static symbol s_6_105[8] = { 0xC3, 0xAD, 's', 's', 'e', 'm', 'o', 's' }; static symbol s_6_106[4] = { 'i', 'm', 'o', 's' }; static symbol s_6_107[5] = { 'a', 'r', 'm', 'o', 's' }; static symbol s_6_108[5] = { 'e', 'r', 'm', 'o', 's' }; static symbol s_6_109[5] = { 'i', 'r', 'm', 'o', 's' }; static symbol s_6_110[5] = { 0xC3, 0xA1, 'm', 'o', 's' }; static symbol s_6_111[5] = { 'a', 'r', 0xC3, 0xA1, 's' }; static symbol s_6_112[5] = { 'e', 'r', 0xC3, 0xA1, 's' }; static symbol s_6_113[5] = { 'i', 'r', 0xC3, 0xA1, 's' }; static symbol s_6_114[2] = { 'e', 'u' }; static symbol s_6_115[2] = { 'i', 'u' }; static symbol s_6_116[2] = { 'o', 'u' }; static symbol s_6_117[4] = { 'a', 'r', 0xC3, 0xA1 }; static symbol s_6_118[4] = { 'e', 'r', 0xC3, 0xA1 }; static symbol s_6_119[4] = { 'i', 'r', 0xC3, 0xA1 }; static struct among a_6[120] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 3, s_6_1, -1, 1, 0}, /* 2 */ { 2, s_6_2, -1, 1, 0}, /* 3 */ { 4, s_6_3, 2, 1, 0}, /* 4 */ { 4, s_6_4, 2, 1, 0}, /* 5 */ { 4, s_6_5, 2, 1, 0}, /* 6 */ { 3, s_6_6, -1, 1, 0}, /* 7 */ { 3, s_6_7, -1, 1, 0}, /* 8 */ { 3, s_6_8, -1, 1, 0}, /* 9 */ { 3, s_6_9, -1, 1, 0}, /* 10 */ { 4, s_6_10, -1, 1, 0}, /* 11 */ { 4, s_6_11, -1, 1, 0}, /* 12 */ { 4, s_6_12, -1, 1, 0}, /* 13 */ { 4, s_6_13, -1, 1, 0}, /* 14 */ { 4, s_6_14, -1, 1, 0}, /* 15 */ { 4, s_6_15, -1, 1, 0}, /* 16 */ { 2, s_6_16, -1, 1, 0}, /* 17 */ { 4, s_6_17, 16, 1, 0}, /* 18 */ { 4, s_6_18, 16, 1, 0}, /* 19 */ { 4, s_6_19, 16, 1, 0}, /* 20 */ { 2, s_6_20, -1, 1, 0}, /* 21 */ { 3, s_6_21, 20, 1, 0}, /* 22 */ { 5, s_6_22, 21, 1, 0}, /* 23 */ { 5, s_6_23, 21, 1, 0}, /* 24 */ { 5, s_6_24, 21, 1, 0}, /* 25 */ { 4, s_6_25, 20, 1, 0}, /* 26 */ { 4, s_6_26, 20, 1, 0}, /* 27 */ { 4, s_6_27, 20, 1, 0}, /* 28 */ { 4, s_6_28, 20, 1, 0}, /* 29 */ { 2, s_6_29, -1, 1, 0}, /* 30 */ { 4, s_6_30, 29, 1, 0}, /* 31 */ { 4, s_6_31, 29, 1, 0}, /* 32 */ { 4, s_6_32, 29, 1, 0}, /* 33 */ { 5, s_6_33, 29, 1, 0}, /* 34 */ { 5, s_6_34, 29, 1, 0}, /* 35 */ { 5, s_6_35, 29, 1, 0}, /* 36 */ { 3, s_6_36, -1, 1, 0}, /* 37 */ { 3, s_6_37, -1, 1, 0}, /* 38 */ { 4, s_6_38, -1, 1, 0}, /* 39 */ { 4, s_6_39, -1, 1, 0}, /* 40 */ { 4, s_6_40, -1, 1, 0}, /* 41 */ { 5, s_6_41, -1, 1, 0}, /* 42 */ { 5, s_6_42, -1, 1, 0}, /* 43 */ { 5, s_6_43, -1, 1, 0}, /* 44 */ { 2, s_6_44, -1, 1, 0}, /* 45 */ { 2, s_6_45, -1, 1, 0}, /* 46 */ { 2, s_6_46, -1, 1, 0}, /* 47 */ { 2, s_6_47, -1, 1, 0}, /* 48 */ { 4, s_6_48, 47, 1, 0}, /* 49 */ { 4, s_6_49, 47, 1, 0}, /* 50 */ { 3, s_6_50, 47, 1, 0}, /* 51 */ { 5, s_6_51, 50, 1, 0}, /* 52 */ { 5, s_6_52, 50, 1, 0}, /* 53 */ { 5, s_6_53, 50, 1, 0}, /* 54 */ { 4, s_6_54, 47, 1, 0}, /* 55 */ { 4, s_6_55, 47, 1, 0}, /* 56 */ { 4, s_6_56, 47, 1, 0}, /* 57 */ { 4, s_6_57, 47, 1, 0}, /* 58 */ { 2, s_6_58, -1, 1, 0}, /* 59 */ { 5, s_6_59, 58, 1, 0}, /* 60 */ { 5, s_6_60, 58, 1, 0}, /* 61 */ { 5, s_6_61, 58, 1, 0}, /* 62 */ { 4, s_6_62, 58, 1, 0}, /* 63 */ { 4, s_6_63, 58, 1, 0}, /* 64 */ { 4, s_6_64, 58, 1, 0}, /* 65 */ { 5, s_6_65, 58, 1, 0}, /* 66 */ { 5, s_6_66, 58, 1, 0}, /* 67 */ { 5, s_6_67, 58, 1, 0}, /* 68 */ { 5, s_6_68, 58, 1, 0}, /* 69 */ { 5, s_6_69, 58, 1, 0}, /* 70 */ { 5, s_6_70, 58, 1, 0}, /* 71 */ { 2, s_6_71, -1, 1, 0}, /* 72 */ { 3, s_6_72, 71, 1, 0}, /* 73 */ { 3, s_6_73, 71, 1, 0}, /* 74 */ { 5, s_6_74, 73, 1, 0}, /* 75 */ { 5, s_6_75, 73, 1, 0}, /* 76 */ { 5, s_6_76, 73, 1, 0}, /* 77 */ { 6, s_6_77, 73, 1, 0}, /* 78 */ { 6, s_6_78, 73, 1, 0}, /* 79 */ { 6, s_6_79, 73, 1, 0}, /* 80 */ { 7, s_6_80, 73, 1, 0}, /* 81 */ { 7, s_6_81, 73, 1, 0}, /* 82 */ { 7, s_6_82, 73, 1, 0}, /* 83 */ { 6, s_6_83, 73, 1, 0}, /* 84 */ { 5, s_6_84, 73, 1, 0}, /* 85 */ { 7, s_6_85, 84, 1, 0}, /* 86 */ { 7, s_6_86, 84, 1, 0}, /* 87 */ { 7, s_6_87, 84, 1, 0}, /* 88 */ { 4, s_6_88, -1, 1, 0}, /* 89 */ { 4, s_6_89, -1, 1, 0}, /* 90 */ { 4, s_6_90, -1, 1, 0}, /* 91 */ { 7, s_6_91, 90, 1, 0}, /* 92 */ { 7, s_6_92, 90, 1, 0}, /* 93 */ { 7, s_6_93, 90, 1, 0}, /* 94 */ { 7, s_6_94, 90, 1, 0}, /* 95 */ { 6, s_6_95, 90, 1, 0}, /* 96 */ { 8, s_6_96, 95, 1, 0}, /* 97 */ { 8, s_6_97, 95, 1, 0}, /* 98 */ { 8, s_6_98, 95, 1, 0}, /* 99 */ { 4, s_6_99, -1, 1, 0}, /*100 */ { 6, s_6_100, 99, 1, 0}, /*101 */ { 6, s_6_101, 99, 1, 0}, /*102 */ { 6, s_6_102, 99, 1, 0}, /*103 */ { 8, s_6_103, 99, 1, 0}, /*104 */ { 8, s_6_104, 99, 1, 0}, /*105 */ { 8, s_6_105, 99, 1, 0}, /*106 */ { 4, s_6_106, -1, 1, 0}, /*107 */ { 5, s_6_107, -1, 1, 0}, /*108 */ { 5, s_6_108, -1, 1, 0}, /*109 */ { 5, s_6_109, -1, 1, 0}, /*110 */ { 5, s_6_110, -1, 1, 0}, /*111 */ { 5, s_6_111, -1, 1, 0}, /*112 */ { 5, s_6_112, -1, 1, 0}, /*113 */ { 5, s_6_113, -1, 1, 0}, /*114 */ { 2, s_6_114, -1, 1, 0}, /*115 */ { 2, s_6_115, -1, 1, 0}, /*116 */ { 2, s_6_116, -1, 1, 0}, /*117 */ { 4, s_6_117, -1, 1, 0}, /*118 */ { 4, s_6_118, -1, 1, 0}, /*119 */ { 4, s_6_119, -1, 1, 0} }; static symbol s_7_0[1] = { 'a' }; static symbol s_7_1[1] = { 'i' }; static symbol s_7_2[1] = { 'o' }; static symbol s_7_3[2] = { 'o', 's' }; static symbol s_7_4[2] = { 0xC3, 0xA1 }; static symbol s_7_5[2] = { 0xC3, 0xAD }; static symbol s_7_6[2] = { 0xC3, 0xB3 }; static struct among a_7[7] = { /* 0 */ { 1, s_7_0, -1, 1, 0}, /* 1 */ { 1, s_7_1, -1, 1, 0}, /* 2 */ { 1, s_7_2, -1, 1, 0}, /* 3 */ { 2, s_7_3, -1, 1, 0}, /* 4 */ { 2, s_7_4, -1, 1, 0}, /* 5 */ { 2, s_7_5, -1, 1, 0}, /* 6 */ { 2, s_7_6, -1, 1, 0} }; static symbol s_8_0[1] = { 'e' }; static symbol s_8_1[2] = { 0xC3, 0xA7 }; static symbol s_8_2[2] = { 0xC3, 0xA9 }; static symbol s_8_3[2] = { 0xC3, 0xAA }; static struct among a_8[4] = { /* 0 */ { 1, s_8_0, -1, 1, 0}, /* 1 */ { 2, s_8_1, -1, 2, 0}, /* 2 */ { 2, s_8_2, -1, 1, 0}, /* 3 */ { 2, s_8_3, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 12, 2 }; static symbol s_0[] = { 'a', '~' }; static symbol s_1[] = { 'o', '~' }; static symbol s_2[] = { 0xC3, 0xA3 }; static symbol s_3[] = { 0xC3, 0xB5 }; static symbol s_4[] = { 'l', 'o', 'g' }; static symbol s_5[] = { 'u' }; static symbol s_6[] = { 'e', 'n', 't', 'e' }; static symbol s_7[] = { 'a', 't' }; static symbol s_8[] = { 'a', 't' }; static symbol s_9[] = { 'e' }; static symbol s_10[] = { 'i', 'r' }; static symbol s_11[] = { 'u' }; static symbol s_12[] = { 'g' }; static symbol s_13[] = { 'i' }; static symbol s_14[] = { 'c' }; static symbol s_15[] = { 'c' }; static symbol s_16[] = { 'i' }; static symbol s_17[] = { 'c' }; static int r_prelude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 36 */ int c = z->c; z->bra = z->c; /* [, line 37 */ among_var = find_among(z, a_0, 3); /* substring, line 37 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 37 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 2, s_0); /* <-, line 38 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 2, s_1); /* <-, line 39 */ if (ret < 0) return ret; } break; case 3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 40 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 50 */ { int c = z->c; /* or, line 52 */ if (!(in_grouping_U(z, g_v, 97, 250))) goto lab2; { int c = z->c; /* or, line 51 */ if (!(out_grouping_U(z, g_v, 97, 250))) goto lab4; while(1) { /* gopast, line 51 */ if (!(in_grouping_U(z, g_v, 97, 250))) goto lab5; break; lab5: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 51 */ } } goto lab3; lab4: z->c = c; if (!(in_grouping_U(z, g_v, 97, 250))) goto lab2; while(1) { /* gopast, line 51 */ if (!(out_grouping_U(z, g_v, 97, 250))) goto lab6; break; lab6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab2; z->c = c; /* gopast, line 51 */ } } } lab3: goto lab1; lab2: z->c = c; if (!(out_grouping_U(z, g_v, 97, 250))) goto lab0; { int c = z->c; /* or, line 53 */ if (!(out_grouping_U(z, g_v, 97, 250))) goto lab8; while(1) { /* gopast, line 53 */ if (!(in_grouping_U(z, g_v, 97, 250))) goto lab9; break; lab9: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab8; z->c = c; /* gopast, line 53 */ } } goto lab7; lab8: z->c = c; if (!(in_grouping_U(z, g_v, 97, 250))) goto lab0; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 53 */ } } lab7: ; } lab1: z->I[0] = z->c; /* setmark pV, line 54 */ lab0: z->c = c; } { int c = z->c; /* do, line 56 */ while(1) { /* gopast, line 57 */ if (!(in_grouping_U(z, g_v, 97, 250))) goto lab11; break; lab11: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 57 */ } } while(1) { /* gopast, line 57 */ if (!(out_grouping_U(z, g_v, 97, 250))) goto lab12; break; lab12: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 57 */ } } z->I[1] = z->c; /* setmark p1, line 57 */ while(1) { /* gopast, line 58 */ if (!(in_grouping_U(z, g_v, 97, 250))) goto lab13; break; lab13: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 58 */ } } while(1) { /* gopast, line 58 */ if (!(out_grouping_U(z, g_v, 97, 250))) goto lab14; break; lab14: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 58 */ } } z->I[2] = z->c; /* setmark p2, line 58 */ lab10: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 62 */ int c = z->c; z->bra = z->c; /* [, line 63 */ among_var = find_among(z, a_1, 3); /* substring, line 63 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 63 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 2, s_2); /* <-, line 64 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 2, s_3); /* <-, line 65 */ if (ret < 0) return ret; } break; case 3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 66 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 77 */ among_var = find_among_b(z, a_5, 45); /* substring, line 77 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 77 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 93 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 93 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 98 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_4); /* <-, line 98 */ if (ret < 0) return ret; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 102 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_5); /* <-, line 102 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 106 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_6); /* <-, line 106 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 110 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 110 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 111 */ z->ket = z->c; /* [, line 112 */ among_var = find_among_b(z, a_2, 4); /* substring, line 112 */ if (!(among_var)) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 112 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 112 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 112 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab0; } case 1: z->ket = z->c; /* [, line 113 */ if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 113 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 113 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 113 */ if (ret < 0) return ret; } break; } lab0: ; } break; case 6: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 122 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 122 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 123 */ z->ket = z->c; /* [, line 124 */ among_var = find_among_b(z, a_3, 3); /* substring, line 124 */ if (!(among_var)) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 124 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab1; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 127 */ if (ret < 0) return ret; } break; } lab1: ; } break; case 7: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 134 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 134 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 135 */ z->ket = z->c; /* [, line 136 */ among_var = find_among_b(z, a_4, 3); /* substring, line 136 */ if (!(among_var)) { z->c = z->l - m; goto lab2; } z->bra = z->c; /* ], line 136 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab2; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 139 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 139 */ if (ret < 0) return ret; } break; } lab2: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 146 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 146 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 147 */ z->ket = z->c; /* [, line 148 */ if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 148 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 148 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 148 */ if (ret < 0) return ret; } lab3: ; } break; case 9: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 153 */ if (ret < 0) return ret; } if (!(eq_s_b(z, 1, s_9))) return 0; { int ret; ret = slice_from_s(z, 2, s_10); /* <-, line 154 */ if (ret < 0) return ret; } break; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 159 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 159 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 160 */ among_var = find_among_b(z, a_6, 120); /* substring, line 160 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 160 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } static int r_residual_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 184 */ among_var = find_among_b(z, a_7, 7); /* substring, line 184 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 184 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 187 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 187 */ if (ret < 0) return ret; } break; } return 1; } static int r_residual_form(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 192 */ among_var = find_among_b(z, a_8, 4); /* substring, line 192 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 192 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 194 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 194 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 194 */ { int m = z->l - z->c; (void) m; /* or, line 194 */ if (!(eq_s_b(z, 1, s_11))) goto lab1; z->bra = z->c; /* ], line 194 */ { int m_test = z->l - z->c; /* test, line 194 */ if (!(eq_s_b(z, 1, s_12))) goto lab1; z->c = z->l - m_test; } goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 1, s_13))) return 0; z->bra = z->c; /* ], line 195 */ { int m_test = z->l - z->c; /* test, line 195 */ if (!(eq_s_b(z, 1, s_14))) return 0; z->c = z->l - m_test; } } lab0: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 195 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 195 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_15); /* <-, line 196 */ if (ret < 0) return ret; } break; } return 1; } extern int portuguese_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 202 */ { int ret = r_prelude(z); if (ret == 0) goto lab0; /* call prelude, line 202 */ if (ret < 0) return ret; } lab0: z->c = c; } { int c = z->c; /* do, line 203 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab1; /* call mark_regions, line 203 */ if (ret < 0) return ret; } lab1: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 204 */ { int m = z->l - z->c; (void) m; /* do, line 205 */ { int m = z->l - z->c; (void) m; /* or, line 209 */ { int m = z->l - z->c; (void) m; /* and, line 207 */ { int m = z->l - z->c; (void) m; /* or, line 206 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab6; /* call standard_suffix, line 206 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab4; /* call verb_suffix, line 206 */ if (ret < 0) return ret; } } lab5: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 207 */ z->ket = z->c; /* [, line 207 */ if (!(eq_s_b(z, 1, s_16))) goto lab7; z->bra = z->c; /* ], line 207 */ { int m_test = z->l - z->c; /* test, line 207 */ if (!(eq_s_b(z, 1, s_17))) goto lab7; z->c = z->l - m_test; } { int ret = r_RV(z); if (ret == 0) goto lab7; /* call RV, line 207 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 207 */ if (ret < 0) return ret; } lab7: z->c = z->l - m; } } goto lab3; lab4: z->c = z->l - m; { int ret = r_residual_suffix(z); if (ret == 0) goto lab2; /* call residual_suffix, line 209 */ if (ret < 0) return ret; } } lab3: lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 211 */ { int ret = r_residual_form(z); if (ret == 0) goto lab8; /* call residual_form, line 211 */ if (ret < 0) return ret; } lab8: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 213 */ { int ret = r_postlude(z); if (ret == 0) goto lab9; /* call postlude, line 213 */ if (ret < 0) return ret; } lab9: z->c = c; } return 1; } extern struct SN_env * portuguese_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); } extern void portuguese_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_portuguese.h000066400000000000000000000005021154025176300302040ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * portuguese_UTF_8_create_env(void); extern void portuguese_UTF_8_close_env(struct SN_env * z); extern int portuguese_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_russian.c000066400000000000000000000605561154025176300275000ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int russian_UTF_8_stem(struct SN_env * z); static int r_tidy_up(struct SN_env * z); static int r_derivational(struct SN_env * z); static int r_noun(struct SN_env * z); static int r_verb(struct SN_env * z); static int r_reflexive(struct SN_env * z); static int r_adjectival(struct SN_env * z); static int r_adjective(struct SN_env * z); static int r_perfective_gerund(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * russian_UTF_8_create_env(void); extern void russian_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[10] = { 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C }; static symbol s_0_1[12] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C }; static symbol s_0_2[12] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C }; static symbol s_0_3[2] = { 0xD0, 0xB2 }; static symbol s_0_4[4] = { 0xD1, 0x8B, 0xD0, 0xB2 }; static symbol s_0_5[4] = { 0xD0, 0xB8, 0xD0, 0xB2 }; static symbol s_0_6[6] = { 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 }; static symbol s_0_7[8] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 }; static symbol s_0_8[8] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 }; static struct among a_0[9] = { /* 0 */ { 10, s_0_0, -1, 1, 0}, /* 1 */ { 12, s_0_1, 0, 2, 0}, /* 2 */ { 12, s_0_2, 0, 2, 0}, /* 3 */ { 2, s_0_3, -1, 1, 0}, /* 4 */ { 4, s_0_4, 3, 2, 0}, /* 5 */ { 4, s_0_5, 3, 2, 0}, /* 6 */ { 6, s_0_6, -1, 1, 0}, /* 7 */ { 8, s_0_7, 6, 2, 0}, /* 8 */ { 8, s_0_8, 6, 2, 0} }; static symbol s_1_0[6] = { 0xD0, 0xB5, 0xD0, 0xBC, 0xD1, 0x83 }; static symbol s_1_1[6] = { 0xD0, 0xBE, 0xD0, 0xBC, 0xD1, 0x83 }; static symbol s_1_2[4] = { 0xD1, 0x8B, 0xD1, 0x85 }; static symbol s_1_3[4] = { 0xD0, 0xB8, 0xD1, 0x85 }; static symbol s_1_4[4] = { 0xD1, 0x83, 0xD1, 0x8E }; static symbol s_1_5[4] = { 0xD1, 0x8E, 0xD1, 0x8E }; static symbol s_1_6[4] = { 0xD0, 0xB5, 0xD1, 0x8E }; static symbol s_1_7[4] = { 0xD0, 0xBE, 0xD1, 0x8E }; static symbol s_1_8[4] = { 0xD1, 0x8F, 0xD1, 0x8F }; static symbol s_1_9[4] = { 0xD0, 0xB0, 0xD1, 0x8F }; static symbol s_1_10[4] = { 0xD1, 0x8B, 0xD0, 0xB5 }; static symbol s_1_11[4] = { 0xD0, 0xB5, 0xD0, 0xB5 }; static symbol s_1_12[4] = { 0xD0, 0xB8, 0xD0, 0xB5 }; static symbol s_1_13[4] = { 0xD0, 0xBE, 0xD0, 0xB5 }; static symbol s_1_14[6] = { 0xD1, 0x8B, 0xD0, 0xBC, 0xD0, 0xB8 }; static symbol s_1_15[6] = { 0xD0, 0xB8, 0xD0, 0xBC, 0xD0, 0xB8 }; static symbol s_1_16[4] = { 0xD1, 0x8B, 0xD0, 0xB9 }; static symbol s_1_17[4] = { 0xD0, 0xB5, 0xD0, 0xB9 }; static symbol s_1_18[4] = { 0xD0, 0xB8, 0xD0, 0xB9 }; static symbol s_1_19[4] = { 0xD0, 0xBE, 0xD0, 0xB9 }; static symbol s_1_20[4] = { 0xD1, 0x8B, 0xD0, 0xBC }; static symbol s_1_21[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; static symbol s_1_22[4] = { 0xD0, 0xB8, 0xD0, 0xBC }; static symbol s_1_23[4] = { 0xD0, 0xBE, 0xD0, 0xBC }; static symbol s_1_24[6] = { 0xD0, 0xB5, 0xD0, 0xB3, 0xD0, 0xBE }; static symbol s_1_25[6] = { 0xD0, 0xBE, 0xD0, 0xB3, 0xD0, 0xBE }; static struct among a_1[26] = { /* 0 */ { 6, s_1_0, -1, 1, 0}, /* 1 */ { 6, s_1_1, -1, 1, 0}, /* 2 */ { 4, s_1_2, -1, 1, 0}, /* 3 */ { 4, s_1_3, -1, 1, 0}, /* 4 */ { 4, s_1_4, -1, 1, 0}, /* 5 */ { 4, s_1_5, -1, 1, 0}, /* 6 */ { 4, s_1_6, -1, 1, 0}, /* 7 */ { 4, s_1_7, -1, 1, 0}, /* 8 */ { 4, s_1_8, -1, 1, 0}, /* 9 */ { 4, s_1_9, -1, 1, 0}, /* 10 */ { 4, s_1_10, -1, 1, 0}, /* 11 */ { 4, s_1_11, -1, 1, 0}, /* 12 */ { 4, s_1_12, -1, 1, 0}, /* 13 */ { 4, s_1_13, -1, 1, 0}, /* 14 */ { 6, s_1_14, -1, 1, 0}, /* 15 */ { 6, s_1_15, -1, 1, 0}, /* 16 */ { 4, s_1_16, -1, 1, 0}, /* 17 */ { 4, s_1_17, -1, 1, 0}, /* 18 */ { 4, s_1_18, -1, 1, 0}, /* 19 */ { 4, s_1_19, -1, 1, 0}, /* 20 */ { 4, s_1_20, -1, 1, 0}, /* 21 */ { 4, s_1_21, -1, 1, 0}, /* 22 */ { 4, s_1_22, -1, 1, 0}, /* 23 */ { 4, s_1_23, -1, 1, 0}, /* 24 */ { 6, s_1_24, -1, 1, 0}, /* 25 */ { 6, s_1_25, -1, 1, 0} }; static symbol s_2_0[4] = { 0xD0, 0xB2, 0xD1, 0x88 }; static symbol s_2_1[6] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88 }; static symbol s_2_2[6] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88 }; static symbol s_2_3[2] = { 0xD1, 0x89 }; static symbol s_2_4[4] = { 0xD1, 0x8E, 0xD1, 0x89 }; static symbol s_2_5[6] = { 0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x89 }; static symbol s_2_6[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; static symbol s_2_7[4] = { 0xD0, 0xBD, 0xD0, 0xBD }; static struct among a_2[8] = { /* 0 */ { 4, s_2_0, -1, 1, 0}, /* 1 */ { 6, s_2_1, 0, 2, 0}, /* 2 */ { 6, s_2_2, 0, 2, 0}, /* 3 */ { 2, s_2_3, -1, 1, 0}, /* 4 */ { 4, s_2_4, 3, 1, 0}, /* 5 */ { 6, s_2_5, 4, 2, 0}, /* 6 */ { 4, s_2_6, -1, 1, 0}, /* 7 */ { 4, s_2_7, -1, 1, 0} }; static symbol s_3_0[4] = { 0xD1, 0x81, 0xD1, 0x8C }; static symbol s_3_1[4] = { 0xD1, 0x81, 0xD1, 0x8F }; static struct among a_3[2] = { /* 0 */ { 4, s_3_0, -1, 1, 0}, /* 1 */ { 4, s_3_1, -1, 1, 0} }; static symbol s_4_0[4] = { 0xD1, 0x8B, 0xD1, 0x82 }; static symbol s_4_1[4] = { 0xD1, 0x8E, 0xD1, 0x82 }; static symbol s_4_2[6] = { 0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x82 }; static symbol s_4_3[4] = { 0xD1, 0x8F, 0xD1, 0x82 }; static symbol s_4_4[4] = { 0xD0, 0xB5, 0xD1, 0x82 }; static symbol s_4_5[6] = { 0xD1, 0x83, 0xD0, 0xB5, 0xD1, 0x82 }; static symbol s_4_6[4] = { 0xD0, 0xB8, 0xD1, 0x82 }; static symbol s_4_7[4] = { 0xD0, 0xBD, 0xD1, 0x8B }; static symbol s_4_8[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD1, 0x8B }; static symbol s_4_9[4] = { 0xD1, 0x82, 0xD1, 0x8C }; static symbol s_4_10[6] = { 0xD1, 0x8B, 0xD1, 0x82, 0xD1, 0x8C }; static symbol s_4_11[6] = { 0xD0, 0xB8, 0xD1, 0x82, 0xD1, 0x8C }; static symbol s_4_12[6] = { 0xD0, 0xB5, 0xD1, 0x88, 0xD1, 0x8C }; static symbol s_4_13[6] = { 0xD0, 0xB8, 0xD1, 0x88, 0xD1, 0x8C }; static symbol s_4_14[2] = { 0xD1, 0x8E }; static symbol s_4_15[4] = { 0xD1, 0x83, 0xD1, 0x8E }; static symbol s_4_16[4] = { 0xD0, 0xBB, 0xD0, 0xB0 }; static symbol s_4_17[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB0 }; static symbol s_4_18[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB0 }; static symbol s_4_19[4] = { 0xD0, 0xBD, 0xD0, 0xB0 }; static symbol s_4_20[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB0 }; static symbol s_4_21[6] = { 0xD0, 0xB5, 0xD1, 0x82, 0xD0, 0xB5 }; static symbol s_4_22[6] = { 0xD0, 0xB8, 0xD1, 0x82, 0xD0, 0xB5 }; static symbol s_4_23[6] = { 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 }; static symbol s_4_24[8] = { 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 }; static symbol s_4_25[8] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 }; static symbol s_4_26[4] = { 0xD0, 0xBB, 0xD0, 0xB8 }; static symbol s_4_27[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB8 }; static symbol s_4_28[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB8 }; static symbol s_4_29[2] = { 0xD0, 0xB9 }; static symbol s_4_30[4] = { 0xD1, 0x83, 0xD0, 0xB9 }; static symbol s_4_31[4] = { 0xD0, 0xB5, 0xD0, 0xB9 }; static symbol s_4_32[2] = { 0xD0, 0xBB }; static symbol s_4_33[4] = { 0xD1, 0x8B, 0xD0, 0xBB }; static symbol s_4_34[4] = { 0xD0, 0xB8, 0xD0, 0xBB }; static symbol s_4_35[4] = { 0xD1, 0x8B, 0xD0, 0xBC }; static symbol s_4_36[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; static symbol s_4_37[4] = { 0xD0, 0xB8, 0xD0, 0xBC }; static symbol s_4_38[2] = { 0xD0, 0xBD }; static symbol s_4_39[4] = { 0xD0, 0xB5, 0xD0, 0xBD }; static symbol s_4_40[4] = { 0xD0, 0xBB, 0xD0, 0xBE }; static symbol s_4_41[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xBE }; static symbol s_4_42[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xBE }; static symbol s_4_43[4] = { 0xD0, 0xBD, 0xD0, 0xBE }; static symbol s_4_44[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xBE }; static symbol s_4_45[6] = { 0xD0, 0xBD, 0xD0, 0xBD, 0xD0, 0xBE }; static struct among a_4[46] = { /* 0 */ { 4, s_4_0, -1, 2, 0}, /* 1 */ { 4, s_4_1, -1, 1, 0}, /* 2 */ { 6, s_4_2, 1, 2, 0}, /* 3 */ { 4, s_4_3, -1, 2, 0}, /* 4 */ { 4, s_4_4, -1, 1, 0}, /* 5 */ { 6, s_4_5, 4, 2, 0}, /* 6 */ { 4, s_4_6, -1, 2, 0}, /* 7 */ { 4, s_4_7, -1, 1, 0}, /* 8 */ { 6, s_4_8, 7, 2, 0}, /* 9 */ { 4, s_4_9, -1, 1, 0}, /* 10 */ { 6, s_4_10, 9, 2, 0}, /* 11 */ { 6, s_4_11, 9, 2, 0}, /* 12 */ { 6, s_4_12, -1, 1, 0}, /* 13 */ { 6, s_4_13, -1, 2, 0}, /* 14 */ { 2, s_4_14, -1, 2, 0}, /* 15 */ { 4, s_4_15, 14, 2, 0}, /* 16 */ { 4, s_4_16, -1, 1, 0}, /* 17 */ { 6, s_4_17, 16, 2, 0}, /* 18 */ { 6, s_4_18, 16, 2, 0}, /* 19 */ { 4, s_4_19, -1, 1, 0}, /* 20 */ { 6, s_4_20, 19, 2, 0}, /* 21 */ { 6, s_4_21, -1, 1, 0}, /* 22 */ { 6, s_4_22, -1, 2, 0}, /* 23 */ { 6, s_4_23, -1, 1, 0}, /* 24 */ { 8, s_4_24, 23, 2, 0}, /* 25 */ { 8, s_4_25, 23, 2, 0}, /* 26 */ { 4, s_4_26, -1, 1, 0}, /* 27 */ { 6, s_4_27, 26, 2, 0}, /* 28 */ { 6, s_4_28, 26, 2, 0}, /* 29 */ { 2, s_4_29, -1, 1, 0}, /* 30 */ { 4, s_4_30, 29, 2, 0}, /* 31 */ { 4, s_4_31, 29, 2, 0}, /* 32 */ { 2, s_4_32, -1, 1, 0}, /* 33 */ { 4, s_4_33, 32, 2, 0}, /* 34 */ { 4, s_4_34, 32, 2, 0}, /* 35 */ { 4, s_4_35, -1, 2, 0}, /* 36 */ { 4, s_4_36, -1, 1, 0}, /* 37 */ { 4, s_4_37, -1, 2, 0}, /* 38 */ { 2, s_4_38, -1, 1, 0}, /* 39 */ { 4, s_4_39, 38, 2, 0}, /* 40 */ { 4, s_4_40, -1, 1, 0}, /* 41 */ { 6, s_4_41, 40, 2, 0}, /* 42 */ { 6, s_4_42, 40, 2, 0}, /* 43 */ { 4, s_4_43, -1, 1, 0}, /* 44 */ { 6, s_4_44, 43, 2, 0}, /* 45 */ { 6, s_4_45, 43, 1, 0} }; static symbol s_5_0[2] = { 0xD1, 0x83 }; static symbol s_5_1[4] = { 0xD1, 0x8F, 0xD1, 0x85 }; static symbol s_5_2[6] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD1, 0x85 }; static symbol s_5_3[4] = { 0xD0, 0xB0, 0xD1, 0x85 }; static symbol s_5_4[2] = { 0xD1, 0x8B }; static symbol s_5_5[2] = { 0xD1, 0x8C }; static symbol s_5_6[2] = { 0xD1, 0x8E }; static symbol s_5_7[4] = { 0xD1, 0x8C, 0xD1, 0x8E }; static symbol s_5_8[4] = { 0xD0, 0xB8, 0xD1, 0x8E }; static symbol s_5_9[2] = { 0xD1, 0x8F }; static symbol s_5_10[4] = { 0xD1, 0x8C, 0xD1, 0x8F }; static symbol s_5_11[4] = { 0xD0, 0xB8, 0xD1, 0x8F }; static symbol s_5_12[2] = { 0xD0, 0xB0 }; static symbol s_5_13[4] = { 0xD0, 0xB5, 0xD0, 0xB2 }; static symbol s_5_14[4] = { 0xD0, 0xBE, 0xD0, 0xB2 }; static symbol s_5_15[2] = { 0xD0, 0xB5 }; static symbol s_5_16[4] = { 0xD1, 0x8C, 0xD0, 0xB5 }; static symbol s_5_17[4] = { 0xD0, 0xB8, 0xD0, 0xB5 }; static symbol s_5_18[2] = { 0xD0, 0xB8 }; static symbol s_5_19[4] = { 0xD0, 0xB5, 0xD0, 0xB8 }; static symbol s_5_20[4] = { 0xD0, 0xB8, 0xD0, 0xB8 }; static symbol s_5_21[6] = { 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8 }; static symbol s_5_22[8] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8 }; static symbol s_5_23[6] = { 0xD0, 0xB0, 0xD0, 0xBC, 0xD0, 0xB8 }; static symbol s_5_24[2] = { 0xD0, 0xB9 }; static symbol s_5_25[4] = { 0xD0, 0xB5, 0xD0, 0xB9 }; static symbol s_5_26[6] = { 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xB9 }; static symbol s_5_27[4] = { 0xD0, 0xB8, 0xD0, 0xB9 }; static symbol s_5_28[4] = { 0xD0, 0xBE, 0xD0, 0xB9 }; static symbol s_5_29[4] = { 0xD1, 0x8F, 0xD0, 0xBC }; static symbol s_5_30[6] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC }; static symbol s_5_31[4] = { 0xD0, 0xB0, 0xD0, 0xBC }; static symbol s_5_32[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; static symbol s_5_33[6] = { 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xBC }; static symbol s_5_34[4] = { 0xD0, 0xBE, 0xD0, 0xBC }; static symbol s_5_35[2] = { 0xD0, 0xBE }; static struct among a_5[36] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 6, s_5_2, 1, 1, 0}, /* 3 */ { 4, s_5_3, -1, 1, 0}, /* 4 */ { 2, s_5_4, -1, 1, 0}, /* 5 */ { 2, s_5_5, -1, 1, 0}, /* 6 */ { 2, s_5_6, -1, 1, 0}, /* 7 */ { 4, s_5_7, 6, 1, 0}, /* 8 */ { 4, s_5_8, 6, 1, 0}, /* 9 */ { 2, s_5_9, -1, 1, 0}, /* 10 */ { 4, s_5_10, 9, 1, 0}, /* 11 */ { 4, s_5_11, 9, 1, 0}, /* 12 */ { 2, s_5_12, -1, 1, 0}, /* 13 */ { 4, s_5_13, -1, 1, 0}, /* 14 */ { 4, s_5_14, -1, 1, 0}, /* 15 */ { 2, s_5_15, -1, 1, 0}, /* 16 */ { 4, s_5_16, 15, 1, 0}, /* 17 */ { 4, s_5_17, 15, 1, 0}, /* 18 */ { 2, s_5_18, -1, 1, 0}, /* 19 */ { 4, s_5_19, 18, 1, 0}, /* 20 */ { 4, s_5_20, 18, 1, 0}, /* 21 */ { 6, s_5_21, 18, 1, 0}, /* 22 */ { 8, s_5_22, 21, 1, 0}, /* 23 */ { 6, s_5_23, 18, 1, 0}, /* 24 */ { 2, s_5_24, -1, 1, 0}, /* 25 */ { 4, s_5_25, 24, 1, 0}, /* 26 */ { 6, s_5_26, 25, 1, 0}, /* 27 */ { 4, s_5_27, 24, 1, 0}, /* 28 */ { 4, s_5_28, 24, 1, 0}, /* 29 */ { 4, s_5_29, -1, 1, 0}, /* 30 */ { 6, s_5_30, 29, 1, 0}, /* 31 */ { 4, s_5_31, -1, 1, 0}, /* 32 */ { 4, s_5_32, -1, 1, 0}, /* 33 */ { 6, s_5_33, 32, 1, 0}, /* 34 */ { 4, s_5_34, -1, 1, 0}, /* 35 */ { 2, s_5_35, -1, 1, 0} }; static symbol s_6_0[6] = { 0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82 }; static symbol s_6_1[8] = { 0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8C }; static struct among a_6[2] = { /* 0 */ { 6, s_6_0, -1, 1, 0}, /* 1 */ { 8, s_6_1, -1, 1, 0} }; static symbol s_7_0[6] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88 }; static symbol s_7_1[2] = { 0xD1, 0x8C }; static symbol s_7_2[8] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88, 0xD0, 0xB5 }; static symbol s_7_3[2] = { 0xD0, 0xBD }; static struct among a_7[4] = { /* 0 */ { 6, s_7_0, -1, 1, 0}, /* 1 */ { 2, s_7_1, -1, 3, 0}, /* 2 */ { 8, s_7_2, -1, 1, 0}, /* 3 */ { 2, s_7_3, -1, 2, 0} }; static unsigned char g_v[] = { 33, 65, 8, 232 }; static symbol s_0[] = { 0xD0, 0xB0 }; static symbol s_1[] = { 0xD1, 0x8F }; static symbol s_2[] = { 0xD0, 0xB0 }; static symbol s_3[] = { 0xD1, 0x8F }; static symbol s_4[] = { 0xD0, 0xB0 }; static symbol s_5[] = { 0xD1, 0x8F }; static symbol s_6[] = { 0xD0, 0xBD }; static symbol s_7[] = { 0xD0, 0xBD }; static symbol s_8[] = { 0xD0, 0xBD }; static symbol s_9[] = { 0xD0, 0xB8 }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; { int c = z->c; /* do, line 61 */ while(1) { /* gopast, line 62 */ if (!(in_grouping_U(z, g_v, 1072, 1103))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 62 */ } } z->I[0] = z->c; /* setmark pV, line 62 */ while(1) { /* gopast, line 62 */ if (!(out_grouping_U(z, g_v, 1072, 1103))) goto lab2; break; lab2: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 62 */ } } while(1) { /* gopast, line 63 */ if (!(in_grouping_U(z, g_v, 1072, 1103))) goto lab3; break; lab3: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 63 */ } } while(1) { /* gopast, line 63 */ if (!(out_grouping_U(z, g_v, 1072, 1103))) goto lab4; break; lab4: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* gopast, line 63 */ } } z->I[1] = z->c; /* setmark p2, line 63 */ lab0: z->c = c; } return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_perfective_gerund(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 72 */ among_var = find_among_b(z, a_0, 9); /* substring, line 72 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 72 */ switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* or, line 76 */ if (!(eq_s_b(z, 2, s_0))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 2, s_1))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 76 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 83 */ if (ret < 0) return ret; } break; } return 1; } static int r_adjective(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 88 */ among_var = find_among_b(z, a_1, 26); /* substring, line 88 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 88 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 97 */ if (ret < 0) return ret; } break; } return 1; } static int r_adjectival(struct SN_env * z) { int among_var; { int ret = r_adjective(z); if (ret == 0) return 0; /* call adjective, line 102 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 109 */ z->ket = z->c; /* [, line 110 */ among_var = find_among_b(z, a_2, 8); /* substring, line 110 */ if (!(among_var)) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 110 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab0; } case 1: { int m = z->l - z->c; (void) m; /* or, line 115 */ if (!(eq_s_b(z, 2, s_2))) goto lab2; goto lab1; lab2: z->c = z->l - m; if (!(eq_s_b(z, 2, s_3))) { z->c = z->l - m; goto lab0; } } lab1: { int ret; ret = slice_del(z); /* delete, line 115 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 122 */ if (ret < 0) return ret; } break; } lab0: ; } return 1; } static int r_reflexive(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 129 */ among_var = find_among_b(z, a_3, 2); /* substring, line 129 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 129 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 132 */ if (ret < 0) return ret; } break; } return 1; } static int r_verb(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 137 */ among_var = find_among_b(z, a_4, 46); /* substring, line 137 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 137 */ switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* or, line 143 */ if (!(eq_s_b(z, 2, s_4))) goto lab1; goto lab0; lab1: z->c = z->l - m; if (!(eq_s_b(z, 2, s_5))) return 0; } lab0: { int ret; ret = slice_del(z); /* delete, line 143 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 151 */ if (ret < 0) return ret; } break; } return 1; } static int r_noun(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 160 */ among_var = find_among_b(z, a_5, 36); /* substring, line 160 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 160 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 167 */ if (ret < 0) return ret; } break; } return 1; } static int r_derivational(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 176 */ among_var = find_among_b(z, a_6, 2); /* substring, line 176 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 176 */ { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 176 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } break; } return 1; } static int r_tidy_up(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 184 */ among_var = find_among_b(z, a_7, 4); /* substring, line 184 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 184 */ switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 188 */ if (ret < 0) return ret; } z->ket = z->c; /* [, line 189 */ if (!(eq_s_b(z, 2, s_6))) return 0; z->bra = z->c; /* ], line 189 */ if (!(eq_s_b(z, 2, s_7))) return 0; { int ret; ret = slice_del(z); /* delete, line 189 */ if (ret < 0) return ret; } break; case 2: if (!(eq_s_b(z, 2, s_8))) return 0; { int ret; ret = slice_del(z); /* delete, line 192 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_del(z); /* delete, line 194 */ if (ret < 0) return ret; } break; } return 1; } extern int russian_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 201 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 201 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 202 */ { int m3; /* setlimit, line 202 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 202 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* do, line 203 */ { int m = z->l - z->c; (void) m; /* or, line 204 */ { int ret = r_perfective_gerund(z); if (ret == 0) goto lab3; /* call perfective_gerund, line 204 */ if (ret < 0) return ret; } goto lab2; lab3: z->c = z->l - m; { int m = z->l - z->c; (void) m; /* try, line 205 */ { int ret = r_reflexive(z); if (ret == 0) { z->c = z->l - m; goto lab4; } /* call reflexive, line 205 */ if (ret < 0) return ret; } lab4: ; } { int m = z->l - z->c; (void) m; /* or, line 206 */ { int ret = r_adjectival(z); if (ret == 0) goto lab6; /* call adjectival, line 206 */ if (ret < 0) return ret; } goto lab5; lab6: z->c = z->l - m; { int ret = r_verb(z); if (ret == 0) goto lab7; /* call verb, line 206 */ if (ret < 0) return ret; } goto lab5; lab7: z->c = z->l - m; { int ret = r_noun(z); if (ret == 0) goto lab1; /* call noun, line 206 */ if (ret < 0) return ret; } } lab5: ; } lab2: lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* try, line 209 */ z->ket = z->c; /* [, line 209 */ if (!(eq_s_b(z, 2, s_9))) { z->c = z->l - m; goto lab8; } z->bra = z->c; /* ], line 209 */ { int ret; ret = slice_del(z); /* delete, line 209 */ if (ret < 0) return ret; } lab8: ; } { int m = z->l - z->c; (void) m; /* do, line 212 */ { int ret = r_derivational(z); if (ret == 0) goto lab9; /* call derivational, line 212 */ if (ret < 0) return ret; } lab9: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 213 */ { int ret = r_tidy_up(z); if (ret == 0) goto lab10; /* call tidy_up, line 213 */ if (ret < 0) return ret; } lab10: z->c = z->l - m; } z->lb = m3; } z->c = z->lb; return 1; } extern struct SN_env * russian_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); } extern void russian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_russian.h000066400000000000000000000004711154025176300274730ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * russian_UTF_8_create_env(void); extern void russian_UTF_8_close_env(struct SN_env * z); extern int russian_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_spanish.c000066400000000000000000001174311154025176300274540ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int spanish_UTF_8_stem(struct SN_env * z); static int r_residual_suffix(struct SN_env * z); static int r_verb_suffix(struct SN_env * z); static int r_y_verb_suffix(struct SN_env * z); static int r_standard_suffix(struct SN_env * z); static int r_attached_pronoun(struct SN_env * z); static int r_R2(struct SN_env * z); static int r_R1(struct SN_env * z); static int r_RV(struct SN_env * z); static int r_mark_regions(struct SN_env * z); static int r_postlude(struct SN_env * z); extern struct SN_env * spanish_UTF_8_create_env(void); extern void spanish_UTF_8_close_env(struct SN_env * z); static symbol s_0_1[2] = { 0xC3, 0xA1 }; static symbol s_0_2[2] = { 0xC3, 0xA9 }; static symbol s_0_3[2] = { 0xC3, 0xAD }; static symbol s_0_4[2] = { 0xC3, 0xB3 }; static symbol s_0_5[2] = { 0xC3, 0xBA }; static struct among a_0[6] = { /* 0 */ { 0, 0, -1, 6, 0}, /* 1 */ { 2, s_0_1, 0, 1, 0}, /* 2 */ { 2, s_0_2, 0, 2, 0}, /* 3 */ { 2, s_0_3, 0, 3, 0}, /* 4 */ { 2, s_0_4, 0, 4, 0}, /* 5 */ { 2, s_0_5, 0, 5, 0} }; static symbol s_1_0[2] = { 'l', 'a' }; static symbol s_1_1[4] = { 's', 'e', 'l', 'a' }; static symbol s_1_2[2] = { 'l', 'e' }; static symbol s_1_3[2] = { 'm', 'e' }; static symbol s_1_4[2] = { 's', 'e' }; static symbol s_1_5[2] = { 'l', 'o' }; static symbol s_1_6[4] = { 's', 'e', 'l', 'o' }; static symbol s_1_7[3] = { 'l', 'a', 's' }; static symbol s_1_8[5] = { 's', 'e', 'l', 'a', 's' }; static symbol s_1_9[3] = { 'l', 'e', 's' }; static symbol s_1_10[3] = { 'l', 'o', 's' }; static symbol s_1_11[5] = { 's', 'e', 'l', 'o', 's' }; static symbol s_1_12[3] = { 'n', 'o', 's' }; static struct among a_1[13] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 4, s_1_1, 0, -1, 0}, /* 2 */ { 2, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0}, /* 4 */ { 2, s_1_4, -1, -1, 0}, /* 5 */ { 2, s_1_5, -1, -1, 0}, /* 6 */ { 4, s_1_6, 5, -1, 0}, /* 7 */ { 3, s_1_7, -1, -1, 0}, /* 8 */ { 5, s_1_8, 7, -1, 0}, /* 9 */ { 3, s_1_9, -1, -1, 0}, /* 10 */ { 3, s_1_10, -1, -1, 0}, /* 11 */ { 5, s_1_11, 10, -1, 0}, /* 12 */ { 3, s_1_12, -1, -1, 0} }; static symbol s_2_0[4] = { 'a', 'n', 'd', 'o' }; static symbol s_2_1[5] = { 'i', 'e', 'n', 'd', 'o' }; static symbol s_2_2[5] = { 'y', 'e', 'n', 'd', 'o' }; static symbol s_2_3[5] = { 0xC3, 0xA1, 'n', 'd', 'o' }; static symbol s_2_4[6] = { 'i', 0xC3, 0xA9, 'n', 'd', 'o' }; static symbol s_2_5[2] = { 'a', 'r' }; static symbol s_2_6[2] = { 'e', 'r' }; static symbol s_2_7[2] = { 'i', 'r' }; static symbol s_2_8[3] = { 0xC3, 0xA1, 'r' }; static symbol s_2_9[3] = { 0xC3, 0xA9, 'r' }; static symbol s_2_10[3] = { 0xC3, 0xAD, 'r' }; static struct among a_2[11] = { /* 0 */ { 4, s_2_0, -1, 6, 0}, /* 1 */ { 5, s_2_1, -1, 6, 0}, /* 2 */ { 5, s_2_2, -1, 7, 0}, /* 3 */ { 5, s_2_3, -1, 2, 0}, /* 4 */ { 6, s_2_4, -1, 1, 0}, /* 5 */ { 2, s_2_5, -1, 6, 0}, /* 6 */ { 2, s_2_6, -1, 6, 0}, /* 7 */ { 2, s_2_7, -1, 6, 0}, /* 8 */ { 3, s_2_8, -1, 3, 0}, /* 9 */ { 3, s_2_9, -1, 4, 0}, /* 10 */ { 3, s_2_10, -1, 5, 0} }; static symbol s_3_0[2] = { 'i', 'c' }; static symbol s_3_1[2] = { 'a', 'd' }; static symbol s_3_2[2] = { 'o', 's' }; static symbol s_3_3[2] = { 'i', 'v' }; static struct among a_3[4] = { /* 0 */ { 2, s_3_0, -1, -1, 0}, /* 1 */ { 2, s_3_1, -1, -1, 0}, /* 2 */ { 2, s_3_2, -1, -1, 0}, /* 3 */ { 2, s_3_3, -1, 1, 0} }; static symbol s_4_0[4] = { 'a', 'b', 'l', 'e' }; static symbol s_4_1[4] = { 'i', 'b', 'l', 'e' }; static symbol s_4_2[4] = { 'a', 'n', 't', 'e' }; static struct among a_4[3] = { /* 0 */ { 4, s_4_0, -1, 1, 0}, /* 1 */ { 4, s_4_1, -1, 1, 0}, /* 2 */ { 4, s_4_2, -1, 1, 0} }; static symbol s_5_0[2] = { 'i', 'c' }; static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' }; static symbol s_5_2[2] = { 'i', 'v' }; static struct among a_5[3] = { /* 0 */ { 2, s_5_0, -1, 1, 0}, /* 1 */ { 4, s_5_1, -1, 1, 0}, /* 2 */ { 2, s_5_2, -1, 1, 0} }; static symbol s_6_0[3] = { 'i', 'c', 'a' }; static symbol s_6_1[5] = { 'a', 'n', 'c', 'i', 'a' }; static symbol s_6_2[5] = { 'e', 'n', 'c', 'i', 'a' }; static symbol s_6_3[5] = { 'a', 'd', 'o', 'r', 'a' }; static symbol s_6_4[3] = { 'o', 's', 'a' }; static symbol s_6_5[4] = { 'i', 's', 't', 'a' }; static symbol s_6_6[3] = { 'i', 'v', 'a' }; static symbol s_6_7[4] = { 'a', 'n', 'z', 'a' }; static symbol s_6_8[6] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a' }; static symbol s_6_9[4] = { 'i', 'd', 'a', 'd' }; static symbol s_6_10[4] = { 'a', 'b', 'l', 'e' }; static symbol s_6_11[4] = { 'i', 'b', 'l', 'e' }; static symbol s_6_12[4] = { 'a', 'n', 't', 'e' }; static symbol s_6_13[5] = { 'm', 'e', 'n', 't', 'e' }; static symbol s_6_14[6] = { 'a', 'm', 'e', 'n', 't', 'e' }; static symbol s_6_15[6] = { 'a', 'c', 'i', 0xC3, 0xB3, 'n' }; static symbol s_6_16[6] = { 'u', 'c', 'i', 0xC3, 0xB3, 'n' }; static symbol s_6_17[3] = { 'i', 'c', 'o' }; static symbol s_6_18[4] = { 'i', 's', 'm', 'o' }; static symbol s_6_19[3] = { 'o', 's', 'o' }; static symbol s_6_20[7] = { 'a', 'm', 'i', 'e', 'n', 't', 'o' }; static symbol s_6_21[7] = { 'i', 'm', 'i', 'e', 'n', 't', 'o' }; static symbol s_6_22[3] = { 'i', 'v', 'o' }; static symbol s_6_23[4] = { 'a', 'd', 'o', 'r' }; static symbol s_6_24[4] = { 'i', 'c', 'a', 's' }; static symbol s_6_25[6] = { 'a', 'n', 'c', 'i', 'a', 's' }; static symbol s_6_26[6] = { 'e', 'n', 'c', 'i', 'a', 's' }; static symbol s_6_27[6] = { 'a', 'd', 'o', 'r', 'a', 's' }; static symbol s_6_28[4] = { 'o', 's', 'a', 's' }; static symbol s_6_29[5] = { 'i', 's', 't', 'a', 's' }; static symbol s_6_30[4] = { 'i', 'v', 'a', 's' }; static symbol s_6_31[5] = { 'a', 'n', 'z', 'a', 's' }; static symbol s_6_32[7] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a', 's' }; static symbol s_6_33[6] = { 'i', 'd', 'a', 'd', 'e', 's' }; static symbol s_6_34[5] = { 'a', 'b', 'l', 'e', 's' }; static symbol s_6_35[5] = { 'i', 'b', 'l', 'e', 's' }; static symbol s_6_36[7] = { 'a', 'c', 'i', 'o', 'n', 'e', 's' }; static symbol s_6_37[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' }; static symbol s_6_38[6] = { 'a', 'd', 'o', 'r', 'e', 's' }; static symbol s_6_39[5] = { 'a', 'n', 't', 'e', 's' }; static symbol s_6_40[4] = { 'i', 'c', 'o', 's' }; static symbol s_6_41[5] = { 'i', 's', 'm', 'o', 's' }; static symbol s_6_42[4] = { 'o', 's', 'o', 's' }; static symbol s_6_43[8] = { 'a', 'm', 'i', 'e', 'n', 't', 'o', 's' }; static symbol s_6_44[8] = { 'i', 'm', 'i', 'e', 'n', 't', 'o', 's' }; static symbol s_6_45[4] = { 'i', 'v', 'o', 's' }; static struct among a_6[46] = { /* 0 */ { 3, s_6_0, -1, 1, 0}, /* 1 */ { 5, s_6_1, -1, 2, 0}, /* 2 */ { 5, s_6_2, -1, 5, 0}, /* 3 */ { 5, s_6_3, -1, 2, 0}, /* 4 */ { 3, s_6_4, -1, 1, 0}, /* 5 */ { 4, s_6_5, -1, 1, 0}, /* 6 */ { 3, s_6_6, -1, 9, 0}, /* 7 */ { 4, s_6_7, -1, 1, 0}, /* 8 */ { 6, s_6_8, -1, 3, 0}, /* 9 */ { 4, s_6_9, -1, 8, 0}, /* 10 */ { 4, s_6_10, -1, 1, 0}, /* 11 */ { 4, s_6_11, -1, 1, 0}, /* 12 */ { 4, s_6_12, -1, 2, 0}, /* 13 */ { 5, s_6_13, -1, 7, 0}, /* 14 */ { 6, s_6_14, 13, 6, 0}, /* 15 */ { 6, s_6_15, -1, 2, 0}, /* 16 */ { 6, s_6_16, -1, 4, 0}, /* 17 */ { 3, s_6_17, -1, 1, 0}, /* 18 */ { 4, s_6_18, -1, 1, 0}, /* 19 */ { 3, s_6_19, -1, 1, 0}, /* 20 */ { 7, s_6_20, -1, 1, 0}, /* 21 */ { 7, s_6_21, -1, 1, 0}, /* 22 */ { 3, s_6_22, -1, 9, 0}, /* 23 */ { 4, s_6_23, -1, 2, 0}, /* 24 */ { 4, s_6_24, -1, 1, 0}, /* 25 */ { 6, s_6_25, -1, 2, 0}, /* 26 */ { 6, s_6_26, -1, 5, 0}, /* 27 */ { 6, s_6_27, -1, 2, 0}, /* 28 */ { 4, s_6_28, -1, 1, 0}, /* 29 */ { 5, s_6_29, -1, 1, 0}, /* 30 */ { 4, s_6_30, -1, 9, 0}, /* 31 */ { 5, s_6_31, -1, 1, 0}, /* 32 */ { 7, s_6_32, -1, 3, 0}, /* 33 */ { 6, s_6_33, -1, 8, 0}, /* 34 */ { 5, s_6_34, -1, 1, 0}, /* 35 */ { 5, s_6_35, -1, 1, 0}, /* 36 */ { 7, s_6_36, -1, 2, 0}, /* 37 */ { 7, s_6_37, -1, 4, 0}, /* 38 */ { 6, s_6_38, -1, 2, 0}, /* 39 */ { 5, s_6_39, -1, 2, 0}, /* 40 */ { 4, s_6_40, -1, 1, 0}, /* 41 */ { 5, s_6_41, -1, 1, 0}, /* 42 */ { 4, s_6_42, -1, 1, 0}, /* 43 */ { 8, s_6_43, -1, 1, 0}, /* 44 */ { 8, s_6_44, -1, 1, 0}, /* 45 */ { 4, s_6_45, -1, 9, 0} }; static symbol s_7_0[2] = { 'y', 'a' }; static symbol s_7_1[2] = { 'y', 'e' }; static symbol s_7_2[3] = { 'y', 'a', 'n' }; static symbol s_7_3[3] = { 'y', 'e', 'n' }; static symbol s_7_4[5] = { 'y', 'e', 'r', 'o', 'n' }; static symbol s_7_5[5] = { 'y', 'e', 'n', 'd', 'o' }; static symbol s_7_6[2] = { 'y', 'o' }; static symbol s_7_7[3] = { 'y', 'a', 's' }; static symbol s_7_8[3] = { 'y', 'e', 's' }; static symbol s_7_9[4] = { 'y', 'a', 'i', 's' }; static symbol s_7_10[5] = { 'y', 'a', 'm', 'o', 's' }; static symbol s_7_11[3] = { 'y', 0xC3, 0xB3 }; static struct among a_7[12] = { /* 0 */ { 2, s_7_0, -1, 1, 0}, /* 1 */ { 2, s_7_1, -1, 1, 0}, /* 2 */ { 3, s_7_2, -1, 1, 0}, /* 3 */ { 3, s_7_3, -1, 1, 0}, /* 4 */ { 5, s_7_4, -1, 1, 0}, /* 5 */ { 5, s_7_5, -1, 1, 0}, /* 6 */ { 2, s_7_6, -1, 1, 0}, /* 7 */ { 3, s_7_7, -1, 1, 0}, /* 8 */ { 3, s_7_8, -1, 1, 0}, /* 9 */ { 4, s_7_9, -1, 1, 0}, /* 10 */ { 5, s_7_10, -1, 1, 0}, /* 11 */ { 3, s_7_11, -1, 1, 0} }; static symbol s_8_0[3] = { 'a', 'b', 'a' }; static symbol s_8_1[3] = { 'a', 'd', 'a' }; static symbol s_8_2[3] = { 'i', 'd', 'a' }; static symbol s_8_3[3] = { 'a', 'r', 'a' }; static symbol s_8_4[4] = { 'i', 'e', 'r', 'a' }; static symbol s_8_5[3] = { 0xC3, 0xAD, 'a' }; static symbol s_8_6[5] = { 'a', 'r', 0xC3, 0xAD, 'a' }; static symbol s_8_7[5] = { 'e', 'r', 0xC3, 0xAD, 'a' }; static symbol s_8_8[5] = { 'i', 'r', 0xC3, 0xAD, 'a' }; static symbol s_8_9[2] = { 'a', 'd' }; static symbol s_8_10[2] = { 'e', 'd' }; static symbol s_8_11[2] = { 'i', 'd' }; static symbol s_8_12[3] = { 'a', 's', 'e' }; static symbol s_8_13[4] = { 'i', 'e', 's', 'e' }; static symbol s_8_14[4] = { 'a', 's', 't', 'e' }; static symbol s_8_15[4] = { 'i', 's', 't', 'e' }; static symbol s_8_16[2] = { 'a', 'n' }; static symbol s_8_17[4] = { 'a', 'b', 'a', 'n' }; static symbol s_8_18[4] = { 'a', 'r', 'a', 'n' }; static symbol s_8_19[5] = { 'i', 'e', 'r', 'a', 'n' }; static symbol s_8_20[4] = { 0xC3, 0xAD, 'a', 'n' }; static symbol s_8_21[6] = { 'a', 'r', 0xC3, 0xAD, 'a', 'n' }; static symbol s_8_22[6] = { 'e', 'r', 0xC3, 0xAD, 'a', 'n' }; static symbol s_8_23[6] = { 'i', 'r', 0xC3, 0xAD, 'a', 'n' }; static symbol s_8_24[2] = { 'e', 'n' }; static symbol s_8_25[4] = { 'a', 's', 'e', 'n' }; static symbol s_8_26[5] = { 'i', 'e', 's', 'e', 'n' }; static symbol s_8_27[4] = { 'a', 'r', 'o', 'n' }; static symbol s_8_28[5] = { 'i', 'e', 'r', 'o', 'n' }; static symbol s_8_29[5] = { 'a', 'r', 0xC3, 0xA1, 'n' }; static symbol s_8_30[5] = { 'e', 'r', 0xC3, 0xA1, 'n' }; static symbol s_8_31[5] = { 'i', 'r', 0xC3, 0xA1, 'n' }; static symbol s_8_32[3] = { 'a', 'd', 'o' }; static symbol s_8_33[3] = { 'i', 'd', 'o' }; static symbol s_8_34[4] = { 'a', 'n', 'd', 'o' }; static symbol s_8_35[5] = { 'i', 'e', 'n', 'd', 'o' }; static symbol s_8_36[2] = { 'a', 'r' }; static symbol s_8_37[2] = { 'e', 'r' }; static symbol s_8_38[2] = { 'i', 'r' }; static symbol s_8_39[2] = { 'a', 's' }; static symbol s_8_40[4] = { 'a', 'b', 'a', 's' }; static symbol s_8_41[4] = { 'a', 'd', 'a', 's' }; static symbol s_8_42[4] = { 'i', 'd', 'a', 's' }; static symbol s_8_43[4] = { 'a', 'r', 'a', 's' }; static symbol s_8_44[5] = { 'i', 'e', 'r', 'a', 's' }; static symbol s_8_45[4] = { 0xC3, 0xAD, 'a', 's' }; static symbol s_8_46[6] = { 'a', 'r', 0xC3, 0xAD, 'a', 's' }; static symbol s_8_47[6] = { 'e', 'r', 0xC3, 0xAD, 'a', 's' }; static symbol s_8_48[6] = { 'i', 'r', 0xC3, 0xAD, 'a', 's' }; static symbol s_8_49[2] = { 'e', 's' }; static symbol s_8_50[4] = { 'a', 's', 'e', 's' }; static symbol s_8_51[5] = { 'i', 'e', 's', 'e', 's' }; static symbol s_8_52[5] = { 'a', 'b', 'a', 'i', 's' }; static symbol s_8_53[5] = { 'a', 'r', 'a', 'i', 's' }; static symbol s_8_54[6] = { 'i', 'e', 'r', 'a', 'i', 's' }; static symbol s_8_55[5] = { 0xC3, 0xAD, 'a', 'i', 's' }; static symbol s_8_56[7] = { 'a', 'r', 0xC3, 0xAD, 'a', 'i', 's' }; static symbol s_8_57[7] = { 'e', 'r', 0xC3, 0xAD, 'a', 'i', 's' }; static symbol s_8_58[7] = { 'i', 'r', 0xC3, 0xAD, 'a', 'i', 's' }; static symbol s_8_59[5] = { 'a', 's', 'e', 'i', 's' }; static symbol s_8_60[6] = { 'i', 'e', 's', 'e', 'i', 's' }; static symbol s_8_61[6] = { 'a', 's', 't', 'e', 'i', 's' }; static symbol s_8_62[6] = { 'i', 's', 't', 'e', 'i', 's' }; static symbol s_8_63[4] = { 0xC3, 0xA1, 'i', 's' }; static symbol s_8_64[4] = { 0xC3, 0xA9, 'i', 's' }; static symbol s_8_65[6] = { 'a', 'r', 0xC3, 0xA9, 'i', 's' }; static symbol s_8_66[6] = { 'e', 'r', 0xC3, 0xA9, 'i', 's' }; static symbol s_8_67[6] = { 'i', 'r', 0xC3, 0xA9, 'i', 's' }; static symbol s_8_68[4] = { 'a', 'd', 'o', 's' }; static symbol s_8_69[4] = { 'i', 'd', 'o', 's' }; static symbol s_8_70[4] = { 'a', 'm', 'o', 's' }; static symbol s_8_71[7] = { 0xC3, 0xA1, 'b', 'a', 'm', 'o', 's' }; static symbol s_8_72[7] = { 0xC3, 0xA1, 'r', 'a', 'm', 'o', 's' }; static symbol s_8_73[8] = { 'i', 0xC3, 0xA9, 'r', 'a', 'm', 'o', 's' }; static symbol s_8_74[6] = { 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_8_75[8] = { 'a', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_8_76[8] = { 'e', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_8_77[8] = { 'i', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' }; static symbol s_8_78[4] = { 'e', 'm', 'o', 's' }; static symbol s_8_79[6] = { 'a', 'r', 'e', 'm', 'o', 's' }; static symbol s_8_80[6] = { 'e', 'r', 'e', 'm', 'o', 's' }; static symbol s_8_81[6] = { 'i', 'r', 'e', 'm', 'o', 's' }; static symbol s_8_82[7] = { 0xC3, 0xA1, 's', 'e', 'm', 'o', 's' }; static symbol s_8_83[8] = { 'i', 0xC3, 0xA9, 's', 'e', 'm', 'o', 's' }; static symbol s_8_84[4] = { 'i', 'm', 'o', 's' }; static symbol s_8_85[5] = { 'a', 'r', 0xC3, 0xA1, 's' }; static symbol s_8_86[5] = { 'e', 'r', 0xC3, 0xA1, 's' }; static symbol s_8_87[5] = { 'i', 'r', 0xC3, 0xA1, 's' }; static symbol s_8_88[3] = { 0xC3, 0xAD, 's' }; static symbol s_8_89[4] = { 'a', 'r', 0xC3, 0xA1 }; static symbol s_8_90[4] = { 'e', 'r', 0xC3, 0xA1 }; static symbol s_8_91[4] = { 'i', 'r', 0xC3, 0xA1 }; static symbol s_8_92[4] = { 'a', 'r', 0xC3, 0xA9 }; static symbol s_8_93[4] = { 'e', 'r', 0xC3, 0xA9 }; static symbol s_8_94[4] = { 'i', 'r', 0xC3, 0xA9 }; static symbol s_8_95[3] = { 'i', 0xC3, 0xB3 }; static struct among a_8[96] = { /* 0 */ { 3, s_8_0, -1, 2, 0}, /* 1 */ { 3, s_8_1, -1, 2, 0}, /* 2 */ { 3, s_8_2, -1, 2, 0}, /* 3 */ { 3, s_8_3, -1, 2, 0}, /* 4 */ { 4, s_8_4, -1, 2, 0}, /* 5 */ { 3, s_8_5, -1, 2, 0}, /* 6 */ { 5, s_8_6, 5, 2, 0}, /* 7 */ { 5, s_8_7, 5, 2, 0}, /* 8 */ { 5, s_8_8, 5, 2, 0}, /* 9 */ { 2, s_8_9, -1, 2, 0}, /* 10 */ { 2, s_8_10, -1, 2, 0}, /* 11 */ { 2, s_8_11, -1, 2, 0}, /* 12 */ { 3, s_8_12, -1, 2, 0}, /* 13 */ { 4, s_8_13, -1, 2, 0}, /* 14 */ { 4, s_8_14, -1, 2, 0}, /* 15 */ { 4, s_8_15, -1, 2, 0}, /* 16 */ { 2, s_8_16, -1, 2, 0}, /* 17 */ { 4, s_8_17, 16, 2, 0}, /* 18 */ { 4, s_8_18, 16, 2, 0}, /* 19 */ { 5, s_8_19, 16, 2, 0}, /* 20 */ { 4, s_8_20, 16, 2, 0}, /* 21 */ { 6, s_8_21, 20, 2, 0}, /* 22 */ { 6, s_8_22, 20, 2, 0}, /* 23 */ { 6, s_8_23, 20, 2, 0}, /* 24 */ { 2, s_8_24, -1, 1, 0}, /* 25 */ { 4, s_8_25, 24, 2, 0}, /* 26 */ { 5, s_8_26, 24, 2, 0}, /* 27 */ { 4, s_8_27, -1, 2, 0}, /* 28 */ { 5, s_8_28, -1, 2, 0}, /* 29 */ { 5, s_8_29, -1, 2, 0}, /* 30 */ { 5, s_8_30, -1, 2, 0}, /* 31 */ { 5, s_8_31, -1, 2, 0}, /* 32 */ { 3, s_8_32, -1, 2, 0}, /* 33 */ { 3, s_8_33, -1, 2, 0}, /* 34 */ { 4, s_8_34, -1, 2, 0}, /* 35 */ { 5, s_8_35, -1, 2, 0}, /* 36 */ { 2, s_8_36, -1, 2, 0}, /* 37 */ { 2, s_8_37, -1, 2, 0}, /* 38 */ { 2, s_8_38, -1, 2, 0}, /* 39 */ { 2, s_8_39, -1, 2, 0}, /* 40 */ { 4, s_8_40, 39, 2, 0}, /* 41 */ { 4, s_8_41, 39, 2, 0}, /* 42 */ { 4, s_8_42, 39, 2, 0}, /* 43 */ { 4, s_8_43, 39, 2, 0}, /* 44 */ { 5, s_8_44, 39, 2, 0}, /* 45 */ { 4, s_8_45, 39, 2, 0}, /* 46 */ { 6, s_8_46, 45, 2, 0}, /* 47 */ { 6, s_8_47, 45, 2, 0}, /* 48 */ { 6, s_8_48, 45, 2, 0}, /* 49 */ { 2, s_8_49, -1, 1, 0}, /* 50 */ { 4, s_8_50, 49, 2, 0}, /* 51 */ { 5, s_8_51, 49, 2, 0}, /* 52 */ { 5, s_8_52, -1, 2, 0}, /* 53 */ { 5, s_8_53, -1, 2, 0}, /* 54 */ { 6, s_8_54, -1, 2, 0}, /* 55 */ { 5, s_8_55, -1, 2, 0}, /* 56 */ { 7, s_8_56, 55, 2, 0}, /* 57 */ { 7, s_8_57, 55, 2, 0}, /* 58 */ { 7, s_8_58, 55, 2, 0}, /* 59 */ { 5, s_8_59, -1, 2, 0}, /* 60 */ { 6, s_8_60, -1, 2, 0}, /* 61 */ { 6, s_8_61, -1, 2, 0}, /* 62 */ { 6, s_8_62, -1, 2, 0}, /* 63 */ { 4, s_8_63, -1, 2, 0}, /* 64 */ { 4, s_8_64, -1, 1, 0}, /* 65 */ { 6, s_8_65, 64, 2, 0}, /* 66 */ { 6, s_8_66, 64, 2, 0}, /* 67 */ { 6, s_8_67, 64, 2, 0}, /* 68 */ { 4, s_8_68, -1, 2, 0}, /* 69 */ { 4, s_8_69, -1, 2, 0}, /* 70 */ { 4, s_8_70, -1, 2, 0}, /* 71 */ { 7, s_8_71, 70, 2, 0}, /* 72 */ { 7, s_8_72, 70, 2, 0}, /* 73 */ { 8, s_8_73, 70, 2, 0}, /* 74 */ { 6, s_8_74, 70, 2, 0}, /* 75 */ { 8, s_8_75, 74, 2, 0}, /* 76 */ { 8, s_8_76, 74, 2, 0}, /* 77 */ { 8, s_8_77, 74, 2, 0}, /* 78 */ { 4, s_8_78, -1, 1, 0}, /* 79 */ { 6, s_8_79, 78, 2, 0}, /* 80 */ { 6, s_8_80, 78, 2, 0}, /* 81 */ { 6, s_8_81, 78, 2, 0}, /* 82 */ { 7, s_8_82, 78, 2, 0}, /* 83 */ { 8, s_8_83, 78, 2, 0}, /* 84 */ { 4, s_8_84, -1, 2, 0}, /* 85 */ { 5, s_8_85, -1, 2, 0}, /* 86 */ { 5, s_8_86, -1, 2, 0}, /* 87 */ { 5, s_8_87, -1, 2, 0}, /* 88 */ { 3, s_8_88, -1, 2, 0}, /* 89 */ { 4, s_8_89, -1, 2, 0}, /* 90 */ { 4, s_8_90, -1, 2, 0}, /* 91 */ { 4, s_8_91, -1, 2, 0}, /* 92 */ { 4, s_8_92, -1, 2, 0}, /* 93 */ { 4, s_8_93, -1, 2, 0}, /* 94 */ { 4, s_8_94, -1, 2, 0}, /* 95 */ { 3, s_8_95, -1, 2, 0} }; static symbol s_9_0[1] = { 'a' }; static symbol s_9_1[1] = { 'e' }; static symbol s_9_2[1] = { 'o' }; static symbol s_9_3[2] = { 'o', 's' }; static symbol s_9_4[2] = { 0xC3, 0xA1 }; static symbol s_9_5[2] = { 0xC3, 0xA9 }; static symbol s_9_6[2] = { 0xC3, 0xAD }; static symbol s_9_7[2] = { 0xC3, 0xB3 }; static struct among a_9[8] = { /* 0 */ { 1, s_9_0, -1, 1, 0}, /* 1 */ { 1, s_9_1, -1, 2, 0}, /* 2 */ { 1, s_9_2, -1, 1, 0}, /* 3 */ { 2, s_9_3, -1, 1, 0}, /* 4 */ { 2, s_9_4, -1, 1, 0}, /* 5 */ { 2, s_9_5, -1, 2, 0}, /* 6 */ { 2, s_9_6, -1, 1, 0}, /* 7 */ { 2, s_9_7, -1, 1, 0} }; static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 10 }; static symbol s_0[] = { 'a' }; static symbol s_1[] = { 'e' }; static symbol s_2[] = { 'i' }; static symbol s_3[] = { 'o' }; static symbol s_4[] = { 'u' }; static symbol s_5[] = { 'i', 'e', 'n', 'd', 'o' }; static symbol s_6[] = { 'a', 'n', 'd', 'o' }; static symbol s_7[] = { 'a', 'r' }; static symbol s_8[] = { 'e', 'r' }; static symbol s_9[] = { 'i', 'r' }; static symbol s_10[] = { 'u' }; static symbol s_11[] = { 'i', 'c' }; static symbol s_12[] = { 'l', 'o', 'g' }; static symbol s_13[] = { 'u' }; static symbol s_14[] = { 'e', 'n', 't', 'e' }; static symbol s_15[] = { 'a', 't' }; static symbol s_16[] = { 'a', 't' }; static symbol s_17[] = { 'u' }; static symbol s_18[] = { 'u' }; static symbol s_19[] = { 'g' }; static symbol s_20[] = { 'u' }; static symbol s_21[] = { 'g' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; z->I[1] = z->l; z->I[2] = z->l; { int c = z->c; /* do, line 37 */ { int c = z->c; /* or, line 39 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab2; { int c = z->c; /* or, line 38 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab4; while(1) { /* gopast, line 38 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab5; break; lab5: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab4; z->c = c; /* gopast, line 38 */ } } goto lab3; lab4: z->c = c; if (!(in_grouping_U(z, g_v, 97, 252))) goto lab2; while(1) { /* gopast, line 38 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab6; break; lab6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab2; z->c = c; /* gopast, line 38 */ } } } lab3: goto lab1; lab2: z->c = c; if (!(out_grouping_U(z, g_v, 97, 252))) goto lab0; { int c = z->c; /* or, line 40 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab8; while(1) { /* gopast, line 40 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab9; break; lab9: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab8; z->c = c; /* gopast, line 40 */ } } goto lab7; lab8: z->c = c; if (!(in_grouping_U(z, g_v, 97, 252))) goto lab0; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 40 */ } } lab7: ; } lab1: z->I[0] = z->c; /* setmark pV, line 41 */ lab0: z->c = c; } { int c = z->c; /* do, line 43 */ while(1) { /* gopast, line 44 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab11; break; lab11: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 44 */ } } while(1) { /* gopast, line 44 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab12; break; lab12: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 44 */ } } z->I[1] = z->c; /* setmark p1, line 44 */ while(1) { /* gopast, line 45 */ if (!(in_grouping_U(z, g_v, 97, 252))) goto lab13; break; lab13: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 45 */ } } while(1) { /* gopast, line 45 */ if (!(out_grouping_U(z, g_v, 97, 252))) goto lab14; break; lab14: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab10; z->c = c; /* gopast, line 45 */ } } z->I[2] = z->c; /* setmark p2, line 45 */ lab10: z->c = c; } return 1; } static int r_postlude(struct SN_env * z) { int among_var; while(1) { /* repeat, line 49 */ int c = z->c; z->bra = z->c; /* [, line 50 */ among_var = find_among(z, a_0, 6); /* substring, line 50 */ if (!(among_var)) goto lab0; z->ket = z->c; /* ], line 50 */ switch(among_var) { case 0: goto lab0; case 1: { int ret; ret = slice_from_s(z, 1, s_0); /* <-, line 51 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 1, s_1); /* <-, line 52 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 1, s_2); /* <-, line 53 */ if (ret < 0) return ret; } break; case 4: { int ret; ret = slice_from_s(z, 1, s_3); /* <-, line 54 */ if (ret < 0) return ret; } break; case 5: { int ret; ret = slice_from_s(z, 1, s_4); /* <-, line 55 */ if (ret < 0) return ret; } break; case 6: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) goto lab0; z->c = c; /* next, line 57 */ } break; } continue; lab0: z->c = c; break; } return 1; } static int r_RV(struct SN_env * z) { if (!(z->I[0] <= z->c)) return 0; return 1; } static int r_R1(struct SN_env * z) { if (!(z->I[1] <= z->c)) return 0; return 1; } static int r_R2(struct SN_env * z) { if (!(z->I[2] <= z->c)) return 0; return 1; } static int r_attached_pronoun(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 68 */ if (!(find_among_b(z, a_1, 13))) return 0; /* substring, line 68 */ z->bra = z->c; /* ], line 68 */ among_var = find_among_b(z, a_2, 11); /* substring, line 72 */ if (!(among_var)) return 0; { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 72 */ if (ret < 0) return ret; } switch(among_var) { case 0: return 0; case 1: z->bra = z->c; /* ], line 73 */ { int ret; ret = slice_from_s(z, 5, s_5); /* <-, line 73 */ if (ret < 0) return ret; } break; case 2: z->bra = z->c; /* ], line 74 */ { int ret; ret = slice_from_s(z, 4, s_6); /* <-, line 74 */ if (ret < 0) return ret; } break; case 3: z->bra = z->c; /* ], line 75 */ { int ret; ret = slice_from_s(z, 2, s_7); /* <-, line 75 */ if (ret < 0) return ret; } break; case 4: z->bra = z->c; /* ], line 76 */ { int ret; ret = slice_from_s(z, 2, s_8); /* <-, line 76 */ if (ret < 0) return ret; } break; case 5: z->bra = z->c; /* ], line 77 */ { int ret; ret = slice_from_s(z, 2, s_9); /* <-, line 77 */ if (ret < 0) return ret; } break; case 6: { int ret; ret = slice_del(z); /* delete, line 81 */ if (ret < 0) return ret; } break; case 7: if (!(eq_s_b(z, 1, s_10))) return 0; { int ret; ret = slice_del(z); /* delete, line 82 */ if (ret < 0) return ret; } break; } return 1; } static int r_standard_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 87 */ among_var = find_among_b(z, a_6, 46); /* substring, line 87 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 87 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 99 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 99 */ if (ret < 0) return ret; } break; case 2: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 105 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 105 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 106 */ z->ket = z->c; /* [, line 106 */ if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 106 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 106 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 106 */ if (ret < 0) return ret; } lab0: ; } break; case 3: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 111 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 3, s_12); /* <-, line 111 */ if (ret < 0) return ret; } break; case 4: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 115 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 1, s_13); /* <-, line 115 */ if (ret < 0) return ret; } break; case 5: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 119 */ if (ret < 0) return ret; } { int ret; ret = slice_from_s(z, 4, s_14); /* <-, line 119 */ if (ret < 0) return ret; } break; case 6: { int ret = r_R1(z); if (ret == 0) return 0; /* call R1, line 123 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 123 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 124 */ z->ket = z->c; /* [, line 125 */ among_var = find_among_b(z, a_3, 4); /* substring, line 125 */ if (!(among_var)) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 125 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 125 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 125 */ if (ret < 0) return ret; } switch(among_var) { case 0: { z->c = z->l - m; goto lab1; } case 1: z->ket = z->c; /* [, line 126 */ if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab1; } z->bra = z->c; /* ], line 126 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 126 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 126 */ if (ret < 0) return ret; } break; } lab1: ; } break; case 7: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 135 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 135 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 136 */ z->ket = z->c; /* [, line 137 */ among_var = find_among_b(z, a_4, 3); /* substring, line 137 */ if (!(among_var)) { z->c = z->l - m; goto lab2; } z->bra = z->c; /* ], line 137 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab2; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 140 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 140 */ if (ret < 0) return ret; } break; } lab2: ; } break; case 8: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 147 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 147 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 148 */ z->ket = z->c; /* [, line 149 */ among_var = find_among_b(z, a_5, 3); /* substring, line 149 */ if (!(among_var)) { z->c = z->l - m; goto lab3; } z->bra = z->c; /* ], line 149 */ switch(among_var) { case 0: { z->c = z->l - m; goto lab3; } case 1: { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 152 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 152 */ if (ret < 0) return ret; } break; } lab3: ; } break; case 9: { int ret = r_R2(z); if (ret == 0) return 0; /* call R2, line 159 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 159 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 160 */ z->ket = z->c; /* [, line 161 */ if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m; goto lab4; } z->bra = z->c; /* ], line 161 */ { int ret = r_R2(z); if (ret == 0) { z->c = z->l - m; goto lab4; } /* call R2, line 161 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 161 */ if (ret < 0) return ret; } lab4: ; } break; } return 1; } static int r_y_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 168 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 168 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 168 */ among_var = find_among_b(z, a_7, 12); /* substring, line 168 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 168 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: if (!(eq_s_b(z, 1, s_17))) return 0; { int ret; ret = slice_del(z); /* delete, line 171 */ if (ret < 0) return ret; } break; } return 1; } static int r_verb_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 176 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 176 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 176 */ among_var = find_among_b(z, a_8, 96); /* substring, line 176 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 176 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int m = z->l - z->c; (void) m; /* try, line 179 */ if (!(eq_s_b(z, 1, s_18))) { z->c = z->l - m; goto lab0; } { int m_test = z->l - z->c; /* test, line 179 */ if (!(eq_s_b(z, 1, s_19))) { z->c = z->l - m; goto lab0; } z->c = z->l - m_test; } lab0: ; } z->bra = z->c; /* ], line 179 */ { int ret; ret = slice_del(z); /* delete, line 179 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_del(z); /* delete, line 200 */ if (ret < 0) return ret; } break; } return 1; } static int r_residual_suffix(struct SN_env * z) { int among_var; z->ket = z->c; /* [, line 205 */ among_var = find_among_b(z, a_9, 8); /* substring, line 205 */ if (!(among_var)) return 0; z->bra = z->c; /* ], line 205 */ switch(among_var) { case 0: return 0; case 1: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 208 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 208 */ if (ret < 0) return ret; } break; case 2: { int ret = r_RV(z); if (ret == 0) return 0; /* call RV, line 210 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 210 */ if (ret < 0) return ret; } { int m = z->l - z->c; (void) m; /* try, line 210 */ z->ket = z->c; /* [, line 210 */ if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; } z->bra = z->c; /* ], line 210 */ { int m_test = z->l - z->c; /* test, line 210 */ if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab0; } z->c = z->l - m_test; } { int ret = r_RV(z); if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 210 */ if (ret < 0) return ret; } { int ret; ret = slice_del(z); /* delete, line 210 */ if (ret < 0) return ret; } lab0: ; } break; } return 1; } extern int spanish_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 216 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 216 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 217 */ { int m = z->l - z->c; (void) m; /* do, line 218 */ { int ret = r_attached_pronoun(z); if (ret == 0) goto lab1; /* call attached_pronoun, line 218 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 219 */ { int m = z->l - z->c; (void) m; /* or, line 219 */ { int ret = r_standard_suffix(z); if (ret == 0) goto lab4; /* call standard_suffix, line 219 */ if (ret < 0) return ret; } goto lab3; lab4: z->c = z->l - m; { int ret = r_y_verb_suffix(z); if (ret == 0) goto lab5; /* call y_verb_suffix, line 220 */ if (ret < 0) return ret; } goto lab3; lab5: z->c = z->l - m; { int ret = r_verb_suffix(z); if (ret == 0) goto lab2; /* call verb_suffix, line 221 */ if (ret < 0) return ret; } } lab3: lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 223 */ { int ret = r_residual_suffix(z); if (ret == 0) goto lab6; /* call residual_suffix, line 223 */ if (ret < 0) return ret; } lab6: z->c = z->l - m; } z->c = z->lb; { int c = z->c; /* do, line 225 */ { int ret = r_postlude(z); if (ret == 0) goto lab7; /* call postlude, line 225 */ if (ret < 0) return ret; } lab7: z->c = c; } return 1; } extern struct SN_env * spanish_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); } extern void spanish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_spanish.h000066400000000000000000000004711154025176300274540ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * spanish_UTF_8_create_env(void); extern void spanish_UTF_8_close_env(struct SN_env * z); extern int spanish_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_swedish.c000066400000000000000000000237251154025176300274570ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #include "../runtime/header.h" extern int swedish_UTF_8_stem(struct SN_env * z); static int r_other_suffix(struct SN_env * z); static int r_consonant_pair(struct SN_env * z); static int r_main_suffix(struct SN_env * z); static int r_mark_regions(struct SN_env * z); extern struct SN_env * swedish_UTF_8_create_env(void); extern void swedish_UTF_8_close_env(struct SN_env * z); static symbol s_0_0[1] = { 'a' }; static symbol s_0_1[4] = { 'a', 'r', 'n', 'a' }; static symbol s_0_2[4] = { 'e', 'r', 'n', 'a' }; static symbol s_0_3[7] = { 'h', 'e', 't', 'e', 'r', 'n', 'a' }; static symbol s_0_4[4] = { 'o', 'r', 'n', 'a' }; static symbol s_0_5[2] = { 'a', 'd' }; static symbol s_0_6[1] = { 'e' }; static symbol s_0_7[3] = { 'a', 'd', 'e' }; static symbol s_0_8[4] = { 'a', 'n', 'd', 'e' }; static symbol s_0_9[4] = { 'a', 'r', 'n', 'e' }; static symbol s_0_10[3] = { 'a', 'r', 'e' }; static symbol s_0_11[4] = { 'a', 's', 't', 'e' }; static symbol s_0_12[2] = { 'e', 'n' }; static symbol s_0_13[5] = { 'a', 'n', 'd', 'e', 'n' }; static symbol s_0_14[4] = { 'a', 'r', 'e', 'n' }; static symbol s_0_15[5] = { 'h', 'e', 't', 'e', 'n' }; static symbol s_0_16[3] = { 'e', 'r', 'n' }; static symbol s_0_17[2] = { 'a', 'r' }; static symbol s_0_18[2] = { 'e', 'r' }; static symbol s_0_19[5] = { 'h', 'e', 't', 'e', 'r' }; static symbol s_0_20[2] = { 'o', 'r' }; static symbol s_0_21[1] = { 's' }; static symbol s_0_22[2] = { 'a', 's' }; static symbol s_0_23[5] = { 'a', 'r', 'n', 'a', 's' }; static symbol s_0_24[5] = { 'e', 'r', 'n', 'a', 's' }; static symbol s_0_25[5] = { 'o', 'r', 'n', 'a', 's' }; static symbol s_0_26[2] = { 'e', 's' }; static symbol s_0_27[4] = { 'a', 'd', 'e', 's' }; static symbol s_0_28[5] = { 'a', 'n', 'd', 'e', 's' }; static symbol s_0_29[3] = { 'e', 'n', 's' }; static symbol s_0_30[5] = { 'a', 'r', 'e', 'n', 's' }; static symbol s_0_31[6] = { 'h', 'e', 't', 'e', 'n', 's' }; static symbol s_0_32[4] = { 'e', 'r', 'n', 's' }; static symbol s_0_33[2] = { 'a', 't' }; static symbol s_0_34[5] = { 'a', 'n', 'd', 'e', 't' }; static symbol s_0_35[3] = { 'h', 'e', 't' }; static symbol s_0_36[3] = { 'a', 's', 't' }; static struct among a_0[37] = { /* 0 */ { 1, s_0_0, -1, 1, 0}, /* 1 */ { 4, s_0_1, 0, 1, 0}, /* 2 */ { 4, s_0_2, 0, 1, 0}, /* 3 */ { 7, s_0_3, 2, 1, 0}, /* 4 */ { 4, s_0_4, 0, 1, 0}, /* 5 */ { 2, s_0_5, -1, 1, 0}, /* 6 */ { 1, s_0_6, -1, 1, 0}, /* 7 */ { 3, s_0_7, 6, 1, 0}, /* 8 */ { 4, s_0_8, 6, 1, 0}, /* 9 */ { 4, s_0_9, 6, 1, 0}, /* 10 */ { 3, s_0_10, 6, 1, 0}, /* 11 */ { 4, s_0_11, 6, 1, 0}, /* 12 */ { 2, s_0_12, -1, 1, 0}, /* 13 */ { 5, s_0_13, 12, 1, 0}, /* 14 */ { 4, s_0_14, 12, 1, 0}, /* 15 */ { 5, s_0_15, 12, 1, 0}, /* 16 */ { 3, s_0_16, -1, 1, 0}, /* 17 */ { 2, s_0_17, -1, 1, 0}, /* 18 */ { 2, s_0_18, -1, 1, 0}, /* 19 */ { 5, s_0_19, 18, 1, 0}, /* 20 */ { 2, s_0_20, -1, 1, 0}, /* 21 */ { 1, s_0_21, -1, 2, 0}, /* 22 */ { 2, s_0_22, 21, 1, 0}, /* 23 */ { 5, s_0_23, 22, 1, 0}, /* 24 */ { 5, s_0_24, 22, 1, 0}, /* 25 */ { 5, s_0_25, 22, 1, 0}, /* 26 */ { 2, s_0_26, 21, 1, 0}, /* 27 */ { 4, s_0_27, 26, 1, 0}, /* 28 */ { 5, s_0_28, 26, 1, 0}, /* 29 */ { 3, s_0_29, 21, 1, 0}, /* 30 */ { 5, s_0_30, 29, 1, 0}, /* 31 */ { 6, s_0_31, 29, 1, 0}, /* 32 */ { 4, s_0_32, 21, 1, 0}, /* 33 */ { 2, s_0_33, -1, 1, 0}, /* 34 */ { 5, s_0_34, -1, 1, 0}, /* 35 */ { 3, s_0_35, -1, 1, 0}, /* 36 */ { 3, s_0_36, -1, 1, 0} }; static symbol s_1_0[2] = { 'd', 'd' }; static symbol s_1_1[2] = { 'g', 'd' }; static symbol s_1_2[2] = { 'n', 'n' }; static symbol s_1_3[2] = { 'd', 't' }; static symbol s_1_4[2] = { 'g', 't' }; static symbol s_1_5[2] = { 'k', 't' }; static symbol s_1_6[2] = { 't', 't' }; static struct among a_1[7] = { /* 0 */ { 2, s_1_0, -1, -1, 0}, /* 1 */ { 2, s_1_1, -1, -1, 0}, /* 2 */ { 2, s_1_2, -1, -1, 0}, /* 3 */ { 2, s_1_3, -1, -1, 0}, /* 4 */ { 2, s_1_4, -1, -1, 0}, /* 5 */ { 2, s_1_5, -1, -1, 0}, /* 6 */ { 2, s_1_6, -1, -1, 0} }; static symbol s_2_0[2] = { 'i', 'g' }; static symbol s_2_1[3] = { 'l', 'i', 'g' }; static symbol s_2_2[3] = { 'e', 'l', 's' }; static symbol s_2_3[5] = { 'f', 'u', 'l', 'l', 't' }; static symbol s_2_4[5] = { 'l', 0xC3, 0xB6, 's', 't' }; static struct among a_2[5] = { /* 0 */ { 2, s_2_0, -1, 1, 0}, /* 1 */ { 3, s_2_1, 0, 1, 0}, /* 2 */ { 3, s_2_2, -1, 1, 0}, /* 3 */ { 5, s_2_3, -1, 3, 0}, /* 4 */ { 5, s_2_4, -1, 2, 0} }; static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32 }; static unsigned char g_s_ending[] = { 119, 127, 149 }; static symbol s_0[] = { 'l', 0xC3, 0xB6, 's' }; static symbol s_1[] = { 'f', 'u', 'l', 'l' }; static int r_mark_regions(struct SN_env * z) { z->I[0] = z->l; { int c_test = z->c; /* test, line 29 */ { int c = skip_utf8(z->p, z->c, 0, z->l, + 3); if (c < 0) return 0; z->c = c; /* hop, line 29 */ } z->I[1] = z->c; /* setmark x, line 29 */ z->c = c_test; } while(1) { /* goto, line 30 */ int c = z->c; if (!(in_grouping_U(z, g_v, 97, 246))) goto lab0; z->c = c; break; lab0: z->c = c; { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* goto, line 30 */ } } while(1) { /* gopast, line 30 */ if (!(out_grouping_U(z, g_v, 97, 246))) goto lab1; break; lab1: { int c = skip_utf8(z->p, z->c, 0, z->l, 1); if (c < 0) return 0; z->c = c; /* gopast, line 30 */ } } z->I[0] = z->c; /* setmark p1, line 30 */ /* try, line 31 */ if (!(z->I[0] < z->I[1])) goto lab2; z->I[0] = z->I[1]; lab2: return 1; } static int r_main_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 37 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 37 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 37 */ among_var = find_among_b(z, a_0, 37); /* substring, line 37 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 37 */ z->lb = m3; } switch(among_var) { case 0: return 0; case 1: { int ret; ret = slice_del(z); /* delete, line 44 */ if (ret < 0) return ret; } break; case 2: if (!(in_grouping_b_U(z, g_s_ending, 98, 121))) return 0; { int ret; ret = slice_del(z); /* delete, line 46 */ if (ret < 0) return ret; } break; } return 1; } static int r_consonant_pair(struct SN_env * z) { { int m3; /* setlimit, line 50 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 50 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; { int m = z->l - z->c; (void) m; /* and, line 52 */ if (!(find_among_b(z, a_1, 7))) { z->lb = m3; return 0; } /* among, line 51 */ z->c = z->l - m; z->ket = z->c; /* [, line 52 */ { int c = skip_utf8(z->p, z->c, z->lb, 0, -1); if (c < 0) { z->lb = m3; return 0; } z->c = c; /* next, line 52 */ } z->bra = z->c; /* ], line 52 */ { int ret; ret = slice_del(z); /* delete, line 52 */ if (ret < 0) return ret; } } z->lb = m3; } return 1; } static int r_other_suffix(struct SN_env * z) { int among_var; { int m3; /* setlimit, line 55 */ int m = z->l - z->c; (void) m; if (z->c < z->I[0]) return 0; z->c = z->I[0]; /* tomark, line 55 */ m3 = z->lb; z->lb = z->c; z->c = z->l - m; z->ket = z->c; /* [, line 56 */ among_var = find_among_b(z, a_2, 5); /* substring, line 56 */ if (!(among_var)) { z->lb = m3; return 0; } z->bra = z->c; /* ], line 56 */ switch(among_var) { case 0: { z->lb = m3; return 0; } case 1: { int ret; ret = slice_del(z); /* delete, line 57 */ if (ret < 0) return ret; } break; case 2: { int ret; ret = slice_from_s(z, 4, s_0); /* <-, line 58 */ if (ret < 0) return ret; } break; case 3: { int ret; ret = slice_from_s(z, 4, s_1); /* <-, line 59 */ if (ret < 0) return ret; } break; } z->lb = m3; } return 1; } extern int swedish_UTF_8_stem(struct SN_env * z) { { int c = z->c; /* do, line 66 */ { int ret = r_mark_regions(z); if (ret == 0) goto lab0; /* call mark_regions, line 66 */ if (ret < 0) return ret; } lab0: z->c = c; } z->lb = z->c; z->c = z->l; /* backwards, line 67 */ { int m = z->l - z->c; (void) m; /* do, line 68 */ { int ret = r_main_suffix(z); if (ret == 0) goto lab1; /* call main_suffix, line 68 */ if (ret < 0) return ret; } lab1: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 69 */ { int ret = r_consonant_pair(z); if (ret == 0) goto lab2; /* call consonant_pair, line 69 */ if (ret < 0) return ret; } lab2: z->c = z->l - m; } { int m = z->l - z->c; (void) m; /* do, line 70 */ { int ret = r_other_suffix(z); if (ret == 0) goto lab3; /* call other_suffix, line 70 */ if (ret < 0) return ret; } lab3: z->c = z->l - m; } z->c = z->lb; return 1; } extern struct SN_env * swedish_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); } extern void swedish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } clucene-core-2.3.3.4/src/contribs-lib/CLucene/snowball/src_c/stem_UTF_8_swedish.h000066400000000000000000000004711154025176300274550ustar00rootroot00000000000000 /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus extern "C" { #endif extern struct SN_env * swedish_UTF_8_create_env(void); extern void swedish_UTF_8_close_env(struct SN_env * z); extern int swedish_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/000077500000000000000000000000001154025176300217025ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/arrayinputstream.h000066400000000000000000000036251154025176300254730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2009 Isidor Zeuner * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CLUCENE_UTIL_ARRAYINPUTSTREAM_H #define CLUCENE_UTIL_ARRAYINPUTSTREAM_H #include "CLucene/_ApiHeader.h" #include "CLucene/util/CLStreams.h" #include "CLucene/util/Array.h" CL_NS_DEF(util) template class CLUCENE_CONTRIBS_EXPORT ArrayInputStream : public CL_NS(util)::CLStream { public: _CL_DEPRECATED(Use compressed field) ArrayInputStream(ArrayBase const* data); int32_t read(const element*& start, int32_t min, int32_t max); int64_t skip(int64_t ntoskip); int64_t position(); size_t size(); private: ArrayBase const* data; int64_t current_position; }; template ArrayInputStream::ArrayInputStream(ArrayBase const* data) : data(data), current_position(0) { } template int32_t ArrayInputStream::read(const element*& start, int32_t min, int32_t max) { int32_t to_read = min; int32_t readable = data->length - current_position; if (readable < to_read) { to_read = readable; } start = data->values + current_position; current_position += to_read; return to_read; } template int64_t ArrayInputStream::skip(int64_t ntoskip) { int64_t to_skip = ntoskip; int64_t skippable = data->length - current_position; if (skippable < to_skip) { to_skip = skippable; } current_position += to_skip; return to_skip; } template int64_t ArrayInputStream::position() { return current_position; } template size_t ArrayInputStream::size() { return data->length; } CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/byteinputstream.h000066400000000000000000000010521154025176300253100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2009 Isidor Zeuner * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CLUCENE_UTIL_BYTEINPUTSTREAM_H #define CLUCENE_UTIL_BYTEINPUTSTREAM_H #include "arrayinputstream.h" CL_NS_DEF(util) typedef ArrayInputStream ByteInputStream; CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/gzipcompressstream.cpp000066400000000000000000000066031154025176300263540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "gzipcompressstream.h" #include "CLucene/util/_bufferedstream.h" #include CL_NS_DEF(util) class GZipCompressInputStream::Internal: public CL_NS(util)::BufferedInputStreamImpl{ z_stream_s* zstream; InputStream* input; protected: int32_t fillBuffer(signed char* start, int32_t space){ if (zstream == 0) return -1; // make sure there is data to decompress if (zstream->avail_in==0) { // read data from the input stream const signed char* inStart; int32_t nread = input->read(inStart, 1, 0); if (nread < 1) { zstream->avail_in = 0; //bail... if (deflate(zstream, Z_FINISH) != Z_STREAM_END) { _CLTHROWA(CL_ERR_IO, "deflate should report Z_STREAM_END\n"); } int32_t nwritten = space - zstream->avail_out; dealloc(); return nwritten; } zstream->next_in = (Bytef*)inStart; zstream->avail_in = nread; } // make sure we can write into the buffer zstream->avail_out = space; zstream->next_out = (Bytef*)start; int r = deflate(zstream, Z_NO_FLUSH); // inform the buffer of the number of bytes that was read int32_t nwritten = space - zstream->avail_out; switch (r) { case Z_NEED_DICT: _CLTHROWA(CL_ERR_IO, "Z_NEED_DICT while inflating stream."); break; case Z_DATA_ERROR: _CLTHROWA(CL_ERR_IO, "Z_DATA_ERROR while inflating stream."); break; case Z_MEM_ERROR: _CLTHROWA(CL_ERR_IO, "Z_MEM_ERROR while inflating stream."); break; } return nwritten; } public: void dealloc(){ if (zstream) { deflateEnd(zstream); free(zstream); zstream = 0; } } void _setMinBufSize(int buf){ this->setMinBufSize(buf); } Internal(InputStream* input, int level){ if ( level < 0 || level > 9 ) level = Z_DEFAULT_COMPRESSION; this->input = input; // initialize the z_stream zstream = (z_stream_s*)malloc(sizeof(z_stream_s)); zstream->zalloc = Z_NULL; zstream->zfree = Z_NULL; zstream->opaque = Z_NULL; zstream->avail_in = 0; // initialize for writing gzip streams int r = deflateInit(zstream, level); if (r != Z_OK) { dealloc(); _CLTHROWA(CL_ERR_IO, "Error initializing GZipCompressInputStream."); } // signal that we need to read into the buffer zstream->avail_out = 1; } ~Internal(){ dealloc(); } }; GZipCompressInputStream::GZipCompressInputStream ( InputStream* input, int level) { internal = new Internal(input,level); } size_t GZipCompressInputStream::size(){ return internal->size(); } GZipCompressInputStream::~GZipCompressInputStream () { delete internal; } int32_t GZipCompressInputStream::read(const signed char*& start, int32_t min, int32_t max){ return internal->read(start,min,max); } int64_t GZipCompressInputStream::position(){ return internal->position(); } int64_t GZipCompressInputStream::reset(int64_t to){ return internal->reset(to); } int64_t GZipCompressInputStream::skip(int64_t ntoskip){ return internal->skip(ntoskip); } void GZipCompressInputStream::setMinBufSize(int32_t minbufsize){ internal->_setMinBufSize(minbufsize); } CL_NS_END clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/gzipcompressstream.h000066400000000000000000000021541154025176300260160ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CLUENE_UTIL_GZIPCOMPRESSSTREAM_H #define CLUENE_UTIL_GZIPCOMPRESSSTREAM_H #include "CLucene/util/CLStreams.h" struct z_stream_s; CL_NS_DEF(util) class CLUCENE_CONTRIBS_EXPORT GZipCompressInputStream : public InputStream{ private: class Internal; Internal* internal; public: LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_BUFFER_SIZE=4096); _CL_DEPRECATED(Use compressed field) explicit GZipCompressInputStream(InputStream* input, int level=-1); _CL_DEPRECATED(Use compressed field) virtual ~GZipCompressInputStream(); int32_t read(const signed char*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); size_t size(); void setMinBufSize(int32_t minbufsize); }; CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/gzipinputstream.cpp000066400000000000000000000117541154025176300256630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "gzipinputstream.h" #include "CLucene/util/_bufferedstream.h" #include CL_NS_DEF(util) class GZipInputStream::Internal{ public: class JStreamsBuffer: public BufferedInputStreamImpl{ z_stream_s* zstream; BufferedInputStream* input; protected: int32_t fillBuffer(signed char* start, int32_t space) { if (zstream == 0) return -1; // make sure there is data to decompress if (zstream->avail_out) { // read data from the input stream const signed char* inStart; int32_t nread = input->read(inStart, 1, 0); if (nread < 1) { _CLTHROWA(CL_ERR_IO, "unexpected end of stream"); } else { zstream->next_in = (Bytef*)inStart; zstream->avail_in = nread; } } // make sure we can write into the buffer zstream->avail_out = space; zstream->next_out = (Bytef*)start; // decompress int r = inflate(zstream, Z_SYNC_FLUSH); // inform the buffer of the number of bytes that was read int32_t nwritten = space - zstream->avail_out; switch (r) { case Z_NEED_DICT: _CLTHROWA(CL_ERR_IO, "Z_NEED_DICT while inflating stream."); break; case Z_DATA_ERROR: _CLTHROWA(CL_ERR_IO, "Z_DATA_ERROR while inflating stream."); break; case Z_MEM_ERROR: _CLTHROWA(CL_ERR_IO, "Z_MEM_ERROR while inflating stream."); break; case Z_STREAM_END: if (zstream->avail_in) { input->reset(input->position()-zstream->avail_in); } // we are finished decompressing, // (but this stream is not yet finished) dealloc(); } return nwritten; } void dealloc() { if (zstream) { inflateEnd(zstream); free(zstream); zstream = 0; } } bool checkMagic() { const unsigned char* buf; const signed char* begin; int32_t nread; int64_t pos = input->position(); nread = input->read(begin, 2, 2); input->reset(pos); if (nread != 2) { return false; } buf = (const unsigned char*)begin; return buf[0] == 0x1f && buf[1] == 0x8b; } public: int encoding; JStreamsBuffer(BufferedInputStream* input, GZipInputStream::ZipFormat format){ this->input = input; // check first bytes of stream before allocating buffer if (format == GZipInputStream::GZIPFORMAT && !checkMagic()) { _CLTHROWA(CL_ERR_IO, "Magic bytes are wrong."); } // initialize the z_stream zstream = (z_stream_s*)malloc(sizeof(z_stream_s)); zstream->zalloc = Z_NULL; zstream->zfree = Z_NULL; zstream->opaque = Z_NULL; zstream->avail_in = 0; zstream->next_in = Z_NULL; // initialize for reading gzip streams // for reading libz streams, you need inflateInit(zstream) int r; switch(format) { case GZipInputStream::ZLIBFORMAT: r = inflateInit(zstream); break; case GZipInputStream::GZIPFORMAT: r = inflateInit2(zstream, 15+16); break; case GZipInputStream::ZIPFORMAT: default: r = inflateInit2(zstream, -MAX_WBITS); break; } if (r != Z_OK) { dealloc(); _CLTHROWA(CL_ERR_IO, "Error initializing GZipInputStream."); } // signal that we need to read into the buffer zstream->avail_out = 1; } void _setMinBufSize(int32_t bufsize){ this->setMinBufSize(bufsize); } ~JStreamsBuffer(){ dealloc(); } }; JStreamsBuffer* jsbuffer; Internal(BufferedInputStream* input, GZipInputStream::ZipFormat format){ jsbuffer = new JStreamsBuffer(input, format); } ~Internal(){ delete jsbuffer; } }; GZipInputStream::GZipInputStream(InputStream* input, ZipFormat format) { internal = new Internal(_CLNEW FilteredBufferedInputStream(input, false), format); } GZipInputStream::GZipInputStream(BufferedInputStream* input, ZipFormat format) { internal = new Internal(input, format); } GZipInputStream::~GZipInputStream() { delete internal; } int32_t GZipInputStream::read(const signed char*& start, int32_t min, int32_t max){ return internal->jsbuffer->read(start,min,max); } int32_t GZipInputStream::read(const unsigned char*& _start, int32_t min, int32_t max){ const signed char* start = 0; int32_t ret = internal->jsbuffer->read(start,min,max); _start = (const unsigned char*)start; return ret; } int64_t GZipInputStream::position(){ return internal->jsbuffer->position(); } int64_t GZipInputStream::reset(int64_t to){ return internal->jsbuffer->reset(to); } int64_t GZipInputStream::skip(int64_t ntoskip){ return internal->jsbuffer->skip(ntoskip); } void GZipInputStream::setMinBufSize(int32_t minbufsize){ internal->jsbuffer->_setMinBufSize(minbufsize); } size_t GZipInputStream::size(){ return internal->jsbuffer->size(); } CL_NS_END clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/gzipinputstream.h000066400000000000000000000024251154025176300253230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CLUENE_UTIL_GZIPINPUTSTREAM_H #define CLUENE_UTIL_GZIPINPUTSTREAM_H #include "CLucene/util/CLStreams.h" struct z_stream_s; CL_NS_DEF(util) class CLUCENE_CONTRIBS_EXPORT GZipInputStream : public CL_NS(util)::BufferedInputStream { public: enum ZipFormat { ZLIBFORMAT, GZIPFORMAT, ZIPFORMAT}; private: class Internal; Internal* internal; public: _CL_DEPRECATED(Use compressed field) explicit GZipInputStream(BufferedInputStream* input, ZipFormat format=GZIPFORMAT); _CL_DEPRECATED(Use compressed field) explicit GZipInputStream(InputStream* input, ZipFormat format=GZIPFORMAT); ~GZipInputStream(); int32_t read(const signed char*& start, int32_t min, int32_t max); int32_t read(const unsigned char*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); size_t size(); void setMinBufSize(int32_t minbufsize); }; CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CLucene/util/streamarray.h000066400000000000000000000020451154025176300244060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2009 Isidor Zeuner * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CLUCENE_UTIL_STREAMARRAY_H #define CLUCENE_UTIL_STREAMARRAY_H #include #include "CLucene/util/CLStreams.h" #include "CLucene/util/Array.h" CL_NS_DEF(util) template ValueArray streamArray(CL_NS(util)::CLStream* stored) { size_t const block_size = 4096; element const* retrieved; ValueArray result(0); size_t available; size_t offset = 0; do { available = stored->read(retrieved, block_size, block_size); result.resize(result.length + sizeof(element) * available); memcpy(result.values + offset, retrieved, sizeof(element) * available); offset += available; } while (block_size == available); return result; } CL_NS_END #endif clucene-core-2.3.3.4/src/contribs-lib/CMakeLists.txt000066400000000000000000000105421154025176300221510ustar00rootroot00000000000000PROJECT(clucene-contribs-lib) INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS} -DMAKE_CLUCENE_CONTRIBS_LIB) set(CMAKE_MODULE_PATH "${clucene-contribs-lib_SOURCE_DIR}/cmake") #add the files to our groups and core SOURCE_GROUP("analysis" ./CLucene/analysis/*) SOURCE_GROUP("util" ./CLucene/util/*) #seems to be a bug in cmake, can't put these in analysis\\standard folder :( SOURCE_GROUP("analysis-cjk" ./CLucene/analysis/cjk/*) SOURCE_GROUP("analysis-de" ./CLucene/analysis/de/*) SOURCE_GROUP("highlighter" ./CLucene/highlighter/*) SOURCE_GROUP("index" ./CLucene/index/*) SOURCE_GROUP("snowball" ./CLucene/snowball/*) SOURCE_GROUP("snowball-impl" ./CLucene/snowball/include/*) SOURCE_GROUP("snowball-impl" ./CLucene/snowball/libstemmer/*) SOURCE_GROUP("snowball-impl" ./CLucene/snowball/runtime/*) SOURCE_GROUP("snowball-impl" ./CLucene/snowball/src_c/*) SET(clucene_contribs_Files ./CLucene/util/gzipcompressstream.cpp ./CLucene/util/gzipinputstream.cpp ./CLucene/analysis/LanguageBasedAnalyzer.cpp ./CLucene/analysis/cjk/CJKAnalyzer.cpp ./CLucene/analysis/de/GermanAnalyzer.cpp ./CLucene/analysis/de/GermanStemFilter.cpp ./CLucene/analysis/de/GermanStemmer.cpp ./CLucene/highlighter/Encoder.cpp ./CLucene/highlighter/Formatter.cpp ./CLucene/highlighter/Fragmenter.cpp ./CLucene/highlighter/Highlighter.cpp ./CLucene/highlighter/QueryScorer.cpp ./CLucene/highlighter/QueryTermExtractor.cpp ./CLucene/highlighter/SimpleFragmenter.cpp ./CLucene/highlighter/SimpleHTMLEncoder.cpp ./CLucene/highlighter/SimpleHTMLFormatter.cpp ./CLucene/highlighter/TextFragment.cpp ./CLucene/highlighter/TokenGroup.cpp ./CLucene/highlighter/TokenSources.cpp ./CLucene/highlighter/WeightedTerm.cpp ./CLucene/snowball/Snowball.cpp ./CLucene/snowball/libstemmer/libstemmer.c ./CLucene/snowball/runtime/api.c ./CLucene/snowball/runtime/utilities.c ./CLucene/snowball/src_c/stem_ISO_8859_1_danish.c ./CLucene/snowball/src_c/stem_ISO_8859_1_dutch.c ./CLucene/snowball/src_c/stem_ISO_8859_1_english.c ./CLucene/snowball/src_c/stem_ISO_8859_1_finnish.c ./CLucene/snowball/src_c/stem_ISO_8859_1_french.c ./CLucene/snowball/src_c/stem_ISO_8859_1_german.c ./CLucene/snowball/src_c/stem_ISO_8859_1_italian.c ./CLucene/snowball/src_c/stem_ISO_8859_1_norwegian.c ./CLucene/snowball/src_c/stem_ISO_8859_1_porter.c ./CLucene/snowball/src_c/stem_ISO_8859_1_portuguese.c ./CLucene/snowball/src_c/stem_ISO_8859_1_spanish.c ./CLucene/snowball/src_c/stem_ISO_8859_1_swedish.c ./CLucene/snowball/src_c/stem_KOI8_R_russian.c ./CLucene/snowball/src_c/stem_UTF_8_danish.c ./CLucene/snowball/src_c/stem_UTF_8_dutch.c ./CLucene/snowball/src_c/stem_UTF_8_english.c ./CLucene/snowball/src_c/stem_UTF_8_finnish.c ./CLucene/snowball/src_c/stem_UTF_8_french.c ./CLucene/snowball/src_c/stem_UTF_8_german.c ./CLucene/snowball/src_c/stem_UTF_8_italian.c ./CLucene/snowball/src_c/stem_UTF_8_norwegian.c ./CLucene/snowball/src_c/stem_UTF_8_porter.c ./CLucene/snowball/src_c/stem_UTF_8_portuguese.c ./CLucene/snowball/src_c/stem_UTF_8_russian.c ./CLucene/snowball/src_c/stem_UTF_8_spanish.c ./CLucene/snowball/src_c/stem_UTF_8_swedish.c ) SET ( clucene_contrib_extra_libs clucene-core clucene-shared ${EXTRA_LIBS}) #find our headers file(GLOB_RECURSE HEADERS ${clucene-contribs-lib_SOURCE_DIR}/*.h) #add extra capabilities find_package(ZLIB) IF ( NOT ZLIB_FOUND ) MESSAGE ( FATAL "ZLib not found" ) ENDIF ( NOT ZLIB_FOUND ) INCLUDE_DIRECTORIES( ${ZLIB_INCLUDE_DIR} ) SET ( clucene_contrib_extra_libs "${clucene_contrib_extra_libs}" ${ZLIB_LIBRARIES} ) find_package(Iconv) #find_package(Strigi) SET ( clucene-contrib-libs "" ) IF ( USE_SHARED_OBJECT_FILES ) GET_SHARED_FILES(clucene_shared_Files) ENDIF ( USE_SHARED_OBJECT_FILES ) #create the libraries INCLUDE_DIRECTORIES( ${clucene_SOURCE_DIR}/src/core ) INCLUDE_DIRECTORIES( ${clucene_SOURCE_DIR}/src/contribs-lib ) add_library(clucene-contribs-lib SHARED ${clucene_contribs_Files} ${clucene_shared_Files} ${HEADERS} ) TARGET_LINK_LIBRARIES(clucene-contribs-lib ${clucene_contrib_extra_libs}) #set properties on the libraries SET_TARGET_PROPERTIES(clucene-contribs-lib PROPERTIES VERSION ${CLUCENE_VERSION} SOVERSION ${CLUCENE_SOVERSION} COMPILE_DEFINITIONS_DEBUG _DEBUG ) clucene-core-2.3.3.4/src/contribs-lib/cmake/000077500000000000000000000000001154025176300204675ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs-lib/cmake/FindIconv.cmake000066400000000000000000000027331154025176300233550ustar00rootroot00000000000000# - Try to find Iconv # Once done this will define # # ICONV_FOUND - system has Iconv # ICONV_INCLUDE_DIR - the Iconv include directory # ICONV_LIBRARIES - Link these to use Iconv # ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const # include(CheckCXXSourceCompiles) IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) # Already in cache, be silent SET(ICONV_FIND_QUIETLY TRUE) ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) FIND_PATH(ICONV_INCLUDE_DIR iconv.h) FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c) IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) SET(ICONV_FOUND TRUE) ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) IF(ICONV_FOUND) check_cxx_source_compiles(" #include int main(){ iconv_t conv = 0; const char* in = 0; size_t ilen = 0; char* out = 0; size_t olen = 0; iconv(conv, &in, &ilen, &out, &olen); return 0; } " ICONV_SECOND_ARGUMENT_IS_CONST ) ENDIF(ICONV_FOUND) set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_LIBRARIES) IF(ICONV_FOUND) IF(NOT ICONV_FIND_QUIETLY) MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") ENDIF(NOT ICONV_FIND_QUIETLY) ELSE(ICONV_FOUND) IF(Iconv_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find Iconv") ENDIF(Iconv_FIND_REQUIRED) ENDIF(ICONV_FOUND) MARK_AS_ADVANCED( ICONV_INCLUDE_DIR ICONV_LIBRARIES ICONV_SECOND_ARGUMENT_IS_CONST ) clucene-core-2.3.3.4/src/contribs/000077500000000000000000000000001154025176300166435ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs/CMakeLists.txt000066400000000000000000000001461154025176300214040ustar00rootroot00000000000000ADD_SUBDIRECTORY (contribs-lib-test EXCLUDE_FROM_ALL) ADD_SUBDIRECTORY (benchmarker EXCLUDE_FROM_ALL) clucene-core-2.3.3.4/src/contribs/bashscripts/000077500000000000000000000000001154025176300211705ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs/bashscripts/findPatchThatBrokeUnitTest.sh000066400000000000000000000060421154025176300267320ustar00rootroot00000000000000#! /bin/bash # # (c) Jos van den Oever # modified by (c) Ben van Klinken revisions if (( $? != 0 )); then exit; fi for REVISION in `cat revisions`; do runTest $REVISION; done echo No revision was found in which the unit test worked. clucene-core-2.3.3.4/src/contribs/bashscripts/simpleupdate.sh000066400000000000000000000016001154025176300242150ustar00rootroot00000000000000#! /bin/bash # this test checks if the strigicmd utility properly detect creation and # deletion of a file function fail() { echo Test failed exit 1 } STRIGICMD="`find -type f -name strigicmd -type f -perm -o+x` " echo Using $STRIGICMD NTHREADS=1 rm -r x y 2> /dev/null mkdir x touch x/y touch x/z echo == $STRIGICMD create -t clucene -d y x == if ! $STRIGICMD create -j 1 -t clucene -d y x; then fail fi echo == $STRIGICMD listFiles -t clucene -d y == if ! $STRIGICMD listFiles -t clucene -d y; then fail fi rm x/y echo == $STRIGICMD update -j $NTHREADS -t clucene -d y x == if ! $STRIGICMD update -j $NTHREADS -t clucene -d y x; then fail fi echo == $STRIGICMD listFiles -t clucene -d y == if ! $STRIGICMD listFiles -t clucene -d y; then fail fi OUT=`$STRIGICMD listFiles -t clucene -d y` if [[ $OUT == $'x\nx/z' ]]; then echo Test succesfull exit 0 fi fail clucene-core-2.3.3.4/src/contribs/bashscripts/twofileupdate.sh000066400000000000000000000016631154025176300244060ustar00rootroot00000000000000#! /bin/bash # this test checks if the strigicmd utility properly detect creation and # deletion of a file function fail() { echo Test failed exit 1 } #VG="valgrind --db-attach=yes " rm -r x y mkdir x touch x/y touch x/z echo == src/strigicmd/strigicmd create -t clucene -d y x == if ! $VG src/strigicmd/strigicmd create -t clucene -d y x; then fail fi echo == src/strigicmd/strigicmd listFiles -t clucene -d y == if ! $VG src/strigicmd/strigicmd listFiles -t clucene -d y; then fail fi sleep 1 touch x/y touch x/z echo == src/strigicmd/strigicmd update -t clucene -d y x == exit if ! $VG src/strigicmd/strigicmd update -t clucene -d y x; then fail fi echo == src/strigicmd/strigicmd listFiles -t clucene -d y == if ! $VG src/strigicmd/strigicmd listFiles -t clucene -d y; then fail fi OUT=`$VG src/strigicmd/strigicmd listFiles -t clucene -d y` if [[ $OUT == 'x/z' ]]; then echo Test succesfull exit 0 fi fail clucene-core-2.3.3.4/src/contribs/benchmarker/000077500000000000000000000000001154025176300211245ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs/benchmarker/Benchmarker.cpp000066400000000000000000000020631154025176300240520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "stdafx.h" #include "Benchmarker.h" #include "Unit.h" void Benchmarker::Add(Unit* unit){ tests.push_back(unit); } Benchmarker::Benchmarker(void) { reset(); } void Benchmarker::reset(){ timerTotal.reset(); testsCountTotal=0; testsCountSuccess=0; testsRunTotal=0; testsRunSuccess=0; } bool Benchmarker::run(){ timerTotal.start(); printf( ">> running tests...\n" ); for ( int i=0;istart(this); unit->stop(); } printf( "\n>> benchmarker ran a total of %d test cases(%d successes) in %d ms\n", testsCountTotal,testsCountSuccess, (int32_t)timerTotal.interval() ); timerTotal.stop(); return testsCountSuccess > 0; } clucene-core-2.3.3.4/src/contribs/benchmarker/Benchmarker.h000066400000000000000000000012021154025176300235110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #pragma once class Benchmarker { lucene::util::CLVector tests; public: Timer timerTotal; int testsCountTotal; int testsCountSuccess; int testsRunTotal; int testsRunSuccess; Benchmarker(void); void Add(Unit* unit); bool run(); void reset(); }; clucene-core-2.3.3.4/src/contribs/benchmarker/CMakeLists.txt000066400000000000000000000007531154025176300236710ustar00rootroot00000000000000PROJECT(clucene-benchmarker) INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS}) file(GLOB_RECURSE benchmarker_HEADERS ${clucene-benchmarker_SOURCE_DIR}/*.h) SET(benchmarker_files ./Benchmarker.cpp ./Main.cpp ./stdafx.cpp ./Unit.cpp ./TestCLString.cpp ${benchmarker_HEADERS} ) ADD_EXECUTABLE(cl_benchmarker EXCLUDE_FROM_ALL ${benchmarker_files} ) TARGET_LINK_LIBRARIES(cl_benchmarker clucene-core clucene-shared ${EXTRA_LIBS}) clucene-core-2.3.3.4/src/contribs/benchmarker/Main.cpp000066400000000000000000000064221154025176300225200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "stdafx.h" #include "TestCLString.h" #ifdef COMPILER_MSVC #ifdef _DEBUG #define CRTDBG_MAP_ALLOC #include #include #endif #endif #include #include #ifdef _CL_HAVE_DIRECT_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_IO_H #include #endif using namespace std; using namespace lucene::util; const char* cl_tempDir; char clucene_data_location[1024]; int main( int argc, char** argv ){ //Dumper Debug #ifdef COMPILER_MSVC #ifdef _DEBUG _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );//| _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF ); #endif #endif Benchmarker bench; TestCLString clstring; bool ret_result = false; cl_tempDir = NULL; if ( Misc::dir_Exists("/tmp") ) cl_tempDir = "/tmp"; if ( getenv("TEMP") != NULL ) cl_tempDir = getenv("TEMP"); else if ( getenv("TMP") != NULL ) cl_tempDir = getenv("TMP"); char* tmp = _CL_NEWARRAY(char,strlen(cl_tempDir)+9); strcpy(tmp,cl_tempDir); strcat(tmp,"/clucene"); _mkdir(tmp); if ( Misc::dir_Exists(tmp) ) cl_tempDir=tmp; clucene_data_location[0]=0; if ( CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION1 "/reuters-21578-index/segments") ) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION1); else if ( CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION2 "/reuters-21578-index/segments") ) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION2); else if ( CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION3 "/reuters-21578-index/segments") ) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION3); else if ( getenv(CLUCENE_DATA_LOCATIONENV) != NULL ){ strcpy(clucene_data_location,getenv(CLUCENE_DATA_LOCATIONENV)); strcat(clucene_data_location,"/data/reuters-21578-index/segments"); if ( CL_NS(util)::Misc::dir_Exists( clucene_data_location ) ){ strcpy(clucene_data_location, getenv(CLUCENE_DATA_LOCATIONENV)); strcat(clucene_data_location, "/data"); }else clucene_data_location[0]=0; } /* first check that we are running the test for the correct position */ //todo: make this configurable if ( !*clucene_data_location ){ fprintf(stderr,"%s must be run from a subdirectory of the application's root directory\n",argv[0]); fprintf(stderr,"ensure that the test data exists in %s or %s or %s\n",CLUCENE_DATA_LOCATION1, CLUCENE_DATA_LOCATION2, CLUCENE_DATA_LOCATION3); if ( getenv(CLUCENE_DATA_LOCATIONENV) != NULL ) fprintf(stderr,"%s/data was also checked because of the " CLUCENE_DATA_LOCATIONENV " environment variable", getenv(CLUCENE_DATA_LOCATIONENV)); ret_result = 1; goto exit_point; } bench.Add(&clstring); ret_result = bench.run(); exit_point: _lucene_shutdown(); //clears all static memory //print lucenebase debug return ret_result ? 0 : 1; //Debuggin techniques: //For msvc, use this for breaking on memory leaks: // _crtBreakAlloc //for linux, use valgrind } clucene-core-2.3.3.4/src/contribs/benchmarker/TestCLString.cpp000066400000000000000000000027721154025176300241650ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "stdafx.h" using namespace lucene::util; using namespace lucene::analysis; using namespace lucene::document; using namespace lucene::index; using namespace lucene::store; int BenchmarkDocumentWriter(Timer* timerCase) { RAMDirectory ram; SimpleAnalyzer an; IndexWriter* ndx = _CLNEW IndexWriter(&ram, &an, true); ndx->setMaxFieldLength(0x7FFFFFFF); char fname[1024]; strcpy(fname, clucene_data_location); strcat(fname, "reuters-21578/feldman-cia-worldfactbook-data.txt"); timerCase->start(); for ( int i=0;i<10;i++ ){ FileReader* reader = _CLNEW FileReader(fname, "ASCII"); Document doc; doc.add(*_CLNEW Field(_T("contents"),reader, Field::STORE_YES | Field::INDEX_TOKENIZED)); ndx->addDocument(&doc); } ndx->close(); timerCase->stop(); ram.close(); _CLDELETE(ndx); return 0; } int BenchmarkTermDocs(Timer* timerCase){ IndexReader* reader = IndexReader::open("index"); timerCase->start(); TermEnum* en = reader->terms(); while (en->next()){ Term* term = en->term(); _CLDECDELETE(term); } en->close(); _CLDELETE(en); timerCase->stop(); reader->close(); _CLDELETE(reader); return 0; } clucene-core-2.3.3.4/src/contribs/benchmarker/TestCLString.h000066400000000000000000000013361154025176300236250ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #pragma once int BenchmarkDocumentWriter(Timer*); int BenchmarkTermDocs(Timer* timerCase); class TestCLString:public Unit { protected: void runTests(){ this->runTest("BenchmarkDocumentWriter",BenchmarkDocumentWriter,10); //this->runTest("BenchmarkTermDocs",BenchmarkTermDocs,100); } public: const char* getName(){ return "TestCLString"; } }; clucene-core-2.3.3.4/src/contribs/benchmarker/Timer.h000066400000000000000000000021231154025176300223530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #pragma once class Timer{ public: int64_t startTime; int64_t stopTime; bool running; Timer(){ running=false; reset(); } void reset(){ startTime=0; stopTime=0; running=false; } void start(){ startTime = lucene::util::Misc::currentTimeMillis(); running=true; } int32_t split(){ return lucene::util::Misc::currentTimeMillis()-startTime; } int32_t stop(){ if ( running ){ running=false; stopTime = lucene::util::Misc::currentTimeMillis(); } return stopTime-startTime; } int32_t interval(){ if (running) return lucene::util::Misc::currentTimeMillis()-startTime; else return stopTime-startTime; } }; typedef int (*PTEST_ROUTINE)(Timer*); typedef PTEST_ROUTINE LPTEST_ROUTINE; clucene-core-2.3.3.4/src/contribs/benchmarker/Unit.cpp000066400000000000000000000041751154025176300225560ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "stdafx.h" #include "Unit.h" Unit::Unit() { this->bm=NULL; testsCountTotal=0; testsCountSuccess=0; testsRunTotal=0; testsRunSuccess=0; timerCase.reset(); timerTotal.reset(); } void Unit::stop(){ timerTotal.stop(); bm=NULL; printf( "> unit ran a total of %d test cases(%d successes) in %d ms\n", testsCountTotal,testsCountSuccess, (int)timerTotal.interval() ); } void Unit::start(Benchmarker* bm){ this->bm = bm; timerTotal.start(); printf( "> running unit %s\n", getName() ); runTests(); } void Unit::runTest(const char* testName,LPTEST_ROUTINE func, int iterations){ if ( bm == NULL ) _CLTHROWA(CL_ERR_NullPointer, "Unit not started with benchmarker!"); float avg=0; int32_t min=0; int32_t max=0; int count=0; Timer total; bool success = false; try { total.start(); printf("\n > running %s %d times...", testName, iterations); for ( int i=0;i max ) max = t; avg = (avg + t)/2; } testsRunTotal++; bm->testsRunTotal++; if ( success ){ testsRunSuccess++; bm->testsRunSuccess++; } count++; } success = true; }catch(CLuceneError& err){ printf("\n > error occurred: %s\n", err.what()); }catch(...){ printf("\n > unexpected error occurred\n >"); } testsCountTotal++; bm->testsCountTotal++; if ( success ){ testsCountSuccess++; bm->testsCountSuccess++; } printf(" it took %d milliseconds",total.stop()); if ( iterations > 1 ){ printf("\n\tmin:%d",min); printf(" max:%d,",max); printf(" avg:%0.3f milliseconds",avg); } printf("\n"); } clucene-core-2.3.3.4/src/contribs/benchmarker/Unit.h000066400000000000000000000014421154025176300222150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #pragma once #include "CLucene/util/Misc.h" class Unit { public: void start(Benchmarker* benchmarker); void stop(); virtual const char* getName()=0; Unit(); protected: Timer timerCase; Timer timerTotal; int testsCountTotal; int testsCountSuccess; int testsRunTotal; int testsRunSuccess; Benchmarker* bm; void runTest(const char* testName,LPTEST_ROUTINE func, int iterations); virtual void runTests()=0; }; clucene-core-2.3.3.4/src/contribs/benchmarker/stdafx.cpp000066400000000000000000000010771154025176300231260ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ // stdafx.cpp : source file that includes just the standard includes // demo.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" clucene-core-2.3.3.4/src/contribs/benchmarker/stdafx.h000066400000000000000000000023601154025176300225670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #ifndef _lucene_examples_benchmark_stdafx_ #define _lucene_examples_benchmark_stdafx_ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include //#include #include #include "CLucene.h" #include "CLucene/_clucene-config.h" #include "CLucene/util/Misc.h" #include "CLucene/store/RAMDirectory.h" #define CLUCENE_DATA_LOCATION1 "../../src/test/data/" #define CLUCENE_DATA_LOCATION2 "../src/test/data/" #define CLUCENE_DATA_LOCATION3 "../../../src/test/data/" #define CLUCENE_DATA_LOCATIONENV "srcdir" extern const char* cl_tempDir; extern char clucene_data_location[1024]; class Benchmarker; #include "Timer.h" #include "Unit.h" #include "Benchmarker.h" #endif clucene-core-2.3.3.4/src/contribs/contribs-lib-test/000077500000000000000000000000001154025176300222075ustar00rootroot00000000000000clucene-core-2.3.3.4/src/contribs/contribs-lib-test/CMakeLists.txt000066400000000000000000000020371154025176300247510ustar00rootroot00000000000000PROJECT(clucene-contribs-lib-test) INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS}) INCLUDE_DIRECTORIES( ${clucene-contribs-lib-test_SOURCE_DIR} ) INCLUDE_DIRECTORIES( ${clucene-contribs-lib_SOURCE_DIR} ) file(GLOB_RECURSE test_HEADERS ${CMAKE_SOURCE_DIR}/test/*.h) SET(test_files ./contribTests.cpp ./TestHighlight.cpp ./TestSnowball.cpp ./TestStreams.cpp ./TestUtf8.cpp ./TestAnalysis.cpp ./CuTest.cpp ./testall.cpp ${test_HEADERS} ) IF ( USE_SHARED_OBJECT_FILES ) GET_SHARED_FILES(clucene_shared_Files) ENDIF ( USE_SHARED_OBJECT_FILES ) #todo: do glob header and include header files for IDE. ADD_EXECUTABLE(cl_contribs-lib-test EXCLUDE_FROM_ALL ${clucene_shared_Files} ${test_files} ) #link the executable against the releavent clucene-shared library (if we aren't using the object files) IF ( NOT USE_SHARED_OBJECT_FILES ) TARGET_LINK_LIBRARIES(cl_contribs-lib-test clucene-core clucene-shared clucene-contribs-lib ${EXTRA_LIBS}) ENDIF ( NOT USE_SHARED_OBJECT_FILES ) clucene-core-2.3.3.4/src/contribs/contribs-lib-test/CuTest.cpp000066400000000000000000000371011154025176300241240ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CuTest.h" #include #include static int verbose = 0; static int messyPrinting = 0; void CuInit(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) { if (!strcmp(argv[i], "-v")) { verbose = 1; } if (!strcmp(argv[i], "-p")) { messyPrinting = 1; } } } /*-------------------------------------------------------------------------* * CuTcs *-------------------------------------------------------------------------*/ TCHAR* CuStrAlloc(int size) { TCHAR* n = (TCHAR*) malloc(sizeof (TCHAR) * (size)); return n; } TCHAR* CuTcsCopy(TCHAR* old) { int len = _tcslen(old); TCHAR* n = CuStrAlloc(len + 1); _tcscpy(n, old); return n; } TCHAR* CuTcsCat(TCHAR* orig, TCHAR* add) { int len = _tcslen(orig) + _tcslen(add); TCHAR* n = CuStrAlloc(len + 1); _tcscpy(n, orig); _tcscat(n, add); return n; } /*-------------------------------------------------------------------------* * CuString *-------------------------------------------------------------------------*/ TCHAR* CuTcsAlloc(int size) { TCHAR* n = (TCHAR*) malloc(sizeof (TCHAR) * (size)); return n; } TCHAR* CuTcsCopy(const TCHAR* old) { int len = _tcslen(old); TCHAR* n = CuTcsAlloc(len + 1); _tcscpy(n, old); return n; } /*-------------------------------------------------------------------------* * CuString *-------------------------------------------------------------------------*/ void CuStringInit(CuString* str) { str->length = 0; str->size = STRING_MAX; str->buffer = (TCHAR*) malloc(sizeof (TCHAR) * str->size); str->buffer[0] = '\0'; } CuString* CuStringNew(void) { CuString* str = (CuString*) malloc(sizeof (CuString)); str->length = 0; str->size = STRING_MAX; str->buffer = (TCHAR*) malloc(sizeof (TCHAR) * str->size); str->buffer[0] = '\0'; return str; } void CuStringFree(CuString* str) { free(str->buffer); free(str); } void CuStringResize(CuString* str, int newSize) { str->buffer = (TCHAR*) realloc(str->buffer, sizeof (TCHAR) * newSize); str->size = newSize; } void CuStringAppend(CuString* str, const TCHAR* text) { int length = _tcslen(text); if (str->length + length + 1 >= str->size) CuStringResize(str, str->length + length + 1 + STRING_INC); str->length += length; _tcscat(str->buffer, text); } void CuStringAppendChar(CuString* str, TCHAR ch) { TCHAR text[2]; text[0] = ch; text[1] = '\0'; CuStringAppend(str, text); } void CuStringAppendFormat(CuString* str, const TCHAR* format, ...) { TCHAR buf[HUGE_STRING_LEN]; va_list argp; va_start(argp, format); _vsntprintf(buf, HUGE_STRING_LEN, format, argp); va_end(argp); CuStringAppend(str, buf); } void CuStringRead(CuString *str, TCHAR *path) { path = NULL; CU_TDUP(path, str->buffer); } /*-------------------------------------------------------------------------* * CuTest *-------------------------------------------------------------------------*/ void CuTestInit(CuTest* t, const TCHAR* name, TestFunction function) { t->name = CuTcsCopy(name); t->notimpl = 0; t->failed = 0; t->ran = 0; t->message = NULL; t->function = function; // t->jumpBuf = NULL; } CuTest* CuTestNew(const TCHAR* name, TestFunction function) { CuTest* tc = CU_ALLOC(CuTest); CuTestInit(tc, name, function); return tc; } void CuTestDelete(CuTest* tst) { free(tst->name); if (tst->message != NULL) free(tst->message); free(tst); } void CuNotImpl(CuTest* tc, const TCHAR* message) { CuString* newstr = CuStringNew(); CuStringAppend(newstr, message); CuStringAppend(newstr, _T(" not implemented on this platform")); tc->notimpl = 1; CuMessage(tc, newstr->buffer); CuStringFree(newstr); // if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); } void CuFail(CuTest* tc, const TCHAR* format, ...) { tc->failed = 1; TCHAR buf[HUGE_STRING_LEN]; va_list argp; va_start(argp, format); _vsntprintf(buf, HUGE_STRING_LEN, format, argp); va_end(argp); // CuMessage(tc,buf); _CLTHROWT(CL_ERR_Runtime, buf); } void CuMessageV(CuTest* tc, const TCHAR* format, va_list& argp) { TCHAR buf[HUGE_STRING_LEN]; _vsntprintf(buf, HUGE_STRING_LEN, format, argp); TCHAR* old = tc->message; if (messyPrinting) { _tprintf(_T("%s"), buf); } else { if (old == NULL) { tc->message = CuTcsCopy(buf); } else { tc->message = CuTcsCat(old, buf); free(old); } } } void CuMessage(CuTest* tc, const TCHAR* format, ...) { va_list argp; va_start(argp, format); CuMessageV(tc, format, argp); va_end(argp); } void CuMessageA(CuTest* tc, const char* format, ...) { va_list argp; char buf[HUGE_STRING_LEN]; TCHAR tbuf[HUGE_STRING_LEN]; va_start(argp, format); vsprintf(buf, format, argp); va_end(argp); TCHAR* old = tc->message; STRCPY_AtoT(tbuf, buf, HUGE_STRING_LEN); if (messyPrinting) { _tprintf(_T("%s"), buf); } else { if (old == NULL) { tc->message = CuTcsCopy(tbuf); } else { tc->message = CuTcsCat(old, tbuf); free(old); } } } void CuAssert(CuTest* tc, const TCHAR* message, int condition) { if (condition) return; CuFail(tc, message); } void CuAssertTrue(CuTest* tc, int condition) { if (condition) return; CuFail(tc, _T("assert failed")); } void CuAssertStrEquals(CuTest* tc, const TCHAR* preMessage, const TCHAR* expected, const TCHAR* actual) { CuString* message; if (_tcscmp(expected, actual) == 0) return; message = CuStringNew(); CuStringAppend(message, preMessage); CuStringAppend(message, _T(" : ")); CuStringAppend(message, _T("expected\n---->\n")); CuStringAppend(message, expected); CuStringAppend(message, _T("\n<----\nbut saw\n---->\n")); CuStringAppend(message, actual); CuStringAppend(message, _T("\n<----")); CuFail(tc, message->buffer); CuStringFree(message); } void CuAssertIntEquals(CuTest* tc, const TCHAR* preMessage, int expected, int actual) { TCHAR buf[STRING_MAX]; if (expected == actual) return; _sntprintf(buf, STRING_MAX, _T("%s : expected <%d> but was <%d>"), preMessage, expected, actual); CuFail(tc, buf); } void CuAssertPtrEquals(CuTest* tc, const TCHAR* preMessage, const void* expected, const void* actual) { TCHAR buf[STRING_MAX]; if (expected == actual) return; _sntprintf(buf, STRING_MAX, _T("%s : expected pointer <%p> but was <%p>"), preMessage, expected, actual); CuFail(tc, buf); } void CuAssertPtrNotNull(CuTest* tc, const TCHAR* preMessage, const void* pointer) { TCHAR buf[STRING_MAX]; if (pointer != NULL) return; _sntprintf(buf, STRING_MAX, _T("%s : null pointer unexpected, but was <%p>"), preMessage, pointer); CuFail(tc, buf); } void CuTestRun(CuTest* tc) { // jmp_buf buf; // tc->jumpBuf = &buf; // if (setjmp(buf) == 0) // { tc->ran = 1; (tc->function)(tc); // } // tc->jumpBuf = 0; } /*-------------------------------------------------------------------------* * CuSuite *-------------------------------------------------------------------------*/ void CuSuiteInit(CuSuite* testSuite, const TCHAR *name) { testSuite->name = NULL; CU_TDUP(testSuite->name, name); testSuite->count = 0; testSuite->failCount = 0; testSuite->notimplCount = 0; testSuite->timeTaken = 0; } CuSuite* CuSuiteNew(const TCHAR *name) { CuSuite* testSuite = CU_ALLOC(CuSuite); CuSuiteInit(testSuite, name); return testSuite; } void CuSuiteDelete(CuSuite* suite) { free(suite->name); for (int i = 0; i < suite->count; i++) { CuTestDelete(suite->list[i]); } free(suite); } void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase) { assert(testSuite->count < MAX_TEST_CASES); testSuite->list[testSuite->count] = testCase; testSuite->count++; } void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2) { int i; for (i = 0; i < testSuite2->count; ++i) { CuTest* testCase = testSuite2->list[i]; CuSuiteAdd(testSuite, testCase); } } void CuSuiteRun(CuSuite* testSuite) { int i; uint64_t start = Misc::currentTimeMillis(); for (i = 0; i < testSuite->count; ++i) { CuTest* testCase = testSuite->list[i]; try { CuTestRun(testCase); } catch (CLuceneError& err) { testCase->failed = 1; CuMessage(testCase, err.twhat()); } testSuite->timeTaken = Misc::currentTimeMillis() - start; if (testCase->failed) { testSuite->failCount += 1; } if (testCase->notimpl) { testSuite->notimplCount += 1; } } } void CuSuiteSummary(CuSuite* testSuite, CuString* summary, bool times) { int i; for (i = 0; i < testSuite->count; ++i) { CuTest* testCase = testSuite->list[i]; CuStringAppend(summary, testCase->failed ? _T("F") : testCase->notimpl ? _T("N") : _T(".")); } if (times) { int bufferLen = 25 - summary->length - 10; for (int i = 0; i < bufferLen; i++) CuStringAppend(summary, _T(" ")); CuStringAppendFormat(summary, _T(" - %dms"), testSuite->timeTaken); } CuStringAppend(summary, _T("\n")); } void CuSuiteOverView(CuSuite* testSuite, CuString* details) { CuStringAppendFormat(details, _T("%d %s run: %d passed, %d failed, ") _T("%d not implemented.\n"), testSuite->count, testSuite->count == 1 ? "test" : "tests", testSuite->count - testSuite->failCount - testSuite->notimplCount, testSuite->failCount, testSuite->notimplCount); } void CuSuiteDetails(CuSuite* testSuite, CuString* details) { int i; int failCount = 0; if (testSuite->failCount != 0 && verbose) { CuStringAppendFormat(details, _T("\nFailed tests in %s:\n"), testSuite->name); for (i = 0; i < testSuite->count; ++i) { CuTest* testCase = testSuite->list[i]; if (testCase->failed) { failCount++; CuStringAppendFormat(details, _T("%d) %s: %s\n"), failCount, testCase->name, testCase->message); } } } if (testSuite->notimplCount != 0 && verbose) { CuStringAppendFormat(details, _T("\nNot Implemented tests in %s:\n"), testSuite->name); for (i = 0; i < testSuite->count; ++i) { CuTest* testCase = testSuite->list[i]; if (testCase->notimpl) { failCount++; CuStringAppendFormat(details, _T("%d) %s: %s\n"), failCount, testCase->name, testCase->message); } } } } /*-------------------------------------------------------------------------* * CuSuiteList *-------------------------------------------------------------------------*/ CuSuiteList* CuSuiteListNew(const TCHAR *name) { CuSuiteList* testSuite = CU_ALLOC(CuSuiteList); testSuite->name = NULL; CU_TDUP(testSuite->name, name); testSuite->count = 0; return testSuite; } void CuSuiteListDelete(CuSuiteList* lst) { free(lst->name); for (int i = 0; i < lst->count; i++) { CuSuiteDelete(lst->list[i]); } free(lst); } void CuSuiteListAdd(CuSuiteList *suites, CuSuite *origsuite) { assert(suites->count < MAX_TEST_CASES); suites->list[suites->count] = origsuite; suites->count++; } void CuSuiteListRun(CuSuiteList* testSuite) { int i; for (i = 0; i < testSuite->count; ++i) { CuSuite* testCase = testSuite->list[i]; CuSuiteRun(testCase); } } static const TCHAR *genspaces(int i) { TCHAR *str = (TCHAR*) malloc((i + 1) * sizeof (TCHAR)); for (int j = 0; j < i; j++) str[j] = _T(' '); str[i] = '\0'; return str; } void CuSuiteListRunWithSummary(CuSuiteList* testSuite, bool verbose, bool times) { int i; _tprintf(_T("%s:\n"), testSuite->name); for (i = 0; i < testSuite->count; ++i) { bool hasprinted = false; CuSuite* testCase = testSuite->list[i]; CuString *str = CuStringNew(); size_t len = _tcslen(testCase->name); const TCHAR* spaces = len > 31 ? NULL : genspaces(31 - len); _tprintf(_T(" %s:%s"), testCase->name, len > 31 ? _T("") : spaces); free((void*) spaces); fflush(stdout); CuSuiteRun(testCase); if (verbose) { for (int i = 0; i < testCase->count; i++) { if (testCase->list[i]->ran) { if (testCase->list[i]->message != NULL) { if (!hasprinted) printf("\n"); _tprintf(_T(" %s:\n"), testCase->list[i]->name); TCHAR* msg = testCase->list[i]->message; bool nl = true; //write out message, indenting on new lines while (*msg != '\0') { if (nl) { printf(" "); nl = false; } if (*msg == '\n') nl = true; putc(*msg, stdout); msg++; } if (testCase->list[i]->message[_tcslen(testCase->list[i]->message) - 1] != '\n') printf("\n"); hasprinted = true; } } } } CuSuiteSummary(testCase, str, times); if (hasprinted) _tprintf(_T(" Result: %s\n"), str->buffer); else _tprintf(_T(" %s"), str->buffer); CuStringFree(str); } _tprintf(_T("\n")); } int CuSuiteListDetails(CuSuiteList* testSuite, CuString* details) { int i; int failCount = 0; int notImplCount = 0; int count = 0; for (i = 0; i < testSuite->count; ++i) { failCount += testSuite->list[i]->failCount; notImplCount += testSuite->list[i]->notimplCount; count += testSuite->list[i]->count; } CuStringAppendFormat(details, _T("%d %s run: %d passed, %d failed, ") _T("%d not implemented.\n"), count, count == 1 ? _T("test") : _T("tests"), count - failCount - notImplCount, failCount, notImplCount); if (failCount != 0 && verbose) { for (i = 0; i < testSuite->count; ++i) { CuString *str = CuStringNew(); CuSuite* testCase = testSuite->list[i]; if (testCase->failCount) { CuSuiteDetails(testCase, str); CuStringAppend(details, str->buffer); } CuStringFree(str); } } if (notImplCount != 0 && verbose) { for (i = 0; i < testSuite->count; ++i) { CuString *str = CuStringNew(); CuSuite* testCase = testSuite->list[i]; if (testCase->notimplCount) { CuSuiteDetails(testCase, str); CuStringAppend(details, str->buffer); } CuStringFree(str); } } return failCount; } clucene-core-2.3.3.4/src/contribs/contribs-lib-test/CuTest.h000066400000000000000000000076661154025176300236060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CU_TEST_H #define CU_TEST_H /* CuString */ TCHAR* CuWstrAlloc(int size); TCHAR* CuWstrCopy(const TCHAR* old); #define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE))) #define CU_TDUP(dest,src) dest=((TCHAR*)malloc(sizeof(TCHAR)*_tcslen(src)+sizeof(TCHAR)));_tcscpy(dest,src); #define HUGE_STRING_LEN 8192 #define STRING_MAX 256 #define STRING_INC 256 #define CLUCENE_ASSERT(x) CuAssert(tc,_T("Assert Failed: ") _T(#x),x) typedef struct { int length; int size; TCHAR* buffer; } CuString; void CuStringInit(CuString* str); CuString* CuStringNew(void); void CuStringFree(CuString* str); void CuStringRead(CuString* str, TCHAR* path); void CuStringAppend(CuString* str, const TCHAR* text); void CuStringAppendChar(CuString* str, TCHAR ch); void CuStringAppendFormat(CuString* str, const TCHAR* format, ...); void CuStringResize(CuString* str, int newSize); /* CuTest */ typedef struct CuTest CuTest; typedef void (*TestFunction)(CuTest *); struct CuTest { TCHAR* name; TestFunction function; int notimpl; int failed; int ran; TCHAR* message; // jmp_buf *jumpBuf; }; void CuInit(int argc, char *argv[]); void CuTestInit(CuTest* t, const TCHAR* name, TestFunction function); CuTest* CuTestNew(const TCHAR* name, TestFunction function); void CuTestDelete(CuTest* tst); void CuFail(CuTest* tc, const TCHAR* format, ...); void CuMessage(CuTest* tc, const TCHAR* message, ...); void CuMessageV(CuTest* tc, const TCHAR* format, va_list& argp); void CuMessageA(CuTest* tc, const char* format, ...); void CuNotImpl(CuTest* tc, const TCHAR* message); void CuAssert(CuTest* tc, const TCHAR* message, int condition); void CuAssertTrue(CuTest* tc, int condition); void CuAssertStrEquals(CuTest* tc, const TCHAR* preMessage, const TCHAR* expected, const TCHAR* actual); void CuAssertIntEquals(CuTest* tc, const TCHAR* preMessage, int expected, int actual); void CuAssertPtrEquals(CuTest* tc, const TCHAR* preMessage, const void* expected, const void* actual); void CuAssertPtrNotNull(CuTest* tc, const TCHAR* preMessage, const void* pointer); void CuTestRun(CuTest* tc); /* CuSuite */ #define MAX_TEST_CASES 1024 #define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(_T(#TEST), TEST)) extern char clucene_data_location[1024]; typedef struct { TCHAR *name; int count; CuTest * list[MAX_TEST_CASES]; int failCount; int notimplCount; uint64_t timeTaken; } CuSuite; void CuSuiteInit(CuSuite* testSuite, const TCHAR* name); CuSuite* CuSuiteNew(const TCHAR* name); void CuSuiteDelete(CuSuite* suite); void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase); void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2); void CuSuiteRun(CuSuite* testSuite); void CuSuiteSummary(CuSuite* testSuite, CuString* summary, bool times); void CuSuiteOverView(CuSuite* testSuite, CuString* details); void CuSuiteDetails(CuSuite* testSuite, CuString* details); typedef struct { TCHAR *name; int count; CuSuite * list[MAX_TEST_CASES]; } CuSuiteList; struct unittest { const char *testname; CuSuite * (*func)(void); }; CuSuiteList* CuSuiteListNew(const TCHAR* name); void CuSuiteListDelete(CuSuiteList* lst); void CuSuiteListAdd(CuSuiteList* testSuite, CuSuite *testCase); void CuSuiteListRun(CuSuiteList* testSuite); void CuSuiteListRunWithSummary(CuSuiteList* testSuite, bool verbose, bool times); //void CuSuiteListSummary(CuSuiteList* testSuite, CuString* summary); /* Print details of test suite results; returns total number of * tests which failed. */ int CuSuiteListDetails(CuSuiteList* testSuite, CuString* details); #endif /* CU_TEST_H */ clucene-core-2.3.3.4/src/contribs/contribs-lib-test/TestAnalysis.cpp000066400000000000000000000136711154025176300253460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/analysis/cjk/CJKAnalyzer.h" #include "CLucene/analysis/LanguageBasedAnalyzer.h" #include "CLucene/snowball/SnowballFilter.h" #include #ifdef _CL_HAVE_IO_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif #ifdef _CL_HAVE_DIRECT_H #include #endif #include CL_NS_USE2(analysis, cjk) CL_NS_USE2(analysis, snowball) void test(CuTest *tc, char* orig, Reader* reader, bool verbose, int64_t bytes) { StandardAnalyzer analyzer; TokenStream* stream = analyzer.tokenStream(NULL, reader); uint64_t start = Misc::currentTimeMillis(); int32_t count = 0; Token t; char atmp[LUCENE_MAX_WORD_LEN + 1]; TCHAR ttmp[LUCENE_MAX_WORD_LEN + 1]; for (; stream->next(&t);) { if (verbose) { CuMessage(tc, _T("Text=%s start=%d end=%d\n"), t.termBuffer(), t.startOffset(), t.endOffset()); } int len = t.termLength(); //use the lucene strlwr function (so copy to TCHAR first then back) strncpy(atmp, orig + t.startOffset(), len); atmp[len] = 0; STRCPY_AtoT(ttmp, atmp, len + 1); _tcslwr(ttmp); if (_tcsncmp(t.termBuffer(), ttmp, len) != 0) { TCHAR err[1024]; _sntprintf(err, 1024, _T("token '%s' didnt match original text at %d-%d"), t.termBuffer(), t.startOffset(), t.endOffset()); CuAssert(tc, err, false); } // _CLDELETE(t); count++; } uint64_t end = Misc::currentTimeMillis(); int64_t time = end - start; CuMessageA(tc, "%d milliseconds to extract ", time); CuMessageA(tc, "%d tokens\n", count); CuMessageA(tc, "%f microseconds/token\n", (time * 1000.0) / count); CuMessageA(tc, "%f megabytes/hour\n", (bytes * 1000.0 * 60.0 * 60.0) / (time * 1000000.0)); _CLDELETE(stream); } void _testFile(CuTest *tc, const char* fname, bool verbose) { struct fileStat buf; fileStat(fname, &buf); int64_t bytes = buf.st_size; char* orig = _CL_NEWARRAY(char, bytes); { FILE* f = fopen(fname, "rb"); int64_t r = fread(orig, bytes, 1, f); fclose(f); } CuMessageA(tc, " Reading test file containing %d bytes.\n", bytes); jstreams::FileReader fr(fname, "ASCII"); const TCHAR *start; size_t total = 0; int32_t numRead; do { numRead = fr.read(start, 1, 0); if (numRead == -1) break; total += numRead; } while (numRead >= 0); jstreams::FileReader reader(fname, "ASCII"); test(tc, orig, &reader, verbose, total); _CLDELETE_CaARRAY(orig); } void testFile(CuTest *tc) { char loc[1024]; strcpy(loc, clucene_data_location); strcat(loc, "/reuters-21578/feldman-cia-worldfactbook-data.txt"); CuAssert(tc, _T("reuters-21578/feldman-cia-worldfactbook-data.txt does not exist"), Misc::dir_Exists(loc)); _testFile(tc, loc, false); } void _testCJK(CuTest *tc, const char* astr, const char** results, bool ignoreSurrogates = true) { SimpleInputStreamReader r(new AStringReader(astr), SimpleInputStreamReader::UTF8); CJKTokenizer* tokenizer = _CLNEW CJKTokenizer(&r); tokenizer->setIgnoreSurrogates(ignoreSurrogates); int pos = 0; Token tok; TCHAR tres[LUCENE_MAX_WORD_LEN]; while (results[pos] != NULL) { CLUCENE_ASSERT(tokenizer->next(&tok) != NULL); lucene_utf8towcs(tres, results[pos], LUCENE_MAX_WORD_LEN); CuAssertStrEquals(tc, _T("unexpected token value"), tres, tok.termBuffer()); pos++; } CLUCENE_ASSERT(!tokenizer->next(&tok)); _CLDELETE(tokenizer); } void testCJK(CuTest *tc) { //utf16 test //we have a very large unicode character: //xEFFFF = utf8(F3 AF BF BF) = utf16(DB7F DFFF) = utf8(ED AD BF, ED BF BF) static const char* exp3[4] = {"\xED\xAD\xBF\xED\xBF\xBF\xe5\x95\xa4", "\xe5\x95\xa4\xED\xAD\xBF\xED\xBF\xBF", "", NULL}; _testCJK(tc, "\xED\xAD\xBF\xED\xBF\xBF\xe5\x95\xa4\xED\xAD\xBF\xED\xBF\xBF", exp3, false); static const char* exp1[5] = {"test", "t\xc3\xbcrm", "values", NULL}; _testCJK(tc, "test t\xc3\xbcrm values", exp1); static const char* exp2[6] = {"a", "\xe5\x95\xa4\xe9\x85\x92", "\xe9\x85\x92\xe5\x95\xa4", "", "x", NULL}; _testCJK(tc, "a\xe5\x95\xa4\xe9\x85\x92\xe5\x95\xa4x", exp2); } void testLanguageBasedAnalyzer(CuTest* tc) { LanguageBasedAnalyzer a; CL_NS(util)::StringReader reader(_T("he abhorred accentueren")); reader.mark(50); TokenStream* ts; Token t; //test with english a.setLanguage(_T("English")); a.setStem(false); ts = a.tokenStream(_T("contents"), &reader); CLUCENE_ASSERT(ts->next(&t) != NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("he")) == 0); CLUCENE_ASSERT(ts->next(&t) != NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("abhorred")) == 0); _CLDELETE(ts); //now test with dutch reader.reset(0); a.setLanguage(_T("Dutch")); a.setStem(true); ts = a.tokenStream(_T("contents"), &reader); CLUCENE_ASSERT(ts->next(&t) != NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("he")) == 0); CLUCENE_ASSERT(ts->next(&t) != NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("abhorred")) == 0); CLUCENE_ASSERT(ts->next(&t) != NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("accentuer")) == 0); _CLDELETE(ts); } CuSuite *testanalysis(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Analysis Test")); SUITE_ADD_TEST(suite, testFile); SUITE_ADD_TEST(suite, testCJK); SUITE_ADD_TEST(suite, testLanguageBasedAnalyzer); return suite; } // EOF clucene-core-2.3.3.4/src/contribs/contribs-lib-test/TestHighlight.cpp000066400000000000000000000215141154025176300254650ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/store/RAMDirectory.h" #include "CLucene/highlighter/QueryTermExtractor.h" #include "CLucene/highlighter/QueryScorer.h" #include "CLucene/highlighter/Highlighter.h" #include "CLucene/highlighter/TokenGroup.h" #include "CLucene/highlighter/SimpleHTMLFormatter.h" #include "CLucene/highlighter/SimpleFragmenter.h" CL_NS_USE2(search, highlight); RAMDirectory hl_ramDir; StandardAnalyzer hl_analyzer; const TCHAR* hl_FIELD_NAME = _T("contents"); Query* hl_originalquery = NULL; Query* hl_query = NULL; Query* hl_rewrittenquery = NULL; IndexReader* hl_reader = NULL; Searcher* hl_searcher = NULL; Hits* hl_hits = NULL; class hl_formatterCls : public Formatter { public: int numHighlights; hl_formatterCls() { numHighlights = 0; } ~hl_formatterCls() { } TCHAR* highlightTerm(const TCHAR* originalText, const TokenGroup* group) { if (group->getTotalScore() <= 0) { return STRDUP_TtoT(originalText); } numHighlights++; //update stats used in assertions int len = _tcslen(originalText) + 7; TCHAR* ret = _CL_NEWARRAY(TCHAR, len + 1); _tcscpy(ret, _T("")); _tcscat(ret, originalText); _tcscat(ret, _T("")); return ret; } }; hl_formatterCls hl_formatter; const TCHAR* hl_texts[6] ={ _T("Hello this is a piece of text that is very long and contains too much preamble and the meat is really here which says kennedy has been shot"), _T("This piece of text refers to Kennedy at the beginning then has a longer piece of text that is very long in the middle and finally ends with another reference to Kennedy"), _T("JFK has been shot"), _T("John Kennedy has been shot"), _T("This text has a typo in referring to Keneddy"), NULL }; void doStandardHighlights(CuTest* tc) { QueryScorer scorer(hl_query); Highlighter highlighter(&hl_formatter, &scorer); SimpleFragmenter frag(20); highlighter.setTextFragmenter(&frag); for (int i = 0; i < hl_hits->length(); i++) { const TCHAR* text = hl_hits->doc(i).get(hl_FIELD_NAME); int maxNumFragmentsRequired = 2; const TCHAR* fragmentSeparator = _T("..."); StringReader reader(text); TokenStream* tokenStream = hl_analyzer.tokenStream(hl_FIELD_NAME, &reader); TCHAR* result = highlighter.getBestFragments( tokenStream, text, maxNumFragmentsRequired, fragmentSeparator); CuMessage(tc, _T("%s\n"), result == NULL ? _T("") : result); _CLDELETE_CARRAY(result); _CLDELETE(tokenStream); } } void doSearching(CuTest* tc, const TCHAR* queryString) { if (hl_searcher == NULL) hl_searcher = _CLNEW IndexSearcher(&hl_ramDir); if (hl_rewrittenquery != NULL && hl_originalquery != NULL) { if (hl_originalquery != hl_rewrittenquery) _CLDELETE(hl_rewrittenquery); _CLDELETE(hl_originalquery); } hl_originalquery = QueryParser::parse(queryString, hl_FIELD_NAME, &hl_analyzer); //for any multi-term queries to work (prefix, wildcard, range,fuzzy etc) you must use a rewritten query! hl_rewrittenquery = hl_originalquery->rewrite(hl_reader); hl_query = hl_rewrittenquery; TCHAR* s = hl_originalquery->toString(hl_FIELD_NAME); CuMessage(tc, _T("Searching for: %s\n"), s == NULL ? _T("") : s); _CLDELETE_CARRAY(s); s = hl_rewrittenquery->toString(hl_FIELD_NAME); CuMessage(tc, _T("Rewritten query: %s\n"), s == NULL ? _T("") : s); _CLDELETE_CARRAY(s); if (hl_hits != NULL) _CLDELETE(hl_hits); hl_hits = hl_searcher->search(hl_query); hl_formatter.numHighlights = 0; } void testSimpleHighlighter(CuTest *tc) { doSearching(tc, _T("Kennedy")); QueryScorer scorer(hl_query); Highlighter highlighter(&scorer); SimpleFragmenter fragmenter(40); highlighter.setTextFragmenter(&fragmenter); int maxNumFragmentsRequired = 2; for (int i = 0; i < hl_hits->length(); i++) { const TCHAR* text = hl_hits->doc(i).get(hl_FIELD_NAME); StringReader reader(text); TokenStream* tokenStream = hl_analyzer.tokenStream(hl_FIELD_NAME, &reader); TCHAR* result = highlighter.getBestFragments(tokenStream, text, maxNumFragmentsRequired, _T("...")); CuMessage(tc, _T("%s\n"), result == NULL ? _T("") : result); _CLDELETE_CARRAY(result); _CLDELETE(tokenStream); } //Not sure we can assert anything here - just running to check we dont throw any exceptions } void testGetFuzzyFragments(CuTest *tc) { doSearching(tc, _T("Kinnedy~")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 5); } void testGetWildCardFragments(CuTest *tc) { doSearching(tc, _T("K?nnedy")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 4); } void testGetBestFragmentsSimpleQuery(CuTest *tc) { doSearching(tc, _T("Kennedy")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 4); } void testGetMidWildCardFragments(CuTest *tc) { doSearching(tc, _T("K*dy")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 5); } void testGetBestFragmentsPhrase(CuTest *tc) { doSearching(tc, _T("\"John Kennedy\"")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 2); } void testGetBestFragmentsMultiTerm(CuTest *tc) { doSearching(tc, _T("John Ken*")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 6); } void testGetBestFragmentsWithOr(CuTest *tc) { doSearching(tc, _T("JFK OR Kennedy")); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 5); } void testGetRangeFragments(CuTest *tc) { TCHAR qry[200]; _sntprintf(qry, 200, _T("%s:[Kannedy TO Kznnedy]"), hl_FIELD_NAME); //bug?needs lower case doSearching(tc, qry); doStandardHighlights(tc); TCHAR msg[1024]; _sntprintf(msg, 1024, _T("Failed to find correct number of highlights %d found"), hl_formatter.numHighlights); CuAssert(tc, msg, hl_formatter.numHighlights == 5); } void setupHighlighter(CuTest *tc) { IndexWriter writer(&hl_ramDir, &hl_analyzer, true); for (int i = 0; hl_texts[i] != NULL; i++) { Document d; d.add(*_CLNEW Field(hl_FIELD_NAME, hl_texts[i], Field::STORE_YES | Field::INDEX_TOKENIZED)); writer.addDocument(&d); } writer.optimize(); writer.close(); hl_reader = IndexReader::open(&hl_ramDir); } void cleanupHighlighter(CuTest *tc) { if (hl_originalquery != hl_rewrittenquery) _CLDELETE(hl_rewrittenquery); _CLDELETE(hl_originalquery); _CLDELETE(hl_hits); if (hl_reader != NULL) { hl_reader->close(); _CLDELETE(hl_reader); } hl_ramDir.close(); if (hl_searcher != NULL) _CLDELETE(hl_searcher); } CuSuite *testhighlighter(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Highlight Test")); SUITE_ADD_TEST(suite, setupHighlighter); SUITE_ADD_TEST(suite, testSimpleHighlighter); SUITE_ADD_TEST(suite, testGetBestFragmentsSimpleQuery); SUITE_ADD_TEST(suite, testGetFuzzyFragments); SUITE_ADD_TEST(suite, testGetWildCardFragments); SUITE_ADD_TEST(suite, testGetMidWildCardFragments); SUITE_ADD_TEST(suite, testGetRangeFragments); SUITE_ADD_TEST(suite, testGetBestFragmentsPhrase); SUITE_ADD_TEST(suite, testGetBestFragmentsMultiTerm); SUITE_ADD_TEST(suite, testGetBestFragmentsWithOr); SUITE_ADD_TEST(suite, cleanupHighlighter); return suite; } clucene-core-2.3.3.4/src/contribs/contribs-lib-test/TestSnowball.cpp000066400000000000000000000023011154025176300253300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/snowball/SnowballAnalyzer.h" CL_NS_USE2(analysis, snowball); void testSnowball(CuTest *tc) { SnowballAnalyzer an(_T("English")); CL_NS(util)::StringReader reader(_T("he abhorred accents")); TokenStream* ts = an.tokenStream(_T("test"), &reader); Token t; CLUCENE_ASSERT(ts->next(&t)!=NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("he")) == 0); CLUCENE_ASSERT(ts->next(&t)!=NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("abhor")) == 0); CLUCENE_ASSERT(ts->next(&t)!=NULL); CLUCENE_ASSERT(_tcscmp(t.termBuffer(), _T("accent")) == 0); CLUCENE_ASSERT(ts->next(&t) == NULL); _CLDELETE(ts); } CuSuite *testsnowball(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Snowball Test")); SUITE_ADD_TEST(suite, testSnowball); return suite; } clucene-core-2.3.3.4/src/contribs/contribs-lib-test/TestStreams.cpp000066400000000000000000000041221154025176300251700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/util/gzipcompressstream.h" #include "CLucene/util/gzipinputstream.h" #include "CLucene/util/byteinputstream.h" #include "CLucene/util/streamarray.h" //#include "CLucene/util/_streambase.h" CL_NS_USE(store); CL_NS_USE(util); void setupStreams(CuTest *tc) { } void cleanupStreams(CuTest *tc) { } void testDocument(CuTest* tc) { //test adding a binary field to the index RAMDirectory ram; const signed char* tmp = 0; const char* str2 = "we all love compressed fields"; { SimpleAnalyzer an; IndexWriter writer(&ram, &an, true); Document doc2; AStringReader stringReader2(str2); GZipCompressInputStream* zipStream; zipStream = new GZipCompressInputStream(&stringReader2); ValueArray stored = streamArray(zipStream); doc2.add(*new Field(_T("test"), reinterpret_cast*>(&stored), Field::STORE_YES)); writer.addDocument(&doc2); //done writer.close(); } //now read it back... IndexReader* reader = IndexReader::open(&ram); Document doc2; CLUCENE_ASSERT(reader->document(0, doc2)); ByteInputStream sb2(reinterpret_cast const*>(doc2.getField(_T("test"))->binaryValue())); GZipInputStream zip2(&sb2, GZipInputStream::ZLIBFORMAT); int rd = zip2.read(tmp, 100000, 0); std::string str((const char*) tmp, rd); CLUCENE_ASSERT(str.compare(str2) == 0); _CLDELETE(reader); } CuSuite *teststreams(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Streams Test")); //SUITE_ADD_TEST(suite, setupStreams); SUITE_ADD_TEST(suite, testDocument); //SUITE_ADD_TEST(suite, cleanupStreams); return suite; } clucene-core-2.3.3.4/src/contribs/contribs-lib-test/TestUtf8.cpp000066400000000000000000000133621154025176300244060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/util/dirent.h" #include "CLucene/util/CLStreams.h" //this is basically a copy of the TestUtf8 located in the core, except using the iconv InputStreamReader... #ifdef _UCS2 void _Index(CuTest *tc, IndexWriter* ndx, const char* file){ char path[CL_MAX_PATH]; TCHAR tlang[20]; strcpy(path,clucene_data_location); strcat(path,"/utf8text"); CuAssert(tc,_T("Utf8 directory does not exist"),Misc::dir_Exists(path)); strcat(path,"/"); strcat(path,file); strcat(path,"_utf8.txt"); CuAssert(tc,_T("Language file does not exist"),Misc::dir_Exists(path)); STRCPY_AtoT(tlang,file,CL_MAX_PATH); Document doc; doc.add(*_CLNEW Field(_T("language"),tlang, Field::STORE_YES | Field::INDEX_UNTOKENIZED)); jstreams::FileReader* fr = new jstreams::FileReader(path, "UTF-8"); doc.add(*_CLNEW Field(_T("contents"),fr, Field::STORE_YES | Field::INDEX_TOKENIZED )); ndx->addDocument(&doc); } void _Search(CuTest *tc, IndexSearcher* srch, Analyzer* analyzer, const char* file, const char* query){ TCHAR tlang[20]; STRCPY_AtoT(tlang,file,CL_MAX_PATH); TCHAR tquery[80]; lucene_utf8towcs(tquery,query,80); Query* q = QueryParser::parse(tquery,_T("contents"), analyzer); Hits* h = srch->search(q); CLUCENE_ASSERT( h->length() == 1 ); Document& doc = h->doc(0); CLUCENE_ASSERT( _tcscmp(doc.get(_T("language")), tlang)==0 ); _CLDELETE(q); _CLDELETE(h); } void testUTF8(CuTest *tc) { RAMDirectory ram; Directory* pram = &ram; SimpleAnalyzer a; IndexWriter ndx(&ram,&a,true); _Index(tc, &ndx,"arabic"); _Index(tc, &ndx,"chinese"); _Index(tc, &ndx,"czech"); _Index(tc, &ndx,"english"); _Index(tc, &ndx,"french"); _Index(tc, &ndx,"german"); _Index(tc, &ndx,"greek"); _Index(tc, &ndx,"hebrew"); _Index(tc, &ndx,"japanese"); _Index(tc, &ndx,"korean"); _Index(tc, &ndx,"polish"); _Index(tc, &ndx,"russian"); ndx.close(); IndexSearcher srch(&ram); _Search(tc,&srch,&a,"arabic", "\xef\xbb\x9e\xef\xbb\xb4\xef\xbb\xa4\xef\xbb\xb3\xef\xba\xad"); //????? - arabic _Search(tc,&srch,&a,"chinese", "\xe5\x95\xa4\xe9\x85\x92"); //?? - chinese _Search(tc,&srch,&a,"czech", "Bud\xc4\x9bjovick\xc3\xbd" ); //Budejovick� - czech _Search(tc,&srch,&a,"english", "google"); //English - google _Search(tc,&srch,&a,"french", "r\xc3\xa9put\xc3\xa9"); //r�put� - french _Search(tc,&srch,&a,"german", "k\xc3\xb6nnen"); //k�nnen - german _Search(tc,&srch,&a,"greek", "\xcf\x83\xcf\x84\xce\xb5\xce\xaf\xce\xbb\xcf\x84\xce\xb5"); //ste??te - greek _Search(tc,&srch,&a,"hebrew", "\xd7\x91\xd7\x90\xd7\xa8\xd7\xa6\xd7\x95\xd7\xaa" ); //?????? - hebrew _Search(tc,&srch,&a,"japanese", "\xe8\xa6\x8b\xe5\xad\xa6" ); //?? - japanese _Search(tc,&srch,&a,"korean", "\xea\xb8\x88" ); //? - korean _Search(tc,&srch,&a,"polish", "sp\xc3\xb3\xc5\x82ka"); ;//sp�lka - polish _Search(tc,&srch,&a,"russian", "\xd0\x92\xd0\xb5\xd0\xbb\xd0\xb8\xd0\xba\xd0\xb8\xd0\xb5\x20"); //??????? - russian srch.close(); } void readBuffered(CuTest* tc, Reader& utf8, Reader& unicode, int readLen){ const TCHAR* buf1; const TCHAR* buf2; int32_t s; size_t p, p1, p2; p = p1 = p2 = 0; while(true){ s = utf8.read(buf1, readLen, readLen); if ( s == -1 ) break; p1+=s; s = unicode.read(buf2, readLen, readLen); if (s == -1) break; p2+=s; CLUCENE_ASSERT(p1==p2); //make sure both readers read the same amount. todo: i guess this is not strictly required... for ( int32_t i=0;i #include #endif #endif #include "test.h" #include #include #ifdef _CL_HAVE_DIRECT_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_IO_H #include #endif const char* cl_tempDir; bool cl_quiet; char clucene_data_location[1024]; int main(int argc, char *argv[]) { #ifdef _MSC_VER #ifdef _DEBUG _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //| _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF ); _crtBreakAlloc = -1; #endif #endif int ret_result = 0; int i = 0; int exclude = 0; int list_provided = 0; CuSuiteList *alltests = NULL; CuString *output = CuStringNew(); bool silent = false; bool verbose = false; bool times = true; uint64_t startTime = 0; cl_tempDir = NULL; if (Misc::dir_Exists("/tmp")) cl_tempDir = "/tmp"; if (getenv("TEMP") != NULL) cl_tempDir = getenv("TEMP"); else if (getenv("TMP") != NULL) cl_tempDir = getenv("TMP"); char* tmp = _CL_NEWARRAY(char, strlen(cl_tempDir) + 9); strcpy(tmp, cl_tempDir); strcat(tmp, "/clucene"); _mkdir(tmp); if (Misc::dir_Exists(tmp)) cl_tempDir = tmp; clucene_data_location[0] = 0; if (CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION1 "/reuters-21578-index/segments")) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION1); else if (CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION2 "/reuters-21578-index/segments")) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION2); else if (CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION3 "/reuters-21578-index/segments")) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION3); else if (getenv(CLUCENE_DATA_LOCATIONENV) != NULL) { strcpy(clucene_data_location, getenv(CLUCENE_DATA_LOCATIONENV)); strcat(clucene_data_location, "/data/reuters-21578-index/segments"); if (CL_NS(util)::Misc::dir_Exists(clucene_data_location)) { strcpy(clucene_data_location, getenv(CLUCENE_DATA_LOCATIONENV)); strcat(clucene_data_location, "/data"); } else clucene_data_location[0] = 0; } /* first check that we are running the test for the correct position */ //todo: make this configurable if (!*clucene_data_location) { fprintf(stderr, "%s must be run from a subdirectory of the application's root directory\n", argv[0]); fprintf(stderr, "ensure that the test data exists in %s or %s or %s\n", CLUCENE_DATA_LOCATION1, CLUCENE_DATA_LOCATION2, CLUCENE_DATA_LOCATION3); if (getenv(CLUCENE_DATA_LOCATIONENV) != NULL) fprintf(stderr, "%s/data was also checked because of the " CLUCENE_DATA_LOCATIONENV " environment variable", getenv(CLUCENE_DATA_LOCATIONENV)); ret_result = 1; goto exit_point; } CuInit(argc, argv); /* see if we're in exclude mode, see if list of testcases provided */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help") || !strcmp(argv[i], "/?")) { printf("%s [-l list] [-q quiet] [-v verbose] [-t show times] [-p printf messages immediatelly] [-x exclude] [tests...]\n", argv[0]); goto exit_point; } if (!strcmp(argv[i], "-v")) { verbose = true; continue; } if (!strcmp(argv[i], "-p")) { //used in CuInit continue; } if (!strcmp(argv[i], "-q")) { silent = true; continue; } if (!strcmp(argv[i], "-x")) { exclude = 1; continue; } if (!strcmp(argv[i], "-t")) { times = true; continue; } if (!strcmp(argv[i], "-l")) { for (i = 0; tests[i].func != NULL; i++) { printf("%s\n", tests[i].testname); } ret_result = 0; goto exit_point; } if (argv[i][0] == '-') { fprintf(stderr, "invalid option: `%s'\n", argv[i]); ret_result = 1; goto exit_point; } list_provided = 1; } if (!list_provided) { /* add everything */ alltests = CuSuiteListNew(_T("All CLucene Tests")); for (i = 0; tests[i].func != NULL; i++) { CuSuiteListAdd(alltests, tests[i].func()); } } else if (exclude) { /* add everything but the tests listed */ alltests = CuSuiteListNew(_T("Partial CLucene Tests")); for (i = 0; tests[i].func != NULL; i++) { int this_test_excluded = 0; int j; for (j = 1; j < argc && !this_test_excluded; j++) { if (!strcmp(argv[j], tests[i].testname)) { this_test_excluded = 1; } } if (!this_test_excluded) { CuSuiteListAdd(alltests, tests[i].func()); } } } else { /* add only the tests listed */ alltests = CuSuiteListNew(_T("Partial CLucene Tests")); for (i = 1; i < argc; i++) { int j; int found = 0; if (argv[i][0] == '-') { continue; } for (j = 0; tests[j].func != NULL; j++) { if (!strcmp(argv[i], tests[j].testname)) { CuSuiteListAdd(alltests, tests[j].func()); found = 1; } } if (!found) { fprintf(stderr, "invalid test name: `%s'\n", argv[i]); ret_result = 1; goto exit_point; } } } startTime = Misc::currentTimeMillis(); printf("Key: .= pass N=not implemented F=fail\n"); if (silent) CuSuiteListRun(alltests); else CuSuiteListRunWithSummary(alltests, verbose, times); i = CuSuiteListDetails(alltests, output); _tprintf(_T("%s\n"), output->buffer); if (times) printf("Tests run in %dms\n\n", (int32_t) (CL_NS(util)::Misc::currentTimeMillis() - startTime)); exit_point: if (alltests != NULL) CuSuiteListDelete(alltests); CuStringFree(output); _CLDELETE_LCaARRAY(const_cast(cl_tempDir)); cl_tempDir = NULL; _lucene_shutdown(); //clears all static memory //print lucenebase debug if (ret_result != 0) return ret_result; else return i > 0 ? 1 : 0; //Debuggin techniques: //For msvc, use this for breaking on memory leaks: // _crtBreakAlloc //for linux, use valgrind } clucene-core-2.3.3.4/src/core/000077500000000000000000000000001154025176300157505ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene.h000066400000000000000000000034511154025176300174420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ //Includes some standard headers for searching and indexing. #ifndef _lucene_CLucene_ #define _lucene_CLucene_ #include "CLucene/StdHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/IndexWriter.h" #include "CLucene/index/MultiReader.h" #include "CLucene/index/Term.h" #include "CLucene/search/IndexSearcher.h" #include "CLucene/search/MultiSearcher.h" #include "CLucene/search/DateFilter.h" #include "CLucene/search/WildcardQuery.h" #include "CLucene/search/FuzzyQuery.h" #include "CLucene/search/PhraseQuery.h" #include "CLucene/search/PrefixQuery.h" #include "CLucene/search/RangeQuery.h" #include "CLucene/search/BooleanQuery.h" #include "CLucene/search/TermQuery.h" #include "CLucene/search/SearchHeader.h" #include "CLucene/search/Similarity.h" #include "CLucene/search/Sort.h" #include "CLucene/search/Hits.h" #include "CLucene/search/Explanation.h" #include "CLucene/document/Document.h" #include "CLucene/document/Field.h" #include "CLucene/document/DateField.h" #include "CLucene/document/DateTools.h" #include "CLucene/document/NumberTools.h" #include "CLucene/store/Directory.h" #include "CLucene/store/FSDirectory.h" #include "CLucene/store/RAMDirectory.h" #include "CLucene/queryParser/QueryParser.h" #include "CLucene/analysis/standard/StandardAnalyzer.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/util/BitSet.h" #include "CLucene/util/CLStreams.h" #include "CLucene/util/PriorityQueue.h" #endif clucene-core-2.3.3.4/src/core/CLucene/000077500000000000000000000000001154025176300172665ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/CLConfig.h000066400000000000000000000236731154025176300210760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_Config_ #define _lucene_Config_ //////////////////////////////////////////////////////////////////// // this settings should be set up in the compiler, // but are put here for reference as to what could be defined //////////////////////////////////////////////////////////////////// // //define this if you want debugging code to be enabled //#define _DEBUG // //define this if you want condition debugging to be enabled #if defined(_DEBUG) && !defined(_CL__CND_DEBUG) #define _CL__CND_DEBUG #endif // //define this to print out lots of information about merges, etc //requires __CL__CND_DEBUG to be defined //#define _CL_DEBUG_INFO stdout // //to disable namespaces define this //#define DISABLE_NAMESPACE // //disable hashmap/set usage. Just use map and set. //this has been shown to be quicker than the hash equivalents in some impementations #ifndef LUCENE_DISABLE_HASHING #define LUCENE_DISABLE_HASHING #endif // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // These options can be set depending on the particular needs of // Your application //////////////////////////////////////////////////////////////////// // //define this to enable mmap support in the fsdirectory IndexInput //EXPERIMENTAL //#define LUCENE_FS_MMAP // //define to true to actually use it (not just enable it) #ifdef LUCENE_FS_MMAP #define LUCENE_USE_MMAP true //yes, use if it's turned on. #else #define LUCENE_USE_MMAP false #endif // //LOCK_DIR implementation: //define this to set an exact directory for the lock dir (not recommended) //all other methods of getting the temporary directory will be ignored //#define LUCENE_LOCK_DIR "/tmp" // //define this to try and load the lock dir from this specified environment variable #define LUCENE_LOCK_DIR_ENV_1 "TEMP" //define this if you want to have look up this environment variable if the first one fails #define LUCENE_LOCK_DIR_ENV_2 "TMP" //define this if you want to have a fallback directory, if not defined then //the lockdirectory will be the index directory #define LUCENE_LOCK_DIR_ENV_FALLBACK "/tmp" // //////////////////////////////////////////////////////////////////// //This must always be defined. They can be adjusted if required. But //general Wildcard string would be '*' and Wildcard Char would be '?' //Both are Required. #define LUCENE_WILDCARDTERMENUM_WILDCARD_STRING '*' #define LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR '?' // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // memory handling configurations //////////////////////////////////////////////////////////////////// // /*** * If this is defined, lucene's configurations are changed * to use less memory, but may run slower. * todo: i dont think this actualy changes speed much, just memory */ #define LUCENE_OPTIMIZE_FOR_MEMORY // //enable this if you want to enable reference counting. This is //not necessary or useful in most cases except when implementing wrappers //which have reference counting. If the wrapper wraps a StringReader, //for example, it should expect that the wrapped StringReader should not //be deleted. However, when the stringreader is added into a Field, //the Field usually takes over the stringReader and deletes it on completion. //If reference counting is enabled, the wrapper can add a reference to any class //and when _CLDECDELETE is called, the reference is decremented and only deleted //if the refcount is zero. //#define LUCENE_ENABLE_REFCOUNT //////////////////////////////////////////////////////////////////// // These options allow you to remove certain implementations // out of clucene so that they can be implemented in the client // application //////////////////////////////////////////////////////////////////// // //define this if you want to implement the _Cnd_OutDebug routine yourself //you can then easily customise in your own application how to handle debug messages //#define _CND_DEBUG_DONTIMPLEMENT_OUTDEBUG // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // These options should not be changed. But you can experiment with // them to optimize performance //////////////////////////////////////////////////////////////////// // //some defaults, wouldn't usually need to be changed //Buffer size for input/output streams. Required. #define LUCENE_STREAM_BUFFER_SIZE 1024 // // DSR:2004.08.19: // Formerly, StringBuffer used 1024 as the default size of its internal buffer. // However, StringBuffer is used primarily for token- and term-oriented // processing, e.g. in StandardTokenizer. I've calculated that the average // token (as produced by StandardTokenizer) in all .txt files distributed in // the Project Gutenberg CD Image (August 2003 release) has only 6 characters. // Although most languages are likely to have a longer average word length than // English due to the popularity of "non-atomized" conjugation and declension // mechanisms, 1024 is still vastly excessive. // I made two changes intended to deliver better overall performance: // a) Switched to a default StringBuffer character capacity of 32. Though 32 // is longer than the average token, the high cost of realloc makes a // slightly liberal default size optimal. I chose the default size of 32 // after fairly extensive experimentation on the Gutenberg e-texts. The // results are summarized in the following table: // ------------------------------------------------------------------------ // LUCENE_DEFAULT_TOKEN_BUFFER_SIZE value | % faster than default size 1024 // ------------------------------------------------------------------------ // 8 : 4% // 16 : 7% // 32 : 6% // 64 : 3% // A default size of 32 is actually slightly slower than 16, but I was // experimenting on English text; I expect that 32 will maintain decent // performance in languages such as German, and in technical documents // with long tokens. // // b) To offset the switch to a smaller default buffer size, I implemented a // more aggressive growth strategy. A StringBuffer now [at least] doubles // the size of its internal buffer every time it needs to grow, rather // than [at least] increasing by LUCENE_DEFAULT_TOKEN_BUFFER_SIZE no // matter how many times it has already grown. //Required. #define LUCENE_DEFAULT_TOKEN_BUFFER_SIZE 32 //todo: should implement a similar strategy in analysis/token // //Size of TermScore cache. Required. #define LUCENE_SCORE_CACHE_SIZE 32 // //analysis options //maximum length that the CharTokenizer uses. Required. //By adjusting this value, you can greatly improve the performance of searching //and especially indexing. Default is 255, but smaller numbers will decrease //the amount of memory used as well as increasing the speed. #define LUCENE_MAX_WORD_LEN 255 //Maximum length of a token word. //Should be the same or more than LUCENE_MAX_WORD_LEN //if not defined, then no token limit, but may be slower //if defined will be faster (up to 15% in some cases), but will use more memory #ifndef LUCENE_OPTIMIZE_FOR_MEMORY #define LUCENE_TOKEN_WORD_LENGTH LUCENE_MAX_WORD_LEN #endif // //maximum field length. some optimisation can be done if a maximum field //length is given... The smaller the better #define LUCENE_MAX_FIELD_LEN 100 // //The initial value set to BooleanQuery::maxClauseCount. Default is 1024 #define LUCENE_BOOLEANQUERY_MAXCLAUSECOUNT 1024 // //bvk: 12.3.2005 //============================================================================== //Previously the way the tokenizer has worked has been changed to optionally //use a a fixed word length. I have implemented this in the Term class as well. //It seems that by predefining the text length instead of using new TCHAR[x] //in the constructor greatly improves the performance by 20-30% for certain //operations. //Maximum length of a term text. //Should be the same or more than LUCENE_MAX_WORD_LEN //if not defined, then no term text limit, but may be slower //if defined will be faster (up to 30% in some cases), but will use more memory #ifndef LUCENE_OPTIMIZE_FOR_MEMORY #define LUCENE_TERM_TEXT_LENGTH LUCENE_MAX_WORD_LEN #endif // //Size of the CharTokenizer buffersize. Required. #define LUCENE_IO_BUFFER_SIZE 1024 // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // Date conversion settings for DateTools and DateField //////////////////////////////////////////////////////////////////// // // DateField, which is now deprecated, had it's buffer size // defined for 9 chars. DateTools currently is configured // for 30 chars, but this needs to be revised after tests // are written for those. // #define DATETOOLS_BUFFER_SIZE 30 #define DATEFIELD_DATE_LEN DATETOOLS_BUFFER_SIZE // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // FuzzyQuery settings //////////////////////////////////////////////////////////////////// // // This should be somewhere around the average long word. // If it is longer, we waste time and space. If it is shorter, we waste a // little bit of time growing the array as we encounter longer words. // #define LUCENE_TYPICAL_LONGEST_WORD_IN_INDEX 19 // //////////////////////////////////////////////////////////////////// #endif clucene-core-2.3.3.4/src/core/CLucene/CLMonolithic.cpp000066400000000000000000000140011154025176300223120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ /* * this is a monolithic file that can be used to compile clucene using one source file. * it simplifies some build processes by avoiding static & dynamic compalation pitfalls. * * note: when creating a project add either this file, or all the other .cpp files, not both! */ #include "CLucene/StdHeader.cpp" #include "CLucene/debug/error.cpp" #include "CLucene/analysis/Analyzers.cpp" #include "CLucene/analysis/AnalysisHeader.cpp" #include "CLucene/analysis/standard/StandardAnalyzer.cpp" #include "CLucene/analysis/standard/StandardFilter.cpp" #include "CLucene/analysis/standard/StandardTokenizer.cpp" #include "CLucene/document/DateField.cpp" #include "CLucene/document/DateTools.cpp" #include "CLucene/document/Document.cpp" #include "CLucene/document/FieldSelector.cpp" #include "CLucene/document/NumberTools.cpp" #include "CLucene/document/Field.cpp" #include "CLucene/index/CompoundFile.cpp" #include "CLucene/index/DirectoryIndexReader.cpp" #include "CLucene/index/DocumentsWriter.cpp" #include "CLucene/index/DocumentsWriterThreadState.cpp" #include "CLucene/index/FieldInfos.cpp" #include "CLucene/index/FieldsReader.cpp" #include "CLucene/index/FieldsWriter.cpp" #include "CLucene/index/IndexDeletionPolicy.cpp" #include "CLucene/index/IndexFileDeleter.cpp" #include "CLucene/index/IndexFileNameFilter.cpp" #include "CLucene/index/IndexFileNames.cpp" #include "CLucene/index/IndexModifier.cpp" #include "CLucene/index/IndexWriter.cpp" #include "CLucene/index/IndexReader.cpp" #include "CLucene/index/MergePolicy.cpp" #include "CLucene/index/MergeScheduler.cpp" #include "CLucene/index/MultipleTermPositions.cpp" #include "CLucene/index/MultiReader.cpp" #include "CLucene/index/MultiSegmentReader.cpp" #include "CLucene/index/Payload.cpp" #include "CLucene/index/SegmentInfos.cpp" #include "CLucene/index/SegmentMergeInfo.cpp" #include "CLucene/index/SegmentMergeQueue.cpp" #include "CLucene/index/SegmentMerger.cpp" #include "CLucene/index/SegmentReader.cpp" #include "CLucene/index/SegmentTermDocs.cpp" #include "CLucene/index/SegmentTermEnum.cpp" #include "CLucene/index/SegmentTermPositions.cpp" #include "CLucene/index/SegmentTermVector.cpp" #include "CLucene/index/SkipListReader.cpp" #include "CLucene/index/SkipListWriter.cpp" #include "CLucene/index/Term.cpp" #include "CLucene/index/Terms.cpp" #include "CLucene/index/TermInfo.cpp" #include "CLucene/index/TermInfosReader.cpp" #include "CLucene/index/TermInfosWriter.cpp" #include "CLucene/index/TermVectorReader.cpp" #include "CLucene/index/TermVectorWriter.cpp" #include "CLucene/queryParser/FastCharStream.cpp" #include "CLucene/queryParser/QueryParserTokenManager.cpp" #include "CLucene/queryParser/MultiFieldQueryParser.cpp" #include "CLucene/queryParser/QueryParser.cpp" #include "CLucene/queryParser/QueryToken.cpp" #include "CLucene/search/BooleanQuery.cpp" #include "CLucene/search/BooleanScorer.cpp" #include "CLucene/search/BooleanScorer2.cpp" #include "CLucene/search/CachingWrapperFilter.cpp" #include "CLucene/search/ChainedFilter.cpp" #include "CLucene/search/Compare.cpp" #include "CLucene/search/ConstantScoreQuery.cpp" #include "CLucene/search/DateFilter.cpp" #include "CLucene/search/ConjunctionScorer.cpp" #include "CLucene/search/DisjunctionSumScorer.cpp" #include "CLucene/search/ExactPhraseScorer.cpp" #include "CLucene/search/Explanation.cpp" #include "CLucene/search/FieldCache.cpp" #include "CLucene/search/FieldCacheImpl.cpp" #include "CLucene/search/FieldDocSortedHitQueue.cpp" #include "CLucene/search/FieldSortedHitQueue.cpp" #include "CLucene/search/FilteredTermEnum.cpp" #include "CLucene/search/FuzzyQuery.cpp" #include "CLucene/search/Hits.cpp" #include "CLucene/search/HitQueue.cpp" #include "CLucene/search/IndexSearcher.cpp" #include "CLucene/search/MatchAllDocsQuery.cpp" #include "CLucene/search/MultiPhraseQuery.cpp" #include "CLucene/search/MultiSearcher.cpp" #include "CLucene/search/MultiTermQuery.cpp" #include "CLucene/search/PhrasePositions.cpp" #include "CLucene/search/PhraseQuery.cpp" #include "CLucene/search/PhraseScorer.cpp" #include "CLucene/search/PrefixQuery.cpp" #include "CLucene/search/QueryFilter.cpp" #include "CLucene/search/RangeQuery.cpp" #include "CLucene/search/RangeFilter.cpp" #include "CLucene/search/SearchHeader.cpp" #include "CLucene/search/Similarity.cpp" #include "CLucene/search/SloppyPhraseScorer.cpp" #include "CLucene/search/Scorer.cpp" #include "CLucene/search/ScorerDocQueue.cpp" #include "CLucene/search/Sort.cpp" #include "CLucene/search/TermQuery.cpp" #include "CLucene/search/TermScorer.cpp" #include "CLucene/search/WildcardQuery.cpp" #include "CLucene/search/WildcardTermEnum.cpp" #include "CLucene/search/spans/NearSpansOrdered.cpp" #include "CLucene/search/spans/NearSpansUnordered.cpp" #include "CLucene/search/spans/SpanFirstQuery.cpp" #include "CLucene/search/spans/SpanNearQuery.cpp" #include "CLucene/search/spans/SpanNotQuery.cpp" #include "CLucene/search/spans/SpanOrQuery.cpp" #include "CLucene/search/spans/SpanScorer.cpp" #include "CLucene/search/spans/SpanTermQuery.cpp" #include "CLucene/search/spans/SpanWeight.cpp" #include "CLucene/search/spans/TermSpans.cpp" #include "CLucene/store/FSDirectory.cpp" #include "CLucene/store/IndexInput.cpp" #include "CLucene/store/Lock.cpp" #include "CLucene/store/LockFactory.cpp" #include "CLucene/store/MMapInput.cpp" #include "CLucene/store/IndexOutput.cpp" #include "CLucene/store/Directory.cpp" #include "CLucene/store/RAMDirectory.cpp" #include "CLucene/util/BitSet.cpp" #include "CLucene/util/Equators.cpp" #include "CLucene/util/FastCharStream.cpp" #include "CLucene/util/MD5Digester.cpp" #include "CLucene/util/Reader.cpp" #include "CLucene/util/StringIntern.cpp" #include "CLucene/util/ThreadLocal.cpp" #include "CLucene/CLSharedMonolithic.cpp" clucene-core-2.3.3.4/src/core/CLucene/StdHeader.cpp000066400000000000000000000026621154025176300216430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/util/Misc.h" #include "CLucene/search/Sort.h" #include "CLucene/search/Similarity.h" #include "CLucene/search/FieldCache.h" #include "CLucene/index/TermVector.h" #include "CLucene/index/_IndexFileNameFilter.h" #include "CLucene/search/FieldSortedHitQueue.h" #include "CLucene/store/LockFactory.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/_ThreadLocal.h" #if defined(_MSC_VER) && defined(_DEBUG) #define CRTDBG_MAP_ALLOC #include #endif CL_NS_USE(util) CL_NS_USE(search) CL_NS_USE(index) CL_NS_USE(store) //clears all static memory. do not attempt to do anything else //in clucene after calling this function void _lucene_shutdown(){ FieldSortedHitQueue::_shutdown(); Sort::_shutdown(); ScoreDocComparator::_shutdown(); SortField::_shutdown(); FieldCache::_shutdown(); Similarity::_shutdown(); CLStringIntern::_shutdown(); NoLockFactory::_shutdown(); _ThreadLocal::_shutdown(); IndexFileNameFilter::_shutdown(); _CLDELETE (TermVectorOffsetInfo_EMPTY_OFFSET_INFO); } clucene-core-2.3.3.4/src/core/CLucene/StdHeader.h000066400000000000000000000033611154025176300213050ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef lucene_stdheader_h #define lucene_stdheader_h /** * This header contains public distributed code that needs to be included *before* * any clucene-core code is included. It also uses the clucene-shared header * which contains platform specific code configured by cmake. */ //configurations for library #include "CLucene/CLConfig.h" //shared header #include "CLucene/SharedHeader.h" //error handling macros/functions #include "CLucene/debug/error.h" //todo: would be good to deprecate this... it's ugly #define StringArrayWithDeletor CL_NS(util)::CLVector #define StringArray std::vector #define StringArrayWithDeletor CL_NS(util)::CLVector #define StringArrayConst std::vector //#define StringArrayConstWithDeletor CL_NS(util)::CLVector #define AStringArray std::vector #define AStringArrayWithDeletor CL_NS(util)::CLVector #define AStringArrayConst std::vector //#define AStringArrayConstWithDeletor CL_NS(util)::CLVector //call this at the end of running to clean up memory. extern CLUCENE_EXPORT void _lucene_shutdown(); #endif // lucene_apiheader_h clucene-core-2.3.3.4/src/core/CLucene/_ApiHeader.h000066400000000000000000000014751154025176300214270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef lucene_internal_apiheader_h #define lucene_internal_apiheader_h /** * This is the header that all clucene-core source code includes. * We include the shared code header and the public StdHeader.h header. */ #include "CLucene/StdHeader.h" #include "CLucene/_SharedHeader.h" //todo: this code needs to go to shared #include "CLucene/util/_VoidMap.h" #include "CLucene/util/_VoidList.h" using namespace std; #endif // lucene_apiheader_h clucene-core-2.3.3.4/src/core/CLucene/analysis/000077500000000000000000000000001154025176300211115ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/analysis/AnalysisHeader.cpp000066400000000000000000000157421154025176300245220ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "AnalysisHeader.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/_ThreadLocal.h" #include CL_NS_USE(util) CL_NS_DEF(analysis) struct Analyzer::Internal{ CL_NS(util)::ThreadLocal >* tokenStreams; }; Analyzer::Analyzer(){ _internal = new Internal; _internal->tokenStreams = _CLNEW CL_NS(util)::ThreadLocal >; } Analyzer::~Analyzer(){ _CLLDELETE(_internal->tokenStreams); delete _internal; } TokenStream* Analyzer::getPreviousTokenStream() { return _internal->tokenStreams->get(); } void Analyzer::setPreviousTokenStream(TokenStream* obj) { _internal->tokenStreams->set(obj); } TokenStream* Analyzer::reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { return tokenStream(fieldName, reader); } ///Compares the Token for their order class OrderCompare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: bool operator()( Token* t1, Token* t2 ) const{ if(t1->startOffset()>t2->startOffset()) return false; if(t1->startOffset()startOffset()) return true; return true; } }; Token::Token(): _startOffset (0), _endOffset (0), _type ( getDefaultType() ), positionIncrement (1), payload(NULL) { _termTextLen = 0; #ifndef LUCENE_TOKEN_WORD_LENGTH _buffer = NULL; bufferTextLen = 0; #else _buffer[0] = 0; //make sure null terminated bufferTextLen = LUCENE_TOKEN_WORD_LENGTH+1; #endif } Token::~Token(){ #ifndef LUCENE_TOKEN_WORD_LENGTH free(_buffer); #endif _CLLDELETE(payload); } Token::Token(const TCHAR* text, const int32_t start, const int32_t end, const TCHAR* typ): _startOffset (start), _endOffset (end), _type ( (typ==NULL?getDefaultType():typ) ), positionIncrement (1), payload(NULL) { _termTextLen = 0; #ifndef LUCENE_TOKEN_WORD_LENGTH _buffer = NULL; bufferTextLen = 0; #else _buffer[0] = 0; //make sure null terminated bufferTextLen = LUCENE_TOKEN_WORD_LENGTH+1; #endif setText(text, -1); } size_t Token::bufferLength(){ return bufferTextLen; } int32_t Token::startOffset() const { return _startOffset; } void Token::setStartOffset(const int32_t val){ _startOffset = val; } int32_t Token::endOffset() const { return _endOffset; } const TCHAR* Token::getDefaultType(){ return _T("word"); } void Token::setEndOffset(const int32_t val){ _endOffset = val; } const TCHAR* Token::type() const { return _type; } void Token::setType(const TCHAR* val) { _type = val; } void Token::set(const TCHAR* text, const int32_t start, const int32_t end, const TCHAR* typ){ _startOffset = start; _endOffset = end; _type = (typ==NULL?getDefaultType():typ); positionIncrement = 1; setText(text); } void Token::setText(const TCHAR* text, int32_t l){ if ( l < 0 ) l = _tcslen(text); #ifndef LUCENE_TOKEN_WORD_LENGTH if(bufferTextLen < l+1) growBuffer(l+1); #else if ( _termTextLen > LUCENE_TOKEN_WORD_LENGTH ){ //in the case where this occurs, we will leave the endOffset as it is //since the actual word still occupies that space. l=LUCENE_TOKEN_WORD_LENGTH; } #endif _tcsncpy(_buffer,text,l); _termTextLen = l; _buffer[_termTextLen] = 0; //make sure null terminated } void Token::setTermLength(int32_t len){ if(bufferTextLengrowBuffer(len); this->_termTextLen = len; } TCHAR* Token::resizeTermBuffer(size_t size){ if(bufferTextLen_buffer; } void Token::growBuffer(size_t size){ if(bufferTextLen>=size) return; #ifndef LUCENE_TOKEN_WORD_LENGTH if ( _buffer == NULL ){ _buffer = (TCHAR*)malloc( size * sizeof(TCHAR) ); *_buffer = 0; }else{ //use realloc. growBuffer is public, therefore could be called //without a subsequent call to overwriting the memory _buffer = (TCHAR*)realloc( _buffer, size * sizeof(TCHAR) ); } bufferTextLen = size; #else _CLTHROWA(CL_ERR_TokenMgr,"Couldn't grow Token buffer"); #endif } void Token::setPositionIncrement(int32_t posIncr) { if (posIncr < 0) { _CLTHROWA(CL_ERR_IllegalArgument,"positionIncrement must be >= 0"); } positionIncrement = posIncr; } int32_t Token::getPositionIncrement() const { return positionIncrement; } const TCHAR* Token::termText() const{ return (const TCHAR*) _buffer; } TCHAR* Token::termBuffer() const{ return _buffer; } size_t Token::termTextLength() { if ( _termTextLen == -1 ) //it was invalidated by growBuffer _termTextLen = _tcslen(_buffer); return _termTextLen; } size_t Token::termLength() { if ( _termTextLen == -1 ) //it was invalidated by growBuffer _termTextLen = _tcslen(_buffer); return _termTextLen; } void Token::resetTermTextLen(){ _termTextLen=-1; } TCHAR* Token::toString() const{ StringBuffer sb; sb.append(_T("(")); if (_buffer) sb.append( _buffer ); else sb.append( _T("null") ); sb.append(_T(",")); sb.appendInt( _startOffset ); sb.append(_T(",")); sb.appendInt( _endOffset ); if (!_tcscmp( _type, _T("word")) == 0 ){ sb.append(_T(",type=")); sb.append(_type); } if (positionIncrement != 1){ sb.append(_T(",posIncr=")); sb.appendInt(positionIncrement); } sb.append(_T(")")); return sb.toString(); } CL_NS(index)::Payload* Token::getPayload() { return this->payload; } void Token::setPayload(CL_NS(index)::Payload* payload) { _CLLDELETE(this->payload); this->payload = payload; } void Token::clear() { _CLDELETE(payload); // Leave _buffer to allow re-use _termTextLen = 0; positionIncrement = 1; // startOffset = endOffset = 0; // type = DEFAULT_TYPE; } void TokenStream::reset(){ } Token* TokenStream::next(){ Token* t = _CLNEW Token; //deprecated if ( !next(t) ) _CLDELETE(t); return t; } TokenStream::~TokenStream(){ } TokenFilter::TokenFilter(TokenStream* in, bool deleteTS): input(in), deleteTokenStream(deleteTS) { } TokenFilter::~TokenFilter(){ if ( deleteTokenStream && input!=NULL ) {input->close();_CLLDELETE( input );} //close(); -- ISH 04/11/09 } // Close the input TokenStream. void TokenFilter::close() { if ( input != NULL ){ input->close(); //if ( deleteTokenStream ) _CLDELETE( input ); -- ISH 04/11/09 } //input = NULL; -- ISH 04/11/09 } Tokenizer::Tokenizer() : input(NULL) { } Tokenizer::Tokenizer(CL_NS(util)::Reader* _input): input(_input) { } void Tokenizer::close(){ if (input != NULL) { // ? delete input; input = NULL; } } void Tokenizer::reset(CL_NS(util)::Reader* _input) { // ? delete input; this->input = _input; } Tokenizer::~Tokenizer(){ close(); } int32_t Analyzer::getPositionIncrementGap(const TCHAR* /*fieldName*/) { return 0; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/analysis/AnalysisHeader.h000066400000000000000000000321221154025176300241560ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_AnalysisHeader_ #define _lucene_analysis_AnalysisHeader_ #include "CLucene/index/Payload.h" #include "CLucene/util/VoidList.h" #include "CLucene/LuceneThreads.h" CL_CLASS_DEF(util,Reader) CL_NS_DEF(analysis) typedef CL_NS(util)::CLSetList CLTCSetList; /** A Token is an occurence of a term from the text of a field. It consists of a term's text, the start and end offset of the term in the text of the field, and a type string.

The start and end offsets permit applications to re-associate a token with its source text, e.g., to display highlighted query terms in a document browser, or to show matching text fragments in a KWIC (KeyWord In Context) display, etc.

The type is an interned string, assigned by a lexical analyzer (a.k.a. tokenizer), naming the lexical or syntactic class that the token belongs to. For example an end of sentence marker token might be implemented with type "eos". The default token type is "word".

A Token can optionally have metadata (a.k.a. Payload) in the form of a variable length byte array. Use {@link lucene::index::TermPositions#getPayloadLength()} and {@link lucene::index::TermPositions#getPayload(byte[], int)} to retrieve the payloads from the index.

WARNING: The status of the Payloads feature is experimental. The APIs introduced here might change in the future and will not be supported anymore in such a case.

Tokenizers and filters should try to re-use a Token instance when possible for best performance, by implementing the {@link lucene::index::TokenStream#next(Token)} API. Failing that, to create a new Token you should first use one of the constructors that starts with null text. Then you should call either {@link #termBuffer()} or {@link #resizeTermBuffer(int)} to retrieve the Token's termBuffer. Fill in the characters of your term into this buffer, and finally call {@link #setTermLength(int)} to set the length of the term text. See LUCENE-969 for details.

@see Payload */ class CLUCENE_EXPORT Token:LUCENE_BASE{ private: int32_t _startOffset; ///< start in source text int32_t _endOffset; ///< end in source text const TCHAR* _type; ///< lexical type int32_t positionIncrement; size_t bufferTextLen; #ifndef LUCENE_TOKEN_WORD_LENGTH TCHAR* _buffer; ///< the text of the term #else TCHAR _buffer[LUCENE_TOKEN_WORD_LENGTH+1]; ///< the text of the term #endif int32_t _termTextLen; ///< the length of termText. Internal use only CL_NS(index)::Payload* payload; public: static const TCHAR* getDefaultType(); Token(); virtual ~Token(); /// Constructs a Token with the given text, start and end offsets, & type. Token(const TCHAR* text, const int32_t start, const int32_t end, const TCHAR* typ=NULL); void set(const TCHAR* text, const int32_t start, const int32_t end, const TCHAR* typ=NULL); size_t bufferLength(); void growBuffer(size_t size); TCHAR* resizeTermBuffer(size_t size); /** Set the position increment. This determines the position of this * token relative to the previous Token in a TokenStream, used in * phrase searching. * * The default value is 1. * * Some common uses for this are: * * - Set it to zero to put multiple terms in the same position. This is * useful if, e.g., a word has multiple stems. Searches for phrases * including either stem will match. In this case, all but the first stem's * increment should be set to zero: the increment of the first instance * should be one. Repeating a token with an increment of zero can also be * used to boost the scores of matches on that token. * * - Set it to values greater than one to inhibit exact phrase matches. * If, for example, one does not want phrases to match across removed stop * words, then one could build a stop word filter that removes stop words and * also sets the increment to the number of stop words removed before each * non-stop word. Then exact phrase queries will only match when the terms * occur with no intervening stop words. */ void setPositionIncrement(int32_t posIncr); int32_t getPositionIncrement() const; /** Returns the internal termBuffer character array which * you can then directly alter. If the array is too * small for your token, use {@link * #resizeTermBuffer(int)} to increase it. After * altering the buffer be sure to call {@link * #setTermLength} to record the number of valid * characters that were placed into the termBuffer. */ TCHAR* termBuffer() const; size_t termLength(); //< Length of the the termBuffer. See #termBuffer _CL_DEPRECATED( termBuffer ) const TCHAR* termText() const; //< See #termBuffer() _CL_DEPRECATED( termLength ) size_t termTextLength(); //< See #termLength void resetTermTextLen(); //< Empties the termBuffer. See #termBuffer void setText(const TCHAR* txt, int32_t len=-1); //< Sets the termBuffer. See #termBuffer /** * Returns this Token's starting offset, the position of the first character * corresponding to this token in the source text. * * Note that the difference between endOffset() and startOffset() may not be * equal to termText.length(), as the term text may have been altered by a * stemmer or some other filter. */ int32_t startOffset() const; /** Set the starting offset. @see #startOffset() */ void setStartOffset(const int32_t val); void setTermLength(int32_t); /** * Returns this Token's ending offset, one greater than the position of the * last character corresponding to this token in the source text. */ int32_t endOffset() const; /** Set the ending offset. @see #endOffset() */ void setEndOffset(const int32_t val); /// Returns this Token's lexical type. Defaults to "word". const TCHAR* type() const; /// This is an abstract class. Concrete subclasses are:
  • {@link Tokenizer}, a TokenStream whose input is a Reader; and
  • {@link TokenFilter}, a TokenStream whose input is another TokenStream.
NOTE: subclasses must override at least one of {@link #next()} or {@link #next(Token)}. */ class CLUCENE_EXPORT TokenStream { public: /** Returns the next token in the stream, or null at EOS. * When possible, the input Token should be used as the * returned Token (this gives fastest tokenization * performance), but this is not required and a new Token * may be returned (pass NULL for this). * Callers may re-use a single Token instance for successive * calls to this method. *

* This implicitly defines a "contract" between * consumers (callers of this method) and * producers (implementations of this method * that are the source for tokens): *

    *
  • A consumer must fully consume the previously * returned Token before calling this method again.
  • *
  • A producer must call {@link Token#clear()} * before setting the fields in it & returning it
  • *
* Note that a {@link TokenFilter} is considered a consumer. * @param result a Token that may or may not be used to return * @return next token in the stream or null if end-of-stream was hit */ virtual Token* next(Token* token) = 0; /** This is for backwards compatibility only. You should pass the token you want to fill * to next(), this will save a lot of object construction and destructions. * @deprecated. use next(token). Kept only to avoid breaking existing code. */ _CL_DEPRECATED(next(Token)) Token* next(); /** Releases resources associated with this stream. */ virtual void close() = 0; /** Resets this stream to the beginning. This is an * optional operation, so subclasses may or may not * implement this method. Reset() is not needed for * the standard indexing process. However, if the Tokens * of a TokenStream are intended to be consumed more than * once, it is necessary to implement reset(). */ virtual void reset(); virtual ~TokenStream(); }; /** An Analyzer builds TokenStreams, which analyze text. It thus represents a * policy for extracting index terms from text. *

* Typical implementations first build a Tokenizer, which breaks the stream of * characters from the Reader into raw Tokens. One or more TokenFilters may * then be applied to the output of the Tokenizer. *

* WARNING: You must override one of the methods defined by this class in your * subclass or the Analyzer will enter an infinite loop. */ class CLUCENE_EXPORT Analyzer{ public: Analyzer(); /** Creates a TokenStream which tokenizes all the text in the provided Reader. Default implementation forwards to tokenStream(Reader) for compatibility with older version. Override to allow Analyzer to choose strategy based on document and/or field. Must be able to handle null field name for backward compatibility. */ virtual TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader)=0; /** Creates a TokenStream that is allowed to be re-used * from the previous time that the same thread called * this method. Callers that do not need to use more * than one TokenStream at the same time from this * analyzer should use this method for better * performance. */ virtual TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); private: DEFINE_MUTEX(THIS_LOCK) struct Internal; Internal* _internal; protected: /** Used by Analyzers that implement reusableTokenStream * to retrieve previously saved TokenStreams for re-use * by the same thread. */ TokenStream* getPreviousTokenStream(); /** Used by Analyzers that implement reusableTokenStream * to save a TokenStream for later re-use by the same * thread. */ void setPreviousTokenStream(TokenStream* obj); public: /** * Invoked before indexing a Field instance if * terms have already been added to that field. This allows custom * analyzers to place an automatic position increment gap between * Field instances using the same field name. The default value * position increment gap is 0. With a 0 position increment gap and * the typical default token position increment of 1, all terms in a field, * including across Field instances, are in successive positions, allowing * exact PhraseQuery matches, for instance, across Field instance boundaries. * * @param fieldName Field name being indexed. * @return position increment gap, added to the next token emitted from {@link #tokenStream(TCHAR*, Reader*)} */ virtual int32_t getPositionIncrementGap(const TCHAR* fieldName); virtual ~Analyzer(); }; /** A Tokenizer is a TokenStream whose input is a Reader.

This is an abstract class.

NOTE: subclasses must override at least one of {@link #next()} or {@link #next(Token)}.

NOTE: subclasses overriding {@link #next(Token)} must call {@link Token#clear()}. */ class CLUCENE_EXPORT Tokenizer:public TokenStream { protected: /** The text source for this Tokenizer. */ CL_NS(util)::Reader* input; public: /** Construct a tokenizer with null input. */ Tokenizer(); /** Construct a token stream processing the given input. */ Tokenizer(CL_NS(util)::Reader* _input); /** By default, closes the input Reader. */ virtual void close(); /** Expert: Reset the tokenizer to a new reader. Typically, an * analyzer (in its reusableTokenStream method) will use * this to re-use a previously created tokenizer. */ virtual void reset(CL_NS(util)::Reader* _input); virtual ~Tokenizer(); }; /** A TokenFilter is a TokenStream whose input is another token stream.

This is an abstract class. */ class CLUCENE_EXPORT TokenFilter:public TokenStream { protected: /** The source of tokens for this filter. */ TokenStream* input; /** If true then input will be deleted in the destructor */ bool deleteTokenStream; /** Construct a token stream filtering the given input. * * @param in The TokenStream to filter from * @param deleteTS If true, input will be deleted in the destructor */ TokenFilter(TokenStream* in, bool deleteTS=false); virtual ~TokenFilter(); public: /** Close the input TokenStream. */ void close(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/analysis/Analyzers.cpp000066400000000000000000000404421154025176300235710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Analyzers.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/Misc.h" #include CL_NS_USE(util) CL_NS_DEF(analysis) CharTokenizer::CharTokenizer(Reader* in) : Tokenizer(in), offset(0), bufferIndex(0), dataLen(0), ioBuffer(NULL) { buffer[0]=0; } CharTokenizer::~CharTokenizer(){ } TCHAR CharTokenizer::normalize(const TCHAR c) const { return c; } Token* CharTokenizer::next(Token* token){ int32_t length = 0; int32_t start = offset; while (true) { TCHAR c; offset++; if (bufferIndex >= dataLen) { dataLen = input->read(ioBuffer, 1, LUCENE_IO_BUFFER_SIZE ); if (dataLen == -1) dataLen = 0; bufferIndex = 0; } if (dataLen <= 0 ) { if (length > 0) break; else return NULL; }else c = ioBuffer[bufferIndex++]; if (isTokenChar(c)) { // if it's a token TCHAR if (length == 0) // start of token start = offset-1; buffer[length++] = normalize(c); // buffer it, normalized if (length == LUCENE_MAX_WORD_LEN) // buffer overflow! break; } else if (length > 0) // at non-Letter w/ chars break; // return 'em } buffer[length]=0; token->set( buffer, start, start+length); return token; } void CharTokenizer::reset(CL_NS(util)::Reader* input) { Tokenizer::reset(input); bufferIndex = 0; offset = 0; dataLen = 0; } LetterTokenizer::LetterTokenizer(CL_NS(util)::Reader* in): CharTokenizer(in) { } LetterTokenizer::~LetterTokenizer(){} bool LetterTokenizer::isTokenChar(const TCHAR c) const { return _istalpha(c)!=0; } LowerCaseTokenizer::LowerCaseTokenizer(CL_NS(util)::Reader* in): LetterTokenizer(in) { } LowerCaseTokenizer::~LowerCaseTokenizer(){ } TCHAR LowerCaseTokenizer::normalize(const TCHAR chr) const { return _totlower(chr); } WhitespaceTokenizer::WhitespaceTokenizer(CL_NS(util)::Reader* in):CharTokenizer(in) { } WhitespaceTokenizer::~WhitespaceTokenizer(){ } bool WhitespaceTokenizer::isTokenChar(const TCHAR c) const{ return _istspace(c)==0; //(return true if NOT a space) } WhitespaceAnalyzer::WhitespaceAnalyzer(){ } WhitespaceAnalyzer::~WhitespaceAnalyzer(){ } TokenStream* WhitespaceAnalyzer::tokenStream(const TCHAR* /*fieldName*/, Reader* reader) { return _CLNEW WhitespaceTokenizer(reader); } TokenStream* WhitespaceAnalyzer::reusableTokenStream(const TCHAR* /*fieldName*/, CL_NS(util)::Reader* reader) { Tokenizer* tokenizer = static_cast(getPreviousTokenStream()); if (tokenizer == NULL) { tokenizer = _CLNEW WhitespaceTokenizer(reader); setPreviousTokenStream(tokenizer); } else tokenizer->reset(reader); return tokenizer; } SimpleAnalyzer::SimpleAnalyzer(){ } SimpleAnalyzer::~SimpleAnalyzer(){ } TokenStream* SimpleAnalyzer::tokenStream(const TCHAR* /*fieldName*/, Reader* reader) { return _CLNEW LowerCaseTokenizer(reader); } TokenStream* SimpleAnalyzer::reusableTokenStream(const TCHAR* /*fieldName*/, CL_NS(util)::Reader* reader) { Tokenizer* tokenizer = static_cast(getPreviousTokenStream()); if (tokenizer == NULL) { tokenizer = _CLNEW LowerCaseTokenizer(reader); setPreviousTokenStream(tokenizer); } else tokenizer->reset(reader); return tokenizer; } LowerCaseFilter::LowerCaseFilter(TokenStream* in, bool deleteTokenStream): TokenFilter(in,deleteTokenStream) { } LowerCaseFilter::~LowerCaseFilter(){ } Token* LowerCaseFilter::next(Token* t){ if (input->next(t) == NULL) return NULL; stringCaseFold( t->termBuffer() ); return t; } bool StopFilter::ENABLE_POSITION_INCREMENTS_DEFAULT = false; /** Constructs a filter which removes words from the input * TokenStream that are named in the CLSetList. */ StopFilter::StopFilter(TokenStream* in, bool deleteTokenStream, CLTCSetList* stopTable, bool _deleteStopTable): TokenFilter(in, deleteTokenStream), stopWords (stopTable), deleteStopTable(_deleteStopTable), enablePositionIncrements(ENABLE_POSITION_INCREMENTS_DEFAULT), ignoreCase(false) { } StopFilter::StopFilter(TokenStream* in, bool deleteTokenStream, const TCHAR** _stopWords, const bool _ignoreCase): TokenFilter(in, deleteTokenStream), enablePositionIncrements(ENABLE_POSITION_INCREMENTS_DEFAULT), ignoreCase(_ignoreCase) { deleteStopTable = true; stopWords = _CLNEW CLTCSetList(true); fillStopTable( stopWords,_stopWords, _ignoreCase ); } StopFilter::~StopFilter(){ if (deleteStopTable) _CLLDELETE(stopWords); } //static bool StopFilter::getEnablePositionIncrementsDefault() { return ENABLE_POSITION_INCREMENTS_DEFAULT; } //static void StopFilter::setEnablePositionIncrementsDefault(const bool defaultValue) { ENABLE_POSITION_INCREMENTS_DEFAULT = defaultValue; } bool StopFilter::getEnablePositionIncrements() const { return enablePositionIncrements; } void StopFilter::setEnablePositionIncrements(const bool enable) { this->enablePositionIncrements = enable; } void StopFilter::fillStopTable(CLTCSetList* stopTable, const TCHAR** stopWords, const bool _ignoreCase) { TCHAR* tmp; if ( _ignoreCase ){ for (int32_t i = 0; stopWords[i]!=NULL; i++){ tmp = STRDUP_TtoT(stopWords[i]); stringCaseFold(tmp); stopTable->insert( tmp ); } }else{ for (int32_t i = 0; stopWords[i]!=NULL; i++){ tmp = STRDUP_TtoT(stopWords[i]); stopTable->insert( tmp ); } } } Token* StopFilter::next(Token* token) { // return the first non-stop word found int32_t skippedPositions = 0; while (input->next(token)){ TCHAR* termText = token->termBuffer(); if ( ignoreCase ){ stringCaseFold(termText); } if (stopWords->find(termText)==stopWords->end()){ if (enablePositionIncrements) { token->setPositionIncrement(token->getPositionIncrement() + skippedPositions); } return token; } skippedPositions += token->getPositionIncrement(); } // reached EOS -- return nothing return NULL; } StopAnalyzer::StopAnalyzer(const char* stopwordsFile, const char* enc): stopTable(_CLNEW CLTCSetList(true)) { if ( enc == NULL ) enc = "ASCII"; WordlistLoader::getWordSet(stopwordsFile, enc, stopTable); } StopAnalyzer::StopAnalyzer(CL_NS(util)::Reader* stopwordsReader, const bool _bDeleteReader): stopTable(_CLNEW CLTCSetList(true)) { WordlistLoader::getWordSet(stopwordsReader, stopTable, _bDeleteReader); } StopAnalyzer::StopAnalyzer(): stopTable(_CLNEW CLTCSetList(true)) { StopFilter::fillStopTable(stopTable,ENGLISH_STOP_WORDS); } class StopAnalyzer::SavedStreams : public TokenStream { public: Tokenizer* source; TokenStream* result; SavedStreams():source(NULL), result(NULL) {} void close(){} Token* next(Token* token) {return NULL;} }; StopAnalyzer::~StopAnalyzer() { SavedStreams* t = reinterpret_cast(this->getPreviousTokenStream()); if (t) _CLDELETE(t->result); _CLDELETE(stopTable); } StopAnalyzer::StopAnalyzer( const TCHAR** stopWords): stopTable(_CLNEW CLTCSetList(true)) { StopFilter::fillStopTable(stopTable,stopWords); } TokenStream* StopAnalyzer::tokenStream(const TCHAR* /*fieldName*/, Reader* reader) { return _CLNEW StopFilter(_CLNEW LowerCaseTokenizer(reader),true, stopTable); } /** Filters LowerCaseTokenizer with StopFilter. */ TokenStream* StopAnalyzer::reusableTokenStream(const TCHAR* fieldName, Reader* reader) { SavedStreams* streams = reinterpret_cast(getPreviousTokenStream()); if (streams == NULL) { streams = _CLNEW SavedStreams(); streams->source = _CLNEW LowerCaseTokenizer(reader); streams->result = _CLNEW StopFilter(streams->source, true, stopTable); setPreviousTokenStream(streams); } else streams->source->reset(reader); return streams->result; } const TCHAR* StopAnalyzer::ENGLISH_STOP_WORDS[] = { _T("a"), _T("an"), _T("and"), _T("are"), _T("as"), _T("at"), _T("be"), _T("but"), _T("by"), _T("for"), _T("if"), _T("in"), _T("into"), _T("is"), _T("it"), _T("no"), _T("not"), _T("of"), _T("on"), _T("or"), _T("such"), _T("that"), _T("the"), _T("their"), _T("then"), _T("there"), _T("these"), _T("they"), _T("this"), _T("to"), _T("was"), _T("will"), _T("with"), NULL }; PerFieldAnalyzerWrapper::PerFieldAnalyzerWrapper(Analyzer* defaultAnalyzer): analyzerMap(_CLNEW AnalyzerMapType(true,true)) { this->defaultAnalyzer = defaultAnalyzer; } PerFieldAnalyzerWrapper::~PerFieldAnalyzerWrapper(){ analyzerMap->clear(); _CLLDELETE(analyzerMap); _CLLDELETE(defaultAnalyzer); } void PerFieldAnalyzerWrapper::addAnalyzer(const TCHAR* fieldName, Analyzer* analyzer) { analyzerMap->put(STRDUP_TtoT(fieldName), analyzer); } TokenStream* PerFieldAnalyzerWrapper::tokenStream(const TCHAR* fieldName, Reader* reader) { Analyzer* analyzer = analyzerMap->get(const_cast(fieldName)); if (analyzer == NULL) { analyzer = defaultAnalyzer; } return analyzer->tokenStream(fieldName, reader); } TokenStream* PerFieldAnalyzerWrapper::reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { Analyzer* analyzer = analyzerMap->get(const_cast(fieldName)); if (analyzer == NULL){ analyzer = defaultAnalyzer; } return analyzer->reusableTokenStream(fieldName, reader); } int32_t PerFieldAnalyzerWrapper::getPositionIncrementGap(const TCHAR* fieldName) { Analyzer* analyzer = analyzerMap->get(const_cast(fieldName)); if (analyzer == NULL) analyzer = defaultAnalyzer; return analyzer->getPositionIncrementGap(fieldName); } ISOLatin1AccentFilter::ISOLatin1AccentFilter(TokenStream* input, bool deleteTs): TokenFilter(input,deleteTs) { } ISOLatin1AccentFilter::~ISOLatin1AccentFilter(){ } Token* ISOLatin1AccentFilter::next(Token* token){ if ( input->next(token) != NULL ){ int32_t l = token->termLength(); const TCHAR* chars = token->termBuffer(); bool doProcess = false; for (int32_t i = 0; i < l; ++i) { #ifdef _UCS2 if ( chars[i] >= 0xC0 && chars[i] <= 0x178 ) { #else if ( (chars[i] >= 0xC0 && chars[i] <= 0xFF) || chars[i] < 0 ) { #endif doProcess = true; break; } } if ( !doProcess ) { return token; } StringBuffer output(l*2); for (int32_t j = 0; j < l; j++) { #ifdef _UCS2 TCHAR c = chars[j]; #else unsigned char c = chars[j]; #endif switch (c) { case 0xC0 : // � case 0xC1 : // � case 0xC2 : // � case 0xC3 : // � case 0xC4 : // � case 0xC5 : // � output.appendChar('A'); break; case 0xC6 : // � output.append(_T("AE")); break; case 0xC7 : // � output.appendChar('C'); break; case 0xC8 : // � case 0xC9 : // � case 0xCA : // � case 0xCB : // � output.appendChar('E'); break; case 0xCC : // � case 0xCD : // � case 0xCE : // � case 0xCF : // � output.appendChar('I'); break; case 0xD0 : // � output.appendChar('D'); break; case 0xD1 : // � output.appendChar('N'); break; case 0xD2 : // � case 0xD3 : // � case 0xD4 : // � case 0xD5 : // � case 0xD6 : // � case 0xD8 : // � output.appendChar('O'); break; case 0xDE : // � output.append(_T("TH")); break; case 0xD9 : // � case 0xDA : // � case 0xDB : // � case 0xDC : // � output.appendChar('U'); break; case 0xDD : // � output.appendChar('Y'); break; case 0xE0 : // � case 0xE1 : // � case 0xE2 : // � case 0xE3 : // � case 0xE4 : // � case 0xE5 : // � output.appendChar('a'); break; case 0xE6 : // � output.append(_T("ae")); break; case 0xE7 : // � output.appendChar('c'); break; case 0xE8 : // � case 0xE9 : // � case 0xEA : // � case 0xEB : // � output.appendChar('e'); break; case 0xEC : // � case 0xED : // � case 0xEE : // � case 0xEF : // � output.appendChar('i'); break; case 0xF0 : // � output.appendChar('d'); break; case 0xF1 : // � output.appendChar('n'); break; case 0xF2 : // � case 0xF3 : // � case 0xF4 : // � case 0xF5 : // � case 0xF6 : // � case 0xF8 : // � output.appendChar('o'); break; case 0xDF : // � output.append(_T("ss")); break; case 0xFE : // � output.append(_T("th")); break; case 0xF9 : // � case 0xFA : // � case 0xFB : // � case 0xFC : // � output.appendChar('u'); break; case 0xFD : // � case 0xFF : // � output.appendChar('y'); break; #ifdef _UCS2 case 0x152 : // � output.append(_T("OE")); break; case 0x153 : // � output.append(_T("oe")); break; case 0x178 : // � output.appendChar('Y'); break; #endif default : output.appendChar(c); break; } } token->setText(output.getBuffer()); return token; } return NULL; } KeywordAnalyzer::KeywordAnalyzer(){} KeywordAnalyzer::~KeywordAnalyzer(){} TokenStream* KeywordAnalyzer::tokenStream(const TCHAR* /*fieldName*/, CL_NS(util)::Reader* reader){ return _CLNEW KeywordTokenizer(reader); } TokenStream* KeywordAnalyzer::reusableTokenStream(const TCHAR* /*fieldName*/, CL_NS(util)::Reader* reader) { Tokenizer* tokenizer = static_cast(getPreviousTokenStream()); if (tokenizer == NULL) { tokenizer = _CLNEW KeywordTokenizer(reader); setPreviousTokenStream(tokenizer); } else tokenizer->reset(reader); return tokenizer; } KeywordTokenizer::KeywordTokenizer(CL_NS(util)::Reader* input, int bufferSize): Tokenizer(input) { this->done = false; this->bufferSize = bufferSize; if ( bufferSize < 1 ) this->bufferSize = DEFAULT_BUFFER_SIZE; } KeywordTokenizer::~KeywordTokenizer(){ } Token* KeywordTokenizer::next(Token* token){ if (!done) { done = true; int32_t upto = 0; int32_t rd; token->clear(); TCHAR* termBuffer=token->termBuffer(); const TCHAR* readBuffer=NULL; while (true) { rd = input->read(readBuffer, 1, cl_min(bufferSize, token->bufferLength()-upto) ); if (rd == -1) break; if ( upto == token->bufferLength() ){ termBuffer = token->resizeTermBuffer(token->bufferLength() + 8); } _tcsncpy(termBuffer + upto, readBuffer, rd); upto += rd; } if ( token->bufferLength() < upto + 1 ){ termBuffer=token->resizeTermBuffer(token->bufferLength() + 8); } termBuffer[upto]=0; token->setTermLength(upto); return token; } return NULL; } void KeywordTokenizer::reset(CL_NS(util)::Reader* input) { Tokenizer::reset(input); this->done = false; } LengthFilter::LengthFilter(TokenStream* in, const size_t _min, const size_t _max): TokenFilter(in) { this->_min = _min; this->_max = _max; } Token* LengthFilter::next(Token* token) { // return the first non-stop word found while ( input->next(token) ) { size_t len = token->termLength(); if (len >= _min && len <= _max) return token; // note: else we ignore it but should we index each part of it? } // reached EOS -- return null return NULL; } CLTCSetList* WordlistLoader::getWordSet(const char* wordfilePath, const char* enc, CLTCSetList* stopTable) { if ( enc == NULL ) enc = "ASCII"; CL_NS(util)::FileReader* reader = NULL; try { reader = _CLNEW CL_NS(util)::FileReader(wordfilePath, enc, LUCENE_DEFAULT_TOKEN_BUFFER_SIZE); stopTable = getWordSet(reader, stopTable); } _CLFINALLY ( if (reader != NULL) { //reader->close(); _CLLDELETE(reader); } ); return stopTable; } //static CLTCSetList* WordlistLoader::getWordSet(CL_NS(util)::Reader* reader, CLTCSetList* stopTable, const bool bDeleteReader) { if (!stopTable) stopTable = _CLNEW CLTCSetList(true); TCHAR* word = NULL; try { word = _CL_NEWARRAY(TCHAR, LUCENE_DEFAULT_TOKEN_BUFFER_SIZE); while (reader->readLine(word, LUCENE_DEFAULT_TOKEN_BUFFER_SIZE) > 0) { stopTable->insert( STRDUP_TtoT(CL_NS(util)::Misc::wordTrim(word))); } } _CLFINALLY ( if (bDeleteReader && reader != NULL) { //reader->close(); _CLDELETE(reader); } _CLDELETE_ARRAY(word); ); return stopTable; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/analysis/Analyzers.h000066400000000000000000000320131154025176300232310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_Analyzers_ #define _lucene_analysis_Analyzers_ #include "CLucene/util/VoidList.h" #include "CLucene/util/VoidMap.h" #include "CLucene/util/CLStreams.h" #include "AnalysisHeader.h" CL_NS_DEF(analysis) /** An abstract base class for simple, character-oriented tokenizers.*/ class CLUCENE_EXPORT CharTokenizer:public Tokenizer { private: int32_t offset, bufferIndex, dataLen; TCHAR buffer[LUCENE_MAX_WORD_LEN+1]; const TCHAR* ioBuffer; protected: /** Returns true iff a character should be included in a token. This * tokenizer generates as tokens adjacent sequences of characters which * satisfy this predicate. Characters for which this is false are used to * define token boundaries and are not included in tokens. */ virtual bool isTokenChar(const TCHAR c) const = 0; /** Called on each token character to normalize it before it is added to the * token. The default implementation does nothing. Subclasses may use this * to, e.g., lowercase tokens. */ virtual TCHAR normalize(const TCHAR c) const; public: CharTokenizer(CL_NS(util)::Reader* in); Token* next(Token* token); void reset(CL_NS(util)::Reader* input); virtual ~CharTokenizer(); }; /** A LetterTokenizer is a tokenizer that divides text at non-letters. That's to say, it defines tokens as maximal strings of adjacent letters, as defined by java.lang.Character.isLetter() predicate. Note: this does a decent job for most European languages, but does a terrible job for some Asian languages, where words are not separated by spaces. */ class CLUCENE_EXPORT LetterTokenizer:public CharTokenizer { public: // Construct a new LetterTokenizer. LetterTokenizer(CL_NS(util)::Reader* in); virtual ~LetterTokenizer(); protected: /** Collects only characters which satisfy _istalpha.*/ bool isTokenChar(const TCHAR c) const; }; /** * LowerCaseTokenizer performs the function of LetterTokenizer * and LowerCaseFilter together. It divides text at non-letters and converts * them to lower case. While it is functionally equivalent to the combination * of LetterTokenizer and LowerCaseFilter, there is a performance advantage * to doing the two tasks at once, hence this (redundant) implementation. *

* Note: this does a decent job for most European languages, but does a terrible * job for some Asian languages, where words are not separated by spaces. */ class CLUCENE_EXPORT LowerCaseTokenizer:public LetterTokenizer { public: /** Construct a new LowerCaseTokenizer. */ LowerCaseTokenizer(CL_NS(util)::Reader* in); virtual ~LowerCaseTokenizer(); protected: /** Collects only characters which satisfy _totlower. */ TCHAR normalize(const TCHAR chr) const; }; /** A WhitespaceTokenizer is a tokenizer that divides text at whitespace. * Adjacent sequences of non-Whitespace characters form tokens. */ class CLUCENE_EXPORT WhitespaceTokenizer: public CharTokenizer { public: /** Construct a new WhitespaceTokenizer. */ WhitespaceTokenizer(CL_NS(util)::Reader* in); virtual ~WhitespaceTokenizer(); protected: /** Collects only characters which do not satisfy _istspace.*/ bool isTokenChar(const TCHAR c) const; }; /** An Analyzer that uses WhitespaceTokenizer. */ class CLUCENE_EXPORT WhitespaceAnalyzer: public Analyzer { public: WhitespaceAnalyzer(); TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); virtual ~WhitespaceAnalyzer(); }; /** An Analyzer that filters LetterTokenizer with LowerCaseFilter. */ class CLUCENE_EXPORT SimpleAnalyzer: public Analyzer { public: SimpleAnalyzer(); TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); virtual ~SimpleAnalyzer(); }; /** * Normalizes token text to lower case. */ class CLUCENE_EXPORT LowerCaseFilter: public TokenFilter { public: LowerCaseFilter(TokenStream* in, bool deleteTokenStream); virtual ~LowerCaseFilter(); Token* next(Token* token); }; /** * Removes stop words from a token stream. */ class CLUCENE_EXPORT StopFilter: public TokenFilter { private: //bvk: i found this to work faster with a non-hash table. the number of items //in the stop table is not like to make it worth having hashing. //ish: implement a radix/patricia tree for this? CLTCSetList* stopWords; bool deleteStopTable; bool enablePositionIncrements; const bool ignoreCase; public: static bool ENABLE_POSITION_INCREMENTS_DEFAULT; // Constructs a filter which removes words from the input // TokenStream that are named in the array of words. StopFilter(TokenStream* in, bool deleteTokenStream, const TCHAR** _stopWords, const bool _ignoreCase = false); virtual ~StopFilter(); /** Constructs a filter which removes words from the input * TokenStream that are named in the CLSetList. */ StopFilter(TokenStream* in, bool deleteTokenStream, CLTCSetList* stopTable, bool _deleteStopTable=false); /** * Builds a Hashtable from an array of stop words, appropriate for passing * into the StopFilter constructor. This permits this table construction to * be cached once when an Analyzer is constructed. * Note: the stopWords list must be a static list because the strings are not copied */ static void fillStopTable(CLTCSetList* stopTable, const TCHAR** stopWords, const bool _ignoreCase = false); /** * Returns the next input Token whose termText() is not a stop word. */ Token* next(Token* token); /** * @see #setEnablePositionIncrementsDefault(boolean). */ static bool getEnablePositionIncrementsDefault(); /** * Set the default position increments behavior of every StopFilter created from now on. *

* Note: behavior of a single StopFilter instance can be modified * with {@link #setEnablePositionIncrements(boolean)}. * This static method allows control over behavior of classes using StopFilters internally, * for example {@link lucene::analysis::standard::StandardAnalyzer StandardAnalyzer}. *

* Default : false. * @see #setEnablePositionIncrements(boolean). */ static void setEnablePositionIncrementsDefault(const bool defaultValue); /** * @see #setEnablePositionIncrements(boolean). */ bool getEnablePositionIncrements() const; /** * Set to true to make this StopFilter enable position increments to result tokens. *

* When set, when a token is stopped (omitted), the position increment of * the following token is incremented. *

* Default: see {@link #setEnablePositionIncrementsDefault(boolean)}. */ void setEnablePositionIncrements(const bool enable); }; /** * Loader for text files that represent a list of stopwords. * */ class CLUCENE_EXPORT WordlistLoader { public: /** * Loads a text file and adds every line as an entry to a HashSet (omitting * leading and trailing whitespace). Every line of the file should contain only * one word. The words need to be in lowercase if you make use of an * Analyzer which uses LowerCaseFilter (like StandardAnalyzer). * * @param wordfile File containing the wordlist * @return A HashSet with the file's words */ static CLTCSetList* getWordSet(const char* wordfilePath, const char* enc = NULL, CLTCSetList* stopTable = NULL); /** * Reads lines from a Reader and adds every line as an entry to a HashSet (omitting * leading and trailing whitespace). Every line of the Reader should contain only * one word. The words need to be in lowercase if you make use of an * Analyzer which uses LowerCaseFilter (like StandardAnalyzer). * * @param reader Reader containing the wordlist * @return A HashSet with the reader's words */ static CLTCSetList* getWordSet(CL_NS(util)::Reader* reader, CLTCSetList* stopTable = NULL, const bool bDeleteReader = false); }; /** Filters LetterTokenizer with LowerCaseFilter and StopFilter. */ class CLUCENE_EXPORT StopAnalyzer: public Analyzer { CLTCSetList* stopTable; class SavedStreams; public: /** Builds an analyzer which removes words in ENGLISH_STOP_WORDS. */ StopAnalyzer(); virtual ~StopAnalyzer(); /** Builds an analyzer which removes words in the provided array. */ StopAnalyzer( const TCHAR** stopWords ); /** Builds an analyzer with the stop words from the given file. * @see WordlistLoader#getWordSet(File) */ StopAnalyzer(const char* stopwordsFile, const char* enc = NULL); /** Builds an analyzer with the stop words from the given reader. * @see WordlistLoader#getWordSet(Reader) */ StopAnalyzer(CL_NS(util)::Reader* stopwordsReader, const bool _bDeleteReader = false); /** Filters LowerCaseTokenizer with StopFilter. */ TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); /** An array containing some common English words that are not usually useful for searching. */ static const TCHAR* ENGLISH_STOP_WORDS[]; }; /** * This analyzer is used to facilitate scenarios where different * fields require different analysis techniques. Use {@link #addAnalyzer} * to add a non-default analyzer on a field name basis. * *

Example usage: * *

 *   PerFieldAnalyzerWrapper* aWrapper =
 *      new PerFieldAnalyzerWrapper(new StandardAnalyzer());
 *   aWrapper.addAnalyzer("firstname", new KeywordAnalyzer());
 *   aWrapper.addAnalyzer("lastname", new KeywordAnalyzer());
 * 
* *

In this example, StandardAnalyzer will be used for all fields except "firstname" * and "lastname", for which KeywordAnalyzer will be used. * *

A PerFieldAnalyzerWrapper can be used like any other analyzer, for both indexing * and query parsing. */ class CLUCENE_EXPORT PerFieldAnalyzerWrapper : public Analyzer { private: Analyzer* defaultAnalyzer; typedef CL_NS(util)::CLHashMap > AnalyzerMapType; AnalyzerMapType* analyzerMap; public: /** * Constructs with default analyzer. * * @param defaultAnalyzer Any fields not specifically * defined to use a different analyzer will use the one provided here. */ PerFieldAnalyzerWrapper(Analyzer* defaultAnalyzer); virtual ~PerFieldAnalyzerWrapper(); /** * Defines an analyzer to use for the specified field. * * @param fieldName field name requiring a non-default analyzer * @param analyzer non-default analyzer to use for field */ void addAnalyzer(const TCHAR* fieldName, Analyzer* analyzer); TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); /** Return the positionIncrementGap from the analyzer assigned to fieldName */ int32_t getPositionIncrementGap(const TCHAR* fieldName); }; /** * A filter that replaces accented characters in the ISO Latin 1 character set * (ISO-8859-1) by their unaccented equivalent. The case will not be altered. *

* For instance, 'à' will be replaced by 'a'. *

*/ class CLUCENE_EXPORT ISOLatin1AccentFilter: public TokenFilter { public: ISOLatin1AccentFilter(TokenStream* input, bool deleteTs); /** * To replace accented characters in a String by unaccented equivalents. */ Token* next(Token* token); virtual ~ISOLatin1AccentFilter(); }; /** * Emits the entire input as a single token. */ class CLUCENE_EXPORT KeywordTokenizer: public Tokenizer { private: LUCENE_STATIC_CONSTANT(int, DEFAULT_BUFFER_SIZE = 256); bool done; int bufferSize; public: KeywordTokenizer(CL_NS(util)::Reader* input, int bufferSize=-1); Token* next(Token* token); void reset(CL_NS(util)::Reader* input); virtual ~KeywordTokenizer(); }; /** * "Tokenizes" the entire stream as a single token. This is useful * for data like zip codes, ids, and some product names. */ class CLUCENE_EXPORT KeywordAnalyzer: public Analyzer { public: KeywordAnalyzer(); virtual ~KeywordAnalyzer(); TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); }; /** * Removes words that are too long and too short from the stream. * */ class CLUCENE_EXPORT LengthFilter: public TokenFilter { private: size_t _min; size_t _max; public: /** * Build a filter that removes words that are too long or too * short from the text. */ LengthFilter(TokenStream* in, const size_t _min, const size_t _max); /** * Returns the next input Token whose termText() is the right len */ Token* next(Token* token); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/analysis/CachingTokenFilter.cpp000066400000000000000000000033701154025176300253230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CachingTokenFilter.h" CL_NS_DEF(analysis) CachingTokenFilter::CachingTokenFilter( TokenStream * input, bool bDeleteTS ) : TokenFilter( input, bDeleteTS ) { bCacheInitialized = false; } CachingTokenFilter::~CachingTokenFilter() { for( itCache = cache.begin(); itCache != cache.end(); itCache++ ) delete (*itCache); cache.clear(); } Token * CachingTokenFilter::next( Token* t ) { if( ! bCacheInitialized ) { fillCache(); bCacheInitialized = true; itCache = cache.begin(); } // if the cache is exhausted, return null if( itCache == cache.end() ) return NULL; t->set( (*itCache)->termBuffer(), (*itCache)->startOffset(), (*itCache)->endOffset(), (*itCache)->type() ); t->setPositionIncrement( (*itCache)->getPositionIncrement() ); t->setPayload( (*itCache)->getPayload() ); itCache++; return t; } void CachingTokenFilter::reset() { itCache = cache.begin(); } void CachingTokenFilter::fillCache() { Token token; Token * pCopy; while( input->next( &token ) ) { pCopy = new Token( token.termBuffer(), token.startOffset(), token.endOffset(), token.type() ); pCopy ->setPositionIncrement( token.getPositionIncrement() ); pCopy ->setPayload( token.getPayload() ); cache.push_back( pCopy ); } } CL_NS_ENDclucene-core-2.3.3.4/src/core/CLucene/analysis/CachingTokenFilter.h000066400000000000000000000017631154025176300247740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_CachingTokenFilter #define _lucene_analysis_CachingTokenFilter #include #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF(analysis) class CLUCENE_EXPORT CachingTokenFilter : public TokenFilter { private: bool bCacheInitialized; std::list cache; std::list::iterator itCache; public: CachingTokenFilter( TokenStream * input, bool bDeleteTS ); virtual ~CachingTokenFilter(); Token * next( Token* t ); void reset(); void fillCache(); }; CL_NS_END #endif // _lucene_analysis_CachingTokenFilter clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/000077500000000000000000000000001154025176300227115ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardAnalyzer.cpp000066400000000000000000000075571154025176300267010ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "StandardAnalyzer.h" ////#include "CLucene/util/VoidMap.h" #include "CLucene/util/CLStreams.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/analysis/Analyzers.h" #include "StandardFilter.h" #include "StandardTokenizer.h" CL_NS_USE(util) CL_NS_USE(analysis) CL_NS_DEF2(analysis,standard) StandardAnalyzer::StandardAnalyzer(): stopSet(_CLNEW CLTCSetList(true)), maxTokenLength(DEFAULT_MAX_TOKEN_LENGTH) { StopFilter::fillStopTable( stopSet,CL_NS(analysis)::StopAnalyzer::ENGLISH_STOP_WORDS); } StandardAnalyzer::StandardAnalyzer( const TCHAR** stopWords): stopSet(_CLNEW CLTCSetList(true)), maxTokenLength(DEFAULT_MAX_TOKEN_LENGTH) { StopFilter::fillStopTable( stopSet,stopWords ); } StandardAnalyzer::StandardAnalyzer(const char* stopwordsFile, const char* enc): stopSet(_CLNEW CLTCSetList(true)), maxTokenLength(DEFAULT_MAX_TOKEN_LENGTH) { if ( enc == NULL ) enc = "ASCII"; WordlistLoader::getWordSet(stopwordsFile, enc, stopSet); } StandardAnalyzer::StandardAnalyzer(CL_NS(util)::Reader* stopwordsReader, const bool _bDeleteReader): stopSet(_CLNEW CLTCSetList(true)), maxTokenLength(DEFAULT_MAX_TOKEN_LENGTH) { WordlistLoader::getWordSet(stopwordsReader, stopSet, _bDeleteReader); } class StandardAnalyzer::SavedStreams : public TokenStream { public: StandardTokenizer* tokenStream; TokenStream* filteredTokenStream; SavedStreams():tokenStream(NULL), filteredTokenStream(NULL) { } void close(){} Token* next(Token* token) {return NULL;} }; StandardAnalyzer::~StandardAnalyzer(){ SavedStreams* t = reinterpret_cast(this->getPreviousTokenStream()); if (t) _CLDELETE(t->filteredTokenStream); _CLLDELETE(stopSet); } TokenStream* StandardAnalyzer::tokenStream(const TCHAR* /*fieldName*/, Reader* reader) { BufferedReader* bufferedReader = reader->__asBufferedReader(); TokenStream* ret; if ( bufferedReader == NULL ) ret = _CLNEW StandardTokenizer( _CLNEW FilteredBufferedReader(reader, false), true ); else ret = _CLNEW StandardTokenizer(bufferedReader); //ret->setMaxTokenLength(maxTokenLength); ret = _CLNEW StandardFilter(ret,true); ret = _CLNEW LowerCaseFilter(ret,true); ret = _CLNEW StopFilter(ret,true, stopSet); return ret; } TokenStream* StandardAnalyzer::reusableTokenStream(const TCHAR* fieldName, Reader* reader){ SavedStreams* streams = reinterpret_cast(getPreviousTokenStream()); if (streams == NULL) { streams = _CLNEW SavedStreams(); setPreviousTokenStream(streams); BufferedReader* bufferedReader = reader->__asBufferedReader(); if ( bufferedReader == NULL ) streams->tokenStream = _CLNEW StandardTokenizer( _CLNEW FilteredBufferedReader(reader, false), true); else streams->tokenStream = _CLNEW StandardTokenizer(bufferedReader); streams->filteredTokenStream = _CLNEW StandardFilter(streams->tokenStream, true); streams->filteredTokenStream = _CLNEW LowerCaseFilter(streams->filteredTokenStream, true); streams->filteredTokenStream = _CLNEW StopFilter(streams->filteredTokenStream, true, stopSet); } else { streams->tokenStream->reset(reader); } //streams->tokenStream->setMaxTokenLength(maxTokenLength); return streams->filteredTokenStream; } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardAnalyzer.h000066400000000000000000000050071154025176300263320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_standard_StandardAnalyzer #define _lucene_analysis_standard_StandardAnalyzer CL_CLASS_DEF(util,BufferedReader) #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF2(analysis,standard) /** * Filters {@link lucene::analysis::standard::StandardTokenizer} with {@link lucene::analysis::standard::StandardFilter}, * {@link lucene::analysis::LowerCaseFilter} and {@link lucene::analysis::StopFilter}, using a list of English stop words. * */ class CLUCENE_EXPORT StandardAnalyzer : public Analyzer { private: CLTCSetList* stopSet; int32_t maxTokenLength; class SavedStreams; public: /** Default maximum allowed token length */ LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_MAX_TOKEN_LENGTH = 255); /** Builds an analyzer.*/ StandardAnalyzer(); /** Builds an analyzer with the given stop words. */ StandardAnalyzer( const TCHAR** stopWords); /** Builds an analyzer with the stop words from the given file. * @see WordlistLoader#getWordSet(File) */ StandardAnalyzer(const char* stopwordsFile, const char* enc = NULL); /** Builds an analyzer with the stop words from the given reader. * @see WordlistLoader#getWordSet(Reader) */ StandardAnalyzer(CL_NS(util)::Reader* stopwordsReader, const bool _bDeleteReader = false); virtual ~StandardAnalyzer(); /** * Constructs a StandardTokenizer filtered by a * StandardFilter, a LowerCaseFilter and a StopFilter. */ TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader); /** * Set maximum allowed token length. If a token is seen * that exceeds this length then it is discarded. This * setting only takes effect the next time tokenStream or * reusableTokenStream is called. */ void setMaxTokenLength(const int32_t length) { maxTokenLength = length; } /** * @see #setMaxTokenLength */ int getMaxTokenLength() const { return maxTokenLength; } }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardFilter.cpp000066400000000000000000000030751154025176300263300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "StandardFilter.h" #include "../AnalysisHeader.h" #include "../Analyzers.h" #include "StandardTokenizerConstants.h" CL_NS_USE(analysis) CL_NS_USE(util) CL_NS_DEF2(analysis,standard) StandardFilter::StandardFilter(TokenStream* in, bool deleteTokenStream): TokenFilter(in, deleteTokenStream) { } StandardFilter::~StandardFilter(){ } Token* StandardFilter::next(Token* t) { if (input->next(t) == NULL) return NULL; TCHAR* text = t->termBuffer(); const int32_t textLength = t->termLength(); const TCHAR* type = t->type(); if ( type == tokenImage[APOSTROPHE] && //we can compare the type directy since the type should always come from the tokenImage ( textLength >= 2 && _tcsicmp(text+textLength-2, _T("'s"))==0 ) ) { // remove 's text[textLength-2]=0; t->resetTermTextLen(); return t; } else if ( type == tokenImage[ACRONYM] ) { // remove dots int32_t j = 0; for ( int32_t i=0;iresetTermTextLen(); return t; } else { return t; } } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardFilter.h000066400000000000000000000022101154025176300257630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_standard_StandardFilter #define _lucene_analysis_standard_StandardFilter #include "CLucene/analysis/AnalysisHeader.h" //#include "../Analyzers.h" //#include "StandardTokenizerConstants.h" CL_CLASS_DEF(util,StringBuffer) CL_NS_DEF2(analysis,standard) /** Normalizes tokens extracted with {@link lucene::analysis::standard::StandardTokenizer}. */ class CLUCENE_EXPORT StandardFilter: public TokenFilter{ public: // Construct filtering in. StandardFilter(TokenStream* in, bool deleteTokenStream); virtual ~StandardFilter(); /** Returns the next token in the stream, or NULL at EOS. *

Removes 's from the end of words. *

Removes dots from acronyms. */ Token* next(Token* token); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardTokenizer.cpp000066400000000000000000000375661154025176300270710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "StandardTokenizer.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/_FastCharStream.h" #include "CLucene/util/CLStreams.h" CL_NS_USE(analysis) CL_NS_USE(util) CL_NS_DEF2(analysis,standard) const TCHAR* tokenImageArray[] = { _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T("") }; const TCHAR** tokenImage = tokenImageArray; /* A bunch of shortcut macros, many of which make assumptions about variable ** names. These macros enhance readability, not just convenience! */ #define EOS (ch==-1 || rd->Eos()) #define SPACE (_istspace((TCHAR)ch) != 0) #define ALPHA (_istalpha((TCHAR)ch) != 0) #define ALNUM (_istalnum(ch) != 0) #define DIGIT (_istdigit(ch) != 0) #define UNDERSCORE (ch == '_') #define _CJK ( (ch>=0x3040 && ch<=0x318f) || \ (ch>=0x3300 && ch<=0x337f) || \ (ch>=0x3400 && ch<=0x3d2d) || \ (ch>=0x4e00 && ch<=0x9fff) || \ (ch>=0xf900 && ch<=0xfaff) || \ (ch>=0xac00 && ch<=0xd7af) ) //korean #define DASH (ch == '-') #define NEGATIVE_SIGN_ DASH //#define POSITIVE_SIGN_ (ch == '+') //#define SIGN (NEGATIVE_SIGN_ || POSITIVE_SIGN_) #define DOT (ch == '.') #define DECIMAL DOT //freebsd seems to have a problem with defines over multiple lines, so this has to be one long line #define _CONSUME_AS_LONG_AS(conditionFails) while (true) { ch = readChar(); if (ch==-1 || (!(conditionFails) || str.len >= LUCENE_MAX_WORD_LEN)) { break; } str.appendChar(ch);} #define CONSUME_ALPHAS _CONSUME_AS_LONG_AS(ALPHA) #define CONSUME_DIGITS _CONSUME_AS_LONG_AS(DIGIT) /* otherMatches is a condition (possibly compound) under which a character ** that's not an ALNUM or UNDERSCORE can be considered not to break the ** span. Callers should pass false if only ALNUM/UNDERSCORE are acceptable. */ #define CONSUME_WORD _CONSUME_AS_LONG_AS(ALNUM || UNDERSCORE) /* ** Consume CJK characters */ #define CONSUME_CJK _CONSUME_AS_LONG_AS(_CJK) /* It is considered that "nothing of value" has been read if: ** a) The "read head" hasn't moved since specialCharPos was established. ** or ** b) The "read head" has moved by one character, but that character was ** either whitespace or not among the characters found in the body of ** a token (deliberately doesn't include the likes of '@'/'&'). */ #define CONSUMED_NOTHING_OF_VALUE (rdPos == specialCharPos || (rdPos == specialCharPos+1 && ( SPACE || !(ALNUM || DOT || DASH || UNDERSCORE) ))) #define RIGHTMOST(sb) (sb.getBuffer()[sb.len-1]) #define RIGHTMOST_IS(sb, c) (RIGHTMOST(sb) == c) /* To discard the last character in a StringBuffer, we decrement the buffer's ** length indicator and move the terminator back by one character. */ #define SHAVE_RIGHTMOST(sb) (sb.getBuffer()[--sb.len] = '\0') //#define REMOVE_TRAILING_CHARS(sb, charMatchesCondition) { TCHAR* sbBuf = sb.getBuffer(); for (int32_t i = sb.len-1; i >= 0; i--) { TCHAR c = sbBuf[i]; if (charMatchesCondition) { sbBuf[--sb.len] = '\0'; } else {break;}}} /* Does StringBuffer sb contain any of the characters in string ofThese? */ #define CONTAINS_ANY(sb, ofThese) (_tcscspn(sb.getBuffer(), _T(ofThese)) != static_cast(sb.len)) StandardTokenizer::StandardTokenizer(BufferedReader* reader, bool deleteReader): /* rdPos is zero-based. It starts at -1, and will advance to the first ** position when readChar() is first called. */ rdPos(-1), tokenStart(-1), rd(_CLNEW FastCharStream(reader)) { this->reader = reader; this->deleteReader = deleteReader; } StandardTokenizer::~StandardTokenizer() { _CLDELETE(rd); if ( this->deleteReader ) _CLDELETE(reader) } int StandardTokenizer::readChar() { /* Increment by 1 because we're speaking in terms of characters, not ** necessarily bytes: */ rdPos++; return rd->GetNext(); } void StandardTokenizer::unReadChar() { rd->UnGet(); rdPos--; } inline Token* StandardTokenizer::setToken(Token* t, StringBuffer* sb, TokenTypes tokenCode) { t->setStartOffset(tokenStart); t->setEndOffset(tokenStart+sb->length()); t->setType(tokenImage[tokenCode]); sb->getBuffer(); //null terminates the buffer t->resetTermTextLen(); return t; } void StandardTokenizer::reset(Reader* _input) { this->input = _input; if (rd->input==NULL) rd->input = _input->__asBufferedReader(); rdPos = -1; tokenStart = -1; rd->reset(); } Token* StandardTokenizer::next(Token* t) { int ch=0; while (!EOS) { ch = readChar(); if ( ch == 0 || ch == -1 ){ continue; } else if (SPACE) { continue; } else if (ALPHA || UNDERSCORE) { tokenStart = rdPos; t = ReadAlphaNum(ch,t); if ( t != NULL) return t; } else if (DIGIT || NEGATIVE_SIGN_ || DECIMAL) { tokenStart = rdPos; /* ReadNumber returns NULL if it fails to extract a valid number; in ** that case, we just continue. */ if (ReadNumber(NULL, ch,t)) return t; } else if ( _CJK ){ t = ReadCJK(ch,t); if ( t != NULL ) return t; } } return NULL; } Token* StandardTokenizer::ReadNumber(const TCHAR* previousNumber, const TCHAR prev,Token* t) { /* previousNumber is only non-NULL if this function already read a complete ** number in a previous recursion, yet has been asked to read additional ** numeric segments. For example, in the HOST "192.168.1.3", "192.168" is ** a complete number, but this function will recurse to read the "1.3", ** generating a single HOST token "192.168.1.3". */ t->growBuffer(LUCENE_MAX_WORD_LEN+1);//make sure token can hold the next word StringBuffer str(t->termBuffer(),t->bufferLength(),true); //use stringbuffer to read data onto the termText TokenTypes tokenType; bool decExhausted; if (previousNumber != NULL) { str.prepend(previousNumber); tokenType = CL_NS2(analysis,standard)::HOST; decExhausted = false; } else { tokenType = CL_NS2(analysis,standard)::NUM; decExhausted = (prev == '.'); } if ( str.len >= LUCENE_MAX_WORD_LEN ){ //if a number is too long, i would say there is no point //storing it, because its going to be the wrong number anyway? //what do people think? return NULL; } str.appendChar(prev); const bool signExhausted = (prev == '-'); int ch = prev; CONSUME_DIGITS; if (str.len < 2 /* CONSUME_DIGITS didn't find any digits. */ && ( (signExhausted && !DECIMAL) || (decExhausted /* && !DIGIT is implied, since CONSUME_DIGITS stopped on a non-digit. */) ) ) { /* We have either: ** a) a negative sign that's not followed by either digit(s) or a decimal ** b) a decimal that's not followed by digit(s) ** so this is not a valid number. */ if (!EOS) { /* Unread the character that stopped CONSUME_DIGITS: */ unReadChar(); } return NULL; } /* We just read a group of digits. Is it followed by a decimal symbol, ** implying that there might be another group of digits available? */ if (!EOS) { if (DECIMAL) { if ( str.len >= LUCENE_MAX_WORD_LEN ) return NULL; //read above for rationale str.appendChar(ch); } else { unReadChar(); goto SUCCESSFULLY_EXTRACTED_NUMBER; } CONSUME_DIGITS; if (!DIGIT && !DECIMAL) { unReadChar(); } else if (!EOS && DECIMAL && _istdigit(rd->Peek())) { /* We just read the fractional digit group, but it's also followed by ** a decimal symbol and at least one more digit, so this must be a ** HOST rather than a real number. */ return ReadNumber(str.getBuffer(), '.',t); } } SUCCESSFULLY_EXTRACTED_NUMBER: TCHAR rightmost = RIGHTMOST(str); /* Don't including a trailing decimal point. */ if (rightmost == '.') { SHAVE_RIGHTMOST(str); unReadChar(); rightmost = RIGHTMOST(str); } /* If all we have left is a negative sign, it's not a valid number. */ if (rightmost == '-') { CND_PRECONDITION (str.len == 1, "Number is invalid"); return NULL; } return setToken(t,&str,tokenType); } Token* StandardTokenizer::ReadAlphaNum(const TCHAR prev, Token* t) { t->growBuffer(LUCENE_MAX_WORD_LEN+1);//make sure token can hold the next word StringBuffer str(t->termBuffer(),t->bufferLength(),true); //use stringbuffer to read data onto the termText if ( str.len < LUCENE_MAX_WORD_LEN ){ str.appendChar(prev); int ch = prev; CONSUME_WORD; if (!EOS && str.len < LUCENE_MAX_WORD_LEN-1 ) { //still have space for 1 more character? switch(ch) { /* What follows the first alphanum segment? */ case '.': str.appendChar('.'); return ReadDotted(&str, CL_NS2(analysis,standard)::UNKNOWN,t); case '\'': str.appendChar('\''); return ReadApostrophe(&str,t); case '@': str.appendChar('@'); return ReadAt(&str,t); case '&': str.appendChar('&'); return ReadCompany(&str,t); /* default: fall through to end of this function. */ } } } return setToken(t,&str,CL_NS2(analysis,standard)::ALPHANUM); } Token* StandardTokenizer::ReadCJK(const TCHAR prev, Token* t) { t->growBuffer(LUCENE_MAX_WORD_LEN+1);//make sure token can hold the next word StringBuffer str(t->termBuffer(),t->bufferLength(),true); //use stringbuffer to read data onto the termText if ( str.len < LUCENE_MAX_WORD_LEN ){ str.appendChar(prev); int ch = prev; CONSUME_CJK; } return setToken(t,&str,CL_NS2(analysis,standard)::CJK); } Token* StandardTokenizer::ReadDotted(StringBuffer* _str, TokenTypes forcedType, Token* t) { const int32_t specialCharPos = rdPos; StringBuffer& str=*_str; /* A segment of a "dotted" is not allowed to begin with another dot or a dash. ** Even though hosts, e-mail addresses, etc., could have a dotted-segment ** that begins with a dot or a dash, it's far more common in source text ** for a pattern like "abc.--def" to be intended as two tokens. */ int ch = rd->Peek(); if (!(DOT || DASH)) { bool prevWasDot; bool prevWasDash; if (str.len == 0) { prevWasDot = false; prevWasDash = false; } else { prevWasDot = RIGHTMOST(str) == '.'; prevWasDash = RIGHTMOST(str) == '-'; } while (!EOS && str.len < LUCENE_MAX_WORD_LEN-1 ) { ch = readChar(); const bool dot = ch == '.'; const bool dash = ch == '-'; if (!(ALNUM || UNDERSCORE || dot || dash)) { break; } /* Multiple dots or dashes in succession end the token. ** Consider the following inputs: ** "Visit windowsupdate.microsoft.com--update today!" ** "In the U.S.A.--yes, even there!" */ if ((dot || dash) && (prevWasDot || prevWasDash)) { /* We're not going to append the character we just read, in any case. ** As to the character before it (which is currently RIGHTMOST(str)): ** Unless RIGHTMOST(str) is a dot, in which we need to save it so the ** acronym-versus-host detection can work, we want to get rid of it. */ if (!prevWasDot) { SHAVE_RIGHTMOST(str); } break; } str.appendChar(ch); prevWasDot = dot; prevWasDash = dash; } } /* There's a potential StringBuffer.append call in the code above, which ** could cause str to reallocate its internal buffer. We must wait to ** obtain the optimization-oriented strBuf pointer until after the initial ** potentially realloc-triggering operations on str. ** Because there can be other such ops much later in this function, strBuf ** is guarded within a block to prevent its use during or after the calls ** that would potentially invalidate it. */ { /* Begin block-guard of strBuf */ TCHAR* strBuf = str.getBuffer(); bool rightmostIsDot = RIGHTMOST_IS(str, '.'); if (CONSUMED_NOTHING_OF_VALUE) { /* No more alphanums available for this token; shave trailing dot, if any. */ if (rightmostIsDot) { SHAVE_RIGHTMOST(str); } /* If there are no dots remaining, this is a generic ALPHANUM. */ if (_tcschr(strBuf, '.') == NULL) { forcedType = CL_NS2(analysis,standard)::ALPHANUM; } /* Check the token to see if it's an acronym. An acronym must have a ** letter in every even slot and a dot in every odd slot, including the ** last slot (for example, "U.S.A."). */ } else if (rightmostIsDot) { bool isAcronym = true; const int32_t upperCheckLimit = str.len - 1; /* -1 b/c we already checked the last slot. */ for (int32_t i = 0; i < upperCheckLimit; i++) { const bool even = (i % 2 == 0); ch = strBuf[i]; if ( (even && !ALPHA) || (!even && !DOT) ) { isAcronym = false; break; } } if (isAcronym) { forcedType = CL_NS2(analysis,standard)::ACRONYM; } else { /* If it's not an acronym, we don't want the trailing dot. */ SHAVE_RIGHTMOST(str); /* If there are no dots remaining, this is a generic ALPHANUM. */ if (_tcschr(strBuf, '.') == NULL) { forcedType = CL_NS2(analysis,standard)::ALPHANUM; } } } } /* End block-guard of strBuf */ if (!EOS) { if (ch == '@' && str.len < LUCENE_MAX_WORD_LEN-1) { str.appendChar('@'); return ReadAt(&str,t); } else { unReadChar(); } } return setToken(t,&str,CL_NS2(analysis,standard)::UNKNOWN ? forcedType : CL_NS2(analysis,standard)::HOST); } Token* StandardTokenizer::ReadApostrophe(StringBuffer* _str, Token* t) { StringBuffer& str=*_str; TokenTypes tokenType = CL_NS2(analysis,standard)::APOSTROPHE; const int32_t specialCharPos = rdPos; int ch=0; CONSUME_ALPHAS; if (RIGHTMOST_IS(str, '\'') || CONSUMED_NOTHING_OF_VALUE) { /* After the apostrophe, no more alphanums were available within this ** token; shave trailing apostrophe and revert to generic ALPHANUM. */ SHAVE_RIGHTMOST(str); tokenType = CL_NS2(analysis,standard)::ALPHANUM; } if (!EOS) { unReadChar(); } return setToken(t,&str,tokenType); } Token* StandardTokenizer::ReadAt(StringBuffer* str, Token* t) { ReadDotted(str, CL_NS2(analysis,standard)::EMAIL,t); /* JLucene grammar indicates dots/digits not allowed in company name: */ if (!CONTAINS_ANY((*str), ".0123456789")) { setToken(t,str,CL_NS2(analysis,standard)::COMPANY); } return t; } Token* StandardTokenizer::ReadCompany(StringBuffer* _str, Token* t) { StringBuffer& str = *_str; const int32_t specialCharPos = rdPos; int ch=0; CONSUME_WORD; if (CONSUMED_NOTHING_OF_VALUE) { /* After the ampersand, no more alphanums were available within this ** token; shave trailing ampersand and revert to ALPHANUM. */ CND_PRECONDITION(RIGHTMOST_IS(str, '&'),"ReadCompany failed"); SHAVE_RIGHTMOST(str); return setToken(t,&str,CL_NS2(analysis,standard)::ALPHANUM); } if (!EOS) { unReadChar(); } return setToken(t,&str,CL_NS2(analysis,standard)::COMPANY); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardTokenizer.h000066400000000000000000000064421154025176300265230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_standard_StandardTokenizer #define _lucene_analysis_standard_StandardTokenizer #include "../AnalysisHeader.h" //required for Tokenizer #include "StandardTokenizerConstants.h" CL_CLASS_DEF(analysis,Token) CL_CLASS_DEF(util,BufferedReader) CL_CLASS_DEF(util,StringBuffer) CL_CLASS_DEF(util,FastCharStream) CL_NS_DEF2(analysis,standard) /** A grammar-based tokenizer constructed with JavaCC. * *

This should be a good tokenizer for most European-language documents: * *

    *
  • Splits words at punctuation characters, removing punctuation. However, a * dot that's not followed by whitespace is considered part of a token. *
  • Splits words at hyphens, unless there's a number in the token, in which case * the whole token is interpreted as a product number and is not split. *
  • Recognizes email addresses and internet hostnames as one token. *
* *

Many applications have specific tokenizer needs. If this tokenizer does * not suit your application, please consider copying this source code * directory to your project and maintaining your own grammar-based tokenizer. */ class CLUCENE_EXPORT StandardTokenizer: public Tokenizer { private: int32_t rdPos; int32_t tokenStart; // Advance by one character, incrementing rdPos and returning the character. int readChar(); // Retreat by one character, decrementing rdPos. void unReadChar(); // createToken centralizes token creation for auditing purposes. //Token* createToken(CL_NS(util)::StringBuffer* sb, TokenTypes tokenCode); inline Token* setToken(Token* t, CL_NS(util)::StringBuffer* sb, TokenTypes tokenCode); Token* ReadDotted(CL_NS(util)::StringBuffer* str, TokenTypes forcedType,Token* t); CL_NS(util)::BufferedReader* reader; bool deleteReader; CL_NS(util)::FastCharStream* rd; public: // Constructs a tokenizer for this Reader. StandardTokenizer(CL_NS(util)::BufferedReader* reader, bool deleteReader=false); virtual ~StandardTokenizer(); /** Returns the next token in the stream, or false at end-of-stream. * The returned token's type is set to an element of * StandardTokenizerConstants::tokenImage. */ Token* next(Token* token); // Reads for number like "1"/"1234.567", or IP address like "192.168.1.2". Token* ReadNumber(const TCHAR* previousNumber, const TCHAR prev, Token* t); Token* ReadAlphaNum(const TCHAR prev, Token* t); // Reads for apostrophe-containing word. Token* ReadApostrophe(CL_NS(util)::StringBuffer* str, Token* t); // Reads for something@... it may be a COMPANY name or a EMAIL address Token* ReadAt(CL_NS(util)::StringBuffer* str, Token* t); // Reads for COMPANY name like AT&T. Token* ReadCompany(CL_NS(util)::StringBuffer* str, Token* t); // Reads CJK characters Token* ReadCJK(const TCHAR prev, Token* t); virtual void reset(CL_NS(util)::Reader* _input); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/analysis/standard/StandardTokenizerConstants.h000066400000000000000000000014051154025176300304120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_analysis_standard_StandardTokenizerConstants #define _lucene_analysis_standard_StandardTokenizerConstants // TODO: Put these into StandardTokenizer CL_NS_DEF2(analysis,standard) enum TokenTypes { _EOF, UNKNOWN, ALPHANUM, APOSTROPHE, ACRONYM, COMPANY, EMAIL, HOST, NUM, CJK }; extern const TCHAR** tokenImage; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/debug/000077500000000000000000000000001154025176300203545ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/debug/error.cpp000066400000000000000000000051401154025176300222110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" #include "error.h" #include "CLucene/util/Misc.h" CL_NS_USE(util) #ifdef _LUCENE_DISABLE_EXCEPTIONS #ifdef _LUCENE_PRAGMA_WARNINGS #pragma message ("==================Lucene exceptions are disabled==================") #else #warning "==================Lucene exceptions are disabled==================" #endif #else CLuceneError::CLuceneError():_twhat(NULL),error_number(0){ #ifndef _ASCII _awhat = NULL; #endif } CLuceneError::CLuceneError(int num, const char* str, bool ownstr):error_number(num) { #ifdef _ASCII _twhat=STRDUP_AtoA(str); #else _awhat=STRDUP_AtoA(str); _twhat=NULL; #endif if ( ownstr ) _CLDELETE_LCaARRAY( const_cast(str)); } #ifndef _ASCII CLuceneError::CLuceneError(int num, const TCHAR* str, bool ownstr) { error_number = num; _awhat=NULL; _twhat=STRDUP_TtoT(str); if ( ownstr ) _CLDELETE_LCARRAY((TCHAR*)str); } #endif CLuceneError::CLuceneError(const CLuceneError& clone) { this->error_number = clone.error_number; #ifndef _ASCII this->_awhat = NULL; if ( clone._awhat != NULL ) this->_awhat = STRDUP_AtoA(clone._awhat); #endif this->_twhat = NULL; if ( clone._twhat != NULL ) this->_twhat = STRDUP_TtoT(clone._twhat); } CLuceneError::~CLuceneError() throw(){ _CLDELETE_LCARRAY(_twhat); #ifndef _ASCII _CLDELETE_LCaARRAY(_awhat); #endif } char* CLuceneError::what(){ #ifdef _ASCII return _twhat; #else if ( _awhat == NULL ) _awhat = STRDUP_TtoA(_twhat); return _awhat; #endif } TCHAR* CLuceneError::twhat(){ #ifdef _ASCII return _twhat; #else if ( _twhat == NULL ) _twhat = STRDUP_AtoT(_awhat); return _twhat; #endif } #ifndef _ASCII void CLuceneError::set(int num, const char* str, bool ownstr){ _CLDELETE_CARRAY(_twhat); _CLDELETE_CaARRAY(_awhat); _awhat=STRDUP_AtoA(str); error_number = num; if ( ownstr ) _CLDELETE_LCaARRAY( const_cast(str)); } #endif void CLuceneError::set(int num, const TCHAR* str, bool ownstr){ #ifndef _ASCII _CLDELETE_CaARRAY(_awhat); #endif _CLDELETE_CARRAY(_twhat); _twhat=STRDUP_TtoT(str); error_number = num; if ( ownstr ) _CLDELETE_LCARRAY(const_cast(str)); } #endif //_LUCENE_DISABLE_EXCEPTIONS clucene-core-2.3.3.4/src/core/CLucene/debug/error.h000066400000000000000000000074731154025176300216710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_debug_error_ #define _lucene_debug_error_ #define CL_ERR_UNKNOWN -1 #define CL_ERR_IO 1 #define CL_ERR_NullPointer 2 #define CL_ERR_Runtime 3 #define CL_ERR_IllegalArgument 4 #define CL_ERR_Parse 5 #define CL_ERR_TokenMgr 6 #define CL_ERR_UnsupportedOperation 7 #define CL_ERR_InvalidState 8 #define CL_ERR_IndexOutOfBounds 9 #define CL_ERR_TooManyClauses 10 #define CL_ERR_RAMTransaction 11 #define CL_ERR_InvalidCast 12 #define CL_ERR_IllegalState 13 // Sub-error: AlreadyClosed #define CL_ERR_UnknownOperator 14 #define CL_ERR_ConcurrentModification 15 #define CL_ERR_CorruptIndex 16 #define CL_ERR_NumberFormat 17 #define CL_ERR_AlreadyClosed 18 #define CL_ERR_StaleReader 19 #define CL_ERR_LockObtainFailed 20 #define CL_ERR_Merge 21 //< Exception thrown if there are any problems while executing a merge. #define CL_ERR_MergeAborted 22 #define CL_ERR_OutOfMemory 23 #define CL_ERR_FieldReader 24 //////////////////////////////////////////////////////// //error try/throw/catch definitions //////////////////////////////////////////////////////// #ifdef _CL_DISABLE_NATIVE_EXCEPTIONS #include /* #define try struct pj_exception_state_t pj_x_except__; int pj_x_code__; \ if(1){ \ pj_push_exception_handler_(&pj_x_except__); \ pj_x_code__ = pj_setjmp(pj_x_except__.state); \ if (pj_x_code__ == 0) #define _CLCATCHEND pj_pop_exception_handler_(); \ } else {} #define _CLCATCH else if (pj_x_code__ == (id)) _CLCATCHEND #define _CLCATCHANY else _CLCATCHEND #define _RETHROW pj_throw_exception_(pj_x_code__) #define _CLFINALLY(x) else{x _RETHROW}_CLCATCHEND x #define _CLTHROWA(number) pj_throw_exception_(number) #define _CLTHROWT(number) pj_throw_exception_(number) #define _THROWA_DEL(number) _CLDELETE_CaARRAY(str); pj_throw_exception_(number) #define _THROWT_DEL(number) _CLDELETE_CARRAY(str); pj_throw_exception_(number) */ #else class CLUCENE_EXPORT CLuceneError { #ifndef _ASCII char* _awhat; #endif TCHAR* _twhat; int error_number; public: CLuceneError(); CLuceneError(const CLuceneError& clone); #ifndef _ASCII CLuceneError(int num, const char* str, bool ownstr); #endif CLuceneError(int num, const TCHAR* str, bool ownstr); int number() const{return error_number;} char* what(); TCHAR* twhat(); ~CLuceneError() throw(); void set(int num, const TCHAR*, bool ownstr=false); #ifndef _ASCII void set(int num, const char*, bool ownstr=false); #endif }; //#define _THROWS //does nothing #define _TRY try #define _CLCATCH_ERR(err_num, cleanup_code, else_code) catch(CLuceneError& err){if (err.number()!=err_num){cleanup_code;throw err;}else {else_code;}} #define _CLCATCH_ERR_ELSE(err_num, else_code) catch(CLuceneError& err){if (err.number()!=err_num){throw err;}else {else_code;}} #define _CLCATCH_ERR_CLEANUP(err_num, cleanup_code) catch(CLuceneError& err){if (err.number()!=err_num){cleanup_code;throw err;}} #define _CLFINALLY(x) catch(...){ x; throw; } x //note: code x is not run if return is called #define _CLTHROWA(number, str) throw CLuceneError(number, str,false) #define _CLTHROWT(number, str) throw CLuceneError(number, str,false) #define _CLTHROWA_DEL(number, str) throw CLuceneError(number, str,true) //throw a string ensures the value is deleted #define _CLTHROWT_DEL(number, str) throw CLuceneError(number, str,true) //throw a string ensures the value is deleted #endif //_LUCENE_DISABLE_EXCEPTIONS // //////////////////////////////////////////////////////// #endif clucene-core-2.3.3.4/src/core/CLucene/debug/lucenebase.h000066400000000000000000000026221154025176300226350ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_debug_lucenebase_ #define _lucene_debug_lucenebase_ #include "CLucene/LuceneThreads.h" CL_NS_DEF(debug) //Lucenebase is the superclass of all clucene objects. It provides //memory debugging tracking and/or reference counting class CLUCENE_EXPORT LuceneBase{ public: _LUCENE_ATOMIC_INT __cl_refcount; LuceneBase(){ _LUCENE_ATOMIC_INT_SET(__cl_refcount,1); } inline int __cl_getref(){ return _LUCENE_ATOMIC_INT_GET(__cl_refcount); } inline int __cl_addref(){ return _LUCENE_ATOMIC_INC(&__cl_refcount); } inline int __cl_decref(){ return _LUCENE_ATOMIC_DEC(&__cl_refcount); } virtual ~LuceneBase(){}; }; class CLUCENE_EXPORT LuceneVoidBase{ public: virtual ~LuceneVoidBase(){}; }; #if defined(LUCENE_ENABLE_REFCOUNT) #define LUCENE_BASE public CL_NS(debug)::LuceneBase #else #define LUCENE_BASE public CL_NS(debug)::LuceneVoidBase #endif #define LUCENE_REFBASE public CL_NS(debug)::LuceneBase //this is the base of classes who *always* need refcounting CL_NS_END #endif //_lucene_debug_lucenebase_ clucene-core-2.3.3.4/src/core/CLucene/debug/mem.h000066400000000000000000000062211154025176300213040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_debug_mem_h #define _lucene_debug_mem_h //todo: this is a hack... #ifndef CND_PRECONDITION #include #define CND_PRECONDITION(x,y) assert(x) #endif //Macro for creating new objects #if defined(LUCENE_ENABLE_REFCOUNT) #define _CLNEW new #else #define _CLNEW new #endif #define _CL_POINTER(x) (x==NULL?NULL:(x->__cl_addref()>=0?x:x)) //return a add-ref'd object #define _CL_DECREF(x) ((x)==NULL?NULL:((x)->__cl_decref()>=0?(x):(x))) //return a add-ref'd object #define _CL_LDECREF(x) if ((x)!=NULL) (x)->__cl_decref(); //Macro for creating new arrays #define _CL_NEWARRAY(type,size) (type*)calloc(size, sizeof(type)) #define _CLDELETE_ARRAY(x) {free(x); x=NULL;} #define _CLDELETE_LARRAY(x) {free(x);} #ifndef _CLDELETE_CARRAY #define _CLDELETE_CARRAY(x) {free(x); x=NULL;} #define _CLDELETE_LCARRAY(x) {free(x);} #endif //a shortcut for deleting a carray and all its contents #define _CLDELETE_CARRAY_ALL(x) {if ( x!=NULL ){ for(int xcda=0;x[xcda]!=NULL;xcda++)_CLDELETE_CARRAY(x[xcda]);}_CLDELETE_ARRAY(x)}; #define _CLDELETE_LCARRAY_ALL(x) {if ( x!=NULL ){ for(int xcda=0;x[xcda]!=NULL;xcda++)_CLDELETE_LCARRAY(x[xcda]);}_CLDELETE_LARRAY(x)}; #define _CLDELETE_CaARRAY_ALL(x) {if ( x!=NULL ){ for(int xcda=0;x[xcda]!=NULL;xcda++)_CLDELETE_CaARRAY(x[xcda]);}_CLDELETE_ARRAY(x)}; #define _CLDELETE_ARRAY_ALL(x) {if ( x!=NULL ){ for(int xcda=0;x[xcda]!=NULL;xcda++)_CLDELETE(x[xcda]);}_CLDELETE_ARRAY(x)}; #ifndef _CLDELETE_CaARRAY #define _CLDELETE_CaARRAY _CLDELETE_CARRAY #define _CLDELETE_LCaARRAY _CLDELETE_LCARRAY #endif //Macro for deleting #ifdef LUCENE_ENABLE_REFCOUNT #define _CLDELETE(x) if (x!=NULL){ CND_PRECONDITION(_LUCENE_ATOMIC_INT_GET((x)->__cl_refcount)>=0,"__cl_refcount was < 0"); if (_LUCENE_ATOMIC_INT_GET((x)->__cl_decref()) <= 0)delete x; x=NULL; } #define _CLLDELETE(x) if (x!=NULL){ CND_PRECONDITION(_LUCENE_ATOMIC_INT_GET((x)->__cl_refcount)>=0,"__cl_refcount was < 0"); if ((x)->__cl_decref() <= 0)delete x; } #else #define _CLDELETE(x) {delete x;x=NULL;} #define _CLLDELETE(x) {delete x;} #endif //_CLDECDELETE deletes objects which are *always* refcounted #define _CLDECDELETE(x) if (x!=NULL){ CND_PRECONDITION(_LUCENE_ATOMIC_INT_GET((x)->__cl_refcount)>=0,"__cl_refcount was < 0"); _LUCENE_ATOMIC_DECDELETE(&(x)->__cl_refcount, x); x=NULL; } #define _CLLDECDELETE(x) if (x!=NULL){ CND_PRECONDITION(_LUCENE_ATOMIC_INT_GET((x)->__cl_refcount)>=0,"__cl_refcount was < 0"); _LUCENE_ATOMIC_DECDELETE(&(x)->__cl_refcount, x); } #define _LUCENE_ATOMIC_DECDELETE(theInteger, theObject) { if ( _LUCENE_ATOMIC_DEC(theInteger) == 0) delete theObject;} //_VDelete should be used for deleting non-clucene objects. //when using reference counting, _CLDELETE casts the object //into a LuceneBase*. #define _CLVDELETE(x) {delete x;x=NULL;} #endif //_lucene_debug_mem_h clucene-core-2.3.3.4/src/core/CLucene/document/000077500000000000000000000000001154025176300211045ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/document/DateField.cpp000066400000000000000000000036161154025176300234370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "DateField.h" #include "CLucene/util/Misc.h" CL_NS_USE(util) CL_NS_DEF(document) DateField::~DateField(){ } TCHAR* DateField::timeToString(const int64_t time) { TCHAR* buf = _CL_NEWARRAY(TCHAR,DATEFIELD_DATE_LEN + 1); timeToString(time,buf); return buf; } void DateField::timeToString(const int64_t time, TCHAR* buf) { CND_PRECONDITION (buf, "buf == NULL"); *buf = '\0'; if (time < 0) _CLTHROWA (CL_ERR_IllegalArgument,"time too early"); //todo: make richer error if (time > DATEFIELD_DATE_MAX) _CLTHROWA (CL_ERR_IllegalArgument, "time too late (past DATEFIELD_DATE_MAX"); //todo: make richer error _i64tot(time, buf, 36); int32_t bufLen = _tcslen(buf); CND_PRECONDITION (bufLen <= DATEFIELD_DATE_LEN, "timeToString length is greater than 9"); /* Supply leading zeroes if necessary. */ if (bufLen < DATEFIELD_DATE_LEN) { const int32_t nMissingZeroes = DATEFIELD_DATE_LEN - bufLen; /* Move buffer contents forward to make room for leading zeroes. */ for (int32_t i = DATEFIELD_DATE_LEN - 1; i >= nMissingZeroes; i--) buf[i] = buf[i - nMissingZeroes]; /* Insert leading zeroes. */ {// MSVC6 scoping fix for (int32_t i = 0; i < nMissingZeroes; i++) buf[i] = '0'; } buf[DATEFIELD_DATE_LEN] = 0; } CND_PRECONDITION (_tcslen(buf) == DATEFIELD_DATE_LEN, "timeToString return is not equal to DATEFIELD_DATE_LEN"); } int64_t DateField::stringToTime(const TCHAR* time) { TCHAR* end; return _tcstoi64(time, &end, 36); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/document/DateField.h000066400000000000000000000046211154025176300231010ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_document_DateField_ #define _lucene_document_DateField_ CL_NS_DEF(document) //here are some constants used throughout clucene //make date strings long enough to last a millenium #define DATEFIELD_DATE_MAX _ILONGLONG(31536000000000) //1000L*365*24*60*60*1000 /** * Provides support for converting dates to strings and vice-versa. * The strings are structured so that lexicographic sorting orders by date, * which makes them suitable for use as field values and search terms. * *

Note that this class saves dates with millisecond granularity, * which is bad for {@link lucene::search::RangeQuery} and {@link lucene::search::PrefixQuery}, as those * queries are expanded to a BooleanQuery with a potentially large number * of terms when searching. Thus you might want to use * {@link lucene::document::DateTools} instead. * *

* Note: dates before 1970 cannot be used, and therefore cannot be * indexed when using this class. See {@link lucene::document::DateTools} for an * alternative without such a limitation. * * @deprecated If you build a new index, use {@link lucene::document::DateTools} instead. * This class is included for use with existing indices and will be removed in a future release. */ class CLUCENE_EXPORT DateField { public: virtual ~DateField(); /** * Converts a millisecond time to a string suitable for indexing. * @throws RuntimeException if the time specified in the * method argument is negative, that is, before 1970 */ _CL_DEPRECATED( DateTools ) static TCHAR* timeToString(const int64_t time); /** * Converts a millisecond time to a string suitable for indexing. * @throws CL_ERR_IllegalArgument if the time specified in the * method argument is negative, that is, before 1970 * @param str must be a character array DATEFIELD_DATE_LEN+1 or longer */ _CL_DEPRECATED( DateTools ) static void timeToString(const int64_t time, TCHAR* str); /** Converts a string-encoded date into a millisecond time. */ _CL_DEPRECATED( DateTools ) static int64_t stringToTime(const TCHAR* s); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/document/DateTools.cpp000066400000000000000000000175721154025176300235220ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "DateTools.h" #include "CLucene/util/Misc.h" CL_NS_USE(util) CL_NS_DEF(document) TCHAR* DateTools::timeToString(const int64_t time, Resolution resolution /*= MILLISECOND_FORMAT*/) { TCHAR* buf = _CL_NEWARRAY(TCHAR, DATETOOLS_BUFFER_SIZE); timeToString(time, resolution, buf, DATETOOLS_BUFFER_SIZE); return buf; } void DateTools::timeToString(const int64_t time, Resolution resolution, TCHAR* buf, size_t bufLength) { // Take into account TZ and DST differences which may appear when using gmtime below const int64_t diff_secs = getDifferenceFromGMT(); time_t secs = time / 1000 + diff_secs; tm *ptm = gmtime(&secs); char abuf[DATETOOLS_BUFFER_SIZE]; if (resolution == MILLISECOND_FORMAT) { size_t len = strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y%m%d%H%M%S", ptm); uint32_t ms = static_cast(time % 1000); _snprintf(abuf + len, 4, "%03u", ms); } else if (resolution == SECOND_FORMAT) { strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y%m%d%H%M%S", ptm); } else if (resolution == MINUTE_FORMAT) { strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y%m%d%H%M", ptm); } else if (resolution == YEAR_FORMAT) { strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y", ptm); } else if (resolution == MONTH_FORMAT) { strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y%m", ptm); } else if (resolution == DAY_FORMAT) { strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y%m%d", ptm); } else if (resolution == HOUR_FORMAT) { strftime(abuf, DATETOOLS_BUFFER_SIZE, "%Y%m%d%H", ptm); } STRCPY_AtoT(buf,abuf, bufLength); } tm* DateTools::stringToDate(const TCHAR* dateString){ const int64_t time = stringToTime(dateString); time_t secs = time / 1000; tm *ptm = gmtime(&secs); return ptm; } int64_t DateTools::stringToTime(const TCHAR* dateString) { tm s_time; memset(&s_time, 0, sizeof (s_time)); s_time.tm_mday = 1; int32_t ms = 0; switch (_tcslen(dateString)) { case 4: // YEAR_FORMAT { s_time.tm_year = _ttoi(dateString) - 1900; if (s_time.tm_year == -1900) _CLTHROWA(CL_ERR_Parse, "Input is not valid date string"); break; } case 6: // MONTH_FORMAT { TCHAR* tmpDate = STRDUP_TtoT(dateString); s_time.tm_mon = _ttoi(&tmpDate[4]) - 1; tmpDate[4] = 0; s_time.tm_year = _ttoi(tmpDate) - 1900; _CLDELETE_CARRAY(tmpDate); break; } case 8: // DAY_FORMAT { TCHAR* tmpDate = STRDUP_TtoT(dateString); s_time.tm_mday = _ttoi(&tmpDate[6]); tmpDate[6] = 0; s_time.tm_mon = _ttoi(&tmpDate[4]) - 1; tmpDate[4] = 0; s_time.tm_year = _ttoi(tmpDate) - 1900; _CLDELETE_CARRAY(tmpDate); break; } case 10: // HOUR_FORMAT { TCHAR* tmpDate = STRDUP_TtoT(dateString); s_time.tm_hour = _ttoi(&tmpDate[8]); tmpDate[8] = 0; s_time.tm_mday = _ttoi(&tmpDate[6]); tmpDate[6] = 0; s_time.tm_mon = _ttoi(&tmpDate[4]) - 1; tmpDate[4] = 0; s_time.tm_year = _ttoi(tmpDate) - 1900; _CLDELETE_CARRAY(tmpDate); break; } case 12: // MINUTE_FORMAT { TCHAR* tmpDate = STRDUP_TtoT(dateString); s_time.tm_min = _ttoi(&tmpDate[10]); tmpDate[10] = 0; s_time.tm_hour = _ttoi(&tmpDate[8]); tmpDate[8] = 0; s_time.tm_mday = _ttoi(&tmpDate[6]); tmpDate[6] = 0; s_time.tm_mon = _ttoi(&tmpDate[4]) - 1; tmpDate[4] = 0; s_time.tm_year = _ttoi(tmpDate) - 1900; _CLDELETE_CARRAY(tmpDate); break; } case 14: // SECOND_FORMAT { TCHAR* tmpDate = STRDUP_TtoT(dateString); s_time.tm_sec = _ttoi(&tmpDate[12]); tmpDate[12] = 0; s_time.tm_min = _ttoi(&tmpDate[10]); tmpDate[10] = 0; s_time.tm_hour = _ttoi(&tmpDate[8]); tmpDate[8] = 0; s_time.tm_mday = _ttoi(&tmpDate[6]); tmpDate[6] = 0; s_time.tm_mon = _ttoi(&tmpDate[4]) - 1; tmpDate[4] = 0; s_time.tm_year = _ttoi(tmpDate) - 1900; _CLDELETE_CARRAY(tmpDate); break; } case 17: // MILLISECOND_FORMAT { TCHAR* tmpDate = STRDUP_TtoT(dateString); ms = _ttoi(&tmpDate[14]); tmpDate[14] = 0; s_time.tm_sec = _ttoi(&tmpDate[12]); tmpDate[12] = 0; s_time.tm_min = _ttoi(&tmpDate[10]); tmpDate[10] = 0; s_time.tm_hour = _ttoi(&tmpDate[8]); tmpDate[8] = 0; s_time.tm_mday = _ttoi(&tmpDate[6]); tmpDate[6] = 0; s_time.tm_mon = _ttoi(&tmpDate[4]) - 1; tmpDate[4] = 0; s_time.tm_year = _ttoi(tmpDate) - 1900; _CLDELETE_CARRAY(tmpDate); break; } default: { _CLTHROWA(CL_ERR_Parse, "Input is not valid date string"); break; } } time_t t = mktime(&s_time); if (t == -1) _CLTHROWA(CL_ERR_Parse, "Input is not valid date string"); // Get TZ difference in seconds, and calc it in const int64_t diff_secs = getDifferenceFromGMT(); return (static_cast(t + diff_secs) * 1000) + ms; } int64_t DateTools::getDifferenceFromGMT() { struct tm *tptr; time_t secs, local_secs, gmt_secs; time( &secs ); // Current time in GMT tptr = localtime( &secs ); local_secs = mktime( tptr ); tptr = gmtime( &secs ); gmt_secs = mktime( tptr ); return int64_t(local_secs - gmt_secs); } int64_t DateTools::timeMakeInclusive(const int64_t time) { time_t secs = time / 1000; tm *ptm = localtime(&secs); // use localtime since mktime below will convert the time to GMT before returning ptm->tm_hour = 23; ptm->tm_min = 59; ptm->tm_sec = 59; time_t t = mktime(ptm); if (t == -1) _CLTHROWA(CL_ERR_Parse, "Input is not a valid date"); return (static_cast(t) * 1000) + 999; } int64_t DateTools::getTime(unsigned short year, uint8_t month, uint8_t mday, uint8_t hours, uint8_t minutes, uint8_t seconds, unsigned short ms) { struct tm* s_time; // get current time, and then change it according to the parameters time_t rawtime; time ( &rawtime ); s_time = localtime ( &rawtime ); // use localtime, since mktime will take into account TZ differences s_time->tm_isdst = 0; // since we are using gmtime all around, make sure DST is off s_time->tm_year = year - 1900; s_time->tm_mon = month - 1; s_time->tm_mday = mday; s_time->tm_hour = hours; s_time->tm_min = minutes; s_time->tm_sec = seconds; time_t t = mktime(s_time); if (t == -1) _CLTHROWA(CL_ERR_Parse, "Input is not a valid date"); return (static_cast(t) * 1000) + ms; } TCHAR* DateTools::getISOFormat(const int64_t time){ const time_t secs = time / 1000; const int64_t ms = abs((int32_t)((secs * 1000) - time)); tm *ptm = gmtime(&secs); return getISOFormat(ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, ms); } void DateTools::strCatDate(TCHAR* buf, int zeroes, int value){ TCHAR str[10]; _i64tot(value, str, 10); size_t l = _tcslen(str); TCHAR* p = buf; for ( size_t i=0;i<(zeroes-l);i++ ){ *p = _T('0'); p++; } _tcscat(p, str); p+=l; *p = _T('\0'); } TCHAR* DateTools::getISOFormat(unsigned short year, uint8_t month, uint8_t mday, uint8_t hours, uint8_t minutes, uint8_t seconds, unsigned short ms) { TCHAR* ISOString = _CL_NEWARRAY(TCHAR, 24); TCHAR* p = ISOString; strCatDate(p, 4, year); p+=4; _tcscat(p, _T("-")); p++; strCatDate(p, 2, month); p+=2; _tcscat(p, _T("-")); p++; strCatDate(p, 2, mday); p+=2; _tcscat(p, _T(" ")); p++; strCatDate(p, 2, hours); p+=2; _tcscat(p, _T(":")); p++; strCatDate(p, 2, minutes); p+=2; _tcscat(p, _T(":")); p++; strCatDate(p, 2, seconds); p+=2; _tcscat(p, _T(":")); p++; strCatDate(p, 3, ms); p+=3; return ISOString; } DateTools::~DateTools(){ } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/document/DateTools.h000066400000000000000000000057041154025176300231610ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_document_DateTools_ #define _lucene_document_DateTools_ #ifdef _CL_TIME_WITH_SYS_TIME # include # include #else # if defined(_CL_HAVE_SYS_TIME_H) # include # else # include # endif #endif #ifdef _CL_HAVE_SYS_TIMEB_H # include #endif CL_NS_DEF(document) class CLUCENE_EXPORT DateTools { private: static void strCatDate(TCHAR* buf, int zeroes, int value); public: enum Resolution { NO_RESOLUTION, YEAR_FORMAT, // yyyy MONTH_FORMAT, // yyyyMM DAY_FORMAT, // yyyyMMdd HOUR_FORMAT, // yyyyMMddHH MINUTE_FORMAT, // yyyyMMddHHmm SECOND_FORMAT, // yyyyMMddHHmmss MILLISECOND_FORMAT // yyyyMMddHHmmssSSS }; /** * Converts a millisecond time to a string suitable for indexing. * * @param time the date expressed as milliseconds since January 1, 1970, 00:00:00 GMT * @param resolution the desired resolution, see {@link #Resolution} * @return a string in format yyyyMMddHHmmssSSS or shorter, * depeding on resolution; using UTC as timezone */ static TCHAR* timeToString(const int64_t time, Resolution resolution = MILLISECOND_FORMAT); static void timeToString(const int64_t time, Resolution resolution, TCHAR* buf, size_t bufLength); /** * Converts a string produced by timeToString or * dateToString back to a time, represented as the * number of milliseconds since January 1, 1970, 00:00:00 GMT. * * @param dateString the date string to be converted * @return the number of milliseconds since January 1, 1970, 00:00:00 GMT * @throws ParseException if dateString is not in the * expected format */ static int64_t stringToTime(const TCHAR* dateString); static tm* stringToDate(const TCHAR* dateString); /**** * CLucene specific methods *****/ /** * Returns a 64bit time value based on the parameters passed */ static int64_t getTime(unsigned short year, uint8_t month, uint8_t mday, uint8_t hours = 0, uint8_t minutes = 0, uint8_t seconds = 0, unsigned short ms = 0); /** * Returns a 64bit time value which is inclusive of the whole last day. */ static int64_t timeMakeInclusive(const int64_t time); inline static int64_t getDifferenceFromGMT(); static TCHAR* getISOFormat(const int64_t time); static TCHAR* getISOFormat(unsigned short year, uint8_t month, uint8_t mday, uint8_t hours = 0, uint8_t minutes = 0, uint8_t seconds = 0, unsigned short ms = 0); virtual ~DateTools(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/document/Document.cpp000066400000000000000000000115031154025176300233660ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Document.h" #include "Field.h" #include "CLucene/util/StringBuffer.h" #include CL_NS_USE(util) CL_NS_DEF(document) struct DocumentFieldEnumeration::Internal { Document::FieldsType::iterator itr; Document::FieldsType::iterator end; }; DocumentFieldEnumeration::DocumentFieldEnumeration(Document::FieldsType::iterator itr, Document::FieldsType::iterator end){ this->_internal = new DocumentFieldEnumeration::Internal; this->_internal->itr = itr; this->_internal->end = end; } bool DocumentFieldEnumeration::hasMoreElements() const { return _internal->itr != _internal->end; } Field* DocumentFieldEnumeration::nextElement() { //Func - Return the next element in the enumeration //Pre - true //Post - The next element is returned or NULL Field* result = NULL; if ( _internal->itr != _internal->end ){ result = *_internal->itr; _internal->itr++; } return result; } DocumentFieldEnumeration::~DocumentFieldEnumeration(){ //Func - Destructor //Pre - true //Post - Instance has been destroyed delete _internal; } DocumentFieldEnumeration* Document::fields() { return _CLNEW DocumentFieldEnumeration(_fields->begin(), _fields->end()); } /** Constructs a new document with no fields-> */ Document::Document(): _fields(_CLNEW FieldsType(true) ) { //Func - Constructor //Pre - true //Post - Instance has been created boost = 1.0f; } Document::~Document(){ //Func - Destructor //Pre - true //Post - Instance has been destroyed boost = 1.0f; _CLDELETE(_fields); } void Document::clear(){ _fields->clear(); } void Document::add(Field& field) { _fields->push_back(&field); } void Document::setBoost(const float_t boost) { this->boost = boost; } float_t Document::getBoost() const { return boost; } Field* Document::getField(const TCHAR* name) const{ CND_PRECONDITION(name != NULL, "name is NULL"); for ( FieldsType::const_iterator itr = _fields->begin(); itr != _fields->end(); itr ++ ){ if ( _tcscmp( (*itr)->name(),name)==0 ) return *itr; } return NULL; } const TCHAR* Document::get(const TCHAR* field) const { CND_PRECONDITION(field != NULL, "field is NULL"); Field* f = getField(field); if (f!=NULL) return f->stringValue(); //this returns null it is a binary(reader) else return NULL; } const Document::FieldsType* Document::getFields() const { return _fields; } TCHAR* Document::toString() const { StringBuffer ret(_T("Document<")); for (FieldsType::const_iterator itr = _fields->begin(); itr != _fields->end(); itr++ ) { TCHAR* tmp = (*itr)->toString(); if ( ret.len > 0 ) ret.append(_T(" ")); ret.append( tmp ); _CLDELETE_ARRAY( tmp ); } ret.append(_T(">")); return ret.toString(); } void Document::removeField(const TCHAR* name) { CND_PRECONDITION(name != NULL, "name is NULL"); for ( FieldsType::iterator itr = _fields->begin(); itr != _fields->end(); itr++ ){ if ( _tcscmp( (*itr)->name(), name) == 0 ){ _fields->remove(itr); return; } } } void Document::removeFields(const TCHAR* name) { CND_PRECONDITION(name != NULL, "name is NULL"); bool flag = true; //TODO: make this more efficient while(flag){ for ( FieldsType::iterator itr = _fields->begin(); itr != _fields->end(); itr++ ){ if ( _tcscmp( (*itr)->name(), name) == 0 ){ _fields->remove(itr); flag = false; //no modifications allowed on an iterator break; } } flag = !flag; } } TCHAR** Document::getValues(const TCHAR* name) { int count = 0; for ( FieldsType::iterator itr = _fields->begin(); itr != _fields->end(); itr++ ){ if ( _tcscmp( (*itr)->name(),name) == 0 && (*itr)->stringValue() != NULL ) count++; } //todo: there must be a better way of doing this, we are doing two iterations of the fields TCHAR** ret = NULL; if ( count > 0 ){ ret = _CL_NEWARRAY(TCHAR*,count+1); int32_t i=0; for ( FieldsType::iterator itr = _fields->begin(); itr != _fields->end(); itr++ ){ if ( _tcscmp( (*itr)->name(),name) == 0 && (*itr)->stringValue() != NULL ){ ret[i] = stringDuplicate((*itr)->stringValue()); i++; } } ret[count]=NULL; } return ret; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/document/Document.h000066400000000000000000000152361154025176300230420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_document_Document_ #define _lucene_document_Document_ #include "CLucene/util/VoidList.h" #include "Field.h" ///todo: jlucene has change from using DocumentFieldList/Enumeration ///to using a java List... do we want to do this too? CL_NS_DEF(document) class DocumentFieldEnumeration; /** Documents are the unit of indexing and search. * * A Document is a set of fields. Each field has a name and a textual value. * A field may be {@link Field#isStored() stored} with the document, in which * case it is returned with search hits on the document. Thus each document * should typically contain one or more stored fields which uniquely identify * it. * *

Note that fields which are not {@link Field#isStored() stored} are * not available in documents retrieved from the index, e.g. with {@link * Hits#doc(int32_t, Document*)}, {@link Searcher#doc(int32_t, Document*)} or {@link * IndexReader#document(int32_t, Document*)}. */ class CLUCENE_EXPORT Document:LUCENE_BASE { public: typedef CL_NS(util)::CLArrayList > FieldsType; private: FieldsType* _fields; float_t boost; public: /** Constructs a new document with no fields. */ Document(); ~Document(); /** Sets a boost factor for hits on any field of this document. This value * will be multiplied into the score of all hits on this document. * *

The default value is 1.0. * *

Values are multiplied into the value of {@link Field#getBoost()} of * each field in this document. Thus, this method in effect sets a default * boost for the fields of this document. * * @see Field#setBoost(float_t) */ void setBoost(const float_t boost); /** Returns, at indexing time, the boost factor as set by {@link #setBoost(float_t)}. * *

Note that once a document is indexed this value is no longer available * from the index. At search time, for retrieved documents, this method always * returns 1. This however does not mean that the boost value set at indexing * time was ignored - it was just combined with other indexing time factors and * stored elsewhere, for better indexing and search performance. (For more * information see the "norm(t,d)" part of the scoring formula in * {@link Similarity}.) * * @see #setBoost(float_t) */ float_t getBoost() const; /** *

Adds a field to a document. Several fields may be added with * the same name. In this case, if the fields are indexed, their text is * treated as though appended for the purposes of search.

*

Note that add like the removeField(s) methods only makes sense * prior to adding a document to an index. These methods cannot * be used to change the content of an existing index! In order to achieve this, * a document has to be deleted from an index and a new changed version of that * document has to be added.

* */ void add(Field& field); /** *

Removes field with the specified name from the document. * If multiple fields exist with this name, this method removes the first field that has been added. * If there is no field with the specified name, the document remains unchanged.

*

Note that the removeField(s) methods like the add method only make sense * prior to adding a document to an index. These methods cannot * be used to change the content of an existing index! In order to achieve this, * a document has to be deleted from an index and a new changed version of that * document has to be added.

* Note: name is case sensitive */ void removeField(const TCHAR* name); /** *

Removes all fields with the given name from the document. * If there is no field with the specified name, the document remains unchanged.

*

Note that the removeField(s) methods like the add method only make sense * prior to adding a document to an index. These methods cannot * be used to change the content of an existing index! In order to achieve this, * a document has to be deleted from an index and a new changed version of that * document has to be added.

* Note: name is case sensitive */ void removeFields(const TCHAR* name); /** Returns a field with the given name if any exist in this document, or * null. If multiple fields exists with this name, this method returns the * first value added. * Note: name is case sensitive * Do not use this method with lazy loaded fields. */ Field* getField(const TCHAR* name) const; /** Returns the string value of the field with the given name if any exist in * this document, or null. If multiple fields exist with this name, this * method returns the first value added. If only binary fields with this name * exist, returns null. * Note: name is case sensitive */ const TCHAR* get(const TCHAR* field) const; /** Returns an Enumeration of all the fields in a document. * @deprecated use {@link #getFields()} instead */ _CL_DEPRECATED( getFields() ) DocumentFieldEnumeration* fields(); /** Returns a List of all the fields in a document. *

Note that fields which are not {@link Field#isStored() stored} are * not available in documents retrieved from the index, e.g. with {@link * Hits#doc(int)}, {@link Searcher#doc(int)} or {@link IndexReader#document(int)}. */ const FieldsType* getFields() const; /** * Returns an array of {@link Field}s with the given name. * This method can return null. * * @param name the name of the field * @return a Field[] array or null */ void getFields(const TCHAR* name, std::vector& ret); /** Prints the fields of a document for human consumption. */ TCHAR* toString() const; /** * Returns an array of values of the field specified as the method parameter. * This method can return null. * Note: name is case sensitive * * @param name the name of the field * @return a TCHAR** of field values or null */ TCHAR** getValues(const TCHAR* name); /** * Empties out the document so that it can be reused */ void clear(); }; class CLUCENE_EXPORT DocumentFieldEnumeration :LUCENE_BASE{ private: struct Internal; Internal* _internal; public: DocumentFieldEnumeration(Document::FieldsType::iterator itr, Document::FieldsType::iterator end); ~DocumentFieldEnumeration(); bool hasMoreElements() const; Field* nextElement(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/document/Field.cpp000066400000000000000000000225251154025176300226410ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Field.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/CLStreams.h" #include "CLucene/analysis/AnalysisHeader.h" CL_NS_USE(util) CL_NS_DEF(document) Field::Field(const TCHAR* Name, Reader* reader, int config): lazy(false) { CND_PRECONDITION(Name != NULL, "Name cannot be NULL"); CND_PRECONDITION(reader != NULL, "reader cannot be NULL"); _name = CLStringIntern::intern( Name ); fieldsData = reader; valueType = VALUE_READER; boost=1.0f; setConfig(config); } Field::Field(const TCHAR* Name, const TCHAR* Value, int _config, const bool duplicateValue): lazy(false) { CND_PRECONDITION(Name != NULL, "Name cannot be NULL"); CND_PRECONDITION(Value != NULL, "value cannot be NULL"); CND_PRECONDITION(_tcslen(Value)>0 || _tcslen(Name)>0, "name and value cannot both be empty"); /* if (_config & INDEX_NO && _config & STORE_NO) _CLTHROWA(CL_ERR_IllegalArgument,"it doesn't make sense to have a field that is neither indexed nor stored"); if (_config & INDEX_NO && _config & TERMVECTOR_YES) _CLTHROWA(CL_ERR_IllegalArgument,"cannot store term vector information for a field that is not indexed"); */ _name = CLStringIntern::intern( Name ); if (duplicateValue) fieldsData = stringDuplicate( Value ); else fieldsData = (void*)Value; valueType = VALUE_STRING; boost=1.0f; //config = INDEX_TOKENIZED; // default Field is tokenized and indexed setConfig(_config); } Field::Field(const TCHAR* Name, ValueArray* Value, int config, bool duplicateValue): lazy(false) { CND_PRECONDITION(Name != NULL, "Name cannot be NULL"); CND_PRECONDITION(Value != NULL, "value cannot be NULL"); _name = CLStringIntern::intern( Name ); if ( duplicateValue ){ ValueArray* tmp = _CLNEW ValueArray(Value->length); memcpy(tmp->values, Value->values, Value->length * sizeof(uint8_t)); fieldsData = tmp; }else{ fieldsData = Value; } valueType = VALUE_BINARY; boost=1.0f; setConfig(config); } Field::Field(const TCHAR* Name, int config): lazy(false) { CND_PRECONDITION(Name != NULL, "Name cannot be NULL"); _name = CLStringIntern::intern( Name ); fieldsData = NULL; valueType = VALUE_NONE; boost=1.0f; if (config) setConfig(config); } Field::~Field(){ //Func - Destructor //Pre - true //Post - Instance has been destroyed CLStringIntern::unintern(_name); _resetValue(); } /*===============FIELDS=======================*/ const TCHAR* Field::name() const { return _name; } ///(fieldsData) : NULL; } ///* Field::binaryValue() { return (valueType & VALUE_BINARY) ? static_cast*>(fieldsData) : NULL; } ///(fieldsData) : NULL; } ///(fieldsData) : NULL; } bool Field::isStored() const { return (config & STORE_YES) != 0; } bool Field::isIndexed() const { return (config & INDEX_TOKENIZED)!=0 || (config & INDEX_UNTOKENIZED)!=0; } bool Field::isTokenized() const { return (config & INDEX_TOKENIZED) != 0; } bool Field::isCompressed() const { return (config & STORE_COMPRESS) != 0; } bool Field::isBinary() const { return (valueType & VALUE_BINARY) && fieldsData!=NULL; } bool Field::isTermVectorStored() const { return (config & TERMVECTOR_YES) != 0; } bool Field::isStoreOffsetWithTermVector() const { return (config & TERMVECTOR_YES) != 0 && (config & TERMVECTOR_WITH_OFFSETS) != 0 && ((config & TERMVECTOR_WITH_OFFSETS) != TERMVECTOR_YES); } bool Field::isStorePositionWithTermVector() const { return (config & TERMVECTOR_YES) != 0 && (config & TERMVECTOR_WITH_POSITIONS) != 0 && ((config & TERMVECTOR_WITH_POSITIONS) != TERMVECTOR_YES); } bool Field::getOmitNorms() const { return (config & INDEX_NONORMS) != 0; } void Field::setOmitNorms(const bool omitNorms) { if ( omitNorms ) config |= INDEX_NONORMS; else config &= ~INDEX_NONORMS; } bool Field::isLazy() const { return lazy; } void Field::setValue(TCHAR* value, const bool duplicateValue) { _resetValue(); if (duplicateValue) fieldsData = stringDuplicate( value ); else fieldsData = value; valueType = VALUE_STRING; } void Field::setValue(Reader* value) { _resetValue(); fieldsData = value; valueType = VALUE_READER; } void Field::setValue(ValueArray* value) { _resetValue(); fieldsData = value; valueType = VALUE_BINARY; } /** Expert: change the value of this field. See setValue(String). */ void Field::setValue(CL_NS(analysis)::TokenStream* value) { _resetValue(); fieldsData = value; valueType = VALUE_TOKENSTREAM; } void Field::setBoost(const float_t boost) { this->boost = boost; } float_t Field::getBoost() const { return boost; } void Field::setConfig(const uint32_t x){ uint32_t newConfig=0; //set storage settings if ( (x & STORE_YES) || (x & STORE_COMPRESS) ){ newConfig |= STORE_YES; if ( x & STORE_COMPRESS ) newConfig |= STORE_COMPRESS; } else newConfig |= STORE_NO; if ( (x & INDEX_NO)==0 ){ bool index=false; if ( x & INDEX_TOKENIZED && x & INDEX_UNTOKENIZED ) _CLTHROWA(CL_ERR_IllegalArgument,"it doesn't make sense to have an untokenised and tokenised field"); if ( x & INDEX_NONORMS ){ newConfig |= INDEX_UNTOKENIZED; newConfig |= INDEX_NONORMS; index = true; } else if ( x & INDEX_TOKENIZED ){ newConfig |= INDEX_TOKENIZED; index = true; } else if ( x & INDEX_UNTOKENIZED ){ newConfig |= INDEX_UNTOKENIZED; index = true; } if ( !index ) newConfig |= INDEX_NO; }else newConfig |= INDEX_NO; if ( newConfig & INDEX_NO && newConfig & STORE_NO ) _CLTHROWA(CL_ERR_IllegalArgument,"it doesn't make sense to have a field that is neither indexed nor stored"); //set termvector settings if ( (x & TERMVECTOR_NO) == 0 ){ bool termVector=false; if ( x & TERMVECTOR_YES ){ termVector=true; } if ( (x & TERMVECTOR_WITH_POSITIONS) && ((x & TERMVECTOR_WITH_POSITIONS) != TERMVECTOR_YES) ){ newConfig |= TERMVECTOR_WITH_POSITIONS; termVector=true; } if ( x & TERMVECTOR_WITH_OFFSETS && ((x & TERMVECTOR_WITH_OFFSETS) != TERMVECTOR_YES) ){ newConfig |= TERMVECTOR_WITH_OFFSETS; termVector=true; } // TERMVECTOR_WITH_POSITIONS_OFFSETS is being automatically handled here if ( termVector ){ if ( newConfig & INDEX_NO ) _CLTHROWA(CL_ERR_IllegalArgument,"cannot store a term vector for fields that are not indexed."); newConfig |= TERMVECTOR_YES; }else newConfig |= TERMVECTOR_NO; }else newConfig |= TERMVECTOR_NO; config = newConfig; } TCHAR* Field::toString() { StringBuffer result; if (isStored()) { result.append( _T("stored") ); if (isCompressed()) result.append( _T("/compressed")); else result.append( _T("/uncompressed") ); } if (isIndexed()) { if (result.length() > 0) result.append( _T(",") ); result.append( _T("indexed") ); } if (isTokenized()) { if (result.length() > 0) result.append( _T(",") ); result.append( _T("tokenized") ); } if (isTermVectorStored()) { if (result.length() > 0) result.append( _T(",") ); result.append( _T("termVector") ); } if (isStoreOffsetWithTermVector()) { if (result.length() > 0) result.appendChar( ',' ); result.append( _T("termVectorOffsets") ); } if (isStorePositionWithTermVector()) { if (result.length() > 0) result.appendChar( ',' ); result.append( _T("termVectorPosition") ); } if (isBinary()) { if (result.length() > 0) result.appendChar( ',' ); result.append( _T("binary") ); } if (getOmitNorms()) { result.append( _T(",omitNorms") ); } if (isLazy()){ result.append( _T(",lazy") ); } result.appendChar('<'); result.append(name()); result.appendChar(':'); if (! isLazy() && fieldsData != NULL) { if (valueType & VALUE_STRING) result.append(static_cast(fieldsData)); else if (valueType & VALUE_READER) result.append( _T("Reader") ); else if (valueType & VALUE_BINARY) result.append( _T("Binary") ); else result.append( _T("NULL") ); } result.appendChar('>'); return result.toString(); } void Field::_resetValue() { if (valueType & VALUE_STRING) { TCHAR* t = static_cast(fieldsData); _CLDELETE_CARRAY(t); } else if (valueType & VALUE_READER) { Reader* r = static_cast(fieldsData); _CLDELETE(r); } else if (valueType & VALUE_BINARY) { ValueArray* v = static_cast*>(fieldsData); _CLDELETE(v); } valueType=VALUE_NONE; } const char* Field::getObjectName() const{ return getClassName(); } const char* Field::getClassName(){ return "Field"; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/document/Field.h000066400000000000000000000264071154025176300223110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_document_Field_ #define _lucene_document_Field_ #include "CLucene/util/Array.h" #include "CLucene/util/Equators.h" /* Fieldable reading: https://issues.apache.org/jira/browse/LUCENE-1219?page=com.atlassian.jira.plugin.system.issuetabpanels:comment- tabpanel&focusedCommentId=12578199#action_12578199 http://lucene.markmail.org/message/ioi4f6z24cbd5bdm?q=Fieldable#query:Fieldable+page:1+mid:fxmvzb6up7zve7k4+state:results TODO: - Solve some inconsistencies between CL and JL - mainly in the constructors area. - Write some more tests to make sure we conform with JL - mainly in the tokenizing and omitNorms area - Is there a bug in JL when calling setOmitNorms after a Tokenized field was created? */ CL_CLASS_DEF(util,Reader) CL_CLASS_DEF(analysis,TokenStream) CL_NS_DEF(document) /** A field is a section of a Document. Each field has two parts, a name and a value. Values may be free text, provided as a String or as a Reader, or they may be atomic keywords, which are not further processed. Such keywords may be used to represent dates, urls, etc. Fields are optionally stored in the index, so that they may be returned with hits on the document. */ class CLUCENE_EXPORT Field : public CL_NS(util)::NamedObject{ public: enum Store{ /** Store the original field value in the index. This is useful for short texts * like a document's title which should be displayed with the results. The * value is stored in its original form, i.e. no analyzer is used before it is * stored. */ STORE_YES=1, /** Do not store the field value in the index. */ STORE_NO=2, /** Store the original field value in the index in a compressed form. This is * useful for long documents and for binary valued fields. */ STORE_COMPRESS=4 }; enum Index{ /** Do not index the field value. This field can thus not be searched, * but one can still access its contents provided it is * {@link Field::Store stored}. */ INDEX_NO=16, /** Index the field's value so it can be searched. An Analyzer will be used * to tokenize and possibly further normalize the text before its * terms will be stored in the index. This is useful for common text. */ INDEX_TOKENIZED=32, /** Index the field's value without using an Analyzer, so it can be searched. * As no analyzer is used the value will be stored as a single term. This is * useful for unique Ids like product numbers. */ INDEX_UNTOKENIZED=64, /** Index the field's value without an Analyzer, and disable * the storing of norms. No norms means that index-time boosting * and field length normalization will be disabled. The benefit is * less memory usage as norms take up one byte per indexed field * for every document in the index. * Note that once you index a given field with norms enabled, * disabling norms will have no effect. In other words, for NO_NORMS * to have the above described effect on a field, all instances of that * field must be indexed with NO_NORMS from the beginning. */ INDEX_NONORMS=128 }; enum TermVector{ /** Do not store term vectors. */ TERMVECTOR_NO=256, /** Store the term vectors of each document. A term vector is a list * of the document's terms and their number of occurences in that document. */ TERMVECTOR_YES=512, /** * Store the term vector + token position information * * @see #YES */ TERMVECTOR_WITH_POSITIONS = TERMVECTOR_YES | 1024, /** * Store the term vector + Token offset information * * @see #YES */ TERMVECTOR_WITH_OFFSETS = TERMVECTOR_YES | 2048, /** * Store the term vector + Token position and offset information * * @see #YES * @see #WITH_POSITIONS * @see #WITH_OFFSETS */ TERMVECTOR_WITH_POSITIONS_OFFSETS = TERMVECTOR_WITH_OFFSETS | TERMVECTOR_WITH_POSITIONS }; bool lazy; enum ValueType { VALUE_NONE = 0, VALUE_STRING = 1, VALUE_READER = 2, VALUE_BINARY = 4, VALUE_TOKENSTREAM = 8 }; /** * TCHAR value constructor of Field. * @memory Set duplicateValue to false to save on memory allocations when possible */ Field(const TCHAR* name, const TCHAR* value, int _config, const bool duplicateValue = true); /** * Reader* constructor of Field. * @memory consumes reader */ Field(const TCHAR* name, CL_NS(util)::Reader* reader, int _config); /** * Binary constructor of Field. * @memory Set duplicateValue to false to save on memory allocations when possible */ Field(const TCHAR* name, CL_NS(util)::ValueArray* data, int _config, const bool duplicateValue = true); Field(const TCHAR* name, int _config); ///* binaryValue(); /** The value of the field as a TokesStream, or null. If null, the Reader value, * String value, or binary value is used. Exactly one of stringValue(), * readerValue(), binaryValue(), and tokenStreamValue() must be set. */ virtual CL_NS(analysis)::TokenStream* tokenStreamValue(); // True if the value of the field is to be stored in the index for return // with search hits. It is an error for this to be true if a field is // Reader-valued. bool isStored() const; // True if the value of the field is to be indexed, so that it may be // searched on. bool isIndexed() const; // True if the value of the field should be tokenized as text prior to // indexing. Un-tokenized fields are indexed as a single word and may not be // Reader-valued. bool isTokenized() const; /** True if the value of the field is stored and compressed within the index */ bool isCompressed() const; /** True if the term or terms used to index this field are stored as a term * vector, available from {@link IndexReader#getTermFreqVector(int32_t,TCHAR*)}. * These methods do not provide access to the original content of the field, * only to terms used to index it. If the original content must be * preserved, use the stored attribute instead. * * @see IndexReader#getTermFreqVector(int32_t, String) */ bool isTermVectorStored() const; /** * True iff terms are stored as term vector together with their offsets * (start and end positon in source text). */ bool isStoreOffsetWithTermVector() const; /** * True iff terms are stored as term vector together with their token positions. */ bool isStorePositionWithTermVector() const; /** Returns the boost factor for hits for this field. * *

The default value is 1.0. * *

Note: this value is not stored directly with the document in the index. * Documents returned from {@link IndexReader#document(int)} and * {@link Hits#doc(int)} may thus not have the same value present as when * this field was indexed. * * @see #setBoost(float_t) */ float_t getBoost() const; /** Sets the boost factor hits on this field. This value will be * multiplied into the score of all hits on this this field of this * document. * *

The boost is multiplied by {@link Document#getBoost()} of the document * containing this field. If a document has multiple fields with the same * name, all such values are multiplied together. This product is then * multipled by the value {@link Similarity#lengthNorm(String,int)}, and * rounded by {@link Similarity#encodeNorm(float_t)} before it is stored in the * index. One should attempt to ensure that this product does not overflow * the range of that encoding. * * @see Document#setBoost(float_t) * @see Similarity#lengthNorm(String, int) * @see Similarity#encodeNorm(float_t) */ void setBoost(const float_t value); /** True if the value of the filed is stored as binary */ bool isBinary() const; /** True if norms are omitted for this indexed field */ bool getOmitNorms() const; /** Expert: * * If set, omit normalization factors associated with this indexed field. * This effectively disables indexing boosts and length normalization for this field. */ void setOmitNorms(const bool omitNorms); /** * Indicates whether a Field is Lazy or not. The semantics of Lazy loading are such that if a Field is lazily loaded, retrieving * it's values via {@link #stringValue()} or {@link #binaryValue()} is only valid as long as the {@link org.apache.lucene.index.IndexReader} that * retrieved the {@link Document} is still open. * * @return true if this field can be loaded lazily */ bool isLazy() const; /** Prints a Field for human consumption. */ TCHAR* toString(); /**

Expert: change the value of this field. This can * be used during indexing to re-use a single Field * instance to improve indexing speed by avoiding GC cost * of new'ing and reclaiming Field instances. Typically * a single {@link Document} instance is re-used as * well. This helps most on small documents.

* *

Note that you should only use this method after the * Field has been consumed (ie, the {@link Document} * containing this Field has been added to the index). * Also, each Field instance should only be used once * within a single {@link Document} instance. See ImproveIndexingSpeed * for details.

* * @memory Caller is responsible for releasing value if duplicateValue == false */ void setValue(TCHAR* value, const bool duplicateValue = true); /** Expert: change the value of this field. See setValue(TCHAR*). */ void setValue(CL_NS(util)::Reader* value); /** Expert: change the value of this field. See setValue(TCHAR*). */ void setValue(CL_NS(util)::ValueArray* value) ; /** Expert: change the value of this field. See setValue(TCHAR*). */ void setValue(CL_NS(analysis)::TokenStream* value); virtual const char* getObjectName() const; static const char* getClassName(); protected: /** * Set configs using XOR. This resets all the settings * For example, to use term vectors with positions and offsets do: * object->setConfig(TERMVECTOR_WITH_POSITIONS | TERMVECTOR_WITH_OFFSETS); */ void setConfig(const uint32_t _config); void _resetValue(); void* fieldsData; ValueType valueType; const TCHAR* _name; uint32_t config; float_t boost; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/document/FieldSelector.cpp000066400000000000000000000034401154025176300243350ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "FieldSelector.h" CL_NS_USE(util) CL_NS_DEF(document) FieldSelector::~FieldSelector(){ } LoadFirstFieldSelector::~LoadFirstFieldSelector(){ } FieldSelector::FieldSelectorResult LoadFirstFieldSelector::accept(const TCHAR* /*fieldName*/) const{ return LOAD_AND_BREAK; } MapFieldSelector::~MapFieldSelector(){ _CLDELETE(fieldSelections); } MapFieldSelector::MapFieldSelector() : fieldSelections(_CLNEW FieldSelectionsType(true,false)) { } MapFieldSelector::MapFieldSelector(std::vector& fields) : fieldSelections(_CLNEW FieldSelectionsType(true,false)) { std::vector::iterator itr = fields.begin(); while ( itr != fields.end() ){ add(*itr); itr++; } } MapFieldSelector::MapFieldSelector(ArrayBase& fields): fieldSelections(_CLNEW FieldSelectionsType(true,false)) { for ( size_t i=0;ifind((TCHAR*)field); if ( itr != fieldSelections->end() ){ return itr->second; } return FieldSelector::NO_LOAD; } void MapFieldSelector::add(const TCHAR* field, FieldSelector::FieldSelectorResult action){ fieldSelections->insert(fieldSelections->end(),std::pair( STRDUP_TtoT(field), action)); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/document/FieldSelector.h000066400000000000000000000116771154025176300240150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_document_FieldSelector_ #define _lucene_document_FieldSelector_ #include "CLucene/util/Equators.h" #include "CLucene/util/Array.h" #include "CLucene/util/VoidMap.h" CL_NS_DEF(document) /** * Similar to a {@link java.io.FileFilter}, the FieldSelector allows one to make decisions about * what Fields get loaded on a {@link Document} by {@link org.apache.lucene.index.IndexReader#document(int,org.apache.lucene.document.FieldSelector)} * **/ class CLUCENE_EXPORT FieldSelector :LUCENE_BASE { public: /** * Provides information about what should be done with this Field * **/ enum FieldSelectorResult { /** * Load this {@link Field} every time the {@link Document} is loaded, reading in the data as it is encounterd. * {@link Document#getField(String)} and {@link Document#getField(String)} should not return null. *

* {@link Document#add(Field)} should be called by the Reader. */ LOAD = 0, /** * Lazily load this {@link Field}. This means the {@link Field} is valid, but it may not actually contain its data until * invoked. {@link Document#getField(String)} SHOULD NOT BE USED. {@link Document#getField(String)} is safe to use and should * return a valid instance of a {@link Field}. *

* {@link Document#add(Field)} should be called by the Reader. */ LAZY_LOAD = 1, /** * Do not load the {@link Field}. {@link Document#getField(String)} and {@link Document#getField(String)} should return null. * {@link Document#add(Field)} is not called. *

* {@link Document#add(Field)} should not be called by the Reader. */ NO_LOAD = 2, /** * Load this field as in the {@link #LOAD} case, but immediately return from {@link Field} loading for the {@link Document}. Thus, the * Document may not have its complete set of Fields. {@link Document#getField(String)} and {@link Document#getField(String)} should * both be valid for this {@link Field} *

* {@link Document#add(Field)} should be called by the Reader. */ LOAD_AND_BREAK = 3, /** * Behaves much like {@link #LOAD} but does not uncompress any compressed data. This is used for internal purposes. * {@link Document#getField(String)} and {@link Document#getField(String)} should not return null. *

* {@link Document#add(Field)} should be called by the Reader. */ LOAD_FOR_MERGE = 4, /** Expert: Load the size of this {@link Field} rather than its value. * Size is measured as number of bytes required to store the field == bytes for a binary or any compressed value, and 2*chars for a String value. * The size is stored as a binary value, represented as an int in a byte[], with the higher order byte first in [0] */ SIZE = 5, /** Expert: Like {@link #SIZE} but immediately break from the field loading loop, i.e., stop loading further fields, after the size is loaded */ SIZE_AND_BREAK = 6 }; virtual ~FieldSelector(); /** * * @param fieldName the field to accept or reject * @return an instance of {@link FieldSelectorResult} * if the {@link Field} named fieldName should be loaded. */ virtual FieldSelectorResult accept(const TCHAR* fieldName) const = 0; }; /** * Load the First field and break. *

* See {@link FieldSelectorResult#LOAD_AND_BREAK} */ class CLUCENE_EXPORT LoadFirstFieldSelector :public FieldSelector { public: ~LoadFirstFieldSelector(); FieldSelectorResult accept(const TCHAR* fieldName) const; }; /** * A FieldSelector based on a Map of field names to FieldSelectorResults * * @author Chuck Williams */ class CLUCENE_EXPORT MapFieldSelector: public FieldSelector { public: typedef CL_NS(util)::CLHashMap FieldSelectionsType; FieldSelectionsType* fieldSelections; virtual ~MapFieldSelector(); MapFieldSelector(std::vector& fieldSelections); /** Create a a MapFieldSelector */ MapFieldSelector(); /** Create a a MapFieldSelector * @param fields fields to LOAD. All other fields are NO_LOAD. */ MapFieldSelector(CL_NS(util)::ArrayBase& fields); /** Load field according to its associated value in fieldSelections * @param field a field name * @return the fieldSelections value that field maps to or NO_LOAD if none. */ FieldSelectorResult accept(const TCHAR* field) const; void add(const TCHAR*, FieldSelector::FieldSelectorResult action=FieldSelector::LOAD); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/document/NumberTools.cpp000066400000000000000000000036471154025176300240730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "NumberTools.h" #include "CLucene/util/Misc.h" CL_NS_DEF(document) const TCHAR* NumberTools::MIN_STRING_VALUE = NEGATIVE_PREFIX _T("0000000000000"); const TCHAR* NumberTools::MAX_STRING_VALUE = POSITIVE_PREFIX _T("1y2p0ij32e8e7"); TCHAR* NumberTools::longToString(int64_t l) { if (l == LUCENE_INT64_MIN_SHOULDBE) { // special case, because long is not symetric around zero return stringDuplicate(MIN_STRING_VALUE); } TCHAR* buf = _CL_NEWARRAY(TCHAR, STR_SIZE + 1); if (l < 0) { buf[0] = NEGATIVE_PREFIX[0]; l = LUCENE_INT64_MAX_SHOULDBE + l + 1; } else { buf[0] = POSITIVE_PREFIX[0]; } TCHAR tmp[STR_SIZE]; _i64tot(l, tmp, NUMBERTOOLS_RADIX); size_t len = _tcslen(tmp); _tcscpy(buf+(STR_SIZE-len),tmp); for ( size_t i=1;i * That is, if l1 is less than l2 for any two longs l1 and l2, then * NumberTools.longToString(l1) is lexicographically less than * NumberTools.longToString(l2). (Similarly for "greater than" and "equals".) * *

* This class handles all long values (unlike * {@link org.apache.lucene.document.DateField}). * * */ class CLUCENE_EXPORT NumberTools :LUCENE_BASE { #define NUMBERTOOLS_RADIX 36 #define NEGATIVE_PREFIX _T("-") // NB: NEGATIVE_PREFIX must be < POSITIVE_PREFIX #define POSITIVE_PREFIX _T("0") public: //NB: this must be less than /** * Equivalent to longToString(Long.MIN_VALUE); STR_SIZE is depandant on the length of it */ static const TCHAR* MIN_STRING_VALUE; /** * Equivalent to longToString(Long.MAX_VALUE) */ static const TCHAR* MAX_STRING_VALUE; /** * The length of (all) strings returned by {@link #longToString} */ LUCENE_STATIC_CONSTANT (size_t, STR_SIZE = 14); /** * Converts a long to a String suitable for indexing. * * @memory Caller should free the returned buffer */ static TCHAR* longToString(int64_t l); /** * Converts a String that was returned by {@link #longToString} back to a * long. * * @throws IllegalArgumentException * if the input is null * @throws NumberFormatException * if the input does not parse (it was not a String returned by * longToString()). */ static int64_t stringToLong(const TCHAR* str); ~NumberTools(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/000077500000000000000000000000001154025176300203755ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/index/CompoundFile.cpp000066400000000000000000000314141154025176300234700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Term.h" #include "_TermInfo.h" #include "_SkipListWriter.h" #include "_CompoundFile.h" #include "CLucene/util/Misc.h" #include "CLucene/store/IndexInput.h" #include "CLucene/store/IndexOutput.h" CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) class WriterFileEntry:LUCENE_BASE { public: WriterFileEntry(){ directoryOffset=0; dataOffset=0; } ~WriterFileEntry(){ } /** source file */ char file[CL_MAX_PATH]; /** temporary holder for the start of directory entry for this file */ int64_t directoryOffset; /** temporary holder for the start of this file's data section */ int64_t dataOffset; }; /** Implementation of an IndexInput that reads from a portion of the * compound file. The visibility is left as "package" *only* because * this helps with testing since JUnit test cases in a different class * can then access package fields of this class. */ class CSIndexInput:public CL_NS(store)::BufferedIndexInput { private: CL_NS(store)::IndexInput* base; int64_t fileOffset; int64_t _length; protected: /** Expert: implements buffer refill. Reads uint8_ts from the current * position in the input. * @param b the array to read uint8_ts into * @param length the number of uint8_ts to read */ void readInternal(uint8_t* /*b*/, const int32_t /*len*/); void seekInternal(const int64_t /*pos*/) { } public: CSIndexInput(CL_NS(store)::IndexInput* base, const int64_t fileOffset, const int64_t length, const int32_t readBufferSize = CL_NS(store)::BufferedIndexInput::BUFFER_SIZE); CSIndexInput(const CSIndexInput& clone); ~CSIndexInput(); /** Closes the stream to futher operations. */ void close(); CL_NS(store)::IndexInput* clone() const; int64_t length() const { return _length; } const char* getDirectoryType() const{ return CompoundFileReader::getClassName(); } const char* getObjectName() const{ return getClassName(); } static const char* getClassName() { return "CSIndexInput"; } }; class ReaderFileEntry:LUCENE_BASE { public: int64_t offset; int64_t length; ReaderFileEntry(){ offset=0; length=0; } ~ReaderFileEntry(){ } }; CSIndexInput::CSIndexInput(CL_NS(store)::IndexInput* base, const int64_t fileOffset, const int64_t length, const int32_t _readBufferSize):BufferedIndexInput(_readBufferSize){ this->base = base; this->fileOffset = fileOffset; this->_length = length; } void CSIndexInput::readInternal(uint8_t* b, const int32_t len) { SCOPED_LOCK_MUTEX(base->THIS_LOCK) int64_t start = getFilePointer(); if(start + len > _length) _CLTHROWA(CL_ERR_IO,"read past EOF"); base->seek(fileOffset + start); base->readBytes(b, len, false); } CSIndexInput::~CSIndexInput(){ } IndexInput* CSIndexInput::clone() const { return _CLNEW CSIndexInput(*this); } CSIndexInput::CSIndexInput(const CSIndexInput& clone): BufferedIndexInput(clone){ this->base = clone.base; //no need to clone this.. this->fileOffset = clone.fileOffset; this->_length = clone._length; } void CSIndexInput::close(){ } CompoundFileReader::CompoundFileReader(Directory* dir, const char* name, int32_t _readBufferSize): readBufferSize(_readBufferSize), directory(dir), stream(NULL), entries(_CLNEW EntriesType(true,true)) { fileName = STRDUP_AtoA(name); bool success = false; try { stream = dir->openInput(name, readBufferSize); // read the directory and init files int32_t count = stream->readVInt(); ReaderFileEntry* entry = NULL; TCHAR tid[CL_MAX_PATH]; for (int32_t i=0; ireadLong(); stream->readString(tid,CL_MAX_PATH); char* aid = STRDUP_TtoA(tid); if (entry != NULL) { // set length of the previous entry entry->length = offset - entry->offset; } entry = _CLNEW ReaderFileEntry(); entry->offset = offset; entries->put(aid, entry); } // set the length of the final entry if (entry != NULL) { entry->length = stream->length() - entry->offset; } success = true; }_CLFINALLY( if (! success && (stream != NULL)) { try { stream->close(); _CLDELETE(stream); } catch (CLuceneError& err){ if ( err.number() != CL_ERR_IO ) throw err; //else ignore } } ) } CompoundFileReader::~CompoundFileReader(){ close(); _CLDELETE_CaARRAY(fileName); _CLDELETE(entries); } Directory* CompoundFileReader::getDirectory(){ return directory; } const char* CompoundFileReader::getName() const{ return fileName; } const char* CompoundFileReader::getClassName(){ return "CompoundFileReader"; } const char* CompoundFileReader::getObjectName() const{ return getClassName(); } void CompoundFileReader::close(){ SCOPED_LOCK_MUTEX(THIS_LOCK) if (stream != NULL){ entries->clear(); stream->close(); _CLDELETE(stream); } } bool CompoundFileReader::openInput(const char * id, CL_NS(store)::IndexInput *& ret, CLuceneError& error, int32_t bufferSize){ SCOPED_LOCK_MUTEX(THIS_LOCK); if (stream == NULL){ error.set(CL_ERR_IO,"Stream closed"); return false; } const ReaderFileEntry* entry = entries->get((char*)id); if (entry == NULL){ char buf[CL_MAX_PATH+26]; cl_sprintf(buf, CL_MAX_PATH+26, "No sub-file with id %s found", id); error.set(CL_ERR_IO,buf); return false; } if (bufferSize < 1) bufferSize = readBufferSize; ret = _CLNEW CSIndexInput(stream, entry->offset, entry->length, bufferSize); return true; } bool CompoundFileReader::list(vector* names) const{ for ( EntriesType::const_iterator i=entries->begin();i!=entries->end();i++ ){ names->push_back(i->first); ++i; } return true; } bool CompoundFileReader::fileExists(const char* name) const{ return entries->exists((char*)name); } int64_t CompoundFileReader::fileModified(const char* name) const{ return directory->fileModified(name); } void CompoundFileReader::touchFile(const char* name){ directory->touchFile(name); } bool CompoundFileReader::doDeleteFile(const char* /*name*/){ _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: CompoundFileReader::doDeleteFile"); } void CompoundFileReader::renameFile(const char* /*from*/, const char* /*to*/){ _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: CompoundFileReader::renameFile"); } int64_t CompoundFileReader::fileLength(const char* name) const{ ReaderFileEntry* e = entries->get((char*)name); if (e == NULL){ char buf[CL_MAX_PATH + 30]; strcpy(buf,"File "); strncat(buf,name,CL_MAX_PATH ); strcat(buf," does not exist"); _CLTHROWA(CL_ERR_IO,buf); } return e->length; } IndexOutput* CompoundFileReader::createOutput(const char* /*name*/){ _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: CompoundFileReader::createOutput"); } LuceneLock* CompoundFileReader::makeLock(const char* /*name*/){ _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: CompoundFileReader::makeLock"); } string CompoundFileReader::toString() const{ return string("CompoundFileReader@") + fileName; } class CompoundFileWriter::Internal{ public: CL_NS(store)::Directory* directory; string fileName; CL_NS(util)::CLHashSet ids; typedef CL_NS(util)::CLLinkedList > EntriesType; EntriesType* entries; bool merged; SegmentMerger::CheckAbort* checkAbort; Internal(): ids(true), entries(_CLNEW EntriesType(true)) { } ~Internal(){ _CLDELETE(entries); } }; CompoundFileWriter::CompoundFileWriter(Directory* dir, const char* name, SegmentMerger::CheckAbort* checkAbort){ _internal = _CLNEW Internal; if (dir == NULL) _CLTHROWA(CL_ERR_NullPointer,"directory cannot be null"); if (name == NULL) _CLTHROWA(CL_ERR_NullPointer,"name cannot be null"); _internal->merged = false; _internal->checkAbort = checkAbort; _internal->directory = dir; _internal->fileName = name; } CompoundFileWriter::~CompoundFileWriter(){ _CLDELETE(_internal); } Directory* CompoundFileWriter::getDirectory(){ return _internal->directory; } /** Returns the name of the compound file. */ const char* CompoundFileWriter::getName() const{ return _internal->fileName.c_str(); } void CompoundFileWriter::addFile(const char* file){ if (_internal->merged) _CLTHROWA(CL_ERR_IO,"Can't add extensions after merge has been called"); if (file == NULL) _CLTHROWA(CL_ERR_NullPointer,"file cannot be null"); if (_internal->ids.find((char*)file)!=_internal->ids.end()){ char buf[CL_MAX_PATH + 30]; strcpy(buf,"File "); strncat(buf,file,CL_MAX_PATH); strcat(buf," already added"); _CLTHROWA(CL_ERR_IO,buf); } _internal->ids.insert(STRDUP_AtoA(file)); WriterFileEntry* entry = _CLNEW WriterFileEntry(); STRCPY_AtoA(entry->file,file,CL_MAX_PATH); _internal->entries->push_back(entry); } void CompoundFileWriter::close(){ if (_internal->merged) _CLTHROWA(CL_ERR_IO,"Merge already performed"); if (_internal->entries->size()==0) //isEmpty() _CLTHROWA(CL_ERR_IO,"No entries to merge have been defined"); _internal->merged = true; // open the compound stream IndexOutput* os = NULL; try { os = _internal->directory->createOutput(_internal->fileName.c_str()); // Write the number of entries os->writeVInt(_internal->entries->size()); // Write the directory with all offsets at 0. // Remember the positions of directory entries so that we can // adjust the offsets later { //msvc6 for scope fix for ( CLLinkedList::iterator i=_internal->entries->begin();i!=_internal->entries->end();i++ ){ WriterFileEntry* fe = *i; fe->directoryOffset = os->getFilePointer(); os->writeLong(0); // for now os->writeString(fe->file); } } // Open the files and copy their data into the stream. // Remember the locations of each file's data section. { //msvc6 for scope fix const int32_t bufferLength = 16384; uint8_t buffer[bufferLength]; for ( CL_NS(util)::CLLinkedList::iterator i=_internal->entries->begin();i!=_internal->entries->end();i++ ){ WriterFileEntry* fe = *i; fe->dataOffset = os->getFilePointer(); copyFile(fe, os, buffer, bufferLength); } } { //msvc6 for scope fix // Write the data offsets into the directory of the compound stream for ( CLLinkedList::iterator i=_internal->entries->begin(); i!=_internal->entries->end();i++ ){ WriterFileEntry* fe = *i; os->seek(fe->directoryOffset); os->writeLong(fe->dataOffset); } } } _CLFINALLY ( if (os != NULL) try { os->close(); _CLDELETE(os); } catch (...) { } ); } void CompoundFileWriter::copyFile(WriterFileEntry* source, IndexOutput* os, uint8_t* buffer, int32_t bufferLength){ IndexInput* is = NULL; try { int64_t startPtr = os->getFilePointer(); is = _internal->directory->openInput(source->file); int64_t length = is->length(); int64_t remainder = length; int32_t chunk = bufferLength; while(remainder > 0) { int32_t len = (int32_t)cl_min((int64_t)chunk, remainder); is->readBytes(buffer, len); os->writeBytes(buffer, len); remainder -= len; if (_internal->checkAbort != NULL) // Roughly every 2 MB we will check if // it's time to abort _internal->checkAbort->work(80); } // Verify that remainder is 0 if (remainder != 0){ TCHAR buf[CL_MAX_PATH+100]; _sntprintf(buf,CL_MAX_PATH+100,_T("Non-zero remainder length after copying") _T(": %d (id: %s, length: %d, buffer size: %d)"), (int)remainder,source->file,(int)length,(int)chunk ); _CLTHROWT(CL_ERR_IO,buf); } // Verify that the output length diff is equal to original file int64_t endPtr = os->getFilePointer(); int64_t diff = endPtr - startPtr; if (diff != length){ TCHAR buf[100]; _sntprintf(buf,100,_T("Difference in the output file offsets %d ") _T("does not match the original file length %d"),(int)diff,(int)length); _CLTHROWT(CL_ERR_IO,buf); } } _CLFINALLY ( if (is != NULL){ is->close(); _CLDELETE(is); } ); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/DirectoryIndexReader.cpp000066400000000000000000000233511154025176300251640ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "DirectoryIndexReader.h" #include "_IndexFileDeleter.h" #include "IndexDeletionPolicy.h" #include "_MultiSegmentReader.h" #include "_SegmentHeader.h" #include "IndexWriter.h" #include "CLucene/store/Directory.h" #include "CLucene/store/Lock.h" #include "_SegmentInfos.h" CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) void DirectoryIndexReader::doClose() { if(closeDirectory && _directory){ _directory->close(); } _CLDECDELETE(_directory); } void DirectoryIndexReader::doCommit() { if(hasChanges){ if (segmentInfos != NULL) { // Default deleter (for backwards compatibility) is // KeepOnlyLastCommitDeleter: IndexFileDeleter deleter(_directory, deletionPolicy == NULL ? _CLNEW KeepOnlyLastCommitDeletionPolicy() : deletionPolicy, segmentInfos, NULL, NULL); // Checkpoint the state we are about to change, in // case we have to roll back: startCommit(); bool success = false; try { commitChanges(); segmentInfos->write(_directory); success = true; } _CLFINALLY ( if (!success) { // Rollback changes that were made to // SegmentInfos but failed to get [fully] // committed. This way this reader instance // remains consistent (matched to what's // actually in the index): rollbackCommit(); // Recompute deletable files & remove them (so // partially written .del files, etc, are // removed): deleter.refresh(); } ) // Have the deleter remove any now unreferenced // files due to this commit: deleter.checkpoint(segmentInfos, true); if (writeLock != NULL) { writeLock->release(); // release write lock _CLDELETE(writeLock); } } else commitChanges(); } hasChanges = false; } void DirectoryIndexReader::acquireWriteLock() { if (segmentInfos != NULL) { ensureOpen(); if (stale) _CLTHROWA(CL_ERR_StaleReader, "IndexReader out of date and no longer valid for delete, undelete, or setNorm operations"); if (writeLock == NULL) { LuceneLock* writeLock = _directory->makeLock(IndexWriter::WRITE_LOCK_NAME); if (!writeLock->obtain(IndexWriter::WRITE_LOCK_TIMEOUT)) { // obtain write lock string message = string("Index locked for write: ") + writeLock->getObjectName(); _CLDELETE(writeLock); _CLTHROWA(CL_ERR_LockObtainFailed, message.c_str()); } this->writeLock = writeLock; // we have to check whether index has changed since this reader was opened. // if so, this reader is no longer valid for deletion if (SegmentInfos::readCurrentVersion(_directory) > segmentInfos->getVersion()) { stale = true; this->writeLock->release(); _CLDELETE(writeLock); _CLTHROWA(CL_ERR_StaleReader, "IndexReader out of date and no longer valid for delete, undelete, or setNorm operations"); } } } } void DirectoryIndexReader::init(Directory* __directory, SegmentInfos* segmentInfos, bool closeDirectory) { this->deletionPolicy = NULL; this->stale = false; this->writeLock = NULL; this->rollbackSegmentInfos = NULL; this->_directory = _CL_POINTER(__directory); this->segmentInfos = segmentInfos; this->closeDirectory = closeDirectory; } DirectoryIndexReader::DirectoryIndexReader(): IndexReader() { } DirectoryIndexReader::~DirectoryIndexReader(){ try { if (writeLock != NULL) { writeLock->release(); // release write lock writeLock = NULL; } }catch(...){ } _CLDELETE(segmentInfos); _CLDELETE(rollbackSegmentInfos); } DirectoryIndexReader::DirectoryIndexReader(Directory* __directory, SegmentInfos* segmentInfos, bool closeDirectory): IndexReader() { init(__directory, segmentInfos, closeDirectory); } class DirectoryIndexReader::FindSegmentsFile_Open: public SegmentInfos::FindSegmentsFile{ bool closeDirectory; IndexDeletionPolicy* deletionPolicy; protected: DirectoryIndexReader* doBody(const char* segmentFileName) { SegmentInfos* infos = _CLNEW SegmentInfos; infos->read(directory, segmentFileName); DirectoryIndexReader* reader; if (infos->size() == 1) { // index is optimized reader = SegmentReader::get(infos, infos->info(0), closeDirectory); } else { reader = _CLNEW MultiSegmentReader(directory, infos, closeDirectory); } reader->setDeletionPolicy(deletionPolicy); return reader; } public: FindSegmentsFile_Open( bool closeDirectory, IndexDeletionPolicy* deletionPolicy, CL_NS(store)::Directory* dir ): SegmentInfos::FindSegmentsFile(dir) { this->closeDirectory = closeDirectory; this->deletionPolicy = deletionPolicy; } }; DirectoryIndexReader* DirectoryIndexReader::open(Directory* __directory, bool closeDirectory, IndexDeletionPolicy* deletionPolicy) { DirectoryIndexReader::FindSegmentsFile_Open runner(closeDirectory, deletionPolicy, __directory); return runner.run(); } class DirectoryIndexReader::FindSegmentsFile_Reopen: public SegmentInfos::FindSegmentsFile{ bool closeDirectory; IndexDeletionPolicy* deletionPolicy; DirectoryIndexReader* _this; protected: DirectoryIndexReader* doBody(const char* segmentFileName) { SegmentInfos* infos = _CLNEW SegmentInfos(); infos->read(directory, segmentFileName); DirectoryIndexReader* newReader = _this->doReopen(infos); if (_this != newReader) { newReader->init(directory, infos, closeDirectory); newReader->deletionPolicy = deletionPolicy; } return newReader; } public: FindSegmentsFile_Reopen( bool closeDirectory, IndexDeletionPolicy* deletionPolicy, CL_NS(store)::Directory* dir, DirectoryIndexReader* _this ): SegmentInfos::FindSegmentsFile(dir) { this->closeDirectory = closeDirectory; this->deletionPolicy = deletionPolicy; this->_this = _this; } }; IndexReader* DirectoryIndexReader::reopen(){ SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); if (this->hasChanges || this->isCurrent()) { // the index hasn't changed - nothing to do here return this; } FindSegmentsFile_Reopen runner(closeDirectory, deletionPolicy, _directory, this); IndexReader* ret = runner.run(); //disown this memory... this->writeLock = NULL; this->_directory = NULL; this->deletionPolicy = NULL; return ret; } void DirectoryIndexReader::setDeletionPolicy(IndexDeletionPolicy* deletionPolicy) { this->deletionPolicy = deletionPolicy; } /** Returns the directory this index resides in. */ Directory* DirectoryIndexReader::directory() { ensureOpen(); return _directory; } /** * Version number when this IndexReader was opened. */ int64_t DirectoryIndexReader::getVersion() { ensureOpen(); return segmentInfos->getVersion(); } /** * Check whether this IndexReader is still using the * current (i.e., most recently committed) version of the * index. If a writer has committed any changes to the * index since this reader was opened, this will return * false, in which case you must open a _CLNEW * IndexReader in order to see the changes. See the * description of the autoCommit * flag which controls when the {@link IndexWriter} * actually commits changes to the index. * * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ bool DirectoryIndexReader::isCurrent(){ ensureOpen(); return SegmentInfos::readCurrentVersion(_directory) == segmentInfos->getVersion(); } /** * Checks is the index is optimized (if it has a single segment and no deletions) * @return true if the index is optimized; false otherwise */ bool DirectoryIndexReader::isOptimized() { ensureOpen(); return segmentInfos->size() == 1 && hasDeletions() == false; } /** * Should internally checkpoint state that will change * during commit so that we can rollback if necessary. */ void DirectoryIndexReader::startCommit() { if (segmentInfos != NULL) { rollbackSegmentInfos = segmentInfos->clone(); } rollbackHasChanges = hasChanges; } /** * Rolls back state to just before the commit (this is * called by commit() if there is some exception while * committing). */ void DirectoryIndexReader::rollbackCommit() { if (segmentInfos != NULL) { for(int32_t i=0;isize();i++) { // Rollback each segmentInfo. Because the // SegmentReader holds a reference to the // SegmentInfo we can't [easily] just replace // segmentInfos, so we reset it in place instead: segmentInfos->info(i)->reset(rollbackSegmentInfos->info(i)); } _CLDELETE(rollbackSegmentInfos); } hasChanges = rollbackHasChanges; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/DirectoryIndexReader.h000066400000000000000000000105271154025176300246320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_DirectoryIndexReader_ #define _lucene_index_DirectoryIndexReader_ #include "IndexReader.h" CL_CLASS_DEF(store,LuceneLock) CL_NS_DEF(index) class IndexDeletionPolicy; /** * IndexReader implementation that has access to a Directory. * Instances that have a SegmentInfos object (i. e. segmentInfos != null) * "own" the directory, which means that they try to acquire a write lock * whenever index modifications are performed. */ class CLUCENE_EXPORT DirectoryIndexReader: public IndexReader { private: IndexDeletionPolicy* deletionPolicy; SegmentInfos* segmentInfos; CL_NS(store)::LuceneLock* writeLock; bool stale; /** Used by commit() to record pre-commit state in case * rollback is necessary */ bool rollbackHasChanges; SegmentInfos* rollbackSegmentInfos; class FindSegmentsFile_Open; class FindSegmentsFile_Reopen; friend class FindSegmentsFile_Open; friend class FindSegmentsFile_Reopen; protected: CL_NS(store)::Directory* _directory; bool closeDirectory; DirectoryIndexReader(); /** * Re-opens the index using the passed-in SegmentInfos */ virtual DirectoryIndexReader* doReopen(SegmentInfos* infos) = 0; void doClose(); /** * Commit changes resulting from delete, undeleteAll, or * setNorm operations * * If an exception is hit, then either no changes or all * changes will have been committed to the index * (transactional semantics). * @throws IOException if there is a low-level IO error */ void doCommit(); virtual void commitChanges() = 0; /** * Tries to acquire the WriteLock on this directory-> * this method is only valid if this IndexReader is directory owner. * * @throws StaleReaderException if the index has changed * since this reader was opened * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if there is a low-level IO error */ void acquireWriteLock(); public: virtual ~DirectoryIndexReader(); void init(CL_NS(store)::Directory* directory, SegmentInfos* segmentInfos, bool closeDirectory); CLUCENE_LOCAL_DECL DirectoryIndexReader(CL_NS(store)::Directory* directory, SegmentInfos* segmentInfos, bool closeDirectory); CLUCENE_LOCAL_DECL static DirectoryIndexReader* open(CL_NS(store)::Directory* directory, bool closeDirectory, IndexDeletionPolicy* deletionPolicy); IndexReader* reopen(); void setDeletionPolicy(IndexDeletionPolicy* deletionPolicy); /** Returns the directory this index resides in. */ CL_NS(store)::Directory* directory(); /** * Version number when this IndexReader was opened. */ int64_t getVersion(); /** * Check whether this IndexReader is still using the * current (i.e., most recently committed) version of the * index. If a writer has committed any changes to the * index since this reader was opened, this will return * false, in which case you must open a _CLNEW * IndexReader in order to see the changes. See the * description of the autoCommit * flag which controls when the {@link IndexWriter} * actually commits changes to the index. * * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ bool isCurrent(); /** * Checks is the index is optimized (if it has a single segment and no deletions) * @return true if the index is optimized; false otherwise */ bool isOptimized(); /** * Should internally checkpoint state that will change * during commit so that we can rollback if necessary. */ CLUCENE_LOCAL_DECL void startCommit(); /** * Rolls back state to just before the commit (this is * called by commit() if there is some exception while * committing). */ CLUCENE_LOCAL_DECL void rollbackCommit(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/DocumentsWriter.cpp000066400000000000000000001431711154025176300242460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexOutput.h" #include "CLucene/store/_RAMDirectory.h" #include "CLucene/util/Array.h" #include "CLucene/util/_Arrays.h" #include "CLucene/util/Misc.h" #include "CLucene/util/CLStreams.h" #include "CLucene/document/Field.h" #include "CLucene/search/Similarity.h" #include "CLucene/document/Document.h" #include "_FieldInfos.h" #include "_TermInfo.h" #include "_CompoundFile.h" #include "IndexWriter.h" #include "_IndexFileNames.h" #include "_FieldsWriter.h" #include "Term.h" #include "_Term.h" #include "_TermInfo.h" #include "_TermVector.h" #include "_TermInfosWriter.h" #include "_SkipListWriter.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/search/Similarity.h" #include "_TermInfosWriter.h" #include "_FieldsWriter.h" #include "_DocumentsWriter.h" #include #include #include CL_NS_USE(util) CL_NS_USE(store) CL_NS_USE(analysis) CL_NS_USE(document) CL_NS_USE(search) CL_NS_DEF(index) const int32_t DocumentsWriter::MAX_THREAD_STATE = 5; const uint8_t DocumentsWriter::defaultNorm = Similarity::encodeNorm(1.0f); const int32_t DocumentsWriter::nextLevelArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 9}; const int32_t DocumentsWriter::levelSizeArray[10] = {5, 14, 20, 30, 40, 40, 80, 80, 120, 200}; const int32_t DocumentsWriter::POSTING_NUM_BYTE = OBJECT_HEADER_BYTES + 9*INT_NUM_BYTE + 5*POINTER_NUM_BYTE; const int32_t DocumentsWriter::BYTE_BLOCK_SHIFT = 15; const int32_t DocumentsWriter::BYTE_BLOCK_SIZE = (int32_t)pow(2.0, BYTE_BLOCK_SHIFT); const int32_t DocumentsWriter::BYTE_BLOCK_MASK = BYTE_BLOCK_SIZE - 1; const int32_t DocumentsWriter::BYTE_BLOCK_NOT_MASK = ~BYTE_BLOCK_MASK; const int32_t DocumentsWriter::CHAR_BLOCK_SHIFT = 14; const int32_t DocumentsWriter::CHAR_BLOCK_SIZE = (int32_t)pow(2.0, CHAR_BLOCK_SHIFT); const int32_t DocumentsWriter::CHAR_BLOCK_MASK = CHAR_BLOCK_SIZE - 1; int32_t DocumentsWriter::OBJECT_HEADER_BYTES = 8; int32_t DocumentsWriter::OBJECT_POINTER_BYTES = 4; // TODO: should be 8 on 64-bit platform int32_t DocumentsWriter::BYTES_PER_CHAR = 2; int32_t DocumentsWriter::BYTES_PER_INT = 4; const int32_t DocumentsWriter::POINTER_NUM_BYTE = 4; const int32_t DocumentsWriter::INT_NUM_BYTE = 4; const int32_t DocumentsWriter::CHAR_NUM_BYTE = 2; //TODO: adjust for c++... const int32_t DocumentsWriter::MAX_TERM_LENGTH = DocumentsWriter::CHAR_BLOCK_SIZE-1; AbortException::AbortException(CLuceneError& _err, DocumentsWriter* docWriter): err(_err) { docWriter->setAborting(); } DocumentsWriter::DocumentsWriter(CL_NS(store)::Directory* directory, IndexWriter* writer): bufferedDeleteTerms(_CLNEW TermNumMapType(true, true)), freeCharBlocks(FreeCharBlocksType(true)), freeByteBlocks(FreeByteBlocksType(true)), waitingThreadStates( CL_NS(util)::ValueArray(MAX_THREAD_STATE) ) { numBytesAlloc = 0; numBytesUsed = 0; this->directory = directory; this->writer = writer; this->hasNorms = this->bufferIsFull = false; fieldInfos = _CLNEW FieldInfos(); maxBufferedDeleteTerms = IndexWriter::DEFAULT_MAX_BUFFERED_DELETE_TERMS; ramBufferSize = (int64_t) (IndexWriter::DEFAULT_RAM_BUFFER_SIZE_MB*1024*1024); maxBufferedDocs = IndexWriter::DEFAULT_MAX_BUFFERED_DOCS; numBufferedDeleteTerms = 0; copyByteBuffer = _CL_NEWARRAY(uint8_t, 4096); *copyByteBuffer = 0; this->closed = this->flushPending = false; _files = NULL; _abortedFiles = NULL; skipListWriter = NULL; infoStream = NULL; fieldsWriter = NULL; tvx = tvf = tvd = NULL; postingsFreeCountDW = postingsAllocCountDW = numWaiting = pauseThreads = abortCount = 0; docStoreOffset = nextDocID = numDocsInRAM = numDocsInStore = nextWriteDocID = 0; } DocumentsWriter::~DocumentsWriter(){ _CLLDELETE(bufferedDeleteTerms); _CLLDELETE(skipListWriter); _CLDELETE_LARRAY(copyByteBuffer); _CLLDELETE(_files); _CLLDELETE(fieldInfos); for(size_t i=0;ipostingsFreeListDW.values){ if (this->postingsFreeCountDW < this->postingsFreeListDW.length) { memset(this->postingsFreeListDW.values + this->postingsFreeCountDW , NULL , sizeof(Posting*)); } postingsFreeListDW.deleteUntilNULL(); } } void DocumentsWriter::setInfoStream(std::ostream* infoStream) { this->infoStream = infoStream; } void DocumentsWriter::setRAMBufferSizeMB(float_t mb) { if ( (int32_t)mb == IndexWriter::DISABLE_AUTO_FLUSH) { ramBufferSize = IndexWriter::DISABLE_AUTO_FLUSH; } else { ramBufferSize = (int64_t) (mb*1024*1024); } } float_t DocumentsWriter::getRAMBufferSizeMB() { if (ramBufferSize == IndexWriter::DISABLE_AUTO_FLUSH) { return (float_t)ramBufferSize; } else { return ramBufferSize/1024.0/1024.0; } } void DocumentsWriter::setMaxBufferedDocs(int32_t count) { maxBufferedDocs = count; } int32_t DocumentsWriter::getMaxBufferedDocs() { return maxBufferedDocs; } std::string DocumentsWriter::getSegment() { return segment; } int32_t DocumentsWriter::getNumDocsInRAM() { return numDocsInRAM; } const std::string& DocumentsWriter::getDocStoreSegment() { return docStoreSegment; } int32_t DocumentsWriter::getDocStoreOffset() { return docStoreOffset; } std::string DocumentsWriter::closeDocStore() { assert (allThreadsIdle()); const std::vector& flushedFiles = files(); if (infoStream != NULL) (*infoStream) << string("\ncloseDocStore: ") << Misc::toString((int32_t)flushedFiles.size()) << string(" files to flush to segment ") << docStoreSegment << string(" numDocs=") << Misc::toString(numDocsInStore) << string("\n"); if (flushedFiles.size() > 0) { _CLDELETE(_files); if (tvx != NULL) { // At least one doc in this run had term vectors enabled assert ( !docStoreSegment.empty()); tvx->close(); _CLDELETE(tvx); tvf->close(); _CLDELETE(tvf); tvd->close(); _CLDELETE(tvd); assert ( 4+numDocsInStore*8 == directory->fileLength( (docStoreSegment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION).c_str()) ); // "after flush: tvx size mismatch: " + numDocsInStore + " docs vs " + directory->fileLength(docStoreSegment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION) + " length in bytes of " + docStoreSegment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION; } if (fieldsWriter != NULL) { assert (!docStoreSegment.empty()); fieldsWriter->close(); _CLDELETE(fieldsWriter); assert(numDocsInStore*8 == directory->fileLength( (docStoreSegment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION).c_str() ) );// "after flush: fdx size mismatch: " + numDocsInStore + " docs vs " + directory->fileLength(docStoreSegment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION) + " length in bytes of " + docStoreSegment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION; } std::string s = docStoreSegment; docStoreSegment.clear(); docStoreOffset = 0; numDocsInStore = 0; return s; } else { return ""; } } const std::vector* DocumentsWriter::abortedFiles() { return _abortedFiles; } const std::vector& DocumentsWriter::files() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (_files != NULL) return *_files; _files = _CLNEW std::vector; // Stored fields: if (fieldsWriter != NULL) { assert ( !docStoreSegment.empty()); _files->push_back(docStoreSegment + "." + IndexFileNames::FIELDS_EXTENSION); _files->push_back(docStoreSegment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION); } // Vectors: if (tvx != NULL) { assert ( !docStoreSegment.empty()); _files->push_back(docStoreSegment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION); _files->push_back(docStoreSegment + "." + IndexFileNames::VECTORS_FIELDS_EXTENSION); _files->push_back(docStoreSegment + "." + IndexFileNames::VECTORS_DOCUMENTS_EXTENSION); } return *_files; } void DocumentsWriter::setAborting() { SCOPED_LOCK_MUTEX(THIS_LOCK) abortCount++; } void DocumentsWriter::abort(AbortException* ae) { SCOPED_LOCK_MUTEX(THIS_LOCK) // Anywhere that throws an AbortException must first // mark aborting to make sure while the exception is // unwinding the un-synchronized stack, no thread grabs // the corrupt ThreadState that hit the aborting // exception: assert (ae == NULL || abortCount>0); try { if (infoStream != NULL) (*infoStream) << string("docWriter: now abort\n"); // Forcefully remove waiting ThreadStates from line for(int32_t i=0;iisIdle = true; numWaiting = 0; // Wait for all other threads to finish with DocumentsWriter: pauseAllThreads(); assert (0 == numWaiting); try { bufferedDeleteTerms->clear(); bufferedDeleteDocIDs.clear(); numBufferedDeleteTerms = 0; try { const std::vector& __abortedFiles = files(); _abortedFiles = _CLNEW std::vector; for ( std::vector::const_iterator itr = __abortedFiles.begin(); itr != __abortedFiles.end(); itr ++ ){ _abortedFiles->push_back(*itr); } } catch (...) { _CLDELETE(_abortedFiles); } docStoreSegment.clear(); numDocsInStore = 0; docStoreOffset = 0; _CLDELETE(_files); // Clear vectors & fields from ThreadStates for(size_t i=0;itvfLocal->reset(); state->fdtLocal->reset(); if (state->localFieldsWriter != NULL) { try { state->localFieldsWriter->close(); } catch (...) { } _CLDELETE(state->localFieldsWriter); } } // Reset vectors writer if (tvx != NULL) { try { tvx->close(); } catch (...) { } _CLDELETE(tvx); } if (tvd != NULL) { try { tvd->close(); } catch (...) { } _CLDELETE(tvd); } if (tvf != NULL) { try { tvf->close(); } catch (...) { } _CLDELETE(tvf); } // Reset fields writer if (fieldsWriter != NULL) { try { fieldsWriter->close(); } catch (...) { } _CLDELETE(fieldsWriter); } // Discard pending norms: const int32_t numField = fieldInfos->size(); for (int32_t i=0;ifieldInfo(i); if (fi->isIndexed && !fi->omitNorms) { BufferedNorms* n = norms[i]; if (n != NULL) try { n->reset(); } catch (...) { } } } // Reset all postings data resetPostingsData(); } _CLFINALLY ( resumeAllThreads(); ) // If we have a root cause exception, re-throw it now: if (ae != NULL) { CLuceneError& t = ae->err; throw t; } } _CLFINALLY ( if (ae != NULL) abortCount--; CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) ) } void DocumentsWriter::resetPostingsData() { // All ThreadStates should be idle when we are called assert ( allThreadsIdle() ); threadBindings.clear(); segment.erase(); numDocsInRAM = 0; nextDocID = 0; nextWriteDocID = 0; _CLDELETE(_files); balanceRAM(); bufferIsFull = false; flushPending = false; for(size_t i=0;inumThreads = 0; threadStates[i]->resetPostings(); } numBytesUsed = 0; } // Returns true if an abort is in progress bool DocumentsWriter::pauseAllThreads() { SCOPED_LOCK_MUTEX(THIS_LOCK) pauseThreads++; while(!allThreadsIdle()) { CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) } return abortCount > 0; } void DocumentsWriter::resumeAllThreads() { SCOPED_LOCK_MUTEX(THIS_LOCK) pauseThreads--; assert ( pauseThreads >= 0 ); if (0 == pauseThreads){ CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) } } bool DocumentsWriter::allThreadsIdle() { SCOPED_LOCK_MUTEX(THIS_LOCK) for(size_t i=0;iisIdle) return false; return true; } int32_t DocumentsWriter::flush(bool _closeDocStore) { SCOPED_LOCK_MUTEX(THIS_LOCK) assert ( allThreadsIdle() ); if (segment.empty()){ // In case we are asked to flush an empty segment segment = writer->newSegmentName(); } newFiles.clear(); docStoreOffset = numDocsInStore; int32_t docCount; assert ( numDocsInRAM > 0 ); if (infoStream != NULL) (*infoStream) << string("\nflush postings as segment ") << segment << string(" numDocs=") << Misc::toString(numDocsInRAM) << string("\n"); bool success = false; try { if (_closeDocStore) { assert ( !docStoreSegment.empty()); assert ( docStoreSegment.compare(segment) == 0 ); const std::vector& tmp = files(); for (std::vector::const_iterator itr = tmp.begin(); itr != tmp.end(); itr++ ) newFiles.push_back(*itr); closeDocStore(); } fieldInfos->write(directory, (segment + ".fnm").c_str() ); docCount = numDocsInRAM; writeSegment(newFiles); //write new files directly... success = true; } _CLFINALLY( if (!success) abort(NULL); ) return docCount; } void DocumentsWriter::createCompoundFile(const std::string& segment) { CompoundFileWriter* cfsWriter = _CLNEW CompoundFileWriter(directory, (segment + "." + IndexFileNames::COMPOUND_FILE_EXTENSION).c_str()); for (std::vector::const_iterator itr = newFiles.begin(); itr != newFiles.end(); itr ++ ) cfsWriter->addFile( (*itr).c_str() ); // Perform the merge cfsWriter->close(); _CLDELETE(cfsWriter); } bool DocumentsWriter::setFlushPending() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (flushPending) return false; else { flushPending = true; return true; } } void DocumentsWriter::clearFlushPending() { SCOPED_LOCK_MUTEX(THIS_LOCK) flushPending = false; } void DocumentsWriter::writeNorms(const std::string& segmentName, int32_t totalNumDoc) { IndexOutput* normsOut = directory->createOutput( (segmentName + "." + IndexFileNames::NORMS_EXTENSION).c_str() ); try { normsOut->writeBytes(SegmentMerger::NORMS_HEADER, SegmentMerger::NORMS_HEADER_length); const int32_t numField = fieldInfos->size(); for (int32_t fieldIdx=0;fieldIdxfieldInfo(fieldIdx); if (fi->isIndexed && !fi->omitNorms) { BufferedNorms* n = norms[fieldIdx]; int64_t v; if (n == NULL) v = 0; else { v = n->out.getFilePointer(); n->out.writeTo(normsOut); n->reset(); } if (v < totalNumDoc) fillBytes(normsOut, defaultNorm, (int32_t) (totalNumDoc-v)); } } } _CLFINALLY ( normsOut->close(); _CLDELETE(normsOut); ) } void DocumentsWriter::writeSegment(std::vector& flushedFiles) { assert ( allThreadsIdle() ); assert ( nextDocID == numDocsInRAM ); const std::string segmentName = segment; TermInfosWriter* termsOut = _CLNEW TermInfosWriter(directory, segmentName.c_str(), fieldInfos, writer->getTermIndexInterval()); IndexOutput* freqOut = directory->createOutput( (segmentName + ".frq").c_str() ); IndexOutput* proxOut = directory->createOutput( (segmentName + ".prx").c_str() ); // Gather all FieldData's that have postings, across all // ThreadStates std::vector allFields; assert ( allThreadsIdle() ); for(size_t i=0;itrimFields(); const int32_t numFields = state->numAllFieldData; for(int32_t j=0;jallFieldDataArray[j]; if (fp->numPostings > 0) allFields.push_back(fp); } } // Sort by field name std::sort(allFields.begin(),allFields.end(),ThreadState::FieldData::sort); const int32_t numAllFields = allFields.size(); skipListWriter = _CLNEW DefaultSkipListWriter(termsOut->skipInterval, termsOut->maxSkipLevels, numDocsInRAM, freqOut, proxOut); int32_t start = 0; while(start < numAllFields) { const TCHAR* fieldName = allFields[start]->fieldInfo->name; int32_t end = start+1; while(end < numAllFields && _tcscmp(allFields[end]->fieldInfo->name, fieldName)==0 ) end++; ValueArray fields(end-start); for(int32_t i=start;iresetPostingArrays(); start = end; } freqOut->close(); _CLDELETE(freqOut); proxOut->close(); _CLDELETE(proxOut); termsOut->close(); _CLDELETE(termsOut); _CLDELETE(skipListWriter); // Record all files we have flushed flushedFiles.push_back(segmentFileName(IndexFileNames::FIELD_INFOS_EXTENSION)); flushedFiles.push_back(segmentFileName(IndexFileNames::FREQ_EXTENSION)); flushedFiles.push_back(segmentFileName(IndexFileNames::PROX_EXTENSION)); flushedFiles.push_back(segmentFileName(IndexFileNames::TERMS_EXTENSION)); flushedFiles.push_back(segmentFileName(IndexFileNames::TERMS_INDEX_EXTENSION)); if (hasNorms) { writeNorms(segmentName, numDocsInRAM); flushedFiles.push_back(segmentFileName(IndexFileNames::NORMS_EXTENSION)); } if (infoStream != NULL) { const int64_t newSegmentSize = segmentSize(segmentName); (*infoStream) << string(" oldRAMSize=") << Misc::toString(numBytesUsed) << string(" newFlushedSize=") << Misc::toString(newSegmentSize) << string(" docs/MB=") << Misc::toString((float_t)(numDocsInRAM/(newSegmentSize/1024.0/1024.0))) << string(" new/old=") << Misc::toString((float_t)(100.0*newSegmentSize/numBytesUsed)) << string("%\n"); } resetPostingsData(); nextDocID = 0; nextWriteDocID = 0; numDocsInRAM = 0; _CLDELETE(_files); // Maybe downsize this->postingsFreeListDW array if (this->postingsFreeListDW.length > 1.5*this->postingsFreeCountDW) { int32_t newSize = this->postingsFreeListDW.length; while(newSize > 1.25*this->postingsFreeCountDW) { newSize = (int32_t) (newSize*0.8); } this->postingsFreeListDW.resize(newSize); } } std::string DocumentsWriter::segmentFileName(const char* extension) { return segmentFileName( string(extension) ); } std::string DocumentsWriter::segmentFileName(const std::string& extension) { return segment + "." + extension; } int32_t DocumentsWriter::compareText(const TCHAR* text1, const TCHAR* text2) { int32_t pos1=0; int32_t pos2=0; while(true) { const TCHAR c1 = text1[pos1++]; const TCHAR c2 = text2[pos2++]; if (c1 < c2) if (CLUCENE_END_OF_WORD == c2) return 1; else return -1; else if (c2 < c1) if (CLUCENE_END_OF_WORD == c1) return -1; else return 1; else if (CLUCENE_END_OF_WORD == c1) return 0; } } void DocumentsWriter::appendPostings(ArrayBase* fields, TermInfosWriter* termsOut, IndexOutput* freqOut, IndexOutput* proxOut) { const int32_t fieldNumber = (*fields)[0]->fieldInfo->number; int32_t numFields = fields->length; ObjectArray mergeStatesData(numFields); ValueArray mergeStates(numFields); for(int32_t i=0;ifield = (*fields)[i]; fms->postings = fms->field->sortPostings(); assert ( fms->field->fieldInfo == (*fields)[0]->fieldInfo ); // Should always be true bool result = fms->nextTerm(); assert (result); } memcpy(mergeStates.values,mergeStatesData.values,sizeof(FieldMergeState*) * numFields); const int32_t skipInterval = termsOut->skipInterval; currentFieldStorePayloads = (*fields)[0]->fieldInfo->storePayloads; ValueArray termStates(numFields); while(numFields > 0) { // Get the next term to merge termStates.values[0] = mergeStates[0]; int32_t numToMerge = 1; for(int32_t i=1;itext; const int32_t textOffset = mergeStates[i]->textOffset; const int32_t cmp = compareText(text+ textOffset, termStates[0]->text + termStates[0]->textOffset); if (cmp < 0) { termStates.values[0] = mergeStates[i]; numToMerge = 1; } else if (cmp == 0) termStates.values[numToMerge++] = mergeStates[i]; } int32_t df = 0; int32_t lastPayloadLength = -1; int32_t lastDoc = 0; const TCHAR* start = termStates[0]->text + termStates[0]->textOffset; const TCHAR* pos = start; while(*pos != CLUCENE_END_OF_WORD) pos++; int64_t freqPointer = freqOut->getFilePointer(); int64_t proxPointer = proxOut->getFilePointer(); skipListWriter->resetSkip(); // Now termStates has numToMerge FieldMergeStates // which all share the same term. Now we must // interleave the docID streams. while(numToMerge > 0) { if ((++df % skipInterval) == 0) { skipListWriter->setSkipData(lastDoc, currentFieldStorePayloads, lastPayloadLength); skipListWriter->bufferSkip(df); } FieldMergeState* minState = termStates[0]; for(int32_t i=1;idocID < minState->docID) minState = termStates[i]; const int32_t doc = minState->docID; const int32_t termDocFreq = minState->termFreq; assert (doc < numDocsInRAM); assert ( doc > lastDoc || df == 1 ); const int32_t newDocCode = (doc-lastDoc)<<1; lastDoc = doc; ByteSliceReader& prox = minState->prox; // Carefully copy over the prox + payload info, // changing the format to match Lucene's segment // format. for(int32_t j=0;jwriteVInt(code|1); proxOut->writeVInt(payloadLength); lastPayloadLength = payloadLength; } else proxOut->writeVInt(code & (~1)); if (payloadLength > 0) copyBytes(&prox, proxOut, payloadLength); } else { assert ( 0 == (code & 1) ); proxOut->writeVInt(code>>1); } } if (1 == termDocFreq) { freqOut->writeVInt(newDocCode|1); } else { freqOut->writeVInt(newDocCode); freqOut->writeVInt(termDocFreq); } if (!minState->nextDoc()) { // Remove from termStates int32_t upto = 0; for(int32_t i=0;inextTerm()) { // OK, no more terms, so remove from mergeStates // as well upto = 0; for(int32_t i=0;i 0); // Done merging this term int64_t skipPointer = skipListWriter->writeSkip(freqOut); // Write term termInfo.set(df, freqPointer, proxPointer, (int32_t) (skipPointer - freqPointer)); termsOut->add(fieldNumber, start, pos-start, &termInfo); } } void DocumentsWriter::close() { SCOPED_LOCK_MUTEX(THIS_LOCK) closed = true; CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) } DocumentsWriter::ThreadState* DocumentsWriter::getThreadState(Document* doc, Term* delTerm) { SCOPED_LOCK_MUTEX(THIS_LOCK) // First, find a thread state. If this thread already // has affinity to a specific ThreadState, use that one // again. ThreadState* state = NULL; if ( threadBindings.find(_LUCENE_CURRTHREADID) == threadBindings.end() ){ // First time this thread has called us since last flush ThreadState* minThreadState = NULL; for(size_t i=0;inumThreads < minThreadState->numThreads) minThreadState = ts; } if (minThreadState != NULL && (minThreadState->numThreads == 0 || threadStates.length == MAX_THREAD_STATE)) { state = minThreadState; state->numThreads++; } else { // Just create a new "private" thread state threadStates.resize(1+threadStates.length); //fill the new position state = threadStates.values[threadStates.length-1] = _CLNEW ThreadState(this); } threadBindings.put(_LUCENE_CURRTHREADID, state); }else{ state = threadBindings[_LUCENE_CURRTHREADID]; } // Next, wait until my thread state is idle (in case // it's shared with other threads) and for threads to // not be paused nor a flush pending: while(!closed && (!state->isIdle || pauseThreads != 0 || flushPending || abortCount > 0)) CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) if (closed) _CLTHROWA(CL_ERR_AlreadyClosed, "this IndexWriter is closed"); if (segment.empty()) segment = writer->newSegmentName(); state->isIdle = false; try { bool success = false; try { state->init(doc, nextDocID); if (delTerm != NULL) { addDeleteTerm(delTerm, state->docID); state->doFlushAfter = timeToFlushDeletes(); } // Only increment nextDocID & numDocsInRAM on successful init nextDocID++; numDocsInRAM++; // We must at this point commit to flushing to ensure we // always get N docs when we flush by doc count, even if // > 1 thread is adding documents: if (!flushPending && maxBufferedDocs != IndexWriter::DISABLE_AUTO_FLUSH && numDocsInRAM >= maxBufferedDocs) { flushPending = true; state->doFlushAfter = true; } success = true; } _CLFINALLY ( if (!success) { // Forcefully idle this ThreadState: state->isIdle = true; CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) if (state->doFlushAfter) { state->doFlushAfter = false; flushPending = false; } } ) } catch (AbortException& ae) { abort(&ae); } return state; } bool DocumentsWriter::addDocument(Document* doc, Analyzer* analyzer){ return updateDocument(doc, analyzer, NULL); } bool DocumentsWriter::updateDocument(Term* t, Document* doc, Analyzer* analyzer){ return updateDocument(doc, analyzer, t); } bool DocumentsWriter::updateDocument(Document* doc, Analyzer* analyzer, Term* delTerm) { // This call is synchronized but fast ThreadState* state = getThreadState(doc, delTerm); try { bool success = false; try { try { // This call is not synchronized and does all the work state->processDocument(analyzer); } _CLFINALLY ( // This call is synchronized but fast finishDocument(state); ) success = true; } _CLFINALLY ( if (!success) { SCOPED_LOCK_MUTEX(THIS_LOCK) // If this thread state had decided to flush, we // must clear it so another thread can flush if (state->doFlushAfter) { state->doFlushAfter = false; flushPending = false; CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) } // Immediately mark this document as deleted // since likely it was partially added. This // keeps indexing as "all or none" (atomic) when // adding a document: addDeleteDocID(state->docID); } ) } catch (AbortException& ae) { abort(&ae); } return state->doFlushAfter || timeToFlushDeletes(); } int32_t DocumentsWriter::getNumBufferedDeleteTerms() { SCOPED_LOCK_MUTEX(THIS_LOCK) return numBufferedDeleteTerms; } const DocumentsWriter::TermNumMapType& DocumentsWriter::getBufferedDeleteTerms() { SCOPED_LOCK_MUTEX(THIS_LOCK) return *bufferedDeleteTerms; } const std::vector* DocumentsWriter::getBufferedDeleteDocIDs() { SCOPED_LOCK_MUTEX(THIS_LOCK) return &bufferedDeleteDocIDs; } // Reset buffered deletes. void DocumentsWriter::clearBufferedDeletes() { SCOPED_LOCK_MUTEX(THIS_LOCK) DocumentsWriter::TermNumMapType::iterator term = bufferedDeleteTerms->begin(); while ( term != bufferedDeleteTerms->end() ){ Term* t = term->first; _CLDELETE(term->second); bufferedDeleteTerms->erase(term); _CLDECDELETE(t); term = bufferedDeleteTerms->begin(); } bufferedDeleteDocIDs.clear(); numBufferedDeleteTerms = 0; if (numBytesUsed > 0) resetPostingsData(); } bool DocumentsWriter::bufferDeleteTerms(const ArrayBase* terms) { SCOPED_LOCK_MUTEX(THIS_LOCK) while(pauseThreads != 0 || flushPending){ CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) } for (size_t i = 0; i < terms->length; i++) addDeleteTerm((*terms)[i], numDocsInRAM); return timeToFlushDeletes(); } bool DocumentsWriter::bufferDeleteTerm(Term* term) { SCOPED_LOCK_MUTEX(THIS_LOCK) while(pauseThreads != 0 || flushPending){ CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) } addDeleteTerm(term, numDocsInRAM); return timeToFlushDeletes(); } bool DocumentsWriter::timeToFlushDeletes() { SCOPED_LOCK_MUTEX(THIS_LOCK) return (bufferIsFull || (maxBufferedDeleteTerms != IndexWriter::DISABLE_AUTO_FLUSH && numBufferedDeleteTerms >= maxBufferedDeleteTerms)) && setFlushPending(); } void DocumentsWriter::setMaxBufferedDeleteTerms(int32_t _maxBufferedDeleteTerms) { this->maxBufferedDeleteTerms = _maxBufferedDeleteTerms; } int32_t DocumentsWriter::getMaxBufferedDeleteTerms() { return maxBufferedDeleteTerms; } bool DocumentsWriter::hasDeletes() { SCOPED_LOCK_MUTEX(THIS_LOCK) return bufferedDeleteTerms->size() > 0 || bufferedDeleteDocIDs.size() > 0; } // Buffer a term in bufferedDeleteTerms, which records the // current number of documents buffered in ram so that the // delete term will be applied to those documents as well // as the disk segments. void DocumentsWriter::addDeleteTerm(Term* term, int32_t docCount) { SCOPED_LOCK_MUTEX(THIS_LOCK) Num* num = bufferedDeleteTerms->get(term); if (num == NULL) { bufferedDeleteTerms->put(_CL_POINTER(term), new Num(docCount)); // This is coarse approximation of actual bytes used: numBytesUsed += ( _tcslen(term->field()) + term->textLength()) * BYTES_PER_CHAR + 4 + 5 * OBJECT_HEADER_BYTES + 5 * OBJECT_POINTER_BYTES; if (ramBufferSize != IndexWriter::DISABLE_AUTO_FLUSH && numBytesUsed > ramBufferSize) { bufferIsFull = true; } } else { num->setNum(docCount); } numBufferedDeleteTerms++; } void DocumentsWriter::addDeleteDocID(int32_t docId) { SCOPED_LOCK_MUTEX(THIS_LOCK) bufferedDeleteDocIDs.push_back(docId); numBytesUsed += OBJECT_HEADER_BYTES + BYTES_PER_INT + OBJECT_POINTER_BYTES; } void DocumentsWriter::finishDocument(ThreadState* state) { SCOPED_LOCK_MUTEX(THIS_LOCK) if (abortCount > 0) { // Forcefully idle this threadstate -- its state will // be reset by abort() state->isIdle = true; CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) return; } // Now write the indexed document to the real files. if (nextWriteDocID == state->docID) { // It's my turn, so write everything now: nextWriteDocID++; state->writeDocument(); state->isIdle = true; CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) // If any states were waiting on me, sweep through and // flush those that are enabled by my write. if (numWaiting > 0) { bool any = true; while(any) { any = false; for(int32_t i=0;idocID == nextWriteDocID) { s->writeDocument(); s->isIdle = true; nextWriteDocID++; any = true; if (numWaiting > i+1) // Swap in the last waiting state to fill in // the hole we just created. It's important // to do this as-we-go and not at the end of // the loop, because if we hit an aborting // exception in one of the s.writeDocument // calls (above), it leaves this array in an // inconsistent state: waitingThreadStates.values[i] = waitingThreadStates[numWaiting-1]; numWaiting--; } else { assert (!s->isIdle); i++; } } } } } else { // Another thread got a docID before me, but, it // hasn't finished its processing. So add myself to // the line but don't hold up this thread. waitingThreadStates.values[numWaiting++] = state; } } int64_t DocumentsWriter::getRAMUsed() { return numBytesUsed; } void DocumentsWriter::fillBytes(IndexOutput* out, uint8_t b, int32_t numBytes) { for(int32_t i=0;iwriteByte(b); } void DocumentsWriter::copyBytes(IndexInput* srcIn, IndexOutput* destIn, int64_t numBytes) { // TODO: we could do this more efficiently (save a copy) // because it's always from a ByteSliceReader -> // IndexOutput while(numBytes > 0) { int32_t chunk; if (numBytes > 4096) chunk = 4096; else chunk = (int32_t) numBytes; srcIn->readBytes(copyByteBuffer, chunk); destIn->writeBytes(copyByteBuffer, chunk); numBytes -= chunk; } } int64_t DocumentsWriter::segmentSize(const std::string& segmentName) { assert (infoStream != NULL); int64_t size = directory->fileLength( (segmentName + ".tii").c_str() ) + directory->fileLength( (segmentName + ".tis").c_str() ) + directory->fileLength( (segmentName + ".frq").c_str() ) + directory->fileLength( (segmentName + ".prx").c_str() ); const std::string normFileName = segmentName + ".nrm"; if (directory->fileExists(normFileName.c_str())) size += directory->fileLength(normFileName.c_str()); return size; } void DocumentsWriter::getPostings(ValueArray& postings) { SCOPED_LOCK_MUTEX(THIS_LOCK) numBytesUsed += postings.length * POSTING_NUM_BYTE; int32_t numToCopy; if (this->postingsFreeCountDW < postings.length) numToCopy = this->postingsFreeCountDW; else numToCopy = postings.length; const int32_t start = this->postingsFreeCountDW-numToCopy; if ( numToCopy > 0 ){ memcpy(postings.values, this->postingsFreeListDW.values+start, sizeof(Posting*)*numToCopy); } this->postingsFreeCountDW -= numToCopy; // Directly allocate the remainder if any if (numToCopy < postings.length) { const int32_t extra = postings.length - numToCopy; const int32_t newPostingsAllocCount = this->postingsAllocCountDW + extra; if (newPostingsAllocCount > this->postingsFreeListDW.length) this->postingsFreeListDW.resize((int32_t) (1.25 * newPostingsAllocCount)); balanceRAM(); for(size_t i=numToCopy;ipostingsAllocCountDW++; } } } void DocumentsWriter::recyclePostings(ValueArray& postings, int32_t numPostings) { SCOPED_LOCK_MUTEX(THIS_LOCK) // Move all Postings from this ThreadState back to our // free list. We pre-allocated this array while we were // creating Postings to make sure it's large enough assert (this->postingsFreeCountDW + numPostings <= this->postingsFreeListDW.length); if ( numPostings > 0 ) memcpy (this->postingsFreeListDW.values + this->postingsFreeCountDW, postings.values, numPostings * sizeof(Posting*)); this->postingsFreeCountDW += numPostings; } uint8_t* DocumentsWriter::getByteBlock(bool trackAllocations) { SCOPED_LOCK_MUTEX(THIS_LOCK) const int32_t size = freeByteBlocks.size(); uint8_t* b; if (0 == size) { numBytesAlloc += BYTE_BLOCK_SIZE; balanceRAM(); b = _CL_NEWARRAY(uint8_t, BYTE_BLOCK_SIZE); memset(b,0,sizeof(uint8_t) * BYTE_BLOCK_SIZE); } else { b = *freeByteBlocks.begin(); freeByteBlocks.remove(freeByteBlocks.begin(),true); } if (trackAllocations) numBytesUsed += BYTE_BLOCK_SIZE; return b; } void DocumentsWriter::recycleBlocks(ArrayBase& blocks, int32_t start, int32_t end) { SCOPED_LOCK_MUTEX(THIS_LOCK) for(int32_t i=start;i& blocks, int32_t start, int32_t numBlocks) { SCOPED_LOCK_MUTEX(THIS_LOCK) for(int32_t i=start;i freeTrigger) { if (infoStream != NULL) (*infoStream) << string(" RAM: now balance allocations: usedMB=") << toMB(numBytesUsed) + string(" vs trigger=") << toMB(flushTrigger) << string(" allocMB=") << toMB(numBytesAlloc) << string(" vs trigger=") << toMB(freeTrigger) << string(" postingsFree=") << toMB(this->postingsFreeCountDW*POSTING_NUM_BYTE) << string(" byteBlockFree=") << toMB(freeByteBlocks.size()*BYTE_BLOCK_SIZE) << string(" charBlockFree=") << toMB(freeCharBlocks.size()*CHAR_BLOCK_SIZE*CHAR_NUM_BYTE) << string("\n"); // When we've crossed 100% of our target Postings // RAM usage, try to free up until we're back down // to 95% const int64_t startBytesAlloc = numBytesAlloc; const int32_t postingsFreeChunk = (int32_t) (BYTE_BLOCK_SIZE / POSTING_NUM_BYTE); int32_t iter = 0; // We free equally from each pool in 64 KB // chunks until we are below our threshold // (freeLevel) while(numBytesAlloc > freeLevel) { if (0 == freeByteBlocks.size() && 0 == freeCharBlocks.size() && 0 == this->postingsFreeCountDW) { // Nothing else to free -- must flush now. bufferIsFull = true; if (infoStream != NULL) (*infoStream) << string(" nothing to free; now set bufferIsFull\n"); break; } if ((0 == iter % 3) && freeByteBlocks.size() > 0) { freeByteBlocks.remove(freeByteBlocks.size()-1); numBytesAlloc -= BYTE_BLOCK_SIZE; } if ((1 == iter % 3) && freeCharBlocks.size() > 0) { freeCharBlocks.remove(freeCharBlocks.size()-1); numBytesAlloc -= CHAR_BLOCK_SIZE * CHAR_NUM_BYTE; } if ((2 == iter % 3) && this->postingsFreeCountDW > 0) { int32_t numToFree; if (this->postingsFreeCountDW >= postingsFreeChunk) numToFree = postingsFreeChunk; else numToFree = this->postingsFreeCountDW; for ( size_t i = this->postingsFreeCountDW-numToFree;i< this->postingsFreeCountDW; i++ ){ _CLDELETE(this->postingsFreeListDW.values[i]); } this->postingsFreeCountDW -= numToFree; this->postingsAllocCountDW -= numToFree; numBytesAlloc -= numToFree * POSTING_NUM_BYTE; } iter++; } if (infoStream != NULL){ (*infoStream) << " after free: freedMB=" + Misc::toString((float_t)((startBytesAlloc-numBytesAlloc)/1024.0/1024.0)) + " usedMB=" + Misc::toString((float_t)(numBytesUsed/1024.0/1024.0)) + " allocMB=" + Misc::toString((float_t)(numBytesAlloc/1024.0/1024.0)) << string("\n"); } } else { // If we have not crossed the 100% mark, but have // crossed the 95% mark of RAM we are actually // using, go ahead and flush. This prevents // over-allocating and then freeing, with every // flush. if (numBytesUsed > flushTrigger) { if (infoStream != NULL){ (*infoStream) << string(" RAM: now flush @ usedMB=") << Misc::toString((float_t)(numBytesUsed/1024.0/1024.0)) << string(" allocMB=") << Misc::toString((float_t)(numBytesAlloc/1024.0/1024.0)) << string(" triggerMB=") << Misc::toString((float_t)(flushTrigger/1024.0/1024.0)) << string("\n"); } bufferIsFull = true; } } } DocumentsWriter::BufferedNorms::BufferedNorms(){ this->upto = 0; } void DocumentsWriter::BufferedNorms::add(float_t norm){ uint8_t b = Similarity::encodeNorm(norm); out.writeByte(b); upto++; } void DocumentsWriter::BufferedNorms::reset(){ out.reset(); upto = 0; } void DocumentsWriter::BufferedNorms::fill(int32_t docID){ // Must now fill in docs that didn't have this // field. Note that this is how norms can consume // tremendous storage when the docs have widely // varying different fields, because we are not // storing the norms sparsely (see LUCENE-830) if (upto < docID) { fillBytes(&out, defaultNorm, docID-upto); upto = docID; } } DocumentsWriter::FieldMergeState::FieldMergeState(){ field = NULL; postings = NULL; p = NULL; text = NULL; textOffset = 0; postingUpto = -1; docID = 0; termFreq = 0; } DocumentsWriter::FieldMergeState::~FieldMergeState(){ } bool DocumentsWriter::FieldMergeState::nextTerm(){ postingUpto++; if (postingUpto == field->numPostings) return false; p = (*postings)[postingUpto]; docID = 0; text = field->threadState->charPool->buffers[p->textStart >> CHAR_BLOCK_SHIFT]; textOffset = p->textStart & CHAR_BLOCK_MASK; if (p->freqUpto > p->freqStart) freq.init(field->threadState->postingsPool, p->freqStart, p->freqUpto); else freq.bufferOffset = freq.upto = freq.endIndex = 0; prox.init(field->threadState->postingsPool, p->proxStart, p->proxUpto); // Should always be true bool result = nextDoc(); assert (result); return true; } bool DocumentsWriter::FieldMergeState::nextDoc() { if (freq.bufferOffset + freq.upto == freq.endIndex) { if (p->lastDocCode != -1) { // Return last doc docID = p->lastDocID; termFreq = p->docFreq; p->lastDocCode = -1; return true; } else // EOF return false; } const uint32_t code = (uint32_t)freq.readVInt(); docID += code >> 1; //unsigned shift if ((code & 1) != 0) termFreq = 1; else termFreq = freq.readVInt(); return true; } DocumentsWriter::ByteSliceReader::ByteSliceReader(){ pool = NULL; bufferUpto = 0; buffer = 0; limit = 0; level = 0; upto = 0; bufferOffset = 0; endIndex = 0; } DocumentsWriter::ByteSliceReader::~ByteSliceReader(){ } const char* DocumentsWriter::ByteSliceReader::getDirectoryType() const{ return ""; } const char* DocumentsWriter::ByteSliceReader::getObjectName() const{ return getClassName(); } const char* DocumentsWriter::ByteSliceReader::getClassName(){ return "DocumentsWriter::ByteSliceReader"; } IndexInput* DocumentsWriter::ByteSliceReader::clone() const{ _CLTHROWA(CL_ERR_UnsupportedOperation, "Not implemented"); } void DocumentsWriter::ByteSliceReader::init(ByteBlockPool* _pool, int32_t _startIndex, int32_t _endIndex) { assert (_endIndex-_startIndex > 0); level = 0; this->pool = _pool; this->endIndex = _endIndex; bufferUpto = _startIndex / BYTE_BLOCK_SIZE; bufferOffset = bufferUpto * BYTE_BLOCK_SIZE; buffer = pool->buffers[bufferUpto]; upto = _startIndex & BYTE_BLOCK_MASK; const int32_t firstSize = levelSizeArray[0]; if (_startIndex+firstSize >= endIndex) { // There is only this one slice to read limit = endIndex & BYTE_BLOCK_MASK; } else limit = upto+firstSize-4; } uint8_t DocumentsWriter::ByteSliceReader::readByte() { // Assert that we are not @ EOF assert (upto + bufferOffset < endIndex); if (upto == limit) nextSlice(); return buffer[upto++]; } int64_t DocumentsWriter::ByteSliceReader::writeTo(IndexOutput* out) { int64_t size = 0; while(true) { if (limit + bufferOffset == endIndex) { assert (endIndex - bufferOffset >= upto); out->writeBytes(buffer+upto, limit-upto); size += limit-upto; break; } else { out->writeBytes(buffer+upto, limit-upto); size += limit-upto; nextSlice(); } } return size; } void DocumentsWriter::ByteSliceReader::nextSlice() { // Skip to our next slice const int32_t nextIndex = ((buffer[limit]&0xff)<<24) + ((buffer[1+limit]&0xff)<<16) + ((buffer[2+limit]&0xff)<<8) + (buffer[3+limit]&0xff); level = nextLevelArray[level]; const int32_t newSize = levelSizeArray[level]; bufferUpto = nextIndex / BYTE_BLOCK_SIZE; bufferOffset = bufferUpto * BYTE_BLOCK_SIZE; buffer = pool->buffers[bufferUpto]; upto = nextIndex & BYTE_BLOCK_MASK; if (nextIndex + newSize >= endIndex) { // We are advancing to the const slice assert (endIndex - nextIndex > 0); limit = endIndex - bufferOffset; } else { // This is not the const slice (subtract 4 for the // forwarding address at the end of this new slice) limit = upto+newSize-4; } } void DocumentsWriter::ByteSliceReader::readBytes(uint8_t* b, int32_t len) { while(len > 0) { const int32_t numLeft = limit-upto; if (numLeft < len) { // Read entire slice memcpy(b, buffer+upto,numLeft * sizeof(uint8_t)); b += numLeft; len -= numLeft; nextSlice(); } else { // This slice is the last one memcpy(b, buffer+upto,len * sizeof(uint8_t)); upto += len; break; } } } int64_t DocumentsWriter::ByteSliceReader::getFilePointer() const{_CLTHROWA(CL_ERR_Runtime,"not implemented");} int64_t DocumentsWriter::ByteSliceReader::length() const{_CLTHROWA(CL_ERR_Runtime,"not implemented");} void DocumentsWriter::ByteSliceReader::seek(const int64_t /*pos*/) {_CLTHROWA(CL_ERR_Runtime,"not implemented");} void DocumentsWriter::ByteSliceReader::close() {_CLTHROWA(CL_ERR_Runtime,"not implemented");} DocumentsWriter::ByteBlockPool::ByteBlockPool( bool _trackAllocations, DocumentsWriter* _parent): BlockPool(_parent, BYTE_BLOCK_SIZE, _trackAllocations) { } DocumentsWriter::ByteBlockPool::~ByteBlockPool(){ reset(); //delete the first block _CLDELETE_ARRAY(buffer); } uint8_t* DocumentsWriter::ByteBlockPool::getNewBlock(bool _trackAllocations){ return parent->getByteBlock(_trackAllocations); } int32_t DocumentsWriter::ByteBlockPool::newSlice(const int32_t size) { if (tUpto > BYTE_BLOCK_SIZE-size) nextBuffer(); const int32_t upto = tUpto; tUpto += size; buffer[tUpto-1] = 16; return upto; } int32_t DocumentsWriter::ByteBlockPool::allocSlice(uint8_t* slice, const int32_t upto) { const int32_t level = slice[upto] & 15; assert(level < 10); const int32_t newLevel = nextLevelArray[level]; const int32_t newSize = levelSizeArray[newLevel]; // Maybe allocate another block if (tUpto > BYTE_BLOCK_SIZE-newSize) nextBuffer(); const int32_t newUpto = tUpto; const uint32_t offset = newUpto + tOffset; tUpto += newSize; // Copy forward the past 3 bytes (which we are about // to overwrite with the forwarding address): buffer[newUpto] = slice[upto-3]; buffer[newUpto+1] = slice[upto-2]; buffer[newUpto+2] = slice[upto-1]; // Write forwarding address at end of last slice: slice[upto-3] = (uint8_t) (offset >> 24); //offset is unsigned... slice[upto-2] = (uint8_t) (offset >> 16); slice[upto-1] = (uint8_t) (offset >> 8); slice[upto] = (uint8_t) offset; // Write new level: buffer[tUpto-1] = (uint8_t) (16|newLevel); return newUpto+3; } void DocumentsWriter::ByteBlockPool::reset() { if (bufferUpto != -1) { // We allocated at least one buffer for(int i=0;i 0) // Recycle all but the first buffer parent->recycleBlocks(buffers, 1, 1+bufferUpto); // Re-use the first buffer bufferUpto = 0; tUpto = 0; tOffset = 0; buffer = buffers[0]; } } DocumentsWriter::CharBlockPool::CharBlockPool(DocumentsWriter* _parent): BlockPool(_parent, CHAR_BLOCK_SIZE, false) { } DocumentsWriter::CharBlockPool::~CharBlockPool(){ } TCHAR* DocumentsWriter::CharBlockPool::getNewBlock(bool){ return parent->getCharBlock(); } void DocumentsWriter::CharBlockPool::reset() { parent->recycleBlocks(buffers, 0, 1+bufferUpto); bufferUpto = -1; tUpto = blockSize; tOffset = -blockSize; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/DocumentsWriterThreadState.cpp000066400000000000000000001257251154025176300264040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexOutput.h" #include "CLucene/store/_RAMDirectory.h" #include "CLucene/util/Array.h" #include "CLucene/util/_Arrays.h" #include "CLucene/util/Misc.h" #include "CLucene/util/CLStreams.h" #include "CLucene/document/Field.h" #include "CLucene/search/Similarity.h" #include "CLucene/document/Document.h" #include "_TermInfo.h" #include "_FieldInfos.h" #include "_CompoundFile.h" #include "IndexWriter.h" #include "_IndexFileNames.h" #include "_FieldsWriter.h" #include "Term.h" #include "_Term.h" #include "_TermVector.h" #include "_TermInfosWriter.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/search/Similarity.h" #include "_TermInfosWriter.h" #include "_FieldsWriter.h" #include "_DocumentsWriter.h" #include #include CL_NS_USE(util) CL_NS_USE(store) CL_NS_USE(analysis) CL_NS_USE(document) CL_NS_USE(search) CL_NS_DEF(index) DocumentsWriter::ThreadState::ThreadState(DocumentsWriter* __parent): postingsFreeListTS(ValueArray(256)), vectorFieldPointers(ValueArray(10)), vectorFieldNumbers(ValueArray(10)), fieldDataArray(ValueArray(8)), fieldDataHash(ValueArray(16)), postingsVectors(ObjectArray(1)), postingsPool( _CLNEW ByteBlockPool(true, __parent) ), vectorsPool( _CLNEW ByteBlockPool(false, __parent) ), charPool( _CLNEW CharBlockPool(__parent) ), allFieldDataArray(ValueArray(10)), _parent(__parent) { fieldDataHashMask = 15; postingsFreeCountTS = 0; stringReader = _CLNEW ReusableStringReader(_T(""),0,false); isIdle = true; numThreads = 1; tvfLocal = _CLNEW RAMOutputStream(); // Term vectors for one doc fdtLocal = _CLNEW RAMOutputStream(); // Stored fields for one doc this->docBoost = 0.0; this->fieldGen = this->posUpto = this->maxPostingsVectors = this->numStoredFields = 0; this->numAllFieldData = this->docID = 0; this->numFieldData = numVectorFields = this->proxUpto = this->freqUpto = this->offsetUpto = 0; this->localFieldsWriter = NULL; this->maxTermPrefix = NULL; this->p = NULL; this->prox = NULL; this->vector = NULL; this->offsets = NULL; this->pos = NULL; this->freq = NULL; this->doFlushAfter = false; } DocumentsWriter::ThreadState::~ThreadState(){ _CLDELETE(postingsPool); _CLDELETE(vectorsPool); _CLDELETE(charPool); _CLDELETE(stringReader); _CLDELETE(tvfLocal); _CLDELETE(fdtLocal); for ( size_t i=0; iclose(); _CLDELETE(localFieldsWriter); } postingsPool->reset(); charPool->reset(); _parent->recyclePostings(this->postingsFreeListTS, this->postingsFreeCountTS); this->postingsFreeCountTS = 0; for(int32_t i=0;ilastGen = -1; if (fp->numPostings > 0) fp->resetPostingArrays(); } } void DocumentsWriter::ThreadState::writeDocument() { // If we hit an exception while appending to the // stored fields or term vectors files, we have to // abort all documents since we last flushed because // it means those files are possibly inconsistent. try { _parent->numDocsInStore++; // Append stored fields to the real FieldsWriter: _parent->fieldsWriter->flushDocument(numStoredFields, fdtLocal); fdtLocal->reset(); // Append term vectors to the real outputs: if (_parent->tvx != NULL) { _parent->tvx->writeLong(_parent->tvd->getFilePointer()); _parent->tvd->writeVInt(numVectorFields); if (numVectorFields > 0) { for(int32_t i=0;itvd->writeVInt(vectorFieldNumbers[i]); assert(0 == vectorFieldPointers[0]); _parent->tvd->writeVLong(_parent->tvf->getFilePointer()); int64_t lastPos = vectorFieldPointers[0]; for(int32_t i=1;itvd->writeVLong(pos-lastPos); lastPos = pos; } tvfLocal->writeTo(_parent->tvf); tvfLocal->reset(); } } // Append norms for the fields we saw: for(int32_t i=0;idoNorms) { BufferedNorms* bn = _parent->norms[fp->fieldInfo->number]; assert ( bn != NULL ); assert ( bn->upto <= docID ); bn->fill(docID); float_t norm = fp->boost * _parent->writer->getSimilarity()->lengthNorm(fp->fieldInfo->name, fp->length); bn->add(norm); } } } catch (CLuceneError& t) { // Forcefully idle this threadstate -- its state will // be reset by abort() isIdle = true; throw AbortException(t, _parent); } if (_parent->bufferIsFull && !_parent->flushPending) { _parent->flushPending = true; doFlushAfter = true; } } void DocumentsWriter::ThreadState::init(Document* doc, int32_t docID) { assert (!isIdle); assert (_parent->writer->testPoint("DocumentsWriter.ThreadState.init start")); this->docID = docID; docBoost = doc->getBoost(); numStoredFields = 0; numFieldData = 0; numVectorFields = 0; maxTermPrefix = NULL; assert (0 == fdtLocal->length()); assert (0 == fdtLocal->getFilePointer()); assert (0 == tvfLocal->length()); assert (0 == tvfLocal->getFilePointer()); const int32_t thisFieldGen = fieldGen++; const Document::FieldsType& docFields = *doc->getFields(); const int32_t numDocFields = docFields.size(); bool docHasVectors = false; // Absorb any new fields first seen in this document. // Also absorb any changes to fields we had already // seen before (eg suddenly turning on norms or // vectors, etc.): for(int32_t i=0;ifieldInfos->add(field->name(), field->isIndexed(), field->isTermVectorStored(), field->isStorePositionWithTermVector(), field->isStoreOffsetWithTermVector(), field->getOmitNorms(), false); if (fi->isIndexed && !fi->omitNorms) { // Maybe grow our buffered norms if (_parent->norms.length <= fi->number) { int32_t newSize = (int32_t) ((1+fi->number)*1.25); _parent->norms.resize(newSize); } if (_parent->norms[fi->number] == NULL) _parent->norms.values[fi->number] = _CLNEW BufferedNorms(); _parent->hasNorms = true; } // Make sure we have a FieldData allocated int32_t hashPos = Misc::thashCode(fi->name) & fieldDataHashMask; //TODO: put hash in fieldinfo FieldData* fp = fieldDataHash[hashPos]; while(fp != NULL && _tcscmp(fp->fieldInfo->name, fi->name) != 0 ) fp = fp->next; if (fp == NULL) { fp = _CLNEW FieldData(_parent,this,fi); fp->next = fieldDataHash[hashPos]; fieldDataHash.values[hashPos] = fp; if (numAllFieldData == allFieldDataArray.length) { allFieldDataArray.resize( (int32_t) (allFieldDataArray.length*1.5) ); ValueArray newHashArray(fieldDataHash.length*2); // Rehash fieldDataHashMask = allFieldDataArray.length-1; for(size_t j=0;jfieldInfo->name) & fieldDataHashMask; FieldData* nextFP0 = fp0->next; fp0->next = newHashArray[hashPos]; newHashArray.values[hashPos] = fp0; fp0 = nextFP0; } } fieldDataHash.resize( newHashArray.length ); memcpy(fieldDataHash.values, newHashArray.values, newHashArray.length * sizeof(FieldData*)); } allFieldDataArray.values[numAllFieldData++] = fp; } else { assert (fp->fieldInfo == fi); } if (thisFieldGen != fp->lastGen) { // First time we're seeing this field for this doc fp->lastGen = thisFieldGen; fp->fieldCount = 0; fp->doVectors = fp->doVectorPositions = fp->doVectorOffsets = false; fp->doNorms = fi->isIndexed && !fi->omitNorms; if (numFieldData == fieldDataArray.length) { fieldDataArray.resize(fieldDataArray.length*2); } fieldDataArray.values[numFieldData++] = fp; } if (field->isTermVectorStored()) { if (!fp->doVectors && numVectorFields++ == vectorFieldPointers.length) { const int32_t newSize = (int32_t)(numVectorFields*1.5); vectorFieldPointers.resize(newSize); vectorFieldNumbers.resize(newSize); } fp->doVectors = true; docHasVectors = true; fp->doVectorPositions |= field->isStorePositionWithTermVector(); fp->doVectorOffsets |= field->isStoreOffsetWithTermVector(); } if (fp->fieldCount == fp->docFields.length) { fp->docFields.resize(fp->docFields.length*2); } // Lazily allocate arrays for postings: if (field->isIndexed() && fp->postingsHash.values == NULL) fp->initPostingArrays(); fp->docFields.values[fp->fieldCount++] = field; } // Maybe init the local & global fieldsWriter if (localFieldsWriter == NULL) { if (_parent->fieldsWriter == NULL) { assert (_parent->docStoreSegment.empty()); assert (!_parent->segment.empty()); _parent->docStoreSegment = _parent->segment; // If we hit an exception while init'ing the // fieldsWriter, we must abort this segment // because those files will be in an unknown // state: try { _parent->fieldsWriter = _CLNEW FieldsWriter(_parent->directory, _parent->docStoreSegment.c_str(), _parent->fieldInfos); } catch (CLuceneError& t) { throw AbortException(t,_parent); } _CLDELETE(_parent->_files); } localFieldsWriter = _CLNEW FieldsWriter(NULL, fdtLocal, _parent->fieldInfos); } // First time we see a doc that has field(s) with // stored vectors, we init our tvx writer if (docHasVectors) { if (_parent->tvx == NULL) { assert (!_parent->docStoreSegment.empty()); // If we hit an exception while init'ing the term // vector output files, we must abort this segment // because those files will be in an unknown // state: try { _parent->tvx = _parent->directory->createOutput( (_parent->docStoreSegment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION).c_str() ); _parent->tvx->writeInt(TermVectorsReader::FORMAT_VERSION); _parent->tvd = _parent->directory->createOutput( (_parent->docStoreSegment + "." + IndexFileNames::VECTORS_DOCUMENTS_EXTENSION).c_str() ); _parent->tvd->writeInt(TermVectorsReader::FORMAT_VERSION); _parent->tvf = _parent->directory->createOutput( (_parent->docStoreSegment + "." + IndexFileNames::VECTORS_FIELDS_EXTENSION).c_str() ); _parent->tvf->writeInt(TermVectorsReader::FORMAT_VERSION); // We must "catch up" for all docs before us // that had no vectors: for(int32_t i=0;i<_parent->numDocsInStore;i++) { _parent->tvx->writeLong(_parent->tvd->getFilePointer()); _parent->tvd->writeVInt(0); } } catch (CLuceneError& t) { throw AbortException(t, _parent); } _CLDELETE(_parent->_files); } numVectorFields = 0; } } void DocumentsWriter::ThreadState::doPostingSort(Posting** postings, int32_t numPosting) { quickSort(postings, 0, numPosting-1); } void DocumentsWriter::ThreadState::quickSort(Posting** postings, int32_t lo, int32_t hi) { if (lo >= hi) return; int32_t mid = ((uint32_t)(lo + hi)) >> 1; //unsigned shift... if (comparePostings(postings[lo], postings[mid]) > 0) { Posting* tmp = postings[lo]; postings[lo] = postings[mid]; postings[mid] = tmp; } if (comparePostings(postings[mid], postings[hi]) > 0) { Posting* tmp = postings[mid]; postings[mid] = postings[hi]; postings[hi] = tmp; if (comparePostings(postings[lo], postings[mid]) > 0) { Posting* tmp2 = postings[lo]; postings[lo] = postings[mid]; postings[mid] = tmp2; } } int32_t left = lo + 1; int32_t right = hi - 1; if (left >= right) return; Posting* partition = postings[mid]; for (; ;) { while (comparePostings(postings[right], partition) > 0) --right; while (left < right && comparePostings(postings[left], partition) <= 0) ++left; if (left < right) { Posting* tmp = postings[left]; postings[left] = postings[right]; postings[right] = tmp; --right; } else { break; } } quickSort(postings, lo, left); quickSort(postings, left + 1, hi); } void DocumentsWriter::ThreadState::doVectorSort(ArrayBase& postings, int32_t numPosting) { quickSort(postings, 0, numPosting-1); } void DocumentsWriter::ThreadState::quickSort(ArrayBase& postings, int32_t lo, int32_t hi) { if (lo >= hi) return; int32_t mid = ((uint8_t)(lo + hi)) >> 1; //unsigned shift.. if (comparePostings(postings[lo]->p, postings[mid]->p) > 0) { PostingVector* tmp = postings[lo]; postings.values[lo] = postings[mid]; postings.values[mid] = tmp; } if (comparePostings(postings[mid]->p, postings[hi]->p) > 0) { PostingVector* tmp = postings[mid]; postings.values[mid] = postings[hi]; postings.values[hi] = tmp; if (comparePostings(postings[lo]->p, postings[mid]->p) > 0) { PostingVector* tmp2 = postings[lo]; postings.values[lo] = postings[mid]; postings.values[mid] = tmp2; } } int32_t left = lo + 1; int32_t right = hi - 1; if (left >= right) return; PostingVector* partition = postings[mid]; for (; ;) { while (comparePostings(postings[right]->p, partition->p) > 0) --right; while (left < right && comparePostings(postings[left]->p, partition->p) <= 0) ++left; if (left < right) { PostingVector* tmp = postings[left]; postings.values[left] = postings[right]; postings.values[right] = tmp; --right; } else { break; } } quickSort(postings, lo, left); quickSort(postings, left + 1, hi); } void DocumentsWriter::ThreadState::trimFields() { int32_t upto = 0; for(int32_t i=0;ilastGen == -1) { // This field was not seen since the previous // flush, so, free up its resources now // Unhash const int32_t hashPos = Misc::thashCode(fp->fieldInfo->name) & fieldDataHashMask; FieldData* last = NULL; FieldData* fp0 = fieldDataHash[hashPos]; while(fp0 != fp) { last = fp0; fp0 = fp0->next; } assert(fp0 != NULL); if (last == NULL) fieldDataHash.values[hashPos] = fp->next; else last->next = fp->next; if (_parent->infoStream != NULL) (*_parent->infoStream) << " remove field=" << fp->fieldInfo->name << "\n"; _CLDELETE(fp); } else { // Reset fp->lastGen = -1; allFieldDataArray.values[upto++] = fp; if (fp->numPostings > 0 && ((float_t) fp->numPostings) / fp->postingsHashSize < 0.2) { int32_t hashSize = fp->postingsHashSize; // Reduce hash so it's between 25-50% full while (fp->numPostings < (hashSize>>1) && hashSize >= 2) hashSize >>= 1; hashSize <<= 1; if (hashSize != fp->postingsHash.length) fp->rehashPostings(hashSize); } } } //delete everything after up to in allFieldDataArray for ( size_t i=upto;inorms.length;i++) { BufferedNorms* n = _parent->norms[i]; if (n != NULL && n->upto == 0) { _CLLDELETE(n); _parent->norms.values[i] = NULL; } } numAllFieldData = upto; // Also pare back PostingsVectors if it's excessively // large if (maxPostingsVectors * 1.5 < postingsVectors.length) { int32_t newSize; if (0 == maxPostingsVectors) newSize = 1; else newSize = (int32_t) (1.5*maxPostingsVectors); postingsVectors.resize(newSize, true); } } void DocumentsWriter::ThreadState::processDocument(Analyzer* analyzer) { const int32_t numFields = numFieldData; assert (0 == fdtLocal->length()); if (_parent->tvx != NULL){ // If we are writing vectors then we must visit // fields in sorted order so they are written in // sorted order. TODO: we actually only need to // sort the subset of fields that have vectors // enabled; we could save [small amount of] CPU // here. Arrays::sort(fieldDataArray.values,fieldDataArray.length, 0, numFields); } // We process the document one field at a time for(int32_t i=0;iprocessField(analyzer); if (maxTermPrefix != NULL && _parent->infoStream != NULL) (*_parent->infoStream) << "WARNING: document contains at least one immense term (longer than the max length " << MAX_TERM_LENGTH << "), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: '" << maxTermPrefix << "...'\n"; if (_parent->ramBufferSize != IndexWriter::DISABLE_AUTO_FLUSH && _parent->numBytesUsed > 0.95 * _parent->ramBufferSize) _parent->balanceRAM(); } // USE ONLY FOR DEBUGGING! /* String getPostingText() { TCHAR* text = charPool->buffers[p->textStart >> CHAR_BLOCK_SHIFT]; int32_t upto = p->textStart & CHAR_BLOCK_MASK; while((*text)[upto] != CLUCENE_END_OF_WORD) upto++; return new String(text, p->textStart, upto-(p->textStart & BYTE_BLOCK_MASK)); } */ bool DocumentsWriter::ThreadState::postingEquals(const TCHAR* tokenText, const int32_t tokenTextLen) { const TCHAR* text = charPool->buffers[p->textStart >> CHAR_BLOCK_SHIFT]; assert (text != NULL); int32_t pos = p->textStart & CHAR_BLOCK_MASK; int32_t tokenPos = 0; for(;tokenPosbuffers[p1->textStart >> CHAR_BLOCK_SHIFT] + (p1->textStart & CHAR_BLOCK_MASK); const TCHAR* pos2 = charPool->buffers[p2->textStart >> CHAR_BLOCK_SHIFT] + (p2->textStart & CHAR_BLOCK_MASK); while(true) { const TCHAR c1 = *pos1++; const TCHAR c2 = *pos2++; if (c1 < c2) if (CLUCENE_END_OF_WORD == c2) return 1; else return -1; else if (c2 < c1) if (CLUCENE_END_OF_WORD == c1) return -1; else return 1; else if (CLUCENE_END_OF_WORD == c1) return 0; } } void DocumentsWriter::ThreadState::writeFreqVInt(int32_t vi) { uint32_t i = vi; while ((i & ~0x7F) != 0) { writeFreqByte((uint8_t)((i & 0x7f) | 0x80)); i >>= 7; //unsigned shift... } writeFreqByte((uint8_t) i); } void DocumentsWriter::ThreadState::writeProxVInt(int32_t vi) { uint32_t i = vi; while ((i & ~0x7F) != 0) { writeProxByte((uint8_t)((i & 0x7f) | 0x80)); i >>= 7; //unsigned shift... } writeProxByte((uint8_t) i); } void DocumentsWriter::ThreadState::writeFreqByte(uint8_t b) { assert (freq != NULL); if (freq[freqUpto] != 0) { freqUpto = postingsPool->allocSlice(freq, freqUpto); freq = postingsPool->buffer; p->freqUpto = postingsPool->tOffset; } freq[freqUpto++] = b; } void DocumentsWriter::ThreadState::writeProxByte(uint8_t b) { assert (prox != NULL); if (prox[proxUpto] != 0) { proxUpto = postingsPool->allocSlice(prox, proxUpto); prox = postingsPool->buffer; p->proxUpto = postingsPool->tOffset; assert (prox != NULL); } prox[proxUpto++] = b; assert (proxUpto != DocumentsWriter::BYTE_BLOCK_SIZE); } void DocumentsWriter::ThreadState::writeProxBytes(uint8_t* b, int32_t offset, int32_t len) { const int32_t offsetEnd = offset + len; while(offset < offsetEnd) { if (prox[proxUpto] != 0) { // End marker proxUpto = postingsPool->allocSlice(prox, proxUpto); prox = postingsPool->buffer; p->proxUpto = postingsPool->tOffset; } prox[proxUpto++] = b[offset++]; assert (proxUpto != DocumentsWriter::BYTE_BLOCK_SIZE); } } void DocumentsWriter::ThreadState::writeOffsetVInt(int32_t vi) { uint32_t i = vi; while ((i & ~0x7F) != 0) { writeOffsetByte((uint8_t)((i & 0x7f) | 0x80)); i >>= 7; //unsigned shift... } writeOffsetByte((uint8_t) i); } void DocumentsWriter::ThreadState::writeOffsetByte(uint8_t b) { assert (offsets != NULL); if (offsets[offsetUpto] != 0) { offsetUpto = vectorsPool->allocSlice(offsets, offsetUpto); offsets = vectorsPool->buffer; vector->offsetUpto = vectorsPool->tOffset; } offsets[offsetUpto++] = b; } void DocumentsWriter::ThreadState::writePosVInt(int32_t vi) { uint32_t i = vi; while ((i & ~0x7F) != 0) { writePosByte((uint8_t)((i & 0x7f) | 0x80)); i >>= 7; //unsigned shift... } writePosByte((uint8_t) i); } void DocumentsWriter::ThreadState::writePosByte(uint8_t b) { assert (pos != NULL); if (pos[posUpto] != 0) { posUpto = vectorsPool->allocSlice(pos, posUpto); pos = vectorsPool->buffer; vector->posUpto = vectorsPool->tOffset; } pos[posUpto++] = b; } DocumentsWriter::ThreadState::FieldData::FieldData(DocumentsWriter* __parent, ThreadState* __threadState, FieldInfo* fieldInfo): docFields(ValueArray(1)), _parent(__parent), localToken (_CLNEW Token), vectorSliceReader(_CLNEW ByteSliceReader()) { this->fieldCount = this->postingsHashSize = this->postingsHashHalfSize = this->postingsVectorsUpto = 0; this->postingsHashMask = this->offsetEnd = 0; this->offsetStartCode = this->offsetStart = this->numPostings = this->position = this->length = this->offset = 0; this->boost = 0.0; this->next = NULL; this->lastGen = -1; this->fieldInfo = fieldInfo; this->threadState = __threadState; this->postingsCompacted = false; } DocumentsWriter::ThreadState::FieldData::~FieldData(){ _CLDELETE(vectorSliceReader); _CLDELETE(localToken); } bool DocumentsWriter::ThreadState::FieldData::sort(FieldData* e1, FieldData* e2){ return _tcscmp(e1->fieldInfo->name, e2->fieldInfo->name) < 0; } void DocumentsWriter::ThreadState::FieldData::resetPostingArrays() { if (!postingsCompacted) compactPostings(); _parent->recyclePostings(this->postingsHash, numPostings); memset(postingsHash.values, 0, postingsHash.length * sizeof(Posting*)); postingsCompacted = false; numPostings = 0; } const char* DocumentsWriter::ThreadState::FieldData::getObjectName() const{ return getClassName(); } const char* DocumentsWriter::ThreadState::FieldData::getClassName(){ return "DocumentsWriter::ThreadState"; } void DocumentsWriter::ThreadState::FieldData::initPostingArrays() { // Target hash fill factor of <= 50% // NOTE: must be a power of two for hash collision // strategy to work correctly postingsHashSize = 4; postingsHashHalfSize = 2; postingsHashMask = postingsHashSize-1; postingsHash.resize(postingsHashSize); } int32_t DocumentsWriter::ThreadState::FieldData::compareTo(NamedObject* o) { if ( o->getObjectName() != FieldData::getClassName() ) return -1; return _tcscmp(fieldInfo->name, ((FieldData*) o)->fieldInfo->name); } void DocumentsWriter::ThreadState::FieldData::compactPostings() { int32_t upto = 0; for(int32_t i=0;i* DocumentsWriter::ThreadState::FieldData::sortPostings() { compactPostings(); threadState->doPostingSort(postingsHash.values, numPostings); return &postingsHash; } void DocumentsWriter::ThreadState::FieldData::processField(Analyzer* analyzer) { length = 0; position = 0; offset = 0; boost = threadState->docBoost; const int32_t maxFieldLength = _parent->writer->getMaxFieldLength(); const int32_t limit = fieldCount; const ArrayBase& docFieldsFinal = docFields; bool doWriteVectors = true; // Walk through all occurrences in this doc for this // field: try { for(int32_t j=0;jisIndexed()) invertField(field, analyzer, maxFieldLength); if (field->isStored()) { threadState->numStoredFields++; bool success = false; try { threadState->localFieldsWriter->writeField(fieldInfo, field); success = true; } _CLFINALLY( // If we hit an exception inside // localFieldsWriter->writeField, the // contents of fdtLocal can be corrupt, so // we must discard all stored fields for // this document: if (!success) threadState->fdtLocal->reset(); ) } docFieldsFinal.values[j] = NULL; } } catch (AbortException& ae) { doWriteVectors = false; throw ae; } _CLFINALLY ( if (postingsVectorsUpto > 0) { try { if (doWriteVectors) { // Add term vectors for this field bool success = false; try { writeVectors(fieldInfo); success = true; } _CLFINALLY ( if (!success) { // If we hit an exception inside // writeVectors, the contents of tvfLocal // can be corrupt, so we must discard all // term vectors for this document: threadState->numVectorFields = 0; threadState->tvfLocal->reset(); } ) } } _CLFINALLY ( if (postingsVectorsUpto > threadState->maxPostingsVectors) threadState->maxPostingsVectors = postingsVectorsUpto; postingsVectorsUpto = 0; threadState->vectorsPool->reset(); ) } ) } void DocumentsWriter::ThreadState::FieldData::invertField(Field* field, Analyzer* analyzer, const int32_t maxFieldLength) { if (length>0) position += analyzer->getPositionIncrementGap(fieldInfo->name); if (!field->isTokenized()) { // un-tokenized field const TCHAR* stringValue = field->stringValue(); const size_t valueLength = _tcslen(stringValue); Token* token = localToken; token->clear(); token->setText(stringValue,valueLength); token->setStartOffset(offset); token->setEndOffset(offset + valueLength); addPosition(token); offset += valueLength; length++; } else { // tokenized field TokenStream* stream; TokenStream* streamValue = field->tokenStreamValue(); if (streamValue != NULL) stream = streamValue; else { // the field does not have a TokenStream, // so we have to obtain one from the analyzer Reader* reader; // find or make Reader Reader* readerValue = field->readerValue(); if (readerValue != NULL) reader = readerValue; else { const TCHAR* stringValue = field->stringValue(); size_t stringValueLength = _tcslen(stringValue); if (stringValue == NULL) _CLTHROWA(CL_ERR_IllegalArgument, "field must have either TokenStream, String or Reader value"); threadState->stringReader->init(stringValue, stringValueLength); reader = threadState->stringReader; } // Tokenize field and add to postingTable stream = analyzer->reusableTokenStream(fieldInfo->name, reader); } // reset the TokenStream to the first token stream->reset(); try { offsetEnd = offset-1; for(;;) { Token* token = stream->next(localToken); if (token == NULL) break; position += (token->getPositionIncrement() - 1); addPosition(token); ++length; // Apply field truncation policy. if (maxFieldLength != IndexWriter::FIELD_TRUNC_POLICY__WARN) { // The client programmer has explicitly authorized us to // truncate the token stream after maxFieldLength tokens. if ( length >= maxFieldLength) { if (_parent->infoStream != NULL) (*_parent->infoStream) << "maxFieldLength " << maxFieldLength << " reached for field " << fieldInfo->name << ", ignoring following tokens\n"; break; } } else if (length > IndexWriter::DEFAULT_MAX_FIELD_LENGTH) { const TCHAR* errMsgBase = _T("Indexing a huge number of tokens from a single") _T(" field (\"%s\", in this case) can cause CLucene") _T(" to use memory excessively.") _T(" By default, CLucene will accept only %s tokens") _T(" tokens from a single field before forcing the") _T(" client programmer to specify a threshold at") _T(" which to truncate the token stream.") _T(" You should set this threshold via") _T(" IndexReader::maxFieldLength (set to LUCENE_INT32_MAX") _T(" to disable truncation, or a value to specify maximum number of fields)."); TCHAR defaultMaxAsChar[34]; _i64tot(IndexWriter::DEFAULT_MAX_FIELD_LENGTH, defaultMaxAsChar, 10 ); int32_t errMsgLen = _tcslen(errMsgBase) + _tcslen(fieldInfo->name) + _tcslen(defaultMaxAsChar); TCHAR* errMsg = _CL_NEWARRAY(TCHAR,errMsgLen+1); _sntprintf(errMsg, errMsgLen,errMsgBase, fieldInfo->name, defaultMaxAsChar); _CLTHROWT_DEL(CL_ERR_Runtime,errMsg); } } offset = offsetEnd+1; } _CLFINALLY ( stream->close(); //don't delete, this stream is re-used ) } boost *= field->getBoost(); } DocumentsWriter::PostingVector* DocumentsWriter::ThreadState::FieldData::addNewVector() { if (postingsVectorsUpto == threadState->postingsVectors.length) { int32_t newSize; if (threadState->postingsVectors.length < 2) newSize = 2; else newSize = (int32_t) (1.5*threadState->postingsVectors.length); threadState->postingsVectors.resize(newSize, true); } threadState->p->vector = threadState->postingsVectors[postingsVectorsUpto]; if (threadState->p->vector == NULL) threadState->p->vector = threadState->postingsVectors.values[postingsVectorsUpto] = _CLNEW PostingVector(); postingsVectorsUpto++; PostingVector* v = threadState->p->vector; v->p = threadState->p; const int32_t firstSize = levelSizeArray[0]; if (doVectorPositions) { const int32_t upto = threadState->vectorsPool->newSlice(firstSize); v->posStart = v->posUpto = threadState->vectorsPool->tOffset + upto; } if (doVectorOffsets) { const int32_t upto = threadState->vectorsPool->newSlice(firstSize); v->offsetStart = v->offsetUpto = threadState->vectorsPool->tOffset + upto; } return v; } void DocumentsWriter::ThreadState::FieldData::addPosition(Token* token) { const Payload* payload = token->getPayload(); // Get the text of this term. Term can either // provide a String token or offset into a TCHAR* // array const TCHAR* tokenText = token->termBuffer(); const int32_t tokenTextLen = token->termLength(); int32_t code = 0; // Compute hashcode int32_t downto = tokenTextLen; while (downto > 0) code = (code*31) + tokenText[--downto]; /* std::cout << " addPosition: buffer=" << Misc::toString(tokenText).substr(0,tokenTextLen) << " pos=" << position << " offsetStart=" << (offset+token->startOffset()) << " offsetEnd=" << (offset + token->endOffset()) << " docID=" << threadState->docID << " doPos=" << (doVectorPositions?"true":"false") << " doOffset=" << (doVectorOffsets?"true":"false") << "\n"; */ int32_t hashPos = code & postingsHashMask; assert (!postingsCompacted); // Locate Posting in hash threadState->p = postingsHash[hashPos]; if (threadState->p != NULL && !threadState->postingEquals(tokenText, tokenTextLen)) { // Conflict: keep searching different locations in // the hash table. const int32_t inc = ((code>>8)+code)|1; do { code += inc; hashPos = code & postingsHashMask; threadState->p = postingsHash[hashPos]; } while (threadState->p != NULL && !threadState->postingEquals(tokenText, tokenTextLen)); } int32_t proxCode; // If we hit an exception below, it's possible the // posting list or term vectors data will be // partially written and thus inconsistent if // flushed, so we have to abort all documents // since the last flush: try { if (threadState->p != NULL) { // term seen since last flush if (threadState->docID != threadState->p->lastDocID) { // term not yet seen in this doc /* std::cout << " seen before (new docID=" << threadState->docID << ") freqUpto=" << threadState->p->freqUpto << " proxUpto=" << threadState->p->proxUpto << "\n"; */ assert (threadState->p->docFreq > 0); // Now that we know doc freq for previous doc, // write it & lastDocCode threadState->freqUpto = threadState->p->freqUpto & BYTE_BLOCK_MASK; threadState->freq = threadState->postingsPool->buffers[threadState->p->freqUpto >> BYTE_BLOCK_SHIFT]; if (1 == threadState->p->docFreq) threadState->writeFreqVInt(threadState->p->lastDocCode | 1); else { threadState->writeFreqVInt(threadState->p->lastDocCode); threadState->writeFreqVInt(threadState->p->docFreq); } threadState->p->freqUpto = threadState->freqUpto + (threadState->p->freqUpto & BYTE_BLOCK_NOT_MASK); if (doVectors) { threadState->vector = addNewVector(); if (doVectorOffsets) { offsetStartCode = offsetStart = offset + token->startOffset(); offsetEnd = offset + token->endOffset(); } } proxCode = position; threadState->p->docFreq = 1; // Store code so we can write this after we're // done with this new doc threadState->p->lastDocCode = (threadState->docID - threadState->p->lastDocID) << 1; threadState->p->lastDocID = threadState->docID; } else { // term already seen in this doc //std::cout << " seen before (same docID=" << threadState->docID << ") proxUpto=" << threadState->p->proxUpto << "\n"; threadState->p->docFreq++; proxCode = position - threadState->p->lastPosition; if (doVectors) { threadState->vector = threadState->p->vector; if (threadState->vector == NULL) threadState->vector = addNewVector(); if (doVectorOffsets) { offsetStart = offset + token->startOffset(); offsetEnd = offset + token->endOffset(); offsetStartCode = offsetStart - threadState->vector->lastOffset; } } } } else { // term not seen before //std::cout << " never seen docID=" << threadState->docID << "\n"; // Refill? if (0 == threadState->postingsFreeCountTS) { _parent->getPostings(threadState->postingsFreeListTS); threadState->postingsFreeCountTS = threadState->postingsFreeListTS.length; } const int32_t textLen1 = 1+tokenTextLen; if (textLen1 + threadState->charPool->tUpto > CHAR_BLOCK_SIZE) { if (textLen1 > CHAR_BLOCK_SIZE) { // Just skip this term, to remain as robust as // possible during indexing. A TokenFilter // can be inserted into the analyzer chain if // other behavior is wanted (pruning the term // to a prefix, throwing an exception, etc). if (threadState->maxTermPrefix == NULL){ threadState->maxTermPrefix = _CL_NEWARRAY(TCHAR,31); _tcsncpy(threadState->maxTermPrefix,tokenText,30); threadState->maxTermPrefix[30] = 0; } // Still increment position: position++; return; } threadState->charPool->nextBuffer(); } TCHAR* text = threadState->charPool->buffer; TCHAR* textUpto = text+ threadState->charPool->tUpto; // Pull next free Posting from free list threadState->p = threadState->postingsFreeListTS[--threadState->postingsFreeCountTS]; assert(threadState->p != NULL); threadState->p->textStart = textUpto + threadState->charPool->tOffset - text; threadState->charPool->tUpto += textLen1; _tcsncpy(textUpto, tokenText, tokenTextLen); textUpto[tokenTextLen] = CLUCENE_END_OF_WORD; assert (postingsHash[hashPos] == NULL); postingsHash.values[hashPos] = threadState->p; numPostings++; if (numPostings == postingsHashHalfSize) rehashPostings(2*postingsHashSize); // Init first slice for freq & prox streams const int32_t firstSize = levelSizeArray[0]; const int32_t upto1 = threadState->postingsPool->newSlice(firstSize); threadState->p->freqStart = threadState->p->freqUpto = threadState->postingsPool->tOffset + upto1; const int32_t upto2 = threadState->postingsPool->newSlice(firstSize); threadState->p->proxStart = threadState->p->proxUpto = threadState->postingsPool->tOffset + upto2; threadState->p->lastDocCode = threadState->docID << 1; threadState->p->lastDocID = threadState->docID; threadState->p->docFreq = 1; if (doVectors) { threadState->vector = addNewVector(); if (doVectorOffsets) { offsetStart = offsetStartCode = offset + token->startOffset(); offsetEnd = offset + token->endOffset(); } } proxCode = position; } threadState->proxUpto = threadState->p->proxUpto & BYTE_BLOCK_MASK; threadState->prox = threadState->postingsPool->buffers[threadState->p->proxUpto >> BYTE_BLOCK_SHIFT]; assert (threadState->prox != NULL); if (payload != NULL && payload->length() > 0) { threadState->writeProxVInt((proxCode<<1)|1); threadState->writeProxVInt(payload->length()); threadState->writeProxBytes(payload->getData().values, payload->getOffset(), payload->length()); fieldInfo->storePayloads = true; } else threadState->writeProxVInt(proxCode<<1); threadState->p->proxUpto = threadState->proxUpto + (threadState->p->proxUpto & BYTE_BLOCK_NOT_MASK); threadState->p->lastPosition = position++; if (doVectorPositions) { threadState->posUpto = threadState->vector->posUpto & BYTE_BLOCK_MASK; threadState->pos = threadState->vectorsPool->buffers[threadState->vector->posUpto >> BYTE_BLOCK_SHIFT]; threadState->writePosVInt(proxCode); threadState->vector->posUpto = threadState->posUpto + (threadState->vector->posUpto & BYTE_BLOCK_NOT_MASK); } if (doVectorOffsets) { threadState->offsetUpto = threadState->vector->offsetUpto & BYTE_BLOCK_MASK; threadState->offsets = threadState->vectorsPool->buffers[threadState->vector->offsetUpto >> BYTE_BLOCK_SHIFT]; threadState->writeOffsetVInt(offsetStartCode); threadState->writeOffsetVInt(offsetEnd-offsetStart); threadState->vector->lastOffset = offsetEnd; threadState->vector->offsetUpto = threadState->offsetUpto + (threadState->vector->offsetUpto & BYTE_BLOCK_NOT_MASK); } } catch (CLuceneError& t) { throw AbortException(t, _parent); } } void DocumentsWriter::ThreadState::FieldData::rehashPostings(const int32_t newSize) { const int32_t newMask = newSize-1; ValueArray newHash(newSize); int32_t hashPos, code; const TCHAR* pos = NULL; const TCHAR* start = NULL; Posting* p0; for(int32_t i=0;icharPool->buffers[p0->textStart >> CHAR_BLOCK_SHIFT] + (p0->textStart & CHAR_BLOCK_MASK); pos = start; while( *pos != CLUCENE_END_OF_WORD) pos++; code = 0; while (pos > start) code = (code*31) + *--pos; hashPos = code & newMask; assert (hashPos >= 0); if (newHash[hashPos] != NULL) { const int32_t inc = ((code>>8)+code)|1; do { code += inc; hashPos = code & newMask; } while (newHash[hashPos] != NULL); } newHash.values[hashPos] = p0; } } postingsHashMask = newMask; postingsHash.deleteArray(); postingsHash.length = newHash.length; postingsHash.values = newHash.takeArray(); postingsHashSize = newSize; postingsHashHalfSize = newSize >> 1; } void DocumentsWriter::ThreadState::FieldData::writeVectors(FieldInfo* fieldInfo) { assert (fieldInfo->storeTermVector); threadState->vectorFieldNumbers.values[threadState->numVectorFields] = fieldInfo->number; threadState->vectorFieldPointers.values[threadState->numVectorFields] = threadState->tvfLocal->getFilePointer(); threadState->numVectorFields++; const int32_t numPostingsVectors = postingsVectorsUpto; threadState->tvfLocal->writeVInt(numPostingsVectors); uint8_t bits = 0x0; if (doVectorPositions) bits |= TermVectorsReader::STORE_POSITIONS_WITH_TERMVECTOR; if (doVectorOffsets) bits |= TermVectorsReader::STORE_OFFSET_WITH_TERMVECTOR; threadState->tvfLocal->writeByte(bits); threadState->doVectorSort(threadState->postingsVectors, numPostingsVectors); Posting* lastPosting = NULL; ByteSliceReader* reader = vectorSliceReader; for(int32_t j=0;jpostingsVectors[j]; Posting* posting = vector->p; const int32_t freq = posting->docFreq; int32_t prefix = 0; const TCHAR* text2 = threadState->charPool->buffers[posting->textStart >> CHAR_BLOCK_SHIFT]; const TCHAR* start2 = text2 + (posting->textStart & CHAR_BLOCK_MASK); const TCHAR* pos2 = start2; // Compute common prefix between last term and // this term if (lastPosting == NULL) prefix = 0; else { const TCHAR* text1 = threadState->charPool->buffers[lastPosting->textStart >> CHAR_BLOCK_SHIFT]; const TCHAR* start1 = text1 + (lastPosting->textStart & CHAR_BLOCK_MASK); const TCHAR* pos1 = start1; while(true) { if (*pos1 != *pos2 || *pos1 == CLUCENE_END_OF_WORD) { prefix = pos1-start1; break; } pos1++; pos2++; } } lastPosting = posting; // Compute length while(*pos2 != CLUCENE_END_OF_WORD) pos2++; const int32_t suffix = pos2 - start2 - prefix; threadState->tvfLocal->writeVInt(prefix); threadState->tvfLocal->writeVInt(suffix); threadState->tvfLocal->writeChars(start2 + prefix, suffix); threadState->tvfLocal->writeVInt(freq); if (doVectorPositions) { reader->init(threadState->vectorsPool, vector->posStart, vector->posUpto); reader->writeTo(threadState->tvfLocal); } if (doVectorOffsets) { reader->init(threadState->vectorsPool, vector->offsetStart, vector->offsetUpto); reader->writeTo(threadState->tvfLocal); } } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/FieldInfos.cpp000066400000000000000000000172401154025176300231270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_FieldInfos.h" #include "CLucene/store/Directory.h" #include "CLucene/document/Document.h" #include "CLucene/document/Field.h" ////#include "CLucene/util/VoidMap.h" #include "CLucene/util/Misc.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/store/IndexInput.h" #include "CLucene/store/IndexOutput.h" CL_NS_USE(store) CL_NS_USE(document) CL_NS_USE(util) CL_NS_DEF(index) FieldInfo::FieldInfo( const TCHAR* _fieldName, const bool _isIndexed, const int32_t _fieldNumber, const bool _storeTermVector, const bool _storeOffsetWithTermVector, const bool _storePositionWithTermVector, const bool _omitNorms, const bool _storePayloads): name(CLStringIntern::intern(_fieldName )), isIndexed(_isIndexed), number(_fieldNumber), storeTermVector(_storeTermVector), storeOffsetWithTermVector(_storeOffsetWithTermVector), storePositionWithTermVector(_storePositionWithTermVector), omitNorms(_omitNorms), storePayloads(_storePayloads) { } FieldInfo::~FieldInfo(){ CL_NS(util)::CLStringIntern::unintern(name); } FieldInfo* FieldInfo::clone() { return _CLNEW FieldInfo(name, isIndexed, number, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); } FieldInfos::FieldInfos(): byName(false,false),byNumber(true) { } FieldInfos::~FieldInfos(){ byName.clear(); byNumber.clear(); } FieldInfos::FieldInfos(Directory* d, const char* name): byName(false,false),byNumber(true) { IndexInput* input = d->openInput(name); try { read(input); } _CLFINALLY ( input->close(); _CLDELETE(input); ); } FieldInfos* FieldInfos::clone() { FieldInfos* fis = _CLNEW FieldInfos(); const size_t numField = byNumber.size(); for(size_t i=0;iclone(); fis->byNumber.push_back(fi); fis->byName.put( fi->name, fi); } return fis; } void FieldInfos::add(const Document* doc) { const Document::FieldsType& fields = *doc->getFields(); Field* field; for ( Document::FieldsType::const_iterator itr = fields.begin() ; itr != fields.end() ; itr++ ){ field = *itr; add(field->name(), field->isIndexed(), field->isTermVectorStored(), field->isStorePositionWithTermVector(), field->isStoreOffsetWithTermVector(), field->getOmitNorms()); } } void FieldInfos::addIndexed(const TCHAR** names, const bool storeTermVectors, const bool storePositionWithTermVector, const bool storeOffsetWithTermVector) { size_t i = 0; while (names[i]) { add(names[i], true, storeTermVectors, storePositionWithTermVector, storeOffsetWithTermVector); ++i; } } void FieldInfos::add(const TCHAR** names,const bool isIndexed, const bool storeTermVectors, const bool storePositionWithTermVector, const bool storeOffsetWithTermVector, const bool omitNorms, const bool storePayloads) { size_t i=0; while ( names[i] != NULL ){ add(names[i], isIndexed, storeTermVectors, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); ++i; } } FieldInfo* FieldInfos::add( const TCHAR* name, const bool isIndexed, const bool storeTermVector, const bool storePositionWithTermVector, const bool storeOffsetWithTermVector, const bool omitNorms, const bool storePayloads) { FieldInfo* fi = fieldInfo(name); if (fi == NULL) { return addInternal(name, isIndexed, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); } else { if (fi->isIndexed != isIndexed) { fi->isIndexed = true; // once indexed, always index } if (fi->storeTermVector != storeTermVector) { fi->storeTermVector = true; // once vector, always vector } if (fi->storePositionWithTermVector != storePositionWithTermVector) { fi->storePositionWithTermVector = true; // once vector, always vector } if (fi->storeOffsetWithTermVector != storeOffsetWithTermVector) { fi->storeOffsetWithTermVector = true; // once vector, always vector } if (fi->omitNorms != omitNorms) { fi->omitNorms = false; // once norms are stored, always store } if (fi->storePayloads != storePayloads) { fi->storePayloads = true; } } return fi; } FieldInfo* FieldInfos::addInternal( const TCHAR* name, const bool isIndexed, const bool storeTermVector, const bool storePositionWithTermVector, const bool storeOffsetWithTermVector, const bool omitNorms, const bool storePayloads) { FieldInfo* fi = _CLNEW FieldInfo(name, isIndexed, byNumber.size(), storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); byNumber.push_back(fi); byName.put( fi->name, fi); return fi; } int32_t FieldInfos::fieldNumber(const TCHAR* fieldName)const { FieldInfo* fi = fieldInfo(fieldName); return (fi!=NULL) ? fi->number : -1; } FieldInfo* FieldInfos::fieldInfo(const TCHAR* fieldName) const { FieldInfo* ret = byName.get(fieldName); return ret; } const TCHAR* FieldInfos::fieldName(const int32_t fieldNumber) const { FieldInfo* fi = fieldInfo(fieldNumber); return (fi==NULL)?LUCENE_BLANK_STRING:fi->name; } FieldInfo* FieldInfos::fieldInfo(const int32_t fieldNumber) const { if ( fieldNumber < 0 || (size_t)fieldNumber >= byNumber.size() ) return NULL; return byNumber[fieldNumber]; } size_t FieldInfos::size()const { return byNumber.size(); } bool FieldInfos::hasVectors() const{ for (size_t i = 0; i < size(); i++) { if (fieldInfo(i)->storeTermVector) return true; } return false; } void FieldInfos::write(Directory* d, const char* name) const{ IndexOutput* output = d->createOutput(name); try { write(output); } _CLFINALLY ( output->close(); _CLDELETE(output); ); } void FieldInfos::write(IndexOutput* output) const{ output->writeVInt(static_cast(size())); FieldInfo* fi; uint8_t bits; for (size_t i = 0; i < size(); ++i) { fi = fieldInfo(i); bits = 0x0; if (fi->isIndexed) bits |= IS_INDEXED; if (fi->storeTermVector) bits |= STORE_TERMVECTOR; if (fi->storePositionWithTermVector) bits |= STORE_POSITIONS_WITH_TERMVECTOR; if (fi->storeOffsetWithTermVector) bits |= STORE_OFFSET_WITH_TERMVECTOR; if (fi->omitNorms) bits |= OMIT_NORMS; if (fi->storePayloads) bits |= STORE_PAYLOADS; output->writeString(fi->name,_tcslen(fi->name)); output->writeByte(bits); } } void FieldInfos::read(IndexInput* input) { int32_t size = input->readVInt();//read in the size uint8_t bits; bool isIndexed,storeTermVector,storePositionsWithTermVector,storeOffsetWithTermVector,omitNorms,storePayloads; for (int32_t i = 0; i < size; ++i){ TCHAR* name = input->readString(); //we could read name into a string buffer, but we can't be sure what the maximum field length will be. bits = input->readByte(); isIndexed = (bits & IS_INDEXED) != 0; storeTermVector = (bits & STORE_TERMVECTOR) != 0; storePositionsWithTermVector = (bits & STORE_POSITIONS_WITH_TERMVECTOR) != 0; storeOffsetWithTermVector = (bits & STORE_OFFSET_WITH_TERMVECTOR) != 0; omitNorms = (bits & OMIT_NORMS) != 0; storePayloads = (bits & STORE_PAYLOADS) != 0; addInternal(name, isIndexed, storeTermVector, storePositionsWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); _CLDELETE_CARRAY(name); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/FieldsReader.cpp000066400000000000000000000441741154025176300234440ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include #include "CLucene/util/Misc.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/CLStreams.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexInput.h" #include "CLucene/document/Document.h" #include "CLucene/document/FieldSelector.h" #include "_FieldInfos.h" #include "_FieldsWriter.h" #include "_FieldsReader.h" #include "CLucene/analysis/AnalysisHeader.h" #include CL_NS_USE(store) CL_NS_USE(document) CL_NS_USE(util) CL_NS_DEF(index) FieldsReader::FieldsReader(Directory* d, const char* segment, FieldInfos* fn, int32_t _readBufferSize, int32_t _docStoreOffset, int32_t size): fieldInfos(fn), cloneableFieldsStream(NULL), fieldsStream(NULL), indexStream(NULL), numTotalDocs(0),_size(0), closed(false),docStoreOffset(0) { //Func - Constructor //Pre - d contains a valid reference to a Directory // segment != NULL // fn contains a valid reference to a FieldInfos //Post - The instance has been created CND_PRECONDITION(segment != NULL, "segment != NULL"); bool success = false; try { cloneableFieldsStream = d->openInput( Misc::segmentname(segment,".fdt").c_str(), _readBufferSize ); fieldsStream = cloneableFieldsStream->clone(); indexStream = d->openInput( Misc::segmentname(segment,".fdx").c_str(), _readBufferSize ); if (_docStoreOffset != -1) { // We read only a slice out of this shared fields file this->docStoreOffset = _docStoreOffset; this->_size = size; // Verify the file is long enough to hold all of our // docs CND_CONDITION(((int32_t) (indexStream->length() / 8)) >= size + this->docStoreOffset, "the file is not long enough to hold all of our docs"); } else { this->docStoreOffset = 0; this->_size = (int32_t) (indexStream->length() >> 3); } //_size = (int32_t)indexStream->length()/8; numTotalDocs = (int32_t) (indexStream->length() >> 3); success = true; } _CLFINALLY ({ // With lock-less commits, it's entirely possible (and // fine) to hit a FileNotFound exception above. In // this case, we want to explicitly close any subset // of things that were opened so that we don't have to // wait for a GC to do so. if (!success) { close(); } }); } FieldsReader::~FieldsReader(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed close(); } void FieldsReader::ensureOpen() { if (closed) { _CLTHROWA(CL_ERR_IllegalState, "this FieldsReader is closed"); } } void FieldsReader::close() { if (!closed) { if (fieldsStream){ fieldsStream->close(); _CLDELETE(fieldsStream); } if (cloneableFieldsStream){ cloneableFieldsStream->close(); _CLDELETE(cloneableFieldsStream); } if(indexStream){ indexStream->close(); _CLDELETE(indexStream); } /* CL_NS(store)::IndexInput* localFieldsStream = fieldsStreamTL.get(); if (localFieldsStream != NULL) { localFieldsStream->close(); fieldsStreamTL->set(NULL); }*/ closed = true; } } int32_t FieldsReader::size() const{ return _size; } bool FieldsReader::doc(int32_t n, Document& doc, const CL_NS(document)::FieldSelector* fieldSelector) { if ( (n + docStoreOffset) * 8L > indexStream->length() ) return false; indexStream->seek((n + docStoreOffset) * 8L); int64_t position = indexStream->readLong(); fieldsStream->seek(position); int32_t numFields = fieldsStream->readVInt(); for (int32_t i = 0; i < numFields; i++) { const int32_t fieldNumber = fieldsStream->readVInt(); FieldInfo* fi = fieldInfos->fieldInfo(fieldNumber); if ( fi == NULL ) _CLTHROWA(CL_ERR_IO, "Field stream is invalid"); FieldSelector::FieldSelectorResult acceptField = (fieldSelector == NULL) ? FieldSelector::LOAD : fieldSelector->accept(fi->name); uint8_t bits = fieldsStream->readByte(); CND_CONDITION(bits <= FieldsWriter::FIELD_IS_COMPRESSED + FieldsWriter::FIELD_IS_TOKENIZED + FieldsWriter::FIELD_IS_BINARY, "invalid field bits"); const bool compressed = (bits & FieldsWriter::FIELD_IS_COMPRESSED) != 0; const bool tokenize = (bits & FieldsWriter::FIELD_IS_TOKENIZED) != 0; const bool binary = (bits & FieldsWriter::FIELD_IS_BINARY) != 0; //TODO: Find an alternative approach here if this list continues to grow beyond the //list of 5 or 6 currently here. See Lucene 762 for discussion if (acceptField == FieldSelector::LOAD) { addField(doc, fi, binary, compressed, tokenize); } else if (acceptField == FieldSelector::LOAD_FOR_MERGE) { addFieldForMerge(doc, fi, binary, compressed, tokenize); } else if (acceptField == FieldSelector::LOAD_AND_BREAK){ addField(doc, fi, binary, compressed, tokenize); break;//Get out of this loop } else if (acceptField == FieldSelector::LAZY_LOAD) { addFieldLazy(doc, fi, binary, compressed, tokenize); } else if (acceptField == FieldSelector::SIZE){ skipField(binary, compressed, addFieldSize(doc, fi, binary, compressed)); } else if (acceptField == FieldSelector::SIZE_AND_BREAK){ addFieldSize(doc, fi, binary, compressed); break; }else { skipField(binary, compressed); } } return true; } CL_NS(store)::IndexInput* FieldsReader::rawDocs(int32_t* lengths, const int32_t startDocID, const int32_t numDocs) { indexStream->seek((docStoreOffset+startDocID) * 8L); int64_t startOffset = indexStream->readLong(); int64_t lastOffset = startOffset; int32_t count = 0; while (count < numDocs) { int64_t offset; const int32_t docID = docStoreOffset + startDocID + count + 1; CND_CONDITION( docID <= numTotalDocs, "invalid docID"); if (docID < numTotalDocs) offset = indexStream->readLong(); else offset = fieldsStream->length(); lengths[count++] = static_cast(offset-lastOffset); lastOffset = offset; } fieldsStream->seek(startOffset); return fieldsStream; } void FieldsReader::skipField(const bool binary, const bool compressed) { skipField(binary, compressed, fieldsStream->readVInt()); } void FieldsReader::skipField(const bool binary, const bool compressed, const int32_t toRead) { if (binary || compressed) { int64_t pointer = fieldsStream->getFilePointer(); fieldsStream->seek(pointer + toRead); } else { //We need to skip chars. This will slow us down, but still better fieldsStream->skipChars(toRead); } } void FieldsReader::addFieldLazy(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize) { if (binary) { int32_t toRead = fieldsStream->readVInt(); int64_t pointer = fieldsStream->getFilePointer(); if (compressed) { doc.add(*_CLNEW LazyField(this, fi->name, Field::STORE_COMPRESS, toRead, pointer)); } else { doc.add(*_CLNEW LazyField(this, fi->name, Field::STORE_YES, toRead, pointer)); } //Need to move the pointer ahead by toRead positions fieldsStream->seek(pointer + toRead); } else { LazyField* f = NULL; if (compressed) { int32_t toRead = fieldsStream->readVInt(); int64_t pointer = fieldsStream->getFilePointer(); f = _CLNEW LazyField(this, fi->name, Field::STORE_COMPRESS, toRead, pointer); //skip over the part that we aren't loading fieldsStream->seek(pointer + toRead); f->setOmitNorms(fi->omitNorms); } else { int32_t length = fieldsStream->readVInt(); int64_t pointer = fieldsStream->getFilePointer(); //Skip ahead of where we are by the length of what is stored fieldsStream->skipChars(length); f = _CLNEW LazyField(this, fi->name, Field::STORE_YES | getIndexType(fi, tokenize) | getTermVectorType(fi), length, pointer); f->setOmitNorms(fi->omitNorms); } doc.add(*f); } } // in merge mode we don't uncompress the data of a compressed field void FieldsReader::addFieldForMerge(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize) { void* data; Field::ValueType v; if ( binary || compressed) { int32_t toRead = fieldsStream->readVInt(); CL_NS(util)::ValueArray b(toRead); fieldsStream->readBytes(b.values,toRead); v = Field::VALUE_BINARY; data = b.takeArray(); } else { data = fieldsStream->readString(); v = Field::VALUE_STRING; } doc.add(*_CLNEW FieldForMerge(data, v, fi, binary, compressed, tokenize)); } void FieldsReader::addField(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize) { //we have a binary stored field, and it may be compressed if (binary) { const int32_t toRead = fieldsStream->readVInt(); ValueArray* b = _CLNEW ValueArray(toRead); fieldsStream->readBytes(b->values,toRead); if (compressed) { // we still do not support compressed fields ValueArray* data = _CLNEW ValueArray; try{ uncompress(*b, *data); }catch(CLuceneError& err){ _CLDELETE(data); _CLDELETE(b); throw err; } _CLDELETE(b); doc.add(* _CLNEW Field(fi->name, data, Field::STORE_COMPRESS, false)); }else{ doc.add(* _CLNEW Field(fi->name, b, Field::STORE_YES, false)); } //no need to clean up, Field consumes b } else { uint8_t bits = 0; bits |= getIndexType(fi, tokenize); bits |= getTermVectorType(fi); Field* f = NULL; if (compressed) { bits |= Field::STORE_COMPRESS; const int32_t toRead = fieldsStream->readVInt(); ValueArray* b = _CLNEW ValueArray(toRead); fieldsStream->readBytes(b->values,toRead); ValueArray data; try{ uncompress(*b, data); }_CLFINALLY( _CLDELETE(b) ) #ifndef _ASCII //convert to utf8 TCHAR* result = _CL_NEWARRAY(TCHAR, data.length); size_t l = lucene_utf8towcs(result, (const char*)data.values, data.length); result[l] = 0; //if we were a bit too pesimistic with the size, then shrink the memory... if ( l < data.length/2 ){ TCHAR* tmp = result; result = STRDUP_TtoT(result); _CLDELETE_LCARRAY(tmp); } f = _CLNEW Field(fi->name, // field name result, // uncompress the value and add as string bits, false); #else f = _CLNEW Field(fi->name, // field name reinterpret_cast(data.values), // uncompress the value and add as string bits, false); #endif f->setOmitNorms(fi->omitNorms); } else { bits |= Field::STORE_YES; TCHAR* str = fieldsStream->readString(); f = _CLNEW Field(fi->name, // name str, // read value bits, false); f->setOmitNorms(fi->omitNorms); } doc.add(*f); } } int32_t FieldsReader::addFieldSize(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed) { const int32_t size = fieldsStream->readVInt(); const uint32_t bytesize = binary || compressed ? size : 2*size; ValueArray* sizebytes = _CLNEW ValueArray(4); sizebytes->values[0] = (uint8_t) (bytesize>>24); sizebytes->values[1] = (uint8_t) (bytesize>>16); sizebytes->values[2] = (uint8_t) (bytesize>> 8); sizebytes->values[3] = (uint8_t) bytesize ; doc.add(*_CLNEW Field(fi->name, sizebytes, Field::STORE_YES, false)); return size; } CL_NS(document)::Field::TermVector FieldsReader::getTermVectorType(const FieldInfo* fi) { if (fi->storeTermVector) { if (fi->storeOffsetWithTermVector) { if (fi->storePositionWithTermVector) { return Field::TERMVECTOR_WITH_POSITIONS_OFFSETS; } else { return Field::TERMVECTOR_WITH_OFFSETS; } } else if (fi->storePositionWithTermVector) { return Field::TERMVECTOR_WITH_POSITIONS; } else { return Field::TERMVECTOR_YES; } } else { return Field::TERMVECTOR_NO ; } } CL_NS(document)::Field::Index FieldsReader::getIndexType(const FieldInfo* fi, const bool tokenize) { if (fi->isIndexed && tokenize) return Field::INDEX_TOKENIZED; else if (fi->isIndexed && !tokenize) return Field::INDEX_UNTOKENIZED; else return Field::INDEX_NO; } FieldsReader::LazyField::LazyField(FieldsReader* _parent, const TCHAR* _name, int config, const int32_t _toRead, const int64_t _pointer) : Field(_name, config), parent(_parent) { // todo: need to allow for auto setting Field::INDEX_NO | Field::TERMVECTOR_NO so only Store is required this->toRead = _toRead; this->pointer = _pointer; lazy = true; } FieldsReader::LazyField::~LazyField(){ } CL_NS(store)::IndexInput* FieldsReader::LazyField::getFieldStream(){ CL_NS(store)::IndexInput* localFieldsStream = parent->fieldsStreamTL.get(); if (localFieldsStream == NULL) { localFieldsStream = parent->cloneableFieldsStream->clone(); parent->fieldsStreamTL.set(localFieldsStream); } return localFieldsStream; } const ValueArray* FieldsReader::LazyField::binaryValue(){ parent->ensureOpen(); if (fieldsData == NULL) { ValueArray* b = _CLNEW ValueArray(toRead); CL_NS(store)::IndexInput* localFieldsStream = getFieldStream(); //Throw this IO Exception since IndexREader.document does so anyway, so probably not that big of a change for people //since they are already handling this exception when getting the document try { localFieldsStream->seek(pointer); localFieldsStream->readBytes(b->values, toRead); if (isCompressed() == true) { ValueArray* data = _CLNEW ValueArray; try{ uncompress(*b, *data); }catch (CLuceneError& err){ _CLDELETE(data); _CLDELETE(b); throw err; } _CLDELETE(b); fieldsData = data; } else { fieldsData = b; } valueType = VALUE_BINARY; }catch(CLuceneError& err){ if ( err.number() != CL_ERR_IO ) throw err; _CLTHROWA(CL_ERR_FieldReader, err.what()); } } return static_cast*>(fieldsData); } CL_NS(util)::Reader* FieldsReader::LazyField::readerValue(){ parent->ensureOpen(); return (valueType & VALUE_READER) ? static_cast(fieldsData) : NULL; } CL_NS(analysis)::TokenStream* FieldsReader::LazyField::tokenStreamValue(){ parent->ensureOpen(); return (valueType & VALUE_TOKENSTREAM) ? static_cast(fieldsData) : NULL; } /** The value of the field as a String, or null. If null, the Reader value, * binary value, or TokenStream value is used. Exactly one of stringValue(), * readerValue(), binaryValue(), and tokenStreamValue() must be set. */ const TCHAR* FieldsReader::LazyField::stringValue() { parent->ensureOpen(); if (fieldsData == NULL) { CL_NS(store)::IndexInput* localFieldsStream = getFieldStream(); localFieldsStream->seek(pointer); if (isCompressed()) { ValueArray b(toRead); ValueArray uncompressed; localFieldsStream->readBytes(b.values, toRead); _resetValue(); uncompress(b, uncompressed); //no need to catch error, memory all in frame #ifndef _ASCII TCHAR* str = _CL_NEWARRAY(TCHAR, uncompressed.length); size_t l = lucene_utf8towcs(str, (const char*)uncompressed.values, uncompressed.length); str[l] = 0; if ( l < uncompressed.length/2 ){ //too pesimistic with size... fieldsData = STRDUP_TtoT(str); _CLDELETE_LCARRAY(str); }else{ fieldsData = str; } #else fieldsData = uncompressed.values; #endif } else { //read in chars b/c we already know the length we need to read TCHAR* chars = _CL_NEWARRAY(TCHAR, toRead+1); localFieldsStream->readChars(chars, 0, toRead); chars[toRead] = _T('\0'); _resetValue(); fieldsData = chars; } valueType = VALUE_STRING; } return static_cast(fieldsData); //instanceof String ? (String) fieldsData : null; } int64_t FieldsReader::LazyField::getPointer() const { parent->ensureOpen(); return pointer; } void FieldsReader::LazyField::setPointer(const int64_t _pointer) { parent->ensureOpen(); this->pointer = _pointer; } int32_t FieldsReader::LazyField::getToRead() const { parent->ensureOpen(); return toRead; } void FieldsReader::LazyField::setToRead(const int32_t _toRead) { parent->ensureOpen(); this->toRead = _toRead; } const TCHAR* FieldsReader::FieldForMerge::stringValue() const { return (valueType & VALUE_STRING) ? static_cast(fieldsData) : NULL; } CL_NS(util)::Reader* FieldsReader::FieldForMerge::readerValue() const { // not needed for merge return NULL; } const CL_NS(util)::ValueArray* FieldsReader::FieldForMerge::binaryValue(){ return (valueType & VALUE_BINARY) ? static_cast*>(fieldsData) : NULL; } CL_NS(analysis)::TokenStream* FieldsReader::FieldForMerge::tokenStreamValue() const { // not needed for merge return NULL; } FieldsReader::FieldForMerge::FieldForMerge(void* _value, ValueType _type, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize) : Field(fi->name, 0) { uint32_t bits = STORE_YES; this->fieldsData = _value; this->valueType = _type; if (tokenize) bits |= INDEX_TOKENIZED; if (compressed) bits |= STORE_COMPRESS; if (fi->isIndexed && !tokenize) bits |= INDEX_UNTOKENIZED; if (fi->omitNorms) bits |= INDEX_NONORMS; if (fi->storeOffsetWithTermVector) bits |= TERMVECTOR_WITH_OFFSETS; if (fi->storePositionWithTermVector) bits |= TERMVECTOR_WITH_POSITIONS; if (fi->storeTermVector) bits |= TERMVECTOR_YES; setConfig(bits); } FieldsReader::FieldForMerge::~FieldForMerge(){ } const char* FieldsReader::FieldForMerge::getClassName(){ return "FieldsReader::FieldForMerge"; } const char* FieldsReader::FieldForMerge::getObjectName() const{ return getClassName(); } void FieldsReader::uncompress(const CL_NS(util)::ValueArray& input, CL_NS(util)::ValueArray& output){ stringstream out; string err; if ( ! Misc::inflate(input.values, input.length, out, err) ){ _CLTHROWA(CL_ERR_IO, err.c_str()); } // get length of file: out.seekg (0, ios::end); size_t length = out.tellg(); out.seekg (0, ios::beg); output.resize(length+1); out.read((char*)output.values,length); output.values[length] = 0;//null-terminate in case we want to use it as utf8 } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/FieldsWriter.cpp000066400000000000000000000213341154025176300235070ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_FieldsWriter.h" //#include "CLucene/util/VoidMap.h" #include "CLucene/util/CLStreams.h" #include "CLucene/util/Misc.h" #include "CLucene/store/Directory.h" #include "CLucene/store/_RAMDirectory.h" #include "CLucene/store/IndexOutput.h" #include "CLucene/document/Document.h" #include "CLucene/document/Field.h" #include "_FieldInfos.h" #include "_FieldsReader.h" #include CL_NS_USE(store) CL_NS_USE(util) CL_NS_USE(document) CL_NS_DEF(index) FieldsWriter::FieldsWriter(Directory* d, const char* segment, FieldInfos* fn): fieldInfos(fn) { //Func - Constructor //Pre - d contains a valid reference to a directory // segment != NULL and contains the name of the segment //Post - fn contains a valid reference toa a FieldInfos CND_PRECONDITION(segment != NULL,"segment is NULL"); fieldsStream = d->createOutput ( Misc::segmentname(segment,".fdt").c_str() ); CND_CONDITION(fieldsStream != NULL,"fieldsStream is NULL"); indexStream = d->createOutput( Misc::segmentname(segment,".fdx").c_str() ); CND_CONDITION(indexStream != NULL,"indexStream is NULL"); doClose = true; } FieldsWriter::FieldsWriter(CL_NS(store)::IndexOutput* fdx, CL_NS(store)::IndexOutput* fdt, FieldInfos* fn): fieldInfos(fn) { fieldsStream = fdt; CND_CONDITION(fieldsStream != NULL,"fieldsStream is NULL"); indexStream = fdx; CND_CONDITION(fieldsStream != NULL,"fieldsStream is NULL"); doClose = false; } FieldsWriter::~FieldsWriter(){ //Func - Destructor //Pre - true //Post - Instance has been destroyed close(); } void FieldsWriter::close() { //Func - Closes all streams and frees all resources //Pre - true //Post - All streams have been closed all resources have been freed if (! doClose ) return; //Check if fieldsStream is valid if (fieldsStream){ //Close fieldsStream fieldsStream->close(); _CLDELETE( fieldsStream ); } //Check if indexStream is valid if (indexStream){ //Close indexStream indexStream->close(); _CLDELETE( indexStream ); } } void FieldsWriter::addDocument(Document* doc) { //Func - Adds a document //Pre - doc contains a valid reference to a Document // indexStream != NULL // fieldsStream != NULL //Post - The document doc has been added CND_PRECONDITION(indexStream != NULL,"indexStream is NULL"); CND_PRECONDITION(fieldsStream != NULL,"fieldsStream is NULL"); indexStream->writeLong(fieldsStream->getFilePointer()); int32_t storedCount = 0; { const Document::FieldsType& fields = *doc->getFields(); for ( Document::FieldsType::const_iterator itr = fields.begin() ; itr != fields.end() ; itr++ ){ Field* field = *itr; if (field->isStored()) storedCount++; } fieldsStream->writeVInt(storedCount); } { const Document::FieldsType& fields = *doc->getFields(); for ( Document::FieldsType::const_iterator itr = fields.begin() ; itr != fields.end() ; itr++ ){ Field* field = *itr; if (field->isStored()) { writeField(fieldInfos->fieldInfo(field->name()), field); } } } } void FieldsWriter::writeField(FieldInfo* fi, CL_NS(document)::Field* field) { // if the field as an instanceof FieldsReader.FieldForMerge, we're in merge mode // and field.binaryValue() already returns the compressed value for a field // with isCompressed()==true, so we disable compression in that case bool disableCompression = (field->instanceOf(FieldsReader::FieldForMerge::getClassName())); fieldsStream->writeVInt(fi->number); uint8_t bits = 0; if (field->isTokenized()) bits |= FieldsWriter::FIELD_IS_TOKENIZED; if (field->isBinary()) bits |= FieldsWriter::FIELD_IS_BINARY; if (field->isCompressed()) bits |= FieldsWriter::FIELD_IS_COMPRESSED; fieldsStream->writeByte(bits); if ( field->isCompressed() ){ // compression is enabled for the current field CL_NS(util)::ValueArray dataB; const CL_NS(util)::ValueArray* data = &dataB; if (disableCompression) { // optimized case for merging, the data // is already compressed data = field->binaryValue(); } else { // check if it is a binary field if (field->isBinary()) { compress(*field->binaryValue(), dataB); }else if ( field->stringValue() == NULL ){ //we must be using readerValue CND_PRECONDITION(!field->isIndexed(), "Cannot store reader if it is indexed too") Reader* r = field->readerValue(); int32_t sz = r->size(); if ( sz < 0 ) sz = 10000000; //todo: we should warn the developer here.... //read the entire string const TCHAR* rv = NULL; int64_t rl = r->read(rv, sz, 1); if ( rl > LUCENE_INT32_MAX_SHOULDBE ) _CLTHROWA(CL_ERR_Runtime,"Field length too long"); else if ( rl < 0 ) rl = 0; string str = lucene_wcstoutf8string(rv, rl); CL_NS(util)::ValueArray utfstr; utfstr.length = str.length(); utfstr.values = (uint8_t*)str.c_str(); compress(utfstr, dataB); utfstr.values = NULL; }else if ( field->stringValue() != NULL ){ string str = lucene_wcstoutf8string(field->stringValue(), LUCENE_INT32_MAX_SHOULDBE); CL_NS(util)::ValueArray utfstr; utfstr.length = str.length(); utfstr.values = (uint8_t*)str.c_str(); compress(utfstr, dataB); utfstr.values = NULL; } } fieldsStream->writeVInt(data->length); fieldsStream->writeBytes(data->values, data->length); }else{ //FEATURE: this problem in Java Lucene too, if using Reader, data is not stored. //todo: this is a logic bug... //if the field is stored, and indexed, and is using a reader the field wont get indexed // //if we could write zero prefixed vints (therefore static length), then we could //write a reader directly to the field indexoutput and then go back and write the data //length. however this is not supported in lucene yet... //if this is ever implemented, then it would make sense to also be able to combine the //FieldsWriter and DocumentWriter::invertDocument process, and use a streamfilter to //write the field data while the documentwrite analyses the document! how cool would //that be! it would cut out all these buffers!!! // compression is disabled for the current field if (field->isBinary()) { const CL_NS(util)::ValueArray* data = field->binaryValue(); fieldsStream->writeVInt(data->length); fieldsStream->writeBytes(data->values, data->length); }else if ( field->stringValue() == NULL ){ //we must be using readerValue CND_PRECONDITION(!field->isIndexed(), "Cannot store reader if it is indexed too") Reader* r = field->readerValue(); int32_t sz = r->size(); if ( sz < 0 ) sz = 10000000; //todo: we should warn the developer here.... //read the entire string const TCHAR* rv; int64_t rl = r->read(rv, sz, 1); if ( rl > LUCENE_INT32_MAX_SHOULDBE ) _CLTHROWA(CL_ERR_Runtime,"Field length too long"); else if ( rl < 0 ) rl = 0; fieldsStream->writeString( rv, (int32_t)rl); }else if ( field->stringValue() != NULL ){ fieldsStream->writeString(field->stringValue(),_tcslen(field->stringValue())); }else _CLTHROWA(CL_ERR_Runtime, "No values are set for the field"); } } void FieldsWriter::flushDocument(int32_t numStoredFields, CL_NS(store)::RAMOutputStream* buffer) { indexStream->writeLong(fieldsStream->getFilePointer()); fieldsStream->writeVInt(numStoredFields); buffer->writeTo(fieldsStream); } void FieldsWriter::flush() { indexStream->flush(); fieldsStream->flush(); } void FieldsWriter::addRawDocuments(CL_NS(store)::IndexInput* stream, const int32_t* lengths, const int32_t numDocs) { int64_t position = fieldsStream->getFilePointer(); const int64_t start = position; for(int32_t i=0;iwriteLong(position); position += lengths[i]; } fieldsStream->copyBytes(stream, position-start); CND_CONDITION(fieldsStream->getFilePointer() == position,"fieldsStream->getFilePointer() != position"); } void FieldsWriter::compress(const CL_NS(util)::ValueArray& input, CL_NS(util)::ValueArray& output){ stringstream out; string err; if ( ! Misc::deflate(input.values, input.length, out, err) ){ _CLTHROWA(CL_ERR_IO, err.c_str()); } // get length of file: out.seekg (0, ios::end); size_t length = out.tellg(); out.seekg (0, ios::beg); output.resize(length); out.read((char*)output.values,length); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexDeletionPolicy.cpp000066400000000000000000000104541154025176300250200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexDeletionPolicy.h" CL_NS_DEF(index) IndexDeletionPolicy::~IndexDeletionPolicy(){ } IndexCommitPoint::~IndexCommitPoint(){ } KeepOnlyLastCommitDeletionPolicy::~KeepOnlyLastCommitDeletionPolicy(){ } void KeepOnlyLastCommitDeletionPolicy::onInit(std::vector& commits) { // Note that commits.size() should normally be 1: onCommit(commits); } void KeepOnlyLastCommitDeletionPolicy::onCommit(std::vector& commits) { // Note that commits.size() should normally be 2 (if not // called by onInit above): size_t size = commits.size(); for(size_t i=0;ideleteCommitPoint(); } } const char* KeepOnlyLastCommitDeletionPolicy::getClassName(){ return "KeepOnlyLastCommitDeletionPolicy"; } const char* KeepOnlyLastCommitDeletionPolicy::getObjectName() const{ return getClassName(); } /** A {@link IndexDeletionPolicy} that wraps around any other * {@link IndexDeletionPolicy} and adds the ability to hold and * later release a single "snapshot" of an index. While * the snapshot is held, the {@link IndexWriter} will not * remove any files associated with it even if the index is * otherwise being actively, arbitrarily changed. Because * we wrap another arbitrary {@link IndexDeletionPolicy}, this * gives you the freedom to continue using whatever {@link * IndexDeletionPolicy} you would normally want to use with your * index. class SnapshotDeletionPolicy: public IndexDeletionPolicy { private: IndexCommitPoint lastCommit; IndexDeletionPolicy primary; IndexCommitPoint snapshot; DEFINE_MUTEX(SnapshotDeletionPolicy_LOCK) class MyCommitPoint: public IndexCommitPoint { IndexCommitPoint cp; public: MyCommitPoint(IndexCommitPoint cp) { this.cp = cp; } String getSegmentsFileName() { return cp.getSegmentsFileName(); } Collection getFileNames() throws IOException { return cp.getFileNames(); } void deleteCommitPoint() { synchronized(SnapshotDeletionPolicy_LOCK) { // Suppress the delete request if this commit point is // our current snapshot. if (snapshot != cp) cp->deleteCommitPoint(); } } } List wrapCommits(List commits) { final int count = commits.size(); List myCommits = new ArrayList(count); for(int i=0;i #include "CLucene/util/Equators.h" CL_NS_DEF(index) class CLUCENE_EXPORT IndexCommitPoint { public: virtual ~IndexCommitPoint(); /** * Get the segments file (segments_N) associated * with this commit point. */ virtual std::string getSegmentsFileName() = 0; /** * Returns all index files referenced by this commit point. */ virtual const std::vector& getFileNames() = 0; /** * Delete this commit point. *

* Upon calling this, the writer is notified that this commit * point should be deleted. *

* Decision that a commit-point should be deleted is taken by the {@link IndexDeletionPolicy} in effect * and therefore this should only be called by its {@link IndexDeletionPolicy#onInit onInit()} or * {@link IndexDeletionPolicy#onCommit onCommit()} methods. */ virtual void deleteCommitPoint() = 0; }; /** *

Expert: policy for deletion of stale {@link IndexCommitPoint index commits}. * *

Implement this interface, and pass it to one * of the {@link IndexWriter} or {@link IndexReader} * constructors, to customize when older * {@link IndexCommitPoint point-in-time commits} * are deleted from the index directory. The default deletion policy * is {@link KeepOnlyLastCommitDeletionPolicy}, which always * removes old commits as soon as a new commit is done (this * matches the behavior before 2.2).

* *

One expected use case for this (and the reason why it * was first created) is to work around problems with an * index directory accessed via filesystems like NFS because * NFS does not provide the "delete on last close" semantics * that Lucene's "point in time" search normally relies on. * By implementing a custom deletion policy, such as "a * commit is only removed once it has been stale for more * than X minutes", you can give your readers time to * refresh to the new commit before {@link IndexWriter} * removes the old commits. Note that doing so will * increase the storage requirements of the index. See LUCENE-710 * for details.

*/ class CLUCENE_EXPORT IndexDeletionPolicy: public CL_NS(util)::NamedObject{ public: virtual ~IndexDeletionPolicy(); /** *

This is called once when a writer is first * instantiated to give the policy a chance to remove old * commit points.

* *

The writer locates all index commits present in the * index directory and calls this method. The policy may * choose to delete some of the commit points, doing so by * calling method {@link IndexCommitPoint#delete delete()} * of {@link IndexCommitPoint}.

* *

Note: the last CommitPoint is the most recent one, * i.e. the "front index state". Be careful not to delete it, * unless you know for sure what you are doing, and unless * you can afford to lose the index content while doing that. * * @param commits List of current * {@link IndexCommitPoint point-in-time commits}, * sorted by age (the 0th one is the oldest commit). */ virtual void onInit(std::vector& commits) = 0; /** *

This is called each time the writer completed a commit. * This gives the policy a chance to remove old commit points * with each commit.

* *

The policy may now choose to delete old commit points * by calling method {@link IndexCommitPoint#delete delete()} * of {@link IndexCommitPoint}.

* *

If writer has autoCommit = true then * this method will in general be called many times during * one instance of {@link IndexWriter}. If * autoCommit = false then this method is * only called once when {@link IndexWriter#close} is * called, or not at all if the {@link IndexWriter#abort} * is called. * *

Note: the last CommitPoint is the most recent one, * i.e. the "front index state". Be careful not to delete it, * unless you know for sure what you are doing, and unless * you can afford to lose the index content while doing that. * * @param commits List of {@link IndexCommitPoint}, * sorted by age (the 0th one is the oldest commit). */ virtual void onCommit(std::vector& commits) = 0; }; /** * This {@link IndexDeletionPolicy} implementation that * keeps only the most recent commit and immediately removes * all prior commits after a new commit is done. This is * the default deletion policy. */ class CLUCENE_EXPORT KeepOnlyLastCommitDeletionPolicy: public IndexDeletionPolicy { public: virtual ~KeepOnlyLastCommitDeletionPolicy(); /** * Deletes all commits except the most recent one. */ void onInit(std::vector& commits); /** * Deletes all commits except the most recent one. */ void onCommit(std::vector& commits); static const char* getClassName(); const char* getObjectName() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/IndexFileDeleter.cpp000066400000000000000000000405271154025176300242650ustar00rootroot00000000000000#include "CLucene/_ApiHeader.h" #include "_IndexFileDeleter.h" #include "_IndexFileNameFilter.h" #include "_DocumentsWriter.h" #include "_SegmentHeader.h" #include "CLucene/store/Directory.h" #include "CLucene/LuceneThreads.h" #include #include #include CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) bool IndexFileDeleter::VERBOSE_REF_COUNTS = false; IndexFileDeleter::CommitPoint::CommitPoint(IndexFileDeleter* _this, SegmentInfos* segmentInfos){ this->_this = _this; this->deleted = false; this->gen = 0; segmentsFileName = segmentInfos->getCurrentSegmentFileName(); int32_t size = segmentInfos->size(); files.push_back(segmentsFileName); gen = segmentInfos->getGeneration(); for(int32_t i=0;iinfo(i); if (segmentInfo->dir == _this->directory) { const vector& ff = segmentInfo->files(); files.insert(files.end(),ff.begin(), ff.end()); } } } IndexFileDeleter::CommitPoint::~CommitPoint(){ } /** * Get the segments_N file for this commit point32_t. */ std::string IndexFileDeleter::CommitPoint::getSegmentsFileName() { return segmentsFileName; } bool IndexFileDeleter::CommitPoint::sort(IndexCommitPoint* elem1, IndexCommitPoint* elem2){ if (((CommitPoint*)elem1)->gen < ((CommitPoint*)elem2)->gen) return true; return false; } const std::vector& IndexFileDeleter::CommitPoint::getFileNames() { return files; } /** * Called only be the deletion policy, to remove this * commit point32_t from the index. */ void IndexFileDeleter::CommitPoint::deleteCommitPoint() { if (!deleted) { deleted = true; _this->commitsToDelete.push_back(this); } } const char* IndexFileDeleter::CommitPoint::getClassName(){ return "IndexFileDeleter::CommitPoint"; } const char* IndexFileDeleter::CommitPoint::getObjectName() const{ return getClassName(); } int32_t IndexFileDeleter::CommitPoint::compareTo(NamedObject* obj) { if ( obj->getObjectName() != CommitPoint::getClassName() ) return -1; CommitPoint* commit = (CommitPoint*) obj; if (gen < commit->gen) { return -1; } else if (gen > commit->gen) { return 1; } else { return 0; } } void IndexFileDeleter::setInfoStream(std::ostream* infoStream) { this->infoStream = infoStream; if (infoStream != NULL){ string msg = string("setInfoStream deletionPolicy=") + policy->getObjectName(); message( msg ); } } void IndexFileDeleter::message(string message) { (*infoStream) << string("IFD [") << Misc::toString( _LUCENE_CURRTHREADID ) << string("]: ") << message << string("\n"); } IndexFileDeleter::~IndexFileDeleter(){ _CLDELETE(policy); commitsToDelete.clear(); commits.clear(); refCounts.clear(); } IndexFileDeleter::IndexFileDeleter(Directory* directory, IndexDeletionPolicy* policy, SegmentInfos* segmentInfos, std::ostream* infoStream, DocumentsWriter* docWriter): refCounts( RefCountsType(true,true) ), commits(CommitsType(true)) { this->docWriter = docWriter; this->infoStream = infoStream; if (infoStream != NULL) message( string("init: current segments file is \"") + segmentInfos->getCurrentSegmentFileName() + "\"; deletionPolicy=" + policy->getObjectName()); this->policy = policy; this->directory = directory; CommitPoint* currentCommitPoint = NULL; // First pass: walk the files and initialize our ref // counts: int64_t currentGen = segmentInfos->getGeneration(); const IndexFileNameFilter* filter = IndexFileNameFilter::getFilter(); vector files; if ( !directory->list(&files) ) _CLTHROWA(CL_ERR_IO, (string("cannot read directory ") + directory->toString() + ": list() returned NULL").c_str()); for(size_t i=0;iaccept(NULL, fileName.c_str()) && !fileName.compare(IndexFileNames::SEGMENTS_GEN) == 0) { // Add this file to refCounts with initial count 0: getRefCount(fileName.c_str()); if ( strncmp(fileName.c_str(), IndexFileNames::SEGMENTS, strlen(IndexFileNames::SEGMENTS)) == 0 ) { // This is a commit (segments or segments_N), and // it's valid (<= the max gen). Load it, then // incref all files it refers to: if (SegmentInfos::generationFromSegmentsFileName(fileName.c_str()) <= currentGen) { if (infoStream != NULL) { message("init: load commit \"" + fileName + "\""); } SegmentInfos sis; bool failed = false; try { sis.read(directory, fileName.c_str()); } catch (CLuceneError& e) { if ( e.number() != CL_ERR_IO ){ throw e; } // LUCENE-948: on NFS (and maybe others), if // you have writers switching back and forth // between machines, it's very likely that the // dir listing will be stale and will claim a // file segments_X exists when in fact it // doesn't. So, we catch this and handle it // as if the file does not exist if (infoStream != NULL) { message("init: hit FileNotFoundException when loading commit \"" + fileName + "\"; skipping this commit point32_t"); } failed = true; } if (!failed) { CommitPoint* commitPoint = _CLNEW CommitPoint(this,&sis); if (sis.getGeneration() == segmentInfos->getGeneration()) { currentCommitPoint = commitPoint; } commits.push_back(commitPoint); incRef(&sis, true); } } } } } if (currentCommitPoint == NULL) { // We did not in fact see the segments_N file // corresponding to the segmentInfos that was passed // in. Yet, it must exist, because our caller holds // the write lock. This can happen when the directory // listing was stale (eg when index accessed via NFS // client with stale directory listing cache). So we // try now to explicitly open this commit point32_t: SegmentInfos sis; try { sis.read(directory, segmentInfos->getCurrentSegmentFileName().c_str()); } catch (CLuceneError& e) { if ( e.number() == CL_ERR_IO ){ _CLTHROWA(CL_ERR_CorruptIndex, "failed to locate current segments_N file"); } } if (infoStream != NULL) message("forced open of current segments file " + segmentInfos->getCurrentSegmentFileName()); currentCommitPoint = _CLNEW CommitPoint(this,&sis); commits.push_back(currentCommitPoint); incRef(&sis, true); } // We keep commits list in sorted order (oldest to newest): std::sort(commits.begin(), commits.end(), CommitPoint::sort); // Now delete anything with ref count at 0. These are // presumably abandoned files eg due to crash of // IndexWriter. RefCountsType::iterator it = refCounts.begin(); while(it != refCounts.end()) { char* fileName = it->first; RefCount* rc = it->second; if (0 == rc->count) { if (infoStream != NULL) { message( string("init: removing unreferenced file \"") + fileName + "\""); } deleteFile(fileName); } it++; } // Finally, give policy a chance to remove things on // startup: policy->onInit(commits); // It's OK for the onInit to remove the current commit // point; we just have to checkpoint our in-memory // SegmentInfos to protect those files that it uses: if (currentCommitPoint->deleted) { checkpoint(segmentInfos, false); } deleteCommits(); } /** * Remove the CommitPoints in the commitsToDelete List by * DecRef'ing all files from each segmentInfos-> */ void IndexFileDeleter::deleteCommits() { int32_t size = commitsToDelete.size(); if (size > 0) { // First decref all files that had been referred to by // the now-deleted commits: for(int32_t i=0;igetSegmentsFileName() + "\""); } decRef(commit->files); } commitsToDelete.clear(); // Now compact commits to remove deleted ones (preserving the sort): size = commits.size(); int32_t readFrom = 0; int32_t writeTo = 0; while(readFrom < size) { CommitPoint* commit = (CommitPoint*)commits[readFrom]; if (!commit->deleted) { if (writeTo != readFrom) { commits.remove(readFrom,true); commits.remove(writeTo,false);//delete this one... if ( commits.size() == writeTo ) commits.push_back(commit); else commits[writeTo] = commit; } writeTo++; } readFrom++; } while(size > writeTo) { commits.remove(size-1); size--; } } } /** * Writer calls this when it has hit an error and had to * roll back, to tell us that there may now be * unreferenced files in the filesystem. So we re-list * the filesystem and delete such files. If segmentName * is non-NULL, we will only delete files corresponding to * that segment. */ void IndexFileDeleter::refresh(const char* segmentName) { vector files; if ( !directory->list(files) ) _CLTHROWA(CL_ERR_IO, (string("cannot read directory ") + directory->toString() + ": list() returned NULL").c_str() ); const IndexFileNameFilter* filter = IndexFileNameFilter::getFilter(); string segmentPrefix1; string segmentPrefix2; if (segmentName != NULL) { segmentPrefix1 = string(segmentName) + "."; segmentPrefix2 = string(segmentName) + "_"; } for(size_t i=0;iaccept(NULL, fileName.c_str()) && ( (segmentName==NULL || fileName.compare(0,segmentPrefix1.length(),segmentPrefix1) == 0 || fileName.compare(0,segmentPrefix2.length(),segmentPrefix2)==0) && refCounts.find((char*)fileName.c_str())== refCounts.end() && fileName.compare(IndexFileNames::SEGMENTS_GEN)!=0) ){ // Unreferenced file, so remove it if (infoStream != NULL) { message( string("refresh [prefix=") + segmentName + "]: removing newly created unreferenced file \"" + fileName + "\""); } deleteFile(fileName.c_str()); } } } void IndexFileDeleter::refresh() { refresh(NULL); } void IndexFileDeleter::close() { deletePendingFiles(); } void IndexFileDeleter::deletePendingFiles() { if (!deletable.empty()) { vector oldDeletable; oldDeletable.insert(oldDeletable.end(),deletable.begin(),deletable.end()); deletable.clear(); int32_t size = oldDeletable.size(); for(int32_t i=0;igetCurrentSegmentFileName() + "\" [" + Misc::toString(segmentInfos->size()) + " segments ; isCommit = " + Misc::toString(isCommit) + "]"); } // Try again now to delete any previously un-deletable // files (because they were in use, on Windows): deletePendingFiles(); // Incref the files: incRef(segmentInfos, isCommit); const vector* docWriterFiles = NULL; if (docWriter != NULL) { docWriterFiles = &docWriter->files(); if (!docWriterFiles->empty()) incRef(*docWriterFiles); else docWriterFiles = NULL; } if (isCommit) { // Append to our commits list: commits.push_back(_CLNEW CommitPoint(this, segmentInfos)); // Tell policy so it can remove commits: policy->onCommit(commits); // Decref files for commits that were deleted by the policy: deleteCommits(); } // DecRef old files from the last checkpoint, if any: int32_t size = lastFiles.size(); if (size > 0) { for(int32_t i=0;isize(); for(int32_t i=0;iinfo(i); if (segmentInfo->dir == directory) { const vector& files = segmentInfo->files(); lastFiles.insert(lastFiles.end(), files.begin(), files.end()); } } } if (docWriterFiles != NULL) lastFiles.insert(lastFiles.end(), docWriterFiles->begin(),docWriterFiles->end()); } void IndexFileDeleter::incRef(SegmentInfos* segmentInfos, bool isCommit) { int32_t size = segmentInfos->size(); for(int32_t i=0;iinfo(i); if (segmentInfo->dir == directory) { incRef(segmentInfo->files()); } } if (isCommit) { // Since this is a commit point32_t, also incref its // segments_N file: getRefCount(segmentInfos->getCurrentSegmentFileName().c_str())->IncRef(); } } void IndexFileDeleter::incRef(const vector& files) { int32_t size = files.size(); for(int32_t i=0;icount)); } rc->IncRef(); } } void IndexFileDeleter::decRef(const vector& files) { int32_t size = files.size(); for(int32_t i=0;icount)); } if (0 == rc->DecRef()) { // This file is no int32_t64_ter referenced by any past // commit point32_ts nor by the in-memory SegmentInfos: deleteFile(fileName.c_str()); refCounts.remove((char*)fileName.c_str()); } } void IndexFileDeleter::decRef(SegmentInfos* segmentInfos) { int32_t size = segmentInfos->size(); for(int32_t i=0;iinfo(i); if (segmentInfo->dir == directory) { decRef(segmentInfo->files()); } } } IndexFileDeleter::RefCount* IndexFileDeleter::getRefCount(const char* fileName) { RefCount* rc; RefCountsType::iterator itr = refCounts.find((char*)fileName); if (itr == refCounts.end()) { rc = _CLNEW RefCount(); refCounts.put( STRDUP_AtoA(fileName), rc); } else { rc = itr->second; } return rc; } void IndexFileDeleter::deleteFiles(vector& files) { int32_t size = files.size(); for(int32_t i=0;i& files) { int32_t size = files.size(); for(int32_t i=0;ideleteFile(fileName); } catch (CLuceneError& e) { // if delete fails if ( e.number() != CL_ERR_IO ){ throw e; } if (directory->fileExists(fileName)) { // Some operating systems (e.g. Windows) don't // permit a file to be deleted while it is opened // for read (e.g. by another process or thread). So // we assume that when a delete fails it is because // the file is open in another process, and queue // the file for subsequent deletion. if (infoStream != NULL) { message(string("IndexFileDeleter: unable to remove file \"") + fileName + "\": " + e.what() + "; Will re-try later."); } deletable.push_back(fileName); // add to deletable } } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexFileNameFilter.cpp000066400000000000000000000047651154025176300247330ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_IndexFileNameFilter.h" #include "_IndexFileNames.h" CL_NS_DEF(index) FilenameFilter::~FilenameFilter(){ } IndexFileNameFilter* IndexFileNameFilter::_singleton = NULL; IndexFileNameFilter* IndexFileNameFilter::singleton(){ if ( _singleton == NULL ) _singleton = _CLNEW IndexFileNameFilter(); return _singleton; } void IndexFileNameFilter::_shutdown(){ _CLDELETE(_singleton); } IndexFileNameFilter::IndexFileNameFilter() { size_t i; for ( i = 0; i < IndexFileNames::INDEX_EXTENSIONS().length; ++i) { extensions.insert(IndexFileNames::INDEX_EXTENSIONS()[i]); } for ( i = 0; i < IndexFileNames::INDEX_EXTENSIONS_IN_COMPOUND_FILE().length; ++i) { extensionsInCFS.insert(IndexFileNames::INDEX_EXTENSIONS_IN_COMPOUND_FILE()[i]); } } IndexFileNameFilter::~IndexFileNameFilter(){ } bool IndexFileNameFilter::accept(const char* /*dir*/, const char* name) const { string _name(name); size_t i = _name.find_last_of('.'); if (i != string::npos) { const char* extension = name + 1 + i; char* tmp; if (extensions.find(extension) != extensions.end()) { return true; } size_t l = _name.length(); if (*extension == 'f' && strtol(extension+1, &tmp,10)>= 0 && tmp == (extension+l) ) { //check for f001 return true; } else if (*extension == 's' && strtol(extension+1, &tmp,10)>= 0 && tmp == (extension+l)) { return true; } } else { if ( strcmp(name, IndexFileNames::DELETABLE) == 0 ) return true; else if ( strncmp(name, IndexFileNames::SEGMENTS, strlen(IndexFileNames::SEGMENTS)) == 0 ) return true; } return false; } bool IndexFileNameFilter::isCFSFile(const char* name) const { string _name(name); size_t i = _name.find_last_of('.'); if (i != string::npos) { const char* extension = name + 1 + i; char* tmp; if (extensionsInCFS.find(extension) != extensionsInCFS.end() ) { return true; } size_t l = _name.length(); if (*extension == 'f' && strtol(extension+1, &tmp,10)>= 0 && tmp == (extension+l)) { return true; } } return false; } const IndexFileNameFilter* IndexFileNameFilter::getFilter() { return singleton(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexFileNames.cpp000066400000000000000000000156671154025176300237530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_IndexFileNames.h" #include "_SegmentInfos.h" #include "CLucene/util/Misc.h" CL_NS_DEF(index) const char* IndexFileNames::SEGMENTS = "segments"; const char* IndexFileNames::SEGMENTS_GEN = "segments.gen"; const char* IndexFileNames::DELETABLE = "deletable"; const char* IndexFileNames::NORMS_EXTENSION = "nrm"; const char* IndexFileNames::FREQ_EXTENSION = "frq"; const char* IndexFileNames::PROX_EXTENSION = "prx"; const char* IndexFileNames::TERMS_EXTENSION = "tis"; const char* IndexFileNames::TERMS_INDEX_EXTENSION = "tii"; const char* IndexFileNames::FIELDS_INDEX_EXTENSION = "fdx"; const char* IndexFileNames::FIELDS_EXTENSION = "fdt"; const char* IndexFileNames::VECTORS_FIELDS_EXTENSION = "tvf"; const char* IndexFileNames::VECTORS_DOCUMENTS_EXTENSION = "tvd"; const char* IndexFileNames::VECTORS_INDEX_EXTENSION = "tvx"; const char* IndexFileNames::COMPOUND_FILE_EXTENSION = "cfs"; const char* IndexFileNames::COMPOUND_FILE_STORE_EXTENSION = "cfx"; const char* IndexFileNames::DELETES_EXTENSION = "del"; const char* IndexFileNames::FIELD_INFOS_EXTENSION = "fnm"; const char* IndexFileNames::PLAIN_NORMS_EXTENSION = "f"; const char* IndexFileNames::SEPARATE_NORMS_EXTENSION = "s"; const char* IndexFileNames::GEN_EXTENSION = "gen"; const char* IndexFileNames_INDEX_EXTENSIONS_s[] = { IndexFileNames::COMPOUND_FILE_EXTENSION, IndexFileNames::FIELD_INFOS_EXTENSION, IndexFileNames::FIELDS_INDEX_EXTENSION, IndexFileNames::FIELDS_EXTENSION, IndexFileNames::TERMS_INDEX_EXTENSION, IndexFileNames::TERMS_EXTENSION, IndexFileNames::FREQ_EXTENSION, IndexFileNames::PROX_EXTENSION, IndexFileNames::DELETES_EXTENSION, IndexFileNames::VECTORS_INDEX_EXTENSION, IndexFileNames::VECTORS_DOCUMENTS_EXTENSION, IndexFileNames::VECTORS_FIELDS_EXTENSION, IndexFileNames::GEN_EXTENSION, IndexFileNames::NORMS_EXTENSION, IndexFileNames::COMPOUND_FILE_STORE_EXTENSION }; CL_NS(util)::ConstValueArray IndexFileNames::_INDEX_EXTENSIONS; CL_NS(util)::ConstValueArray& IndexFileNames::INDEX_EXTENSIONS(){ if ( _INDEX_EXTENSIONS.length == 0 ){ _INDEX_EXTENSIONS.values = IndexFileNames_INDEX_EXTENSIONS_s; _INDEX_EXTENSIONS.length = 15; } return _INDEX_EXTENSIONS; } const char* IndexFileNames_INDEX_EXTENSIONS_IN_COMPOUND_FILE_s[] = { IndexFileNames::FIELD_INFOS_EXTENSION, IndexFileNames::FIELDS_INDEX_EXTENSION, IndexFileNames::FIELDS_EXTENSION, IndexFileNames::TERMS_INDEX_EXTENSION, IndexFileNames::TERMS_EXTENSION, IndexFileNames::FREQ_EXTENSION, IndexFileNames::PROX_EXTENSION, IndexFileNames::VECTORS_INDEX_EXTENSION, IndexFileNames::VECTORS_DOCUMENTS_EXTENSION, IndexFileNames::VECTORS_FIELDS_EXTENSION, IndexFileNames::NORMS_EXTENSION }; CL_NS(util)::ConstValueArray IndexFileNames::_INDEX_EXTENSIONS_IN_COMPOUND_FILE; CL_NS(util)::ConstValueArray& IndexFileNames::INDEX_EXTENSIONS_IN_COMPOUND_FILE(){ if ( _INDEX_EXTENSIONS_IN_COMPOUND_FILE.length == 0 ){ _INDEX_EXTENSIONS_IN_COMPOUND_FILE.values = IndexFileNames_INDEX_EXTENSIONS_IN_COMPOUND_FILE_s; _INDEX_EXTENSIONS_IN_COMPOUND_FILE.length = 11; } return _INDEX_EXTENSIONS_IN_COMPOUND_FILE; } const char* IndexFileNames_STORE_INDEX_EXTENSIONS_s[] = { IndexFileNames::VECTORS_INDEX_EXTENSION, IndexFileNames::VECTORS_FIELDS_EXTENSION, IndexFileNames::VECTORS_DOCUMENTS_EXTENSION, IndexFileNames::FIELDS_INDEX_EXTENSION, IndexFileNames::FIELDS_EXTENSION }; CL_NS(util)::ConstValueArray IndexFileNames::_STORE_INDEX_EXTENSIONS; CL_NS(util)::ConstValueArray& IndexFileNames::STORE_INDEX_EXTENSIONS(){ if ( _STORE_INDEX_EXTENSIONS.length == 0 ){ _STORE_INDEX_EXTENSIONS.values = IndexFileNames_STORE_INDEX_EXTENSIONS_s; _STORE_INDEX_EXTENSIONS.length = 5; } return _STORE_INDEX_EXTENSIONS; } const char* IndexFileNames_NON_STORE_INDEX_EXTENSIONS_s[] = { IndexFileNames::FIELD_INFOS_EXTENSION, IndexFileNames::FREQ_EXTENSION, IndexFileNames::PROX_EXTENSION, IndexFileNames::TERMS_EXTENSION, IndexFileNames::TERMS_INDEX_EXTENSION, IndexFileNames::NORMS_EXTENSION }; CL_NS(util)::ConstValueArray IndexFileNames::_NON_STORE_INDEX_EXTENSIONS; CL_NS(util)::ConstValueArray& IndexFileNames::NON_STORE_INDEX_EXTENSIONS(){ if ( _NON_STORE_INDEX_EXTENSIONS.length == 0 ){ _NON_STORE_INDEX_EXTENSIONS.values = IndexFileNames_NON_STORE_INDEX_EXTENSIONS_s; _NON_STORE_INDEX_EXTENSIONS.length = 6; } return _NON_STORE_INDEX_EXTENSIONS; } const char* IndexFileNames_COMPOUND_EXTENSIONS_s[] = { IndexFileNames::FIELD_INFOS_EXTENSION, IndexFileNames::FREQ_EXTENSION, IndexFileNames::PROX_EXTENSION, IndexFileNames::FIELDS_INDEX_EXTENSION, IndexFileNames::FIELDS_EXTENSION, IndexFileNames::TERMS_INDEX_EXTENSION, IndexFileNames::TERMS_EXTENSION }; CL_NS(util)::ConstValueArray IndexFileNames::_COMPOUND_EXTENSIONS; CL_NS(util)::ConstValueArray& IndexFileNames::COMPOUND_EXTENSIONS(){ if ( _COMPOUND_EXTENSIONS.length == 0 ){ _COMPOUND_EXTENSIONS.values = IndexFileNames_COMPOUND_EXTENSIONS_s; _COMPOUND_EXTENSIONS.length = 7; } return _COMPOUND_EXTENSIONS; } const char* IndexFileNames_VECTOR_EXTENSIONS_s[] = { IndexFileNames::VECTORS_INDEX_EXTENSION, IndexFileNames::VECTORS_DOCUMENTS_EXTENSION, IndexFileNames::VECTORS_FIELDS_EXTENSION }; CL_NS(util)::ConstValueArray IndexFileNames::_VECTOR_EXTENSIONS; CL_NS(util)::ConstValueArray& IndexFileNames::VECTOR_EXTENSIONS(){ if ( _VECTOR_EXTENSIONS.length == 0 ){ _VECTOR_EXTENSIONS.values = IndexFileNames_VECTOR_EXTENSIONS_s; _VECTOR_EXTENSIONS.length = 3; } return _VECTOR_EXTENSIONS; } string IndexFileNames::fileNameFromGeneration( const char* base, const char* extension, int64_t gen ) { if ( gen == SegmentInfo::NO ) { return ""; } else if ( gen == SegmentInfo::WITHOUT_GEN ) { return string(base) + extension; } else { char buf[(sizeof(unsigned long) << 3) + 1]; CL_NS(util)::Misc::longToBase( gen, 36, buf ); return string(base) + "_" + buf + extension; } } bool IndexFileNames::isDocStoreFile( const char* fileName ) { const char* p = strchr( fileName, (int)'.' ); if ( p != NULL && strcmp( p+1, COMPOUND_FILE_STORE_EXTENSION ) == 0 ) { return true; } for ( int32_t i = 0; i < STORE_INDEX_EXTENSIONS().length; i++ ) { if ( p != NULL && strcmp( p+1, STORE_INDEX_EXTENSIONS()[i] ) == 0 ) { return true; } } return false; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexModifier.cpp000066400000000000000000000166031154025176300236350ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexModifier.h" #include "IndexWriter.h" #include "IndexReader.h" #include "CLucene/store/FSDirectory.h" #include "CLucene/document/Document.h" #include "MergeScheduler.h" CL_NS_DEF(index) CL_NS_USE(util) CL_NS_USE(store) CL_NS_USE(analysis) CL_NS_USE(document) IndexModifier::IndexModifier(Directory* directory, Analyzer* analyzer, bool create) { init(directory, analyzer, create); } IndexModifier::IndexModifier(const char* dirName, Analyzer* analyzer, bool create) { Directory* dir = FSDirectory::getDirectory(dirName); init(dir, analyzer, create); } void IndexModifier::init(Directory* directory, Analyzer* analyzer, bool create) { indexWriter = NULL; indexReader = NULL; open = false; infoStream = NULL; useCompoundFile = true; this->maxBufferedDocs = IndexWriter::DEFAULT_MAX_BUFFERED_DOCS; this->maxFieldLength = IndexWriter::DEFAULT_MAX_FIELD_LENGTH; this->mergeFactor = IndexWriter::DEFAULT_MERGE_FACTOR; this->directory = _CL_POINTER(directory); SCOPED_LOCK_MUTEX(directory->THIS_LOCK) this->analyzer = analyzer; indexWriter = _CLNEW IndexWriter(directory, analyzer, create); open = true; } IndexModifier::~IndexModifier(){ if (open) { close(); } } void IndexModifier::assureOpen() const{ if (!open) { _CLTHROWA(CL_ERR_IllegalState,"Index is closed"); } } void IndexModifier::createIndexWriter(bool create) { if (indexWriter == NULL) { if (indexReader != NULL) { indexReader->close(); _CLDELETE(indexReader); } indexWriter = _CLNEW IndexWriter(directory, analyzer, false); // IndexModifier cannot use ConcurrentMergeScheduler // because it synchronizes on the directory which can // cause deadlock indexWriter->setMergeScheduler(_CLNEW SerialMergeScheduler()); indexWriter->setInfoStream(infoStream); indexWriter->setUseCompoundFile(useCompoundFile); if (maxBufferedDocs != IndexWriter::DISABLE_AUTO_FLUSH) indexWriter->setMaxBufferedDocs(maxBufferedDocs); indexWriter->setMaxFieldLength(maxFieldLength); indexWriter->setMergeFactor(mergeFactor); } } void IndexModifier::createIndexReader() { if (indexReader == NULL) { if (indexWriter != NULL) { indexWriter->close(); _CLDELETE(indexWriter); } indexReader = IndexReader::open(directory); } } void IndexModifier::flush() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); if (indexWriter != NULL) { indexWriter->close(); _CLDELETE(indexWriter); createIndexWriter(); } else { indexReader->close(); _CLDELETE(indexReader); createIndexReader(); } } void IndexModifier::addDocument(Document* doc, Analyzer* docAnalyzer) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexWriter(); if (docAnalyzer != NULL) indexWriter->addDocument(doc, docAnalyzer); else indexWriter->addDocument(doc); } int32_t IndexModifier::deleteDocuments(Term* term) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexReader(); return indexReader->deleteDocuments(term); } void IndexModifier::deleteDocument(int32_t docNum) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexReader(); indexReader->deleteDocument(docNum); } int32_t IndexModifier::docCount() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); if (indexWriter != NULL) return indexWriter->docCount(); else return indexReader->numDocs(); } void IndexModifier::optimize() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexWriter(); indexWriter->optimize(); } void IndexModifier::setUseCompoundFile(bool useCompoundFile) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); if (indexWriter != NULL) indexWriter->setUseCompoundFile(useCompoundFile); this->useCompoundFile = useCompoundFile; } bool IndexModifier::getUseCompoundFile() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexWriter(); return indexWriter->getUseCompoundFile(); } void IndexModifier::setMaxFieldLength(int32_t maxFieldLength) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); if (indexWriter != NULL) indexWriter->setMaxFieldLength(maxFieldLength); this->maxFieldLength = maxFieldLength; } int32_t IndexModifier::getMaxFieldLength() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexWriter(); return indexWriter->getMaxFieldLength(); } void IndexModifier::setMaxBufferedDocs(int32_t maxBufferedDocs) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); if (indexWriter != NULL) indexWriter->setMaxBufferedDocs(maxBufferedDocs); this->maxBufferedDocs = maxBufferedDocs; } int32_t IndexModifier::getMaxBufferedDocs() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexWriter(); return indexWriter->getMaxBufferedDocs(); } void IndexModifier::setMergeFactor(int32_t mergeFactor) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); if (indexWriter != NULL) indexWriter->setMergeFactor(mergeFactor); this->mergeFactor = mergeFactor; } int32_t IndexModifier::getMergeFactor() { SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexWriter(); return indexWriter->getMergeFactor(); } void IndexModifier::close() { if (!open) _CLTHROWA(CL_ERR_IllegalState, "Index is closed already"); SCOPED_LOCK_MUTEX(directory->THIS_LOCK) if (indexWriter != NULL) { indexWriter->close(); _CLDELETE(indexWriter); } else if (indexReader != NULL) { indexReader->close(); _CLDELETE(indexReader); } _CLDECDELETE(directory) open = false; } string IndexModifier::toString() const{ return string("Index@") + directory->toString(); } int64_t IndexModifier::getCurrentVersion() const{ SCOPED_LOCK_MUTEX(directory->THIS_LOCK) return IndexReader::getCurrentVersion(directory); } TermDocs* IndexModifier::termDocs(Term* term){ SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexReader(); return indexReader->termDocs(term); } TermEnum* IndexModifier::terms(Term* term){ SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexReader(); if ( term != NULL ) return indexReader->terms(term); else return indexReader->terms(); } CL_NS(document)::Document* IndexModifier::document(const int32_t n){ Document* ret = _CLNEW Document; if (!document(n, *ret) ) _CLDELETE(ret); return ret; } bool IndexModifier::document(int32_t n, CL_NS(document)::Document* doc){ SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexReader(); return indexReader->document(n, *doc); } bool IndexModifier::document(int32_t n, CL_NS(document)::Document& doc){ SCOPED_LOCK_MUTEX(directory->THIS_LOCK) assureOpen(); createIndexReader(); return indexReader->document(n, doc); } CL_NS(store)::Directory* IndexModifier::getDirectory(){ return directory; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexModifier.h000066400000000000000000000266721154025176300233110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_IndexModifier_ #define _lucene_index_IndexModifier_ CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(document,Document) CL_CLASS_DEF(index, IndexWriter) CL_CLASS_DEF(index, IndexReader) CL_CLASS_DEF(index, Term) CL_CLASS_DEF(index, TermDocs) CL_CLASS_DEF(index, TermEnum) #include "CLucene/analysis/AnalysisHeader.h" CL_NS_DEF(index) /** *

[Note that as of 2.1, all but one of the * methods in this class are available via {@link * IndexWriter}. The one method that is not available is * {@link #deleteDocument(int)}.]

* * A class to modify an index, i.e. to delete and add documents. This * class hides {@link IndexReader} and {@link IndexWriter} so that you * do not need to care about implementation details such as that adding * documents is done via IndexWriter and deletion is done via IndexReader. * *

Note that you cannot create more than one IndexModifier object * on the same directory at the same time. * *

Example usage: * *

* * * * *
* * //note this code will leak memory :) * Analyzer* analyzer = new StandardAnalyzer();
* // create an index in /tmp/index, overwriting an existing one:
* IndexModifier* indexModifier = new IndexModifier("/tmp/index", analyzer, true);
* Document* doc = new Document*();
* doc->add(*new Field("id", "1", Field::STORE_YES| Field::INDEX_UNTOKENIZED));
* doc->add(*new Field("body", "a simple test", Field::STORE_YES, Field::INDEX_TOKENIZED));
* indexModifier->addDocument(doc);
* int32_t deleted = indexModifier->deleteDocuments(new Term("id", "1"));
* printf("Deleted %d document", deleted);
* indexModifier->flush();
* printf( "$d docs in index", indexModifier->docCount() );
* indexModifier->close(); *
*
* *

Not all methods of IndexReader and IndexWriter are offered by this * class. If you need access to additional methods, either use those classes * directly or implement your own class that extends IndexModifier. * *

Although an instance of this class can be used from more than one * thread, you will not get the best performance. You might want to use * IndexReader and IndexWriter directly for that (but you will need to * care about synchronization yourself then). * *

While you can freely mix calls to add() and delete() using this class, * you should batch you calls for best performance. For example, if you * want to update 20 documents, you should first delete all those documents, * then add all the new documents. * * @deprecated Please use {@link IndexWriter} instead. */ class CLUCENE_EXPORT IndexModifier { protected: IndexWriter* indexWriter; IndexReader* indexReader; CL_NS(store)::Directory* directory; CL_NS(analysis)::Analyzer* analyzer; bool open; // Lucene defaults: std::ostream* infoStream; bool useCompoundFile; int32_t maxBufferedDocs; int32_t maxFieldLength; int32_t mergeFactor; public: /** * Open an index with write access. * * @param directory the index directory * @param analyzer the analyzer to use for adding new documents * @param create true to create the index or overwrite the existing one; * false to append to the existing index */ IndexModifier(CL_NS(store)::Directory* directory, CL_NS(analysis)::Analyzer* analyzer, bool create); /** * Open an index with write access. * * @param dirName the index directory * @param analyzer the analyzer to use for adding new documents * @param create true to create the index or overwrite the existing one; * false to append to the existing index */ IndexModifier(const char* dirName, CL_NS(analysis)::Analyzer* analyzer, bool create); virtual ~IndexModifier(); protected: /** * Initialize an IndexWriter. * @throws IOException */ void init(CL_NS(store)::Directory* directory, CL_NS(analysis)::Analyzer* analyzer, bool create); /** * Throw an IllegalStateException if the index is closed. * @throws IllegalStateException */ void assureOpen() const; /** * Close the IndexReader and open an IndexWriter. * @throws IOException */ void createIndexWriter(bool create = false); /** * Close the IndexWriter and open an IndexReader. * @throws IOException */ void createIndexReader(); public: /** * Make sure all changes are written to disk. * @throws IOException */ void flush(); /** * Adds a document to this index, using the provided analyzer instead of the * one specific in the constructor. If the document contains more than * {@link #setMaxFieldLength(int32_t)} terms for a given field, the remainder are * discarded. * @see IndexWriter#addDocument(Document*, Analyzer*) * @throws IllegalStateException if the index is closed */ void addDocument(CL_NS(document)::Document* doc, CL_NS(analysis)::Analyzer* docAnalyzer=NULL); /** * Deletes all documents containing term. * This is useful if one uses a document field to hold a unique ID string for * the document. Then to delete such a document, one merely constructs a * term with the appropriate field and the unique ID string as its text and * passes it to this method. Returns the number of documents deleted. * @return the number of documents deleted * @see IndexReader#deleteDocuments(Term*) * @throws IllegalStateException if the index is closed */ int32_t deleteDocuments(Term* term); /** * Deletes the document numbered docNum. * @see IndexReader#deleteDocument(int32_t) * @throws IllegalStateException if the index is closed */ void deleteDocument(int32_t docNum); /** * Returns the number of documents currently in this index. * @see IndexWriter#docCount() * @see IndexReader#numDocs() * @throws IllegalStateException if the index is closed */ int32_t docCount(); /** * Merges all segments together into a single segment, optimizing an index * for search. * @see IndexWriter#optimize() * @throws IllegalStateException if the index is closed */ void optimize(); /** * Setting to turn on usage of a compound file. When on, multiple files * for each segment are merged into a single file once the segment creation * is finished. This is done regardless of what directory is in use. * @see IndexWriter#setUseCompoundFile(bool) * @throws IllegalStateException if the index is closed */ void setUseCompoundFile(bool useCompoundFile); /** * @throws IOException * @see IndexModifier#setUseCompoundFile(bool) */ bool getUseCompoundFile(); /** * The maximum number of terms that will be indexed for a single field in a * document. This limits the amount of memory required for indexing, so that * collections with very large files will not crash the indexing process by * running out of memory.

* Note that this effectively truncates large documents, excluding from the * index terms that occur further in the document. If you know your source * documents are large, be sure to set this value high enough to accomodate * the expected size. If you set it to Integer.MAX_VALUE, then the only limit * is your memory, but you should anticipate an OutOfMemoryError.

* By default, no more than 10,000 terms will be indexed for a field. * @see IndexWriter#setMaxFieldLength(int32_t) * @throws IllegalStateException if the index is closed */ void setMaxFieldLength(int32_t maxFieldLength); /** * @throws IOException * @see IndexModifier#setMaxFieldLength(int32_t) */ int32_t getMaxFieldLength(); /** * The maximum number of terms that will be indexed for a single field in a * document. This limits the amount of memory required for indexing, so that * collections with very large files will not crash the indexing process by * running out of memory.

* Note that this effectively truncates large documents, excluding from the * index terms that occur further in the document. If you know your source * documents are large, be sure to set this value high enough to accomodate * the expected size. If you set it to Integer.MAX_VALUE, then the only limit * is your memory, but you should anticipate an OutOfMemoryError.

* By default, no more than 10,000 terms will be indexed for a field. * @see IndexWriter#setMaxBufferedDocs(int32_t) * @throws IllegalStateException if the index is closed */ void setMaxBufferedDocs(int32_t maxBufferedDocs); /** * @throws IOException * @see IndexModifier#setMaxBufferedDocs(int32_t) */ int32_t getMaxBufferedDocs(); /** * Determines how often segment indices are merged by addDocument(). With * smaller values, less RAM is used while indexing, and searches on * unoptimized indices are faster, but indexing speed is slower. With larger * values, more RAM is used during indexing, and while searches on unoptimized * indices are slower, indexing is faster. Thus larger values (> 10) are best * for batch index creation, and smaller values (< 10) for indices that are * interactively maintained. *

This must never be less than 2. The default value is 10. * * @see IndexWriter#setMergeFactor(int32_t) * @throws IllegalStateException if the index is closed */ void setMergeFactor(int32_t mergeFactor); /** * @throws IOException * @see IndexModifier#setMergeFactor(int32_t) */ int32_t getMergeFactor(); /** * Close this index, writing all pending changes to disk. * * @throws IllegalStateException if the index has been closed before already */ void close(); std::string toString() const; /** * Gets the version number of the currently open index. */ int64_t getCurrentVersion() const; /** * Returns an enumeration of all the documents which contain term. * * Warning: This is not threadsafe. Make sure you lock the modifier object * while using the TermDocs. If the IndexReader that the modifier manages * is closed, the TermDocs object will fail. */ TermDocs* termDocs(Term* term=NULL); /** * Returns an enumeration of all terms after a given term. * If no term is given, an enumeration of all the terms * in the index is returned. * The enumeration is ordered by Term.compareTo(). Each term * is greater than all that precede it in the enumeration. * * Warning: This is not threadsafe. Make sure you lock the modifier object * while using the TermDocs. If the IndexReader that the modifier manages * is closed, the Document will be invalid */ TermEnum* terms(Term* term=NULL); /** * Returns the stored fields of the n-th Document in this index. * * Warning: This is not threadsafe. Make sure you lock the modifier object * while using the TermDocs. If the IndexReader that the modifier manages * is closed, the Document will be invalid */ bool document(const int32_t n, CL_NS(document)::Document& doc); _CL_DEPRECATED( document(i, Document&) )bool document(const int32_t n, CL_NS(document)::Document* doc); _CL_DEPRECATED( document(i, document) ) CL_NS(document)::Document* document(const int32_t n); /** * Returns the directory used by this index. */ CL_NS(store)::Directory* getDirectory(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/IndexReader.cpp000066400000000000000000000422021154025176300232730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexReader.h" #include "IndexWriter.h" #include "CLucene/store/Directory.h" #include "CLucene/store/FSDirectory.h" #include "CLucene/store/_Lock.h" #include "CLucene/document/Document.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/Misc.h" #include "_SegmentInfos.h" #include "_SegmentHeader.h" #include "MultiReader.h" #include "Terms.h" #include CL_NS_USE(util) CL_NS_USE(store) CL_NS_DEF(index) class IndexReaderFindSegmentsFile: public SegmentInfos::FindSegmentsFile{ public: IndexReaderFindSegmentsFile( CL_NS(store)::Directory* dir ): SegmentInfos::FindSegmentsFile(dir){ } IndexReaderFindSegmentsFile( const char* dir ): SegmentInfos::FindSegmentsFile(dir){ } uint64_t doBody(const char* segmentFileName){ return directory->fileModified(segmentFileName); } }; class CloseCallbackCompare:public CL_NS(util)::Compare::_base{ public: bool operator()( IndexReader::CloseCallback t1, IndexReader::CloseCallback t2 ) const{ return t1 > t2; } static void doDelete(IndexReader::CloseCallback /*dummy*/){ } }; class IndexReader::Internal: LUCENE_BASE{ public: /** * @deprecated will be deleted when IndexReader(Directory) is deleted * @see #directory() */ CL_NS(store)::Directory* directory; typedef CL_NS(util)::CLSet CloseCallbackMap; CloseCallbackMap closeCallbacks; Internal(Directory* directory, IndexReader* _this) { if ( directory != NULL ) this->directory = _CL_POINTER(directory); else this->directory = NULL; _this->closed = false; _this->hasChanges = false; } ~Internal(){ } }; IndexReader::IndexReader(Directory* dir){ //Constructor. //Func - Creates an instance of IndexReader //Pre - true //Post - An instance has been created with writeLock = NULL _internal = _CLNEW Internal(dir, this); } IndexReader::IndexReader(){ //Constructor. //Func - Creates an instance of IndexReader //Pre - true //Post - An instance has been created with writeLock = NULL _internal = _CLNEW Internal(NULL, this); } IndexReader::~IndexReader(){ //Func - Destructor // Destroys the instance and releases the writeLock if needed //Pre - true //Post - The instance has been destroyed if pre(writeLock) exists is has been released _CLLDELETE(_internal); } IndexReader* IndexReader::open(const char* path, bool closeDirectoryOnCleanup, IndexDeletionPolicy* deletionPolicy){ //Func - Static method. // Returns an IndexReader reading the index in an FSDirectory in the named path. //Pre - path != NULL and contains the path of the index for which an IndexReader must be // instantiated // closeDir indicates if the directory needs to be closed //Post - An IndexReader has been returned that reads tnhe index located at path CND_PRECONDITION(path != NULL, "path is NULL"); Directory* dir = FSDirectory::getDirectory(path); IndexReader* reader = open(dir,closeDirectoryOnCleanup,deletionPolicy); //because fsdirectory will now have a refcount of 1 more than //if the reader had been opened with a directory object, //we need to do a refdec _CLDECDELETE(dir); return reader; } IndexReader* IndexReader::open( Directory* directory, bool closeDirectory, IndexDeletionPolicy* deletionPolicy){ //Func - Static method. // Returns an IndexReader reading the index in an FSDirectory in the named path. //Pre - directory represents a directory // closeDir indicates if the directory needs to be closed //Post - An IndexReader has been returned that reads the index located at directory return DirectoryIndexReader::open(directory, closeDirectory, deletionPolicy); } IndexReader* IndexReader::reopen(){ _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support reopen()."); } CL_NS(store)::Directory* IndexReader::directory() { ensureOpen(); if (NULL != _internal->directory) { return _internal->directory; } else { _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support this method."); } } void IndexReader::ensureOpen(){ } void IndexReader::acquireWriteLock(){ SCOPED_LOCK_MUTEX(THIS_LOCK) /* NOOP */ } CL_NS(document)::Document* IndexReader::document(const int32_t n){ CL_NS(document)::Document* ret = _CLNEW CL_NS(document)::Document; if (!document(n,*ret) ) _CLDELETE(ret); return ret; } uint64_t IndexReader::lastModified(const char* directory2) { //Func - Static method // Returns the time the index in the named directory was last modified. //Pre - directory != NULL and contains the path name of the directory to check //Post - The last modified time of the index has been returned CND_PRECONDITION(directory2 != NULL, "directory is NULL"); IndexReaderFindSegmentsFile runner(directory2); return (uint64_t)runner.run(); } int64_t IndexReader::getCurrentVersion(Directory* directory) { return SegmentInfos::readCurrentVersion(directory); } int64_t IndexReader::getCurrentVersion(const char* directory){ Directory* dir = FSDirectory::getDirectory(directory); int64_t version = getCurrentVersion(dir); dir->close(); _CLDECDELETE(dir); return version; } int64_t IndexReader::getVersion() { _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support this method."); } void IndexReader::setTermInfosIndexDivisor(int32_t /*indexDivisor*/) { _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support this method."); } int32_t IndexReader::getTermInfosIndexDivisor() { _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support this method."); } bool IndexReader::isCurrent() { _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support this method."); } bool IndexReader::isOptimized() { _CLTHROWA(CL_ERR_UnsupportedOperation, "This reader does not support this method."); } uint64_t IndexReader::lastModified(Directory* directory2) { //Func - Static method // Returns the time the index in this directory was last modified. //Pre - directory contains a valid reference //Post - The last modified time of the index has been returned IndexReaderFindSegmentsFile runner(directory2); return (uint64_t)runner.run(); } void IndexReader::setNorm(int32_t doc, const TCHAR* field, uint8_t value){ SCOPED_LOCK_MUTEX(THIS_LOCK) this->ensureOpen(); this->acquireWriteLock(); this->hasChanges = true; this->doSetNorm(doc, field, value); } void IndexReader::setNorm(int32_t doc, const TCHAR* field, float_t value){ ensureOpen(); setNorm(doc, field, CL_NS(search)::Similarity::encodeNorm(value)); } bool IndexReader::indexExists(const char* directory){ //Func - Static method // Checks if an index exists in the named directory //Pre - directory != NULL //Post - Returns true if an index exists at the specified directory-> // If the directory does not exist or if there is no index in it. // false is returned. std::vector files; Misc::listFiles(directory, files); return SegmentInfos::getCurrentSegmentGeneration(files) != -1; } bool IndexReader::indexExists(const Directory* directory){ //Func - Static method // Checks if an index exists in the directory //Pre - directory is a valid reference //Post - Returns true if an index exists at the specified directory-> // If the directory does not exist or if there is no index in it. // false is returned. return SegmentInfos::getCurrentSegmentGeneration(directory) != -1; } TermDocs* IndexReader::termDocs(Term* term) { //Func - Returns an enumeration of all the documents which contain // term. For each document, the document number, the frequency of // the term in that document is also provided, for use in search scoring. // Thus, this method implements the mapping: // // Term => * // The enumeration is ordered by document number. Each document number // is greater than all that precede it in the enumeration. //Pre - term != NULL //Post - A reference to TermDocs containing an enumeration of all found documents // has been returned CND_PRECONDITION(term != NULL, "term is NULL"); ensureOpen(); //Reference an instantiated TermDocs instance TermDocs* _termDocs = termDocs(); //Seek all documents containing term _termDocs->seek(term); //return the enumaration return _termDocs; } TermPositions* IndexReader::termPositions(Term* term){ //Func - Returns an enumeration of all the documents which contain term. For each // document, in addition to the document number and frequency of the term in // that document, a list of all of the ordinal positions of the term in the document // is available. Thus, this method implements the mapping: // // Term => >* // // This positional information faciliates phrase and proximity searching. // The enumeration is ordered by document number. Each document number is greater than // all that precede it in the enumeration. //Pre - term != NULL //Post - A reference to TermPositions containing an enumeration of all found documents // has been returned CND_PRECONDITION(term != NULL, "term is NULL"); ensureOpen(); //Reference an instantiated termPositions instance TermPositions* _termPositions = termPositions(); //Seek all documents containing term _termPositions->seek(term); //return the enumeration return _termPositions; } bool IndexReader::document(int32_t n, CL_NS(document)::Document* doc){ return document(n, *doc); } bool IndexReader::document(int32_t n, CL_NS(document)::Document& doc){ ensureOpen(); return document(n, doc, NULL); } void IndexReader::deleteDoc(const int32_t docNum){ deleteDocument(docNum); } int32_t IndexReader::deleteTerm(Term* term){ return deleteDocuments(term); } void IndexReader::deleteDocument(const int32_t docNum) { //Func - Deletes the document numbered docNum. Once a document is deleted it will not appear // in TermDocs or TermPostitions enumerations. Attempts to read its field with the document // method will result in an error. The presence of this document may still be reflected in // the docFreq statistic, though this will be corrected eventually as the index is further modified. //Pre - docNum >= 0 //Post - If successful the document identified by docNum has been deleted. If no writelock // could be obtained an exception has been thrown stating that the index was locked or has no write access SCOPED_LOCK_MUTEX(THIS_LOCK) CND_PRECONDITION(docNum >= 0, "docNum is negative"); ensureOpen(); acquireWriteLock(); //Have the document identified by docNum deleted hasChanges = true; doDelete(docNum); } void IndexReader::flush() { SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); commit(); } void IndexReader::commit(){ SCOPED_LOCK_MUTEX(THIS_LOCK) if(hasChanges){ doCommit(); } hasChanges = false; } void IndexReader::undeleteAll(){ SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); acquireWriteLock(); hasChanges = true; doUndeleteAll(); } int32_t IndexReader::deleteDocuments(Term* term) { //Func - Deletes all documents containing term. This is useful if one uses a // document field to hold a unique ID string for the document. Then to delete such // a document, one merely constructs a term with the appropriate field and the unique // ID string as its text and passes it to this method. //Pre - term != NULL //Post - All documents containing term have been deleted. The number of deleted documents // has been returned CND_PRECONDITION(term != NULL, "term is NULL"); ensureOpen(); //Search for the documents contain term TermDocs* docs = termDocs(term); //Check if documents have been found if ( docs == NULL ){ return 0; } //initialize int32_t Counter = 0; try { //iterate through the found documents while (docs->next()) { //Delete the document deleteDocument(docs->doc()); ++Counter; } }_CLFINALLY( //Close the enumeration docs->close(); ); //Delete the enumeration of found documents _CLDELETE( docs ); //Return the number of deleted documents return Counter; } void IndexReader::close() { //Func - Closes files associated with this index and also saves any new deletions to disk. // No other methods should be called after this has been called. //Pre - true //Post - All files associated with this index have been deleted and new deletions have been // saved to disk SCOPED_LOCK_MUTEX(THIS_LOCK) if ( !closed ){ Internal::CloseCallbackMap::iterator iter = _internal->closeCallbacks.begin(); for ( ;iter!=_internal->closeCallbacks.end();iter++){ CloseCallback callback = *iter->first; callback(this,iter->second); } commit(); doClose(); } closed = true; } bool IndexReader::isLocked(Directory* directory) { //Func - Static method // Checks if the index in the directory is currently locked. //Pre - directory is a valid reference to a directory to check for a lock //Post - Returns true if the index in the named directory is locked otherwise false //Check the existence of the file write.lock and return true when it does and false //when it doesn't LuceneLock* l = directory->makeLock("write.lock"); bool ret = l->isLocked(); _CLDELETE(l); return ret; } bool IndexReader::isLocked(const char* directory) { //Func - Static method // Checks if the index in the named directory is currently locked. //Pre - directory != NULL and contains the directory to check for a lock //Post - Returns true if the index in the named directory is locked otherwise false CND_PRECONDITION(directory != NULL, "directory is NULL"); Directory* dir = FSDirectory::getDirectory(directory); bool ret = isLocked(dir); dir->close(); _CLDECDELETE(dir); return ret; } bool IndexReader::hasNorms(const TCHAR* field) { // backward compatible implementation. // SegmentReader has an efficient implementation. ensureOpen(); return norms(field) != NULL; } void IndexReader::unlock(const char* path){ FSDirectory* dir = FSDirectory::getDirectory(path); unlock(dir); dir->close(); _CLDECDELETE(dir); } void IndexReader::unlock(Directory* directory){ //Func - Static method // Forcibly unlocks the index in the named directory-> // Caution: this should only be used by failure recovery code, // when it is known that no other process nor thread is in fact // currently accessing this index. //Pre - directory is a valid reference to a directory //Post - The directory has been forcibly unlocked LuceneLock* lock = directory->makeLock("write.lock"); lock->release(); _CLDELETE(lock); } bool IndexReader::isLuceneFile(const char* filename){ if ( !filename ) return false; size_t len = strlen(filename); if ( len < 6 ) //need at least x.frx return false; const char* ext=filename+len; while(*ext != '.' && ext!=filename) ext--; if ( strcmp(ext, ".cfs") == 0 ) return true; else if ( strcmp(ext, ".fnm") == 0 ) return true; else if ( strcmp(ext, ".fdx") == 0 ) return true; else if ( strcmp(ext, ".fdt") == 0 ) return true; else if ( strcmp(ext, ".tii") == 0 ) return true; else if ( strcmp(ext, ".tis") == 0 ) return true; else if ( strcmp(ext, ".frq") == 0 ) return true; else if ( strcmp(ext, ".prx") == 0 ) return true; else if ( strcmp(ext, ".del") == 0 ) return true; else if ( strcmp(ext, ".tvx") == 0 ) return true; else if ( strcmp(ext, ".tvd") == 0 ) return true; else if ( strcmp(ext, ".tvf") == 0 ) return true; else if ( strcmp(ext, ".tvp") == 0 ) return true; else if ( strcmp(filename, "segments") == 0 ) return true; else if ( strcmp(filename, "segments.new") == 0 ) return true; else if ( strcmp(filename, "deletable") == 0 ) return true; else if ( strncmp(ext,".f",2)==0 ){ const char* n = ext+2; if ( *n && _istdigit(*n) ) return true; } return false; } CL_NS(store)::Directory* IndexReader::getDirectory() { return directory(); } void IndexReader::addCloseCallback(CloseCallback callback, void* parameter){ _internal->closeCallbacks.put(callback, parameter); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexReader.h000066400000000000000000000666541154025176300227610ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_IndexReader_ #define _lucene_index_IndexReader_ #include "CLucene/util/Array.h" #include "CLucene/util/VoidList.h" #include "CLucene/LuceneThreads.h" CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(store,LuceneLock) CL_CLASS_DEF(document,Document) CL_CLASS_DEF(document,FieldSelector) CL_NS_DEF(index) class SegmentInfos; class TermFreqVector; class TermEnum; class Term; class TermDocs; class TermPositions; class IndexDeletionPolicy; class TermVectorMapper; /** IndexReader is an abstract class, providing an interface for accessing an index. Search of an index is done entirely through this abstract interface, so that any subclass which implements it is searchable.

Concrete subclasses of IndexReader are usually constructed with a call to one of the static open() methods, e.g. {@link #open(String)}.

For efficiency, in this API documents are often referred to via document numbers, non-negative integers which each name a unique document in the index. These document numbers are ephemeral--they may change as documents are added to and deleted from an index. Clients should thus not rely on a given document having the same number between sessions.

An IndexReader can be opened on a directory for which an IndexWriter is opened already, but it cannot be used to delete documents from the index then.

NOTE: for backwards API compatibility, several methods are not listed as abstract, but have no useful implementations in this base class and instead always throw UnsupportedOperationException. Subclasses are strongly encouraged to override these methods, but in many cases may not need to.

*/ class CLUCENE_EXPORT IndexReader: public CL_NS(util)::NamedObject{ bool closed; protected: bool hasChanges; /** * Legacy Constructor for backwards compatibility. * *

* This Constructor should not be used, it exists for backwards * compatibility only to support legacy subclasses that did not "own" * a specific directory, but needed to specify something to be returned * by the directory() method. Future subclasses should delegate to the * no arg constructor and implement the directory() method as appropriate. * * @param directory Directory to be returned by the directory() method * @see #directory() * @deprecated - use IndexReader() */ IndexReader(CL_NS(store)::Directory* dir); IndexReader(); /// Implements close. virtual void doClose() = 0; /** Implements setNorm in subclass.*/ virtual void doSetNorm(int32_t doc, const TCHAR* field, uint8_t value) = 0; /** Implements actual undeleteAll() in subclass. */ virtual void doUndeleteAll() = 0; /** Implements deletion of the document numbered docNum. * Applications should call {@link #deleteDocument(int32_t)} or {@link #deleteDocuments(Term*)}. */ virtual void doDelete(const int32_t docNum) = 0; /** * @throws AlreadyClosedException if this IndexReader is closed */ virtual void ensureOpen(); /** Does nothing by default. Subclasses that require a write lock for * index modifications must implement this method. */ virtual void acquireWriteLock(); public: //Callback for classes that need to know if IndexReader is closing. typedef void (*CloseCallback)(IndexReader*, void*); /** Internal use. Implements commit */ virtual void doCommit() = 0; /** Internal use. */ class Internal; /** Internal use. */ Internal* _internal; /** * Constants describing field properties, for example used for * {@link IndexReader#getFieldNames(FieldOption)}. */ enum FieldOption { /** all fields */ ALL = 1, /** all indexed fields */ INDEXED = 2, /** all fields which are not indexed */ UNINDEXED = 4, /** all fields which are indexed with termvectors enables */ INDEXED_WITH_TERMVECTOR = 8, /** all fields which are indexed but don't have termvectors enabled */ INDEXED_NO_TERMVECTOR = 16, /** all fields where termvectors are enabled. Please note that only standard termvector fields are returned */ TERMVECTOR = 32, /** all field with termvectors wiht positions enabled */ TERMVECTOR_WITH_POSITION = 64, /** all fields where termvectors with offset position are set */ TERMVECTOR_WITH_OFFSET = 128, /** all fields where termvectors with offset and position values set */ TERMVECTOR_WITH_POSITION_OFFSET = 256, /** all fields that store payloads */ STORES_PAYLOADS = 512 }; /** Returns an IndexReader reading the index in an FSDirectory in the named path. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error * @param path the path to the index directory */ static IndexReader* open(const char* path, bool closeDirectoryOnCleanup=true, IndexDeletionPolicy* deletionPolicy=NULL); /** Expert: returns an IndexReader reading the index in the given * Directory, with a custom {@link IndexDeletionPolicy}. * @param directory the index directory * @param deletionPolicy a custom deletion policy (only used * if you use this reader to perform deletes or to set * norms); see {@link IndexWriter} for details. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static IndexReader* open(CL_NS(store)::Directory* directory, bool closeDirectoryOnCleanup=false, IndexDeletionPolicy* deletionPolicy=NULL); /** * Refreshes an IndexReader if the index has changed since this instance * was (re)opened. *

* Opening an IndexReader is an expensive operation. This method can be used * to refresh an existing IndexReader to reduce these costs. This method * tries to only load segments that have changed or were created after the * IndexReader was (re)opened. *

* If the index has not changed since this instance was (re)opened, then this * call is a NOOP and returns this instance. Otherwise, a new instance is * returned. The old instance is closed (unlink JLucene) and must * be deleted
*

* You can determine whether a reader was actually reopened by comparing the * old instance with the instance returned by this method: *

   * IndexReader* reader = ...
   * ...
   * IndexReader* newreader = r->reopen();
   * if (newreader != reader) {
   *   ...     // reader was reopened
   *   reader->close();
   *   _CLDELETE(reader);
   * }
   * reader = newreader;
   * ...
   * 
* * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ virtual IndexReader* reopen(); /** * Returns the directory associated with this index. The Default * implementation returns the directory specified by subclasses when * delegating to the IndexReader(Directory) constructor, or throws an * UnsupportedOperationException if one was not specified. * @throws UnsupportedOperationException if no directory */ virtual CL_NS(store)::Directory* directory(); DEFINE_MUTEX(THIS_LOCK) /** * * @throws IOException */ virtual void flush(); /** * Commit changes resulting from delete, undeleteAll, or * setNorm operations * * If an exception is hit, then either no changes or all * changes will have been committed to the index * (transactional semantics). * @throws IOException if there is a low-level IO error */ CLUCENE_LOCAL_DECL virtual void commit(); /** Undeletes all documents currently marked as deleted in this index. * * @throws StaleReaderException if the index has changed * since this reader was opened * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ virtual void undeleteAll(); /** * Get a list of unique field names that exist in this index and have the specified * field option information. * @param fldOption specifies which field option should be available for the returned fields * @return Collection of Strings indicating the names of the fields. * @see IndexReader.FieldOption */ virtual void getFieldNames(FieldOption fldOption, StringArrayWithDeletor& retarray) = 0; /** Returns the byte-encoded normalization factor for the named field of * every document. This is used by the search code to score documents. * * The number of bytes returned is the size of the IndexReader->maxDoc() * * @see Field#setBoost(float_t) * @memory The values are cached, so don't delete the returned byte array. */ virtual uint8_t* norms(const TCHAR* field) = 0; /** Reads the byte-encoded normalization factor for the named field of every * document. This is used by the search code to score documents. * * The size of bytes must be the size of the IndexReader->maxDoc() * * @see Field#setBoost(float_t) */ virtual void norms(const TCHAR* field, uint8_t* bytes) = 0; /** Expert: Resets the normalization factor for the named field of the named * document. * * @see #norms(TCHAR*) * @see Similarity#decodeNorm(uint8_t) * * @throws StaleReaderException if the index has changed * since this reader was opened * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if there is a low-level IO error */ void setNorm(int32_t doc, const TCHAR* field, float_t value); /** Expert: Resets the normalization factor for the named field of the named * document. The norm represents the product of the field's {@link * Field#setBoost(float_t) boost} and its {@link Similarity#lengthNorm(TCHAR*, * int32_t) length normalization}. Thus, to preserve the length normalization * values when resetting this, one should base the new value upon the old. * * @see #norms(TCHAR*) * @see Similarity#decodeNorm(uint8_t) * @throws StaleReaderException if the index has changed * since this reader was opened * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if there is a low-level IO error */ void setNorm(int32_t doc, const TCHAR* field, uint8_t value); /// Release the write lock, if needed. virtual ~IndexReader(); /** * Returns the time the index in the named directory was last modified. * Do not use this to check whether the reader is still up-to-date, use * {@link #isCurrent()} instead. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static uint64_t lastModified(const char* directory); /** * Returns the time the index in the named directory was last modified. * Do not use this to check whether the reader is still up-to-date, use * {@link #isCurrent()} instead. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static uint64_t lastModified(CL_NS(store)::Directory* directory); /** * Reads version number from segments files. The version number is * initialized with a timestamp and then increased by one for each change of * the index. * * @param directory where the index resides. * @return version number. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static int64_t getCurrentVersion(CL_NS(store)::Directory* directory); /** * Reads version number from segments files. The version number is * initialized with a timestamp and then increased by one for each change of * the index. * * @param directory where the index resides. * @return version number. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static int64_t getCurrentVersion(const char* directory); /** * Version number when this IndexReader was opened. Not implemented in the IndexReader base class. * @throws UnsupportedOperationException unless overridden in subclass */ virtual int64_t getVersion(); /**

For IndexReader implementations that use * TermInfosReader to read terms, this sets the * indexDivisor to subsample the number of indexed terms * loaded into memory. This has the same effect as {@link * IndexWriter#setTermIndexInterval} except that setting * must be done at indexing time while this setting can be * set per reader. When set to N, then one in every * N*termIndexInterval terms in the index is loaded into * memory. By setting this to a value > 1 you can reduce * memory usage, at the expense of higher latency when * loading a TermInfo. The default value is 1.

* * NOTE: you must call this before the term * index is loaded. If the index is already loaded, * an IllegalStateException is thrown. * @throws IllegalStateException if the term index has already been loaded into memory */ void setTermInfosIndexDivisor(int32_t indexDivisor); /**

For IndexReader implementations that use * TermInfosReader to read terms, this returns the * current indexDivisor. * @see #setTermInfosIndexDivisor */ int32_t getTermInfosIndexDivisor(); /** * Check whether this IndexReader is still using the * current (i.e., most recently committed) version of the * index. If a writer has committed any changes to the * index since this reader was opened, this will return * false, in which case you must open a new * IndexReader in order to see the changes. See the * description of the autoCommit * flag which controls when the {@link IndexWriter} * actually commits changes to the index. * *

* Not implemented in the IndexReader base class. *

* @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error * @throws UnsupportedOperationException unless overridden in subclass */ virtual bool isCurrent(); /** * Checks is the index is optimized (if it has a single segment and * no deletions). Not implemented in the IndexReader base class. * @return true if the index is optimized; false otherwise * @throws UnsupportedOperationException unless overridden in subclass */ virtual bool isOptimized(); /** * Return an array of term frequency vectors for the specified document. * The array contains a vector for each vectorized field in the document. * Each vector contains terms and frequencies for all terms in a given vectorized field. * If no such fields existed, the method returns null. The term vectors that are * returned my either be of type TermFreqVector or of type TermPositionsVector if * positions or offsets have been stored. * * @param docNumber document for which term frequency vectors are returned * @return array of term frequency vectors. May be null if no term vectors have been * stored for the specified document. * @throws IOException if index cannot be accessed * @see org.apache.lucene.document.Field.TermVector */ virtual CL_NS(util)::ArrayBase* getTermFreqVectors(int32_t docNumber) = 0; /** * Return a term frequency vector for the specified document and field. The * returned vector contains terms and frequencies for the terms in * the specified field of this document, if the field had the storeTermVector * flag set. If termvectors had been stored with positions or offsets, a * TermPositionsVector is returned. * * @param docNumber document for which the term frequency vector is returned * @param field field for which the term frequency vector is returned. * @return term frequency vector May be null if field does not exist in the specified * document or term vector was not stored. * @throws IOException if index cannot be accessed * @see org.apache.lucene.document.Field.TermVector */ virtual TermFreqVector* getTermFreqVector(int32_t docNumber, const TCHAR* field=NULL) = 0; /** * Load the Term Vector into a user-defined data structure instead of relying on the parallel arrays of * the {@link TermFreqVector}. * @param docNumber The number of the document to load the vector for * @param field The name of the field to load * @param mapper The {@link TermVectorMapper} to process the vector. Must not be null * @throws IOException if term vectors cannot be accessed or if they do not exist on the field and doc. specified. * */ virtual void getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper) =0; /** * Map all the term vectors for all fields in a Document * @param docNumber The number of the document to load the vector for * @param mapper The {@link TermVectorMapper} to process the vector. Must not be null * @throws IOException if term vectors cannot be accessed or if they do not exist on the field and doc. specified. */ virtual void getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper) =0; /** * Returns true if an index exists at the specified directory. * If the directory does not exist or if there is no index in it. * @param directory the directory to check for an index * @return true if an index exists; false otherwise */ static bool indexExists(const char* directory); /** * Returns true if an index exists at the specified directory. * If the directory does not exist or if there is no index in it. * @param directory the directory to check for an index * @return true if an index exists; false otherwise * @throws IOException if there is a problem with accessing the index */ static bool indexExists(const CL_NS(store)::Directory* directory); /** Returns the number of documents in this index. */ virtual int32_t numDocs() = 0; /** Returns one greater than the largest possible document number. * This may be used to, e.g., determine how big to allocate an array which * will have an element for every document number in an index. */ virtual int32_t maxDoc() const = 0; /** * Get the {@link org.apache.lucene.document.Document} at the nth position. The {@link org.apache.lucene.document.FieldSelector} * may be used to determine what {@link org.apache.lucene.document.Field}s to load and how they should be loaded. * The fields are not cleared before retrieving the document, so the * object should be new or just cleared. * * NOTE: If this Reader (more specifically, the underlying FieldsReader) is closed before the lazy {@link org.apache.lucene.document.Field} is * loaded an exception may be thrown. If you want the value of a lazy {@link org.apache.lucene.document.Field} to be available after closing you must * explicitly load it or fetch the Document again with a new loader. * * * @param n Get the document at the nth position * @param fieldSelector The {@link org.apache.lucene.document.FieldSelector} to use to determine what Fields should be loaded on the Document. May be null, in which case all Fields will be loaded. * @return The stored fields of the {@link org.apache.lucene.document.Document} at the nth position * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error * * @see org.apache.lucene.document.Field * @see org.apache.lucene.document.FieldSelector * @see org.apache.lucene.document.SetBasedFieldSelector * @see org.apache.lucene.document.LoadFirstFieldSelector */ //When we convert to JDK 1.5 make this Set virtual bool document(int32_t n, CL_NS(document)::Document& doc, const CL_NS(document)::FieldSelector* fieldSelector) =0; /** Gets the stored fields of the nth * Document in this index. * The fields are not cleared before retrieving the document, so the * object should be new or just cleared. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ bool document(int32_t n, CL_NS(document)::Document& doc); _CL_DEPRECATED( document(i, Document&) ) bool document(int32_t n, CL_NS(document)::Document*); _CL_DEPRECATED( document(i, document) ) CL_NS(document)::Document* document(const int32_t n); /** Returns true if document n has been deleted */ virtual bool isDeleted(const int32_t n) = 0; /** Returns true if any documents have been deleted */ virtual bool hasDeletions() const = 0; /** Returns true if there are norms stored for this field. */ virtual bool hasNorms(const TCHAR* field); /** Returns an enumeration of all the terms in the index. The * enumeration is ordered by Term.compareTo(). Each term is greater * than all that precede it in the enumeration. Note that after * calling terms(), {@link TermEnum#next()} must be called * on the resulting enumeration before calling other methods such as * {@link TermEnum#term()}. * @throws IOException if there is a low-level IO error * @memory Caller must clean up */ virtual TermEnum* terms() = 0; /** Returns an enumeration of all terms starting at a given term. If * the given term does not exist, the enumeration is positioned at the * first term greater than the supplied therm. The enumeration is * ordered by Term.compareTo(). Each term is greater than all that * precede it in the enumeration. * @throws IOException if there is a low-level IO error * @memory Caller must clean up */ virtual TermEnum* terms(const Term* t) = 0; /** Returns the number of documents containing the term t. * @throws IOException if there is a low-level IO error */ virtual int32_t docFreq(const Term* t) = 0; /* Returns an unpositioned TermPositions enumerator. * @throws IOException if there is a low-level IO error * @memory Caller must clean up */ virtual TermPositions* termPositions() = 0; /** Returns an enumeration of all the documents which contain * term. For each document, in addition to the document number * and frequency of the term in that document, a list of all of the ordinal * positions of the term in the document is available. Thus, this method * implements the mapping: * *

    * Term    =>    <docNum, freq, * <pos1, pos2, ... * posfreq-1> * >* *
*

This positional information facilitates phrase and proximity searching. *

The enumeration is ordered by document number. Each document number is * greater than all that precede it in the enumeration. * @throws IOException if there is a low-level IO error * @memory Caller must clean up */ TermPositions* termPositions(Term* term); /** Returns an unpositioned {@link TermDocs} enumerator. * @throws IOException if there is a low-level IO error * @memory Caller must clean up */ virtual TermDocs* termDocs() = 0; /** Returns an enumeration of all the documents which contain * term. For each document, the document number, the frequency of * the term in that document is also provided, for use in search scoring. * Thus, this method implements the mapping: *

    Term    =>    <docNum, freq>*
*

The enumeration is ordered by document number. Each document number * is greater than all that precede it in the enumeration. * @throws IOException if there is a low-level IO error * @memory Caller must clean up */ TermDocs* termDocs(Term* term); /** Deletes the document numbered docNum. Once a document is * deleted it will not appear in TermDocs or TermPostitions enumerations. * Attempts to read its field with the {@link #document} * method will result in an error. The presence of this document may still be * reflected in the {@link #docFreq} statistic, though * this will be corrected eventually as the index is further modified. * @throws StaleReaderException if the index has changed * since this reader was opened * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if there is a low-level IO error */ void deleteDocument(const int32_t docNum); ///@deprecated. Use deleteDocument instead. _CL_DEPRECATED( deleteDocument ) void deleteDoc(const int32_t docNum); /** Deletes all documents that have a given term. * This is useful if one uses a document field to hold a unique ID string for * the document. Then to delete such a document, one merely constructs a * term with the appropriate field and the unique ID string as its text and * passes it to this method. * See {@link #deleteDocument(int)} for information about when this deletion will * become effective. * @return the number of documents deleted * @throws StaleReaderException if the index has changed * since this reader was opened * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if there is a low-level IO error */ int32_t deleteDocuments(Term* term); ///@deprecated. Use deleteDocuments instead. _CL_DEPRECATED( deleteDocuments ) int32_t deleteTerm(Term* term); /** * Closes files associated with this index and also saves any new deletions to disk. * No other methods should be called after this has been called. * @throws IOException if there is a low-level IO error */ void close(); /** * Returns true iff the index in the named directory is * currently locked. * @param directory the directory to check for a lock * @throws IOException if there is a low-level IO error */ static bool isLocked(CL_NS(store)::Directory* directory); /** * Returns true iff the index in the named directory is * currently locked. * @param directory the directory to check for a lock * @throws IOException if there is a low-level IO error */ static bool isLocked(const char* directory); ///Forcibly unlocks the index in the named directory. ///Caution: this should only be used by failure recovery code, ///when it is known that no other process nor thread is in fact ///currently accessing this index. static void unlock(CL_NS(store)::Directory* directory); static void unlock(const char* path); /** Returns the directory this index resides in. */ _CL_DEPRECATED( directory() ) CL_NS(store)::Directory* getDirectory(); /** Returns true if the file is a lucene filename (based on extension or filename) */ static bool isLuceneFile(const char* filename); /** * For classes that need to know when the IndexReader closes (such as caches, etc), * should pass their callback function to this. */ void addCloseCallback(CloseCallback callback, void* parameter); friend class SegmentReader; friend class MultiReader; friend class IndexWriter; friend class MultiSegmentReader; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/IndexWriter.cpp000066400000000000000000002136521154025176300233560ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexWriter.h" #include "IndexReader.h" #include "CLucene/document/Document.h" #include "CLucene/store/Directory.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/Misc.h" #include "CLucene/store/_Lock.h" #include "CLucene/store/_RAMDirectory.h" #include "CLucene/store/FSDirectory.h" #include "CLucene/util/Array.h" #include "CLucene/util/PriorityQueue.h" #include "_DocumentsWriter.h" #include "_TermInfo.h" #include "_SegmentInfos.h" #include "_SegmentMerger.h" #include "_SegmentHeader.h" #include "CLucene/search/Similarity.h" #include "CLucene/index/MergePolicy.h" #include "MergePolicy.h" #include "MergeScheduler.h" #include "_IndexFileDeleter.h" #include "_Term.h" #include #include #include CL_NS_USE(store) CL_NS_USE(util) CL_NS_USE(document) CL_NS_USE(analysis) CL_NS_USE(search) CL_NS_DEF(index) int64_t IndexWriter::WRITE_LOCK_TIMEOUT = 1000; const char* IndexWriter::WRITE_LOCK_NAME = "write.lock"; std::ostream* IndexWriter::defaultInfoStream = NULL; const int32_t IndexWriter::MERGE_READ_BUFFER_SIZE = 4096; const int32_t IndexWriter::DISABLE_AUTO_FLUSH = -1; const int32_t IndexWriter::DEFAULT_MAX_BUFFERED_DOCS = DISABLE_AUTO_FLUSH; const float_t IndexWriter::DEFAULT_RAM_BUFFER_SIZE_MB = 16.0; const int32_t IndexWriter::DEFAULT_MAX_BUFFERED_DELETE_TERMS = DISABLE_AUTO_FLUSH; const int32_t IndexWriter::DEFAULT_MAX_MERGE_DOCS = LogDocMergePolicy::DEFAULT_MAX_MERGE_DOCS; const int32_t IndexWriter::DEFAULT_MERGE_FACTOR = LogMergePolicy::DEFAULT_MERGE_FACTOR; DEFINE_MUTEX(IndexWriter::MESSAGE_ID_LOCK) int32_t IndexWriter::MESSAGE_ID = 0; const int32_t IndexWriter::MAX_TERM_LENGTH = DocumentsWriter::MAX_TERM_LENGTH; class IndexWriter::Internal{ public: IndexWriter* _this; Internal(IndexWriter* _this){ this->_this = _this; } // Apply buffered delete terms to the segment just flushed from ram // apply appropriately so that a delete term is only applied to // the documents buffered before it, not those buffered after it. void applyDeletesSelectively(const DocumentsWriter::TermNumMapType& deleteTerms, const std::vector& deleteIds,IndexReader* reader); // Apply buffered delete terms to this reader. void applyDeletes(const DocumentsWriter::TermNumMapType& deleteTerms, IndexReader* reader); }; void IndexWriter::deinit(bool releaseWriteLock) throw() { if (writeLock != NULL && releaseWriteLock) { writeLock->release(); // release write lock _CLLDELETE(writeLock); } _CLLDELETE(segmentInfos); _CLLDELETE(mergingSegments); _CLLDELETE(pendingMerges); _CLLDELETE(runningMerges); _CLLDELETE(mergeExceptions); _CLLDELETE(segmentsToOptimize); _CLLDELETE(mergeScheduler); _CLLDELETE(mergePolicy); _CLLDELETE(deleter); _CLLDELETE(docWriter); if (bOwnsDirectory) _CLLDECDELETE(directory); delete _internal; } IndexWriter::~IndexWriter(){ deinit(); } void IndexWriter::ensureOpen() { if (closed) { _CLTHROWA(CL_ERR_AlreadyClosed, "this IndexWriter is closed"); } } void IndexWriter::message(string message) { if (infoStream != NULL){ (*infoStream) << string("IW ") << Misc::toString(messageID) << string(" [") << Misc::toString( _LUCENE_CURRTHREADID ) << string("]: ") << message << string("\n"); } } void IndexWriter::setMessageID() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (infoStream != NULL && messageID == -1) { { SCOPED_LOCK_MUTEX(MESSAGE_ID_LOCK) messageID = MESSAGE_ID++; } } } LogMergePolicy* IndexWriter::getLogMergePolicy() const{ if ( mergePolicy->instanceOf(LogMergePolicy::getClassName()) ) return (LogMergePolicy*) mergePolicy; else _CLTHROWA(CL_ERR_IllegalArgument, "this method can only be called when the merge policy is the default LogMergePolicy"); } bool IndexWriter::getUseCompoundFile() { return getLogMergePolicy()->getUseCompoundFile(); } void IndexWriter::setUseCompoundFile(bool value) { getLogMergePolicy()->setUseCompoundFile(value); getLogMergePolicy()->setUseCompoundDocStore(value); } void IndexWriter::setSimilarity(Similarity* similarity) { ensureOpen(); this->similarity = similarity; } Similarity* IndexWriter::getSimilarity() { ensureOpen(); return this->similarity; } void IndexWriter::setTermIndexInterval(int32_t interval) { ensureOpen(); this->termIndexInterval = interval; } int32_t IndexWriter::getTermIndexInterval() { ensureOpen(); return termIndexInterval; } IndexWriter::IndexWriter(const char* path, Analyzer* a, bool create):bOwnsDirectory(true){ init(FSDirectory::getDirectory(path, create), a, create, true, (IndexDeletionPolicy*)NULL, true); } IndexWriter::IndexWriter(Directory* d, Analyzer* a, bool create, bool closeDir):bOwnsDirectory(false){ init(d, a, create, closeDir, NULL, true); } IndexWriter::IndexWriter(Directory* d, bool autoCommit, Analyzer* a, IndexDeletionPolicy* deletionPolicy, bool closeDirOnShutdown):bOwnsDirectory(false){ init(d, a, closeDirOnShutdown, deletionPolicy, autoCommit); } IndexWriter::IndexWriter(Directory* d, bool autoCommit, Analyzer* a, bool create, IndexDeletionPolicy* deletionPolicy, bool closeDirOnShutdown):bOwnsDirectory(false){ init(d, a, create, closeDirOnShutdown, deletionPolicy, autoCommit); } void IndexWriter::init(Directory* d, Analyzer* a, bool closeDir, IndexDeletionPolicy* deletionPolicy, bool autoCommit){ if (IndexReader::indexExists(d)) { init(d, a, false, closeDir, deletionPolicy, autoCommit); } else { init(d, a, true, closeDir, deletionPolicy, autoCommit); } } void IndexWriter::init(Directory* d, Analyzer* a, const bool create, const bool closeDir, IndexDeletionPolicy* deletionPolicy, const bool autoCommit){ this->_internal = new Internal(this); this->termIndexInterval = IndexWriter::DEFAULT_TERM_INDEX_INTERVAL; this->mergeScheduler = _CLNEW SerialMergeScheduler(); //TODO: implement and use ConcurrentMergeScheduler this->mergingSegments = _CLNEW MergingSegmentsType; this->pendingMerges = _CLNEW PendingMergesType; this->runningMerges = _CLNEW RunningMergesType; this->mergeExceptions = _CLNEW MergeExceptionsType; this->segmentsToOptimize = _CLNEW SegmentsToOptimizeType; this->mergePolicy = _CLNEW LogByteSizeMergePolicy(); this->localRollbackSegmentInfos = NULL; this->stopMerges = false; messageID = -1; maxFieldLength = FIELD_TRUNC_POLICY__WARN; infoStream = NULL; this->mergeFactor = this->minMergeDocs = this->maxMergeDocs = 0; this->commitLockTimeout =0; this->closeDir = closeDir; this->commitPending = this->closed = this->closing = false; directory = d; analyzer = a; this->infoStream = defaultInfoStream; setMessageID(); this->writeLockTimeout = IndexWriter::WRITE_LOCK_TIMEOUT; this->similarity = Similarity::getDefault(); this->hitOOM = false; this->autoCommit = true; this->segmentInfos = _CLNEW SegmentInfos; this->mergeGen = 0; this->rollbackSegmentInfos = NULL; this->deleter = NULL; this->docWriter = NULL; this->writeLock = NULL; if (create) { // Clear the write lock in case it's leftover: directory->clearLock(IndexWriter::WRITE_LOCK_NAME); } bool hasLock = false; try { writeLock = directory->makeLock(IndexWriter::WRITE_LOCK_NAME); hasLock = writeLock->obtain(writeLockTimeout); if (!hasLock) // obtain write lock _CLTHROWA(CL_ERR_LockObtainFailed, (string("Index locked for write: ") + writeLock->getObjectName()).c_str() ); } catch (...) { deinit(hasLock); throw; } try { if (create) { // Try to read first. This is to allow create // against an index that's currently open for // searching. In this case we write the next // segments_N file with no segments: try { segmentInfos->read(directory); segmentInfos->clear(); } catch (CLuceneError& e) { if ( e.number() != CL_ERR_IO ) throw e; // Likely this means it's a fresh directory } segmentInfos->write(directory); } else { segmentInfos->read(directory); } this->autoCommit = autoCommit; if (!autoCommit) { rollbackSegmentInfos = segmentInfos->clone(); }else{ rollbackSegmentInfos = NULL; } docWriter = _CLNEW DocumentsWriter(directory, this); docWriter->setInfoStream(infoStream); // Default deleter (for backwards compatibility) is // KeepOnlyLastCommitDeleter: deleter = _CLNEW IndexFileDeleter(directory, deletionPolicy == NULL ? _CLNEW KeepOnlyLastCommitDeletionPolicy() : deletionPolicy, segmentInfos, infoStream, docWriter); pushMaxBufferedDocs(); if (infoStream != NULL) { message( string("init: create=") + (create ? "true" : "false") ); messageState(); } } catch (CLuceneError& e) { deinit(e.number() == CL_ERR_IO); throw e; } } void IndexWriter::setMergePolicy(MergePolicy* mp) { ensureOpen(); if (mp == NULL) _CLTHROWA(CL_ERR_NullPointer, "MergePolicy must be non-NULL"); if (mergePolicy != mp){ mergePolicy->close(); _CLDELETE(mergePolicy); } mergePolicy = mp; pushMaxBufferedDocs(); if (infoStream != NULL) message(string("setMergePolicy ") + mp->getObjectName()); } MergePolicy* IndexWriter::getMergePolicy() { ensureOpen(); return mergePolicy; } void IndexWriter::setMergeScheduler(MergeScheduler* mergeScheduler) { ensureOpen(); if (mergeScheduler == NULL) _CLTHROWA(CL_ERR_NullPointer, "MergeScheduler must be non-NULL"); if (this->mergeScheduler != mergeScheduler) { finishMerges(true); this->mergeScheduler->close(); _CLLDELETE(this->mergeScheduler) } this->mergeScheduler = mergeScheduler; if (infoStream != NULL) message( string("setMergeScheduler ") + mergeScheduler->getObjectName()); } MergeScheduler* IndexWriter::getMergeScheduler() { ensureOpen(); return mergeScheduler; } void IndexWriter::setMaxMergeDocs(int32_t maxMergeDocs) { getLogMergePolicy()->setMaxMergeDocs(maxMergeDocs); } int32_t IndexWriter::getMaxMergeDocs() const{ return getLogMergePolicy()->getMaxMergeDocs(); } void IndexWriter::setMaxFieldLength(int32_t maxFieldLength) { ensureOpen(); this->maxFieldLength = maxFieldLength; if (infoStream != NULL) message( "setMaxFieldLength " + Misc::toString(maxFieldLength) ); } int32_t IndexWriter::getMaxFieldLength() { ensureOpen(); return maxFieldLength; } void IndexWriter::setMaxBufferedDocs(int32_t maxBufferedDocs) { ensureOpen(); if (maxBufferedDocs != DISABLE_AUTO_FLUSH && maxBufferedDocs < 2) _CLTHROWA(CL_ERR_IllegalArgument, "maxBufferedDocs must at least be 2 when enabled"); if (maxBufferedDocs == DISABLE_AUTO_FLUSH && (int32_t)getRAMBufferSizeMB() == DISABLE_AUTO_FLUSH) _CLTHROWA(CL_ERR_IllegalArgument, "at least one of ramBufferSize and maxBufferedDocs must be enabled"); docWriter->setMaxBufferedDocs(maxBufferedDocs); pushMaxBufferedDocs(); if (infoStream != NULL) message("setMaxBufferedDocs " + Misc::toString(maxBufferedDocs)); } void IndexWriter::pushMaxBufferedDocs() { if (docWriter->getMaxBufferedDocs() != DISABLE_AUTO_FLUSH) { const MergePolicy* mp = mergePolicy; if (mp->instanceOf(LogDocMergePolicy::getClassName())) { LogDocMergePolicy* lmp = (LogDocMergePolicy*) mp; const int32_t maxBufferedDocs = docWriter->getMaxBufferedDocs(); if (lmp->getMinMergeDocs() != maxBufferedDocs) { if (infoStream != NULL){ message(string("now push maxBufferedDocs ") + Misc::toString(maxBufferedDocs) + " to LogDocMergePolicy"); } lmp->setMinMergeDocs(maxBufferedDocs); } } } } int32_t IndexWriter::getMaxBufferedDocs() { ensureOpen(); return docWriter->getMaxBufferedDocs(); } void IndexWriter::setRAMBufferSizeMB(float_t mb) { if ( (int32_t)mb != DISABLE_AUTO_FLUSH && mb <= 0.0) _CLTHROWA(CL_ERR_IllegalArgument, "ramBufferSize should be > 0.0 MB when enabled"); if (mb == DISABLE_AUTO_FLUSH && getMaxBufferedDocs() == DISABLE_AUTO_FLUSH) _CLTHROWA(CL_ERR_IllegalArgument, "at least one of ramBufferSize and maxBufferedDocs must be enabled"); docWriter->setRAMBufferSizeMB(mb); if (infoStream != NULL){ message(string("setRAMBufferSizeMB ") + Misc::toString(mb)); } } float_t IndexWriter::getRAMBufferSizeMB() { return docWriter->getRAMBufferSizeMB(); } void IndexWriter::setMaxBufferedDeleteTerms(int32_t maxBufferedDeleteTerms) { ensureOpen(); if (maxBufferedDeleteTerms != DISABLE_AUTO_FLUSH && maxBufferedDeleteTerms < 1) _CLTHROWA(CL_ERR_IllegalArgument, "maxBufferedDeleteTerms must at least be 1 when enabled"); docWriter->setMaxBufferedDeleteTerms(maxBufferedDeleteTerms); if (infoStream != NULL) message("setMaxBufferedDeleteTerms " + Misc::toString(maxBufferedDeleteTerms)); } int32_t IndexWriter::getMaxBufferedDeleteTerms() { ensureOpen(); return docWriter->getMaxBufferedDeleteTerms(); } void IndexWriter::setMergeFactor(int32_t mergeFactor) { getLogMergePolicy()->setMergeFactor(mergeFactor); } int32_t IndexWriter::getMergeFactor() const { return getLogMergePolicy()->getMergeFactor(); } void IndexWriter::setDefaultInfoStream(std::ostream* infoStream) { IndexWriter::defaultInfoStream = infoStream; } std::ostream* IndexWriter::getDefaultInfoStream() { return IndexWriter::defaultInfoStream; } //TODO: infoStream - unicode void IndexWriter::setInfoStream(std::ostream* infoStream) { ensureOpen(); this->infoStream = infoStream; setMessageID(); docWriter->setInfoStream(infoStream); deleter->setInfoStream(infoStream); if (infoStream != NULL) messageState(); } void IndexWriter::messageState() { message( string("setInfoStream: dir=") + directory->toString() + " autoCommit=" + (autoCommit?"true":"false" + string(" mergePolicy=") + mergePolicy->getObjectName() + " mergeScheduler=" + mergeScheduler->getObjectName() + " ramBufferSizeMB=" + Misc::toString(docWriter->getRAMBufferSizeMB()) + " maxBuffereDocs=" + Misc::toString(docWriter->getMaxBufferedDocs())) + " maxBuffereDeleteTerms=" + Misc::toString(docWriter->getMaxBufferedDeleteTerms()) + " maxFieldLength=" + Misc::toString(maxFieldLength) + " index=" + segString()); } std::ostream* IndexWriter::getInfoStream() { ensureOpen(); return infoStream; } void IndexWriter::setWriteLockTimeout(int64_t writeLockTimeout) { ensureOpen(); this->writeLockTimeout = writeLockTimeout; } int64_t IndexWriter::getWriteLockTimeout() { ensureOpen(); return writeLockTimeout; } void IndexWriter::setDefaultWriteLockTimeout(int64_t writeLockTimeout) { IndexWriter::WRITE_LOCK_TIMEOUT = writeLockTimeout; } int64_t IndexWriter::getDefaultWriteLockTimeout() { return IndexWriter::WRITE_LOCK_TIMEOUT; } void IndexWriter::close(bool waitForMerges) { bool doClose; // If any methods have hit OutOfMemoryError, then abort // on close, in case the internal state of IndexWriter // or DocumentsWriter is corrupt if (hitOOM) abort(); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) // Ensure that only one thread actually gets to do the closing: if (!closing) { doClose = true; closing = true; } else doClose = false; } if (doClose) closeInternal(waitForMerges); else // Another thread beat us to it (is actually doing the // close), so we will block until that other thread // has finished closing waitForClose(); } void IndexWriter::waitForClose() { SCOPED_LOCK_MUTEX(THIS_LOCK) while(!closed && closing) { CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) } } void IndexWriter::closeInternal(bool waitForMerges) { try { if (infoStream != NULL) message(string("now flush at close")); docWriter->close(); // Only allow a _CLNEW merge to be triggered if we are // going to wait for merges: flush(waitForMerges, true); if (waitForMerges) // Give merge scheduler last chance to run, in case // any pending merges are waiting: mergeScheduler->merge(this); mergePolicy->close(); finishMerges(waitForMerges); mergeScheduler->close(); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) if (commitPending) { bool success = false; try { segmentInfos->write(directory); // now commit changes success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception committing segments file during close")); deletePartialSegmentsFile(); } ) if (infoStream != NULL) message("close: wrote segments file \"" + segmentInfos->getCurrentSegmentFileName() + "\""); deleter->checkpoint(segmentInfos, true); commitPending = false; // _CLDELETE(rollbackSegmentInfos); } _CLDELETE(rollbackSegmentInfos); if (infoStream != NULL) message("at close: " + segString()); _CLDELETE(docWriter); deleter->close(); } if (closeDir) directory->close(); if (writeLock != NULL) { writeLock->release(); // release write lock _CLDELETE(writeLock); } closed = true; } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } _CLFINALLY ( { SCOPED_LOCK_MUTEX(this->THIS_LOCK) if (!closed) { closing = false; if (infoStream != NULL) message(string("hit exception while closing")); } CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) } ) } bool IndexWriter::flushDocStores() { SCOPED_LOCK_MUTEX(THIS_LOCK) const std::vector& files = docWriter->files(); bool useCompoundDocStore = false; if (files.size() > 0) { string docStoreSegment; bool success = false; try { docStoreSegment = docWriter->closeDocStore(); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception closing doc store segment")); docWriter->abort(NULL); } ) useCompoundDocStore = mergePolicy->useCompoundDocStore(segmentInfos); if (useCompoundDocStore && !docStoreSegment.empty()) { // Now build compound doc store file success = false; const int32_t numSegments = segmentInfos->size(); const string compoundFileName = docStoreSegment + "." + IndexFileNames::COMPOUND_FILE_STORE_EXTENSION; try { CompoundFileWriter cfsWriter(directory, compoundFileName.c_str()); const size_t size = files.size(); for(size_t i=0;iinfo(i); if (si->getDocStoreOffset() != -1 && si->getDocStoreSegment().compare(docStoreSegment)==0) si->setDocStoreIsCompoundFile(true); } checkpoint(); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message("hit exception building compound file doc store for segment " + docStoreSegment); // Rollback to no compound file for(int32_t i=0;iinfo(i); if (si->getDocStoreOffset() != -1 && si->getDocStoreSegment().compare(docStoreSegment)==0 ) si->setDocStoreIsCompoundFile(false); } deleter->deleteFile(compoundFileName.c_str()); deletePartialSegmentsFile(); } ) deleter->checkpoint(segmentInfos, false); } } return useCompoundDocStore; } Directory* IndexWriter::getDirectory() { ensureOpen(); return directory; } Analyzer* IndexWriter::getAnalyzer() { ensureOpen(); return analyzer; } int32_t IndexWriter::docCount() { SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); int32_t count = docWriter->getNumDocsInRAM(); for (int32_t i = 0; i < segmentInfos->size(); i++) { SegmentInfo* si = segmentInfos->info(i); count += si->docCount; } return count; } void IndexWriter::addDocument(Document* doc, Analyzer* analyzer) { if ( analyzer == NULL ) analyzer = this->analyzer; ensureOpen(); bool doFlush = false; bool success = false; try { try { doFlush = docWriter->addDocument(doc, analyzer); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception adding document")); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) // If docWriter has some aborted files that were // never incref'd, then we clean them up here if (docWriter != NULL) { const std::vector* files = docWriter->abortedFiles(); if (files != NULL ) deleter->deleteNewFiles(*files); } } } ) if (doFlush) flush(true, false); } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } } void IndexWriter::deleteDocuments(Term* term) { ensureOpen(); try { bool doFlush = docWriter->bufferDeleteTerm(term); if (doFlush) flush(true, false); } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } } void IndexWriter::deleteDocuments(const ArrayBase* terms) { ensureOpen(); try { bool doFlush = docWriter->bufferDeleteTerms(terms); if (doFlush) flush(true, false); } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } } void IndexWriter::updateDocument(Term* term, Document* doc) { ensureOpen(); updateDocument(term, doc, getAnalyzer()); } void IndexWriter::updateDocument(Term* term, Document* doc, Analyzer* analyzer) { ensureOpen(); try { bool doFlush = false; bool success = false; try { doFlush = docWriter->updateDocument(term, doc, analyzer); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception updating document")); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) // If docWriter has some aborted files that were // never incref'd, then we clean them up here const std::vector* files = docWriter->abortedFiles(); if (files != NULL) deleter->deleteNewFiles(*files); } } ) if (doFlush) flush(true, false); } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } } // for test purpose int32_t IndexWriter::getSegmentCount(){ SCOPED_LOCK_MUTEX(THIS_LOCK) return segmentInfos->size(); } // for test purpose int32_t IndexWriter::getNumBufferedDocuments(){ SCOPED_LOCK_MUTEX(THIS_LOCK) return docWriter->getNumDocsInRAM(); } // for test purpose int32_t IndexWriter::getDocCount(int32_t i) { SCOPED_LOCK_MUTEX(THIS_LOCK) if (i >= 0 && i < segmentInfos->size()) { return segmentInfos->info(i)->docCount; } else { return -1; } } string IndexWriter::newSegmentName() { // Cannot synchronize on IndexWriter because that causes // deadlock { SCOPED_LOCK_MUTEX(segmentInfos->THIS_LOCK) // Important to set commitPending so that the // segmentInfos is written on close. Otherwise we // could close, re-open and re-return the same segment // name that was previously returned which can cause // problems at least with ConcurrentMergeScheduler. commitPending = true; char buf[10]; Misc::longToBase(segmentInfos->counter++, 36,buf); return string("_") + buf; } } void IndexWriter::optimize(bool doWait) { optimize(1, doWait); } void IndexWriter::optimize(int32_t maxNumSegments, bool doWait) { ensureOpen(); if (maxNumSegments < 1) _CLTHROWA(CL_ERR_IllegalArgument, "maxNumSegments must be >= 1; got " + maxNumSegments); if (infoStream != NULL) message("optimize: index now " + segString()); flush(); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) resetMergeExceptions(); segmentsToOptimize->clear(); const int32_t numSegments = segmentInfos->size(); for(int32_t i=0;ipush_back(segmentInfos->info(i)); // Now mark all pending & running merges as optimize // merge: PendingMergesType::iterator it = pendingMerges->begin(); while(it != pendingMerges->end()) { MergePolicy::OneMerge* _merge = *it; _merge->optimize = true; _merge->maxNumSegmentsOptimize = maxNumSegments; it++; } RunningMergesType::iterator it2 = runningMerges->begin(); while(it2 != runningMerges->end()) { MergePolicy::OneMerge* _merge = *it2; _merge->optimize = true; _merge->maxNumSegmentsOptimize = maxNumSegments; it2++; } } maybeMerge(maxNumSegments, true); if (doWait) { { SCOPED_LOCK_MUTEX(this->THIS_LOCK) while(optimizeMergesPending()) { CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION); if (mergeExceptions->size() > 0) { // Forward any exceptions in background merge // threads to the current thread: const int32_t size = mergeExceptions->size(); for(int32_t i=0;ioptimize) { CLuceneError tmp(_merge->getException()); CLuceneError err(tmp.number(), (string("background merge hit exception: ") + _merge->segString(directory) + ":" + tmp.what() ).c_str(), false ); throw err; } } } } } } // NOTE: in the ConcurrentMergeScheduler case, when // doWait is false, we can return immediately while // background threads accomplish the optimization } bool IndexWriter::optimizeMergesPending() { SCOPED_LOCK_MUTEX(THIS_LOCK) for(PendingMergesType::iterator it = pendingMerges->begin(); it != pendingMerges->end(); it++){ if ((*it)->optimize) return true; it++; } for(RunningMergesType::iterator it = runningMerges->begin(); it != runningMerges->end(); it++){ if ((*it)->optimize) return true; it++; } return false; } void IndexWriter::maybeMerge() { maybeMerge(false); } void IndexWriter::maybeMerge(bool optimize) { maybeMerge(1, optimize); } void IndexWriter::maybeMerge(int32_t maxNumSegmentsOptimize, bool optimize) { updatePendingMerges(maxNumSegmentsOptimize, optimize); mergeScheduler->merge(this); } void IndexWriter::updatePendingMerges(int32_t maxNumSegmentsOptimize, bool optimize){ SCOPED_LOCK_MUTEX(THIS_LOCK) assert (!optimize || maxNumSegmentsOptimize > 0); if (stopMerges) return; MergePolicy::MergeSpecification* spec; if (optimize) { spec = mergePolicy->findMergesForOptimize(segmentInfos, this, maxNumSegmentsOptimize, *segmentsToOptimize); if (spec != NULL) { const int32_t numMerges = spec->merges->size(); for(int32_t i=0;imerges)[i]; _merge->optimize = true; _merge->maxNumSegmentsOptimize = maxNumSegmentsOptimize; } } } else spec = mergePolicy->findMerges(segmentInfos, this); if (spec != NULL) { const int32_t numMerges = spec->merges->size(); for(int32_t i=0;imerges)[i]); } _CLDELETE(spec); } MergePolicy::OneMerge* IndexWriter::getNextMerge() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (pendingMerges->size() == 0) return NULL; else { // Advance the merge from pending to running MergePolicy::OneMerge* _merge = *pendingMerges->begin(); pendingMerges->pop_front(); runningMerges->insert(_merge); return _merge; } } void IndexWriter::startTransaction() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (infoStream != NULL) message(string("now start transaction")); CND_PRECONDITION(docWriter->getNumBufferedDeleteTerms() == 0, "calling startTransaction with buffered delete terms not supported"); CND_PRECONDITION (docWriter->getNumDocsInRAM() == 0, "calling startTransaction with buffered documents not supported"); localRollbackSegmentInfos = segmentInfos->clone(); localAutoCommit = autoCommit; if (localAutoCommit) { if (infoStream != NULL) message(string("flush at startTransaction")); flush(); // Turn off auto-commit during our local transaction: autoCommit = false; } else // We must "protect" our files at this point from // deletion in case we need to rollback: deleter->incRef(segmentInfos, false); } void IndexWriter::rollbackTransaction() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (infoStream != NULL) message(string("now rollback transaction")); // First restore autoCommit in case we hit an exception below: autoCommit = localAutoCommit; // Keep the same segmentInfos instance but replace all // of its SegmentInfo instances. This is so the next // attempt to commit using this instance of IndexWriter // will always write to a _CLNEW generation ("write once"). segmentInfos->clear(); segmentInfos->insert(localRollbackSegmentInfos, true); _CLDELETE(localRollbackSegmentInfos); // Ask deleter to locate unreferenced files we had // created & remove them: deleter->checkpoint(segmentInfos, false); if (!autoCommit) // Remove the incRef we did in startTransaction: deleter->decRef(segmentInfos); deleter->refresh(); finishMerges(false); stopMerges = false; } void IndexWriter::commitTransaction() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (infoStream != NULL) message(string("now commit transaction")); // First restore autoCommit in case we hit an exception below: autoCommit = localAutoCommit; bool success = false; try { checkpoint(); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception committing transaction")); rollbackTransaction(); } ) if (!autoCommit) // Remove the incRef we did in startTransaction. deleter->decRef(localRollbackSegmentInfos); _CLDELETE(localRollbackSegmentInfos); // Give deleter a chance to remove files now: deleter->checkpoint(segmentInfos, autoCommit); } void IndexWriter::abort() { ensureOpen(); if (autoCommit) _CLTHROWA(CL_ERR_IllegalState,"abort() can only be called when IndexWriter was opened with autoCommit=false"); bool doClose; { SCOPED_LOCK_MUTEX(this->THIS_LOCK) // Ensure that only one thread actually gets to do the closing: if (!closing) { doClose = true; closing = true; } else doClose = false; } if (doClose) { finishMerges(false); // Must pre-close these two, in case they set // commitPending=true, so that we can then set it to // false before calling closeInternal mergePolicy->close(); mergeScheduler->close(); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) // Keep the same segmentInfos instance but replace all // of its SegmentInfo instances. This is so the next // attempt to commit using this instance of IndexWriter // will always write to a _CLNEW generation ("write // once"). segmentInfos->clear(); segmentInfos->insert(rollbackSegmentInfos, false); docWriter->abort(NULL); // Ask deleter to locate unreferenced files & remove // them: deleter->checkpoint(segmentInfos, false); deleter->refresh(); } commitPending = false; closeInternal(false); } else waitForClose(); } void IndexWriter::finishMerges(bool waitForMerges) { SCOPED_LOCK_MUTEX(THIS_LOCK) if (!waitForMerges) { stopMerges = true; // Abort all pending & running merges: for(PendingMergesType::iterator it = pendingMerges->begin(); it != pendingMerges->end(); it++ ){ MergePolicy::OneMerge* _merge = *it; if (infoStream != NULL) message("now abort pending merge " + _merge->segString(directory)); _merge->abort(); mergeFinish(_merge); it++; } pendingMerges->clear(); for(RunningMergesType::iterator it = runningMerges->begin(); it != runningMerges->end(); it++ ){ MergePolicy::OneMerge* _merge = *it; if (infoStream != NULL) message("now abort running merge " + _merge->segString(directory)); _merge->abort(); it++; } // These merges periodically check whether they have // been aborted, and stop if so. We wait here to make // sure they all stop. It should not take very int64_t // because the merge threads periodically check if // they are aborted. while(runningMerges->size() > 0) { if (infoStream != NULL) message( string("now wait for ") + Misc::toString( (int32_t)runningMerges->size()) + " running merge to abort"); CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) } assert (0 == mergingSegments->size()); if (infoStream != NULL) message(string("all running merges have aborted")); } else { while(pendingMerges->size() > 0 || runningMerges->size() > 0) { CONDITION_WAIT(THIS_LOCK, THIS_WAIT_CONDITION) } assert (0 == mergingSegments->size()); } } void IndexWriter::checkpoint() { SCOPED_LOCK_MUTEX(THIS_LOCK) if (autoCommit) { segmentInfos->write(directory); commitPending = false; if (infoStream != NULL) message("checkpoint: wrote segments file \"" + segmentInfos->getCurrentSegmentFileName() + "\""); } else { commitPending = true; } } void IndexWriter::addIndexes(CL_NS(util)::ArrayBase& dirs){ ensureOpen(); // Do not allow add docs or deletes while we are running: docWriter->pauseAllThreads(); try { if (infoStream != NULL) message(string("flush at addIndexes")); flush(); bool success = false; startTransaction(); try { { SCOPED_LOCK_MUTEX(this->THIS_LOCK) for (int32_t i = 0; i< dirs.length; i++) { SegmentInfos sis; // read infos from dir sis.read(dirs[i]); segmentInfos->insert(&sis,true); // add each info } } optimize(); success = true; } _CLFINALLY ( if (success) { commitTransaction(); } else { rollbackTransaction(); } ) } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } _CLFINALLY ( docWriter->resumeAllThreads(); ) } void IndexWriter::resetMergeExceptions() { SCOPED_LOCK_MUTEX(THIS_LOCK) mergeExceptions->clear(); mergeGen++; } void IndexWriter::addIndexesNoOptimize(CL_NS(util)::ArrayBase& dirs) { ensureOpen(); // Do not allow add docs or deletes while we are running: docWriter->pauseAllThreads(); try { if (infoStream != NULL) message(string("flush at addIndexesNoOptimize")); flush(); bool success = false; startTransaction(); try { { SCOPED_LOCK_MUTEX(this->THIS_LOCK) for (int32_t i = 0; i< dirs.length; i++) { if (directory == dirs[i]) { // cannot add this index: segments may be deleted in merge before added _CLTHROWA(CL_ERR_IllegalArgument,"Cannot add this index to itself"); } SegmentInfos sis; // read infos from dir sis.read(dirs[i]); segmentInfos->insert(&sis, true); } } maybeMerge(); // If after merging there remain segments in the index // that are in a different directory, just copy these // over into our index. This is necessary (before // finishing the transaction) to avoid leaving the // index in an unusable (inconsistent) state. copyExternalSegments(); success = true; } _CLFINALLY ( if (success) { commitTransaction(); } else { rollbackTransaction(); } ) } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } _CLFINALLY ( docWriter->resumeAllThreads(); ) } void IndexWriter::copyExternalSegments() { bool any = false; while(true) { SegmentInfo* info = NULL; MergePolicy::OneMerge* _merge = NULL; { SCOPED_LOCK_MUTEX(this->THIS_LOCK) const int32_t numSegments = segmentInfos->size(); for(int32_t i=0;iinfo(i); if (info->dir != directory) { SegmentInfos* range = _CLNEW SegmentInfos; segmentInfos->range(i, 1+i, *range); _merge = _CLNEW MergePolicy::OneMerge(range, info->getUseCompoundFile()); break; } } } if (_merge != NULL) { if (registerMerge(_merge)) { PendingMergesType::iterator p = std::find(pendingMerges->begin(),pendingMerges->end(), _merge); pendingMerges->remove(p,true); runningMerges->insert(_merge); any = true; merge(_merge); } else // This means there is a bug in the // MergeScheduler. MergeSchedulers in general are // not allowed to run a merge involving segments // external to this IndexWriter's directory in the // background because this would put the index // into an inconsistent state (where segmentInfos // has been written with such external segments // that an IndexReader would fail to load). _CLTHROWA(CL_ERR_Merge, (string("segment \"") + info->name + " exists in external directory yet the MergeScheduler executed the merge in a separate thread").c_str() ); } else // No more external segments break; } if (any) // Sometimes, on copying an external segment over, // more merges may become necessary: mergeScheduler->merge(this); } void IndexWriter::doAfterFlush(){ } void IndexWriter::flush() { flush(true, false); } void IndexWriter::flush(bool triggerMerge, bool _flushDocStores) { ensureOpen(); if (doFlush(_flushDocStores) && triggerMerge) maybeMerge(); } bool IndexWriter::doFlush(bool _flushDocStores) { SCOPED_LOCK_MUTEX(THIS_LOCK) // Make sure no threads are actively adding a document // Returns true if docWriter is currently aborting, in // which case we skip flushing this segment if (docWriter->pauseAllThreads()) { docWriter->resumeAllThreads(); return false; } bool ret = false; try { SegmentInfo* newSegment = NULL; const int32_t numDocs = docWriter->getNumDocsInRAM(); // Always flush docs if there are any bool flushDocs = numDocs > 0; // With autoCommit=true we always must flush the doc // stores when we flush _flushDocStores |= autoCommit; string docStoreSegment = docWriter->getDocStoreSegment(); if (docStoreSegment.empty()) _flushDocStores = false; // Always flush deletes if there are any delete terms. // TODO: when autoCommit=false we don't have to flush // deletes with every flushed segment; we can save // CPU/IO by buffering longer & flushing deletes only // when they are full or writer is being closed. We // have to fix the "applyDeletesSelectively" logic to // apply to more than just the last flushed segment bool flushDeletes = docWriter->hasDeletes(); if (infoStream != NULL) { message(" flush: segment=" + docWriter->getSegment() + " docStoreSegment=" + docWriter->getDocStoreSegment() + " docStoreOffset=" + Misc::toString(docWriter->getDocStoreOffset()) + " flushDocs=" + Misc::toString(flushDocs) + " flushDeletes=" + Misc::toString(flushDeletes) + " flushDocStores=" + Misc::toString(_flushDocStores) + " numDocs=" + Misc::toString(numDocs) + " numBufDelTerms=" + Misc::toString(docWriter->getNumBufferedDeleteTerms()) ); message(" index before flush " + segString()); } int32_t docStoreOffset = docWriter->getDocStoreOffset(); // docStoreOffset should only be non-zero when // autoCommit == false assert (!autoCommit || 0 == docStoreOffset); bool docStoreIsCompoundFile = false; // Check if the doc stores must be separately flushed // because other segments, besides the one we are about // to flush, reference it if (_flushDocStores && (!flushDocs || !docWriter->getSegment().compare(docWriter->getDocStoreSegment())==0 )) { // We must separately flush the doc store if (infoStream != NULL) message(" flush shared docStore segment " + docStoreSegment); docStoreIsCompoundFile = flushDocStores(); _flushDocStores = false; } string segment = docWriter->getSegment(); // If we are flushing docs, segment must not be NULL: assert (!segment.empty() || !flushDocs); if (flushDocs || flushDeletes) { SegmentInfos* rollback = NULL; if (flushDeletes) rollback = segmentInfos->clone(); bool success = false; try { if (flushDocs) { if (0 == docStoreOffset && _flushDocStores) { // This means we are flushing doc stores // with this segment, so it will not be shared // with other segments assert (!docStoreSegment.empty()); assert (docStoreSegment.compare(segment)==0); docStoreOffset = -1; docStoreIsCompoundFile = false; docStoreSegment.clear(); } int32_t flushedDocCount = docWriter->flush(_flushDocStores); newSegment = _CLNEW SegmentInfo(segment.c_str(), flushedDocCount, directory, false, true, docStoreOffset, docStoreSegment.c_str(), docStoreIsCompoundFile); segmentInfos->insert(newSegment); } if (flushDeletes) // we should be able to change this so we can // buffer deletes longer and then flush them to // multiple flushed segments, when // autoCommit=false applyDeletes(flushDocs); doAfterFlush(); checkpoint(); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message("hit exception flushing segment " + segment); if (flushDeletes) { // Carefully check if any partial .del files // should be removed: const int32_t size = rollback->size(); for(int32_t i=0;iinfo(i)->getDelFileName(); const string delFileName = rollback->info(i)->getDelFileName(); if ( !newDelFileName.empty() && newDelFileName.compare(delFileName)!=0 ) deleter->deleteFile(newDelFileName.c_str()); } // Fully replace the segmentInfos since flushed // deletes could have changed any of the // SegmentInfo instances: segmentInfos->clear(); assert(false);//test me.. segmentInfos->insert(rollback, false); } else { // Remove segment we added, if any: if ( newSegment != NULL && segmentInfos->size() > 0 && segmentInfos->info(segmentInfos->size()-1) == newSegment) segmentInfos->remove(segmentInfos->size()-1); } if (flushDocs) docWriter->abort(NULL); deletePartialSegmentsFile(); deleter->checkpoint(segmentInfos, false); if (!segment.empty()) deleter->refresh(segment.c_str()); } else if (flushDeletes) _CLDELETE(rollback); ) deleter->checkpoint(segmentInfos, autoCommit); if (flushDocs && mergePolicy->useCompoundFile(segmentInfos, newSegment)) { success = false; try { docWriter->createCompoundFile(segment); newSegment->setUseCompoundFile(true); checkpoint(); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message("hit exception creating compound file for newly flushed segment " + segment); newSegment->setUseCompoundFile(false); deleter->deleteFile( (segment + "." + IndexFileNames::COMPOUND_FILE_EXTENSION).c_str() ); deletePartialSegmentsFile(); } ) deleter->checkpoint(segmentInfos, autoCommit); } ret = true; } } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } _CLFINALLY ( docWriter->clearFlushPending(); docWriter->resumeAllThreads(); ) return ret; } int64_t IndexWriter::ramSizeInBytes() { ensureOpen(); return docWriter->getRAMUsed(); } int32_t IndexWriter::numRamDocs() { SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); return docWriter->getNumDocsInRAM(); } int32_t IndexWriter::ensureContiguousMerge(MergePolicy::OneMerge* _merge) { int32_t first = segmentInfos->indexOf(_merge->segments->info(0)); if (first == -1) _CLTHROWA(CL_ERR_Merge, (string("could not find segment ") + _merge->segments->info(0)->name + " in current segments").c_str()); const int32_t numSegments = segmentInfos->size(); const int32_t numSegmentsToMerge = _merge->segments->size(); for(int32_t i=0;isegments->info(i); if (first + i >= numSegments || !segmentInfos->info(first+i)->equals(info) ) { if (segmentInfos->indexOf(info) == -1) _CLTHROWA(CL_ERR_Merge, (string("MergePolicy selected a segment (") + info->name + ") that is not in the index").c_str()); else _CLTHROWA(CL_ERR_Merge, (string("MergePolicy selected non-contiguous segments to merge (") + _merge->getObjectName() + " vs " + segString() + "), which IndexWriter (currently) cannot handle").c_str() ); } } return first; } bool IndexWriter::commitMerge(MergePolicy::OneMerge* _merge) { SCOPED_LOCK_MUTEX(THIS_LOCK) assert (_merge->registerDone); if (hitOOM) return false; if (infoStream != NULL) message("commitMerge: " + _merge->segString(directory)); // If merge was explicitly aborted, or, if abort() or // rollbackTransaction() had been called since our merge // started (which results in an unqualified // deleter->refresh() call that will remove any index // file that current segments does not reference), we // abort this merge if (_merge->isAborted()) { if (infoStream != NULL) message("commitMerge: skipping merge " + _merge->segString(directory) + ": it was aborted"); assert (_merge->increfDone); decrefMergeSegments(_merge); deleter->refresh(_merge->info->name.c_str()); return false; } bool success = false; int32_t start; try { SegmentInfos* sourceSegmentsClone = _merge->segmentsClone; const SegmentInfos* sourceSegments = _merge->segments; start = ensureContiguousMerge(_merge); if (infoStream != NULL) message("commitMerge " + _merge->segString(directory)); // Carefully merge deletes that occurred after we // started merging: BitVector* deletes = NULL; int32_t docUpto = 0; const int32_t numSegmentsToMerge = sourceSegments->size(); for(int32_t i=0;iinfo(i); const SegmentInfo* currentInfo = sourceSegments->info(i); assert (currentInfo->docCount == previousInfo->docCount); const int32_t docCount = currentInfo->docCount; if (previousInfo->hasDeletions()) { // There were deletes on this segment when the merge // started. The merge has collapsed away those // deletes, but, if _CLNEW deletes were flushed since // the merge started, we must now carefully keep any // newly flushed deletes but mapping them to the _CLNEW // docIDs. assert (currentInfo->hasDeletions()); // Load deletes present @ start of merge, for this segment: BitVector previousDeletes(previousInfo->dir, previousInfo->getDelFileName().c_str()); if (!currentInfo->getDelFileName().compare(previousInfo->getDelFileName())==0 ){ // This means this segment has had new deletes // committed since we started the merge, so we // must merge them: if (deletes == NULL) deletes = _CLNEW BitVector(_merge->info->docCount); BitVector currentDeletes(currentInfo->dir, currentInfo->getDelFileName().c_str()); for(int32_t j=0;jset(docUpto); docUpto++; } } } else docUpto += docCount - previousDeletes.count(); } else if (currentInfo->hasDeletions()) { // This segment had no deletes before but now it // does: if (deletes == NULL) deletes = _CLNEW BitVector(_merge->info->docCount); BitVector currentDeletes(directory, currentInfo->getDelFileName().c_str()); for(int32_t j=0;jset(docUpto); docUpto++; } } else // No deletes before or after docUpto += currentInfo->docCount; _merge->checkAborted(directory); } if (deletes != NULL) { _merge->info->advanceDelGen(); deletes->write(directory, _merge->info->getDelFileName().c_str() ); _CLDELETE(deletes); } success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception creating merged deletes file")); deleter->refresh(_merge->info->name.c_str()); } ) // Simple optimization: if the doc store we are using // has been closed and is in now compound format (but // wasn't when we started), then we will switch to the // compound format as well: const string mergeDocStoreSegment = _merge->info->getDocStoreSegment(); if ( !mergeDocStoreSegment.empty() && !_merge->info->getDocStoreIsCompoundFile()) { const int32_t size = segmentInfos->size(); for(int32_t i=0;iinfo(i); const string docStoreSegment = info->getDocStoreSegment(); if ( !docStoreSegment.empty() && docStoreSegment.compare(mergeDocStoreSegment)==0 && info->getDocStoreIsCompoundFile()) { _merge->info->setDocStoreIsCompoundFile(true); break; } } } success = false; SegmentInfos* rollback = NULL; try { rollback = segmentInfos->clone(); int32_t segmentssize = _merge->segments->size(); for ( int32_t i=0;iremove(start); } segmentInfos->add(_merge->info,start); checkpoint(); success = true; } _CLFINALLY ( if (!success && rollback != NULL) { if (infoStream != NULL) message(string("hit exception when checkpointing after merge")); segmentInfos->clear(); segmentInfos->insert(rollback,true); deletePartialSegmentsFile(); deleter->refresh(_merge->info->name.c_str()); } _CLDELETE(rollback); ) if (_merge->optimize) segmentsToOptimize->push_back(_merge->info); // Must checkpoint before decrefing so any newly // referenced files in the _CLNEW merge->info are incref'd // first: deleter->checkpoint(segmentInfos, autoCommit); decrefMergeSegments(_merge); return true; } void IndexWriter::decrefMergeSegments(MergePolicy::OneMerge* _merge) { const SegmentInfos* sourceSegmentsClone = _merge->segmentsClone; const int32_t numSegmentsToMerge = sourceSegmentsClone->size(); assert (_merge->increfDone); _merge->increfDone = false; for(int32_t i=0;iinfo(i); // Decref all files for this SegmentInfo (this // matches the incref in mergeInit): if (previousInfo->dir == directory) deleter->decRef(previousInfo->files()); } } void IndexWriter::merge(MergePolicy::OneMerge* _merge) { assert (_merge->registerDone); assert (!_merge->optimize || _merge->maxNumSegmentsOptimize > 0); bool success = false; try { try { try { mergeInit(_merge); if (infoStream != NULL) message("now merge\n merge=" + _merge->segString(directory) + "\n index=" + segString()); mergeMiddle(_merge); success = true; } catch (CLuceneError& e) { if ( e.number() != CL_ERR_MergeAborted ) throw e; _merge->setException(e); addMergeException(_merge); // We can ignore this exception, unless the merge // involves segments from external directories, in // which case we must throw it so, for example, the // rollbackTransaction code in addIndexes* is // executed. if (_merge->isExternal) throw e; } } _CLFINALLY ( { SCOPED_LOCK_MUTEX(this->THIS_LOCK) try { mergeFinish(_merge); if (!success) { if (infoStream != NULL) message(string("hit exception during merge")); addMergeException(_merge); if (_merge->info != NULL && segmentInfos->indexOf(_merge->info)==-1) deleter->refresh(_merge->info->name.c_str()); } // This merge (and, generally, any change to the // segments) may now enable new merges, so we call // merge policy & update pending merges. if (success && !_merge->isAborted() && !closed && !closing) updatePendingMerges(_merge->maxNumSegmentsOptimize, _merge->optimize); } _CLFINALLY ( RunningMergesType::iterator itr = runningMerges->find(_merge); if ( itr != runningMerges->end() ) runningMerges->remove( itr ); // Optimize may be waiting on the final optimize // merge to finish; and finishMerges() may be // waiting for all merges to finish: CONDITION_NOTIFYALL(THIS_WAIT_CONDITION) ) } ) } catch (std::bad_alloc&) { hitOOM = true; _CLTHROWA(CL_ERR_OutOfMemory,"Out of memory"); } } bool IndexWriter::registerMerge(MergePolicy::OneMerge* _merge) { SCOPED_LOCK_MUTEX(THIS_LOCK) if (_merge->registerDone) return true; const int32_t count = _merge->segments->size(); bool isExternal = false; for(int32_t i=0;isegments->info(i); if (mergingSegments->find(info) != mergingSegments->end()) return false; if (segmentInfos->indexOf(info) == -1) return false; if (info->dir != directory) isExternal = true; } pendingMerges->push_back(_merge); if (infoStream != NULL) message( string("add merge to pendingMerges: ") + _merge->segString(directory) + " [total " + Misc::toString((int32_t)pendingMerges->size()) + " pending]"); _merge->mergeGen = mergeGen; _merge->isExternal = isExternal; // OK it does not conflict; now record that this merge // is running (while synchronized) to avoid race // condition where two conflicting merges from different // threads, start for(int32_t i=0;iinsert(mergingSegments->end(),_merge->segments->info(i)); // Merge is now registered _merge->registerDone = true; return true; } void IndexWriter::mergeInit(MergePolicy::OneMerge* _merge) { SCOPED_LOCK_MUTEX(THIS_LOCK) bool success = false; try { _mergeInit(_merge); success = true; } _CLFINALLY ( if (!success) { mergeFinish(_merge); RunningMergesType::iterator itr = runningMerges->find(_merge); if ( itr != runningMerges->end() ) runningMerges->remove(itr); } ) } void IndexWriter::_mergeInit(MergePolicy::OneMerge* _merge) { SCOPED_LOCK_MUTEX(THIS_LOCK) assert (testPoint("startMergeInit")); assert (_merge->registerDone); if (_merge->info != NULL) // mergeInit already done return; if (_merge->isAborted()) return; const SegmentInfos* sourceSegments = _merge->segments; const int32_t end = sourceSegments->size(); ensureContiguousMerge(_merge); // Check whether this merge will allow us to skip // merging the doc stores (stored field & vectors). // This is a very substantial optimization (saves tons // of IO) that can only be applied with // autoCommit=false. Directory* lastDir = directory; string lastDocStoreSegment; int32_t next = -1; bool mergeDocStores = false; bool doFlushDocStore = false; const string currentDocStoreSegment = docWriter->getDocStoreSegment(); // Test each segment to be merged: check if we need to // flush/merge doc stores for (int32_t i = 0; i < end; i++) { SegmentInfo* si = sourceSegments->info(i); // If it has deletions we must merge the doc stores if (si->hasDeletions()) mergeDocStores = true; // If it has its own (private) doc stores we must // merge the doc stores if (-1 == si->getDocStoreOffset()) mergeDocStores = true; // If it has a different doc store segment than // previous segments, we must merge the doc stores string docStoreSegment = si->getDocStoreSegment(); if (docStoreSegment.empty()) mergeDocStores = true; else if (lastDocStoreSegment.empty()) lastDocStoreSegment = docStoreSegment; else if (!lastDocStoreSegment.compare(docStoreSegment)==0 ) mergeDocStores = true; // Segments' docScoreOffsets must be in-order, // contiguous. For the default merge policy now // this will always be the case but for an arbitrary // merge policy this may not be the case if (-1 == next) next = si->getDocStoreOffset() + si->docCount; else if (next != si->getDocStoreOffset()) mergeDocStores = true; else next = si->getDocStoreOffset() + si->docCount; // If the segment comes from a different directory // we must merge if (lastDir != si->dir) mergeDocStores = true; // If the segment is referencing the current "live" // doc store outputs then we must merge if (si->getDocStoreOffset() != -1 && !currentDocStoreSegment.empty() && si->getDocStoreSegment().compare(currentDocStoreSegment)==0 ) doFlushDocStore = true; } int32_t docStoreOffset; string docStoreSegment; bool docStoreIsCompoundFile; if (mergeDocStores) { docStoreOffset = -1; docStoreSegment.clear(); docStoreIsCompoundFile = false; } else { SegmentInfo* si = sourceSegments->info(0); docStoreOffset = si->getDocStoreOffset(); docStoreSegment = si->getDocStoreSegment(); docStoreIsCompoundFile = si->getDocStoreIsCompoundFile(); } if (mergeDocStores && doFlushDocStore) { // SegmentMerger intends to merge the doc stores // (stored fields, vectors), and at least one of the // segments to be merged refers to the currently // live doc stores. // TODO: if we know we are about to merge away these // newly flushed doc store files then we should not // make compound file out of them... if (infoStream != NULL) message(string("flush at merge")); flush(false, true); } // We must take a full copy at this point so that we can // properly merge deletes in commitMerge() _merge->segmentsClone = _merge->segments->clone(); for (int32_t i = 0; i < end; i++) { SegmentInfo* si = _merge->segmentsClone->info(i); // IncRef all files for this segment info to make sure // they are not removed while we are trying to merge-> if (si->dir == directory) deleter->incRef(si->files()); } _merge->increfDone = true; _merge->mergeDocStores = mergeDocStores; // Bind a _CLNEW segment name here so even with // ConcurrentMergePolicy we keep deterministic segment // names. _merge->info = _CLNEW SegmentInfo(newSegmentName().c_str(), 0, directory, false, true, docStoreOffset, docStoreSegment.c_str(), docStoreIsCompoundFile); // Also enroll the merged segment into mergingSegments; // this prevents it from getting selected for a merge // after our merge is done but while we are building the // CFS: mergingSegments->insert(_merge->info); } void IndexWriter::mergeFinish(MergePolicy::OneMerge* _merge) { SCOPED_LOCK_MUTEX(THIS_LOCK) if (_merge->increfDone) decrefMergeSegments(_merge); assert (_merge->registerDone); const SegmentInfos* sourceSegments = _merge->segments; const int32_t end = sourceSegments->size(); for(int32_t i=0;ifind(sourceSegments->info(i)); if ( itr != mergingSegments->end() ) mergingSegments->remove(itr); } MergingSegmentsType::iterator itr = mergingSegments->find(_merge->info); if ( itr != mergingSegments->end() ) mergingSegments->remove(itr); _merge->registerDone = false; } int32_t IndexWriter::mergeMiddle(MergePolicy::OneMerge* _merge) { _merge->checkAborted(directory); const string mergedName = _merge->info->name; int32_t mergedDocCount = 0; const SegmentInfos* sourceSegments = _merge->segments; SegmentInfos* sourceSegmentsClone = _merge->segmentsClone; const int32_t numSegments = sourceSegments->size(); if (infoStream != NULL) message("merging " + _merge->segString(directory)); SegmentMerger merger (this, mergedName.c_str(), _merge) ; // This is try/finally to make sure merger's readers are // closed: bool success = false; try { int32_t totDocCount = 0; for (int32_t i = 0; i < numSegments; i++) { SegmentInfo* si = sourceSegmentsClone->info(i); IndexReader* reader = SegmentReader::get(si, MERGE_READ_BUFFER_SIZE, _merge->mergeDocStores); // no need to set deleter (yet) merger.add(reader); totDocCount += reader->numDocs(); } if (infoStream != NULL) { message(string("merge: total ")+ Misc::toString(totDocCount)+" docs"); } _merge->checkAborted(directory); mergedDocCount = _merge->info->docCount = merger.merge(_merge->mergeDocStores); assert (mergedDocCount == totDocCount); success = true; } _CLFINALLY ( // close readers before we attempt to delete // now-obsolete segments merger.closeReaders(); if (!success) { if (infoStream != NULL) message("hit exception during merge; now refresh deleter on segment " + mergedName); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) addMergeException(_merge); deleter->refresh(mergedName.c_str()); } } ) if (!commitMerge(_merge)) // commitMerge will return false if this merge was aborted return 0; if (_merge->useCompoundFile) { success = false; bool skip = false; const string compoundFileName = mergedName + "." + IndexFileNames::COMPOUND_FILE_EXTENSION; try { try { merger.createCompoundFile(compoundFileName.c_str()); success = true; } catch (CLuceneError& ioe) { if ( ioe.number() != CL_ERR_IO ) throw ioe; { SCOPED_LOCK_MUTEX(this->THIS_LOCK) if (segmentInfos->indexOf(_merge->info) == -1) { // If another merge kicked in and merged our // _CLNEW segment away while we were trying to // build the compound file, we can hit a // FileNotFoundException and possibly // IOException over NFS. We can tell this has // happened because our SegmentInfo is no // longer in the segments; if this has // happened it is safe to ignore the exception // & skip finishing/committing our compound // file creating. if (infoStream != NULL) message("hit exception creating compound file; ignoring it because our info (segment " + _merge->info->name + ") has been merged away"); skip = true; } else throw ioe; } } } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception creating compound file during merge: skip=") + Misc::toString(skip)); { SCOPED_LOCK_MUTEX(this->THIS_LOCK) if (!skip) addMergeException(_merge); deleter->deleteFile(compoundFileName.c_str()); } } ) if (!skip) { { SCOPED_LOCK_MUTEX(this->THIS_LOCK) if (skip || segmentInfos->indexOf(_merge->info) == -1 || _merge->isAborted()) { // Our segment (committed in non-compound // format) got merged away while we were // building the compound format. deleter->deleteFile(compoundFileName.c_str()); } else { success = false; try { _merge->info->setUseCompoundFile(true); checkpoint(); success = true; } _CLFINALLY ( if (!success) { if (infoStream != NULL) message(string("hit exception checkpointing compound file during merge")); // Must rollback: addMergeException(_merge); _merge->info->setUseCompoundFile(false); deletePartialSegmentsFile(); deleter->deleteFile(compoundFileName.c_str()); } ) // Give deleter a chance to remove files now. deleter->checkpoint(segmentInfos, autoCommit); } } } } return mergedDocCount; } void IndexWriter::addMergeException(MergePolicy::OneMerge* _merge) { SCOPED_LOCK_MUTEX(THIS_LOCK) if ( mergeGen == _merge->mergeGen ){ MergeExceptionsType::iterator itr = mergeExceptions->begin(); while ( itr != mergeExceptions->end() ){ MergePolicy::OneMerge* x = *itr; if ( x == _merge ){ return; } } } mergeExceptions->push_back(_merge); } void IndexWriter::deletePartialSegmentsFile() { if (segmentInfos->getLastGeneration() != segmentInfos->getGeneration()) { string segmentFileName = IndexFileNames::fileNameFromGeneration(IndexFileNames::SEGMENTS, "", segmentInfos->getGeneration()); if (infoStream != NULL) message("now delete partial segments file \"" + segmentFileName + "\""); deleter->deleteFile(segmentFileName.c_str()); } } void IndexWriter::applyDeletes(bool flushedNewSegment) { const DocumentsWriter::TermNumMapType& bufferedDeleteTerms = docWriter->getBufferedDeleteTerms(); const vector* bufferedDeleteDocIDs = docWriter->getBufferedDeleteDocIDs(); if (infoStream != NULL) message( string("flush ") + Misc::toString(docWriter->getNumBufferedDeleteTerms()) + " buffered deleted terms and " + Misc::toString((int32_t)bufferedDeleteDocIDs->size()) + " deleted docIDs on " + Misc::toString((int32_t)segmentInfos->size()) + " segments."); if (flushedNewSegment) { IndexReader* reader = NULL; try { // Open readers w/o opening the stored fields / // vectors because these files may still be held // open for writing by docWriter reader = SegmentReader::get(segmentInfos->info(segmentInfos->size() - 1), false); // Apply delete terms to the segment just flushed from ram // apply appropriately so that a delete term is only applied to // the documents buffered before it, not those buffered after it. _internal->applyDeletesSelectively(bufferedDeleteTerms, *bufferedDeleteDocIDs, reader); } _CLFINALLY ( if (reader != NULL) { try { reader->doCommit(); } _CLFINALLY ( reader->doClose(); _CLLDELETE(reader); ) } ) } int32_t infosEnd = segmentInfos->size(); if (flushedNewSegment) { infosEnd--; } for (int32_t i = 0; i < infosEnd; i++) { IndexReader* reader = NULL; try { reader = SegmentReader::get(segmentInfos->info(i), false); // Apply delete terms to disk segments // except the one just flushed from ram. _internal->applyDeletes(bufferedDeleteTerms, reader); } _CLFINALLY ( if (reader != NULL) { try { reader->doCommit(); } _CLFINALLY ( reader->doClose(); ) } ) } // Clean up bufferedDeleteTerms. docWriter->clearBufferedDeletes(); } int32_t IndexWriter::getBufferedDeleteTermsSize() { SCOPED_LOCK_MUTEX(THIS_LOCK) return docWriter->getBufferedDeleteTerms().size(); } int32_t IndexWriter::getNumBufferedDeleteTerms() { SCOPED_LOCK_MUTEX(THIS_LOCK) return docWriter->getNumBufferedDeleteTerms(); } void IndexWriter::Internal::applyDeletesSelectively(const DocumentsWriter::TermNumMapType& deleteTerms, const vector& deleteIds, IndexReader* reader) { DocumentsWriter::TermNumMapType::const_iterator iter = deleteTerms.begin(); while (iter != deleteTerms.end() ) { Term* term = iter->first; TermDocs* docs = reader->termDocs(term); if (docs != NULL) { int32_t num = iter->second->getNum(); try { while (docs->next()) { int32_t doc = docs->doc(); if (doc >= num) { break; } reader->deleteDocument(doc); } } _CLFINALLY ( docs->close(); _CLDELETE(docs); ) } iter++; } if (deleteIds.size() > 0) { vector::const_iterator iter2 = deleteIds.begin(); while (iter2 != deleteIds.end()){ reader->deleteDocument(*iter2); ++iter2; } } } void IndexWriter::Internal::applyDeletes(const DocumentsWriter::TermNumMapType& deleteTerms, IndexReader* reader) { DocumentsWriter::TermNumMapType::const_iterator iter = deleteTerms.begin(); while (iter != deleteTerms.end()) { reader->deleteDocuments(iter->first); iter++; } } SegmentInfo* IndexWriter::newestSegment() { return segmentInfos->info(segmentInfos->size()-1); } string IndexWriter::segString() { SCOPED_LOCK_MUTEX(THIS_LOCK) std::string buffer; for(int32_t i = 0; i < segmentInfos->size(); i++) { if (i > 0) { buffer+= " "; } buffer+= segmentInfos->info(i)->segString(directory); } return buffer; } bool IndexWriter::testPoint(const char* name) { return true; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/IndexWriter.h000066400000000000000000001436411154025176300230230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_IndexWriter_ #define _lucene_index_IndexWriter_ #include "CLucene/util/VoidList.h" #include "CLucene/util/Array.h" CL_CLASS_DEF(search,Similarity) CL_CLASS_DEF(store,Lock) CL_CLASS_DEF(analysis,Analyzer) CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(store,LuceneLock) CL_CLASS_DEF(document,Document) #include "MergePolicy.h" #include "CLucene/LuceneThreads.h" CL_NS_DEF(index) class SegmentInfo; class SegmentInfos; class MergePolicy; class IndexReader; class SegmentReader; class MergeScheduler; class DocumentsWriter; class IndexFileDeleter; class LogMergePolicy; class IndexDeletionPolicy; class Term; /** An IndexWriter creates and maintains an index.

The create argument to the constructor determines whether a new index is created, or whether an existing index is opened. Note that you can open an index with create=true even while readers are using the index. The old readers will continue to search the "point in time" snapshot they had opened, and won't see the newly created index until they re-open. There are also constructors with no create argument which will create a new index if there is not already an index at the provided path and otherwise open the existing index.

In either case, documents are added with addDocument and removed with deleteDocuments. A document can be updated with updateDocument (which just deletes and then adds the entire document). When finished adding, deleting and updating documents, close should be called.

These changes are buffered in memory and periodically flushed to the {@link Directory} (during the above method calls). A flush is triggered when there are enough buffered deletes (see {@link #setMaxBufferedDeleteTerms}) or enough added documents since the last flush, whichever is sooner. For the added documents, flushing is triggered either by RAM usage of the documents (see {@link #setRAMBufferSizeMB}) or the number of added documents. The default is to flush when RAM usage hits 16 MB. For best indexing speed you should flush by RAM usage with a large RAM buffer. You can also force a flush by calling {@link #flush}. When a flush occurs, both pending deletes and added documents are flushed to the index. A flush may also trigger one or more segment merges which by default run with a background thread so as not to block the addDocument calls (see below for changing the {@link MergeScheduler}).

The optional autoCommit argument to the constructors controls visibility of the changes to {@link IndexReader} instances reading the same index. When this is false, changes are not visible until {@link #close()} is called. Note that changes will still be flushed to the {@link org.apache.lucene.store.Directory} as new files, but are not committed (no new segments_N file is written referencing the new files) until {@link #close} is called. If something goes terribly wrong (for example the JVM crashes) before {@link #close()}, then the index will reflect none of the changes made (it will remain in its starting state). You can also call {@link #abort()}, which closes the writer without committing any changes, and removes any index files that had been flushed but are now unreferenced. This mode is useful for preventing readers from refreshing at a bad time (for example after you've done all your deletes but before you've done your adds). It can also be used to implement simple single-writer transactional semantics ("all or none").

When autoCommit is true then every flush is also a commit ({@link IndexReader} instances will see each flush as changes to the index). This is the default, to match the behavior before 2.2. When running in this mode, be careful not to refresh your readers while optimize or segment merges are taking place as this can tie up substantial disk space.

Regardless of autoCommit, an {@link IndexReader} or {@link org.apache.lucene.search.IndexSearcher} will only see the index as of the "point in time" that it was opened. Any changes committed to the index after the reader was opened are not visible until the reader is re-opened.

If an index will not have more documents added for a while and optimal search performance is desired, then the optimize method should be called before the index is closed.

Opening an IndexWriter creates a lock file for the directory in use. Trying to open another IndexWriter on the same directory will lead to a {@link LockObtainFailedException}. The {@link LockObtainFailedException} is also thrown if an IndexReader on the same directory is used to delete documents from the index.

Expert: IndexWriter allows an optional {@link IndexDeletionPolicy} implementation to be specified. You can use this to control when prior commits are deleted from the index. The default policy is {@link KeepOnlyLastCommitDeletionPolicy} which removes all prior commits as soon as a new commit is done (this matches behavior before 2.2). Creating your own policy can allow you to explicitly keep previous "point in time" commits alive in the index for some time, to allow readers to refresh to the new commit without having the old commit deleted out from under them. This is necessary on filesystems like NFS that do not support "delete on last close" semantics, which Lucene's "point in time" search normally relies on.

Expert: IndexWriter allows you to separately change the {@link MergePolicy} and the {@link MergeScheduler}. The {@link MergePolicy} is invoked whenever there are changes to the segments in the index. Its role is to select which merges to do, if any, and return a {@link MergePolicy.MergeSpecification} describing the merges. It also selects merges to do for optimize(). (The default is {@link LogByteSizeMergePolicy}. Then, the {@link MergeScheduler} is invoked with the requested merges and it decides when and how to run the merges. The default is {@link ConcurrentMergeScheduler}.

*/ /* * Clarification: Check Points (and commits) * Being able to set autoCommit=false allows IndexWriter to flush and * write new index files to the directory without writing a new segments_N * file which references these new files. It also means that the state of * the in memory SegmentInfos object is different than the most recent * segments_N file written to the directory. * * Each time the SegmentInfos is changed, and matches the (possibly * modified) directory files, we have a new "check point". * If the modified/new SegmentInfos is written to disk - as a new * (generation of) segments_N file - this check point is also an * IndexCommitPoint. * * With autoCommit=true, every checkPoint is also a CommitPoint. * With autoCommit=false, some checkPoints may not be commits. * * A new checkpoint always replaces the previous checkpoint and * becomes the new "front" of the index. This allows the IndexFileDeleter * to delete files that are referenced only by stale checkpoints. * (files that were created since the last commit, but are no longer * referenced by the "front" of the index). For this, IndexFileDeleter * keeps track of the last non commit checkpoint. */ class CLUCENE_EXPORT IndexWriter:LUCENE_BASE { bool isOpen; //indicates if the writers is open - this way close can be called multiple times // how to analyze text CL_NS(analysis)::Analyzer* analyzer; CL_NS(search)::Similarity* similarity; // how to normalize bool closeDir; bool closed; bool closing; // Holds all SegmentInfo instances currently involved in // merges typedef CL_NS(util)::CLHashSet > MergingSegmentsType; MergingSegmentsType* mergingSegments; MergePolicy* mergePolicy; MergeScheduler* mergeScheduler; typedef CL_NS(util)::CLLinkedList > PendingMergesType; PendingMergesType* pendingMerges; typedef CL_NS(util)::CLHashSet, CL_NS(util)::Deletor::Object > RunningMergesType; RunningMergesType* runningMerges; typedef CL_NS(util)::CLArrayList MergeExceptionsType; MergeExceptionsType* mergeExceptions; int64_t mergeGen; bool stopMerges; /** If non-null, information about merges will be printed to this. */ std::ostream* infoStream; static std::ostream* defaultInfoStream; bool commitPending; // true if segmentInfos has changes not yet committed SegmentInfos* rollbackSegmentInfos; // segmentInfos we will fallback to if the commit fails SegmentInfos* localRollbackSegmentInfos; // segmentInfos we will fallback to if the commit fails bool localAutoCommit; // saved autoCommit during local transaction bool autoCommit; // false if we should commit only on close DocumentsWriter* docWriter; IndexFileDeleter* deleter; typedef std::vector SegmentsToOptimizeType; SegmentsToOptimizeType* segmentsToOptimize; // used by optimize to note those needing optimization CL_NS(store)::LuceneLock* writeLock; void init(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, bool closeDir, IndexDeletionPolicy* deletionPolicy, bool autoCommit); void init(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, bool create, bool closeDir, IndexDeletionPolicy* deletionPolicy, bool autoCommit); void deinit(bool releaseWriteLock = true) throw(); // where this index resides CL_NS(store)::Directory* directory; bool bOwnsDirectory; int32_t getSegmentsCounter(); int32_t maxFieldLength; int32_t mergeFactor; int32_t minMergeDocs; int32_t maxMergeDocs; int32_t termIndexInterval; int64_t writeLockTimeout; int64_t commitLockTimeout; // The normal read buffer size defaults to 1024, but // increasing this during merging seems to yield // performance gains. However we don't want to increase // it too much because there are quite a few // BufferedIndexInputs created during merging. See // LUCENE-888 for details. static const int32_t MERGE_READ_BUFFER_SIZE; // Used for printing messages STATIC_DEFINE_MUTEX(MESSAGE_ID_LOCK) static int32_t MESSAGE_ID; int32_t messageID; mutable bool hitOOM; public: DEFINE_MUTEX(THIS_LOCK) DEFINE_CONDITION(THIS_WAIT_CONDITION) // Release the write lock, if needed. SegmentInfos* segmentInfos; // Release the write lock, if needed. virtual ~IndexWriter(); /** * The Java implementation of Lucene silently truncates any tokenized * field if the number of tokens exceeds a certain threshold. Although * that threshold is adjustable, it is easy for the client programmer * to be unaware that such a threshold exists, and to become its * unwitting victim. * CLucene implements a less insidious truncation policy. Up to * DEFAULT_MAX_FIELD_LENGTH tokens, CLucene behaves just as JLucene * does. If the number of tokens exceeds that threshold without any * indication of a truncation preference by the client programmer, * CLucene raises an exception, prompting the client programmer to * explicitly set a truncation policy by adjusting maxFieldLength. */ LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_MAX_FIELD_LENGTH = 10000); LUCENE_STATIC_CONSTANT(int32_t, FIELD_TRUNC_POLICY__WARN = -1); /** * Returns the maximum number of terms that will be * indexed for a single field in a document. * @see #setMaxFieldLength */ int32_t getMaxFieldLength(); /** * The maximum number of terms that will be indexed for a single field in a * document. This limits the amount of memory required for indexing, so that * collections with very large files will not crash the indexing process by * running out of memory. This setting refers to the number of running terms, * not to the number of different terms.

* Note: see {@link DEFAULT_MAX_FIELD_LENGTH} for an important * note regarding field lengths. * @see #DEFAULT_MAX_FIELD_LENGTH */ void setMaxFieldLength(int32_t val); /** Determines the minimal number of documents required before the buffered * in-memory documents are merging and a new Segment is created. * Since Documents are merged in a {@link RAMDirectory}, * large value gives faster indexing. At the same time, mergeFactor limits * the number of files open in a FSDirectory. * *

The default value is DEFAULT_MAX_BUFFERED_DOCS.*/ void setMaxBufferedDocs(int32_t val); /** * @see #setMaxBufferedDocs */ int32_t getMaxBufferedDocs(); /** * Default value for the write lock timeout (1,000). * @see #setDefaultWriteLockTimeout */ static int64_t WRITE_LOCK_TIMEOUT; /** * Sets the maximum time to wait for a write lock (in milliseconds). */ void setWriteLockTimeout(int64_t writeLockTimeout); /** * @see #setWriteLockTimeout */ int64_t getWriteLockTimeout(); /** * Sets the maximum time to wait for a commit lock (in milliseconds). */ void setCommitLockTimeout(int64_t commitLockTimeout); /** * @see #setCommitLockTimeout */ int64_t getCommitLockTimeout(); /** * Name of the write lock in the index. */ static const char* WRITE_LOCK_NAME; //"write.lock"; /** * @deprecated * @see LogMergePolicy#DEFAULT_MERGE_FACTOR */ static const int32_t DEFAULT_MERGE_FACTOR ; /** * Value to denote a flush trigger is disabled */ static const int32_t DISABLE_AUTO_FLUSH; /** * Disabled by default (because IndexWriter flushes by RAM usage * by default). Change using {@link #setMaxBufferedDocs(int)}. */ static const int32_t DEFAULT_MAX_BUFFERED_DOCS; /** * Default value is 16 MB (which means flush when buffered * docs consume 16 MB RAM). Change using {@link #setRAMBufferSizeMB}. */ static const float_t DEFAULT_RAM_BUFFER_SIZE_MB; /** * Disabled by default (because IndexWriter flushes by RAM usage * by default). Change using {@link #setMaxBufferedDeleteTerms(int)}. */ static const int32_t DEFAULT_MAX_BUFFERED_DELETE_TERMS; /** * @deprecated * @see LogDocMergePolicy#DEFAULT_MAX_MERGE_DOCS */ static const int32_t DEFAULT_MAX_MERGE_DOCS; /** * Absolute hard maximum length for a term. If a term * arrives from the analyzer longer than this length, it * is skipped and a message is printed to infoStream, if * set (see {@link #setInfoStream}). */ static const int32_t MAX_TERM_LENGTH; /* Determines how often segment indices are merged by addDocument(). With * smaller values, less RAM is used while indexing, and searches on * unoptimized indices are faster, but indexing speed is slower. With larger * values more RAM is used while indexing and searches on unoptimized indices * are slower, but indexing is faster. Thus larger values (> 10) are best * for batched index creation, and smaller values (< 10) for indices that are * interactively maintained. * *

This must never be less than 2. The default value is 10. */ int32_t getMergeFactor() const; void setMergeFactor(int32_t val); /** Expert: The fraction of terms in the "dictionary" which should be stored * in RAM. Smaller values use more memory, but make searching slightly * faster, while larger values use less memory and make searching slightly * slower. Searching is typically not dominated by dictionary lookup, so * tweaking this is rarely useful. */ LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_TERM_INDEX_INTERVAL = 128); /** Expert: Set the interval between indexed terms. Large values cause less * memory to be used by IndexReader, but slow random-access to terms. Small * values cause more memory to be used by an IndexReader, and speed * random-access to terms. * * This parameter determines the amount of computation required per query * term, regardless of the number of documents that contain that term. In * particular, it is the maximum number of other terms that must be * scanned before a term is located and its frequency and position information * may be processed. In a large index with user-entered query terms, query * processing time is likely to be dominated not by term lookup but rather * by the processing of frequency and positional data. In a small index * or when many uncommon query terms are generated (e.g., by wildcard * queries) term lookup may become a dominant cost. * * In particular, numUniqueTerms/interval terms are read into * memory by an IndexReader, and, on average, interval/2 terms * must be scanned for each random term access. * * @see #DEFAULT_TERM_INDEX_INTERVAL */ void setTermIndexInterval(int32_t interval); /** Expert: Return the interval between indexed terms. * * @see #setTermIndexInterval(int) */ int32_t getTermIndexInterval(); /**Determines the largest number of documents ever merged by addDocument(). * Small values (e.g., less than 10,000) are best for interactive indexing, * as this limits the length of pauses while indexing to a few seconds. * Larger values are best for batched indexing and speedier searches. * *

The default value is {@link Integer#MAX_VALUE}. */ int32_t getMaxMergeDocs() const; void setMaxMergeDocs(int32_t val); /** * Constructs an IndexWriter for the index in path. * Text will be analyzed with a. If create * is true, then a new, empty index will be created in * path, replacing the index already there, if any. * * @param path the path to the index directory * @param a the analyzer to use * @param create true to create the index or overwrite * the existing one; false to append to the existing * index * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if the directory cannot be read/written to, or * if it does not exist and create is * false or if there is any other low-level * IO error */ explicit IndexWriter(const char* path, CL_NS(analysis)::Analyzer* a, const bool create); /** * Constructs an IndexWriter for the index in d. * Text will be analyzed with a. If create * is true, then a new, empty index will be created in * d, replacing the index already there, if any. * * @param d the index directory * @param a the analyzer to use * @param create true to create the index or overwrite * the existing one; false to append to the existing * index * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if the directory cannot be read/written to, or * if it does not exist and create is * false or if there is any other low-level * IO error */ explicit IndexWriter(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, const bool create, const bool closeDirOnShutdown=false); /** * Expert: constructs an IndexWriter with a custom {@link * IndexDeletionPolicy}, for the index in d, * first creating it if it does not already exist. Text * will be analyzed with a. * * @param d the index directory * @param autoCommit see above * @param a the analyzer to use * @param deletionPolicy see above * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if the directory cannot be * read/written to or if there is any other low-level * IO error */ explicit IndexWriter(CL_NS(store)::Directory* d, const bool autoCommit, CL_NS(analysis)::Analyzer* a, IndexDeletionPolicy* deletionPolicy = NULL, const bool closeDirOnShutdown=false); /** * Expert: constructs an IndexWriter with a custom {@link * IndexDeletionPolicy}, for the index in d. * Text will be analyzed with a. If * create is true, then a new, empty index * will be created in d, replacing the index * already there, if any. * * @param d the index directory * @param autoCommit see above * @param a the analyzer to use * @param create true to create the index or overwrite * the existing one; false to append to the existing * index * @param deletionPolicy see above * @throws CorruptIndexException if the index is corrupt * @throws LockObtainFailedException if another writer * has this index open (write.lock could not * be obtained) * @throws IOException if the directory cannot be read/written to, or * if it does not exist and create is * false or if there is any other low-level * IO error */ explicit IndexWriter(CL_NS(store)::Directory* d, const bool autoCommit, CL_NS(analysis)::Analyzer* a, const bool create, IndexDeletionPolicy* deletionPolicy = NULL, const bool closeDirOnShutdown=false); /**Returns the number of documents currently in this index. * synchronized */ int32_t docCount(); /** Returns the directory this index resides in. */ CL_NS(store)::Directory* getDirectory(); /** Get the current setting of whether to use the compound file format. * Note that this just returns the value you set with setUseCompoundFile(boolean) * or the default. You cannot use this to query the status of an existing index. * @see #setUseCompoundFile(boolean) */ bool getUseCompoundFile(); /** Setting to turn on usage of a compound file. When on, multiple files * for each segment are merged into a single file once the segment creation * is finished. This is done regardless of what directory is in use. */ void setUseCompoundFile(bool value); /** Expert: Set the Similarity implementation used by this IndexWriter. * * @see Similarity#setDefault(Similarity) */ void setSimilarity(CL_NS(search)::Similarity* similarity); /** Expert: Return the Similarity implementation used by this IndexWriter. * *

This defaults to the current value of {@link Similarity#getDefault()}. */ CL_NS(search)::Similarity* getSimilarity(); /** Returns the analyzer used by this index. */ CL_NS(analysis)::Analyzer* getAnalyzer(); // synchronized std::string newSegmentName(); /** * Prints a message to the infoStream (if non-null), * prefixed with the identifying information for this * writer and the thread that's calling it. */ void message(std::string message); /** * Returns the current default infoStream for newly * instantiated IndexWriters. * @see #setDefaultInfoStream */ static std::ostream* getDefaultInfoStream(); /** * Returns the current infoStream in use by this writer. * @see #setInfoStream */ std::ostream* getInfoStream(); /** * Returns the number of buffered deleted terms that will * trigger a flush if enabled. * @see #setMaxBufferedDeleteTerms */ int32_t getMaxBufferedDeleteTerms(); /** * Expert: returns the current MergePolicy in use by this writer. * @see #setMergePolicy */ MergePolicy* getMergePolicy(); /** * Expert: returns the current MergePolicy in use by this * writer. * @see #setMergePolicy */ MergeScheduler* getMergeScheduler(); /** * Returns the value set by {@link #setRAMBufferSizeMB} if enabled. */ float_t getRAMBufferSizeMB(); /** If non-null, this will be the default infoStream used * by a newly instantiated IndexWriter. * @see #setInfoStream */ static void setDefaultInfoStream(std::ostream* infoStream);\ /** If non-null, information about merges, deletes and a * message when maxFieldLength is reached will be printed * to this. */ void setInfoStream(std::ostream* infoStream); /** *

Determines the minimal number of delete terms required before the buffered * in-memory delete terms are applied and flushed. If there are documents * buffered in memory at the time, they are merged and a new segment is * created.

*

Disabled by default (writer flushes by RAM usage).

* * @throws IllegalArgumentException if maxBufferedDeleteTerms * is enabled but smaller than 1 * @see #setRAMBufferSizeMB */ void setMaxBufferedDeleteTerms(int32_t maxBufferedDeleteTerms); /** * Expert: set the merge policy used by this writer. */ void setMergePolicy(MergePolicy* mp); /** * Expert: set the merge scheduler used by this writer. */ void setMergeScheduler(MergeScheduler* mergeScheduler); /** Determines the amount of RAM that may be used for * buffering added documents before they are flushed as a * new Segment. Generally for faster indexing performance * it's best to flush by RAM usage instead of document * count and use as large a RAM buffer as you can. * *

When this is set, the writer will flush whenever * buffered documents use this much RAM. Pass in {@link * #DISABLE_AUTO_FLUSH} to prevent triggering a flush due * to RAM usage. Note that if flushing by document count * is also enabled, then the flush will be triggered by * whichever comes first.

* *

The default value is {@link #DEFAULT_RAM_BUFFER_SIZE_MB}.

* * @throws IllegalArgumentException if ramBufferSize is * enabled but non-positive, or it disables ramBufferSize * when maxBufferedDocs is already disabled */ void setRAMBufferSizeMB(float_t mb); /** Expert: the {@link MergeScheduler} calls this method * to retrieve the next merge requested by the * MergePolicy */ MergePolicy::OneMerge* getNextMerge(); /** * Merges the indicated segments, replacing them in the stack with a * single segment. */ void merge(MergePolicy::OneMerge* merge); /** * Deletes the document(s) containing term. * @param term the term to identify the documents to be deleted * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void deleteDocuments(Term* term); /** * Deletes the document(s) containing any of the * terms. All deletes are flushed at the same time. * @param terms array of terms to identify the documents * to be deleted * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void deleteDocuments(const CL_NS(util)::ArrayBase* terms); /** * Updates a document by first deleting the document(s) * containing term and then adding the new * document. The delete and then add are atomic as seen * by a reader on the same index (flush may happen only after * the add). * @param term the term to identify the document(s) to be * deleted * @param doc the document to be added * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void updateDocument(Term* term, CL_NS(document)::Document* doc); /** * Updates a document by first deleting the document(s) * containing term and then adding the new * document. The delete and then add are atomic as seen * by a reader on the same index (flush may happen only after * the add). * @param term the term to identify the document(s) to be * deleted * @param doc the document to be added * @param analyzer the analyzer to use when analyzing the document * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void updateDocument(Term* term, CL_NS(document)::Document* doc, CL_NS(analysis)::Analyzer* analyzer); /** * Returns default write lock timeout for newly * instantiated IndexWriters. * @see #setDefaultWriteLockTimeout */ int64_t getDefaultWriteLockTimeout(); /** * Sets the default (for any instance of IndexWriter) maximum time to wait for a write lock (in * milliseconds). */ void setDefaultWriteLockTimeout(int64_t writeLockTimeout); std::string segString(); /** * Closes the index with or without waiting for currently * running merges to finish. This is only meaningful when * using a MergeScheduler that runs merges in background * threads. * @param waitForMerges if true, this call will block * until all merges complete; else, it will ask all * running merges to abort, wait until those merges have * finished (which should be at most a few seconds), and * then return. * *

If an Exception is hit during close, eg due to disk * full or some other reason, then both the on-disk index * and the internal state of the IndexWriter instance will * be consistent. However, the close will not be complete * even though part of it (flushing buffered documents) * may have succeeded, so the write lock will still be * held.

* *

If you can correct the underlying cause (eg free up * some disk space) then you can call close() again. * Failing that, if you want to force the write lock to be * released (dangerous, because you may then lose buffered * docs in the IndexWriter instance) then you can do * something like this:

* *
   * try {
   *   writer.close();
   * } finally {
   *   if (IndexReader.isLocked(directory)) {
   *     IndexReader.unlock(directory);
   *   }
   * }
   * 
* * after which, you must be certain not to use the writer * instance anymore.

* @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void close(bool waitForMerges=true); /** * Requests an "optimize" operation on an index, priming the index * for the fastest available search. Traditionally this has meant * merging all segments into a single segment as is done in the * default merge policy, but individaul merge policies may implement * optimize in different ways. * * @see LogMergePolicy#findMergesForOptimize * *

It is recommended that this method be called upon completion of indexing. In * environments with frequent updates, optimize is best done during low volume times, if at all. * *

*

See http://www.gossamer-threads.com/lists/lucene/java-dev/47895 for more discussion.

* *

Note that this can require substantial temporary free * space in the Directory (see LUCENE-764 * for details):

* *
    *
  • * *

    If no readers/searchers are open against the index, * then free space required is up to 1X the total size of * the starting index. For example, if the starting * index is 10 GB, then you must have up to 10 GB of free * space before calling optimize.

    * *
  • * *

    If readers/searchers are using the index, then free * space required is up to 2X the size of the starting * index. This is because in addition to the 1X used by * optimize, the original 1X of the starting index is * still consuming space in the Directory as the readers * are holding the segments files open. Even on Unix, * where it will appear as if the files are gone ("ls" * won't list them), they still consume storage due to * "delete on last close" semantics.

    * *

    Furthermore, if some but not all readers re-open * while the optimize is underway, this will cause > 2X * temporary space to be consumed as those new readers * will then hold open the partially optimized segments at * that time. It is best not to re-open readers while * optimize is running.

    * *
* *

The actual temporary usage could be much less than * these figures (it depends on many factors).

* *

In general, once the optimize completes, the total size of the * index will be less than the size of the starting index. * It could be quite a bit smaller (if there were many * pending deletes) or just slightly smaller.

* *

If an Exception is hit during optimize(), for example * due to disk full, the index will not be corrupt and no * documents will have been lost. However, it may have * been partially optimized (some segments were merged but * not all), and it's possible that one of the segments in * the index will be in non-compound format even when * using compound file format. This will occur when the * Exception is hit during conversion of the segment into * compound format.

* *

This call will optimize those segments present in * the index when the call started. If other threads are * still adding documents and flushing segments, those * newly created segments will not be optimized unless you * call optimize again.

* * @param doWait Specifies whether the call should block * until the optimize completes. This is only meaningful * with a {@link MergeScheduler} that is able to run merges * in background threads. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void optimize(bool doWait=true); /** * Optimize the index down to <= maxNumSegments. If * maxNumSegments==1 then this is the same as {@link * #optimize()}. * @param maxNumSegments maximum number of segments left * in the index after optimization finishes * @param doWait Specifies whether the call should block * until the optimize completes. This is only meaningful * with a {@link MergeScheduler} that is able to run merges * in background threads. */ void optimize(int32_t maxNumSegments, bool doWait=true); /** * Flush all in-memory buffered updates (adds and deletes) * to the Directory. *

Note: if autoCommit=false, flushed data would still * not be visible to readers, until {@link #close} is called. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void flush(); /** * Adds a document to this index. If the document contains more than * {@link #setMaxFieldLength(int)} terms for a given field, the remainder are * discarded (depending on the policy, see #FIELD_TRUNC_POLICY__WARN) * *

Note that if an Exception is hit (for example disk full) * then the index will be consistent, but this document * may not have been added. Furthermore, it's possible * the index will have one segment in non-compound format * even when using compound files (when a merge has * partially succeeded).

* *

This method periodically flushes pending documents * to the Directory (every {@link #setMaxBufferedDocs}), * and also periodically merges segments in the index * (every {@link #setMergeFactor} flushes). When this * occurs, the method will take more time to run (possibly * a long time if the index is large), and will require * free temporary space in the Directory to do the * merging.

* *

The amount of free space required when a merge is triggered is * up to 1X the size of all segments being merged, when no * readers/searchers are open against the index, and up to 2X the * size of all segments being merged when readers/searchers are open * against the index (see {@link #optimize()} for details). The * sequence of primitive merge operations performed is governed by * the merge policy. * *

Note that each term in the document can be no longer * than 16383 characters, otherwise an * IllegalArgumentException will be thrown.

* * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error * @param analyzer use the provided analyzer instead of the * value of {@link #getAnalyzer()} */ void addDocument(CL_NS(document)::Document* doc, CL_NS(analysis)::Analyzer* analyzer=NULL); /** * Expert: asks the mergePolicy whether any merges are * necessary now and if so, runs the requested merges and * then iterate (test again if merges are needed) until no * more merges are returned by the mergePolicy. * * Explicit calls to maybeMerge() are usually not * necessary. The most common case is when merge policy * parameters have changed. */ void maybeMerge(); /** * Close the IndexWriter without committing * any of the changes that have occurred since it was * opened. This removes any temporary files that had been * created, after which the state of the index will be the * same as it was when this writer was first opened. This * can only be called when this IndexWriter was opened * with autoCommit=false. * @throws IllegalStateException if this is called when * the writer was opened with autoCommit=true. * @throws IOException if there is a low-level IO error */ void abort(); /** * Merges all segments from an array of indexes into this index. *

* This is similar to addIndexes(Directory[]). However, no optimize() * is called either at the beginning or at the end. Instead, merges * are carried out as necessary. * *

NOTE: the index in each Directory must not be * changed (opened by a writer) while this method is * running. This method does not acquire a write lock in * each input Directory, so it is up to the caller to * enforce this. * *

NOTE: while this is running, any attempts to * add or delete documents (with another thread) will be * paused until this method completes. * *

* This requires this index not be among those to be added, and the * upper bound* of those segment doc counts not exceed maxMergeDocs. * *

See {@link #addIndexes(Directory[])} for * details on transactional semantics, temporary free * space required in the Directory, and non-CFS segments * on an Exception.

* @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void addIndexesNoOptimize(CL_NS(util)::ArrayBase& dirs); /** Merges the provided indexes into this index. *

After this completes, the index is optimized.

*

The provided IndexReaders are not closed.

*

NOTE: the index in each Directory must not be * changed (opened by a writer) while this method is * running. This method does not acquire a write lock in * each input Directory, so it is up to the caller to * enforce this. * *

NOTE: while this is running, any attempts to * add or delete documents (with another thread) will be * paused until this method completes. * *

See {@link #addIndexes(Directory[])} for * details on transactional semantics, temporary free * space required in the Directory, and non-CFS segments * on an Exception.

* @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ //NOT IMPLEMENTED YET: void addIndexes(CL_NS(util)::ArrayBase& readers); /** Merges all segments from an array of indexes into this index. * *

This may be used to parallelize batch indexing. A large document * collection can be broken into sub-collections. Each sub-collection can be * indexed in parallel, on a different thread, process or machine. The * complete index can then be created by merging sub-collection indexes * with this method. * *

NOTE: the index in each Directory must not be * changed (opened by a writer) while this method is * running. This method does not acquire a write lock in * each input Directory, so it is up to the caller to * enforce this. * *

NOTE: while this is running, any attempts to * add or delete documents (with another thread) will be * paused until this method completes. * *

After this completes, the index is optimized. * *

This method is transactional in how Exceptions are * handled: it does not commit a new segments_N file until * all indexes are added. This means if an Exception * occurs (for example disk full), then either no indexes * will have been added or they all will have been.

* *

If an Exception is hit, it's still possible that all * indexes were successfully added. This happens when the * Exception is hit when trying to build a CFS file. In * this case, one segment in the index will be in non-CFS * format, even when using compound file format.

* *

Also note that on an Exception, the index may still * have been partially or fully optimized even though none * of the input indexes were added.

* *

Note that this requires temporary free space in the * Directory up to 2X the sum of all input indexes * (including the starting index). If readers/searchers * are open against the starting index, then temporary * free space required will be higher by the size of the * starting index (see {@link #optimize()} for details). *

* *

Once this completes, the final size of the index * will be less than the sum of all input index sizes * (including the starting index). It could be quite a * bit smaller (if there were many pending deletes) or * just slightly smaller.

* *

See LUCENE-702 * for details.

* @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void addIndexes(CL_NS(util)::ArrayBase& dirs); /** Expert: Return the total size of all index files currently cached in memory. * Useful for size management with flushRamDocs() */ int64_t ramSizeInBytes(); /** Expert: Return the number of documents whose segments are currently cached in memory. * Useful when calling flush() */ int32_t numRamDocs(); /** for testing only */ virtual bool testPoint(const char* name); private: class LockWith2; class LockWithCFS; friend class LockWith2; friend class LockWithCFS; friend class DocumentsWriter; /** Merges all RAM-resident segments. */ void flushRamSegments(); /** Incremental segment merger. */ void maybeMergeSegments(); /** Pops segments off of segmentInfos stack down to minSegment, merges them, * and pushes the merged index onto the top of the segmentInfos stack. */ void mergeSegments(const uint32_t minSegment); /** Merges the named range of segments, replacing them in the stack with a * single segment. */ void mergeSegments(const uint32_t minSegment, const uint32_t end); void deleteFiles(std::vector& files); void readDeleteableFiles(std::vector& files); void writeDeleteableFiles(std::vector& files); /* * Some operating systems (e.g. Windows) don't permit a file to be deleted * while it is opened for read (e.g. by another process or thread). So we * assume that when a delete fails it is because the file is open in another * process, and queue the file for subsequent deletion. */ void deleteSegments(CL_NS(util)::CLVector* segments); void deleteFiles(std::vector& files, CL_NS(store)::Directory* directory); void deleteFiles(std::vector& files, std::vector& deletable); /** * Casts current mergePolicy to LogMergePolicy, and throws * an exception if the mergePolicy is not a LogMergePolicy. */ LogMergePolicy* getLogMergePolicy() const; void setMessageID(); void closeInternal(bool waitForMerges); void messageState(); /** * If we are flushing by doc count (not by RAM usage), and * using LogDocMergePolicy then push maxBufferedDocs down * as its minMergeDocs, to keep backwards compatibility. */ void pushMaxBufferedDocs(); void finishMerges(bool waitForMerges); /** Tells the docWriter to close its currently open shared * doc stores (stored fields & vectors files). * Return value specifices whether new doc store files are compound or not. */ bool flushDocStores(); //for test purposes protected: int32_t getDocCount(int32_t i); int32_t getNumBufferedDocuments(); int32_t getSegmentCount(); int32_t getBufferedDeleteTermsSize(); int32_t getNumBufferedDeleteTerms(); virtual SegmentInfo* newestSegment(); private: void waitForClose(); void deletePartialSegmentsFile(); /** Returns true if any merges in pendingMerges or * runningMerges are optimization merges. */ bool optimizeMergesPending(); void resetMergeExceptions(); void updatePendingMerges(int32_t maxNumSegmentsOptimize, bool optimize); /* * Begin a transaction. During a transaction, any segment * merges that happen (or ram segments flushed) will not * write a new segments file and will not remove any files * that were present at the start of the transaction. You * must make a matched (try/finally) call to * commitTransaction() or rollbackTransaction() to finish * the transaction. * * Note that buffered documents and delete terms are not handled * within the transactions, so they must be flushed before the * transaction is started. */ void startTransaction(); /* * Rolls back the transaction and restores state to where * we were at the start. */ void rollbackTransaction(); /* * Commits the transaction. This will write the new * segments file and remove and pending deletions we have * accumulated during the transaction */ void commitTransaction(); void maybeMerge(bool optimize); void maybeMerge(int32_t maxNumSegmentsOptimize, bool optimize); /** Does initial setup for a merge, which is fast but holds * the synchronized lock on IndexWriter instance. */ void mergeInit(MergePolicy::OneMerge* _merge); void _mergeInit(MergePolicy::OneMerge* _merge); /* If any of our segments are using a directory != ours * then copy them over. Currently this is only used by * addIndexesNoOptimize(). */ void copyExternalSegments(); /* * Called whenever the SegmentInfos has been updated and * the index files referenced exist (correctly) in the * index directory-> If we are in autoCommit mode, we * commit the change immediately. Else, we mark * commitPending. */ void checkpoint(); bool doFlush(bool flushDocStores); /* FIXME if we want to support non-contiguous segment merges */ bool commitMerge(MergePolicy::OneMerge* merge); int32_t ensureContiguousMerge(MergePolicy::OneMerge* merge); void decrefMergeSegments(MergePolicy::OneMerge* _merge); /** Does fininishing for a merge, which is fast but holds * the synchronized lock on IndexWriter instance. */ void mergeFinish(MergePolicy::OneMerge* _merge); /** Does the actual (time-consuming) work of the merge, * but without holding synchronized lock on IndexWriter * instance */ int32_t mergeMiddle(MergePolicy::OneMerge* _merge); void addMergeException(MergePolicy::OneMerge* _merge); /** Checks whether this merge involves any segments * already participating in a merge. If not, this merge * is "registered", meaning we record that its segments * are now participating in a merge, and true is * returned. Else (the merge conflicts) false is * returned. */ bool registerMerge(MergePolicy::OneMerge* _merge); // Called during flush to apply any buffered deletes. If // flushedNewSegment is true then a new segment was just // created and flushed from the ram segments, so we will // selectively apply the deletes to that new segment. void applyDeletes(bool flushedNewSegment); class Internal; Internal* _internal; protected: // This is called after pending added and deleted // documents have been flushed to the Directory but before // the change is committed (_CLNEW segments_N file written). virtual void doAfterFlush(); /** * Used internally to throw an {@link * AlreadyClosedException} if this IndexWriter has been * closed. * @throws AlreadyClosedException if this IndexWriter is */ void ensureOpen(); /** * Flush all in-memory buffered udpates (adds and deletes) * to the Directory. * @param triggerMerge if true, we may merge segments (if * deletes or docs were flushed) if necessary * @param flushDocStores if false we are allowed to keep * doc stores open to share with the next segment */ void flush(bool triggerMerge, bool flushDocStores); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/MergePolicy.cpp000066400000000000000000000364251154025176300233320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MergePolicy.h" #include "_SegmentInfos.h" #include "IndexWriter.h" #include "CLucene/store/Directory.h" #include CL_NS_USE(util) CL_NS_USE(store) CL_NS_DEF(index) #define MESSAGE(msg) if ( writer != NULL && writer->getInfoStream() != NULL ) message(msg) const int32_t LogMergePolicy::DEFAULT_MAX_MERGE_DOCS = LUCENE_INT32_MAX_SHOULDBE; MergePolicy::OneMerge::OneMerge(SegmentInfos* segments, bool _useCompoundFile): useCompoundFile(_useCompoundFile) { if (0 == segments->size()) _CLTHROWA(CL_ERR_Runtime,"segments must include at least one segment"); this->segments = segments; this->info = NULL; this->segmentsClone = NULL; this->mergeGen = 0; this->maxNumSegmentsOptimize = 0; aborted = mergeDocStores = optimize = increfDone = registerDone = isExternal = false; } MergePolicy::OneMerge::~OneMerge(){ _CLDELETE(this->segmentsClone); while ( this->segments->size() > 0 ){ this->segments->remove(0,true);//don't delete... } _CLDELETE(this->segments);//and finally delete the segments object itself } const char* MergePolicy::OneMerge::getClassName(){ return "MergePolicy::OneMerge"; } const char* MergePolicy::OneMerge::getObjectName() const{ return getClassName(); } void MergePolicy::OneMerge::setException(CLuceneError& error) { SCOPED_LOCK_MUTEX(THIS_LOCK) this->error.set(error.number(),error.what()); } const CLuceneError& MergePolicy::OneMerge::getException(){ SCOPED_LOCK_MUTEX(THIS_LOCK) return error; } void MergePolicy::OneMerge::abort() { SCOPED_LOCK_MUTEX(THIS_LOCK) aborted = true; } bool MergePolicy::OneMerge::isAborted() { SCOPED_LOCK_MUTEX(THIS_LOCK) return aborted; } void MergePolicy::OneMerge::checkAborted(CL_NS(store)::Directory* dir){ SCOPED_LOCK_MUTEX(THIS_LOCK) if (aborted) _CLTHROWA(CL_ERR_MergeAborted, (string("merge is aborted: ") + segString(dir)).c_str() ); } std::string MergePolicy::OneMerge::segString(CL_NS(store)::Directory* dir) const{ std::string b; const int32_t numSegments = segments->size(); for(int32_t i=0;i 0) b.append(" "); b.append(segments->info(i)->segString(dir)); } if (info != NULL) b.append(" into ").append(info->name); if (optimize) b.append(" [optimize]"); return b; } MergePolicy::MergeSpecification::MergeSpecification(){ merges = _CLNEW CLArrayList; } MergePolicy::MergeSpecification::~MergeSpecification(){ _CLDELETE(merges); } void MergePolicy::MergeSpecification::add(OneMerge* merge) { merges->push_back(merge); } std::string MergePolicy::MergeSpecification::segString(CL_NS(store)::Directory* dir) { std::string b = "MergeSpec:\n"; int32_t count = merges->size(); for(int32_t i=0;isegString(dir)); } return b; } const float_t LogMergePolicy::LEVEL_LOG_SPAN = 0.75; void LogMergePolicy::message(const string& message) { if (writer != NULL){ string msg = "LMP: " + message; writer->message( msg ); } } int32_t LogMergePolicy::getMergeFactor(){ return mergeFactor; } bool LogMergePolicy::isOptimized(SegmentInfos* infos, IndexWriter* writer, int32_t maxNumSegments, std::vector& segmentsToOptimize){ const int32_t numSegments = infos->size(); int32_t numToOptimize = 0; SegmentInfo* optimizeInfo = NULL; for(int32_t i=0;iinfo(i); vector::iterator itr = segmentsToOptimize.begin(); while ( itr != segmentsToOptimize.end() ){ if ( *itr == info ) { numToOptimize++; optimizeInfo = info; } itr++; } } return numToOptimize <= maxNumSegments && (numToOptimize != 1 || isOptimized(writer, optimizeInfo)); } bool LogMergePolicy::isOptimized(IndexWriter* writer, SegmentInfo* info){ return !info->hasDeletions() && !info->hasSeparateNorms() && info->dir == writer->getDirectory() && info->getUseCompoundFile() == _useCompoundFile; } LogMergePolicy::LogMergePolicy(){ this->maxMergeDocs = DEFAULT_MAX_MERGE_DOCS; this->mergeFactor = DEFAULT_MERGE_FACTOR; this->_useCompoundFile = true; this->_useCompoundDocStore = true; this->writer = NULL; this->minMergeSize = this->maxMergeSize = 0; } void LogMergePolicy::setMergeFactor(int32_t mergeFactor) { if (mergeFactor < 2) _CLTHROWA(CL_ERR_IllegalArgument, "mergeFactor cannot be less than 2"); this->mergeFactor = mergeFactor; } bool LogMergePolicy::useCompoundFile(SegmentInfos* /*infos*/, SegmentInfo* /*info*/) { return _useCompoundFile; } void LogMergePolicy::setUseCompoundFile(bool useCompoundFile) { this->_useCompoundFile = useCompoundFile; } bool LogMergePolicy::getUseCompoundFile() { return _useCompoundFile; } bool LogMergePolicy::useCompoundDocStore(SegmentInfos* /*infos*/) { return _useCompoundDocStore; } void LogMergePolicy::setUseCompoundDocStore(bool useCompoundDocStore) { this->_useCompoundDocStore = useCompoundDocStore; } bool LogMergePolicy::getUseCompoundDocStore() { return _useCompoundDocStore; } void LogMergePolicy::close() {} MergePolicy::MergeSpecification* LogMergePolicy::findMergesForOptimize(SegmentInfos* infos, IndexWriter* writer, int32_t maxNumSegments, vector& segmentsToOptimize) { MergeSpecification* spec = NULL; assert (maxNumSegments > 0); if (!isOptimized(infos, writer, maxNumSegments, segmentsToOptimize)) { // Find the newest (rightmost) segment that needs to // be optimized (other segments may have been flushed // since optimize started): int32_t last = infos->size(); while(last > 0) { const SegmentInfo* info = infos->info(--last); vector::iterator itr = segmentsToOptimize.begin(); bool containsInfo = false; while (itr != segmentsToOptimize.end() ){ if ( *itr == info ){ containsInfo = true; break; } itr++; } if (containsInfo) { last++; break; } } if (last > 0) { spec = _CLNEW MergeSpecification(); // First, enroll all "full" merges (size // mergeFactor) to potentially be run concurrently: while (last - maxNumSegments + 1 >= mergeFactor) { SegmentInfos* range = _CLNEW SegmentInfos; infos->range(last-mergeFactor, last, *range); spec->add(_CLNEW OneMerge(range, _useCompoundFile)); last -= mergeFactor; } // Only if there are no full merges pending do we // add a final partial (< mergeFactor segments) merge: if (0 == spec->merges->size()) { if (maxNumSegments == 1) { // Since we must optimize down to 1 segment, the // choice is simple: if (last > 1 || !isOptimized(writer, infos->info(0))){ SegmentInfos* range = _CLNEW SegmentInfos; infos->range(0, last, *range); spec->add(_CLNEW OneMerge(range, _useCompoundFile)); } } else if (last > maxNumSegments) { // Take care to pick a partial merge that is // least cost, but does not make the index too // lopsided. If we always just picked the // partial tail then we could produce a highly // lopsided index over time: // We must merge this many segments to leave // maxNumSegments in the index (from when // optimize was first kicked off): const int32_t finalMergeSize = last - maxNumSegments + 1; // Consider all possible starting points: int64_t bestSize = 0; int32_t bestStart = 0; for(int32_t i=0;iinfo(j+i)); if (i == 0 || (sumSize < 2*size(infos->info(i-1)) && sumSize < bestSize)) { bestStart = i; bestSize = sumSize; } } SegmentInfos* range = _CLNEW SegmentInfos; infos->range(bestStart, bestStart+finalMergeSize, *range); spec->add(_CLNEW OneMerge(range, _useCompoundFile)); } } } else _CLDELETE(spec); } else _CLDELETE(spec); return spec; } MergePolicy::MergeSpecification* LogMergePolicy::findMerges(SegmentInfos* infos, IndexWriter* writer){ const int32_t numSegments = infos->size(); this->writer = writer; MESSAGE( string("findMerges: ") + Misc::toString(numSegments) + " segments"); // Compute levels, which is just log (base mergeFactor) // of the size of each segment ValueArray levels(numSegments); const float_t norm = log((float_t)mergeFactor); for(int32_t i=0;iinfo(i); int64_t _size = size(info); // Floor tiny segments if (_size < 1) _size = 1; levels[i] = log((float_t)_size)/norm; } float_t levelFloor; if (minMergeSize <= 0) levelFloor = 0.0; else levelFloor = log((float_t)minMergeSize)/norm; // Now, we quantize the log values into levels. The // first level is any segment whose log size is within // LEVEL_LOG_SPAN of the max size, or, who has such as // segment "to the right". Then, we find the max of all // other segments and use that to define the next level // segment, etc. MergeSpecification* spec = NULL; int32_t start = 0; while(start < numSegments) { // Find max level of all segments not already // quantized. float_t maxLevel = levels[start]; for(int32_t i=1+start;i maxLevel) maxLevel = level; } // Now search backwards for the rightmost segment that // falls into this level: float_t levelBottom; if (maxLevel < levelFloor) // All remaining segments fall into the min level levelBottom = -1.0F; else { levelBottom = maxLevel - LEVEL_LOG_SPAN; // Force a boundary at the level floor if (levelBottom < levelFloor && maxLevel >= levelFloor) levelBottom = levelFloor; } int32_t upto = numSegments-1; while(upto >= start) { if (levels[upto] >= levelBottom) { break; } upto--; } MESSAGE(string(" level ") + Misc::toString(levelBottom) + " to " + Misc::toString(maxLevel) + ": " + Misc::toString(1+upto-start) + " segments"); // Finally, record all merges that are viable at this level: int32_t end = start + mergeFactor; while(end <= 1+upto) { bool anyTooLarge = false; for(int32_t i=start;iinfo(i); anyTooLarge |= (size(info) >= maxMergeSize || info->docCount >= maxMergeDocs); } if (!anyTooLarge) { if (spec == NULL) spec = _CLNEW MergeSpecification(); MESSAGE( string(" ") + Misc::toString(start) + " to " + Misc::toString(end) + ": add this merge"); SegmentInfos* range = _CLNEW SegmentInfos; infos->range(start, end, *range); spec->add(_CLNEW OneMerge(range, _useCompoundFile)); } else MESSAGE( string(" ") + Misc::toString(start) + " to " + Misc::toString(end) + ": contains segment over maxMergeSize or maxMergeDocs; skipping"); start = end; end = start + mergeFactor; } start = 1+upto; } return spec; } void LogMergePolicy::setMaxMergeDocs(int32_t maxMergeDocs) { this->maxMergeDocs = maxMergeDocs; } int32_t LogMergePolicy::getMaxMergeDocs() { return maxMergeDocs; } const char* LogMergePolicy::getClassName(){ return "LogMergePolicy"; } const char* LogMergePolicy::getObjectName() const{ return getClassName(); } bool LogMergePolicy::instanceOf(const char* other) const{ const char* t = this->getObjectName(); if ( t==other || strcmp( t, other )==0 ){ return true; } t = getClassName(); if ( t==other || strcmp( t, other )==0 ){ return true; } return false; } LogDocMergePolicy::LogDocMergePolicy() { minMergeSize = DEFAULT_MIN_MERGE_DOCS; // maxMergeSize is never used by LogDocMergePolicy; set // it to Long.MAX_VALUE to disable it maxMergeSize = LUCENE_INT64_MAX_SHOULDBE; } void LogDocMergePolicy::setMinMergeDocs(int32_t minMergeDocs) { minMergeSize = minMergeDocs; } int32_t LogDocMergePolicy::getMinMergeDocs() { return (int32_t)minMergeSize; } int64_t LogDocMergePolicy::size(SegmentInfo* info) { return info->docCount; } const char* LogDocMergePolicy::getClassName(){ return "LogDocMergePolicy"; } const char* LogDocMergePolicy::getObjectName() const{ return getClassName(); } int64_t LogByteSizeMergePolicy::size(SegmentInfo* info) { return info->sizeInBytes(); } /** Default minimum segment size. @see setMinMergeMB */ const float_t LogByteSizeMergePolicy::DEFAULT_MIN_MERGE_MB = 1.6; /** Default maximum segment size. A segment of this size * or larger will never be merged. @see setMaxMergeMB */ const float_t LogByteSizeMergePolicy::DEFAULT_MAX_MERGE_MB = (float_t)LUCENE_INT64_MAX_SHOULDBE; LogByteSizeMergePolicy::LogByteSizeMergePolicy() { minMergeSize = (int64_t) (DEFAULT_MIN_MERGE_MB*1024*1024); maxMergeSize = (uint64_t) (DEFAULT_MAX_MERGE_MB); //*1024*1024 } /**

Determines the largest segment (measured by total * byte size of the segment's files, in MB) that may be * merged with other segments. Small values (e.g., less * than 50 MB) are best for interactive indexing, as this * limits the length of pauses while indexing to a few * seconds. Larger values are best for batched indexing * and speedier searches.

* *

Note that {@link #setMaxMergeDocs} is also * used to check whether a segment is too large for * merging (it's either or).

*/ void LogByteSizeMergePolicy::setMaxMergeMB(float_t mb) { maxMergeSize = (uint64_t) (mb*1024*1024); } /** Returns the largest segment (meaured by total byte * size of the segment's files, in MB) that may be merged * with other segments. * @see #setMaxMergeMB */ float_t LogByteSizeMergePolicy::getMaxMergeMB() { return ((float_t) maxMergeSize)/1024/1024; } /** Sets the minimum size for the lowest level segments. * Any segments below this size are considered to be on * the same level (even if they vary drastically in size) * and will be merged whenever there are mergeFactor of * them. This effectively truncates the "long tail" of * small segments that would otherwise be created into a * single level. If you set this too large, it could * greatly increase the merging cost during indexing (if * you flush many small segments). */ void LogByteSizeMergePolicy::setMinMergeMB(float_t mb) { minMergeSize = (int64_t) (mb*1024*1024); } /** Get the minimum size for a segment to remain * un-merged. * @see #setMinMergeMB **/ float_t LogByteSizeMergePolicy::getMinMergeMB() { return ((float_t) minMergeSize)/1024/1024; } const char* LogByteSizeMergePolicy::getClassName(){ return "LogByteSizeMergePolicy"; } const char* LogByteSizeMergePolicy::getObjectName() const{ return getClassName(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/MergePolicy.h000066400000000000000000000364311154025176300227740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_MergePolicy_ #define _lucene_index_MergePolicy_ #include "CLucene/util/VoidList.h" CL_CLASS_DEF(store,Directory) CL_NS_DEF(index) class SegmentInfo; class SegmentInfos; class IndexWriter; /** *

Expert: a MergePolicy determines the sequence of * primitive merge operations to be used for overall merge * and optimize operations.

* *

Whenever the segments in an index have been altered by * {@link IndexWriter}, either the addition of a newly * flushed segment, addition of many segments from * addIndexes* calls, or a previous merge that may now need * to cascade, {@link IndexWriter} invokes {@link * #findMerges} to give the MergePolicy a chance to pick * merges that are now required. This method returns a * {@link MergeSpecification} instance describing the set of * merges that should be done, or null if no merges are * necessary. When IndexWriter.optimize is called, it calls * {@link #findMergesForOptimize} and the MergePolicy should * then return the necessary merges.

* *

Note that the policy can return more than one merge at * a time. In this case, if the writer is using {@link * SerialMergeScheduler}, the merges will be run * sequentially but if it is using {@link * ConcurrentMergeScheduler} they will be run concurrently.

* *

The default MergePolicy is {@link * LogByteSizeMergePolicy}.

*

NOTE: This API is new and still experimental * (subject to change suddenly in the next release)

*/ class CLUCENE_EXPORT MergePolicy: public CL_NS(util)::NamedObject { public: /** OneMerge provides the information necessary to perform * an individual primitive merge operation, resulting in * a single new segment. The merge spec includes the * subset of segments to be merged as well as whether the * new segment should use the compound file format. */ class CLUCENE_EXPORT OneMerge: public CL_NS(util)::NamedObject { public: DEFINE_MUTEX(THIS_LOCK) SegmentInfo* info; // used by IndexWriter bool mergeDocStores; // used by IndexWriter bool optimize; // used by IndexWriter SegmentInfos* segmentsClone; // used by IndexWriter bool increfDone; // used by IndexWriter bool registerDone; // used by IndexWriter int64_t mergeGen; // used by IndexWriter bool isExternal; // used by IndexWriter int32_t maxNumSegmentsOptimize; // used by IndexWriter SegmentInfos* segments; const bool useCompoundFile; bool aborted; CLuceneError error; /** * Constructor * @memory, segments object is consumed. The SegmentInfo objects within are referenced */ OneMerge(SegmentInfos* segments, bool _useCompoundFile); ~OneMerge(); /** Record that an exception occurred while executing * this merge */ void setException(CLuceneError& error); /** Retrieve previous exception set by {@link * #setException}. */ const CLuceneError& getException(); /** Mark this merge as aborted. If this is called * before the merge is committed then the merge will * not be committed. */ void abort(); /** Returns true if this merge was aborted. */ bool isAborted(); void checkAborted(CL_NS(store)::Directory* dir); std::string segString(CL_NS(store)::Directory* dir) const; static const char* getClassName(); virtual const char* getObjectName() const; }; /** * A MergeSpecification instance provides the information * necessary to perform multiple merges. It simply * contains a list of {@link OneMerge} instances. */ class CLUCENE_EXPORT MergeSpecification { public: MergeSpecification(); ~MergeSpecification(); /** * The subset of segments to be included in the primitive merge. */ CL_NS(util)::CLArrayList* merges; void add(OneMerge* merge); std::string segString(CL_NS(store)::Directory* dir); }; /** * Determine what set of merge operations are now * necessary on the index. The IndexWriter calls this * whenever there is a change to the segments. This call * is always synchronized on the IndexWriter instance so * only one thread at a time will call this method. * * @param segmentInfos the total set of segments in the index * @param writer IndexWriter instance */ virtual MergeSpecification* findMerges(SegmentInfos* segmentInfos, IndexWriter* writer) = 0; /** * Determine what set of merge operations are necessary in * order to optimize the index. The IndexWriter calls * this when its optimize() method is called. This call * is always synchronized on the IndexWriter instance so * only one thread at a time will call this method. * * @param segmentInfos the total set of segments in the index * @param writer IndexWriter instance * @param maxSegmentCount requested maximum number of * segments in the index (currently this is always 1) * @param segmentsToOptimize contains the specific * SegmentInfo instances that must be merged away. This * may be a subset of all SegmentInfos. */ virtual MergeSpecification* findMergesForOptimize(SegmentInfos* segmentInfos, IndexWriter* writer, int32_t maxSegmentCount, std::vector& segmentsToOptimize) = 0; /** * Release all resources for the policy. */ virtual void close() = 0; /** * Returns true if a newly flushed (not from merge) * segment should use the compound file format. */ virtual bool useCompoundFile(SegmentInfos* segments, SegmentInfo* newSegment) = 0; /** * Returns true if the doc store files should use the * compound file format. */ virtual bool useCompoundDocStore(SegmentInfos* segments) = 0; }; /**

This class implements a {@link MergePolicy} that tries * to merge segments into levels of exponentially * increasing size, where each level has < mergeFactor * segments in it. Whenever a given levle has mergeFactor * segments or more in it, they will be merged.

* *

This class is abstract and requires a subclass to * define the {@link #size} method which specifies how a * segment's size is determined. {@link LogDocMergePolicy} * is one subclass that measures size by document count in * the segment. {@link LogByteSizeMergePolicy} is another * subclass that measures size as the total byte size of the * file(s) for the segment.

*/ class CLUCENE_EXPORT LogMergePolicy: public MergePolicy { int32_t mergeFactor; int32_t maxMergeDocs; bool _useCompoundFile; bool _useCompoundDocStore; IndexWriter* writer; void message(const std::string& message); bool isOptimized(SegmentInfos* infos, IndexWriter* writer, int32_t maxNumSegments, std::vector& segmentsToOptimize); /** Returns true if this single nfo is optimized (has no * pending norms or deletes, is in the same dir as the * writer, and matches the current compound file setting */ bool isOptimized(IndexWriter* writer, SegmentInfo* info); protected: virtual int64_t size(SegmentInfo* info) = 0; int64_t minMergeSize; uint64_t maxMergeSize; public: LogMergePolicy(); /** Defines the allowed range of log(size) for each * level. A level is computed by taking the max segment * log size, minuse LEVEL_LOG_SPAN, and finding all * segments falling within that range. */ static const float_t LEVEL_LOG_SPAN; /** Default merge factor, which is how many segments are * merged at a time */ LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_MERGE_FACTOR = 10); /** Default maximum segment size. A segment of this size * or larger will never be merged. @see setMaxMergeDocs */ static const int32_t DEFAULT_MAX_MERGE_DOCS; /**

Returns the number of segments that are merged at * once and also controls the total number of segments * allowed to accumulate in the index.

*/ int32_t getMergeFactor(); /** Determines how often segment indices are merged by * addDocument(). With smaller values, less RAM is used * while indexing, and searches on unoptimized indices are * faster, but indexing speed is slower. With larger * values, more RAM is used during indexing, and while * searches on unoptimized indices are slower, indexing is * faster. Thus larger values (> 10) are best for batch * index creation, and smaller values (< 10) for indices * that are interactively maintained. */ void setMergeFactor(int32_t mergeFactor); // Javadoc inherited bool useCompoundFile(SegmentInfos* infos, SegmentInfo* info); /** Sets whether compound file format should be used for * newly flushed and newly merged segments. */ void setUseCompoundFile(bool useCompoundFile); /** Returns true if newly flushed and newly merge segments * are written in compound file format. @see * #setUseCompoundFile */ bool getUseCompoundFile(); // Javadoc inherited bool useCompoundDocStore(SegmentInfos* infos); /** Sets whether compound file format should be used for * newly flushed and newly merged doc store * segment files (term vectors and stored fields). */ void setUseCompoundDocStore(bool useCompoundDocStore); /** Returns true if newly flushed and newly merge doc * store segment files (term vectors and stored fields) * are written in compound file format. @see * #setUseCompoundDocStore */ bool getUseCompoundDocStore(); void close(); /** Returns the merges necessary to optimize the index. * This merge policy defines "optimized" to mean only one * segment in the index, where that segment has no * deletions pending nor separate norms, and it is in * compound file format if the current useCompoundFile * setting is true. This method returns multiple merges * (mergeFactor at a time) so the {@link MergeScheduler} * in use may make use of concurrency. */ MergeSpecification* findMergesForOptimize(SegmentInfos* segmentInfos, IndexWriter* writer, int32_t maxSegmentCount, std::vector& segmentsToOptimize); /** Checks if any merges are now necessary and returns a * {@link MergePolicy.MergeSpecification} if so. A merge * is necessary when there are more than {@link * #setMergeFactor} segments at a given level. When * multiple levels have too many segments, this method * will return multiple merges, allowing the {@link * MergeScheduler} to use concurrency. */ MergeSpecification* findMerges(SegmentInfos* infos, IndexWriter* writer); /**

Determines the largest segment (measured by * document count) that may be merged with other segments. * Small values (e.g., less than 10,000) are best for * interactive indexing, as this limits the length of * pauses while indexing to a few seconds. Larger values * are best for batched indexing and speedier * searches.

* *

The default value is {@link Integer#MAX_VALUE}.

* *

The default merge policy ({@link * LogByteSizeMergePolicy}) also allows you to set this * limit by net size (in MB) of the segment, using {@link * LogByteSizeMergePolicy#setMaxMergeMB}.

*/ void setMaxMergeDocs(int32_t maxMergeDocs); /** Returns the largest segment (measured by document * count) that may be merged with other segments. * @see #setMaxMergeDocs */ int32_t getMaxMergeDocs(); virtual bool instanceOf(const char* otherobject) const; static const char* getClassName(); virtual const char* getObjectName() const; }; /** This is a {@link LogMergePolicy} that measures size of a * segment as the number of documents (not taking deletions * into account). */ class CLUCENE_EXPORT LogDocMergePolicy: public LogMergePolicy { public: /** Default minimum segment size. @see setMinMergeDocs */ LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_MIN_MERGE_DOCS = 1000); LogDocMergePolicy(); /** Sets the minimum size for the lowest level segments. * Any segments below this size are considered to be on * the same level (even if they vary drastically in size) * and will be merged whenever there are mergeFactor of * them. This effectively truncates the "int64_t tail" of * small segments that would otherwise be created into a * single level. If you set this too large, it could * greatly increase the merging cost during indexing (if * you flush many small segments). */ void setMinMergeDocs(int32_t minMergeDocs); /** Get the minimum size for a segment to remain * un-merged. * @see #setMinMergeDocs **/ int32_t getMinMergeDocs(); static const char* getClassName(); virtual const char* getObjectName() const; protected: int64_t size(SegmentInfo* info); }; /** This is a {@link LogMergePolicy} that measures size of a * segment as the total byte size of the segment's files. */ class CLUCENE_EXPORT LogByteSizeMergePolicy: public LogMergePolicy { protected: int64_t size(SegmentInfo* info); public: /** Default minimum segment size. @see setMinMergeMB */ static const float_t DEFAULT_MIN_MERGE_MB; /** Default maximum segment size. A segment of this size * or larger will never be merged. @see setMaxMergeMB */ static const float_t DEFAULT_MAX_MERGE_MB; LogByteSizeMergePolicy(); /**

Determines the largest segment (measured by total * byte size of the segment's files, in MB) that may be * merged with other segments. Small values (e.g., less * than 50 MB) are best for interactive indexing, as this * limits the length of pauses while indexing to a few * seconds. Larger values are best for batched indexing * and speedier searches.

* *

Note that {@link #setMaxMergeDocs} is also * used to check whether a segment is too large for * merging (it's either or).

*/ void setMaxMergeMB(float_t mb); /** Returns the largest segment (meaured by total byte * size of the segment's files, in MB) that may be merged * with other segments. * @see #setMaxMergeMB */ float_t getMaxMergeMB(); /** Sets the minimum size for the lowest level segments. * Any segments below this size are considered to be on * the same level (even if they vary drastically in size) * and will be merged whenever there are mergeFactor of * them. This effectively truncates the "long tail" of * small segments that would otherwise be created into a * single level. If you set this too large, it could * greatly increase the merging cost during indexing (if * you flush many small segments). */ void setMinMergeMB(float_t mb); /** Get the minimum size for a segment to remain * un-merged. * @see #setMinMergeMB **/ float_t getMinMergeMB(); static const char* getClassName(); virtual const char* getObjectName() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/MergeScheduler.cpp000066400000000000000000000016451154025176300240050ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MergeScheduler.h" #include "IndexWriter.h" CL_NS_DEF(index) const char* SerialMergeScheduler::getObjectName() const{ return getClassName(); } const char* SerialMergeScheduler::getClassName(){ return "SerialMergeScheduler"; } void SerialMergeScheduler::merge(IndexWriter* writer){ SCOPED_LOCK_MUTEX(THIS_LOCK) while(true) { MergePolicy::OneMerge* merge = writer->getNextMerge(); if (merge == NULL) break; writer->merge(merge); } } void SerialMergeScheduler::close() {} CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/MergeScheduler.h000066400000000000000000000032241154025176300234450ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_MergeScheduler_ #define _lucene_index_MergeScheduler_ #include "CLucene/util/Equators.h" #include "CLucene/LuceneThreads.h" CL_NS_DEF(index) class IndexWriter; /** Expert: {@link IndexWriter} uses an instance * implementing this interface to execute the merges * selected by a {@link MergePolicy}. The default * MergeScheduler is {@link ConcurrentMergeScheduler}. *

NOTE: This API is new and still experimental * (subject to change suddenly in the next release)

*/ class CLUCENE_EXPORT MergeScheduler: public CL_NS(util)::NamedObject { public: /** Run the merges provided by {@link IndexWriter#getNextMerge()}. */ virtual void merge(IndexWriter* writer) = 0; /** Close this MergeScheduler. */ virtual void close() = 0; }; /** A {@link MergeScheduler} that simply does each merge * sequentially, using the current thread. */ class CLUCENE_EXPORT SerialMergeScheduler: public MergeScheduler { public: DEFINE_MUTEX(THIS_LOCK) /** Just do the merges in sequence. We do this * "synchronized" so that even if the application is using * multiple threads, only one merge may run at a time. */ void merge(IndexWriter* writer); void close(); const char* getObjectName() const; static const char* getClassName(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/MultiReader.cpp000066400000000000000000000250571154025176300233270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MultiReader.h" #include "_MultiSegmentReader.h" #include "IndexReader.h" #include "CLucene/document/Document.h" #include "Term.h" #include "Terms.h" #include "CLucene/util/PriorityQueue.h" #include "_SegmentHeader.h" #include "_SegmentMergeInfo.h" #include "_SegmentMergeQueue.h" CL_NS_USE(store) CL_NS_USE(document) CL_NS_USE(util) CL_NS_DEF(index) class MultiReader::Internal: LUCENE_BASE{ public: MultiSegmentReader::NormsCacheType normsCache; bool* closeOnClose; //remember which subreaders to close on close bool _hasDeletions; uint8_t* ones; int32_t _maxDoc; int32_t _numDocs; Internal(): normsCache(true, true) { _maxDoc = 0; _numDocs = -1; ones = NULL; _hasDeletions = false; closeOnClose = NULL; } ~Internal(){ _CLDELETE_ARRAY(ones); _CLDELETE_ARRAY(closeOnClose); } }; MultiReader::MultiReader(const CL_NS(util)::ArrayBase* subReaders, bool closeSubReaders) { this->_internal = _CLNEW Internal(); this->init(subReaders, closeSubReaders); } void MultiReader::init(const CL_NS(util)::ArrayBase* _subReaders, bool closeSubReaders){ this->subReaders = _CLNEW CL_NS(util)::ValueArray(_subReaders->length); starts = _CL_NEWARRAY(int32_t, subReaders->length + 1); // build starts array _internal->closeOnClose = _CL_NEWARRAY(bool, subReaders->length); for (size_t i = 0; i < subReaders->length; i++) { this->subReaders->values[i] = _subReaders->values[i]; starts[i] = _internal->_maxDoc; // compute maxDocs _internal->_maxDoc += (*subReaders)[i]->maxDoc(); _internal->closeOnClose[i] = closeSubReaders; if ((*subReaders)[i]->hasDeletions()) _internal->_hasDeletions = true; } starts[subReaders->length] = _internal->_maxDoc; } MultiReader::~MultiReader() { //Func - Destructor //Pre - true //Post - The instance has been destroyed all IndexReader instances // this instance managed have been destroyed to close(); _CLDELETE(_internal); _CLDELETE_ARRAY(starts); _CLDELETE(subReaders); } IndexReader* MultiReader::reopen() { ensureOpen(); bool reopened = false; ValueArray newSubReaders(subReaders->length); ValueArray newCloseOnClose(subReaders->length); bool success = false; IndexReader* ret = NULL; try { for (size_t i = 0; i < subReaders->length; i++) { newSubReaders[i] = (*subReaders)[i]->reopen(); // if at least one of the subreaders was updated we remember that // and return a new MultiReader if (newSubReaders[i] != (*subReaders)[i]) { reopened = true; // this is a new subreader instance, so on close() we don't close it newCloseOnClose[i] = true; } } if (reopened) { MultiReader* mr = _CLNEW MultiReader(&newSubReaders); for (size_t i = 0; i < subReaders->length; i++) { if (newSubReaders[i] == (*subReaders)[i]) { // 'give' the memory to the new object mr->_internal->closeOnClose[i] = this->_internal->closeOnClose[i]; this->subReaders->values[i] = NULL; } } success = true; ret = mr; } else { success = true; ret = this; } } _CLFINALLY ( if (!success && reopened) { for (size_t i = 0; i < newSubReaders.length; i++) { if (newSubReaders[i] != NULL) { try { if (newCloseOnClose[i]) { newSubReaders.values[i]->close(); _CLDELETE(newSubReaders.values[i]); } } catch (CLuceneError& ignore) { if ( ignore.number() != CL_ERR_IO ) throw ignore; // keep going - we want to clean up as much as possible } } } } ) return ret; } ArrayBase* MultiReader::getTermFreqVectors(int32_t n){ ensureOpen(); int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->getTermFreqVectors(n - starts[i]); // dispatch to segment } TermFreqVector* MultiReader::getTermFreqVector(int32_t n, const TCHAR* field){ ensureOpen(); int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->getTermFreqVector(n - starts[i], field); } void MultiReader::getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper) { ensureOpen(); int32_t i = readerIndex(docNumber); // find segment num (*subReaders)[i]->getTermFreqVector(docNumber - starts[i], field, mapper); } void MultiReader::getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper) { ensureOpen(); int32_t i = readerIndex(docNumber); // find segment num (*subReaders)[i]->getTermFreqVector(docNumber - starts[i], mapper); } bool MultiReader::isOptimized() { return false; } int32_t MultiReader::numDocs() { SCOPED_LOCK_MUTEX(THIS_LOCK) // Don't call ensureOpen() here (it could affect performance) if (_internal->_numDocs == -1) { // check cache int32_t n = 0; // cache miss--recompute for (size_t i = 0; i < subReaders->length; i++){ n += (*subReaders)[i]->numDocs(); // sum from readers } _internal->_numDocs = n; } return _internal->_numDocs; } int32_t MultiReader::maxDoc() const { // Don't call ensureOpen() here (it could affect performance) return _internal->_maxDoc; } bool MultiReader::document(int32_t n, CL_NS(document)::Document& doc, const FieldSelector* fieldSelector){ ensureOpen(); int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->document(n - starts[i],doc, fieldSelector); // dispatch to segment reader } bool MultiReader::isDeleted(const int32_t n) { // Don't call ensureOpen() here (it could affect performance) int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->isDeleted(n - starts[i]); // dispatch to segment reader } bool MultiReader::hasDeletions() const{ // Don't call ensureOpen() here (it could affect performance) return _internal->_hasDeletions; } const ArrayBase* MultiReader::getSubReaders() const{ return subReaders; } uint8_t* MultiReader::norms(const TCHAR* field){ SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); uint8_t* bytes; bytes = _internal->normsCache.get((TCHAR*)field); if (bytes != NULL){ return bytes; // cache hit } if ( !hasNorms(field) ) return fakeNorms(); bytes = _CL_NEWARRAY(uint8_t,maxDoc()); for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->norms(field, bytes + starts[i]); //Unfortunately the data in the normCache can get corrupted, since it's being loaded with string //keys that may be deleted while still in use by the map. To prevent this field is duplicated //and then stored in the normCache TCHAR* key = STRDUP_TtoT(field); //update cache _internal->normsCache.put(key, bytes); return bytes; } void MultiReader::norms(const TCHAR* field, uint8_t* result) { SCOPED_LOCK_MUTEX(THIS_LOCK) uint8_t* bytes = norms(field); if (bytes != NULL){ // return memcpy(result,bytes, maxDoc() * sizeof(int32_t)); } } void MultiReader::doSetNorm(int32_t n, const TCHAR* field, uint8_t value){ _internal->normsCache.removeitr( _internal->normsCache.find((TCHAR*)field) ); // clear cache int32_t i = readerIndex(n); // find segment num (*subReaders)[i]->setNorm(n-starts[i], field, value); // dispatch } TermEnum* MultiReader::terms() { ensureOpen(); return _CLNEW MultiTermEnum(subReaders, starts, NULL); } TermEnum* MultiReader::terms(const Term* term) { ensureOpen(); return _CLNEW MultiTermEnum(subReaders, starts, term); } int32_t MultiReader::docFreq(const Term* t) { ensureOpen(); int32_t total = 0; // sum freqs in Multi for (size_t i = 0; i < subReaders->length; i++) total += (*subReaders)[i]->docFreq(t); return total; } TermDocs* MultiReader::termDocs() { ensureOpen(); TermDocs* ret = _CLNEW MultiTermDocs(subReaders, starts); return ret; } TermPositions* MultiReader::termPositions() { ensureOpen(); TermPositions* ret = (TermPositions*)_CLNEW MultiTermPositions(subReaders, starts); return ret; } void MultiReader::doDelete(const int32_t n) { _internal->_numDocs = -1; // invalidate cache int32_t i = readerIndex(n); // find segment num (*subReaders)[i]->deleteDocument(n - starts[i]); // dispatch to segment reader _internal->_hasDeletions = true; } int32_t MultiReader::readerIndex(const int32_t n) const { // find reader for doc n: return MultiSegmentReader::readerIndex(n, this->starts, this->subReaders->length); } bool MultiReader::hasNorms(const TCHAR* field) { ensureOpen(); for (size_t i = 0; i < subReaders->length; i++) { if ((*subReaders)[i]->hasNorms(field)) return true; } return false; } uint8_t* MultiReader::fakeNorms() { if (_internal->ones==NULL) _internal->ones=SegmentReader::createFakeNorms(maxDoc()); return _internal->ones; } void MultiReader::doUndeleteAll(){ for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->undeleteAll(); _internal->_hasDeletions = false; _internal->_numDocs = -1; } void MultiReader::doCommit() { for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->commit(); } void MultiReader::doClose() { SCOPED_LOCK_MUTEX(THIS_LOCK) for (size_t i = 0; i < subReaders->length; i++){ if ( (*subReaders)[i] == NULL ) continue; //reopen may take some memory... if (_internal->closeOnClose[i]) { subReaders->values[i]->close(); _CLDELETE(subReaders->values[i]); } } } void MultiReader::getFieldNames(FieldOption fieldNames, StringArrayWithDeletor& retarray){ ensureOpen(); return MultiSegmentReader::getFieldNames(fieldNames, retarray, this->subReaders); } bool MultiReader::isCurrent(){ for (size_t i = 0; i < subReaders->length; i++) { if (!(*subReaders)[i]->isCurrent()) { return false; } } // all subreaders are up to date return true; } /** Not implemented. * @throws UnsupportedOperationException */ int64_t MultiReader::getVersion() { _CLTHROWA(CL_ERR_UnsupportedOperation, "MultiReader does not support this method."); } const char* MultiReader::getClassName(){ return "MultiReader"; } const char* MultiReader::getObjectName() const{ return getClassName(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/MultiReader.h000066400000000000000000000103501154025176300227620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_MultiReader #define _lucene_index_MultiReader //#include "SegmentHeader.h" #include "IndexReader.h" CL_CLASS_DEF(document,Document) //#include "Terms.h" //#include "SegmentMergeQueue.h" CL_NS_DEF(index) /** An IndexReader which reads multiple indexes, appending their content. */ class CLUCENE_EXPORT MultiReader:public IndexReader{ private: class Internal; Internal* _internal; int32_t readerIndex(const int32_t n) const; bool hasNorms(const TCHAR* field); uint8_t* fakeNorms(); void init(const CL_NS(util)::ArrayBase* subReaders, bool closeSubReaders); protected: CL_NS(util)::ArrayBase* subReaders; int32_t* starts; // 1st docno for each segment void doSetNorm(int32_t n, const TCHAR* field, uint8_t value); void doUndeleteAll(); void doCommit(); void doClose(); void doDelete(const int32_t n); public: /** *

Construct a MultiReader aggregating the named set of (sub)readers. * Directory locking for delete, undeleteAll, and setNorm operations is * left to the subreaders.

* @param subReaders set of (sub)readers * @param closeSubReaders The subReaders (IndexReader instances) are deleted if true * @throws IOException * @memory The subReaders array itself belongs to the caller */ MultiReader(const CL_NS(util)::ArrayBase* subReaders, bool closeSubReaders=true); ~MultiReader(); /** * Tries to reopen the subreaders. *
* If one or more subreaders could be re-opened (i. e. subReader.reopen() * returned a new instance != subReader), then a new MultiReader instance * is returned, otherwise this instance is returned. *

* A re-opened instance might share one or more subreaders with the old * instance. Index modification operations result in undefined behavior * when performed before the old instance is closed. * (see {@link IndexReader#reopen()}). *

* If subreaders are shared, then the reference count of those * readers is increased to ensure that the subreaders remain open * until the last referring reader is closed. * * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ IndexReader* reopen(); TermFreqVector* getTermFreqVector(int32_t n, const TCHAR* field=NULL); void getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper); void getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper); /** Return an array of term frequency vectors for the specified document. * The array contains a vector for each vectorized field in the document. * Each vector vector contains term numbers and frequencies for all terms * in a given vectorized field. * If no such fields existed, the method returns null. */ CL_NS(util)::ArrayBase* getTermFreqVectors(int32_t n); bool isOptimized(); int32_t numDocs(); int32_t maxDoc() const; bool document(int32_t n, CL_NS(document)::Document& doc, const CL_NS(document)::FieldSelector* fieldSelector); bool isDeleted(const int32_t n); bool hasDeletions() const; uint8_t* norms(const TCHAR* field); void norms(const TCHAR* field, uint8_t* result); TermEnum* terms(); TermEnum* terms(const Term* term); //Returns the document frequency of the current term in the set int32_t docFreq(const Term* t=NULL); TermDocs* termDocs(); TermPositions* termPositions(); /** * @see IndexReader#getFieldNames(IndexReader.FieldOption fldOption) */ void getFieldNames(FieldOption fldOption, StringArrayWithDeletor& retarray); /** * Checks recursively if all subreaders are up to date. */ bool isCurrent(); /** Not implemented. * @throws UnsupportedOperationException */ int64_t getVersion(); const CL_NS(util)::ArrayBase* getSubReaders() const; static const char* getClassName(); const char* getObjectName() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/MultiSegmentReader.cpp000066400000000000000000000646141154025176300246540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexReader.h" #include "CLucene/document/Document.h" #include "CLucene/document/FieldSelector.h" #include "Term.h" #include "Terms.h" #include "CLucene/util/PriorityQueue.h" #include "_SegmentHeader.h" #include "_SegmentMergeInfo.h" #include "_SegmentMergeQueue.h" #include "MultiReader.h" #include "_MultiSegmentReader.h" CL_NS_USE(document) CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) void MultiSegmentReader::initialize(CL_NS(util)::ArrayBase* _subReaders){ this->subReaders = _subReaders; _maxDoc = 0; _numDocs = -1; ones = NULL; _hasDeletions = false; starts = _CL_NEWARRAY(int32_t, subReaders->length + 1); // build starts array for (size_t i = 0; i < subReaders->length; i++) { starts[i] = _maxDoc; // compute maxDocs _maxDoc += (*subReaders)[i]->maxDoc(); if ((*subReaders)[i]->hasDeletions()) _hasDeletions = true; } starts[subReaders->length] = _maxDoc; } MultiSegmentReader::MultiSegmentReader(CL_NS(store)::Directory* directory, SegmentInfos* sis, bool closeDirectory): DirectoryIndexReader(directory,sis,closeDirectory), normsCache(NormsCacheType(true,true)) { // To reduce the chance of hitting FileNotFound // (and having to retry), we open segments in // reverse because IndexWriter merges & deletes // the newest segments first. ArrayBase* readers = _CLNEW ObjectArray(sis->size()); for (int32_t i = (int32_t)sis->size()-1; i >= 0; i--) { try { readers->values[i] = SegmentReader::get(sis->info(i)); } catch(CLuceneError& err) { if ( err.number() != CL_ERR_IO ) throw err; // Close all readers we had opened: for(i++;isize();i++) { try { (*readers)[i]->close(); } catch (CLuceneError& err2) { if ( err.number() != CL_ERR_IO ) throw err2; // keep going - we want to clean up as much as possible } } throw err; } } initialize(readers); } /** This contructor is only used for {@link #reopen()} */ MultiSegmentReader::MultiSegmentReader( CL_NS(store)::Directory* directory, SegmentInfos* infos, bool closeDirectory, CL_NS(util)::ArrayBase* oldReaders, int32_t* oldStarts, NormsCacheType* oldNormsCache): DirectoryIndexReader(directory, infos, closeDirectory), normsCache(NormsCacheType(true,true)) { // we put the old SegmentReaders in a map, that allows us // to lookup a reader using its segment name map segmentReaders; if (oldReaders != NULL) { // create a Map SegmentName->SegmentReader for (size_t i = 0; i < oldReaders->length; i++) { segmentReaders[((SegmentReader*)(*oldReaders)[i])->getSegmentName()] = i; } } ArrayBase* newReaders = _CLNEW ObjectArray(infos->size()); for (int32_t i = infos->size() - 1; i>=0; i--) { // find SegmentReader for this segment map::iterator oldReaderIndex = segmentReaders.find(infos->info(i)->name); if ( oldReaderIndex == segmentReaders.end()) { // this is a new segment, no old SegmentReader can be reused newReaders->values[i] = NULL; } else { // there is an old reader for this segment - we'll try to reopen it newReaders->values[i] = (*oldReaders)[oldReaderIndex->second]; } bool success = false; try { SegmentReader* newReader; if ((*newReaders)[i] == NULL || infos->info(i)->getUseCompoundFile() != ((SegmentReader*)(*newReaders)[i])->getSegmentInfo()->getUseCompoundFile()) { // this is a new reader; in case we hit an exception we can close it safely newReader = SegmentReader::get(infos->info(i)); } else { newReader = ((SegmentReader*)(*newReaders)[i])->reopenSegment(infos->info(i)); } if (newReader == (*newReaders)[i]) { // this reader is being re-used, so we take ownership of it... oldReaders->values[i] = NULL; } newReaders->values[i] = newReader; success = true; } _CLFINALLY ( if (!success) { for (i++; i < infos->size(); i++) { if (newReaders->values[i] != NULL) { try { (*newReaders)[i]->close(); _CLDELETE(newReaders->values[i]); }catch(CLuceneError& ignore){ if ( ignore.number() != CL_ERR_IO ) throw ignore; // keep going - we want to clean up as much as possible } } } } ) } // initialize the readers to calculate maxDoc before we try to reuse the old normsCache initialize(newReaders); // try to copy unchanged norms from the old normsCache to the new one if (oldNormsCache != NULL) { NormsCacheType::iterator it = oldNormsCache->begin(); while (it != oldNormsCache->end()) { TCHAR* field = it->first; if (!hasNorms(field)) { continue; } uint8_t* oldBytes = it->second; uint8_t* bytes = _CL_NEWARRAY(uint8_t,maxDoc()); for (size_t i = 0; i < subReaders->length; i++) { map::iterator oldReaderIndex = segmentReaders.find(((SegmentReader*)(*subReaders)[i])->getSegmentName()); // this SegmentReader was not re-opened, we can copy all of its norms if (oldReaderIndex != segmentReaders.end() && ((*oldReaders)[oldReaderIndex->second] == (*subReaders)[i] || ((SegmentReader*)(*oldReaders)[oldReaderIndex->second])->_norms.get(field) == ((SegmentReader*)(*subReaders)[i])->_norms.get(field))) { // we don't have to synchronize here: either this constructor is called from a SegmentReader, // in which case no old norms cache is present, or it is called from MultiReader.reopen(), // which is synchronized memcpy(bytes + starts[i], oldBytes + oldStarts[oldReaderIndex->second], starts[i+1] - starts[i]); } else { (*subReaders)[i]->norms(field, bytes+starts[i]); } } normsCache.put(field, bytes); // update cache it++; } } } MultiSegmentReader::~MultiSegmentReader() { //Func - Destructor //Pre - true //Post - The instance has been destroyed all IndexReader instances // this instance managed have been destroyed to _CLDELETE_ARRAY(ones); _CLDELETE_ARRAY(starts); //Iterate through the subReaders and destroy each reader _CLDELETE(subReaders); } const char* MultiTermEnum::getObjectName() const{ return getClassName(); } const char* MultiTermEnum::getClassName(){ return "MultiTermEnum"; } DirectoryIndexReader* MultiSegmentReader::doReopen(SegmentInfos* infos){ SCOPED_LOCK_MUTEX(THIS_LOCK) if (infos->size() == 1) { // The index has only one segment now, so we can't refresh the MultiSegmentReader. // Return a new SegmentReader instead return SegmentReader::get(infos, infos->info(0), false); } else { return _CLNEW MultiSegmentReader(_directory, infos, closeDirectory, subReaders, starts, &normsCache); } } ArrayBase* MultiSegmentReader::getTermFreqVectors(int32_t n){ ensureOpen(); int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->getTermFreqVectors(n - starts[i]); // dispatch to segment } TermFreqVector* MultiSegmentReader::getTermFreqVector(int32_t n, const TCHAR* field){ ensureOpen(); int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->getTermFreqVector(n - starts[i], field); } void MultiSegmentReader::getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper){ ensureOpen(); int32_t i = readerIndex(docNumber); // find segment num (*subReaders)[i]->getTermFreqVector(docNumber - starts[i], field, mapper); } void MultiSegmentReader::getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper){ ensureOpen(); int32_t i = readerIndex(docNumber); // find segment num (*subReaders)[i]->getTermFreqVector(docNumber - starts[i], mapper); } bool MultiSegmentReader::isOptimized() { return false; } int32_t MultiSegmentReader::numDocs() { SCOPED_LOCK_MUTEX(THIS_LOCK) // Don't call ensureOpen() here (it could affect performance) if (_numDocs == -1) { // check cache int32_t n = 0; // cache miss--recompute for (size_t i = 0; i < subReaders->length; i++) n += (*subReaders)[i]->numDocs(); // sum from readers _numDocs = n; } return _numDocs; } int32_t MultiSegmentReader::maxDoc() const { // Don't call ensureOpen() here (it could affect performance) return _maxDoc; } const ArrayBase* MultiSegmentReader::getSubReaders() const{ return subReaders; } bool MultiSegmentReader::document(int32_t n, CL_NS(document)::Document& doc, const FieldSelector* fieldSelector){ ensureOpen(); int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->document(n - starts[i],doc, fieldSelector); // dispatch to segment reader } bool MultiSegmentReader::isDeleted(const int32_t n) { // Don't call ensureOpen() here (it could affect performance) int32_t i = readerIndex(n); // find segment num return (*subReaders)[i]->isDeleted(n - starts[i]); // dispatch to segment reader } bool MultiSegmentReader::hasDeletions() const{ // Don't call ensureOpen() here (it could affect performance) return _hasDeletions; } uint8_t* MultiSegmentReader::norms(const TCHAR* field){ SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); uint8_t* bytes; bytes = normsCache.get((TCHAR*)field); if (bytes != NULL){ return bytes; // cache hit } if ( !hasNorms(field) ) return fakeNorms(); bytes = _CL_NEWARRAY(uint8_t,maxDoc()); for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->norms(field, bytes + starts[i]); //Unfortunately the data in the normCache can get corrupted, since it's being loaded with string //keys that may be deleted while still in use by the map. To prevent this field is duplicated //and then stored in the normCache TCHAR* key = STRDUP_TtoT(field); //update cache normsCache.put(key, bytes); return bytes; } void MultiSegmentReader::norms(const TCHAR* field, uint8_t* result) { SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); uint8_t* bytes = normsCache.get((TCHAR*)field); if (bytes==NULL && !hasNorms(field)) bytes=fakeNorms(); if (bytes != NULL){ // cache hit int32_t len = maxDoc(); memcpy(result,bytes,len * sizeof(int32_t)); } for (size_t i = 0; i < subReaders->length; i++) // read from segments (*subReaders)[i]->norms(field, result + starts[i]); } void MultiSegmentReader::doSetNorm(int32_t n, const TCHAR* field, uint8_t value){ normsCache.removeitr( normsCache.find((TCHAR*)field) ); // clear cache int32_t i = readerIndex(n); // find segment num (*subReaders)[i]->setNorm(n-starts[i], field, value); // dispatch } TermEnum* MultiSegmentReader::terms() { ensureOpen(); return _CLNEW MultiTermEnum(subReaders, starts, NULL); } TermEnum* MultiSegmentReader::terms(const Term* term) { ensureOpen(); return _CLNEW MultiTermEnum(subReaders, starts, term); } int32_t MultiSegmentReader::docFreq(const Term* t) { ensureOpen(); int32_t total = 0; // sum freqs in Multi for (size_t i = 0; i < subReaders->length; i++) total += (*subReaders)[i]->docFreq(t); return total; } TermDocs* MultiSegmentReader::termDocs() { ensureOpen(); TermDocs* ret = _CLNEW MultiTermDocs(subReaders, starts); return ret; } TermPositions* MultiSegmentReader::termPositions() { ensureOpen(); TermPositions* ret = static_cast(_CLNEW MultiTermPositions(subReaders, starts)); return ret; } void MultiSegmentReader::setTermInfosIndexDivisor(int32_t indexDivisor) { for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->setTermInfosIndexDivisor(indexDivisor); } int32_t MultiSegmentReader::getTermInfosIndexDivisor() { if (subReaders->length > 0) return (*subReaders)[0]->getTermInfosIndexDivisor(); else _CLTHROWA(CL_ERR_IllegalState,"no readers"); } void MultiSegmentReader::doDelete(const int32_t n) { _numDocs = -1; // invalidate cache int32_t i = readerIndex(n); // find segment num (*subReaders)[i]->deleteDocument(n - starts[i]); // dispatch to segment reader _hasDeletions = true; } int32_t MultiSegmentReader::readerIndex(int32_t n) const{ // find reader for doc n: return readerIndex(n, this->starts, this->subReaders->length); } int32_t MultiSegmentReader::readerIndex(const int32_t n, int32_t* starts, int32_t numSubReaders) { // find reader for doc n: int32_t lo = 0; // search starts array int32_t hi = numSubReaders - 1; // for first element less // than n, return its index while (hi >= lo) { int32_t mid = (lo + hi) >> 1; int32_t midValue = starts[mid]; if (n < midValue) hi = mid - 1; else if (n > midValue) lo = mid + 1; else{ // found a match while (mid+1 < numSubReaders && starts[mid+1] == midValue) { mid++; // scan to last match } return mid; } } return hi; } bool MultiSegmentReader::hasNorms(const TCHAR* field) { ensureOpen(); for (size_t i = 0; i < subReaders->length; i++) { if ((*subReaders)[i]->hasNorms(field)) return true; } return false; } uint8_t* MultiSegmentReader::fakeNorms() { if (ones==NULL) ones=SegmentReader::createFakeNorms(maxDoc()); return ones; } void MultiSegmentReader::doUndeleteAll(){ for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->undeleteAll(); _hasDeletions = false; _numDocs = -1; } void MultiSegmentReader::commitChanges() { for (size_t i = 0; i < subReaders->length; i++) (*subReaders)[i]->commit(); } void MultiSegmentReader::doClose() { SCOPED_LOCK_MUTEX(THIS_LOCK) for (size_t i = 0; i < subReaders->length; i++){ if ( (*subReaders)[i] != NULL ){ (*subReaders)[i]->close(); _CLDELETE(subReaders->values[i]); } } // maybe close directory DirectoryIndexReader::doClose(); } void MultiSegmentReader::getFieldNames(FieldOption fieldNames, StringArrayWithDeletor& retarray, CL_NS(util)::ArrayBase* subReaders) { // maintain a unique set of field names for (size_t i = 0; i < subReaders->length; i++) { IndexReader* reader = (*subReaders)[i]; StringArrayWithDeletor subFields(false); reader->getFieldNames(fieldNames, subFields); retarray.insert(retarray.end(),subFields.begin(),subFields.end()); subFields.clear(); } } void MultiSegmentReader::getFieldNames(FieldOption fldOption, StringArrayWithDeletor& retarray){ StringArrayWithDeletor temp; CLHashList hashList; for (size_t i = 0; i < subReaders->length; i++) { IndexReader* reader = (*subReaders)[i]; reader->getFieldNames(fldOption, temp); //create a unique list of names. StringArrayWithDeletor::iterator itr = temp.begin(); while ( itr != temp.end() ){ if ( hashList.find(*itr) == hashList.end() ) hashList.insert(STRDUP_TtoT(*itr)); itr++; } } //move the items into the return CLHashList::iterator itr = hashList.begin(); while ( itr != hashList.end() ){ retarray.push_back(*itr);//no need to copy, already done! itr++; } } const char* MultiSegmentReader::getClassName(){ return "MultiSegmentReader"; } const char* MultiSegmentReader::getObjectName() const{ return getClassName(); } void MultiTermDocs::init(ArrayBase* r, const int32_t* s){ subReaders = r; starts = s; base = 0; pointer = 0; current = NULL; term = NULL; readerTermDocs = NULL; //Check if there are subReaders if(subReaders != NULL && subReaders->length > 0){ readerTermDocs = _CLNEW ValueArray(subReaders->length); } } MultiTermDocs::MultiTermDocs(){ //Func - Default constructor // Initialises an empty MultiTermDocs. // This constructor is needed to allow the constructor of MultiTermPositions // initialise the instance by itself //Pre - true //Post - An empty init(NULL,NULL); } MultiTermDocs::MultiTermDocs(ArrayBase* r, const int32_t* s){ //Func - Constructor //Pre - if r is NULL then rLen must be 0 else if r != NULL then rLen > 0 // s != NULL //Post - The instance has been created init(r,s); } MultiTermDocs::~MultiTermDocs(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed close(); } TermPositions* MultiTermDocs::__asTermPositions(){ return NULL; } int32_t MultiTermDocs::doc() const { CND_PRECONDITION(current!=NULL,"current==NULL, check that next() was called"); return base + current->doc(); } int32_t MultiTermDocs::freq() const { CND_PRECONDITION(current!=NULL,"current==NULL, check that next() was called"); return current->freq(); } void MultiTermDocs::seek(TermEnum* termEnum){ seek(termEnum->term(false)); } void MultiTermDocs::seek( Term* tterm) { //Func - Resets the instance for a new search //Pre - tterm != NULL //Post - The instance has been reset for a new search CND_PRECONDITION(tterm != NULL, "tterm is NULL"); //Assigning tterm is done as below for a reason //The construction ensures that if seek is called from within //MultiTermDocs with as argument this->term (seek(this->term)) that the assignment //will succeed and all referencecounters represent the correct situation //Get a pointer from tterm and increase its reference counter Term *TempTerm = _CL_POINTER(tterm); //xx //Finialize term to ensure we decrease the reference counter of the instance which term points to _CLDECDELETE(term); //Assign TempTerm to term term = TempTerm; base = 0; pointer = 0; current = NULL; } bool MultiTermDocs::next() { for(;;) { if (current != NULL && current->next()) { return true; } else if (pointer < subReaders->length) { base = starts[pointer]; current = termDocs(pointer++); } else { return false; } } } int32_t MultiTermDocs::read(int32_t* docs, int32_t* freqs, int32_t length) { while (true) { while (current == NULL) { if (pointer < subReaders->length) { // try next segment base = starts[pointer]; current = termDocs(pointer++); } else { return 0; } } int32_t end = current->read(docs, freqs,length); if (end == 0) { // none left in segment current = NULL; } else { // got some int32_t b = base; // adjust doc numbers for (int32_t i = 0; i < end; i++) docs[i] += b; return end; } } } bool MultiTermDocs::skipTo(const int32_t target) { // do { // if (!next()) // return false; // } while (target > doc()); // return true; for(;;) { if ( current != NULL && current->skipTo(target - base)) { return true; } else if ( pointer < subReaders->length ) { base = starts[pointer]; current = termDocs(pointer++); } else { return false; } } } void MultiTermDocs::close() { //Func - Closes all MultiTermDocs managed by this instance //Pre - true //Post - All the MultiTermDocs have been closed //Check if readerTermDocs is valid if (readerTermDocs){ TermDocs* curTD = NULL; //iterate through the readerTermDocs array for (size_t i = 0; i < subReaders->length; i++) { //Retrieve the i-th TermDocs instance curTD = (*readerTermDocs)[i]; //Check if it is a valid pointer if (curTD != NULL) { //Close it curTD->close(); _CLDELETE(curTD); } } _CLDELETE(readerTermDocs); } //current previously pointed to a member of readerTermDocs; ensure that //it doesn't now point to invalid memory. current = NULL; base = 0; pointer = 0; _CLDECDELETE(term); } TermDocs* MultiTermDocs::termDocs(IndexReader* reader) { return reader->termDocs(); } TermDocs* MultiTermDocs::termDocs(const int32_t i) { if (term == NULL) return NULL; TermDocs* result = (*readerTermDocs)[i]; if (result == NULL){ _CLLDELETE(readerTermDocs->values[i]); readerTermDocs->values[i] = termDocs((*subReaders)[i]); result = (*readerTermDocs)[i]; } result->seek(term); return result; } MultiTermEnum::MultiTermEnum(ArrayBase* subReaders, const int32_t *starts, const Term* t){ //Func - Constructor // Opens all enumerations of all readers //Pre - readers != NULL and contains an array of IndexReader instances each responsible for // reading a single segment // subReaders->length >= 0 and represents the number of readers in the readers array // starts is an array of //Post - An instance of has been created //Pre - if readers is NULL then subReaders->length must be 0 else if readers != NULL then subReaders->length > 0 // s != NULL //Post - The instance has been created CND_PRECONDITION(starts != NULL,"starts is NULL"); //Temporary variables IndexReader* reader = NULL; TermEnum* termEnum = NULL; SegmentMergeInfo* smi = NULL; _docFreq = 0; _term = NULL; queue = _CLNEW SegmentMergeQueue(subReaders->length); CND_CONDITION (queue != NULL, "Could not allocate memory for queue"); //iterate through all the readers for ( size_t i=0;ilength;i++ ) { //Get the i-th reader reader = (*subReaders)[i]; //Check if the enumeration must start from term t if (t != NULL) { //termEnum is an enumeration of terms starting at or after the named term t termEnum = reader->terms(t); }else{ //termEnum is an enumeration of all the Terms and TermInfos in the set. termEnum = reader->terms(); } //Instantiate an new SegmentMerginfo smi = _CLNEW SegmentMergeInfo(starts[i], termEnum, reader); // Note that in the call termEnum->getTerm(false) below false is required because // otherwise a reference is leaked. By passing false getTerm is // ordered to return an unowned reference instead. (Credits for DSR) if (t == NULL ? smi->next() : termEnum->term(false) != NULL){ // initialize queue queue->put(smi); } else{ //Close the SegmentMergeInfo smi->close(); //And have it deleted _CLDELETE(smi); } } //Check if the queue has elements if (t != NULL && queue->size() > 0) { next(); } } MultiTermEnum::~MultiTermEnum(){ //Func - Destructor //Pre - true //Post - All the resource have been freed and the instance has been deleted //Close the enumeration close(); //Delete the queue _CLDELETE(queue); } bool MultiTermEnum::next(){ //Func - Move the current term to the next in the set of enumerations //Pre - true //Post - Returns true if term has been moved to the next in the set of enumerations // Returns false if this was not possible SegmentMergeInfo* top = queue->top(); if (top == NULL) { _CLDECDELETE(_term); _term = NULL; return false; } //The getTerm method requires the client programmer to indicate whether he // owns the returned reference, so we can discard ours // right away. _CLDECDELETE(_term); //Assign term the term of top and make sure the reference counter is increased _term = _CL_POINTER(top->term); _docFreq = 0; //Find the next term while (top != NULL && _term->compareTo(top->term) == 0) { //don't delete, this is the top queue->pop(); // increment freq _docFreq += top->termEnum->docFreq(); if (top->next()){ // restore queue queue->put(top); }else{ // done with a segment top->close(); _CLDELETE(top); } top = queue->top(); } return true; } Term* MultiTermEnum::term(bool pointer) { if ( pointer ) return _CL_POINTER(_term); else return _term; } int32_t MultiTermEnum::docFreq() const { //Func - Returns the document frequency of the current term in the set //Pre - termInfo != NULL // next() must have been called once //Post - The document frequency of the current enumerated term has been returned return _docFreq; } void MultiTermEnum::close() { //Func - Closes the set of enumerations in the queue //Pre - queue holds a valid reference to a SegmentMergeQueue //Post - The queue has been closed all SegmentMergeInfo instance have been deleted by // the closing of the queue // term has been finalized and reset to NULL // Needed when this enumeration hasn't actually been exhausted yet _CLDECDELETE(_term); //Close the queue This will destroy all SegmentMergeInfo instances! queue->close(); } MultiTermPositions::MultiTermPositions(ArrayBase* r, const int32_t* s){ //Func - Constructor //Pre - if r is NULL then rLen must be 0 else if r != NULL then rLen > 0 // s != NULL //Post - The instance has been created init(r,s); } TermDocs* MultiTermPositions::__asTermDocs(){ return (TermDocs*) this; } TermPositions* MultiTermPositions::__asTermPositions(){ return (TermPositions*) this; } TermDocs* MultiTermPositions::termDocs(IndexReader* reader) { // Here in the MultiTermPositions class, we want this->current to always // be a SegmentTermPositions rather than merely a SegmentTermDocs. // To that end, we override the termDocs(IndexReader&) method to produce // a SegmentTermPositions via the underlying reader's termPositions method // rather merely producing a SegmentTermDocs via the reader's termDocs // method. TermPositions* tp = reader->termPositions(); TermDocs* ret = tp->__asTermDocs(); CND_CONDITION(ret != NULL, "Dynamic downcast in MultiTermPositions::termDocs from" " TermPositions to TermDocs failed." ); return ret; } int32_t MultiTermPositions::nextPosition() { //Func - //Pre - current != NULL //Post - CND_PRECONDITION(current != NULL,"current is NULL"); TermPositions* curAsTP = current->__asTermPositions(); CND_CONDITION(curAsTP != NULL, "Dynamic downcast in MultiTermPositions::nextPosition from" " SegmentTermDocs to TermPositions failed." ) return curAsTP->nextPosition(); } int32_t MultiTermPositions::getPayloadLength() const{ TermPositions* curAsTP = current->__asTermPositions(); return curAsTP->getPayloadLength(); } uint8_t* MultiTermPositions::getPayload(uint8_t* data){ TermPositions* curAsTP = current->__asTermPositions(); return curAsTP->getPayload(data); } bool MultiTermPositions::isPayloadAvailable() const{ TermPositions* curAsTP = current->__asTermPositions(); return curAsTP->isPayloadAvailable(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/MultipleTermPositions.cpp000066400000000000000000000116001154025176300254320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MultipleTermPositions.h" #include "IndexReader.h" #include "CLucene/util/Array.h" #include "CLucene/util/PriorityQueue.h" CL_NS_USE(util) CL_NS_DEF(index) void MultipleTermPositions::seek(Term*) { _CLTHROWA(CL_ERR_UnsupportedOperation, "Unsupported operation: MultipleTermPositions::seek"); } void MultipleTermPositions::seek(TermEnum*) { _CLTHROWA(CL_ERR_UnsupportedOperation, "Unsupported operation: MultipleTermPositions::seek"); } int32_t MultipleTermPositions::read(int32_t*, int32_t*,int32_t) { _CLTHROWA(CL_ERR_UnsupportedOperation, "Unsupported operation: MultipleTermPositions::read"); } int32_t MultipleTermPositions::getPayloadLength() const { _CLTHROWA(CL_ERR_UnsupportedOperation, "Unsupported operation: MultipleTermPositions::getPayloadLength"); } uint8_t* MultipleTermPositions::getPayload(uint8_t*) { _CLTHROWA(CL_ERR_UnsupportedOperation, "Unsupported operation: MultipleTermPositions::getPayload"); } bool MultipleTermPositions::isPayloadAvailable() const{ return false; } TermDocs* MultipleTermPositions::__asTermDocs(){ return (TermDocs*)this; } TermPositions* MultipleTermPositions::__asTermPositions(){ return (TermPositions*)this; } class MultipleTermPositions::TermPositionsQueue : public CL_NS(util)::PriorityQueue > { public: TermPositionsQueue(TermPositions** termPositions, size_t termPositionsSize) { initialize(termPositionsSize, false); size_t i=0; while (termPositions[i]!=NULL) { if (termPositions[i]->next()) put(termPositions[i]); else _CLDELETE( termPositions[ i ] ); ++i; } } virtual ~TermPositionsQueue(){ } TermPositions* peek() { return top(); } bool lessThan(TermPositions* a, TermPositions* b) { return a->doc() < b->doc(); } }; int IntQueue_sort(const void* a, const void* b){ return ( *(int*)a - *(int*)b ); } class MultipleTermPositions::IntQueue { private: ValueArray* _array; int32_t _index; int32_t _lastIndex; public: IntQueue():_array(_CLNEW ValueArray(16)), _index(0), _lastIndex(0){ } virtual ~IntQueue(){ _CLLDELETE(_array); } void add(const int32_t i) { if (_lastIndex == _array->length) _array->resize(_array->length*2); _array->values[_lastIndex++] = i; } int32_t next() { return _array->values[_index++]; } void sort() { int len = _lastIndex - _index; qsort(_array->values+_index, len, sizeof(int32_t), IntQueue_sort); } void clear() { _index = 0; _lastIndex = 0; } int32_t size() { return (_lastIndex - _index); } }; MultipleTermPositions::MultipleTermPositions(IndexReader* indexReader, const CL_NS(util)::ArrayBase* terms) : _posList(_CLNEW IntQueue()){ CLLinkedList termPositions; for ( size_t i=0;ilength;i++){ termPositions.push_back( indexReader->termPositions(terms->values[i])); } TermPositions** tps = _CL_NEWARRAY(TermPositions*, terms->length+1); // i == tpsSize termPositions.toArray_nullTerminated(tps); _termPositionsQueue = _CLNEW TermPositionsQueue(tps,terms->length); _CLDELETE_LARRAY(tps); } MultipleTermPositions::~MultipleTermPositions() { _CLLDELETE(_termPositionsQueue); _CLLDELETE(_posList); } bool MultipleTermPositions::next() { if (_termPositionsQueue->size() == 0) return false; _posList->clear(); _doc = _termPositionsQueue->peek()->doc(); TermPositions* tp; do { tp = _termPositionsQueue->peek(); for (int32_t i = 0; i < tp->freq(); i++) _posList->add(tp->nextPosition()); if (tp->next()) _termPositionsQueue->adjustTop(); else { _termPositionsQueue->pop(); tp->close(); _CLLDELETE(tp); } } while (_termPositionsQueue->size() > 0 && _termPositionsQueue->peek()->doc() == _doc); _posList->sort(); _freq = _posList->size(); return true; } int32_t MultipleTermPositions::nextPosition() { return _posList->next(); } bool MultipleTermPositions::skipTo(int32_t target) { while (_termPositionsQueue->peek() != NULL && target > _termPositionsQueue->peek()->doc()) { TermPositions* tp = _termPositionsQueue->pop(); if (tp->skipTo(target)) _termPositionsQueue->put(tp); else { tp->close(); _CLLDELETE(tp); } } return next(); } int32_t MultipleTermPositions::doc() const { return _doc; } int32_t MultipleTermPositions::freq() const { return _freq; } void MultipleTermPositions::close() { while (_termPositionsQueue->size() > 0) { TermPositions* tp = _termPositionsQueue->pop(); tp->close(); _CLLDELETE(tp); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/MultipleTermPositions.h000066400000000000000000000035411154025176300251040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_MultipleTermPositions_ #define _lucene_index_MultipleTermPositions_ #include "Terms.h" #include "CLucene/util/Array.h" CL_NS_DEF(index) class Term; class IndexReader; class CLUCENE_EXPORT MultipleTermPositions : public TermPositions { private: class TermPositionsQueue; class IntQueue; int32_t _doc; int32_t _freq; TermPositionsQueue* _termPositionsQueue; IntQueue* _posList; public: /** * Creates a new MultipleTermPositions instance. * * @exception IOException */ MultipleTermPositions(IndexReader* indexReader, const CL_NS(util)::ArrayBase* terms); virtual ~MultipleTermPositions(); bool next(); int32_t nextPosition(); bool skipTo(const int32_t target); int32_t doc() const; int32_t freq() const; void close(); /** * Not implemented. * @throws UnsupportedOperationException */ void seek(Term*); /** * Not implemented. * @throws UnsupportedOperationException */ void seek(TermEnum*); /** * Not implemented. * @throws UnsupportedOperationException */ int32_t read(int32_t*, int32_t*,int32_t); /** * Not implemented. * @throws UnsupportedOperationException */ int32_t getPayloadLength() const; /** * Not implemented. * @throws UnsupportedOperationException */ uint8_t* getPayload(uint8_t*); /** * * @return false */ // Java-TODO: Remove warning after API has been finalized bool isPayloadAvailable() const; TermDocs* __asTermDocs(); TermPositions* __asTermPositions(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/Payload.cpp000066400000000000000000000065061154025176300225010ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Payload.h" #include CL_NS_USE(util) CL_NS_DEF(index) Payload::Payload() : data( * _CLNEW CL_NS(util)::ValueArray(0)) { // nothing to do this->deleteData = true; this->deleteArray = true; } Payload::Payload(CL_NS(util)::ValueArray& _data, const int32_t offset, const int32_t length, bool deleteData): data(_data) { this->deleteData = false; this->deleteArray = false; this->setData(data,offset,length,deleteData); } Payload::Payload(uint8_t* data, const int32_t length, bool deleteData): data(*_CLNEW CL_NS(util)::ValueArray) { this->deleteData = false; this->deleteArray = false; this->setData(data,length,deleteData); } Payload::~Payload() { if ( deleteData ) this->data.deleteValues(); if ( deleteArray ) _CLLDELETE(&this->data); } void Payload::setData(uint8_t* data, const int32_t length, bool deleteData) { if ( this->deleteData ) this->data.deleteValues(); if ( this->deleteArray ) { _CLLDELETE(&this->data); this->data = *_CLNEW CL_NS(util)::ValueArray; } if (length < 0 ) { _CLTHROWA(CL_ERR_IllegalArgument,"length < 0"); } this->data.length = offset+length; this->data.values = data; this->deleteData = deleteData; this->deleteArray = true; this->_length = length; this->offset = 0; assert(false); } void Payload::setData(CL_NS(util)::ValueArray& data, const int32_t offset, const int32_t length, bool deleteData) { if ( this->deleteData ) this->data.deleteValues(); if ( this->deleteArray ) { _CLLDELETE(&this->data); } if (offset < 0 || offset + length > data.length) { _CLTHROWA(CL_ERR_IllegalArgument,"offset < 0 || offset + length > data.length"); } this->data = data; this->_length = ( length < 0 ? data.length-offset : length ); this->offset = offset; this->deleteData = this->deleteArray = deleteData; assert(false); } const CL_NS(util)::ValueArray& Payload::getData() const{ return data; } int32_t Payload::getOffset() const { return offset; } int32_t Payload::length() const { return _length; } uint8_t Payload::byteAt(int index) const { if (0 <= index && index < this->_length) { return this->data[this->offset + index]; } _CLTHROWA(CL_ERR_IndexOutOfBounds,"Array index out of bounds at Payload::byteAt"); } CL_NS(util)::ValueArray* Payload::toByteArray() const{ CL_NS(util)::ValueArray* ret = _CLNEW CL_NS(util)::ValueArray(this->_length); memcpy(ret->values, this->data.values + this->offset, this->_length * sizeof(uint8_t)); return ret; } void Payload::copyTo(uint8_t* target, const int32_t targetLen) const { if (this->_length > targetLen) { _CLTHROWA(CL_ERR_IndexOutOfBounds,"Array index out of bounds at Payload::byteAt"); } memcpy(target, this->data.values + this->offset, this->_length * sizeof(uint8_t)); } Payload* Payload::clone() const{ Payload* clone = _CLNEW Payload(*this->toByteArray(), 0, -1, true); return clone; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/Payload.h000066400000000000000000000072331154025176300221440ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_Payload_ #define _lucene_index_Payload_ #include "CLucene/util/Array.h" CL_NS_DEF(index) /** * A Payload is metadata that can be stored together with each occurrence * of a term. This metadata is stored inline in the posting list of the * specific term. *

* To store payloads in the index a {@link TokenStream} has to be used that * produces {@link Token}s containing payload data. *

* Use {@link TermPositions#getPayloadLength()} and {@link TermPositions#getPayload(byte[], int)} * to retrieve the payloads from the index.
* */ class CLUCENE_EXPORT Payload:LUCENE_REFBASE { protected: CL_NS(util)::ValueArray& data; /** the offset within the byte array */ int32_t offset; /** the length of the payload data */ int32_t _length; bool deleteData; bool deleteArray; public: /** Creates an empty payload and does not allocate a byte array. */ Payload(); /** * Creates a new payload with the the given array as data. * A reference to the passed-in array is held, i. e. no * copy is made. * * @param data the data of this payload * @param length the length of the data * @param deleteData delete data when payload is deleted */ Payload(uint8_t* data, const int32_t length, bool deleteData=false); /** * Creates a new payload with the the given array as data. * A reference to the passed-in array is held, i. e. no * copy is made. * * @param data the data of this payload * @param deleteData delete data when payload is deleted */ Payload(CL_NS(util)::ValueArray& data, const int32_t offset=0, const int32_t length=-1, bool deleteData=false); /* Desctructor - auto-delete the data container */ ~Payload(); /** * Sets this payloads data. * A reference to the passed-in array is held, i. e. no * copy is made. * @param deleteData delete data when payload is deleted */ void setData(uint8_t* data, const int32_t length, bool deleteData=false); /** * Sets this payloads data. * A reference to the passed-in array is held, i. e. no * copy is made. * @param deleteData delete data when payload is deleted */ void setData(CL_NS(util)::ValueArray& data, const int32_t offset=0, const int32_t length=-1, bool deleteData=false); /** * Returns a reference to the underlying byte array * that holds this payloads data. */ const CL_NS(util)::ValueArray& getData() const; /** * Returns the length of the payload data. */ int32_t length() const; /** * Returns the offset in the underlying byte array */ int32_t getOffset() const; /** * Returns the byte at the given index. */ uint8_t byteAt(int index) const; /** * Allocates a new byte array, copies the payload data into it and returns it. Caller is responsible * for deleting it later. * @memory caller is responsible for deleting the returned array */ CL_NS(util)::ValueArray* toByteArray() const; /** * Copies the payload data to a byte array. * * @param target the target byte array * @param targetOffset the offset in the target byte array */ void copyTo(uint8_t* target, const int32_t targetLen) const; /** * Clones this payload by creating a copy of the underlying * byte array. */ Payload* clone() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/SegmentInfos.cpp000066400000000000000000001076151154025176300235140ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SegmentInfos.h" #include "_IndexFileNames.h" #include "_SegmentHeader.h" #include "MultiReader.h" #include #include #include "CLucene/store/Directory.h" #include "CLucene/util/Misc.h" CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) SegmentInfo::SegmentInfo(const char* _name, const int32_t _docCount, CL_NS(store)::Directory* _dir, bool _isCompoundFile, bool _hasSingleNormFile, int32_t _docStoreOffset, const char* _docStoreSegment, bool _docStoreIsCompoundFile) : docCount(_docCount), preLockless(false), delGen(SegmentInfo::NO), isCompoundFile(_isCompoundFile ? SegmentInfo::YES : SegmentInfo::NO), hasSingleNormFile(_hasSingleNormFile), _sizeInBytes(-1), docStoreOffset(_docStoreOffset), docStoreSegment( _docStoreSegment == NULL ? "" : _docStoreSegment ), docStoreIsCompoundFile(_docStoreIsCompoundFile) { CND_PRECONDITION(docStoreOffset == -1 || !docStoreSegment.empty(), "failed testing for (docStoreOffset == -1 || docStoreSegment != NULL)"); this->name = _name; this->dir = _dir; } string SegmentInfo::segString(Directory* dir) { string cfs; try { if (getUseCompoundFile()) cfs = "c"; else cfs = "C"; } catch (CLuceneError& ioe) { if ( ioe.number() != CL_ERR_IO ) throw ioe; cfs = "?"; } string docStore; if (docStoreOffset != -1) docStore = string("->") + docStoreSegment; else docStore = ""; return string(name) + ":" + cfs + string(this->dir == dir ? "" : "x") + Misc::toString(docCount) + docStore; } SegmentInfo::SegmentInfo(CL_NS(store)::Directory* _dir, int32_t format, CL_NS(store)::IndexInput* input): _sizeInBytes(-1) { this->dir = _dir; { char aname[CL_MAX_PATH]; input->readString(aname, CL_MAX_PATH); this->name = aname; } docCount = input->readInt(); if (format <= SegmentInfos::FORMAT_LOCKLESS) { delGen = input->readLong(); if (format <= SegmentInfos::FORMAT_SHARED_DOC_STORE) { docStoreOffset = input->readInt(); if (docStoreOffset != -1) { char aname[CL_MAX_PATH]; input->readString(aname, CL_MAX_PATH); docStoreSegment = aname; docStoreIsCompoundFile = (1 == input->readByte()); } else { docStoreSegment = name; docStoreIsCompoundFile = false; } } else { docStoreOffset = -1; docStoreSegment = name; docStoreIsCompoundFile = false; } if (format <= SegmentInfos::FORMAT_SINGLE_NORM_FILE) { hasSingleNormFile = (1 == input->readByte()); } else { hasSingleNormFile = false; } int32_t numNormGen = input->readInt(); normGen.deleteValues(); if (numNormGen == NO) { // normGen is already NULL, we'll just set normGenLen to 0 } else { normGen.values = _CL_NEWARRAY(int64_t, numNormGen); normGen.length = numNormGen; for(int32_t j=0;jreadLong(); } } isCompoundFile = input->readByte(); preLockless = (isCompoundFile == CHECK_DIR); } else { delGen = CHECK_DIR; //normGen=NULL; normGenLen=0; isCompoundFile = CHECK_DIR; preLockless = true; hasSingleNormFile = false; docStoreOffset = -1; docStoreIsCompoundFile = false; } } void SegmentInfo::reset(const SegmentInfo* src) { clearFiles(); this->name = src->name; docCount = src->docCount; dir = src->dir; preLockless = src->preLockless; delGen = src->delGen; docStoreOffset = src->docStoreOffset; docStoreIsCompoundFile = src->docStoreIsCompoundFile; if (src->normGen.values == NULL) { this->normGen.deleteValues(); }else{ // optimized case to allocate new array only if current memory buffer is too small if (this->normGen.length < src->normGen.length) { normGen.resize(src->normGen.length); }else{ this->normGen.length = src->normGen.length; } memcpy(this->normGen.values, src->normGen.values, sizeof(int64_t) * this->normGen.length); } isCompoundFile = src->isCompoundFile; hasSingleNormFile = src->hasSingleNormFile; } SegmentInfo::~SegmentInfo(){ normGen.deleteValues(); } void SegmentInfo::setNumFields(const int32_t numFields) { if (normGen.values == NULL) { // normGen is null if we loaded a pre-2.1 segment // file, or, if this segments file hasn't had any // norms set against it yet: normGen.resize(numFields); if (preLockless) { // Do nothing: thus leaving normGen[k]==CHECK_DIR (==0), so that later we know // we have to check filesystem for norm files, because this is prelockless. } else { // This is a FORMAT_LOCKLESS segment, which means // there are no separate norms: for(int32_t i=0;i& __files = files(); size_t size = __files.size(); _sizeInBytes = 0; for(size_t i=0;ifileLength(fileName); } } return _sizeInBytes; } void SegmentInfo::addIfExists(std::vector& files, const std::string& fileName){ if (dir->fileExists(fileName.c_str())) files.push_back(fileName); } const vector& SegmentInfo::files(){ if (!_files.empty()) { // Already cached: return _files; } bool useCompoundFile = getUseCompoundFile(); if (useCompoundFile) { _files.push_back( string(name) + "." + IndexFileNames::COMPOUND_FILE_EXTENSION); } else { ConstValueArray& exts = IndexFileNames::NON_STORE_INDEX_EXTENSIONS(); for(size_t i=0;i& exts = IndexFileNames::STORE_INDEX_EXTENSIONS(); for(size_t i=0;i& exts = IndexFileNames::STORE_INDEX_EXTENSIONS(); for(size_t i=0;i= YES || dir->fileExists(delFileName.c_str()))) { _files.push_back(delFileName); } // Careful logic for norms files if (normGen.values != NULL) { for(size_t i=0;i= YES) { // Definitely a separate norm file, with generation: string gens = string(".") + IndexFileNames::SEPARATE_NORMS_EXTENSION; gens += Misc::toString((int64_t)i); _files.push_back(IndexFileNames::fileNameFromGeneration(name.c_str(), gens.c_str(), gen)); } else if (NO == gen) { // No separate norms but maybe plain norms // in the non compound file case: if (!hasSingleNormFile && !useCompoundFile) { string fileName = name + "." + IndexFileNames::PLAIN_NORMS_EXTENSION; fileName += i; if (dir->fileExists(fileName.c_str())) { _files.push_back(fileName); } } } else if (CHECK_DIR == gen) { // Pre-2.1: we have to check file existence string fileName; if (useCompoundFile) { fileName = name + "." + IndexFileNames::SEPARATE_NORMS_EXTENSION; fileName += Misc::toString((int64_t)i); } else if (!hasSingleNormFile) { fileName = name + "." + IndexFileNames::PLAIN_NORMS_EXTENSION; fileName += Misc::toString((int64_t)i); } if ( !fileName.empty() && dir->fileExists(fileName.c_str())) { _files.push_back(fileName); } } } } else if (preLockless || (!hasSingleNormFile && !useCompoundFile)) { // Pre-2.1: we have to scan the dir to find all // matching _X.sN/_X.fN files for our segment: string prefix; if (useCompoundFile) prefix = name + "." + IndexFileNames::SEPARATE_NORMS_EXTENSION; else prefix = name + "." + IndexFileNames::PLAIN_NORMS_EXTENSION; size_t prefixLength = prefix.length(); vector allFiles; if (dir->list(allFiles) == false ){ string err = "cannot read directory "; err += dir->toString(); err += ": list() returned null"; _CLTHROWA(CL_ERR_IO, err.c_str()); } for(size_t i=0;i prefixLength && _istdigit(fileName[prefixLength]) && fileName.compare(0,prefix.length(),prefix)==0 ) { _files.push_back(fileName); } } } return _files; } bool SegmentInfo::hasDeletions() const { // Cases: // // delGen == NO: this means this segment was written // by the LOCKLESS code and for certain does not have // deletions yet // // delGen == CHECK_DIR: this means this segment was written by // pre-LOCKLESS code which means we must check // directory to see if .del file exists // // delGen >= YES: this means this segment was written by // the LOCKLESS code and for certain has // deletions // if (delGen == NO) { return false; } else if (delGen >= YES) { return true; } else { return dir->fileExists(getDelFileName().c_str()); } } void SegmentInfo::advanceDelGen() { // delGen 0 is reserved for pre-LOCKLESS format if (delGen == NO) { delGen = YES; } else { delGen++; } clearFiles(); } void SegmentInfo::clearDelGen() { delGen = NO; clearFiles(); } SegmentInfo* SegmentInfo::clone () { SegmentInfo* si = _CLNEW SegmentInfo(name.c_str(), docCount, dir); si->isCompoundFile = isCompoundFile; si->delGen = delGen; si->preLockless = preLockless; si->hasSingleNormFile = hasSingleNormFile; if (this->normGen.values != NULL) { si->normGen.resize(this->normGen.length); memcpy(si->normGen.values, this->normGen.values, sizeof(int64_t) * this->normGen.length); } si->docStoreOffset = docStoreOffset; si->docStoreSegment = docStoreSegment; si->docStoreIsCompoundFile = docStoreIsCompoundFile; return si; } string SegmentInfo::getDelFileName() const { if (delGen == NO) { // In this case we know there is no deletion filename // against this segment return NULL; } else { // If delGen is CHECK_DIR, it's the pre-lockless-commit file format return IndexFileNames::fileNameFromGeneration(name.c_str(), (string(".") + IndexFileNames::DELETES_EXTENSION).c_str(), delGen); } } bool SegmentInfo::hasSeparateNorms(const int32_t fieldNumber) const { if ((normGen.values == NULL && preLockless) || (normGen.values != NULL && normGen[fieldNumber] == CHECK_DIR)) { // Must fallback to directory file exists check: return dir->fileExists( (name + string(".s") + Misc::toString(fieldNumber)).c_str() ); } else if (normGen.values == NULL || normGen[fieldNumber] == NO) { return false; } else { return true; } } bool SegmentInfo::hasSeparateNorms() const { if (normGen.values == NULL) { if (!preLockless) { // This means we were created w/ LOCKLESS code and no // norms are written yet: return false; } else { // This means this segment was saved with pre-LOCKLESS // code. So we must fallback to the original // directory list check: vector result; if ( !dir->list(result) ) { _CLTHROWA(CL_ERR_IO, (string("cannot read directory: ") + dir->toString() + string(" list() returned NULL")).c_str() ); } string pattern = name + string(".s"); for ( vector::iterator itr = result.begin(); itr != result.end() ; itr ++ ){ if(strncmp(itr->c_str(), pattern.c_str(), pattern.length() ) == 0 && isdigit( (*itr)[pattern.length()])) { return true; } } return false; } } else { // This means this segment was saved with LOCKLESS // code so we first check whether any normGen's are >= 1 // (meaning they definitely have separate norms): for(size_t i=0;i= YES) { return true; } } // Next we look for any == 0. These cases were // pre-LOCKLESS and must be checked in directory: for(size_t j=0;jisCompoundFile = YES; } else { this->isCompoundFile = NO; } clearFiles(); } bool SegmentInfo::getUseCompoundFile() const { if (isCompoundFile == NO) { return false; } else if (isCompoundFile == YES) { return true; } else { return dir->fileExists( ((string)name + "." + IndexFileNames::COMPOUND_FILE_EXTENSION).c_str() ); } } int32_t SegmentInfo::getDocStoreOffset() const { return docStoreOffset; } bool SegmentInfo::getDocStoreIsCompoundFile() const { return docStoreIsCompoundFile; } void SegmentInfo::setDocStoreIsCompoundFile(const bool v) { docStoreIsCompoundFile = v; clearFiles(); } const string& SegmentInfo::getDocStoreSegment() const { return docStoreSegment; } void SegmentInfo::setDocStoreOffset(const int32_t offset) { docStoreOffset = offset; clearFiles(); } void SegmentInfo::write(CL_NS(store)::IndexOutput* output) { output->writeString(name); output->writeInt(docCount); output->writeLong(delGen); output->writeInt(docStoreOffset); if (docStoreOffset != -1) { output->writeString(docStoreSegment); output->writeByte(static_cast(docStoreIsCompoundFile ? 1:0)); } output->writeByte(static_cast(hasSingleNormFile ? 1:0)); if (normGen.values == NULL) { output->writeInt(NO); } else { output->writeInt(normGen.length); for(size_t j = 0; j < normGen.length; j++) { output->writeLong(normGen[j]); } } output->writeByte(isCompoundFile); } void SegmentInfo::clearFiles() { _files.clear(); _sizeInBytes = -1; } /** We consider another SegmentInfo instance equal if it * has the same dir and same name. */ bool SegmentInfo::equals(const SegmentInfo* obj) { return (obj->dir == this->dir && obj->name.compare(this->name) == 0 ); } std::ostream* SegmentInfos::infoStream = NULL; /** If non-null, information about retries when loading * the segments file will be printed to this. */ void SegmentInfos::setInfoStream(std::ostream* infoStream) { SegmentInfos::infoStream = infoStream; } /** * @see #setInfoStream */ std::ostream* SegmentInfos::getInfoStream() { return infoStream; } SegmentInfos::SegmentInfos(bool deleteMembers, int32_t reserveCount) : generation(0),lastGeneration(0), infos(deleteMembers) { //Func - Constructor //Pre - deleteMembers indicates if the instance to be created must delete // all SegmentInfo instances it manages when the instance is destroyed or not // true -> must delete, false may not delete //Post - An instance of SegmentInfos has been created. //initialize counter to 0 counter = 0; version = Misc::currentTimeMillis(); if (reserveCount > 1) infos.reserve(reserveCount); } SegmentInfos::~SegmentInfos(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed. Depending on the constructor used // the SegmentInfo instances that this instance managed have been deleted or not. //Clear the list of SegmentInfo instances - make sure everything is deleted infos.clear(); } SegmentInfo* SegmentInfos::info(int32_t i) const { //Func - Returns a reference to the i-th SegmentInfo in the list. //Pre - i >= 0 //Post - A reference to the i-th SegmentInfo instance has been returned CND_PRECONDITION(i >= 0 && i < infos.size(), "i is out of bounds"); //Get the i-th SegmentInfo instance SegmentInfo *ret = infos[i]; //Condition check to see if the i-th SegmentInfo has been retrieved CND_CONDITION(ret != NULL,"No SegmentInfo instance found"); return ret; } int64_t SegmentInfos::getCurrentSegmentGeneration( std::vector& files ) { if ( files.size() == 0 ) { return -1; } int64_t max = -1; vector::iterator itr = files.begin(); const char* file; size_t seglen = strlen(IndexFileNames::SEGMENTS); while ( itr != files.end() ) { file = itr->c_str(); if ( strncmp( file, IndexFileNames::SEGMENTS, seglen ) == 0 && strcmp( file, IndexFileNames::SEGMENTS_GEN ) != 0 ) { int64_t gen = generationFromSegmentsFileName( file ); if ( gen > max ) { max = gen; } } itr++; } return max; } int64_t SegmentInfos::getCurrentSegmentGeneration( const CL_NS(store)::Directory* directory ) { vector files; if ( !directory->list(&files) ){ _CLTHROWA(CL_ERR_IO, (string("cannot read directory ") + directory->toString() + string(": list() returned NULL")).c_str() ); } int64_t gen = getCurrentSegmentGeneration( files ); return gen; } string SegmentInfos::getCurrentSegmentFileName( vector& files ) { return IndexFileNames::fileNameFromGeneration( IndexFileNames::SEGMENTS, "", getCurrentSegmentGeneration( files )); } std::string SegmentInfos::getCurrentSegmentFileName( CL_NS(store)::Directory* directory ) { return IndexFileNames::fileNameFromGeneration( IndexFileNames::SEGMENTS, "", getCurrentSegmentGeneration( directory )); } std::string SegmentInfos::getCurrentSegmentFileName() { return IndexFileNames::fileNameFromGeneration( IndexFileNames::SEGMENTS, "", lastGeneration ); } int64_t SegmentInfos::generationFromSegmentsFileName( const char* fileName ) { if ( strcmp( fileName, IndexFileNames::SEGMENTS ) == 0 ) { return 0; } else if ( strncmp( fileName, IndexFileNames::SEGMENTS, strlen(IndexFileNames::SEGMENTS) ) == 0 ) { return CL_NS(util)::Misc::base36ToLong( fileName + strlen( IndexFileNames::SEGMENTS )+1 ); } else { TCHAR err[CL_MAX_PATH + 35]; _sntprintf(err,CL_MAX_PATH + 35,_T("fileName \"%s\" is not a segments file"), fileName); _CLTHROWA(CL_ERR_IllegalArgument, err); return 0; } } std::string SegmentInfos::getNextSegmentFileName() { int64_t nextGeneration; if ( generation == -1 ) { nextGeneration = 1; } else { nextGeneration = generation+1; } return IndexFileNames::fileNameFromGeneration( IndexFileNames::SEGMENTS, "", nextGeneration ); } void SegmentInfos::clearto(size_t from, size_t end){ size_t range = end - from; if ( (infos.size() - from) >= range) { // Make sure we actually need to remove segmentInfosType::iterator itr,bitr=infos.begin()+from,eitr=infos.end(); size_t count = 0; for(itr=bitr;itr!=eitr && count < range;++itr, count++) { _CLLDELETE((*itr)); } infos.erase(bitr,bitr + count); } } void SegmentInfos::add(SegmentInfo* info, int32_t pos){ if ( pos == -1 ){ infos.push_back(info); }else{ if ( pos < 0 || pos >= (int32_t)infos.size()+1 ) _CLTHROWA(CL_ERR_IllegalArgument, "pos is out of range"); infos.insert( infos.begin()+pos, info ); } } int32_t SegmentInfos::size() const{ return infos.size(); } SegmentInfo* SegmentInfos::elementAt(int32_t pos) { return infos.at(pos); } void SegmentInfos::setElementAt(SegmentInfo* si, int32_t pos) { infos.set(pos, si); } void SegmentInfos::clear() { infos.clear(); } void SegmentInfos::insert(SegmentInfos* _infos, bool takeMemory){ infos.insert(infos.end(),_infos->infos.begin(),_infos->infos.end()); if ( takeMemory ){ while (_infos->infos.size() > 0 ) _infos->infos.remove(_infos->infos.begin(), true ); } } void SegmentInfos::insert(SegmentInfo* info){ infos.push_back(info); } int32_t SegmentInfos::indexOf(const SegmentInfo* info) const{ segmentInfosType::const_iterator itr = infos.begin(); int32_t c=-1; while ( itr != infos.end()){ c++; if ( *itr == info ){ return c; } itr++; } return -1; } void SegmentInfos::range(size_t from, size_t to, SegmentInfos& ret) const{ segmentInfosType::const_iterator itr = infos.begin(); itr+= from; for (size_t i=from;iopenInput(segmentFileName); CND_CONDITION(input != NULL,"input == NULL"); generation = generationFromSegmentsFileName( segmentFileName ); lastGeneration = generation; try { int32_t format = input->readInt(); if(format < 0){ // file contains explicit format info // check that it is a format we can understand if (format < CURRENT_FORMAT){ char err[30]; cl_sprintf(err,30,"Unknown format version: %d", format); _CLTHROWA(CL_ERR_CorruptIndex, err); } version = input->readLong(); // read version counter = input->readInt(); // read counter } else{ // file is in old format without explicit format info counter = format; } for (int32_t i = input->readInt(); i > 0; i--) { // read segmentInfos infos.push_back( _CLNEW SegmentInfo(directory, format, input) ); } if(format >= 0){ // in old format the version number may be at the end of the file if (input->getFilePointer() >= input->length()) version = CL_NS(util)::Misc::currentTimeMillis(); // old file format without version number else version = input->readLong(); // read version } success = true; } _CLFINALLY({ input->close(); _CLDELETE(input); if (!success) { // Clear any segment infos we had loaded so we // have a clean slate on retry: clear(); } }); } void SegmentInfos::read(Directory* directory) { generation = lastGeneration = -1; FindSegmentsRead find(directory, this); find.run(); } void SegmentInfos::write(Directory* directory){ //Func - Writes a new segments file based upon the SegmentInfo instances it manages //Pre - directory is a valid reference to a Directory //Post - The new segment has been written to disk string segmentFileName = getNextSegmentFileName(); // Always advance the generation on write: if (generation == -1) { generation = 1; } else { generation++; } IndexOutput* output = directory->createOutput(segmentFileName.c_str()); bool success = false; try { output->writeInt(CURRENT_FORMAT); // write FORMAT output->writeLong(++version); // every write changes // the index output->writeInt(counter); // write counter output->writeInt(size()); // write infos for (int32_t i = 0; i < size(); i++) { info(i)->write(output); } }_CLFINALLY ( try { output->close(); _CLDELETE(output); success = true; } _CLFINALLY ( if (!success) { // Try not to leave a truncated segments_N file in // the index: directory->deleteFile(segmentFileName.c_str()); } ) ) try { output = directory->createOutput(IndexFileNames::SEGMENTS_GEN); try { output->writeInt(FORMAT_LOCKLESS); output->writeLong(generation); output->writeLong(generation); } _CLFINALLY( output->close(); _CLDELETE(output); ) } catch (CLuceneError& e) { if ( e.number() != CL_ERR_IO ) throw e; // It's OK if we fail to write this file since it's // used only as one of the retry fallbacks. } lastGeneration = generation; } SegmentInfos* SegmentInfos::clone() const{ SegmentInfos* sis = _CLNEW SegmentInfos(true, infos.size()); for(size_t i=0;isetElementAt(infos[i]->clone(), i); } return sis; } int64_t SegmentInfos::getVersion() const { return version; } int64_t SegmentInfos::getGeneration() const { return generation; } int64_t SegmentInfos::getLastGeneration() const { return lastGeneration; } int64_t SegmentInfos::readCurrentVersion(Directory* directory){ FindSegmentsVersion find(directory); return find.run(); } //void SegmentInfos::setDefaultGenFileRetryCount(const int32_t count) { defaultGenFileRetryCount = count; } int32_t SegmentInfos::getDefaultGenFileRetryCount() { return defaultGenFileRetryCount; } //void SegmentInfos::setDefaultGenFileRetryPauseMsec(const int32_t msec) { defaultGenFileRetryPauseMsec = msec; } int32_t SegmentInfos::getDefaultGenFileRetryPauseMsec() { return defaultGenFileRetryPauseMsec; } //void SegmentInfos::setDefaultGenLookaheadCount(const int32_t count) { defaultGenLookaheadCount = count;} int32_t SegmentInfos::getDefaultGenLookahedCount() { return defaultGenLookaheadCount; } void SegmentInfos::_FindSegmentsFile::doRun(){ string segmentFileName; int64_t lastGen = -1; int64_t gen = 0; int32_t genLookaheadCount = 0; bool retry = false; CLuceneError exc; //saved exception int32_t method = 0; // Loop until we succeed in calling doBody() without // hitting an IOException. An IOException most likely // means a commit was in process and has finished, in // the time it took us to load the now-old infos files // (and segments files). It's also possible it's a // true error (corrupt index). To distinguish these, // on each retry we must see "forward progress" on // which generation we are trying to load. If we // don't, then the original error is real and we throw // it. // We have three methods for determining the current // generation. We try the first two in parallel, and // fall back to the third when necessary. while( true ) { if ( 0 == method ) { // Method 1: list the directory and use the highest // segments_N file. This method works well as long // as there is no stale caching on the directory // contents (NOTE: NFS clients often have such stale // caching): vector files; int64_t genA = -1; if (directory != NULL){ if (directory->list(&files)) { genA = getCurrentSegmentGeneration( files ); files.clear(); } } if ( infoStream ){ (*infoStream) << "[SIS]: directory listing genA=" << genA << "\n"; } // Method 2: open segments.gen and read its // contents. Then we take the larger of the two // gen's. This way, if either approach is hitting // a stale cache (NFS) we have a better chance of // getting the right generation. int64_t genB = -1; if (directory != NULL) { CLuceneError e; for(int32_t i=0;iopenInput(IndexFileNames::SEGMENTS_GEN, genInput, e) ){ if (e.number() == CL_ERR_IO ) { if ( infoStream ){ (*infoStream) << "[SIS]: segments.gen open: IOException " << e.what() << "\n"; } break; } else { genInput->close(); _CLLDELETE(genInput); throw e; } } if (genInput != NULL) { try { int32_t version = genInput->readInt(); if (version == FORMAT_LOCKLESS) { int64_t gen0 = genInput->readLong(); int64_t gen1 = genInput->readLong(); //CL_TRACE("fallback check: %d; %d", gen0, gen1); if (gen0 == gen1) { // The file is consistent. genB = gen0; genInput->close(); _CLDELETE(genInput); break; } } } catch (CLuceneError &err2) { if (err2.number() != CL_ERR_IO) { genInput->close(); _CLLDELETE(genInput); throw err2; // retry only for IOException } } _CLFINALLY({ genInput->close(); _CLDELETE(genInput); }); } _LUCENE_SLEEP(defaultGenFileRetryPauseMsec); /* //todo: Wrap the LUCENE_SLEEP call above with the following try/catch block if // InterruptedException is implemented try { } catch (CLuceneError &e) { //if (err2.number != CL_ERR_Interrupted) // retry only for InterruptedException // todo: see if CL_ERR_Interrupted needs to be added... throw e; }*/ } } //CL_TRACE("%s check: genB=%d", IndexFileNames::SEGMENTS_GEN, genB); // Pick the larger of the two gen's: if (genA > genB) gen = genA; else gen = genB; if (gen == -1) { // Neither approach found a generation _CLTHROWA(CL_ERR_IO, (string("No segments* file found in ") + directory->toString()).c_str()); } } // Third method (fallback if first & second methods // are not reliable): since both directory cache and // file contents cache seem to be stale, just // advance the generation. if ( 1 == method || ( 0 == method && lastGen == gen && retry )) { method = 1; if (genLookaheadCount < defaultGenLookaheadCount) { gen++; genLookaheadCount++; //CL_TRACE("look ahead increment gen to %d", gen); } } if (lastGen == gen) { // This means we're about to try the same // segments_N last tried. This is allowed, // exactly once, because writer could have been in // the process of writing segments_N last time. if (retry) { // OK, we've tried the same segments_N file // twice in a row, so this must be a real // error. We throw the original exception we // got. throw exc; } else { retry = true; } } else { // Segment file has advanced since our last loop, so // reset retry: retry = false; } lastGen = gen; segmentFileName = IndexFileNames::fileNameFromGeneration(IndexFileNames::SEGMENTS, "", gen); CLuceneError saved_error; if ( tryDoBody(segmentFileName.c_str(), saved_error) ){ return; } // Save the original root cause: if (exc.number() == 0) { CND_CONDITION( saved_error.number() > 0, "Unsupported error code"); exc.set(saved_error.number(),saved_error.what()); } //CL_TRACE("primary Exception on '" + segmentFileName + "': " + err + "'; will retry: retry=" + retry + "; gen = " + gen); if (!retry && gen > 1) { // This is our first time trying this segments // file (because retry is false), and, there is // possibly a segments_(N-1) (because gen > 1). // So, check if the segments_(N-1) exists and // try it if so: string prevSegmentFileName = IndexFileNames::fileNameFromGeneration( IndexFileNames::SEGMENTS, "", gen-1 ); bool prevExists=false; if (directory != NULL) prevExists = directory->fileExists(prevSegmentFileName.c_str()); else prevExists = Misc::dir_Exists( (string(fileDirectory) + prevSegmentFileName).c_str() ); if (prevExists) { //CL_TRACE("fallback to prior segment file '%s'", prevSegmentFileName); CLuceneError saved_error; if ( tryDoBody(prevSegmentFileName.c_str(), saved_error) ){ return; } //CL_TRACE("secondary Exception on '" + prevSegmentFileName + "': " + err2 + "'; will retry"); } } } } SegmentInfos::FindSegmentsRead::FindSegmentsRead( CL_NS(store)::Directory* dir, SegmentInfos* _this ) : SegmentInfos::FindSegmentsFile(dir) { this->_this = _this; } bool SegmentInfos::FindSegmentsRead::doBody( const char* segmentFileName ) { //Have SegmentInfos read the segments file in directory _this->read(directory, segmentFileName); return true; } SegmentInfos::FindSegmentsVersion::FindSegmentsVersion( CL_NS(store)::Directory* dir ) : SegmentInfos::FindSegmentsFile(dir) { } int64_t SegmentInfos::FindSegmentsVersion::doBody( const char* segmentFileName ) { IndexInput* input = directory->openInput( segmentFileName ); int32_t format = 0; int64_t version=0; try { format = input->readInt(); if(format < 0){ if(format < CURRENT_FORMAT){ char err[30]; cl_sprintf(err,30,"Unknown format version: %d",format); _CLTHROWA(CL_ERR_CorruptIndex,err); } version = input->readLong(); // read version } } _CLFINALLY( input->close(); _CLDELETE(input); ); if(format < 0) return version; // We cannot be sure about the format of the file. // Therefore we have to read the whole file and cannot simply seek to the version entry. SegmentInfos* sis = _CLNEW SegmentInfos(); sis->read(directory, segmentFileName); version = sis->getVersion(); _CLDELETE(sis); return version; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentMergeInfo.cpp000066400000000000000000000054661154025176300243120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SegmentHeader.h" #include "_SegmentMergeInfo.h" #include "_SegmentTermEnum.h" CL_NS_DEF(index) SegmentMergeInfo::SegmentMergeInfo(const int32_t b, TermEnum* te, IndexReader* r): docMap(NULL), termEnum(te), base(b), reader(r) { //Func - Constructor //Pre - b >= 0 // te contains a valid reference to a SegmentTermEnum instance // r contains a valid reference to a SegmentReader instance //Post - The instance has been created CND_PRECONDITION(b >= 0, "b is a negative number"); postings=NULL; term = te->term(); } SegmentMergeInfo::~SegmentMergeInfo(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed close(); } int32_t* SegmentMergeInfo::getDocMap(){ if ( docMap == NULL ){ // build array which maps document numbers around deletions if (reader->hasDeletions()) { //Get the total number of documents managed by the reader including the deleted ones int32_t maxDoc = reader->maxDoc(); //Create a map for all documents docMap = _CL_NEWARRAY(int32_t,maxDoc); int32_t j = 0; //Iterate through all the document numbers for (int32_t i = 0; i < maxDoc; i++) { //Check if document i is marked deleted if (reader->isDeleted(i)){ //Document i has not been marked deleted so assign -1 docMap[i] = -1; }else{ docMap[i] = j++; } } } } return docMap; } TermPositions* SegmentMergeInfo::getPositions() { if (postings == NULL) { postings = reader->termPositions(); } return postings; } bool SegmentMergeInfo::next() { //Func - Moves the current term of the enumeration termEnum to the next and term // points to this new current term //Pre - true //Post - Returns true if the term has been moved to the next otherwise false if (termEnum->next()) { _CLDECDELETE(term); term = termEnum->term(); return true; } else { _CLDECDELETE(term); //TODO: test HighFreqTerms errors with this term = NULL; return false; } } void SegmentMergeInfo::close() { //Func - Closes the the resources //Pre - true //Post - The resources have been closed //First make sure posting has been closed if ( postings != NULL ){ postings->close(); _CLVDELETE(postings); //todo: not a clucene object... should be } if ( termEnum != NULL ){ termEnum->close(); _CLDELETE(termEnum); } _CLDECDELETE(term); _CLDELETE_ARRAY(docMap); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentMergeQueue.cpp000066400000000000000000000056611154025176300245000ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/util/PriorityQueue.h" #include "_SegmentHeader.h" #include "_SegmentMergeInfo.h" #include "_SegmentMergeQueue.h" CL_NS_DEF(index) SegmentMergeQueue::SegmentMergeQueue(const int32_t size) { //Func - Constructor // Creates a queue of length size //Pre - size >= 0 //Post - The queue has been created of length size //BVK: bug. changed condition from size > 0 to size >= 0 //if size is 0, as it is when retrieving a TermEnum //from an empty index this should this should not fail. CND_PRECONDITION(size >= 0, "size is too small"); //Call the initialize method of its superclass. The boolean value passed here //indicates that the superclass PriorityQueue takes the responsibility to have its elements deleted //The destructor of SegmentMergInfo will make sure that each intstance it will be closed properly //before it is deleted initialize(size,true); } SegmentMergeQueue::~SegmentMergeQueue(){ //Func - Destructor // Does nothing as its parent class will clean up everything //Pre - true //Post - true close(); } void SegmentMergeQueue::close() { //Func - Closes and destroyes all SegmentMergeInfo Instances in the queue //Pre - true //post - All SegmentMergeInfo Instances in the queue have been closed and deleted // The queue is now empty but can still be used //call the clear method of the parent class PriorityQueue clear(); } bool SegmentMergeQueue::lessThan(SegmentMergeInfo* stiA, SegmentMergeInfo* stiB) { //Func - Overloaded method that implements the lessThan operator for the parent class // This method is used by the parent class Priority queue to reorder its internal // data structures. This implementation check if stiA is less than the current term of stiB. //Pre - stiA != NULL // stiB != NULL //Post - true is returned if stiA < stiB otherwise false CND_PRECONDITION(stiA != NULL, "stiA is NULL"); CND_PRECONDITION(stiB != NULL, "stiB is NULL"); //Compare the two terms int32_t comparison = stiA->term->compareTo(stiB->term); //Check if they match if (comparison == 0){ //todo: can we do an optimized compare here? compare using equals, then compare properly? //If the match check if the base of stiA is smaller than the base of stiB //Note that different bases means that the terms of stiA an stiB ly in different segments return stiA->base < stiB->base; }else{ //Terms didn't match so return the difference in positions return comparison < 0; } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentMerger.cpp000066400000000000000000000675241154025176300236630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SegmentHeader.h" #include "CLucene/util/PriorityQueue.h" #include "CLucene/util/Misc.h" #include "IndexReader.h" #include "IndexWriter.h" #include "_SegmentMerger.h" #include "_FieldsWriter.h" #include "CLucene/document/Document.h" #include #include "CLucene/index/_IndexFileNames.h" #include "_CompoundFile.h" #include "_SkipListWriter.h" #include "CLucene/document/FieldSelector.h" CL_NS_USE(util) CL_NS_USE(document) CL_NS_USE(store) CL_NS_DEF(index) const uint8_t SegmentMerger::NORMS_HEADER[] = {'N','R','M', (uint8_t)-1}; const int SegmentMerger::NORMS_HEADER_length = 4; int32_t SegmentMerger::MAX_RAW_MERGE_DOCS = 4192; void SegmentMerger::init(){ skipListWriter = NULL; freqOutput = NULL; proxOutput = NULL; termInfosWriter = NULL; queue = NULL; fieldInfos = NULL; checkAbort = NULL; skipInterval = 0; } SegmentMerger::SegmentMerger(IndexWriter* writer, const char* name, MergePolicy::OneMerge* merge){ //Func - Constructor //Pre - dir holds a valid reference to a Directory // name != NULL //Post - Instance has been created CND_PRECONDITION(name != NULL, "name is NULL"); this->init(); this->directory = writer->getDirectory(); this->segment = name; if (merge != NULL) this->checkAbort = _CLNEW CheckAbort(merge, directory); this->termIndexInterval= writer->getTermIndexInterval(); this->mergedDocs = 0; this->maxSkipLevels = 0; } SegmentMerger::~SegmentMerger(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed //Clear the readers set readers.clear(); //Delete field Infos _CLDELETE(fieldInfos); //Close and destroy the IndexOutput to the Frequency File if (freqOutput != NULL){ freqOutput->close(); _CLDELETE(freqOutput); } //Close and destroy the IndexOutput to the Prox File if (proxOutput != NULL){ proxOutput->close(); _CLDELETE(proxOutput); } //Close and destroy the termInfosWriter if (termInfosWriter != NULL){ termInfosWriter->close(); _CLDELETE(termInfosWriter); } //Close and destroy the queue if (queue != NULL){ queue->close(); _CLDELETE(queue); } _CLDELETE(checkAbort); _CLDELETE(skipListWriter); } void SegmentMerger::add(IndexReader* reader) { //Func - Adds a IndexReader to the set of readers //Pre - reader contains a valid reference to a IndexReader //Post - The SegementReader reader has been added to the set of readers readers.push_back(reader); } IndexReader* SegmentMerger::segmentReader(const int32_t i) { //Func - Returns a reference to the i-th IndexReader //Pre - 0 <= i < readers.size() //Post - A reference to the i-th IndexReader has been returned CND_PRECONDITION(i >= 0, "i is a negative number"); CND_PRECONDITION((size_t)i < readers.size(), "i is bigger than the number of IndexReader instances"); //Retrieve the i-th IndexReader IndexReader* ret = readers[i]; CND_CONDITION(ret != NULL,"No IndexReader found"); return ret; } int32_t SegmentMerger::merge(bool mergeDocStores) { this->mergeDocStores = mergeDocStores; // NOTE: it's important to add calls to // checkAbort.work(...) if you make any changes to this // method that will spend alot of time. The frequency // of this check impacts how long // IndexWriter.close(false) takes to actually stop the // threads. mergedDocs = mergeFields(); mergeTerms(); mergeNorms(); if (mergeDocStores && fieldInfos->hasVectors()) mergeVectors(); return mergedDocs; } void SegmentMerger::closeReaders(){ for (uint32_t i = 0; i < readers.size(); i++) { // close readers IndexReader* reader = readers[i]; reader->close(); } } void SegmentMerger::createCompoundFile(const char* filename, std::vector* files){ CompoundFileWriter* cfsWriter = _CLNEW CompoundFileWriter(directory, filename, checkAbort); bool ownFiles = false; if ( files == NULL ){ files = new vector; files->reserve(IndexFileNames::COMPOUND_EXTENSIONS().length + 1); ownFiles = true; } // Basic files for (int32_t i = 0; i < IndexFileNames::COMPOUND_EXTENSIONS().length; i++) { const char* ext = IndexFileNames::COMPOUND_EXTENSIONS()[i]; if (mergeDocStores || (strcmp(ext,IndexFileNames::FIELDS_EXTENSION) != 0 && strcmp(ext,IndexFileNames::FIELDS_INDEX_EXTENSION) != 0 ) ){ files->push_back ( string(segment) + "." + ext ); } } // Field norm files for (size_t i = 0; i < fieldInfos->size(); i++) { FieldInfo* fi = fieldInfos->fieldInfo(i); if (fi->isIndexed && !fi->omitNorms) { files->push_back ( segment + "." + IndexFileNames::NORMS_EXTENSION ); break; } } // Vector files if ( mergeDocStores && fieldInfos->hasVectors()) { for (int32_t i = 0; i < IndexFileNames::VECTOR_EXTENSIONS().length; i++) { files->push_back ( segment + "." + IndexFileNames::VECTOR_EXTENSIONS()[i] ); } } // Now merge all added files for ( size_t i=0;isize();i++ ){ cfsWriter->addFile( (*files)[i].c_str()); } // Perform the merge cfsWriter->close(); _CLDELETE(cfsWriter); if ( ownFiles ) delete files; } void SegmentMerger::addIndexed(IndexReader* reader, FieldInfos* fieldInfos, StringArrayWithDeletor& names, bool storeTermVectors, bool storePositionWithTermVector, bool storeOffsetWithTermVector, bool storePayloads){ StringArrayWithDeletor::const_iterator itr = names.begin(); while ( itr != names.end() ){ fieldInfos->add(*itr, true, storeTermVectors, storePositionWithTermVector, storeOffsetWithTermVector, !reader->hasNorms(*itr), storePayloads); ++itr; } } // for merging we don't want to compress/uncompress the data, so to tell the FieldsReader that we're // in merge mode, we use this FieldSelector class FieldSelectorMerge: public FieldSelector{ public: FieldSelectorResult accept(const TCHAR* /*fieldName*/) const{ return FieldSelector::LOAD_FOR_MERGE; } }; int32_t SegmentMerger::mergeFields() { //Func - Merge the fields of all segments //Pre - true //Post - The field infos and field values of all segments have been merged. if (!mergeDocStores) { // When we are not merging by doc stores, that means // all segments were written as part of a single // autoCommit=false IndexWriter session, so their field // name -> number mapping are the same. So, we start // with the fieldInfos of the last segment in this // case, to keep that numbering. assert(readers[readers.size()-1]->instanceOf(SegmentReader::getClassName())); assert(false);//check last...and remove if correct... SegmentReader* sr = (SegmentReader*)readers[readers.size()-1]; fieldInfos = sr->fieldInfos()->clone(); } else { //Create a new FieldInfos fieldInfos = _CLNEW FieldInfos(); // merge field names } //Condition check to see if fieldInfos points to a valid instance CND_CONDITION(fieldInfos != NULL,"Memory allocation for fieldInfos failed"); IndexReader* reader = NULL; //Iterate through all readers for (uint32_t i = 0; i < readers.size(); i++){ //get the i-th reader reader = readers[i]; //Condition check to see if reader points to a valid instance CND_CONDITION(reader != NULL,"No IndexReader found"); if (reader->instanceOf(SegmentReader::getClassName())) { SegmentReader* segmentReader = (SegmentReader*) reader; for (size_t j = 0; j < segmentReader->getFieldInfos()->size(); j++) { FieldInfo* fi = segmentReader->getFieldInfos()->fieldInfo(j); fieldInfos->add(fi->name, fi->isIndexed, fi->storeTermVector, fi->storePositionWithTermVector, fi->storeOffsetWithTermVector, !reader->hasNorms(fi->name), fi->storePayloads); } } else { StringArrayWithDeletor tmp; tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR_WITH_POSITION_OFFSET, tmp); addIndexed(reader, fieldInfos, tmp, true, true, true, false); tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR_WITH_POSITION, tmp); addIndexed(reader, fieldInfos, tmp, true, true, false, false); tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR_WITH_OFFSET, tmp); addIndexed(reader, fieldInfos, tmp, true, false, true, false); tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR, tmp); addIndexed(reader, fieldInfos, tmp, true, false, false, false); tmp.clear(); reader->getFieldNames(IndexReader::STORES_PAYLOADS, tmp); addIndexed(reader, fieldInfos, tmp, false, false, false, true); tmp.clear(); reader->getFieldNames(IndexReader::INDEXED, tmp); addIndexed(reader, fieldInfos, tmp, false, false, false, false); tmp.clear(); reader->getFieldNames(IndexReader::UNINDEXED, tmp); if ( tmp.size() > 0 ){ TCHAR** arr = _CL_NEWARRAY(TCHAR*,tmp.size()+1); tmp.toArray_nullTerminated(arr); fieldInfos->add((const TCHAR**)arr, false); _CLDELETE_ARRAY(arr); //no need to delete the contents, since tmp is responsible for it } } } //Write the new FieldInfos file to the directory fieldInfos->write(directory, Misc::segmentname(segment.c_str(),".fnm").c_str() ); int32_t docCount = 0; if (mergeDocStores) { // If the i'th reader is a SegmentReader and has // identical fieldName -> number mapping, then this // array will be non-NULL at position i: ValueArray matchingSegmentReaders(readers.size()); // If this reader is a SegmentReader, and all of its // field name -> number mappings match the "merged" // FieldInfos, then we can do a bulk copy of the // stored fields: for (size_t i = 0; i < readers.size(); i++) { IndexReader* reader = readers[i]; if (reader->instanceOf(SegmentReader::getClassName())) { SegmentReader* segmentReader = (SegmentReader*) reader; bool same = true; FieldInfos* segmentFieldInfos = segmentReader->getFieldInfos(); for (size_t j = 0; same && j < segmentFieldInfos->size(); j++) same = _tcscmp(fieldInfos->fieldName(j), segmentFieldInfos->fieldName(j)) == 0; if (same) { matchingSegmentReaders.values[i] = segmentReader; } } } // Used for bulk-reading raw bytes for stored fields ValueArray rawDocLengths(MAX_RAW_MERGE_DOCS); // merge field values FieldsWriter fieldsWriter(directory, segment.c_str(), fieldInfos); try { for (size_t i = 0; i < readers.size(); i++) { IndexReader* reader = readers[i]; SegmentReader* matchingSegmentReader = matchingSegmentReaders[i]; FieldsReader* matchingFieldsReader; if (matchingSegmentReader != NULL) matchingFieldsReader = matchingSegmentReader->getFieldsReader(); else matchingFieldsReader = NULL; const int32_t maxDoc = reader->maxDoc(); Document doc; FieldSelectorMerge fieldSelectorMerge; for (int32_t j = 0; j < maxDoc;) { if (!reader->isDeleted(j)) { // skip deleted docs if (matchingSegmentReader != NULL) { // We can optimize this case (doing a bulk // byte copy) since the field numbers are // identical int32_t start = j; int32_t numDocs = 0; do { j++; numDocs++; } while(j < maxDoc && !matchingSegmentReader->isDeleted(j) && numDocs < MAX_RAW_MERGE_DOCS); IndexInput* stream = matchingFieldsReader->rawDocs(rawDocLengths.values, start, numDocs); fieldsWriter.addRawDocuments(stream, rawDocLengths.values, numDocs); docCount += numDocs; if (checkAbort != NULL) checkAbort->work(300*numDocs); } else { doc.clear(); reader->document(j, doc, &fieldSelectorMerge); fieldsWriter.addDocument(&doc); j++; docCount++; if (checkAbort != NULL) checkAbort->work(300); } } else j++; } } } _CLFINALLY ( fieldsWriter.close(); ) CND_PRECONDITION (docCount*8 == directory->fileLength( (segment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION).c_str() ), (string("after mergeFields: fdx size mismatch: ") + Misc::toString(docCount) + " docs vs " + Misc::toString(directory->fileLength( (segment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION).c_str() )) + " length in bytes of " + segment + "." + IndexFileNames::FIELDS_INDEX_EXTENSION).c_str() ); } else{ // If we are skipping the doc stores, that means there // are no deletions in any of these segments, so we // just sum numDocs() of each segment to get total docCount for (size_t i = 0; i < readers.size(); i++) docCount += readers[i]->numDocs(); } return docCount; } void SegmentMerger::mergeVectors(){ TermVectorsWriter* termVectorsWriter = _CLNEW TermVectorsWriter(directory, segment.c_str(), fieldInfos); try { for (uint32_t r = 0; r < readers.size(); r++) { IndexReader* reader = readers[r]; int32_t maxDoc = reader->maxDoc(); for (int32_t docNum = 0; docNum < maxDoc; docNum++) { // skip deleted docs if (reader->isDeleted(docNum)) continue; ArrayBase* tmp = reader->getTermFreqVectors(docNum); // if ( tmp != NULL ){ termVectorsWriter->addAllDocVectors(tmp); _CLLDELETE(tmp); // } if (checkAbort != NULL) checkAbort->work(300); } } }_CLFINALLY( if ( termVectorsWriter != NULL ){ termVectorsWriter->close(); _CLDELETE(termVectorsWriter); } ); CND_PRECONDITION(4+mergedDocs*8 == directory->fileLength( (segment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION).c_str() ), (string("after mergeVectors: tvx size mismatch: ") + Misc::toString(mergedDocs) + " docs vs " + Misc::toString(directory->fileLength( (segment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION).c_str() )) + " length in bytes of " + segment + "." + IndexFileNames::VECTORS_INDEX_EXTENSION).c_str() ) } void SegmentMerger::mergeTerms() { //Func - Merge the terms of all segments //Pre - fieldInfos != NULL //Post - The terms of all segments have been merged CND_PRECONDITION(fieldInfos != NULL, "fieldInfos is NULL"); try{ //Open an IndexOutput to the new Frequency File freqOutput = directory->createOutput( Misc::segmentname(segment.c_str(),".frq").c_str() ); //Open an IndexOutput to the new Prox File proxOutput = directory->createOutput( Misc::segmentname(segment.c_str(),".prx").c_str() ); //Instantiate a new termInfosWriter which will write in directory //for the segment name segment using the new merged fieldInfos termInfosWriter = _CLNEW TermInfosWriter(directory, segment.c_str(), fieldInfos, termIndexInterval); //Condition check to see if termInfosWriter points to a valid instance CND_CONDITION(termInfosWriter != NULL,"Memory allocation for termInfosWriter failed") ; skipInterval = termInfosWriter->skipInterval; maxSkipLevels = termInfosWriter->maxSkipLevels; skipListWriter = _CLNEW DefaultSkipListWriter(skipInterval, maxSkipLevels, mergedDocs, freqOutput, proxOutput); queue = _CLNEW SegmentMergeQueue(readers.size()); //And merge the Term Infos mergeTermInfos(); }_CLFINALLY( if ( freqOutput != NULL ){ freqOutput->close(); _CLDELETE(freqOutput); } if ( proxOutput != NULL ){ proxOutput->close(); _CLDELETE(proxOutput); } if ( termInfosWriter != NULL ){ termInfosWriter->close(); _CLDELETE(termInfosWriter); } if ( queue != NULL ){ queue->close(); _CLDELETE(queue); } ); } void SegmentMerger::mergeTermInfos(){ //Func - Merges all TermInfos into a single segment //Pre - true //Post - All TermInfos have been merged into a single segment //Condition check to see if queue points to a valid instance CND_CONDITION(queue != NULL, "Memory allocation for queue failed") ; //base is the id of the first document in a segment int32_t base = 0; IndexReader* reader = NULL; SegmentMergeInfo* smi = NULL; //iterate through all the readers for (uint32_t i = 0; i < readers.size(); i++) { //Get the i-th reader reader = readers[i]; //Condition check to see if reader points to a valid instance CND_CONDITION(reader != NULL, "No IndexReader found"); //Get the term enumeration of the reader TermEnum* termEnum = reader->terms(); //Instantiate a new SegmentMerginfo for the current reader and enumeration smi = _CLNEW SegmentMergeInfo(base, termEnum, reader); //Condition check to see if smi points to a valid instance CND_CONDITION(smi != NULL, "Memory allocation for smi failed") ; //Increase the base by the number of documents that have not been marked deleted //so base will contain a new value for the first document of the next iteration base += reader->numDocs(); //Get the next current term if (smi->next()){ //Store the SegmentMergeInfo smi with the initialized SegmentTermEnum TermEnum //into the queue queue->put(smi); }else{ //Apparently the end of the TermEnum of the SegmentTerm has been reached so //close the SegmentMergeInfo smi smi->close(); //And destroy the instance and set smi to NULL (It will be used later in this method) _CLDELETE(smi); } } //Instantiate an array of SegmentMergeInfo instances called match SegmentMergeInfo** match = _CL_NEWARRAY(SegmentMergeInfo*,readers.size()); //Condition check to see if match points to a valid instance CND_CONDITION(match != NULL, "Memory allocation for match failed") ; SegmentMergeInfo* top = NULL; //As long as there are SegmentMergeInfo instances stored in the queue while (queue->size() > 0) { int32_t matchSize = 0; // pop matching terms //Pop the first SegmentMergeInfo from the queue match[matchSize++] = queue->pop(); //Get the Term of match[0] Term* term = match[0]->term; //Condition check to see if term points to a valid instance CND_CONDITION(term != NULL,"term is NULL") ; //Get the current top of the queue top = queue->top(); //For each SegmentMergInfo still in the queue //Check if term matches the term of the SegmentMergeInfo instances in the queue while (top != NULL && term->equals(top->term) ){ //A match has been found so add the matching SegmentMergeInfo to the match array match[matchSize++] = queue->pop(); //Get the next SegmentMergeInfo top = queue->top(); } int32_t df = mergeTermInfo(match, matchSize); // add new TermInfo if (checkAbort != NULL) checkAbort->work(df/3.0); //Restore the SegmentTermInfo instances in the match array back into the queue while (matchSize > 0){ smi = match[--matchSize]; //Condition check to see if smi points to a valid instance CND_CONDITION(smi != NULL,"smi is NULL") ; //Move to the next term in the enumeration of SegmentMergeInfo smi if (smi->next()){ //There still are some terms so restore smi in the queue queue->put(smi); }else{ //Done with a segment //No terms anymore so close this SegmentMergeInfo instance smi->close(); _CLDELETE( smi ); } } } _CLDELETE_ARRAY(match); } int32_t SegmentMerger::mergeTermInfo( SegmentMergeInfo** smis, int32_t n){ //Func - Merge the TermInfo of a term found in one or more segments. //Pre - smis != NULL and it contains segments that are positioned at the same term. // n is equal to the number of SegmentMergeInfo instances in smis // freqOutput != NULL // proxOutput != NULL //Post - The TermInfo of a term has been merged CND_PRECONDITION(smis != NULL, "smis is NULL"); CND_PRECONDITION(freqOutput != NULL, "freqOutput is NULL"); CND_PRECONDITION(proxOutput != NULL, "proxOutput is NULL"); //Get the file pointer of the IndexOutput to the Frequency File int64_t freqPointer = freqOutput->getFilePointer(); //Get the file pointer of the IndexOutput to the Prox File int64_t proxPointer = proxOutput->getFilePointer(); //Process postings from multiple segments all positioned on the same term. int32_t df = appendPostings(smis, n); int64_t skipPointer = skipListWriter->writeSkip(freqOutput); //df contains the number of documents across all segments where this term was found if (df > 0) { //add an entry to the dictionary with pointers to prox and freq files termInfo.set(df, freqPointer, proxPointer, (int32_t)(skipPointer - freqPointer)); //Precondition check for to be sure that the reference to //smis[0]->term will be valid CND_PRECONDITION(smis[0]->term != NULL, "smis[0]->term is NULL"); //Write a new TermInfo termInfosWriter->add(smis[0]->term, &termInfo); } return df; } int32_t SegmentMerger::appendPostings(SegmentMergeInfo** smis, int32_t n){ //Func - Process postings from multiple segments all positioned on the // same term. Writes out merged entries into freqOutput and // the proxOutput streams. //Pre - smis != NULL and it contains segments that are positioned at the same term. // n is equal to the number of SegmentMergeInfo instances in smis // freqOutput != NULL // proxOutput != NULL //Post - Returns number of documents across all segments where this term was found CND_PRECONDITION(smis != NULL, "smis is NULL"); CND_PRECONDITION(freqOutput != NULL, "freqOutput is NULL"); CND_PRECONDITION(proxOutput != NULL, "proxOutput is NULL"); int32_t lastDoc = 0; int32_t df = 0; //Document Counter skipListWriter->resetSkip(); bool storePayloads = fieldInfos->fieldInfo(smis[0]->term->field())->storePayloads; int32_t lastPayloadLength = -1; // ensures that we write the first length SegmentMergeInfo* smi = NULL; //Iterate through all SegmentMergeInfo instances in smis for ( int32_t i=0;igetPositions(); assert(postings != NULL); //Get the base of this segment int32_t base = smi->base; //Get the docMap so we can see which documents have been deleted int32_t* docMap = smi->getDocMap(); //Seek the termpost postings->seek(smi->termEnum); while (postings->next()) { int32_t doc = postings->doc(); //Check if there are deletions if (docMap != NULL) doc = docMap[doc]; // map around deletions doc += base; // convert to merged space //Condition check to see doc is eaqual to or bigger than lastDoc if (doc < 0 || (df > 0 && doc <= lastDoc)) _CLTHROWA(CL_ERR_CorruptIndex, (string("docs out of order (") + Misc::toString(doc) + " <= " + Misc::toString(lastDoc) + " )").c_str()); //Increase the total frequency over all segments df++; if ((df % skipInterval) == 0) { skipListWriter->setSkipData(lastDoc, storePayloads, lastPayloadLength); skipListWriter->bufferSkip(df); } //Calculate a new docCode //use low bit to flag freq=1 int32_t docCode = (doc - lastDoc) << 1; lastDoc = doc; //Get the frequency of the Term int32_t freq = postings->freq(); if (freq == 1){ //write doc & freq=1 freqOutput->writeVInt(docCode | 1); }else{ //write doc freqOutput->writeVInt(docCode); //write frequency in doc freqOutput->writeVInt(freq); } /** See {@link DocumentWriter#writePostings(Posting[], String)} for * documentation about the encoding of positions and payloads */ int32_t lastPosition = 0; // write position deltas for (int32_t j = 0; j < freq; j++) { //Get the next position int32_t position = postings->nextPosition(); int32_t delta = position - lastPosition; if (storePayloads) { size_t payloadLength = postings->getPayloadLength(); if (payloadLength == lastPayloadLength) { proxOutput->writeVInt(delta * 2); } else { proxOutput->writeVInt(delta * 2 + 1); proxOutput->writeVInt(payloadLength); lastPayloadLength = payloadLength; } if (payloadLength > 0) { if ( payloadBuffer.length < payloadLength ){ payloadBuffer.resize(payloadLength); } postings->getPayload(payloadBuffer.values); proxOutput->writeBytes(payloadBuffer.values, payloadLength); } } else { proxOutput->writeVInt(delta); } lastPosition = position; } } } //Return total number of documents across all segments where term was found return df; } void SegmentMerger::mergeNorms() { //Func - Merges the norms for all fields //Pre - fieldInfos != NULL //Post - The norms for all fields have been merged ValueArray normBuffer; IndexOutput* output = NULL; try { CND_PRECONDITION(fieldInfos != NULL, "fieldInfos is NULL"); IndexReader* reader = NULL; //iterate through all the Field Infos instances for (size_t i = 0; i < fieldInfos->size(); i++) { //Get the i-th FieldInfo FieldInfo* fi = fieldInfos->fieldInfo(i); //Is this Field indexed? if (fi->isIndexed && !fi->omitNorms){ //Instantiate an IndexOutput to that norm file if (output == NULL) { output = directory->createOutput( (segment + "." + IndexFileNames::NORMS_EXTENSION).c_str() ); output->writeBytes(NORMS_HEADER,NORMS_HEADER_length); } //Condition check to see if output points to a valid instance CND_CONDITION(output != NULL, "No Outputstream retrieved"); //Iterate through all IndexReaders for (uint32_t j = 0; j < readers.size(); j++) { //Get the i-th IndexReader reader = readers[j]; //Condition check to see if reader points to a valid instance CND_CONDITION(reader != NULL, "No reader found"); //Get the total number of documents including the documents that have been marked deleted size_t maxDoc = reader->maxDoc(); //Get an IndexInput to the norm file for this field in this segment if ( normBuffer.length < maxDoc ){ normBuffer.resize(maxDoc); memset(normBuffer.values,0,sizeof(uint8_t) * maxDoc); } reader->norms(fi->name, normBuffer.values); if (!reader->hasDeletions()) { //optimized case for segments without deleted docs output->writeBytes(normBuffer.values, maxDoc); } else { // this segment has deleted docs, so we have to // check for every doc if it is deleted or not for(size_t k = 0; k < maxDoc; k++) { //Check if document k is deleted if (!reader->isDeleted(k)){ //write the new norm output->writeByte(normBuffer[k]); } } } if (checkAbort != NULL) checkAbort->work(maxDoc); } } } }_CLFINALLY( if ( output != NULL ){ output->close(); _CLDELETE(output); } ); } SegmentMerger::CheckAbort::CheckAbort(MergePolicy::OneMerge* merge, Directory* dir) { this->merge = merge; this->dir = dir; this->workCount = 0; } void SegmentMerger::CheckAbort::work(float_t units){ workCount += units; if (workCount >= 10000.0) { merge->checkAborted(dir); workCount = 0; } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentReader.cpp000066400000000000000000001064231154025176300236340ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/util/Misc.h" #include "_SegmentHeader.h" #include "_MultiSegmentReader.h" #include "_FieldInfos.h" #include "_FieldsReader.h" #include "IndexReader.h" #include "_TermInfosReader.h" #include "Terms.h" #include "CLucene/search/Similarity.h" #include "CLucene/store/FSDirectory.h" #include "CLucene/util/PriorityQueue.h" #include "_SegmentMerger.h" #include CL_NS_USE(util) CL_NS_USE(store) CL_NS_USE(document) CL_NS_USE(search) CL_NS_DEF(index) SegmentReader::Norm::Norm(IndexInput* instrm, bool _useSingleNormStream, int32_t n, int64_t ns, SegmentReader* r, const char* seg): number(n), normSeek(ns), _this(r), segment(seg), useSingleNormStream(_useSingleNormStream), in(instrm), bytes(NULL), dirty(false){ //Func - Constructor //Pre - instrm is a valid reference to an IndexInput //Post - A Norm instance has been created with an empty bytes array refCount = 1; bytes = NULL; dirty = false; } SegmentReader::Norm::~Norm() { //Func - Destructor //Pre - true //Post - The IndexInput in has been deleted (and closed by its destructor) // and the array too. //Close and destroy the inputstream in-> The inputstream will be closed // by its destructor. Note that the IndexInput 'in' actually is a pointer!!!!! if ( in != _this->singleNormStream ) _CLDELETE(in); //Delete the bytes array _CLDELETE_ARRAY(bytes); } void SegmentReader::Norm::doDelete(Norm* norm){ if ( norm->refCount == 0 ){ _CLLDELETE(norm); } } void SegmentReader::Norm::close(){ SCOPED_LOCK_MUTEX(THIS_LOCK) if (in != NULL && !useSingleNormStream) { in->close(); _CLDELETE(in); } in = NULL; } void SegmentReader::Norm::incRef() { SCOPED_LOCK_MUTEX(THIS_LOCK) assert (refCount > 0); refCount++; } void SegmentReader::Norm::decRef(){ SCOPED_LOCK_MUTEX(THIS_LOCK) assert (refCount > 0); if (refCount == 1) { close(); } refCount--; } void SegmentReader::Norm::reWrite(SegmentInfo* si){ // NOTE: norms are re-written in regular directory, not cfs si->advanceNormGen(this->number); IndexOutput* out = _this->directory()->createOutput(si->getNormFileName(this->number).c_str()); try { out->writeBytes(bytes, _this->maxDoc()); }_CLFINALLY( out->close(); _CLDELETE(out) ); this->dirty = false; } void SegmentReader::initialize(SegmentInfo* si, int32_t readBufferSize, bool doOpenStores, bool doingReopen){ //Pre - si-> is a valid reference to SegmentInfo instance // identified by si-> //Post - All files of the segment have been read this->deletedDocs = NULL; this->ones = NULL; //There are no documents yet marked as deleted this->deletedDocsDirty = false; this->normsDirty=false; this->undeleteAll=false; this->rollbackDeletedDocsDirty = false; this->rollbackNormsDirty = false; this->rollbackUndeleteAll = false; //Duplicate the name of the segment from SegmentInfo to segment this->segment = si->name; // make sure that all index files have been read or are kept open // so that if an index update removes them we'll still have them this->freqStream = NULL; this->proxStream = NULL; this->singleNormStream = NULL; this->termVectorsReaderOrig = NULL; this->_fieldInfos = NULL; this->tis = NULL; this->fieldsReader = NULL; this->cfsReader = NULL; this->storeCFSReader = NULL; this->segment = si->name; this->si = si; this->readBufferSize = readBufferSize; if ( doingReopen ) return; // the rest is done in the reopen code... bool success = false; try { // Use compound file directory for some files, if it exists Directory* cfsDir = directory(); if (si->getUseCompoundFile()) { cfsReader = _CLNEW CompoundFileReader(directory(), (segment + "." + IndexFileNames::COMPOUND_FILE_EXTENSION).c_str(), readBufferSize); cfsDir = cfsReader; } Directory* storeDir; if (doOpenStores) { if (si->getDocStoreOffset() != -1) { if (si->getDocStoreIsCompoundFile()) { storeCFSReader = _CLNEW CompoundFileReader(directory(), (si->getDocStoreSegment() + "." + IndexFileNames::COMPOUND_FILE_STORE_EXTENSION).c_str(), readBufferSize); storeDir = storeCFSReader; } else { storeDir = directory(); } } else { storeDir = cfsDir; } } else storeDir = NULL; // No compound file exists - use the multi-file format _fieldInfos = _CLNEW FieldInfos(cfsDir, (segment + ".fnm").c_str() ); string fieldsSegment; if (si->getDocStoreOffset() != -1) fieldsSegment = si->getDocStoreSegment(); else fieldsSegment = segment; if (doOpenStores) { fieldsReader = _CLNEW FieldsReader(storeDir, fieldsSegment.c_str(), _fieldInfos, readBufferSize, si->getDocStoreOffset(), si->docCount); // Verify two sources of "maxDoc" agree: if (si->getDocStoreOffset() == -1 && fieldsReader->size() != si->docCount) { string err = "doc counts differ for segment "; err += si->name; err += ": fieldsReader shows "; err += fieldsReader->size(); err += " but segmentInfo shows "; err += si->docCount; _CLTHROWA(CL_ERR_CorruptIndex, err.c_str() ); } } tis = _CLNEW TermInfosReader(cfsDir, segment.c_str(), _fieldInfos, readBufferSize); loadDeletedDocs(); // make sure that all index files have been read or are kept open // so that if an index update removes them we'll still have them freqStream = cfsDir->openInput( (segment + ".frq").c_str(), readBufferSize); proxStream = cfsDir->openInput( (segment + ".prx").c_str(), readBufferSize); openNorms(cfsDir, readBufferSize); if (doOpenStores && _fieldInfos->hasVectors()) { // open term vector files only as needed string vectorsSegment; if (si->getDocStoreOffset() != -1) vectorsSegment = si->getDocStoreSegment(); else vectorsSegment = segment; termVectorsReaderOrig = _CLNEW TermVectorsReader(storeDir, vectorsSegment.c_str(), _fieldInfos, readBufferSize, si->getDocStoreOffset(), si->docCount); } success = true; } _CLFINALLY ( // With lock-less commits, it's entirely possible (and // fine) to hit a FileNotFound exception above. In // this case, we want to explicitly close any subset // of things that were opened so that we don't have to // wait for a GC to do so. if (!success) { doClose(); } ) } SegmentReader* SegmentReader::get(SegmentInfo* si, bool doOpenStores) { return get(si->dir, si, NULL, false, false, BufferedIndexInput::BUFFER_SIZE, doOpenStores); } SegmentReader* SegmentReader::get(SegmentInfo* si, int32_t readBufferSize, bool doOpenStores){ return get(si->dir, si, NULL, false, false, readBufferSize, doOpenStores); } SegmentReader* SegmentReader::get(SegmentInfos* sis, SegmentInfo* si, bool closeDir) { return get(si->dir, si, sis, closeDir, true, BufferedIndexInput::BUFFER_SIZE, true); } /** * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ SegmentReader* SegmentReader::get(Directory* dir, SegmentInfo* si, SegmentInfos* sis, bool closeDir, bool ownDir, int32_t readBufferSize, bool doOpenStores){ SegmentReader* instance = _CLNEW SegmentReader(); //todo: make this configurable... instance->init(dir, sis, closeDir); instance->initialize(si, readBufferSize==-1 ? BufferedIndexInput::BUFFER_SIZE : readBufferSize, doOpenStores, false); return instance; } SegmentReader::SegmentReader(): DirectoryIndexReader(), _norms(false,true) { } SegmentReader::~SegmentReader(){ //Func - Destructor. //Pre - doClose has been invoked! //Post - the instance has been destroyed doClose(); //this means that index reader doesn't need to be closed manually _CLDELETE(_fieldInfos); _CLDELETE(fieldsReader); _CLDELETE(tis); _CLDELETE(freqStream); _CLDELETE(proxStream); _CLDELETE(deletedDocs); _CLDELETE_ARRAY(ones); _CLDELETE(termVectorsReaderOrig) _CLDECDELETE(cfsReader); //termVectorsLocal->unregister(this); } void SegmentReader::commitChanges(){ if (deletedDocsDirty) { // re-write deleted si->advanceDelGen(); // We can write directly to the actual name (vs to a // .tmp & renaming it) because the file is not live // until segments file is written: deletedDocs->write(directory(), si->getDelFileName().c_str()); } if (undeleteAll && si->hasDeletions()) { si->clearDelGen(); } if (normsDirty) { // re-write norms si->setNumFields(_fieldInfos->size()); NormsType::iterator it = _norms.begin(); while (it != _norms.end()) { Norm* norm = it->second; if (norm->dirty) { norm->reWrite(si); } it++; } } deletedDocsDirty = false; normsDirty = false; undeleteAll = false; } void SegmentReader::doClose() { //Func - Closes all streams to the files of a single segment //Pre - fieldsReader != NULL // tis != NULL //Post - All streams to files have been closed _CLDELETE(deletedDocs); // close the single norms stream if (singleNormStream != NULL) { // we can close this stream, even if the norms // are shared, because every reader has it's own // singleNormStream singleNormStream->close(); _CLDELETE(singleNormStream); } // re-opened SegmentReaders have their own instance of FieldsReader if (fieldsReader != NULL) { fieldsReader->close(); _CLDELETE(fieldsReader); } if (tis != NULL) { tis->close(); _CLDELETE(tis); } //Close the frequency stream if (freqStream != NULL){ freqStream->close(); _CLDELETE(freqStream); } //Close the prox stream if (proxStream != NULL){ proxStream->close(); _CLDELETE(proxStream); } if (termVectorsReaderOrig != NULL){ termVectorsReaderOrig->close(); _CLDELETE(termVectorsReaderOrig); } if (cfsReader != NULL){ cfsReader->close(); _CLDECDELETE(cfsReader); } if (storeCFSReader != NULL){ storeCFSReader->close(); _CLDELETE(storeCFSReader); } this->decRefNorms(); _norms.clear(); // maybe close directory DirectoryIndexReader::doClose(); } bool SegmentReader::hasDeletions() const{ // Don't call ensureOpen() here (it could affect performance) return deletedDocs != NULL; } //static bool SegmentReader::usesCompoundFile(SegmentInfo* si) { return si->getUseCompoundFile(); } //static bool SegmentReader::hasSeparateNorms(SegmentInfo* si) { return si->hasSeparateNorms(); } bool SegmentReader::hasDeletions(const SegmentInfo* si) { //Func - Static method // Checks if a segment managed by SegmentInfo si-> has deletions //Pre - si-> holds a valid reference to an SegmentInfo instance //Post - if the segement contains deleteions true is returned otherwise flas // Don't call ensureOpen() here (it could affect performance) return si->hasDeletions(); } //synchronized void SegmentReader::doDelete(const int32_t docNum){ //Func - Marks document docNum as deleted //Pre - docNum >=0 and DocNum < maxDoc() // docNum contains the number of the document that must be // marked deleted //Post - The document identified by docNum has been marked deleted SCOPED_LOCK_MUTEX(THIS_LOCK) CND_PRECONDITION(docNum >= 0, "docNum is a negative number"); CND_PRECONDITION(docNum < maxDoc(), "docNum is bigger than the total number of documents"); //Check if deletedDocs exists if (deletedDocs == NULL){ deletedDocs = _CLNEW BitSet(maxDoc()); //Condition check to see if deletedDocs points to a valid instance CND_CONDITION(deletedDocs != NULL,"No memory could be allocated for deletedDocs"); } //Flag that there are documents marked deleted deletedDocsDirty = true; undeleteAll = false; //Mark document identified by docNum as deleted deletedDocs->set(docNum); } void SegmentReader::doUndeleteAll(){ _CLDELETE(deletedDocs); deletedDocsDirty = false; undeleteAll = true; } void SegmentReader::files(vector& retarray) { //Func - Returns all file names managed by this SegmentReader //Pre - segment != NULL //Post - All filenames managed by this SegmentRead have been returned vector tmp = si->files(); retarray.insert(retarray.end(),tmp.begin(),tmp.end()); } TermEnum* SegmentReader::terms() { //Func - Returns an enumeration of all the Terms and TermInfos in the set. //Pre - tis != NULL //Post - An enumeration of all the Terms and TermInfos in the set has been returned CND_PRECONDITION(tis != NULL, "tis is NULL"); ensureOpen(); return tis->terms(); } TermEnum* SegmentReader::terms(const Term* t) { //Func - Returns an enumeration of terms starting at or after the named term t //Pre - t != NULL // tis != NULL //Post - An enumeration of terms starting at or after the named term t CND_PRECONDITION(t != NULL, "t is NULL"); CND_PRECONDITION(tis != NULL, "tis is NULL"); ensureOpen(); return tis->terms(t); } bool SegmentReader::document(int32_t n, Document& doc, const FieldSelector* fieldSelector) { //Func - writes the fields of document n into doc //Pre - n >=0 and identifies the document n //Post - if the document has been deleted then an exception has been thrown // otherwise a reference to the found document has been returned SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); CND_PRECONDITION(n >= 0, "n is a negative number"); //Check if the n-th document has been marked deleted if (isDeleted(n)){ _CLTHROWA( CL_ERR_InvalidState,"attempt to access a deleted document" ); } //Retrieve the n-th document return fieldsReader->doc(n, doc, fieldSelector); } bool SegmentReader::isDeleted(const int32_t n){ //Func - Checks if the n-th document has been marked deleted //Pre - n >=0 and identifies the document n //Post - true has been returned if document n has been deleted otherwise fralse SCOPED_LOCK_MUTEX(THIS_LOCK) CND_PRECONDITION(n >= 0, "n is a negative number"); //Is document n deleted bool ret = (deletedDocs != NULL && deletedDocs->get(n)); return ret; } TermDocs* SegmentReader::termDocs() { //Func - Returns an unpositioned TermDocs enumerator. //Pre - true //Post - An unpositioned TermDocs enumerator has been returned ensureOpen(); return _CLNEW SegmentTermDocs(this); } TermPositions* SegmentReader::termPositions() { //Func - Returns an unpositioned TermPositions enumerator. //Pre - true //Post - An unpositioned TermPositions enumerator has been returned ensureOpen(); return _CLNEW SegmentTermPositions(this); } int32_t SegmentReader::docFreq(const Term* t) { //Func - Returns the number of documents which contain the term t //Pre - t holds a valid reference to a Term //Post - The number of documents which contain term t has been returned ensureOpen(); //Get the TermInfo ti for Term t in the set TermInfo* ti = tis->get(t); //Check if an TermInfo has been returned if (ti){ //Get the frequency of the term int32_t ret = ti->docFreq; //TermInfo ti is not needed anymore so delete it _CLDELETE( ti ); //return the number of documents which containt term t return ret; } else //No TermInfo returned so return 0 return 0; } int32_t SegmentReader::numDocs() { //Func - Returns the actual number of documents in the segment //Pre - true //Post - The actual number of documents in the segments ensureOpen(); //Get the number of all the documents in the segment including the ones that have //been marked deleted int32_t n = maxDoc(); //Check if there any deleted docs if (deletedDocs != NULL) //Substract the number of deleted docs from the number returned by maxDoc n -= deletedDocs->count(); //return the actual number of documents in the segment return n; } int32_t SegmentReader::maxDoc() const { //Func - Returns the number of all the documents in the segment including // the ones that have been marked deleted //Pre - true //Post - The total number of documents in the segment has been returned // Don't call ensureOpen() here (it could affect performance) return si->docCount; } void SegmentReader::setTermInfosIndexDivisor(int32_t indexDivisor){ tis->setIndexDivisor(indexDivisor); } int32_t SegmentReader::getTermInfosIndexDivisor() { return tis->getIndexDivisor(); } void SegmentReader::getFieldNames(FieldOption fldOption, StringArrayWithDeletor& retarray){ ensureOpen(); size_t len = _fieldInfos->size(); for (size_t i = 0; i < len; i++) { FieldInfo* fi = _fieldInfos->fieldInfo(i); bool v=false; if (fldOption & IndexReader::ALL) { v=true; }else { if (!fi->isIndexed && (fldOption & IndexReader::UNINDEXED) ) v=true; else if (fi->isIndexed && (fldOption & IndexReader::INDEXED) ) v=true; else if (fi->storePayloads && (fldOption & IndexReader::STORES_PAYLOADS) ) v=true; else if (fi->isIndexed && fi->storeTermVector == false && ( fldOption & IndexReader::INDEXED_NO_TERMVECTOR) ) v=true; else if ( (fldOption & IndexReader::TERMVECTOR) && fi->storeTermVector == true && fi->storePositionWithTermVector == false && fi->storeOffsetWithTermVector == false ) v=true; else if (fi->isIndexed && fi->storeTermVector && (fldOption & IndexReader::INDEXED_WITH_TERMVECTOR) ) v=true; else if (fi->storePositionWithTermVector && fi->storeOffsetWithTermVector == false && (fldOption & IndexReader::TERMVECTOR_WITH_POSITION)) v=true; else if (fi->storeOffsetWithTermVector && fi->storePositionWithTermVector == false && (fldOption & IndexReader::TERMVECTOR_WITH_OFFSET) ) v=true; else if ((fi->storeOffsetWithTermVector && fi->storePositionWithTermVector) && (fldOption & IndexReader::TERMVECTOR_WITH_POSITION_OFFSET) ) v=true; } if ( v ) retarray.push_back(STRDUP_TtoT(fi->name)); } } bool SegmentReader::hasNorms(const TCHAR* field){ ensureOpen(); return _norms.find(field) != _norms.end(); } void SegmentReader::norms(const TCHAR* field, uint8_t* bytes) { //Func - Reads the Norms for field from disk starting at offset in the inputstream //Pre - field != NULL // bytes != NULL is an array of bytes which is to be used to read the norms into. // it is advisable to have bytes initalized by zeroes! //Post - The if an inputstream to the norm file could be retrieved the bytes have been read // You are never sure whether or not the norms have been read into bytes properly!!!!!!!!!!!!!!!!! CND_PRECONDITION(field != NULL, "field is NULL"); CND_PRECONDITION(bytes != NULL, "field is NULL"); SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); Norm* norm = _norms.get(field); if ( norm == NULL ){ memcpy(bytes, fakeNorms(), maxDoc()); return; } {SCOPED_LOCK_MUTEX(norm->THIS_LOCK) if (norm->bytes != NULL) { // can copy from cache memcpy(bytes, norm->bytes, maxDoc()); return; } // Read from disk. norm.in may be shared across multiple norms and // should only be used in a synchronized context. IndexInput* normStream; if (norm->useSingleNormStream) { normStream = singleNormStream; } else { normStream = norm->in; } normStream->seek(norm->normSeek); normStream->readBytes(bytes, maxDoc()); } } uint8_t* SegmentReader::createFakeNorms(int32_t size) { uint8_t* ones = _CL_NEWARRAY(uint8_t,size); if ( size > 0 ) memset(ones, DefaultSimilarity::encodeNorm(1.0f), size); return ones; } uint8_t* SegmentReader::fakeNorms() { if (ones==NULL) ones=createFakeNorms(maxDoc()); return ones; } // can return NULL if norms aren't stored uint8_t* SegmentReader::getNorms(const TCHAR* field) { SCOPED_LOCK_MUTEX(THIS_LOCK) Norm* norm = _norms.get(field); if (norm == NULL) return NULL; // not indexed, or norms not stored {SCOPED_LOCK_MUTEX(norm->THIS_LOCK) if (norm->bytes == NULL) { // value not yet read uint8_t* bytes = _CL_NEWARRAY(uint8_t, maxDoc()); norms(field, bytes); norm->bytes = bytes; // cache it // it's OK to close the underlying IndexInput as we have cached the // norms and will never read them again. norm->close(); } return norm->bytes; } } void SegmentReader::decRefNorms(){ SCOPED_LOCK_MUTEX(THIS_LOCK) NormsType::iterator it = _norms.begin(); while (it != _norms.end()) { Norm* norm = it->second; norm->decRef(); it++; } } DirectoryIndexReader* SegmentReader::doReopen(SegmentInfos* infos){ SCOPED_LOCK_MUTEX(THIS_LOCK) DirectoryIndexReader* newReader; if (infos->size() == 1) { SegmentInfo* si = infos->info(0); if (segment.compare(si->name)==0 && si->getUseCompoundFile() == this->si->getUseCompoundFile()) { newReader = reopenSegment(si); } else { // segment not referenced anymore, reopen not possible // or segment format changed newReader = SegmentReader::get(infos, infos->info(0), false); } } else { ValueArray readers(1); readers.values[0] = this; return _CLNEW MultiSegmentReader(_directory, infos, closeDirectory, &readers, NULL, NULL); } return newReader; } uint8_t* SegmentReader::norms(const TCHAR* field) { //Func - Returns the bytes array that holds the norms of a named field //Pre - field != NULL and contains the name of the field for which the norms // must be retrieved //Post - If there was norm for the named field then a bytes array has been allocated // and returned containing the norms for that field. If the named field is unknown NULL is returned. CND_PRECONDITION(field != NULL, "field is NULL"); SCOPED_LOCK_MUTEX(THIS_LOCK) ensureOpen(); uint8_t* bytes = getNorms(field); if (bytes==NULL) bytes=fakeNorms(); return bytes; } void SegmentReader::doSetNorm(int32_t doc, const TCHAR* field, uint8_t value){ Norm* norm = _norms.get(field); if (norm == NULL) // not an indexed field return; norm->dirty = true; // mark it dirty normsDirty = true; uint8_t* bits = norms(field); bits[doc] = value; // set the value } string SegmentReader::SegmentName(const char* ext, const int32_t x){ //Func - Returns an allocated buffer in which it creates a filename by // concatenating segment with ext and x //Pre ext != NULL and holds the extension // x contains a number //Post - A buffer has been instantiated an when x = -1 buffer contains the concatenation of // segment and ext otherwise buffer contains the contentation of segment, ext and x CND_PRECONDITION(ext != NULL, "ext is NULL"); return Misc::segmentname(segment.c_str(),ext,x); } void SegmentReader::openNorms(Directory* cfsDir, int32_t readBufferSize) { //Func - Open all norms files for all fields // Creates for each field a norm Instance with an open inputstream to // a corresponding norm file ready to be read //Pre - true //Post - For each field a norm instance has been created with an open inputstream to // a corresponding norm file ready to be read int64_t nextNormSeek = SegmentMerger::NORMS_HEADER_length; //skip header (header unused for now) int32_t _maxDoc = maxDoc(); for (size_t i = 0; i < _fieldInfos->size(); i++) { FieldInfo* fi = _fieldInfos->fieldInfo(i); if (_norms.find(fi->name) != _norms.end()) { // in case this SegmentReader is being re-opened, we might be able to // reuse some norm instances and skip loading them here continue; } if (fi->isIndexed && !fi->omitNorms) { Directory* d = directory(); string fileName = si->getNormFileName(fi->number); if (!si->hasSeparateNorms(fi->number)) { d = cfsDir; } // singleNormFile means multiple norms share this file string ext = string(".") + IndexFileNames::NORMS_EXTENSION; bool singleNormFile = fileName.compare(fileName.length()-ext.length(),ext.length(),ext)==0; IndexInput* normInput = NULL; int64_t normSeek; if (singleNormFile) { normSeek = nextNormSeek; if (singleNormStream==NULL) { singleNormStream = d->openInput(fileName.c_str(), readBufferSize); } // All norms in the .nrm file can share a single IndexInput since // they are only used in a synchronized context. // If this were to change in the future, a clone could be done here. normInput = singleNormStream; } else { normSeek = 0; normInput = d->openInput(fileName.c_str()); } _norms[fi->name] = _CLNEW Norm(normInput, singleNormFile, fi->number, normSeek, this, segment.c_str()); nextNormSeek += _maxDoc; // increment also if some norms are separate } } } TermVectorsReader* SegmentReader::getTermVectorsReader() { TermVectorsReader* tvReader = termVectorsLocal.get(); if (tvReader == NULL) { tvReader = termVectorsReaderOrig->clone(); termVectorsLocal.set(tvReader); } return tvReader; } FieldsReader* SegmentReader::getFieldsReader() { return fieldsReader; } FieldInfos* SegmentReader::getFieldInfos() { return _fieldInfos; } TermFreqVector* SegmentReader::getTermFreqVector(int32_t docNumber, const TCHAR* field){ ensureOpen(); if ( field != NULL ){ // Check if this field is invalid or has no stored term vector FieldInfo* fi = _fieldInfos->fieldInfo(field); if (fi == NULL || !fi->storeTermVector || termVectorsReaderOrig == NULL ) return NULL; } TermVectorsReader* termVectorsReader = getTermVectorsReader(); if (termVectorsReader == NULL) return NULL; return termVectorsReader->get(docNumber, field); } ArrayBase* SegmentReader::getTermFreqVectors(int32_t docNumber) { ensureOpen(); if (termVectorsReaderOrig == NULL) return NULL; TermVectorsReader* termVectorsReader = getTermVectorsReader(); if (termVectorsReader == NULL) return NULL; return termVectorsReader->get(docNumber); } void SegmentReader::getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper) { ensureOpen(); FieldInfo* fi = _fieldInfos->fieldInfo(field); if (fi == NULL || !fi->storeTermVector || termVectorsReaderOrig == NULL) return; TermVectorsReader* termVectorsReader = getTermVectorsReader(); if (termVectorsReader == NULL) { return; } termVectorsReader->get(docNumber, field, mapper); } void SegmentReader::getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper){ ensureOpen(); if (termVectorsReaderOrig == NULL) return; TermVectorsReader* termVectorsReader = getTermVectorsReader(); if (termVectorsReader == NULL) return; termVectorsReader->get(docNumber, mapper); } void SegmentReader::loadDeletedDocs(){ // NOTE: the bitvector is stored using the regular directory, not cfs if (hasDeletions(si)) { deletedDocs = _CLNEW BitVector(directory(), si->getDelFileName().c_str()); // Verify # deletes does not exceed maxDoc for this segment: if (deletedDocs->count() > maxDoc()) { string err = "number of deletes ("; err += deletedDocs->count(); err += ") exceeds max doc ("; err += maxDoc(); err += ") for segment "; err += si->name; _CLTHROWA(CL_ERR_CorruptIndex, err.c_str()); } } } SegmentReader* SegmentReader::reopenSegment(SegmentInfo* si){ SCOPED_LOCK_MUTEX(THIS_LOCK) bool deletionsUpToDate = (this->si->hasDeletions() == si->hasDeletions()) && (!si->hasDeletions() || this->si->getDelFileName().compare(si->getDelFileName())==0 ); bool normsUpToDate = true; ValueArrayfieldNormsChanged(_fieldInfos->size()); if (normsUpToDate) { for (size_t i = 0; i < _fieldInfos->size(); i++) { if (this->si->getNormFileName(i).compare(si->getNormFileName(i)) != 0) { normsUpToDate = false; fieldNormsChanged.values[i] = true; } } } if (normsUpToDate && deletionsUpToDate) { this->si = si; //force the result to use the new segment info (the old one is going to go away!) return this; } // clone reader SegmentReader* clone = NULL; bool success = false; try { clone = _CLNEW SegmentReader(); clone->init(_directory, NULL, false); clone->initialize(si, readBufferSize, false, true); clone->cfsReader = cfsReader; clone->storeCFSReader = storeCFSReader; clone->_fieldInfos = _fieldInfos; clone->tis = tis; clone->freqStream = freqStream; clone->proxStream = proxStream; clone->termVectorsReaderOrig = termVectorsReaderOrig; // we have to open a new FieldsReader, because it is not thread-safe // and can thus not be shared among multiple SegmentReaders // TODO: Change this in case FieldsReader becomes thread-safe in the future string fieldsSegment; Directory* storeDir = directory(); if (si->getDocStoreOffset() != -1) { fieldsSegment = si->getDocStoreSegment(); if (storeCFSReader != NULL) { storeDir = storeCFSReader; } } else { fieldsSegment = segment; if (cfsReader != NULL) { storeDir = cfsReader; } } if (fieldsReader != NULL) { clone->fieldsReader = _CLNEW FieldsReader(storeDir, fieldsSegment.c_str(), _fieldInfos, readBufferSize, si->getDocStoreOffset(), si->docCount); } if (!deletionsUpToDate) { // load deleted docs clone->deletedDocs = NULL; clone->loadDeletedDocs(); } else { clone->deletedDocs = this->deletedDocs; } if (!normsUpToDate) { // load norms for (size_t i = 0; i < fieldNormsChanged.length; i++) { // copy unchanged norms to the cloned reader and incRef those norms if (!fieldNormsChanged[i]) { const TCHAR* curField = _fieldInfos->fieldInfo(i)->name; Norm* norm = this->_norms.get(curField); norm->incRef(); norm->_this = clone; //give the norm to the clone clone->_norms.put(curField, norm); } } clone->openNorms(si->getUseCompoundFile() ? cfsReader : directory(), readBufferSize); } else { NormsType::iterator it = _norms.begin(); while (it != _norms.end()) { const TCHAR* field = it->first; Norm* norm = _norms[field]; norm->incRef(); norm->_this = clone; //give the norm to the clone clone->_norms.put(field, norm); it++; } } if (clone->singleNormStream == NULL) { for (size_t i = 0; i < _fieldInfos->size(); i++) { FieldInfo* fi = _fieldInfos->fieldInfo(i); if (fi->isIndexed && !fi->omitNorms) { Directory* d = si->getUseCompoundFile() ? cfsReader : directory(); string fileName = si->getNormFileName(fi->number); if (si->hasSeparateNorms(fi->number)) { continue; } string ext = string(".") + IndexFileNames::NORMS_EXTENSION; if (fileName.compare(fileName.length()-ext.length(),ext.length(),ext)==0) { clone->singleNormStream = d->openInput(fileName.c_str(), readBufferSize); break; } } } } success = true; } _CLFINALLY ( if (!success) { // An exception occured during reopen, we have to decRef the norms // that we incRef'ed already and close singleNormsStream and FieldsReader clone->decRefNorms(); } ) //disown this memory this->freqStream = NULL; this->_fieldInfos = NULL; this->tis = NULL; this->deletedDocs = NULL; this->ones = NULL; this->termVectorsReaderOrig = NULL; this->cfsReader = NULL; this->freqStream = NULL; this->proxStream = NULL; this->termVectorsReaderOrig = NULL; this->cfsReader = NULL; this->storeCFSReader = NULL; this->singleNormStream = NULL; return clone; } /** Returns the field infos of this segment */ FieldInfos* SegmentReader::fieldInfos() { return _fieldInfos; } /** * Return the name of the segment this reader is reading. */ const char* SegmentReader::getSegmentName() { return segment.c_str(); } /** * Return the SegmentInfo of the segment this reader is reading. */ SegmentInfo* SegmentReader::getSegmentInfo() { return si; } void SegmentReader::setSegmentInfo(SegmentInfo* info) { si = info; } void SegmentReader::startCommit() { DirectoryIndexReader::startCommit(); rollbackDeletedDocsDirty = deletedDocsDirty; rollbackNormsDirty = normsDirty; rollbackUndeleteAll = undeleteAll; NormsType::iterator it = _norms.begin(); while (it != _norms.end()) { Norm* norm = it->second; norm->rollbackDirty = norm->dirty; } } void SegmentReader::rollbackCommit() { DirectoryIndexReader::rollbackCommit(); deletedDocsDirty = rollbackDeletedDocsDirty; normsDirty = rollbackNormsDirty; undeleteAll = rollbackUndeleteAll; NormsType::iterator it = _norms.begin(); while (it != _norms.end()) { Norm* norm = it->second; norm->dirty = norm->rollbackDirty; } } const char* SegmentReader::getClassName(){ return "SegmentReader"; } const char* SegmentReader::getObjectName() const{ return getClassName(); } bool SegmentReader::normsClosed() { if (singleNormStream != NULL) { return false; } NormsType::iterator it = _norms.begin(); while ( it != _norms.end() ) { Norm* norm = it->second; if (norm->refCount > 0) { return false; } } return true; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentTermDocs.cpp000066400000000000000000000114601154025176300241460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SegmentHeader.h" #include "CLucene/store/IndexInput.h" #include "Term.h" #include CL_NS_DEF(index) SegmentTermDocs::SegmentTermDocs(const SegmentReader* _parent) : parent(_parent),freqStream(_parent->freqStream->clone()), count(0),df(0),deletedDocs(_parent->deletedDocs),_doc(0),_freq(0),skipInterval(_parent->tis->getSkipInterval()), maxSkipLevels(_parent->tis->getMaxSkipLevels()),skipListReader(NULL),freqBasePointer(0),proxBasePointer(0), skipPointer(0),haveSkipped(false) { CND_CONDITION(_parent != NULL,"Parent is NULL"); } SegmentTermDocs::~SegmentTermDocs() { close(); } TermPositions* SegmentTermDocs::__asTermPositions(){ return NULL; } void SegmentTermDocs::seek(Term* term) { TermInfo* ti = parent->tis->get(term); seek(ti, term); _CLDELETE(ti); } void SegmentTermDocs::seek(TermEnum* termEnum){ TermInfo* ti=NULL; Term* term = NULL; // use comparison of fieldinfos to verify that termEnum belongs to the same segment as this SegmentTermDocs if ( termEnum->getObjectName() == SegmentTermEnum::getClassName() && ((SegmentTermEnum*)termEnum)->fieldInfos == parent->_fieldInfos ){ SegmentTermEnum* segmentTermEnum = (SegmentTermEnum*) termEnum; term = segmentTermEnum->term(false); ti = segmentTermEnum->getTermInfo(); }else{ term = termEnum->term(false); ti = parent->tis->get(term); } seek(ti,term); _CLDELETE(ti); } void SegmentTermDocs::seek(const TermInfo* ti,Term* term) { count = 0; FieldInfo* fi = parent->_fieldInfos->fieldInfo(term->field()); currentFieldStoresPayloads = (fi != NULL) ? fi->storePayloads : false; if (ti == NULL) { df = 0; } else { // punt case df = ti->docFreq; _doc = 0; freqBasePointer = ti->freqPointer; proxBasePointer = ti->proxPointer; skipPointer = freqBasePointer + ti->skipOffset; freqStream->seek(freqBasePointer); haveSkipped = false; } } void SegmentTermDocs::close() { _CLDELETE( freqStream ); _CLDELETE( skipListReader ); } int32_t SegmentTermDocs::doc()const { return _doc; } int32_t SegmentTermDocs::freq()const { return _freq; } bool SegmentTermDocs::next() { while (true) { if (count == df) return false; uint32_t docCode = freqStream->readVInt(); _doc += docCode >> 1; //unsigned shift if ((docCode & 1) != 0) // if low bit is set _freq = 1; // _freq is one else _freq = freqStream->readVInt(); // else read _freq count++; if ( (deletedDocs == NULL) || (_doc >= 0 && deletedDocs->get(_doc) == false ) ) break; skippingDoc(); } return true; } int32_t SegmentTermDocs::read(int32_t* docs, int32_t* freqs, int32_t length) { int32_t i = 0; //todo: one optimization would be to get the pointer buffer for ram or mmap dirs //and iterate over them instead of using readByte() intensive functions. while (ireadVInt(); _doc += docCode >> 1; if ((docCode & 1) != 0) // if low bit is set _freq = 1; // _freq is one else _freq = freqStream->readVInt(); // else read _freq count++; if (deletedDocs == NULL || (_doc >= 0 && !deletedDocs->get(_doc))) { docs[i] = _doc; freqs[i] = _freq; i++; } } return i; } bool SegmentTermDocs::skipTo(const int32_t target){ assert(count <= df ); if (df >= skipInterval) { // optimized case if (skipListReader == NULL) skipListReader = _CLNEW DefaultSkipListReader(freqStream->clone(), maxSkipLevels, skipInterval); // lazily clone if (!haveSkipped) { // lazily initialize skip stream skipListReader->init(skipPointer, freqBasePointer, proxBasePointer, df, currentFieldStoresPayloads); haveSkipped = true; } int32_t newCount = skipListReader->skipTo(target); if (newCount > count) { freqStream->seek(skipListReader->getFreqPointer()); skipProx(skipListReader->getProxPointer(), skipListReader->getPayloadLength()); _doc = skipListReader->getDoc(); count = newCount; } } // done skipping, now just scan do { if (!next()) return false; } while (target > _doc); return true; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentTermEnum.cpp000066400000000000000000000304631154025176300241660ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SegmentHeader.h" #include "_SegmentTermEnum.h" #include "Terms.h" #include "_FieldInfos.h" #include "Term.h" #include "_TermInfo.h" #include "_TermInfosWriter.h" CL_NS_USE(store) CL_NS_DEF(index) SegmentTermEnum::SegmentTermEnum(IndexInput* i, FieldInfos* fis, const bool isi): fieldInfos(fis){ //Func - Constructor //Pre - i holds a reference to an instance of IndexInput // fis holds a reference to an instance of FieldInfos // isi //Post - An instance of SegmentTermEnum has been created input = i; position = -1; //Instantiate a Term with empty field, empty text and which is interned (see term.h what interned means) _term = _CLNEW Term; isIndex = isi; termInfo = _CLNEW TermInfo(); indexPointer = 0; buffer = NULL; bufferLength = 0; prev = NULL; formatM1SkipInterval = 0; maxSkipLevels = 1; //Set isClone to false as the instance is not clone of another instance isClone = false; int32_t firstInt = input->readInt(); if (firstInt >= 0) { // original-format file, without explicit format version number format = 0; size = firstInt; // back-compatible settings indexInterval = 128; skipInterval = LUCENE_INT32_MAX_SHOULDBE; // switch off skipTo optimization } else { // we have a format version number format = firstInt; // check that it is a format we can understand if (format < TermInfosWriter::FORMAT){ TCHAR err[30]; _sntprintf(err,30,_T("Unknown format version: %d"), format); _CLTHROWT(CL_ERR_CorruptIndex,err); } size = input->readLong(); // read the size if(format == -1){ if (!isIndex) { indexInterval = input->readInt(); formatM1SkipInterval = input->readInt(); } // switch off skipTo optimization for file format prior to 1.4rc2 in order to avoid a bug in // skipTo implementation of these versions skipInterval = LUCENE_INT32_MAX_SHOULDBE; }else{ indexInterval = input->readInt(); skipInterval = input->readInt(); if ( format == -3 ) { // this new format introduces multi-level skipping maxSkipLevels = input->readInt(); } } } } SegmentTermEnum::SegmentTermEnum(const SegmentTermEnum& clone): fieldInfos(clone.fieldInfos) { //Func - Constructor // The instance is created by cloning all properties of clone //Pre - clone holds a valid reference to SegmentTermEnum //Post - An instance of SegmentTermEnum with the same properties as clone input = clone.input->clone(); //Copy the postion from the clone position = clone.position; if ( clone._term != NULL ){ _term = _CLNEW Term; _term->set(clone._term,clone._term->text()); }else _term = NULL; isIndex = clone.isIndex; termInfo = _CLNEW TermInfo(clone.termInfo); indexPointer = clone.indexPointer; buffer = clone.buffer==NULL?NULL:(TCHAR*)malloc(sizeof(TCHAR) * (clone.bufferLength+1)); bufferLength = clone.bufferLength; prev = clone.prev==NULL?NULL:_CLNEW Term(clone.prev->field(),clone.prev->text(),false); size = clone.size; format = clone.format; indexInterval= clone.indexInterval; skipInterval = clone.skipInterval; formatM1SkipInterval = clone.formatM1SkipInterval; maxSkipLevels = clone.maxSkipLevels; //Set isClone to true as this instance is a clone of another instance isClone = true; //Copy the contents of buffer of clone to the buffer of this instance if ( clone.buffer != NULL ) memcpy(buffer,clone.buffer,bufferLength * sizeof(TCHAR)); } SegmentTermEnum::~SegmentTermEnum(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed. If this instance was a clone // then the inputstream is closed and deleted too. //todo: revisit this... close() should clean up most of everything. //Finalize prev _CLDECDELETE(prev ); //Finalize term _CLDECDELETE( _term ); //Delete the buffer if necessary if ( buffer != NULL ) free(buffer); //Delete termInfo if necessary _CLDELETE(termInfo); //Check if this instance is a clone if ( isClone ){ //Close the inputstream input->close(); //delete the inputstream _CLDELETE(input); } } const char* SegmentTermEnum::getObjectName() const{ return getClassName(); } const char* SegmentTermEnum::getClassName(){ return "SegmentTermEnum"; } bool SegmentTermEnum::next(){ //Func - Moves the current of the set to the next in the set //Pre - true //Post - If the end has been reached NULL is returned otherwise the term has // become the next Term in the enumeration //Increase position by and and check if the end has been reached if (position++ >= size-1) { //delete term _CLDECDELETE(_term); return false; } //delete the previous enumerated term Term* tmp=NULL; if ( prev != NULL ){ if ( _LUCENE_ATOMIC_INT_GET(prev->__cl_refcount) > 1 ){ _CLDECDELETE(prev); //todo: tune other places try and delete its term }else tmp = prev; //we are going to re-use this term } //prev becomes the current enumerated term prev = _term; //term becomes the next term read from inputStream input _term = readTerm(tmp); //Read docFreq, the number of documents which contain the term. termInfo->docFreq = input->readVInt(); //Read freqPointer, a pointer into the TermFreqs file (.frq) termInfo->freqPointer += input->readVLong(); //Read proxPointer, a pointer into the TermPosition file (.prx). termInfo->proxPointer += input->readVLong(); if(format == -1){ // just read skipOffset in order to increment file pointer; // value is never used since skipTo is switched off if (!isIndex) { if (termInfo->docFreq > formatM1SkipInterval) { termInfo->skipOffset = input->readVInt(); } } }else{ if (termInfo->docFreq >= skipInterval) termInfo->skipOffset = input->readVInt(); } //Check if the enumeration is an index if (isIndex) //read index pointer indexPointer += input->readVLong(); return true; } Term* SegmentTermEnum::term(bool pointer) { if ( pointer ) return _CL_POINTER(_term); else return _term; } void SegmentTermEnum::scanTo(const Term *term){ //Func - Scan for Term without allocating new Terms //Pre - term != NULL //Post - The iterator term has been moved to the position where Term is expected to be // in the enumeration while ( term->compareTo(this->_term) > 0 && next()) { } } void SegmentTermEnum::close() { //Func - Closes the enumeration to further activity, freeing resources. //Pre - true //Post - The inputStream input has been closed input->close(); } int32_t SegmentTermEnum::docFreq() const { //Func - Returns the document frequency of the current term in the set //Pre - termInfo != NULL // next() must have been called once //Post - The document frequency of the current enumerated term has been returned return termInfo->docFreq; } void SegmentTermEnum::seek(const int64_t pointer, const int32_t p, Term* t, TermInfo* ti) { //Func - Repositions term and termInfo within the enumeration //Pre - pointer >= 0 // p >= 0 and contains the new position within the enumeration // t is a valid reference to a Term and is the new current term in the enumeration // ti is a valid reference to a TermInfo and is corresponding TermInfo form the new // current Term //Post - term and terminfo have been repositioned within the enumeration //Reset the IndexInput input to pointer input->seek(pointer); //Assign the new position position = p; //finalize the current term if ( _term == NULL || _LUCENE_ATOMIC_INT_GET(_term->__cl_refcount) > 1 ){ _CLDECDELETE(_term); //Get a pointer from t and increase the reference counter of t _term = _CLNEW Term; //cannot use reference, because TermInfosReader uses non ref-counted array } _term->set(t,t->text()); //finalize prev _CLDECDELETE(prev); //Change the current termInfo so it matches the new current term termInfo->set(ti); //Have the buffer grown if needed if ( bufferLength <= _term->textLength() ) growBuffer(_term->textLength(), true ); // copy term text into buffer else _tcsncpy(buffer,_term->text(),bufferLength); //just copy the buffer } TermInfo* SegmentTermEnum::getTermInfo()const { //Func - Returns a clone of the current termInfo //Pre - termInfo != NULL // next() must have been called once //Post - A clone of the current termInfo has been returned return _CLNEW TermInfo(*termInfo); //clone } void SegmentTermEnum::getTermInfo(TermInfo* ti)const { //Func - Retrieves a clone of termInfo through the reference ti //Pre - ti contains a valid reference to TermInfo // termInfo != NULL // next() must have been called once //Post - ti contains a clone of termInfo ti->set(termInfo); } int64_t SegmentTermEnum::freqPointer()const { //Func - Returns the freqpointer of the current termInfo //Pre - termInfo != NULL // next() must have been called once //Post - The freqpointer of the current termInfo has been returned return termInfo->freqPointer; } int64_t SegmentTermEnum::proxPointer()const { //Func - Returns the proxPointer of the current termInfo //Pre - termInfo != NULL // next() must have been called once //Post - the proxPointer of the current termInfo has been returned return termInfo->proxPointer; } SegmentTermEnum* SegmentTermEnum::clone() const { //Func - Returns a clone of this instance //Pre - true //Post - An clone of this instance has been returned return _CLNEW SegmentTermEnum(*this); } Term* SegmentTermEnum::readTerm(Term* reuse) { //Func - Reads the next term in the enumeration //Pre - true //Post - The next Term in the enumeration has been read and returned //Read the start position from the inputStream input int32_t start = input->readVInt(); //Read the length of term in the inputStream input int32_t length = input->readVInt(); //Calculated the total lenght of bytes that buffer must be to contain the current //chars in buffer and the new ones yet to be read uint32_t totalLength = start + length; if (static_cast(bufferLength) < totalLength+1) growBuffer(totalLength, false); //dont copy the buffer over. //Read a length number of characters into the buffer from position start in the inputStream input input->readChars(buffer, start, length); //Null terminate the string buffer[totalLength] = 0; //Return a new Term int32_t field = input->readVInt(); const TCHAR* fieldname = fieldInfos->fieldName(field); if ( reuse == NULL ) reuse = _CLNEW Term; reuse->set(fieldname, buffer, false); return reuse; } void SegmentTermEnum::growBuffer(const uint32_t length, bool force_copy) { //Func - Instantiate a buffer of length length+1 //Pre - length > 0 //Post - pre(buffer) has been deleted with its contents. A new buffer // has been allocated of length length+1 and the text of term has been copied // to buffer //todo: we could guess that we will need to re-grow this //buffer a few times...so start off with a reasonable grow //value... if ( bufferLength > length ) return; //Store the new bufferLength if ( length - bufferLength < 8 ) bufferLength = length+8; else bufferLength = length+1; bool copy = buffer==NULL; //Instantiate the new buffer + 1 is needed for terminator '\0' if ( buffer == NULL ) buffer = (TCHAR*)malloc(sizeof(TCHAR) * (bufferLength+1)); else buffer = (TCHAR*)realloc(buffer, sizeof(TCHAR) * (bufferLength+1)); if ( copy || force_copy){ //Copy the text of term into buffer _tcsncpy(buffer,_term->text(),bufferLength); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentTermPositions.cpp000066400000000000000000000113431154025176300252450ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SegmentHeader.h" #include "Terms.h" CL_NS_USE(util) CL_NS_DEF(index) SegmentTermPositions::SegmentTermPositions(const SegmentReader* _parent): SegmentTermDocs(_parent), proxStream(NULL)// the proxStream will be cloned lazily when nextPosition() is called for the first time ,lazySkipPointer(-1), lazySkipProxCount(0) { CND_CONDITION(_parent != NULL, "Parent is NULL"); } SegmentTermPositions::~SegmentTermPositions() { close(); } TermDocs* SegmentTermPositions::__asTermDocs(){ return (TermDocs*) this; } TermPositions* SegmentTermPositions::__asTermPositions(){ return (TermPositions*) this; } void SegmentTermPositions::seek(const TermInfo* ti, Term* term) { SegmentTermDocs::seek(ti, term); if (ti != NULL) lazySkipPointer = ti->proxPointer; lazySkipProxCount = 0; proxCount = 0; payloadLength = 0; needToLoadPayload = false; } void SegmentTermPositions::close() { SegmentTermDocs::close(); //Check if proxStream still exists if(proxStream){ proxStream->close(); _CLDELETE( proxStream ); } } int32_t SegmentTermPositions::nextPosition() { // perform lazy skips if neccessary lazySkip(); proxCount--; return position += readDeltaPosition(); } int32_t SegmentTermPositions::readDeltaPosition() { int32_t delta = proxStream->readVInt(); if (currentFieldStoresPayloads) { // if the current field stores payloads then // the position delta is shifted one bit to the left. // if the LSB is set, then we have to read the current // payload length if ((delta & 1) != 0) { payloadLength = proxStream->readVInt(); } delta = (int32_t)((uint32_t)delta >> (uint32_t)1); needToLoadPayload = true; } return delta; } void SegmentTermPositions::skippingDoc() { lazySkipProxCount += _freq; } bool SegmentTermPositions::next() { // we remember to skip the remaining positions of the current // document lazily lazySkipProxCount += proxCount; if (SegmentTermDocs::next()) { // run super proxCount = _freq; // note frequency position = 0; // reset position return true; } return false; } int32_t SegmentTermPositions::read(int32_t* /*docs*/, int32_t* /*freqs*/, int32_t /*length*/) { _CLTHROWA(CL_ERR_UnsupportedOperation,"TermPositions does not support processing multiple documents in one call. Use TermDocs instead."); } void SegmentTermPositions::skipProx(const int64_t proxPointer, const int32_t _payloadLength){ // we save the pointer, we might have to skip there lazily lazySkipPointer = proxPointer; lazySkipProxCount = 0; proxCount = 0; this->payloadLength = _payloadLength; needToLoadPayload = false; } void SegmentTermPositions::skipPositions(const int32_t n) { for ( int32_t f = n; f > 0; f-- ) { // skip unread positions readDeltaPosition(); skipPayload(); } } void SegmentTermPositions::skipPayload() { if (needToLoadPayload && payloadLength > 0) { proxStream->seek(proxStream->getFilePointer() + payloadLength); } needToLoadPayload = false; } void SegmentTermPositions::lazySkip() { if (proxStream == NULL) { // clone lazily proxStream = parent->proxStream->clone(); } // we might have to skip the current payload // if it was not read yet skipPayload(); if (lazySkipPointer != -1) { proxStream->seek(lazySkipPointer); lazySkipPointer = -1; } if (lazySkipProxCount != 0) { skipPositions(lazySkipProxCount); lazySkipProxCount = 0; } } int32_t SegmentTermPositions::getPayloadLength() const { return payloadLength; } uint8_t* SegmentTermPositions::getPayload(uint8_t* data) { if (!needToLoadPayload) { _CLTHROWA(CL_ERR_IO, "Payload cannot be loaded more than once for the same term position."); } // read payloads lazily uint8_t* retArray; // TODO: Complete length logic ( possibly using ValueArray ? ) if (data == NULL /*|| data.length - offset < payloadLength*/) { // the array is too small to store the payload data, // so we allocate a new one _CLDELETE_ARRAY(data); retArray = _CL_NEWARRAY(uint8_t, payloadLength); } else { retArray = data; } proxStream->readBytes(retArray, payloadLength); needToLoadPayload = false; return retArray; } bool SegmentTermPositions::isPayloadAvailable() const { return needToLoadPayload && (payloadLength > 0); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SegmentTermVector.cpp000066400000000000000000000103551154025176300245220ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_FieldInfos.h" #include "_TermVector.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/Array.h" CL_NS_USE(util) CL_NS_DEF(index) ValueArray SegmentTermPositionVector::EMPTY_TERM_POS; SegmentTermVector::SegmentTermVector(const TCHAR* _field, ArrayBase* _terms, ArrayBase* _termFreqs) { this->field = STRDUP_TtoT(_field); // TODO: Try and avoid this dup (using intern'ing perhaps?) this->terms = _terms; this->termFreqs = _termFreqs; } SegmentTermVector::~SegmentTermVector(){ _CLDELETE_LCARRAY(field); _CLDELETE(terms); _CLDELETE(termFreqs); } TermPositionVector* SegmentTermVector::__asTermPositionVector(){ return NULL; } const TCHAR* SegmentTermVector::getField() { return field; } TCHAR* SegmentTermVector::toString() const{ StringBuffer sb; sb.appendChar('{'); sb.append(field); sb.append(_T(": ")); int32_t i=0; while ( terms && terms->values[i] != NULL ){ if (i>0) sb.append(_T(", ")); sb.append(terms->values[i]); sb.appendChar('/'); sb.appendInt((*termFreqs)[i]); } sb.appendChar('}'); return sb.toString(); } int32_t SegmentTermVector::size() { if ( terms == NULL ) return 0; return terms->length; } const CL_NS(util)::ArrayBase* SegmentTermVector::getTerms() { return (CL_NS(util)::ArrayBase*)terms; } const ArrayBase* SegmentTermVector::getTermFrequencies() { return termFreqs; } int32_t SegmentTermVector::binarySearch(const ArrayBase& a, const TCHAR* key) const { int32_t low = 0; int32_t hi = a.length - 1; int32_t mid = 0; while (low <= hi) { mid = (low + hi) >> 1; int32_t c = _tcscmp(a[mid],key); if (c==0) return mid; else if (c > 0) hi = mid - 1; else // This gets the insertion point right on the last loop. low = ++mid; } return -mid - 1; } int32_t SegmentTermVector::indexOf(const TCHAR* termText) { if(terms == NULL) return -1; int32_t res = binarySearch(*terms, termText); return res >= 0 ? res : -1; } ArrayBase* SegmentTermVector::indexesOf(const CL_NS(util)::ArrayBase& termNumbers, const int32_t start, const int32_t len) { // TODO: there must be a more efficient way of doing this. // At least, we could advance the lower bound of the terms array // as we find valid indexes. Also, it might be possible to leverage // this even more by starting in the middle of the termNumbers array // and thus dividing the terms array maybe in half with each found index. ArrayBase* ret = _CLNEW ValueArray(len); for (int32_t i=0; ivalues[i] = indexOf(termNumbers[start+ i]); } return ret; } SegmentTermPositionVector::SegmentTermPositionVector(const TCHAR* field, ArrayBase* terms, ArrayBase* termFreqs, ArrayBase< ArrayBase* >* _positions, ArrayBase< ArrayBase* >* _offsets) : SegmentTermVector(field,terms,termFreqs), positions(_positions), offsets(_offsets) { } SegmentTermPositionVector::~SegmentTermPositionVector(){ _CLLDELETE(offsets); _CLLDELETE(positions); } ArrayBase* SegmentTermPositionVector::indexesOf(const ArrayBase& termNumbers, const int32_t start, const int32_t len) { return SegmentTermVector::indexesOf(termNumbers, start, len); } TermPositionVector* SegmentTermPositionVector::__asTermPositionVector(){ return this; } const ArrayBase* SegmentTermPositionVector::getOffsets(const size_t index) { if(offsets == NULL) return NULL; if (index < offsets->length) return offsets->values[index]; else return TermVectorOffsetInfo_EMPTY_OFFSET_INFO; } const ArrayBase* SegmentTermPositionVector::getTermPositions(const size_t index) { if(positions == NULL) return NULL; if (index < positions->length) return positions->values[index]; else return &EMPTY_TERM_POS; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SkipListReader.cpp000066400000000000000000000241441154025176300237730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SkipListReader.h" CL_NS_USE(store) CL_NS_DEF(index) MultiLevelSkipListReader::MultiLevelSkipListReader(IndexInput* _skipStream, const int32_t maxSkipLevels, const int32_t _skipInterval): maxNumberOfSkipLevels(maxSkipLevels),numberOfLevelsToBuffer(1), skipStream(CL_NS(util)::ObjectArray(maxSkipLevels)), skipPointer(_CL_NEWARRAY(int64_t,maxSkipLevels)), skipInterval(_CL_NEWARRAY(int32_t,maxSkipLevels)), numSkipped(_CL_NEWARRAY(int32_t,maxSkipLevels)), skipDoc(_CL_NEWARRAY(int32_t,maxSkipLevels)), childPointer(_CL_NEWARRAY(int64_t,maxSkipLevels)) { memset(this->skipPointer,0,sizeof(int64_t) * maxSkipLevels); memset(this->skipInterval,0,sizeof(int32_t) * maxSkipLevels); memset(this->numSkipped,0,sizeof(int32_t) * maxSkipLevels); memset(this->skipDoc,0,sizeof(int32_t) * maxSkipLevels); memset(this->childPointer,0,sizeof(int32_t) * maxSkipLevels); this->numberOfLevelsToBuffer = 0; this->numberOfSkipLevels = 0; this->docCount = 0; this->lastDoc = 0; this->lastChildPointer = 0; this->haveSkipped = false; this->skipStream[0] = _skipStream; this->inputIsBuffered = _skipStream->instanceOf(BufferedIndexInput::getClassName()); this->skipInterval[0] = _skipInterval; for (int32_t i = 1; i < maxSkipLevels; i++) { // cache skip intervals this->skipInterval[i] = this->skipInterval[i - 1] * _skipInterval; } } MultiLevelSkipListReader::~MultiLevelSkipListReader(){ close(); _CLDELETE_LARRAY(skipPointer); _CLDELETE_LARRAY(childPointer); _CLDELETE_LARRAY(numSkipped); _CLDELETE_LARRAY(skipInterval); _CLDELETE_LARRAY(skipDoc); } int32_t MultiLevelSkipListReader::getDoc() const { return lastDoc; } int32_t MultiLevelSkipListReader::skipTo(const int32_t target) { if (!haveSkipped) { // first time, load skip levels loadSkipLevels(); haveSkipped = true; } // walk up the levels until highest level is found that has a skip // for this target int32_t level = 0; while (level < numberOfSkipLevels - 1 && target > skipDoc[level + 1]) { level++; } while (level >= 0) { if (target > skipDoc[level]) { if (!loadNextSkip(level)) { continue; } } else { // no more skips on this level, go down one level if (level > 0 && lastChildPointer > skipStream[level - 1]->getFilePointer()) { seekChild(level - 1); } level--; } } return numSkipped[0] - skipInterval[0] - 1; } bool MultiLevelSkipListReader::loadNextSkip(const int32_t level) { // we have to skip, the target document is greater than the current // skip list entry setLastSkipData(level); numSkipped[level] += skipInterval[level]; if (numSkipped[level] > docCount) { // this skip list is exhausted skipDoc[level] = LUCENE_INT32_MAX_SHOULDBE; if (numberOfSkipLevels > level) numberOfSkipLevels = level; return false; } // read next skip entry skipDoc[level] += readSkipData(level, skipStream[level]); if (level != 0) { // read the child pointer if we are not on the leaf level childPointer[level] = skipStream[level]->readVLong() + skipPointer[level - 1]; } return true; } void MultiLevelSkipListReader::seekChild(const int32_t level) { skipStream[level]->seek(lastChildPointer); numSkipped[level] = numSkipped[level + 1] - skipInterval[level + 1]; skipDoc[level] = lastDoc; if (level > 0) { childPointer[level] = skipStream[level]->readVLong() + skipPointer[level - 1]; } } void MultiLevelSkipListReader::close() { for (int32_t i = 1; i < maxNumberOfSkipLevels; i++) { if (skipStream[i] != NULL) { //skipStream[i]->close(); _CLDELETE(skipStream[i]); // ISH: We actually do need to nullify pointer here } } } void MultiLevelSkipListReader::init(const int64_t _skipPointer, const int32_t df) { this->skipPointer[0] = _skipPointer; this->docCount = df; memset(skipDoc,0,sizeof(int32_t) * maxNumberOfSkipLevels); memset(numSkipped,0,sizeof(int32_t) * maxNumberOfSkipLevels); memset(childPointer,0,sizeof(int64_t) * maxNumberOfSkipLevels); if ( numberOfSkipLevels > 1 ) { for (int i=1;i maxNumberOfSkipLevels) { numberOfSkipLevels = maxNumberOfSkipLevels; } skipStream[0]->seek(skipPointer[0]); int32_t toBuffer = numberOfLevelsToBuffer; for (int32_t i = numberOfSkipLevels - 1; i > 0; i--) { // the length of the current level int64_t length = skipStream[0]->readVLong(); // the start pointer of the current level skipPointer[i] = skipStream[0]->getFilePointer(); if (toBuffer > 0) { // buffer this level skipStream[i] = _CLNEW SkipBuffer(skipStream[0], (int32_t) length); toBuffer--; } else { // clone this stream, it is already at the start of the current level skipStream[i] = skipStream[0]->clone(); if (inputIsBuffered && length < BufferedIndexInput::BUFFER_SIZE) { ((BufferedIndexInput*) skipStream[i])->setBufferSize((int32_t) length); } // move base stream beyond the current level skipStream[0]->seek(skipStream[0]->getFilePointer() + length); } } // use base stream for the lowest level skipPointer[0] = skipStream[0]->getFilePointer(); } void MultiLevelSkipListReader::setLastSkipData(const int32_t level) { lastDoc = skipDoc[level]; lastChildPointer = childPointer[level]; } MultiLevelSkipListReader::SkipBuffer::SkipBuffer(IndexInput* input, const int32_t _length):pos(0) { data = _CL_NEWARRAY(uint8_t,_length); this->_datalength = _length; pointer = input->getFilePointer(); input->readBytes(data, _length); } MultiLevelSkipListReader::SkipBuffer::~SkipBuffer() { _CLLDELETE(data); } void MultiLevelSkipListReader::SkipBuffer::close() { _CLDELETE(data); _datalength=0; } int64_t MultiLevelSkipListReader::SkipBuffer::getFilePointer() const { return pointer + pos; } int64_t MultiLevelSkipListReader::SkipBuffer::length() const { return _datalength; } uint8_t MultiLevelSkipListReader::SkipBuffer::readByte() { return data[pos++]; } void MultiLevelSkipListReader::SkipBuffer::readBytes(uint8_t* b, const int32_t len) { memcpy(b,data+pos,len*sizeof(uint8_t)); pos += len; } void MultiLevelSkipListReader::SkipBuffer::seek(const int64_t _pos) { this->pos = static_cast(_pos - pointer); } const char* MultiLevelSkipListReader::SkipBuffer::getObjectName() const{ return getClassName(); } const char* MultiLevelSkipListReader::SkipBuffer::getClassName(){ return "MultiLevelSkipListReader::SkipBuffer"; } const char* MultiLevelSkipListReader::SkipBuffer::getDirectoryType() const{ return "SKIP"; } MultiLevelSkipListReader::SkipBuffer::SkipBuffer(const SkipBuffer& other): IndexInput(other) { data = _CL_NEWARRAY(uint8_t,other._datalength); memcpy(data,other.data,other._datalength * sizeof(uint8_t)); this->_datalength = other._datalength; this->pointer = other.pointer; this->pos = other.pos; } IndexInput* MultiLevelSkipListReader::SkipBuffer::clone() const{ return _CLNEW SkipBuffer(*this); } DefaultSkipListReader::DefaultSkipListReader(CL_NS(store)::IndexInput* _skipStream, const int32_t maxSkipLevels, const int32_t _skipInterval) : MultiLevelSkipListReader(_skipStream, maxSkipLevels, _skipInterval) { freqPointer = _CL_NEWARRAY(int64_t,maxSkipLevels); proxPointer = _CL_NEWARRAY(int64_t,maxSkipLevels); payloadLength = _CL_NEWARRAY(int32_t,maxSkipLevels); memset(freqPointer,0, sizeof(int64_t) * maxSkipLevels); memset(proxPointer,0, sizeof(int64_t) * maxSkipLevels); memset(payloadLength,0, sizeof(int32_t) * maxSkipLevels); this->lastFreqPointer = 0; this->lastProxPointer = 0; this->lastPayloadLength = 0; this->currentFieldStoresPayloads = false; } DefaultSkipListReader::~DefaultSkipListReader(){ _CLDELETE_LARRAY(freqPointer); _CLDELETE_LARRAY(proxPointer); _CLDELETE_LARRAY(payloadLength); } void DefaultSkipListReader::init(const int64_t _skipPointer, const int64_t freqBasePointer, const int64_t proxBasePointer, const int32_t df, const bool storesPayloads) { MultiLevelSkipListReader::init(_skipPointer, df); this->currentFieldStoresPayloads = storesPayloads; lastFreqPointer = freqBasePointer; lastProxPointer = proxBasePointer; for (int32_t j=0; jreadVInt(); if ((delta & 1) != 0) { payloadLength[level] = _skipStream->readVInt(); } delta = (int32_t)(((uint32_t)delta) >> (uint32_t)1); } else { delta = _skipStream->readVInt(); } freqPointer[level] += _skipStream->readVInt(); proxPointer[level] += _skipStream->readVInt(); return delta; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/SkipListWriter.cpp000066400000000000000000000155701154025176300240500ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_SkipListWriter.h" #include "CLucene/util/_Arrays.h" CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) void MultiLevelSkipListWriter::bufferSkip(int32_t df){ int32_t numLevels; // determine max level for (numLevels = 0; (df % skipInterval) == 0 && numLevels < numberOfSkipLevels; df /= skipInterval) { numLevels++; } int64_t childPointer = 0; for (int32_t level = 0; level < numLevels; level++) { writeSkipData(level, (*skipBuffer)[level]); int64_t newChildPointer = (*skipBuffer)[level]->getFilePointer(); if (level != 0) { // store child pointers for all levels except the lowest (*skipBuffer)[level]->writeVLong(childPointer); } //remember the childPointer for the next level childPointer = newChildPointer; } } int64_t MultiLevelSkipListWriter::writeSkip(IndexOutput* output){ int64_t skipPointer = output->getFilePointer(); if (skipBuffer == NULL || skipBuffer->length == 0) return skipPointer; for (int32_t level = numberOfSkipLevels - 1; level > 0; level--) { int64_t length = (*skipBuffer)[level]->getFilePointer(); if (length > 0) { output->writeVLong(length); (*skipBuffer)[level]->writeTo(output); } } (*skipBuffer)[0]->writeTo(output); return skipPointer; } MultiLevelSkipListWriter::MultiLevelSkipListWriter(int32_t skipInterval, int32_t maxSkipLevels, int32_t df) { this->skipBuffer = NULL; this->skipInterval = skipInterval; // calculate the maximum number of skip levels for this document frequency numberOfSkipLevels = df == 0 ? 0 : (int32_t) floor(log((float_t)df) / log((float_t)skipInterval)); // make sure it does not exceed maxSkipLevels if (numberOfSkipLevels > maxSkipLevels) { numberOfSkipLevels = maxSkipLevels; } } MultiLevelSkipListWriter::~MultiLevelSkipListWriter(){ _CLDELETE(skipBuffer); } void MultiLevelSkipListWriter::init() { skipBuffer = _CLNEW CL_NS(util)::ObjectArray(numberOfSkipLevels); for (int32_t i = 0; i < numberOfSkipLevels; i++) { skipBuffer->values[i] = _CLNEW RAMOutputStream; } } void MultiLevelSkipListWriter::resetSkip() { // creates new buffers or empties the existing ones if (skipBuffer == NULL) { init(); } else { for (size_t i = 0; i < skipBuffer->length; i++) { (*skipBuffer)[i]->reset(); } } } void DefaultSkipListWriter::setSkipData(int32_t doc, bool storePayloads, int32_t payloadLength) { this->curDoc = doc; this->curStorePayloads = storePayloads; this->curPayloadLength = payloadLength; this->curFreqPointer = freqOutput->getFilePointer(); this->curProxPointer = proxOutput->getFilePointer(); } void DefaultSkipListWriter::resetSkip() { MultiLevelSkipListWriter::resetSkip(); memset(lastSkipDoc, 0, numberOfSkipLevels * sizeof(int32_t) ); Arrays::fill(lastSkipPayloadLength, numberOfSkipLevels, -1); // we don't have to write the first length in the skip list Arrays::fill(lastSkipFreqPointer, numberOfSkipLevels, freqOutput->getFilePointer()); Arrays::fill(lastSkipProxPointer, numberOfSkipLevels, proxOutput->getFilePointer()); } void DefaultSkipListWriter::writeSkipData(int32_t level, IndexOutput* skipBuffer){ // To efficiently store payloads in the posting lists we do not store the length of // every payload. Instead we omit the length for a payload if the previous payload had // the same length. // However, in order to support skipping the payload length at every skip point must be known. // So we use the same length encoding that we use for the posting lists for the skip data as well: // Case 1: current field does not store payloads // SkipDatum --> DocSkip, FreqSkip, ProxSkip // DocSkip,FreqSkip,ProxSkip --> VInt // DocSkip records the document number before every SkipInterval th document in TermFreqs. // Document numbers are represented as differences from the previous value in the sequence. // Case 2: current field stores payloads // SkipDatum --> DocSkip, PayloadLength?, FreqSkip,ProxSkip // DocSkip,FreqSkip,ProxSkip --> VInt // PayloadLength --> VInt // In this case DocSkip/2 is the difference between // the current and the previous value. If DocSkip // is odd, then a PayloadLength encoded as VInt follows, // if DocSkip is even, then it is assumed that the // current payload length equals the length at the previous // skip point if (curStorePayloads) { int32_t delta = curDoc - lastSkipDoc[level]; if (curPayloadLength == lastSkipPayloadLength[level]) { // the current payload length equals the length at the previous skip point, // so we don't store the length again skipBuffer->writeVInt(delta * 2); } else { // the payload length is different from the previous one. We shift the DocSkip, // set the lowest bit and store the current payload length as VInt. skipBuffer->writeVInt(delta * 2 + 1); skipBuffer->writeVInt(curPayloadLength); lastSkipPayloadLength[level] = curPayloadLength; } } else { // current field does not store payloads skipBuffer->writeVInt(curDoc - lastSkipDoc[level]); } skipBuffer->writeVInt((int32_t) (curFreqPointer - lastSkipFreqPointer[level])); skipBuffer->writeVInt((int32_t) (curProxPointer - lastSkipProxPointer[level])); lastSkipDoc[level] = curDoc; //System.out.println("write doc at level " + level + ": " + curDoc); lastSkipFreqPointer[level] = curFreqPointer; lastSkipProxPointer[level] = curProxPointer; } DefaultSkipListWriter::DefaultSkipListWriter(int32_t skipInterval, int32_t numberOfSkipLevels, int32_t docCount, IndexOutput* freqOutput, IndexOutput* proxOutput): MultiLevelSkipListWriter(skipInterval, numberOfSkipLevels, docCount) { this->freqOutput = freqOutput; this->proxOutput = proxOutput; this->curDoc = this->curPayloadLength = 0; this->curFreqPointer =this->curProxPointer = 0; lastSkipDoc = _CL_NEWARRAY(int32_t,numberOfSkipLevels); lastSkipPayloadLength = _CL_NEWARRAY(int32_t,numberOfSkipLevels); lastSkipFreqPointer = _CL_NEWARRAY(int64_t,numberOfSkipLevels); lastSkipProxPointer = _CL_NEWARRAY(int64_t,numberOfSkipLevels); } DefaultSkipListWriter::~DefaultSkipListWriter(){ _CLDELETE_ARRAY(lastSkipDoc); _CLDELETE_ARRAY(lastSkipPayloadLength); _CLDELETE_ARRAY(lastSkipFreqPointer); _CLDELETE_ARRAY(lastSkipProxPointer); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/Term.cpp000066400000000000000000000162111154025176300220110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Term.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/Misc.h" CL_NS_USE(util) CL_NS_DEF(index) Term::Term(){ //Intern fld and assign it to field _field = LUCENE_BLANK_STRING; internF = false; cachedHashCode = 0; textLen = 0; //Duplicate txt and assign it to text #ifdef LUCENE_TERM_TEXT_LENGTH _text[0]=0; #else _text = STRDUP_TtoT(LUCENE_BLANK_STRING); textLenBuf = 0; #endif textLen = 0; } Term::Term(const TCHAR* fld, const TCHAR* txt, bool internField){ //Func - Constructor. // Constructs a Term with the given field and text. Field and text are not copied // Field and text are deleted in destructor only if intern is false. //Pre - fld != NULL and contains the name of the field // txt != NULL and contains the value of the field // internF is true or false and indicates if term Field is interned or not // internT is true or false and indicates if term Text is interned or not // canDelete defaults to true but can be false and indicates to the IGarbageCollector that the Term can be deleted when finalized //Post - An instance of Term has been created.Field and txt have not been copied but assigned _field = LUCENE_BLANK_STRING; internF = false; textLen = 0; #ifdef LUCENE_TERM_TEXT_LENGTH _text[0]=0; #else _text = STRDUP_TtoT(LUCENE_BLANK_STRING); textLenBuf = 0; #endif set(fld,txt,internField); } Term::Term(const Term* fieldTerm, const TCHAR* txt){ _field = LUCENE_BLANK_STRING; internF = false; textLen = 0; #ifdef LUCENE_TERM_TEXT_LENGTH _text[0]=0; #else _text = STRDUP_TtoT(LUCENE_BLANK_STRING); textLenBuf = 0; #endif set(fieldTerm,txt); } Term::Term(const TCHAR* fld, const TCHAR* txt){ _field = LUCENE_BLANK_STRING; internF = false; textLen = 0; #ifdef LUCENE_TERM_TEXT_LENGTH _text[0]=0; #else _text = STRDUP_TtoT(LUCENE_BLANK_STRING); textLenBuf = 0; #endif set(fld,txt); } Term::~Term(){ //Func - Destructor. //Pre - true //Post - The instance has been destroyed. field and text have been deleted if pre(intrn) is false //Unintern field if ( internF ) CLStringIntern::unintern(_field); _field = NULL; #ifndef LUCENE_TERM_TEXT_LENGTH //Deletetext if it is the owner _CLDELETE_CARRAY( _text ); #endif } const TCHAR* Term::field() const { //Func - Returns the field of this term, an interned string. The field indicates // the part of a document which this term came from. //Pre - true //Post - field has been returned return _field; } const TCHAR* Term::text() const { //Func - Returns the text of this term. In the case of words, this is simply the // text of the word. In the case of dates and other types, this is an // encoding of the object as a string. //Pre - true //Post - text has been returned return _text; } void Term::set(const Term* term, const TCHAR* txt){ set(term->field(),txt,false); } void Term::set(const TCHAR* fld, const TCHAR* txt,const bool internField){ //Func - Resets the field and text of a Term. //Pre - fld != NULL and contains the name of the field // txt != NULL and contains the value of the field // internF is true or false // internT is true or false //Post - field and text of Term have been reset CND_PRECONDITION(fld != NULL, "fld contains NULL"); CND_PRECONDITION(txt != NULL, "txt contains NULL"); //save field for unintern later const TCHAR* oldField = _field; //bool oldInternF = internF; //Not used cachedHashCode = 0; textLen = _tcslen(txt); //Delete text if it is the owner #ifdef LUCENE_TERM_TEXT_LENGTH if ( textLen > LUCENE_TERM_TEXT_LENGTH ) textLen = LUCENE_TERM_TEXT_LENGTH; _tcsncpy(_text,txt,textLen+1); _text[textLen]=0; #else //if the term text buffer is bigger than what we have if ( _text && textLen > textLenBuf){ _CLDELETE_ARRAY( _text ); textLenBuf = 0; } if ( _text==NULL ){ //duplicate the text _text = stringDuplicate(txt); textLenBuf = textLen; }else{ //re-use the buffer _tcscpy(_text,txt); } #endif //Set Term Field if ( internField ) _field = CLStringIntern::intern(fld); else _field = fld; //unintern old field after interning new one, if ( internF ) CLStringIntern::unintern(oldField); internF = internField; CND_PRECONDITION(_tcscmp(fld, _field)==0,"field not equal"); } /** Compares two terms, returning true iff they have the same field and text. */ bool Term::equals(const Term* other) const{ if (other == this) return true; if (other == NULL) return false; if ( cachedHashCode != 0 && other->cachedHashCode != 0 && other->cachedHashCode != cachedHashCode ) return false; if ( _field==other->_field ){ //this can be quicker than using compareTo, because checks //field length first if ( textLen == other->textLen ){ return (_tcscmp(_text,other->_text)==0); }else return false; }else return false; } size_t Term::hashCode(){ if ( cachedHashCode == 0 ) cachedHashCode = Misc::thashCode(_field) + Misc::thashCode(_text,textLen); return cachedHashCode; } size_t Term::textLength() const { return textLen; } int32_t Term::compareTo(const Term* other) const { //Func - Compares two terms, to see if this term belongs before,is equal to or after // after the argument term. //Pre - other is a reference to another term //Post - A negative integer is returned if this term belongs before the argument, // zero is returned if this term is equal to the argument, and a positive integer // if this term belongs after the argument. //Check ret to see if text needs to be compared if ( _field == other->_field ){ // fields are interned //Compare text with text of other and return the result return _tcscmp(_text,other->_text); }else{ int32_t ret = _tcscmp(_field,other->_field); if ( ret == 0 ){ return _tcscmp(_text,other->_text); }else{ return ret; } } } int32_t Term::hashedCompareTo(Term* other) { size_t hc1 = this->hashCode(); size_t hc2 = other->hashCode(); if ( hc1 == hc2 ) return compareTo(other); else if ( hc1 > hc2 ) return -1; else return 1; } TCHAR* Term::toString() const{ //Func - Forms the contents of Field and term in some kind of tuple notation // //Pre - true //Post - a string formatted as is returned if pre(field) is NULL and // text is NULL the returned string will be formatted as <:> // Note: Should this representation ever change, make sure to update Query and Filter classes // that may be using this format without calling toString (to save on memory allocations) // For example: PrefixFilter::toString() return CL_NS(util)::Misc::join( _field, _T(":"), _text); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/Term.h000066400000000000000000000114441154025176300214610ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_Term_ #define _lucene_index_Term_ CL_NS_DEF(index) /** A Term represents a word from text. This is the unit of search. It is composed of two elements, the text of the word, as a string, and the name of the field that the text occured in, an interned string. Note that terms may represent more than words from text fields, but also things like dates, email addresses, urls, etc. IMPORTANT NOTE: Term inherits from the template class LUCENE_REFBASE which tries to do some garbage collection by counting the references an instance has. As a result of this construction you MUST use _CLDECDELETE(obj) when you want to delete an of Term! ABOUT intrn intrn indicates if field and text are interned or not. Interning of Strings is the process of converting duplicated strings to shared ones. */ class CLUCENE_EXPORT Term:LUCENE_REFBASE { private: size_t cachedHashCode; const TCHAR* _field; //CLStringIntern::iterator fielditr; #ifdef LUCENE_TERM_TEXT_LENGTH TCHAR _text[LUCENE_TERM_TEXT_LENGTH+1]; #else TCHAR* _text; size_t textLenBuf; //a cache of text len, this allows for a preliminary comparison of text lengths //bool dupT; //Indicates if Term Text is duplicated (and therefore must be deleted). #endif size_t textLen; //a cache of text len, this allows for a preliminary comparison of text lengths bool internF; //Indicates if Term Field is interned(and therefore must be uninternd). public: //uses the specified fieldTerm's field. this saves on intern'ing time. /** Constructs a Term with the given field and text. *

Note that a null field or null text value results in undefined * behavior for most Lucene APIs that accept a Term parameter. */ Term(const Term* fieldTerm, const TCHAR* txt); /** Constructs a blank term */ Term(); /** Constructs a Term with the given field and text. *

Note that a null field or null text value results in undefined * behavior for most Lucene APIs that accept a Term parameter. */ Term(const TCHAR* fld, const TCHAR* txt, bool internField); /** * Constructor. Constructs a Term with the given field and text. Field and text are not copied * Field and text are deleted in destructor only if intern is false. *

Note that a null field or null text value results in undefined * behavior for most Lucene APIs that accept a Term parameter. */ Term(const TCHAR* fld, const TCHAR* txt); ///Destructor. ~Term(); ///Returns the field of this term, an interned string. The field indicates ///the part of a document which this term came from. const TCHAR* field() const; /// TCHAR* toString() const; size_t hashCode(); }; class Term_UnorderedCompare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: bool operator()( Term* t1, Term* t2 ) const{ return ( t1->hashedCompareTo(t2) < 0 ); } size_t operator()( Term* t ) const{ return t->hashCode(); } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/TermInfo.cpp000066400000000000000000000063751154025176300226370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_TermInfo.h" CL_NS_DEF(index) TermInfo::TermInfo(){ //Func - Constructor //Pre - true //Post - Instance has been created docFreq = 0; freqPointer = 0; proxPointer = 0; skipOffset = 0; } TermInfo::~TermInfo(){ //Func - Destructor. //Pre - true //Post - Instance has been destroyed } TermInfo::TermInfo(const int32_t df, const int64_t fp, const int64_t pp){ //Func - Constructor. //Pre - df >= 0, fp >= 0 pp >= 0 //Post - An instance has been created with FreqPointer = fp, proxPointer=pp and docFreq= df CND_PRECONDITION(df >= 0, "df contains negative number"); CND_PRECONDITION(fp >= 0, "fp contains negative number"); CND_PRECONDITION(pp >= 0, "pp contains negative number"); freqPointer = fp; proxPointer = pp; docFreq = df; skipOffset = 0; } TermInfo::TermInfo(const TermInfo* ti) { //Func - Constructor. // Initialises this instance by copying the values of another TermInfo ti //Pre - ti is a reference to another TermInfo // ti->docFreq >= 0 // ti->freqPointer >= 0 // ti->proxPointer >= 0 //Post - Values of ti have been copied to the values of this Instance. CND_PRECONDITION(ti->docFreq >= 0, "ti->docFreq contains negative number"); CND_PRECONDITION(ti->freqPointer >= 0, "ti->freqPointer contains negative number"); CND_PRECONDITION(ti->proxPointer >= 0, "ti->proxPointer contains negative number"); docFreq = ti->docFreq; freqPointer = ti->freqPointer; proxPointer = ti->proxPointer; skipOffset = ti->skipOffset; } void TermInfo::set(const int32_t df, const int64_t fp, const int64_t pp, int32_t so) { //Func - Sets a new document frequency, a new freqPointer and a new proxPointer //Pre - df >= 0, fp >= 0 pp >= 0 //Post - The new document frequency, a new freqPointer and a new proxPointer // have been set CND_PRECONDITION(df >= 0, "df contains negative number"); CND_PRECONDITION(fp >= 0, "fp contains negative number"); CND_PRECONDITION(pp >= 0, "pp contains negative number"); docFreq = df; freqPointer = fp; proxPointer = pp; skipOffset = so; } void TermInfo::set(const TermInfo* ti) { //Func - Sets a new document frequency, a new freqPointer and a new proxPointer // by copying these values from another instance of TermInfo //Pre - ti is a reference to another TermInfo // ti->docFreq >= 0 // ti->freqPointer >= 0 // ti->proxPointer >= 0 //Post - Values of ti have been copied to the values of this Instance. CND_PRECONDITION(ti->docFreq >= 0, "ti->docFreq contains negative number"); CND_PRECONDITION(ti->freqPointer >= 0, "ti->freqPointer contains negative number"); CND_PRECONDITION(ti->proxPointer >= 0, "ti->proxPointer contains negative number"); docFreq = ti->docFreq; freqPointer = ti->freqPointer; proxPointer = ti->proxPointer; skipOffset = ti->skipOffset; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/TermInfosReader.cpp000066400000000000000000000362611154025176300241420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Term.h" #include "Terms.h" #include "CLucene/util/Misc.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexInput.h" #include "_TermInfo.h" #include "_FieldInfos.h" #include "_SegmentTermEnum.h" #include "_FieldInfos.h" #include "_TermInfo.h" #include "_TermInfosWriter.h" #include "_TermInfosReader.h" CL_NS_USE(store) CL_NS_USE(util) CL_NS_DEF(index) TermInfosReader::TermInfosReader(Directory* dir, const char* seg, FieldInfos* fis, const int32_t readBufferSize): directory (dir),fieldInfos (fis), indexTerms(NULL), indexInfos(NULL), indexPointers(NULL), indexDivisor(1) { //Func - Constructor. // Reads the TermInfos file (.tis) and eventually the Term Info Index file (.tii) //Pre - dir is a reference to a valid Directory // Fis contains a valid reference to an FieldInfos instance // seg != NULL and contains the name of the segment //Post - An instance has been created and the index named seg has been read. (Remember // a segment is nothing more then an independently readable index) CND_PRECONDITION(seg != NULL, "seg is NULL"); //Initialize the name of the segment segment = seg; //Create a filname fo a Term Info File string tisFile = Misc::segmentname(segment,".tis"); string tiiFile = Misc::segmentname(segment,".tii"); bool success = false; origEnum = indexEnum = NULL; _size = indexTermsLength = totalIndexInterval = 0; try { //Create an SegmentTermEnum for storing all the terms read of the segment origEnum = _CLNEW SegmentTermEnum( directory->openInput( tisFile.c_str(), readBufferSize ), fieldInfos, false); _size = origEnum->size; totalIndexInterval = origEnum->indexInterval; indexEnum = _CLNEW SegmentTermEnum( directory->openInput( tiiFile.c_str(), readBufferSize ), fieldInfos, true); //Check if enumerator points to a valid instance CND_CONDITION(origEnum != NULL, "No memory could be allocated for orig enumerator"); CND_CONDITION(indexEnum != NULL, "No memory could be allocated for index enumerator"); success = true; } _CLFINALLY({ // With lock-less commits, it's entirely possible (and // fine) to hit a FileNotFound exception above. In // this case, we want to explicitly close any subset // of things that were opened so that we don't have to // wait for a GC to do so. if (!success) { close(); } }); } TermInfosReader::~TermInfosReader(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed //Close the TermInfosReader to be absolutly sure that enumerator has been closed //and the arrays indexTerms, indexPointers and indexInfos and their elements //have been destroyed close(); } int32_t TermInfosReader::getSkipInterval() const { return origEnum->skipInterval; } int32_t TermInfosReader::getMaxSkipLevels() const { return origEnum->maxSkipLevels; } void TermInfosReader::setIndexDivisor(const int32_t _indexDivisor) { if (indexDivisor < 1) _CLTHROWA(CL_ERR_IllegalArgument, "indexDivisor must be > 0"); if (indexTerms != NULL) _CLTHROWA(CL_ERR_IllegalArgument, "index terms are already loaded"); this->indexDivisor = _indexDivisor; totalIndexInterval = origEnum->indexInterval * _indexDivisor; } int32_t TermInfosReader::getIndexDivisor() const { return indexDivisor; } void TermInfosReader::close() { //Check if indexTerms and indexInfos exist if (indexTerms && indexInfos){ //Iterate through arrays indexTerms and indexPointer to //destroy their elements #ifdef _DEBUG for ( int32_t i=0; iclose(); //Get a pointer to IndexInput used by the enumeration but //instantiated in the constructor by directory.open( tisFile ) IndexInput *is = origEnum->input; //Delete the enumuration enumerator _CLDELETE(origEnum); //Delete the IndexInput _CLDELETE(is); } if (indexEnum != NULL){ indexEnum->close(); //Get a pointer to IndexInput used by the enumeration but //instantiated in the constructor by directory.open( tiiFile ) IndexInput *is = indexEnum->input; //Delete the enumuration enumerator _CLDELETE(indexEnum); //Delete the IndexInput _CLDELETE(is); } enumerators.setNull(); } int64_t TermInfosReader::size() const{ //Func - Return the size of the enumeration of TermInfos //Pre - true //Post - size has been returened return _size; } Term* TermInfosReader::get(const int32_t position) { //Func - Returns the nth term in the set //Pre - position > = 0 //Post - The n-th term in the set has been returned //Check if the size is 0 because then there are no terms if (_size == 0) return NULL; SegmentTermEnum* enumerator = getEnum(); if ( enumerator != NULL //an enumeration exists && enumerator->term(false) != NULL // term is at or past current && position >= enumerator->position && position < (enumerator->position + totalIndexInterval) ) { return scanEnum(position); // can avoid seek } //random-access: must seek seekEnum(position / totalIndexInterval); //Get the Term at position return scanEnum(position); } SegmentTermEnum* TermInfosReader::getEnum(){ SegmentTermEnum* termEnum = enumerators.get(); if (termEnum == NULL){ termEnum = terms(); enumerators.set(termEnum); } return termEnum; } TermInfo* TermInfosReader::get(const Term* term){ //Func - Returns a TermInfo for a term //Pre - term holds a valid reference to term //Post - if term can be found its TermInfo has been returned otherwise NULL //If the size of the enumeration is 0 then no Terms have been read if (_size == 0) return NULL; ensureIndexIsRead(); // optimize sequential access: first try scanning cached enum w/o seeking SegmentTermEnum* enumerator = getEnum(); // optimize sequential access: first try scanning cached enumerator w/o seeking if ( //the current term of the enumeration enumerator is not at the end AND enumerator->term(false) != NULL && ( //there exists a previous current called prev and term is positioned after this prev OR ( enumerator->prev != NULL && term->compareTo(enumerator->prev) > 0) || //term is positioned at the same position as the current of enumerator or at a higher position term->compareTo(enumerator->term(false)) >= 0 ) ) { //Calculate the offset for the position int32_t _enumOffset = (int32_t)(enumerator->position/totalIndexInterval)+1; // but before end of block if ( //the length of indexTerms (the number of terms in enumerator) equals //_enum_offset OR indexTermsLength == _enumOffset || //term is positioned in front of term found at _enumOffset in indexTerms term->compareTo(&indexTerms[_enumOffset]) < 0){ //no need to seek, retrieve the TermInfo for term return scanEnum(term); } } //Reposition current term in the enumeration seekEnum(getIndexOffset(term)); //Return the TermInfo for term return scanEnum(term); } int64_t TermInfosReader::getPosition(const Term* term) { //Func - Returns the position of a Term in the set //Pre - term holds a valid reference to a Term // enumerator != NULL //Post - If term was found then its position is returned otherwise -1 //if the enumeration is empty then return -1 if (_size == 0) return -1; ensureIndexIsRead(); //Retrieve the indexOffset for term int32_t indexOffset = getIndexOffset(term); seekEnum(indexOffset); SegmentTermEnum* enumerator = getEnum(); while(term->compareTo(enumerator->term(false)) > 0 && enumerator->next()) {} if ( term->equals(enumerator->term(false)) ){ return enumerator->position; }else return -1; } SegmentTermEnum* TermInfosReader::terms(const Term* term) { //Func - Returns an enumeration of terms starting at or after the named term. // If term is null then enumerator is set to the beginning //Pre - term holds a valid reference to a Term // enumerator != NULL //Post - An enumeration of terms starting at or after the named term has been returned SegmentTermEnum* enumerator = NULL; if ( term != NULL ){ //Seek enumerator to term; delete the new TermInfo that's returned. TermInfo* ti = get(term); _CLLDELETE(ti); enumerator = getEnum(); }else enumerator = origEnum; //Clone the entire enumeration SegmentTermEnum* cln = enumerator->clone(); //Check if cln points to a valid instance CND_CONDITION(cln != NULL,"cln is NULL"); return cln; } void TermInfosReader::ensureIndexIsRead() { //Func - Reads the term info index file or .tti file. // This file contains every IndexInterval-th entry from the .tis file, // along with its location in the "tis" file. This is designed to be read entirely // into memory and used to provide random access to the "tis" file. //Pre - indexTerms = NULL // indexInfos = NULL // indexPointers = NULL //Post - The term info index file has been read into memory SCOPED_LOCK_MUTEX(THIS_LOCK) if ( indexTerms != NULL ) return; try { indexTermsLength = (size_t)indexEnum->size; //Instantiate an block of Term's,so that each one doesn't have to be new'd indexTerms = new Term[indexTermsLength]; CND_CONDITION(indexTerms != NULL,"No memory could be allocated for indexTerms");//Check if is indexTerms is a valid array //Instantiate an big block of TermInfo's, so that each one doesn't have to be new'd indexInfos = _CL_NEWARRAY(TermInfo,indexTermsLength); CND_CONDITION(indexInfos != NULL,"No memory could be allocated for indexInfos"); //Check if is indexInfos is a valid array //Instantiate an array indexPointers that contains pointers to the term info index file indexPointers = _CL_NEWARRAY(int64_t,indexTermsLength); CND_CONDITION(indexPointers != NULL,"No memory could be allocated for indexPointers");//Check if is indexPointers is a valid array //Iterate through the terms of indexEnum for (int32_t i = 0; indexEnum->next(); ++i){ indexTerms[i].set(indexEnum->term(false),indexEnum->term(false)->text()); indexEnum->getTermInfo(&indexInfos[i]); indexPointers[i] = indexEnum->indexPointer; for (int32_t j = 1; j < indexDivisor; j++) if (!indexEnum->next()) break; } }_CLFINALLY( indexEnum->close(); //Close and delete the IndexInput is. The close is done by the destructor. _CLDELETE( indexEnum->input ); _CLDELETE( indexEnum ); ); } int32_t TermInfosReader::getIndexOffset(const Term* term){ //Func - Returns the offset of the greatest index entry which is less than or equal to term. //Pre - term holds a reference to a valid term // indexTerms != NULL //Post - The new offset has been returned //Check if is indexTerms is a valid array CND_PRECONDITION(indexTerms != NULL,"indexTerms is NULL"); int32_t lo = 0; int32_t hi = indexTermsLength - 1; int32_t mid; int32_t delta; while (hi >= lo) { //Start in the middle betwee hi and lo mid = (lo + hi) >> 1; //Check if is indexTerms[mid] is a valid instance of Term CND_PRECONDITION(&indexTerms[mid] != NULL,"indexTerms[mid] is NULL"); CND_PRECONDITION(mid < indexTermsLength,"mid >= indexTermsLength"); //Determine if term is before mid or after mid delta = term->compareTo(&indexTerms[mid]); if (delta < 0){ //Calculate the new hi hi = mid - 1; }else if (delta > 0){ //Calculate the new lo lo = mid + 1; }else{ //term has been found so return its position return mid; } } // the new starting offset return hi; } void TermInfosReader::seekEnum(const int32_t indexOffset) { //Func - Reposition the current Term and TermInfo to indexOffset //Pre - indexOffset >= 0 // indexTerms != NULL // indexInfos != NULL // indexPointers != NULL //Post - The current Term and Terminfo have been repositioned to indexOffset CND_PRECONDITION(indexOffset >= 0, "indexOffset contains a negative number"); CND_PRECONDITION(indexTerms != NULL, "indexTerms is NULL"); CND_PRECONDITION(indexInfos != NULL, "indexInfos is NULL"); CND_PRECONDITION(indexPointers != NULL, "indexPointers is NULL"); SegmentTermEnum* enumerator = getEnum(); enumerator->seek( indexPointers[indexOffset], (indexOffset * totalIndexInterval) - 1, &indexTerms[indexOffset], &indexInfos[indexOffset] ); } TermInfo* TermInfosReader::scanEnum(const Term* term) { //Func - Scans the Enumeration of terms for term and returns the corresponding TermInfo instance if found. // The search is started from the current term. //Pre - term contains a valid reference to a Term // enumerator != NULL //Post - if term has been found the corresponding TermInfo has been returned otherwise NULL // has been returned SegmentTermEnum* enumerator = getEnum(); enumerator->scanTo(term); //Check if the at the position the Term term can be found if (enumerator->term(false) != NULL && term->equals(enumerator->term(false)) ){ //Return the TermInfo instance about term return enumerator->getTermInfo(); }else{ //term was not found so no TermInfo can be returned return NULL; } } Term* TermInfosReader::scanEnum(const int32_t position) { //Func - Scans the enumeration to the requested position and returns the // Term located at that position //Pre - position > = 0 // enumerator != NULL //Post - The Term at the requested position has been returned SegmentTermEnum* enumerator = getEnum(); //As long the position of the enumeration enumerator is smaller than the requested one while(enumerator->position < position){ //Move the current of enumerator to the next if (!enumerator->next()){ //If there is no next it means that the requested position was to big return NULL; } } //Return the Term a the requested position return enumerator->term(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/TermInfosWriter.cpp000066400000000000000000000211121154025176300242010ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexOutput.h" #include "CLucene/util/Misc.h" #include "Term.h" #include "_TermInfo.h" #include "IndexWriter.h" #include "_FieldInfos.h" #include "_TermInfosWriter.h" #include CL_NS_USE(util) CL_NS_USE(store) CL_NS_DEF(index) TermInfosWriter::TermInfosWriter(Directory* directory, const char* segment, FieldInfos* fis, int32_t interval): fieldInfos(fis){ //Func - Constructor //Pre - directory contains a valid reference to a Directory // segment != NULL // fis contains a valid reference to a reference FieldInfos //Post - The instance has been created CND_PRECONDITION(segment != NULL, "segment is NULL"); //Initialize instance initialise(directory,segment,interval, false); other = _CLNEW TermInfosWriter(directory, segment,fieldInfos, interval, true); CND_CONDITION(other != NULL, "other is NULL"); other->other = this; } TermInfosWriter::TermInfosWriter(Directory* directory, const char* segment, FieldInfos* fis, int32_t interval, bool isIndex): fieldInfos(fis){ //Func - Constructor //Pre - directory contains a valid reference to a Directory // segment != NULL // fis contains a valid reference to a reference FieldInfos // isIndex is true or false //Post - The instance has been created CND_PRECONDITION(segment != NULL, "segment is NULL"); initialise(directory,segment,interval,isIndex); } void TermInfosWriter::initialise(Directory* directory, const char* segment, int32_t interval, bool IsIndex){ //Func - Helps constructors to initialize Instance //Pre - directory contains a valid reference to a Directory // segment != NULL // fis contains a valid reference to a reference FieldInfos //Post - The instance has been initialized maxSkipLevels = 10; lastTermTextLength = 0; lastFieldNumber = -1; lastTi = _CLNEW TermInfo(); CND_CONDITION(lastTi != NULL, "Could not allocate memory for lastTi"); lastIndexPointer = 0; size = 0; isIndex = IsIndex; indexInterval = interval; skipInterval = TermInfosWriter::DEFAULT_TERMDOCS_SKIP_INTERVAL; output = directory->createOutput( Misc::segmentname(segment, (isIndex ? ".tii" : ".tis")).c_str() ); output->writeInt(FORMAT); // write format output->writeLong(0); // leave space for size output->writeInt(indexInterval);// write indexInterval output->writeInt(skipInterval); // write skipInterval output->writeInt(maxSkipLevels); // write maxSkipLevels //Set other to NULL by Default other = NULL; } TermInfosWriter::~TermInfosWriter(){ //Func - Destructor //Pre - true //Post - de instance has been destroyed close(); } void TermInfosWriter::add(Term* term, TermInfo* ti){ const size_t length = term->textLength(); if ( termTextBuffer.values == NULL || termTextBuffer.length < length ){ termTextBuffer.resize( (int32_t)(length*1.25) ); } _tcsncpy(termTextBuffer.values, term->text(), length); add(fieldInfos->fieldNumber(term->field()), termTextBuffer.values, length, ti); } // Currently used only by assert statement int32_t TermInfosWriter::compareToLastTerm(int32_t fieldNumber, const TCHAR* termText, int32_t length) { int32_t pos = 0; if (lastFieldNumber != fieldNumber) { const int32_t cmp = _tcscmp(fieldInfos->fieldName(lastFieldNumber), fieldInfos->fieldName(fieldNumber)); // If there is a field named "" (empty string) then we // will get 0 on this comparison, yet, it's "OK". But // it's not OK if two different field numbers map to // the same name. if (cmp != 0 || lastFieldNumber != -1) return cmp; } //TODO: is this just a _tcsncmp??? while(pos < length && pos < lastTermTextLength) { const TCHAR c1 = lastTermText[pos]; const TCHAR c2 = termText[pos]; if (c1 < c2) return -1; else if (c1 > c2) return 1; pos++; } if (pos < lastTermTextLength) // Last term was longer return 1; else if (pos < length) // Last term was shorter return -1; else return 0; } void TermInfosWriter::add(int32_t fieldNumber, const TCHAR* termText, int32_t termTextLength, const TermInfo* ti) { //Func - Writes a Term and TermInfo to the outputstream //Pre - Term must be lexicographically greater than all previous Terms added. // Pointers of TermInfo ti (freqPointer and proxPointer) must be positive and greater than all previous. // TODO: This is a hack. If _ASCII is defined, Misc::toString(const TCHAR*, int) will cause linking errors, // at least on VS. Needs a prettier fix no doubt... ISH 2009-11-08 #ifdef _ASCII assert(compareToLastTerm(fieldNumber, termText, termTextLength) < 0 || (isIndex && termTextLength == 0 && lastTermTextLength == 0)); #else CND_PRECONDITION(compareToLastTerm(fieldNumber, termText, termTextLength) < 0 || (isIndex && termTextLength == 0 && lastTermTextLength == 0), (string("Terms are out of order: field=") + Misc::toString(fieldInfos->fieldName(fieldNumber)) + " (number " + Misc::toString(fieldNumber) + ")" + " lastField=" + Misc::toString(fieldInfos->fieldName(lastFieldNumber)) + " (number " + Misc::toString(lastFieldNumber) + ")" + " text=" + Misc::toString(termText, termTextLength) + " lastText=" + Misc::toString(lastTermText.values, lastTermTextLength) ).c_str() ); #endif CND_PRECONDITION(ti->freqPointer >= lastTi->freqPointer, ("freqPointer out of order (" + Misc::toString(ti->freqPointer) + " < " + Misc::toString(lastTi->freqPointer) + ")").c_str()); CND_PRECONDITION(ti->proxPointer >= lastTi->proxPointer, ("proxPointer out of order (" + Misc::toString(ti->proxPointer) + " < " + Misc::toString(lastTi->proxPointer) + ")").c_str()); if (!isIndex && size % indexInterval == 0){ //add an index term other->add(lastFieldNumber, lastTermText.values, lastTermTextLength, lastTi); // add an index term } //write term writeTerm(fieldNumber, termText, termTextLength); // write doc freq output->writeVInt(ti->docFreq); //write pointers output->writeVLong(ti->freqPointer - lastTi->freqPointer); output->writeVLong(ti->proxPointer - lastTi->proxPointer); if (ti->docFreq >= skipInterval) { output->writeVInt(ti->skipOffset); } if (isIndex){ output->writeVLong(other->output->getFilePointer() - lastIndexPointer); lastIndexPointer = other->output->getFilePointer(); // write pointer } if (lastTermText.length < termTextLength || lastTermText.length == 0){ lastTermText.resize( (int32_t)cl_max(10.0,termTextLength*1.25) ); } if ( termText != NULL ) _tcsncpy(lastTermText.values,termText,termTextLength); else lastTermText.values[0] = 0; lastTermTextLength = termTextLength; lastFieldNumber = fieldNumber; lastTi->set(ti); size++; } void TermInfosWriter::close() { //Func - Closes the TermInfosWriter //Pre - true //Post - The TermInfosWriter has been closed if (output){ //write size at start output->seek(4); // write size after format output->writeLong(size); output->close(); _CLDELETE(output); if (!isIndex){ if(other){ other->close(); _CLDELETE( other ); } } _CLDELETE(lastTi); } } void TermInfosWriter::writeTerm(int32_t fieldNumber, const TCHAR* termText, int32_t termTextLength){ // Compute prefix in common with last term: int32_t start = 0; const int32_t limit = termTextLength < lastTermTextLength ? termTextLength : lastTermTextLength; while(start < limit) { if (termText[start] != lastTermText.values[start]) break; start++; } int32_t length = termTextLength - start; output->writeVInt(start); // write shared prefix length output->writeVInt(length); // write delta length output->writeChars(termText+start, length); // write delta chars output->writeVInt(fieldNumber); // write field num } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/TermVector.h000066400000000000000000000127611154025176300226470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_termvector_h #define _lucene_index_termvector_h //#include "FieldInfos.h" #include "CLucene/util/Array.h" CL_NS_DEF(index) class TermPositionVector; /** Provides access to stored term vector of * a document field. The vector consists of the name of the field, an array of the terms tha occur in the field of the * {@link org.apache.lucene.document.Document} and a parallel array of frequencies. Thus, getTermFrequencies()[5] corresponds with the * frequency of getTerms()[5], assuming there are at least 5 terms in the Document. */ class CLUCENE_EXPORT TermFreqVector:LUCENE_BASE { public: virtual ~TermFreqVector(){ } /** * The Field name. * @return The name of the field this vector is associated with. * */ virtual const TCHAR* getField() = 0; /** * @return The number of terms in the term vector. */ virtual int32_t size() = 0; /** * @return An Array of term texts in ascending order. */ virtual const CL_NS(util)::ArrayBase* getTerms() = 0; /** Array of term frequencies. Locations of the array correspond one to one * to the terms in the array obtained from getTerms * method. Each location in the array contains the number of times this * term occurs in the document or the document field. * * The size of the returned array is size() * @memory Returning a pointer to internal data. Do not delete. */ virtual const CL_NS(util)::ArrayBase* getTermFrequencies() = 0; /** Return an index in the term numbers array returned from * getTerms at which the term with the specified * term appears. If this term does not appear in the array, * return -1. */ virtual int32_t indexOf(const TCHAR* term) = 0; /** Just like indexOf(int32_t) but searches for a number of terms * at the same time. Returns an array that has the same size as the number * of terms searched for, each slot containing the result of searching for * that term number. * * @param terms array containing terms to look for * @param start index in the array where the list of terms starts * @param len the number of terms in the list */ virtual CL_NS(util)::ArrayBase* indexesOf(const CL_NS(util)::ArrayBase& terms, const int32_t start, const int32_t len) = 0; /** Solve the diamond inheritence problem by providing a reinterpret function. * No dynamic casting is required and no RTTI data is needed to do this */ virtual TermPositionVector* __asTermPositionVector()=0; }; /** * The TermVectorOffsetInfo class holds information pertaining to a Term in a {@link TermPositionVector}'s * offset information. This offset information is the character offset as set during the Analysis phase (and thus may not be the actual offset in the * original content). */ struct CLUCENE_EXPORT TermVectorOffsetInfo { private: int32_t startOffset; int32_t endOffset; public: // TODO: Remove after TermVectorWriter has been ported; TermVectorOffsetInfo(); ~TermVectorOffsetInfo(); TermVectorOffsetInfo(int32_t startOffset, int32_t endOffset); /** * The accessor for the ending offset for the term * @return The offset */ int32_t getEndOffset() const; void setEndOffset(const int32_t _endOffset); /** * The accessor for the starting offset of the term. * * @return The offset */ int32_t getStartOffset() const; void setStartOffset(const int32_t _startOffset); /** * Two TermVectorOffsetInfos are equals if both the start and end offsets are the same * @param o The comparison Object * @return true if both {@link #getStartOffset()} and {@link #getEndOffset()} are the same for both objects. */ bool equals(TermVectorOffsetInfo* o); size_t hashCode() const; }; /** * Convenience declaration when creating a {@link org.apache.lucene.index.TermPositionVector} that stores only position information. */ extern CL_NS(util)::ObjectArray* TermVectorOffsetInfo_EMPTY_OFFSET_INFO; /** Extends TermFreqVector to provide additional information about * positions in which each of the terms is found. A TermPositionVector not necessarily * contains both positions and offsets, but at least one of these arrays exists. */ class CLUCENE_EXPORT TermPositionVector: public virtual TermFreqVector { public: /** Returns an array of positions in which the term is found. * Terms are identified by the index at which its number appears in the * term String array obtained from the indexOf method. * May return null if positions have not been stored. */ virtual const CL_NS(util)::ArrayBase* getTermPositions(const size_t index) = 0; /** * Returns an array of TermVectorOffsetInfo in which the term is found. * May return null if offsets have not been stored. * * @see org.apache.lucene.analysis.Token * * @param index The position in the array to get the offsets from * @return An array of TermVectorOffsetInfo objects or the empty list */ virtual const CL_NS(util)::ArrayBase* getOffsets(const size_t index) = 0; virtual ~TermPositionVector(){ } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/TermVectorReader.cpp000066400000000000000000000372161154025176300243270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_TermVector.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/store/IndexInput.h" #include "CLucene/store/IndexOutput.h" #include "_IndexFileNames.h" CL_NS_USE(util) CL_NS_DEF(index) TermVectorsReader::TermVectorsReader(CL_NS(store)::Directory* d, const char* segment, FieldInfos* fieldInfos, int32_t readBufferSize, int32_t docStoreOffset, int32_t size): fieldInfos(NULL), tvx(NULL), tvd(NULL), tvf(NULL), _size(0), docStoreOffset(0) { bool success = false; char fbuf[CL_MAX_NAME]; strcpy(fbuf,segment); strcat(fbuf,"."); char* fpbuf=fbuf+strlen(fbuf); strcpy(fpbuf,IndexFileNames::VECTORS_INDEX_EXTENSION); try { if (d->fileExists(fbuf)) { tvx = d->openInput(fbuf, readBufferSize); checkValidFormat(tvx); strcpy(fpbuf,IndexFileNames::VECTORS_DOCUMENTS_EXTENSION); tvd = d->openInput(fbuf, readBufferSize); tvdFormat = checkValidFormat(tvd); strcpy(fpbuf,IndexFileNames::VECTORS_FIELDS_EXTENSION); tvf = d->openInput(fbuf, readBufferSize); tvfFormat = checkValidFormat(tvf); if (-1 == docStoreOffset) { this->docStoreOffset = 0; this->_size = static_cast(tvx->length() >> 3); } else { this->docStoreOffset = docStoreOffset; this->_size = size; // Verify the file is long enough to hold all of our // docs CND_CONDITION( ((int64_t) (tvx->length() / 8)) >= size + docStoreOffset , "file is not long enough to hold all of our docs"); } } this->fieldInfos = fieldInfos; success = true; } _CLFINALLY ({ // With lock-less commits, it's entirely possible (and // fine) to hit a FileNotFound exception above. In // this case, we want to explicitly close any subset // of things that were opened so that we don't have to // wait for a GC to do so. if (!success) { close(); } }); } TermVectorsReader::TermVectorsReader(const TermVectorsReader& copy) { tvx = copy.tvx->clone(); tvd = copy.tvd->clone(); tvf = copy.tvf->clone(); tvdFormat = copy.tvdFormat; tvfFormat = copy.tvfFormat; _size = copy._size; fieldInfos = copy.fieldInfos; docStoreOffset = copy.docStoreOffset; } TermVectorsReader* TermVectorsReader::clone() const{ if (tvx == NULL || tvd == NULL || tvf == NULL) return NULL; return _CLNEW TermVectorsReader(*this); } TermVectorsReader::~TermVectorsReader(){ close(); } int32_t TermVectorsReader::checkValidFormat(CL_NS(store)::IndexInput* in){ int32_t format = in->readInt(); if (format > TermVectorsReader::FORMAT_VERSION) { CL_NS(util)::StringBuffer err; err.append(_T("Incompatible format version: ")); err.appendInt(format); err.append(_T(" expected ")); err.appendInt(TermVectorsReader::FORMAT_VERSION); err.append(_T(" or less")); _CLTHROWT(CL_ERR_CorruptIndex,err.getBuffer()); } return format; } void TermVectorsReader::close(){ // make all effort to close up. Keep the first exception // and throw it as a new one. // todo: why don't we trap the exception and at least make sure that // all streams that we can close are closed? CLuceneError keep; bool thrown = false; if (tvx != NULL){ try{tvx->close();} catch(CLuceneError& err){ if ( err.number() == CL_ERR_IO ){ keep = err; thrown = true; }else throw err; } _CLDELETE(tvx);//delete even if error thrown } if (tvd != NULL){ try{tvd->close();} catch(CLuceneError& err){ if ( err.number() == CL_ERR_IO ){ keep = err; thrown = true; }else throw err; } _CLDELETE(tvd); } if (tvf != NULL){ try{tvf->close();} catch(CLuceneError& err){ if ( err.number() == CL_ERR_IO ){ keep = err; thrown = true; }else throw err; } _CLDELETE(tvf); } if ( thrown ) throw keep; } int64_t TermVectorsReader::size() const{ return _size; } void TermVectorsReader::get(const int32_t docNum, const TCHAR* field, TermVectorMapper* mapper){ if (tvx != NULL) { int32_t fieldNumber = fieldInfos->fieldNumber(field); //We need to account for the FORMAT_SIZE at when seeking in the tvx //We don't need to do this in other seeks because we already have the // file pointer //that was written in another file tvx->seek(((docNum + docStoreOffset) * 8L) + FORMAT_SIZE); int64_t position = tvx->readLong(); tvd->seek(position); int32_t fieldCount = tvd->readVInt(); // There are only a few fields per document. We opt for a full scan // rather then requiring that they be ordered. We need to read through // all of the fields anyway to get to the tvf pointers. int32_t number = 0; int32_t found = -1; for (int32_t i = 0; i < fieldCount; ++i) { if(tvdFormat == FORMAT_VERSION) number = tvd->readVInt(); else number += tvd->readVInt(); if (number == fieldNumber) found = i; } // This field, although valid in the segment, was not found in this // document if (found != -1) { // Compute position in the tvf file position = 0; for (int32_t i = 0; i <= found; i++) // TODO: Was ++i, make sure its still good position += tvd->readVLong(); mapper->setDocumentNumber(docNum); readTermVector(field, position, mapper); } else { // "Field not found" } } else { // "No tvx file" } } TermFreqVector* TermVectorsReader::get(const int32_t docNum, const TCHAR* field){ // Check if no term vectors are available for this segment at all ParallelArrayTermVectorMapper* mapper = _CLNEW ParallelArrayTermVectorMapper(); get(docNum, field, (TermVectorMapper*)mapper); TermFreqVector* ret = mapper->materializeVector(); _CLLDELETE(mapper); return ret; } ArrayBase* TermVectorsReader::get(const int32_t docNum){ ObjectArray* result = NULL; // Check if no term vectors are available for this segment at all if (tvx != NULL) { //We need to offset by tvx->seek(((docNum + docStoreOffset) * 8L) + FORMAT_SIZE); int64_t position = tvx->readLong(); tvd->seek(position); int32_t fieldCount = tvd->readVInt(); // No fields are vectorized for this document if (fieldCount != 0) { int32_t number = 0; const TCHAR** fields = _CL_NEWARRAY(const TCHAR*,fieldCount+1); { //msvc6 scope fix for (int32_t i = 0; i < fieldCount; ++i) { if(tvdFormat == FORMAT_VERSION) number = tvd->readVInt(); else number += tvd->readVInt(); fields[i] = fieldInfos->fieldName(number); } } fields[fieldCount]=NULL; // Compute position in the tvf file position = 0; int64_t* tvfPointers = _CL_NEWARRAY(int64_t,fieldCount); { //msvc6 scope fix for (int32_t i = 0; i < fieldCount; ++i) { position += tvd->readVLong(); tvfPointers[i] = position; } } result = (ObjectArray*)readTermVectors(docNum, fields, tvfPointers, fieldCount); _CLDELETE_ARRAY(tvfPointers); _CLDELETE_ARRAY(fields); } } else { // "No tvx file" } return result; } void TermVectorsReader::get(const int32_t docNumber, TermVectorMapper* mapper) { // Check if no term vectors are available for this segment at all if (tvx != NULL) { //We need to offset by tvx->seek((docNumber * 8L) + FORMAT_SIZE); int64_t position = tvx->readLong(); tvd->seek(position); int32_t fieldCount = tvd->readVInt(); // No fields are vectorized for this document if (fieldCount != 0) { int32_t number = 0; const TCHAR** fields = _CL_NEWARRAY(const TCHAR*, fieldCount+1); { //msvc6 scope fix for (int32_t i = 0; i < fieldCount; i++) { if(tvdFormat == FORMAT_VERSION) number = tvd->readVInt(); else number += tvd->readVInt(); fields[i] = fieldInfos->fieldName(number); } } fields[fieldCount]=NULL; // Compute position in the tvf file position = 0; int64_t* tvfPointers = _CL_NEWARRAY(int64_t,fieldCount); { //msvc6 scope fix for (int32_t i = 0; i < fieldCount; i++) { position += tvd->readVLong(); tvfPointers[i] = position; } } mapper->setDocumentNumber(docNumber); readTermVectors(fields, tvfPointers, fieldCount, mapper); _CLDELETE_ARRAY(tvfPointers); _CLDELETE_ARRAY(fields); } } else { // "No tvx file" } } ObjectArray* TermVectorsReader::readTermVectors(const int32_t docNum, const TCHAR** fields, const int64_t* tvfPointers, const int32_t len){ ObjectArray* res = _CLNEW CL_NS(util)::ObjectArray(len); ParallelArrayTermVectorMapper* mapper = _CLNEW ParallelArrayTermVectorMapper(); for (int32_t i = 0; i < len; i++) { mapper->setDocumentNumber(docNum); readTermVector(fields[i], tvfPointers[i], mapper); res->values[i] = static_cast(mapper->materializeVector()); mapper->reset(); } _CLLDELETE(mapper); return res; } void TermVectorsReader::readTermVectors(const TCHAR** fields, const int64_t* tvfPointers, const int32_t len, TermVectorMapper* mapper){ for (int32_t i = 0; i < len; i++) { readTermVector(fields[i], tvfPointers[i], mapper); } } void TermVectorsReader::readTermVector(const TCHAR* field, const int64_t tvfPointer, TermVectorMapper* mapper){ //Now read the data from specified position //We don't need to offset by the FORMAT here since the pointer already includes the offset tvf->seek(tvfPointer); int32_t numTerms = tvf->readVInt(); // If no terms - return a constant empty termvector. However, this should never occur! if (numTerms == 0) return; bool storePositions; bool storeOffsets; if(tvfFormat == FORMAT_VERSION){ uint8_t bits = tvf->readByte(); storePositions = (bits & STORE_POSITIONS_WITH_TERMVECTOR) != 0; storeOffsets = (bits & STORE_OFFSET_WITH_TERMVECTOR) != 0; } else{ tvf->readVInt(); storePositions = false; storeOffsets = false; } mapper->setExpectations(field, numTerms, storeOffsets, storePositions); int32_t start = 0; int32_t deltaLength = 0; int32_t totalLength = 0; ValueArray buffer(10); // init the buffer with a length of 10 character for (int32_t i = 0; i < numTerms; ++i) { start = tvf->readVInt(); deltaLength = tvf->readVInt(); totalLength = start + deltaLength; if (buffer.length < totalLength + 1) // increase buffer { buffer.resize(totalLength+1); } //read the term tvf->readChars(buffer.values, start, deltaLength); buffer.values[totalLength] = '\0'; //null terminate term //read the frequency int32_t freq = tvf->readVInt(); ValueArray* positions = NULL; if (storePositions) { //read in the positions //does the mapper even care about positions? if (mapper->isIgnoringPositions() == false) { positions = _CLNEW ValueArray(freq); int32_t prevPosition = 0; for (int32_t j = 0; j < freq; j++) { positions->values[j] = prevPosition + tvf->readVInt(); prevPosition = positions->values[j]; } } else { //we need to skip over the positions. Since these are VInts, I don't believe there is anyway to know for sure how far to skip // for (int32_t j = 0; j < freq; j++) { tvf->readVInt(); } } } ArrayBase* offsets = NULL; if (storeOffsets) { //does the mapper even care about offsets? if (mapper->isIgnoringOffsets() == false) { offsets = _CLNEW ObjectArray(freq); int32_t prevOffset = 0; for (int32_t j = 0; j < freq; j++) { int32_t startOffset = prevOffset + tvf->readVInt(); int32_t endOffset = startOffset + tvf->readVInt(); offsets->values[j] = _CLNEW TermVectorOffsetInfo(startOffset, endOffset); prevOffset = endOffset; } } else { for (int32_t j = 0; j < freq; j++){ tvf->readVInt(); tvf->readVInt(); } } } mapper->map(buffer.values, totalLength, freq, offsets, positions); } } ObjectArray* TermVectorOffsetInfo_EMPTY_OFFSET_INFO = _CLNEW ObjectArray; TermVectorOffsetInfo::TermVectorOffsetInfo() { startOffset = 0; endOffset=0; } TermVectorOffsetInfo::~TermVectorOffsetInfo() { } TermVectorOffsetInfo::TermVectorOffsetInfo(int32_t startOffset, int32_t endOffset) { this->endOffset = endOffset; this->startOffset = startOffset; } int32_t TermVectorOffsetInfo::getEndOffset() const{ return endOffset; } void TermVectorOffsetInfo::setEndOffset(const int32_t _endOffset) { this->endOffset = _endOffset; } int32_t TermVectorOffsetInfo::getStartOffset() const{ return startOffset; } void TermVectorOffsetInfo::setStartOffset(const int32_t _startOffset) { this->startOffset = _startOffset; } bool TermVectorOffsetInfo::equals(TermVectorOffsetInfo* termVectorOffsetInfo) { if (this == termVectorOffsetInfo) return true; if (endOffset != termVectorOffsetInfo->endOffset) return false; if (startOffset != termVectorOffsetInfo->startOffset) return false; return true; } size_t TermVectorOffsetInfo::hashCode() const{ size_t result; result = startOffset; result = 29 * result + endOffset; return result; } TermVectorMapper::TermVectorMapper(){ this->ignoringPositions = false; this->ignoringOffsets = false; } TermVectorMapper::TermVectorMapper(const bool _ignoringPositions, const bool _ignoringOffsets){ this->ignoringPositions = _ignoringPositions; this->ignoringOffsets = _ignoringOffsets; } bool TermVectorMapper::isIgnoringPositions() const { return ignoringPositions; } bool TermVectorMapper::isIgnoringOffsets() const { return ignoringOffsets; } void TermVectorMapper::setDocumentNumber(const int32_t /*documentNumber*/) { //default implementation does nothing... } ParallelArrayTermVectorMapper::ParallelArrayTermVectorMapper(): terms(NULL), termFreqs(NULL), positions(NULL), offsets(NULL), currentPosition(0), field(NULL) { } ParallelArrayTermVectorMapper::~ParallelArrayTermVectorMapper(){ _CLDELETE_LCARRAY(field); } void ParallelArrayTermVectorMapper::setExpectations(const TCHAR* _field, const int32_t numTerms, const bool storeOffsets, const bool storePositions) { _CLDELETE_LCARRAY(field); this->field = STRDUP_TtoT(_field); terms = _CLNEW CL_NS(util)::TCharArray(numTerms); termFreqs = _CLNEW ValueArray(numTerms); this->storingOffsets = storeOffsets; this->storingPositions = storePositions; if(storePositions){ positions = (ArrayBase< ArrayBase* >*)_CLNEW ObjectArray< ValueArray >(numTerms); } if(storeOffsets){ offsets = _CLNEW ObjectArray< ArrayBase >(numTerms); } } void ParallelArrayTermVectorMapper::map(const TCHAR* term, int32_t termLen, const int32_t frequency, ArrayBase* _offsets, ArrayBase* _positions) { terms->values[currentPosition] = STRDUP_TtoT(term); termFreqs->values[currentPosition] = frequency; if (storingOffsets) { this->offsets->values[currentPosition] = _offsets; } if (storingPositions) { this->positions->values[currentPosition] = _positions; } currentPosition++; } TermFreqVector* ParallelArrayTermVectorMapper::materializeVector() { SegmentTermVector* tv = NULL; if (field != NULL && terms != NULL) { if (storingPositions || storingOffsets) { tv = _CLNEW SegmentTermPositionVector(field, terms, termFreqs, positions, offsets); } else { tv = _CLNEW SegmentTermVector(field, terms, termFreqs); } } return tv; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/TermVectorWriter.cpp000066400000000000000000000160061154025176300243730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_TermVector.h" #include "_IndexFileNames.h" #include "CLucene/util/Misc.h" #include "CLucene/store/IndexInput.h" #include "CLucene/store/IndexOutput.h" #include CL_NS_USE(util) CL_NS_DEF(index) TermVectorsWriter::TermVectorsWriter(CL_NS(store)::Directory* directory, const char* segment,FieldInfos* fieldInfos) { // Open files for TermVector storage char fbuf[CL_MAX_NAME]; strcpy(fbuf,segment); strcat(fbuf,"."); char* fpbuf=fbuf+strlen(fbuf); strcpy(fpbuf,IndexFileNames::VECTORS_INDEX_EXTENSION); tvx = directory->createOutput(fbuf); tvx->writeInt(TermVectorsReader::FORMAT_VERSION); strcpy(fpbuf,IndexFileNames::VECTORS_DOCUMENTS_EXTENSION); tvd = directory->createOutput(fbuf); tvd->writeInt(TermVectorsReader::FORMAT_VERSION); strcpy(fpbuf,IndexFileNames::VECTORS_FIELDS_EXTENSION); tvf = directory->createOutput(fbuf); tvf->writeInt(TermVectorsReader::FORMAT_VERSION); this->fieldInfos = fieldInfos; } void TermVectorsWriter::close(CLuceneError* err){ CLuceneError keep; bool bError = false; if ( tvx != NULL ){ try{ tvx->close(); }catch(CLuceneError& ioerr){ if ( ioerr.number() != CL_ERR_IO ) { _CLDELETE(tvx); _CLDELETE(tvd); _CLDELETE(tvf); throw ioerr; } if (!bError) { bError = true; keep.set(ioerr.number(), ioerr.what()); } } _CLDELETE(tvx); } if ( tvd != NULL ){ try{ tvd->close(); }catch(CLuceneError& ioerr){ if ( ioerr.number() != CL_ERR_IO ) { _CLDELETE(tvd); _CLDELETE(tvf); throw ioerr; } if (!bError) { bError = true; keep.set(ioerr.number(), ioerr.what()); } } _CLDELETE(tvd); } if ( tvf != NULL ){ try{ tvf->close(); }catch(CLuceneError& ioerr){ if ( ioerr.number() != CL_ERR_IO ) { _CLDELETE(tvf); throw ioerr; } if (!bError) { bError = true; keep.set(ioerr.number(), ioerr.what()); } } _CLDELETE(tvf); } if (bError) { if ( err != NULL ) err->set(keep.number(), keep.what()); else throw keep; } } TermVectorsWriter::~TermVectorsWriter(){ CLuceneError err; close(&err); } void TermVectorsWriter::addAllDocVectors(ArrayBase* _vectors){ tvx->writeLong(tvd->getFilePointer()); if (_vectors != NULL) { ArrayBase& vectors = *_vectors; const int32_t numFields = vectors.length; tvd->writeVInt(numFields); ValueArray fieldPointers(numFields); for (int32_t i=0; igetFilePointer(); const int32_t fieldNumber = fieldInfos->fieldNumber(vectors[i]->getField()); // 1st pass: write field numbers to tvd tvd->writeVInt(fieldNumber); const int32_t numTerms = vectors[i]->size(); tvf->writeVInt(numTerms); TermPositionVector* tpVector = NULL; uint8_t bits = 0; bool storePositions = false; bool storeOffsets = false; if ( vectors[i]->__asTermPositionVector() != NULL ) { // May have positions & offsets tpVector = vectors[i]->__asTermPositionVector(); storePositions = tpVector->size() > 0 && tpVector->getTermPositions(0) != NULL; storeOffsets = tpVector->size() > 0 && tpVector->getOffsets(0) != NULL; bits = ((storePositions ? TermVectorsReader::STORE_POSITIONS_WITH_TERMVECTOR : 0) + (storeOffsets ? TermVectorsReader::STORE_OFFSET_WITH_TERMVECTOR : 0)); } else { tpVector = NULL; bits = 0; storePositions = false; storeOffsets = false; } tvf->writeVInt(bits); const ArrayBase& terms = *vectors[i]->getTerms(); const ArrayBase& freqs = *vectors[i]->getTermFrequencies(); const TCHAR* lastTermText = LUCENE_BLANK_STRING; size_t lastTermTextLen = 0; for (int32_t j=0; jwriteVInt(start); // write shared prefix length tvf->writeVInt(length); // write delta length tvf->writeChars(termText + start, length); // write delta chars lastTermText = termText; const int32_t termFreq = freqs[j]; tvf->writeVInt(termFreq); if (storePositions) { const ArrayBase* _positions = tpVector->getTermPositions(j); if (_positions == NULL) _CLTHROWA(CL_ERR_IllegalState, "Trying to write positions that are NULL!"); const ArrayBase& positions = *_positions; assert (positions.length == termFreq); // use delta encoding for positions int32_t lastPosition = 0; for(int32_t k=0;kwriteVInt(position-lastPosition); lastPosition = position; } } if (storeOffsets) { const ArrayBase* _offsets = tpVector->getOffsets(j); if (_offsets == NULL) _CLTHROWA(CL_ERR_IllegalState, "Trying to write offsets that are NULL!"); const ArrayBase& offsets = *_offsets; assert (offsets.length == termFreq); // use delta encoding for offsets int32_t lastEndOffset = 0; for(int k=0;kgetStartOffset(); const int32_t endOffset = offsets[k]->getEndOffset(); tvf->writeVInt(startOffset-lastEndOffset); tvf->writeVInt(endOffset-startOffset); lastEndOffset = endOffset; } } } } // 2nd pass: write field pointers to tvd int64_t lastFieldPointer = 0; for (int32_t i=0; iwriteVLong(fieldPointer-lastFieldPointer); lastFieldPointer = fieldPointer; } } else tvd->writeVInt(0); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/Terms.cpp000066400000000000000000000013031154025176300221700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Terms.h" #include "Term.h" CL_NS_DEF(index) TermDocs::~TermDocs(){ } TermEnum::~TermEnum(){ } bool TermEnum::skipTo(Term* target){ do { if (!next()) return false; } while (target->compareTo(term(false)) > 0); return true; } TermPositions::~TermPositions(){ } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/index/Terms.h000066400000000000000000000146771154025176300216570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_Terms_ #define _lucene_index_Terms_ #include "CLucene/util/Equators.h" CL_NS_DEF(index) //predefine class Term; class TermEnum; class TermPositions; /** TermDocs provides an interface for enumerating <document, frequency> pairs for a term.

The document portion names each document containing the term. Documents are indicated by number. The frequency portion gives the number of times the term occurred in each document.

The pairs are ordered by document number. @see IndexReader#termDocs() */ class CLUCENE_EXPORT TermDocs { public: virtual ~TermDocs(); // Sets this to the data for a term. // The enumeration is reset to the start of the data for this term. virtual void seek(Term* term)=0; /** Sets this to the data for the current term in a {@link TermEnum}. * This may be optimized in some implementations. */ virtual void seek(TermEnum* termEnum)=0; // Returns the current document number.

This is invalid until {@link // #next()} is called for the first time. virtual int32_t doc() const=0; // Returns the frequency of the term within the current document.

This // is invalid until {@link #next()} is called for the first time. virtual int32_t freq() const=0; // Moves to the next pair in the enumeration.

Returns true iff there is // such a next pair in the enumeration. virtual bool next() =0; // Attempts to read multiple entries from the enumeration, up to length of // docs. Document numbers are stored in docs, and term // frequencies are stored in freqs. The freqs array must be as // int64_t as the docs array. // //

Returns the number of entries read. Zero is only returned when the // stream has been exhausted. virtual int32_t read(int32_t* docs, int32_t* freqs, int32_t length)=0; // Skips entries to the first beyond the current whose document number is // greater than or equal to target.

Returns true iff there is such // an entry.

Behaves as if written:

	//   bool skipTo(int32_t target) {
	//     do {
	//       if (!next())
	// 	     return false;
	//     } while (target > doc());
	//     return true;
	//   }
	// 
// Some implementations are considerably more efficient than that. virtual bool skipTo(const int32_t target)=0; // Frees associated resources. virtual void close() = 0; /** Solve the diamond inheritence problem by providing a reinterpret function. * No dynamic casting is required and no RTTI data is needed to do this */ virtual TermPositions* __asTermPositions()=0; }; /** Abstract class for enumerating terms.

Term enumerations are always ordered by Term.compareTo(). Each term in the enumeration is greater than all that precede it. */ class CLUCENE_EXPORT TermEnum: LUCENE_BASE, public CL_NS(util)::NamedObject { public: /** Increments the enumeration to the next element. True if one exists.*/ virtual bool next()=0; /** * Returns the current Term in the enumeration. * @param pointer if true, then increment the reference count before returning */ virtual Term* term(bool pointer=true)=0; /** Returns the docFreq of the current Term in the enumeration.*/ virtual int32_t docFreq() const=0; /** Closes the enumeration to further activity, freeing resources. */ virtual void close() =0; virtual ~TermEnum(); // Term Vector support /** Skips terms to the first beyond the current whose value is * greater or equal to target.

Returns true iff there is such * an entry.

Behaves as if written:

	*   public boolean skipTo(Term target) {
	*     do {
	*       if (!next())
	* 	     return false;
	*     } while (target > term());
	*     return true;
	*   }
	* 
* Some implementations are considerably more efficient than that. */ virtual bool skipTo(Term* target); }; /** * TermPositions provides an interface for enumerating the <document, * frequency, <position>* > tuples for a term.

The document and * frequency are the same as for a TermDocs. The positions portion lists the ordinal * positions of each occurrence of a term in a document. * * @see IndexReader#termPositions() */ class CLUCENE_EXPORT TermPositions: public virtual TermDocs { public: /** Returns next position in the current document. It is an error to call this more than {@link #freq()} times without calling {@link #next()}

This is invalid until {@link #next()} is called for the first time. */ virtual int32_t nextPosition() = 0; virtual ~TermPositions(); /** * Returns the length of the payload at the current term position. * This is invalid until {@link #nextPosition()} is called for * the first time.
* @return length of the current payload in number of bytes */ virtual int32_t getPayloadLength() const = 0; /** * Returns the payload data at the current term position. * This is invalid until {@link #nextPosition()} is called for * the first time. * This method must not be called more than once after each call * of {@link #nextPosition()}. However, payloads are loaded lazily, * so if the payload data for the current position is not needed, * this method may not be called at all for performance reasons.
* * @param data the array into which the data of this payload is to be * stored, if it is big enough; otherwise, a new byte[] array * is allocated for this purpose. * @return a byte[] array containing the data of this payload */ virtual uint8_t* getPayload(uint8_t* data) = 0; /** * Checks if a payload can be loaded at this position. *

* Payloads can only be loaded once per call to * {@link #nextPosition()}. * * @return true if there is a payload available at this position that can be loaded */ virtual bool isPayloadAvailable() const = 0; /** Solve the diamond inheritence problem by providing a reinterpret function. * No dynamic casting is required and no RTTI data is needed to do this */ virtual TermDocs* __asTermDocs()=0; virtual TermPositions* __asTermPositions()=0; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_CompoundFile.h000066400000000000000000000121141154025176300232700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_compoundfile_h #define _lucene_index_compoundfile_h CL_CLASS_DEF(store,Lock) #include "CLucene/store/Directory.h" #include "CLucene/store/IndexInput.h" #include "_SegmentMerger.h" CL_NS_DEF(index) class WriterFileEntry; class ReaderFileEntry; /** * Class for accessing a compound stream. * This class implements a directory, but is limited to only read operations. * Directory methods that would normally modify data throw an exception. * */ class CompoundFileReader: public CL_NS(store)::Directory { private: int32_t readBufferSize; // Base info CL_NS(store)::Directory* directory; char* fileName; CL_NS(store)::IndexInput* stream; typedef CL_NS(util)::CLHashMap > EntriesType; EntriesType* entries; protected: /** Removes an existing file in the directory-> */ bool doDeleteFile(const char* name); public: CompoundFileReader(CL_NS(store)::Directory* dir, const char* name, int32_t _readBufferSize=CL_NS(store)::BufferedIndexInput::BUFFER_SIZE); virtual ~CompoundFileReader(); CL_NS(store)::Directory* getDirectory(); const char* getName() const; void close(); bool openInput(const char * name, CL_NS(store)::IndexInput *& ret, CLuceneError& error, int32_t bufferSize=0); /** Returns an array of strings, one for each file in the directory-> */ bool list(std::vector* names) const; /** Returns true iff a file with the given name exists. */ bool fileExists(const char* name) const; /** Returns the time the named file was last modified. */ int64_t fileModified(const char* name) const; /** Set the modified time of an existing file to now. */ void touchFile(const char* name); /** Renames an existing file in the directory-> If a file already exists with the new name, then it is replaced. This replacement should be atomic. */ void renameFile(const char* from, const char* to); /** Returns the length of a file in the directory. * @throws IOException if the file does not exist */ int64_t fileLength(const char* name) const; /** Not implemented * @throws UnsupportedOperationException */ CL_NS(store)::IndexOutput* createOutput(const char* name); /** Not implemented * @throws UnsupportedOperationException */ CL_NS(store)::LuceneLock* makeLock(const char* name); std::string toString() const; static const char* getClassName(); const char* getObjectName() const; }; /** * Combines multiple files into a single compound file. * The file format:
*

    *
  • VInt fileCount
  • *
  • {Directory} * fileCount entries with the following structure:
  • *
      *
    • int64_t dataOffset
    • *
    • UTFString extension
    • *
    *
  • {File Data} * fileCount entries with the raw data of the corresponding file
  • *
* * The fileCount integer indicates how many files are contained in this compound * file. The {directory} that follows has that many entries. Each directory entry * contains an encoding identifier, an int64_t pointer to the start of this file's * data section, and a UTF String with that file's extension. * */ class CompoundFileWriter:LUCENE_BASE { class Internal; Internal* _internal; /** Copy the contents of the file with specified extension into the * provided output stream. Use the provided buffer for moving data * to reduce memory allocation. */ void copyFile(WriterFileEntry* source, CL_NS(store)::IndexOutput* os, uint8_t* buffer, int32_t bufferLength); public: /** Create the compound stream in the specified file. The file name is the * entire name (no extensions are added). */ CompoundFileWriter(CL_NS(store)::Directory* dir, const char* name, SegmentMerger::CheckAbort* checkAbort = NULL); ~CompoundFileWriter(); /** Returns the directory of the compound file. */ CL_NS(store)::Directory* getDirectory(); const char* getName() const ; /** Add a source stream. file is the string by which the * sub-stream will be known in the compound stream. * * @throws IllegalStateException if this writer is closed * @throws NullPointerException if file is null * @throws IllegalArgumentException if a file with the same name * has been added already */ void addFile(const char* file); /** Merge files with the extensions added up to now. * All files with these extensions are combined sequentially into the * compound stream. After successful merge, the source files * @throws IllegalStateException if close() had been called before or * if no file has been added to this object * are deleted. */ void close(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_DocumentsWriter.h000066400000000000000000001020401154025176300240400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_DocumentsWriter_ #define _lucene_index_DocumentsWriter_ #include "CLucene/store/IndexInput.h" #include "CLucene/config/_threads.h" #include "CLucene/util/Array.h" #include "CLucene/store/_RAMDirectory.h" #include "_TermInfo.h" CL_CLASS_DEF(analysis,Analyzer) CL_CLASS_DEF(analysis,Token) CL_CLASS_DEF(analysis,TokenStream) CL_CLASS_DEF(document,Field) CL_CLASS_DEF(store,IndexOutput) CL_CLASS_DEF(document,Document) CL_CLASS_DEF(util,StringReader) CL_NS_DEF(index) class DocumentsWriter; class DefaultSkipListWriter; class FieldInfos; class FieldsWriter; class FieldInfos; class IndexWriter; class TermInfo; class TermInfosWriter; class Term; class FieldInfo; class Term_Compare; class Term_Equals; /** Used only internally to DW to call abort "up the stack" */ class AbortException{ public: CLuceneError err; AbortException(CLuceneError& _err, DocumentsWriter* docWriter); }; /** * This class accepts multiple added documents and directly * writes a single segment file. It does this more * efficiently than creating a single segment per document * (with DocumentWriter) and doing standard merges on those * segments. * * When a document is added, its stored fields (if any) and * term vectors (if any) are immediately written to the * Directory (ie these do not consume RAM). The freq/prox * postings are accumulated into a Postings hash table keyed * by term. Each entry in this hash table holds a separate * uint8_t stream (allocated as incrementally growing slices * into large shared uint8_t[] arrays) for freq and prox, that * contains the postings data for multiple documents. If * vectors are enabled, each unique term for each document * also allocates a PostingVector instance to similarly * track the offsets & positions uint8_t stream. * * Once the Postings hash is full (ie is consuming the * allowed RAM) or the number of added docs is large enough * (in the case we are flushing by doc count instead of RAM * usage), we create a real segment and flush it to disk and * reset the Postings hash. * * In adding a document we first organize all of its fields * by field name. We then process field by field, and * record the Posting hash per-field. After each field we * flush its term vectors. When it's time to flush the full * segment we first sort the fields by name, and then go * field by field and sorts its postings. * * * Threads: * * Multiple threads are allowed into addDocument at once. * There is an initial synchronized call to getThreadState * which allocates a ThreadState for this thread. The same * thread will get the same ThreadState over time (thread * affinity) so that if there are consistent patterns (for * example each thread is indexing a different content * source) then we make better use of RAM. Then * processDocument is called on that ThreadState without * synchronization (most of the "heavy lifting" is in this * call). Finally the synchronized "finishDocument" is * called to flush changes to the directory. * * Each ThreadState instance has its own Posting hash. Once * we're using too much RAM, we flush all Posting hashes to * a segment by merging the docIDs in the posting lists for * the same term across multiple thread states (see * writeSegment and appendPostings). * * When flush is called by IndexWriter, or, we flush * internally when autoCommit=false, we forcefully idle all * threads and flush only once they are all idle. This * means you can call flush with a given thread even while * other threads are actively adding/deleting documents. * * * Exceptions: * * Because this class directly updates in-memory posting * lists, and flushes stored fields and term vectors * directly to files in the directory, there are certain * limited times when an exception can corrupt this state. * For example, a disk full while flushing stored fields * leaves this file in a corrupt state. Or, an OOM * exception while appending to the in-memory posting lists * can corrupt that posting list. We call such exceptions * "aborting exceptions". In these cases we must call * abort() to discard all docs added since the last flush. * * All other exceptions ("non-aborting exceptions") can * still partially update the index structures. These * updates are consistent, but, they represent only a part * of the document seen up until the exception was hit. * When this happens, we immediately mark the document as * deleted so that the document is always atomically ("all * or none") added to the index. */ class DocumentsWriter { public: // Number of documents a delete term applies to. class Num { private: int32_t num; public: Num(int32_t num) { this->num = num; } int32_t getNum() { return num; } void setNum(int32_t num) { // Only record the new number if it's greater than the // current one. This is important because if multiple // threads are replacing the same doc at nearly the // same time, it's possible that one thread that got a // higher docID is scheduled before the other // threads. if (num > this->num) this->num = num; } }; typedef CL_NS(util)::CLHashMap, CL_NS(util)::Deletor::Object > TermNumMapType; private: IndexWriter* writer; CL_NS(store)::Directory* directory; DEFINE_MUTEX(THIS_LOCK) DEFINE_CONDITION(THIS_WAIT_CONDITION) FieldInfos* fieldInfos; // All fields we've seen CL_NS(store)::IndexOutput *tvx, *tvf, *tvd; // To write term vectors FieldsWriter* fieldsWriter; // To write stored fields std::string segment; // Current segment we are working on std::string docStoreSegment; // Current doc-store segment we are writing int32_t docStoreOffset; // Current starting doc-store offset of current segment int32_t nextDocID; // Next docID to be added int32_t numDocsInRAM; // # docs buffered in RAM int32_t numDocsInStore; // # docs written to doc stores int32_t nextWriteDocID; // Next docID to be written std::ostream* infoStream; // Currently used only for deleting a doc on hitting an non-aborting exception std::vector bufferedDeleteDocIDs; // The max number of delete terms that can be buffered before // they must be flushed to disk. int32_t maxBufferedDeleteTerms; // How much RAM we can use before flushing. This is 0 if // we are flushing by doc count instead. int64_t ramBufferSize; // Flush @ this number of docs. If rarmBufferSize is // non-zero we will flush by RAM usage instead. int32_t maxBufferedDocs; bool closed; // Coarse estimates used to measure RAM usage of buffered deletes static int32_t OBJECT_HEADER_BYTES; static int32_t OBJECT_POINTER_BYTES; // TODO: should be 8 on 64-bit platform static int32_t BYTES_PER_CHAR; static int32_t BYTES_PER_INT; // This Hashmap buffers delete terms in ram before they // are applied. The key is delete term; the value is // number of buffered documents the term applies to. TermNumMapType* bufferedDeleteTerms; int32_t numBufferedDeleteTerms; /* Simple StringReader that can be reset to a new string; * we use this when tokenizing the string value from a * Field. */ typedef CL_NS(util)::StringReader ReusableStringReader; class ByteBlockPool; class CharBlockPool; class FieldMergeState; /* IndexInput that knows how to read the byte slices written * by Posting and PostingVector. We read the bytes in * each slice until we hit the end of that slice at which * point we read the forwarding address of the next slice * and then jump to it.*/ class ByteSliceReader: public CL_NS(store)::IndexInput { ByteBlockPool* pool; int32_t bufferUpto; const uint8_t* buffer; int32_t limit; int32_t level; int32_t upto; int32_t bufferOffset; int32_t endIndex; public: ByteSliceReader(); virtual ~ByteSliceReader(); void init(ByteBlockPool* pool, int32_t startIndex, int32_t endIndex); uint8_t readByte(); int64_t writeTo(CL_NS(store)::IndexOutput* out); void nextSlice(); void readBytes(uint8_t* b, const int32_t len); int64_t getFilePointer() const; int64_t length() const; void seek(const int64_t pos); void close(); IndexInput* clone() const; const char* getDirectoryType() const; const char* getObjectName() const; static const char* getClassName(); friend class FieldMergeState; }; struct PostingVector; //predefine... /* Used to track postings for a single term. One of these * exists per unique term seen since the last flush. */ struct Posting { int32_t textStart; // Address into char[] blocks where our text is stored int32_t docFreq; // # times this term occurs in the current doc int32_t freqStart; // Address of first uint8_t[] slice for freq int32_t freqUpto; // Next write address for freq int32_t proxStart; // Address of first uint8_t[] slice int32_t proxUpto; // Next write address for prox int32_t lastDocID; // Last docID where this term occurred int32_t lastDocCode; // Code for prior doc int32_t lastPosition; // Last position where this term occurred PostingVector* vector; // Corresponding PostingVector instance }; /* Used to track data for term vectors. One of these * exists per unique term seen in each field in the * document. */ struct PostingVector { Posting* p; // Corresponding Posting instance for this term int32_t lastOffset; // Last offset we saw int32_t offsetStart; // Address of first slice for offsets int32_t offsetUpto; // Next write address for offsets int32_t posStart; // Address of first slice for positions int32_t posUpto; // Next write address for positions }; /* Stores norms, buffered in RAM, until they are flushed * to a partial segment. */ class BufferedNorms { public: CL_NS(store)::RAMOutputStream out; int32_t upto; BufferedNorms(); void add(float_t norm); void reset(); void fill(int32_t docID); }; // Used only when infoStream != null int64_t segmentSize(const std::string& segmentName); static const int32_t POINTER_NUM_BYTE; static const int32_t INT_NUM_BYTE; static const int32_t CHAR_NUM_BYTE; // Holds free pool of Posting instances CL_NS(util)::ObjectArray postingsFreeListDW; int32_t postingsFreeCountDW; int32_t postingsAllocCountDW; typedef CL_NS(util)::CLArrayList FreeCharBlocksType; FreeCharBlocksType freeCharBlocks; /* We have three pools of RAM: Postings, uint8_t blocks * (holds freq/prox posting data) and char blocks (holds * characters in the term). Different docs require * varying amount of storage from these three classes. * For example, docs with many unique single-occurrence * short terms will use up the Postings RAM and hardly any * of the other two. Whereas docs with very large terms * will use alot of char blocks RAM and relatively less of * the other two. This method just frees allocations from * the pools once we are over-budget, which balances the * pools to match the current docs. */ void balanceRAM(); std::vector* _files; // Cached list of files we've created std::vector* _abortedFiles; // List of files that were written before last abort() bool allThreadsIdle(); bool hasNorms; // Whether any norms were seen since last flush DefaultSkipListWriter* skipListWriter; bool currentFieldStorePayloads; /** Creates a segment from all Postings in the Postings * hashes across all ThreadStates & FieldDatas. */ void writeSegment(std::vector& flushedFiles); /** Returns the name of the file with this extension, on * the current segment we are working on. */ std::string segmentFileName(const std::string& extension); std::string segmentFileName(const char* extension); TermInfo termInfo; // minimize consing /** Reset after a flush */ void resetPostingsData(); static const uint8_t defaultNorm; ///=Similarity::encodeNorm(1.0f) bool timeToFlushDeletes(); // Buffer a term in bufferedDeleteTerms, which records the // current number of documents buffered in ram so that the // delete term will be applied to those documents as well // as the disk segments. void addDeleteTerm(Term* term, int32_t docCount); // Buffer a specific docID for deletion. Currently only // used when we hit a exception when adding a document void addDeleteDocID(int32_t docId); typedef CL_NS(util)::CLArrayList > FreeByteBlocksType; FreeByteBlocksType freeByteBlocks; /** Per-thread state. We keep a separate Posting hash and * other state for each thread and then merge postings * * hashes from all threads when writing the segment. */ class ThreadState { public: /** Holds data associated with a single field, including * the Postings hash. A document may have many * * occurrences for a given field name; we gather all * * such occurrences here (in docFields) so that we can * * process the entire field at once. */ class FieldData: public CL_NS(util)::Comparable { private: ThreadState* threadState; int32_t fieldCount; CL_NS(util)::ValueArray docFields; FieldData* next; bool postingsCompacted; CL_NS(util)::ValueArray postingsHash; int32_t postingsHashSize; int32_t postingsHashHalfSize; int32_t postingsHashMask; int32_t postingsVectorsUpto; DocumentsWriter* _parent; int32_t offsetEnd; CL_NS(analysis)::Token* localToken; int32_t offsetStartCode; int32_t offsetStart; ByteSliceReader* vectorSliceReader; void initPostingArrays(); /** Only called when term vectors are enabled. This * is called the first time we see a given term for * each * document, to allocate a PostingVector * instance that * is used to record data needed to * write the posting * vectors. */ PostingVector* addNewVector(); /** This is the hotspot of indexing: it's called once * for every term of every document. Its job is to * * update the postings uint8_t stream (Postings hash) * * based on the occurence of a single term. */ void addPosition(CL_NS(analysis)::Token* token); /** Called when postings hash is too small (> 50% * occupied) or too large (< 20% occupied). */ void rehashPostings(int32_t newSize); /** Called once per field per document if term vectors * are enabled, to write the vectors to * * RAMOutputStream, which is then quickly flushed to * the real term vectors files in the Directory. */ void writeVectors(FieldInfo* fieldInfo); void compactPostings(); public: int32_t numPostings; FieldInfo* fieldInfo; int32_t lastGen; int32_t position; int32_t length; int32_t offset; float_t boost; bool doNorms; bool doVectors; bool doVectorPositions; bool doVectorOffsets; void resetPostingArrays(); FieldData(DocumentsWriter* _parent, ThreadState* __threadState, FieldInfo* fieldInfo); ~FieldData(); /** So Arrays.sort can sort us. */ int32_t compareTo(const void* o); /** Collapse the hash table & sort in-place. */ CL_NS(util)::ValueArray* sortPostings(); /** Process all occurrences of one field in the document. */ void processField(CL_NS(analysis)::Analyzer* analyzer); /* Invert one occurrence of one field in the document */ void invertField(CL_NS(document)::Field* field, CL_NS(analysis)::Analyzer* analyzer, int32_t maxFieldLength); static bool sort(FieldData*, FieldData*); const char* getObjectName() const; static const char* getClassName(); int32_t compareTo(lucene::util::NamedObject *); friend class ThreadState; friend class FieldMergeState; }; private: CL_NS(util)::ValueArray postingsFreeListTS; // Free Posting instances int32_t postingsFreeCountTS; CL_NS(util)::ValueArray vectorFieldPointers; CL_NS(util)::ValueArray vectorFieldNumbers; int32_t numStoredFields; // How many stored fields in current doc float_t docBoost; // Boost for current doc CL_NS(util)::ValueArray fieldDataArray; // Fields touched by current doc int32_t numFieldData; // How many fields in current doc int32_t numVectorFields; // How many vector fields in current doc CL_NS(util)::ValueArray fieldDataHash; // Hash FieldData instances by field name int32_t fieldDataHashMask; TCHAR* maxTermPrefix; // Non-null prefix of a too-large term if this // doc has one int32_t fieldGen; CL_NS(util)::ObjectArray postingsVectors; int32_t maxPostingsVectors; // Used to read a string value for a field ReusableStringReader* stringReader; ByteBlockPool* postingsPool; ByteBlockPool* vectorsPool; CharBlockPool* charPool; // Current posting we are working on Posting* p; PostingVector* vector; //writeFreqByte... uint8_t* freq; int32_t freqUpto; //writeProxByte... uint8_t* prox; int32_t proxUpto; //writeOffsetByte... uint8_t* offsets; int32_t offsetUpto; //writePosByte... uint8_t* pos; int32_t posUpto; /** Do in-place sort of Posting array */ void doPostingSort(Posting** postings, int32_t numPosting); void quickSort(Posting** postings, int32_t lo, int32_t hi); /** Do in-place sort of PostingVector array */ void doVectorSort(CL_NS(util)::ArrayBase& postings, int32_t numPosting); void quickSort(CL_NS(util)::ArrayBase& postings, int32_t lo, int32_t hi); // USE ONLY FOR DEBUGGING! /* public String getPostingText() { char[] text = charPool.buffers[p.textStart >> CHAR_BLOCK_SHIFT]; int32_t upto = p.textStart & CHAR_BLOCK_MASK; while(text[upto] != CLUCENE_END_OF_WORD) upto++; return new String(text, p.textStart, upto-(p.textStart & BYTE_BLOCK_MASK)); } */ /** Test whether the text for current Posting p equals * current tokenText. */ bool postingEquals(const TCHAR* tokenText, int32_t tokenTextLen); /** Compares term text for two Posting instance and * returns -1 if p1 < p2; 1 if p1 > p2; else 0. */ int32_t comparePostings(Posting* p1, Posting* p2); public: bool isIdle; // Whether we are in use CL_NS(store)::RAMOutputStream* tvfLocal; // Term vectors for one doc CL_NS(store)::RAMOutputStream* fdtLocal; // Stored fields for one doc FieldsWriter* localFieldsWriter; // Fields for one doc int32_t numThreads; // Number of threads that use this instance int32_t numAllFieldData; CL_NS(util)::ValueArray allFieldDataArray; // All FieldData instances bool doFlushAfter; int32_t docID; // docID we are now working on DocumentsWriter* _parent; ThreadState(DocumentsWriter* _parent); virtual ~ThreadState(); /** Initializes shared state for this new document */ void init(CL_NS(document)::Document* doc, int32_t docID); /** Tokenizes the fields of a document into Postings */ void processDocument(CL_NS(analysis)::Analyzer* analyzer); /** If there are fields we've seen but did not see again * in the last run, then free them up. Also reduce * postings hash size. */ void trimFields(); /** Clear the postings hash and return objects back to * shared pool */ void resetPostings(); /** Move all per-document state that was accumulated in * the ThreadState into the "real" stores. */ void writeDocument(); /** Write vInt into freq stream of current Posting */ void writeFreqVInt(int32_t i); /** Write vInt into prox stream of current Posting */ void writeProxVInt(int32_t i); /** Write uint8_t into freq stream of current Posting */ void writeFreqByte(uint8_t b); /** Write uint8_t into prox stream of current Posting */ void writeProxByte(uint8_t b); /** Currently only used to copy a payload into the prox * stream. */ void writeProxBytes(uint8_t* b, int32_t offset, int32_t len); /** Write vInt into offsets stream of current * PostingVector */ void writeOffsetVInt(int32_t i); /** Write uint8_t into offsets stream of current * PostingVector */ void writeOffsetByte(uint8_t b); /** Write vInt into pos stream of current * PostingVector */ void writePosVInt(int32_t i); /** Write uint8_t into pos stream of current * PostingVector */ void writePosByte(uint8_t b); friend class FieldMergeState; }; /* Class that Posting and PostingVector use to write uint8_t * streams into shared fixed-size uint8_t[] arrays. The idea * is to allocate slices of increasing lengths For * example, the first slice is 5 bytes, the next slice is * 14, etc. We start by writing our bytes into the first * 5 bytes. When we hit the end of the slice, we allocate * the next slice and then write the address of the new * slice into the last 4 bytes of the previous slice (the * "forwarding address"). * * Each slice is filled with 0's initially, and we mark * the end with a non-zero uint8_t. This way the methods * that are writing into the slice don't need to record * its length and instead allocate a new slice once they * hit a non-zero uint8_t. */ template class BlockPool { protected: bool trackAllocations; int32_t numBuffer; int32_t bufferUpto; // Which buffer we are upto int32_t blockSize; DocumentsWriter* parent; public: CL_NS(util)::ValueArray< T* > buffers; int32_t tOffset; // Current head offset int32_t tUpto; // Where we are in head buffer T* buffer; // Current head buffer virtual T* getNewBlock(bool trackAllocations) = 0; BlockPool(DocumentsWriter* _parent, int32_t _blockSize, bool trackAllocations): buffers(CL_NS(util)::ValueArray(10)) { this->blockSize = _blockSize; this->parent = _parent; bufferUpto = -1; tUpto = blockSize; tOffset = -blockSize; buffer = NULL; numBuffer = 0; this->trackAllocations = trackAllocations; buffer = NULL; } virtual ~BlockPool(){ buffers.deleteValues(); } virtual void reset() = 0; void nextBuffer() { if (1+bufferUpto == buffers.length) { //expand the number of buffers buffers.resize( (int32_t)(buffers.length * 1.5)); } buffer = buffers.values[1+bufferUpto] = getNewBlock(trackAllocations); bufferUpto++; tUpto = 0; tOffset += blockSize; } friend class DocumentsWriter; friend class DocumentsWriter::ThreadState; friend class DocumentsWriter::ThreadState::FieldData; friend class DocumentsWriter::FieldMergeState; friend class DocumentsWriter::ByteSliceReader; }; class CharBlockPool: public BlockPool{ public: CharBlockPool(DocumentsWriter* _parent); virtual ~CharBlockPool(); TCHAR* getNewBlock(bool trackAllocations); void reset(); friend class DocumentsWriter::FieldMergeState; }; class ByteBlockPool: public BlockPool{ public: ByteBlockPool( bool _trackAllocations, DocumentsWriter* _parent); virtual ~ByteBlockPool(); uint8_t* getNewBlock(bool trackAllocations); int32_t newSlice(const int32_t size); int32_t allocSlice(uint8_t* slice, const int32_t upto); void reset(); friend class DocumentsWriter::ThreadState; }; // Max # ThreadState instances; if there are more threads // than this they share ThreadStates static const int32_t MAX_THREAD_STATE; CL_NS(util)::ValueArray threadStates; CL_NS(util)::CLHashMap<_LUCENE_THREADID_TYPE, ThreadState*, CL_NS (util)::CLuceneThreadIdCompare,CL_NS (util)::CLuceneThreadIdCompare, CL_NS (util)::Deletor::ConstNullVal<_LUCENE_THREADID_TYPE>, CL_NS (util)::Deletor::Object > threadBindings; int32_t numWaiting; CL_NS(util)::ValueArray waitingThreadStates; int32_t pauseThreads; // Non-zero when we need all threads to // pause (eg to flush) bool flushPending; // True when a thread has decided to flush bool bufferIsFull; // True when it's time to write segment int32_t abortCount; // Non-zero while abort is pending or running CL_NS(util)::ObjectArray norms; // Holds norms until we flush /** Does the synchronized work to finish/flush the * inverted document. */ void finishDocument(ThreadState* state); /** Used to merge the postings from multiple ThreadStates * when creating a segment */ class FieldMergeState { private: ThreadState::FieldData* field; CL_NS(util)::ValueArray* postings; Posting* p; TCHAR* text; int32_t textOffset; int32_t postingUpto; ByteSliceReader freq; ByteSliceReader prox; int32_t docID; int32_t termFreq; public: FieldMergeState(); ~FieldMergeState(); bool nextTerm(); bool nextDoc(); friend class DocumentsWriter; }; public: DocumentsWriter(CL_NS(store)::Directory* directory, IndexWriter* writer); ~DocumentsWriter(); /** If non-null, various details of indexing are printed * here. */ void setInfoStream(std::ostream* infoStream); /** Set how much RAM we can use before flushing. */ void setRAMBufferSizeMB(float_t mb); float_t getRAMBufferSizeMB(); /** Set max buffered docs, which means we will flush by * doc count instead of by RAM usage. */ void setMaxBufferedDocs(int32_t count); int32_t getMaxBufferedDocs(); /** Get current segment name we are writing. */ std::string getSegment(); /** Returns how many docs are currently buffered in RAM. */ int32_t getNumDocsInRAM(); /** Returns the current doc store segment we are writing * to. This will be the same as segment when autoCommit * * is true. */ const std::string& getDocStoreSegment(); /** Returns the doc offset into the shared doc store for * the current buffered docs. */ int32_t getDocStoreOffset(); /** Closes the current open doc stores an returns the doc * store segment name. This returns a blank string if there are * no buffered documents. */ std::string closeDocStore(); const std::vector* abortedFiles(); /* Returns list of files in use by this instance, * including any flushed segments. */ const std::vector& files(); void setAborting(); /** Called if we hit an exception when adding docs, * flushing, etc. This resets our state, discarding any * docs added since last flush. If ae is non-null, it * contains the root cause exception (which we re-throw * after we are done aborting). */ void abort(AbortException* ae); // Returns true if an abort is in progress bool pauseAllThreads(); void resumeAllThreads(); std::vector newFiles; /** Flush all pending docs to a new segment */ int32_t flush(bool closeDocStore); /** Build compound file for the segment we just flushed */ void createCompoundFile(const std::string& segment); /** Set flushPending if it is not already set and returns * whether it was set. This is used by IndexWriter to * * trigger a single flush even when multiple threads are * * trying to do so. */ bool setFlushPending(); void clearFlushPending(); /** Write norms in the "true" segment format. This is * called only during commit, to create the .nrm file. */ void writeNorms(const std::string& segmentName, int32_t totalNumDoc); int32_t compareText(const TCHAR* text1, const TCHAR* text2); /* Walk through all unique text tokens (Posting * instances) found in this field and serialize them * into a single RAM segment. */ void appendPostings(CL_NS(util)::ArrayBase* fields, TermInfosWriter* termsOut, CL_NS(store)::IndexOutput* freqOut, CL_NS(store)::IndexOutput* proxOut); void close(); /** Returns a free (idle) ThreadState that may be used for * indexing this one document. This call also pauses if a * flush is pending. If delTerm is non-null then we * buffer this deleted term after the thread state has * been acquired. */ ThreadState* getThreadState(CL_NS(document)::Document* doc, Term* delTerm); /** Returns true if the caller (IndexWriter) should now * flush. */ bool addDocument(CL_NS(document)::Document* doc, CL_NS(analysis)::Analyzer* analyzer); bool updateDocument(Term* t, CL_NS(document)::Document* doc, CL_NS(analysis)::Analyzer* analyzer); bool updateDocument(CL_NS(document)::Document* doc, CL_NS(analysis)::Analyzer* analyzer, Term* delTerm); int32_t getNumBufferedDeleteTerms(); const TermNumMapType& getBufferedDeleteTerms(); const std::vector* getBufferedDeleteDocIDs(); // Reset buffered deletes. void clearBufferedDeletes(); bool bufferDeleteTerms(const CL_NS(util)::ArrayBase* terms); bool bufferDeleteTerm(Term* term); void setMaxBufferedDeleteTerms(int32_t maxBufferedDeleteTerms); int32_t getMaxBufferedDeleteTerms(); bool hasDeletes(); int64_t getRAMUsed(); int64_t numBytesAlloc; int64_t numBytesUsed; /* Used only when writing norms to fill in default norm * value into the holes in docID stream for those docs * that didn't have this field. */ static void fillBytes(CL_NS(store)::IndexOutput* out, uint8_t b, int32_t numBytes); uint8_t* copyByteBuffer; /** Copy numBytes from srcIn to destIn */ void copyBytes(CL_NS(store)::IndexInput* srcIn, CL_NS(store)::IndexOutput* destIn, int64_t numBytes); // Size of each slice. These arrays should be at most 16 // elements. First array is just a compact way to encode // X+1 with a max. Second array is the length of each // slice, ie first slice is 5 bytes, next slice is 14 // bytes, etc. static const int32_t nextLevelArray[10]; static const int32_t levelSizeArray[10]; // Why + 5*POINTER_NUM_BYTE below? // 1: Posting has "vector" field which is a pointer // 2: Posting is referenced by postingsFreeList array // 3,4,5: Posting is referenced by postings hash, which // targets 25-50% fill factor; approximate this // as 3X # pointers //TODO: estimate this accurately for C++! static const int32_t POSTING_NUM_BYTE; /// = OBJECT_HEADER_BYTES + 9*INT_NUM_BYTE + 5*POINTER_NUM_BYTE; /* Allocate more Postings from shared pool */ void getPostings(CL_NS(util)::ValueArray& postings); void recyclePostings(CL_NS(util)::ValueArray& postings, int32_t numPostings); /* Initial chunks size of the shared uint8_t[] blocks used to store postings data */ static const int32_t BYTE_BLOCK_SHIFT; static const int32_t BYTE_BLOCK_SIZE; static const int32_t BYTE_BLOCK_MASK; static const int32_t BYTE_BLOCK_NOT_MASK; /* Allocate another uint8_t[] from the shared pool */ uint8_t* getByteBlock(bool trackAllocations); /* Return a uint8_t[] to the pool */ void recycleBlocks(CL_NS(util)::ArrayBase& blocks, int32_t start, int32_t end); /* Initial chunk size of the shared char[] blocks used to store term text */ static const int32_t CHAR_BLOCK_SHIFT; static const int32_t CHAR_BLOCK_SIZE; static const int32_t CHAR_BLOCK_MASK; static const int32_t MAX_TERM_LENGTH; /* Allocate another char[] from the shared pool */ TCHAR* getCharBlock(); /* Return a char[] to the pool */ void recycleBlocks(CL_NS(util)::ArrayBase& blocks, int32_t start, int32_t numBlocks); std::string toMB(int64_t v); }; #define CLUCENE_END_OF_WORD 0x0 CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_FieldInfo.h000066400000000000000000000010101154025176300225340ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_FieldInfo_ #define _lucene_index_FieldInfo_ #error "This header is deprecated, use _FieldInfos.h instead" #endif clucene-core-2.3.3.4/src/core/CLucene/index/_FieldInfos.h000066400000000000000000000152561154025176300227400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_FieldInfos_ #define _lucene_index_FieldInfos_ #include "CLucene/store/Directory.h" CL_CLASS_DEF(document,Document) CL_CLASS_DEF(document,Field) CL_NS_DEF(index) class FieldInfo :LUCENE_BASE{ public: //name of the field const TCHAR* name; //Is field indexed? true = yes false = no bool isIndexed; //field number const int32_t number; // true if term vector for this field should be stored bool storeTermVector; bool storeOffsetWithTermVector; bool storePositionWithTermVector; bool omitNorms; // omit norms associated with indexed fields bool storePayloads; // whether this field stores payloads together with term positions //Func - Constructor // Initialises FieldInfo. // na holds the name of the field // tk indicates whether this field is indexed or not // nu indicates its number //Pre - na != NULL and holds the name of the field // tk is true or false // number >= 0 //Post - The FieldInfo instance has been created and initialized. // name holds the duplicated string of na // isIndexed = tk // number = nu FieldInfo(const TCHAR* fieldName, const bool isIndexed, const int32_t fieldNumber, const bool storeTermVector, const bool storeOffsetWithTermVector, const bool storePositionWithTermVector, const bool omitNorms, const bool storePayloads); //Func - Destructor //Pre - true //Post - The instance has been destroyed ~FieldInfo(); /* Clones this * @memory - caller is responsible for deleting the returned object */ FieldInfo* clone(); }; /** Access to the Field Info file that describes document fields and whether or * not they are indexed. Each segment has a separate Field Info file. Objects * of this class are thread-safe for multiple readers, but only one thread can * be adding documents at a time, with no other reader or writer threads * accessing this object. */ class CLUCENE_EXPORT FieldInfos :LUCENE_BASE{ //we now use internd field names, so we can use the voidCompare //to directly compare the strings typedef CL_NS(util)::CLHashMap defByName; defByName byName; CL_NS(util)::CLArrayList > byNumber; public: enum{ IS_INDEXED = 0x1, STORE_TERMVECTOR = 0x2, STORE_POSITIONS_WITH_TERMVECTOR = 0x4, STORE_OFFSET_WITH_TERMVECTOR = 0x8, OMIT_NORMS = 0x10, STORE_PAYLOADS = 0x20 }; FieldInfos(); ~FieldInfos(); /** * Construct a FieldInfos object using the directory and the name of the file * IndexInput * @param d The directory to open the IndexInput from * @param name The name of the file to open the IndexInput from in the Directory * @throws IOException */ FieldInfos(CL_NS(store)::Directory* d, const char* name); /** * Returns a deep clone of this FieldInfos instance. * @memory caller is responisble for deleting returned object */ FieldInfos* clone(); /** Adds field info for a Document. */ void add(const CL_NS(document)::Document* doc); /** * Add fields that are indexed. Whether they have termvectors has to be specified. * * @param names The names of the fields. An array of TCHARs, last item has to be NULL * @param storeTermVectors Whether the fields store term vectors or not * @param storePositionWithTermVector treu if positions should be stored. * @param storeOffsetWithTermVector true if offsets should be stored */ void addIndexed(const TCHAR** names, const bool storeTermVectors, const bool storePositionWithTermVector, const bool storeOffsetWithTermVector); /** * Assumes the fields are not storing term vectors. * * @param names The names of the fields * @param isIndexed Whether the fields are indexed or not * * @see #add(TCHAR*, bool) */ void add(const TCHAR** names, const bool isIndexed, const bool storeTermVector=false, const bool storePositionWithTermVector=false, const bool storeOffsetWithTermVector=false, const bool omitNorms=false, const bool storePayloads=false); // Merges in information from another FieldInfos. void add(FieldInfos* other); /** If the field is not yet known, adds it. If it is known, checks to make * sure that the isIndexed flag is the same as was given previously for this * field. If not - marks it as being indexed. Same goes for the TermVector * parameters. * * @param name The name of the field * @param isIndexed true if the field is indexed * @param storeTermVector true if the term vector should be stored * @param storePositionWithTermVector true if the term vector with positions should be stored * @param storeOffsetWithTermVector true if the term vector with offsets should be stored * @param omitNorms true if the norms for the indexed field should be omitted * @param storePayloads true if payloads should be stored for this field */ FieldInfo* add(const TCHAR* name, const bool isIndexed, const bool storeTermVector=false, const bool storePositionWithTermVector=false, const bool storeOffsetWithTermVector=false, const bool omitNorms=false, const bool storePayloads=false); // was void FieldInfo* addInternal( const TCHAR* name,const bool isIndexed, const bool storeTermVector, const bool storePositionWithTermVector, const bool storeOffsetWithTermVector, const bool omitNorms, const bool storePayloads); int32_t fieldNumber(const TCHAR* fieldName)const; /** * Return the fieldinfo object referenced by the fieldNumber. * @param fieldNumber * @return the FieldInfo object or null when the given fieldNumber * doesn't exist. */ FieldInfo* fieldInfo(const TCHAR* fieldName) const; /** * Return the fieldName identified by its number. * * @param fieldNumber * @return the fieldName or an empty string when the field * with the given number doesn't exist. */ const TCHAR* fieldName(const int32_t fieldNumber)const; /** * Return the fieldinfo object referenced by the fieldNumber. * @param fieldNumber * @return the FieldInfo object or null when the given fieldNumber * doesn't exist. */ FieldInfo* fieldInfo(const int32_t fieldNumber) const; size_t size()const; bool hasVectors() const; void write(CL_NS(store)::Directory* d, const char* name) const; void write(CL_NS(store)::IndexOutput* output) const; private: void read(CL_NS(store)::IndexInput* input); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_FieldsReader.h000066400000000000000000000153451154025176300232460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_FieldsReader_ #define _lucene_index_FieldsReader_ #include "CLucene/util/_ThreadLocal.h" CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(document,Document) #include "CLucene/document/Field.h" CL_CLASS_DEF(document,FieldSelector) CL_CLASS_DEF(index, FieldInfo) CL_CLASS_DEF(index, FieldInfos) CL_CLASS_DEF(store,IndexInput) CL_NS_DEF(index) /** * Class responsible for access to stored document fields. *

* It uses <segment>.fdt and <segment>.fdx; files. */ class FieldsReader :LUCENE_BASE{ private: const FieldInfos* fieldInfos; // The main fieldStream, used only for cloning. CL_NS(store)::IndexInput* cloneableFieldsStream; // This is a clone of cloneableFieldsStream used for reading documents. // It should not be cloned outside of a synchronized context. CL_NS(store)::IndexInput* fieldsStream; CL_NS(store)::IndexInput* indexStream; int32_t numTotalDocs; int32_t _size; bool closed; // The docID offset where our docs begin in the index // file. This will be 0 if we have our own private file. int32_t docStoreOffset; DEFINE_MUTEX(THIS_LOCK) CL_NS(util)::ThreadLocal > fieldsStreamTL; static void uncompress(const CL_NS(util)::ValueArray& input, CL_NS(util)::ValueArray& output); public: FieldsReader(CL_NS(store)::Directory* d, const char* segment, FieldInfos* fn, int32_t readBufferSize = CL_NS(store)::BufferedIndexInput::BUFFER_SIZE, int32_t docStoreOffset = -1, int32_t size = 0); virtual ~FieldsReader(); //protected: /** * @throws an exception (CL_ERR_IllegalState) if this FieldsReader is closed */ void ensureOpen(); /** * Closes the underlying {@link org.apache.lucene.store.IndexInput} streams, including any ones associated with a * lazy implementation of a Field. This means that the Fields values will not be accessible. * * @throws IOException */ void close(); int32_t size() const; /** Loads the fields from n'th document into doc. returns true on success. */ bool doc(int32_t n, CL_NS(document)::Document& doc, const CL_NS(document)::FieldSelector* fieldSelector = NULL); protected: /** Returns the length in bytes of each raw document in a * contiguous range of length numDocs starting with * startDocID. Returns the IndexInput (the fieldStream), * already seeked to the starting point for startDocID.*/ CL_NS(store)::IndexInput* rawDocs(int32_t* lengths, const int32_t startDocID, const int32_t numDocs); private: /** * Skip the field. We still have to read some of the information about the field, but can skip past the actual content. * This will have the most payoff on large fields. */ void skipField(const bool binary, const bool compressed); void skipField(const bool binary, const bool compressed, const int32_t toRead); void addFieldLazy(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize); /** Add the size of field as a byte[] containing the 4 bytes of the integer byte size (high order byte first; char = 2 bytes) * Read just the size -- caller must skip the field content to continue reading fields * Return the size in bytes or chars, depending on field type */ int32_t addFieldSize(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed); // in merge mode we don't uncompress the data of a compressed field void addFieldForMerge(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize); void addField(CL_NS(document)::Document& doc, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize); CL_NS(document)::Field::TermVector getTermVectorType(const FieldInfo* fi); CL_NS(document)::Field::Index getIndexType(const FieldInfo* fi, const bool tokenize); private: /** * A Lazy implementation of Field that differs loading of fields until asked for, instead of when the Document is * loaded. */ class LazyField : public CL_NS(document)::Field { private: int32_t toRead; int64_t pointer; FieldsReader* parent; public: LazyField(FieldsReader* _parent, const TCHAR* _name, int config, const int32_t _toRead, const int64_t _pointer); virtual ~LazyField(); private: CL_NS(store)::IndexInput* getFieldStream(); public: /** The value of the field in Binary, or null. If null, the Reader value, * String value, or TokenStream value is used. Exactly one of stringValue(), * readerValue(), binaryValue(), and tokenStreamValue() must be set. */ virtual const CL_NS(util)::ValueArray* binaryValue(); /** The value of the field as a Reader, or null. If null, the String value, * binary value, or TokenStream value is used. Exactly one of stringValue(), * readerValue(), binaryValue(), and tokenStreamValue() must be set. */ virtual CL_NS(util)::Reader* readerValue(); /** The value of the field as a String, or null. If null, the Reader value, * binary value, or TokenStream value is used. Exactly one of stringValue(), * readerValue(), binaryValue(), and tokenStreamValue() must be set. */ virtual const TCHAR* stringValue(); /** The value of the field as a TokesStream, or null. If null, the Reader value, * String value, or binary value is used. Exactly one of stringValue(), * readerValue(), binaryValue(), and tokenStreamValue() must be set. */ virtual CL_NS(analysis)::TokenStream* tokenStreamValue(); int64_t getPointer() const; void setPointer(const int64_t _pointer); int32_t getToRead() const; void setToRead(const int32_t _toRead); }; friend class LazyField; friend class SegmentMerger; friend class FieldsWriter; // Instances of this class hold field properties and data // for merge class FieldForMerge : public CL_NS(document)::Field { public: const TCHAR* stringValue() const; CL_NS(util)::Reader* readerValue() const; const CL_NS(util)::ValueArray* binaryValue(); CL_NS(analysis)::TokenStream* tokenStreamValue() const; FieldForMerge(void* _value, ValueType _type, const FieldInfo* fi, const bool binary, const bool compressed, const bool tokenize); virtual ~FieldForMerge(); virtual const char* getObjectName() const; static const char* getClassName(); }; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_FieldsWriter.h000066400000000000000000000042371154025176300233160ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_FieldsWriter_ #define _lucene_index_FieldsWriter_ CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(store,IndexOutput) CL_CLASS_DEF(store,IndexInput) CL_CLASS_DEF(index,FieldInfo) CL_CLASS_DEF(store,RAMOutputStream) CL_CLASS_DEF(document,Document) CL_CLASS_DEF(document,Field) CL_CLASS_DEF(index,FieldInfos) #include "CLucene/util/Array.h" CL_NS_DEF(index) class FieldsWriter :LUCENE_BASE{ private: FieldInfos* fieldInfos; CL_NS(store)::IndexOutput* fieldsStream; CL_NS(store)::IndexOutput* indexStream; bool doClose; static void compress(const CL_NS(util)::ValueArray& input, CL_NS(util)::ValueArray& output); public: LUCENE_STATIC_CONSTANT(uint8_t, FIELD_IS_TOKENIZED = 0x1); LUCENE_STATIC_CONSTANT(uint8_t, FIELD_IS_BINARY = 0x2); LUCENE_STATIC_CONSTANT(uint8_t, FIELD_IS_COMPRESSED = 0x4); FieldsWriter(CL_NS(store)::Directory* d, const char* segment, FieldInfos* fn); FieldsWriter(CL_NS(store)::IndexOutput* fdx, CL_NS(store)::IndexOutput* fdt, FieldInfos* fn); ~FieldsWriter(); // Writes the contents of buffer into the fields stream // and adds a new entry for this document into the index // stream. This assumes the buffer was already written // in the correct fields format. void flushDocument(int32_t numStoredFields, CL_NS(store)::RAMOutputStream* buffer); void flush(); void writeField(FieldInfo* fi, CL_NS(document)::Field* field); void close(); /** Bulk write a contiguous series of documents. The * lengths array is the length (in bytes) of each raw * document. The stream IndexInput is the * fieldsStream from which we should bulk-copy all * bytes. */ void addRawDocuments(CL_NS(store)::IndexInput* stream, const int32_t* lengths, const int32_t numDocs); void addDocument(CL_NS(document)::Document* doc); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_IndexFileDeleter.h000066400000000000000000000172741154025176300240740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_IndexFileDeleter_ #define _lucene_index_IndexFileDeleter_ #include "CLucene/util/Equators.h" #include "IndexDeletionPolicy.h" CL_CLASS_DEF(store,Directory) CL_NS_DEF(index) class SegmentInfos; class DocumentsWriter; class IndexDeletionPolicy; /* * This class keeps track of each SegmentInfos instance that * is still "live", either because it corresponds to a * segments_N file in the Directory (a "commit", i.e. a * committed SegmentInfos) or because it's the in-memory SegmentInfos * that a writer is actively updating but has not yet committed * (currently this only applies when autoCommit=false in IndexWriter). * This class uses simple reference counting to map the live * SegmentInfos instances to individual files in the Directory. * * The same directory file may be referenced by more than * one IndexCommitPoints, i.e. more than one SegmentInfos. * Therefore we count how many commits reference each file. * When all the commits referencing a certain file have been * deleted, the refcount for that file becomes zero, and the * file is deleted. * * A separate deletion policy interface * (IndexDeletionPolicy) is consulted on creation (onInit) * and once per commit (onCommit), to decide when a commit * should be removed. * * It is the business of the IndexDeletionPolicy to choose * when to delete commit points. The actual mechanics of * file deletion, retrying, etc, derived from the deletion * of commit points is the business of the IndexFileDeleter. * * The current default deletion policy is {@link * KeepOnlyLastCommitDeletionPolicy}, which removes all * prior commits when a new commit has completed. This * matches the behavior before 2.2. * * Note that you must hold the write.lock before * instantiating this class. It opens segments_N file(s) * directly with no retry logic. */ class IndexFileDeleter { private: /** * Tracks the reference count for a single index file: */ class RefCount { public: int count; int IncRef() { return ++count; } int DecRef() { return --count; } }; /** * Holds details for each commit point. This class is * also passed to the deletion policy. Note: this class * has a natural ordering that is inconsistent with * equals. */ class CommitPoint: public IndexCommitPoint, public CL_NS(util)::Comparable { int64_t gen; std::string segmentsFileName; IndexFileDeleter* _this; public: std::vector files; bool deleted; CommitPoint(IndexFileDeleter* _this, SegmentInfos* segmentInfos); virtual ~CommitPoint(); /** * Get the segments_N file for this commit point. */ std::string getSegmentsFileName(); const std::vector& getFileNames(); /** * Called only be the deletion policy, to remove this * commit point from the index. */ void deleteCommitPoint(); int32_t compareTo(NamedObject* obj); static const char* getClassName(); const char* getObjectName() const; static bool sort(IndexCommitPoint* elem1, IndexCommitPoint* elem2); }; private: /* Files that we tried to delete but failed (likely * because they are open and we are running on Windows), * so we will retry them again later: */ std::vector deletable; typedef CL_NS(util)::CLHashMap > RefCountsType; /* Reference count for all files in the index. * Counts how many existing commits reference a file. * Maps String to RefCount (class below) instances: */ RefCountsType refCounts; typedef CL_NS(util)::CLVector > CommitsType; /* Holds all commits (segments_N) currently in the index. * This will have just 1 commit if you are using the * default delete policy (KeepOnlyLastCommitDeletionPolicy). * Other policies may leave commit points live for longer * in which case this list would be longer than 1: */ CommitsType commits; /* Holds files we had incref'd from the previous * non-commit checkpoint: */ std::vector lastFiles; /* Commits that the IndexDeletionPolicy have decided to delete: */ CL_NS(util)::CLArrayList commitsToDelete; std::ostream* infoStream; CL_NS(store)::Directory* directory; IndexDeletionPolicy* policy; DocumentsWriter* docWriter; public: void deletePendingFiles(); void setInfoStream(std::ostream* infoStream); void message(std::string message); void decRef(const std::string& fileName); RefCount* getRefCount(const char* fileName); /** * Remove the CommitPoints in the commitsToDelete List by * DecRef'ing all files from each SegmentInfos. */ void deleteCommits(); /** Change to true to see details of reference counts when * infoStream != null */ static bool VERBOSE_REF_COUNTS; /** * Initialize the deleter: find all previous commits in * the Directory, incref the files they reference, call * the policy to let it delete commits. The incoming * segmentInfos must have been loaded from a commit point * and not yet modified. This will remove any files not * referenced by any of the commits. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ IndexFileDeleter(CL_NS(store)::Directory* directory, IndexDeletionPolicy* policy, SegmentInfos* segmentInfos, std::ostream* infoStream, DocumentsWriter* docWriter); ~IndexFileDeleter(); /** * Writer calls this when it has hit an error and had to * roll back, to tell us that there may now be * unreferenced files in the filesystem. So we re-list * the filesystem and delete such files. If segmentName * is non-null, we will only delete files corresponding to * that segment. */ void refresh(const char* segmentName); void refresh(); void close(); /** * For definition of "check point" see IndexWriter comments: * "Clarification: Check Points (and commits)". * * Writer calls this when it has made a "consistent * change" to the index, meaning new files are written to * the index and the in-memory SegmentInfos have been * modified to point to those files. * * This may or may not be a commit (segments_N may or may * not have been written). * * We simply incref the files referenced by the new * SegmentInfos and decref the files we had previously * seen (if any). * * If this is a commit, we also call the policy to give it * a chance to remove other commits. If any commits are * removed, we decref their files as well. */ void checkpoint(SegmentInfos* segmentInfos, bool isCommit); void CLUCENE_LOCAL_DECL incRef(SegmentInfos* segmentInfos, bool isCommit); void CLUCENE_LOCAL_DECL incRef(const std::vector& files); void CLUCENE_LOCAL_DECL decRef(const std::vector& files) ; void CLUCENE_LOCAL_DECL decRef(SegmentInfos* segmentInfos); void CLUCENE_LOCAL_DECL deleteFiles(std::vector& files); /** Delets the specified files, but only if they are new * (have not yet been incref'd). */ void CLUCENE_LOCAL_DECL deleteNewFiles(const std::vector& files); void CLUCENE_LOCAL_DECL deleteFile(const char* fileName); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_IndexFileNameFilter.h000066400000000000000000000033151154025176300245250ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_IndexFileNameFilter_ #define _lucene_index_IndexFileNameFilter_ #include "CLucene/util/Equators.h" #include "CLucene/util/VoidList.h" CL_NS_DEF(index) class FilenameFilter{ public: virtual bool accept(const char* dir, const char* name) const = 0; virtual ~FilenameFilter(); }; /** * Filename filter that accept filenames and extensions only created by Lucene. * * @author Daniel Naber / Bernhard Messer * @version $rcs = ' $Id: Exp $ ' ; */ class IndexFileNameFilter: public FilenameFilter { static IndexFileNameFilter* _singleton; static IndexFileNameFilter* singleton(); CL_NS(util)::CLHashSet extensions; CL_NS(util)::CLHashSet extensionsInCFS; public: IndexFileNameFilter(); virtual ~IndexFileNameFilter(); /* (non-Javadoc) * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String) */ bool accept(const char* dir, const char* name) const; /** * Returns true if this is a file that would be contained * in a CFS file. This function should only be called on * files that pass the above "accept" (ie, are already * known to be a Lucene index file). */ bool isCFSFile(const char* name) const; static const IndexFileNameFilter* getFilter(); static void _shutdown(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_IndexFileNames.h000066400000000000000000000043361154025176300235460ustar00rootroot00000000000000 #ifndef _lucene_index_IndexFileNames_ #define _lucene_index_IndexFileNames_ #include "CLucene/util/Array.h" CL_NS_DEF(index) class CLUCENE_EXPORT IndexFileNames { static CL_NS(util)::ConstValueArray _INDEX_EXTENSIONS; static CL_NS(util)::ConstValueArray _INDEX_EXTENSIONS_IN_COMPOUND_FILE; static CL_NS(util)::ConstValueArray _STORE_INDEX_EXTENSIONS; static CL_NS(util)::ConstValueArray _NON_STORE_INDEX_EXTENSIONS; static CL_NS(util)::ConstValueArray _COMPOUND_EXTENSIONS; static CL_NS(util)::ConstValueArray _VECTOR_EXTENSIONS; public: static const char* SEGMENTS; static const char* SEGMENTS_GEN; static const char* DELETABLE; static const char* NORMS_EXTENSION; static const char* FREQ_EXTENSION; static const char* PROX_EXTENSION; static const char* TERMS_EXTENSION; static const char* TERMS_INDEX_EXTENSION; static const char* FIELDS_INDEX_EXTENSION; static const char* FIELDS_EXTENSION; static const char* VECTORS_FIELDS_EXTENSION; static const char* VECTORS_DOCUMENTS_EXTENSION; static const char* VECTORS_INDEX_EXTENSION; static const char* COMPOUND_FILE_EXTENSION; static const char* COMPOUND_FILE_STORE_EXTENSION; static const char* DELETES_EXTENSION; static const char* FIELD_INFOS_EXTENSION; static const char* PLAIN_NORMS_EXTENSION; static const char* SEPARATE_NORMS_EXTENSION; static const char* GEN_EXTENSION; LUCENE_STATIC_CONSTANT(int32_t,COMPOUND_EXTENSIONS_LENGTH=7); LUCENE_STATIC_CONSTANT(int32_t,VECTOR_EXTENSIONS_LENGTH=3); LUCENE_STATIC_CONSTANT(int32_t,STORE_INDEX_EXTENSIONS_LENGTH=5); static CL_NS(util)::ConstValueArray& INDEX_EXTENSIONS(); static CL_NS(util)::ConstValueArray& INDEX_EXTENSIONS_IN_COMPOUND_FILE(); static CL_NS(util)::ConstValueArray& STORE_INDEX_EXTENSIONS(); static CL_NS(util)::ConstValueArray& NON_STORE_INDEX_EXTENSIONS(); static CL_NS(util)::ConstValueArray& COMPOUND_EXTENSIONS(); static CL_NS(util)::ConstValueArray& VECTOR_EXTENSIONS(); static std::string fileNameFromGeneration( const char* base, const char* extension, int64_t gen ); static bool isDocStoreFile( const char* fileName ); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_MultiSegmentReader.h000066400000000000000000000147631154025176300244600ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_MultiSegmentReader #define _lucene_index_MultiSegmentReader #include "DirectoryIndexReader.h" #include "IndexReader.h" CL_CLASS_DEF(document,Document) //#include "Terms.h" #include "_SegmentHeader.h" CL_NS_DEF(index) class SegmentMergeQueue; class MultiSegmentReader:public DirectoryIndexReader{ static int32_t readerIndex(const int32_t n, int32_t* starts, int32_t numSubReaders); public: typedef CL_NS(util)::CLHashtable > NormsCacheType; private: int32_t readerIndex(int32_t n) const; bool hasNorms(const TCHAR* field); uint8_t* fakeNorms(); void startCommit(); void rollbackCommit(); bool _hasDeletions; uint8_t* ones; NormsCacheType normsCache; int32_t _maxDoc; int32_t _numDocs; protected: CL_NS(util)::ArrayBase* subReaders; int32_t* starts; // 1st docno for each segment void doSetNorm(int32_t n, const TCHAR* field, uint8_t value); void doUndeleteAll(); void commitChanges(); // synchronized void doClose(); // synchronized void doDelete(const int32_t n); DirectoryIndexReader* doReopen(SegmentInfos* infos); void initialize( CL_NS(util)::ArrayBase* subReaders); public: /** Construct reading the named set of readers. */ MultiSegmentReader(CL_NS(store)::Directory* directory, SegmentInfos* sis, bool closeDirectory); /** This contructor is only used for {@link #reopen()} */ CLUCENE_LOCAL_DECL MultiSegmentReader( CL_NS(store)::Directory* directory, SegmentInfos* sis, bool closeDirectory, CL_NS(util)::ArrayBase* oldReaders, int32_t* oldStarts, NormsCacheType* oldNormsCache); virtual ~MultiSegmentReader(); /** Return an array of term frequency vectors for the specified document. * The array contains a vector for each vectorized field in the document. * Each vector vector contains term numbers and frequencies for all terms * in a given vectorized field. * If no such fields existed, the method returns null. */ TermFreqVector* getTermFreqVector(int32_t docNumber, const TCHAR* field=NULL); CL_NS(util)::ArrayBase* getTermFreqVectors(int32_t docNumber); void getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper); void getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper); bool isOptimized(); // synchronized int32_t numDocs(); int32_t maxDoc() const; bool document(int32_t n, CL_NS(document)::Document& doc, const CL_NS(document)::FieldSelector* fieldSelector); bool isDeleted(const int32_t n); bool hasDeletions() const; // synchronized uint8_t* norms(const TCHAR* field); void norms(const TCHAR* field, uint8_t* result); TermEnum* terms(); TermEnum* terms(const Term* term); //Returns the document frequency of the current term in the set int32_t docFreq(const Term* t=NULL); TermDocs* termDocs(); TermPositions* termPositions(); void getFieldNames (FieldOption fldOption, StringArrayWithDeletor& retarray); static void getFieldNames(FieldOption fldOption, StringArrayWithDeletor& retarray, CL_NS(util)::ArrayBase* subReaders); void setTermInfosIndexDivisor(int32_t indexDivisor); int32_t getTermInfosIndexDivisor(); const CL_NS(util)::ArrayBase* getSubReaders() const; friend class MultiReader; friend class SegmentReader; friend class DirectoryIndexReader; static const char* getClassName(); const char* getObjectName() const; }; class MultiTermDocs:public virtual TermDocs { protected: CL_NS(util)::ArrayBase* readerTermDocs; CL_NS(util)::ArrayBase* subReaders; const int32_t* starts; Term* term; int32_t base; size_t pointer; TermDocs* current; // == segTermDocs[pointer] TermDocs* termDocs(const int32_t i); //< internal use only virtual TermDocs* termDocs(IndexReader* reader); void init(CL_NS(util)::ArrayBase* subReaders, const int32_t* starts); public: MultiTermDocs(); MultiTermDocs(CL_NS(util)::ArrayBase* subReaders, const int32_t* s); virtual ~MultiTermDocs(); int32_t doc() const; int32_t freq() const; void seek(TermEnum* termEnum); void seek(Term* tterm); bool next(); /** Optimized implementation. */ int32_t read(int32_t* docs, int32_t* freqs, int32_t length); /* A Possible future optimization could skip entire segments */ bool skipTo(const int32_t target); void close(); virtual TermPositions* __asTermPositions(); }; //MultiTermEnum represents the enumeration of all terms of all readers class MultiTermEnum:public TermEnum { private: SegmentMergeQueue* queue; Term* _term; int32_t _docFreq; public: //Constructor //Opens all enumerations of all readers MultiTermEnum(CL_NS(util)::ArrayBase* subReaders, const int32_t* starts, const Term* t); //Destructor ~MultiTermEnum(); //Move the current term to the next in the set of enumerations bool next(); //Returns a pointer to the current term of the set of enumerations Term* term(bool pointer=true); //Returns the document frequency of the current term in the set int32_t docFreq() const; //Closes the set of enumerations in the queue void close(); const char* getObjectName() const; static const char* getClassName(); }; #ifdef _MSC_VER #pragma warning(disable : 4250) #endif class MultiTermPositions:public MultiTermDocs,public TermPositions { protected: TermDocs* termDocs(IndexReader* reader); public: MultiTermPositions(CL_NS(util)::ArrayBase* subReaders, const int32_t* s); virtual ~MultiTermPositions() {}; int32_t nextPosition(); /** * Not implemented. * @throws UnsupportedOperationException */ int32_t getPayloadLength() const; /** * Not implemented. * @throws UnsupportedOperationException */ uint8_t* getPayload(uint8_t* data); /** * * @return false */ // TODO: Remove warning after API has been finalized bool isPayloadAvailable() const; virtual TermDocs* __asTermDocs(); virtual TermPositions* __asTermPositions(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SegmentHeader.h000066400000000000000000000321531154025176300234240ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SegmentHeader_ #define _lucene_index_SegmentHeader_ #include "_SegmentInfos.h" #include "CLucene/util/BitSet.h" //#include "CLucene/util/VoidMap.h" #include "CLucene/store/IndexInput.h" #include "CLucene/store/IndexOutput.h" #include "CLucene/index/IndexReader.h" #include "Term.h" #include "Terms.h" #include "_TermInfo.h" //#include "FieldInfos.h" #include "_FieldsReader.h" #include "_TermVector.h" //#include "IndexReader.h" #include "_TermInfosReader.h" #include "_CompoundFile.h" #include "DirectoryIndexReader.h" #include "_SkipListReader.h" #include "CLucene/util/_ThreadLocal.h" CL_NS_DEF(index) class SegmentReader; class SegmentTermDocs:public virtual TermDocs { protected: const SegmentReader* parent; CL_NS(store)::IndexInput* freqStream; int32_t count; int32_t df; CL_NS(util)::BitSet* deletedDocs; int32_t _doc; int32_t _freq; private: int32_t skipInterval; int32_t maxSkipLevels; DefaultSkipListReader* skipListReader; int64_t freqBasePointer; int64_t proxBasePointer; int64_t skipPointer; bool haveSkipped; protected: bool currentFieldStoresPayloads; public: ///\param Parent must be a segment reader SegmentTermDocs( const SegmentReader* Parent); virtual ~SegmentTermDocs(); virtual void seek(Term* term); virtual void seek(TermEnum* termEnum); virtual void seek(const TermInfo* ti,Term* term); virtual void close(); virtual int32_t doc()const; virtual int32_t freq()const; virtual bool next(); /** Optimized implementation. */ virtual int32_t read(int32_t* docs, int32_t* freqs, int32_t length); /** Optimized implementation. */ virtual bool skipTo(const int32_t target); virtual TermPositions* __asTermPositions(); protected: virtual void skippingDoc(){} virtual void skipProx(const int64_t /*proxPointer*/, const int32_t /*payloadLength*/){} }; class SegmentTermPositions: public SegmentTermDocs, public TermPositions { private: CL_NS(store)::IndexInput* proxStream; int32_t proxCount; int32_t position; // the current payload length int32_t payloadLength; // indicates whether the payload of the currend position has // been read from the proxStream yet bool needToLoadPayload; // these variables are being used to remember information // for a lazy skip int64_t lazySkipPointer; int32_t lazySkipProxCount; public: ///\param Parent must be a segment reader SegmentTermPositions(const SegmentReader* Parent); virtual ~SegmentTermPositions(); private: void seek(const TermInfo* ti, Term* term); public: void close(); int32_t nextPosition(); private: int32_t readDeltaPosition(); protected: void skippingDoc(); public: bool next(); int32_t read(int32_t* docs, int32_t* freqs, int32_t length); protected: /** Called by super.skipTo(). */ void skipProx(const int64_t proxPointer, const int32_t _payloadLength); private: void skipPositions( int32_t n ); void skipPayload(); // It is not always neccessary to move the prox pointer // to a new document after the freq pointer has been moved. // Consider for example a phrase query with two terms: // the freq pointer for term 1 has to move to document x // to answer the question if the term occurs in that document. But // only if term 2 also matches document x, the positions have to be // read to figure out if term 1 and term 2 appear next // to each other in document x and thus satisfy the query. // So we move the prox pointer lazily to the document // as soon as positions are requested. void lazySkip(); public: int32_t getPayloadLength() const; uint8_t* getPayload(uint8_t* data); bool isPayloadAvailable() const; private: virtual TermDocs* __asTermDocs(); virtual TermPositions* __asTermPositions(); //resolve SegmentTermDocs/TermPositions ambiguity void seek(Term* term){ SegmentTermDocs::seek(term); } void seek(TermEnum* termEnum){ SegmentTermDocs::seek(termEnum); } int32_t doc() const{ return SegmentTermDocs::doc(); } int32_t freq() const{ return SegmentTermDocs::freq(); } bool skipTo(const int32_t target){ return SegmentTermDocs::skipTo(target); } }; /** * An IndexReader responsible for reading 1 segment of an index */ class SegmentReader: public DirectoryIndexReader { /** * The class Norm represents the normalizations for a field. * These normalizations are read from an IndexInput in into an array of bytes called bytes */ class Norm :LUCENE_BASE{ int32_t number; int64_t normSeek; SegmentReader* _this; const char* segment; ///< pointer to segment name volatile int32_t refCount; bool useSingleNormStream; bool rollbackDirty; /** Closes the underlying IndexInput for this norm. * It is still valid to access all other norm properties after close is called. * @throws IOException */ void close(); public: DEFINE_MUTEX(THIS_LOCK) CL_NS(store)::IndexInput* in; uint8_t* bytes; bool dirty; //Constructor Norm(CL_NS(store)::IndexInput* instrm, bool useSingleNormStream, int32_t number, int64_t normSeek, SegmentReader* reader, const char* segment); //Destructor ~Norm(); void reWrite(SegmentInfo* si); void incRef(); void decRef(); friend class SegmentReader; static void doDelete(Norm* norm); }; friend class SegmentReader::Norm; //Holds the name of the segment that is being read std::string segment; SegmentInfo* si; int32_t readBufferSize; //Indicates if there are documents marked as deleted bool deletedDocsDirty; bool normsDirty; bool undeleteAll; bool rollbackDeletedDocsDirty; bool rollbackNormsDirty; bool rollbackUndeleteAll; //Holds all norms for all fields in the segment typedef CL_NS(util)::CLHashtable NormsType; NormsType _norms; uint8_t* ones; uint8_t* fakeNorms(); // optionally used for the .nrm file shared by multiple norms CL_NS(store)::IndexInput* singleNormStream; // Compound File Reader when based on a compound file segment CompoundFileReader* cfsReader; CompoundFileReader* storeCFSReader; ///Reads the Field Info file FieldsReader* fieldsReader; TermVectorsReader* termVectorsReaderOrig; CL_NS(util)::ThreadLocal >termVectorsLocal; void initialize(SegmentInfo* si, int32_t readBufferSize, bool doOpenStores, bool doingReopen); /** * Create a clone from the initial TermVectorsReader and store it in the ThreadLocal. * @return TermVectorsReader */ TermVectorsReader* getTermVectorsReader(); FieldsReader* getFieldsReader(); FieldInfos* getFieldInfos(); protected: ///Marks document docNum as deleted void doDelete(const int32_t docNum); void doUndeleteAll(); void commitChanges(); void doSetNorm(int32_t doc, const TCHAR* field, uint8_t value); // can return null if norms aren't stored uint8_t* getNorms(const TCHAR* field); /** * Decrements the RC of the norms this reader is using */ void decRefNorms(); DirectoryIndexReader* doReopen(SegmentInfos* infos); public: /** * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static SegmentReader* get(SegmentInfo* si, bool doOpenStores=true); /** * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static SegmentReader* get(SegmentInfo* si, int32_t readBufferSize, bool doOpenStores=true); /** * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static SegmentReader* get(SegmentInfos* sis, SegmentInfo* si, bool closeDir); /** * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error * @param readBufferSize defaults to BufferedIndexInput::BUFFER_SIZE */ static SegmentReader* get(CL_NS(store)::Directory* dir, SegmentInfo* si, SegmentInfos* sis, bool closeDir, bool ownDir, int32_t readBufferSize=-1, bool doOpenStores=true); SegmentReader(); ///Destructor. virtual ~SegmentReader(); ///Closes all streams to the files of a single segment void doClose(); ///Checks if a segment managed by SegmentInfo si has deletions static bool hasDeletions(const SegmentInfo* si); bool hasDeletions() const; bool hasNorms(const TCHAR* field); ///Returns all file names managed by this SegmentReader void files(std::vector& retarray); ///Returns an enumeration of all the Terms and TermInfos in the set. TermEnum* terms(); ///Returns an enumeration of terms starting at or after the named term t TermEnum* terms(const Term* t); ///Gets the document identified by n bool document(int32_t n, CL_NS(document)::Document& doc, const CL_NS(document)::FieldSelector* fieldSelector); ///Checks if the n-th document has been marked deleted bool isDeleted(const int32_t n); ///Returns an unpositioned TermDocs enumerator. TermDocs* termDocs(); ///Returns an unpositioned TermPositions enumerator. TermPositions* termPositions(); ///Returns the number of documents which contain the term t int32_t docFreq(const Term* t); ///Returns the actual number of documents in the segment int32_t numDocs(); ///Returns the number of all the documents in the segment including the ones that have ///been marked deleted int32_t maxDoc() const; void setTermInfosIndexDivisor(int32_t indexDivisor); int32_t getTermInfosIndexDivisor(); ///Returns the bytes array that holds the norms of a named field. ///Returns fake norms if norms aren't available uint8_t* norms(const TCHAR* field); ///Reads the Norms for field from disk void norms(const TCHAR* field, uint8_t* bytes); ///concatenating segment with ext and x std::string SegmentName(const char* ext, const int32_t x=-1); ///Creates a filename in buffer by concatenating segment with ext and x void SegmentName(char* buffer,int32_t bufferLen,const char* ext, const int32_t x=-1 ); /** * @see IndexReader#getFieldNames(IndexReader.FieldOption fldOption) */ void getFieldNames(FieldOption fldOption, StringArrayWithDeletor& retarray); static bool usesCompoundFile(SegmentInfo* si); /** Return a term frequency vector for the specified document and field. The * vector returned contains term numbers and frequencies for all terms in * the specified field of this document, if the field had storeTermVector * flag set. If the flag was not set, the method returns null. * @throws IOException */ TermFreqVector* getTermFreqVector(int32_t docNumber, const TCHAR* field=NULL); void getTermFreqVector(int32_t docNumber, const TCHAR* field, TermVectorMapper* mapper); void getTermFreqVector(int32_t docNumber, TermVectorMapper* mapper); /** Return an array of term frequency vectors for the specified document. * The array contains a vector for each vectorized field in the document. * Each vector vector contains term numbers and frequencies for all terms * in a given vectorized field. * If no such fields existed, the method returns null. * @throws IOException */ CL_NS(util)::ArrayBase* getTermFreqVectors(int32_t docNumber); static const char* getClassName(); const char* getObjectName() const; // for testing only bool normsClosed(); private: //Open all norms files for all fields void openNorms(CL_NS(store)::Directory* cfsDir, int32_t readBufferSize); ///a bitVector that manages which documents have been deleted CL_NS(util)::BitSet* deletedDocs; ///an IndexInput to the frequency file CL_NS(store)::IndexInput* freqStream; ///For reading the fieldInfos file FieldInfos* _fieldInfos; ///For reading the Term Dictionary .tis file TermInfosReader* tis; ///an IndexInput to the prox file CL_NS(store)::IndexInput* proxStream; static bool hasSeparateNorms(SegmentInfo* si); static uint8_t* createFakeNorms(int32_t size); void loadDeletedDocs(); SegmentReader* reopenSegment(SegmentInfo* si); /** Returns the field infos of this segment */ FieldInfos* fieldInfos(); /** * Return the name of the segment this reader is reading. */ const char* getSegmentName(); /** * Return the SegmentInfo of the segment this reader is reading. */ SegmentInfo* getSegmentInfo(); void setSegmentInfo(SegmentInfo* info); void startCommit(); void rollbackCommit(); //allow various classes to access the internals of this. this allows us to have //a more tight idea of the package friend class IndexReader; friend class IndexWriter; friend class SegmentTermDocs; friend class SegmentTermPositions; friend class MultiReader; friend class MultiSegmentReader; friend class SegmentMerger; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SegmentInfos.h000066400000000000000000000441331154025176300233130ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SegmentInfos_ #define _lucene_index_SegmentInfos_ //#include "IndexReader.h" #include "CLucene/util/Misc.h" #include "_IndexFileNames.h" CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(store,IndexInput) CL_CLASS_DEF(store,IndexOutput) CL_NS_DEF(index) class SegmentInfo :LUCENE_BASE{ public: LUCENE_STATIC_CONSTANT(int32_t, NO = -1); // e.g. no norms; no deletes; LUCENE_STATIC_CONSTANT(int32_t, YES = 1); // e.g. have norms; have deletes; LUCENE_STATIC_CONSTANT(int32_t, CHECK_DIR = 0); // e.g. must check dir to see if there are norms/deletions LUCENE_STATIC_CONSTANT(int32_t, WITHOUT_GEN = 0); // a file name that has no GEN in it. std::string name; // unique name in dir int32_t docCount; // number of docs in seg CL_NS(store)::Directory* dir; // where segment resides private: bool preLockless; // true if this is a segments file written before // lock-less commits (2.1) int64_t delGen; // current generation of del file; NO if there // are no deletes; CHECK_DIR if it's a pre-2.1 segment // (and we must check filesystem); YES or higher if // there are deletes at generation N CL_NS(util)::ValueArray normGen; // current generation of each field's norm file. // If this array is null, for lockLess this means no // separate norms. For preLockLess this means we must // check filesystem. If this array is not null, its // values mean: NO says this field has no separate // norms; CHECK_DIR says it is a preLockLess segment and // filesystem must be checked; >= YES says this field // has separate norms with the specified generation int8_t isCompoundFile; // NO if it is not; YES if it is; CHECK_DIR if it's // pre-2.1 (ie, must check file system to see // if .cfs and .nrm exist) bool hasSingleNormFile; // true if this segment maintains norms in a single file; // false otherwise // this is currently false for segments populated by DocumentWriter // and true for newly created merged segments (both // compound and non compound). private: std::vector _files; // cached list of files that this segment uses // in the Directory int64_t _sizeInBytes; // total byte size of all of our files (computed on demand) int32_t docStoreOffset; // if this segment shares stored fields & vectors, this // offset is where in that file this segment's docs begin std::string docStoreSegment; // name used to derive fields/vectors file we share with // other segments // This string is being interned. There might be a way around this, // and if found, this would greatly improve perfomance. bool docStoreIsCompoundFile; // whether doc store files are stored in compound file (*.cfx) /* Called whenever any change is made that affects which * files this segment has. */ void clearFiles(); void addIfExists(std::vector& files, const std::string& fileName); public: SegmentInfo(const char* _name, const int32_t _docCount, CL_NS(store)::Directory* _dir, bool _isCompoundFile=SegmentInfo::CHECK_DIR, bool _hasSingleNormFile=false, int32_t _docStoreOffset = -1, const char* _docStoreSegment = NULL, bool _docStoreIsCompoundFile = false); /** * Construct a new SegmentInfo instance by reading a * previously saved SegmentInfo from input. * * @param dir directory to load from * @param format format of the segments info file * @param input input handle to read segment info from */ SegmentInfo(CL_NS(store)::Directory* dir, int32_t format, CL_NS(store)::IndexInput* input); ~SegmentInfo(); void setNumFields(const int32_t numFields); int64_t sizeInBytes(); bool hasDeletions() const; void advanceDelGen(); void clearDelGen(); SegmentInfo* clone (); std::string getDelFileName() const; /** * Returns true if this field for this segment has saved a separate norms file (__N.sX). * * @param fieldNumber the field index to check */ bool hasSeparateNorms(const int32_t fieldNumber) const; /** * Returns true if any fields in this segment have separate norms. */ bool hasSeparateNorms() const; /** * Get the file name for the norms file for this field. * * @param number field index */ std::string getNormFileName(const int32_t number) const; /** * Increment the generation count for the norms file for * this field. * * @param fieldIndex field whose norm file will be rewritten */ void advanceNormGen(const int32_t fieldIndex); /** * Mark whether this segment is stored as a compound file. * * @param isCompoundFile true if this is a compound file; * else, false */ void setUseCompoundFile(const bool isCompoundFile); /** * Returns true if this segment is stored as a compound * file; else, false. */ bool getUseCompoundFile() const; /* * Return all files referenced by this SegmentInfo. The * returns List is a locally cached List so you should not * modify it. */ const std::vector& files(); /** * Copy everything from src SegmentInfo into our instance. */ void reset(const SegmentInfo* src); /** * Save this segment's info. */ void write(CL_NS(store)::IndexOutput* output); int32_t getDocStoreOffset() const; bool getDocStoreIsCompoundFile() const; void setDocStoreIsCompoundFile(const bool v); /** * Returns a reference to docStoreSegment */ const std::string& getDocStoreSegment() const; void setDocStoreOffset(const int32_t offset); /** We consider another SegmentInfo instance equal if it * has the same dir and same name. */ bool equals(const SegmentInfo* obj); ///Gets the Directory where the segment resides CL_NS(store)::Directory* getDir() const{ return dir; } //todo: since dir is public, consider removing this function friend class SegmentReader; /** Used for debugging */ std::string segString(CL_NS(store)::Directory* dir); }; typedef CL_NS(util)::CLVector > segmentInfosType; //SegmentInfos manages a list of SegmentInfo instances //Each SegmentInfo contains information about a segment in a directory. // //The active segments in the index are stored in the segment info file. //An index only has a single file in this format, and it is named "segments". //This lists each segment by name, and also contains the size of each segment. //The format of the file segments is defined as follows: // // SegCount //Segments --> SegCount, // //SegCount, SegSize --> UInt32 // //SegName --> String // //SegName is the name of the segment, and is used as the file name prefix //for all of the files that compose the segment's index. // //SegSize is the number of documents contained in the segment index. // //Note: //At http://jakarta.apache.org/lucene/docs/fileformats.html the definition //of all file formats can be found. Note that java lucene currently //defines Segments as follows: // //Segments --> Format, Version, SegCount, SegCount // //Format, SegCount, SegSize --> UInt32 // //Format and Version have not been implemented yet class IndexReader; class SegmentInfos: LUCENE_BASE { public: DEFINE_MUTEX(THIS_LOCK) /** The file format version, a negative number. */ /* Works since counter, the old 1st entry, is always >= 0 */ LUCENE_STATIC_CONSTANT(int32_t,FORMAT=-1); /** This format adds details used for lockless commits. It differs * slightly from the previous format in that file names * are never re-used (write once). Instead, each file is * written to the next generation. For example, * segments_1, segments_2, etc. This allows us to not use * a commit lock. See file * formats for details. */ LUCENE_STATIC_CONSTANT(int32_t,FORMAT_LOCKLESS=-2); /** This format adds a "hasSingleNormFile" flag into each segment info. * See LUCENE-756 * for details. */ LUCENE_STATIC_CONSTANT(int32_t,FORMAT_SINGLE_NORM_FILE=-3); /** This format allows multiple segments to share a single * vectors and stored fields file. */ LUCENE_STATIC_CONSTANT(int32_t,FORMAT_SHARED_DOC_STORE=-4); private: /* This must always point to the most recent file format. */ LUCENE_STATIC_CONSTANT(int32_t,CURRENT_FORMAT=FORMAT_SHARED_DOC_STORE); public: int32_t counter; // used to name new segments /** * counts how often the index has been changed by adding or deleting docs. * starting with the current time in milliseconds forces to create unique version numbers. */ int64_t version; private: int64_t generation; // generation of the "segments_N" for the next commit int64_t lastGeneration; // generation of the "segments_N" file we last successfully read // or wrote; this is normally the same as generation except if // there was an IOException that had interrupted a commit /** * If non-null, information about loading segments_N files * will be printed here. @see #setInfoStream. */ static std::ostream* infoStream; LUCENE_STATIC_CONSTANT(int32_t,defaultGenFileRetryCount=10); LUCENE_STATIC_CONSTANT(int32_t,defaultGenFileRetryPauseMsec=50); LUCENE_STATIC_CONSTANT(int32_t,defaultGenLookaheadCount=10); segmentInfosType infos; friend class IndexWriter; //allow IndexWriter to use counter static void message(const char* _message, ...); public: SegmentInfos(bool deleteMembers=true, int32_t reserveCount=0); ~SegmentInfos(); //Returns a reference to the i-th SegmentInfo in the list. SegmentInfo* info(int32_t i) const; /** * Get the generation (N) of the current segments_N file * from a list of files. * * @param files -- array of file names to check */ static int64_t getCurrentSegmentGeneration( std::vector& files ); /** * Get the generation (N) of the current segments_N file * in the directory. * * @param directory -- directory to search for the latest segments_N file */ static int64_t getCurrentSegmentGeneration( const CL_NS(store)::Directory* directory ); /** * Get the filename of the current segments_N file * from a list of files. * * @param files -- array of file names to check */ static std::string getCurrentSegmentFileName( std::vector& files ); /** * Get the filename of the current segments_N file * in the directory. * * @param directory -- directory to search for the latest segments_N file */ static std::string getCurrentSegmentFileName( CL_NS(store)::Directory* directory ); /** * Get the segments_N filename in use by this segment infos. */ std::string getCurrentSegmentFileName(); /** * Parse the generation off the segments file name and * return it. */ static int64_t generationFromSegmentsFileName( const char* fileName ); /** * Get the next segments_N filename that will be written. */ std::string getNextSegmentFileName(); /* public vector-like operations */ //delete and clears objects 'from' from to 'to' void clearto(size_t to, size_t end); //count of segment infos int32_t size() const; /** add a segment info * @param pos position to add the info at. -1 for last position */ void add(SegmentInfo* info, int32_t pos=-1); SegmentInfo* elementAt(int32_t pos); void setElementAt(SegmentInfo* si, int32_t pos); void clear(); void insert(SegmentInfos* infos, bool takeMemory); void insert(SegmentInfo* info); int32_t indexOf(const SegmentInfo* info) const; void range(size_t from, size_t to, SegmentInfos& ret) const; void remove(size_t index, bool dontDelete=false); /** * Read a particular segmentFileName. Note that this may * throw an IOException if a commit is in process. * * @param directory -- directory containing the segments file * @param segmentFileName -- segment file to load * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void read(CL_NS(store)::Directory* directory, const char* segmentFileName); /** * This version of read uses the retry logic (for lock-less * commits) to find the right segments file to load. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ void read(CL_NS(store)::Directory* directory); //Writes a new segments file based upon the SegmentInfo instances it manages //note: still does not support lock-less writes (still pre-2.1 format) void write(CL_NS(store)::Directory* directory); /** * Returns a copy of this instance, also copying each * SegmentInfo. */ SegmentInfos* clone() const; /** * version number when this SegmentInfos was generated. */ int64_t getVersion() const; int64_t getGeneration() const; int64_t getLastGeneration() const; /** * Current version number from segments file. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ static int64_t readCurrentVersion(CL_NS(store)::Directory* directory); /** If non-null, information about retries when loading * the segments file will be printed to this. */ static void setInfoStream(std::ostream* infoStream); /** * @see #setInfoStream */ static std::ostream* getInfoStream(); /** * Advanced: set how many times to try loading the * segments.gen file contents to determine current segment * generation. This file is only referenced when the * primary method (listing the directory) fails. */ //static void setDefaultGenFileRetryCount(const int32_t count); /** * @see #setDefaultGenFileRetryCount */ static int32_t getDefaultGenFileRetryCount(); /** * Advanced: set how many milliseconds to pause in between * attempts to load the segments.gen file. */ //static void setDefaultGenFileRetryPauseMsec(const int32_t msec); /** * @see #setDefaultGenFileRetryPauseMsec */ static int32_t getDefaultGenFileRetryPauseMsec(); /** * Advanced: set how many times to try incrementing the * gen when loading the segments file. This only runs if * the primary (listing directory) and secondary (opening * segments.gen file) methods fail to find the segments * file. */ //static void setDefaultGenLookaheadCount(const int32_t count); /** * @see #setDefaultGenLookaheadCount */ static int32_t getDefaultGenLookahedCount(); class _FindSegmentsFile: LUCENE_BASE{ protected: const char* fileDirectory; CL_NS(store)::Directory* directory; void doRun(); virtual bool tryDoBody(const char* segmentFileName, CLuceneError& ret_err) = 0; }; /** * Utility class for executing code that needs to do * something with the current segments file. This is * necessary with lock-less commits because from the time * you locate the current segments file name, until you * actually open it, read its contents, or check modified * time, etc., it could have been deleted due to a writer * commit finishing. */ template class FindSegmentsFile: public _FindSegmentsFile{ protected: virtual RET doBody(const char* segmentFileName) = 0; RET result; //catch only IO errors, return true on success... bool tryDoBody(const char* segmentFileName, CLuceneError& ret_err){ try{ result = doBody(segmentFileName); return true; } catch (CLuceneError& err) { result = 0; ret_err.set(err.number(),err.what()); } return false; } public: FindSegmentsFile( CL_NS(store)::Directory* dir ){ this->directory = dir; this->fileDirectory = NULL; this->result = 0; } FindSegmentsFile( const char* dir ){ this->directory = NULL; this->fileDirectory = dir; this->result = 0; } ~FindSegmentsFile(){ } RET run(){ doRun(); return result; }; }; //friend class SegmentInfos::FindSegmentsFile; class FindSegmentsVersion: public FindSegmentsFile { public: FindSegmentsVersion( CL_NS(store)::Directory* dir ); FindSegmentsVersion( const char* dir ); int64_t doBody( const char* segmentFileName ); }; friend class SegmentInfos::FindSegmentsVersion; class FindSegmentsRead: public FindSegmentsFile { SegmentInfos* _this; public: FindSegmentsRead( CL_NS(store)::Directory* dir, SegmentInfos* _this ); FindSegmentsRead( const char* dir, SegmentInfos* _this ); bool doBody( const char* segmentFileName ); }; friend class SegmentInfos::FindSegmentsRead; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SegmentMergeInfo.h000066400000000000000000000022451154025176300241060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SegmentMergeInfo_ #define _lucene_index_SegmentMergeInfo_ //#include "SegmentTermEnum.h" //#include "SegmentHeader.h" #include "Terms.h" CL_NS_DEF(index) class IndexReader; class SegmentMergeInfo:LUCENE_BASE { private: int32_t* docMap; // maps around deleted docs TermPositions* postings; public: TermEnum* termEnum; Term* term; int32_t base; IndexReader* reader; //Constructor SegmentMergeInfo(const int32_t b, TermEnum* te, IndexReader* r); //Destructor ~SegmentMergeInfo(); //Moves the current term of the enumeration termEnum to the next and term //points to this new current term bool next(); //Closes the the resources void close(); // maps around deleted docs int32_t* getDocMap(); TermPositions* getPositions(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SegmentMergeQueue.h000066400000000000000000000025061154025176300242770ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SegmentMergeQueue_ #define _lucene_index_SegmentMergeQueue_ #include "CLucene/util/PriorityQueue.h" //#include "SegmentMergeInfo.h" CL_NS_DEF(index) class SegmentMergeQueue :public CL_NS(util)::PriorityQueue > { public: //Constructor //Creates a queue of length size SegmentMergeQueue(const int32_t size); //Destructor //Does nothing as its parent class will clean up everything ~SegmentMergeQueue(); //Closes and destroyes all SegmentMergeInfo Instances in the queue void close(); protected: //Overloaded method that implements the lessThan operator for the parent class //This method is used by the parent class Priority queue to reorder its internal //data structures. This implementation check if stiA is less than the current term of stiB. bool lessThan(SegmentMergeInfo* stiA, SegmentMergeInfo* stiB); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SegmentMerger.h000066400000000000000000000142131154025176300234520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SegmentMerger_ #define _lucene_index_SegmentMerger_ CL_CLASS_DEF(store,Directory) #include "CLucene/store/_RAMDirectory.h" #include "_SegmentMergeInfo.h" #include "_SegmentMergeQueue.h" #include "IndexReader.h" #include "_TermInfosWriter.h" #include "Terms.h" #include "MergePolicy.h" CL_NS_DEF(index) class DefaultSkipListWriter; /** * The SegmentMerger class combines two or more Segments, represented by an IndexReader ({@link #add}, * into a single Segment. After adding the appropriate readers, call the merge method to combine the * segments. *

* If the compoundFile flag is set, then the segments will be merged into a compound file. * * * @see #merge * @see #add */ class SegmentMerger:LUCENE_BASE { CL_NS(util)::ValueArray payloadBuffer; //Directory of the segment CL_NS(store)::Directory* directory; //name of the new segment std::string segment; //Set of IndexReaders CL_NS(util)::CLVector > readers; //Field Infos for t he FieldInfo instances of all fields FieldInfos* fieldInfos; int32_t mergedDocs; // Whether we should merge doc stores (stored fields and // vectors files). When all segments we are merging // already share the same doc store files, we don't need // to merge the doc stores. bool mergeDocStores; /** Maximum number of contiguous documents to bulk-copy when merging stored fields */ static int32_t MAX_RAW_MERGE_DOCS; //The queue that holds SegmentMergeInfo instances SegmentMergeQueue* queue; //IndexOutput to the new Frequency File CL_NS(store)::IndexOutput* freqOutput; //IndexOutput to the new Prox File CL_NS(store)::IndexOutput* proxOutput; //Writes Terminfos that have been merged TermInfosWriter* termInfosWriter; TermInfo termInfo; //(new) minimize consing int32_t termIndexInterval; int32_t skipInterval; int32_t maxSkipLevels; DefaultSkipListWriter* skipListWriter; public: static const uint8_t NORMS_HEADER[]; static const int NORMS_HEADER_length; /** * * @param dir The Directory to merge the other segments into * @param name The name of the new segment * @param compoundFile true if the new segment should use a compoundFile */ SegmentMerger( IndexWriter* writer, const char* name, MergePolicy::OneMerge* merge ); SegmentMerger(IndexWriter* writer, std::string name, MergePolicy::OneMerge* merge); void init(); //Destructor ~SegmentMerger(); /** * Add an IndexReader to the collection of readers that are to be merged * @param reader */ void add(IndexReader* reader); /** * * @param i The index of the reader to return * @return The ith reader to be merged */ IndexReader* segmentReader(const int32_t i); /** * Merges the readers specified by the {@link #add} method * into the directory passed to the constructor. * @param mergeDocStores if false, we will not merge the * stored fields nor vectors files * @return The number of documents that were merged * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ int32_t merge(bool mergeDocStores); /** * close all IndexReaders that have been added. * Should not be called before merge(). * @throws IOException */ void closeReaders(); class CheckAbort { private: float_t workCount; MergePolicy::OneMerge* merge; CL_NS(store)::Directory* dir; public: CheckAbort(MergePolicy::OneMerge* merge, CL_NS(store)::Directory* dir); /** * Records the fact that roughly units amount of work * have been done since this method was last called. * When adding time-consuming code into SegmentMerger, * you should test different values for units to ensure * that the time in between calls to merge.checkAborted * is up to ~ 1 second. */ void work(float_t units); }; private: CheckAbort* checkAbort; void addIndexed(IndexReader* reader, FieldInfos* fieldInfos, StringArrayWithDeletor& names, bool storeTermVectors, bool storePositionWithTermVector, bool storeOffsetWithTermVector, bool storePayloads); /** * Merge the fields of all segments * @return The number of documents in all of the readers * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ int32_t mergeFields(); /** * Merge the TermVectors from each of the segments into the new one. * @throws IOException */ void mergeVectors(); /** Merge the terms of all segments */ void mergeTerms(); /** Merges all TermInfos into a single segment */ void mergeTermInfos(); /** Merge one term found in one or more segments. The array smis * contains segments that are positioned at the same term. N * is the number of cells in the array actually occupied. * * @param smis array of segments * @param n number of cells in the array actually occupied * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ int32_t mergeTermInfo( SegmentMergeInfo** smis, int32_t n); /** Process postings from multiple segments all positioned on the * same term. Writes out merged entries into freqOutput and * the proxOutput streams. * * @param smis array of segments * @param n number of cells in the array actually occupied * @return number of documents across all segments where this term was found * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ int32_t appendPostings(SegmentMergeInfo** smis, int32_t n); //Merges the norms for all fields void mergeNorms(); void createCompoundFile(const char* filename, std::vector* files=NULL); friend class IndexWriter; //allow IndexWriter to use createCompoundFile }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SegmentTermEnum.h000066400000000000000000000065701154025176300237740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SegmentTermEnum_ #define _lucene_index_SegmentTermEnum_ //#include "Terms.h" //#include "FieldInfos.h" //#include "TermInfo.h" CL_NS_DEF(index) /** * SegmentTermEnum is an enumeration of all Terms and TermInfos */ class SegmentTermEnum:public TermEnum{ private: Term* _term; ///points to the current Term in the enumeration TermInfo* termInfo; ///points to the TermInfo matching the current Term in the enumeration bool isIndex; ///Indicates if the Segment is a an index bool isClone; ///Indicates if SegmentTermEnum is an orignal instance or ///a clone of another SegmentTermEnum TCHAR* buffer; ///The buffer that contains the data read from the Term Infos File uint32_t bufferLength; ///Length of the buffer int32_t format; int32_t formatM1SkipInterval; CL_NS(store)::IndexInput* input; ///The IndexInput that reads from the Term Infos File FieldInfos* fieldInfos; ///contains the Field Infos for the segment int64_t size; ///The size of the enumeration int64_t position; ///The position of the current (term) in the enumeration int64_t indexPointer; Term* prev; ///The previous current int32_t indexInterval; int32_t skipInterval; int32_t maxSkipLevels; friend class TermInfosReader; friend class SegmentTermDocs; protected: /** * Constructor. * The instance is created by cloning all properties of clone */ SegmentTermEnum( const SegmentTermEnum& clone); public: ///Constructor SegmentTermEnum(CL_NS(store)::IndexInput* i, FieldInfos* fis, const bool isi ); ///Destructor ~SegmentTermEnum(); /** * Moves the current of the set to the next in the set */ bool next(); /** * Returns the current term. */ Term* term(bool pointer=true); /** * Scan for Term term without allocating new Terms */ void scanTo(const Term *term); /** * Closes the enumeration to further activity, freeing resources. */ void close(); /** * Returns the document frequency of the current term in the set */ int32_t docFreq() const; /** * Repositions term and termInfo within the enumeration */ void seek(const int64_t pointer, const int32_t p, Term* t, TermInfo* ti); /** * Returns a clone of the current termInfo */ TermInfo* getTermInfo()const; /** * Retrieves a clone of termInfo through the reference ti */ void getTermInfo(TermInfo* ti)const; /** * Returns the freqPointer from the current TermInfo in the enumeration. */ int64_t freqPointer() const; /** * Returns the proxPointer from the current TermInfo in the enumeration. */ int64_t proxPointer() const; /** * Returns a clone of this instance */ SegmentTermEnum* clone() const; const char* getObjectName() const; static const char* getClassName(); private: /** * Reads the next term in the enumeration */ Term* readTerm(Term* reuse); /** * Instantiate a buffer of length length+1 * TODO: deprecate this... */ void growBuffer(const uint32_t length, bool force_copy); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SkipListReader.h000066400000000000000000000131361154025176300235760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SkipListReader_ #define _lucene_index_SkipListReader_ #include "CLucene/store/IndexInput.h" #include "CLucene/util/Array.h" CL_NS_DEF(index) /** * This abstract class reads skip lists with multiple levels. * * See {@link MultiLevelSkipListWriter} for the information about the encoding * of the multi level skip lists. * * Subclasses must implement the abstract method {@link #readSkipData(int, IndexInput)} * which defines the actual format of the skip data. */ class MultiLevelSkipListReader : LUCENE_BASE { protected: // number of levels in this skip list int32_t numberOfSkipLevels; // the maximum number of skip levels possible for this index int32_t maxNumberOfSkipLevels; private: // Expert: defines the number of top skip levels to buffer in memory. // Reducing this number results in less memory usage, but possibly // slower performance due to more random I/Os. // Please notice that the space each level occupies is limited by // the skipInterval. The top level can not contain more than // skipLevel entries, the second top level can not contain more // than skipLevel^2 entries and so forth. int32_t numberOfLevelsToBuffer; int32_t docCount; bool haveSkipped; CL_NS(util)::ObjectArray skipStream; // skipStream for each level int64_t* skipPointer; // the start pointer of each skip level int32_t* skipInterval; // skipInterval of each level int32_t* numSkipped; // number of docs skipped per level int32_t* skipDoc; // doc id of current skip entry per level int32_t lastDoc; // doc id of last read skip entry with docId <= target int64_t* childPointer; // child pointer of current skip entry per level int64_t lastChildPointer; // childPointer of last read skip entry with docId <= target bool inputIsBuffered; public: /** * @memory consumes _skipStream */ MultiLevelSkipListReader(CL_NS(store)::IndexInput* _skipStream, const int32_t maxSkipLevels, const int32_t _skipInterval); virtual ~MultiLevelSkipListReader(); /** Returns the id of the doc to which the last call of {@link #skipTo(int)} * has skipped. */ int32_t getDoc() const; /** Skips entries to the first beyond the current whose document number is * greater than or equal to target. Returns the current doc count. */ int32_t skipTo(const int32_t target); private: bool loadNextSkip(const int32_t level); protected: /** Seeks the skip entry on the given level */ virtual void seekChild(const int32_t level); void close(); /** initializes the reader */ void init(const int64_t _skipPointer, const int32_t df); private: /** Loads the skip levels */ void loadSkipLevels(); protected: /** * Subclasses must implement the actual skip data encoding in this method. * * @param level the level skip data shall be read from * @param skipStream the skip stream to read from */ virtual int32_t readSkipData(const int32_t level, CL_NS(store)::IndexInput* skipStream) = 0; /** Copies the values of the last read skip entry on this level */ virtual void setLastSkipData(const int32_t level); protected: /** used to buffer the top skip levels */ class SkipBuffer : public CL_NS(store)::IndexInput { private: uint8_t* data; int64_t pointer; int32_t pos; size_t _datalength; public: SkipBuffer(CL_NS(store)::IndexInput* input, const int32_t length); virtual ~SkipBuffer(); private: void close(); int64_t getFilePointer() const; int64_t length() const; uint8_t readByte(); /* Make sure b is passed after the offset has been calculated into it, if necessary! */ void readBytes(uint8_t* b, const int32_t len); void seek(const int64_t _pos); SkipBuffer(const SkipBuffer& other); CL_NS(store)::IndexInput* clone() const; const char* getDirectoryType() const; const char* getObjectName() const; static const char* getClassName(); }; }; /** * Implements the skip list reader for the default posting list format * that stores positions and payloads. * */ class DefaultSkipListReader: public MultiLevelSkipListReader { private: bool currentFieldStoresPayloads; int64_t* freqPointer; int64_t* proxPointer; int32_t* payloadLength; int64_t lastFreqPointer; int64_t lastProxPointer; int32_t lastPayloadLength; public: DefaultSkipListReader(CL_NS(store)::IndexInput* _skipStream, const int32_t maxSkipLevels, const int32_t _skipInterval); virtual ~DefaultSkipListReader(); void init(const int64_t _skipPointer, const int64_t freqBasePointer, const int64_t proxBasePointer, const int32_t df, const bool storesPayloads); /** Returns the freq pointer of the doc to which the last call of * {@link MultiLevelSkipListReader#skipTo(int)} has skipped. */ int64_t getFreqPointer() const; /** Returns the prox pointer of the doc to which the last call of * {@link MultiLevelSkipListReader#skipTo(int)} has skipped. */ int64_t getProxPointer() const; /** Returns the payload length of the payload stored just before * the doc to which the last call of {@link MultiLevelSkipListReader#skipTo(int)} * has skipped. */ int32_t getPayloadLength() const; protected: void seekChild(const int32_t level); void setLastSkipData(const int32_t level); int32_t readSkipData(const int32_t level, CL_NS(store)::IndexInput* _skipStream); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_SkipListWriter.h000066400000000000000000000100131154025176300236370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_SkipListWriter_ #define _lucene_index_SkipListWriter_ #include "CLucene/store/IndexInput.h" #include "CLucene/store/_RAMDirectory.h" #include "CLucene/util/Array.h" CL_NS_DEF(index) /** * This abstract class writes skip lists with multiple levels. * * Example for skipInterval = 3: * c (skip level 2) * c c c (skip level 1) * x x x x x x x x x x (skip level 0) * d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d (posting list) * 3 6 9 12 15 18 21 24 27 30 (df) * * d - document * x - skip data * c - skip data with child pointer * * Skip level i contains every skipInterval-th entry from skip level i-1. * Therefore the number of entries on level i is: floor(df / ((skipInterval ^ (i + 1))). * * Each skip entry on a level i>0 contains a pointer to the corresponding skip entry in list i-1. * This guarantess a logarithmic amount of skips to find the target document. * * While this class takes care of writing the different skip levels, * subclasses must define the actual format of the skip data. * */ class MultiLevelSkipListWriter { private: // the skip interval in the list with level = 0 int32_t skipInterval; // for every skip level a different buffer is used CL_NS(util)::ArrayBase* skipBuffer; /** * Writes the current skip data to the buffers. The current document frequency determines * the max level is skip data is to be written to. * * @param df the current document frequency * @throws IOException */ void bufferSkip(int32_t df); /** * Writes the buffered skip lists to the given output. * * @param output the IndexOutput the skip lists shall be written to * @return the pointer the skip list starts */ int64_t writeSkip(CL_NS(store)::IndexOutput* output); protected: // number of levels in this skip list int32_t numberOfSkipLevels; MultiLevelSkipListWriter(int32_t skipInterval, int32_t maxSkipLevels, int32_t df); virtual ~MultiLevelSkipListWriter(); void init(); void resetSkip(); /** * Subclasses must implement the actual skip data encoding in this method. * * @param level the level skip data shall be writting for * @param skipBuffer the skip buffer to write to */ virtual void writeSkipData(int32_t level, CL_NS(store)::IndexOutput* skipBuffer) = 0; friend class SegmentMerger; friend class DocumentsWriter; }; /** * Implements the skip list writer for the default posting list format * that stores positions and payloads. * */ class DefaultSkipListWriter: public MultiLevelSkipListWriter { private: int32_t* lastSkipDoc; int32_t* lastSkipPayloadLength; int64_t* lastSkipFreqPointer; int64_t* lastSkipProxPointer; CL_NS(store)::IndexOutput* freqOutput; CL_NS(store)::IndexOutput* proxOutput; int32_t curDoc; bool curStorePayloads; int32_t curPayloadLength; int64_t curFreqPointer; int64_t curProxPointer; /** * Sets the values for the current skip data. */ void setSkipData(int32_t doc, bool storePayloads, int32_t payloadLength); protected: void resetSkip(); void writeSkipData(int32_t level, CL_NS(store)::IndexOutput* skipBuffer); public: DefaultSkipListWriter(int32_t skipInterval, int32_t numberOfSkipLevels, int32_t docCount, CL_NS(store)::IndexOutput* freqOutput, CL_NS(store)::IndexOutput* proxOutput); ~DefaultSkipListWriter(); friend class SegmentMerger; friend class DocumentsWriter; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_Term.h000066400000000000000000000017041154025176300216160ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_internal_Term_ #define _lucene_index_internal_Term_ #include "Term.h" #include CL_NS_DEF(index) class Term_Equals:public CL_NS_STD(binary_function) { public: bool operator()( const Term* val1, const Term* val2 ) const{ return val1->equals(val2); } }; class Term_Compare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: bool operator()( Term* t1, Term* t2 ) const{ return ( t1->compareTo(t2) < 0 ); } size_t operator()( Term* t ) const{ return t->hashCode(); } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_TermInfo.h000066400000000000000000000032021154025176300224250ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_TermInfo #define _lucene_index_TermInfo CL_NS_DEF(index) // A TermInfo is the record of information stored for a term. class TermInfo: LUCENE_BASE{ public: // The number of documents which contain the term. int32_t docFreq; //A pointer into the TermFreqs file (.frq) //The .frq file contains the lists of documents which contain each term, //along with the frequency of the term in that document. int64_t freqPointer; //A pointer into the TermPosition file (.prx). //The .prx file contains the lists of positions that each term //occurs at within documents. int64_t proxPointer; int32_t skipOffset; //Constructor TermInfo(); //Constructor TermInfo(const int32_t df, const int64_t fp, const int64_t pp); //Constructor //Initialises this instance by copying the values of another TermInfo ti TermInfo(const TermInfo* ti); //Destructor ~TermInfo(); //Sets a new document frequency, a new freqPointer and a new proxPointer void set(const int32_t docFreq, const int64_t freqPointer, const int64_t proxPointer, int32_t skipOffset); //Sets a new document frequency, a new freqPointer and a new proxPointer //by copying these values from another instance of TermInfo void set(const TermInfo* ti); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_TermInfosReader.h000066400000000000000000000102551154025176300237410ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_TermInfosReader_ #define _lucene_index_TermInfosReader_ //#include "Terms.h" #include "_SegmentTermEnum.h" CL_CLASS_DEF(store,Directory) //CL_CLASS_DEF(store,IndexInput) #include "CLucene/util/_ThreadLocal.h" //#include "FieldInfos.h" //#include "TermInfo.h" //#include "TermInfosWriter.h" CL_NS_DEF(index) /** This stores a monotonically increasing set of pairs in a * Directory. Pairs are accessed either by Term or by ordinal position the * set. * * PORT STATUS: 365707 (jlucene 1.9) -- started port to JLucene 2.3.2 */ class TermInfosReader :LUCENE_BASE{ private: CL_NS(store)::Directory* directory; const char* segment; FieldInfos* fieldInfos; CL_NS(util)::ThreadLocal > enumerators; SegmentTermEnum* getEnum(); SegmentTermEnum* origEnum; SegmentTermEnum* indexEnum; int64_t _size; Term* indexTerms; //note: this is a list of objects, not arrays! int32_t indexTermsLength; TermInfo* indexInfos; int64_t* indexPointers; int32_t indexDivisor; int32_t totalIndexInterval; DEFINE_MUTEX(THIS_LOCK) public: /** * Constructor. * Reads the TermInfos file (.tis) and eventually the Term Info Index file (.tii) */ TermInfosReader(CL_NS(store)::Directory* dir, const char* segment, FieldInfos* fis, const int32_t readBufferSize = CL_NS(store)::BufferedIndexInput::BUFFER_SIZE); ~TermInfosReader(); int32_t getSkipInterval() const; int32_t getMaxSkipLevels() const; /** *

Sets the indexDivisor, which subsamples the number * of indexed terms loaded into memory. This has a * similar effect as {@link * IndexWriter#setTermIndexInterval} except that setting * must be done at indexing time while this setting can be * set per reader. When set to N, then one in every * N*termIndexInterval terms in the index is loaded into * memory. By setting this to a value > 1 you can reduce * memory usage, at the expense of higher latency when * loading a TermInfo. The default value is 1.

* * NOTE: you must call this before the term * index is loaded. If the index is already loaded, * an IllegalStateException is thrown. * * @throws IllegalStateException if the term index has * already been loaded into memory. */ void setIndexDivisor(const int32_t _indexDivisor); /** Returns the indexDivisor. * @see #setIndexDivisor */ int32_t getIndexDivisor() const; /** Close the enumeration of TermInfos */ void close(); /** Returns the number of term/value pairs in the set. */ int64_t size() const; /** * Returns an enumeration of terms starting at or after the named term. * If no term is specified, an enumeration of all the Terms * and TermInfos in the set is returned. */ SegmentTermEnum* terms(const Term* term=NULL); /** Returns the TermInfo for a Term in the set, or null. */ TermInfo* get(const Term* term); private: /** Reads the term info index file or .tti file. */ void ensureIndexIsRead(); /** Returns the offset of the greatest index entry which is less than or equal to term.*/ int32_t getIndexOffset(const Term* term); /** Reposition the current Term and TermInfo to indexOffset */ void seekEnum(const int32_t indexOffset); /** Scans the Enumeration of terms for term and returns the corresponding TermInfo instance if found. * The search is started from the current term. */ TermInfo* scanEnum(const Term* term); /** Scans the enumeration to the requested position and returns the Term located at that position */ Term* scanEnum(const int32_t position); /** Returns the position of a Term in the set or -1. */ int64_t getPosition(const Term* term); /** Returns the nth term in the set. synchronized */ Term* get(const int32_t position); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_TermInfosWriter.h000066400000000000000000000073351154025176300240200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_TermInfosWriter_ #define _lucene_index_TermInfosWriter_ #include "CLucene/util/Array.h" CL_CLASS_DEF(store,Directory) //#include "FieldInfos.h" //#include "TermInfo.h" //#include "Term.h" CL_NS_DEF(index) class FieldInfos; class TermInfo; // This stores a monotonically increasing set of pairs in a // Directory. A TermInfos can be written once, in order. class TermInfosWriter :LUCENE_BASE{ private: FieldInfos* fieldInfos; CL_NS(store)::IndexOutput* output; TermInfo* lastTi; int64_t size; int64_t lastIndexPointer; bool isIndex; CL_NS(util)::ValueArray lastTermText; int32_t lastTermTextLength; int32_t lastFieldNumber; CL_NS(util)::ValueArray termTextBuffer; TermInfosWriter* other; //inititalize TermInfosWriter(CL_NS(store)::Directory* directory, const char* segment, FieldInfos* fis, int32_t interval, bool isIndex); int32_t compareToLastTerm(int32_t fieldNumber, const TCHAR* termText, int32_t length); public: /** Expert: The maximum number of skip levels. Smaller values result in * slightly smaller indexes, but slower skipping in big posting lists. */ int32_t maxSkipLevels; /** The file format version, a negative number. */ LUCENE_STATIC_CONSTANT(int32_t,FORMAT=-3); //Expert: The fraction of {@link TermDocs} entries stored in skip tables, //used to accellerate {@link TermDocs#skipTo(int)}. Larger values result in //smaller indices, greater acceleration, but fewer accelerable cases, while //smaller values result in bigger indices, less acceleration and more //accelerable cases. More detailed experiments would be useful here. */ LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_TERMDOCS_SKIP_INTERVAL=16); /** * Expert: The fraction of terms in the "dictionary" which should be stored * in RAM. Smaller values use more memory, but make searching slightly * faster, while larger values use less memory and make searching slightly * slower. Searching is typically not dominated by dictionary lookup, so * tweaking this is rarely useful. */ int32_t indexInterval;// = 128 /** * Expert: The fraction of {@link TermDocs} entries stored in skip tables, * used to accellerate {@link TermDocs#SkipTo(int32_t)}. Larger values result in * smaller indexes, greater acceleration, but fewer accelerable cases, while * smaller values result in bigger indexes, less acceleration and more * accelerable cases. More detailed experiments would be useful here. */ int32_t skipInterval;// = 16 TermInfosWriter(CL_NS(store)::Directory* directory, const char* segment, FieldInfos* fis, int32_t interval); ~TermInfosWriter(); void add(Term* term, TermInfo* ti); /** Adds a new <, TermInfo> pair to the set. Term must be lexicographically greater than all previous Terms added. TermInfo pointers must be positive and greater than all previous.*/ void add(int32_t fieldNumber, const TCHAR* termText, int32_t termTextLength, const TermInfo* ti); /** Called to complete TermInfos creation. */ void close(); private: /** Helps constructors to initialize instances */ void initialise(CL_NS(store)::Directory* directory, const char* segment, int32_t interval, bool IsIndex); void writeTerm(int32_t fieldNumber, const TCHAR* termText, int32_t termTextLength); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/index/_TermVector.h000066400000000000000000000263551154025176300230120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_index_internal_termvector_h #define _lucene_index_internal_termvector_h #include "CLucene/util/Array.h" #include "_FieldInfos.h" #include "TermVector.h" //#include "FieldInfos.h" CL_NS_DEF(index) class TermVectorsWriter:LUCENE_BASE { private: CL_NS(store)::IndexOutput* tvx, *tvd, *tvf; FieldInfos* fieldInfos; public: TermVectorsWriter(CL_NS(store)::Directory* directory, const char* segment, FieldInfos* fieldInfos); ~TermVectorsWriter(); /** * Add a complete document specified by all its term vectors. If document has no * term vectors, add value for tvx. * * @param vectors * @throws IOException */ void addAllDocVectors(CL_NS(util)::ArrayBase* vectors); /** Close all streams. * to suppress exceptions from being thrown, pass an error object to be filled in */ void close(CLuceneError* err = NULL); }; /** */ class SegmentTermVector: public /*virtual*/ TermFreqVector { private: TCHAR* field; CL_NS(util)::ArrayBase* terms; CL_NS(util)::ArrayBase* termFreqs; int32_t binarySearch(const CL_NS(util)::ArrayBase& array, const TCHAR* key) const; public: //note: termFreqs must be the same length as terms SegmentTermVector(const TCHAR* field, CL_NS(util)::ArrayBase* terms, CL_NS(util)::ArrayBase* termFreqs); virtual ~SegmentTermVector(); /** * * @return The number of the field this vector is associated with */ const TCHAR* getField(); TCHAR* toString() const; int32_t size(); const CL_NS(util)::ArrayBase* getTerms(); const CL_NS(util)::ArrayBase* getTermFrequencies(); int32_t indexOf(const TCHAR* termText); CL_NS(util)::ArrayBase* indexesOf(const CL_NS(util)::ArrayBase& termNumbers, const int32_t start, const int32_t len); virtual TermPositionVector* __asTermPositionVector(); }; /** * @version $Id: */ class TermVectorMapper; // Forward declaration class CLUCENE_EXPORT TermVectorsReader:LUCENE_BASE { public: LUCENE_STATIC_CONSTANT(int32_t, FORMAT_VERSION = 2); LUCENE_STATIC_CONSTANT(uint8_t, STORE_POSITIONS_WITH_TERMVECTOR = 0x1); LUCENE_STATIC_CONSTANT(uint8_t, STORE_OFFSET_WITH_TERMVECTOR = 0x2); private: //The size in bytes that the FORMAT_VERSION will take up at the beginning of each file LUCENE_STATIC_CONSTANT(int32_t, FORMAT_SIZE = 4); FieldInfos* fieldInfos; CL_NS(store)::IndexInput* tvx; CL_NS(store)::IndexInput* tvd; CL_NS(store)::IndexInput* tvf; int64_t _size; // TODO: size_t ? // The docID offset where our docs begin in the index // file. This will be 0 if we have our own private file. int32_t docStoreOffset; int32_t tvdFormat; int32_t tvfFormat; public: TermVectorsReader(CL_NS(store)::Directory* d, const char* segment, FieldInfos* fieldInfos, int32_t readBufferSize=LUCENE_STREAM_BUFFER_SIZE, int32_t docStoreOffset=-1, int32_t size=0); ~TermVectorsReader(); private: int32_t checkValidFormat(CL_NS(store)::IndexInput* in); public: void close(); /** * * @return The number of documents in the reader */ int64_t size() const; public: void get(const int32_t docNum, const TCHAR* field, TermVectorMapper* mapper); /** * Retrieve the term vector for the given document and field * @param docNum The document number to retrieve the vector for * @param field The field within the document to retrieve * @return The TermFreqVector for the document and field or null if there is no termVector for this field. * @throws IOException if there is an error reading the term vector files */ TermFreqVector* get(const int32_t docNum, const TCHAR* field); /** * Return all term vectors stored for this document or null if the could not be read in. * * @param docNum The document number to retrieve the vector for * @return All term frequency vectors * @throws IOException if there is an error reading the term vector files */ CL_NS(util)::ArrayBase* get(const int32_t docNum); //bool get(int32_t docNum, CL_NS(util)::ObjectArray& result); void get(const int32_t docNumber, TermVectorMapper* mapper); private: CL_NS(util)::ObjectArray* readTermVectors(const int32_t docNum, const TCHAR** fields, const int64_t* tvfPointers, const int32_t len); void readTermVectors(const TCHAR** fields, const int64_t* tvfPointers, const int32_t len, TermVectorMapper* mapper); /** * * @param field The field to read in * @param tvfPointer The pointer within the tvf file where we should start reading * @param mapper The mapper used to map the TermVector * @return The TermVector located at that position * @throws IOException */ void readTermVector(const TCHAR* field, const int64_t tvfPointer, TermVectorMapper* mapper); DEFINE_MUTEX(THIS_LOCK) TermVectorsReader(const TermVectorsReader& copy); public: TermVectorsReader* clone() const; }; class SegmentTermPositionVector: public SegmentTermVector, public TermPositionVector { protected: CL_NS(util)::ArrayBase< CL_NS(util)::ArrayBase* >* positions; CL_NS(util)::ArrayBase< CL_NS(util)::ArrayBase* >* offsets; static CL_NS(util)::ValueArray EMPTY_TERM_POS; public: SegmentTermPositionVector(const TCHAR* field, CL_NS(util)::ArrayBase* terms, CL_NS(util)::ArrayBase* termFreqs, CL_NS(util)::ArrayBase< CL_NS(util)::ArrayBase* >* _positions, CL_NS(util)::ArrayBase< CL_NS(util)::ArrayBase* >* _offsets); ~SegmentTermPositionVector(); /** * Returns an array of TermVectorOffsetInfo in which the term is found. * * @param index The position in the array to get the offsets from * @return An array of TermVectorOffsetInfo objects or the empty list * @see org.apache.lucene.analysis.Token */ const CL_NS(util)::ArrayBase* getOffsets(const size_t index); /** * Returns an array of positions in which the term is found. * Terms are identified by the index at which its number appears in the * term String array obtained from the indexOf method. */ const CL_NS(util)::ArrayBase* getTermPositions(const size_t index); // disambiguation const TCHAR* getField(){ return SegmentTermVector::getField(); } TCHAR* toString() const{ return SegmentTermVector::toString(); } int32_t size(){ return SegmentTermVector::size(); } const CL_NS(util)::ArrayBase* getTerms(){ return SegmentTermVector::getTerms(); } const CL_NS(util)::ArrayBase* getTermFrequencies(){ return SegmentTermVector::getTermFrequencies(); } int32_t indexOf(const TCHAR* termText){ return SegmentTermVector::indexOf(termText); } CL_NS(util)::ArrayBase* indexesOf(const CL_NS(util)::ArrayBase& termNumbers, const int32_t start, const int32_t len); virtual TermPositionVector* __asTermPositionVector(); }; /** * The TermVectorMapper can be used to map Term Vectors into your own * structure instead of the parallel array structure used by * {@link org.apache.lucene.index.IndexReader#getTermFreqVector(int,String)}. *

* It is up to the implementation to make sure it is thread-safe. * * **/ class CLUCENE_EXPORT TermVectorMapper : LUCENE_BASE{ private: bool ignoringPositions; bool ignoringOffsets; protected: TermVectorMapper(); virtual ~TermVectorMapper(){}; /** * * @param ignoringPositions true if this mapper should tell Lucene to ignore positions even if they are stored * @param ignoringOffsets similar to ignoringPositions */ TermVectorMapper(const bool _ignoringPositions, const bool _ignoringOffsets); public: /** * Tell the mapper what to expect in regards to field, number of terms, offset and position storage. * This method will be called once before retrieving the vector for a field. * * This method will be called before {@link #map(String,int,TermVectorOffsetInfo[],int[])}. * @param field The field the vector is for * @param numTerms The number of terms that need to be mapped * @param storeOffsets true if the mapper should expect offset information * @param storePositions true if the mapper should expect positions info */ virtual void setExpectations(const TCHAR* _field, const int32_t numTerms, const bool storeOffsets, const bool storePositions) = 0; /** * Map the Term Vector information into your own structure * @param term The term to add to the vector * @param frequency The frequency of the term in the document * @param offsets null if the offset is not specified, otherwise the offset into the field of the term * @param positions null if the position is not specified, otherwise the position in the field of the term * @memory offset and position objects must be cleaned up by implementing class */ virtual void map(const TCHAR* term, const int32_t termLen, const int32_t frequency, CL_NS(util)::ArrayBase* _offsets, CL_NS(util)::ArrayBase* _positions) = 0; /** * Indicate to Lucene that even if there are positions stored, this mapper is not interested in them and they * can be skipped over. Derived classes should set this to true if they want to ignore positions. The default * is false, meaning positions will be loaded if they are stored. * @return false */ bool isIgnoringPositions() const; /** * * @see #isIgnoringPositions() Same principal as {@link #isIgnoringPositions()}, but applied to offsets. false by default. * @return false */ bool isIgnoringOffsets() const; /** * Passes down the index of the document whose term vector is currently being mapped, * once for each top level call to a term vector reader. *

* Default implementation IGNORES the document number. Override if your implementation needs the document number. *

* NOTE: Document numbers are internal to Lucene and subject to change depending on indexing operations. * * @param documentNumber index of document currently being mapped */ virtual void setDocumentNumber(const int32_t documentNumber); }; /** * Models the existing parallel array structure */ class ParallelArrayTermVectorMapper : public TermVectorMapper { private: CL_NS(util)::ArrayBase* terms; CL_NS(util)::ArrayBase* termFreqs; CL_NS(util)::ArrayBase< CL_NS(util)::ArrayBase* >* positions; CL_NS(util)::ArrayBase< CL_NS(util)::ArrayBase* >* offsets; int32_t currentPosition; bool storingOffsets; bool storingPositions; TCHAR* field; public: ParallelArrayTermVectorMapper(); virtual ~ParallelArrayTermVectorMapper(); void setExpectations(const TCHAR* _field, const int32_t numTerms, const bool storeOffsets, const bool storePositions); void map(const TCHAR* term, const int32_t termLen, const int32_t frequency, CL_NS(util)::ArrayBase* _offsets, CL_NS(util)::ArrayBase* _positions); /** * Construct the vector * @return The {@link TermFreqVector} based on the mappings. * @memory Caller is responsible for freeing up the returned object */ TermFreqVector* materializeVector(); void reset() { currentPosition = 0; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/000077500000000000000000000000001154025176300216105ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/queryParser/FastCharStream.cpp000066400000000000000000000061251154025176300251670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_CharStream.h" #include "_FastCharStream.h" #include "CLucene/util/CLStreams.h" CL_NS_DEF(queryParser) FastCharStream::FastCharStream(CL_NS(util)::Reader* r, bool ownsReader) : buffer(NULL), _bufferSize(0), bufferLength(0), bufferPosition(0), tokenStart(0), bufferStart(0), input(r), _ownsReader(ownsReader) { } FastCharStream::~FastCharStream() { if (_ownsReader ){ _CLLDELETE(input); } _CLDELETE_LCARRAY(buffer); } TCHAR FastCharStream::readChar() { if (bufferPosition >= bufferLength) refill(); return buffer[bufferPosition++]; } void FastCharStream::refill() { int32_t newPosition = bufferLength - tokenStart; if (tokenStart == 0) { // token won't fit in buffer if (buffer == NULL) { // first time: alloc buffer buffer = _CL_NEWARRAY(TCHAR, 2048); _bufferSize = 2048; } else if (bufferLength == _bufferSize) { // grow buffer _bufferSize *= 2; TCHAR* newBuffer = _CL_NEWARRAY(TCHAR, _bufferSize); _tcsncpy(newBuffer, buffer, bufferLength); _CLDELETE_LCARRAY(buffer); buffer = newBuffer; } } else { // shift token to front _tcsncpy(buffer, buffer+tokenStart,newPosition); } bufferLength = newPosition; // update state bufferPosition = newPosition; bufferStart += tokenStart; tokenStart = 0; const TCHAR* charBuf = NULL; int32_t charsRead = // fill space in buffer input->read(charBuf, newPosition, _bufferSize-newPosition); if (charsRead == -1){ _CLTHROWA(CL_ERR_IO, "read past eof"); } else { memcpy(buffer, charBuf, charsRead * sizeof(TCHAR)); // TODO: Can we use the reader buffer instead of copying to our own? bufferLength += charsRead; } } void FastCharStream::backup(const int32_t amount) { bufferPosition -= amount; } TCHAR* FastCharStream::GetImage() { size_t len = bufferPosition - tokenStart; TCHAR* ret = _CL_NEWARRAY(TCHAR, len + 1); _tcsncpy(ret, buffer+tokenStart, len); ret[len] = 0; // NULL terminated string return ret; } TCHAR* FastCharStream::GetSuffix(const int32_t len) { TCHAR* value = _CL_NEWARRAY(TCHAR, len + 1); _tcsncpy(value, buffer+(bufferPosition - len), len); value[len] = 0; // NULL terminated string return value; } void FastCharStream::Done() { } TCHAR FastCharStream::BeginToken() { tokenStart = bufferPosition; return readChar(); } int32_t FastCharStream::getColumn() const { return bufferStart + bufferPosition; } int32_t FastCharStream::getLine() const { return 1; } int32_t FastCharStream::getEndColumn() const { return bufferStart + bufferPosition; } int32_t FastCharStream::getEndLine() const { return 1; } int32_t FastCharStream::getBeginColumn() const { return bufferStart + tokenStart; } int32_t FastCharStream::getBeginLine() const { return 1; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/queryParser/MultiFieldQueryParser.cpp000066400000000000000000000146571154025176300265720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MultiFieldQueryParser.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/search/BooleanQuery.h" #include "CLucene/search/BooleanClause.h" #include "CLucene/search/PhraseQuery.h" #include "CLucene/search/MultiPhraseQuery.h" #include "CLucene/search/SearchHeader.h" #include "QueryParser.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(search) CL_NS_USE(analysis) CL_NS_DEF(queryParser) MultiFieldQueryParser::MultiFieldQueryParser(const TCHAR** _fields, CL_NS(analysis)::Analyzer* a, BoostMap* _boosts): QueryParser(NULL,a), fields(_fields), boosts(_boosts) { } MultiFieldQueryParser::~MultiFieldQueryParser(){ } Query* MultiFieldQueryParser::getFieldQuery(const TCHAR* field, TCHAR* queryText, const int32_t slop){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::getFieldQuery(fields[i], queryText); if (q != NULL) { //If the user passes a map of boosts if (boosts != NULL) { //Get the boost from the map and apply them BoostMap::const_iterator itr = boosts->find((TCHAR*)fields[i]); if (itr != boosts->end()) { q->setBoost(itr->second); } } if (q->instanceOf(PhraseQuery::getClassName())) { ((PhraseQuery*)q)->setSlop(slop); } if (q->instanceOf(MultiPhraseQuery::getClassName())) { ((MultiPhraseQuery*) q)->setSlop(slop); } clauses.push_back(_CLNEW BooleanClause(q, true, BooleanClause::SHOULD)); } } if (clauses.size() == 0) // happens for stopwords return NULL; return QueryParser::getBooleanQuery(clauses, true); }else{ return QueryParser::getFieldQuery(field, queryText); } } Query* MultiFieldQueryParser::getFuzzyQuery(const TCHAR* field, TCHAR* termStr, const float_t minSimilarity){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::getFuzzyQuery(fields[i], termStr, minSimilarity); if (q) clauses.push_back(_CLNEW BooleanClause(q,true, BooleanClause::SHOULD) ); } return QueryParser::getBooleanQuery(clauses, true); } return QueryParser::getFuzzyQuery(field, termStr, minSimilarity); } Query* MultiFieldQueryParser::getPrefixQuery(const TCHAR* field, TCHAR* termStr){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::getPrefixQuery(fields[i], termStr); if (q) clauses.push_back(_CLNEW BooleanClause(q,true,BooleanClause::SHOULD)); } return QueryParser::getBooleanQuery(clauses, true); } return QueryParser::getPrefixQuery(field, termStr); } Query* MultiFieldQueryParser::getWildcardQuery(const TCHAR* field, TCHAR* termStr){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::getWildcardQuery(fields[i], termStr); if (q) clauses.push_back(_CLNEW BooleanClause(q,true,BooleanClause::SHOULD)); } return QueryParser::getBooleanQuery(clauses, true); } return QueryParser::getWildcardQuery(field, termStr); } Query* MultiFieldQueryParser::getRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, const bool inclusive){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::getRangeQuery(fields[i], part1, part2, inclusive); if (q) clauses.push_back(_CLNEW BooleanClause(q,true,BooleanClause::SHOULD)); } return QueryParser::getBooleanQuery(clauses, true); }else{ return QueryParser::getRangeQuery(field, part1, part2, inclusive); } } //static Query* MultiFieldQueryParser::parse(const TCHAR** _queries, const TCHAR** _fields, Analyzer* analyzer) { BooleanQuery* bQuery = _CLNEW BooleanQuery(); for (size_t i = 0; _fields[i]!=NULL; i++) { if (_queries[i] == NULL) { _CLLDELETE(bQuery); _CLTHROWA(CL_ERR_IllegalArgument, "_queries.length != _fields.length"); } // TODO: Reuse qp instead of creating it over and over again QueryParser* qp = _CLNEW QueryParser(_fields[i], analyzer); Query* q = qp->parse(_queries[i]); if (q!=NULL && // q never null, just being defensive (!(q->instanceOf(BooleanQuery::getClassName()) || ((BooleanQuery*)q)->getClauseCount() > 0))) { bQuery->add(q, true, BooleanClause::SHOULD); } else _CLLDELETE(q); _CLLDELETE(qp); } return bQuery; } // static Query* MultiFieldQueryParser::parse(const TCHAR* query, const TCHAR** _fields, const uint8_t* flags, Analyzer* analyzer) { BooleanQuery* bQuery = _CLNEW BooleanQuery(); for (size_t i = 0; _fields[i]!=NULL; i++) { //TODO: this is really confusing... why not refactor _fields and flags to use a array object. //flags can be NULL since NULL == 0... /*if (flags[i] == NULL) { _CLLDELETE(bQuery); _CLTHROWA(CL_ERR_IllegalArgument, "_fields.length != flags.length"); }*/ QueryParser* qp = _CLNEW QueryParser(_fields[i], analyzer); Query* q = qp->parse(query); if (q!=NULL && // q never null, just being defensive (!(q->instanceOf(BooleanQuery::getClassName())) || ((BooleanQuery*)q)->getClauseCount()>0)) { bQuery->add(q, true, (BooleanClause::Occur)flags[i]); } else _CLLDELETE(q); _CLLDELETE(qp); } return bQuery; } //static Query* MultiFieldQueryParser::parse(const TCHAR** _queries, const TCHAR** _fields, const uint8_t* flags, Analyzer* analyzer){ BooleanQuery* bQuery = _CLNEW BooleanQuery(); for (size_t i = 0; _fields[i]!=NULL; i++) { //TODO: this is really confusing... why not refactor _fields and flags to use a array object. //flags can be NULL since NULL == 0... if (_queries[i] == NULL ) { //|| flags[i] == NULL _CLLDELETE(bQuery); _CLTHROWA(CL_ERR_IllegalArgument, "_queries, _fields, and flags array have have different length"); } QueryParser* qp = _CLNEW QueryParser(_fields[i], analyzer); Query* q = qp->parse(_queries[i]); if (q!=NULL && // q never null, just being defensive (!(q->instanceOf(BooleanQuery::getClassName())) || ((BooleanQuery*)q)->getClauseCount()>0)) { bQuery->add(q, true, (BooleanClause::Occur)flags[i]); } else _CLLDELETE(q); _CLLDELETE(qp); } return bQuery; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/queryParser/MultiFieldQueryParser.h000066400000000000000000000133451154025176300262300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_MultiFieldQueryParser_ #define _lucene_queryParser_MultiFieldQueryParser_ #include "QueryParser.h" #include "CLucene/util/VoidMap.h" CL_NS_DEF(queryParser) typedef CL_NS(util)::CLHashMap BoostMap; /** * A QueryParser which constructs queries to search multiple fields. * */ class CLUCENE_EXPORT MultiFieldQueryParser: public QueryParser { protected: const TCHAR** fields; BoostMap* boosts; public: /** * Creates a MultiFieldQueryParser. * Allows passing of a map with term to Boost, and the boost to apply to each term. * *

It will, when parse(String query) * is called, construct a query like this (assuming the query consists of * two terms and you specify the two fields title and body):

* * * (title:term1 body:term1) (title:term2 body:term2) * * *

When setDefaultOperator(AND_OPERATOR) is set, the result will be:

* * * +(title:term1 body:term1) +(title:term2 body:term2) * * *

When you pass a boost (title=>5 body=>10) you can get

* * * +(title:term1^5.0 body:term1^10.0) +(title:term2^5.0 body:term2^10.0) * * *

In other words, all the query's terms must appear, but it doesn't matter in * what fields they appear.

*/ MultiFieldQueryParser(const TCHAR** _fields, CL_NS(analysis)::Analyzer* a, BoostMap* _boosts = NULL); virtual ~MultiFieldQueryParser(); protected: CL_NS(search)::Query* getFieldQuery(const TCHAR* field, TCHAR* queryText, const int32_t slop); CL_NS(search)::Query* getFieldQuery(const TCHAR* field, TCHAR* queryText) { return getFieldQuery(field,queryText,0); } CL_NS(search)::Query* getFuzzyQuery(const TCHAR* field, TCHAR* termStr, const float_t minSimilarity); CL_NS(search)::Query* getPrefixQuery(const TCHAR* field, TCHAR* termStr); CL_NS(search)::Query* getWildcardQuery(const TCHAR* field, TCHAR* termStr); CL_NS(search)::Query* getRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, const bool inclusive); public: /** * Parses a query which searches on the fields specified. *

* If x fields are specified, this effectively constructs: *

  * 
  * (field1:query1) (field2:query2) (field3:query3)...(fieldx:queryx)
  * 
  * 
* @param queries Queries strings to parse * @param fields Fields to search on * @param analyzer Analyzer to use * @throws ParseException if query parsing fails * @throws IllegalArgumentException if the length of the queries array differs * from the length of the fields array */ static CL_NS(search)::Query* parse(const TCHAR** _queries, const TCHAR** _fields, CL_NS(analysis)::Analyzer* analyzer); /** * Parses a query, searching on the fields specified. * Use this if you need to specify certain fields as required, * and others as prohibited. *

  * Usage:
  * 
  * String[] fields = {"filename", "contents", "description"};
  * BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,
  *                BooleanClause.Occur.MUST,
  *                BooleanClause.Occur.MUST_NOT};
  * MultiFieldQueryParser.parse("query", fields, flags, analyzer);
  * 
  * 
*

* The code above would construct a query: *

  * 
  * (filename:query) +(contents:query) -(description:query)
  * 
  * 
* * @param query Query string to parse * @param fields Fields to search on * @param flags Flags describing the fields * @param analyzer Analyzer to use * @throws ParseException if query parsing fails * @throws IllegalArgumentException if the length of the fields array differs * from the length of the flags array */ static CL_NS(search)::Query* parse(const TCHAR* query, const TCHAR** _fields, const uint8_t* flags, CL_NS(analysis)::Analyzer* analyzer); /** * Parses a query, searching on the fields specified. * Use this if you need to specify certain fields as required, * and others as prohibited. *

  * Usage:
  * 
  * String[] query = {"query1", "query2", "query3"};
  * String[] fields = {"filename", "contents", "description"};
  * BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,
  *                BooleanClause.Occur.MUST,
  *                BooleanClause.Occur.MUST_NOT};
  * MultiFieldQueryParser.parse(query, fields, flags, analyzer);
  * 
  * 
*

* The code above would construct a query: *

  * 
  * (filename:query1) +(contents:query2) -(description:query3)
  * 
  * 
* * @param queries Queries string to parse * @param fields Fields to search on * @param flags Flags describing the fields * @param analyzer Analyzer to use * @throws ParseException if query parsing fails * @throws IllegalArgumentException if the length of the queries, fields, * and flags array differ */ static CL_NS(search)::Query* parse(const TCHAR** _queries, const TCHAR** _fields, const uint8_t* flags, CL_NS(analysis)::Analyzer* analyzer); CL_NS(search)::Query* parse(const TCHAR* _query){return QueryParser::parse(_query);} }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryParser.cpp000066400000000000000000001255541154025176300246120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_CharStream.h" #include "_FastCharStream.h" #include "QueryParserConstants.h" #include "QueryParserTokenManager.h" #include "QueryParser.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/search/SearchHeader.h" #include "CLucene/search/Query.h" #include "CLucene/search/TermQuery.h" #include "CLucene/search/BooleanQuery.h" #include "CLucene/search/FuzzyQuery.h" #include "CLucene/search/PhraseQuery.h" #include "CLucene/search/WildcardQuery.h" #include "CLucene/search/PrefixQuery.h" #include "CLucene/search/RangeQuery.h" #include "CLucene/search/MatchAllDocsQuery.h" #include "CLucene/search/MultiPhraseQuery.h" #include "CLucene/search/ConstantScoreQuery.h" #include "CLucene/document/DateField.h" #include "CLucene/document/DateTools.h" #include "CLucene/index/Term.h" #include "QueryToken.h" #include "CLucene/util/CLStreams.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(util) CL_NS_USE(index) CL_NS_USE(analysis) CL_NS_USE(search) CL_NS_DEF(queryParser) const TCHAR* QueryParserConstants::tokenImage[] = { _T(""), _T("<_NUM_CHAR>"), _T("<_ESCAPED_CHAR>"), _T("<_TERM_START_CHAR>"), _T("<_TERM_CHAR>"), _T("<_WHITESPACE>"), _T(""), _T(""), _T(""), _T(""), _T("\"+\""), _T("\"-\""), _T("\"(\""), _T("\")\""), _T("\":\""), _T("\"*\""), _T("\"^\""), _T(""), _T(""), _T(""), _T(""), _T(""), _T("\"[\""), _T("\"{\""), _T(""), _T("\"TO\""), _T("\"]\""), _T(""), _T(""), _T("\"TO\""), _T("\"}\""), _T(""), _T("") }; const int32_t QueryParser::jj_la1_0[] = {0x180,0x180,0xe00,0xe00,0x1f69f80,0x48000,0x10000,0x1f69000,0x1348000,0x80000,0x80000,0x10000,0x18000000,0x2000000,0x18000000,0x10000,0x80000000,0x20000000,0x80000000,0x10000,0x80000,0x10000,0x1f68000}; const int32_t QueryParser::jj_la1_1[] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x0,0x0,0x0}; struct QueryParser::JJCalls { public: int32_t gen; QueryToken* first; int32_t arg; JJCalls* next; JJCalls(); ~JJCalls(); }; QueryParser::QueryParser(const TCHAR* f, Analyzer* a) : _operator(OR_OPERATOR), lowercaseExpandedTerms(true),useOldRangeQuery(false),allowLeadingWildcard(false),enablePositionIncrements(false), analyzer(a),field(NULL),phraseSlop(0),fuzzyMinSim(FuzzyQuery::defaultMinSimilarity), fuzzyPrefixLength(FuzzyQuery::defaultPrefixLength),/*locale(NULL),*/ dateResolution(CL_NS(document)::DateTools::NO_RESOLUTION),fieldToDateResolution(NULL), token_source(NULL),token(NULL),jj_nt(NULL),_firstToken(NULL),jj_ntk(-1),jj_scanpos(NULL),jj_lastpos(NULL),jj_la(0), lookingAhead(false),jj_gen(0),jj_2_rtns(NULL),jj_rescan(false),jj_gc(0),jj_expentries(NULL),jj_expentry(NULL), jj_kind(-1),jj_endpos(0) { StringReader* rdr = _CLNEW StringReader(_T("")); _init(_CLNEW FastCharStream(rdr, true)); if ( f ) field = STRDUP_TtoT(f); } void QueryParser::_deleteTokens(){ QueryToken* t = _firstToken; while (true){ if (_firstToken == NULL) break; t = _firstToken->next; _CLLDELETE(_firstToken); _firstToken = t; } } QueryParser::~QueryParser(){ _CLLDELETE(fieldToDateResolution); _CLLDELETE(token_source); _deleteTokens(); _CLLDELETE(jj_expentries); _CLLDELETE(jj_expentry); _CLLDELETE(jj_2_rtns); _CLDELETE_CARRAY(field); } CL_NS(search)::Query* QueryParser::parse(const TCHAR* q, const TCHAR* f, CL_NS(analysis)::Analyzer* a){ QueryParser* qp = _CLNEW QueryParser(f, a); CL_NS(search)::Query* qry = qp->parse(q); _CLDELETE(qp); return qry; } Query* QueryParser::parse(const TCHAR* _query) { StringReader* rdr = _CLNEW StringReader(_query); ReInit(_CLNEW FastCharStream(rdr, true)); try { // TopLevelQuery is a Query followed by the end-of-input (EOF) Query* res = TopLevelQuery(field); return (res!=NULL) ? res : _CLNEW BooleanQuery(); } catch (CLuceneError& e) { // rethrow to include the original query: if (e.number()==CL_ERR_Parse || e.number()==CL_ERR_TokenMgr) { TCHAR* _twhat = e.twhat(); const size_t errLen = _tcslen(_twhat) + _tcslen(_query) + 20; // make sure we have enough room for our error message TCHAR *err = _CL_NEWARRAY(TCHAR,errLen); cl_stprintf(err, errLen, _T("Cannot parse '%s': %s"), _query,_twhat); _CLTHROWT_DEL(CL_ERR_Parse, err); } else if (e.number()==CL_ERR_TooManyClauses) { const size_t errLen = _tcslen(_query) + 25; // make sure we have enough room for our error message TCHAR *err = _CL_NEWARRAY(TCHAR,errLen); cl_stprintf(err, errLen, _T("Cannot parse '%s': too many boolean clauses"), _query); _CLTHROWT_DEL(CL_ERR_Parse, err); } else throw e; } } Analyzer* QueryParser::getAnalyzer() const { return analyzer; } const TCHAR* QueryParser::getField() const { return field; } float_t QueryParser::getFuzzyMinSim() const { return fuzzyMinSim; } void QueryParser::setFuzzyMinSim(const float_t _fuzzyMinSim) { fuzzyMinSim = _fuzzyMinSim; } int32_t QueryParser::getFuzzyPrefixLength() const { return fuzzyPrefixLength; } void QueryParser::setFuzzyPrefixLength(const int32_t _fuzzyPrefixLength) { fuzzyPrefixLength = _fuzzyPrefixLength; } void QueryParser::setPhraseSlop(const int32_t _phraseSlop) { phraseSlop = _phraseSlop; } int32_t QueryParser::getPhraseSlop() const { return phraseSlop; } void QueryParser::setAllowLeadingWildcard(const bool _allowLeadingWildcard) { allowLeadingWildcard = _allowLeadingWildcard; } bool QueryParser::getAllowLeadingWildcard() const { return allowLeadingWildcard; } void QueryParser::setEnablePositionIncrements(const bool _enable) { enablePositionIncrements = _enable; } bool QueryParser::getEnablePositionIncrements() const { return enablePositionIncrements; } void QueryParser::setDefaultOperator(Operator _op) { _operator = _op; } QueryParser::Operator QueryParser::getDefaultOperator() const { return _operator; } void QueryParser::setLowercaseExpandedTerms(const bool _lowercaseExpandedTerms) { lowercaseExpandedTerms = _lowercaseExpandedTerms; } bool QueryParser::getLowercaseExpandedTerms() const { return lowercaseExpandedTerms; } void QueryParser::setUseOldRangeQuery(const bool _useOldRangeQuery) { useOldRangeQuery = _useOldRangeQuery; } bool QueryParser::getUseOldRangeQuery() const { return useOldRangeQuery; } void QueryParser::setDateResolution(const CL_NS(document)::DateTools::Resolution _dateResolution) { dateResolution = _dateResolution; } void QueryParser::setDateResolution(const TCHAR* fieldName, const CL_NS(document)::DateTools::Resolution _dateResolution) { if (fieldName == NULL) _CLTHROWA(CL_ERR_IllegalArgument, "Field cannot be null."); if (fieldToDateResolution == NULL) { // lazily initialize HashMap fieldToDateResolution = _CLNEW FieldToDateResolutionType(); } fieldToDateResolution->put(fieldName, _dateResolution); } CL_NS(document)::DateTools::Resolution QueryParser::getDateResolution(const TCHAR* fieldName) const { if (fieldName == NULL) _CLTHROWA(CL_ERR_IllegalArgument,"Field cannot be null."); if (fieldToDateResolution == NULL) { // no field specific date resolutions set; return default date resolution instead return dateResolution; } CL_NS(document)::DateTools::Resolution resolution = fieldToDateResolution->get(fieldName); if (resolution == CL_NS(document)::DateTools::NO_RESOLUTION) { // no date resolutions set for the given field; return default date resolution instead resolution = dateResolution; } return resolution; } void QueryParser::addClause(std::vector& clauses, int32_t conj, int32_t mods, Query* q){ bool required, prohibited; // If this term is introduced by AND, make the preceding term required, // unless it's already prohibited const uint32_t nPreviousClauses = clauses.size(); if (nPreviousClauses > 0 && conj == CONJ_AND) { BooleanClause* c = clauses[nPreviousClauses-1]; if (!c->isProhibited()) c->setOccur(BooleanClause::MUST); } if (nPreviousClauses > 0 && _operator == AND_OPERATOR && conj == CONJ_OR) { // If this term is introduced by OR, make the preceding term optional, // unless it's prohibited (that means we leave -a OR b but +a OR b-->a OR b) // notice if the input is a OR b, first term is parsed as required; without // this modification a OR b would parsed as +a OR b BooleanClause* c = clauses[nPreviousClauses-1]; if (!c->isProhibited()) c->setOccur(BooleanClause::SHOULD); } // We might have been passed a null query; the term might have been // filtered away by the analyzer. if (q == NULL) return; if (_operator == OR_OPERATOR) { // We set REQUIRED if we're introduced by AND or +; PROHIBITED if // introduced by NOT or -; make sure not to set both. prohibited = (mods == MOD_NOT); required = (mods == MOD_REQ); if (conj == CONJ_AND && !prohibited) { required = true; } } else { // We set PROHIBITED if we're introduced by NOT or -; We set REQUIRED // if not PROHIBITED and not introduced by OR prohibited = (mods == MOD_NOT); required = (!prohibited && conj != CONJ_OR); } if (required && !prohibited) clauses.push_back(_CLNEW BooleanClause(q,true, BooleanClause::MUST)); else if (!required && !prohibited) clauses.push_back(_CLNEW BooleanClause(q,true, BooleanClause::SHOULD)); else if (!required && prohibited) clauses.push_back(_CLNEW BooleanClause(q,true, BooleanClause::MUST_NOT)); else { _CLTHROWA(CL_ERR_Runtime, "Clause cannot be both required and prohibited"); } } Query* QueryParser::getFieldQuery(const TCHAR* _field, TCHAR* queryText) { // Use the analyzer to get all the tokens, and then build a TermQuery, // PhraseQuery, or nothing based on the term count StringReader reader(queryText); TokenStream* source = analyzer->tokenStream(_field, &reader); CLVector > v; CL_NS(analysis)::Token* t = NULL; int32_t positionCount = 0; bool severalTokensAtSamePosition = false; while (true) { t = _CLNEW Token(); try { Token* _t = source->next(t); if (_t == NULL) _CLDELETE(t); }_CLCATCH_ERR(CL_ERR_IO, _CLLDELETE(source);_CLLDELETE(t);_CLDELETE_LCARRAY(queryText);,{ t = NULL; }); if (t == NULL) break; v.push_back(t); if (t->getPositionIncrement() != 0) positionCount += t->getPositionIncrement(); else severalTokensAtSamePosition = true; } try { source->close(); } _CLCATCH_ERR_CLEANUP(CL_ERR_IO, {_CLLDELETE(source);_CLLDELETE(t);_CLDELETE_LCARRAY(queryText);} ); /* cleanup */ _CLLDELETE(source); if (v.size() == 0) return NULL; else if (v.size() == 1) { Term* tm = _CLNEW Term(_field, v.at(0)->termBuffer()); Query* ret = _CLNEW TermQuery( tm ); _CLDECDELETE(tm); return ret; } else { if (severalTokensAtSamePosition) { if (positionCount == 1) { // no phrase query: BooleanQuery* q = _CLNEW BooleanQuery(true); for(size_t i=0; itermBuffer()); q->add(_CLNEW TermQuery(tm), true, BooleanClause::SHOULD); _CLDECDELETE(tm); } return q; }else { MultiPhraseQuery* mpq = _CLNEW MultiPhraseQuery(); mpq->setSlop(phraseSlop); CLArrayList multiTerms; int32_t position = -1; for (size_t i = 0; i < v.size(); i++) { t = v.at(i); if (t->getPositionIncrement() > 0 && multiTerms.size() > 0) { ValueArray termsArray(multiTerms.size()); multiTerms.toArray(termsArray.values); if (enablePositionIncrements) { mpq->add(&termsArray,position); } else { mpq->add(&termsArray); } multiTerms.clear(); } position += t->getPositionIncrement(); multiTerms.push_back(_CLNEW Term(field, t->termBuffer())); } ValueArray termsArray(multiTerms.size()); multiTerms.toArray(termsArray.values); if (enablePositionIncrements) { mpq->add(&termsArray,position); } else { mpq->add(&termsArray); } return mpq; } }else { PhraseQuery* pq = _CLNEW PhraseQuery(); pq->setSlop(phraseSlop); int32_t position = -1; for (size_t i = 0; i < v.size(); i++) { t = v.at(i); Term* tm = _CLNEW Term(_field, t->termBuffer()); if (enablePositionIncrements) { position += t->getPositionIncrement(); pq->add(tm,position); } else { pq->add(tm); } _CLDECDELETE(tm); } return pq; } } } Query* QueryParser::getFieldQuery(const TCHAR* _field, TCHAR* queryText, const int32_t slop) { Query* query = getFieldQuery(_field, queryText); if (query) { if ( query->instanceOf(PhraseQuery::getClassName()) ) { static_cast(query)->setSlop(slop); } else if ( query->instanceOf(MultiPhraseQuery::getClassName()) ) { static_cast(query)->setSlop(slop); } } return query; } Query* QueryParser::getRangeQuery(const TCHAR* _field, TCHAR* part1, TCHAR* part2, const bool inclusive) { if (lowercaseExpandedTerms) { _tcslwr(part1); _tcslwr(part2); } TCHAR* _part1 = part1, *_part2 = part2; // just in case anything go wrong... try { /*DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); // SHORT means completely numeric df.setLenient(true); Date d1 = df.parse(part1); Date d2 = df.parse(part2); */ const int64_t d1 = CL_NS(document)::DateTools::stringToTime(part1); int64_t d2 = CL_NS(document)::DateTools::stringToTime(part2); if (inclusive) { // The user can only specify the date, not the time, so make sure // the time is set to the latest possible time of that date to really // include all documents: d2 = CL_NS(document)::DateTools::timeMakeInclusive(d2); } CL_NS(document)::DateTools::Resolution resolution = getDateResolution(_field); if (resolution == CL_NS(document)::DateTools::NO_RESOLUTION) { // no default or field specific date resolution has been set, // use deprecated DateField to maintain compatibilty with // pre-1.9 Lucene versions. _part1 = CL_NS(document)::DateField::timeToString(d1); _part2 = CL_NS(document)::DateField::timeToString(d2); } else { _part1 = CL_NS(document)::DateTools::timeToString(d1, resolution); _part2 = CL_NS(document)::DateTools::timeToString(d2, resolution); } } catch (...) { } if(useOldRangeQuery) { Term* t1 = _CLNEW Term(_field,part1); Term* t2 = _CLNEW Term(_field,part2); Query* ret = _CLNEW RangeQuery(t1, t2, inclusive); _CLDECDELETE(t1); _CLDECDELETE(t2); // Make sure to delete the date strings we allocated only if we indeed allocated them if (part1 != _part1) _CLDELETE_LCARRAY(_part1); if (part2 != _part2) _CLDELETE_LCARRAY(_part2); return ret; } else { Query* q = _CLNEW ConstantScoreRangeQuery(_field,part1,part2,inclusive,inclusive); // Make sure to delete the date strings we allocated only if we indeed allocated them if (part1 != _part1) _CLDELETE_LCARRAY(_part1); if (part2 != _part2) _CLDELETE_LCARRAY(_part2); return q; } } Query* QueryParser::getBooleanQuery(std::vector& clauses, bool disableCoord) { if (clauses.size()==0) { return NULL; // all clause words were filtered away by the analyzer. } BooleanQuery* query = _CLNEW BooleanQuery(disableCoord); for (size_t i = 0; i < clauses.size(); i++) { query->add(clauses[i]); } return query; } Query* QueryParser::getWildcardQuery(const TCHAR* _field, TCHAR* termStr) { if (_tcscmp(_T("*"), _field) == 0) { if (_tcscmp(_T("*"), termStr) == 0) return _CLNEW MatchAllDocsQuery(); } if (!allowLeadingWildcard && (termStr[0]==_T('*') || termStr[0]==_T('?'))){ _CLDELETE_LCARRAY(termStr); _CLTHROWT(CL_ERR_Parse,_T("'*' or '?' not allowed as first character in WildcardQuery")); } if (lowercaseExpandedTerms) { _tcslwr(termStr); } Term* t = _CLNEW Term(_field, termStr); Query* q = _CLNEW WildcardQuery(t); _CLDECDELETE(t); return q; } Query* QueryParser::getPrefixQuery(const TCHAR* _field, TCHAR* _termStr) { if (!allowLeadingWildcard && _termStr[0] == _T('*')){ _CLDELETE_LCARRAY(_termStr); _CLTHROWT(CL_ERR_Parse,_T("'*' not allowed as first character in PrefixQuery")); } if (lowercaseExpandedTerms) { _tcslwr(_termStr); } Term* t = _CLNEW Term(_field, _termStr); Query *q = _CLNEW PrefixQuery(t); _CLDECDELETE(t); return q; } Query* QueryParser::getFuzzyQuery(const TCHAR* _field, TCHAR* termStr, const float_t minSimilarity) { if (lowercaseExpandedTerms) { _tcslwr(termStr); } Term* t = _CLNEW Term(_field, termStr); Query *q = _CLNEW FuzzyQuery(t, minSimilarity, fuzzyPrefixLength); _CLDECDELETE(t); return q; } TCHAR* QueryParser::discardEscapeChar(TCHAR* input, TCHAR* output) { // Create char array to hold unescaped char sequence const size_t inputLen = _tcslen(input); bool outputOwned=false; if (output == NULL){ // TODO: Perhaps we can re-use an inner buffer instead of creating new char arrays here and in several other places output = _CL_NEWARRAY(TCHAR, inputLen + 1); outputOwned=true; } // The length of the output can be less than the input // due to discarded escape chars. This variable holds // the actual length of the output int32_t length = 0; // We remember whether the last processed character was // an escape character bool lastCharWasEscapeChar = false; // The multiplier the current unicode digit must be multiplied with. // E. g. the first digit must be multiplied with 16^3, the second with 16^2... uint32_t codePointMultiplier = 0; // Used to calculate the codepoint of the escaped unicode character int32_t codePoint = 0; for (size_t i = 0; i < inputLen; i++) { TCHAR curChar = input[i]; if (codePointMultiplier > 0) { try { codePoint += hexToInt(curChar) * codePointMultiplier; } catch (CLuceneError& e) { if (outputOwned)_CLDELETE_LCARRAY(output); throw e; } codePointMultiplier = codePointMultiplier >> 4; if (codePointMultiplier == 0) { output[length++] = (TCHAR)codePoint; codePoint = 0; } } else if (lastCharWasEscapeChar) { if (curChar == _T('u')) { // found an escaped unicode character codePointMultiplier = 16 * 16 * 16; } else { // this character was escaped output[length] = curChar; length++; } lastCharWasEscapeChar = false; } else { if (curChar == _T('\\')) { lastCharWasEscapeChar = true; } else { output[length] = curChar; length++; } } } if (codePointMultiplier > 0) { if (outputOwned)_CLDELETE_LCARRAY(output); _CLTHROWT(CL_ERR_Parse, _T("Truncated unicode escape sequence.")); } if (lastCharWasEscapeChar) { if (outputOwned)_CLDELETE_LCARRAY(output); _CLTHROWT(CL_ERR_Parse,_T("Term can not end with escape character.")); } output[length]=0; return output; } //static int32_t QueryParser::hexToInt(TCHAR c) { if (_T('0') <= c && c <= _T('9')) { return c - _T('0'); } else if (_T('a') <= c && c <= _T('f')){ return c - _T('a') + 10; } else if (_T('A') <= c && c <= _T('F')) { return c - _T('A') + 10; } else { TCHAR err[50]; cl_stprintf(err,50, _T("Non-hex character in unicode escape sequence: %c"), c); _CLTHROWT(CL_ERR_Parse,err); } } //static TCHAR* QueryParser::escape(const TCHAR* s) { size_t len = _tcslen(s); // Create a StringBuffer object a bit longer from the length of the query (to prevent some reallocations), // and declare we are the owners of the buffer (to save on a copy) // TODO: 1. Test to see what is the optimal initial length // 2. Allow re-using the provided string buffer (argument s) instead of creating another one? StringBuffer sb(len+5); for (size_t i = 0; i < len; i++) { const TCHAR c = s[i]; // These characters are part of the query syntax and must be escaped if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':' || c == '^' || c == '[' || c == ']' || c == '"' || c == '{' || c == '}' || c == '~' || c == '*' || c == '?' || c == '|' || c == '&') { sb.appendChar(_T('\\')); } sb.appendChar(c); } return sb.giveBuffer(); } int32_t QueryParser::Conjunction() { int32_t ret = CONJ_NONE; switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case AND: case OR: switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case AND: jj_consume_token(AND); ret = CONJ_AND; break; case OR: jj_consume_token(OR); ret = CONJ_OR; break; default: jj_la1[0] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } break; default: jj_la1[1] = jj_gen; } return ret; } int32_t QueryParser::Modifiers() { int32_t ret = MOD_NONE; switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case NOT: case PLUS: case MINUS: switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case PLUS: jj_consume_token(PLUS); ret = MOD_REQ; break; case MINUS: jj_consume_token(MINUS); ret = MOD_NOT; break; case NOT: jj_consume_token(NOT); ret = MOD_NOT; break; default: jj_la1[2] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } break; default: jj_la1[3] = jj_gen; } return ret; } Query* QueryParser::TopLevelQuery(TCHAR* _field) { Query* q = NULL;; try { q = fQuery(_field); jj_consume_token(0); } catch (CLuceneError& e) { _CLLDELETE(q); throw e; } return q; } Query* QueryParser::fQuery(TCHAR* _field) { CLVector > clauses; Query *q, *firstQuery=NULL; int32_t conj, mods; mods = Modifiers(); q = fClause(_field); addClause(clauses, CONJ_NONE, mods, q); if (mods == MOD_NONE) firstQuery=q; while (true) { switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case AND: case OR: case NOT: case PLUS: case MINUS: case LPAREN: case STAR: case QUOTED: case TERM: case PREFIXTERM: case WILDTERM: case RANGEIN_START: case RANGEEX_START: case NUMBER: break; default: jj_la1[4] = jj_gen; goto label_1_brk; } conj = Conjunction(); mods = Modifiers(); q = fClause(_field); addClause(clauses, conj, mods, q); } label_1_brk: if (clauses.size() == 1 && firstQuery != NULL){ clauses[0]->deleteQuery = false; return firstQuery; }else{ clauses.setDoDelete(false); return getBooleanQuery(clauses); } } Query* QueryParser::fClause(TCHAR* _field) { Query* q=NULL; QueryToken *fieldToken=NULL, *boost=NULL; TCHAR* tmpField=NULL; if (jj_2_1(2)) { switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case TERM: { fieldToken = jj_consume_token(TERM); jj_consume_token(COLON); // make sure to delete _field only if it's not contained already by the QP tmpField=discardEscapeChar(fieldToken->image); break; } case STAR: jj_consume_token(STAR); jj_consume_token(COLON); tmpField=_CL_NEWARRAY(TCHAR,2); tmpField[0]=_T('*'); tmpField[1]=0; break; default: jj_la1[5] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } } switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case STAR: case QUOTED: case TERM: case PREFIXTERM: case WILDTERM: case RANGEIN_START: case RANGEEX_START: case NUMBER: { q = fTerm( tmpField==NULL ? _field : tmpField ); break; } case LPAREN: { jj_consume_token(LPAREN); q = fQuery( tmpField==NULL ? _field : tmpField ); jj_consume_token(RPAREN); if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == CARAT) { jj_consume_token(CARAT); boost = jj_consume_token(NUMBER); } else jj_la1[6] = jj_gen; break; } default: { jj_la1[7] = jj_gen; jj_consume_token(-1); _CLDELETE_LCARRAY(tmpField); _CLTHROWT(CL_ERR_Parse,_T("")); } } _CLDELETE_LCARRAY(tmpField); if (q && boost != NULL) { float_t f = 1.0; try { f = _tcstod(boost->image, NULL); q->setBoost(f); } catch (...) { /* ignore errors */ } } return q; } Query* QueryParser::fTerm(const TCHAR* _field) { QueryToken *term, *boost=NULL, *fuzzySlop=NULL, *goop1, *goop2; bool prefix = false; bool wildcard = false; bool fuzzy = false; //bool rangein = false; Query* q = NULL; switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case STAR: case TERM: case PREFIXTERM: case WILDTERM: case NUMBER: { switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case TERM: term = jj_consume_token(TERM); break; case STAR: term = jj_consume_token(STAR); wildcard=true; break; case PREFIXTERM: term = jj_consume_token(PREFIXTERM); prefix=true; break; case WILDTERM: term = jj_consume_token(WILDTERM); wildcard=true; break; case NUMBER: term = jj_consume_token(NUMBER); break; default: jj_la1[8] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == FUZZY_SLOP) { fuzzySlop = jj_consume_token(FUZZY_SLOP); fuzzy=true; } else jj_la1[9] = jj_gen; if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == CARAT) { jj_consume_token(CARAT); boost = jj_consume_token(NUMBER); if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == FUZZY_SLOP) { fuzzySlop = jj_consume_token(FUZZY_SLOP); fuzzy=true; } else jj_la1[10] = jj_gen; } else jj_la1[11] = jj_gen; TCHAR* termImage=NULL; if (wildcard) { termImage=discardEscapeChar(term->image); q = getWildcardQuery(_field, termImage); } else if (prefix) { termImage = STRDUP_TtoT(term->image); size_t tiLen = _tcslen(termImage); termImage[tiLen-1]=0; q = getPrefixQuery(_field,discardEscapeChar(termImage, termImage)); } else if (fuzzy) { float_t fms = fuzzyMinSim; try { if (fuzzySlop->image[1] != 0) fms = _tcstod(fuzzySlop->image + 1, NULL); } catch (...) { /* ignore exceptions */ } if(fms < 0.0f || fms > 1.0f){ _CLTHROWT(CL_ERR_Parse, _T("Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !")); } termImage=discardEscapeChar(term->image); q = getFuzzyQuery(_field, termImage,fms); } else { termImage=discardEscapeChar(term->image); q = getFieldQuery(_field, termImage); } _CLDELETE_LCARRAY(termImage); break; } case RANGEIN_START: { jj_consume_token(RANGEIN_START); switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case RANGEIN_GOOP: goop1 = jj_consume_token(RANGEIN_GOOP); break; case RANGEIN_QUOTED: goop1 = jj_consume_token(RANGEIN_QUOTED); break; default: jj_la1[12] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == RANGEIN_TO) jj_consume_token(RANGEIN_TO); else jj_la1[13] = jj_gen; switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case RANGEIN_GOOP: goop2 = jj_consume_token(RANGEIN_GOOP); break; case RANGEIN_QUOTED: goop2 = jj_consume_token(RANGEIN_QUOTED); break; default: jj_la1[14] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } jj_consume_token(RANGEIN_END); if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == CARAT) { jj_consume_token(CARAT); boost = jj_consume_token(NUMBER); } else jj_la1[15] = jj_gen; // TODO: Allow analysis::Term to accept ownership on a TCHAR* and save on extra dup's if (goop1->kind == RANGEIN_QUOTED) { _tcscpy(goop1->image, goop1->image+1); goop1->image[_tcslen(goop1->image)-1]='\0'; } if (goop2->kind == RANGEIN_QUOTED) { _tcscpy(goop2->image, goop2->image+1); goop2->image[_tcslen(goop2->image)-1]='\0'; } TCHAR* t1 = discardEscapeChar(goop1->image); TCHAR* t2 = discardEscapeChar(goop2->image); q = getRangeQuery(_field, t1, t2, true); _CLDELETE_LCARRAY(t1); _CLDELETE_LCARRAY(t2); break; } case RANGEEX_START: { jj_consume_token(RANGEEX_START); switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case RANGEEX_GOOP: goop1 = jj_consume_token(RANGEEX_GOOP); break; case RANGEEX_QUOTED: goop1 = jj_consume_token(RANGEEX_QUOTED); break; default: jj_la1[16] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == RANGEEX_TO) jj_consume_token(RANGEEX_TO); else jj_la1[17] = jj_gen; switch ((jj_ntk==-1)?f_jj_ntk():jj_ntk) { case RANGEEX_GOOP: goop2 = jj_consume_token(RANGEEX_GOOP); break; case RANGEEX_QUOTED: goop2 = jj_consume_token(RANGEEX_QUOTED); break; default: jj_la1[18] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } jj_consume_token(RANGEEX_END); if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == CARAT) { jj_consume_token(CARAT); boost = jj_consume_token(NUMBER); } else jj_la1[19] = jj_gen; if (goop1->kind == RANGEEX_QUOTED) goop1->image = goop1->image + 1; if (goop2->kind == RANGEEX_QUOTED) goop2->image = goop2->image + 1; TCHAR* t1 = discardEscapeChar(goop1->image); TCHAR* t2 = discardEscapeChar(goop2->image); q = getRangeQuery(_field, t1, t2, false); _CLDELETE_LCARRAY(t1); _CLDELETE_LCARRAY(t2); break; } case QUOTED: { term = jj_consume_token(QUOTED); if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == FUZZY_SLOP) fuzzySlop = jj_consume_token(FUZZY_SLOP); else jj_la1[20] = jj_gen; if (((jj_ntk==-1)?f_jj_ntk():jj_ntk) == CARAT) { jj_consume_token(CARAT); boost = jj_consume_token(NUMBER); } else jj_la1[21] = jj_gen; int32_t s = phraseSlop; if (fuzzySlop != NULL) { try { s = _ttoi(fuzzySlop->image + 1); } catch (...) { /* ignore exceptions */ } } // TODO: Make sure this hack, save an extra dup, is legal and not harmful const size_t st = _tcslen(term->image); term->image[st-1]='\0'; TCHAR* tmp = discardEscapeChar(term->image+1); q = getFieldQuery(_field, tmp, s); _CLDELETE_LCARRAY(tmp); break; } default: { jj_la1[22] = jj_gen; jj_consume_token(-1); _CLTHROWT(CL_ERR_Parse,_T("")); } } if (boost != NULL) { float_t f = 1.0; try { f = _tcstod(boost->image, NULL); } catch (...) { /* Should this be handled somehow? (defaults to "no boost", if * boost number is invalid) */ } // avoid boosting null queries, such as those caused by stop words if (q != NULL) { q->setBoost(f); } } return q; } bool QueryParser::jj_2_1(const int32_t xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_1(); } catch(CLuceneError& e) { // TODO: Improve this handling if (e.number()==CL_ERR_Parse && _tcscmp(e.twhat(),_T("LookaheadSuccess"))==0) return true; else throw e; } _CLFINALLY( jj_save(0, xla); ); } bool QueryParser::jj_3R_2() { if (jj_scan_token(TERM)) return true; if (jj_scan_token(COLON)) return true; return false; } bool QueryParser::jj_3_1() { QueryToken* xsp = jj_scanpos; if (jj_3R_2()) { jj_scanpos = xsp; if (jj_3R_3()) return true; } return false; } bool QueryParser::jj_3R_3() { if (jj_scan_token(STAR)) return true; if (jj_scan_token(COLON)) return true; return false; } QueryParser::QueryParser(CharStream* stream):_operator(OR_OPERATOR), lowercaseExpandedTerms(true),useOldRangeQuery(false),allowLeadingWildcard(false),enablePositionIncrements(false), analyzer(NULL),field(NULL),phraseSlop(0),fuzzyMinSim(FuzzyQuery::defaultMinSimilarity), fuzzyPrefixLength(FuzzyQuery::defaultPrefixLength),/*locale(NULL),*/ dateResolution(CL_NS(document)::DateTools::NO_RESOLUTION),fieldToDateResolution(NULL), token_source(NULL),token(NULL),jj_nt(NULL),_firstToken(NULL),jj_ntk(-1),jj_scanpos(NULL),jj_lastpos(NULL),jj_la(0), lookingAhead(false),jj_gen(0),jj_2_rtns(NULL),jj_rescan(false),jj_gc(0),jj_expentries(NULL),jj_expentry(NULL), jj_kind(-1),jj_endpos(0) { _init(stream); } void QueryParser::_init(CharStream* stream){ if (token_source == NULL) token_source = _CLNEW QueryParserTokenManager(stream); _firstToken = token = _CLNEW QueryToken(); jj_ntk = -1; jj_gen = 0; for (int32_t i = 0; i < 23; i++) jj_la1[i] = -1; jj_2_rtns = new JJCalls(); } QueryToken* QueryParser::jj_consume_token(const int32_t kind) { QueryToken* oldToken = token; if (token->next != NULL) token = token->next; else token = token->next = token_source->getNextToken(); jj_ntk = -1; if (token->kind == kind) { jj_gen++; if (++jj_gc > 100) { jj_gc = 0; JJCalls* c = jj_2_rtns; while (c != NULL) { if (c->gen < jj_gen) c->first = NULL; c = c->next; } } return token; } token = oldToken; jj_kind = kind; generateParseException(); return NULL; } bool QueryParser::jj_scan_token(const int32_t kind) { if (jj_scanpos == jj_lastpos) { jj_la--; if (jj_scanpos->next == NULL) { jj_lastpos = jj_scanpos = jj_scanpos->next = token_source->getNextToken(); } else { jj_lastpos = jj_scanpos = jj_scanpos->next; } } else { jj_scanpos = jj_scanpos->next; } if (jj_rescan) { int32_t i = 0; QueryToken* tok = token; while (tok != NULL && tok != jj_scanpos) { i++; tok = tok->next; } if (tok != NULL) jj_add_error_token(kind, i); } if (jj_scanpos->kind != kind) return true; if (jj_la == 0 && jj_scanpos == jj_lastpos) _CLTHROWT(CL_ERR_Parse, _T("LookaheadSuccess")); return false; } void QueryParser::ReInit(CharStream* stream) { token_source->ReInit(stream); delete jj_2_rtns; _deleteTokens(); _init(NULL); } QueryParser::QueryParser(QueryParserTokenManager* tm):_operator(OR_OPERATOR), lowercaseExpandedTerms(true),useOldRangeQuery(false),allowLeadingWildcard(false),enablePositionIncrements(false), analyzer(NULL),field(NULL),phraseSlop(0),fuzzyMinSim(FuzzyQuery::defaultMinSimilarity), fuzzyPrefixLength(FuzzyQuery::defaultPrefixLength),/*locale(NULL),*/ dateResolution(CL_NS(document)::DateTools::NO_RESOLUTION),fieldToDateResolution(NULL), token_source(NULL),token(NULL),jj_nt(NULL),_firstToken(NULL),jj_ntk(-1),jj_scanpos(NULL),jj_lastpos(NULL),jj_la(0), lookingAhead(false),jj_gen(0),jj_2_rtns(NULL),jj_rescan(false),jj_gc(0),jj_expentries(NULL),jj_expentry(NULL), jj_kind(-1),jj_endpos(0) { ReInit(tm); } void QueryParser::ReInit(QueryParserTokenManager* tm){ _CLLDELETE(token_source); token_source = tm; _deleteTokens(); _firstToken = token = _CLNEW QueryToken(); jj_ntk = -1; jj_gen = 0; for (int32_t i = 0; i < 23; i++) jj_la1[i] = -1; delete jj_2_rtns; jj_2_rtns = new JJCalls(); } QueryToken* QueryParser::getNextToken() { if (token->next != NULL) token = token->next; else token = token->next = token_source->getNextToken(); jj_ntk = -1; jj_gen++; return token; } QueryToken* QueryParser::getToken(int32_t index) { QueryToken* t = lookingAhead ? jj_scanpos : token; for (int32_t i = 0; i < index; i++) { if (t->next != NULL) t = t->next; else t = t->next = token_source->getNextToken(); } return t; } int32_t QueryParser::f_jj_ntk() { if ((jj_nt=token->next) == NULL){ token->next=token_source->getNextToken(); jj_ntk = token->next->kind; return jj_ntk; } else{ jj_ntk = jj_nt->kind; return jj_ntk; } } QueryParser::JJCalls::JJCalls():gen(0),first(NULL),arg(0),next(NULL) { } QueryParser::JJCalls::~JJCalls(){ _CLLDELETE(first); delete next; } void QueryParser::jj_add_error_token(const int32_t kind, int32_t pos) { if (pos >= 100) return; if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { _CLLDELETE(jj_expentry); jj_expentry = _CLNEW ValueArray(jj_endpos); for (int32_t i = 0; i < jj_endpos; i++) { jj_expentry->values[i] = jj_lasttokens[i]; } bool exists = false; if (!jj_expentries) jj_expentries = _CLNEW CL_NS(util)::CLVector*, CL_NS(util)::Deletor::Object< CL_NS(util)::ValueArray > >(); for (size_t i=0;isize();i++){ const ValueArray* oldentry = jj_expentries->at(i); if (oldentry->length == jj_expentry->length) { exists = true; for (size_t i = 0; i < jj_expentry->length; i++) { if (oldentry->values[i] != jj_expentry->values[i]) { exists = false; break; } } if (exists) break; } } if (!exists) {jj_expentries->push_back(jj_expentry); jj_expentry=NULL;} if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; } } void QueryParser::generateParseException() { // lazily create the vectors required for this operation if (!jj_expentries) jj_expentries = _CLNEW CL_NS(util)::CLVector*, CL_NS(util)::Deletor::Object< CL_NS(util)::ValueArray > >(); else jj_expentries->clear(); bool la1tokens[33]; for (int32_t i = 0; i < 33; i++) { la1tokens[i] = false; } if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } for (int32_t i = 0; i < 23; i++) { if (jj_la1[i] == jj_gen) { for (int32_t j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<(1); jj_expentry->values[0] = i; jj_expentries->push_back(jj_expentry); jj_expentry=NULL; } } jj_endpos = 0; jj_rescan_token(); jj_add_error_token(0, 0); TCHAR* err = getParseExceptionMessage(token, jj_expentries, tokenImage); _CLTHROWT_DEL(CL_ERR_Parse, err); } void QueryParser::jj_rescan_token() { jj_rescan = true; JJCalls* p = jj_2_rtns; do { if (p->gen > jj_gen) { jj_la = p->arg; jj_lastpos = jj_scanpos = p->first; jj_3_1(); } p = p->next; } while (p != NULL); jj_rescan = false; } void QueryParser::jj_save(const int32_t /*index*/, int32_t xla) { JJCalls* p = jj_2_rtns; while (p->gen > jj_gen) { if (p->next == NULL) { p = p->next = new JJCalls(); break; } p = p->next; } p->gen = jj_gen + xla - jj_la; p->first = token; p->arg = xla; } TCHAR* QueryParserConstants::addEscapes(TCHAR* str) { const size_t len = _tcslen(str); StringBuffer retval(len * 2); TCHAR ch; for (size_t i = 0; i < len; i++) { switch (str[i]) { case 0 : continue; case _T('\b'): retval.append(_T("\\b")); continue; case _T('\t'): retval.append(_T("\\t")); continue; case _T('\n'): retval.append(_T("\\n")); continue; case _T('\f'): retval.append(_T("\\f")); continue; case _T('\r'): retval.append(_T("\\r")); continue; case _T('"'): retval.append(_T("\\\"")); continue; case _T('\''): retval.append(_T("\\'")); continue; case _T('\\'): retval.append(_T("\\\\")); continue; default: if ((ch = str[i]) < 0x20 || ch > 0x7e) { TCHAR buf[4]; _sntprintf(buf, 4, _T("%012X"), static_cast(ch)); retval.append(_T("\\u")); retval.append(buf); } else { retval.appendChar(ch); } continue; } } return retval.giveBuffer(); } TCHAR* QueryParser::getParseExceptionMessage(QueryToken* currentToken, CL_NS(util)::CLVector< CL_NS(util)::ValueArray*, CL_NS(util)::Deletor::Object< CL_NS(util)::ValueArray > >* expectedTokenSequences, const TCHAR* tokenImage[]) { // TODO: Check to see what's a realistic initial value for the buffers here // TODO: Make eol configurable (will be useful for PrintStream implementation as well later)? const TCHAR* eol = _T("\n"); StringBuffer expected(CL_MAX_PATH); size_t maxSize = 0; for (size_t i = 0; i < expectedTokenSequences->size(); i++) { if (maxSize < expectedTokenSequences->at(i)->length) { maxSize = expectedTokenSequences->at(i)->length; } for (size_t j = 0; j < expectedTokenSequences->at(i)->length; j++) { expected.append(tokenImage[expectedTokenSequences->at(i)->values[j]]); expected.appendChar(_T(' ')); } if (expectedTokenSequences->at(i)->values[expectedTokenSequences->at(i)->length - 1] != 0) { expected.append(_T("...")); } expected.append(eol); expected.append(_T(" ")); } StringBuffer retval(CL_MAX_PATH); retval.append(_T("Encountered \"")); QueryToken* tok = currentToken->next; for (size_t i = 0; i < maxSize; i++) { if (i != 0) retval.appendChar(' '); if (tok->kind == 0) { retval.append(tokenImage[0]); break; } if (tok->image){ TCHAR* buf = addEscapes(tok->image); retval.append(buf); _CLDELETE_CARRAY(buf); } tok = tok->next; } retval.append(_T("\" at line ")); retval.appendInt(currentToken->next->beginLine); retval.append(_T(", column ")); retval.appendInt(currentToken->next->beginColumn); retval.appendChar(_T('.')); retval.append(eol); if (expectedTokenSequences->size() == 1) { retval.append(_T("Was expecting:")); retval.append(eol); retval.append(_T(" ")); } else { retval.append(_T("Was expecting one of:")); retval.append(eol); retval.append(_T(" ")); } retval.append(expected.getBuffer()); return retval.giveBuffer(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryParser.h000066400000000000000000000421321154025176300242450ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_QueryParser_ #define _lucene_queryParser_QueryParser_ #include "CLucene/util/Array.h" #include "QueryParserTokenManager.h" #include "CLucene/document/DateTools.h" #include "CLucene/util/VoidMap.h" #include "CLucene/util/VoidList.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(analysis,Analyzer) CL_CLASS_DEF(search,Query) CL_CLASS_DEF(search,BooleanClause) CL_NS_DEF(queryParser) class QueryParserConstants; /** * This class is generated by JavaCC. The most important method is * {@link #parse(String)}. * * The syntax for query strings is as follows: * A Query is a series of clauses. * A clause may be prefixed by: *
    *
  • a plus (+) or a minus (-) sign, indicating * that the clause is required or prohibited respectively; or *
  • a term followed by a colon, indicating the field to be searched. * This enables one to construct queries which search multiple fields. *
* * A clause may be either: *
    *
  • a term, indicating all the documents that contain this term; or *
  • a nested query, enclosed in parentheses. Note that this may be used * with a +/- prefix to require any of a set of * terms. *
* * Thus, in BNF, the query grammar is: *
 *   Query  ::= ( Clause )*
 *   Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" )
 * 
* *

* Examples of appropriately formatted queries can be found in the query syntax * documentation. *

* *

* In {@link RangeQuery}s, QueryParser tries to detect date values, e.g. * date:[6/1/2005 TO 6/4/2005] produces a range query that searches * for "date" fields between 2005-06-01 and 2005-06-04. Note that the format * of the accepted input depends on {@link #setLocale(Locale) the locale}. * By default a date is converted into a search term using the deprecated * {@link DateField} for compatibility reasons. * To use the new {@link DateTools} to convert dates, a * {@link org.apache.lucene.document.DateTools.Resolution} has to be set. *

*

* The date resolution that shall be used for RangeQueries can be set * using {@link #setDateResolution(DateTools.Resolution)} * or {@link #setDateResolution(String, DateTools.Resolution)}. The former * sets the default date resolution for all fields, whereas the latter can * be used to set field specific date resolutions. Field specific date * resolutions take, if set, precedence over the default date resolution. *

*

* If you use neither {@link DateField} nor {@link DateTools} in your * index, you can create your own * query parser that inherits QueryParser and overwrites * {@link #getRangeQuery(String, String, String, boolean)} to * use a different method for date conversion. *

* *

Note that QueryParser is not thread-safe.

* * @author Brian Goetz * @author Peter Halacsy * @author Tatu Saloranta */ class CLUCENE_EXPORT QueryParser : public virtual QueryParserConstants { private: LUCENE_STATIC_CONSTANT(int32_t, CONJ_NONE=0); LUCENE_STATIC_CONSTANT(int32_t, CONJ_AND=1); LUCENE_STATIC_CONSTANT(int32_t, CONJ_OR=2); LUCENE_STATIC_CONSTANT(int32_t, MOD_NONE=0); LUCENE_STATIC_CONSTANT(int32_t, MOD_NOT=10); LUCENE_STATIC_CONSTANT(int32_t, MOD_REQ=11); public: /** The default operator for parsing queries. * Use {@link QueryParser#setDefaultOperator} to change it. */ enum Operator { OR_OPERATOR, AND_OPERATOR }; private: /** The actual operator that parser uses to combine query terms */ Operator _operator; bool lowercaseExpandedTerms; bool useOldRangeQuery; bool allowLeadingWildcard; bool enablePositionIncrements; CL_NS(analysis)::Analyzer* analyzer; TCHAR* field; int32_t phraseSlop; float_t fuzzyMinSim; int32_t fuzzyPrefixLength; //TODO: Locale locale = Locale.getDefault(); // the default date resolution CL_NS(document)::DateTools::Resolution dateResolution; // maps field names to date resolutions typedef CL_NS(util)::CLHashMap FieldToDateResolutionType; FieldToDateResolutionType* fieldToDateResolution; public: /** Constructs a query parser. * @param f the default field for query terms. * @param a used to find terms in the query text. */ QueryParser(const TCHAR* f, CL_NS(analysis)::Analyzer* a); virtual ~QueryParser(); void _deleteTokens(); /** For backward compatibility */ static CL_NS(search)::Query* parse(const TCHAR* q, const TCHAR* f, CL_NS(analysis)::Analyzer* a); /** Parses a query string, returning a {@link org.apache.lucene.search.Query}. * @param query the query string to be parsed. * @throws ParseException if the parsing fails */ CL_NS(search)::Query* parse(const TCHAR* _query); /** * @return Returns the analyzer. */ CL_NS(analysis)::Analyzer* getAnalyzer() const; /** * @return Returns the field. */ const TCHAR* getField() const; /** * Get the minimal similarity for fuzzy queries. */ float_t getFuzzyMinSim() const; /** * Set the minimum similarity for fuzzy queries. * Default is 0.5f. */ void setFuzzyMinSim(const float_t _fuzzyMinSim); /** * Get the prefix length for fuzzy queries. * @return Returns the fuzzyPrefixLength. */ int32_t getFuzzyPrefixLength() const; /** * Set the prefix length for fuzzy queries. Default is 0. * @param fuzzyPrefixLength The fuzzyPrefixLength to set. */ void setFuzzyPrefixLength(const int32_t _fuzzyPrefixLength); /** * Sets the default slop for phrases. If zero, then exact phrase matches * are required. Default value is zero. */ void setPhraseSlop(const int32_t _phraseSlop); /** * Gets the default slop for phrases. */ int32_t getPhraseSlop() const; /** * Set to true to allow leading wildcard characters. *

* When set, * or ? are allowed as * the first character of a PrefixQuery and WildcardQuery. * Note that this can produce very slow * queries on big indexes. *

* Default: false. */ void setAllowLeadingWildcard(const bool _allowLeadingWildcard); /** * @see #setAllowLeadingWildcard(boolean) */ bool getAllowLeadingWildcard() const; /** * Set to true to enable position increments in result query. *

* When set, result phrase and multi-phrase queries will * be aware of position increments. * Useful when e.g. a StopFilter increases the position increment of * the token that follows an omitted token. *

* Default: false. */ void setEnablePositionIncrements(const bool _enable); /** * @see #setEnablePositionIncrements(boolean) */ bool getEnablePositionIncrements() const; /** * Sets the boolean operator of the QueryParser. * In default mode (OR_OPERATOR) terms without any modifiers * are considered optional: for example capital of Hungary is equal to * capital OR of OR Hungary.
* In AND_OPERATOR mode terms are considered to be in conjuction: the * above mentioned query is parsed as capital AND of AND Hungary */ void setDefaultOperator(Operator _op); /** * Gets implicit operator setting, which will be either AND_OPERATOR * or OR_OPERATOR. */ Operator getDefaultOperator() const; /** * Whether terms of wildcard, prefix, fuzzy and range queries are to be automatically * lower-cased or not. Default is true. */ void setLowercaseExpandedTerms(const bool _lowercaseExpandedTerms); /** * @see #setLowercaseExpandedTerms(boolean) */ bool getLowercaseExpandedTerms() const; /** * By default QueryParser uses new ConstantScoreRangeQuery in preference to RangeQuery * for range queries. This implementation is generally preferable because it * a) Runs faster b) Does not have the scarcity of range terms unduly influence score * c) avoids any "TooManyBooleanClauses" exception. * However, if your application really needs to use the old-fashioned RangeQuery and the above * points are not required then set this option to true * Default is false. */ void setUseOldRangeQuery(const bool _useOldRangeQuery); /** * @see #setUseOldRangeQuery(boolean) */ bool getUseOldRangeQuery() const; /** * Set locale used by date range parsing. * void setLocale(const Locale _locale) { locale = _locale; } * Returns current locale, allowing access by subclasses. * Locale getLocale() const { return locale; } */ /** * Sets the default date resolution used by RangeQueries for fields for which no * specific date resolutions has been set. Field specific resolutions can be set * with {@link #setDateResolution(String, DateTools.Resolution)}. * * @param dateResolution the default date resolution to set */ void setDateResolution(const CL_NS(document)::DateTools::Resolution _dateResolution); /** * Sets the date resolution used by RangeQueries for a specific field. * * @param fieldName field for which the date resolution is to be set * @param dateResolution date resolution to set */ void setDateResolution(const TCHAR* fieldName, const CL_NS(document)::DateTools::Resolution _dateResolution); /** * Returns the date resolution that is used by RangeQueries for the given field. * Returns null (NO_RESOLUTION), if no default or field specific date resolution has been set * for the given field. * */ CL_NS(document)::DateTools::Resolution getDateResolution(const TCHAR* fieldName) const; protected: void addClause(std::vector& clauses, int32_t conj, int32_t mods, CL_NS(search)::Query* q); /** * @exception ParseException throw in overridden method to disallow */ virtual CL_NS(search)::Query* getFieldQuery(const TCHAR* _field, TCHAR* queryText); /** * Base implementation delegates to {@link #getFieldQuery(String,String)}. * This method may be overridden, for example, to return * a SpanNearQuery instead of a PhraseQuery. * * @exception ParseException throw in overridden method to disallow */ virtual CL_NS(search)::Query* getFieldQuery(const TCHAR* _field, TCHAR* queryText, const int32_t slop); /** * @exception ParseException throw in overridden method to disallow */ virtual CL_NS(search)::Query* getRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, const bool inclusive); /** * Factory method for generating query, given a set of clauses. * By default creates a boolean query composed of clauses passed in. * * Can be overridden by extending classes, to modify query being * returned. * * @param clauses Vector that contains {@link BooleanClause} instances * to join. * @param disableCoord true if coord scoring should be disabled. * * @return Resulting {@link Query} object. * @exception ParseException throw in overridden method to disallow */ CL_NS(search)::Query* getBooleanQuery(std::vector& clauses, bool disableCoord = false); /** * Factory method for generating a query. Called when parser * parses an input term token that contains one or more wildcard * characters (? and *), but is not a prefix term token (one * that has just a single * character at the end) *

* Depending on settings, prefix term may be lower-cased * automatically. It will not go through the default Analyzer, * however, since normal Analyzers are unlikely to work properly * with wildcard templates. *

* Can be overridden by extending classes, to provide custom handling for * wildcard queries, which may be necessary due to missing analyzer calls. * * @param field Name of the field query will use. * @param termStr Term token that contains one or more wild card * characters (? or *), but is not simple prefix term * * @return Resulting {@link Query} built for the term * @exception ParseException throw in overridden method to disallow */ virtual CL_NS(search)::Query* getWildcardQuery(const TCHAR* _field, TCHAR* termStr); /** * Factory method for generating a query (similar to * {@link #getWildcardQuery}). Called when parser parses an input term * token that uses prefix notation; that is, contains a single '*' wildcard * character as its last character. Since this is a special case * of generic wildcard term, and such a query can be optimized easily, * this usually results in a different query object. *

* Depending on settings, a prefix term may be lower-cased * automatically. It will not go through the default Analyzer, * however, since normal Analyzers are unlikely to work properly * with wildcard templates. *

* Can be overridden by extending classes, to provide custom handling for * wild card queries, which may be necessary due to missing analyzer calls. * * @param field Name of the field query will use. * @param termStr Term token to use for building term for the query * (without trailing '*' character!) * * @return Resulting {@link Query} built for the term * @exception ParseException throw in overridden method to disallow */ virtual CL_NS(search)::Query* getPrefixQuery(const TCHAR* _field, TCHAR* _termStr); /** * Factory method for generating a query (similar to * {@link #getWildcardQuery}). Called when parser parses * an input term token that has the fuzzy suffix (~) appended. * * @param field Name of the field query will use. * @param termStr Term token to use for building term for the query * * @return Resulting {@link Query} built for the term * @exception ParseException throw in overridden method to disallow */ virtual CL_NS(search)::Query* getFuzzyQuery(const TCHAR* _field, TCHAR* termStr, const float_t minSimilarity); private: /** * Returns a String where the escape char has been * removed, or kept only once if there was a double escape. * * Supports escaped unicode characters, e. g. translates * A to A. * * @memory caller is responsible to free the returned string * */ TCHAR* discardEscapeChar(TCHAR* input, TCHAR* output=NULL); /** Returns the numeric value of the hexadecimal character */ static int32_t hexToInt(TCHAR c); struct JJCalls; public: /** * Returns a String where those characters that QueryParser * expects to be escaped are escaped by a preceding \. * * @memory caller is responsible to free the returned string */ static TCHAR* escape(const TCHAR* s); // * Query ::= ( Clause )* // * Clause ::= ["+", "-"] [ ":"] ( | "(" Query ")" ) int32_t Conjunction(); int32_t Modifiers(); // This makes sure that there is no garbage after the query string CL_NS(search)::Query* TopLevelQuery(TCHAR* _field); CL_NS(search)::Query* fQuery(TCHAR* _field); CL_NS(search)::Query* fClause(TCHAR* _field); public: CL_NS(search)::Query* fTerm(const TCHAR* _field); private: bool jj_2_1(const int32_t xla); bool jj_3R_2(); bool jj_3_1(); bool jj_3R_3(); public: QueryParserTokenManager* token_source; QueryToken *token, *jj_nt; private: QueryToken *_firstToken; int32_t jj_ntk; QueryToken *jj_scanpos, *jj_lastpos; int32_t jj_la; public: bool lookingAhead; private: bool jj_semLA; int32_t jj_gen; int32_t jj_la1[23]; static const int32_t jj_la1_0[]; static const int32_t jj_la1_1[]; JJCalls* jj_2_rtns; bool jj_rescan; int32_t jj_gc; public: QueryParser(CharStream* stream); void ReInit(CharStream* stream); QueryParser(QueryParserTokenManager* tm); void ReInit(QueryParserTokenManager* tm); private: void _init(CharStream* stream); QueryToken* jj_consume_token(const int32_t kind); bool jj_scan_token(const int32_t kind); public: QueryToken* getNextToken(); QueryToken* getToken(int32_t index); private: int32_t f_jj_ntk(); CL_NS(util)::CLVector< CL_NS(util)::ValueArray*, CL_NS(util)::Deletor::Object< CL_NS(util)::ValueArray > >* jj_expentries; CL_NS(util)::ValueArray* jj_expentry; int32_t jj_kind; int32_t jj_lasttokens[100]; int32_t jj_endpos; void jj_add_error_token(const int32_t kind, int32_t pos); public: void generateParseException(); //void enable_tracing() {} //void disable_tracing() {} private: void jj_rescan_token(); void jj_save(const int32_t index, int32_t xla); TCHAR* getParseExceptionMessage(QueryToken* currentToken, CL_NS(util)::CLVector< CL_NS(util)::ValueArray*, CL_NS(util)::Deletor::Object< CL_NS(util)::ValueArray > >* expectedTokenSequences, const TCHAR* tokenImage[]); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryParserConstants.h000066400000000000000000000030131154025176300261350ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_QueryParserConstants_ #define _lucene_queryParser_QueryParserConstants_ CL_NS_DEF(queryParser) class CLUCENE_EXPORT QueryParserConstants { public: enum Types { _EOF = 0, _NUM_CHAR = 1, _ESCAPED_CHAR = 2, _TERM_START_CHAR = 3, _TERM_CHAR = 4, _WHITESPACE = 5, AND = 7, OR = 8, NOT = 9, PLUS = 10, MINUS = 11, LPAREN = 12, RPAREN = 13, COLON = 14, STAR = 15, CARAT = 16, QUOTED = 17, TERM = 18, FUZZY_SLOP = 19, PREFIXTERM = 20, WILDTERM = 21, RANGEIN_START = 22, RANGEEX_START = 23, NUMBER = 24, RANGEIN_TO = 25, RANGEIN_END = 26, RANGEIN_QUOTED = 27, RANGEIN_GOOP = 28, RANGEEX_TO = 29, RANGEEX_END = 30, RANGEEX_QUOTED = 31, RANGEEX_GOOP = 32 }; enum LexStates { Boost = 0, RangeEx = 1, RangeIn = 2, DEFAULT = 3 }; static const TCHAR* tokenImage[]; protected: /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal, while formatting an error message. * Called internally only by error reporting tools. */ static TCHAR* addEscapes(TCHAR* str); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryParserTokenManager.cpp000066400000000000000000000700301154025176300270720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryParserTokenManager.h" #include "_CharStream.h" #include "_FastCharStream.h" #include "QueryToken.h" #include "CLucene/util/StringBuffer.h" CL_NS_DEF(queryParser) const int64_t QueryParserTokenManager::jjbitVec2[]={0x0L, 0x0L, _ILONGLONG(0xffffffffffffffff), _ILONGLONG(0xffffffffffffffff)}; const int64_t QueryParserTokenManager::jjbitVec0[] = { _ILONGLONG(0xfffffffffffffffe), _ILONGLONG(0xffffffffffffffff), _ILONGLONG(0xffffffffffffffff), _ILONGLONG(0xffffffffffffffff) }; const int32_t QueryParserTokenManager::jjnextStates[]={ 15, 17, 18, 29, 32, 23, 33, 30, 20, 21, 32, 23, 33, 31, 34, 27, 2, 4, 5, 0, 1 }; const TCHAR* QueryParserTokenManager::jjstrLiteralImages[]={ _T(""), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, _T("\53"), _T("\55)"), _T("\50)"), _T("\51"), _T("\72"), _T("\52"), _T("\136"), NULL, NULL, NULL, NULL, NULL, _T("\133"), _T("\173"), NULL, _T("\124\117"), _T("\135"), NULL, NULL, _T("\124\117"), _T("\175"), NULL, NULL }; const TCHAR* QueryParserTokenManager::lexStateNames [] = { _T("Boost"), _T("RangeEx"), _T("RangeIn"), _T("DEFAULT") }; const int32_t QueryParserTokenManager::jjnewLexState [] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 2, 1, 3, -1, 3, -1, -1, -1, 3, -1, -1 }; const int64_t QueryParserTokenManager::jjtoToken [] = { _ILONGLONG(0x1ffffff81) }; const int64_t QueryParserTokenManager::jjtoSkip [] = { _ILONGLONG(0x40) }; QueryParserTokenManager::QueryParserTokenManager(CharStream* stream, const int32_t lexState) : input_stream(stream), curChar(0), curLexState(3), defaultLexState(3),jjnewStateCnt(0),jjround(0), jjmatchedPos(0),jjmatchedKind(0) { if (lexState > -1) SwitchTo(lexState); } QueryParserTokenManager::~QueryParserTokenManager() { _CLLDELETE(input_stream); } int32_t QueryParserTokenManager::jjStopStringLiteralDfa_3(const int32_t /*pos*/, int64_t /*active0*/) { return -1; } int32_t QueryParserTokenManager::jjStartNfa_3(int32_t pos, int64_t active0) { return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0), pos + 1); } int32_t QueryParserTokenManager::jjStopAtPos(const int32_t pos, const int32_t kind) { jjmatchedKind = kind; jjmatchedPos = pos; return pos + 1; } int32_t QueryParserTokenManager::jjStartNfaWithStates_3(int32_t pos, int32_t kind, int32_t state) { jjmatchedKind = kind; jjmatchedPos = pos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return pos + 1; } return jjMoveNfa_3(state, pos + 1); } int32_t QueryParserTokenManager::jjMoveStringLiteralDfa0_3() { switch(curChar) { case 40: return jjStopAtPos(0, 12); case 41: return jjStopAtPos(0, 13); case 42: return jjStartNfaWithStates_3(0, 15, 36); case 43: return jjStopAtPos(0, 10); case 45: return jjStopAtPos(0, 11); case 58: return jjStopAtPos(0, 14); case 91: return jjStopAtPos(0, 22); case 94: return jjStopAtPos(0, 16); case 123: return jjStopAtPos(0, 23); default : return jjMoveNfa_3(0, 0); } } void QueryParserTokenManager::jjCheckNAdd(const int32_t state) { if (jjrounds[state] != jjround) { jjstateSet[jjnewStateCnt++] = state; jjrounds[state] = jjround; } } void QueryParserTokenManager::jjAddStates(int32_t start, const int32_t end) { do { jjstateSet[jjnewStateCnt++] = jjnextStates[start]; } while (start++ != end); } void QueryParserTokenManager::jjCheckNAddTwoStates(const int32_t state1, const int32_t state2) { jjCheckNAdd(state1); jjCheckNAdd(state2); } void QueryParserTokenManager::jjCheckNAddStates(int32_t start, const int32_t end) { do { jjCheckNAdd(jjnextStates[start]); } while (start++ != end); } void QueryParserTokenManager::jjCheckNAddStates(const int32_t start) { jjCheckNAdd(jjnextStates[start]); jjCheckNAdd(jjnextStates[start + 1]); } int32_t QueryParserTokenManager::jjMoveNfa_3(const int32_t startState, int32_t curPos) { int32_t startsAt = 0; jjnewStateCnt = 36; int32_t i = 1; jjstateSet[0] = startState; int32_t kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { uint64_t l = (uint64_t) (((uint64_t)1L) << ((int32_t)curChar)); do { switch(jjstateSet[--i]) { case 36: case 25: if (( _ILONGLONG(0xfbfffcf8ffffd9ff) & l) == 0L) break; if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 0: if (( _ILONGLONG(0xfbffd4f8ffffd9ff) & l) != 0L) { if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); } else if ((_ILONGLONG(0x100002600) & l) != 0L) { if (kind > 6) kind = 6; } else if (curChar == 34) jjCheckNAddStates(0, 2); else if (curChar == 33) { if (kind > 9) kind = 9; } if ((_ILONGLONG(0x7bffd0f8ffffd9ff) & l) != 0L) { if (kind > 18) kind = 18; jjCheckNAddStates(3, 7); } else if (curChar == 42) { if (kind > 20) kind = 20; } if (curChar == 38) jjstateSet[jjnewStateCnt++] = 4; break; case 4: if (curChar == 38 && kind > 7) kind = 7; break; case 5: if (curChar == 38) jjstateSet[jjnewStateCnt++] = 4; break; case 13: if (curChar == 33 && kind > 9) kind = 9; break; case 14: case 16: if (curChar == 34) jjCheckNAddStates(0, 2); break; case 15: if ((_ILONGLONG(0xfffffffbffffffff) & l) != 0L) jjCheckNAddStates(0, 2); break; case 18: if (curChar == 34 && kind > 17) kind = 17; break; case 20: if ((_ILONGLONG(0x3ff000000000000) & l) == 0L) break; if (kind > 19) kind = 19; jjAddStates(8, 9); break; case 21: if (curChar == 46) jjCheckNAdd(22); break; case 22: if ((_ILONGLONG(0x3ff000000000000) & l) == 0L) break; if (kind > 19) kind = 19; jjCheckNAdd(22); break; case 23: if (curChar == 42 && kind > 20) kind = 20; break; case 24: if ((_ILONGLONG(0xfbffd4f8ffffd9ff) & l) == 0L) break; if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 27: if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 28: if ((_ILONGLONG(0x7bffd0f8ffffd9ff) & l) == 0L) break; if (kind > 18) kind = 18; jjCheckNAddStates(3, 7); break; case 29: if ((_ILONGLONG(0x7bfff8f8ffffd9ff) & l) == 0L) break; if (kind > 18) kind = 18; jjCheckNAddTwoStates(29, 30); break; case 31: if (kind > 18) kind = 18; jjCheckNAddTwoStates(29, 30); break; case 32: if ((_ILONGLONG(0x7bfff8f8ffffd9ff) & l) != 0L) jjCheckNAddStates(10, 12); break; case 34: jjCheckNAddStates(10, 12); break; default : break; } } while(i != startsAt); } else if (curChar < 128) { uint64_t l = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { case 36: if ((_ILONGLONG(0x97ffffff87ffffff) & l) != 0L) { if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); } else if (curChar == 92) jjCheckNAddTwoStates(27, 27); break; case 0: if ((_ILONGLONG(0x97ffffff87ffffff) & l) != 0L) { if (kind > 18) kind = 18; jjCheckNAddStates(3, 7); } else if (curChar == 92) jjCheckNAddStates(13, 15); else if (curChar == 126) { if (kind > 19) kind = 19; jjstateSet[jjnewStateCnt++] = 20; } if ((_ILONGLONG(0x97ffffff87ffffff) & l) != 0L) { if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); } if (curChar == 78) jjstateSet[jjnewStateCnt++] = 11; else if (curChar == 124) jjstateSet[jjnewStateCnt++] = 8; else if (curChar == 79) jjstateSet[jjnewStateCnt++] = 6; else if (curChar == 65) jjstateSet[jjnewStateCnt++] = 2; break; case 1: if (curChar == 68 && kind > 7) kind = 7; break; case 2: if (curChar == 78) jjstateSet[jjnewStateCnt++] = 1; break; case 3: if (curChar == 65) jjstateSet[jjnewStateCnt++] = 2; break; case 6: if (curChar == 82 && kind > 8) kind = 8; break; case 7: if (curChar == 79) jjstateSet[jjnewStateCnt++] = 6; break; case 8: if (curChar == 124 && kind > 8) kind = 8; break; case 9: if (curChar == 124) jjstateSet[jjnewStateCnt++] = 8; break; case 10: if (curChar == 84 && kind > 9) kind = 9; break; case 11: if (curChar == 79) jjstateSet[jjnewStateCnt++] = 10; break; case 12: if (curChar == 78) jjstateSet[jjnewStateCnt++] = 11; break; case 15: jjAddStates(0, 2); break; case 17: if (curChar == 92) jjstateSet[jjnewStateCnt++] = 16; break; case 19: if (curChar != 126) break; if (kind > 19) kind = 19; jjstateSet[jjnewStateCnt++] = 20; break; case 24: if ((_ILONGLONG(0x97ffffff87ffffff) & l) == 0L) break; if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 25: if ((_ILONGLONG(0x97ffffff87ffffff) & l) == 0L) break; if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 26: if (curChar == 92) jjCheckNAddTwoStates(27, 27); break; case 27: if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 28: if ((_ILONGLONG(0x97ffffff87ffffff) & l) == 0L) break; if (kind > 18) kind = 18; jjCheckNAddStates(3, 7); break; case 29: if ((_ILONGLONG(0x97ffffff87ffffff) & l) == 0L) break; if (kind > 18) kind = 18; jjCheckNAddTwoStates(29, 30); break; case 30: if (curChar == 92) jjCheckNAddTwoStates(31, 31); break; case 31: if (kind > 18) kind = 18; jjCheckNAddTwoStates(29, 30); break; case 32: if ((_ILONGLONG(0x97ffffff87ffffff) & l) != 0L) jjCheckNAddStates(10, 12); break; case 33: if (curChar == 92) jjCheckNAddTwoStates(34, 34); break; case 34: jjCheckNAddStates(10, 12); break; case 35: if (curChar == 92) jjCheckNAddStates(13, 15); break; default : break; } } while(i != startsAt); } else { int32_t hiByte = (int32_t)(curChar >> 8); int32_t i1 = hiByte >> 6; uint64_t l1 = ((uint64_t)1L) << (hiByte & 63); int32_t i2 = (curChar & 0xff) >> 6; uint64_t l2 = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { case 36: case 25: case 27: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 0: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); } if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { if (kind > 18) kind = 18; jjCheckNAddStates(3, 7); } break; case 15: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) jjAddStates(0, 2); break; case 24: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; if (kind > 21) kind = 21; jjCheckNAddTwoStates(25, 26); break; case 28: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; if (kind > 18) kind = 18; jjCheckNAddStates(3, 7); break; case 29: case 31: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; if (kind > 18) kind = 18; jjCheckNAddTwoStates(29, 30); break; case 32: case 34: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) jjCheckNAddStates(10, 12); break; default : break; } } while(i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 36 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return curPos; } } } int32_t QueryParserTokenManager::jjStopStringLiteralDfa_1(const int32_t pos, const int64_t active0) { switch (pos) { case 0: if ((active0 & 0x20000000L) != 0L) { jjmatchedKind = 32; return 6; } return -1; default : return -1; } } int32_t QueryParserTokenManager::jjStartNfa_1(int32_t pos, int64_t active0) { return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1); } int32_t QueryParserTokenManager::jjStartNfaWithStates_1(const int32_t pos, const int32_t kind, const int32_t state) { jjmatchedKind = kind; jjmatchedPos = pos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return pos + 1; } return jjMoveNfa_1(state, pos + 1); } int32_t QueryParserTokenManager::jjMoveStringLiteralDfa0_1() { switch(curChar) { case 84: return jjMoveStringLiteralDfa1_1(0x20000000L); case 125: return jjStopAtPos(0, 30); default : return jjMoveNfa_1(0, 0); } } int32_t QueryParserTokenManager::jjMoveStringLiteralDfa1_1(int64_t active0) { try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else { jjStopStringLiteralDfa_1(0, active0); return 1; } } switch(curChar) { case 79: if ((active0 & 0x20000000L) != 0L) return jjStartNfaWithStates_1(1, 29, 6); break; default : break; } return jjStartNfa_1(0, active0); } int32_t QueryParserTokenManager::jjMoveNfa_1(const int32_t startState, int32_t curPos) { int32_t startsAt = 0; jjnewStateCnt = 7; int32_t i = 1; jjstateSet[0] = startState; int32_t kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { uint64_t l = ((uint64_t)1L) << curChar; do { switch(jjstateSet[--i]) { case 0: if ((_ILONGLONG(0xfffffffeffffffff) & l) != 0L) { if (kind > 32) kind = 32; jjCheckNAdd(6); } if ((_ILONGLONG(0x100002600) & l) != 0L) { if (kind > 6) kind = 6; } else if (curChar == 34) jjCheckNAddTwoStates(2, 4); break; case 1: if (curChar == 34) jjCheckNAddTwoStates(2, 4); break; case 2: if ((_ILONGLONG(0xfffffffbffffffff) & l) != 0L) jjCheckNAddStates(16, 18); break; case 3: if (curChar == 34) jjCheckNAddStates(16, 18); break; case 5: if (curChar == 34 && kind > 31) kind = 31; break; case 6: if ((_ILONGLONG(0xfffffffeffffffff) & l) == 0L) break; if (kind > 32) kind = 32; jjCheckNAdd(6); break; default : break; } } while(i != startsAt); } else if (curChar < 128) { uint64_t l = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { case 0: case 6: if ((_ILONGLONG(0xdfffffffffffffff) & l) == 0L) break; if (kind > 32) kind = 32; jjCheckNAdd(6); break; case 2: jjAddStates(16, 18); break; case 4: if (curChar == 92) jjstateSet[jjnewStateCnt++] = 3; break; default : break; } } while(i != startsAt); } else { int32_t hiByte = (int32_t)(curChar >> 8); int32_t i1 = hiByte >> 6; uint64_t l1 = ((uint64_t)1L) << (hiByte & 63); int32_t i2 = (curChar & 0xff) >> 6; uint64_t l2 = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { case 0: case 6: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; if (kind > 32) kind = 32; jjCheckNAdd(6); break; case 2: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) jjAddStates(16, 18); break; default : break; } } while(i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 7 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return curPos; } } } int32_t QueryParserTokenManager::jjMoveStringLiteralDfa0_0() { return jjMoveNfa_0(0, 0); } int32_t QueryParserTokenManager::jjMoveNfa_0(const int32_t startState, int32_t curPos) { int32_t startsAt = 0; jjnewStateCnt = 3; int32_t i = 1; jjstateSet[0] = startState; int32_t kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { uint64_t l = ((uint64_t)1L) << curChar; do { switch(jjstateSet[--i]) { case 0: if ((_ILONGLONG(0x3ff000000000000) & l) == 0L) break; if (kind > 24) kind = 24; jjAddStates(19, 20); break; case 1: if (curChar == 46) jjCheckNAdd(2); break; case 2: if ((_ILONGLONG(0x3ff000000000000) & l) == 0L) break; if (kind > 24) kind = 24; jjCheckNAdd(2); break; default : break; } } while(i != startsAt); } else if (curChar < 128) { /* uint64_t l = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { default : break; } } while(i != startsAt);*/ i = startsAt; } else { /* int32_t hiByte = (int)(curChar >> 8); int32_t i1 = hiByte >> 6; uint64_t l1 = ((uint64_t)1L) << (hiByte & 63); int32_t i2 = (curChar & 0xff) >> 6; uint64_t l2 = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { default : break; } } while(i != startsAt);*/ i = startsAt; } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return curPos; } } } int32_t QueryParserTokenManager::jjStopStringLiteralDfa_2(const int32_t pos, const int64_t active0) { switch (pos) { case 0: if ((active0 & 0x2000000L) != 0L) { jjmatchedKind = 28; return 6; } return -1; default : return -1; } } int32_t QueryParserTokenManager::jjStartNfa_2(int32_t pos, int64_t active0) { return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1); } int32_t QueryParserTokenManager::jjStartNfaWithStates_2(const int32_t pos, const int32_t kind, const int32_t state) { jjmatchedKind = kind; jjmatchedPos = pos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return pos+1; } return jjMoveNfa_2(state, pos + 1); } int32_t QueryParserTokenManager::jjMoveStringLiteralDfa0_2() { switch(curChar) { case 84: return jjMoveStringLiteralDfa1_2(0x2000000L); case 93: return jjStopAtPos(0, 26); default : return jjMoveNfa_2(0, 0); } } int32_t QueryParserTokenManager::jjMoveStringLiteralDfa1_2(const int64_t active0) { try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else { jjStopStringLiteralDfa_2(0, active0); return 1; } } switch(curChar) { case 79: if ((active0 & 0x2000000L) != 0L) return jjStartNfaWithStates_2(1, 25, 6); break; default : break; } return jjStartNfa_2(0, active0); } int32_t QueryParserTokenManager::jjMoveNfa_2(const int32_t startState, int32_t curPos) { int32_t startsAt = 0; jjnewStateCnt = 7; int32_t i = 1; jjstateSet[0] = startState; int32_t kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { uint64_t l = ((uint64_t)1L) << curChar; do { switch(jjstateSet[--i]) { case 0: if ((_ILONGLONG(0xfffffffeffffffff) & l) != 0L) { if (kind > 28) kind = 28; jjCheckNAdd(6); } if ((_ILONGLONG(0x100002600) & l) != 0L) { if (kind > 6) kind = 6; } else if (curChar == 34) jjCheckNAddTwoStates(2, 4); break; case 1: if (curChar == 34) jjCheckNAddTwoStates(2, 4); break; case 2: if ((_ILONGLONG(0xfffffffbffffffff) & l) != 0L) jjCheckNAddStates(16, 18); break; case 3: if (curChar == 34) jjCheckNAddStates(16, 18); break; case 5: if (curChar == 34 && kind > 27) kind = 27; break; case 6: if ((_ILONGLONG(0xfffffffeffffffff) & l) == 0L) break; if (kind > 28) kind = 28; jjCheckNAdd(6); break; default : break; } } while(i != startsAt); } else if (curChar < 128) { uint64_t l = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { case 0: case 6: if ((_ILONGLONG(0xffffffffdfffffff) & l) == 0L) break; if (kind > 28) kind = 28; jjCheckNAdd(6); break; case 2: jjAddStates(16, 18); break; case 4: if (curChar == 92) jjstateSet[jjnewStateCnt++] = 3; break; default : break; } } while(i != startsAt); } else { int32_t hiByte = (int32_t)(curChar >> 8); int32_t i1 = hiByte >> 6; uint64_t l1 = ((uint64_t)1L) << (hiByte & 63); int32_t i2 = (curChar & 0xff) >> 6; uint64_t l2 = ((uint64_t)1L) << (curChar & 63); do { switch(jjstateSet[--i]) { case 0: case 6: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; if (kind > 28) kind = 28; jjCheckNAdd(6); break; case 2: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) jjAddStates(16, 18); break; default : break; } } while(i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 7 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream->readChar(); } catch(CLuceneError& e) { if (e.number() != CL_ERR_IO) { throw e; } else return curPos; } } } /*static*/ bool QueryParserTokenManager::jjCanMove_0(const int32_t hiByte, const int32_t i1, const int32_t i2, const int64_t l1, const int64_t l2) { switch(hiByte) { case 0: return ((jjbitVec2[i2] & l2) != 0L); default : if ((jjbitVec0[i1] & l1) != 0L) return true; return false; } } void QueryParserTokenManager::ReInit(CharStream* stream) { jjmatchedPos = jjnewStateCnt = 0; curLexState = defaultLexState; _CLLDELETE(input_stream); input_stream = stream; ReInitRounds(); } void QueryParserTokenManager::ReInitRounds() { jjround = 0x80000001; for (int32_t i = 36; i-- > 0;) jjrounds[i] = 0x80000000; } void QueryParserTokenManager::ReInit(CharStream* stream, const int32_t lexState) { ReInit(stream); SwitchTo(lexState); } void QueryParserTokenManager::SwitchTo(const int32_t lexState) { if (lexState >= 4 || lexState < 0) { TCHAR err[CL_MAX_PATH]; // TODO: use TokenMgrError::INVALID_LEXICAL_STATE? _sntprintf(err,CL_MAX_PATH,_T("Error: Ignoring invalid lexical state : %d. State unchanged."), lexState); _CLTHROWA(CL_ERR_TokenMgr,err); } else curLexState = lexState; } QueryToken* QueryParserTokenManager::jjFillToken(){ QueryToken* t = QueryToken::newToken(jjmatchedKind); t->kind = jjmatchedKind; const TCHAR* im = jjstrLiteralImages[jjmatchedKind]; t->image = (im == NULL) ? input_stream->GetImage() : stringDuplicate(im); t->beginLine = input_stream->getBeginLine(); t->beginColumn = input_stream->getBeginColumn(); t->endLine = input_stream->getEndLine(); t->endColumn = input_stream->getEndColumn(); return t; } QueryToken* QueryParserTokenManager::getNextToken() { QueryToken* matchedToken = NULL; int32_t curPos = 0; for (;;) { try { curChar = input_stream->BeginToken(); } _CLCATCH_ERR_ELSE(CL_ERR_IO, { /*else*/ jjmatchedKind = 0; matchedToken = jjFillToken(); return matchedToken; }); switch(curLexState){ case 0: jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_0(); break; case 1: jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_1(); break; case 2: jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_2(); break; case 3: jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_3(); break; } if (jjmatchedKind != 0x7fffffff){ if (jjmatchedPos + 1 < curPos) input_stream->backup(curPos - jjmatchedPos - 1); if ((jjtoToken[jjmatchedKind >> 6] & ((uint64_t)(1L << (jjmatchedKind & 63)))) != (uint64_t)0L) { matchedToken = jjFillToken(); if (jjnewLexState[jjmatchedKind] != -1) curLexState = jjnewLexState[jjmatchedKind]; return matchedToken; } else { if (jjnewLexState[jjmatchedKind] != -1) curLexState = jjnewLexState[jjmatchedKind]; continue; } } int32_t error_line = input_stream->getEndLine(); int32_t error_column = input_stream->getEndColumn(); TCHAR* error_after = NULL; bool EOFSeen = false; try { input_stream->readChar(); input_stream->backup(1); } _CLCATCH_ERR_ELSE(CL_ERR_IO, { /*else*/ EOFSeen = true; if (curPos <= 1) { error_after = _CL_NEWARRAY(TCHAR,2); error_after[0] = _T(' '); error_after[1] = 0; } else { error_after = input_stream->GetImage(); } if (curChar == _T('\n') || curChar == _T('\r')) { error_line++; error_column = 0; } else error_column++; }); if (!EOFSeen) { input_stream->backup(1); if (curPos <= 1) { error_after = _CL_NEWARRAY(TCHAR,2); error_after[0] = _T(' '); error_after[1] = 0; } else { error_after = input_stream->GetImage(); } } // TODO: TokenMgrError.LEXICAL_ERROR ? TCHAR* err = getLexicalError(EOFSeen, curLexState, error_line, error_column, error_after, curChar); _CLDELETE_LCARRAY(error_after); _CLTHROWT_DEL(CL_ERR_TokenMgr,err); } } TCHAR* QueryParserTokenManager::getLexicalError(bool EOFSeen, int32_t /*lexState*/, int32_t errorLine, int32_t errorColumn, TCHAR* errorAfter, TCHAR curChar) { TCHAR* tmp = NULL; CL_NS(util)::StringBuffer sb(100); sb.append(_T("Lexical error at line ")); sb.appendInt(errorLine); sb.append(_T(", column ")); sb.appendInt(errorColumn); sb.append(_T(". Encountered: ")); if (EOFSeen){ sb.append(_T(" ")); }else{ sb.appendChar(_T('"')); sb.appendChar(curChar); // TODO: addEscapes ? sb.appendChar(_T('"')); sb.append(_T(" (")); sb.appendInt((int32_t)curChar); sb.append(_T("), ")); } sb.append(_T("after : \"")); tmp = addEscapes(errorAfter); sb.append(tmp); _CLDELETE_LCARRAY(tmp); sb.appendChar(_T('"')); return sb.giveBuffer(); } CL_NS_END // QueryParserTokenManager clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryParserTokenManager.h000066400000000000000000000067271154025176300265530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_QueryParserTokenManager_ #define _lucene_queryParser_QueryParserTokenManager_ #include "QueryParserConstants.h" CL_NS_DEF(queryParser) class CharStream; class QueryToken; class CLUCENE_EXPORT QueryParserTokenManager: public virtual QueryParserConstants { public: // TODO: PrintStream debugStream = System.out; // TODO: setDebugStream(PrintStream ds) { debugStream = ds; } private: int32_t jjStopStringLiteralDfa_3(const int32_t pos, int64_t active0); int32_t jjStartNfa_3(int32_t pos, int64_t active0); int32_t jjStopAtPos(const int32_t pos, const int32_t kind); int32_t jjStartNfaWithStates_3(int32_t pos, int32_t kind, int32_t state); int32_t jjMoveStringLiteralDfa0_3(); void jjCheckNAdd(const int32_t state); void jjAddStates(int32_t start, const int32_t end); void jjCheckNAddTwoStates(const int32_t state1, const int32_t state2); void jjCheckNAddStates(int32_t start, const int32_t end); void jjCheckNAddStates(const int32_t start); static const int64_t jjbitVec0[]; static const int64_t jjbitVec2[]; int32_t jjMoveNfa_3(const int32_t startState, int32_t curPos); int32_t jjStopStringLiteralDfa_1(const int32_t pos, const int64_t active0); int32_t jjStartNfa_1(int32_t pos, int64_t active0); int32_t jjStartNfaWithStates_1(const int32_t pos, const int32_t kind, const int32_t state); int32_t jjMoveStringLiteralDfa0_1(); int32_t jjMoveStringLiteralDfa1_1(int64_t active0); int32_t jjMoveNfa_1(const int32_t startState, int32_t curPos); int32_t jjMoveStringLiteralDfa0_0(); int32_t jjMoveNfa_0(const int32_t startState, int32_t curPos); int32_t jjStopStringLiteralDfa_2(const int32_t pos, const int64_t active0); int32_t jjStartNfa_2(int32_t pos, int64_t active0); int32_t jjStartNfaWithStates_2(const int32_t pos, const int32_t kind, const int32_t state); int32_t jjMoveStringLiteralDfa0_2(); int32_t jjMoveStringLiteralDfa1_2(const int64_t active0); int32_t jjMoveNfa_2(const int32_t startState, int32_t curPos); static const int32_t jjnextStates[]; static bool jjCanMove_0(const int32_t hiByte, const int32_t i1, const int32_t i2, const int64_t l1, const int64_t l2); public: static const TCHAR* jjstrLiteralImages []; static const TCHAR* lexStateNames []; static const int32_t jjnewLexState []; static const int64_t jjtoToken []; static const int64_t jjtoSkip []; protected: CharStream* input_stream; private: int32_t jjrounds[36]; int32_t jjstateSet[72]; protected: TCHAR curChar; public: QueryParserTokenManager(CharStream* stream, const int32_t lexState = -1); virtual ~QueryParserTokenManager(); void ReInit(CharStream* stream); private: void ReInitRounds(); public: void ReInit(CharStream* stream, const int32_t lexState); void SwitchTo(const int32_t lexState); protected: QueryToken* jjFillToken(); int32_t curLexState; int32_t defaultLexState; int32_t jjnewStateCnt; uint32_t jjround; int32_t jjmatchedPos; int32_t jjmatchedKind; public: QueryToken* getNextToken(); private: static TCHAR* getLexicalError(bool EOFSeen, int32_t lexState, int32_t errorLine, int32_t errorColumn, TCHAR* errorAfter, TCHAR curChar); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryToken.cpp000066400000000000000000000020231154025176300244170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryToken.h" CL_NS_DEF(queryParser) QueryToken::QueryToken() : kind(0), beginLine(0), beginColumn(0), endLine(0), endColumn(0), image(NULL), next(NULL), specialToken(NULL) { } QueryToken::~QueryToken() { #ifndef LUCENE_TOKEN_WORD_LENGTH _CLDELETE_LCARRAY( image ); #endif } TCHAR* QueryToken::toString() const { #ifndef LUCENE_TOKEN_WORD_LENGTH return image; #else return STRDUP_TtoT(image); #endif } /*static*/ QueryToken* QueryToken::newToken(const int32_t /*ofKind*/) { //switch(ofKind) //{ //default : return _CLNEW Token(); //} return _CLNEW QueryToken(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/queryParser/QueryToken.h000066400000000000000000000060211154025176300240660ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_Token_ #define _lucene_queryParser_Token_ CL_NS_DEF(queryParser) /** * Describes the input token stream. */ class CLUCENE_EXPORT QueryToken{ public: QueryToken(); ~QueryToken(); /** * An integer that describes the kind of this token. This numbering * system is determined by JavaCCParser, and a table of these numbers is * stored in the file ...Constants.java. */ int32_t kind; /** * beginLine and beginColumn describe the position of the first character * of this token; endLine and endColumn describe the position of the * last character of this token. */ int32_t beginLine, beginColumn, endLine, endColumn; /** * The string image of the token. */ TCHAR* image; /* TODO: If LUCENE_TOKEN_WORD_LENGTH is still necessary, use the #defines below #ifdef LUCENE_TOKEN_WORD_LENGTH TCHAR image[LUCENE_TOKEN_WORD_LENGTH+1]; #else TCHAR* image; #endif */ /** * A reference to the next regular (non-special) token from the input * stream. If this is the last token from the input stream, or if the * token manager has not read tokens beyond this one, this field is * set to null. This is true only if this token is also a regular * token. Otherwise, see below for a description of the contents of * this field. */ QueryToken* next; /** * This field is used to access special tokens that occur prior to this * token, but after the immediately preceding regular (non-special) token. * If there are no such special tokens, this field is set to null. * When there are more than one such special token, this field refers * to the last of these special tokens, which in turn refers to the next * previous special token through its specialToken field, and so on * until the first special token (whose specialToken field is null). * The next fields of special tokens refer to other special tokens that * immediately follow it (without an intervening regular token). If there * is no such token, this field is null. */ QueryToken* specialToken; /** * Returns the image. */ TCHAR* toString() const; /** * Returns a new Token object, by default. However, if you want, you * can create and return subclass objects based on the value of ofKind. * Simply add the cases to the switch for all those special cases. * For example, if you have a subclass of Token called IDToken that * you want to create if ofKind is ID, simlpy add something like : * * case MyParserConstants.ID : return new IDToken(); * * to the following switch statement. Then you can cast matchedToken * variable to the appropriate type and use it in your lexical actions. */ static QueryToken* newToken(const int32_t ofKind); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/_CharStream.h000066400000000000000000000101141154025176300241460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_CharStream_ #define _lucene_queryParser_CharStream_ CL_NS_DEF(queryParser) /** * This interface describes a character stream that maintains line and * column number positions of the characters. It also has the capability * to backup the stream to some extent. An implementation of this * interface is used in the TokenManager implementation generated by * JavaCCParser. * * All the methods except backup can be implemented in any fashion. backup * needs to be implemented correctly for the correct operation of the lexer. * Rest of the methods are all used to get information like line number, * column number and the String that constitutes a token and are not used * by the lexer. Hence their implementation won't affect the generated lexer's * operation. */ class CharStream :LUCENE_BASE { public: /** * Returns the next character from the selected input. The method * of selecting the input is the responsibility of the class * implementing this interface. Can throw any java.io.IOException. */ virtual TCHAR readChar() = 0; /** * Returns the column position of the character last read. * @deprecated * @see #getEndColumn */ virtual int32_t getColumn() const = 0; /** * Returns the line number of the character last read. * @deprecated * @see #getEndLine */ virtual int32_t getLine() const = 0; /** * Returns the column number of the last character for current token (being * matched after the last call to BeginTOken). */ virtual int32_t getEndColumn() const = 0; /** * Returns the line number of the last character for current token (being * matched after the last call to BeginTOken). */ virtual int32_t getEndLine() const = 0; /** * Returns the column number of the first character for current token (being * matched after the last call to BeginTOken). */ virtual int32_t getBeginColumn() const = 0; /** * Returns the line number of the first character for current token (being * matched after the last call to BeginTOken). */ virtual int32_t getBeginLine() const = 0; /** * Backs up the input stream by amount steps. Lexer calls this method if it * had already read some characters, but could not use them to match a * (longer) token. So, they will be used again as the prefix of the next * token and it is the implemetation's responsibility to do this right. */ virtual void backup(const int32_t amount) = 0; /** * Returns the next character that marks the beginning of the next token. * All characters must remain in the buffer between two successive calls * to this method to implement backup correctly. */ virtual TCHAR BeginToken() = 0; /** * Returns a string made up of characters from the marked token beginning * to the current buffer position. Implementations have the choice of returning * anything that they want to. For example, for efficiency, one might decide * to just return null, which is a valid implementation. */ virtual TCHAR* GetImage() = 0; /** * Returns an array of characters that make up the suffix of length 'len' for * the currently matched token. This is used to build up the matched string * for use in actions in the case of MORE. A simple and inefficient * implementation of this is as follows : * * { * String t = GetImage(); * return t.substring(t.length() - len, t.length()).toCharArray(); * } */ virtual TCHAR* GetSuffix(const int32_t len) = 0; /** * The lexer calls this function to indicate that it is done with the stream * and hence implementations can free any resources held by this class. * Again, the body of this function can be just empty and it will not * affect the lexer's operation. */ virtual void Done() = 0; //CharStream(){}; //virtual ~CharStream(){}; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/_FastCharStream.h000066400000000000000000000036611154025176300247750ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_FastCharStream_ #define _lucene_queryParser_FastCharStream_ CL_CLASS_DEF(util,Reader) CL_NS_DEF(queryParser) class CharStream; /** An efficient implementation of JavaCC's CharStream interface.

Note that * this does not do line-number counting, but instead keeps track of the * character position of the token in the input, as required by Lucene's {@link * org.apache.lucene.analysis.Token} API. */ class FastCharStream : public CharStream { protected: TCHAR* buffer; size_t _bufferSize; // To keep track of the buffer size in memory int32_t bufferLength; // end of valid chars int32_t bufferPosition; // next char to read int32_t tokenStart; // offset in buffer int32_t bufferStart; // position in file of buffer CL_NS(util)::Reader* input; // source of chars bool _ownsReader; // Should we delete the reader once done with it, or in destructor? public: /** Constructs from a Reader. */ FastCharStream(CL_NS(util)::Reader* r, bool ownsReader = false); virtual ~FastCharStream(); TCHAR readChar(); private: void refill(); public: void backup(const int32_t amount); /*@memory Caller is responsible for deleting the returned string */ TCHAR* GetImage(); /*@memory Caller is responsible for deleting the returned string */ TCHAR* GetSuffix(const int32_t len); void Done(); TCHAR BeginToken(); int32_t getColumn() const; int32_t getLine() const; int32_t getEndColumn() const; int32_t getEndLine() const; int32_t getBeginColumn() const; int32_t getBeginLine() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/000077500000000000000000000000001154025176300230545ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/Lexer.cpp000066400000000000000000000231701154025176300246420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryParser.h" #include "_TokenList.h" #include "QueryToken.h" #include "_Lexer.h" #include "CLucene/util/CLStreams.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/_FastCharStream.h" CL_NS_USE(util) CL_NS_DEF2(queryParser,legacy) Lexer::Lexer(QueryParserBase* queryparser, const TCHAR* query) { //Func - Constructor //Pre - query != NULL and contains the query string //Post - An instance of Lexer has been created this->queryparser = queryparser; CND_PRECONDITION(query != NULL, "query is NULL"); //The InputStream of Reader must be destroyed in the destructor delSR = true; StringReader *r = _CLNEW StringReader(query); //Check to see if r has been created properly CND_CONDITION(r != NULL, "Could not allocate memory for StringReader r"); //Instantie a FastCharStream instance using r and assign it to reader reader = _CLNEW FastCharStream(r); //Check to see if reader has been created properly CND_CONDITION(reader != NULL, "Could not allocate memory for FastCharStream reader"); //The InputStream of Reader must be destroyed in the destructor delSR = true; } Lexer::Lexer(QueryParserBase* queryparser, BufferedReader* source) { //Func - Constructor // Initializes a new instance of the Lexer class with the specified // TextReader to lex. //Pre - Source contains a valid reference to a Reader //Post - An instance of Lexer has been created using source as the reader this->queryparser = queryparser; //Instantie a FastCharStream instance using r and assign it to reader reader = _CLNEW FastCharStream(source); //Check to see if reader has been created properly CND_CONDITION(reader != NULL, "Could not allocate memory for FastCharStream reader"); //The InputStream of Reader must not be destroyed in the destructor delSR = false; } Lexer::~Lexer() { //Func - Destructor //Pre - true //Post - if delSR was true the InputStream input of reader has been deleted // The instance of Lexer has been destroyed if (delSR) { _CLDELETE(reader->input); } _CLDELETE(reader); } void Lexer::Lex(TokenList *tokenList) { //Func - Breaks the input stream onto the tokens list tokens //Pre - tokens != NULL and contains a TokenList in which the tokens can be stored //Post - The tokens have been added to the TokenList tokens CND_PRECONDITION(tokenList != NULL, "tokens is NULL"); //Get all the tokens while(true) { //Add the token to the tokens list //Get the next token QueryToken* token = _CLNEW QueryToken; if ( !GetNextToken(token) ){ _CLDELETE(token); break; } tokenList->add(token); } //The end has been reached so create an EOF_ token //Add the final token to the TokenList _tokens tokenList->add(_CLNEW QueryToken( QueryToken::EOF_)); } bool Lexer::GetNextToken(QueryToken* token) { while(!reader->Eos()) { int ch = reader->GetNext(); if ( ch == -1 ) break; // skipping whitespaces if( _istspace(ch)!=0 ) { continue; } TCHAR buf[2] = {ch,'\0'}; switch(ch) { case '+': token->set(buf, QueryToken::PLUS); return true; case '-': token->set(buf, QueryToken::MINUS); return true; case '(': token->set(buf, QueryToken::LPAREN); return true; case ')': token->set(buf, QueryToken::RPAREN); return true; case ':': token->set(buf, QueryToken::COLON); return true; case '!': token->set(buf, QueryToken::NOT); return true; case '^': token->set(buf, QueryToken::CARAT); return true; case '~': if( _istdigit( reader->Peek() )!=0 ) { TCHAR number[LUCENE_MAX_FIELD_LEN]; ReadIntegerNumber(ch, number,LUCENE_MAX_FIELD_LEN); token->set(number, QueryToken::SLOP); return true; }else{ token->set(buf, QueryToken::FUZZY); return true; } break; case '"': return ReadQuoted(ch, token); case '[': return ReadInclusiveRange(ch, token); case '{': return ReadExclusiveRange(ch, token); case ']': case '}': case '*': queryparser->throwParserException( _T("Unrecognized char %d at %d::%d."), ch, reader->Column(), reader->Line() ); return false; default: return ReadTerm(ch, token); // end of swith } } return false; } void Lexer::ReadIntegerNumber(const TCHAR ch, TCHAR* buf, int buflen) { int bp=0; buf[bp++] = ch; int c = reader->Peek(); while( c!=-1 && _istdigit(c)!=0 && bpGetNext(); c = reader->Peek(); } buf[bp++] = 0; } bool Lexer::ReadInclusiveRange(const TCHAR prev, QueryToken* token) { int ch = prev; StringBuffer range; range.appendChar(ch); while(!reader->Eos()) { ch = reader->GetNext(); if ( ch == -1 ) break; range.appendChar(ch); if(ch == ']'){ token->set(range.getBuffer(), QueryToken::RANGEIN); return true; } } queryparser->throwParserException(_T("Unterminated inclusive range! %d %d::%d"),' ', reader->Column(),reader->Column()); return false; } bool Lexer::ReadExclusiveRange(const TCHAR prev, QueryToken* token) { int ch = prev; StringBuffer range; range.appendChar(ch); while(!reader->Eos()) { ch = reader->GetNext(); if (ch==-1) break; range.appendChar(ch); if(ch == '}'){ token->set(range.getBuffer(), QueryToken::RANGEEX); return true; } } queryparser->throwParserException(_T("Unterminated exclusive range! %d %d::%d"),' ', reader->Column(),reader->Column() ); return false; } bool Lexer::ReadQuoted(const TCHAR prev, QueryToken* token) { int ch = prev; StringBuffer quoted; quoted.appendChar(ch); while(!reader->Eos()) { ch = reader->GetNext(); if (ch==-1) break; quoted.appendChar(ch); if(ch == '"'){ token->set(quoted.getBuffer(), QueryToken::QUOTED); return true; } } queryparser->throwParserException(_T("Unterminated string! %d %d::%d"),' ', reader->Column(),reader->Column()); return false; } bool Lexer::ReadTerm(const TCHAR prev, QueryToken* token) { int ch = prev; bool completed = false; int32_t asteriskCount = 0; bool hasQuestion = false; StringBuffer val; TCHAR buf[3]; //used for readescaped while(true) { switch(ch) { case -1: break; case '\\': { if ( ReadEscape(ch, buf) ) val.append( buf ); else return false; } break; case LUCENE_WILDCARDTERMENUM_WILDCARD_STRING: asteriskCount++; val.appendChar(ch); break; case LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR: hasQuestion = true; val.appendChar(ch); break; case '\n': case '\t': case ' ': case '+': case '-': case '!': case '(': case ')': case ':': case '^': case '[': case ']': case '{': case '}': case '~': case '"': // create new QueryToken reader->UnGet(); completed = true; break; default: val.appendChar(ch); break; // end of switch } if(completed || ch==-1 || reader->Eos() ) break; else ch = reader->GetNext(); } // create new QueryToken if(hasQuestion) token->set(val.getBuffer(), QueryToken::WILDTERM); else if(asteriskCount == 1 && val.getBuffer()[val.length() - 1] == '*') token->set(val.getBuffer(), QueryToken::PREFIXTERM); else if(asteriskCount > 0) token->set(val.getBuffer(), QueryToken::WILDTERM); else if( _tcsicmp(val.getBuffer(), _T("AND"))==0 || _tcscmp(val.getBuffer(), _T("&&"))==0 ) token->set(val.getBuffer(), QueryToken::AND_); else if( _tcsicmp(val.getBuffer(), _T("OR"))==0 || _tcscmp(val.getBuffer(), _T("||"))==0) token->set(val.getBuffer(), QueryToken::OR); else if( _tcsicmp(val.getBuffer(), _T("NOT"))==0 ) token->set(val.getBuffer(), QueryToken::NOT); else { bool isnum = true; int32_t nlen=val.length(); for (int32_t i=0;iset(val.getBuffer(), QueryToken::NUMBER); else token->set(val.getBuffer(), QueryToken::TERM); } return true; } bool Lexer::ReadEscape(TCHAR prev, TCHAR* buf) { TCHAR ch = prev; int bp=0; buf[bp++] = ch; ch = reader->GetNext(); int32_t idx = _tcscspn( buf, _T("\\+-!():^[]{}\"~*") ); if(idx == 0) { buf[bp++] = ch; buf[bp++]=0; return true; } queryparser->throwParserException(_T("Unrecognized escape sequence at %d %d::%d"), ' ', reader->Column(),reader->Line()); return false; } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/MultiFieldQueryParser.cpp000066400000000000000000000141421154025176300300230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MultiFieldQueryParser.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/search/BooleanQuery.h" #include "CLucene/search/BooleanClause.h" #include "CLucene/search/PhraseQuery.h" #include "CLucene/search/SearchHeader.h" #include "QueryParser.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(search) CL_NS_USE(analysis) CL_NS_DEF2(queryParser,legacy) MultiFieldQueryParser::MultiFieldQueryParser(const TCHAR** fields, CL_NS(analysis)::Analyzer* a, BoostMap* boosts): QueryParser(NULL,a) { this->fields = fields; this->boosts = boosts; } MultiFieldQueryParser::~MultiFieldQueryParser(){ } //static Query* MultiFieldQueryParser::parse(const TCHAR* query, const TCHAR** fields, Analyzer* analyzer) { BooleanQuery* bQuery = _CLNEW BooleanQuery( true ); int32_t i = 0; while ( fields[i] != NULL ){ Query* q = QueryParser::parse(query, fields[i], analyzer); if (q && ( !q->instanceOf(BooleanQuery::getClassName()) || ((BooleanQuery*)q)->getClauseCount() > 0)) { //todo: Move to using BooleanClause::Occur bQuery->add(q, true, false, false); } else { _CLDELETE(q); } i++; } return bQuery; } //static Query* MultiFieldQueryParser::parse(const TCHAR* query, const TCHAR** fields, const uint8_t* flags, Analyzer* analyzer) { BooleanQuery* bQuery = _CLNEW BooleanQuery( true ); int32_t i = 0; while ( fields[i] != NULL ) { Query* q = QueryParser::parse(query, fields[i], analyzer); if (q && ( !q->instanceOf(BooleanQuery::getClassName()) || ((BooleanQuery*)q)->getClauseCount() > 0)) { uint8_t flag = flags[i]; switch (flag) { //todo: Move to using BooleanClause::Occur case MultiFieldQueryParser::REQUIRED_FIELD: bQuery->add(q, true, true, false); break; case MultiFieldQueryParser::PROHIBITED_FIELD: bQuery->add(q, true, false, true); break; default: bQuery->add(q, true, false, false); break; } } else { _CLDELETE(q); } i++; } return bQuery; } //not static CL_NS(search)::Query* MultiFieldQueryParser::parse(const TCHAR* query) { return parse(query, this->fields, this->analyzer); } Query* MultiFieldQueryParser::GetFieldQuery(const TCHAR* field, TCHAR* queryText, int32_t slop){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::GetFieldQuery(fields[i], queryText); if (q != NULL) { //If the user passes a map of boosts if (boosts != NULL) { //Get the boost from the map and apply them BoostMap::iterator itr = boosts->find( fields[i]); if (itr != boosts->end()) { q->setBoost(itr->second); } } if (q->instanceOf(PhraseQuery::getClassName()) ) { ((PhraseQuery*)q)->setSlop(slop); } //if (q instanceof MultiPhraseQuery) { // ((MultiPhraseQuery) q).setSlop(slop); //} q = QueryAddedCallback(fields[i], q); if ( q ) clauses.push_back(_CLNEW BooleanClause(q, true, false,false)); } } if (clauses.size() == 0) // happens for stopwords return NULL; Query* q = QueryParser::GetBooleanQuery(clauses); return q; }else{ Query* q = QueryParser::GetFieldQuery(field, queryText); if ( q ) q = QueryAddedCallback(field,q); return q; } } Query* MultiFieldQueryParser::GetFieldQuery(const TCHAR* field, TCHAR* queryText){ return GetFieldQuery(field, queryText, 0); } CL_NS(search)::Query* MultiFieldQueryParser::GetFuzzyQuery(const TCHAR* field, TCHAR* termStr){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::GetFuzzyQuery(fields[i], termStr); //todo: , minSimilarity if ( q ){ q = QueryAddedCallback(fields[i], q); if ( q ){ clauses.push_back(_CLNEW BooleanClause(q,true,false,false) ); } } } return QueryParser::GetBooleanQuery(clauses); }else{ Query* q = QueryParser::GetFuzzyQuery(field, termStr);//todo: , minSimilarity if ( q ) q = QueryAddedCallback(field,q); return q; } } Query* MultiFieldQueryParser::GetPrefixQuery(const TCHAR* field, TCHAR* termStr){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::GetPrefixQuery(fields[i], termStr); if ( q ){ q = QueryAddedCallback(fields[i],q); if ( q ){ clauses.push_back(_CLNEW BooleanClause(q,true,false,false)); } } } return QueryParser::GetBooleanQuery(clauses); }else{ Query* q = QueryParser::GetPrefixQuery(field, termStr); if ( q ) q = QueryAddedCallback(field,q); return q; } } Query* MultiFieldQueryParser::GetWildcardQuery(const TCHAR* field, TCHAR* termStr){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::GetWildcardQuery(fields[i], termStr); if ( q ){ q = QueryAddedCallback(fields[i],q); if ( q ){ clauses.push_back(_CLNEW BooleanClause(q,true,false,false)); } } } return QueryParser::GetBooleanQuery(clauses); }else{ Query* q = QueryParser::GetWildcardQuery(field, termStr); if ( q ) q = QueryAddedCallback(field,q); return q; } } Query* MultiFieldQueryParser::GetRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, bool inclusive){ if (field == NULL) { vector clauses; for (int i = 0; fields[i]!=NULL; ++i) { Query* q = QueryParser::GetRangeQuery(fields[i], part1, part2, inclusive); if ( q ){ q = QueryAddedCallback(fields[i],q); if ( q ){ clauses.push_back(_CLNEW BooleanClause(q,true,false,false)); } } } return QueryParser::GetBooleanQuery(clauses); }else{ Query* q = QueryParser::GetRangeQuery(field, part1, part2, inclusive); if ( q ) q = QueryAddedCallback(field,q); return q; } } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/MultiFieldQueryParser.h000066400000000000000000000113461154025176300274730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_legacy_MultiFieldQueryParser #define _lucene_queryParser_legacy_MultiFieldQueryParser #include "QueryParser.h" #include "CLucene/util/VoidMap.h" CL_NS_DEF2(queryParser,legacy) typedef CL_NS(util)::CLHashMap BoostMap; /** * A QueryParser which constructs queries to search multiple fields. * */ class CLUCENE_EXPORT MultiFieldQueryParser: public QueryParser { protected: const TCHAR** fields; BoostMap* boosts; public: LUCENE_STATIC_CONSTANT(uint8_t, NORMAL_FIELD=0); LUCENE_STATIC_CONSTANT(uint8_t, REQUIRED_FIELD=1); LUCENE_STATIC_CONSTANT(uint8_t, PROHIBITED_FIELD=2); /** * Creates a MultiFieldQueryParser. * *

It will, when parse(String query) * is called, construct a query like this (assuming the query consists of * two terms and you specify the two fields title and body):

* * * (title:term1 body:term1) (title:term2 body:term2) * * *

When setDefaultOperator(AND_OPERATOR) is set, the result will be:

* * * +(title:term1 body:term1) +(title:term2 body:term2) * * *

In other words, all the query's terms must appear, but it doesn't matter in * what fields they appear.

*/ MultiFieldQueryParser(const TCHAR** fields, CL_NS(analysis)::Analyzer* a, BoostMap* boosts = NULL); virtual ~MultiFieldQueryParser(); /** *

* Parses a query which searches on the fields specified. *

* If x fields are specified, this effectively constructs: *

     * 
     * (field1:query) (field2:query) (field3:query)...(fieldx:query)
     * 
     * 
* * @param query Query string to parse * @param fields Fields to search on * @param analyzer Analyzer to use * @throws ParserException if query parsing fails * @throws TokenMgrError if query parsing fails */ static CL_NS(search)::Query* parse(const TCHAR* query, const TCHAR** fields, CL_NS(analysis)::Analyzer* analyzer); /** *

* Parses a query, searching on the fields specified. * Use this if you need to specify certain fields as required, * and others as prohibited. *

     * Usage:
     * 
     * TCHAR** fields = {"filename", "contents", "description"};
     * int8_t* flags = {MultiFieldQueryParser::NORMAL FIELD,
     *                MultiFieldQueryParser::REQUIRED FIELD,
     *                MultiFieldQueryParser::PROHIBITED FIELD};
     * parse(query, fields, flags, analyzer);
     * 
     * 
*

* The code above would construct a query: *

     * 
     * (filename:query) +(contents:query) -(description:query)
     * 
     * 
* * @param query Query string to parse * @param fields Fields to search on * @param flags Flags describing the fields * @param analyzer Analyzer to use * @throws ParserException if query parsing fails * @throws TokenMgrError if query parsing fails */ static CL_NS(search)::Query* parse(const TCHAR* query, const TCHAR** fields, const uint8_t* flags, CL_NS(analysis)::Analyzer* analyzer); // non-static version of the above CL_NS(search)::Query* parse(const TCHAR* query); protected: CL_NS(search)::Query* GetFieldQuery(const TCHAR* field, TCHAR* queryText); CL_NS(search)::Query* GetFieldQuery(const TCHAR* field, TCHAR* queryText, int32_t slop); CL_NS(search)::Query* GetFuzzyQuery(const TCHAR* field, TCHAR* termStr); CL_NS(search)::Query* GetRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, bool inclusive); CL_NS(search)::Query* GetPrefixQuery(const TCHAR* field, TCHAR* termStr); CL_NS(search)::Query* GetWildcardQuery(const TCHAR* field, TCHAR* termStr); /** * A special virtual function for the MultiFieldQueryParser which can be used * to clean up queries. Once the field name is known and the query has been * created, its passed to this function. * An example of this usage is to set boosts. */ virtual CL_NS(search)::Query* QueryAddedCallback(const TCHAR* field, CL_NS(search)::Query* query){ return query; } }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/QueryParser.cpp000066400000000000000000000320611154025176300260440ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryParser.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/util/CLStreams.h" #include "CLucene/search/SearchHeader.h" #include "CLucene/search/BooleanClause.h" #include "CLucene/search/Query.h" #include "CLucene/index/Term.h" #include "QueryToken.h" #include "_TokenList.h" #include "_Lexer.h" CL_NS_USE(util) CL_NS_USE(index) CL_NS_USE(analysis) CL_NS_USE(search) CL_NS_DEF2(queryParser,legacy) QueryParser::QueryParser(const TCHAR* _field, Analyzer* _analyzer) : QueryParserBase(_analyzer){ //Func - Constructor. // Instantiates a QueryParser for the named field _field //Pre - _field != NULL //Post - An instance has been created if ( _field ) field = STRDUP_TtoT(_field); else field = NULL; tokens = NULL; lowercaseExpandedTerms = true; } QueryParser::~QueryParser() { //Func - Destructor //Pre - true //Post - The instance has been destroyed _CLDELETE_CARRAY(field); } //static Query* QueryParser::parse(const TCHAR* query, const TCHAR* field, Analyzer* analyzer){ //Func - Returns a new instance of the Query class with a specified query, field and // analyzer values. //Pre - query != NULL and holds the query to parse // field != NULL and holds the default field for query terms // analyzer holds a valid reference to an Analyzer and is used to // find terms in the query text //Post - query has been parsed and an instance of Query has been returned CND_PRECONDITION(query != NULL, "query is NULL"); CND_PRECONDITION(field != NULL, "field is NULL"); QueryParser parser(field, analyzer); return parser.parse(query); } Query* QueryParser::parse(const TCHAR* query){ //Func - Returns a parsed Query instance //Pre - query != NULL and contains the query value to be parsed //Post - Returns a parsed Query Instance CND_PRECONDITION(query != NULL, "query is NULL"); //Instantie a Stringer that can read the query string BufferedReader* r = _CLNEW StringReader(query); //Check to see if r has been created properly CND_CONDITION(r != NULL, "Could not allocate memory for StringReader r"); //Pointer for the return value Query* ret = NULL; try{ //Parse the query managed by the StringReader R and return a parsed Query instance //into ret ret = parse(r); }_CLFINALLY ( _CLDELETE(r); ); return ret; } Query* QueryParser::parse(BufferedReader* reader){ //Func - Returns a parsed Query instance //Pre - reader contains a valid reference to a Reader and manages the query string //Post - A parsed Query instance has been returned or //instantiate the TokenList tokens TokenList _tokens; this->tokens = &_tokens; //Instantiate a lexer Lexer lexer(this, reader); //tokens = lexer.Lex(); //Lex the tokens lexer.Lex(tokens); //Peek to the first token and check if is an EOF if (tokens->peek()->Type == QueryToken::EOF_){ // The query string failed to yield any tokens. We discard the // TokenList tokens and raise an exceptioin. QueryToken* token = this->tokens->extract(); _CLDELETE(token); _CLTHROWA(CL_ERR_Parse, "No query given."); } //Return the parsed Query instance Query* ret = MatchQuery(field); this->tokens = NULL; return ret; } int32_t QueryParser::MatchConjunction(){ //Func - matches for CONJUNCTION // CONJUNCTION ::= | //Pre - tokens != NULL //Post - if the first token is an AND or an OR then // the token is extracted and deleted and CONJ_AND or CONJ_OR is returned // otherwise CONJ_NONE is returned CND_PRECONDITION(tokens != NULL, "tokens is NULL"); switch(tokens->peek()->Type){ case QueryToken::AND_ : //Delete the first token of tokenlist ExtractAndDeleteToken(); return CONJ_AND; case QueryToken::OR : //Delete the first token of tokenlist ExtractAndDeleteToken(); return CONJ_OR; default : return CONJ_NONE; } } int32_t QueryParser::MatchModifier(){ //Func - matches for MODIFIER // MODIFIER ::= | | //Pre - tokens != NULL //Post - if the first token is a PLUS the token is extracted and deleted and MOD_REQ is returned // if the first token is a MINUS or NOT the token is extracted and deleted and MOD_NOT is returned // otherwise MOD_NONE is returned CND_PRECONDITION(tokens != NULL, "tokens is NULL"); switch(tokens->peek()->Type){ case QueryToken::PLUS : //Delete the first token of tokenlist ExtractAndDeleteToken(); return MOD_REQ; case QueryToken::MINUS : case QueryToken::NOT : //Delete the first token of tokenlist ExtractAndDeleteToken(); return MOD_NOT; default : return MOD_NONE; } } Query* QueryParser::MatchQuery(const TCHAR* field){ //Func - matches for QUERY // QUERY ::= [MODIFIER] QueryParser::CLAUSE ( [MODIFIER] CLAUSE)* //Pre - field != NULL //Post - CND_PRECONDITION(tokens != NULL, "tokens is NULL"); vector clauses; Query* q = NULL; int32_t mods = MOD_NONE; int32_t conj = CONJ_NONE; //match for MODIFIER mods = MatchModifier(); //match for CLAUSE q = MatchClause(field); AddClause(clauses, CONJ_NONE, mods, q); // match for CLAUSE* while(true){ QueryToken* p = tokens->peek(); if(p->Type == QueryToken::EOF_){ QueryToken* qt = MatchQueryToken(QueryToken::EOF_); _CLDELETE(qt); break; } if(p->Type == QueryToken::RPAREN){ //MatchQueryToken(QueryToken::RPAREN); break; } //match for a conjuction (AND OR NOT) conj = MatchConjunction(); //match for a modifier mods = MatchModifier(); q = MatchClause(field); if ( q != NULL ) AddClause(clauses, conj, mods, q); } // finalize query if(clauses.size() == 1){ //bvk: removed this && firstQuery != NULL BooleanClause* c = clauses[0]; Query* q = c->getQuery(); //Condition check to be sure clauses[0] is valid CND_CONDITION(c != NULL, "c is NULL"); //Tell the boolean clause not to delete its query c->deleteQuery=false; //Clear the clauses list clauses.clear(); _CLDELETE(c); return q; }else{ return GetBooleanQuery(clauses); } } Query* QueryParser::MatchClause(const TCHAR* field){ //Func - matches for CLAUSE // CLAUSE ::= [TERM ] ( TERM | ( QUERY )) //Pre - field != NULL //Post - Query* q = NULL; const TCHAR* sfield = field; TCHAR* tmp = NULL; QueryToken *DelToken = NULL; //match for [TERM ] QueryToken* term = tokens->extract(); if(term->Type == QueryToken::TERM && tokens->peek()->Type == QueryToken::COLON){ DelToken = MatchQueryToken(QueryToken::COLON); CND_CONDITION(DelToken != NULL,"DelToken is NULL"); _CLDELETE(DelToken); tmp = STRDUP_TtoT(term->Value); discardEscapeChar(tmp); sfield = tmp; _CLDELETE(term); }else{ tokens->push(term); term = NULL; } // match for // TERM | ( QUERY ) if(tokens->peek()->Type == QueryToken::LPAREN){ DelToken = MatchQueryToken(QueryToken::LPAREN); CND_CONDITION(DelToken != NULL,"DelToken is NULL"); _CLDELETE(DelToken); q = MatchQuery(sfield); //DSR:2004.11.01: //If exception is thrown while trying to match trailing parenthesis, //need to prevent q from leaking. try{ DelToken = MatchQueryToken(QueryToken::RPAREN); CND_CONDITION(DelToken != NULL,"DelToken is NULL"); _CLDELETE(DelToken); }catch(...) { _CLDELETE(q); throw; } }else{ q = MatchTerm(sfield); } _CLDELETE_CARRAY(tmp); return q; } Query* QueryParser::MatchTerm(const TCHAR* field){ //Func - matches for TERM // TERM ::= TERM | PREFIXTERM | WILDTERM | NUMBER // [ ] [ []] // | ( | ) [ ] // | [SLOP] [ ] //Pre - field != NULL //Post - QueryToken* term = NULL; QueryToken* slop = NULL; QueryToken* boost = NULL; bool prefix = false; bool wildcard = false; bool fuzzy = false; bool rangein = false; Query* q = NULL; term = tokens->extract(); QueryToken* DelToken = NULL; //Token that is about to be deleted switch(term->Type){ case QueryToken::TERM: case QueryToken::NUMBER: case QueryToken::PREFIXTERM: case QueryToken::WILDTERM: { //start case //Check if type of QueryToken term is a prefix term if(term->Type == QueryToken::PREFIXTERM){ prefix = true; } //Check if type of QueryToken term is a wildcard term if(term->Type == QueryToken::WILDTERM){ wildcard = true; } //Peek to see if the type of the next token is fuzzy term if(tokens->peek()->Type == QueryToken::FUZZY){ DelToken = MatchQueryToken(QueryToken::FUZZY); CND_CONDITION(DelToken !=NULL, "DelToken is NULL"); _CLDELETE(DelToken); fuzzy = true; } if(tokens->peek()->Type == QueryToken::CARAT){ DelToken = MatchQueryToken(QueryToken::CARAT); CND_CONDITION(DelToken !=NULL, "DelToken is NULL"); _CLDELETE(DelToken); boost = MatchQueryToken(QueryToken::NUMBER); if(tokens->peek()->Type == QueryToken::FUZZY){ DelToken = MatchQueryToken(QueryToken::FUZZY); CND_CONDITION(DelToken !=NULL, "DelToken is NULL"); _CLDELETE(DelToken); fuzzy = true; } } //end if type==CARAT discardEscapeChar(term->Value); //clean up if(wildcard){ q = GetWildcardQuery(field,term->Value); break; }else if(prefix){ //Create a PrefixQuery term->Value[_tcslen(term->Value)-1] = 0; //discard the * q = GetPrefixQuery(field,term->Value); break; }else if(fuzzy){ //Create a FuzzyQuery //Check if the last char is a ~ if(term->Value[_tcslen(term->Value)-1] == '~'){ //remove the ~ term->Value[_tcslen(term->Value)-1] = '\0'; } q = GetFuzzyQuery(field,term->Value); break; }else{ q = GetFieldQuery(field, term->Value); break; } } case QueryToken::RANGEIN: case QueryToken::RANGEEX:{ if(term->Type == QueryToken::RANGEIN){ rangein = true; } if(tokens->peek()->Type == QueryToken::CARAT){ DelToken = MatchQueryToken(QueryToken::CARAT); CND_CONDITION(DelToken !=NULL, "DelToken is NULL"); _CLDELETE(DelToken); boost = MatchQueryToken(QueryToken::NUMBER); } TCHAR* noBrackets = term->Value + 1; noBrackets[_tcslen(noBrackets)-1] = 0; q = ParseRangeQuery(field, noBrackets, rangein); break; } case QueryToken::QUOTED:{ if(tokens->peek()->Type == QueryToken::SLOP){ slop = MatchQueryToken(QueryToken::SLOP); } if(tokens->peek()->Type == QueryToken::CARAT){ DelToken = MatchQueryToken(QueryToken::CARAT); CND_CONDITION(DelToken !=NULL, "DelToken is NULL"); _CLDELETE(DelToken); boost = MatchQueryToken(QueryToken::NUMBER); } //remove the quotes TCHAR* quotedValue = term->Value+1; quotedValue[_tcslen(quotedValue)-1] = '\0'; int32_t islop = phraseSlop; if(slop != NULL ){ try { islop = _ttoi(slop->Value+1); }catch(...){ //ignored } } q = GetFieldQuery(field, quotedValue, islop); _CLDELETE(slop); } default: break; } // end of switch _CLDELETE(term); if( q!=NULL && boost != NULL ){ float_t f = 1.0F; try { f = _tcstod(boost->Value, NULL); }catch(...){ //ignored } _CLDELETE(boost); q->setBoost( f); } return q; } QueryToken* QueryParser::MatchQueryToken(QueryToken::Types expectedType){ //Func - matches for QueryToken of the specified type and returns it // otherwise Exception throws //Pre - tokens != NULL //Post - CND_PRECONDITION(tokens != NULL,"tokens is NULL"); if(tokens->count() == 0){ throwParserException(_T("Error: Unexpected end of program"),' ',0,0); } //Extract a token form the TokenList tokens QueryToken* t = tokens->extract(); //Check if the type of the token t matches the expectedType if (expectedType != t->Type){ TCHAR buf[200]; _sntprintf(buf,200,_T("Error: Unexpected QueryToken: %d, expected: %d"),t->Type,expectedType); _CLDELETE(t); throwParserException(buf,' ',0,0); } //Return the matched token return t; } void QueryParser::ExtractAndDeleteToken(void){ //Func - Extracts the first token from the Tokenlist tokenlist // and destroys it //Pre - true //Post - The first token has been extracted and destroyed CND_PRECONDITION(tokens != NULL, "tokens is NULL"); //Extract the token from the TokenList tokens QueryToken* t = tokens->extract(); //Condition Check Token may not be NULL CND_CONDITION(t != NULL, "Token is NULL"); //Delete Token _CLDELETE(t); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/QueryParser.h000066400000000000000000000257331154025176300255210ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_legacy_QueryParser_ #define _lucene_queryParser_legacy_QueryParser_ //#include "CLucene/analysis/AnalysisHeader.h" CL_CLASS_DEF(util,BufferedReader) //#include "CLucene/search/SearchHeader.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(analysis,Analyzer) CL_CLASS_DEF(search,Query) CL_CLASS_DEF(search,BooleanClause) CL_CLASS_DEF2(queryParser,legacy,TokenList) #include //#include "TokenList.h" #include "QueryToken.h" //#include "QueryParserBase.h" //#include "Lexer.h" CL_NS_DEF2(queryParser,legacy) /** * Contains default implementations used by QueryParser. * You can override any of these to provide a customised QueryParser. */ class CLUCENE_EXPORT QueryParserBase:LUCENE_BASE { protected: /* The actual operator the parser uses to combine query terms */ int defaultOperator; int32_t phraseSlop; bool lowercaseExpandedTerms; LUCENE_STATIC_CONSTANT(int, CONJ_NONE=0); LUCENE_STATIC_CONSTANT(int, CONJ_AND=1); LUCENE_STATIC_CONSTANT(int, CONJ_OR=2); LUCENE_STATIC_CONSTANT(int, MOD_NONE=0); LUCENE_STATIC_CONSTANT(int, MOD_NOT=10); LUCENE_STATIC_CONSTANT(int, MOD_REQ=11); CL_NS(analysis)::Analyzer* analyzer; public: QueryParserBase(CL_NS(analysis)::Analyzer* analyzer); virtual ~QueryParserBase(); /** * Whether terms of wildcard, prefix, fuzzy and range queries are to be automatically * lower-cased or not. Default is true. */ void setLowercaseExpandedTerms(bool lowercaseExpandedTerms); /** * @see #setLowercaseExpandedTerms(boolean) */ bool getLowercaseExpandedTerms() const; //values used for setOperator LUCENE_STATIC_CONSTANT(int, OR_OPERATOR=0); LUCENE_STATIC_CONSTANT(int, AND_OPERATOR=1); /** * Sets the boolean operator of the QueryParser. * In default mode (OR_OPERATOR) terms without any modifiers * are considered optional: for example capital of Hungary is equal to * capital OR of OR Hungary.
* In AND_OPERATOR mode terms are considered to be in conjuction: the * above mentioned query is parsed as capital AND of AND Hungary */ void setDefaultOperator(int oper); /** * Gets implicit operator setting, which will be either AND_OPERATOR * or OR_OPERATOR. */ int getDefaultOperator() const; //public so that the lexer can call this virtual void throwParserException(const TCHAR* message, TCHAR ch, int32_t col, int32_t line ); /** * Sets the default slop for phrases. If zero, then exact phrase matches * are required. Default value is zero. */ void setPhraseSlop(int phraseSlop) { this->phraseSlop = phraseSlop; } /** * Gets the default slop for phrases. */ int getPhraseSlop() { return phraseSlop; } protected: /** * Removes the escaped characters */ void discardEscapeChar(TCHAR* token) const; //Analyzes the expanded term termStr with the StandardFilter and the LowerCaseFilter. TCHAR* AnalyzeExpandedTerm(const TCHAR* field, TCHAR* termStr); // Adds the next parsed clause. virtual void AddClause(std::vector& clauses, int32_t conj, int32_t mods, CL_NS(search)::Query* q); /** * Returns a termquery, phrasequery for the specified field. * Note: this is only a partial implementation, since MultiPhraseQuery is not implemented yet * return NULL to disallow */ virtual CL_NS(search)::Query* GetFieldQuery(const TCHAR* field, TCHAR* queryText); /** * Delegates to GetFieldQuery(string, string), and adds slop onto phrasequery. * Can be used to remove slop functionality */ virtual CL_NS(search)::Query* GetFieldQuery(const TCHAR* field, TCHAR* queryText, int32_t slop); /** * Factory method for generating a query (similar to * {@link #GetWildcardQuery}). Called when parser parses an input term * token that uses prefix notation; that is, contains a single '*' wildcard * character as its last character. Since this is a special case * of generic wildcard term, and such a query can be optimized easily, * this usually results in a different query object. *

* Depending on settings, a prefix term may be lower-cased * automatically. It will not go through the default Analyzer, * however, since normal Analyzers are unlikely to work properly * with wildcard templates. *

* Can be overridden by extending classes, to provide custom handling for * wild card queries, which may be necessary due to missing analyzer calls. * * @param field Name of the field query will use. * @param termStr Term token to use for building term for the query * (without trailing '*' character!) * * @return Resulting {@link Query} built for the term * return NULL to disallow */ virtual CL_NS(search)::Query* GetPrefixQuery(const TCHAR* field, TCHAR* termStr); /** * Factory method for generating a query. Called when parser * parses an input term token that contains one or more wildcard * characters (? and *), but is not a prefix term token (one * that has just a single * character at the end) *

* Depending on settings, prefix term may be lower-cased * automatically. It will not go through the default Analyzer, * however, since normal Analyzers are unlikely to work properly * with wildcard templates. *

* Can be overridden by extending classes, to provide custom handling for * wildcard queries, which may be necessary due to missing analyzer calls. * * @param field Name of the field query will use. * @param termStr Term token that contains one or more wild card * characters (? or *), but is not simple prefix term * * @return Resulting {@link Query} built for the term * return NULL to disallow */ virtual CL_NS(search)::Query* GetWildcardQuery(const TCHAR* field, TCHAR* termStr); /** * Factory method for generating a query (similar to * {@link #GetWildcardQuery}). Called when parser parses * an input term token that has the fuzzy suffix (~) appended. * * @param field Name of the field query will use. * @param termStr Term token to use for building term for the query * * @return Resulting {@link Query} built for the term * return NULL to disallow */ virtual CL_NS(search)::Query* GetFuzzyQuery(const TCHAR* field, TCHAR* termStr); /** * Factory method for generating query, given a set of clauses. * By default creates a boolean query composed of clauses passed in. * * Can be overridden by extending classes, to modify query being * returned. * * @param clauses Vector that contains {@link BooleanClause} instances * to join. * * @return Resulting {@link Query} object. * return NULL to disallow * * @memory clauses must all be cleaned up by this function. */ virtual CL_NS(search)::Query* GetBooleanQuery(std::vector& clauses); virtual CL_NS(search)::Query* GetBooleanQuery(std::vector& clauses, bool disableCoord ); /** * return NULL to disallow */ virtual CL_NS(search)::Query* GetRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, bool inclusive); virtual CL_NS(search)::Query* ParseRangeQuery(const TCHAR* field, TCHAR* str, bool inclusive); }; /** * @brief CLucene's default query parser. * *

It's a query parser. * The only method that clients should need to call is Parse(). * The syntax for query const TCHAR*s is as follows: * A Query is a series of clauses. A clause may be prefixed by:

*
    *
  • a plus (+) or a minus (-) sign, indicating that the * clause is required or prohibited respectively; or
  • *
  • a term followed by a colon, indicating the field to be searched. * This enables one to construct queries which search multiple fields.
  • *
*

* A clause may be either:

*
    *
  • a term, indicating all the documents that contain this term; or
  • *
  • a nested query, enclosed in parentheses. Note that this may be * used with a +/- prefix to require any of a set of terms.
  • *
*

* Thus, in BNF, the query grammar is:

* * Query ::= ( Clause )* * Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" ) * *

* Examples of appropriately formatted queries can be found in the test cases. *

*/ class CLUCENE_EXPORT QueryParser : public QueryParserBase { private: TCHAR* field; TokenList* tokens; public: /** * Initializes a new instance of the QueryParser class with a specified field and * analyzer values. */ QueryParser(const TCHAR* field, CL_NS(analysis)::Analyzer* analyzer); ~QueryParser(); /** * Returns a parsed Query instance. * Note: this call is not threadsafe, either use a seperate QueryParser for each thread, or use a thread lock * The query value to be parsed. * A parsed Query instance. */ virtual CL_NS(search)::Query* parse(const TCHAR* query); /** * Returns a parsed Query instance. * Note: this call is not threadsafe, either use a seperate QueryParser for each thread, or use a thread lock * The TextReader value to be parsed. * A parsed Query instance. */ virtual CL_NS(search)::Query* parse(CL_NS(util)::BufferedReader* reader); /** * Returns a new instance of the Query class with a specified query, field and * analyzer values. */ static CL_NS(search)::Query* parse(const TCHAR* query, const TCHAR* field, CL_NS(analysis)::Analyzer* analyzer); CL_NS(analysis)::Analyzer* getAnalyzer() { return analyzer; } /** * @return Returns the field. */ const TCHAR* getField(); //deprecated functions _CL_DEPRECATED( setLowercaseExpandedTerms ) void setLowercaseWildcardTerms(bool lowercaseWildcardTerms); _CL_DEPRECATED( getLowercaseExpandedTerms ) bool getLowercaseWildcardTerms() const; private: /** * matches for CONJUNCTION * CONJUNCTION ::= | */ int32_t MatchConjunction(); /** * matches for MODIFIER * MODIFIER ::= | | */ int32_t MatchModifier(); /** * matches for QUERY * QUERY ::= [MODIFIER] CLAUSE ( [MODIFIER] CLAUSE)* */ CL_NS(search)::Query* MatchQuery(const TCHAR* field); /** * matches for CLAUSE * CLAUSE ::= [TERM ] ( TERM | ( QUERY )) */ CL_NS(search)::Query* MatchClause(const TCHAR* field); /** * matches for TERM * TERM ::= TERM | PREFIXTERM | WILDTERM | NUMBER * [ ] [ []] * * | ( | ) [ ] * | [SLOP] [ ] */ CL_NS(search)::Query* MatchTerm(const TCHAR* field); /** * matches for QueryToken of the specified type and returns it * otherwise Exception throws */ QueryToken* MatchQueryToken(QueryToken::Types expectedType); /** * Extracts the first token from the Tokenlist tokenlist * and destroys it */ void ExtractAndDeleteToken(void); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/QueryParserBase.cpp000066400000000000000000000272541154025176300266470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryParser.h" #include "CLucene/search/TermQuery.h" #include "CLucene/search/PhraseQuery.h" #include "CLucene/search/RangeQuery.h" #include "CLucene/search/FuzzyQuery.h" #include "CLucene/search/WildcardQuery.h" #include "CLucene/search/PrefixQuery.h" #include "CLucene/search/BooleanQuery.h" #include "CLucene/analysis/AnalysisHeader.h" #include "CLucene/util/CLStreams.h" #include "CLucene/search/SearchHeader.h" #include "CLucene/search/BooleanClause.h" #include "CLucene/search/Query.h" #include "CLucene/index/Term.h" #include "QueryToken.h" #include "_TokenList.h" #include "_Lexer.h" CL_NS_USE(search) CL_NS_USE(util) CL_NS_USE(analysis) CL_NS_USE(index) CL_NS_DEF2(queryParser,legacy) QueryParserBase::QueryParserBase(Analyzer* analyzer){ //Func - Constructor //Pre - true //Post - instance has been created with PhraseSlop = 0 this->analyzer = analyzer; this->defaultOperator = OR_OPERATOR; this->phraseSlop = 0; this->lowercaseExpandedTerms = true; } QueryParserBase::~QueryParserBase(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed } void QueryParserBase::discardEscapeChar(TCHAR* source) const{ int len = _tcslen(source); for (int i = 0; i < len; i++) { if (source[i] == '\\' && source[i+1] != '\0' ) { _tcscpy(source+i,source+i+1); len--; } } } void QueryParserBase::AddClause(std::vector& clauses, int32_t conj, int32_t mods, Query* q){ //Func - Adds the next parsed clause. //Pre - //Post - bool required, prohibited; // If this term is introduced by AND, make the preceding term required, // unless it's already prohibited. const uint32_t nPreviousClauses = clauses.size(); if (nPreviousClauses > 0 && conj == CONJ_AND) { BooleanClause* c = clauses[nPreviousClauses-1]; if (!c->prohibited) c->required = true; } if (nPreviousClauses > 0 && defaultOperator == AND_OPERATOR && conj == CONJ_OR) { // If this term is introduced by OR, make the preceding term optional, // unless it's prohibited (that means we leave -a OR b but +a OR b-->a OR b) // notice if the input is a OR b, first term is parsed as required; without // this modification a OR b would parse as +a OR b BooleanClause* c = clauses[nPreviousClauses-1]; if (!c->prohibited){ c->required = false; c->prohibited = false; } } // We might have been passed a NULL query; the term might have been // filtered away by the analyzer. if (q == NULL) return; if (defaultOperator == OR_OPERATOR) { // We set REQUIRED if we're introduced by AND or +; PROHIBITED if // introduced by NOT or -; make sure not to set both. prohibited = (mods == MOD_NOT); required = (mods == MOD_REQ); if (conj == CONJ_AND && !prohibited) { required = true; } } else { // We set PROHIBITED if we're introduced by NOT or -; We set REQUIRED // if not PROHIBITED and not introduced by OR prohibited = (mods == MOD_NOT); required = (!prohibited && conj != CONJ_OR); } if ( required && prohibited ) throwParserException( _T("Clause cannot be both required and prohibited"), ' ',0,0); clauses.push_back(_CLNEW BooleanClause(q,true, required, prohibited)); } void QueryParserBase::throwParserException(const TCHAR* message, TCHAR ch, int32_t col, int32_t line ) { TCHAR msg[1024]; _sntprintf(msg,1024,message,ch,col,line); _CLTHROWT (CL_ERR_Parse, msg ); } Query* QueryParserBase::GetFieldQuery(const TCHAR* field, TCHAR* queryText, int32_t slop){ Query* ret = GetFieldQuery(field,queryText); if ( ret && ret->instanceOf(PhraseQuery::getClassName()) ) ((PhraseQuery*)ret)->setSlop(slop); return ret; } Query* QueryParserBase::GetFieldQuery(const TCHAR* field, TCHAR* queryText){ //Func - Returns a query for the specified field. // Use the analyzer to get all the tokens, and then build a TermQuery, // PhraseQuery, or nothing based on the term count //Pre - field != NULL // analyzer contains a valid reference to an Analyzer // queryText != NULL and contains the query //Post - A query instance has been returned for the specified field CND_PRECONDITION(field != NULL, "field is NULL"); CND_PRECONDITION(queryText != NULL, "queryText is NULL"); //Instantiate a stringReader for queryText StringReader reader(queryText); TokenStream* source = analyzer->tokenStream(field, &reader); CND_CONDITION(source != NULL,"source is NULL"); StringArrayWithDeletor v; Token t; int positionCount = 0; bool severalTokensAtSamePosition = false; //Get the tokens from the source try{ while (source->next(&t)){ v.push_back(STRDUP_TtoT(t.termBuffer())); if (t.getPositionIncrement() != 0) positionCount += t.getPositionIncrement(); else severalTokensAtSamePosition = true; } }catch(CLuceneError& err){ if ( err.number() != CL_ERR_IO ) { _CLLDELETE(source); throw err; } } _CLDELETE(source); //Check if there are any tokens retrieved if (v.size() == 0){ return NULL; }else{ if (v.size() == 1){ Term* t = _CLNEW Term(field, v[0]); Query* ret = _CLNEW TermQuery( t ); _CLDECDELETE(t); return ret; }else{ if (severalTokensAtSamePosition) { if (positionCount == 1) { // no phrase query: BooleanQuery* q = _CLNEW BooleanQuery( true ); //todo: disableCoord=true here, but not implemented in BooleanQuery StringArray::iterator itr = v.begin(); while ( itr != v.end() ){ Term* t = _CLNEW Term(field, *itr); q->add(_CLNEW TermQuery(t),true, false,false);//should occur... _CLDECDELETE(t); ++itr; } return q; }else { _CLTHROWA(CL_ERR_UnsupportedOperation, "MultiPhraseQuery NOT Implemented"); } }else{ PhraseQuery* q = _CLNEW PhraseQuery; q->setSlop(phraseSlop); StringArrayWithDeletor::iterator itr = v.begin(); while ( itr != v.end() ){ const TCHAR* data = *itr; Term* t = _CLNEW Term(field, data); q->add(t); _CLDECDELETE(t); ++itr; } return q; } } } } void QueryParserBase::setLowercaseExpandedTerms(bool lowercaseExpandedTerms){ this->lowercaseExpandedTerms = lowercaseExpandedTerms; } bool QueryParserBase::getLowercaseExpandedTerms() const { return lowercaseExpandedTerms; } void QueryParserBase::setDefaultOperator(int oper){ this->defaultOperator=oper; } int QueryParserBase::getDefaultOperator() const{ return defaultOperator; } Query* QueryParserBase::ParseRangeQuery(const TCHAR* field, TCHAR* queryText, bool inclusive) { //todo: this must be fixed, [-1--5] (-1 to -5) should yield a result, but won't parse properly //because it uses an analyser, should split it up differently... // Use the analyzer to get all the tokens. There should be 1 or 2. StringReader reader(queryText); TokenStream* source = analyzer->tokenStream(field, &reader); TCHAR* terms[2]; terms[0]=NULL;terms[1]=NULL; Token t; bool tret=false; bool from=true; do { try{ tret = (source->next(&t) != NULL); }catch (CLuceneError& err){ if ( err.number() == CL_ERR_IO ) tret=false; else throw err; } if (tret) { if ( !from && _tcscmp(t.termBuffer(),_T("TO"))==0 ) continue; TCHAR* tmp = STRDUP_TtoT(t.termBuffer()); discardEscapeChar(tmp); terms[from? 0 : 1] = tmp; if (from) from = false; else break; } }while(tret); if ((terms[0] == NULL) || (terms[1] == NULL)) { _CLTHROWA(CL_ERR_Parse, "No range given."); } Query* ret = GetRangeQuery(field, terms[0], terms[1],inclusive); _CLDELETE_CARRAY(terms[0]); _CLDELETE_CARRAY(terms[1]); _CLDELETE(source); return ret; } Query* QueryParserBase::GetPrefixQuery(const TCHAR* field, TCHAR* termStr){ //Pre - field != NULL and field contains the name of the field that the query will use // termStr != NULL and is the token to use for building term for the query // (WITH or WITHOUT a trailing '*' character!) //Post - A PrefixQuery instance has been returned CND_PRECONDITION(field != NULL,"field is NULL"); CND_PRECONDITION(termStr != NULL,"termStr is NULL"); if ( lowercaseExpandedTerms ) _tcslwr(termStr); Term* t = _CLNEW Term(field, termStr); CND_CONDITION(t != NULL,"Could not allocate memory for term t"); Query *q = _CLNEW PrefixQuery(t); CND_CONDITION(q != NULL,"Could not allocate memory for PrefixQuery q"); _CLDECDELETE(t); return q; } Query* QueryParserBase::GetFuzzyQuery(const TCHAR* field, TCHAR* termStr){ //Func - Factory method for generating a query (similar to getPrefixQuery}). Called when parser parses // an input term token that has the fuzzy suffix (~) appended. //Pre - field != NULL and field contains the name of the field that the query will use // termStr != NULL and is the token to use for building term for the query // (WITH or WITHOUT a trailing '*' character!) //Post - A FuzzyQuery instance has been returned CND_PRECONDITION(field != NULL,"field is NULL"); CND_PRECONDITION(termStr != NULL,"termStr is NULL"); if ( lowercaseExpandedTerms ) _tcslwr(termStr); Term* t = _CLNEW Term(field, termStr); CND_CONDITION(t != NULL,"Could not allocate memory for term t"); Query *q = _CLNEW FuzzyQuery(t); CND_CONDITION(q != NULL,"Could not allocate memory for FuzzyQuery q"); _CLDECDELETE(t); return q; } Query* QueryParserBase::GetWildcardQuery(const TCHAR* field, TCHAR* termStr){ CND_PRECONDITION(field != NULL,"field is NULL"); CND_PRECONDITION(termStr != NULL,"termStr is NULL"); if ( lowercaseExpandedTerms ) _tcslwr(termStr); Term* t = _CLNEW Term(field, termStr); CND_CONDITION(t != NULL,"Could not allocate memory for term t"); Query* q = _CLNEW WildcardQuery(t); _CLDECDELETE(t); return q; } Query* QueryParserBase::GetBooleanQuery(std::vector& clauses ) { return GetBooleanQuery( clauses, false ); } Query* QueryParserBase::GetBooleanQuery(std::vector& clauses, bool disableCoord){ if ( clauses.size() == 0 ) return NULL; BooleanQuery* query = _CLNEW BooleanQuery( disableCoord ); //Condition check to see if query has been allocated properly CND_CONDITION(query != NULL, "No memory could be allocated for query"); //iterate through all the clauses for( uint32_t i=0;iadd(clauses[i]); } return query; } CL_NS(search)::Query* QueryParserBase::GetRangeQuery(const TCHAR* field, TCHAR* part1, TCHAR* part2, bool inclusive){ //todo: does jlucene handle rangequeries differntly? if we are using //a certain type of analyser, the terms may be filtered out, which //is not necessarily what we want. if (lowercaseExpandedTerms) { _tcslwr(part1); _tcslwr(part2); } //todo: should see if we can parse the strings as dates... currently we leave that up to the end-developer... Term* t1 = _CLNEW Term(field,part1); Term* t2 = _CLNEW Term(field,part2); Query* ret = _CLNEW RangeQuery(t1, t2, inclusive); _CLDECDELETE(t1); _CLDECDELETE(t2); return ret; } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/QueryToken.cpp000066400000000000000000000034141154025176300256700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryToken.h" CL_NS_DEF2(queryParser,legacy) QueryToken::QueryToken(): Value(NULL) { set(UNKNOWN_); } QueryToken::QueryToken(const TCHAR* value, const int32_t start, const int32_t end, const QueryToken::Types type): Value(NULL) { set(value,start,end,type); } QueryToken::~QueryToken(){ //Func - Destructor //Pre - true //Post - Instance has been destroyed #ifndef LUCENE_TOKEN_WORD_LENGTH _CLDELETE_CARRAY( Value ); #endif } // Initializes a new instance of the Token class LUCENE_EXPORT. // QueryToken::QueryToken(const TCHAR* value, const QueryToken::Types type): Value(NULL) { set(value,type); } // Initializes a new instance of the Token class LUCENE_EXPORT. // QueryToken::QueryToken(QueryToken::Types type): Value(NULL) { set(type); } void QueryToken::set(const TCHAR* value, const Types type){ set(value,0,-1,type); } void QueryToken::set(const TCHAR* value, const int32_t start, const int32_t end, const Types type){ #ifndef LUCENE_TOKEN_WORD_LENGTH _CLDELETE_CARRAY(Value); Value = STRDUP_TtoT(value); #else _tcsncpy(Value,value,LUCENE_TOKEN_WORD_LENGTH); Value[LUCENE_TOKEN_WORD_LENGTH]; #endif this->Start = start; this->End = end; this->Type = type; if ( this->End < 0 ) this->End = _tcslen(Value); } void QueryToken::set(Types type){ set(LUCENE_BLANK_STRING,0,0,type); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/QueryToken.h000066400000000000000000000031501154025176300253320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_legacy_QueryToken_ #define _lucene_queryParser_legacy_QueryToken_ CL_NS_DEF2(queryParser,legacy) // Token class that used by QueryParser. class CLUCENE_EXPORT QueryToken:LUCENE_BASE { public: enum Types { AND_, OR, NOT, PLUS, MINUS, LPAREN, RPAREN, COLON, CARAT, QUOTED, TERM, SLOP, FUZZY, PREFIXTERM, WILDTERM, RANGEIN, RANGEEX, NUMBER, EOF_, UNKNOWN_ }; #ifdef LUCENE_TOKEN_WORD_LENGTH TCHAR Value[LUCENE_TOKEN_WORD_LENGTH+1]; #else TCHAR* Value; #endif int32_t Start; int32_t End; QueryToken::Types Type; // Initializes a new instance of the Token class. QueryToken(const TCHAR* value, const int32_t start, const int32_t end, const Types type); // Initializes a new instance of the Token class. QueryToken(const TCHAR* value, const Types type); // Initializes a new instance of the Token class. QueryToken(Types type); // Initializes an empty instance of the Token class. QueryToken(); ~QueryToken(); void set(const TCHAR* value, const int32_t start, const int32_t end, const Types type); void set(const TCHAR* value, const Types type); void set(Types type); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/TokenList.cpp000066400000000000000000000042111154025176300254720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_TokenList.h" //#include "CLucene/util/VoidMap.h" #include "CLucene/util/VoidList.h" #include "QueryToken.h" CL_NS_DEF2(queryParser,legacy) TokenList::TokenList(){ //Func - Constructor //Pre - true //Post - Instance has been created } TokenList::~TokenList(){ //Func - Destructor //Pre - true //Post - The tokenlist has been destroyed tokens.clear(); } void TokenList::add(QueryToken* token){ //Func - Adds a QueryToken token to the TokenList //Pre - token != NULL //Post - token has been added to the token list CND_PRECONDITION(token != NULL, "token != NULL"); tokens.insert(tokens.begin(),token); } void TokenList::push(QueryToken* token){ //Func - //Pre - token != NULL //Post - CND_PRECONDITION(token != NULL, "token is NULL"); tokens.push_back(token); } QueryToken* TokenList::peek() { /* DSR:2004.11.01: Reverted my previous (circa April 2004) fix (which ** raised an exception if Peek was called when there were no tokens) in ** favor of returning the EOF token. This solution is much better ** integrated with the rest of the code in the queryParser subsystem. */ size_t nTokens = tokens.size(); if (nTokens == 0) { push(_CLNEW QueryToken(QueryToken::EOF_)); nTokens++; } return tokens[nTokens-1]; } QueryToken* TokenList::extract(){ //Func - Extract token from the TokenList //Pre - true //Post - Retracted token has been returned QueryToken* token = peek(); //Retract the current peeked token tokens.delete_back(); return token; } int32_t TokenList::count() const { return tokens.size(); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/_Lexer.h000066400000000000000000000041501154025176300244430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_legacy_Lexer_ #define _lucene_queryParser_legacy_Lexer_ CL_CLASS_DEF(util,FastCharStream) CL_CLASS_DEF(util,BufferedReader) CL_CLASS_DEF(util,StringBuffer) //#include "TokenList.h" class QueryToken; class TokenList; class QueryParserBase; CL_NS_DEF2(queryParser,legacy) // A simple Lexer that is used by QueryParser. class Lexer:LUCENE_BASE { private: CL_NS(util)::FastCharStream* reader; QueryParserBase* queryparser; //holds the queryparser so that we can do callbacks bool delSR; //Indicates if the reader must be deleted or not public: // Initializes a new instance of the Lexer class with the specified // query to lex. Lexer(QueryParserBase* queryparser, const TCHAR* query); // Initializes a new instance of the Lexer class with the specified // TextReader to lex. Lexer(QueryParserBase* queryparser, CL_NS(util)::BufferedReader* source); //Breaks the input stream onto the tokens list tokens void Lex(TokenList *tokens); ~Lexer(); private: bool GetNextToken(QueryToken* token); // Reads an integer number. buf should quite large, probably as large as a field should ever be void ReadIntegerNumber(const TCHAR ch, TCHAR* buf, int buflen); // Reads an inclusive range like [some words] bool ReadInclusiveRange(const TCHAR prev, QueryToken* token); // Reads an exclusive range like {some words} bool ReadExclusiveRange(const TCHAR prev, QueryToken* token); // Reads quoted string like "something else" bool ReadQuoted(const TCHAR prev, QueryToken* token); bool ReadTerm(const TCHAR prev, QueryToken* token); //reads an escaped character into the buf. Buf requires at least 3 characters bool ReadEscape(const TCHAR prev, TCHAR* buf); }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/queryParser/legacy/_TokenList.h000066400000000000000000000016431154025176300253040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_queryParser_legacy_TokenList_ #define _lucene_queryParser_legacy_TokenList_ //#include "QueryToken.h" CL_NS_DEF2(queryParser,legacy) class QueryToken; // Represents a list of the tokens. class TokenList:LUCENE_BASE { private: CL_NS(util)::CLVector tokens; //todo:,CL_NS(util)::Deletor::Object public: TokenList(); ~TokenList(); void add(QueryToken* token); void push(QueryToken* token); QueryToken* peek(); QueryToken* extract(); int32_t count() const; }; CL_NS_END2 #endif clucene-core-2.3.3.4/src/core/CLucene/search/000077500000000000000000000000001154025176300205335ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/search/BooleanClause.h000066400000000000000000000063461154025176300234310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_BooleanClause_ #define _lucene_search_BooleanClause_ CL_CLASS_DEF(util,StringBuffer) CL_CLASS_DEF(search,Query) CL_NS_DEF(search) // A clause in a BooleanQuery. class CLUCENE_EXPORT BooleanClause:LUCENE_BASE { public: /** Specifies how clauses are to occur in matching documents. */ enum Occur { /** Use this operator for clauses that must appear in the matching documents. */ MUST=1, /** Use this operator for clauses that should appear in the * matching documents. For a BooleanQuery with no MUST * clauses one or more SHOULD clauses must match a document * for the BooleanQuery to match. * @see BooleanQuery#setMinimumNumberShouldMatch */ SHOULD=2, /** Use this operator for clauses that must not appear in the matching documents. * Note that it is not possible to search for queries that only consist * of a MUST_NOT clause. */ MUST_NOT=4 }; private: /** The query whose matching documents are combined by the boolean query. * @deprecated use {@link #setQuery(Query)} instead */ Query* query; Occur occur; /* Middle layer for the Occur enum; will be removed soon enough. */ void setFields(Occur occur); public: bool deleteQuery; int32_t getClauseCount(); /** Constructs a BooleanClause with query q, required * r and prohibited p. * @deprecated use BooleanClause(Query, Occur) instead *
    *
  • For BooleanClause(query, true, false) use BooleanClause(query, BooleanClause.Occur.MUST) *
  • For BooleanClause(query, false, false) use BooleanClause(query, BooleanClause.Occur.SHOULD) *
  • For BooleanClause(query, false, true) use BooleanClause(query, BooleanClause.Occur.MUST_NOT) *
*/ BooleanClause(Query* q, const bool DeleteQuery,const bool req, const bool p); BooleanClause(const BooleanClause& clone); /** Constructs a BooleanClause. */ BooleanClause(Query* q, const bool DeleteQuery, Occur o); BooleanClause* clone() const; ~BooleanClause(); /** Returns true if o is equal to this. */ bool equals(const BooleanClause* other) const; /** Returns a hash code value for this object.*/ size_t hashCode() const; Occur getOccur() const; void setOccur(Occur o); Query* getQuery() const; void setQuery(Query* q); bool isProhibited() const; bool isRequired() const; TCHAR* toString() const; public: // TODO: Make private and remove for CLucene 2.3.2 /** If true, documents documents which do not match this sub-query will not match the boolean query. @deprecated use {@link #setOccur(BooleanClause.Occur)} instead */ bool required; /** If true, documents documents which do match this sub-query will not match the boolean query. @deprecated use {@link #setOccur(BooleanClause.Occur)} instead */ bool prohibited; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/BooleanQuery.cpp000066400000000000000000000400201154025176300236400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "BooleanQuery.h" #include "BooleanClause.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/_Arrays.h" #include "SearchHeader.h" #include "_BooleanScorer.h" #include "_ConjunctionScorer.h" #include "Similarity.h" #include "Explanation.h" #include "_BooleanScorer2.h" #include "Scorer.h" #include CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) class BooleanClause_Compare:public CL_NS_STD(binary_function) { public: bool operator()( const BooleanClause* val1, const BooleanClause* val2 ) const { return val1->equals(val2); } }; class BooleanWeight: public Weight { protected: Searcher* searcher; Similarity* similarity; CL_NS(util)::CLVector > weights; BooleanQuery::ClausesType* clauses; BooleanQuery* parentQuery; public: BooleanWeight(Searcher* searcher, CL_NS(util)::CLVector >* clauses, BooleanQuery* parentQuery); virtual ~BooleanWeight(); Query* getQuery(); float_t getValue(); float_t sumOfSquaredWeights(); void normalize(float_t norm); Scorer* scorer(CL_NS(index)::IndexReader* reader); Explanation* explain(CL_NS(index)::IndexReader* reader, int32_t doc); };// BooleanWeight BooleanQuery::BooleanQuery( bool disableCoord ): clauses(_CLNEW BooleanQuery::ClausesType(true)) { this->minNrShouldMatch = 0; this->disableCoord = disableCoord; } Weight* BooleanQuery::_createWeight(Searcher* searcher) { return _CLNEW BooleanWeight(searcher, clauses,this); } BooleanQuery::BooleanQuery(const BooleanQuery& clone): Query(clone), clauses(_CLNEW ClausesType(true)), disableCoord(clone.disableCoord) { minNrShouldMatch = clone.minNrShouldMatch; for ( uint32_t i=0;isize();i++ ){ BooleanClause* clause = (*clone.clauses)[i]->clone(); clause->deleteQuery=true; add(clause); } } BooleanQuery::~BooleanQuery(){ clauses->clear(); _CLDELETE(clauses); } size_t BooleanQuery::hashCode() const { //todo: do cachedHashCode, and invalidate on add/remove clause size_t ret = 0; for (uint32_t i = 0 ; i < clauses->size(); i++) { BooleanClause* c = (*clauses)[i]; ret = 31 * ret + c->hashCode(); } ret = ret ^ Similarity::floatToByte(getBoost()); return ret; } const char* BooleanQuery::getObjectName() const{ return getClassName(); } const char* BooleanQuery::getClassName(){ return "BooleanQuery"; } /** * Default value is 1024. Use org.apache.lucene.maxClauseCount * system property to override. */ size_t BooleanQuery::maxClauseCount = LUCENE_BOOLEANQUERY_MAXCLAUSECOUNT; size_t BooleanQuery::getMaxClauseCount(){ return maxClauseCount; } void BooleanQuery::setMaxClauseCount(const size_t maxClauseCount){ if (maxClauseCount < 1) _CLTHROWA(CL_ERR_IllegalArgument, "maxClauseCount must be >= 1"); BooleanQuery::maxClauseCount = maxClauseCount; } Similarity* BooleanQuery::getSimilarity( Searcher* searcher ) { Similarity* result = Query::getSimilarity( searcher ); return result; } void BooleanQuery::add(Query* query, const bool deleteQuery, const bool required, const bool prohibited) { BooleanClause* bc = _CLNEW BooleanClause(query,deleteQuery,required, prohibited); try{ add(bc); }catch(...){ _CLDELETE(bc); throw; } } void BooleanQuery::add(Query* query, const bool deleteQuery, BooleanClause::Occur occur) { BooleanClause* bc = _CLNEW BooleanClause(query,deleteQuery,occur); try{ add(bc); }catch(...){ _CLDELETE(bc); throw; } } void BooleanQuery::add(BooleanClause* clause) { if (clauses->size() >= getMaxClauseCount()) _CLTHROWA(CL_ERR_TooManyClauses,"Too Many Clauses"); clauses->push_back(clause); } int32_t BooleanQuery::getMinNrShouldMatch(){ return minNrShouldMatch; } bool BooleanQuery::getUseScorer14() { return getAllowDocsOutOfOrder(); } bool BooleanQuery::allowDocsOutOfOrder = false; void BooleanQuery::setUseScorer14( bool use14 ) { setAllowDocsOutOfOrder(use14); } void BooleanQuery::setAllowDocsOutOfOrder(bool allow) { allowDocsOutOfOrder = allow; } bool BooleanQuery::getAllowDocsOutOfOrder() { return allowDocsOutOfOrder; } size_t BooleanQuery::getClauseCount() const { return (int32_t) clauses->size(); } TCHAR* BooleanQuery::toString(const TCHAR* field) const{ StringBuffer buffer; bool needParens=(getBoost() != 1.0) /* TODO: || (getMinimumNumberShouldMatch()>0)*/ ; if (needParens) { buffer.append(_T("(")); } for (uint32_t i = 0 ; i < clauses->size(); i++) { BooleanClause* c = (*clauses)[i]; if (c->prohibited) buffer.append(_T("-")); else if (c->required) buffer.append(_T("+")); if ( c->getQuery()->instanceOf(BooleanQuery::getClassName()) ) { // wrap sub-bools in parens buffer.append(_T("(")); TCHAR* buf = c->getQuery()->toString(field); buffer.append(buf); _CLDELETE_CARRAY( buf ); buffer.append(_T(")")); } else { TCHAR* buf = c->getQuery()->toString(field); buffer.append(buf); _CLDELETE_CARRAY( buf ); } if (i != clauses->size()-1) buffer.append(_T(" ")); } if (needParens) { buffer.append(_T(")")); } if (getBoost() != 1.0) { buffer.appendChar(_T('^')); buffer.appendFloat(getBoost(),1); } return buffer.toString(); } bool BooleanQuery::isCoordDisabled() { return disableCoord; } void BooleanQuery::setCoordDisabled( bool disableCoord ) { this->disableCoord = disableCoord; } BooleanClause** BooleanQuery::getClauses() const { CND_MESSAGE(false, "Warning: BooleanQuery::getClauses() is deprecated") BooleanClause** ret = _CL_NEWARRAY(BooleanClause*, clauses->size()+1); getClauses(ret); return ret; } void BooleanQuery::getClauses(BooleanClause** ret) const { size_t size=clauses->size(); for ( uint32_t i=0;isize() == 1) { // optimize 1-clause queries BooleanClause* c = (*clauses)[0]; if (!c->prohibited) { // just return clause Query* query = c->getQuery()->rewrite(reader); // rewrite first //if the query doesn't actually get re-written, //then return a clone (because the BooleanQuery //will register different to the returned query. if ( query == c->getQuery() ) query = query->clone(); if (getBoost() != 1.0f) { // incorporate boost query->setBoost(getBoost() * query->getBoost()); } return query; } } BooleanQuery* clone = NULL; // recursively rewrite for (uint32_t i = 0 ; i < clauses->size(); i++) { BooleanClause* c = (*clauses)[i]; Query* query = c->getQuery()->rewrite(reader); if (query != c->getQuery()) { // clause rewrote: must clone if (clone == NULL) clone = (BooleanQuery*)this->clone(); clone->clauses->set (i, _CLNEW BooleanClause(query, true, c->getOccur())); } } if (clone != NULL) { return clone; // some clauses rewrote } else return this; // no clauses rewrote } void BooleanQuery::extractTerms( TermSet * termset ) const { for (size_t i = 0 ; i < clauses->size(); i++) { BooleanClause* clause = (*clauses)[i]; clause->getQuery()->extractTerms( termset ); } } Query* BooleanQuery::clone() const{ BooleanQuery* clone = _CLNEW BooleanQuery(*this); return clone; } /** Returns true iff o is equal to this. */ bool BooleanQuery::equals(Query* o)const { if (!(o->instanceOf(BooleanQuery::getClassName()))) return false; const BooleanQuery* other = (BooleanQuery*)o; bool ret = (this->getBoost() == other->getBoost()); if ( ret ){ CLListEquals comp; ret = comp.equals(this->clauses,other->clauses); } return ret; } float_t BooleanWeight::getValue() { return parentQuery->getBoost(); } Query* BooleanWeight::getQuery() { return (Query*)parentQuery; } BooleanWeight::BooleanWeight(Searcher* searcher, CLVector >* clauses, BooleanQuery* parentQuery) { this->searcher = searcher; this->similarity = parentQuery->getSimilarity( searcher ); this->parentQuery = parentQuery; this->clauses = clauses; for (uint32_t i = 0 ; i < clauses->size(); i++) { weights.push_back((*clauses)[i]->getQuery()->_createWeight(searcher)); } } BooleanWeight::~BooleanWeight(){ this->weights.clear(); } float_t BooleanWeight::sumOfSquaredWeights() { float_t sum = 0.0f; for (uint32_t i = 0 ; i < weights.size(); i++) { BooleanClause* c = (*clauses)[i]; Weight* w = weights[i]; float_t s = w->sumOfSquaredWeights(); // sum sub weights if (!c->isProhibited()) // only add to sum for non-prohibited clauses sum += s; } sum *= parentQuery->getBoost() * parentQuery->getBoost(); // boost each sub-weight return sum ; } void BooleanWeight::normalize(float_t norm) { norm *= parentQuery->getBoost(); // incorporate boost for (uint32_t i = 0 ; i < weights.size(); i++) { Weight* w = weights[i]; // normalize all clauses, (even if prohibited in case of side affects) w->normalize(norm); } } Scorer* BooleanWeight::scorer(IndexReader* reader){ BooleanScorer2* result = _CLNEW BooleanScorer2(similarity, parentQuery->minNrShouldMatch, parentQuery->allowDocsOutOfOrder); for (size_t i = 0 ; i < weights.size(); i++) { BooleanClause* c = (*clauses)[i]; Weight* w = weights[i]; Scorer* subScorer = w->scorer(reader); if (subScorer != NULL) result->add(subScorer, c->isRequired(), c->isProhibited()); else if (c->isRequired()){ _CLDELETE(result); return NULL; } } return result; } Explanation* BooleanWeight::explain(IndexReader* reader, int32_t doc){ const int32_t minShouldMatch = parentQuery->getMinNrShouldMatch(); ComplexExplanation* sumExpl = _CLNEW ComplexExplanation(); sumExpl->setDescription(_T("sum of:")); int32_t coord = 0; int32_t maxCoord = 0; float_t sum = 0.0f; bool fail = false; int32_t shouldMatchCount = 0; for (size_t i = 0 ; i < weights.size(); i++) { BooleanClause* c = (*clauses)[i]; Weight* w = weights[i]; Explanation* e = w->explain(reader, doc); if (!c->isProhibited()) maxCoord++; if (e->isMatch()){ if (!c->isProhibited()) { sumExpl->addDetail(e); sum += e->getValue(); coord++; } else { StringBuffer buf(100); buf.append(_T("match on prohibited clause (")); TCHAR* tmp = c->getQuery()->toString(); buf.append(tmp); _CLDELETE_LCARRAY(tmp); buf.appendChar(_T(')')); Explanation* r = _CLNEW Explanation(0.0f, buf.getBuffer()); r->addDetail(e); sumExpl->addDetail(r); fail = true; } if (c->getOccur() == BooleanClause::SHOULD) shouldMatchCount++; } else if (c->isRequired()) { StringBuffer buf(100); buf.append(_T("no match on required clause (")); TCHAR* tmp = c->getQuery()->toString(); buf.append(tmp); _CLDELETE_LCARRAY(tmp); buf.appendChar(_T(')')); Explanation* r = _CLNEW Explanation(0.0f, buf.getBuffer()); r->addDetail(e); sumExpl->addDetail(r); fail = true; } else { _CLLDELETE(e); } } if (fail) { sumExpl->setMatch(false); sumExpl->setValue(0.0f); sumExpl->setDescription(_T("Failure to meet condition(s) of required/prohibited clause(s)")); return sumExpl; } else if (shouldMatchCount < minShouldMatch) { sumExpl->setMatch(false); sumExpl->setValue(0.0f); StringBuffer buf(60); buf.append(_T("Failure to match minimum number of optional clauses: ")); buf.appendInt(minShouldMatch); sumExpl->setDescription(buf.getBuffer()); return sumExpl; } sumExpl->setMatch(0 < coord ? true : false); sumExpl->setValue(sum); float_t coordFactor = similarity->coord(coord, maxCoord); if (coordFactor == 1.0f) // coord is no-op return sumExpl; // eliminate wrapper else { ComplexExplanation* result = _CLNEW ComplexExplanation(sumExpl->isMatch(), sum*coordFactor, _T("product of:")); result->addDetail(sumExpl); StringBuffer buf(30); buf.append(_T("coord(")); buf.appendInt(coord); buf.appendChar(_T('/')); buf.appendInt(maxCoord); buf.appendChar(_T(')')); result->addDetail(_CLNEW Explanation(coordFactor,buf.getBuffer())); return result; } } BooleanClause::BooleanClause(Query* q, const bool DeleteQuery,const bool req, const bool p): query(q), occur(SHOULD), deleteQuery(DeleteQuery), required(req), prohibited(p) { if (required) { if (prohibited) { // prohibited && required doesn't make sense, but we want the old behaviour: occur = MUST_NOT; } else { occur = MUST; } } else { if (prohibited) { occur = MUST_NOT; } else { occur = SHOULD; } } } BooleanClause::BooleanClause(const BooleanClause& clone): query(clone.query->clone()), occur(clone.occur), deleteQuery(true), required(clone.required), prohibited(clone.prohibited) { } BooleanClause::BooleanClause(Query* q, const bool DeleteQuery, Occur o): query(q), occur(o), deleteQuery(DeleteQuery) { setFields(occur); } BooleanClause* BooleanClause::clone() const { BooleanClause* ret = _CLNEW BooleanClause(*this); return ret; } BooleanClause::~BooleanClause(){ if ( deleteQuery ) _CLDELETE( query ); } /** Returns true if o is equal to this. */ bool BooleanClause::equals(const BooleanClause* other) const { return this->query->equals(other->query) && (this->required == other->required) && (this->prohibited == other->prohibited) // TODO: Remove these && (this->occur == other->getOccur() ); } /** Returns a hash code value for this object.*/ size_t BooleanClause::hashCode() const { return query->hashCode() ^ ( (occur == MUST) ?1:0) ^ ( (occur == MUST_NOT)?2:0); } BooleanClause::Occur BooleanClause::getOccur() const { return occur; } void BooleanClause::setOccur(Occur o) { occur = o; setFields(o); } Query* BooleanClause::getQuery() const { return query; } void BooleanClause::setQuery(Query* q) { if ( deleteQuery ) _CLDELETE( query ); query = q; } bool BooleanClause::isProhibited() const { return prohibited; /* TODO: return (occur == MUST_NOT); */ } bool BooleanClause::isRequired() const { return required; /* TODO: return (occur == MUST); */ } TCHAR* BooleanClause::toString() const { CL_NS(util)::StringBuffer buffer; if (occur == MUST) buffer.append(_T("+")); else if (occur == MUST_NOT) buffer.append(_T("-")); buffer.append( query->toString() ); return buffer.toString(); } void BooleanClause::setFields(Occur occur) { if (occur == MUST) { required = true; prohibited = false; } else if (occur == SHOULD) { required = false; prohibited = false; } else if (occur == MUST_NOT) { required = false; prohibited = true; } else { _CLTHROWT (CL_ERR_UnknownOperator, _T("Unknown operator")); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/BooleanQuery.h000066400000000000000000000130161154025176300233120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_BooleanQuery_ #define _lucene_search_BooleanQuery_ CL_CLASS_DEF(util,StringBuffer) CL_CLASS_DEF(search,Weight) #include "Query.h" #include "BooleanClause.h" #include "CLucene/util/VoidList.h" CL_NS_DEF(search) // A Query that matches documents matching boolean combinations of other // queries, typically {@link TermQuery}s or {@link PhraseQuery}s. class CLUCENE_EXPORT BooleanQuery:public Query { public: typedef CL_NS(util)::CLVector > ClausesType; private: ClausesType* clauses; static size_t maxClauseCount; /** Whether hit docs may be collected out of docid order. */ static bool allowDocsOutOfOrder; bool disableCoord; protected: int32_t minNrShouldMatch; Weight* _createWeight(Searcher* searcher); BooleanQuery(const BooleanQuery& clone); public: /** Constructs an empty boolean query. */ BooleanQuery( bool disableCoord = false ); ~BooleanQuery(); const char* getObjectName() const; static const char* getClassName(); /** Return the maximum number of clauses permitted, 1024 by default. * Attempts to add more than the permitted number of clauses cause {@link * TooManyClauses} to be thrown.*/ static size_t getMaxClauseCount(); /** Set the maximum number of clauses permitted. */ static void setMaxClauseCount(const size_t maxClauseCount); /** Adds a clause to a boolean query. Clauses may be: *
    *
  • required which means that documents which do not * match this sub-query will not match the boolean query; *
  • prohibited which means that documents which do * match this sub-query will not match the boolean query; or *
  • neither, in which case matched documents are neither prohibited from * nor required to match the sub-query. However, a document must match at * least 1 sub-query to match the boolean query. *
* It is an error to specify a clause as both required and * prohibited. * * @deprecated use {@link #add(Query, BooleanClause.Occur)} instead: *
    *
  • For add(query, true, false) use add(query, BooleanClause.Occur.MUST) *
  • For add(query, false, false) use add(query, BooleanClause.Occur.SHOULD) *
  • For add(query, false, true) use add(query, BooleanClause.Occur.MUST_NOT) *
*/ void add(Query* query, const bool required, const bool prohibited){ add(query,false,required,prohibited); } void add(Query* query, const bool deleteQuery, const bool required, const bool prohibited); void add(Query* query, const bool deleteQuery, BooleanClause::Occur occur); void add(Query* query, BooleanClause::Occur occur) { add(query,false,occur); }; /** Copies the clauses of this query into the array. * The array must be at least as long as getClauseCount() * If you want to use the clauses, make sure you null terminate it. */ void getClauses(BooleanClause** clauses) const; ///@deprecated _CL_DEPRECATED( getClauses(clauses) ) BooleanClause** getClauses() const; /** * Give client code access to clauses.size() so we know how * large the array returned by getClauses is. */ size_t getClauseCount() const; /** Adds a clause to a boolean query. * @see #getMaxClauseCount() */ void add(BooleanClause* clause); Query* rewrite(CL_NS(index)::IndexReader* reader); Query* clone() const; /** Expert: adds all terms occurring in this query to the termset set. */ void extractTerms( TermSet * termset ) const; bool equals(Query* o) const; Similarity* getSimilarity( Searcher* searcher ); bool isCoordDisabled(); void setCoordDisabled( bool disableCoord ); static bool getUseScorer14(); static void setUseScorer14( bool use14 ); /** * Expert: Indicates whether hit docs may be collected out of docid * order. * *

* Background: although the contract of the Scorer class requires that * documents be iterated in order of doc id, this was not true in early * versions of Lucene. Many pieces of functionality in the current * Lucene code base have undefined behavior if this contract is not * upheld, but in some specific simple cases may be faster. (For * example: disjunction queries with less than 32 prohibited clauses; * This setting has no effect for other queries.) *

* *

* Specifics: By setting this option to true, calls to * {@link HitCollector#collect(int,float)} might be * invoked first for docid N and only later for docid N-1. * Being static, this setting is system wide. *

*/ static void setAllowDocsOutOfOrder(bool allow); /** * Whether hit docs may be collected out of docid order. * @see #setAllowDocsOutOfOrder(boolean) */ static bool getAllowDocsOutOfOrder(); /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* field) const; /** Returns a hash code value for this object.*/ size_t hashCode() const; //internal int32_t getMinNrShouldMatch(); friend class BooleanWeight; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/BooleanScorer.cpp000066400000000000000000000165321154025176300240030ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "SearchHeader.h" #include "_BooleanScorer.h" #include "Scorer.h" #include "Similarity.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(util) CL_NS_DEF(search) BooleanScorer::BooleanScorer(Similarity* similarity, int32_t minNrShouldMatch ): Scorer(similarity), scorers(NULL), maxCoord(1), nextMask(1), end(0), current(NULL), minNrShouldMatch(minNrShouldMatch), requiredMask(0), prohibitedMask(0), coordFactors(NULL) { bucketTable = _CLNEW BucketTable(this); } BooleanScorer::~BooleanScorer(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed _CLDELETE(bucketTable); _CLDELETE_ARRAY(coordFactors); _CLDELETE(scorers); } bool BooleanScorer::next() { bool more; do { while (bucketTable->first != NULL) { // more queued current = bucketTable->first; bucketTable->first = current->next; // pop the queue // check prohibited & required if ((current->bits & prohibitedMask) == 0 && (current->bits & requiredMask) == requiredMask) { return true; } } // refill the queue more = false; end += BooleanScorer::BucketTable_SIZE; for (SubScorer* sub = scorers; sub != NULL; sub = sub->next) { Scorer* scorer = sub->scorer; int32_t doc; while (!sub->done && (doc=scorer->doc()) < end) { sub->collector->collect(doc, scorer->score()); sub->done = !scorer->next(); } if (!sub->done) { more = true; } } } while (bucketTable->first != NULL || more); return false; } float_t BooleanScorer::score(){ if (coordFactors == NULL) computeCoordFactors(); return current->score * coordFactors[current->coord]; } void BooleanScorer::score( HitCollector* results ) { next(); score( results, LUCENE_INT32_MAX_SHOULDBE ); } bool BooleanScorer::skipTo(int32_t /*target*/) { _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: BooleanScorer::skipTo"); } Explanation* BooleanScorer::explain(int32_t /*doc*/) { _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: BooleanScorer::explain"); } TCHAR* BooleanScorer::toString() { CL_NS(util)::StringBuffer buffer; buffer.append(_T("boolean(")); for (SubScorer* sub = scorers; sub != NULL; sub = sub->next) { TCHAR* tmp = sub->scorer->toString(); buffer.append(tmp); _CLDELETE_LCARRAY(tmp); buffer.appendChar(_T(' ')); } buffer.appendChar(_T(')')); return buffer.toString(); } void BooleanScorer::add(Scorer* scorer, const bool required, const bool prohibited) { int32_t mask = 0; if (required || prohibited) { if (nextMask == 0) _CLTHROWA(CL_ERR_IndexOutOfBounds, "More than 32 required/prohibited clauses in query."); mask = nextMask; nextMask = ( nextMask << 1 ); } else mask = 0; if (!prohibited) maxCoord++; if (prohibited) prohibitedMask |= mask; // update prohibited mask else if (required) requiredMask |= mask; // update required mask //scorer, HitCollector, and scorers is delete in the SubScorer scorers = _CLNEW SubScorer(scorer, required, prohibited, bucketTable->newCollector(mask), scorers); } void BooleanScorer::computeCoordFactors(){ coordFactors = _CL_NEWARRAY(float_t,maxCoord); for (int32_t i = 0; i < maxCoord; i++) coordFactors[i] = getSimilarity()->coord(i, maxCoord-1); } bool BooleanScorer::score( HitCollector* results, const int32_t maxDoc ) { if ( coordFactors == NULL ) { computeCoordFactors(); } bool more; Bucket* tmp; do { bucketTable->first = NULL; while ( current != NULL ) { if (( current->bits & prohibitedMask ) == 0 && ( current->bits & requiredMask ) == requiredMask ) { if ( current->doc >= maxDoc ) { tmp = current; current = current->next; tmp->next = bucketTable->first; bucketTable->first = tmp; continue; } if ( current->coord >= minNrShouldMatch ) { results->collect( current->doc, current->score * coordFactors[current->coord] ); } } current = current->next; } if ( bucketTable->first != NULL ) { current = bucketTable->first; bucketTable->first = current->next; return true; } more = false; end += BucketTable_SIZE; for ( SubScorer* sub = scorers; sub != NULL; sub = sub->next ) { if ( !sub->done ) { sub->done = !sub->scorer->score( sub->collector, end ); if ( !sub->done ) more = true; } } current = bucketTable->first; } while ( current != NULL || more ); return false; } BooleanScorer::SubScorer::SubScorer(Scorer* scr, const bool r, const bool p, HitCollector* c, SubScorer* nxt): scorer(scr), required(r), prohibited(p), collector(c), next(nxt) { //Func - Constructor //Pre - scr != NULL, // c != NULL // nxt may or may not be NULL //Post - The instance has been created CND_PRECONDITION(scr != NULL,"scr is NULL"); CND_PRECONDITION(c != NULL,"c is NULL"); done = !scorer->next(); } BooleanScorer::SubScorer::~SubScorer(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed for (SubScorer * ptr = next; ptr; ){ SubScorer* next = ptr->next; ptr->next = NULL; _CLDELETE(ptr); ptr = next; } _CLDELETE(scorer); _CLDELETE(collector); } BooleanScorer::Bucket::Bucket(): doc(-1), score(0.0), bits(0), coord(0), next(NULL) { } BooleanScorer::Bucket::~Bucket(){ } BooleanScorer::BucketTable::BucketTable(BooleanScorer* scr): scorer(scr), first(NULL) { buckets = new Bucket[BucketTable_SIZE]; } BooleanScorer::BucketTable::~BucketTable(){ clear(); delete [] buckets; } void BooleanScorer::BucketTable::clear(){ //delete first; first = NULL; } int32_t BooleanScorer::BucketTable::size() const { return BooleanScorer::BucketTable_SIZE; } HitCollector* BooleanScorer::BucketTable::newCollector(const int32_t mask) { return _CLNEW Collector(mask, this); } BooleanScorer::Collector::Collector(const int32_t msk, BucketTable* bucketTbl): bucketTable(bucketTbl), mask(msk) { } void BooleanScorer::Collector::collect(const int32_t doc, const float_t score){ BucketTable* table = bucketTable; int32_t i = doc & (BooleanScorer::BucketTable_SIZE-1); Bucket* bucket = &table->buckets[i]; if (bucket->doc != doc) { // invalid bucket bucket->doc = doc; // set doc bucket->score = score; // initialize score bucket->bits = mask; // initialize mask bucket->coord = 1; // initialize coord bucket->next = table->first; // push onto valid list table->first = bucket; } else { // valid bucket bucket->score += score; // increment score bucket->bits |= mask; // add bits in mask bucket->coord++; // increment coord } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/BooleanScorer2.cpp000066400000000000000000000433771154025176300240740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_BooleanScorer2.h" #include "Scorer.h" #include "SearchHeader.h" #include "Similarity.h" #include "ScorerDocQueue.h" #include "Explanation.h" #include "_BooleanScorer.h" #include "_BooleanScorer.h" #include "_ConjunctionScorer.h" #include "_DisjunctionSumScorer.h" CL_NS_USE(util) CL_NS_DEF(search) class BooleanScorer2::Coordinator { public: int32_t maxCoord; int32_t nrMatchers; // to be increased by score() of match counting scorers. float_t* coordFactors; Scorer* parentScorer; Coordinator( Scorer* parent ): maxCoord(0), nrMatchers(0), coordFactors(NULL), parentScorer(parent) { } virtual ~Coordinator() { _CLDELETE_ARRAY(coordFactors); } void init() { coordFactors = _CL_NEWARRAY( float_t, maxCoord+1 ); Similarity* sim = parentScorer->getSimilarity(); for ( int32_t i = 0; i <= maxCoord; i++ ) { coordFactors[i] = sim->coord(i, maxCoord); } } void initDoc() { nrMatchers = 0; } float_t coordFactor() { return coordFactors[nrMatchers]; } }; class BooleanScorer2::SingleMatchScorer: public Scorer { public: Scorer* scorer; Coordinator* coordinator; int32_t lastScoredDoc; SingleMatchScorer( Scorer* _scorer, Coordinator* _coordinator ) : Scorer( _scorer->getSimilarity() ), scorer(_scorer), coordinator(_coordinator), lastScoredDoc(-1) { } virtual ~SingleMatchScorer() { _CLDELETE( scorer ); } float_t score() { if ( doc() >= lastScoredDoc ) { lastScoredDoc = this->doc(); coordinator->nrMatchers++; } return scorer->score(); } int32_t doc() const { return scorer->doc(); } bool next() { return scorer->next(); } bool skipTo( int32_t docNr ) { return scorer->skipTo( docNr ); } virtual TCHAR* toString() { return scorer->toString(); } Explanation* explain(int32_t doc) { return scorer->explain( doc ); } }; /** A scorer that matches no document at all. */ class BooleanScorer2::NonMatchingScorer: public Scorer { public: NonMatchingScorer() : Scorer( NULL ) { } virtual ~NonMatchingScorer() {}; int32_t doc() const { _CLTHROWA(CL_ERR_UnsupportedOperation, "UnsupportedOperationException: BooleanScorer2::NonMatchingScorer::doc"); return 0; } bool next() { return false; } float_t score() { _CLTHROWA(CL_ERR_UnsupportedOperation, "UnsupportedOperationException: BooleanScorer2::NonMatchingScorer::score"); return 0.0; } bool skipTo( int32_t /*target*/ ) { return false; } virtual TCHAR* toString() { return stringDuplicate(_T("NonMatchingScorer")); } Explanation* explain( int32_t /*doc*/ ) { Explanation* e = _CLNEW Explanation(); e->setDescription(_T("No document matches.")); return e; } }; /** A Scorer for queries with a required part and an optional part. * Delays skipTo() on the optional part until a score() is needed. *
* This Scorer implements {@link Scorer#skipTo(int)}. */ class BooleanScorer2::ReqOptSumScorer: public Scorer { private: /** The scorers passed from the constructor. * These are set to null as soon as their next() or skipTo() returns false. */ Scorer* reqScorer; Scorer* optScorer; bool firstTimeOptScorer; public: /** Construct a ReqOptScorer. * @param reqScorer The required scorer. This must match. * @param optScorer The optional scorer. This is used for scoring only. */ ReqOptSumScorer( Scorer* _reqScorer, Scorer* _optScorer ) : Scorer( NULL ), reqScorer(_reqScorer), optScorer(_optScorer), firstTimeOptScorer(true) { } virtual ~ReqOptSumScorer() { _CLDELETE( reqScorer ); _CLDELETE( optScorer ); } /** Returns the score of the current document matching the query. * Initially invalid, until {@link #next()} is called the first time. * @return The score of the required scorer, eventually increased by the score * of the optional scorer when it also matches the current document. */ float_t score() { int32_t curDoc = reqScorer->doc(); float_t reqScore = reqScorer->score(); if ( firstTimeOptScorer ) { firstTimeOptScorer = false; if ( !optScorer->skipTo( curDoc ) ) { _CLDELETE(optScorer); return reqScore; } } else if ( optScorer == NULL ) { return reqScore; } else if (( optScorer->doc() < curDoc ) && ( !optScorer->skipTo( curDoc ))) { _CLDELETE(optScorer); return reqScore; } return ( optScorer->doc() == curDoc ) ? reqScore + optScorer->score() : reqScore; } int32_t doc() const { return reqScorer->doc(); } bool next() { return reqScorer->next(); } bool skipTo( int32_t target ) { return reqScorer->skipTo( target ); } virtual TCHAR* toString() { return stringDuplicate(_T("ReqOptSumScorer")); } /** Explain the score of a document. * @todo Also show the total score. * See BooleanScorer.explain() on how to do this. */ Explanation* explain( int32_t doc ) { Explanation* res = _CLNEW Explanation(); res->setDescription(_T("required, optional")); res->addDetail(reqScorer->explain(doc)); res->addDetail(optScorer->explain(doc)); return res; } }; /** A Scorer for queries with a required subscorer and an excluding (prohibited) subscorer. *
* This Scorer implements {@link Scorer#skipTo(int)}, * and it uses the skipTo() on the given scorers. */ class BooleanScorer2::ReqExclScorer: public Scorer { private: Scorer* reqScorer; Scorer* exclScorer; bool firstTime; public: /** Construct a ReqExclScorer. * @param reqScorer The scorer that must match, except where * @param exclScorer indicates exclusion. */ ReqExclScorer( Scorer* _reqScorer, Scorer* _exclScorer ) : Scorer( NULL ), reqScorer(_reqScorer), exclScorer(_exclScorer), firstTime(true) { } virtual ~ReqExclScorer() { _CLDELETE( reqScorer ); _CLDELETE( exclScorer ); } int32_t doc() const { return reqScorer->doc(); } /** Returns the score of the current document matching the query. * Initially invalid, until {@link #next()} is called the first time. * @return The score of the required scorer. */ float_t score() { return reqScorer->score(); } virtual TCHAR* toString() { return stringDuplicate(_T("ReqExclScorer")); } Explanation* explain( int32_t doc ) { Explanation* res = _CLNEW Explanation(); if (exclScorer->skipTo(doc) && (exclScorer->doc() == doc)) { res->setDescription(_T("excluded")); } else { res->setDescription(_T("not excluded")); res->addDetail(reqScorer->explain(doc)); } return res; } bool next() { if ( firstTime ) { if ( !exclScorer->next() ) { _CLDELETE( exclScorer ); } firstTime = false; } if ( reqScorer == NULL ) { return false; } if ( !reqScorer->next() ) { _CLDELETE( reqScorer ); // exhausted, nothing left return false; } if ( exclScorer == NULL ) { return true;// reqScorer.next() already returned true } return toNonExcluded(); } /** Skips to the first match beyond the current whose document number is * greater than or equal to a given target. *
When this method is used the {@link #explain(int)} method should not be used. * @param target The target document number. * @return true iff there is such a match. */ bool skipTo( int32_t target ) { if ( firstTime ) { firstTime = false; if ( !exclScorer->skipTo( target )) { _CLDELETE( exclScorer ); // exhausted } } if ( reqScorer == NULL ) { return false; } if ( exclScorer == NULL ) { return reqScorer->skipTo( target ); } if ( !reqScorer->skipTo( target )) { _CLDELETE( reqScorer ); return false; } return toNonExcluded(); } private: /** Advance to non excluded doc. *
On entry: *
    *
  • reqScorer != null, *
  • exclScorer != null, *
  • reqScorer was advanced once via next() or skipTo() * and reqScorer.doc() may still be excluded. *
* Advances reqScorer a non excluded required doc, if any. * @return true iff there is a non excluded required doc. */ bool toNonExcluded() { int32_t exclDoc = exclScorer->doc(); do { int32_t reqDoc = reqScorer->doc(); if ( reqDoc < exclDoc ) { return true; // reqScorer advanced to before exclScorer, ie. not excluded } else if ( reqDoc > exclDoc ) { if (! exclScorer->skipTo(reqDoc)) { _CLDELETE( exclScorer ); // exhausted, no more exclusions return true; } exclDoc = exclScorer->doc(); if ( exclDoc > reqDoc ) { return true; // not excluded } } } while ( reqScorer->next() ); _CLDELETE( reqScorer ); // exhausted, nothing left return false; } }; class BooleanScorer2::BSConjunctionScorer: public CL_NS(search)::ConjunctionScorer { private: CL_NS(search)::BooleanScorer2::Coordinator* coordinator; int32_t lastScoredDoc; int32_t requiredNrMatchers; typedef CL_NS(util)::CLVector > ScorersType; public: BSConjunctionScorer( CL_NS(search)::BooleanScorer2::Coordinator* _coordinator, ScorersType* _requiredScorers, int32_t _requiredNrMatchers ): ConjunctionScorer( Similarity::getDefault(), _requiredScorers ), coordinator(_coordinator), lastScoredDoc(-1), requiredNrMatchers(_requiredNrMatchers) { } virtual ~BSConjunctionScorer(){ } float_t score() { if ( this->doc() >= lastScoredDoc ) { lastScoredDoc = this->doc(); coordinator->nrMatchers += requiredNrMatchers; } return ConjunctionScorer::score(); } virtual TCHAR* toString() {return stringDuplicate(_T("BSConjunctionScorer"));} }; class BooleanScorer2::BSDisjunctionSumScorer: public CL_NS(search)::DisjunctionSumScorer { private: CL_NS(search)::BooleanScorer2::Coordinator* coordinator; int32_t lastScoredDoc; typedef CL_NS(util)::CLVector > ScorersType; public: BSDisjunctionSumScorer( CL_NS(search)::BooleanScorer2::Coordinator* _coordinator, ScorersType* subScorers, int32_t minimumNrMatchers ): DisjunctionSumScorer( subScorers, minimumNrMatchers ), coordinator(_coordinator), lastScoredDoc(-1) { } float_t score() { if ( this->doc() >= lastScoredDoc ) { lastScoredDoc = this->doc(); coordinator->nrMatchers += _nrMatchers; } return DisjunctionSumScorer::score(); } virtual ~BSDisjunctionSumScorer(){ } virtual TCHAR* toString() {return stringDuplicate(_T("BSDisjunctionSumScorer"));} }; class BooleanScorer2::Internal{ public: typedef CL_NS(util)::CLVector > ScorersType; ScorersType requiredScorers; ScorersType optionalScorers; ScorersType prohibitedScorers; BooleanScorer2::Coordinator *coordinator; Scorer* countingSumScorer; size_t minNrShouldMatch; bool allowDocsOutOfOrder; void initCountingSumScorer() { coordinator->init(); countingSumScorer = makeCountingSumScorer(); } Scorer* countingDisjunctionSumScorer( ScorersType* scorers, int32_t minNrShouldMatch ) { return _CLNEW BSDisjunctionSumScorer( coordinator, scorers, minNrShouldMatch ); } Scorer* countingConjunctionSumScorer( ScorersType* requiredScorers ) { return _CLNEW BSConjunctionScorer( coordinator, requiredScorers, requiredScorers->size() ); } Scorer* dualConjunctionSumScorer( Scorer* req1, Scorer* req2 ) { ValueArray scorers(2); scorers[0] = req1; scorers[1] = req2; return _CLNEW CL_NS(search)::ConjunctionScorer( Similarity::getDefault(), &scorers ); } Scorer* makeCountingSumScorer() { return ( requiredScorers.size() == 0 ) ? makeCountingSumScorerNoReq() : makeCountingSumScorerSomeReq(); } Scorer* makeCountingSumScorerNoReq() { if ( optionalScorers.size() == 0 ) { optionalScorers.setDoDelete(true); return _CLNEW NonMatchingScorer(); } else { size_t nrOptRequired = ( minNrShouldMatch < 1 ) ? 1 : minNrShouldMatch; if ( optionalScorers.size() < nrOptRequired ) { optionalScorers.setDoDelete(true); return _CLNEW NonMatchingScorer(); } else { Scorer* requiredCountingSumScorer = ( optionalScorers.size() > nrOptRequired ) ? countingDisjunctionSumScorer( &optionalScorers, nrOptRequired ) : ( optionalScorers.size() == 1 ) ? _CLNEW SingleMatchScorer((Scorer*) optionalScorers[0], coordinator) : countingConjunctionSumScorer( &optionalScorers ); return addProhibitedScorers( requiredCountingSumScorer ); } } } Scorer* makeCountingSumScorerSomeReq() { if ( optionalScorers.size() < minNrShouldMatch ) { requiredScorers.setDoDelete(true); optionalScorers.setDoDelete(true); return _CLNEW NonMatchingScorer(); } else if ( optionalScorers.size() == minNrShouldMatch ) { Internal::ScorersType allReq( false ); for ( Internal::ScorersType::iterator it = requiredScorers.begin(); it != requiredScorers.end(); it++ ) { allReq.push_back( *it ); } for ( Internal::ScorersType::iterator it2 = optionalScorers.begin(); it2 != optionalScorers.end(); it2++ ) { allReq.push_back( *it2 ); } return addProhibitedScorers( countingConjunctionSumScorer( &allReq )); } else { Scorer* requiredCountingSumScorer = ( requiredScorers.size() == 1 ) ? _CLNEW SingleMatchScorer( (Scorer*)requiredScorers[0], coordinator ) : countingConjunctionSumScorer( &requiredScorers ); if ( minNrShouldMatch > 0 ) { return addProhibitedScorers( dualConjunctionSumScorer( requiredCountingSumScorer, countingDisjunctionSumScorer( &optionalScorers, minNrShouldMatch ))); } else { return _CLNEW ReqOptSumScorer( addProhibitedScorers( requiredCountingSumScorer ), (( optionalScorers.size() == 1 ) ? _CLNEW SingleMatchScorer( (Scorer*)optionalScorers[0], coordinator ) : countingDisjunctionSumScorer( &optionalScorers, 1 ))); } } } Scorer* addProhibitedScorers( Scorer* requiredCountingSumScorer ) { return ( prohibitedScorers.size() == 0 ) ? requiredCountingSumScorer : _CLNEW ReqExclScorer( requiredCountingSumScorer, (( prohibitedScorers.size() == 1 ) ? (Scorer*)prohibitedScorers[0] : _CLNEW CL_NS(search)::DisjunctionSumScorer( &prohibitedScorers ))); } Internal( BooleanScorer2* parent, int32_t _minNrShouldMatch, bool _allowDocsOutOfOrder ): requiredScorers(false), optionalScorers(false), prohibitedScorers(false), countingSumScorer(NULL), minNrShouldMatch(_minNrShouldMatch), allowDocsOutOfOrder(_allowDocsOutOfOrder) { if ( _minNrShouldMatch < 0 ) { _CLTHROWA(CL_ERR_IllegalArgument, "Minimum number of optional scorers should not be negative"); } this->coordinator = _CLNEW Coordinator( parent ); } ~Internal(){ _CLDELETE( coordinator ); _CLDELETE( countingSumScorer ); /* TODO: these leak memory... haven't figure out how it should be fixed though... requiredScorers.clear(); optionalScorers.clear(); prohibitedScorers.clear(); */ } }; BooleanScorer2::BooleanScorer2( Similarity* similarity, int32_t minNrShouldMatch, bool allowDocsOutOfOrder ): Scorer( similarity ) { _internal = new Internal(this, minNrShouldMatch, allowDocsOutOfOrder); } BooleanScorer2::~BooleanScorer2() { delete _internal; } void BooleanScorer2::add( Scorer* scorer, bool required, bool prohibited ) { if ( !prohibited ) { _internal->coordinator->maxCoord++; } if ( required ) { if ( prohibited ) { _CLTHROWA(CL_ERR_IllegalArgument, "scorer cannot be required and prohibited"); } _internal->requiredScorers.push_back( scorer ); } else if ( prohibited ) { _internal->prohibitedScorers.push_back( scorer ); } else { _internal->optionalScorers.push_back( scorer ); } } void BooleanScorer2::score( HitCollector* hc ) { if ( _internal->allowDocsOutOfOrder && _internal->requiredScorers.size() == 0 && _internal->prohibitedScorers.size() < 32 ) { BooleanScorer* bs = _CLNEW BooleanScorer( getSimilarity(), _internal->minNrShouldMatch ); Internal::ScorersType::iterator si = _internal->optionalScorers.begin(); while ( si != _internal->optionalScorers.end() ) { bs->add( (*si), false /* required */, false /* prohibited */ ); si++; } si = _internal->prohibitedScorers.begin(); while ( si != _internal->prohibitedScorers.end() ) { bs->add( (*si), false /* required */, true /* prohibited */ ); si++; } bs->score( hc ); } else { if ( _internal->countingSumScorer == NULL ) { _internal->initCountingSumScorer(); } while ( _internal->countingSumScorer->next() ) { hc->collect( _internal->countingSumScorer->doc(), score() ); } } } int32_t BooleanScorer2::doc() const { return _internal->countingSumScorer->doc(); } bool BooleanScorer2::next() { if ( _internal->countingSumScorer == NULL ) { _internal->initCountingSumScorer(); } return _internal->countingSumScorer->next(); } float_t BooleanScorer2::score() { _internal->coordinator->initDoc(); float_t sum = _internal->countingSumScorer->score(); return sum * _internal->coordinator->coordFactor(); } bool BooleanScorer2::skipTo( int32_t target ) { if ( _internal->countingSumScorer == NULL ) { _internal->initCountingSumScorer(); } return _internal->countingSumScorer->skipTo( target ); } TCHAR* BooleanScorer2::toString() { return stringDuplicate(_T("BooleanScorer2")); } Explanation* BooleanScorer2::explain( int32_t /*doc*/ ) { _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: BooleanScorer2::explain"); /* How to explain the coordination factor? initCountingSumScorer(); return countingSumScorer.explain(doc); // misses coord factor. */ } bool BooleanScorer2::score( HitCollector* hc, int32_t max ) { int32_t docNr = _internal->countingSumScorer->doc(); while ( docNr < max ) { hc->collect( docNr, score() ); if ( !_internal->countingSumScorer->next() ) { return false; } docNr = _internal->countingSumScorer->doc(); } return true; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/CachingSpanFilter.cpp000066400000000000000000000057411154025176300245720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CachingSpanFilter.h" #include "CLucene/index/IndexReader.h" CL_NS_DEF(search) /** * Result wrapper for the cache */ class ResultHolder : LUCENE_BASE { bool deleteResult; public: SpanFilterResult * result; ResultHolder(SpanFilterResult * result, bool deleteResult ) { this->result = result; this->deleteResult = deleteResult; } ~ResultHolder() { if ( deleteResult ) _CLDELETE( result ); } }; struct CachingSpanFilter::Internal { typedef CL_NS(util)::CLHashMap< CL_NS(index)::IndexReader *, ResultHolder *, CL_NS(util)::Compare::Void, CL_NS(util)::Equals::Void, CL_NS(util)::Deletor::Object, CL_NS(util)::Deletor::Object > ResultCacheType; ResultCacheType cache; DEFINE_MUTEX(cache_LOCK) Internal() : cache(false,true) {} }; CachingSpanFilter::CachingSpanFilter( SpanFilter * filter, bool deleteFilter ) { _internal = _CLNEW Internal(); this->filter = filter; this->deleteFilter = deleteFilter; } CachingSpanFilter::CachingSpanFilter( const CachingSpanFilter& copy ) { _internal = _CLNEW Internal(); this->filter = (SpanFilter*)copy.filter->clone(); this->deleteFilter = true; } CachingSpanFilter::~CachingSpanFilter() { _CLDELETE( _internal ); if( deleteFilter ) { _CLDELETE( filter ); } else filter = NULL; } Filter* CachingSpanFilter::clone() const { return _CLNEW CachingSpanFilter( *this ); } CL_NS(util)::BitSet* CachingSpanFilter::bits( CL_NS(index)::IndexReader * reader ) { SpanFilterResult * result = getCachedResult( reader ); return result != NULL ? result->getBits() : NULL; } SpanFilterResult * CachingSpanFilter::getCachedResult( CL_NS(index)::IndexReader * reader ) { SCOPED_LOCK_MUTEX( _internal->cache_LOCK ) ResultHolder * resultHolder = _internal->cache.get( reader ); if( ! resultHolder ) { SpanFilterResult * result = filter->bitSpans( reader ); resultHolder = _CLNEW ResultHolder( result, true ); _internal->cache.put( reader, resultHolder ); } return resultHolder->result; } SpanFilterResult * CachingSpanFilter::bitSpans( CL_NS(index)::IndexReader * reader ) { return getCachedResult( reader ); } TCHAR* CachingSpanFilter::toString() { TCHAR* ft = filter->toString(); size_t len = _tcslen( ft ) + 20; TCHAR* ret = _CL_NEWARRAY( TCHAR, len ); ret[0] = 0; _sntprintf( ret, len, _T( "CachingSpanFilter(%s)" ), ft ); _CLDELETE_CARRAY( ft ); return ret; } CL_NS_ENDclucene-core-2.3.3.4/src/core/CLucene/search/CachingSpanFilter.h000066400000000000000000000033121154025176300242270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_CachingSpanFilter_ #define _lucene_search_CachingSpanFilter_ #include "SpanFilter.h" CL_NS_DEF(search) /** * Wraps another SpanFilter's result and caches it. The purpose is to allow * filters to simply filter, and then wrap with this class to add caching. */ class CachingSpanFilter : public SpanFilter { struct Internal; Internal* _internal; protected: SpanFilter * filter; bool deleteFilter; protected: CachingSpanFilter( const CachingSpanFilter& copy ); public: /** * @param filter Filter to cache results of */ CachingSpanFilter( SpanFilter * filter, bool deleteFilter=true ); virtual ~CachingSpanFilter(); virtual Filter* clone() const; virtual CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader * reader ); virtual SpanFilterResult * bitSpans( CL_NS(index)::IndexReader * reader ); virtual TCHAR* toString(); private: SpanFilterResult * getCachedResult( CL_NS(index)::IndexReader * reader ); // public boolean equals(Object o) { // if (!(o instanceof CachingSpanFilter)) return false; // return this.filter.equals(((CachingSpanFilter)o).filter); // } // // public int hashCode() { // return filter.hashCode() ^ 0x1117BF25; // } }; CL_NS_END #endif // _lucene_search_CachingSpanFilter_ clucene-core-2.3.3.4/src/core/CLucene/search/CachingWrapperFilter.cpp000066400000000000000000000057631154025176300253150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CachingWrapperFilter.h" #include "CLucene/util/BitSet.h" #include "CLucene/index/IndexReader.h" CL_NS_DEF(search) CL_NS_USE(index) CL_NS_USE(util) class BitSetHolder: LUCENE_BASE{ bool deleteBs; public: CL_NS(util)::BitSet* bits; BitSetHolder(CL_NS(util)::BitSet* bits, bool deleteBs){ this->bits = bits; this->deleteBs = deleteBs; } ~BitSetHolder(){ if ( deleteBs ) _CLDELETE(bits); } }; struct AbstractCachingFilter::Internal{ typedef CL_NS(util)::CLHashMap, CL_NS(util)::Equals::Void, CL_NS(util)::Deletor::Object, CL_NS(util)::Deletor::Object > CacheType; CacheType cache; DEFINE_MUTEX(cache_LOCK) Internal(): cache(false,true) { } }; AbstractCachingFilter::AbstractCachingFilter(): _internal(new Internal) { } AbstractCachingFilter::AbstractCachingFilter(const AbstractCachingFilter& /*copy*/): _internal(new Internal) { } AbstractCachingFilter::~AbstractCachingFilter(){ delete _internal; } BitSet* AbstractCachingFilter::bits(IndexReader* reader){ SCOPED_LOCK_MUTEX(_internal->cache_LOCK) BitSetHolder* cached = _internal->cache.get(reader); if ( cached != NULL ) return cached->bits; BitSet* bs = doBits(reader); BitSetHolder* bsh = _CLNEW BitSetHolder(bs, doShouldDeleteBitSet(bs)); _internal->cache.put(reader,bsh); return bs; } void AbstractCachingFilter::closeCallback(CL_NS(index)::IndexReader* reader, void*){ SCOPED_LOCK_MUTEX(_internal->cache_LOCK) _internal->cache.remove(reader); } CachingWrapperFilter::CachingWrapperFilter(Filter* filter, bool deleteFilter): AbstractCachingFilter() { this->filter = filter; this->deleteFilter = deleteFilter; } CachingWrapperFilter::CachingWrapperFilter(const CachingWrapperFilter& copy): AbstractCachingFilter(copy) { this->filter = copy.filter->clone(); this->deleteFilter = true; } Filter* CachingWrapperFilter::clone() const{ return _CLNEW CachingWrapperFilter(*this); } TCHAR* CachingWrapperFilter::toString(){ TCHAR* fs = filter->toString(); int len = _tcslen(fs)+23; TCHAR* ret = _CL_NEWARRAY(TCHAR,len); _sntprintf(ret,len,_T("CachingWrapperFilter(%s)"),fs); _CLDELETE_CARRAY(fs); return ret; } BitSet* CachingWrapperFilter::doBits(IndexReader* reader){ return filter->bits(reader); } bool CachingWrapperFilter::doShouldDeleteBitSet( CL_NS(util)::BitSet* bits ){ return filter->shouldDeleteBitSet(bits); } CachingWrapperFilter::~CachingWrapperFilter(){ if ( deleteFilter ){ _CLDELETE(filter); }else filter=NULL; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/CachingWrapperFilter.h000066400000000000000000000044151154025176300247530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_CachingWrapperFilter_ #define _lucene_search_CachingWrapperFilter_ //#include "CLucene/util/BitSet.h" //#include "CLucene/index/IndexReader.h" #include "Filter.h" CL_NS_DEF(search) /** * Wraps another filter's result and caches it. The purpose is to allow * filters to implement this and allow itself to be cached. Alternatively, * use the CachingWrapperFilter to cache the filter. */ class CLUCENE_EXPORT AbstractCachingFilter: public Filter { struct Internal; Internal* _internal; void closeCallback(CL_NS(index)::IndexReader* reader, void* param); protected: AbstractCachingFilter( const AbstractCachingFilter& copy ); virtual CL_NS(util)::BitSet* doBits( CL_NS(index)::IndexReader* reader ) = 0; virtual bool doShouldDeleteBitSet( CL_NS(util)::BitSet* /*bits*/ ){ return false; } AbstractCachingFilter(); public: virtual ~AbstractCachingFilter(); /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader ); virtual Filter *clone() const = 0; virtual TCHAR *toString() = 0; bool shouldDeleteBitSet( const CL_NS(util)::BitSet* /*bits*/ ) const{ return false; } }; /** * Wraps another filter's result and caches it. The purpose is to allow * filters to simply filter, and then wrap with this class to add * caching, keeping the two concerns decoupled yet composable. */ class CLUCENE_EXPORT CachingWrapperFilter: public AbstractCachingFilter { private: Filter* filter; bool deleteFilter; protected: CachingWrapperFilter( const CachingWrapperFilter& copy ); CL_NS(util)::BitSet* doBits( CL_NS(index)::IndexReader* reader ); bool doShouldDeleteBitSet( CL_NS(util)::BitSet* bits ); public: CachingWrapperFilter( Filter* filter, bool deleteFilter=true ); ~CachingWrapperFilter(); Filter *clone() const; TCHAR *toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/ChainedFilter.cpp000066400000000000000000000124351154025176300237450ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/util/Misc.h" #include "CLucene/util/BitSet.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/index/IndexReader.h" #include "ChainedFilter.h" CL_NS_DEF(search) CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(document) ChainedFilter::ChainedFilter( Filter ** _filters, int _op ): Filter(), filters(_filters), logicArray(NULL), logic(_op) { } ChainedFilter::ChainedFilter( Filter** _filters, int* _array ): Filter(), filters(_filters), logicArray(_array), logic(-1) { } ChainedFilter::ChainedFilter( const ChainedFilter& copy ) : Filter(copy), logicArray( copy.logicArray ), logic( copy.logic ) { filters = copy.filters; } ChainedFilter::~ChainedFilter(void) { } Filter* ChainedFilter::clone() const { return _CLNEW ChainedFilter(*this ); } const TCHAR* ChainedFilter::getLogicString(int logic){ if ( logic == ChainedFilter::OR ) return _T("OR"); else if ( logic == ChainedFilter::AND ) return _T("AND"); else if ( logic == ChainedFilter::ANDNOT ) return _T("ANDNOT"); else if ( logic == ChainedFilter::XOR ) return _T("XOR"); else if ( logic >= ChainedFilter::USER ){ return _T("USER"); } return _T(""); } TCHAR* ChainedFilter::toString() { Filter** filter = filters; StringBuffer buf(_T("ChainedFilter: [")); int* la = logicArray; while(*filter ) { if ( filter != filters ) buf.appendChar(' '); buf.append(getLogicString(logic==-1?*la:logic)); buf.appendChar(' '); TCHAR* filterstr = (*filter)->toString(); buf.append(filterstr); _CLDELETE_ARRAY( filterstr ); filter++; if ( logic == -1 ) la++; } buf.appendChar(']'); return buf.toString(); } /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ BitSet* ChainedFilter::bits( IndexReader* reader ) { if( logic != -1 ) return bits( reader, logic ); else if( logicArray != NULL ) return bits( reader, logicArray ); else return bits( reader, DEFAULT ); } BitSet* ChainedFilter::bits( IndexReader* reader, int logic ) { BitSet* bts = NULL; Filter** filter = filters; // see discussion at top of file if( *filter ) { BitSet* tmp = (*filter)->bits( reader ); if ( (*filter)->shouldDeleteBitSet(tmp) ) //if we are supposed to delete this BitSet, then bts = tmp; //we can safely call it our own else if ( tmp == NULL ){ int32_t len = reader->maxDoc(); bts = _CLNEW BitSet( len ); //bitset returned null, which means match _all_ for (int32_t i=0;iset(i); }else{ bts = tmp->clone(); //else it is probably cached, so we need to copy it before using it. } filter++; } else bts = _CLNEW BitSet( reader->maxDoc() ); while( *filter ) { doChain( bts, reader, logic, *filter ); filter++; } return bts; } BitSet* ChainedFilter::bits( IndexReader* reader, int* _logicArray ) { BitSet* bts = NULL; Filter** filter = filters; int* logic = _logicArray; // see discussion at top of file if( *filter ) { BitSet* tmp = (*filter)->bits( reader ); if ( (*filter)->shouldDeleteBitSet(tmp) ) //if we are supposed to delete this BitSet, then bts = tmp; //we can safely call it our own else if ( tmp == NULL ){ int32_t len = reader->maxDoc(); bts = _CLNEW BitSet( len ); //bitset returned null, which means match _all_ for (int32_t i=0;iset(i); //todo: this could mean that we can skip certain types of filters } else { bts = tmp->clone(); //else it is probably cached, so we need to copy it before using it. } filter++; logic++; } else bts = _CLNEW BitSet( reader->maxDoc() ); while( *filter ) { doChain( bts, reader, *logic, *filter ); filter++; logic++; } return bts; } void ChainedFilter::doUserChain( CL_NS(util)::BitSet* /*chain*/, CL_NS(util)::BitSet* /*filter*/, int /*logic*/ ){ _CLTHROWA(CL_ERR_Runtime,"User chain logic not implemented by superclass"); } BitSet* ChainedFilter::doChain( BitSet* resultset, IndexReader* reader, int logic, Filter* filter ) { BitSet* filterbits = filter->bits( reader ); int32_t maxDoc = reader->maxDoc(); int32_t i=0; if ( logic >= ChainedFilter::USER ){ doUserChain(resultset,filterbits,logic); }else{ switch( logic ) { case OR: for( i=0; i < maxDoc; i++ ) resultset->set( i, (resultset->get(i) || (filterbits==NULL || filterbits->get(i) ))?1:0 ); break; case AND: for( i=0; i < maxDoc; i++ ) resultset->set( i, (resultset->get(i) && (filterbits==NULL || filterbits->get(i) ))?1:0 ); break; case ANDNOT: for( i=0; i < maxDoc; i++ ) resultset->set( i, (resultset->get(i) && (filterbits==NULL || filterbits->get(i)))?0:1 ); break; case XOR: for( i=0; i < maxDoc; i++ ) resultset->set( i, resultset->get(i) ^ ((filterbits==NULL || filterbits->get(i) )?1:0) ); break; default: doChain( resultset, reader, DEFAULT, filter ); } } if ( filter->shouldDeleteBitSet(filterbits) ) _CLDELETE( filterbits ); return resultset; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/ChainedFilter.h000066400000000000000000000062161154025176300234120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_ChainedFilter_ #define _lucene_search_ChainedFilter_ //#include "CLucene/index/IndexReader.h" //#include "CLucene/util/BitSet.h" #include "Filter.h" CL_NS_DEF(search) /* Discussion - brian@unixpoet.com From ChainedFilter.java: ... // First AND operation takes place against a completely false // bitset and will always return zero results. Thanks to // Daniel Armbrust for pointing this out and suggesting workaround. if (logic[0] == AND) { result = (BitSet) chain[i].bits(reader).clone(); ++i; } ... The observation is correct and it was buggy. The problem is that the same issue remains for the ANDNOT logic op but with the inverse result: all bits set to 1. The result of the other ops, i.e. OR, AND, XOR for the first filter ends up just copying the bitset of the first filter (explicitly in the case of the AND). Why not do the same for the NAND? This will have the side effect of rendering the first op in the logic array superflous - not a big problem. The only "problem" is that we will return different results then the Java Lucene code - though I prefer CLucene to be a correct implementation and only maintain API compat rather than full 100% compat with Lucene. */ class CLUCENE_EXPORT ChainedFilter: public Filter { public: LUCENE_STATIC_CONSTANT(int, OR = 0); //set current bit if the chain is set OR if the filter bit is set LUCENE_STATIC_CONSTANT(int, AND = 1); //set current bit if the chain is set AND the filter bit is set LUCENE_STATIC_CONSTANT(int, ANDNOT = 2); //set current bit if the chain is not set AND the filter bit is not set LUCENE_STATIC_CONSTANT(int, XOR = 3); //set current bit if the chain is set OR the filter bit is set BUT not both is set LUCENE_STATIC_CONSTANT(int, USER = 5); //add this value to user defined value, then override doUserChain LUCENE_STATIC_CONSTANT(int, DEFAULT = OR); protected: Filter **filters; int *logicArray; int logic; ChainedFilter( const ChainedFilter& copy ); CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader, int logic ); CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader, int* logicArray ); CL_NS(util)::BitSet* doChain( CL_NS(util)::BitSet* result, CL_NS(index)::IndexReader* reader, int logic, Filter* filter ); virtual void doUserChain( CL_NS(util)::BitSet* chain, CL_NS(util)::BitSet* filter, int logic ); virtual const TCHAR* getLogicString(int logic); public: ChainedFilter( Filter** filters, int op = DEFAULT ); ChainedFilter( Filter** filters, int* _array ); virtual ~ChainedFilter(); /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader ); virtual Filter* clone() const; TCHAR* toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/Compare.cpp000066400000000000000000000070441154025176300226320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Compare.h" #include "SearchHeader.h" CL_NS_DEF(search) ScoreDocComparators::ScoreDocComparators(){} ScoreDocComparators::~ScoreDocComparators(){ } int32_t ScoreDocComparators::Relevance::compare (struct ScoreDoc* i, struct ScoreDoc* j) { if (i->score > j->score) return -1; if (i->score < j->score) return 1; return 0; } CL_NS(util)::Comparable* ScoreDocComparators::Relevance::sortValue (struct ScoreDoc* i) { return _CLNEW CL_NS(util)::Compare::Float (i->score); } int32_t ScoreDocComparators::Relevance::sortType() { return SortField::DOCSCORE; } ScoreDocComparators::IndexOrder::IndexOrder(): ScoreDocComparator() { } int32_t ScoreDocComparators::IndexOrder::compare (struct ScoreDoc* i, struct ScoreDoc* j) { if (i->doc < j->doc) return -1; if (i->doc > j->doc) return 1; return 0; } CL_NS(util)::Comparable* ScoreDocComparators::IndexOrder::sortValue (struct ScoreDoc* i) { return _CLNEW CL_NS(util)::Compare::Int32(i->doc); } int32_t ScoreDocComparators::IndexOrder::sortType() { return SortField::DOC; } ScoreDocComparators::String::String(FieldCache::StringIndex* index, int32_t len) { this->length = len; this->index = index; } int32_t ScoreDocComparators::String::compare (struct ScoreDoc* i, struct ScoreDoc* j) { CND_PRECONDITION(i->docdoc>=length") CND_PRECONDITION(j->docdoc>=length") if (index->order[i->doc] < index->order[j->doc]) return -1; if (index->order[i->doc] > index->order[j->doc]) return 1; return 0; } CL_NS(util)::Comparable* ScoreDocComparators::String::sortValue (struct ScoreDoc* i) { return _CLNEW CL_NS(util)::Compare::TChar(index->lookup[index->order[i->doc]]); } int32_t ScoreDocComparators::String::sortType() { return SortField::STRING; } ScoreDocComparators::Int32::Int32(int32_t* fieldOrder, int32_t len) { this->fieldOrder = fieldOrder; this->length = len; } int32_t ScoreDocComparators::Int32::compare (struct ScoreDoc* i, struct ScoreDoc* j) { CND_PRECONDITION(i->docdoc>=length") CND_PRECONDITION(j->docdoc>=length") if (fieldOrder[i->doc] < fieldOrder[j->doc]) return -1; if (fieldOrder[i->doc] > fieldOrder[j->doc]) return 1; return 0; } CL_NS(util)::Comparable* ScoreDocComparators::Int32::sortValue (struct ScoreDoc* i) { CND_PRECONDITION(i->docdoc>=length") return _CLNEW CL_NS(util)::Compare::Int32(fieldOrder[i->doc]); } int32_t ScoreDocComparators::Int32::sortType() { return SortField::INT; } ScoreDocComparators::Float::Float(float_t* fieldOrder, int32_t len) { this->fieldOrder = fieldOrder; this->length = len; } int32_t ScoreDocComparators::Float::compare (struct ScoreDoc* i, struct ScoreDoc* j) { CND_PRECONDITION(i->docdoc>=length") CND_PRECONDITION(j->docdoc>=length") if (fieldOrder[i->doc] < fieldOrder[j->doc]) return -1; if (fieldOrder[i->doc] > fieldOrder[j->doc]) return 1; return 0; } CL_NS(util)::Comparable* ScoreDocComparators::Float::sortValue (struct ScoreDoc* i) { CND_PRECONDITION(i->docdoc>=length") return _CLNEW CL_NS(util)::Compare::Float(fieldOrder[i->doc]); } int32_t ScoreDocComparators::Float::sortType() { return SortField::FLOAT; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Compare.h000066400000000000000000000040011154025176300222650ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Compare_ #define _lucene_search_Compare_ //#include "FieldSortedHitQueue.h" #include "Sort.h" #include "FieldCache.h" CL_NS_DEF(search) class CLUCENE_EXPORT ScoreDocComparators:LUCENE_BASE { protected: ScoreDocComparators(); public: ~ScoreDocComparators(); class CLUCENE_EXPORT Relevance:public ScoreDocComparator { public: int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j); CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i); int32_t sortType(); }; class CLUCENE_EXPORT IndexOrder:public ScoreDocComparator{ public: IndexOrder(); int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j); CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i); int32_t sortType(); }; class CLUCENE_EXPORT String: public ScoreDocComparator { FieldCache::StringIndex* index; int32_t length; public: String(FieldCache::StringIndex* index, int32_t len); int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j); CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i); int32_t sortType(); }; class CLUCENE_EXPORT Int32:public ScoreDocComparator{ int32_t* fieldOrder; int32_t length; public: Int32(int32_t* fieldOrder, int32_t len); int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j); CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i); int32_t sortType(); }; class CLUCENE_EXPORT Float:public ScoreDocComparator { float_t* fieldOrder; int32_t length; public: Float(float_t* fieldOrder, int32_t len); int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j); CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i); int32_t sortType(); }; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/ConjunctionScorer.cpp000066400000000000000000000102411154025176300247040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_ConjunctionScorer.h" #include "Similarity.h" #include "CLucene/util/_Arrays.h" #include #include CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) ConjunctionScorer::ConjunctionScorer(Similarity* similarity, ScorersType* _scorers): Scorer(similarity), firstTime(true), more(false), coord(0.0), lastDoc(-1) { this->scorers = _CLNEW CL_NS(util)::ObjectArray(_scorers->size()); _scorers->toArray(this->scorers->values); coord = getSimilarity()->coord(this->scorers->length, this->scorers->length); } ConjunctionScorer::ConjunctionScorer(Similarity* similarity, const CL_NS(util)::ArrayBase* _scorers): Scorer(similarity), firstTime(true), more(false), coord(0.0), lastDoc(-1) { this->scorers = _CLNEW CL_NS(util)::ObjectArray(_scorers->length); memcpy(this->scorers->values, _scorers->values, _scorers->length * sizeof(Scorer*)); coord = getSimilarity()->coord(this->scorers->length, this->scorers->length); } ConjunctionScorer::~ConjunctionScorer(){ _CLLDELETE(scorers); } TCHAR* ConjunctionScorer::toString(){ return stringDuplicate(_T("ConjunctionScorer")); } int32_t ConjunctionScorer::doc() const{ return lastDoc; } bool ConjunctionScorer::next() { if (firstTime) { init(0); } else if (more) { more = scorers->values[(scorers->length-1)]->next(); } return doNext(); } bool ConjunctionScorer::doNext() { int32_t first=0; Scorer* lastScorer = scorers->values[scorers->length-1]; Scorer* firstScorer; while (more && (firstScorer=scorers->values[first])->doc() < (lastDoc=lastScorer->doc())) { more = firstScorer->skipTo(lastDoc); lastScorer = firstScorer; first = (first == (scorers->length-1)) ? 0 : first+1; } return more; } bool ConjunctionScorer::skipTo(int32_t target) { if (firstTime) return init(target); else if (more) more = scorers->values[(scorers->length-1)]->skipTo(target); return doNext(); } int ConjunctionScorer_sort(const void* _elem1, const void* _elem2){ const Scorer* elem1 = *(const Scorer**)_elem1; const Scorer* elem2 = *(const Scorer**)_elem2; return elem1->doc() - elem2->doc(); } bool ConjunctionScorer::init(int32_t target) { firstTime = false; more = scorers->length>1; for (size_t i=0; ilength; i++) { more = target==0 ? scorers->values[i]->next() : scorers->values[i]->skipTo(target); if (!more) return false; } // Sort the array the first time... // We don't need to sort the array in any future calls because we know // it will already start off sorted (all scorers on same doc). // note that this comparator is not consistent with equals! qsort(scorers->values,scorers->length, sizeof(Scorer*), ConjunctionScorer_sort); doNext(); // If first-time skip distance is any predictor of // scorer sparseness, then we should always try to skip first on // those scorers. // Keep last scorer in it's last place (it will be the first // to be skipped on), but reverse all of the others so that // they will be skipped on in order of original high skip. int32_t end=(scorers->length-1)-1; for (int32_t i=0; i<(end>>1); i++) { Scorer* tmp = scorers->values[i]; scorers->values[i] = scorers->values[end-i]; scorers->values[end-i] = tmp; } return more; } float_t ConjunctionScorer::score(){ float_t sum = 0.0f; for (size_t i = 0; i < scorers->length; i++) { sum += scorers->values[i]->score(); } return sum * coord; } Explanation* ConjunctionScorer::explain(int32_t /*doc*/) { _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: ConjunctionScorer::explain"); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/ConstantScoreQuery.cpp000066400000000000000000000232241154025176300250550ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "ConstantScoreQuery.h" #include "SearchHeader.h" #include "Scorer.h" #include "RangeFilter.h" #include "Similarity.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/BitSet.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/Misc.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) class ConstantScorer : public Scorer { BitSet* bits; const float_t theScore; int32_t _doc; public: ConstantScorer(Similarity* similarity, IndexReader* reader, Weight* w, Filter* filter) : Scorer(similarity), bits(filter->bits(reader)), theScore(w->getValue()), _doc(-1) { } virtual ~ConstantScorer() { _CLLDELETE(bits); } bool next() { _doc = bits->nextSetBit(_doc+1); return _doc >= 0; } int32_t doc() const { return _doc; } float_t score() { return theScore; } bool skipTo(int32_t target) { _doc = bits->nextSetBit(target); return _doc >= 0; } Explanation* explain(int32_t /*doc*/) { _CLTHROWA(CL_ERR_UnsupportedOperation, "Unsupported operation at ConstantScoreQuery::explain"); } TCHAR* toString(){ return STRDUP_TtoT(_T("ConstantScorer")); } friend class ConstantWeight; }; class ConstantWeight : public Weight { private: Similarity* similarity; float_t queryNorm; float_t queryWeight; const ConstantScoreQuery* parentQuery; public: ConstantWeight(ConstantScoreQuery* enclosingInstance, Searcher* searcher) : similarity(enclosingInstance->getSimilarity(searcher)), queryNorm(0), queryWeight(0), parentQuery(enclosingInstance) { } virtual ~ConstantWeight(){} Query* getQuery() { return (Query*)parentQuery; } float_t getValue() { return queryWeight; } float_t sumOfSquaredWeights() { queryWeight = parentQuery->getBoost(); return queryWeight * queryWeight; } void normalize(float_t norm) { this->queryNorm = norm; queryWeight *= this->queryNorm; } Scorer* scorer(IndexReader* reader) { return _CLNEW ConstantScorer(similarity, reader, this, parentQuery->filter); } Explanation* explain(IndexReader* reader, int32_t doc) { ConstantScorer* cs = (ConstantScorer*)scorer(reader); bool exists = cs->bits->get(doc); _CLDELETE(cs); ComplexExplanation* result = _CLNEW ComplexExplanation(); if (exists) { StringBuffer buf(100); buf.append(_T("ConstantScoreQuery(")); TCHAR* tmp = parentQuery->filter->toString(); buf.append(tmp); _CLDELETE_LCARRAY(tmp); buf.append(_T("), product of:")); result->setDescription(buf.getBuffer()); result->setValue(queryWeight); result->setMatch(true); result->addDetail(_CLNEW Explanation(parentQuery->getBoost(), _T("boost"))); result->addDetail(_CLNEW Explanation(queryNorm, _T("queryNorm"))); } else { StringBuffer buf(100); buf.append(_T("ConstantScoreQuery(")); TCHAR* tmp = parentQuery->filter->toString(); buf.append(tmp); _CLDELETE_LCARRAY(tmp); buf.append(_T(") doesn't match id ")); buf.appendInt(doc); result->setDescription(buf.getBuffer()); result->setValue(0); result->setMatch(true); } _CLLDELETE(cs); return result; } }; ConstantScoreQuery::ConstantScoreQuery(Filter* _filter) : filter(_filter) { } ConstantScoreQuery::~ConstantScoreQuery() { _CLLDELETE(filter); } Filter* ConstantScoreQuery::getFilter() const { return filter; } Query* ConstantScoreQuery::rewrite(IndexReader* reader) { return this; } void ConstantScoreQuery::extractTerms( TermSet * termset ) const { // OK to not add any terms when used for MultiSearcher, // but may not be OK for highlighting } Weight* ConstantScoreQuery::_createWeight(Searcher* searcher) { return _CLNEW /*ConstantScoreQuery::*/ConstantWeight(this, searcher); } TCHAR* ConstantScoreQuery::toString(const TCHAR* /*field*/) const { StringBuffer buf; buf.append(_T("ConstantScore(")); TCHAR* tmp = filter->toString(); buf.append(tmp); _CLLDELETE(tmp); buf.appendBoost(getBoost()); buf.appendChar(_T(')')); return buf.giveBuffer(); } // TODO: Filter is missing an equals() function, hence this equals() is incomplete bool ConstantScoreQuery::equals(Query* o) const { if (this == o) return true; if (!(o->instanceOf("ConstantScoreQuery"))) return false; ConstantScoreQuery* other = (ConstantScoreQuery*)o; return this->getBoost()==other->getBoost() /*&& filter->equals(other->filter)*/; } // TODO: Filter is missing hashCode() size_t ConstantScoreQuery::hashCode() const { // Simple add is OK since no existing filter hashcode has a float component. //return filter->hashCode() + FloatToIntBits(getBoost()); return 0; } ConstantScoreQuery::ConstantScoreQuery( const ConstantScoreQuery& copy ) : filter(copy.getFilter()->clone()) { } const char* ConstantScoreQuery::getObjectName() const { return "ConstantScoreQuery"; } Query* ConstantScoreQuery::clone() const{ return _CLNEW ConstantScoreQuery(*this); } ConstantScoreRangeQuery::ConstantScoreRangeQuery( const ConstantScoreRangeQuery& copy ): fieldName(const_cast(CLStringIntern::intern(copy.fieldName))), lowerVal(STRDUP_TtoT(copy.lowerVal)), upperVal(STRDUP_TtoT(copy.upperVal)), includeLower(copy.includeLower),includeUpper(copy.includeUpper) { } ConstantScoreRangeQuery::ConstantScoreRangeQuery(const TCHAR* _fieldName, const TCHAR* _lowerVal, const TCHAR* _upperVal, bool _includeLower, bool _includeUpper) : fieldName(NULL), lowerVal(NULL), upperVal(NULL) { // do a little bit of normalization... // open ended range queries should always be inclusive. if (_lowerVal==NULL) { _includeLower=true; } else if (_includeLower && _tcscmp(_lowerVal, _T(""))==0) { _lowerVal=NULL; } if (_upperVal==NULL) { _includeUpper=true; } this->fieldName = const_cast(CLStringIntern::intern(_fieldName)); // intern it, just like terms... if (_lowerVal != NULL) this->lowerVal = STRDUP_TtoT(_lowerVal); if (_upperVal != NULL) this->upperVal = STRDUP_TtoT(_upperVal); this->includeLower = _includeLower; this->includeUpper = _includeUpper; } ConstantScoreRangeQuery::~ConstantScoreRangeQuery(){ _CLDELETE_LCARRAY(lowerVal); _CLDELETE_LCARRAY(upperVal); CLStringIntern::unintern(this->fieldName); } Query* ConstantScoreRangeQuery::rewrite(CL_NS(index)::IndexReader* reader) { // Map to RangeFilter semantics which are slightly different... const TCHAR* lowerSafe = lowerVal!=NULL?lowerVal:_T(""); RangeFilter* rangeFilt = _CLNEW RangeFilter(fieldName, lowerSafe, upperVal, (_tcscmp(lowerSafe, _T(""))==0)?false:includeLower, upperVal==NULL?false:includeUpper); Query* q = _CLNEW ConstantScoreQuery(rangeFilt); q->setBoost(getBoost()); return q; } TCHAR* ConstantScoreRangeQuery::toString(const TCHAR* field) const { StringBuffer buffer(30); if (_tcscmp(getField(), field) != 0) { buffer.append(getField()); buffer.appendChar(_T(':')); } buffer.appendChar(includeLower ? _T('[') : _T('{')); buffer.append(lowerVal != NULL ? lowerVal : _T("*")); buffer.append(_T(" TO ")); buffer.append(upperVal != NULL ? upperVal : _T("*")); buffer.appendChar(includeUpper ? _T(']') : _T('}')); buffer.appendBoost(getBoost()); return buffer.giveBuffer(); } bool ConstantScoreRangeQuery::equals(Query* o) const { if (this == o) return true; if (!(o->instanceOf("ConstantScoreRangeQuery"))) return false; ConstantScoreRangeQuery* other = (ConstantScoreRangeQuery*) o; if (this->fieldName != other->fieldName // interned comparison || this->includeLower != other->includeLower || this->includeUpper != other->includeUpper ) { return false; } if (this->lowerVal != NULL ? _tcscmp(this->lowerVal, other->lowerVal) != 0 : other->lowerVal != NULL) return false; if (this->upperVal != NULL ? _tcscmp(this->upperVal, other->upperVal) != 0 : other->upperVal != NULL) return false; return this->getBoost() == other->getBoost(); } // TODO: Complete this size_t ConstantScoreRangeQuery::hashCode() const { int32_t h = Similarity::floatToByte( getBoost() ) ^ Misc::thashCode( fieldName ); // hashCode of "" is 0, so don't use that for null... h ^= ( lowerVal != NULL ) ? Misc::thashCode( lowerVal ) : 0x965a965a; // don't just XOR upperVal with out mixing either it or h, as it will cancel // out lowerVal if they are equal. h ^= (h << 17) | (h >> 16); // a reversible (one to one) 32 bit mapping mix h ^= (upperVal != NULL) ? Misc::thashCode( upperVal ) : 0x5a695a69; h ^= (includeLower ? 0x665599aa : 0) ^ (includeUpper ? 0x99aa5566 : 0); return h; } const char* ConstantScoreRangeQuery::getObjectName() const { return "ConstantScoreRangeQuery"; } Query* ConstantScoreRangeQuery::clone() const{ return _CLNEW ConstantScoreRangeQuery(*this); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/ConstantScoreQuery.h000066400000000000000000000075171154025176300245310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_ConstantScoreQuery_ #define _lucene_search_ConstantScoreQuery_ CL_CLASS_DEF(index,IndexReader) #include "Query.h" #include "Filter.h" #include "Explanation.h" CL_NS_DEF(search) /** * A query that wraps a filter and simply returns a constant score equal to the * query boost for every document in the filter. * */ class CLUCENE_EXPORT ConstantScoreQuery : public Query { protected: Filter* filter; public: /** * Constructs a new ConstantScoreQuery, and takes ownership of the filter object * * @memory this object consumes _filter */ ConstantScoreQuery(Filter* _filter); virtual ~ConstantScoreQuery(); /** Returns the encapsulated filter */ Filter* getFilter() const; Query* rewrite(CL_NS(index)::IndexReader* reader); /** Constant score query does not return any terms */ void extractTerms( TermSet * termset ) const; protected: Weight* _createWeight(Searcher* searcher); public: /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* field) const; /** Returns true if o is equal to this. */ bool equals(Query* o) const; /** Returns a hash code value for this object. */ size_t hashCode() const; const char* getObjectName() const; static const char* getClassName(){ return "ConstantScoreQuery"; } Query* clone() const; friend class ConstantWeight; protected: ConstantScoreQuery( const ConstantScoreQuery& copy ); }; /** * A range query that returns a constant score equal to its boost for * all documents in the range. *

* It does not have an upper bound on the number of clauses covered in the range. *

* If an endpoint is null, it is said to be "open". * Either or both endpoints may be open. Open endpoints may not be exclusive * (you can't select all but the first or last term without explicitly specifying the term to exclude.) * */ class CLUCENE_EXPORT ConstantScoreRangeQuery : public Query { private: TCHAR* fieldName; TCHAR* lowerVal; TCHAR* upperVal; bool includeLower; bool includeUpper; public: ConstantScoreRangeQuery(const TCHAR* _fieldName, const TCHAR* _lowerVal, const TCHAR* _upperVal, bool _includeLower, bool _includeUpper); virtual ~ConstantScoreRangeQuery(); /** Returns the field name for this query */ TCHAR* getField() const { return fieldName; } /** Returns the value of the lower endpoint of this range query, null if open ended */ TCHAR* getLowerVal() const { return lowerVal; } /** Returns the value of the upper endpoint of this range query, null if open ended */ TCHAR* getUpperVal() const { return upperVal; } /** Returns true if the lower endpoint is inclusive */ bool includesLower() const { return includeLower; } /** Returns true if the upper endpoint is inclusive */ bool includesUpper() const { return includeUpper; } Query* rewrite(CL_NS(index)::IndexReader* reader); /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* field) const; /** Returns true if o is equal to this. */ bool equals(Query* o) const; /** Returns a hash code value for this object.*/ size_t hashCode() const; const char* getObjectName() const; static const char* getClassName(){ return "ConstantScoreRangeQuery"; } Query* clone() const; protected: ConstantScoreRangeQuery( const ConstantScoreRangeQuery& copy ); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/DateFilter.cpp000066400000000000000000000056561154025176300232760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "DateFilter.h" #include "CLucene/document/DateField.h" #include "CLucene/index/Term.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/Terms.h" #include "CLucene/util/BitSet.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(document) CL_NS_DEF(search) DateFilter::~DateFilter(){ _CLDECDELETE( start ); _CLDECDELETE( end ); } DateFilter::DateFilter(const DateFilter& copy): start( _CL_POINTER(copy.start) ), end ( _CL_POINTER(copy.end) ) { } /** Constructs a filter for field f matching times between from and to. */ DateFilter::DateFilter(const TCHAR* f, int64_t from, int64_t to) { TCHAR* tmp = DateField::timeToString(from); start = _CLNEW Term(f, tmp); _CLDELETE_CARRAY(tmp); tmp = DateField::timeToString(to); end = _CLNEW Term(start, tmp); _CLDELETE_CARRAY(tmp); } /** Constructs a filter for field f matching times before time. */ DateFilter* DateFilter::Before(const TCHAR* field, int64_t time) { return _CLNEW DateFilter(field, 0,time); } /** Constructs a filter for field f matching times after time. */ DateFilter* DateFilter::After(const TCHAR* field, int64_t time) { return _CLNEW DateFilter(field,time, DATEFIELD_DATE_MAX ); } /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ BitSet* DateFilter::bits(IndexReader* reader) { BitSet* bts = _CLNEW BitSet(reader->maxDoc()); TermEnum* enumerator = reader->terms(start); if (enumerator->term(false) == NULL){ _CLDELETE(enumerator); return bts; } TermDocs* termDocs = reader->termDocs(); try { while (enumerator->term(false)->compareTo(end) <= 0) { termDocs->seek(enumerator->term(false)); while (termDocs->next()) { bts->set(termDocs->doc()); } if (!enumerator->next()) { break; } } } _CLFINALLY ( termDocs->close(); _CLDELETE(termDocs); enumerator->close(); _CLDELETE(enumerator); ); return bts; } Filter* DateFilter::clone() const{ return _CLNEW DateFilter(*this); } TCHAR* DateFilter::toString(){ size_t len = _tcslen(start->field()) + start->textLength() + end->textLength() + 8; TCHAR* ret = _CL_NEWARRAY(TCHAR,len); ret[0]=0; _sntprintf(ret,len,_T("%s: [%s-%s]"), start->field(),start->text(),end->text()); return ret; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/DateFilter.h000066400000000000000000000035541154025176300227360ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_DateFilter_ #define _lucene_search_DateFilter_ //#include "CLucene/document/DateField.h" CL_CLASS_DEF(index,Term) //#include "CLucene/index/Terms.h" //#include "CLucene/index/IndexReader.h" //#include "CLucene/util/BitSet.h" #include "Filter.h" CL_NS_DEF(search) // Deprecated. Instead, use RangeFilter combined with DateTools. /** * A Filter that restricts search results to a range of time. * *

For this to work, documents must have been indexed with a * {@link DateField}. */ class CLUCENE_EXPORT DateFilter: public Filter { private: CL_NS(index)::Term* start; CL_NS(index)::Term* end; protected: DateFilter(const DateFilter& copy); public: ~DateFilter(); /** Constructs a filter for field f matching times between from and to. */ DateFilter(const TCHAR* f, int64_t from, int64_t to); /** Constructs a filter for field f matching times before time. */ static DateFilter* Before(const TCHAR* field, int64_t time) ; /** Constructs a filter for field f matching times after time. */ static DateFilter* After(const TCHAR* field, int64_t time) ; /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ CL_NS(util)::BitSet* bits(CL_NS(index)::IndexReader* reader) ; Filter* clone() const; TCHAR* toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/DisjunctionSumScorer.cpp000066400000000000000000000116421154025176300253770ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Scorer.h" #include "ScorerDocQueue.h" #include "SearchHeader.h" #include "Explanation.h" #include "CLucene/util/StringBuffer.h" #include "_DisjunctionSumScorer.h" CL_NS_DEF(search) DisjunctionSumScorer::DisjunctionSumScorer( DisjunctionSumScorer::ScorersType* _subScorers, const int32_t _minimumNrMatchers ) : Scorer( NULL ), minimumNrMatchers(_minimumNrMatchers), scorerDocQueue(NULL), queueSize(-1), currentDoc(-1), currentScore(-1.0f), nrScorers(0), _nrMatchers(-1) { if ( minimumNrMatchers <= 0 ) { _CLTHROWA(CL_ERR_IllegalArgument,"Minimum nr of matchers must be positive"); } nrScorers = _subScorers->size(); if ( nrScorers <= 1 ) { _CLTHROWA(CL_ERR_IllegalArgument,"There must be at least 2 subScorers"); } for ( DisjunctionSumScorer::ScorersType::iterator itr = _subScorers->begin(); itr != _subScorers->end(); itr++ ) { subScorers.push_back( *itr ); } } DisjunctionSumScorer::~DisjunctionSumScorer() { _CLLDELETE( scorerDocQueue ); } void DisjunctionSumScorer::score( HitCollector* hc ) { while( next() ) { hc->collect( currentDoc, currentScore ); } } bool DisjunctionSumScorer::next() { if ( scorerDocQueue == NULL ) { initScorerDocQueue(); } return ( scorerDocQueue->size() >= minimumNrMatchers ) && advanceAfterCurrent(); } float_t DisjunctionSumScorer::score() { return currentScore; } int32_t DisjunctionSumScorer::doc() const { return currentDoc; } int32_t DisjunctionSumScorer::nrMatchers() const { return _nrMatchers; } bool DisjunctionSumScorer::skipTo( int32_t target ) { if ( scorerDocQueue == NULL ) { initScorerDocQueue(); } if ( queueSize < minimumNrMatchers ) { return false; } if ( target <= currentDoc ) { return true; } do { if ( scorerDocQueue->topDoc() >= target ) { return advanceAfterCurrent(); } else if ( !scorerDocQueue->topSkipToAndAdjustElsePop( target )) { if ( --queueSize < minimumNrMatchers ) { return false; } } } while ( true ); } TCHAR* DisjunctionSumScorer::toString() { return stringDuplicate(_T("DisjunctionSumScorer")); } Explanation* DisjunctionSumScorer::explain( int32_t doc ){ Explanation* res = _CLNEW Explanation(); float_t sumScore = 0.0f; int32_t nrMatches = 0; ScorersType::iterator ssi = subScorers.begin(); while (ssi != subScorers.end()) { Explanation* es = reinterpret_cast(*ssi)->explain(doc); if (es->getValue() > 0.0f) { // indicates match sumScore += es->getValue(); nrMatches++; } res->addDetail(es); ++ssi; } CL_NS(util)::StringBuffer buf(50); if (_nrMatchers >= minimumNrMatchers) { buf.append(_T("sum over at least ")); buf.appendInt(minimumNrMatchers); buf.append(_T(" of ")); buf.appendInt(subScorers.size()); buf.appendChar(_T(':')); res->setValue(sumScore); res->setDescription(buf.getBuffer()); } else { buf.appendInt(nrMatches); buf.append(_T(" match(es) but at least ")); buf.appendInt(minimumNrMatchers); buf.append(_T(" of ")); buf.appendInt(subScorers.size()); buf.append(_T(" needed")); res->setValue(0.0f); res->setDescription(buf.getBuffer()); } return res; } bool DisjunctionSumScorer::score( HitCollector* hc, const int32_t max ) { while ( currentDoc < max ) { hc->collect( currentDoc, currentScore ); if ( !next() ) { return false; } } return true; } bool DisjunctionSumScorer::advanceAfterCurrent() { do { // repeat until minimum nr of matchers currentDoc = scorerDocQueue->topDoc(); currentScore = scorerDocQueue->topScore(); _nrMatchers = 1; do { // Until all subscorers are after currentDoc if ( !scorerDocQueue->topNextAndAdjustElsePop() ) { if ( --queueSize == 0 ) { break; // nothing more to advance, check for last match. } } if ( scorerDocQueue->topDoc() != currentDoc ) { break; // All remaining subscorers are after currentDoc. } currentScore += scorerDocQueue->topScore(); _nrMatchers++; } while( true ); if ( _nrMatchers >= minimumNrMatchers ) { return true; } else if ( queueSize < minimumNrMatchers ) { return false; } } while( true ); } void DisjunctionSumScorer::initScorerDocQueue() { // No need to _CLLDELETE here since this function since this function is only called if scorerDocQueue==NULL scorerDocQueue = _CLNEW ScorerDocQueue( nrScorers ); queueSize = 0; for ( ScorersType::iterator it = subScorers.begin(); it != subScorers.end(); ++it ) { Scorer* scorer = (Scorer*)(*it); if ( scorer->next() ) { // doc() method will be used in scorerDocQueue. if ( scorerDocQueue->insert( scorer )) { queueSize++; } } } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/ExactPhraseScorer.cpp000066400000000000000000000060401154025176300246240ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/Terms.h" #include "SearchHeader.h" #include "SearchHeader.h" #include "Scorer.h" #include "_ExactPhraseScorer.h" CL_NS_USE(index) CL_NS_DEF(search) ExactPhraseScorer::ExactPhraseScorer(Weight* weight, TermPositions** tps, int32_t* offsets, Similarity* similarity, uint8_t* norms): PhraseScorer(weight, tps, offsets, similarity, norms){ //Func - Constructor //Pre - tps != NULL // tpsLength >= 0 // n != NULL //Post - Instance has been created CND_PRECONDITION(tps != NULL,"tps is NULL"); CND_PRECONDITION(tps[0] != NULL,"tps is NULL"); //CND_PRECONDITION(n != NULL,"n is NULL") =this is checked already in PhraseScorer } ExactPhraseScorer::~ExactPhraseScorer(){} float_t ExactPhraseScorer::phraseFreq(){ //Func - Returns the freqency of the phrase //Pre - first != NULL // last != NULL // pq != NULL // size of the PhraseQueue pq is 0 //Post - The frequency of the phrase has been returned CND_PRECONDITION(first != NULL,"first is NULL"); CND_PRECONDITION(last != NULL,"last is NULL"); CND_PRECONDITION(pq != NULL,"pq is NULL"); CND_PRECONDITION(pq->size()==0,"pq is not empty"); // sort list with pq pq->clear(); //Add the nodes of the list of PhrasePositions and store them //into the PhraseQueue pq so it can used to build //a list of sorted nodes for (PhrasePositions* pp = first; pp != NULL; pp = pp->_next) { //Read the first TermPosition of the current PhrasePositions pp pp->firstPosition(); //Store the current PhrasePositions pp into the PhraseQueue pq pq->put(pp); } //pqToList requires that first and last be NULL when it's called. //This is done at the beginning of pqToList() //In this case, the nodes of the linked list are referenced by pq (see //above loop), so we can clear our pointers to the head and tail of the //linked list without fear of leaking the nodes. //rebuild list from pq pqToList(); // for counting how many times the exact phrase is found in current document, // just count how many times all PhrasePosition's have exactly the same position. int32_t freq = 0; do { //find position with all terms while (first->position < last->position){ //scan forward in first do{ if (!first->nextPosition()){ return (float_t)freq; } } while (first->position < last->position); //Make the current first node the last node in the list firstToLast(); } //all equal: a match has been found freq++; } while (last->nextPosition()); return (float_t)freq; } TCHAR* ExactPhraseScorer::toString(){ return stringDuplicate(_T("ExactPhraseScorer")); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Explanation.cpp000066400000000000000000000111521154025176300235210ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Explanation.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(util) CL_NS_DEF(search) Explanation::Explanation(float_t _value, const TCHAR* _description):value(_value),details(NULL) { _tcsncpy(this->description,_description,LUCENE_SEARCH_EXPLANATION_DESC_LEN); } Explanation::Explanation():value(0), details(NULL) { this->description[0]=0; } Explanation::Explanation(const Explanation& copy):details(NULL) { set(copy); } void Explanation::set(const Explanation& copy){ this->value = copy.value; _tcsncpy(description,copy.description,LUCENE_SEARCH_EXPLANATION_DESC_LEN); _CLDELETE(this->details); if (copy.details != NULL) { this->details = _CLNEW CL_NS(util)::CLArrayList >(true); CL_NS(util)::CLArrayList >::const_iterator itr; itr = copy.details->begin(); while ( itr != copy.details->end() ){ details->push_back( (*itr)->clone() ); ++itr; } } } Explanation* Explanation::clone() const{ return _CLNEW Explanation(*this); } Explanation::~Explanation(){ _CLLDELETE(this->details); } bool Explanation::isMatch() const { return (0.0f < getValue()); } float_t Explanation::getValue() const{ return value; } void Explanation::setValue(const float_t value) { this->value = value; } const TCHAR* Explanation::getDescription() const { return description; } void Explanation::setDescription(const TCHAR* description) { _tcsncpy(this->description,description,LUCENE_SEARCH_EXPLANATION_DESC_LEN); } TCHAR* Explanation::getSummary() { StringBuffer buf(210); buf.appendFloat(getValue(), 2); buf.append(_T(" = ")); buf.append(getDescription()); return buf.giveBuffer(); } size_t Explanation::getDetailsLength() const {return (details==NULL)?0:details->size();} void Explanation::getDetails(Explanation** ret) { if (details==NULL){ ret[0]=NULL; return; } size_t size = details->size(); for ( size_t i=0;iclone(); } ret[size] = NULL; } Explanation* Explanation::getDetail(const size_t i){return (*details)[i];} void Explanation::addDetail(Explanation* detail) { if (details==NULL) details = _CLNEW CL_NS(util)::CLArrayList >(true); details->push_back(detail); } TCHAR* Explanation::toString() { return toString(0); } TCHAR* Explanation::toString(int32_t depth) { StringBuffer buffer; for (int32_t i = 0; i < depth; i++) { buffer.append(_T(" ")); } TCHAR* tSum = getSummary(); buffer.append(tSum); _CLDELETE_LCARRAY(tSum); buffer.appendChar(_T('\n')); if (details != NULL){ for ( size_t j=0;jsize();j++ ){ TCHAR* tmp = (*details)[j]->toString(depth+1); buffer.append(tmp); _CLDELETE_LCARRAY(tmp); } } return buffer.toString(); } TCHAR* Explanation::toHtml() { StringBuffer buffer; TCHAR* tmp; buffer.append(_T("

    \n")); buffer.append(_T("
  • ")); TCHAR* tSum = getSummary(); buffer.append(tSum); _CLDELETE_LCARRAY(tSum); buffer.append(_T("
    \n")); if (details != NULL){ for ( size_t i=0;isize();i++ ){ tmp = (*details)[i]->toHtml(); buffer.append(tmp); _CLDELETE_LCARRAY(tmp); } } buffer.append(_T("
  • \n")); buffer.append(_T("
\n")); return buffer.toString(); } ComplexExplanation::ComplexExplanation():Explanation(){} ComplexExplanation::ComplexExplanation(const ComplexExplanation& copy): Explanation(copy) { this->match = copy.match; } ComplexExplanation::ComplexExplanation(const bool _match, const float_t _value, const TCHAR* _description): Explanation(_value, _description), match(_match) { } ComplexExplanation::~ComplexExplanation(){ } bool ComplexExplanation::getMatch() const { return match; } void ComplexExplanation::setMatch(const bool _match) { this->match = _match; } bool ComplexExplanation::isMatch() const {return getMatch();} TCHAR* ComplexExplanation::getSummary() { StringBuffer buf(220); buf.appendFloat(getValue(),2); buf.append(_T(" = ")); buf.append(isMatch() ? _T("(MATCH) ") : _T("(NON-MATCH) ")); buf.append(getDescription()); return buf.giveBuffer(); } Explanation* ComplexExplanation::clone() const{ return _CLNEW ComplexExplanation(*this); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Explanation.h000066400000000000000000000067321154025176300231760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Explanation #define _lucene_search_Explanation #include "CLucene/util/VoidList.h" CL_NS_DEF(search) #define LUCENE_SEARCH_EXPLANATION_DESC_LEN 200 /** Expert: Describes the score computation for document and query. */ class CLUCENE_EXPORT Explanation { private: float_t value; // the value of this node TCHAR description[LUCENE_SEARCH_EXPLANATION_DESC_LEN]; // what it represents CL_NS(util)::CLArrayList >* details; // sub-explanations public: Explanation(); Explanation(float_t _value, const TCHAR* _description); virtual ~Explanation(); /** * Indicates whether or not this Explanation models a good match. * *

* By default, an Explanation represents a "match" if the value is positive. *

* @see #getValue */ virtual bool isMatch() const; /** The value assigned to this explanation node. */ float_t getValue() const; /** Sets the value assigned to this explanation node. */ void setValue(const float_t value); /** A description of this explanation node. */ const TCHAR* getDescription() const; /// * If the match statis is explicitly set (ie: not null) this method * uses it; otherwise it defers to the superclass. *

* @see #getMatch */ bool isMatch() const; Explanation* clone() const; protected: TCHAR* getSummary(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/FieldCache.cpp000066400000000000000000000036731154025176300232170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "FieldCache.h" #include "_FieldCacheImpl.h" #include "Sort.h" CL_NS_DEF(search) FieldCache* FieldCache_DEFAULT = NULL; int32_t FieldCache::STRING_INDEX = -1; FieldCache* FieldCache::DEFAULT(){ if ( FieldCache_DEFAULT == NULL ) FieldCache_DEFAULT = _CLNEW FieldCacheImpl(); return FieldCache_DEFAULT; } void FieldCache::_shutdown(){ _CLDELETE(FieldCache_DEFAULT); } FieldCacheAuto::FieldCacheAuto(int32_t len, int32_t type){ contentType = type; contentLen = len; ownContents = false; intArray=NULL; floatArray=NULL; stringIndex=NULL; stringArray=NULL; comparableArray=NULL; sortComparator=NULL; scoreDocComparator=NULL; } FieldCacheAuto::~FieldCacheAuto(){ if ( contentType == FieldCacheAuto::INT_ARRAY ){ _CLDELETE_ARRAY(intArray); }else if ( contentType == FieldCacheAuto::FLOAT_ARRAY ){ _CLDELETE_ARRAY(floatArray); }else if ( contentType == FieldCacheAuto::STRING_INDEX ){ _CLDELETE(stringIndex); }else if ( contentType == FieldCacheAuto::STRING_ARRAY ){ if ( ownContents ){ for ( int32_t i=0;ifield as integers and returns an array * of size reader.maxDoc() of the value each document * has in the given field. * @param reader Used to get field values. * @param field Which field contains the integers. * @return The values in the given field for each document. * @throws IOException If any error occurs. */ virtual FieldCacheAuto* getInts (CL_NS(index)::IndexReader* reader, const TCHAR* field) = 0; /** Checks the internal cache for an appropriate entry, and if * none is found, reads the terms in field as floats and returns an array * of size reader.maxDoc() of the value each document * has in the given field. * @param reader Used to get field values. * @param field Which field contains the floats. * @return The values in the given field for each document. * @throws IOException If any error occurs. */ virtual FieldCacheAuto* getFloats (CL_NS(index)::IndexReader* reader, const TCHAR* field) = 0; /** Checks the internal cache for an appropriate entry, and if none * is found, reads the term values in field and returns an array * of size reader.maxDoc() containing the value each document * has in the given field. * @param reader Used to get field values. * @param field Which field contains the strings. * @return The values in the given field for each document. * @throws IOException If any error occurs. */ virtual FieldCacheAuto* getStrings (CL_NS(index)::IndexReader* reader, const TCHAR* field) = 0; /** Checks the internal cache for an appropriate entry, and if none * is found reads the term values in field and returns * an array of them in natural order, along with an array telling * which element in the term array each document uses. * @param reader Used to get field values. * @param field Which field contains the strings. * @return Array of terms and index into the array for each document. * @throws IOException If any error occurs. */ virtual FieldCacheAuto* getStringIndex (CL_NS(index)::IndexReader* reader, const TCHAR* field) = 0; /** Checks the internal cache for an appropriate entry, and if * none is found reads field to see if it contains integers, floats * or strings, and then calls one of the other methods in this class to get the * values. For string values, a FieldCache::StringIndex is returned. After * calling this method, there is an entry in the cache for both * type AUTO and the actual found type. * @param reader Used to get field values. * @param field Which field contains the values. * @return int32_t[], float_t[] or FieldCache::StringIndex. * @throws IOException If any error occurs. */ virtual FieldCacheAuto* getAuto (CL_NS(index)::IndexReader* reader, const TCHAR* field) = 0; /** Checks the internal cache for an appropriate entry, and if none * is found reads the terms out of field and calls the given SortComparator * to get the sort values. A hit in the cache will happen if reader, * field, and comparator are the same (using equals()) * as a previous call to this method. * @param reader Used to get field values. * @param field Which field contains the values. * @param comparator Used to convert terms into something to sort by. * @return Array of sort objects, one for each document. * @throws IOException If any error occurs. */ virtual FieldCacheAuto* getCustom (CL_NS(index)::IndexReader* reader, const TCHAR* field, SortComparator* comparator) = 0; /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); }; /** A class holding an AUTO field. In java lucene an Object is used, but we use this. contentType: 1 - integer array 2 - float array 3 - FieldCache::StringIndex object This class is also used when returning getInt, getFloat, etc because we have no way of returning the size of the array and this class can be used to determine the array size */ class CLUCENE_EXPORT FieldCacheAuto:LUCENE_BASE{ public: enum{ INT_ARRAY=1, FLOAT_ARRAY=2, STRING_INDEX=3, STRING_ARRAY=4, COMPARABLE_ARRAY=5, SORT_COMPARATOR=6, SCOREDOC_COMPARATOR=7 }; FieldCacheAuto(int32_t len, int32_t type); ~FieldCacheAuto(); ///if contents should be deleted too, depending on type bool ownContents; int32_t contentLen; //number of items in the list uint8_t contentType; int32_t* intArray; //item 1 float_t* floatArray; //item 2 FieldCache::StringIndex* stringIndex; //item 3 TCHAR** stringArray; //item 4 CL_NS(util)::Comparable** comparableArray; //item 5 SortComparator* sortComparator; //item 6 ScoreDocComparator* scoreDocComparator; //item 7 }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/FieldCacheImpl.cpp000066400000000000000000000443601154025176300240370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_FieldCacheImpl.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/Misc.h" #include "Sort.h" CL_NS_USE(util) CL_NS_USE(index) CL_NS_DEF(search) ///the type that is stored in the field cache. can't use a typedef because ///the decorated name would become too long class fieldcacheCacheReaderType: public CL_NS(util)::CLHashMap, CL_NS(util)::Deletor::Object >{ public: fieldcacheCacheReaderType(){ setDeleteKey(false); setDeleteValue(false); } ~fieldcacheCacheReaderType(){ iterator itr = begin(); while ( itr != end() ){ FieldCacheImpl::FileEntry* f = itr->first; if ( f->getType() != SortField::AUTO ) _CLDELETE( itr->second ); _CLDELETE( f ); ++itr; } clear(); } }; //note: typename gets too long if using cacheReaderType as a typename class fieldcacheCacheType: public CL_NS(util)::CLHashMap< CL_NS(index)::IndexReader*, fieldcacheCacheReaderType*, CL_NS(util)::Compare::Void, CL_NS(util)::Equals::Void, CL_NS(util)::Deletor::Object, CL_NS(util)::Deletor::Object >{ public: fieldcacheCacheType ( const bool deleteKey, const bool deleteValue) { setDeleteKey(deleteKey); setDeleteValue(deleteValue); } virtual ~fieldcacheCacheType(){ } }; FieldCache::StringIndex::StringIndex (int32_t* values, TCHAR** lookup, int count) { this->count = count; this->order = values; this->lookup = lookup; } FieldCache::StringIndex::~StringIndex(){ _CLDELETE_ARRAY(order); for ( int i=0;iclear(); _CLDELETE(cache); } FieldCacheImpl::FileEntry::FileEntry (const TCHAR* field, int32_t type) { this->field = CLStringIntern::intern(field); this->type = type; this->custom = NULL; this->_hashCode = 0; } /** Creates one of these objects for a custom comparator. */ FieldCacheImpl::FileEntry::FileEntry (const TCHAR* field, SortComparatorSource* custom) { this->field = CLStringIntern::intern(field); this->type = SortField::CUSTOM; this->custom = custom; this->_hashCode = 0; } FieldCacheImpl::FileEntry::~FileEntry(){ CLStringIntern::unintern(field); } size_t FieldCacheImpl::FileEntry::hashCode(){ if ( _hashCode == 0 ){ //todo: cache hashcode? size_t ret = Misc::thashCode(field); if ( custom != NULL ) ret = ret ^ custom->hashCode(); ret = ret ^ (type*7); //type with a seed _hashCode = ret; } return _hashCode; } int32_t FieldCacheImpl::FileEntry::compareTo(const FieldCacheImpl::FileEntry* other) const{ if ( other->field == this->field ){ if ( other->type == this->type ){ if ( other->custom == NULL ){ if ( this->custom == NULL ) return 0; //both null else return 1; }else if ( this->custom == NULL ) return -1; else if ( other->custom < this->custom ) return -1; else if ( other->custom > this->custom ) return 1; else return 0; }else if ( other->type > this->type ) return 1; else return -1; }else return _tcscmp(other->field,this->field); } /** Two of these are equal iff they reference the same field and type. */ /*bool FieldCacheImpl::FileEntry::equals (FileEntry* other) { if (other->field == field && other->type == type) { if (other->custom == NULL) { if (custom == NULL) return true; } else if (other->custom->equals (custom)) { return true; } } }*/ /** Composes a hashcode based on the field and type. */ /*size_t FieldCacheImpl::FileEntry::hashCode() { return field->hashCode() ^ type ^ (custom==NULL ? 0 : custom->hashCode()); }*/ /** See if an object is in the cache. */ FieldCacheAuto* FieldCacheImpl::lookup (IndexReader* reader, const TCHAR* field, int32_t type) { FieldCacheAuto* ret = NULL; FileEntry* entry = _CLNEW FileEntry (field, type); { SCOPED_LOCK_MUTEX(THIS_LOCK) fieldcacheCacheReaderType* readerCache = cache->get(reader); if (readerCache != NULL) ret = readerCache->get (entry); _CLDELETE(entry); } return ret; } /** See if a custom object is in the cache. */ FieldCacheAuto* FieldCacheImpl::lookup (IndexReader* reader, const TCHAR* field, SortComparatorSource* comparer) { FieldCacheAuto* ret = NULL; FileEntry* entry = _CLNEW FileEntry (field, comparer); { SCOPED_LOCK_MUTEX(THIS_LOCK) fieldcacheCacheReaderType* readerCache = cache->get(reader); if (readerCache != NULL) ret = readerCache->get (entry); _CLDELETE(entry); } return ret; } void FieldCacheImpl::closeCallback(CL_NS(index)::IndexReader* reader, void* fieldCacheImpl){ FieldCacheImpl* fci = (FieldCacheImpl*)fieldCacheImpl; SCOPED_LOCK_MUTEX(fci->THIS_LOCK) fci->cache->remove(reader); } /** Put an object into the cache. */ void FieldCacheImpl::store (IndexReader* reader, const TCHAR* field, int32_t type, FieldCacheAuto* value) { FileEntry* entry = _CLNEW FileEntry (field, type); { SCOPED_LOCK_MUTEX(THIS_LOCK) fieldcacheCacheReaderType* readerCache = cache->get(reader); if (readerCache == NULL) { readerCache = _CLNEW fieldcacheCacheReaderType; cache->put(reader,readerCache); reader->addCloseCallback(closeCallback, this); } readerCache->put (entry, value); //this is supposed to return the previous value, but it needs to be deleted!!! } } /** Put a custom object into the cache. */ void FieldCacheImpl::store (IndexReader* reader, const TCHAR* field, SortComparatorSource* comparer, FieldCacheAuto* value) { FileEntry* entry = _CLNEW FileEntry (field, comparer); { SCOPED_LOCK_MUTEX(THIS_LOCK) fieldcacheCacheReaderType* readerCache = cache->get(reader); if (readerCache == NULL) { readerCache = _CLNEW fieldcacheCacheReaderType; cache->put(reader, readerCache); reader->addCloseCallback(FieldCacheImpl::closeCallback, this); } readerCache->put(entry, value); //this is supposed to return the previous value, but it needs to be deleted!!! } } // inherit javadocs FieldCacheAuto* FieldCacheImpl::getInts (IndexReader* reader, const TCHAR* field) { field = CLStringIntern::intern(field); FieldCacheAuto* ret = lookup (reader, field, SortField::INT); if (ret == NULL) { int32_t retLen = reader->maxDoc(); int32_t* retArray = _CL_NEWARRAY(int32_t,retLen); memset(retArray,0,sizeof(int32_t)*retLen); if (retLen > 0) { TermDocs* termDocs = reader->termDocs(); Term* term = _CLNEW Term (field, LUCENE_BLANK_STRING, false); TermEnum* termEnum = reader->terms (term); _CLDECDELETE(term); try { if (termEnum->term(false) == NULL) { _CLTHROWA(CL_ERR_Runtime,"no terms in field"); //todo: add detailed error: + field); } do { Term* term = termEnum->term(false); if (term->field() != field) break; int32_t termval = _ttoi(term->text()); termDocs->seek (termEnum); while (termDocs->next()) { retArray[termDocs->doc()] = termval; } } while (termEnum->next()); } _CLFINALLY( termDocs->close(); _CLDELETE(termDocs); termEnum->close(); _CLDELETE(termEnum); ) } FieldCacheAuto* fa = _CLNEW FieldCacheAuto(retLen,FieldCacheAuto::INT_ARRAY); fa->intArray = retArray; store (reader, field, SortField::INT, fa); CLStringIntern::unintern(field); return fa; } CLStringIntern::unintern(field); return ret; } // inherit javadocs FieldCacheAuto* FieldCacheImpl::getFloats (IndexReader* reader, const TCHAR* field){ field = CLStringIntern::intern(field); FieldCacheAuto* ret = lookup (reader, field, SortField::FLOAT); if (ret == NULL) { int32_t retLen = reader->maxDoc(); float_t* retArray = _CL_NEWARRAY(float_t,retLen); memset(retArray,0,sizeof(float_t)*retLen); if (retLen > 0) { TermDocs* termDocs = reader->termDocs(); Term* term = _CLNEW Term (field, LUCENE_BLANK_STRING, false); TermEnum* termEnum = reader->terms (term); _CLDECDELETE(term); try { if (termEnum->term(false) == NULL) { _CLTHROWA(CL_ERR_Runtime,"no terms in field "); //todo: make richer error + field); } do { Term* term = termEnum->term(false); if (term->field() != field) break; float_t termval = _tcstod(term->text(),NULL); termDocs->seek (termEnum); while (termDocs->next()) { retArray[termDocs->doc()] = termval; } } while (termEnum->next()); } _CLFINALLY( termDocs->close(); _CLDELETE(termDocs); termEnum->close(); _CLDELETE(termEnum); ) } FieldCacheAuto* fa = _CLNEW FieldCacheAuto(retLen,FieldCacheAuto::FLOAT_ARRAY); fa->floatArray = retArray; store (reader, field, SortField::FLOAT, fa); CLStringIntern::unintern(field); return fa; } CLStringIntern::unintern(field); return ret; } // inherit javadocs FieldCacheAuto* FieldCacheImpl::getStrings (IndexReader* reader, const TCHAR* field){ //todo: this is not really used, i think? field = CLStringIntern::intern(field); FieldCacheAuto* ret = lookup (reader, field, SortField::STRING); if (ret == NULL) { int32_t retLen = reader->maxDoc(); TCHAR** retArray = _CL_NEWARRAY(TCHAR*,retLen+1); memset(retArray,0,sizeof(TCHAR*)*(retLen+1)); if (retLen > 0) { TermDocs* termDocs = reader->termDocs(); Term* term = _CLNEW Term (field, LUCENE_BLANK_STRING, false); TermEnum* termEnum = reader->terms (term); _CLDECDELETE(term); try { if (termEnum->term(false) == NULL) { _CLTHROWA(CL_ERR_Runtime,"no terms in field "); //todo: extend to + field); } do { Term* term = termEnum->term(false); if (term->field() != field) break; const TCHAR* termval = term->text(); termDocs->seek (termEnum); while (termDocs->next()) { retArray[termDocs->doc()] = STRDUP_TtoT(termval); //todo: any better way of doing this??? } } while (termEnum->next()); } _CLFINALLY( retArray[retLen]=NULL; termDocs->close(); _CLDELETE(termDocs); termEnum->close(); _CLDELETE(termEnum); ) } FieldCacheAuto* fa = _CLNEW FieldCacheAuto(retLen,FieldCacheAuto::STRING_ARRAY); fa->stringArray = retArray; fa->ownContents=true; store (reader, field, SortField::STRING, fa); CLStringIntern::unintern(field); return fa; } CLStringIntern::unintern(field); return ret; } // inherit javadocs FieldCacheAuto* FieldCacheImpl::getStringIndex (IndexReader* reader, const TCHAR* field){ field = CLStringIntern::intern(field); FieldCacheAuto* ret = lookup (reader, field, STRING_INDEX); int32_t t = 0; // current term number if (ret == NULL) { int32_t retLen = reader->maxDoc(); int32_t* retArray = _CL_NEWARRAY(int32_t,retLen); memset(retArray,0,sizeof(int32_t)*retLen); TCHAR** mterms = _CL_NEWARRAY(TCHAR*,retLen+2); mterms[0]=NULL; if ( retLen > 0 ) { TermDocs* termDocs = reader->termDocs(); Term* term = _CLNEW Term (field, LUCENE_BLANK_STRING, false); TermEnum* termEnum = reader->terms (term); _CLDECDELETE(term); CND_PRECONDITION(t+1 <= retLen, "t out of bounds"); // an entry for documents that have no terms in this field // should a document with no terms be at top or bottom? // this puts them at the top - if it is changed, FieldDocSortedHitQueue // needs to change as well. mterms[t++] = NULL; try { if (termEnum->term(false) == NULL) { _CLTHROWA(CL_ERR_Runtime,"no terms in field"); //todo: make rich message " + field); } do { Term* term = termEnum->term(false); if (term->field() != field) break; // store term text // we expect that there is at most one term per document if (t >= retLen+1) _CLTHROWA(CL_ERR_Runtime,"there are more terms than documents in field"); //todo: rich error \"" + field + "\""); mterms[t] = STRDUP_TtoT(term->text()); termDocs->seek (termEnum); while (termDocs->next()) { retArray[termDocs->doc()] = t; } t++; } while (termEnum->next()); CND_PRECONDITION(tclose(); _CLDELETE(termDocs); termEnum->close(); _CLDELETE(termEnum); ); if (t == 0) { // if there are no terms, make the term array // have a single NULL entry _CLDELETE_ARRAY(mterms); mterms = _CL_NEWARRAY(TCHAR*,1); //todo: delete old mterms? mterms[0]=NULL; } else if (t < retLen) { //todo: check, was mterms.length // if there are less terms than documents, // trim off the dead array space //const TCHAR** terms = _CL_NEWARRAY(TCHAR,t); //System.arraycopy (mterms, 0, terms, 0, t); //mterms = terms; //we simply shorten the length of the array... } } FieldCache::StringIndex* value = _CLNEW FieldCache::StringIndex (retArray, mterms,t); FieldCacheAuto* fa = _CLNEW FieldCacheAuto(retLen,FieldCacheAuto::STRING_INDEX); fa->stringIndex = value; fa->ownContents=true; store (reader, field, STRING_INDEX, fa); CLStringIntern::unintern(field); return fa; } CLStringIntern::unintern(field); return ret; } // inherit javadocs FieldCacheAuto* FieldCacheImpl::getAuto (IndexReader* reader, const TCHAR* field) { field = CLStringIntern::intern(field); FieldCacheAuto* ret = lookup (reader, field, SortField::AUTO); if (ret == NULL) { Term* term = _CLNEW Term (field, LUCENE_BLANK_STRING, false); TermEnum* enumerator = reader->terms (term); _CLDECDELETE(term); try { Term* term = enumerator->term(false); if (term == NULL) { _CLTHROWA(CL_ERR_Runtime,"no terms in field - cannot determine sort type"); //todo: make rich error: " + field + " } if (term->field() == field) { const TCHAR* termtext = term->text(); size_t termTextLen = term->textLength(); bool isint=true; for ( size_t i=0;iclose(); _CLDELETE(enumerator) ); } CLStringIntern::unintern(field); return ret; } // inherit javadocs FieldCacheAuto* FieldCacheImpl::getCustom (IndexReader* reader, const TCHAR* field, SortComparator* comparator){ field = CLStringIntern::intern(field); FieldCacheAuto* ret = lookup (reader, field, comparator); if (ret == NULL) { int32_t retLen = reader->maxDoc(); Comparable** retArray = _CL_NEWARRAY(Comparable*,retLen); memset(retArray,0,sizeof(Comparable*)*retLen); if (retLen > 0) { TermDocs* termDocs = reader->termDocs(); TermEnum* termEnum = reader->terms (); try { if (termEnum->term(false) == NULL) { _CLTHROWA(CL_ERR_Runtime,"no terms in field "); //todo: make rich error + field); } do { Term* term = termEnum->term(false); if (term->field() != field) break; Comparable* termval = comparator->getComparable (term->text()); termDocs->seek (termEnum); while (termDocs->next()) { retArray[termDocs->doc()] = termval; } } while (termEnum->next()); } _CLFINALLY ( termDocs->close(); _CLDELETE(termDocs); termEnum->close(); _CLDELETE(termEnum); ); } FieldCacheAuto* fa = _CLNEW FieldCacheAuto(retLen,FieldCacheAuto::COMPARABLE_ARRAY); fa->comparableArray = retArray; fa->ownContents=true; store (reader, field, SortField::CUSTOM, fa); CLStringIntern::unintern(field); return fa; } CLStringIntern::unintern(field); return ret; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/FieldDoc.h000066400000000000000000000037641154025176300223670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FieldDoc_ #define _lucene_search_FieldDoc_ #include "SearchHeader.h" CL_NS_DEF(search) /** * Expert: A ScoreDoc which also contains information about * how to sort the referenced document. In addition to the * document number and score, this object contains an array * of values for the document from the field(s) used to sort. * For example, if the sort criteria was to sort by fields * "a", "b" then "c", the fields object array * will have three elements, corresponding respectively to * the term values for the document in fields "a", "b" and "c". * The class of each element in the array will be either * Integer, Float or String depending on the type of values * in the terms of each field. * * @see ScoreDoc * @see TopFieldDocs */ class CLUCENE_EXPORT FieldDoc: LUCENE_BASE { public: //FieldDoc did inherit from ScoreDoc, but now we make the scoredoc a member struct ScoreDoc scoreDoc; /** Expert: The values which are used to sort the referenced document. * The order of these will match the original sort criteria given by a * Sort object. Each Object will be either an Integer, Float or String, * depending on the type of values in the terms of the original field. * @see Sort * @see Searchable#search(Query,Filter,int32_t,Sort) */ CL_NS(util)::Comparable** fields; /** Expert: Creates one of these objects with empty sort information. */ FieldDoc (int32_t doc, float_t score); /** Expert: Creates one of these objects with the given sort information. */ FieldDoc (int32_t doc, float_t score, CL_NS(util)::Comparable** fields); ~FieldDoc(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/FieldDocSortedHitQueue.cpp000066400000000000000000000134511154025176300255470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_FieldDocSortedHitQueue.h" CL_NS_USE(util) CL_NS_DEF(search) FieldDoc::FieldDoc (int32_t doc, float_t score) { this->scoreDoc.doc = doc; this->scoreDoc.score = score; fields=NULL; } FieldDoc::FieldDoc (int32_t doc, float_t score, CL_NS(util)::Comparable** fields) { this->scoreDoc.doc = doc; this->scoreDoc.score = score; this->fields = fields; } FieldDoc::~FieldDoc(){ if ( fields != NULL ){ for ( int i=0;fields[i]!=NULL;i++ ) _CLDELETE(fields[i]); _CLDELETE_ARRAY(fields); } } FieldDocSortedHitQueue::FieldDocSortedHitQueue (SortField** fields, int32_t size) { this->fields = fields; _countsize(); //this->collators = hasCollators (fields); initialize (size,true); } bool FieldDocSortedHitQueue::lessThan (FieldDoc* docA, FieldDoc* docB) { const int32_t n = fieldsLen; int32_t c = 0; float_t f1,f2,r1,r2; int32_t i1,i2; const TCHAR *s1, *s2; for (int32_t i=0; igetType(); if (fields[i]->getReverse()) { switch (type) { case SortField::DOCSCORE: r1 = reinterpret_cast(docA->fields[i])->getValue(); r2 = reinterpret_cast(docB->fields[i])->getValue(); if (r1 < r2) c = -1; if (r1 > r2) c = 1; break; case SortField::DOC: case SortField::INT: i1 = reinterpret_cast(docA->fields[i])->getValue(); i2 = reinterpret_cast(docB->fields[i])->getValue(); if (i1 > i2) c = -1; if (i1 < i2) c = 1; break; case SortField::STRING: s1 = reinterpret_cast(docA->fields[i])->getValue(); s2 = reinterpret_cast(docB->fields[i])->getValue(); if (s2 == NULL) c = -1; // could be NULL if there are else if (s1 == NULL) c = 1; // no terms in the given field else c = _tcscmp(s2,s1); //else if (fields[i].getLocale() == NULL) { /*todo: collators not impl } else { c = collators[i].compare (s2, s1); }*/ break; case SortField::FLOAT: f1 = reinterpret_cast(docA->fields[i])->getValue(); f2 = reinterpret_cast(docB->fields[i])->getValue(); if (f1 > f2) c = -1; if (f1 < f2) c = 1; break; case SortField::CUSTOM: c = docB->fields[i]->compareTo (docA->fields[i]); break; case SortField::AUTO: // we cannot handle this - even if we determine the type of object (float_t or // Integer), we don't necessarily know how to compare them (both SCORE and // float_t both contain floats, but are sorted opposite of each other). Before // we get here, each AUTO should have been replaced with its actual value. _CLTHROWA (CL_ERR_Runtime,"FieldDocSortedHitQueue cannot use an AUTO SortField"); default: _CLTHROWA (CL_ERR_Runtime, "invalid SortField type"); //todo: rich error... : "+type); } } else { switch (type) { case SortField::DOCSCORE: r1 = reinterpret_cast(docA->fields[i])->getValue(); r2 = reinterpret_cast(docB->fields[i])->getValue(); if (r1 > r2) c = -1; if (r1 < r2) c = 1; break; case SortField::DOC: case SortField::INT: i1 = reinterpret_cast(docA->fields[i])->getValue(); i2 = reinterpret_cast(docB->fields[i])->getValue(); if (i1 < i2) c = -1; if (i1 > i2) c = 1; break; case SortField::STRING: s1 = reinterpret_cast(docA->fields[i])->getValue(); s2 = reinterpret_cast(docB->fields[i])->getValue(); // NULL values need to be sorted first, because of how FieldCache.getStringIndex() // works - in that routine, any documents without a value in the given field are // put first. if (s1 == NULL) c = -1; // could be NULL if there are else if (s2 == NULL) c = 1; // no terms in the given field else c = _tcscmp(s1,s2); //else if (fields[i].getLocale() == NULL) { /* todo: collators not implemented } else { c = collators[i].compare (s1, s2); }*/ break; case SortField::FLOAT: f1 = reinterpret_cast(docA->fields[i])->getValue(); f2 = reinterpret_cast(docB->fields[i])->getValue(); if (f1 < f2) c = -1; if (f1 > f2) c = 1; break; case SortField::CUSTOM: c = docA->fields[i]->compareTo (docB->fields[i]); break; case SortField::AUTO: // we cannot handle this - even if we determine the type of object (float_t or // Integer), we don't necessarily know how to compare them (both SCORE and // float_t both contain floats, but are sorted opposite of each other). Before // we get here, each AUTO should have been replaced with its actual value. _CLTHROWA (CL_ERR_Runtime,"FieldDocSortedHitQueue cannot use an AUTO SortField"); default: _CLTHROWA (CL_ERR_Runtime,"invalid SortField type"); //todo: rich error... : "+type); } } } return c > 0; } void FieldDocSortedHitQueue::setFields (SortField** fields) { SCOPED_LOCK_MUTEX(THIS_LOCK) if (this->fields == NULL) { this->fields = fields; _countsize(); //this->collators = hasCollators (fields); }else if ( fields == NULL ) this->fields = NULL; } FieldDocSortedHitQueue::~FieldDocSortedHitQueue(){ if ( fields != NULL ){ for ( int i=0;fields[i]!=NULL;i++ ) _CLDELETE(fields[i]); _CLDELETE_ARRAY(fields); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/FieldSortedHitQueue.cpp000066400000000000000000000221051154025176300251150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "FieldSortedHitQueue.h" #include "_FieldDocSortedHitQueue.h" #include "_FieldCacheImpl.h" #include "Compare.h" #include "CLucene/index/IndexReader.h" CL_NS_USE(util) CL_NS_USE(index) CL_NS_DEF(search) //note: typename gets too long if using cacheReaderType as a typename class hitqueueCacheType: public CL_NS(util)::CLHashMap, CL_NS(util)::Equals::Void, CL_NS(util)::Deletor::Object, CL_NS(util)::Deletor::Object >{ public: hitqueueCacheType(bool deleteKey, bool deleteValue){ setDeleteKey(deleteKey); setDeleteValue(deleteValue); } ~hitqueueCacheType(){ clear(); } }; ///the type that is stored in the field cache. can't use a typedef because ///the decorated name would become too long class hitqueueCacheReaderType: public CL_NS(util)::CLHashMap, CL_NS(util)::Deletor::Object >{ public: hitqueueCacheReaderType(bool deleteValue){ setDeleteKey(true); setDeleteValue(deleteValue); } ~hitqueueCacheReaderType(){ clear(); } }; hitqueueCacheType* FieldSortedHitQueue::Comparators = _CLNEW hitqueueCacheType(false,true); DEFINE_MUTEX(FieldSortedHitQueue::Comparators_LOCK) void FieldSortedHitQueue::_shutdown(){ Comparators->clear(); _CLDELETE(Comparators); } FieldSortedHitQueue::FieldSortedHitQueue (IndexReader* reader, SortField** _fields, int32_t size): fieldsLen(0), maxscore(1.0f) { while ( _fields[fieldsLen] != 0 ) fieldsLen++; comparators = _CL_NEWARRAY(ScoreDocComparator*,fieldsLen+1); SortField** tmp = _CL_NEWARRAY(SortField*,fieldsLen+1); for (int32_t i=0; igetField(); //todo: fields[i].getLocale(), not implemented comparators[i] = getCachedComparator (reader, fieldname, _fields[i]->getType(), _fields[i]->getFactory()); tmp[i] = _CLNEW SortField (fieldname, comparators[i]->sortType(), _fields[i]->getReverse()); } comparatorsLen = fieldsLen; comparators[fieldsLen]=NULL; tmp[fieldsLen] = NULL; this->fields = tmp; initialize(size,true); } bool FieldSortedHitQueue::lessThan (FieldDoc* docA, FieldDoc* docB) { // keep track of maximum score if (docA->scoreDoc.score > maxscore) maxscore = docA->scoreDoc.score; if (docB->scoreDoc.score > maxscore) maxscore = docB->scoreDoc.score; // run comparators int32_t c = 0; for ( int32_t i=0; c==0 && igetReverse()) ? comparators[i]->compare (&docB->scoreDoc, &docA->scoreDoc) : comparators[i]->compare (&docA->scoreDoc, &docB->scoreDoc); } // avoid random sort order that could lead to duplicates (bug #31241): if (c == 0) return docA->scoreDoc.doc > docB->scoreDoc.doc; return c > 0; } //static ScoreDocComparator* FieldSortedHitQueue::comparatorString (IndexReader* reader, const TCHAR* field) { //const TCHAR* field = CLStringIntern::intern(fieldname); FieldCacheAuto* fa = FieldCache::DEFAULT()->getStringIndex (reader, field); //CLStringIntern::unintern(field); CND_PRECONDITION(fa->contentType==FieldCacheAuto::STRING_INDEX,"Content type is incorrect"); fa->ownContents = false; return _CLNEW ScoreDocComparators::String(fa->stringIndex, fa->contentLen); } //static ScoreDocComparator* FieldSortedHitQueue::comparatorInt (IndexReader* reader, const TCHAR* field){ //const TCHAR* field = CLStringIntern::intern(fieldname); FieldCacheAuto* fa = FieldCache::DEFAULT()->getInts (reader, field); //CLStringIntern::unintern(field); CND_PRECONDITION(fa->contentType==FieldCacheAuto::INT_ARRAY,"Content type is incorrect"); return _CLNEW ScoreDocComparators::Int32(fa->intArray, fa->contentLen); } //static ScoreDocComparator* FieldSortedHitQueue::comparatorFloat (IndexReader* reader, const TCHAR* field) { //const TCHAR* field = CLStringIntern::intern(fieldname); FieldCacheAuto* fa = FieldCache::DEFAULT()->getFloats (reader, field); //CLStringIntern::unintern(field); CND_PRECONDITION(fa->contentType==FieldCacheAuto::FLOAT_ARRAY,"Content type is incorrect"); return _CLNEW ScoreDocComparators::Float (fa->floatArray, fa->contentLen); } //static ScoreDocComparator* FieldSortedHitQueue::comparatorAuto (IndexReader* reader, const TCHAR* field){ //const TCHAR* field = CLStringIntern::intern(fieldname); FieldCacheAuto* fa = FieldCache::DEFAULT()->getAuto (reader, field); //CLStringIntern::unintern(field); if (fa->contentType == FieldCacheAuto::STRING_INDEX ) { return comparatorString (reader, field); } else if (fa->contentType == FieldCacheAuto::INT_ARRAY) { return comparatorInt (reader, field); } else if (fa->contentType == FieldCacheAuto::FLOAT_ARRAY) { return comparatorFloat (reader, field); } else if (fa->contentType == FieldCacheAuto::STRING_ARRAY) { return comparatorString (reader, field); } else { _CLTHROWA(CL_ERR_Runtime, "unknown data type in field"); //todo: rich error information: '"+field+"'"); } } //todo: Locale locale, not implemented yet ScoreDocComparator* FieldSortedHitQueue::getCachedComparator (IndexReader* reader, const TCHAR* fieldname, int32_t type, SortComparatorSource* factory){ if (type == SortField::DOC) return ScoreDocComparator::INDEXORDER(); if (type == SortField::DOCSCORE) return ScoreDocComparator::RELEVANCE(); ScoreDocComparator* comparator = lookup (reader, fieldname, type, factory); if (comparator == NULL) { switch (type) { case SortField::AUTO: comparator = comparatorAuto (reader, fieldname); break; case SortField::INT: comparator = comparatorInt (reader, fieldname); break; case SortField::FLOAT: comparator = comparatorFloat (reader, fieldname); break; case SortField::STRING: //if (locale != NULL) // comparator = comparatorStringLocale (reader, fieldname, locale); //else comparator = comparatorString (reader, fieldname); break; case SortField::CUSTOM: comparator = factory->newComparator (reader, fieldname); break; default: _CLTHROWA(CL_ERR_Runtime,"unknown field type"); //todo: extend error //throw _CLNEW RuntimeException ("unknown field type: "+type); } store (reader, fieldname, type, factory, comparator); } return comparator; } FieldDoc* FieldSortedHitQueue::fillFields (FieldDoc* doc) const{ int32_t n = comparatorsLen; Comparable** fields = _CL_NEWARRAY(Comparable*,n+1); for (int32_t i=0; isortValue(&doc->scoreDoc); fields[n]=NULL; doc->fields = fields; if (maxscore > 1.0f) doc->scoreDoc.score /= maxscore; // normalize scores return doc; } ScoreDocComparator* FieldSortedHitQueue::lookup (IndexReader* reader, const TCHAR* field, int32_t type, SortComparatorSource* factory) { ScoreDocComparator* sdc = NULL; FieldCacheImpl::FileEntry* entry = (factory != NULL) ? _CLNEW FieldCacheImpl::FileEntry (field, factory) : _CLNEW FieldCacheImpl::FileEntry (field, type); { SCOPED_LOCK_MUTEX(Comparators_LOCK) hitqueueCacheReaderType* readerCache = Comparators->get(reader); if (readerCache == NULL){ _CLDELETE(entry); return NULL; } sdc = readerCache->get (entry); _CLDELETE(entry); } return sdc; } void FieldSortedHitQueue::closeCallback(CL_NS(index)::IndexReader* reader, void*){ SCOPED_LOCK_MUTEX(Comparators_LOCK) Comparators->remove(reader); } //static void FieldSortedHitQueue::store (IndexReader* reader, const TCHAR* field, int32_t type, SortComparatorSource* factory, ScoreDocComparator* value) { FieldCacheImpl::FileEntry* entry = (factory != NULL) ? _CLNEW FieldCacheImpl::FileEntry (field, factory) : _CLNEW FieldCacheImpl::FileEntry (field, type); { SCOPED_LOCK_MUTEX(Comparators_LOCK) hitqueueCacheReaderType* readerCache = Comparators->get(reader); if (readerCache == NULL) { readerCache = _CLNEW hitqueueCacheReaderType(true); Comparators->put(reader,readerCache); reader->addCloseCallback(FieldSortedHitQueue::closeCallback,NULL); } readerCache->put (entry, value); //return NULL; //supposed to return previous value... } } FieldSortedHitQueue::~FieldSortedHitQueue(){ _CLDELETE_ARRAY(comparators); if ( fields != NULL ){ for ( int i=0;fields[i]!=NULL;i++ ) _CLDELETE(fields[i]); _CLDELETE_ARRAY(fields); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/FieldSortedHitQueue.h000066400000000000000000000156121154025176300245670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FieldSortedHitQueue_ #define _lucene_search_FieldSortedHitQueue_ CL_CLASS_DEF(search,FieldDoc) CL_CLASS_DEF(search,SortComparatorSource) CL_CLASS_DEF(search,SortField) #include "FieldDoc.h" //required to expose destructor #include "CLucene/util/PriorityQueue.h" #include "CLucene/util/Equators.h" #include "CLucene/LuceneThreads.h" CL_CLASS_DEF(index,IndexReader) CL_NS_DEF(search) class hitqueueCacheReaderType; class hitqueueCacheType; class ScoreDocComparator; /** * Expert: A hit queue for sorting by hits by terms in more than one field. * Uses FieldCache.DEFAULT for maintaining internal term lookup tables. * * @see Searchable#search(Query,Filter,int32_t,Sort) * @see FieldCache */ class CLUCENE_EXPORT FieldSortedHitQueue: public CL_NS(util)::PriorityQueue > { public: //todo: remove this and below after close callback is implemented /** Internal cache of comparators. Similar to FieldCache, only * caches comparators instead of term values. */ static hitqueueCacheType* Comparators; STATIC_DEFINE_MUTEX(Comparators_LOCK) /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); private: /** Returns a comparator if it is in the cache.*/ static ScoreDocComparator* lookup (CL_NS(index)::IndexReader* reader, const TCHAR* field, int32_t type, SortComparatorSource* factory); /** Stores a comparator into the cache. returns the valid ScoreDocComparator. */ static void store (CL_NS(index)::IndexReader* reader, const TCHAR* field, int32_t type, SortComparatorSource* factory, ScoreDocComparator* value); //todo: Locale locale, not implemented yet static ScoreDocComparator* getCachedComparator (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname, int32_t type, SortComparatorSource* factory); /** * Returns a comparator for sorting hits according to a field containing integers. * @param reader Index to use. * @param fieldname Field containg integer values. * @return Comparator for sorting hits. * @throws IOException If an error occurs reading the index. */ static ScoreDocComparator* comparatorInt (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname); /** * Returns a comparator for sorting hits according to a field containing floats. * @param reader Index to use. * @param fieldname Field containg float values. * @return Comparator for sorting hits. * @throws IOException If an error occurs reading the index. */ static ScoreDocComparator* comparatorFloat (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname); /** * Returns a comparator for sorting hits according to a field containing strings. * @param reader Index to use. * @param fieldname Field containg string values. * @return Comparator for sorting hits. * @throws IOException If an error occurs reading the index. */ static ScoreDocComparator* comparatorString (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname); //todo: /** * Returns a comparator for sorting hits according to a field containing strings. * @param reader Index to use. * @param fieldname Field containg string values. * @return Comparator for sorting hits. * @throws IOException If an error occurs reading the index. static ScoreDocComparator* comparatorStringLocale (IndexReader* reader, TCHAR* fieldname, Locale locale){ Collator collator = Collator.getInstance (locale); TCHAR* field = fieldname.intern(); TCHAR** index = FieldCache.DEFAULT.getStrings (reader, field); return _CLNEW ScoreDocComparator() { public int32_t compare (ScoreDoc i, ScoreDoc j) { return collator.compare (index[i.doc], index[j.doc]); } public Comparable sortValue (ScoreDoc i) { return index[i.doc]; } public int32_t sortType() { return SortField.STRING; } }; }*/ /** * Returns a comparator for sorting hits according to values in the given field. * The terms in the field are looked at to determine whether they contain integers, * floats or strings. Once the type is determined, one of the other static methods * in this class is called to get the comparator. * @param reader Index to use. * @param fieldname Field containg values. * @return Comparator for sorting hits. * @throws IOException If an error occurs reading the index. */ static ScoreDocComparator* comparatorAuto (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname); protected: /** Stores a comparator corresponding to each field being sorted by */ ScoreDocComparator** comparators; int32_t comparatorsLen; /** Stores the sort criteria being used. */ SortField** fields; int32_t fieldsLen; /** Stores the maximum score value encountered, for normalizing. * we only care about scores greater than 1.0 - if all the scores * are less than 1.0, we don't have to normalize. */ float_t maxscore; /** * Returns whether a is less relevant than b. * @param a ScoreDoc * @param b ScoreDoc * @return true if document a should be sorted after document b. */ bool lessThan (FieldDoc* docA, FieldDoc* docB); public: /** * Creates a hit queue sorted by the given list of fields. * @param reader Index to use. * @param fields Field names, in priority order (highest priority first). Cannot be null or empty. * @param size The number of hits to retain. Must be greater than zero. * @throws IOException */ FieldSortedHitQueue (CL_NS(index)::IndexReader* reader, SortField** fields, int32_t size); ~FieldSortedHitQueue(); /** * Callback for when IndexReader closes. This causes * any Comparators to be removed for the specified reader. */ static void closeCallback(CL_NS(index)::IndexReader* reader, void* param); /** * Given a FieldDoc object, stores the values used * to sort the given document. These values are not the raw * values out of the index, but the internal representation * of them. This is so the given search hit can be collated * by a MultiSearcher with other search hits. * @param doc The FieldDoc to store sort values into. * @return The same FieldDoc passed in. * @see Searchable#search(Query,Filter,int32_t,Sort) */ FieldDoc* fillFields (FieldDoc* doc) const; void setFields (SortField** fields){ this->fields = fields; } /** Returns the SortFields being used by this hit queue. */ SortField** getFields() { return fields; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/Filter.h000066400000000000000000000030221154025176300221260ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Filter_ #define _lucene_search_Filter_ CL_CLASS_DEF(util,BitSet) CL_CLASS_DEF(index,IndexReader) CL_NS_DEF(search) // Abstract base class providing a mechanism to restrict searches to a subset // of an index. class CLUCENE_EXPORT Filter: LUCENE_BASE { public: virtual ~Filter(){ } virtual Filter* clone() const = 0; /** * Returns a BitSet with true for documents which should be permitted in * search results, and false for those that should not. * @memory see {@link #shouldDeleteBitSet} */ virtual CL_NS(util)::BitSet* bits(CL_NS(index)::IndexReader* reader)=0; /** * Because of the problem of cached bitsets with the CachingWrapperFilter, * CLucene has no way of knowing whether to delete the bitset returned from bits(). * To properly clean memory from bits(), pass the bitset to this function. The * Filter should be deleted if this function returns true. */ virtual bool shouldDeleteBitSet(const CL_NS(util)::BitSet*) const{ return true; } //Creates a user-readable version of this query and returns it as as string virtual TCHAR* toString()=0; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/FilterResultCache.cpp000066400000000000000000000024061154025176300246110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CachingWrapperFilter.h" #include "CLucene/index/IndexReader.h" CL_NS_DEF(search) CL_NS_USE(index) CL_NS_USE(util) template FilterResultCache::FilterResultCache( bool bDeleteResults ) { this->bDeleteResults = bDeleteResults; } template FilterResultCache::~FilterResultCache() { } template T* FilterResultCache::getResult( CL_NS(index)::IndexReader* reader ) { SCOPED_LOCK_MUTEX( cache_LOCK ) ResultHolder * cached = cache.get( reader ); if( cached != NULL ) return cached->result; T * result = fiter->( reader ); ResultHolder * holder = _CLNEW ResultHolder( result, bDeleteResults ); cache.put( reader, holder ); return result; } template void FilterResultCache::closeCallback( CL_NS(index)::IndexReader* reader, void* ) { SCOPED_LOCK_MUTEX( cache_LOCK ) cache.remove( reader ); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/FilterResultCache.h000066400000000000000000000033471154025176300242630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FilterResultCache_ #define _lucene_search_FilterResultCache_ CL_CLASS_DEF(index,IndexReader) CL_NS_DEF(search) /** * Holds one cached result */ template class ResultHolder : LUCENE_BASE { bool deleteRes; public: T* result; ResultHolder( T * result, bool deleteRes ) { this->result = result; this->deleteRes = deleteRes; } ~ResultHolder(){ if ( deleteRes ) _CLDELETE( result ); } }; /** * Wraps another filter's result and caches it. The purpose is to allow * filters to implement this and allow itself to be cached. Alternatively, * use the CachingWrapperFilter to cache the filter. */ template class FilterResultCache { typedef CL_NS(util)::CLHashMap< CL_NS(index)::IndexReader*, BitSetHolder*, CL_NS(util)::Compare::Void, CL_NS(util)::Equals::Void, CL_NS(util)::Deletor::Object, CL_NS(util)::Deletor::Object > > CacheType; CacheType cache; bool bDeleteResults; DEFINE_MUTEX( cache_LOCK ) public: FilterResultCache( bool bDeleteResults ); virtual ~FilterResultCache(); T* getResult( CL_NS(index)::IndexReader* reader ); protected: void closeCallback( CL_NS(index)::IndexReader* reader, void* param ); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/FilteredTermEnum.cpp000066400000000000000000000065311154025176300244570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "FilteredTermEnum.h" #include "CLucene/index/Term.h" CL_NS_USE(index) CL_NS_DEF(search) FilteredTermEnum::FilteredTermEnum():currentTerm(NULL),actualEnum(NULL){ } FilteredTermEnum::~FilteredTermEnum() { //Func - Destructor //Pre - true //Post - The instance has been destroyed close(); } int32_t FilteredTermEnum::docFreq() const { //Func - Returns the docFreq of the current Term in the enumeration. //Pre - next() must have been called at least once //Post - if actualEnum is NULL result is -1 otherwise the frequencey is returned if (actualEnum == NULL){ return -1; } return actualEnum->docFreq(); } bool FilteredTermEnum::next() { //Func - Increments the enumeration to the next element. //Pre - true //Post - Returns True if the enumeration has been moved to the next element otherwise false //The actual enumerator is not initialized! if (actualEnum == NULL){ return false; } //Finalize the currentTerm and reset it to NULL _CLDECDELETE( currentTerm ); //Iterate through the enumeration while (currentTerm == NULL) { if (endEnum()) return false; if (actualEnum->next()) { //Order term not to return reference ownership here. */ Term* term = actualEnum->term(false); //Compare the retrieved term if (termCompare(term)){ //Matched so finalize the current _CLDECDELETE(currentTerm); //Get a reference to the matched term currentTerm = _CL_POINTER(term); return true; } }else return false; } _CLDECDELETE(currentTerm); currentTerm = NULL; return false; } Term* FilteredTermEnum::term(bool pointer) { if ( pointer ) return _CL_POINTER(currentTerm); else return currentTerm; } void FilteredTermEnum::close(){ //Func - Closes the enumeration to further activity, freeing resources. //Pre - true //Post - The Enumeration has been closed //Check if actualEnum is valid if (actualEnum){ //Close the enumeration actualEnum->close(); //Destroy the enumeration _CLDELETE(actualEnum); } //Destroy currentTerm _CLDECDELETE(currentTerm); } void FilteredTermEnum::setEnum(TermEnum* actualEnum) { //Func - Sets the actual Enumeration //Pre - actualEnum != NULL //Post - The instance has been created CND_PRECONDITION(actualEnum != NULL,"actualEnum is NULL"); _CLLDELETE(this->actualEnum); this->actualEnum = actualEnum; // Find the first term that matches //Ordered term not to return reference ownership here. Term* term = actualEnum->term(false); if (term != NULL && termCompare(term)){ _CLDECDELETE(currentTerm); currentTerm = _CL_POINTER(term); }else{ next(); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/FilteredTermEnum.h000066400000000000000000000034221154025176300241200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FilteredTermEnum_ #define _lucene_search_FilteredTermEnum_ CL_CLASS_DEF(index,Term) #include "CLucene/index/Terms.h" CL_NS_DEF(search) /** Abstract class for enumerating a subset of all terms.

Term enumerations are always ordered by Term.compareTo(). Each term in the enumeration is greater than all that precede it. */ class CLUCENE_EXPORT FilteredTermEnum: public CL_NS(index)::TermEnum { public: FilteredTermEnum(); virtual ~FilteredTermEnum(); /** Equality measure on the term */ virtual float_t difference() = 0; /** * Returns the docFreq of the current Term in the enumeration. * Returns -1 if no Term matches or all terms have been enumerated. */ int32_t docFreq() const; /** Increments the enumeration to the next element. True if one exists. */ bool next() ; /** Returns the current Term in the enumeration. * Returns null if no Term matches or all terms have been enumerated. */ CL_NS(index)::Term* term(bool pointer=true); /** Closes the enumeration to further activity, freeing resources. */ void close(); protected: /** Equality compare on the term */ virtual bool termCompare(CL_NS(index)::Term* term) = 0; /** Indicates the end of the enumeration has been reached */ virtual bool endEnum() = 0; void setEnum(CL_NS(index)::TermEnum* actualEnum) ; private: CL_NS(index)::Term* currentTerm; CL_NS(index)::TermEnum* actualEnum; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/FuzzyQuery.cpp000066400000000000000000000322501154025176300234160ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/Term.h" #include "CLucene/index/IndexReader.h" #include "Similarity.h" #include "FuzzyQuery.h" #include "BooleanQuery.h" #include "BooleanClause.h" #include "TermQuery.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/PriorityQueue.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) /** Finds and returns the smallest of three integers * precondition: Must define int32_t __t for temporary storage and result */ #define min3(a, b, c) __t = (a < b) ? a : b; __t = (__t < c) ? __t : c; FuzzyTermEnum::FuzzyTermEnum(IndexReader* reader, Term* term, float_t minSimilarity, size_t _prefixLength): FilteredTermEnum(),d(NULL),dLen(0),_similarity(0),_endEnum(false),searchTerm(_CL_POINTER(term)), text(NULL),textLen(0),prefix(NULL)/* ISH: was STRDUP_TtoT(LUCENE_BLANK_STRING)*/,prefixLength(0), minimumSimilarity(minSimilarity) { CND_PRECONDITION(term != NULL,"term is NULL"); if (minSimilarity >= 1.0f) _CLTHROWA(CL_ERR_IllegalArgument,"minimumSimilarity cannot be greater than or equal to 1"); else if (minSimilarity < 0.0f) _CLTHROWA(CL_ERR_IllegalArgument,"minimumSimilarity cannot be less than 0"); scale_factor = 1.0f / (1.0f - minimumSimilarity); // only now we are safe from a division by zero //TODO: this.field = searchTerm.field(); //The prefix could be longer than the word. //It's kind of silly though. It means we must match the entire word. const size_t fullSearchTermLength = searchTerm->textLength(); const size_t realPrefixLength = _prefixLength > fullSearchTermLength ? fullSearchTermLength : _prefixLength; text = STRDUP_TtoT(searchTerm->text() + realPrefixLength); textLen = fullSearchTermLength - realPrefixLength; prefix = _CL_NEWARRAY(TCHAR,realPrefixLength+1); _tcsncpy(prefix, searchTerm->text(), realPrefixLength); prefix[realPrefixLength]='\0'; prefixLength = realPrefixLength; initializeMaxDistances(); Term* trm = _CLNEW Term(searchTerm->field(), prefix); // _CLNEW Term(term, prefix); -- not intern'd? setEnum(reader->terms(trm)); _CLLDECDELETE(trm); /* LEGACY: //Initialize e to NULL e = NULL; eWidth = 0; eHeight = 0; if(prefixLength > 0 && prefixLength < textLen){ this->prefixLength = prefixLength; prefix = _CL_NEWARRAY(TCHAR,prefixLength+1); _tcsncpy(prefix,text,prefixLength); prefix[prefixLength]='\0'; textLen = prefixLength; text[textLen]='\0'; } */ } FuzzyTermEnum::~FuzzyTermEnum(){ close(); } const char* FuzzyTermEnum::getObjectName() const{ return getClassName(); } const char* FuzzyTermEnum::getClassName(){ return "FuzzyTermEnum"; } bool FuzzyTermEnum::endEnum() { return _endEnum; } void FuzzyTermEnum::close(){ FilteredTermEnum::close(); //Finalize the searchTerm _CLDECDELETE(searchTerm); free(d); d=NULL; _CLDELETE_CARRAY(text); _CLDELETE_CARRAY(prefix); } bool FuzzyTermEnum::termCompare(Term* term) { //Func - Compares term with the searchTerm using the Levenshtein distance. //Pre - term is NULL or term points to a Term //Post - if pre(term) is NULL then false is returned otherwise // if the distance of the current term in the enumeration is bigger than the FUZZY_THRESHOLD // then true is returned if (term == NULL){ return false; //Note that endEnum is not set to true! } const TCHAR* termText = term->text(); const size_t termTextLen = term->textLength(); //Check if the field name of searchTerm of term match //(we can use == because fields are interned) if ( searchTerm->field() == term->field() && (prefixLength==0 || _tcsncmp(termText,prefix,prefixLength)==0 )) { const TCHAR* target = termText+prefixLength; const size_t targetLen = termTextLen-prefixLength; _similarity = similarity(target, targetLen); return (_similarity > minimumSimilarity); } _endEnum = true; return false; } float_t FuzzyTermEnum::difference() { return (float_t)((_similarity - minimumSimilarity) * scale_factor ); } // TODO: had synchronized in definition float_t FuzzyTermEnum::similarity(const TCHAR* target, const size_t m) { const size_t n = textLen; // TODO: remove after replacing n with textLen if (n == 0) { //we don't have anything to compare. That means if we just add //the letters for m we get the new word return prefixLength == 0 ? 0.0f : 1.0f - ((float_t) m / prefixLength); } if (m == 0) { return prefixLength == 0 ? 0.0f : 1.0f - ((float_t) n / prefixLength); } const uint32_t maxDistance = getMaxDistance(m); if ( maxDistance < (uint32_t)(abs((int32_t)(m-n))) ) { //just adding the characters of m to n or vice-versa results in //too many edits //for example "pre" length is 3 and "prefixes" length is 8. We can see that //given this optimal circumstance, the edit distance cannot be less than 5. //which is 8-3 or more precisesly Math.abs(3-8). //if our maximum edit distance is 4, then we can discard this word //without looking at it. return 0.0f; } //let's make sure we have enough room in our array to do the distance calculations. //Check if the array must be reallocated because it is too small or does not exist size_t dWidth = n+1; size_t dHeight = m+1; if (d == NULL){ dLen = dWidth*dHeight; d = (int32_t*)(malloc(sizeof(int32_t)*dLen)); } else if (dLen < dWidth*dHeight) { dLen = dWidth*dHeight; d = (int32_t*)(realloc(d, sizeof(int32_t)*dLen)); } memset(d,0,dLen); size_t i; // iterates through the source string size_t j; // iterates through the target string // init matrix d for (i = 0; i <= n; i++){ d[i + (0*dWidth)] = i; } for (j = 0; j <= m; j++){ d[0 + (j*dWidth)] = j; } int32_t __t; //temporary variable for min3 // start computing edit distance TCHAR s_i; // ith character of s for (i = 1; i <= n; i++) { size_t bestPossibleEditDistance = m; s_i = text[i - 1]; for (j = 1; j <= m; j++) { if (s_i != target[j-1]) { min3(d[i-1 + (j*dWidth)], d[i + ((j-1)*dWidth)], d[i-1 + ((j-1)*dWidth)]); d[i + (j*dWidth)] = __t+1; } else { min3(d[i-1 + (j*dWidth)]+1, d[i + ((j-1)*dWidth)]+1, d[i-1 + ((j-1)*dWidth)]); d[i + (j*dWidth)] = __t; } bestPossibleEditDistance = cl_min(bestPossibleEditDistance, d[i + (j*dWidth)]); } //After calculating row i, the best possible edit distance //can be found by finding the smallest value in a given column. //If the bestPossibleEditDistance is greater than the max distance, abort. if (i > maxDistance && bestPossibleEditDistance > maxDistance) { //equal is okay, but not greater //the closest the target can be to the text is just too far away. //this target is leaving the party early. return 0.0f; } } // this will return less than 0.0 when the edit distance is // greater than the number of characters in the shorter word. // but this was the formula that was previously used in FuzzyTermEnum, // so it has not been changed (even though minimumSimilarity must be // greater than 0.0) return 1.0f - ((float_t)d[n + m*dWidth] / (float_t) (prefixLength + cl_min(n, m))); } int32_t FuzzyTermEnum::getMaxDistance(const size_t m) { return (m < LUCENE_TYPICAL_LONGEST_WORD_IN_INDEX) ? maxDistances[m] : calculateMaxDistance(m); } void FuzzyTermEnum::initializeMaxDistances() { for (int32_t i = 0; i < LUCENE_TYPICAL_LONGEST_WORD_IN_INDEX; i++) { maxDistances[i] = calculateMaxDistance(i); } } int32_t FuzzyTermEnum::calculateMaxDistance(const size_t m) const { return (int32_t) ((1-minimumSimilarity) * (cl_min(textLen, m) + prefixLength)); } // TODO: Make ScoreTerm and ScoreTermQueue reside under FuzzyQuery class ScoreTerm { public: Term* term; float_t score; ScoreTerm(Term* _term, float_t _score):term(_term),score(_score){ } virtual ~ScoreTerm(){ _CLLDECDELETE(term); } }; class ScoreTermQueue : public PriorityQueue > { public: ScoreTermQueue(int32_t size){ initialize(size, true); } virtual ~ScoreTermQueue(){ } protected: bool lessThan(ScoreTerm* termA, ScoreTerm* termB) { if (termA->score == termB->score) return termA->term->compareTo(termB->term) > 0; else return termA->score < termB->score; } }; FuzzyQuery::FuzzyQuery(Term* term, float_t _minimumSimilarity, size_t _prefixLength): MultiTermQuery(term), minimumSimilarity(_minimumSimilarity), prefixLength(_prefixLength) { if ( minimumSimilarity < 0 ) minimumSimilarity = defaultMinSimilarity; CND_PRECONDITION(term != NULL,"term is NULL"); if (minimumSimilarity >= 1.0f) _CLTHROWA(CL_ERR_IllegalArgument,"minimumSimilarity >= 1"); else if (minimumSimilarity < 0.0f) _CLTHROWA(CL_ERR_IllegalArgument,"minimumSimilarity < 0"); } float_t FuzzyQuery::defaultMinSimilarity = 0.5f; int32_t FuzzyQuery::defaultPrefixLength = 0; FuzzyQuery::~FuzzyQuery(){ } float_t FuzzyQuery::getMinSimilarity() const { return minimumSimilarity; } size_t FuzzyQuery::getPrefixLength() const { return prefixLength; } TCHAR* FuzzyQuery::toString(const TCHAR* field) const{ StringBuffer buffer(100); // TODO: Have a better estimation for the initial buffer length Term* term = getTerm(false); // no need to increase ref count if ( field==NULL || _tcscmp(term->field(),field)!=0 ) { buffer.append(term->field()); buffer.appendChar( _T(':')); } buffer.append(term->text()); buffer.appendChar( _T('~') ); buffer.appendFloat(minimumSimilarity,1); buffer.appendBoost(getBoost()); return buffer.giveBuffer(); } const char* FuzzyQuery::getObjectName() const{ //Func - Returns the name of the query //Pre - true //post - The string FuzzyQuery has been returned return getClassName(); } const char* FuzzyQuery::getClassName(){ //Func - Returns the name of the query //Pre - true //post - The string FuzzyQuery has been returned return "FuzzyQuery"; } FuzzyQuery::FuzzyQuery(const FuzzyQuery& clone): MultiTermQuery(clone) { this->minimumSimilarity = clone.getMinSimilarity(); this->prefixLength = clone.getPrefixLength(); //if(prefixLength < 0) // _CLTHROWA(CL_ERR_IllegalArgument,"prefixLength < 0"); //else if(prefixLength >= clone.getTerm()->textLength()) _CLTHROWA(CL_ERR_IllegalArgument,"prefixLength >= term.textLength()"); } Query* FuzzyQuery::clone() const{ return _CLNEW FuzzyQuery(*this); } size_t FuzzyQuery::hashCode() const{ //todo: we should give the query a seeding value... but //need to do it for all hascode functions // TODO: does not conform with JL size_t val = Similarity::floatToByte(getBoost()) ^ getTerm()->hashCode(); val ^= Similarity::floatToByte(this->getMinSimilarity()); val ^= this->getPrefixLength(); return val; } bool FuzzyQuery::equals(Query* other) const{ if (this == other) return true; if (!(other->instanceOf(FuzzyQuery::getClassName()))) return false; FuzzyQuery* fq = static_cast(other); return (this->getBoost() == fq->getBoost()) && this->minimumSimilarity == fq->getMinSimilarity() && this->prefixLength == fq->getPrefixLength() && getTerm()->equals(fq->getTerm()); } FilteredTermEnum* FuzzyQuery::getEnum(IndexReader* reader){ Term* term = getTerm(false); FuzzyTermEnum* ret = _CLNEW FuzzyTermEnum(reader, term, minimumSimilarity, prefixLength); return ret; } Query* FuzzyQuery::rewrite(IndexReader* reader) { FilteredTermEnum* enumerator = getEnum(reader); const size_t maxClauseCount = BooleanQuery::getMaxClauseCount(); ScoreTermQueue* stQueue = _CLNEW ScoreTermQueue(maxClauseCount); ScoreTerm* reusableST = NULL; try { do { float_t score = 0.0f; Term* t = enumerator->term(); if (t != NULL) { score = enumerator->difference(); if (reusableST == NULL) { reusableST = _CLNEW ScoreTerm(t, score); } else if (score >= reusableST->score) { // reusableST holds the last "rejected" entry, so, if // this new score is not better than that, there's no // need to try inserting it reusableST->score = score; reusableST->term = t; } else { continue; } reusableST = stQueue->insertWithOverflow(reusableST); } } while (enumerator->next()); } _CLFINALLY({ enumerator->close(); _CLLDELETE(enumerator); //_CLLDELETE(reusableST); }); BooleanQuery* query = _CLNEW BooleanQuery(true); const size_t size = stQueue->size(); for(size_t i = 0; i < size; i++){ ScoreTerm* st = stQueue->pop(); TermQuery* tq = _CLNEW TermQuery(st->term); // found a match tq->setBoost(getBoost() * st->score); // set the boost query->add(tq, true, BooleanClause::SHOULD); // add to query _CLLDELETE(st); } _CLLDELETE(stQueue); return query; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/FuzzyQuery.h000066400000000000000000000161641154025176300230710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FuzzyQuery_ #define _lucene_search_FuzzyQuery_ #include "MultiTermQuery.h" #include "FilteredTermEnum.h" CL_CLASS_DEF(index,Term) CL_NS_DEF(search) /** Implements the fuzzy search query. The similiarity measurement * is based on the Levenshtein (edit distance) algorithm. */ class CLUCENE_EXPORT FuzzyQuery : public MultiTermQuery { private: float_t minimumSimilarity; size_t prefixLength; protected: FuzzyQuery(const FuzzyQuery& clone); public: static float_t defaultMinSimilarity; static int32_t defaultPrefixLength; /** * Create a new FuzzyQuery that will match terms with a similarity * of at least minimumSimilarity to term. * If a prefixLength > 0 is specified, a common prefix * of that length is also required. * * @param term the term to search for * @param minimumSimilarity a value between 0 and 1 to set the required similarity * between the query term and the matching terms. For example, for a * minimumSimilarity of 0.5 a term of the same length * as the query term is considered similar to the query term if the edit distance * between both terms is less than length(term)*0.5 * @param prefixLength length of common (non-fuzzy) prefix * @throws IllegalArgumentException if minimumSimilarity is > 1 or < 0 * or if prefixLength < 0 or > term.text().length(). */ FuzzyQuery(CL_NS(index)::Term* term, float_t minimumSimilarity=-1, size_t prefixLength=0); virtual ~FuzzyQuery(); /** * Returns the minimum similarity that is required for this query to match. * @return float value between 0.0 and 1.0 */ float_t getMinSimilarity() const; /** * Returns the prefix length, i.e. the number of characters at the start * of a term that must be identical (not fuzzy) to the query term if the query * is to match that term. */ size_t getPrefixLength() const; Query* rewrite(CL_NS(index)::IndexReader* reader); TCHAR* toString(const TCHAR* field) const; //Returns the name "FuzzyQuery" static const char* getClassName(); const char* getObjectName() const; Query* clone() const; bool equals(Query * other) const; size_t hashCode() const; protected: FilteredTermEnum* getEnum(CL_NS(index)::IndexReader* reader); }; /** Subclass of FilteredTermEnum for enumerating all terms that are similiar * to the specified filter term. * *

Term enumerations are always ordered by Term.compareTo(). Each term in * the enumeration is greater than all that precede it. */ class CLUCENE_EXPORT FuzzyTermEnum: public FilteredTermEnum { private: /* Allows us save time required to create a new array * everytime similarity is called. */ int32_t* d; size_t dLen; //float_t distance; float_t _similarity; bool _endEnum; CL_NS(index)::Term* searchTerm; //String field; TCHAR* text; size_t textLen; TCHAR* prefix; size_t prefixLength; float_t minimumSimilarity; double scale_factor; int32_t maxDistances[LUCENE_TYPICAL_LONGEST_WORD_IN_INDEX]; /****************************** * Compute Levenshtein distance ******************************/ /** *

Similarity returns a number that is 1.0f or less (including negative numbers) * based on how similar the Term is compared to a target term. It returns * exactly 0.0f when *

	*    editDistance < maximumEditDistance
* Otherwise it returns: *
	*    1 - (editDistance / length)
* where length is the length of the shortest term (text or target) including a * prefix that are identical and editDistance is the Levenshtein distance for * the two words.

* *

Embedded within this algorithm is a fail-fast Levenshtein distance * algorithm. The fail-fast algorithm differs from the standard Levenshtein * distance algorithm in that it is aborted if it is discovered that the * mimimum distance between the words is greater than some threshold. * *

To calculate the maximum distance threshold we use the following formula: *

	*     (1 - minimumSimilarity) * length
* where length is the shortest term including any prefix that is not part of the * similarity comparision. This formula was derived by solving for what maximum value * of distance returns false for the following statements: *
	*   similarity = 1 - ((float)distance / (float) (prefixLength + Math.min(textlen, targetlen)));
	*   return (similarity > minimumSimilarity);
* where distance is the Levenshtein distance for the two words. *

*

Levenshtein distance (also known as edit distance) is a measure of similiarity * between two strings where the distance is measured as the number of character * deletions, insertions or substitutions required to transform one string to * the other string. * @param target the target word or phrase * @return the similarity, 0.0 or less indicates that it matches less than the required * threshold and 1.0 indicates that the text and target are identical */ float_t similarity(const TCHAR* target, const size_t targetLen); /** * The max Distance is the maximum Levenshtein distance for the text * compared to some other value that results in score that is * better than the minimum similarity. * @param m the length of the "other value" * @return the maximum levenshtein distance that we care about */ int32_t getMaxDistance(const size_t m); void initializeMaxDistances(); int32_t calculateMaxDistance(const size_t m) const; protected: /** * The termCompare method in FuzzyTermEnum uses Levenshtein distance to * calculate the distance between the given term and the comparing term. */ bool termCompare(CL_NS(index)::Term* term) ; /** Returns the fact if the current term in the enumeration has reached the end */ bool endEnum(); public: /** * Constructor for enumeration of all terms from specified reader which share a prefix of * length prefixLength with term and which have a fuzzy similarity > * minSimilarity. *

* After calling the constructor the enumeration is already pointing to the first * valid term if such a term exists. * * @param reader Delivers terms. * @param term Pattern term. * @param minSimilarity Minimum required similarity for terms from the reader. Default value is 0.5f. * @param prefixLength Length of required common prefix. Default value is 0. * @throws IOException */ FuzzyTermEnum(CL_NS(index)::IndexReader* reader, CL_NS(index)::Term* term, float_t minSimilarity=FuzzyQuery::defaultMinSimilarity, size_t prefixLength=0); virtual ~FuzzyTermEnum(); /** Close the enumeration */ void close(); /** Returns the difference between the distance and the fuzzy threshold * multiplied by the scale factor */ float_t difference(); const char* getObjectName() const; static const char* getClassName(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/HitQueue.cpp000066400000000000000000000050401154025176300227670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "SearchHeader.h" #include "_HitQueue.h" CL_NS_DEF(search) void HitQueue::upHeap(){ size_t i = _size; ScoreDoc node = heap[i]; // save bottom node (WAS object) int32_t j = ((uint32_t)i) >> 1; while (j > 0 && lessThan(node,heap[j])) { heap[i] = heap[j]; // shift parents down i = j; j = ((uint32_t)j) >> 1; } heap[i] = node; // install saved node } void HitQueue::downHeap(){ size_t i = 1; ScoreDoc node = heap[i]; // save top node size_t j = i << 1; // find smaller child size_t k = j + 1; if (k <= _size && lessThan(heap[k], heap[j])) { j = k; } while (j <= _size && lessThan(heap[j],node)) { heap[i] = heap[j]; // shift up child i = j; j = i << 1; k = j + 1; if (k <= _size && lessThan(heap[k], heap[j])) { j = k; } } heap[i] = node; // install saved node } void HitQueue::adjustTop(){ downHeap(); } size_t HitQueue::size(){ return _size; } struct ScoreDoc& HitQueue::top(){ if ( _size == 0 ) _CLTHROWA(CL_ERR_IndexOutOfBounds, "Attempted to access empty hitqueue::top"); return heap[1]; } void HitQueue::put(struct ScoreDoc& element){ if ( _size>=maxSize ) _CLTHROWA(CL_ERR_IndexOutOfBounds,"add is out of bounds"); _size++; heap[_size] = element; upHeap(); } ScoreDoc HitQueue::pop(){ if (_size > 0) { ScoreDoc result = heap[1]; // save first value heap[1] = heap[_size]; // move last to first _size--; downHeap(); // adjust heap return result; } else _CLTHROWA(CL_ERR_IndexOutOfBounds, "Attempted to access empty hitqueue::top"); } bool HitQueue::insert(struct ScoreDoc& element){ if(_size < maxSize){ put(element); return true; }else if(_size > 0 && !lessThan(element, heap[1])){ heap[1] = element; adjustTop(); return true; }else return false; } HitQueue::HitQueue(const int32_t maxSize){ _size = 0; this->maxSize = maxSize; int32_t heapSize = maxSize + 1; heap = new ScoreDoc[heapSize]; } HitQueue::~HitQueue(){ delete [] heap; } bool HitQueue::lessThan(struct ScoreDoc& hitA, struct ScoreDoc& hitB){ if (hitA.score == hitB.score) return hitA.doc > hitB.doc; else return hitA.score < hitB.score; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Hits.cpp000066400000000000000000000126461154025176300221570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Hits.h" #include "SearchHeader.h" #include "CLucene/document/Document.h" #include "CLucene/index/IndexReader.h" #include "Filter.h" #include "CLucene/search/SearchHeader.h" #include "CLucene/search/IndexSearcher.h" CL_NS_USE(document) CL_NS_USE(util) CL_NS_USE(index) CL_NS_DEF(search) HitDoc::HitDoc(const float_t s, const int32_t i) { //Func - Constructor //Pre - true //Post - The instance has been created next = NULL; prev = NULL; doc = NULL; score = s; id = i; } HitDoc::~HitDoc(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed _CLLDELETE(doc); } Hits::Hits(Searcher* s, Query* q, Filter* f, const Sort* _sort): query(q), searcher(s), filter(f), sort(_sort) , _length(0), first(NULL), last(NULL), numDocs(0), maxDocs(200), nDeletedHits(0), debugCheckedForDeletions(false) { //Func - Constructor //Pre - s contains a valid reference to a searcher s // q contains a valid reference to a Query // f is NULL or contains a pointer to a filter //Post - The instance has been created hitDocs = _CLNEW CL_NS(util)::CLVector >; nDeletions = countDeletions(s); //retrieve 100 initially getMoreDocs(50); _lengthAtStart = _length; } Hits::~Hits(){ _CLLDELETE(hitDocs); } // count # deletions, return -1 if unknown. int32_t Hits::countDeletions(CL_NS(search)::Searcher* s) { int32_t cnt = -1; if ( s->getObjectName() == IndexSearcher::getClassName() ) { cnt = s->maxDoc() - static_cast(s)->getReader()->numDocs(); } return cnt; } size_t Hits::length() const { return _length; } Document& Hits::doc(const int32_t n){ HitDoc* hitDoc = getHitDoc(n); // Update LRU cache of documents remove(hitDoc); // remove from list, if there addToFront(hitDoc); // add to front of list if (numDocs > maxDocs) { // if cache is full HitDoc* oldLast = last; remove(last); // flush last _CLLDELETE( oldLast->doc ); oldLast->doc = NULL; } if (hitDoc->doc == NULL){ hitDoc->doc = _CLNEW Document; searcher->doc(hitDoc->id, hitDoc->doc); // cache miss: read document } return *hitDoc->doc; } int32_t Hits::id (const int32_t n){ return getHitDoc(n)->id; } float_t Hits::score(const int32_t n){ return getHitDoc(n)->score; } void Hits::getMoreDocs(const size_t m){ size_t _min = m; if ( hitDocs->size() > _min) _min = hitDocs->size(); size_t n = _min * 2; // double # retrieved TopDocs* topDocs = NULL; if ( sort==NULL ) topDocs = (TopDocs*)((Searchable*)searcher)->_search(query, filter, n); else topDocs = (TopDocs*)((Searchable*)searcher)->_search(query, filter, n, sort); _length = topDocs->totalHits; ScoreDoc* scoreDocs = topDocs->scoreDocs; size_t scoreDocsLength = topDocs->scoreDocsLength; float_t scoreNorm = 1.0f; //Check that scoreDocs is a valid pointer before using it if (scoreDocs != NULL){ if (_length > 0 && scoreDocs[0].score > 1.0f){ scoreNorm = 1.0f / scoreDocs[0].score; } int32_t start = hitDocs->size() - nDeletedHits; // any new deletions? int32_t nDels2 = countDeletions(searcher); debugCheckedForDeletions = false; if (nDeletions < 0 || nDels2 > nDeletions) { // either we cannot count deletions, or some "previously valid hits" might have been deleted, so find exact start point nDeletedHits = 0; debugCheckedForDeletions = true; size_t i2 = 0; for (size_t i1=0; i1size() && i2 < scoreDocsLength; i1++) { int32_t id1 = ((*hitDocs)[i1])->id; int32_t id2 = scoreDocs[i2].doc; if (id1 == id2) { i2++; } else { nDeletedHits++; } } start = i2; } size_t end = scoreDocsLength < _length ? scoreDocsLength : _length; _length += nDeletedHits; for (size_t i = start; i < end; i++) { hitDocs->push_back(_CLNEW HitDoc(scoreDocs[i].score * scoreNorm, scoreDocs[i].doc)); } nDeletions = nDels2; } _CLDELETE(topDocs); } HitDoc* Hits::getHitDoc(const size_t n){ if (n >= _lengthAtStart){ TCHAR buf[100]; _sntprintf(buf, 100,_T("Not a valid hit number: %d"), (int)n); _CLTHROWT(CL_ERR_IndexOutOfBounds, buf ); } if (n >= hitDocs->size()) getMoreDocs(n); if (n >= _length) { TCHAR buf[100]; _sntprintf(buf, 100,_T("Not a valid hit number: %d"), (int)n); _CLTHROWT(CL_ERR_ConcurrentModification, buf ); } return (*hitDocs)[n]; } void Hits::addToFront(HitDoc* hitDoc) { // insert at front of cache if (first == NULL) last = hitDoc; else first->prev = hitDoc; hitDoc->next = first; first = hitDoc; hitDoc->prev = NULL; numDocs++; } void Hits::remove(const HitDoc* hitDoc) { // remove from cache if (hitDoc->doc == NULL) // it's not in the list return; // abort if (hitDoc->next == NULL) last = hitDoc->prev; else hitDoc->next->prev = hitDoc->prev; if (hitDoc->prev == NULL) first = hitDoc->next; else hitDoc->prev->next = hitDoc->next; numDocs--; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Hits.h000066400000000000000000000070521154025176300216170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Hits_h #define _lucene_search_Hits_h #include "CLucene/util/VoidList.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(document,Document) CL_NS_DEF(search) class Query; class Searcher; class Filter; class HitDoc; class Sort; /** A ranked list of documents, used to hold search results. *

* Caution: Iterate only over the hits needed. Iterating over all * hits is generally not desirable and may be the source of * performance issues. If you need to iterate over many or all hits, consider * using the search method that takes a {@link HitCollector}. *

*

Note: Deleting matching documents concurrently with traversing * the hits, might, when deleting hits that were not yet retrieved, decrease * {@link #length()}. In such case, * {@link java.util.ConcurrentModificationException ConcurrentModificationException} * is thrown when accessing hit n ≥ current_{@link #length()} * (but n < {@link #length()}_at_start). */ class CLUCENE_EXPORT Hits { private: Query* query; Searcher* searcher; Filter* filter; const Sort* sort; size_t _length; // the total number of hits CL_NS(util)::CLVector >* hitDocs; // cache of hits retrieved HitDoc* first; // head of LRU cache HitDoc* last; // tail of LRU cache int32_t numDocs; // number cached int32_t maxDocs; // max to cache int32_t nDeletions; // # deleted docs in the index. size_t _lengthAtStart; // this is the number apps usually count on (although deletions can bring it down). int32_t nDeletedHits; // # of already collected hits that were meanwhile deleted. bool debugCheckedForDeletions; // for test purposes. /** * Tries to add new documents to hitDocs. * Ensures that the hit numbered _min has been retrieved. */ void getMoreDocs(const size_t _min); /** Returns the score for the nth document in this set. */ HitDoc* getHitDoc(const size_t n); void addToFront(HitDoc* hitDoc); void remove(const HitDoc* hitDoc); public: Hits(Searcher* s, Query* q, Filter* f, const Sort* sort=NULL); virtual ~Hits(); /** Returns the total number of hits available in this set. */ size_t length() const; /** Returns the stored fields of the nth document in this set. *

Documents are cached, so that repeated requests for the same element may * return the same Document object. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error * * @memory Memory belongs to the hits object. Don't delete the return value. */ CL_NS(document)::Document& doc(const int32_t n); /** Returns the id for the nth document in this set. * Note that ids may change when the index changes, so you cannot * rely on the id to be stable. */ int32_t id (const int32_t n); /** Returns the score for the nth document in this set. */ float_t score(const int32_t n); /** count # deletions, return -1 if unknown. */ int32_t countDeletions(CL_NS(search)::Searcher* s); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/IndexSearcher.cpp000066400000000000000000000265371154025176300240000ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexSearcher.h" #include "SearchHeader.h" #include "Scorer.h" #include "_HitQueue.h" #include "Query.h" #include "Filter.h" #include "_FieldDocSortedHitQueue.h" #include "CLucene/store/Directory.h" #include "CLucene/document/Document.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/Term.h" #include "CLucene/util/BitSet.h" #include "FieldSortedHitQueue.h" #include "Explanation.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(document) CL_NS_DEF(search) class SimpleTopDocsCollector:public HitCollector{ private: float_t minScore; const CL_NS(util)::BitSet* bits; HitQueue* hq; size_t nDocs; int32_t* totalHits; public: SimpleTopDocsCollector(const CL_NS(util)::BitSet* bs, HitQueue* hitQueue, int32_t* totalhits, size_t ndocs, const float_t ms=-1.0f): minScore(ms), bits(bs), hq(hitQueue), nDocs(ndocs), totalHits(totalhits) { } ~SimpleTopDocsCollector(){} void collect(const int32_t doc, const float_t score){ if (score > 0.0f && // ignore zeroed buckets (bits==NULL || bits->get(doc))) { // skip docs not in bits ++totalHits[0]; if (hq->size() < nDocs || (minScore==-1.0f || score >= minScore)) { ScoreDoc sd = {doc, score}; hq->insert(sd); // update hit queue if ( minScore != -1.0f ) minScore = hq->top().score; // maintain minScore } } } }; class SortedTopDocsCollector:public HitCollector{ private: const CL_NS(util)::BitSet* bits; FieldSortedHitQueue* hq; size_t nDocs; int32_t* totalHits; public: SortedTopDocsCollector(const CL_NS(util)::BitSet* bs, FieldSortedHitQueue* hitQueue, int32_t* totalhits, size_t _nDocs): bits(bs), hq(hitQueue), nDocs(_nDocs), totalHits(totalhits) { } ~SortedTopDocsCollector(){ } void collect(const int32_t doc, const float_t score){ if (score > 0.0f && // ignore zeroed buckets (bits==NULL || bits->get(doc))) { // skip docs not in bits ++totalHits[0]; FieldDoc* fd = _CLNEW FieldDoc(doc, score); //todo: see jlucene way... with fields def??? if ( !hq->insert(fd) ) // update hit queue _CLDELETE(fd); } } }; class SimpleFilteredCollector: public HitCollector{ private: CL_NS(util)::BitSet* bits; HitCollector* results; public: SimpleFilteredCollector(CL_NS(util)::BitSet* bs, HitCollector* collector): bits(bs), results(collector) { } ~SimpleFilteredCollector(){ } protected: void collect(const int32_t doc, const float_t score){ if (bits->get(doc)) { // skip docs not in bits results->collect(doc, score); } } }; IndexSearcher::IndexSearcher(const char* path){ //Func - Constructor // Creates a searcher searching the index in the named directory. */ //Pre - path != NULL //Post - The instance has been created CND_PRECONDITION(path != NULL, "path is NULL"); reader = IndexReader::open(path); readerOwner = true; } IndexSearcher::IndexSearcher(CL_NS(store)::Directory* directory){ //Func - Constructor // Creates a searcher searching the index in the specified directory. */ //Pre - path != NULL //Post - The instance has been created CND_PRECONDITION(directory != NULL, "directory is NULL"); reader = IndexReader::open(directory); readerOwner = true; } IndexSearcher::IndexSearcher(IndexReader* r){ //Func - Constructor // Creates a searcher searching the index with the provide IndexReader //Pre - path != NULL //Post - The instance has been created reader = r; readerOwner = false; } IndexSearcher::~IndexSearcher(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed close(); } void IndexSearcher::close(){ //Func - Frees resources associated with this Searcher. //Pre - true //Post - The resources associated have been freed if (readerOwner && reader){ reader->close(); _CLDELETE(reader); } } // inherit javadoc int32_t IndexSearcher::docFreq(const Term* term) const{ //Func - //Pre - reader != NULL //Post - CND_PRECONDITION(reader != NULL, "reader is NULL"); return reader->docFreq(term); } _CL_DEPRECATED( doc(i, document) ) CL_NS(document)::Document* IndexSearcher::doc(int32_t i){ CL_NS(document)::Document* ret = _CLNEW CL_NS(document)::Document; if (!doc(i,ret) ) _CLDELETE(ret); return ret; } // inherit javadoc bool IndexSearcher::doc(int32_t i, CL_NS(document)::Document& d) { //Func - Retrieves i-th document found // For use by HitCollector implementations. //Pre - reader != NULL //Post - The i-th document has been returned CND_PRECONDITION(reader != NULL, "reader is NULL"); return reader->document(i,d); } bool IndexSearcher::doc(int32_t i, CL_NS(document)::Document* d) { //Func - Retrieves i-th document found // For use by HitCollector implementations. //Pre - reader != NULL //Post - The i-th document has been returned CND_PRECONDITION(reader != NULL, "reader is NULL"); return reader->document(i,*d); } // inherit javadoc int32_t IndexSearcher::maxDoc() const { //Func - Return total number of documents including the ones marked deleted //Pre - reader != NULL //Post - The total number of documents including the ones marked deleted // has been returned CND_PRECONDITION(reader != NULL, "reader is NULL"); return reader->maxDoc(); } //todo: find out why we are passing Query* and not Weight*, as Weight is being extracted anyway from Query* TopDocs* IndexSearcher::_search(Query* query, Filter* filter, const int32_t nDocs){ //Func - //Pre - reader != NULL //Post - CND_PRECONDITION(reader != NULL, "reader is NULL"); CND_PRECONDITION(query != NULL, "query is NULL"); Weight* weight = query->weight(this); Scorer* scorer = weight->scorer(reader); if (scorer == NULL) { Query* wq = weight->getQuery(); if (wq != query) _CLLDELETE(wq); _CLLDELETE(weight); return _CLNEW TopDocs(0, NULL, 0); } BitSet* bits = filter != NULL ? filter->bits(reader) : NULL; HitQueue* hq = _CLNEW HitQueue(nDocs); //Check hq has been allocated properly CND_CONDITION(hq != NULL, "Could not allocate memory for HitQueue hq"); int32_t* totalHits = _CL_NEWARRAY(int32_t,1); totalHits[0] = 0; SimpleTopDocsCollector hitCol(bits,hq,totalHits,nDocs,0.0f); scorer->score( &hitCol ); _CLDELETE(scorer); int32_t scoreDocsLength = hq->size(); ScoreDoc* scoreDocs = new ScoreDoc[scoreDocsLength]; for (int32_t i = scoreDocsLength-1; i >= 0; --i) // put docs in array scoreDocs[i] = hq->pop(); int32_t totalHitsInt = totalHits[0]; _CLDELETE(hq); if ( bits != NULL && filter->shouldDeleteBitSet(bits) ) _CLDELETE(bits); _CLDELETE_ARRAY(totalHits); Query* wq = weight->getQuery(); if ( query != wq ) //query was re-written _CLLDELETE(wq); _CLDELETE(weight); return _CLNEW TopDocs(totalHitsInt, scoreDocs, scoreDocsLength); } // inherit javadoc TopFieldDocs* IndexSearcher::_search(Query* query, Filter* filter, const int32_t nDocs, const Sort* sort) { CND_PRECONDITION(reader != NULL, "reader is NULL"); CND_PRECONDITION(query != NULL, "query is NULL"); Weight* weight = query->weight(this); Scorer* scorer = weight->scorer(reader); if (scorer == NULL){ return _CLNEW TopFieldDocs(0, NULL, 0, NULL ); } BitSet* bits = filter != NULL ? filter->bits(reader) : NULL; FieldSortedHitQueue hq(reader, sort->getSort(), nDocs); int32_t* totalHits = _CL_NEWARRAY(int32_t,1); totalHits[0]=0; SortedTopDocsCollector hitCol(bits,&hq,totalHits,nDocs); scorer->score(&hitCol); _CLLDELETE(scorer); int32_t hqLen = hq.size(); FieldDoc** fieldDocs = _CL_NEWARRAY(FieldDoc*,hqLen); for (int32_t i = hqLen-1; i >= 0; --i){ // put docs in array fieldDocs[i] = hq.fillFields (hq.pop()); } Query* wq = weight->getQuery(); if ( query != wq ) //query was re-written _CLLDELETE(wq); _CLLDELETE(weight); SortField** hqFields = hq.getFields(); hq.setFields(NULL); //move ownership of memory over to TopFieldDocs int32_t totalHits0 = totalHits[0]; if ( bits != NULL && filter->shouldDeleteBitSet(bits) ) _CLLDELETE(bits); _CLDELETE_LARRAY(totalHits); return _CLNEW TopFieldDocs(totalHits0, fieldDocs, hqLen, hqFields ); } void IndexSearcher::_search(Query* query, Filter* filter, HitCollector* results){ //Func - _search an index and fetch the results // Applications should only use this if they need all of the // matching documents. The high-level search API (search(Query)) is usually more efficient, // as it skips non-high-scoring hits. //Pre - query is a valid reference to a query // filter may or may not be NULL // results is a valid reference to a HitCollector and used to store the results //Post - filter if non-NULL, a bitset used to eliminate some documents CND_PRECONDITION(reader != NULL, "reader is NULL"); CND_PRECONDITION(query != NULL, "query is NULL"); BitSet* bits = NULL; SimpleFilteredCollector* fc = NULL; if (filter != NULL){ bits = filter->bits(reader); fc = _CLNEW SimpleFilteredCollector(bits, results); } Weight* weight = query->weight(this); Scorer* scorer = weight->scorer(reader); if (scorer != NULL) { if (fc == NULL){ scorer->score(results); }else{ scorer->score((HitCollector*)fc); } _CLDELETE(scorer); } _CLLDELETE(fc); Query* wq = weight->getQuery(); if (wq != query) // query was rewritten _CLLDELETE(wq); _CLLDELETE(weight); if ( bits != NULL && filter->shouldDeleteBitSet(bits) ) _CLLDELETE(bits); } Query* IndexSearcher::rewrite(Query* original) { Query* query = original; Query* last = original; for (Query* rewrittenQuery = query->rewrite(reader); rewrittenQuery != query; rewrittenQuery = query->rewrite(reader)) { query = rewrittenQuery; if ( query != last && last != original ){ _CLLDELETE(last); } last = query; } return query; } void IndexSearcher::explain(Query* query, int32_t doc, Explanation* ret){ Weight* weight = query->weight(this); ret->addDetail(weight->explain(reader, doc)); // TODO: A hack until this function will return Explanation* as well Query* wq = weight->getQuery(); if ( query != wq ) //query was re-written _CLLDELETE(wq); _CLDELETE(weight); } CL_NS(index)::IndexReader* IndexSearcher::getReader(){ return reader; } const char* IndexSearcher::getClassName(){ return "IndexSearcher"; } const char* IndexSearcher::getObjectName() const{ return IndexSearcher::getClassName(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/IndexSearcher.h000066400000000000000000000054701154025176300234360ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_IndexSearcher_ #define _lucene_search_IndexSearcher_ #include "Searchable.h" CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(document,Document) CL_CLASS_DEF(index,Term) CL_CLASS_DEF(search,TopDocs) CL_CLASS_DEF(search,TopFieldDocs) CL_CLASS_DEF(search,Query) CL_CLASS_DEF(search,Filter) CL_CLASS_DEF(search,Sort) CL_CLASS_DEF(search,HitCollector) CL_CLASS_DEF(search,Explanation) CL_CLASS_DEF(index,IndexReader) //#include "CLucene/index/IndexReader.h" //#include "CLucene/util/BitSet.h" //#include "HitQueue.h" //#include "FieldSortedHitQueue.h" CL_NS_DEF(search) /** Implements search over a single IndexReader. * *

Applications usually need only call the inherited {@link search(Query*)} * or {@link search(Query*,Filter*)} methods. */ class CLUCENE_EXPORT IndexSearcher:public Searcher{ CL_NS(index)::IndexReader* reader; bool readerOwner; public: /** Creates a searcher searching the index in the named directory. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ IndexSearcher(const char* path); /** Creates a searcher searching the index in the provided directory. * @throws CorruptIndexException if the index is corrupt * @throws IOException if there is a low-level IO error */ IndexSearcher(CL_NS(store)::Directory* directory); /** Creates a searcher searching the provided index. */ IndexSearcher(CL_NS(index)::IndexReader* r); ~IndexSearcher(); /** * Note that the underlying IndexReader is not closed, if * IndexSearcher was constructed with IndexSearcher(IndexReader r). * If the IndexReader was supplied implicitly by specifying a directory, then * the IndexReader gets closed. */ void close(); int32_t docFreq(const CL_NS(index)::Term* term) const; bool doc(int32_t i, CL_NS(document)::Document& document); bool doc(int32_t i, CL_NS(document)::Document* document); _CL_DEPRECATED( doc(i, document) ) CL_NS(document)::Document* doc(int32_t i); int32_t maxDoc() const; TopDocs* _search(Query* query, Filter* filter, const int32_t nDocs); TopFieldDocs* _search(Query* query, Filter* filter, const int32_t nDocs, const Sort* sort); void _search(Query* query, Filter* filter, HitCollector* results); CL_NS(index)::IndexReader* getReader(); Query* rewrite(Query* original); void explain(Query* query, int32_t doc, Explanation* ret); virtual const char* getObjectName() const; static const char* getClassName(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/MatchAllDocsQuery.cpp000066400000000000000000000122251154025176300245650ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Query.h" #include "MatchAllDocsQuery.h" #include "Explanation.h" #include "SearchHeader.h" #include "Searchable.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" CL_NS_DEF(search) class MatchAllDocsQuery::MatchAllDocsWeight : public Weight { private: Similarity* similarity; float_t queryWeight; float_t queryNorm; MatchAllDocsQuery* parentQuery; public: MatchAllDocsWeight(MatchAllDocsQuery* enclosingInstance, Searcher* searcher); virtual ~MatchAllDocsWeight(){} virtual TCHAR* toString(); Query* getQuery(); float_t getValue(); float_t sumOfSquaredWeights(); void normalize(float_t _queryNorm); Scorer* scorer(CL_NS(index)::IndexReader* reader); Explanation* explain(CL_NS(index)::IndexReader* reader, int32_t doc); }; class MatchAllDocsQuery::MatchAllScorer : public Scorer { CL_NS(index)::IndexReader* reader; int32_t id; int32_t maxId; float_t _score; public: MatchAllScorer(CL_NS(index)::IndexReader* _reader, Similarity* similarity, Weight* w); virtual ~MatchAllScorer(){} Explanation* explain(int32_t doc); int32_t doc() const; bool next(); float_t score(); bool skipTo(int32_t target); virtual TCHAR* toString(); }; MatchAllDocsQuery::MatchAllScorer::MatchAllScorer(CL_NS(index)::IndexReader* _reader, Similarity* similarity, Weight* w) :Scorer(similarity),reader(_reader),id(-1) { maxId = reader->maxDoc() - 1; _score = w->getValue(); } Explanation* MatchAllDocsQuery::MatchAllScorer::explain(int32_t doc) { // not called... see MatchAllDocsWeight::explain() return NULL; } int32_t MatchAllDocsQuery::MatchAllScorer::doc() const { return id; } bool MatchAllDocsQuery::MatchAllScorer::next() { while (id < maxId) { id++; if (!reader->isDeleted(id)) { return true; } } return false; } float_t MatchAllDocsQuery::MatchAllScorer::score() { return _score; } bool MatchAllDocsQuery::MatchAllScorer::skipTo(int32_t target) { id = target - 1; return next(); } TCHAR* MatchAllDocsQuery::MatchAllScorer::toString(){ return stringDuplicate(_T("MatchAllScorer")); } MatchAllDocsQuery::MatchAllDocsWeight::MatchAllDocsWeight(MatchAllDocsQuery* enclosingInstance, Searcher* searcher): parentQuery(enclosingInstance){ this->similarity = searcher->getSimilarity(); } TCHAR* MatchAllDocsQuery::MatchAllDocsWeight::toString() { CL_NS(util)::StringBuffer buf(50); buf.append(_T("weight(")); TCHAR* t = parentQuery->toString(); buf.append(t); _CLDELETE_LCARRAY(t); buf.appendChar(_T(')')); return buf.giveBuffer(); } Query* MatchAllDocsQuery::MatchAllDocsWeight::getQuery() { return parentQuery; } float_t MatchAllDocsQuery::MatchAllDocsWeight::getValue() { return queryWeight; } float_t MatchAllDocsQuery::MatchAllDocsWeight::sumOfSquaredWeights() { queryWeight = parentQuery->getBoost(); return queryWeight * queryWeight; } void MatchAllDocsQuery::MatchAllDocsWeight::normalize(float_t _queryNorm) { this->queryNorm = _queryNorm; queryWeight *= this->queryNorm; } Scorer* MatchAllDocsQuery::MatchAllDocsWeight::scorer(CL_NS(index)::IndexReader* reader) { return _CLNEW MatchAllScorer(reader, similarity, this); } Explanation* MatchAllDocsQuery::MatchAllDocsWeight::explain(CL_NS(index)::IndexReader* reader, int32_t doc) { // explain query weight Explanation* queryExpl = _CLNEW ComplexExplanation(true, getValue(), _T("MatchAllDocsQuery, product of:")); if (parentQuery->getBoost() != 1.0f) { queryExpl->addDetail(_CLNEW Explanation(parentQuery->getBoost(),_T("boost"))); } queryExpl->addDetail(_CLNEW Explanation(queryNorm,_T("queryNorm"))); return queryExpl; } MatchAllDocsQuery::MatchAllDocsQuery(){} MatchAllDocsQuery::~MatchAllDocsQuery(){} Weight* MatchAllDocsQuery::_createWeight(Searcher* searcher){ return _CLNEW MatchAllDocsWeight(this, searcher); } const char* MatchAllDocsQuery::getClassName() { return "MatchAllDocsQuery"; } const char* MatchAllDocsQuery::getObjectName() const{ return getClassName(); } TCHAR* MatchAllDocsQuery::toString(const TCHAR* /*field*/) const{ CL_NS(util)::StringBuffer buffer(25); buffer.append(_T("MatchAllDocsQuery")); buffer.appendBoost(getBoost()); return buffer.giveBuffer(); } MatchAllDocsQuery::MatchAllDocsQuery(const MatchAllDocsQuery& clone): Query(clone) { } Query* MatchAllDocsQuery::clone() const{ return _CLNEW MatchAllDocsQuery(*this); } void MatchAllDocsQuery::extractTerms( TermSet * termset ) const { } bool MatchAllDocsQuery::equals(Query* o) const{ if (!(o->instanceOf(MatchAllDocsQuery::getClassName()))) return false; MatchAllDocsQuery* other = static_cast(o); return this->getBoost() == other->getBoost(); } size_t MatchAllDocsQuery::hashCode() const{ return (static_cast(getBoost())) ^ 0x1AA71190; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/MatchAllDocsQuery.h000066400000000000000000000045171154025176300242370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_MatchAllDocsQuery_h #define _lucene_search_MatchAllDocsQuery_h #include "Scorer.h" #include "SearchHeader.h" #include "Query.h" CL_CLASS_DEF(search,Explanation) CL_CLASS_DEF(search,Similarity) CL_CLASS_DEF(index,IndexReader) CL_NS_DEF(search) class Weight; /** * A query that matches all documents. * */ class CLUCENE_EXPORT MatchAllDocsQuery : public Query { protected: MatchAllDocsQuery(const MatchAllDocsQuery& clone); public: MatchAllDocsQuery(); virtual ~MatchAllDocsQuery(); class MatchAllScorer; class MatchAllDocsWeight; /** Prints a query to a string, with field assumed to be the * default field and omitted. *

The representation used is one that is supposed to be readable * by {@link org.apache.lucene.queryParser.QueryParser QueryParser}. However, * there are the following limitations: *

    *
  • If the query was created by the parser, the printed * representation may not be exactly what was parsed. For example, * characters that need to be escaped will be represented without * the required backslash.
  • *
  • Some of the more complicated queries (e.g. span queries) * don't have a representation that can be parsed by QueryParser.
  • *
*/ virtual TCHAR* toString(const TCHAR* field = NULL) const; protected: /** Expert: Constructs an appropriate Weight implementation for this query. * *

Only implemented by primitive queries, which re-write to themselves. * This is an Internal function */ virtual Weight* _createWeight(Searcher* searcher); public: /** Returns a clone of this query. */ virtual Query* clone() const; /** Expert: MatchAllDocsQuery provides no terms at all. */ void extractTerms( TermSet * termset ) const; virtual bool equals(Query* o) const; virtual size_t hashCode() const; static const char* getClassName(); const char* getObjectName() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/MultiPhraseQuery.cpp000066400000000000000000000316441154025176300245320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MultiPhraseQuery.h" #include "SearchHeader.h" #include "BooleanClause.h" #include "BooleanQuery.h" #include "TermQuery.h" #include "Explanation.h" #include "Similarity.h" #include "CLucene/index/_Term.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/MultipleTermPositions.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/VoidList.h" #include "CLucene/util/_Arrays.h" #include "_ExactPhraseScorer.h" #include "_SloppyPhraseScorer.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) class MultiPhraseWeight : public Weight { private: Similarity* similarity; float_t value; float_t idf; float_t queryNorm; float_t queryWeight; MultiPhraseQuery* parentQuery; public: MultiPhraseWeight(Searcher* searcher, MultiPhraseQuery* _parentQuery) : similarity(_parentQuery->getSimilarity(searcher)), value(0), idf(0), queryNorm(0), queryWeight(0), parentQuery(_parentQuery) { // compute idf for (size_t i = 0; i < parentQuery->termArrays->size(); i++){ ArrayBase* terms = parentQuery->termArrays->at(i); for ( size_t j=0;jlength;j++ ){ idf += parentQuery->getSimilarity(searcher)->idf(terms->values[j], searcher); } } } virtual ~MultiPhraseWeight(){}; Query* getQuery() { return parentQuery; } float_t getValue() { return value; } float_t sumOfSquaredWeights() { queryWeight = idf * parentQuery->getBoost(); // compute query weight return queryWeight * queryWeight; // square it } void normalize(float_t _queryNorm) { this->queryNorm = _queryNorm; queryWeight *= _queryNorm; // normalize query weight value = queryWeight * idf; // idf for document } Scorer* scorer(IndexReader* reader) { const size_t termArraysSize = parentQuery->termArrays->size(); if (termArraysSize == 0) // optimize zero-term case return NULL; TermPositions** tps = _CL_NEWARRAY(TermPositions*,termArraysSize+1); for (size_t i=0; i* terms = parentQuery->termArrays->at(i); TermPositions* p; if (terms->length > 1 ) p = _CLNEW MultipleTermPositions(reader, terms); else p = reader->termPositions((*terms)[0]); if (p == NULL) return NULL; tps[i] = p; } tps[termArraysSize] = NULL; Scorer* ret = NULL; ValueArray positions; parentQuery->getPositions(positions); const int32_t slop = parentQuery->getSlop(); if (slop == 0) ret = _CLNEW ExactPhraseScorer(this, tps, positions.values, similarity, reader->norms(parentQuery->field)); else ret = _CLNEW SloppyPhraseScorer(this, tps, positions.values, similarity, slop, reader->norms(parentQuery->field)); positions.deleteArray(); //tps can be deleted safely. SloppyPhraseScorer or ExactPhraseScorer will take care //of its values _CLDELETE_LARRAY(tps); return ret; } Explanation* explain(IndexReader* reader, int32_t doc){ ComplexExplanation* result = _CLNEW ComplexExplanation(); StringBuffer buf(100); buf.append(_T("weight(")); TCHAR* queryString = getQuery()->toString(); buf.append(queryString); buf.append(_T(" in ")); buf.appendInt(doc); buf.append(_T("), product of:")); result->setDescription(buf.getBuffer()); buf.clear(); buf.append(_T("idf(")); buf.append(queryString); buf.appendChar(_T(')')); Explanation* idfExpl = _CLNEW Explanation(idf, buf.getBuffer()); buf.clear(); // explain query weight Explanation* queryExpl = _CLNEW Explanation(); buf.append(_T("queryWeight(")); buf.append(queryString); buf.append(_T("), product of:")); queryExpl->setDescription(buf.getBuffer()); buf.clear(); Explanation* boostExpl = _CLNEW Explanation(parentQuery->getBoost(), _T("boost")); if (parentQuery->getBoost() != 1.0f) queryExpl->addDetail(boostExpl); queryExpl->addDetail(idfExpl); Explanation* queryNormExpl = _CLNEW Explanation(queryNorm,_T("queryNorm")); queryExpl->addDetail(queryNormExpl); queryExpl->setValue(boostExpl->getValue() * idfExpl->getValue() * queryNormExpl->getValue()); result->addDetail(queryExpl); // explain field weight ComplexExplanation* fieldExpl = _CLNEW ComplexExplanation(); buf.append(_T("fieldWeight(")); buf.append(queryString); buf.append(_T(" in ")); buf.appendInt(doc); buf.append(_T("), product of:")); fieldExpl->setDescription(buf.getBuffer()); buf.clear(); _CLDELETE_LCARRAY(queryString); Explanation* tfExpl = scorer(reader)->explain(doc); fieldExpl->addDetail(tfExpl); fieldExpl->addDetail(idfExpl); Explanation* fieldNormExpl = _CLNEW Explanation(); uint8_t* fieldNorms = reader->norms(parentQuery->field); float_t fieldNorm = fieldNorms!=NULL ? Similarity::decodeNorm(fieldNorms[doc]) : 0.0f; fieldNormExpl->setValue(fieldNorm); buf.append(_T("fieldNorm(field=")); buf.append(parentQuery->field); buf.append(_T(", doc=")); buf.appendInt(doc); buf.appendChar(_T(')')); fieldNormExpl->setDescription(buf.getBuffer()); buf.clear(); fieldExpl->addDetail(fieldNormExpl); fieldExpl->setMatch(tfExpl->isMatch()); fieldExpl->setValue(tfExpl->getValue() * idfExpl->getValue() * fieldNormExpl->getValue()); if (queryExpl->getValue() == 1.0f){ _CLLDELETE(result); return fieldExpl; } result->addDetail(fieldExpl); result->setMatch(fieldExpl->getMatch()); // combine them result->setValue(queryExpl->getValue() * fieldExpl->getValue()); return result; } }; Query* MultiPhraseQuery::rewrite(IndexReader* /*reader*/) { if (termArrays->size() == 1) { // optimize one-term case ArrayBase* terms = termArrays->at(0); BooleanQuery* boq = _CLNEW BooleanQuery(true); for ( size_t i=0;ilength;i++ ){ boq->add(_CLNEW TermQuery((*terms)[i]), BooleanClause::SHOULD); } boq->setBoost(getBoost()); return boq; } else { return this; } } void MultiPhraseQuery::extractTerms( TermSet * termset ) const { for( size_t i = 0; i < termArrays->size(); i++ ) { ArrayBase * terms = termArrays->at( i ); for( size_t j=0; j < terms->length; j++ ) { Term * pTerm = terms->values[ j ]; if( pTerm && termset->end() == termset->find( pTerm )) termset->insert( _CL_POINTER( pTerm )); } } } MultiPhraseQuery::MultiPhraseQuery(): field(NULL), termArrays(_CLNEW CL_NS(util)::CLArrayList*>), positions(_CLNEW CL_NS(util)::CLVector), slop(0) { } MultiPhraseQuery::MultiPhraseQuery( const MultiPhraseQuery& clone ): Query(clone) { this->field = clone.field ? STRDUP_TtoT( clone.field ) : NULL; this->slop = clone.slop; this->termArrays = _CLNEW CL_NS(util)::CLArrayList*>(); this->positions = _CLNEW CL_NS(util)::CLVector(); size_t size = clone.positions->size(); for( size_t i = 0; i < size; i++ ) { int32_t n = (*clone.positions)[i]; this->positions->push_back( n ); } size = clone.termArrays->size(); for( size_t j = 0; j < size; j++ ) { CL_NS(util)::ArrayBase* termsToClone = (*clone.termArrays)[ j ]; CL_NS(util)::ArrayBase* terms = _CLNEW CL_NS(util)::ValueArray( termsToClone->length ); for( size_t t = 0; t < termsToClone->length; t++ ) terms->values[ t ] = _CL_POINTER( termsToClone->values[ t ] ); this->termArrays->push_back( terms ); } } MultiPhraseQuery::~MultiPhraseQuery(){ for (size_t i = 0; i < termArrays->size(); i++){ for ( size_t j=0;jat(i)->length;j++ ) { _CLLDECDELETE(termArrays->at(i)->values[j]); } _CLLDELETE(termArrays->at(i)); } _CLLDELETE(termArrays); _CLLDELETE(positions); _CLDELETE_LCARRAY(field); } Query * MultiPhraseQuery::clone() const { return _CLNEW MultiPhraseQuery( *this ); } void MultiPhraseQuery::setSlop(const int32_t s) { slop = s; } int32_t MultiPhraseQuery::getSlop() const { return slop; } void MultiPhraseQuery::add(CL_NS(index)::Term* term) { ValueArray _terms(1); _terms[0] = term; add(&_terms); } void MultiPhraseQuery::add(const CL_NS(util)::ArrayBase* terms) { int32_t position = 0; if (positions->size() > 0) position = (*positions)[positions->size()-1] + 1; add(terms, position); } void MultiPhraseQuery::add(const CL_NS(util)::ArrayBase* _terms, const int32_t position) { if (termArrays->size() == 0) field = STRDUP_TtoT((*_terms)[0]->field()); CL_NS(util)::ArrayBase* terms = _CLNEW CL_NS(util)::ValueArray(_terms->length); for ( size_t i=0;i<_terms->length;i++ ){ if ( _tcscmp(_terms->values[i]->field(), field) != 0) { TCHAR buf[250]; _sntprintf(buf,250,_T("All phrase terms must be in the same field (%s): %s"),field, (*terms)[i]->field()); _CLTHROWT(CL_ERR_IllegalArgument,buf); } terms->values[i] = _CL_POINTER(_terms->values[i]); } termArrays->push_back(terms); positions->push_back(position); } const CL_NS(util)::CLArrayList*>* MultiPhraseQuery::getTermArrays() { return termArrays; } void MultiPhraseQuery::getPositions(ValueArray& result) const { result.length = positions->size(); result.values = _CL_NEWARRAY(int32_t,result.length); for (size_t i = 0; i < result.length; i++) result.values[i] = (*positions)[i]; } Weight* MultiPhraseQuery::_createWeight(Searcher* searcher) { return _CLNEW MultiPhraseWeight(searcher, this); } TCHAR* MultiPhraseQuery::toString(const TCHAR* f) const { StringBuffer buffer(100); if (_tcscmp(f, field)!=0) { buffer.append(field); buffer.appendChar(_T(':')); } buffer.appendChar(_T('"')); CL_NS(util)::CLArrayList*>::iterator i; i = termArrays->begin(); while (i != termArrays->end()){ CL_NS(util)::ArrayBase& terms = *(*i); if (terms.length > 1) { buffer.appendChar(_T('(')); for (size_t j = 0; j < terms.length; j++) { buffer.append(terms[j]->text()); if (j < terms.length-1) buffer.appendChar(_T(' ')); } buffer.appendChar(_T(')')); } else { buffer.append(terms[0]->text()); } if (i+1 != termArrays->end() ) buffer.appendChar(_T(' ')); i++; } buffer.appendChar(_T('"')); if (slop != 0) { buffer.appendChar(_T('~')); buffer.appendInt(slop); } buffer.appendBoost(getBoost()); return buffer.giveBuffer(); } class TermArray_Equals:public CL_NS_STD(binary_function) { public: bool operator()( CL_NS(util)::ArrayBase* val1, CL_NS(util)::ArrayBase* val2 ) const{ if ( val1->length != val2->length ) return false; for ( size_t i=0;ilength;i++ ){ if (!val1->values[i]->equals(val2->values[i])) return false; } return true; } }; bool MultiPhraseQuery::equals(Query* o) const { if (!(o->instanceOf(MultiPhraseQuery::getObjectName()))) return false; MultiPhraseQuery* other = static_cast(o); bool ret = (this->getBoost() == other->getBoost()) && (this->slop == other->slop); if (ret){ CLListEquals, const CL_NS(util)::CLVector > comp; ret = comp.equals(this->positions,other->positions); } if (ret){ if (this->termArrays->size() != other->termArrays->size()) return false; for (size_t i=0; itermArrays->size();i++){ CLListEquals*>, const CL_NS(util)::CLVector*> > comp; ret = comp.equals(this->termArrays,other->termArrays); } } return ret; } // TODO: Test hashed value if conforms with JL size_t MultiPhraseQuery::hashCode() const { size_t ret = Similarity::floatToByte(getBoost()) ^ slop; { //msvc6 scope fix for( size_t i = 0; i < termArrays->size(); i++ ) { for( size_t j = 0; j < termArrays->at( i )->length; j++ ) { ret = 31 * ret + termArrays->at(i)->values[j]->hashCode(); } } } { //msvc6 scope fix for ( size_t i=0;isize();i++ ) ret = 31 * ret + (*positions)[i]; } ret ^= 0x4AC65113; return ret; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/MultiPhraseQuery.h000066400000000000000000000066421154025176300241770ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_MultiPhraseQuery_ #define _lucene_search_MultiPhraseQuery_ #include "Query.h" #include "CLucene/util/Array.h" #include "CLucene/util/VoidList.h" CL_CLASS_DEF(index,Term) CL_NS_DEF(search) class MultiPhraseWeight; /** * MultiPhraseQuery is a generalized version of PhraseQuery, with an added * method {@link #add(Term[])}. * To use this class, to search for the phrase "Microsoft app*" first use * add(Term) on the term "Microsoft", then find all terms that have "app" as * prefix using IndexReader.terms(Term), and use MultiPhraseQuery.add(Term[] * terms) to add them to the query. * * @author Anders Nielsen * @version 1.0 */ class CLUCENE_EXPORT MultiPhraseQuery : public Query { private: TCHAR* field; CL_NS(util)::CLArrayList*>* termArrays; CL_NS(util)::CLVector* positions; int32_t slop; protected: MultiPhraseQuery( const MultiPhraseQuery& clone ); public: MultiPhraseQuery(); virtual ~MultiPhraseQuery(); friend class MultiPhraseWeight; /** Sets the phrase slop for this query. * @see PhraseQuery#setSlop(int) */ void setSlop(const int32_t s); /** Sets the phrase slop for this query. * @see PhraseQuery#getSlop() */ int32_t getSlop() const; /** Add a single term at the next position in the phrase. * @see PhraseQuery#add(Term) * @memory A pointer is taken to term */ void add(CL_NS(index)::Term* term); /** Add multiple terms at the next position in the phrase. Any of the terms * may match. * @memory A pointer is taken of each term, the array memory must be cleaned up by calle * @see PhraseQuery#add(Term) */ void add(const CL_NS(util)::ArrayBase* terms); /** * Allows to specify the relative position of terms within the phrase. * * @see PhraseQuery#add(Term, int) * @param terms * @param position * @memory A pointer is taken of each term, the array memory must be cleaned up by calle */ void add(const CL_NS(util)::ArrayBase* terms, const int32_t position); /** * Returns a ArrayBase of the terms in the multiphrase. * Do not modify the List or its contents. */ const CL_NS(util)::CLArrayList*>* getTermArrays(); /** * Returns the relative positions of terms in this phrase. */ void getPositions(CL_NS(util)::ValueArray& result) const; Query* rewrite(CL_NS(index)::IndexReader* reader); /** Expert: adds all terms occurring in this query to the terms set. */ void extractTerms( TermSet * termset ) const; protected: Weight* _createWeight(Searcher* searcher); public: /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* f) const; /** Returns true if o is equal to this. */ bool equals(Query* o) const; /** Returns a hash code value for this object.*/ size_t hashCode() const; Query* clone() const; const char* getObjectName() const { return getClassName(); } static const char* getClassName(){ return "MultiPhraseQuery"; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/MultiSearcher.cpp000066400000000000000000000174261154025176300240200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "MultiSearcher.h" #include "SearchHeader.h" #include "Query.h" #include "_HitQueue.h" #include "CLucene/document/Document.h" #include "CLucene/index/Term.h" #include "_FieldDocSortedHitQueue.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(document) CL_NS_DEF(search) class MultiHitCollector: public HitCollector{ private: HitCollector* results; int32_t start; public: MultiHitCollector(HitCollector* _results, int32_t _start); void collect(const int32_t doc, const float_t score) ; }; /** Creates a searcher which searches searchers. */ MultiSearcher::MultiSearcher(Searchable** _searchables): _maxDoc(0) { searchablesLen = 0; while ( _searchables[searchablesLen] != NULL ) ++searchablesLen; searchables=_CL_NEWARRAY(Searchable*,searchablesLen+1); starts = _CL_NEWARRAY(int32_t,searchablesLen + 1); // build starts array for (int32_t i = 0; i < searchablesLen; ++i) { searchables[i]=_searchables[i]; starts[i] = _maxDoc; _maxDoc += searchables[i]->maxDoc(); // compute maxDocs } starts[searchablesLen] = _maxDoc; } MultiSearcher::~MultiSearcher() { _CLDELETE_ARRAY(searchables); _CLDELETE_ARRAY(starts); } int32_t* MultiSearcher::getStarts() { return starts; } int32_t MultiSearcher::getLength() { return searchablesLen; } // inherit javadoc void MultiSearcher::close() { for (int32_t i = 0; i < searchablesLen; ++i){ searchables[i]->close(); searchables[i]=NULL; } } int32_t MultiSearcher::docFreq(const Term* term) const { int32_t docFreq = 0; for (int32_t i = 0; i < searchablesLen; ++i) docFreq += searchables[i]->docFreq(term); return docFreq; } /** For use by {@link HitCollector} implementations. */ bool MultiSearcher::doc(int32_t n, Document* d) { int32_t i = subSearcher(n); // find searcher index return searchables[i]->doc(n - starts[i], d); // dispatch to searcher } int32_t MultiSearcher::searcherIndex(int32_t n) const{ return subSearcher(n); } /** Returns index of the searcher for document n in the array * used to construct this searcher. */ int32_t MultiSearcher::subSearcher(int32_t n) const{ // replace w/ call to Arrays.binarySearch in Java 1.2 int32_t lo = 0; // search starts array int32_t hi = searchablesLen - 1; // for first element less // than n, return its index int32_t mid,midValue; while (hi >= lo) { mid = (lo + hi) >> 1; midValue = starts[mid]; if (n < midValue) hi = mid - 1; else if (n > midValue) lo = mid + 1; else{ // found a match while (mid+1 < searchablesLen && starts[mid+1] == midValue) { ++mid; // scan to last match } return mid; } } return hi; } /** Returns the document number of document n within its * sub-index. */ int32_t MultiSearcher::subDoc(int32_t n) const{ return n - starts[subSearcher(n)]; } int32_t MultiSearcher::maxDoc() const{ return _maxDoc; } TopDocs* MultiSearcher::_search(Query* query, Filter* filter, const int32_t nDocs) { HitQueue* hq = _CLNEW HitQueue(nDocs); int32_t totalHits = 0; TopDocs* docs; int32_t j; ScoreDoc* scoreDocs; for (int32_t i = 0; i < searchablesLen; i++) { // search each searcher docs = searchables[i]->_search(query, filter, nDocs); totalHits += docs->totalHits; // update totalHits scoreDocs = docs->scoreDocs; for ( j = 0; j scoreDocsLength; ++j) { // merge scoreDocs int_to hq scoreDocs[j].doc += starts[i]; // convert doc if ( !hq->insert(scoreDocs[j])) break; // no more scores > minScore } _CLDELETE(docs); } int32_t scoreDocsLen = hq->size(); scoreDocs = new ScoreDoc[scoreDocsLen]; {//MSVC 6 scope fix for (int32_t i = scoreDocsLen-1; i >= 0; --i) // put docs in array scoreDocs[i] = hq->pop(); } //cleanup _CLDELETE(hq); return _CLNEW TopDocs(totalHits, scoreDocs, scoreDocsLen); } /** Lower-level search API. * *

{@link HitCollector#collect(int32_t,float_t)} is called for every non-zero * scoring document. * *

Applications should only use this if they need all of the * matching documents. The high-level search API ({@link * Searcher#search(Query)}) is usually more efficient, as it skips * non-high-scoring hits. * * @param query to match documents * @param filter if non-null, a bitset used to eliminate some documents * @param results to receive hits */ void MultiSearcher::_search(Query* query, Filter* filter, HitCollector* results){ for (int32_t i = 0; i < searchablesLen; ++i) { /* DSR:CL_BUG: Old implementation leaked and was misconceived. We need ** to have the original HitCollector ($results) collect *all* hits; ** the MultiHitCollector instantiated below serves only to adjust ** (forward by starts[i]) the docNo passed to $results. ** Old implementation instead created a sort of linked list of ** MultiHitCollectors that applied the adjustments in $starts ** cumulatively (and was never deleted). */ HitCollector *docNoAdjuster = _CLNEW MultiHitCollector(results, starts[i]); searchables[i]->_search(query, filter, docNoAdjuster); _CLDELETE(docNoAdjuster); } } TopFieldDocs* MultiSearcher::_search (Query* query, Filter* filter, const int32_t n, const Sort* sort){ FieldDocSortedHitQueue* hq = NULL; int32_t totalHits = 0; TopFieldDocs* docs; int32_t j; FieldDoc** fieldDocs; for (int32_t i = 0; i < searchablesLen; ++i) { // search each searcher docs = searchables[i]->_search (query, filter, n, sort); if (hq == NULL){ hq = _CLNEW FieldDocSortedHitQueue (docs->fields, n); docs->fields = NULL; //hit queue takes fields memory } totalHits += docs->totalHits; // update totalHits fieldDocs = docs->fieldDocs; for(j = 0;jscoreDocsLength;++j){ // merge scoreDocs into hq fieldDocs[j]->scoreDoc.doc += starts[i]; // convert doc if (!hq->insert (fieldDocs[j]) ) break; // no more scores > minScore } for ( int32_t x=0;xsize(); fieldDocs = _CL_NEWARRAY(FieldDoc*,hqlen); for (j = hqlen - 1; j >= 0; j--) // put docs in array fieldDocs[j] = hq->pop(); SortField** hqFields = hq->getFields(); hq->setFields(NULL); //move ownership of memory over to TopFieldDocs _CLDELETE(hq); return _CLNEW TopFieldDocs (totalHits, fieldDocs, hqlen, hqFields); } Query* MultiSearcher::rewrite(Query* query) { // this is a bit of a hack. We know that a query which // creates a Weight based on this Dummy-Searcher is // always already rewritten (see preparedWeight()). // Therefore we just return the unmodified query here return query; } void MultiSearcher::explain(Query* query, int32_t doc, Explanation* ret) { int32_t i = subSearcher(doc); // find searcher index searchables[i]->explain(query,doc-starts[i], ret); // dispatch to searcher } MultiHitCollector::MultiHitCollector(HitCollector* _results, int32_t _start): results(_results), start(_start) { } void MultiHitCollector::collect(const int32_t doc, const float_t score) { results->collect(doc + start, score); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/MultiSearcher.h000066400000000000000000000052401154025176300234540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_multisearcher #define _lucene_search_multisearcher //#include "SearchHeader.h" #include "Searchable.h" CL_CLASS_DEF(document,Document) CL_CLASS_DEF(index,Term) CL_NS_DEF(search) /** Implements search over a set of Searchables. * *

Applications usually need only call the inherited {@link #search(Query)} * or {@link #search(Query,Filter)} methods. */ class CLUCENE_EXPORT MultiSearcher: public Searcher { private: Searchable** searchables; int32_t searchablesLen; int32_t* starts; int32_t _maxDoc; protected: int32_t* getStarts(); int32_t getLength(); public: /** Creates a searcher which searches Searchables. */ MultiSearcher(Searchable** searchables); ~MultiSearcher(); /** Frees resources associated with this Searcher. */ void close() ; int32_t docFreq(const CL_NS(index)::Term* term) const ; /** For use by {@link HitCollector} implementations. */ bool doc(int32_t n, CL_NS(document)::Document* document); /** For use by {@link HitCollector} implementations to identify the * index of the sub-searcher that a particular hit came from. */ int32_t searcherIndex(int32_t n) const; int32_t subSearcher(int32_t n) const; int32_t subDoc(int32_t n) const; int32_t maxDoc() const; TopDocs* _search(Query* query, Filter* filter, const int32_t nDocs) ; TopFieldDocs* _search (Query* query, Filter* filter, const int32_t n, const Sort* sort); /** Lower-level search API. * *

{@link HitCollector#collect(int32_t,float_t)} is called for every non-zero * scoring document. * *

Applications should only use this if they need all of the * matching documents. The high-level search API ({@link * Searcher#search(Query)}) is usually more efficient, as it skips * non-high-scoring hits. * * @param query to match documents * @param filter if non-null, a bitset used to eliminate some documents * @param results to receive hits */ void _search(Query* query, Filter* filter, HitCollector* results); Query* rewrite(Query* original); void explain(Query* query, int32_t doc, Explanation* ret); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/MultiTermQuery.cpp000066400000000000000000000060411154025176300242100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "MultiTermQuery.h" #include "BooleanQuery.h" #include "FilteredTermEnum.h" #include "TermQuery.h" #include "CLucene/index/Term.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) /** Constructs a query for terms matching term. */ MultiTermQuery::MultiTermQuery(Term* t){ //Func - Constructor //Pre - t != NULL //Post - The instance has been created CND_PRECONDITION(t != NULL, "t is NULL"); term = _CL_POINTER(t); } MultiTermQuery::MultiTermQuery(const MultiTermQuery& clone): Query(clone) { term = _CLNEW Term(clone.getTerm(false),clone.getTerm(false)->text()); } MultiTermQuery::~MultiTermQuery(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed _CLDECDELETE(term); } Term* MultiTermQuery::getTerm(bool pointer) const{ if ( pointer ) return _CL_POINTER(term); else return term; } Query* MultiTermQuery::rewrite(IndexReader* reader) { FilteredTermEnum* enumerator = getEnum(reader); BooleanQuery* query = _CLNEW BooleanQuery( true ); try { do { Term* t = enumerator->term(false); if (t != NULL) { TermQuery* tq = _CLNEW TermQuery(t); // found a match tq->setBoost(getBoost() * enumerator->difference()); // set the boost query->add(tq,true, false, false); // add to q } } while (enumerator->next()); } _CLFINALLY ( enumerator->close(); _CLDELETE(enumerator) ); //if we only added one clause and the clause is not prohibited then //we can just return the query if (query->getClauseCount() == 1) { // optimize 1-clause queries BooleanClause* c=0; query->getClauses(&c); if (!c->prohibited) { // just return clause c->deleteQuery=false; Query* ret = c->getQuery(); _CLDELETE(query); return ret; } } return query; } Query* MultiTermQuery::combine(CL_NS(util)::ArrayBase* queries) { return Query::mergeBooleanQueries(queries); } /** Prints a user-readable version of this query. */ TCHAR* MultiTermQuery::toString(const TCHAR* field) const{ StringBuffer buffer; if ( field==NULL || _tcscmp(term->field(),field)!=0 ) { buffer.append(term->field()); buffer.append( _T(":")); } buffer.append(term->text()); // todo: use ToStringUtils.boost() if (getBoost() != 1.0f) { buffer.appendChar ( '^' ); buffer.appendFloat( getBoost(),1); } return buffer.toString(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/MultiTermQuery.h000066400000000000000000000043721154025176300236620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_MultiTermQuery_ #define _lucene_search_MultiTermQuery_ CL_CLASS_DEF(util,StringBuffer) //#include "CLucene/index/IndexReader.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(search,FilteredTermEnum) CL_CLASS_DEF(index,IndexReader) //#include "CLucene/index/Terms.h" //#include "FilteredTermEnum.h" //#include "SearchHeader.h" //#include "BooleanQuery.h" //#include "TermQuery.h" #include "Query.h" CL_NS_DEF(search) /** * A {@link lucene::search::Query} that matches documents containing a subset of terms provided * by a {@link lucene::search::FilteredTermEnum} enumeration. *

* MultiTermQuery is not designed to be used by itself. *
* The reason being that it is not intialized with a {@link FilteredTermEnum} * enumeration. A {@link FilteredTermEnum} enumeration needs to be provided. *

* For example, {@link WildcardQuery} and {@link FuzzyQuery} extend * MultiTermQuery to provide {@link WildcardTermEnum} and * {@link FuzzyTermEnum}, respectively. */ class CLUCENE_EXPORT MultiTermQuery: public Query { private: CL_NS(index)::Term* term; protected: MultiTermQuery(const MultiTermQuery& clone); /** Construct the enumeration to be used, expanding the pattern term. */ virtual FilteredTermEnum* getEnum(CL_NS(index)::IndexReader* reader) = 0; public: /** Constructs a query for terms matching term. */ MultiTermQuery(CL_NS(index)::Term* t); virtual ~MultiTermQuery(); /** Returns the pattern term. */ CL_NS(index)::Term* getTerm(bool pointer=true) const; Query* combine(CL_NS(util)::ArrayBase* queries); /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* field) const; virtual Query* rewrite(CL_NS(index)::IndexReader* reader); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/PhrasePositions.cpp000066400000000000000000000061301154025176300243710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_PhrasePositions.h" CL_NS_USE(index) CL_NS_DEF(search) PhrasePositions::PhrasePositions(TermPositions* t, const int32_t OffSet) { //Func - Constructor //Pre - t != NULL // OffSet != NULL //Post - The instance has been created CND_PRECONDITION(t != NULL,"Tp is NULL"); CND_PRECONDITION(OffSet >= 0 ,"OffSet is a negative number"); tp = t; offset = OffSet; position = 0; count = 0; doc = 0; _next = NULL; } PhrasePositions::~PhrasePositions(){ //Func - Destructor //Pre - true //Post - The instance has been deleted //delete next Phrase position and by doing that //all PhrasePositions in the list _CLDELETE(_next); //Check if tp is valid if ( tp != NULL ){ //Close TermPositions tp tp->close(); _CLDELETE(tp); } } bool PhrasePositions::next(){ //Func - Increments to next doc //Pre - tp != NULL //Post - if there was no next then doc = INT_MAX otherwise // doc contains the current document number CND_PRECONDITION(tp != NULL,"tp is NULL"); //Move to the next in TermPositions tp if (!tp->next()) { //There is no next so close the stream tp->close(); //delete tp and reset tp to NULL _CLVDELETE(tp); //todo: not a clucene object... should be //Assign Doc sentinel value doc = LUCENE_INT32_MAX_SHOULDBE; return false; }else{ doc = tp->doc(); position = 0; return true; } } bool PhrasePositions::skipTo(int32_t target){ if (!tp->skipTo(target)) { tp->close(); // close stream doc = LUCENE_INT32_MAX_SHOULDBE; // sentinel value return false; } doc = tp->doc(); position = 0; return true; } void PhrasePositions::firstPosition(){ //Func - Read the first TermPosition //Pre - tp != NULL //Post - CND_PRECONDITION(tp != NULL,"tp is NULL"); //read first pos count = tp->freq(); //Move to the next TermPosition nextPosition(); } bool PhrasePositions::nextPosition(){ //Func - Move to the next position //Pre - tp != NULL //Post - CND_PRECONDITION(tp != NULL,"tp is NULL"); if (count-- > 0) { //read subsequent pos's position = tp->nextPosition() - offset; //Check position always bigger than or equal to 0 //bvk: todo, bug??? position < 0 occurs, cant figure out why, //old version does it too and will fail the "SearchTest" test //CND_CONDITION(position >= 0, "position has become a negative number"); return true; }else{ return false; } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/PhraseQuery.cpp000066400000000000000000000323571154025176300235210ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "PhraseQuery.h" #include "SearchHeader.h" #include "Scorer.h" #include "BooleanQuery.h" #include "TermQuery.h" #include "Similarity.h" #include "Searchable.h" #include "Explanation.h" #include "CLucene/index/_Term.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/VoidList.h" #include "CLucene/util/_Arrays.h" #include "_ExactPhraseScorer.h" #include "_SloppyPhraseScorer.h" #include CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) class PhraseWeight: public Weight { private: Searcher* searcher; float_t value; float_t idf; float_t queryNorm; float_t queryWeight; PhraseQuery* parentQuery; public: PhraseWeight(Searcher* searcher, PhraseQuery* parentQuery); virtual ~PhraseWeight(); TCHAR* toString(); Query* getQuery(); float_t getValue(); float_t sumOfSquaredWeights(); void normalize(float_t queryNorm); Scorer* scorer(CL_NS(index)::IndexReader* reader); Explanation* explain(CL_NS(index)::IndexReader* reader, int32_t doc); TCHAR* toString(TCHAR* f); bool equals(PhraseWeight* o); }; PhraseQuery::PhraseQuery(): field(NULL), terms(_CLNEW CL_NS(util)::CLVector(false) ), positions(_CLNEW CL_NS(util)::CLVector), slop(0) { } PhraseQuery::PhraseQuery(const PhraseQuery& clone): Query(clone), terms(_CLNEW CL_NS(util)::CLVector(false) ), positions(_CLNEW CL_NS(util)::CLVector) { slop = clone.slop; field = clone.field; int32_t size=clone.positions->size(); { //msvc6 scope fix for ( int32_t i=0;ipositions->push_back( n ); } } size=clone.terms->size(); { //msvc6 scope fix for ( int32_t i=0;iterms->push_back( _CL_POINTER((*clone.terms)[i])); } } } Query* PhraseQuery::clone() const{ return _CLNEW PhraseQuery(*this); } const TCHAR* PhraseQuery::getFieldName() const{ return field; } void PhraseQuery::setSlop(const int32_t s) { slop = s; } int32_t PhraseQuery::getSlop() const { return slop; } bool PhraseQuery::equals(CL_NS(search)::Query *other) const{ if (!(other->instanceOf(PhraseQuery::getClassName()))) return false; PhraseQuery* pq = (PhraseQuery*)other; bool ret = (this->getBoost() == pq->getBoost()) && (this->slop == pq->slop); if ( ret ){ CLListEquals, const CL_NS(util)::CLVector > comp; ret = comp.equals(this->terms,pq->terms); } if ( ret ){ CLListEquals, const CL_NS(util)::CLVector > comp; ret = comp.equals(this->positions,pq->positions); } return ret; } PhraseQuery::~PhraseQuery(){ //Func - Destructor //Pre - true //Post 0 The instance has been destroyed //Iterate through all the terms for (size_t i = 0; i < terms->size(); i++){ _CLLDECDELETE((*terms)[i]); } _CLLDELETE(terms); _CLLDELETE(positions); } size_t PhraseQuery::hashCode() const { //todo: do cachedHashCode, and invalidate on add/remove clause size_t ret = Similarity::floatToByte(getBoost()) ^ Similarity::floatToByte(slop); { //msvc6 scope fix for ( size_t i=0;isize();i++ ) ret = 31 * ret + (*terms)[i]->hashCode(); } { //msvc6 scope fix for ( size_t i=0;isize();i++ ) ret = 31 * ret + (*positions)[i]; } return ret; } const char* PhraseQuery::getClassName(){ return "PhraseQuery"; } const char* PhraseQuery::getObjectName() const{ //Func - Returns the string "PhraseQuery" //Pre - true //Post - The string "PhraseQuery" has been returned return getClassName(); } void PhraseQuery::add(Term* term) { CND_PRECONDITION(term != NULL,"term is NULL"); int32_t position = 0; if(positions->size() > 0) position = ((*positions)[positions->size()-1]) + 1; add(term, position); } void PhraseQuery::add(Term* term, int32_t position) { CND_PRECONDITION(term != NULL,"term is NULL"); if (terms->size() == 0) field = term->field(); else{ //Check if the field of the _CLNEW term matches the field of the PhraseQuery //can use != because fields are interned if ( term->field() != field){ TCHAR buf[200]; _sntprintf(buf,200,_T("All phrase terms must be in the same field: %s"),term->field()); _CLTHROWT(CL_ERR_IllegalArgument,buf); } } //Store the _CLNEW term terms->push_back(_CL_POINTER(term)); positions->push_back(position); } void PhraseQuery::getPositions(ValueArray& result) const{ result.length = positions->size(); result.values = _CL_NEWARRAY(int32_t,result.length); for(size_t i = 0; i < result.length; i++){ result.values[i] = (*positions)[i]; } } Weight* PhraseQuery::_createWeight(Searcher* searcher) { if (terms->size() == 1) { // optimize one-term case Term* term = (*terms)[0]; Query* termQuery = _CLNEW TermQuery(term); termQuery->setBoost(getBoost()); Weight* ret = termQuery->_createWeight(searcher); _CLLDELETE(termQuery); return ret; } return _CLNEW PhraseWeight(searcher,this); } Term** PhraseQuery::getTerms() const{ //Func - added by search highlighter //Let size contain the number of terms int32_t size = terms->size(); Term** ret = _CL_NEWARRAY(Term*,size+1); CND_CONDITION(ret != NULL,"Could not allocated memory for ret"); //Iterate through terms and copy each pointer to ret for ( int32_t i=0;isize()== 0 ) return NULL; StringBuffer buffer(32); if ( f==NULL || _tcscmp(field,f)!=0) { buffer.append(field); buffer.appendChar(_T(':')); } buffer.appendChar( _T('"') ); Term *T = NULL; //iterate through all terms for (size_t i = 0; i < terms->size(); i++) { //Get the i-th term T = (*terms)[i]; buffer.append( T->text() ); //Check if i is at the end of terms if (i != terms->size()-1){ buffer.appendChar(_T(' ')); } } buffer.appendChar( _T('"') ); if (slop != 0) { buffer.appendChar(_T('~')); buffer.appendFloat(slop, 0); } buffer.appendBoost(getBoost()); return buffer.giveBuffer(); } void PhraseQuery::extractTerms( TermSet * termset ) const { for( size_t i = 0; i < terms->size(); i++ ) { Term * pTerm = (*terms)[i]; if( pTerm && termset->end() == termset->find( pTerm )) termset->insert( _CL_POINTER( pTerm )); } } PhraseWeight::PhraseWeight(Searcher* searcher, PhraseQuery* _parentQuery) { this->parentQuery=_parentQuery; this->value = 0; this->idf = 0; this->queryNorm = 0; this->queryWeight = 0; this->searcher = searcher; } TCHAR* PhraseWeight::toString() { return STRDUP_TtoT(_T("weight(PhraseQuery)")); } PhraseWeight::~PhraseWeight(){ } Query* PhraseWeight::getQuery() { return parentQuery; } float_t PhraseWeight::getValue() { return value; } float_t PhraseWeight::sumOfSquaredWeights(){ idf = parentQuery->getSimilarity(searcher)->idf(parentQuery->terms, searcher); queryWeight = idf * parentQuery->getBoost(); // compute query weight return queryWeight * queryWeight; // square it } void PhraseWeight::normalize(float_t queryNorm) { this->queryNorm = queryNorm; queryWeight *= queryNorm; // normalize query weight value = queryWeight * idf; // idf for document } Scorer* PhraseWeight::scorer(IndexReader* reader) { //Func - //Pre - //Post - //Get the length of terms const int32_t tpsLength = (const int32_t)parentQuery->terms->size(); //optimize zero-term case if (tpsLength == 0) return NULL; TermPositions** tps = _CL_NEWARRAY(TermPositions*,tpsLength+1); //Check if tps has been allocated properly CND_CONDITION(tps != NULL,"Could not allocate memory for tps"); TermPositions* p = NULL; //Iterate through all terms for (int32_t i = 0; i < tpsLength; i++) { //Get the termPostitions for the i-th term p = reader->termPositions((*parentQuery->terms)[i]); //Check if p is valid if (p == NULL) { //Delete previous retrieved termPositions while (--i >= 0){ _CLVDELETE(tps[i]); //todo: not a clucene object... should be } _CLDELETE_ARRAY(tps); return NULL; } //Store p at i in tps tps[i] = p; } tps[tpsLength] = NULL; Scorer* ret = NULL; ValueArray positions; parentQuery->getPositions(positions); int32_t slop = parentQuery->getSlop(); if ( slop != 0) // optimize exact case //todo: need to pass these: this, tps, ret = _CLNEW SloppyPhraseScorer(this,tps,positions.values, parentQuery->getSimilarity(searcher), slop, reader->norms(parentQuery->field)); else ret = _CLNEW ExactPhraseScorer(this, tps, positions.values, parentQuery->getSimilarity(searcher), reader->norms(parentQuery->field)); positions.deleteArray(); CND_CONDITION(ret != NULL,"Could not allocate memory for ret"); //tps can be deleted safely. SloppyPhraseScorer or ExactPhraseScorer will take care //of its values _CLDELETE_LARRAY(tps); return ret; } Explanation* PhraseWeight::explain(IndexReader* reader, int32_t doc){ Explanation* result = _CLNEW Explanation(); TCHAR descbuf[LUCENE_SEARCH_EXPLANATION_DESC_LEN+1]; TCHAR* tmp; tmp = getQuery()->toString(); _sntprintf(descbuf,LUCENE_SEARCH_EXPLANATION_DESC_LEN,_T("weight(%s in %d), product of:"), tmp,doc); _CLDELETE_LCARRAY(tmp); result->setDescription(descbuf); StringBuffer docFreqs; StringBuffer query; query.appendChar('"'); for (size_t i = 0; i < parentQuery->terms->size(); i++) { if (i != 0) { docFreqs.appendChar(' '); query.appendChar(' '); } Term* term = (*parentQuery->terms)[i]; docFreqs.append(term->text()); docFreqs.appendChar('='); docFreqs.appendInt(searcher->docFreq(term)); query.append(term->text()); } query.appendChar('\"'); _sntprintf(descbuf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("idf(%s: %s)"),parentQuery->field,docFreqs.getBuffer()); Explanation* idfExpl = _CLNEW Explanation(idf, descbuf); // explain query weight Explanation* queryExpl = _CLNEW Explanation(); tmp = getQuery()->toString(); _sntprintf(descbuf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("queryWeight(%s), product of:"),tmp); _CLDELETE_LCARRAY(tmp); queryExpl->setDescription(descbuf); Explanation* boostExpl = _CLNEW Explanation(parentQuery->getBoost(), _T("boost")); bool deleteBoostExpl = false; if (parentQuery->getBoost() != 1.0f) queryExpl->addDetail(boostExpl); else deleteBoostExpl = true; queryExpl->addDetail(idfExpl); Explanation* queryNormExpl = _CLNEW Explanation(queryNorm,_T("queryNorm")); queryExpl->addDetail(queryNormExpl); queryExpl->setValue(boostExpl->getValue() * idfExpl->getValue() * queryNormExpl->getValue()); if (deleteBoostExpl) _CLLDELETE(boostExpl); result->addDetail(queryExpl); // explain field weight Explanation* fieldExpl = _CLNEW Explanation(); _sntprintf(descbuf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("fieldWeight(%s:%s in %d), product of:"), parentQuery->field,query.getBuffer(),doc); fieldExpl->setDescription(descbuf); Scorer* sc = scorer(reader); Explanation* tfExpl = sc->explain(doc); _CLLDELETE(sc); fieldExpl->addDetail(tfExpl); fieldExpl->addDetail( _CLNEW Explanation(idfExpl->getValue(), idfExpl->getDescription()) ); Explanation* fieldNormExpl = _CLNEW Explanation(); uint8_t* fieldNorms = reader->norms(parentQuery->field); float_t fieldNorm = fieldNorms!=NULL ? Similarity::decodeNorm(fieldNorms[doc]) : 0.0f; fieldNormExpl->setValue(fieldNorm); _sntprintf(descbuf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("fieldNorm(field=%s, doc=%d)"),parentQuery->field,doc); fieldNormExpl->setDescription(descbuf); fieldExpl->addDetail(fieldNormExpl); fieldExpl->setValue(tfExpl->getValue() * idfExpl->getValue() * fieldNormExpl->getValue()); if (queryExpl->getValue() == 1.0f){ _CLLDELETE(result); return fieldExpl; } result->addDetail(fieldExpl); // combine them result->setValue(queryExpl->getValue() * fieldExpl->getValue()); return result; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/PhraseQuery.h000066400000000000000000000070571154025176300231650ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_PhraseQuery_ #define _lucene_search_PhraseQuery_ #include "Query.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(search,Scorer) #include "CLucene/util/Array.h" #include "CLucene/util/VoidList.h" CL_NS_DEF(search) /** A Query that matches documents containing a particular sequence of terms. * A PhraseQuery is built by QueryParser for input like "new york". * *

This query may be combined with other terms or queries with a {@link BooleanQuery}. */ class CLUCENE_EXPORT PhraseQuery: public Query { private: const TCHAR* field; CL_NS(util)::CLVector* terms; CL_NS(util)::CLVector* positions; int32_t slop; friend class PhraseWeight; protected: Weight* _createWeight(Searcher* searcher); PhraseQuery(const PhraseQuery& clone); public: /** Constructs an empty phrase query. */ PhraseQuery(); virtual ~PhraseQuery(); /** Sets the number of other words permitted between words in query phrase. If zero, then this is an exact phrase search. For larger values this works like a WITHIN or NEAR operator.

The slop is in fact an edit-distance, where the units correspond to moves of terms in the query phrase out of position. For example, to switch the order of two words requires two moves (the first move places the words atop one another), so to permit re-orderings of phrases, the slop must be at least two.

More exact matches are scored higher than sloppier matches, thus search results are sorted by exactness.

The slop is zero by default, requiring exact matches.*/ void setSlop(const int32_t s); /** Returns the slop. See setSlop(). */ int32_t getSlop() const; /** * Adds a term to the end of the query phrase. * The relative position of the term is the one immediately after the last term added. */ void add(CL_NS(index)::Term* term); /** * Adds a term to the end of the query phrase. * The relative position of the term within the phrase is specified explicitly. * This allows e.g. phrases with more than one term at the same position * or phrases with gaps (e.g. in connection with stopwords). * * @param term * @param position */ void add(CL_NS(index)::Term* term, int32_t position); /** Returns the set of terms in this phrase. */ CL_NS(index)::Term** getTerms() const; /** * Returns the relative positions of terms in this phrase. */ void getPositions(CL_NS(util)::ValueArray& result) const; //Returns the sum of squared weights float_t sumOfSquaredWeights(Searcher* searcher); //Normalizes the Weight void normalize(const float_t norm); Scorer* scorer(CL_NS(index)::IndexReader* reader); const TCHAR* getFieldName() const; /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* f) const; Query* clone() const; bool equals(Query *) const; size_t hashCode() const; const char* getObjectName() const; static const char* getClassName(); /** Expert: adds all terms occurring in this query to the terms set. */ void extractTerms( TermSet * termset ) const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/PhraseScorer.cpp000066400000000000000000000145531154025176300236470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Scorer.h" #include "Explanation.h" #include "Similarity.h" #include "SearchHeader.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/index/Terms.h" #include "_PhraseQueue.h" #include "_PhraseScorer.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) PhraseScorer::PhraseScorer(Weight* _weight, TermPositions** tps, int32_t* offsets, Similarity* similarity, uint8_t* _norms): Scorer(similarity), weight(_weight), norms(_norms), value(_weight->getValue()), firstTime(true), more(true), freq(0.0f), first(NULL), last(NULL) { //Func - Constructor //Pre - tps != NULL and is an array of TermPositions // tpsLength >= 0 // n != NULL //Post - The instance has been created CND_PRECONDITION(tps != NULL,"tps is NULL"); // convert tps to a list of phrase positions. // note: phrase-position differs from term-position in that its position // reflects the phrase offset: pp.pos = tp.pos - offset. // this allows to easily identify a matching (exact) phrase // when all PhrasePositions have exactly the same position. int32_t i = 0; while(tps[i] != NULL){ PhrasePositions *pp = _CLNEW PhrasePositions(tps[i], offsets[i]); CND_CONDITION(pp != NULL,"Could not allocate memory for pp"); //Store PhrasePos into the PhrasePos pq if (last != NULL) { // add next to end of list last->_next = pp; } else first = pp; last = pp; i++; } pq = _CLNEW PhraseQueue(i); //i==tps.length CND_CONDITION(pq != NULL,"Could not allocate memory for pq"); } PhraseScorer::~PhraseScorer() { //Func - Destructor //Pre - true //Post - The instance has been destroyed //The PhraseQueue pq (which is a PriorityQueue) pq is actually empty at present, the elements //having been transferred by pqToList() to the linked list starting with //first. The nodes of that linked list are deleted by the destructor of //first, rather than the destructor of pq. _CLLDELETE(first); _CLLDELETE(pq); } bool PhraseScorer::next(){ if (firstTime) { init(); firstTime = false; } else if (more) { more = last->next(); // trigger further scanning } return doNext(); } // next without initial increment bool PhraseScorer::doNext() { while (more) { while (more && first->doc < last->doc) { // find doc w/ all the terms more = first->skipTo(last->doc); // skip first upto last firstToLast(); // and move it to the end } if (more) { // found a doc with all of the terms freq = phraseFreq(); // check for phrase if (freq == 0.0f) // no match more = last->next(); // trigger further scanning else return true; // found a match } } return false; // no more matches } float_t PhraseScorer::score(){ //System.out.println("scoring " + first.doc); float_t raw = getSimilarity()->tf(freq) * value; // raw score return raw * Similarity::decodeNorm(norms[first->doc]); // normalize } bool PhraseScorer::skipTo(int32_t target) { firstTime = false; for (PhrasePositions* pp = first; more && pp != NULL; pp = pp->_next) { more = pp->skipTo(target); } if (more) sort(); // re-sort return doNext(); } void PhraseScorer::init() { for (PhrasePositions* pp = first; more && pp != NULL; pp = pp->_next) more = pp->next(); if(more) sort(); } void PhraseScorer::sort() { pq->clear(); for (PhrasePositions* pp = first; pp != NULL; pp = pp->_next) pq->put(pp); pqToList(); } void PhraseScorer::pqToList(){ //Func - Transfers the PhrasePositions from the PhraseQueue pq to // the PhrasePositions list with first as its first element //Pre - pq != NULL // first = NULL // last = NULL //Post - All PhrasePositions have been transfered to the list // of PhrasePositions of which the first element is pointed to by first // and the last element is pointed to by last CND_PRECONDITION(pq != NULL,"pq is NULL"); last = first = NULL; PhrasePositions* PhrasePos = NULL; //As long pq is not empty while (pq->top() != NULL){ //Pop a PhrasePositions instance PhrasePos = pq->pop(); // add next to end of list if (last != NULL) { last->_next = PhrasePos; } else { first = PhrasePos; } //Let last point to the new last PhrasePositions instance just added last = PhrasePos; //Reset the next of last to NULL last->_next = NULL; } //Check to see that pq is empty now CND_CONDITION(pq->size()==0, "pq is not empty while it should be"); } void PhraseScorer::firstToLast(){ //Func - Moves first to the end of the list //Pre - first is NULL or points to an PhrasePositions Instance // last is NULL or points to an PhrasePositions Instance // first and last both are NULL or both are not NULL //Post - The first element has become the last element in the list CND_PRECONDITION(((first==NULL && last==NULL) ||(first !=NULL && last != NULL)), "Either first or last is NULL but not both"); //Check if first and last are valid pointers if(first && last){ last->_next = first; last = first; first = first->_next; last->_next = NULL; } } Explanation* PhraseScorer::explain(int32_t _doc) { Explanation* tfExplanation = _CLNEW Explanation(); while (next() && doc() < _doc){ } float_t phraseFreq = (doc() == _doc) ? freq : 0.0f; tfExplanation->setValue(getSimilarity()->tf(phraseFreq)); StringBuffer buf; buf.append(_T("tf(phraseFreq=")); buf.appendFloat(phraseFreq,2); buf.append(_T(")")); tfExplanation->setDescription(buf.getBuffer()); return tfExplanation; } TCHAR* PhraseScorer::toString() { StringBuffer buf; buf.append(_T("scorer(")); TCHAR* tmp = weight->toString(); buf.append(tmp); _CLDELETE_CARRAY(tmp); buf.append(_T(")")); return buf.toString(); } int32_t PhraseScorer::doc() const { return first->doc; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/PrefixQuery.cpp000066400000000000000000000207251154025176300235300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "CLucene/index/IndexReader.h" #include "Similarity.h" #include "PrefixQuery.h" #include "BooleanClause.h" #include "BooleanQuery.h" #include "TermQuery.h" #include "CLucene/util/BitSet.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(util) CL_NS_USE(index) CL_NS_DEF(search) PrefixQuery::PrefixQuery(Term* Prefix){ //Func - Constructor. // Constructs a query for terms starting with prefix //Pre - Prefix != NULL //Post - The instance has been created //Get a pointer to Prefix prefix = _CL_POINTER(Prefix); } PrefixQuery::PrefixQuery(const PrefixQuery& clone):Query(clone){ prefix = _CL_POINTER(clone.prefix); } Query* PrefixQuery::clone() const{ return _CLNEW PrefixQuery(*this); } Term* PrefixQuery::getPrefix(bool pointer){ if ( pointer ) return _CL_POINTER(prefix); else return prefix; } PrefixQuery::~PrefixQuery(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed. //Delete prefix by finalizing it _CLDECDELETE(prefix); } /** Returns a hash code value for this object.*/ size_t PrefixQuery::hashCode() const { return Similarity::floatToByte(getBoost()) ^ prefix->hashCode(); } const char* PrefixQuery::getObjectName()const{ //Func - Returns the name "PrefixQuery" //Pre - true //Post - The string "PrefixQuery" has been returned return getClassName(); } const char* PrefixQuery::getClassName(){ //Func - Returns the name "PrefixQuery" //Pre - true //Post - The string "PrefixQuery" has been returned return "PrefixQuery"; } bool PrefixQuery::equals(Query * other) const{ if (!(other->instanceOf(PrefixQuery::getClassName()))) return false; PrefixQuery* rq = (PrefixQuery*)other; bool ret = (this->getBoost() == rq->getBoost()) && (this->prefix->equals(rq->prefix)); return ret; } Query* PrefixQuery::rewrite(IndexReader* reader){ BooleanQuery* query = _CLNEW BooleanQuery( true ); TermEnum* enumerator = reader->terms(prefix); Term* lastTerm = NULL; try { const TCHAR* prefixText = prefix->text(); const TCHAR* prefixField = prefix->field(); const TCHAR* tmp; size_t i; size_t prefixLen = prefix->textLength(); do { lastTerm = enumerator->term(); if (lastTerm != NULL && lastTerm->field() == prefixField ) // interned comparison { //now see if term->text() starts with prefixText size_t termLen = lastTerm->textLength(); if ( prefixLen>termLen ) break; //the prefix is longer than the term, can't be matched tmp = lastTerm->text(); //check for prefix match in reverse, since most change will be at the end for ( i=prefixLen-1;i!=-1;--i ){ if ( tmp[i] != prefixText[i] ){ tmp=NULL;//signals inequality break; } } if ( tmp == NULL ) break; TermQuery* tq = _CLNEW TermQuery(lastTerm); // found a match tq->setBoost(getBoost()); // set the boost query->add(tq,true,false, false); // add to query } else break; _CLDECDELETE(lastTerm); } while (enumerator->next()); }_CLFINALLY( enumerator->close(); _CLDELETE(enumerator); _CLDECDELETE(lastTerm); ); _CLDECDELETE(lastTerm); //if we only added one clause and the clause is not prohibited then //we can just return the query if (query->getClauseCount() == 1) { // optimize 1-clause queries BooleanClause* c=0; query->getClauses(&c); if (!c->prohibited) { // just return clause c->deleteQuery=false; Query* ret = c->getQuery(); _CLDELETE(query); return ret; } } return query; } Query* PrefixQuery::combine(CL_NS(util)::ArrayBase* queries) { return Query::mergeBooleanQueries(queries); } TCHAR* PrefixQuery::toString(const TCHAR* field) const{ //Func - Creates a user-readable version of this query and returns it as as string //Pre - field != NULL //Post - a user-readable version of this query has been returned as as string //Instantiate a stringbuffer buffer to store the readable version temporarily CL_NS(util)::StringBuffer buffer; //check if field equal to the field of prefix if( field==NULL || _tcscmp(prefix->field(),field) != 0 ) { //Append the field of prefix to the buffer buffer.append(prefix->field()); //Append a colon buffer.append(_T(":") ); } //Append the text of the prefix buffer.append(prefix->text()); //Append a wildchar character buffer.append(_T("*")); //if the boost factor is not eaqual to 1 if (getBoost() != 1.0f) { //Append ^ buffer.append(_T("^")); //Append the boost factor buffer.appendFloat( getBoost(),1); } //Convert StringBuffer buffer to TCHAR block and return it return buffer.toString(); } //todo: this needs to be exposed, but java is still a bit confused about how... class PrefixFilter::PrefixGenerator{ const Term* prefix; public: PrefixGenerator(const Term* prefix){ this->prefix = prefix; } virtual ~PrefixGenerator(){ } virtual void handleDoc(int doc) = 0; void generate(IndexReader* reader) { TermEnum* enumerator = reader->terms(prefix); TermDocs* termDocs = reader->termDocs(); const TCHAR* prefixText = prefix->text(); const TCHAR* prefixField = prefix->field(); const TCHAR* tmp; size_t i; size_t prefixLen = prefix->textLength(); Term* term = NULL; try{ do{ term = enumerator->term(false); if (term != NULL && term->field() == prefixField // interned comparison ){ //now see if term->text() starts with prefixText size_t termLen = term->textLength(); if ( prefixLen>termLen ) break; //the prefix is longer than the term, can't be matched tmp = term->text(); //check for prefix match in reverse, since most change will be at the end for ( i=prefixLen-1;i!=-1;--i ){ if ( tmp[i] != prefixText[i] ){ tmp=NULL;//signals inequality break; } } if ( tmp == NULL ) break; termDocs->seek(enumerator); while (termDocs->next()) { handleDoc(termDocs->doc()); } } }while(enumerator->next()); } _CLFINALLY( termDocs->close(); _CLDELETE(termDocs); enumerator->close(); _CLDELETE(enumerator); ) } }; class DefaultPrefixGenerator: public PrefixFilter::PrefixGenerator{ public: BitSet* bts; DefaultPrefixGenerator(BitSet* bts, const Term* prefix): PrefixGenerator(prefix) { this->bts = bts; } virtual ~DefaultPrefixGenerator(){ } void handleDoc(int doc) { bts->set(doc); } }; PrefixFilter::PrefixFilter( Term* prefix ) { this->prefix = _CL_POINTER(prefix); } PrefixFilter::~PrefixFilter() { _CLDECDELETE(prefix); } PrefixFilter::PrefixFilter( const PrefixFilter& copy ) : Filter(), prefix( _CL_POINTER(copy.prefix) ) { } Filter* PrefixFilter::clone() const { return _CLNEW PrefixFilter(*this ); } TCHAR* PrefixFilter::toString() { //Instantiate a stringbuffer buffer to store the readable version temporarily CL_NS(util)::StringBuffer buffer; buffer.append(_T("PrefixFilter(")); buffer.append(prefix->field()); buffer.append(_T(")")); //Convert StringBuffer buffer to TCHAR block and return it return buffer.toString(); } /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ BitSet* PrefixFilter::bits( IndexReader* reader ) { BitSet* bts = _CLNEW BitSet( reader->maxDoc() ); DefaultPrefixGenerator gen(bts, prefix); gen.generate(reader); return bts; } CL_NS(index)::Term* PrefixFilter::getPrefix() const { return prefix; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/PrefixQuery.h000066400000000000000000000046031154025176300231720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_PrefixQuery #define _lucene_search_PrefixQuery CL_CLASS_DEF(index,Term) //#include "CLucene/index/Terms.h" //#include "CLucene/index/IndexReader.h" //#include "SearchHeader.h" //#include "BooleanQuery.h" //#include "TermQuery.h" #include "Query.h" #include "Filter.h" CL_CLASS_DEF(util,StringBuffer) CL_NS_DEF(search) /** A Query that matches documents containing terms with a specified prefix. A PrefixQuery * is built by QueryParser for input like app*. */ class CLUCENE_EXPORT PrefixQuery: public Query { private: CL_NS(index)::Term* prefix; protected: PrefixQuery(const PrefixQuery& clone); public: //Constructor. Constructs a query for terms starting with prefix PrefixQuery(CL_NS(index)::Term* Prefix); //Destructor ~PrefixQuery(); //Returns the name "PrefixQuery" const char* getObjectName() const; static const char* getClassName(); /** Returns the prefix of this query. */ CL_NS(index)::Term* getPrefix(bool pointer=true); Query* combine(CL_NS(util)::ArrayBase* queries); Query* rewrite(CL_NS(index)::IndexReader* reader); Query* clone() const; bool equals(Query * other) const; //Creates a user-readable version of this query and returns it as as string TCHAR* toString(const TCHAR* field) const; size_t hashCode() const; }; class CLUCENE_EXPORT PrefixFilter: public Filter { private: CL_NS(index)::Term* prefix; protected: PrefixFilter( const PrefixFilter& copy ); public: class PrefixGenerator; PrefixFilter(CL_NS(index)::Term* prefix); ~PrefixFilter(); /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader ); Filter* clone() const; /** Prints a user-readable version of this query. */ TCHAR* toString(); // Returns a reference of internal prefix CL_NS(index)::Term* getPrefix() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/Query.h000066400000000000000000000134271154025176300220200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Query_h #define _lucene_search_Query_h #include "CLucene/util/Array.h" #include "CLucene/index/Term.h" #include "CLucene/util/Equators.h" CL_CLASS_DEF(index,IndexReader) CL_NS_DEF(search) class Weight; class Similarity; class Searcher; typedef std::set TermSet; /** The abstract base class for queries.

Instantiable subclasses are:

  • {@link TermQuery}
  • {@link MultiTermQuery}
  • {@link BooleanQuery}
  • {@link WildcardQuery}
  • {@link PhraseQuery}
  • {@link PrefixQuery}
  • {@link PhrasePrefixQuery}
  • {@link FuzzyQuery}
  • {@link RangeQuery}
  • {@link spans.SpanQuery}

A parser for queries is contained in:

  • {@link queryParser.QueryParser QueryParser}
*/ class CLUCENE_EXPORT Query : public CL_NS(util)::NamedObject { private: // query boost factor float_t boost; protected: Query(); Query(const Query& clone); public: virtual ~Query(); /** Sets the boost for this query clause to b. Documents * matching this clause will (in addition to the normal weightings) have * their score multiplied by b. */ void setBoost(float_t b); /** Gets the boost for this clause. Documents matching * this clause will (in addition to the normal weightings) have their score * multiplied by b. The boost is 1.0 by default. */ float_t getBoost() const; /** Expert: Constructs an initializes a Weight for a top-level query. */ Weight* weight(Searcher* searcher); /** Expert: called to re-write queries into primitive queries. * * @memory: * The caller has to clean up. When rewrite() returns a pointer which * differs from the pointer to the initial query, the pointer points * to a newly allocated object and has also to be cleaned up. */ virtual Query* rewrite(CL_NS(index)::IndexReader* reader); /** Expert: called when re-writing queries under MultiSearcher. * * Create a single query suitable for use by all subsearchers (in 1-1 * correspondence with queries). This is an optimization of the OR of * all queries. We handle the common optimization cases of equal * queries and overlapping clauses of boolean OR queries (as generated * by MultiTermQuery.rewrite() and RangeQuery.rewrite()). * Be careful overriding this method as queries[0] determines which * method will be called and is not necessarily of the same type as * the other queries. */ virtual Query* combine(CL_NS(util)::ArrayBase* queries); /** Expert: adds all terms occurring in this query to the terms set. Only * works if this query is in its {@link #rewrite rewritten} form. * * @memory: * CLucene specific - all terms in the list have their reference counter * increased by one. * * @throws CLuceneError with CL_ERR_UnsupportedOperation */ virtual void extractTerms( TermSet * termset ) const; /** Expert: merges the clauses of a set of BooleanQuery's into a single * BooleanQuery. * *

A utility for use by {@link #combine(Query[])} implementations. */ static Query* mergeBooleanQueries(CL_NS(util)::ArrayBase* queries); /** Expert: Returns the Similarity implementation to be used for this query. * Subclasses may override this method to specify their own Similarity * implementation, perhaps one that delegates through that of the Searcher. * By default the Searcher's Similarity implementation is returned.*/ Similarity* getSimilarity(Searcher* searcher); /** Returns a clone of this query. */ virtual Query* clone() const = 0; _CL_DEPRECATED(getObjectName) const char* getQueryName() const; /** Prints a query to a string, with field assumed to be the * default field and omitted. *

The representation used is one that is supposed to be readable * by {@link org.apache.lucene.queryParser.QueryParser QueryParser}. However, * there are the following limitations: *

    *
  • If the query was created by the parser, the printed * representation may not be exactly what was parsed. For example, * characters that need to be escaped will be represented without * the required backslash.
  • *
  • Some of the more complicated queries (e.g. span queries) * don't have a representation that can be parsed by QueryParser.
  • *
* * @memory always returns a newly allocated string, which the caller is * responsible for deleting * */ virtual TCHAR* toString(const TCHAR* field) const = 0; virtual bool equals(Query* other) const = 0; virtual size_t hashCode() const = 0; /** Prints a query to a string. */ TCHAR* toString() const; /** Expert: Constructs an appropriate Weight implementation for this query. * *

Only implemented by primitive queries, which re-write to themselves. * This is an Internal function */ virtual Weight* _createWeight(Searcher* searcher); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/QueryFilter.cpp000066400000000000000000000037111154025176300235140ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "QueryFilter.h" #include "IndexSearcher.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/BitSet.h" #include "SearchHeader.h" #include "Query.h" CL_NS_DEF(search) CL_NS_USE(util) CL_NS_USE(index) class QFHitCollector: public HitCollector{ CL_NS(util)::BitSet* bits; public: QFHitCollector(CL_NS(util)::BitSet* bits){ this->bits = bits; } void collect(const int32_t doc, const float_t /*score*/){ bits->set(doc); // set bit for hit } }; QueryFilter::QueryFilter( const Query* query ) { this->query = query->clone(); bDeleteQuery = true; } QueryFilter::QueryFilter( Query* query, bool bDeleteQuery ) { this->query = query; this->bDeleteQuery = bDeleteQuery; } QueryFilter::~QueryFilter() { if( bDeleteQuery ) _CLDELETE( query ); } QueryFilter::QueryFilter( const QueryFilter& copy ) { this->query = copy.query->clone(); bDeleteQuery = true; } Filter* QueryFilter::clone() const { return _CLNEW QueryFilter(*this ); } TCHAR* QueryFilter::toString() { TCHAR* qt = query->toString(); size_t len = _tcslen(qt) + 14; TCHAR* ret = _CL_NEWARRAY( TCHAR, len ); ret[0] = 0; _sntprintf( ret, len, _T("QueryFilter(%s)"), qt ); _CLDELETE_CARRAY(qt); return ret; } /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ BitSet* QueryFilter::bits( IndexReader* reader ) { BitSet* bits = _CLNEW BitSet(reader->maxDoc()); IndexSearcher s(reader); QFHitCollector hc(bits); s._search(query, NULL, &hc); return bits; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/QueryFilter.h000066400000000000000000000020451154025176300231600ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_QueryFilter_ #define _lucene_search_QueryFilter_ //#include "CLucene/util/BitSet.h" //#include "CLucene/index/IndexReader.h" //#include "SearchHeader.h" #include "Filter.h" CL_CLASS_DEF(search,Query) //#include "CachingWrapperFilter.h" CL_NS_DEF(search) class CLUCENE_EXPORT QueryFilter: public Filter { private: Query* query; bool bDeleteQuery; protected: QueryFilter( const QueryFilter& copy ); public: QueryFilter( const Query* query ); QueryFilter( Query* query, bool bDeleteQuery ); ~QueryFilter(); CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader ); Filter *clone() const; TCHAR *toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/RangeFilter.cpp000066400000000000000000000103421154025176300234410ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/BitSet.h" #include "RangeFilter.h" CL_NS_DEF(search) CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(document) RangeFilter::RangeFilter( const TCHAR* _fieldName, const TCHAR* _lowerTerm, const TCHAR* _upperTerm, bool _includeLower, bool _includeUpper ) : fieldName(NULL), lowerTerm(NULL), upperTerm(NULL) , includeLower(_includeLower), includeUpper(_includeUpper) { if (NULL == _lowerTerm && NULL == _upperTerm) { _CLTHROWT(CL_ERR_IllegalArgument, _T("At least one value must be non-null")); } if (_includeLower && NULL == _lowerTerm) { _CLTHROWT(CL_ERR_IllegalArgument, _T("The lower bound must be non-null to be inclusive")); } if (_includeUpper && NULL == _upperTerm) { _CLTHROWT(CL_ERR_IllegalArgument, _T("The upper bound must be non-null to be inclusive")); } this->fieldName = STRDUP_TtoT(_fieldName); if ( _lowerTerm != NULL ) this->lowerTerm = STRDUP_TtoT(_lowerTerm); if ( _upperTerm != NULL ) this->upperTerm = STRDUP_TtoT(_upperTerm); } RangeFilter::RangeFilter( const RangeFilter& copy ) : fieldName( STRDUP_TtoT(copy.fieldName) ), lowerTerm( STRDUP_TtoT(copy.lowerTerm) ), upperTerm( STRDUP_TtoT(copy.upperTerm) ), includeLower( copy.includeLower ), includeUpper( copy.includeUpper ) { } RangeFilter::~RangeFilter() { _CLDELETE_LCARRAY( fieldName ); _CLDELETE_LCARRAY( lowerTerm ); _CLDELETE_LCARRAY( upperTerm ); } RangeFilter* RangeFilter::Less( const TCHAR* _fieldName, const TCHAR* _upperTerm ) { return _CLNEW RangeFilter( _fieldName, NULL, _upperTerm, false, true ); } RangeFilter* RangeFilter::More( const TCHAR* _fieldName, const TCHAR* _lowerTerm ) { return _CLNEW RangeFilter( _fieldName, _lowerTerm, NULL, true, false ); } BitSet* RangeFilter::bits( IndexReader* reader ) { BitSet* bts = _CLNEW BitSet( reader->maxDoc() ); Term* term = NULL; Term* t = _CLNEW Term( fieldName, (lowerTerm ? lowerTerm : _T("")), false ); TermEnum* enumerator = reader->terms( t ); // get enumeration of all terms after lowerValue _CLDECDELETE( t ); if( enumerator->term(false) == NULL ) { _CLLDELETE( enumerator ); return bts; } bool checkLower = false; if( !includeLower ) // make adjustments to set to exclusive checkLower = true; TermDocs* termDocs = reader->termDocs(); #define CLEANUP \ _CLLDECDELETE( term ); \ termDocs->close(); \ _CLLDELETE( termDocs ); \ enumerator->close(); \ _CLLDELETE( enumerator ) try { do { term = enumerator->term(); if( term == NULL || _tcscmp(term->field(), fieldName) ) break; if( !checkLower || lowerTerm == NULL || _tcscmp(term->text(), lowerTerm) > 0 ) { checkLower = false; if( upperTerm != NULL ) { int compare = _tcscmp( upperTerm, term->text() ); /* if beyond the upper term, or is exclusive and * this is equal to the upper term, break out */ if( (compare < 0) || (!includeUpper && compare == 0) ) break; } termDocs->seek( enumerator->term(false) ); while( termDocs->next() ) { bts->set( termDocs->doc() ); } } _CLDECDELETE( term ); } while( enumerator->next() ); }catch(CLuceneError& err){ _CLDELETE(bts); CLEANUP; throw err; } CLEANUP; return bts; } TCHAR* RangeFilter::toString() { size_t len = (fieldName ? _tcslen(fieldName) : 0) + (lowerTerm ? _tcslen(lowerTerm) : 0) + (upperTerm ? _tcslen(upperTerm) : 0) + 8; TCHAR* ret = _CL_NEWARRAY( TCHAR, len ); ret[0] = 0; _sntprintf( ret, len, _T("%s: [%s-%s]"), fieldName, (lowerTerm?lowerTerm:_T("")), (upperTerm?upperTerm:_T("")) ); return ret; } Filter* RangeFilter::clone() const { return _CLNEW RangeFilter(*this ); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/RangeFilter.h000066400000000000000000000041351154025176300231110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_RangeFilter_ #define _lucene_search_RangeFilter_ #include "Filter.h" CL_CLASS_DEF(index,Term) CL_NS_DEF(search) /** * A Filter that restricts search results to a range of values in a given * field. * *

* This code borrows heavily from {@link RangeQuery}, but is implemented as a Filter * *

*/ class CLUCENE_EXPORT RangeFilter: public Filter { private: TCHAR* fieldName; TCHAR* lowerTerm; TCHAR* upperTerm; bool includeLower; bool includeUpper; public: /** * @param fieldName The field this range applies to * @param lowerTerm The lower bound on this range * @param upperTerm The upper bound on this range * @param includeLower Does this range include the lower bound? * @param includeUpper Does this range include the upper bound? */ RangeFilter( const TCHAR* fieldName, const TCHAR* lowerTerm, const TCHAR* upperTerm, bool includeLower, bool includeUpper ); virtual ~RangeFilter(); /** * Constructs a filter for field fieldName matching * less than or equal to upperTerm. */ static RangeFilter* Less( const TCHAR* fieldName, const TCHAR* upperTerm ); /** * Constructs a filter for field fieldName matching * more than or equal to lowerTerm. */ static RangeFilter* More( const TCHAR* fieldName, const TCHAR* lowerTerm ); /** * Returns a BitSet with true for documents which should be * permitted in search results, and false for those that should * not. */ CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader ); Filter* clone() const; TCHAR* toString(); protected: RangeFilter( const RangeFilter& copy ); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/RangeQuery.cpp000066400000000000000000000143741154025176300233320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "RangeQuery.h" #include "SearchHeader.h" #include "Scorer.h" #include "BooleanQuery.h" #include "TermQuery.h" #include "Similarity.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) RangeQuery::RangeQuery(Term* lowerTerm, Term* upperTerm, const bool Inclusive){ //Func - Constructor //Pre - (LowerTerm != NULL OR UpperTerm != NULL) AND // if LowerTerm and UpperTerm are valid pointer then the fieldnames must be the same //Post - The instance has been created if (lowerTerm == NULL && upperTerm == NULL) { _CLTHROWA(CL_ERR_IllegalArgument,"At least one term must be non-null"); } if (lowerTerm != NULL && upperTerm != NULL && lowerTerm->field() != upperTerm->field()) { _CLTHROWA(CL_ERR_IllegalArgument,"Both terms must be for the same field"); } // if we have a lowerTerm, start there. otherwise, start at beginning if (lowerTerm != NULL) { this->lowerTerm = _CL_POINTER(lowerTerm); } else { this->lowerTerm = _CLNEW Term(upperTerm, LUCENE_BLANK_STRING); } this->upperTerm = (upperTerm != NULL ? _CL_POINTER(upperTerm) : NULL); this->inclusive = Inclusive; } RangeQuery::RangeQuery(const RangeQuery& clone): Query(clone){ this->inclusive = clone.inclusive; this->upperTerm = (clone.upperTerm != NULL ? _CL_POINTER(clone.upperTerm) : NULL ); this->lowerTerm = (clone.lowerTerm != NULL ? _CL_POINTER(clone.lowerTerm) : NULL ); } Query* RangeQuery::clone() const{ return _CLNEW RangeQuery(*this); } RangeQuery::~RangeQuery() { //Func - Destructor //Pre - true //Post - The instance has been destroyed _CLDECDELETE(lowerTerm); _CLDECDELETE(upperTerm); } /** Returns a hash code value for this object.*/ size_t RangeQuery::hashCode() const { return Similarity::floatToByte(getBoost()) ^ (lowerTerm != NULL ? lowerTerm->hashCode() : 0) ^ (upperTerm != NULL ? upperTerm->hashCode() : 0) ^ (this->inclusive ? 1 : 0); } const char* RangeQuery::getObjectName() const{ return getClassName(); } const char* RangeQuery::getClassName(){ return "RangeQuery"; } Query* RangeQuery::combine(CL_NS(util)::ArrayBase* queries) { return Query::mergeBooleanQueries(queries); } bool RangeQuery::equals(Query * other) const{ if (!(other->instanceOf(RangeQuery::getClassName()))) return false; RangeQuery* rq = (RangeQuery*)other; bool ret = (this->getBoost() == rq->getBoost()) && (this->isInclusive() == rq->isInclusive()) && (this->getLowerTerm()->equals(rq->getLowerTerm())) && (this->getUpperTerm()->equals(rq->getUpperTerm())); return ret; } Query* RangeQuery::rewrite(IndexReader* reader){ BooleanQuery* query = _CLNEW BooleanQuery( true ); TermEnum* enumerator = reader->terms(lowerTerm); Term* lastTerm = NULL; try { bool checkLower = false; if (!inclusive) // make adjustments to set to exclusive checkLower = true; const TCHAR* testField = getField(); do { lastTerm = enumerator->term(); if (lastTerm != NULL && lastTerm->field() == testField ) { if (!checkLower || _tcscmp(lastTerm->text(),lowerTerm->text()) > 0) { checkLower = false; if (upperTerm != NULL) { int compare = _tcscmp(upperTerm->text(),lastTerm->text()); /* if beyond the upper term, or is exclusive and * this is equal to the upper term, break out */ if ((compare < 0) || (!inclusive && compare == 0)) break; } TermQuery* tq = _CLNEW TermQuery(lastTerm); // found a match tq->setBoost(getBoost()); // set the boost query->add(tq, true, false, false); // add to query } }else { break; } _CLDECDELETE(lastTerm); } while (enumerator->next()); }catch(...){ _CLDECDELETE(lastTerm); //always need to delete this _CLDELETE(query); //in case of error, delete the query enumerator->close(); _CLDELETE(enumerator); throw; //rethrow } _CLDECDELETE(lastTerm); //always need to delete this enumerator->close(); _CLDELETE(enumerator); return query; } TCHAR* RangeQuery::toString(const TCHAR* field) const { StringBuffer buffer; if ( field==NULL || _tcscmp(getField(),field)!=0 ) { buffer.append( getField() ); buffer.append( _T(":")); } buffer.append(inclusive ? _T("[") : _T("{")); buffer.append(lowerTerm != NULL ? lowerTerm->text() : _T("NULL")); buffer.append(_T(" TO ")); buffer.append(upperTerm != NULL ? upperTerm->text() : _T("NULL")); buffer.append(inclusive ? _T("]") : _T("}")); if (getBoost() != 1.0f) { buffer.append( _T("^")); buffer.appendFloat( getBoost(),1 ); } return buffer.toString(); } const TCHAR* RangeQuery::getField() const { return (lowerTerm != NULL ? lowerTerm->field() : upperTerm->field()); } Term* RangeQuery::getLowerTerm(bool pointer) const { if ( pointer ) return _CL_POINTER(lowerTerm); else return lowerTerm; } Term* RangeQuery::getUpperTerm(bool pointer) const { if ( pointer ) return _CL_POINTER(upperTerm); else return upperTerm; } bool RangeQuery::isInclusive() const { return inclusive; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/RangeQuery.h000066400000000000000000000057421154025176300227760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_RangeQuery_ #define _lucene_search_RangeQuery_ //#include "SearchHeader.h" //#include "Scorer.h" //#include "TermQuery.h" #include "Query.h" CL_CLASS_DEF(index,Term) //#include "CLucene/index/Terms.h" CL_CLASS_DEF(util,StringBuffer) CL_NS_DEF(search) /** * A Query that matches documents within an exclusive range. A RangeQuery * is built by QueryParser for input like [010 TO 120] but only if the QueryParser has * the useOldRangeQuery property set to true. The QueryParser default behaviour is to use * the newer ConstantScoreRangeQuery class. This is generally preferable because: *
    *
  • It is faster than RangeQuery
  • *
  • Unlike RangeQuery, it does not cause a BooleanQuery.TooManyClauses exception if the range of values is large
  • *
  • Unlike RangeQuery it does not influence scoring based on the scarcity of individual terms that may match
  • *
* * * @see ConstantScoreRangeQuery * * * @version $Id: RangeQuery.java 520891 2007-03-21 13:58:47Z yonik $ */ class CLUCENE_EXPORT RangeQuery: public Query { private: CL_NS(index)::Term* lowerTerm; CL_NS(index)::Term* upperTerm; bool inclusive; protected: RangeQuery(const RangeQuery& clone); public: /** Constructs a query selecting all terms greater than * lowerTerm but less than upperTerm. * There must be at least one term and either term may be null, * in which case there is no bound on that side, but if there are * two terms, both terms must be for the same field. */ RangeQuery(CL_NS(index)::Term* LowerTerm, CL_NS(index)::Term* UpperTerm, const bool Inclusive); ~RangeQuery(); const char* getObjectName() const; static const char* getClassName(); /** * FIXME: Describe rewrite method here. * * @param reader an IndexReader value * @return a Query value * @exception IOException if an error occurs */ Query* rewrite(CL_NS(index)::IndexReader* reader); Query* combine(CL_NS(util)::ArrayBase* queries); /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* field) const; Query* clone() const; bool equals(Query * other) const; /** Returns the lower term of this range query */ CL_NS(index)::Term* getLowerTerm(bool pointer=true) const; /** Returns the upper term of this range query */ CL_NS(index)::Term* getUpperTerm(bool pointer=true) const; bool isInclusive() const; /** Returns true if the range query is inclusive */ const TCHAR* getField() const; size_t hashCode() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/Scorer.cpp000066400000000000000000000020121154025176300224670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Scorer.h" #include "SearchHeader.h" CL_NS_DEF(search) Scorer::Scorer(Similarity* _similarity) : similarity(_similarity){ } Scorer::~Scorer(){ } Similarity* Scorer::getSimilarity() const{ return this->similarity; } void Scorer::score(HitCollector* hc) { while (next()) { hc->collect(doc(), score()); } } bool Scorer::score( HitCollector* results, const int32_t maxDoc ) { while( doc() < maxDoc ) { results->collect( doc(), score() ); if ( !next() ) return false; } return true; } bool Scorer::sort(const Scorer* elem1, const Scorer* elem2){ return elem1->doc() < elem2->doc(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Scorer.h000066400000000000000000000102441154025176300221420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Scorer_ #define _lucene_search_Scorer_ CL_CLASS_DEF(search,Similarity) CL_CLASS_DEF(search,HitCollector) CL_CLASS_DEF(search,Explanation) CL_NS_DEF(search) /** * Expert: Common scoring functionality for different types of queries. * *

* A Scorer either iterates over documents matching a * query in increasing order of doc Id, or provides an explanation of * the score for a query for a given document. *

*

* Document scores are computed using a given Similarity * implementation. *

* @see BooleanQuery#setAllowDocsOutOfOrder */ class CLUCENE_EXPORT Scorer { private: Similarity* similarity; protected: /** Constructs a Scorer. * @param similarity The Similarity implementation used by this scorer. */ Scorer(Similarity* _similarity); public: virtual ~Scorer(); /** Returns the Similarity implementation used by this scorer. */ Similarity* getSimilarity() const; /** Scores and collects all matching documents. * @param hc The collector to which all matching documents are passed through * {@link HitCollector#collect(int, float)}. *
When this method is used the {@link #explain(int)} method should not be used. */ virtual void score(HitCollector* hc) ; /** Expert: Collects matching documents in a range. Hook for optimization. * Note that {@link #next()} must be called once before this method is called * for the first time. * @param hc The collector to which all matching documents are passed through * {@link HitCollector#collect(int, float)}. * @param max Do not score documents past this. * @return true if more matching documents may remain. */ virtual bool score( HitCollector* results, const int32_t maxDoc ); /** * Advances to the document matching this Scorer with the lowest doc Id * greater than the current value of {@link #doc()} (or to the matching * document with the lowest doc Id if next has never been called on * this Scorer). * *

* When this method is used the {@link #explain(int)} method should not * be used. *

* * @return true iff there is another document matching the query. * @see BooleanQuery#setAllowDocsOutOfOrder */ virtual bool next() = 0; /** Returns the current document number matching the query. * Initially invalid, until {@link #next()} is called the first time. */ virtual int32_t doc() const = 0; /** Returns the score of the current document matching the query. * Initially invalid, until {@link #next()} or {@link #skipTo(int)} * is called the first time. */ virtual float_t score() = 0; /** * Skips to the document matching this Scorer with the lowest doc Id * greater than or equal to a given target. * *

* The behavior of this method is undefined if the target specified is * less than or equal to the current value of {@link #doc()}. *

* Behaves as if written: *

	*   boolean skipTo(int target) {
	*     do {
	*       if (!next())
	* 	     return false;
	*     } while (target > doc());
	*     return true;
	*   }
	* 
* Most implementations are considerably more efficient than that. *

* *

* When this method is used the {@link #explain(int)} method should not * be used. *

* * @param target The target document number. * @return true iff there is such a match. * @see BooleanQuery#setAllowDocsOutOfOrder */ virtual bool skipTo(int32_t target) = 0; /** Returns an explanation of the score for a document. *
When this method is used, the {@link #next()}, {@link #skipTo(int)} and * {@link #score(HitCollector)} methods should not be used. * @param doc The document number for the explanation. */ virtual Explanation* explain(int32_t doc) = 0; /** Returns a string which explains the object */ virtual TCHAR* toString() = 0; static bool sort(const Scorer* elem1, const Scorer* elem2); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/ScorerDocQueue.cpp000066400000000000000000000063601154025176300241340ustar00rootroot00000000000000#include "CLucene/_ApiHeader.h" #include "ScorerDocQueue.h" #include "Scorer.h" CL_NS_DEF(util) class ScorerDocQueue::HeapedScorerDoc:LUCENE_BASE { public: Scorer* _scorer; int32_t _doc; HeapedScorerDoc( Scorer* s ); HeapedScorerDoc( Scorer* s, int32_t doc ); ~HeapedScorerDoc(); void adjust(); }; ScorerDocQueue::HeapedScorerDoc::HeapedScorerDoc( Scorer* scorer ) : _scorer(scorer), _doc(scorer->doc()) { } ScorerDocQueue::HeapedScorerDoc::HeapedScorerDoc( Scorer* scorer, int32_t doc ) : _scorer(scorer), _doc(doc) { } ScorerDocQueue::HeapedScorerDoc::~HeapedScorerDoc() { } void ScorerDocQueue::HeapedScorerDoc::adjust() { this->_doc = _scorer->doc(); } ScorerDocQueue::ScorerDocQueue( int32_t maxSize ) : maxSize(maxSize), _size(0) { int heapSize = maxSize + 1; heap = _CL_NEWARRAY( HeapedScorerDoc*, heapSize ); for ( int32_t i = 0; i < heapSize; i++ ) { heap[i] = NULL; } topHsd = heap[1]; } ScorerDocQueue::~ScorerDocQueue() { clear(); _CLDELETE_ARRAY( heap ); } void ScorerDocQueue::put( Scorer* scorer ) { _size++; heap[ _size ] = _CLNEW HeapedScorerDoc( scorer ); upHeap(); } bool ScorerDocQueue::insert( Scorer* scorer ) { if ( _size < maxSize ) { put( scorer ); return true; } else { int32_t docNr = scorer->doc(); if (( _size > 0 ) && ( !( docNr < topHsd->_doc ))) { _CLDELETE( heap[1] ); heap[1] = _CLNEW HeapedScorerDoc( scorer, docNr ); downHeap(); return true; } else { return false; } } } Scorer* ScorerDocQueue::pop() { Scorer* result = topHsd->_scorer; popNoResult(); return result; } void ScorerDocQueue::adjustTop() { topHsd->adjust(); downHeap(); } int32_t ScorerDocQueue::size() { return _size; } void ScorerDocQueue::clear() { for ( int32_t i = 0; i <= _size; i++ ) { _CLDELETE( heap[i] ); } _size = 0; } Scorer* ScorerDocQueue::top() { return topHsd->_scorer; } int32_t ScorerDocQueue::topDoc() { return topHsd->_doc; } float_t ScorerDocQueue::topScore() { return topHsd->_scorer->score(); } bool ScorerDocQueue::topNextAndAdjustElsePop() { return checkAdjustElsePop( topHsd->_scorer->next() ); } bool ScorerDocQueue::topSkipToAndAdjustElsePop( int32_t target ) { return checkAdjustElsePop( topHsd->_scorer->skipTo( target )); } bool ScorerDocQueue::checkAdjustElsePop( bool cond ) { if ( cond ) { topHsd->_doc = topHsd->_scorer->doc(); } else { _CLLDELETE( heap[1] ); heap[1] = heap[_size]; heap[_size] = NULL; _size--; } downHeap(); return cond; } void ScorerDocQueue::popNoResult() { _CLLDELETE( heap[1] ); heap[1] = heap[_size]; heap[_size] = NULL; _size--; downHeap(); } void ScorerDocQueue::upHeap() { int32_t i = _size; HeapedScorerDoc* node = heap[i]; int32_t j = i >> 1; while (( j > 0 ) && ( node->_doc < heap[j]->_doc )) { heap[i] = heap[j]; i = j; j = j >> 1; } heap[i] = node; topHsd = heap[1]; } void ScorerDocQueue::downHeap() { int32_t i = 1; HeapedScorerDoc* node = heap[i]; int32_t j = i << 1; int32_t k = j + 1; if (( k <= _size ) && ( heap[k]->_doc < heap[j]->_doc )) { j = k; } while (( j <= _size ) && ( heap[j]->_doc < node->_doc )) { heap[i] = heap[j]; i = j; j = i << 1; k = j + 1; if (( k <= _size ) && ( heap[k]->_doc < heap[j]->_doc )) { j = k; } } heap[i] = node; topHsd = heap[1]; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/ScorerDocQueue.h000066400000000000000000000022241154025176300235740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_ScorerDocQueue_ #define _lucene_util_ScorerDocQueue_ CL_CLASS_DEF(search,Scorer) CL_NS_USE(search) CL_NS_DEF(util) class CLUCENE_EXPORT ScorerDocQueue:LUCENE_BASE { private: class HeapedScorerDoc; HeapedScorerDoc** heap; HeapedScorerDoc* topHsd; int32_t maxSize; int32_t _size; public: ScorerDocQueue( int32_t maxSize ); virtual ~ScorerDocQueue(); void put( Scorer* scorer ); bool insert( Scorer* scorer ); Scorer* pop(); void adjustTop(); int32_t size(); void clear(); Scorer* top(); int32_t topDoc(); float_t topScore(); bool topNextAndAdjustElsePop(); bool topSkipToAndAdjustElsePop( int32_t target ); private: bool checkAdjustElsePop( bool cond ); void popNoResult(); void upHeap(); void downHeap(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/SearchHeader.cpp000066400000000000000000000142021154025176300235540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "SearchHeader.h" #include "CLucene/document/Document.h" #include "Similarity.h" #include "BooleanQuery.h" #include "Searchable.h" #include "Hits.h" #include "_FieldDocSortedHitQueue.h" #include CL_NS_USE(index) CL_NS_DEF(search) CL_NS(document)::Document* Searchable::doc(const int32_t i){ CL_NS(document)::Document* ret = _CLNEW CL_NS(document)::Document; if (!doc(i,ret) ) _CLDELETE(ret); return ret; } //static Query* Query::mergeBooleanQueries(CL_NS(util)::ArrayBase* queries) { std::vector allClauses; CL_NS(util)::ValueArray clauses; for (size_t i = 0; i < queries->length; i++) { assert(BooleanQuery::getClassName() == queries->values[i]->getObjectName()); BooleanQuery* booleanQuery = (BooleanQuery*)queries->values[i]; clauses.resize((booleanQuery->getClauseCount())); booleanQuery->getClauses(clauses.values); for (size_t j = 0; j < clauses.length; j++) { allClauses.push_back(clauses.values[j]->clone()); } } bool coordDisabled = ( queries->length == 0 ) ? false : ((BooleanQuery*)queries->values[0])->isCoordDisabled(); BooleanQuery* result = _CLNEW BooleanQuery(coordDisabled); std::vector::iterator i = allClauses.begin(); while ( i != allClauses.end() ){ result->add(*i); i++; } return result; } Query::Query(const Query& clone):boost(clone.boost){ } Weight* Query::_createWeight(Searcher* /*searcher*/){ _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: Query::_createWeight"); } Query::Query(): boost(1.0f) { } Query::~Query(){ } const char* Query::getQueryName() const{ return getObjectName(); } /** Expert: called to re-write queries into primitive queries. */ Query* Query::rewrite(CL_NS(index)::IndexReader* /*reader*/){ return this; } Query* Query::combine(CL_NS(util)::ArrayBase* queries){ std::vector uniques; for (size_t i = 0; i < queries->length; i++) { Query* query = queries->values[i]; CL_NS(util)::ValueArray clauses; // check if we can split the query into clauses bool splittable = query->instanceOf(BooleanQuery::getClassName()); if(splittable){ BooleanQuery* bq = (BooleanQuery*) query; splittable = bq->isCoordDisabled(); clauses.resize(bq->getClauseCount()); bq->getClauses(clauses.values); for (size_t j = 0; splittable && j < clauses.length; j++) { splittable = (clauses[j]->getOccur() == BooleanClause::SHOULD); } } if(splittable){ for (size_t j = 0; j < clauses.length; j++) { uniques.push_back(clauses[j]->getQuery()); } } else { uniques.push_back(query); } } // optimization: if we have just one query, just return it if(uniques.size() == 1){ return *uniques.begin(); } std::vector::iterator it = uniques.begin(); BooleanQuery* result = _CLNEW BooleanQuery(true); while (it != uniques.end() ){ result->add(*it, BooleanClause::SHOULD); it++; } return result; } Similarity* Query::getSimilarity(Searcher* searcher) { return searcher->getSimilarity(); } TCHAR* Query::toString() const{ return toString(LUCENE_BLANK_STRING); } void Query::setBoost(float_t b) { boost = b; } float_t Query::getBoost() const { return boost; } Weight* Query::weight(Searcher* searcher){ Query* query = searcher->rewrite(this); Weight* weight = query->_createWeight(searcher); float_t sum = weight->sumOfSquaredWeights(); float_t norm = getSimilarity(searcher)->queryNorm(sum); weight->normalize(norm); return weight; } void Query::extractTerms( TermSet * termset ) const { _CLTHROWA( CL_ERR_UnsupportedOperation,"UnsupportedOperationException: Query::extractTerms" ); } TopFieldDocs::TopFieldDocs (int32_t totalHits, FieldDoc** fieldDocs, int32_t scoreDocsLen, SortField** fields): TopDocs (totalHits, NULL, scoreDocsLen) { this->fields = fields; this->fieldDocs = fieldDocs; this->scoreDocs = new ScoreDoc[scoreDocsLen]; for (int32_t i=0;iscoreDocs[i] = this->fieldDocs[i]->scoreDoc; } TopFieldDocs::~TopFieldDocs(){ if ( fieldDocs ){ for (int32_t i=0;i= 0 //Post - The instance has been created } TopDocs::~TopDocs(){ //Func - Destructor //Pre - true //Post - The instance has been destroyed delete[] scoreDocs; } Searcher::Searcher(){ similarity = Similarity::getDefault(); } Searcher::~Searcher(){ } Hits* Searcher::search(Query* query) { return search(query, (Filter*)NULL ); } Hits* Searcher::search(Query* query, Filter* filter) { return _CLNEW Hits(this, query, filter); } Hits* Searcher::search(Query* query, const Sort* sort){ return _CLNEW Hits(this, query, NULL, sort); } Hits* Searcher::search(Query* query, Filter* filter, const Sort* sort){ return _CLNEW Hits(this, query, filter, sort); } void Searcher::_search(Query* query, HitCollector* results) { _search(query, NULL, results); } void Searcher::setSimilarity(Similarity* similarity) { this->similarity = similarity; } Similarity* Searcher::getSimilarity(){ return this->similarity; } const char* Searcher::getClassName(){ return "Searcher"; } const char* Searcher::getObjectName() const{ return Searcher::getClassName(); } Weight::~Weight(){ } TCHAR* Weight::toString(){ return STRDUP_TtoT(_T("Weight")); } Searchable::~Searchable(){ } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/SearchHeader.h000066400000000000000000000115031154025176300232220ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_SearchHeader_ #define _lucene_search_SearchHeader_ //#include "CLucene/index/IndexReader.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(index,IndexReader) //#include "Filter.h" CL_CLASS_DEF(document,Document) CL_CLASS_DEF(util,Comparable) //#include "Sort.h" //#include "CLucene/util/VoidList.h" //#include "Explanation.h" //#include "Similarity.h" CL_NS_DEF(search) class Query; class Scorer; class Explanation; class Hits; class Sort; class FieldDoc; class TopFieldDocs; /** Expert: Returned by low-level search implementations. * @see TopDocs */ struct CLUCENE_EXPORT ScoreDoc { /** Expert: A hit document's number. * @see Searcher#doc(int32_t) */ int32_t doc; /** Expert: The score of this document for the query. */ float_t score; }; /** Expert: Returned by low-level search implementations. * @see Searcher#search(Query,Filter,int32_t) */ class CLUCENE_EXPORT TopDocs:LUCENE_BASE { public: /** Expert: The total number of hits for the query. * @see Hits#length() */ int32_t totalHits; /** Expert: The top hits for the query. */ ScoreDoc* scoreDocs; int32_t scoreDocsLength; /** Expert: Constructs a TopDocs. TopDocs takes ownership of the ScoreDoc array*/ TopDocs(const int32_t th, ScoreDoc* sds, int32_t scoreDocsLength); virtual ~TopDocs(); private: /** Expert: Stores the maximum score value encountered, needed for normalizing. */ //float_t maxScore; }; /** Lower-level search API. *
HitCollectors are primarily meant to be used to implement queries, * sorting and filtering. * @see Searcher#search(Query,HitCollector) */ class CLUCENE_EXPORT HitCollector: LUCENE_BASE { public: /** Called once for every non-zero scoring document, with the document number * and its score. * *

If, for example, an application wished to collect all of the hits for a * query in a BitSet, then it might:

      *   Searcher searcher = new IndexSearcher(indexReader);
      *   final BitSet bits = new BitSet(indexReader.maxDoc());
      *   searcher.search(query, new HitCollector() {
      *       public void collect(int32_t doc, float score) {
      *         bits.set(doc);
      *       }
      *     });
      * 
* *

Note: This is called in an inner search loop. For good search * performance, implementations of this method should not call * {@link Searcher#doc(int32_t)} or * {@link IndexReader#document(int32_t)} on every * document number encountered. Doing so can slow searches by an order * of magnitude or more. *

Note: The score passed to this method is a raw score. * In other words, the score will not necessarily be a float whose value is * between 0 and 1. */ virtual void collect(const int32_t doc, const float_t score) = 0; virtual ~HitCollector(){} }; /** Expert: Calculate query weights and build query scorers. * *

A Weight is constructed by a query, given a Searcher ({@link * Query#_createWeight(Searcher)}). The {@link #sumOfSquaredWeights()} method * is then called on the top-level query to compute the query normalization * factor (@link Similarity#queryNorm(float_t)}). This factor is then passed to * {@link #normalize(float_t)}. At this point the weighting is complete and a * scorer may be constructed by calling {@link #scorer(IndexReader)}. */ class CLUCENE_EXPORT Weight { public: virtual ~Weight(); /** The query that this concerns. */ virtual Query* getQuery() = 0; /** The weight for this query. */ virtual float_t getValue() = 0; /** The sum of squared weights of contained query clauses. */ virtual float_t sumOfSquaredWeights() = 0; /** Assigns the query normalization factor to this. */ virtual void normalize(float_t norm) = 0; /** Constructs a scorer for this. */ virtual Scorer* scorer(CL_NS(index)::IndexReader* reader) = 0; /** An explanation of the score computation for the named document. */ virtual Explanation* explain(CL_NS(index)::IndexReader* reader, int32_t doc) = 0; virtual TCHAR* toString(); }; class CLUCENE_EXPORT HitDoc { public: float_t score; int32_t id; CL_NS(document)::Document* doc; HitDoc* next; // in doubly-linked cache HitDoc* prev; // in doubly-linked cache HitDoc(const float_t s, const int32_t i); virtual ~HitDoc(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/Searchable.h000066400000000000000000000143201154025176300227350ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Searcher_ #define _lucene_search_Searcher_ //#include "CLucene/index/IndexReader.h" CL_CLASS_DEF(index,Term) //#include "Filter.h" CL_CLASS_DEF(document,Document) //#include "Sort.h" //#include "CLucene/util/VoidList.h" //#include "Explanation.h" //#include "Similarity.h" CL_NS_DEF(search) //predefine classes class Query; class Filter; class HitCollector; class TopDocs; class Explanation; class Hits; class Similarity; class TopFieldDocs; class Sort; /** The interface for search implementations. * *

Implementations provide search over a single index, over multiple * indices, and over indices on remote servers. */ class CLUCENE_EXPORT Searchable: LUCENE_BASE { public: virtual ~Searchable(); /** Lower-level search API. * *

{@link HitCollector#collect(int32_t,float_t)} is called for every non-zero * scoring document. * *

Applications should only use this if they need all of the * matching documents. The high-level search API ({@link * Searcher#search(Query*)}) is usually more efficient, as it skips * non-high-scoring hits. * * @param query to match documents * @param filter if non-null, a bitset used to eliminate some documents * @param results to receive hits */ virtual void _search(Query* query, Filter* filter, HitCollector* results) = 0; /** Frees resources associated with this Searcher. * Be careful not to call this method while you are still using objects * like {@link Hits}. */ virtual void close() = 0; /** Expert: Returns the number of documents containing term. * Called by search code to compute term weights. * @see IndexReader#docFreq(Term). */ virtual int32_t docFreq(const CL_NS(index)::Term* term) const = 0; /** Expert: Returns one greater than the largest possible document number. * Called by search code to compute term weights. * @see IndexReader#maxDoc(). */ virtual int32_t maxDoc() const = 0; /** Expert: Low-level search implementation. Finds the top n * hits for query, applying filter if non-null. * *

Called by {@link Hits}. * *

Applications should usually call {@link Searcher#search(Query*)} or * {@link Searcher#search(Query*,Filter*)} instead. */ virtual TopDocs* _search(Query* query, Filter* filter, const int32_t n) = 0; /** Expert: Returns the stored fields of document i. * Called by {@link HitCollector} implementations. * @see IndexReader#document(int32_t). */ virtual bool doc(int32_t i, CL_NS(document)::Document* d) = 0; _CL_DEPRECATED( doc(i, document) ) CL_NS(document)::Document* doc(const int32_t i); /** Expert: called to re-write queries into primitive queries. */ virtual Query* rewrite(Query* query) = 0; /** Returns an Explanation that describes how doc scored against * query. * *

This is intended to be used in developing Similarity implementations, * and, for good performance, should not be displayed with every hit. * Computing an explanation is as expensive as executing the query over the * entire index. */ virtual void explain(Query* query, int32_t doc, Explanation* ret) = 0; /** Expert: Low-level search implementation with arbitrary sorting. Finds * the top n hits for query, applying * filter if non-null, and sorting the hits by the criteria in * sort. * *

Applications should usually call {@link * Searcher#search(Query,Filter,Sort)} instead. */ virtual TopFieldDocs* _search(Query* query, Filter* filter, const int32_t n, const Sort* sort) = 0; }; /** An abstract base class for search implementations. * Implements some common utility methods. */ class CLUCENE_EXPORT Searcher:public Searchable { private: /** The Similarity implementation used by this searcher. */ Similarity* similarity; public: Searcher(); virtual ~Searcher(); // Returns the documents matching query. Hits* search(Query* query); // Returns the documents matching query and // filter. Hits* search(Query* query, Filter* filter); /** Returns documents matching query sorted by * sort. */ Hits* search(Query* query, const Sort* sort); /** Returns documents matching query and filter, * sorted by sort. */ Hits* search(Query* query, Filter* filter, const Sort* sort); /** Lower-level search API. * *

{@link HitCollector#collect(int32_t ,float_t)} is called for every non-zero * scoring document. * *

Applications should only use this if they need all of the * matching documents. The high-level search API ({@link * Searcher#search(Query*)}) is usually more efficient, as it skips * non-high-scoring hits. *

Note: The score passed to this method is a raw score. * In other words, the score will not necessarily be a float whose value is * between 0 and 1. */ void _search(Query* query, HitCollector* results); /** Expert: Set the Similarity implementation used by this Searcher. * * @see Similarity#setDefault(Similarity) */ void setSimilarity(Similarity* similarity); /** Expert: Return the Similarity implementation used by this Searcher. * *

This defaults to the current value of {@link Similarity#getDefault()}. */ Similarity* getSimilarity(); virtual const char* getObjectName() const; static const char* getClassName(); virtual void _search(Query* query, Filter* filter, HitCollector* results) = 0; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/Similarity.cpp000066400000000000000000000175001154025176300233700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Similarity.h" #include "CLucene/index/Term.h" #include "SearchHeader.h" #include "Searchable.h" CL_NS_USE(index) CL_NS_DEF(search) #ifdef _CL_HAVE_NO_FLOAT_BYTE #if defined(_LUCENE_PRAGMA_WARNINGS) #pragma message ("==================Using fallback float<->byte encodings!!!==================") #else #warning "==================Using fallback float<->byte encodings!!!==================" #endif //if the autoconf figured out that we can't do the conversions properly, then //we fall back on the old, inaccurate way of doing things. float_t NORM_TABLE[] = { 0.0,5.820766E-10,6.9849193E-10,8.1490725E-10,9.313226E-10,1.1641532E-9,1.3969839E-9, 1.6298145E-9,1.8626451E-9,2.3283064E-9,2.7939677E-9,3.259629E-9,3.7252903E-9, 4.656613E-9,5.5879354E-9,6.519258E-9,7.4505806E-9,9.313226E-9,1.1175871E-8,1.3038516E-8, 1.4901161E-8,1.8626451E-8,2.2351742E-8,2.6077032E-8,2.9802322E-8,3.7252903E-8,4.4703484E-8, 5.2154064E-8,5.9604645E-8,7.4505806E-8,8.940697E-8,1.0430813E-7,1.1920929E-7,1.4901161E-7, 1.7881393E-7,2.0861626E-7,2.3841858E-7,2.9802322E-7,3.5762787E-7,4.172325E-7,4.7683716E-7, 5.9604645E-7,7.1525574E-7,8.34465E-7,9.536743E-7,1.1920929E-6,1.4305115E-6,1.66893E-6, 1.9073486E-6,2.3841858E-6,2.861023E-6,3.33786E-6,3.8146973E-6,4.7683716E-6,5.722046E-6, 6.67572E-6,7.6293945E-6,9.536743E-6,1.1444092E-5,1.335144E-5,1.5258789E-5,1.9073486E-5, 2.2888184E-5,2.670288E-5,3.0517578E-5,3.8146973E-5,4.5776367E-5,5.340576E-5,6.1035156E-5, 7.6293945E-5,9.1552734E-5,1.0681152E-4,1.2207031E-4,1.5258789E-4,1.8310547E-4,2.1362305E-4, 2.4414062E-4,3.0517578E-4,3.6621094E-4,4.272461E-4,4.8828125E-4,6.1035156E-4,7.324219E-4, 8.544922E-4,9.765625E-4,0.0012207031,0.0014648438,0.0017089844,0.001953125,0.0024414062, 0.0029296875,0.0034179688,0.00390625,0.0048828125,0.005859375,0.0068359375, 0.0078125,0.009765625,0.01171875,0.013671875,0.015625,0.01953125,0.0234375, 0.02734375,0.03125,0.0390625,0.046875,0.0546875,0.0625,0.078125,0.09375,0.109375, 0.125,0.15625,0.1875,0.21875,0.25,0.3125,0.375,0.4375,0.5,0.625,0.75, 0.875,1.0,1.25,1.5,1.75,2,2.5,3,3.5,4.0,5.0,6.0,7.0,8.0,10.0,12.0,14.0,16.0,20.0,24.0,28.0,32.0,40.0,48.0,56.0, 64.0,80.0,96.0,112.0,128.0,160.0,192.0,224.0,256.0,320.0,384.0,448.0,512.0,640.0,768.0,896.0,1024.0,1280.0,1536.0,1792.0, 2048.0,2560.0,3072.0,3584.0,4096.0,5120.0,6144.0,7168.0,8192.0,10240.0,12288.0,14336.0,16384.0,20480.0,24576.0, 28672.0,32768.0,40960.0,49152.0,57344.0,65536.0,81920.0,98304.0,114688.0,131072.0,163840.0,196608.0, 229376.0,262144.0,327680.0,393216.0,458752.0,524288.0,655360.0,786432.0,917504.0,1048576.0,1310720.0, 1572864.0,1835008.0,2097152.0,2621440.0,3145728.0,3670016.0,4194304.0,5242880.0,6291456.0,7340032.0, 8388608.0,10485760.0,12582912.0,14680064.0,16777216.0,20971520.0,25165824.0,29360128.0,33554432.0, 41943040.0,50331648.0,58720256.0,67108864.0,83886080.0,100663296.0,117440512.0,134217728.0, 167772160.0,201326592.0,234881024.0,268435456.0,335544320.0,402653184.0,469762048.0,536870912.0, 671088640.0,805306368.0,939524096.0,1073741824.0,1342177280.0,1610612736.0,1879048192.0, 2147483648.0,2684354560.0,3221225472.0,3758096384.0,4294967296.0,5368709120.0,6442450944.0,7516192768.0 }; float_t Similarity::byteToFloat(uint8_t b) { return NORM_TABLE[b]; } uint8_t Similarity::floatToByte(float_t f) { return Similarity::encodeNorm(f); } #else /** Cache of decoded bytes. */ float_t NORM_TABLE[256]; bool NORM_TABLE_initd=false; //float to bits conversion utilities... union clvalue { int32_t i; float f; //must use a float type, else types dont match up }; int32_t floatToIntBits(float_t value) { clvalue u; int32_t e, f; u.f = (float)value; e = u.i & 0x7f800000; f = u.i & 0x007fffff; if (e == 0x7f800000 && f != 0) u.i = 0x7fc00000; return u.i; } float_t intBitsToFloat(int32_t bits) { clvalue u; u.i = bits; return u.f; } float_t Similarity::byteToFloat(uint8_t b) { if (b == 0) // zero is a special case return 0.0f; int32_t mantissa = b & 7; int32_t exponent = (b >> 3) & 31; int32_t bits = ((exponent+(63-15)) << 24) | (mantissa << 21); return intBitsToFloat(bits); } uint8_t Similarity::floatToByte(float_t f) { if (f < 0.0f) // round negatives up to zero f = 0.0f; if (f == 0.0f) // zero is a special case return 0; int32_t bits = floatToIntBits(f); // parse float_t into parts int32_t mantissa = (bits & 0xffffff) >> 21; int32_t exponent = (((bits >> 24) & 0x7f) - 63) + 15; if (exponent > 31) { // overflow: use max value exponent = 31; mantissa = 7; } if (exponent < 0) { // underflow: use min value exponent = 0; mantissa = 1; } return (uint8_t)((exponent << 3) | mantissa); // pack into a uint8_t } #endif /** The Similarity implementation used by default. */ Similarity* Similarity_defaultImpl=NULL; void Similarity::setDefault(Similarity* similarity) { _CLDELETE(Similarity_defaultImpl); Similarity_defaultImpl = similarity; } Similarity* Similarity::getDefault() { if ( Similarity_defaultImpl == NULL ){ Similarity_defaultImpl = _CLNEW DefaultSimilarity(); } return Similarity_defaultImpl; } void Similarity::_shutdown(){ _CLDELETE(Similarity_defaultImpl); } float_t Similarity::decodeNorm(uint8_t b) { #ifndef _CL_HAVE_NO_FLOAT_BYTE if ( !NORM_TABLE_initd ){ for (int i = 0; i < 256; i++) NORM_TABLE[i] = byteToFloat(i); NORM_TABLE_initd=true; } #endif return NORM_TABLE[b]; } uint8_t Similarity::encodeNorm(float_t f) { #ifdef _CL_HAVE_NO_FLOAT_BYTE int32_t i=0; if ( f <= 0 ) return 0; while ( i<256 && f > NORM_TABLE[i] ){ i++; } if ( i == 0 ) return 0; else if ( i == 255 && f>NORM_TABLE[255] ) return 255; else return i; #else return floatToByte(f); #endif } float_t Similarity::idf(Term* term, Searcher* searcher) { return idf(searcher->docFreq(term), searcher->maxDoc()); } float_t Similarity::idf(CL_NS(util)::CLVector* terms, Searcher* searcher) { float_t _idf = 0.0f; for (CL_NS(util)::CLVector::iterator i = terms->begin(); i != terms->end(); i++ ) { _idf += idf((Term*)*i, searcher); } return _idf; } Similarity::~Similarity(){ } DefaultSimilarity::DefaultSimilarity(){ } DefaultSimilarity::~DefaultSimilarity(){ } float_t DefaultSimilarity::lengthNorm(const TCHAR* /*fieldName*/, int32_t numTerms) { if ( numTerms == 0 ) //prevent div by zero return 0; return (1.0 / sqrt((float_t)numTerms)); } float_t DefaultSimilarity::queryNorm(float_t sumOfSquaredWeights) { if ( sumOfSquaredWeights == 0 ) //prevent div by zero return 0.0f; return (float_t)(1.0 / sqrt(sumOfSquaredWeights)); } float_t DefaultSimilarity::tf(float_t freq) { return sqrt(freq); } float_t DefaultSimilarity::sloppyFreq(int32_t distance) { return 1.0f / (distance + 1); } float_t DefaultSimilarity::idf(int32_t docFreq, int32_t numDocs) { return (float_t)(log(numDocs/(float_t)(docFreq+1)) + 1.0); } float_t DefaultSimilarity::coord(int32_t overlap, int32_t maxOverlap) { if ( maxOverlap == 0 ) return 0.0f; return overlap / (float_t)maxOverlap; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Similarity.h000066400000000000000000000247231154025176300230420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Similarity_ #define _lucene_search_Similarity_ #include "CLucene/util/VoidList.h" CL_CLASS_DEF(index,Term) CL_NS_DEF(search) class Searcher; class DefaultSimilarity; /** Expert: Scoring API. *

Subclasses implement search scoring. * *

The score of query q for document d is defined * in terms of these methods as follows: * * * * * * * * * * * *
score(q,d) =
* Σ * {@link #tf(int32_t) tf}(t in d) * * {@link #idf(Term,Searcher) idf}(t) * * {@link Field#getBoost getBoost}(t.field in d) * * {@link #lengthNorm(TCHAR*,int32_t) lengthNorm}(t.field in d) *  * * {@link #coord(int32_t,int32_t) coord}(q,d) * * {@link #queryNorm(float_t) queryNorm}(q) *
* t in q *
* * @see #setDefault(Similarity) * @see IndexWriter#setSimilarity(Similarity) * @see Searcher#setSimilarity(Similarity) */ class CLUCENE_EXPORT Similarity:LUCENE_BASE { public: virtual ~Similarity(); /** Set the default Similarity implementation used by indexing and search * code. * * @see Searcher#setSimilarity(Similarity) * @see IndexWriter#setSimilarity(Similarity) */ static void setDefault(Similarity* similarity); /** Return the default Similarity implementation used by indexing and search * code. * *

This is initially an instance of {@link DefaultSimilarity}. * * @see Searcher#setSimilarity(Similarity) * @see IndexWriter#setSimilarity(Similarity) */ static Similarity* getDefault(); /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); /** Encodes a normalization factor for storage in an index. * *

The encoding uses a five-bit exponent and three-bit mantissa, thus * representing values from around 7x10^9 to 2x10^-9 with about one * significant decimal digit of accuracy. Zero is also represented. * Negative numbers are rounded up to zero. Values too large to represent * are rounded down to the largest representable value. Positive values too * small to represent are rounded up to the smallest positive representable * value. * * @see Field#setBoost(float_t) */ static uint8_t encodeNorm(float_t f); /** Decodes a normalization factor stored in an index. * @see #encodeNorm(float_t) */ static float_t decodeNorm(uint8_t b); static uint8_t floatToByte(float_t f); static float_t byteToFloat(uint8_t b); /** Computes a score factor for a phrase. * *

The default implementation sums the {@link #idf(Term,Searcher)} factor * for each term in the phrase. * * @param terms the terms in the phrase * @param searcher the document collection being searched * @return a score factor for the phrase */ float_t idf(CL_NS(util)::CLVector* terms, Searcher* searcher); template float_t idf( TermIterator first, TermIterator last, Searcher* searcher ) { float_t _idf = 0.0f; for( ; first != last; first++ ) { _idf += idf(*first, searcher); } return _idf; } //float_t idf(Term** terms, Searcher* searcher); /** Computes a score factor for a simple term. * *

The default implementation is:

   *   return idf(searcher.docFreq(term), searcher.maxDoc());
   * 
* * Note that {@link Searcher#maxDoc()} is used instead of * {@link IndexReader#numDocs()} because it is proportional to * {@link Searcher#docFreq(Term)} , i.e., when one is inaccurate, * so is the other, and in the same direction. * * @param term the term in question * @param searcher the document collection being searched * @return a score factor for the term */ float_t idf(CL_NS(index)::Term* term, Searcher* searcher); /** Computes a score factor based on a term or phrase's frequency in a * document. This value is multiplied by the {@link #idf(Term, Searcher)} * factor for each term in the query and these products are then summed to * form the initial score for a document. * *

Terms and phrases repeated in a document indicate the topic of the * document, so implementations of this method usually return larger values * when freq is large, and smaller values when freq * is small. * *

The default implementation calls {@link #tf(float_t)}. * * @param freq the frequency of a term within a document * @return a score factor based on a term's within-document frequency */ inline float_t tf(int32_t freq){ return tf((float_t)freq); } /** Computes the normalization value for a field given the total number of * terms contained in a field. These values, together with field boosts, are * stored in an index and multipled into scores for hits on each field by the * search code. * *

Matches in longer fields are less precise, so implemenations of this * method usually return smaller values when numTokens is large, * and larger values when numTokens is small. * *

That these values are computed under {@link * IndexWriter#addDocument(Document)} and stored then using * {#encodeNorm(float_t)}. Thus they have limited precision, and documents * must be re-indexed if this method is altered. * * @param fieldName the name of the field * @param numTokens the total number of tokens contained in fields named * fieldName of doc. * @return a normalization factor for hits on this field of this document * * @see Field#setBoost(float_t) */ virtual float_t lengthNorm(const TCHAR* fieldName, int32_t numTokens) = 0; /** Computes the normalization value for a query given the sum of the squared * weights of each of the query terms. This value is then multipled into the * weight of each query term. * *

This does not affect ranking, but rather just attempts to make scores * from different queries comparable. * * @param sumOfSquaredWeights the sum of the squares of query term weights * @return a normalization factor for query weights */ virtual float_t queryNorm(float_t sumOfSquaredWeights) = 0; /** Computes the amount of a sloppy phrase match, based on an edit distance. * This value is summed for each sloppy phrase match in a document to form * the frequency that is passed to {@link #tf(float_t)}. * *

A phrase match with a small edit distance to a document passage more * closely matches the document, so implementations of this method usually * return larger values when the edit distance is small and smaller values * when it is large. * * @see PhraseQuery#setSlop(int32_t) * @param distance the edit distance of this sloppy phrase match * @return the frequency increment for this match */ virtual float_t sloppyFreq(int32_t distance) = 0; /** Computes a score factor based on a term or phrase's frequency in a * document. This value is multiplied by the {@link #idf(Term, Searcher)} * factor for each term in the query and these products are then summed to * form the initial score for a document. * *

Terms and phrases repeated in a document indicate the topic of the * document, so implemenations of this method usually return larger values * when freq is large, and smaller values when freq * is small. * * @param freq the frequency of a term within a document * @return a score factor based on a term's within-document frequency */ virtual float_t tf(float_t freq) = 0; /** Computes a score factor based on a term's document frequency (the number * of documents which contain the term). This value is multiplied by the * {@link #tf(int32_t)} factor for each term in the query and these products are * then summed to form the initial score for a document. * *

Terms that occur in fewer documents are better indicators of topic, so * implemenations of this method usually return larger values for rare terms, * and smaller values for common terms. * * @param docFreq the number of documents which contain the term * @param numDocs the total number of documents in the collection * @return a score factor based on the term's document frequency */ virtual float_t idf(int32_t docFreq, int32_t numDocs) = 0; /** Computes a score factor based on the fraction of all query terms that a * document contains. This value is multiplied into scores. * *

The presence of a large portion of the query terms indicates a better * match with the query, so implemenations of this method usually return * larger values when the ratio between these parameters is large and smaller * values when the ratio between them is small. * * @param overlap the number of query terms matched in the document * @param maxOverlap the total number of terms in the query * @return a score factor based on term overlap with the query */ virtual float_t coord(int32_t overlap, int32_t maxOverlap) = 0; }; /** Expert: Default scoring implementation. */ class CLUCENE_EXPORT DefaultSimilarity: public Similarity { public: DefaultSimilarity(); ~DefaultSimilarity(); /** Implemented as 1/sqrt(numTerms). */ float_t lengthNorm(const TCHAR* fieldName, int32_t numTerms); /** Implemented as 1/sqrt(sumOfSquaredWeights). */ float_t queryNorm(float_t sumOfSquaredWeights); /** Implemented as sqrt(freq). */ inline float_t tf(float_t freq); /** Implemented as 1 / (distance + 1). */ float_t sloppyFreq(int32_t distance); /** Implemented as log(numDocs/(docFreq+1)) + 1. */ float_t idf(int32_t docFreq, int32_t numDocs); /** Implemented as overlap / maxOverlap. */ float_t coord(int32_t overlap, int32_t maxOverlap); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/SloppyPhraseScorer.cpp000066400000000000000000000126771154025176300250630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Scorer.h" #include "CLucene/index/Terms.h" #include "SearchHeader.h" #include "_PhrasePositions.h" #include "_SloppyPhraseScorer.h" #include "Similarity.h" CL_NS_USE(index) CL_NS_DEF(search) SloppyPhraseScorer::SloppyPhraseScorer(Weight* _weight, TermPositions** tps, int32_t* offsets, Similarity* similarity, int32_t _slop, uint8_t* norms): PhraseScorer(_weight,tps,offsets,similarity,norms),slop(_slop),repeats(NULL),repeatsLen(0){ //Func - Constructor //Pre - tps != NULL // tpsLength >= 0 // n != NULL //Post - Instance has been created CND_PRECONDITION(tps != NULL, "tps is NULL"); } SloppyPhraseScorer::~SloppyPhraseScorer(){ _CLDELETE_LARRAY(repeats); } float_t SloppyPhraseScorer::phraseFreq() { CND_PRECONDITION(first != NULL,"first is NULL"); CND_PRECONDITION(last != NULL,"last is NULL"); CND_PRECONDITION(pq != NULL,"pq is NULL"); int32_t end = initPhrasePositions(); float_t freq = 0.0f; bool done = (end<0); while (!done) { PhrasePositions* pp = pq->pop(); int32_t start = pp->position; int32_t next = pq->top()->position; bool tpsDiffer = true; for (int32_t pos = start; pos <= next || !tpsDiffer; pos = pp->position) { if (pos<=next && tpsDiffer) start = pos; // advance pp to min window if (!pp->nextPosition()) { done = true; // ran out of a term -- done break; } tpsDiffer = !pp->repeats || termPositionsDiffer(pp); } const int32_t matchLength = end - start; if (matchLength <= slop) freq += getSimilarity()->sloppyFreq(matchLength); // score match if (pp->position > end) end = pp->position; pq->put(pp); // restore pq } return freq; } int32_t SloppyPhraseScorer::initPhrasePositions() { int32_t end = 0; PhrasePositions* pp = NULL; // used in order to solve msvc6 scope issues // no repeats at all (most common case is also the simplest one) if (checkedRepeats && repeats==NULL) { // build queue from list pq->clear(); for (pp = first; pp != NULL; pp = pp->_next) { pp->firstPosition(); if (pp->position > end) end = pp->position; pq->put(pp); // build pq from list } return end; } // position the pp's for (pp = first; pp != NULL; pp = pp->_next) pp->firstPosition(); // one time initializatin for this scorer if (!checkedRepeats) { checkedRepeats = true; // check for repeats // TODO: is this correct, filtering clones using CLHashMap??? PhrasePositionsMap* m = NULL; for (pp = first; pp != NULL; pp = pp->_next) { int32_t tpPos = pp->position + pp->offset; for (PhrasePositions* pp2 = pp->_next; pp2 != NULL; pp2 = pp2->_next) { int32_t tpPos2 = pp2->position + pp2->offset; if (tpPos2 == tpPos) { if (m == NULL) m = new PhrasePositionsMap(false,false); pp->repeats = true; pp2->repeats = true; m->put(pp,NULL); m->put(pp2,NULL); } } } if (m!=NULL) { repeatsLen = m->size(); repeats = _CL_NEWARRAY(PhrasePositions*, repeatsLen + 1); PhrasePositionsMap::iterator itr = m->begin(); size_t pos = 0; while ( itr!=m->end() ){ repeats[pos] = itr->first; ++itr; ++pos; } repeats[repeatsLen + 1] = NULL; // NULL terminate the array } delete m; } // with repeats must advance some repeating pp's so they all start with differing tp's if (repeats!=NULL) { // must propagate higher offsets first (otherwise might miss matches). qsort(repeats, repeatsLen, sizeof(PhrasePositions*), comparePhrasePositions); // now advance them for (size_t i = 0; i < repeatsLen; i++) { PhrasePositions* pp = repeats[i]; while (!termPositionsDiffer(pp)) { if (!pp->nextPosition()) return -1; // ran out of a term -- done } } } // build queue from list pq->clear(); for (pp = first; pp != NULL; pp = pp->_next) { if (pp->position > end) end = pp->position; pq->put(pp); // build pq from list } return end; } // disalow two pp's to have the same tp position, so that same word twice // in query would go elswhere in the matched doc bool SloppyPhraseScorer::termPositionsDiffer(PhrasePositions* pp) { // efficiency note: a more efficient implemention could keep a map between repeating // pp's, so that if pp1a, pp1b, pp1c are repeats term1, and pp2a, pp2b are repeats // of term2, pp2a would only be checked against pp2b but not against pp1a, pp1b, pp1c. // However this would complicate code, for a rather rare case, so choice is to compromise here. const int32_t tpPos = pp->position + pp->offset; for (size_t i = 0; i < repeatsLen; i++) { PhrasePositions* pp2 = repeats[i]; if (pp2 == pp) continue; const int32_t tpPos2 = pp2->position + pp2->offset; if (tpPos2 == tpPos) return false; } return true; } TCHAR* SloppyPhraseScorer::toString(){ return stringDuplicate(_T("SloppyPhraseScorer")); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Sort.cpp000066400000000000000000000210731154025176300221710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Sort.h" #include "Compare.h" #include "SearchHeader.h" #include "CLucene/util/_StringIntern.h" #include "CLucene/util/StringBuffer.h" CL_NS_USE(util) CL_NS_DEF(search) SortField* SortField_FIELD_SCORE = NULL; SortField* SortField_FIELD_DOC = NULL; SortField* SortField::FIELD_SCORE(){ if ( SortField_FIELD_SCORE == NULL ) SortField_FIELD_SCORE = _CLNEW SortField (NULL, DOCSCORE,false); return SortField_FIELD_SCORE; } SortField* SortField::FIELD_DOC(){ if ( SortField_FIELD_DOC == NULL ) SortField_FIELD_DOC = _CLNEW SortField (NULL, DOC,false); return SortField_FIELD_DOC; } void SortField::_shutdown(){ _CLDELETE(SortField_FIELD_SCORE); _CLDELETE(SortField_FIELD_DOC); } Sort* Sort_RELEVANCE = NULL; Sort* Sort_INDEXORDER = NULL; Sort* Sort::RELEVANCE(){ if ( Sort_RELEVANCE == NULL ) Sort_RELEVANCE = _CLNEW Sort(); return Sort_RELEVANCE; } Sort* Sort::INDEXORDER(){ if ( Sort_INDEXORDER == NULL ) Sort_INDEXORDER = _CLNEW Sort (SortField::FIELD_DOC()); return Sort_INDEXORDER; } void Sort::_shutdown(){ _CLDELETE(Sort_RELEVANCE); _CLDELETE(Sort_INDEXORDER); } ScoreDocComparator* ScoreDocComparator_INDEXORDER = NULL; ScoreDocComparator* ScoreDocComparator_RELEVANCE = NULL; ScoreDocComparator* ScoreDocComparator::INDEXORDER(){ if ( ScoreDocComparator_INDEXORDER == NULL ) ScoreDocComparator_INDEXORDER = _CLNEW ScoreDocComparators::IndexOrder; return ScoreDocComparator_INDEXORDER; } ScoreDocComparator* ScoreDocComparator::RELEVANCE(){ if ( ScoreDocComparator_RELEVANCE == NULL ) ScoreDocComparator_RELEVANCE = _CLNEW ScoreDocComparators::Relevance; return ScoreDocComparator_RELEVANCE; } void ScoreDocComparator::_shutdown(){ _CLDELETE(ScoreDocComparator_INDEXORDER); _CLDELETE(ScoreDocComparator_RELEVANCE); } SortField::SortField (const TCHAR* field) { this->type = AUTO; this->reverse = false; this->field = CLStringIntern::intern(field); this->factory = NULL; } SortField::SortField (const TCHAR* field, int32_t type, bool reverse) { this->field = (field != NULL) ? CLStringIntern::intern(field) : field; this->type = type; this->reverse = reverse; this->factory = NULL; } SortField::SortField(const SortField& clone){ this->field = (clone.field != NULL) ? CLStringIntern::intern(clone.field) : clone.field; this->type = clone.type; this->reverse = clone.reverse; this->factory = clone.factory; } SortField* SortField::clone() const{ return _CLNEW SortField(*this); } const TCHAR* SortField::getField() const { return field; } int32_t SortField::getType() const { return type; } bool SortField::getReverse() const { return reverse; } SortComparatorSource* SortField::getFactory() const { return factory; } /** Creates a sort by terms in the given field sorted * according to the given locale. * @param field Name of field to sort by, cannot be null. * @param locale Locale of values in the field. */ /*SortField::SortField (TCHAR* field, Locale* locale) { this->field = (field != NULL) ? CLStringIntern::intern(field): field; this->type = STRING; this->locale = locale; }*/ /** Creates a sort, possibly in reverse, by terms in the given field sorted * according to the given locale. * @param field Name of field to sort by, cannot be null. * @param locale Locale of values in the field. */ /*SortField::SortField (TCHAR* field, Locale* locale, bool reverse) { this->field = (field != NULL) ? CLStringIntern::intern(field): field; this->type = STRING; this->locale = locale; this->reverse = reverse; }*/ SortField::SortField (const TCHAR* field, SortComparatorSource* comparator, bool reverse) { this->field = (field != NULL) ? CLStringIntern::intern(field): field; this->type = CUSTOM; this->reverse = reverse; this->factory = comparator; } SortField::~SortField(){ CLStringIntern::unintern(field); } TCHAR* SortField::toString() const { CL_NS(util)::StringBuffer buffer; switch (type) { case DOCSCORE: buffer.append(_T("")); break; case DOC: buffer.append(_T("")); break; case CUSTOM: buffer.append (_T("getName()); buffer.append(_T(">")); break; default: buffer.append( _T("\"")); buffer.append( field ); buffer.append( _T("\"") ); break; } //if (locale != null) buffer.append ("("+locale+")"); todo: if (reverse) buffer.appendChar('!'); return buffer.toString(); } Sort::Sort() { fields=NULL; SortField** fields=_CL_NEWARRAY(SortField*,3); fields[0]=SortField::FIELD_SCORE(); fields[1]=SortField::FIELD_DOC(); fields[2]=NULL; setSort (fields); _CLDELETE_ARRAY(fields); } Sort::~Sort(){ clear(); } void Sort::clear(){ if ( fields != NULL ){ int32_t i=0; while ( fields[i] != NULL ){ if ( fields[i] != SortField::FIELD_SCORE() && fields[i] != SortField::FIELD_DOC() ){ _CLDELETE(fields[i]); } i++; } _CLDELETE_ARRAY(fields); } } Sort::Sort (const TCHAR* field, bool reverse) { this->fields=NULL; setSort (field, reverse); } Sort::Sort (const TCHAR** fields) { this->fields=NULL; setSort (fields); } Sort::Sort (SortField* field) { this->fields=NULL; setSort (field); } Sort::Sort (SortField** fields) { this->fields=NULL; setSort (fields); } void Sort::setSort (const TCHAR* field, bool reverse) { clear(); fields = _CL_NEWARRAY(SortField*,3); fields[0] = _CLNEW SortField (field, SortField::AUTO, reverse); fields[1] = SortField::FIELD_DOC(); fields[2] = NULL; } void Sort::setSort (const TCHAR** fieldnames) { clear(); int32_t n = 0; while ( fieldnames[n] != NULL ) n++; fields = _CL_NEWARRAY(SortField*,n+1); for (int32_t i = 0; i < n; ++i) { fields[i] = _CLNEW SortField (fieldnames[i], SortField::AUTO,false); } fields[n]=NULL; } void Sort::setSort (SortField* field) { clear(); this->fields = _CL_NEWARRAY(SortField*,2); this->fields[0] = field; this->fields[1] = NULL; } void Sort::setSort (SortField** fields) { clear(); int n=0; while ( fields[n] != NULL ) n++; this->fields = _CL_NEWARRAY(SortField*,n+1); for (int i=0;ifields[i]=fields[i]; } TCHAR* Sort::toString() const { CL_NS(util)::StringBuffer buffer; int32_t i = 0; while ( fields[i] != NULL ){ if (i>0) buffer.appendChar(','); TCHAR* p = fields[i]->toString(); buffer.append(p); _CLDELETE_CARRAY(p); i++; } return buffer.toString(); } ScoreDocComparator::~ScoreDocComparator(){ } class ScoreDocComparatorImpl: public ScoreDocComparator{ Comparable** cachedValues; FieldCacheAuto* fca; int32_t cachedValuesLen; public: ScoreDocComparatorImpl(FieldCacheAuto* fca){ this->fca = fca; if ( fca->contentType != FieldCacheAuto::COMPARABLE_ARRAY ) _CLTHROWA(CL_ERR_InvalidCast,"Invalid field cache auto type"); this->cachedValues = fca->comparableArray; this->cachedValuesLen = fca->contentLen; } ~ScoreDocComparatorImpl(){ } int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j){ CND_PRECONDITION(i->doc >= 0 && i->doc < cachedValuesLen, "i->doc out of range") CND_PRECONDITION(j->doc >= 0 && j->doc < cachedValuesLen, "j->doc out of range") return cachedValues[i->doc]->compareTo (cachedValues[j->doc]); } CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i){ CND_PRECONDITION(i->doc >= 0 && i->doc < cachedValuesLen, "i->doc out of range") return cachedValues[i->doc]; } int32_t sortType(){ return SortField::CUSTOM; } }; ScoreDocComparator* SortComparator::newComparator (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname){ return _CLNEW ScoreDocComparatorImpl(FieldCache::DEFAULT()->getCustom (reader, fieldname, this)); } SortComparator::SortComparator(){ } SortComparator::~SortComparator(){ } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/Sort.h000066400000000000000000000355051154025176300216430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_Sort_ #define _lucene_search_Sort_ //#include "CLucene/index/IndexReader.h" //#include "SearchHeader.h" //#include "CLucene/util/Equator.h" CL_CLASS_DEF(index,IndexReader) CL_CLASS_DEF(util,Comparable) CL_NS_DEF(search) //predefine class SortField; class Sort; /** * Expert: Compares two ScoreDoc objects for sorting. * */ class CLUCENE_EXPORT ScoreDocComparator { protected: ScoreDocComparator(){} public: virtual ~ScoreDocComparator(); /** * Compares two ScoreDoc objects and returns a result indicating their * sort order. * @param i First ScoreDoc * @param j Second ScoreDoc * @return a negative integer if i should come before j
* a positive integer if i should come after j
* 0 if they are equal * @see java.util.Comparator */ virtual int32_t compare (struct ScoreDoc* i, struct ScoreDoc* j) = 0; /** * Returns the value used to sort the given document. The * object returned must implement the java.io.Serializable * interface. This is used by multisearchers to determine how * to collate results from their searchers. * @see FieldDoc * @param i Document * @return Serializable object */ virtual CL_NS(util)::Comparable* sortValue (struct ScoreDoc* i) = 0; /** * Returns the type of sort. Should return SortField.SCORE, * SortField.DOC, SortField.STRING, * SortField.INTEGER, SortField.FLOAT or * SortField.CUSTOM. It is not valid to return * SortField.AUTO. * This is used by multisearchers to determine how to collate results * from their searchers. * @return One of the constants in SortField. * @see SortField */ virtual int32_t sortType() = 0; /** Special comparator for sorting hits according to computed relevance (document score). */ static ScoreDocComparator* RELEVANCE(); /** Special comparator for sorting hits according to index order (document number). */ static ScoreDocComparator* INDEXORDER(); /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); }; /** * Expert: returns a comparator for sorting ScoreDocs. * */ class CLUCENE_EXPORT SortComparatorSource:LUCENE_BASE { public: virtual ~SortComparatorSource(){ } /** * return a reference to a string describing the name of the comparator * this is used in the explanation */ virtual TCHAR* getName() = 0; virtual size_t hashCode() = 0; /** * Creates a comparator for the field in the given index. * @param reader Index to create comparator for. * @param fieldname Name of the field to create comparator for. * @return Comparator of ScoreDoc objects. * @throws IOException If an error occurs reading the index. */ virtual ScoreDocComparator* newComparator (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname) = 0; }; /** * Abstract base class for sorting hits returned by a Query. * *

This class should only be used if the other SortField * types (SCORE, DOC, STRING, INT, FLOAT) do not provide an * adequate sorting. It maintains an internal cache of values which * could be quite large. The cache is an array of Comparable, * one for each document in the index. There is a distinct * Comparable for each unique term in the field - if * some documents have the same term in the field, the cache * array will have entries which reference the same Comparable. * */ class CLUCENE_EXPORT SortComparator: public SortComparatorSource { public: virtual ScoreDocComparator* newComparator (CL_NS(index)::IndexReader* reader, const TCHAR* fieldname); SortComparator(); virtual ~SortComparator(); /** * Returns an object which, when sorted according to natural order, * will order the Term values in the correct order. *

For example, if the Terms contained integer values, this method * would return new Integer(termtext). Note that this * might not always be the most efficient implementation - for this * particular example, a better implementation might be to make a * ScoreDocLookupComparator that uses an internal lookup table of int. * @param termtext The textual value of the term. * @return An object representing termtext that sorts * according to the natural order of termtext. * @see Comparable * @see ScoreDocComparator */ virtual CL_NS(util)::Comparable* getComparable (const TCHAR* termtext) = 0; }; /** * Stores information about how to sort documents by terms in an individual * field. Fields must be indexed in order to sort by them. * */ class CLUCENE_EXPORT SortField:LUCENE_BASE { private: const TCHAR* field; int32_t type; // defaults to determining type dynamically //Locale* locale; // defaults to "natural order" (no Locale) bool reverse; // defaults to natural order SortComparatorSource* factory; protected: SortField (const SortField& clone); public: virtual ~SortField(); /** Sort by document score (relevancy). Sort values are Float and higher * values are at the front. * PORTING: this is the same as SCORE in java, it had to be renamed because * SCORE is a system macro on some platforms (AIX). */ LUCENE_STATIC_CONSTANT(int32_t, DOCSCORE=0); /** Sort by document number (index order). Sort values are Integer and lower * values are at the front. */ LUCENE_STATIC_CONSTANT(int32_t, DOC=1); /** Guess type of sort based on field contents. A regular expression is used * to look at the first term indexed for the field and determine if it * represents an integer number, a floating point number, or just arbitrary * string characters. */ LUCENE_STATIC_CONSTANT(int32_t, AUTO=2); /** Sort using term values as Strings. Sort values are String and lower * values are at the front. */ LUCENE_STATIC_CONSTANT(int32_t, STRING=3); /** Sort using term values as encoded Integers. Sort values are Integer and * lower values are at the front. */ LUCENE_STATIC_CONSTANT(int32_t, INT=4); /** Sort using term values as encoded Floats. Sort values are Float and * lower values are at the front. */ LUCENE_STATIC_CONSTANT(int32_t, FLOAT=5); /** Sort using term values as encoded Longs. Sort values are Long and * lower values are at the front. */ LUCENE_STATIC_CONSTANT(int32_t, LONG=6); /** Sort using term values as encoded Doubles. Sort values are Double and * lower values are at the front. */ LUCENE_STATIC_CONSTANT(int32_t, DOUBLE=7); /** Sort using a custom Comparator. Sort values are any Comparable and * sorting is done according to natural order. */ LUCENE_STATIC_CONSTANT(int32_t, CUSTOM=9); // IMPLEMENTATION NOTE: the FieldCache.STRING_INDEX is in the same "namespace" // as the above static int values. Any new values must not have the same value // as FieldCache.STRING_INDEX. /** Represents sorting by document score (relevancy). */ static SortField* FIELD_SCORE(); /** Represents sorting by document number (index order). */ static SortField* FIELD_DOC(); /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); /** Creates a sort by terms in the given field where the type of term value * is determined dynamically ({@link #AUTO AUTO}). * @param field Name of field to sort by, cannot be null. */ SortField (const TCHAR* field); //SortField (const TCHAR* field, bool reverse); //todo: we cannot make reverse use default field of =false. //because bool and int are the same type in c, overloading is not possible /** Creates a sort, possibly in reverse, by terms in the given field with the * type of term values explicitly given. * @param field Name of field to sort by. Can be null if * type is SCORE or DOC. * @param type Type of values in the terms. * @param reverse True if natural order should be reversed (default=false). */ SortField (const TCHAR* field, int32_t type, bool reverse); /* SortField (TCHAR* field, Locale* locale) { SortField (TCHAR* field, Locale* locale, bool reverse);*/ /** Creates a sort, possibly in reverse, with a custom comparison function. * @param field Name of field to sort by; cannot be null. * @param comparator Returns a comparator for sorting hits. * @param reverse True if natural order should be reversed (default=false). */ SortField (const TCHAR* field, SortComparatorSource* comparator, bool reverse=false); /** Returns the name of the field. Could return null * if the sort is by SCORE or DOC. * @return Name of field, possibly null. */ const TCHAR* getField() const; SortField* clone() const; /** Returns the type of contents in the field. * @return One of the constants SCORE, DOC, AUTO, STRING, INT or FLOAT. */ int32_t getType() const; /** Returns the Locale by which term values are interpreted. * May return null if no Locale was specified. * @return Locale, or null. */ /*Locale getLocale() { return locale; }*/ /** Returns whether the sort should be reversed. * @return True if natural order should be reversed. */ bool getReverse() const; SortComparatorSource* getFactory() const; TCHAR* toString() const; }; /** * Encapsulates sort criteria for returned hits. * *

The fields used to determine sort order must be carefully chosen. * Documents must contain a single term in such a field, * and the value of the term should indicate the document's relative position in * a given sort order. The field must be indexed, but should not be tokenized, * and does not need to be stored (unless you happen to want it back with the * rest of your document data). In other words: * *

document.add (new Field ("byNumber", Integer.toString(x), false, true, false)); *
* *

Valid Types of Values

* *

There are three possible kinds of term values which may be put into * sorting fields: Integers, Floats, or Strings. Unless * {@link SortField SortField} objects are specified, the type of value * in the field is determined by parsing the first term in the field. * *

Integer term values should contain only digits and an optional * preceeding negative sign. Values must be base 10 and in the range * Integer.MIN_VALUE and Integer.MAX_VALUE inclusive. * Documents which should appear first in the sort * should have low value integers, later documents high values * (i.e. the documents should be numbered 1..n where * 1 is the first and n the last). * *

Float term values should conform to values accepted by * {@link Float Float.valueOf(String)} (except that NaN * and Infinity are not supported). * Documents which should appear first in the sort * should have low values, later documents high values. * *

String term values can contain any valid String, but should * not be tokenized. The values are sorted according to their * {@link Comparable natural order}. Note that using this type * of term value has higher memory requirements than the other * two types. * *

Object Reuse

* *

One of these objects can be * used multiple times and the sort order changed between usages. * *

This class is thread safe. * *

Memory Usage

* *

Sorting uses of caches of term values maintained by the * internal HitQueue(s). The cache is static and contains an integer * or float array of length IndexReader.maxDoc() for each field * name for which a sort is performed. In other words, the size of the * cache in bytes is: * *

4 * IndexReader.maxDoc() * (# of different fields actually used to sort) * *

For String fields, the cache is larger: in addition to the * above array, the value of every term in the field is kept in memory. * If there are many unique terms in the field, this could * be quite large. * *

Note that the size of the cache is not affected by how many * fields are in the index and might be used to sort - only by * the ones actually used to sort a result set. * *

The cache is cleared each time a new IndexReader is * passed in, or if the value returned by maxDoc() * changes for the current IndexReader. This class is not set up to * be able to efficiently sort hits from more than one index * simultaneously. * */ class CLUCENE_EXPORT Sort:LUCENE_BASE { // internal representation of the sort criteria SortField** fields; void clear(); public: ~Sort(); /** Represents sorting by computed relevance. Using this sort criteria * returns the same results as calling {@link Searcher#search(Query) Searcher#search()} * without a sort criteria, only with slightly more overhead. */ static Sort* RELEVANCE(); /** Represents sorting by index order. */ static Sort* INDEXORDER(); /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); /** Sorts by computed relevance. This is the same sort criteria as * calling {@link Searcher#search(Query) Searcher#search()} without a sort criteria, only with * slightly more overhead. */ Sort(); /** Sorts possibly in reverse by the terms in field then by * index order (document number). The type of value in field is determined * automatically. * @see SortField#AUTO */ Sort (const TCHAR* field, bool reverse=false); /** Sorts in succession by the terms in each field. * The type of value in field is determined * automatically. * @see SortField#AUTO */ Sort (const TCHAR** fields); /** Sorts by the criteria in the given SortField. */ Sort (SortField* field); /** Sorts in succession by the criteria in each SortField. */ Sort (SortField** fields); /** Sets the sort to the terms in field possibly in reverse, * then by index order (document number). */ void setSort (const TCHAR* field, bool reverse=false); /** Sets the sort to the terms in each field in succession. */ void setSort (const TCHAR** fieldnames); /** Sets the sort to the given criteria. */ void setSort (SortField* field); /** Sets the sort to the given criteria in succession. */ void setSort (SortField** fields); TCHAR* toString() const; /** * Representation of the sort criteria. * @return a pointer to the of SortField array used in this sort criteria */ SortField** getSort() const{ return fields; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/SpanFilter.h000066400000000000000000000032501154025176300227530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_SpanFilter_ #define _lucene_search_SpanFilter_ #include "Filter.h" #include "SpanFilterResult.h" CL_NS_DEF(search) /** Abstract base class providing a mechanism to restrict searches to a subset of an index and also maintains and returns position information. This is useful if you want to compare the positions from a SpanQuery with the positions of items in a filter. For instance, if you had a SpanFilter that marked all the occurrences of the word "foo" in documents, and then you entered a new SpanQuery containing bar, you could not only filter by the word foo, but you could then compare position information for post processing. */ class CLUCENE_EXPORT SpanFilter : public Filter { public: virtual ~SpanFilter() {} /** Returns a SpanFilterResult with true for documents which should be permitted in * search results, and false for those that should not and Spans for where the true docs match. * @param reader The {@link org.apache.lucene.index.IndexReader} to load position and bitset information from * @return A {@link SpanFilterResult} * @throws CLuceneError if there was an issue accessing the necessary information */ virtual SpanFilterResult * bitSpans( CL_NS(index)::IndexReader * reader ) = 0; }; CL_NS_END #endif // _lucene_search_SpanFilter_ clucene-core-2.3.3.4/src/core/CLucene/search/SpanFilterResult.h000066400000000000000000000060451154025176300241570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_SpanFilterResult_ #define _lucene_search_SpanFilterResult_ #include "CLucene/util/BitSet.h" #include "CLucene/util/VoidList.h" CL_NS_DEF(search) /** * The results of a SpanQueryFilter. * Wraps the BitSet and the position information from the SpanQuery * * NOTE: This API is still experimental and subject to change. **/ class CLUCENE_EXPORT SpanFilterResult { public: class StartEnd { private: int32_t start; int32_t end; public: StartEnd( int32_t _start, int32_t _end ) : start(_start), end(_end) {} virtual ~StartEnd() {} /** * @return The end position of this match */ int32_t getEnd() { return end; } /** * The Start position * @return The start position of this match */ int32_t getStart() { return start; } }; class PositionInfo { private: int32_t doc; CL_NS(util)::CLList* positions; public: PositionInfo( int32_t _doc ) : doc(_doc) { positions = _CLNEW CL_NS(util)::CLList(); } virtual ~PositionInfo() { _CLLDELETE( positions ); } void addPosition( int32_t start, int32_t end ) { positions->push_back( _CLNEW StartEnd( start, end )); } int32_t getDoc() { return doc; } /** * @return A List of {@link org.apache.lucene.search.SpanFilterResult.StartEnd} objects */ CL_NS(util)::CLList* getPositions() { return positions; } }; private: CL_NS(util)::BitSet * bits; CL_NS(util)::CLList * positions; //Spans spans; public: /** * Constructor * @param bits The bits for the Filter * @param positions A List of {@link org.apache.lucene.search.SpanFilterResult.PositionInfo} objects */ SpanFilterResult( CL_NS(util)::BitSet * _bits, CL_NS(util)::CLList * _positions ) : bits( _bits ), positions( _positions ) {} virtual ~SpanFilterResult() {} /** * The first entry in the array corresponds to the first "on" bit. * Entries are increasing by document order * @return A List of PositionInfo objects */ CL_NS(util)::CLList * getPositions() { return positions; } CL_NS(util)::BitSet * getBits() { return bits; } }; CL_NS_END #endif // _lucene_search_SpanFilterResult_ clucene-core-2.3.3.4/src/core/CLucene/search/SpanQueryFilter.cpp000066400000000000000000000054041154025176300243370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "SpanQueryFilter.h" #include "CLucene/index/IndexReader.h" #include "CLucene/search/spans/Spans.h" CL_NS_DEF(search) SpanQueryFilter::SpanQueryFilter() : query( NULL ) {} SpanQueryFilter::SpanQueryFilter( const CL_NS2(search,spans)::SpanQuery * query ) { this->query = (CL_NS2(search,spans)::SpanQuery *) query->clone(); bDeleteQuery = true; } SpanQueryFilter::SpanQueryFilter( CL_NS2(search,spans)::SpanQuery * query, bool bDeleteQuery ) { this->query = query; this->bDeleteQuery = bDeleteQuery; } SpanQueryFilter::SpanQueryFilter( const SpanQueryFilter& copy ) { this->query = (CL_NS2(search,spans)::SpanQuery *) copy.query->clone(); bDeleteQuery = true; } SpanQueryFilter::~SpanQueryFilter() { if( bDeleteQuery ) _CLDELETE( query ); } Filter* SpanQueryFilter::clone() const { return _CLNEW SpanQueryFilter( *this ); } CL_NS(util)::BitSet * SpanQueryFilter::bits( CL_NS(index)::IndexReader * reader ) { SpanFilterResult * result = bitSpans( reader ); CL_NS(util)::BitSet * bits = result->getBits(); _CLLDELETE( result ); return bits; } SpanFilterResult * SpanQueryFilter::bitSpans( CL_NS(index)::IndexReader * reader ) { CL_NS(util)::BitSet * bits = _CLNEW CL_NS(util)::BitSet( reader->maxDoc() ); CL_NS2(search,spans)::Spans * spans = query->getSpans( reader ); CL_NS(util)::CLList * tmp = new CL_NS(util)::CLList(); int32_t currentDoc = -1; SpanFilterResult::PositionInfo * currentInfo = NULL; while( spans->next() ) { int32_t doc = spans->doc(); bits->set( doc ); if( currentDoc != doc ) { currentInfo = _CLNEW SpanFilterResult::PositionInfo( doc ); tmp->push_back( currentInfo ); currentDoc = doc; } currentInfo->addPosition( spans->start(), spans->end() ); } return _CLNEW SpanFilterResult( bits, tmp ); } TCHAR* SpanQueryFilter::toString() { TCHAR* qt = query->toString(); size_t len = _tcslen( qt ) + 21; TCHAR* ret = _CL_NEWARRAY( TCHAR, len ); ret[0] = 0; _sntprintf( ret, len, _T( "QueryWrapperFilter(%s)" ), qt ); _CLDELETE_CARRAY( qt ); return ret; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/SpanQueryFilter.h000066400000000000000000000045641154025176300240120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_SpanQueryFilter_ #define _lucene_search_SpanQueryFilter_ #include "SpanFilter.h" #include "spans/SpanQuery.h" CL_NS_DEF(search) /** * Constrains search results to only match those which also match a provided * query. Also provides position information about where each document matches * at the cost of extra space compared with the QueryWrapperFilter. * There is an added cost to this above what is stored in a {@link QueryWrapperFilter}. Namely, * the position information for each matching document is stored. *

* This filter does not cache. See the {@link org.apache.lucene.search.CachingSpanFilter} for a wrapper that * caches. * * @version $Id:$ */ class CLUCENE_EXPORT SpanQueryFilter : public SpanFilter { protected: CL_NS2(search,spans)::SpanQuery * query; bool bDeleteQuery; protected: SpanQueryFilter(); SpanQueryFilter( const SpanQueryFilter& copy ); public: /** Constructs a filter which only matches documents matching * query. * @param query The {@link org.apache.lucene.search.spans.SpanQuery} to use as the basis for the Filter. */ SpanQueryFilter( const CL_NS2(search,spans)::SpanQuery * query ); SpanQueryFilter( CL_NS2(search,spans)::SpanQuery * query, bool bDeleteQuery ); virtual ~SpanQueryFilter(); virtual Filter* clone() const; virtual CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader * reader ); virtual SpanFilterResult * bitSpans( CL_NS(index)::IndexReader * reader ); CL_NS2(search,spans)::SpanQuery * getQuery(); virtual TCHAR* toString(); // public boolean equals( Object o ) { // return o instanceof SpanQueryFilter && this.query.equals(((SpanQueryFilter) o).query); // } // // public int hashCode() { // return query.hashCode() ^ 0x923F64B9; // } }; inline CL_NS2(search,spans)::SpanQuery * SpanQueryFilter::getQuery() { return query; } CL_NS_END #endif // _lucene_search_SpanQueryFilter_ clucene-core-2.3.3.4/src/core/CLucene/search/TermQuery.cpp000066400000000000000000000162451154025176300232040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "TermQuery.h" #include "SearchHeader.h" #include "Scorer.h" #include "CLucene/index/Term.h" #include "Explanation.h" #include "Similarity.h" #include "Searchable.h" #include "_TermScorer.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/index/Terms.h" #include CL_NS_USE(index) CL_NS_DEF(search) class TermWeight: public Weight { private: Similarity* similarity; // ISH: was Searcher*, for no apparent reason float_t value; float_t idf; float_t queryNorm; float_t queryWeight; TermQuery* parentQuery; // CLucene specific CL_NS(index)::Term* _term; public: TermWeight(Searcher* searcher, TermQuery* parentQuery, CL_NS(index)::Term* _term); virtual ~TermWeight(); // return a *new* string describing this object TCHAR* toString(); Query* getQuery() { return (Query*)parentQuery; } float_t getValue() { return value; } float_t sumOfSquaredWeights(); void normalize(float_t queryNorm); Scorer* scorer(CL_NS(index)::IndexReader* reader); Explanation* explain(CL_NS(index)::IndexReader* reader, int32_t doc); }; /** Constructs a query for the term t. */ TermQuery::TermQuery(Term* t): term( _CL_POINTER(t) ) { } TermQuery::TermQuery(const TermQuery& clone): Query(clone){ this->term=_CL_POINTER(clone.term); } TermQuery::~TermQuery(){ _CLLDECDELETE(term); } Query* TermQuery::clone() const{ return _CLNEW TermQuery(*this); } const char* TermQuery::getClassName(){ return "TermQuery"; } const char* TermQuery::getObjectName() const{ return getClassName(); } size_t TermQuery::hashCode() const { return Similarity::floatToByte(getBoost()) ^ term->hashCode(); } //added by search highlighter Term* TermQuery::getTerm(bool pointer) const { if ( pointer ) return _CL_POINTER(term); else return term; } TCHAR* TermQuery::toString(const TCHAR* field) const{ CL_NS(util)::StringBuffer buffer; if ( field==NULL || _tcscmp(term->field(),field)!= 0 ) { buffer.append(term->field()); buffer.append(_T(":")); } buffer.append(term->text()); if (getBoost() != 1.0f) { buffer.append(_T("^")); buffer.appendFloat( getBoost(),1 ); } return buffer.toString(); } bool TermQuery::equals(Query* other) const { if (!(other->instanceOf(TermQuery::getClassName()))) return false; TermQuery* tq = (TermQuery*)other; return (this->getBoost() == tq->getBoost()) && this->term->equals(tq->term); } TermWeight::TermWeight(Searcher* _searcher, TermQuery* _parentQuery, Term* term):similarity(_searcher->getSimilarity()), value(0), queryNorm(0),queryWeight(0), parentQuery(_parentQuery),_term(term) { idf = similarity->idf(term, _searcher); // compute idf } TermWeight::~TermWeight(){ } // TCHAR* TermWeight::toString() { int32_t size=strlen(parentQuery->getObjectName()) + 10; TCHAR* tmp = _CL_NEWARRAY(TCHAR, size); _sntprintf(tmp,size,_T("weight(%S)"),parentQuery->getObjectName()); return tmp; } float_t TermWeight::sumOfSquaredWeights() { // legacy // idf = parentQuery->getSimilarity(searcher)->idf(_term, searcher); // compute idf queryWeight = idf * parentQuery->getBoost(); // compute query weight return queryWeight * queryWeight; // square it } void TermWeight::normalize(float_t _queryNorm) { this->queryNorm = _queryNorm; queryWeight *= queryNorm; // normalize query weight value = queryWeight * idf; // idf for document } Scorer* TermWeight::scorer(IndexReader* reader) { TermDocs* termDocs = reader->termDocs(_term); if (termDocs == NULL) return NULL; return _CLNEW TermScorer(this, termDocs, similarity, reader->norms(_term->field())); } Explanation* TermWeight::explain(IndexReader* reader, int32_t doc){ ComplexExplanation* result = _CLNEW ComplexExplanation(); TCHAR buf[LUCENE_SEARCH_EXPLANATION_DESC_LEN]; TCHAR* tmp; tmp = getQuery()->toString(); _sntprintf(buf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("weight(%s in %d), product of:"),tmp,doc); _CLDELETE_LCARRAY(tmp); result->setDescription(buf); _sntprintf(buf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("idf(docFreq=%d, numDocs=%d)"), reader->docFreq(_term), reader->numDocs() ); Explanation* idfExpl = _CLNEW Explanation(idf, buf); // explain query weight Explanation* queryExpl = _CLNEW Explanation(); tmp = getQuery()->toString(); _sntprintf(buf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("queryWeight(%s), product of:"), tmp); _CLDELETE_LCARRAY(tmp); queryExpl->setDescription(buf); Explanation* boostExpl = _CLNEW Explanation(parentQuery->getBoost(), _T("boost")); if (parentQuery->getBoost() != 1.0f) queryExpl->addDetail(boostExpl); else _CLDELETE(boostExpl); queryExpl->addDetail(idfExpl->clone()); Explanation* queryNormExpl = _CLNEW Explanation(queryNorm,_T("queryNorm")); queryExpl->addDetail(queryNormExpl); queryExpl->setValue(parentQuery->getBoost()* // always 1.0 | TODO: original Java code is boostExpl.getValue() idfExpl->getValue() * queryNormExpl->getValue()); result->addDetail(queryExpl); // explain field weight const TCHAR* field = _term->field(); ComplexExplanation* fieldExpl = _CLNEW ComplexExplanation(); tmp = _term->toString(); _sntprintf(buf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("fieldWeight(%s in %d), product of:"),tmp,doc); _CLDELETE_LCARRAY(tmp); fieldExpl->setDescription(buf); Scorer* sc = scorer(reader); Explanation* tfExpl = sc->explain(doc); _CLLDELETE(sc); fieldExpl->addDetail(tfExpl); fieldExpl->addDetail(idfExpl); Explanation* fieldNormExpl = _CLNEW Explanation(); uint8_t* fieldNorms = reader->norms(field); float_t fieldNorm = fieldNorms!=NULL ? Similarity::decodeNorm(fieldNorms[doc]) : 0.0f; fieldNormExpl->setValue(fieldNorm); _sntprintf(buf,LUCENE_SEARCH_EXPLANATION_DESC_LEN, _T("fieldNorm(field=%s, doc=%d)"),field,doc); fieldNormExpl->setDescription(buf); fieldExpl->addDetail(fieldNormExpl); fieldExpl->setMatch(tfExpl->isMatch()); fieldExpl->setValue(tfExpl->getValue() * idfExpl->getValue() * fieldNormExpl->getValue()); if (queryExpl->getValue() == 1.0f){ _CLLDELETE(result); return fieldExpl; } // combine them result->setValue(queryExpl->getValue() * fieldExpl->getValue()); result->addDetail(fieldExpl); result->setMatch(fieldExpl->getMatch()); return result; } Weight* TermQuery::_createWeight(Searcher* _searcher) { return _CLNEW TermWeight(_searcher,this,term); } void TermQuery::extractTerms( TermSet * termset ) const { if( term && termset->end() == termset->find( term )) termset->insert( _CL_POINTER( term )); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/TermQuery.h000066400000000000000000000031401154025176300226370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_TermQuery_ #define _lucene_search_TermQuery_ CL_CLASS_DEF(index,Term) CL_CLASS_DEF(util,StringBuffer) #include "Query.h" CL_NS_DEF(search) /** A Query that matches documents containing a term. This may be combined with other terms with a {@link BooleanQuery}. */ class CLUCENE_EXPORT TermQuery: public Query { private: CL_NS(index)::Term* term; protected: Weight* _createWeight(Searcher* searcher); TermQuery(const TermQuery& clone); public: // Constructs a query for the term t. TermQuery(CL_NS(index)::Term* t); virtual ~TermQuery(); static const char* getClassName(); const char* getObjectName() const; /** Returns the term of this query. */ CL_NS(index)::Term* getTerm(bool pointer=true) const; /** Prints a user-readable version of this query. */ TCHAR* toString(const TCHAR* field) const; /** Returns true if o is equal to this. */ bool equals(Query* other) const; Query* clone() const; /** Returns a hash code value for this object.*/ size_t hashCode() const; /** Expert: adds all terms occurring in this query to the termset set. */ void extractTerms( TermSet * termset ) const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/TermScorer.cpp000066400000000000000000000072511154025176300233310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_TermScorer.h" #include "SearchHeader.h" #include "Explanation.h" #include "CLucene/index/Term.h" #include "CLucene/index/Terms.h" #include "TermQuery.h" #include "Similarity.h" #include "Explanation.h" CL_NS_USE(index) CL_NS_DEF(search) TermScorer::TermScorer(Weight* w, CL_NS(index)::TermDocs* td, Similarity* similarity,uint8_t* _norms): Scorer(similarity), termDocs(td), norms(_norms), weight(w), weightValue(w->getValue()), _doc(0), pointer(0), pointerMax(0) { memset(docs,0,32*sizeof(int32_t)); memset(freqs,0,32*sizeof(int32_t)); for (int32_t i = 0; i < LUCENE_SCORE_CACHE_SIZE; i++) scoreCache[i] = getSimilarity()->tf(i) * weightValue; } TermScorer::~TermScorer(){ _CLLDELETE(termDocs); } bool TermScorer::next(){ pointer++; if (pointer >= pointerMax) { pointerMax = termDocs->read(docs, freqs, 32); // refill buffer if (pointerMax != 0) { pointer = 0; } else { termDocs->close(); // close stream _doc = LUCENE_INT32_MAX_SHOULDBE; // set to sentinel value return false; } } _doc = docs[pointer]; return true; } bool TermScorer::skipTo(int32_t target) { // first scan in cache for (pointer++; pointer < pointerMax; pointer++) { if (docs[pointer] >= target) { _doc = docs[pointer]; return true; } } // not found in cache, seek underlying stream bool result = termDocs->skipTo(target); if (result) { pointerMax = 1; pointer = 0; docs[pointer] = _doc = termDocs->doc(); freqs[pointer] = termDocs->freq(); } else { _doc = LUCENE_INT32_MAX_SHOULDBE; } return result; } Explanation* TermScorer::explain(int32_t doc) { TermQuery* query = (TermQuery*)weight->getQuery(); Explanation* tfExplanation = _CLNEW Explanation(); int32_t tf = 0; while (pointer < pointerMax) { if (docs[pointer] == doc) tf = freqs[pointer]; pointer++; } if (tf == 0) { if (termDocs->skipTo(doc)) { if (termDocs->doc() == doc) { tf = termDocs->freq(); } } } termDocs->close(); tfExplanation->setValue(getSimilarity()->tf(tf)); TCHAR buf[LUCENE_SEARCH_EXPLANATION_DESC_LEN+1]; TCHAR* termToString = query->getTerm(false)->toString(); _sntprintf(buf,LUCENE_SEARCH_EXPLANATION_DESC_LEN,_T("tf(termFreq(%s)=%d)"), termToString, tf); _CLDELETE_LCARRAY(termToString); tfExplanation->setDescription(buf); return tfExplanation; } TCHAR* TermScorer::toString() { TCHAR* wb = weight->toString(); int32_t rl = _tcslen(wb) + 9; //9=_tcslen("scorer(" ")") + 1 TCHAR* ret = _CL_NEWARRAY(TCHAR,rl); _sntprintf(ret,rl,_T("scorer(%s)"), wb); _CLDELETE_LCARRAY(wb); return ret; } float_t TermScorer::score(){ int32_t f = freqs[pointer]; float_t raw = // compute tf(f)*weight f < LUCENE_SCORE_CACHE_SIZE // check cache ? scoreCache[f] // cache hit : getSimilarity()->tf(f) * weightValue; // cache miss return raw * Similarity::decodeNorm(norms[_doc]); // normalize for field } int32_t TermScorer::doc() const { return _doc; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/WildcardQuery.cpp000066400000000000000000000071771154025176300240320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "WildcardQuery.h" #include "TermQuery.h" #include "WildcardTermEnum.h" #include "Similarity.h" #include "CLucene/index/Term.h" #include "CLucene/util/BitSet.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/index/IndexReader.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_DEF(search) WildcardQuery::WildcardQuery(Term* term): MultiTermQuery( term ){ //Func - Constructor //Pre - term != NULL //Post - Instance has been created termContainsWildcard = (_tcschr(term->text(), _T('*')) != NULL || _tcschr(term->text(), _T('?')) != NULL); } WildcardQuery::~WildcardQuery(){ //Func - Destructor //Pre - true //Post - true } const char* WildcardQuery::getObjectName() const{ //Func - Returns the string "WildcardQuery" //Pre - true //Post - The string "WildcardQuery" has been returned return getClassName(); } const char* WildcardQuery::getClassName(){ return "WildcardQuery"; } FilteredTermEnum* WildcardQuery::getEnum(IndexReader* reader) { return _CLNEW WildcardTermEnum(reader, getTerm(false)); } WildcardQuery::WildcardQuery(const WildcardQuery& clone): MultiTermQuery(clone) { } Query* WildcardQuery::clone() const{ return _CLNEW WildcardQuery(*this); } size_t WildcardQuery::hashCode() const{ //todo: we should give the query a seeding value... but //need to do it for all hascode functions return Similarity::floatToByte(getBoost()) ^ getTerm()->hashCode(); } bool WildcardQuery::equals(Query* other) const{ if (!(other->instanceOf(WildcardQuery::getClassName()))) return false; WildcardQuery* tq = (WildcardQuery*)other; return (this->getBoost() == tq->getBoost()) && getTerm()->equals(tq->getTerm()); } Query* WildcardQuery::rewrite(CL_NS(index)::IndexReader* reader) { if (termContainsWildcard) return MultiTermQuery::rewrite(reader); return _CLNEW TermQuery( getTerm(false) ); } WildcardFilter::WildcardFilter( Term* term ) { this->term = _CL_POINTER(term); } WildcardFilter::~WildcardFilter() { _CLDECDELETE(term); } WildcardFilter::WildcardFilter( const WildcardFilter& copy ) : term( _CL_POINTER(copy.term) ) { } Filter* WildcardFilter::clone() const { return _CLNEW WildcardFilter(*this ); } TCHAR* WildcardFilter::toString() { //Instantiate a stringbuffer buffer to store the readable version temporarily CL_NS(util)::StringBuffer buffer; //check if field equal to the field of prefix if( term->field() != NULL ) { //Append the field of prefix to the buffer buffer.append(term->field()); //Append a colon buffer.append(_T(":") ); } //Append the text of the prefix buffer.append(term->text()); //Convert StringBuffer buffer to TCHAR block and return it return buffer.toString(); } /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ BitSet* WildcardFilter::bits( IndexReader* reader ) { BitSet* bts = _CLNEW BitSet( reader->maxDoc() ); WildcardTermEnum termEnum (reader, term); if (termEnum.term(false) == NULL) return bts; TermDocs* termDocs = reader->termDocs(); try{ do{ termDocs->seek(&termEnum); while (termDocs->next()) { bts->set(termDocs->doc()); } }while(termEnum.next()); } _CLFINALLY( termDocs->close(); _CLDELETE(termDocs); termEnum.close(); ) return bts; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/WildcardQuery.h000066400000000000000000000040651154025176300234700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_WildcardQuery_ #define _lucene_search_WildcardQuery_ //#include "CLucene/index/IndexReader.h" CL_CLASS_DEF(index,Term) #include "MultiTermQuery.h" #include "Filter.h" //#include "WildcardTermEnum.h" CL_NS_DEF(search) /** Implements the wildcard search query. Supported wildcards are *, which * matches any character sequence (including the empty one), and ?, * which matches any single character. Note this query can be slow, as it * needs to iterate over all terms. In order to prevent extremely slow WildcardQueries, * a Wildcard term must not start with one of the wildcards * or * ?. * * @see WildcardTermEnum */ class CLUCENE_EXPORT WildcardQuery: public MultiTermQuery { protected: FilteredTermEnum* getEnum(CL_NS(index)::IndexReader* reader); WildcardQuery(const WildcardQuery& clone); public: WildcardQuery(CL_NS(index)::Term* term); ~WildcardQuery(); const char* getObjectName() const; static const char* getClassName(); size_t hashCode() const; bool equals(Query* other) const; Query* clone() const; Query* rewrite(CL_NS(index)::IndexReader* reader); private: bool termContainsWildcard; }; class CLUCENE_EXPORT WildcardFilter: public Filter { private: CL_NS(index)::Term* term; protected: WildcardFilter( const WildcardFilter& copy ); public: WildcardFilter(CL_NS(index)::Term* term); ~WildcardFilter(); /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader ); Filter* clone() const; TCHAR* toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/WildcardTermEnum.cpp000066400000000000000000000123631154025176300244520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "WildcardTermEnum.h" #include "CLucene/index/Term.h" #include "CLucene/index/IndexReader.h" CL_NS_USE(index) CL_NS_DEF(search) bool WildcardTermEnum::termCompare(Term* term) { if ( term!=NULL && __term->field() == term->field() ) { const TCHAR* searchText = term->text(); const TCHAR* patternText = __term->text(); if ( _tcsncmp( searchText, pre, preLen ) == 0 ){ return wildcardEquals(patternText+preLen, __term->textLength()-preLen, 0, searchText, term->textLength(), preLen); } } _endEnum = true; return false; } /** Creates new WildcardTermEnum */ WildcardTermEnum::WildcardTermEnum(IndexReader* reader, Term* term): FilteredTermEnum(), __term(_CL_POINTER(term)), fieldMatch(false), _endEnum(false) { pre = stringDuplicate(term->text()); const TCHAR* sidx = _tcschr( pre, LUCENE_WILDCARDTERMENUM_WILDCARD_STRING ); const TCHAR* cidx = _tcschr( pre, LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR ); const TCHAR* tidx = sidx; if (tidx == NULL) tidx = cidx; else if ( cidx && cidx > pre) tidx = cl_min(sidx, cidx); CND_PRECONDITION(tidx != NULL, "tidx==NULL"); int32_t idx = (int32_t)(tidx - pre); preLen = idx; CND_PRECONDITION(preLentextLength(), "preLen >= term->textLength()"); pre[preLen]=0; //trim end Term* t = _CLNEW Term(__term, pre); setEnum( reader->terms(t) ); _CLDECDELETE(t); } void WildcardTermEnum::close() { if ( __term != NULL ){ FilteredTermEnum::close(); _CLDECDELETE(__term); __term = NULL; _CLDELETE_CARRAY( pre ); } } WildcardTermEnum::~WildcardTermEnum() { close(); } float_t WildcardTermEnum::difference() { return 1.0f; } bool WildcardTermEnum::endEnum() { return _endEnum; } const char* WildcardTermEnum::getObjectName() const{ return getClassName(); } const char* WildcardTermEnum::getClassName(){ return "WildcardTermEnum"; } bool WildcardTermEnum::wildcardEquals(const TCHAR* pattern, int32_t patternLen, int32_t patternIdx, const TCHAR* str, int32_t strLen, int32_t stringIdx) { for (int32_t p = patternIdx; ; ++p) { for (int32_t s = stringIdx; ; ++p, ++s) { // End of str yet? bool sEnd = (s >= strLen); // End of pattern yet? bool pEnd = (p >= patternLen); // If we're looking at the end of the str... if (sEnd) { // Assume the only thing left on the pattern is/are wildcards bool justWildcardsLeft = true; // Current wildcard position int32_t wildcardSearchPos = p; // While we haven't found the end of the pattern, // and haven't encountered any non-wildcard characters while (wildcardSearchPos < patternLen && justWildcardsLeft) { // Check the character at the current position TCHAR wildchar = pattern[wildcardSearchPos]; // If it's not a wildcard character, then there is more // pattern information after this/these wildcards. if (wildchar != LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR && wildchar != LUCENE_WILDCARDTERMENUM_WILDCARD_STRING){ justWildcardsLeft = false; }else{ // to prevent "cat" matches "ca??" if (wildchar == LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR) return false; wildcardSearchPos++; // Look at the next character } } // This was a prefix wildcard search, and we've matched, so // return true. if (justWildcardsLeft) return true; } // If we've gone past the end of the str, or the pattern, // return false. if (sEnd || pEnd) break; // Match a single character, so continue. if (pattern[p] == LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR) continue; if (pattern[p] == LUCENE_WILDCARDTERMENUM_WILDCARD_STRING) { // Look at the character beyond the '*'. ++p; // Examine the str, starting at the last character. for (int32_t i = strLen; i >= s; --i) { if (wildcardEquals(pattern, patternLen, p, str, strLen, i)) return true; } break; } if (pattern[p] != str[s]) break; } return false; } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/search/WildcardTermEnum.h000066400000000000000000000042501154025176300241130ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_WildcardTermEnum_ #define _lucene_search_WildcardTermEnum_ //#include "CLucene/index/IndexReader.h" CL_CLASS_DEF(index,Term) CL_CLASS_DEF(index,IndexReader) //#include "CLucene/index/Terms.h" #include "FilteredTermEnum.h" CL_NS_DEF(search) /** * Subclass of FilteredTermEnum for enumerating all terms that match the * specified wildcard filter term-> *

* Term enumerations are always ordered by term->compareTo(). Each term in * the enumeration is greater than all that precede it. */ class CLUCENE_EXPORT WildcardTermEnum: public FilteredTermEnum { private: CL_NS(index)::Term* __term; TCHAR* pre; int32_t preLen; bool fieldMatch; bool _endEnum; /******************************************** * const TCHAR* equality with support for wildcards ********************************************/ protected: bool termCompare(CL_NS(index)::Term* term) ; public: /** * Creates a new WildcardTermEnum. Passing in a * {@link Term Term} that does not contain a * LUCENE_WILDCARDTERMENUM_WILDCARD_STRING or * LUCENE_WILDCARDTERMENUM_WILDCARD_CHAR will cause an exception to be thrown. */ WildcardTermEnum(CL_NS(index)::IndexReader* reader, CL_NS(index)::Term* term); ~WildcardTermEnum(); float_t difference() ; bool endEnum() ; /** * Determines if a word matches a wildcard pattern. */ static bool wildcardEquals(const TCHAR* pattern, int32_t patternLen, int32_t patternIdx, const TCHAR* str, int32_t strLen, int32_t stringIdx); void close(); const char* getObjectName() const; static const char* getClassName(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_BooleanScorer.h000066400000000000000000000046561154025176300236130ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_BooleanScorer_ #define _lucene_search_BooleanScorer_ #include "Scorer.h" CL_NS_DEF(search) class BooleanScorer: public Scorer { private: class Bucket { public: int32_t doc; // tells if bucket is valid float_t score; // incremental score int32_t bits; // used for bool constraints int32_t coord; // count of terms in score Bucket* next; // next valid bucket Bucket(); virtual ~Bucket(); }; class SubScorer { public: bool done; Scorer* scorer; bool required; bool prohibited; HitCollector* collector; SubScorer* next; SubScorer(Scorer* scr, const bool r, const bool p, HitCollector* c, SubScorer* nxt); virtual ~SubScorer(); }; class BucketTable { private: BooleanScorer* scorer; public: Bucket* buckets; Bucket* first; // head of valid list BucketTable(BooleanScorer* scr); int32_t size() const; HitCollector* newCollector(const int32_t mask); void clear(); virtual ~BucketTable(); }; class Collector: public HitCollector { private: BucketTable* bucketTable; int32_t mask; public: Collector(const int32_t mask, BucketTable* bucketTable); void collect(const int32_t doc, const float_t score); }; SubScorer* scorers; BucketTable* bucketTable; int32_t maxCoord; int32_t nextMask; int32_t end; Bucket* current; int32_t minNrShouldMatch; public: LUCENE_STATIC_CONSTANT(int32_t,BucketTable_SIZE=1024); int32_t requiredMask; int32_t prohibitedMask; float_t* coordFactors; BooleanScorer( Similarity* similarity, int32_t minNrShouldMatch = 1 ); virtual ~BooleanScorer(); void add(Scorer* scorer, const bool required, const bool prohibited); int32_t doc() const { return current->doc; } bool next(); float_t score(); void score( HitCollector* hc ); bool skipTo(int32_t target); Explanation* explain(int32_t doc); virtual TCHAR* toString(); void computeCoordFactors(); protected: bool score( HitCollector* hc, const int32_t max ); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_BooleanScorer2.h000066400000000000000000000024771154025176300236740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_BooleanScorer2_ #define _lucene_search_BooleanScorer2_ #include "Scorer.h" CL_NS_DEF(search) class CLUCENE_EXPORT BooleanScorer2: public Scorer { private: class Internal; friend class Internal; Internal* _internal; class Coordinator; class SingleMatchScorer; class NonMatchingScorer; class ReqOptSumScorer; class ReqExclScorer; class BSConjunctionScorer; class BSDisjunctionSumScorer; protected: bool score( HitCollector* hc, const int32_t max ); public: BooleanScorer2( Similarity* similarity, int32_t minNrShouldMatch = 0, bool allowDocsOutOfOrder = false ); virtual ~BooleanScorer2(); void add( Scorer* scorer, bool required, bool prohibited ); void score( HitCollector* hc ); int32_t doc() const; bool next(); float_t score(); bool skipTo( int32_t target ); Explanation* explain( int32_t doc ); virtual TCHAR* toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_ConjunctionScorer.h000066400000000000000000000024521154025176300245150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_ConjunctionScorer_ #define _lucene_search_ConjunctionScorer_ #include "Scorer.h" #include "CLucene/util/Array.h" CL_NS_DEF(search) /** Scorer for conjunctions, sets of queries, all of which are required. */ class ConjunctionScorer: public Scorer { private: CL_NS(util)::ArrayBase* scorers; typedef CL_NS(util)::CLVector > ScorersType; bool firstTime; bool more; float_t coord; int32_t lastDoc; Scorer* last(); bool doNext(); bool init(int32_t target); public: ConjunctionScorer(Similarity* similarity, ScorersType* scorers); ConjunctionScorer(Similarity* similarity, const CL_NS(util)::ArrayBase* scorers); virtual ~ConjunctionScorer(); virtual TCHAR* toString(); int32_t doc() const; bool next(); bool skipTo(int32_t target); virtual float_t score(); virtual Explanation* explain(int32_t doc); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_DisjunctionSumScorer.h000066400000000000000000000130611154025176300252000ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_DisjunctionSumScorer_ #define _lucene_search_DisjunctionSumScorer_ CL_NS_USE(util) CL_NS_DEF(search) /** A Scorer for OR like queries, counterpart of ConjunctionScorer. * This Scorer implements {@link Scorer#skipTo(int)} and uses skipTo() on the given Scorers. * @java-todo Implement score(HitCollector, int). */ class DisjunctionSumScorer : public Scorer { public: typedef CL_NS(util)::CLVector > ScorersType; private: /** The minimum number of scorers that should match. */ int32_t minimumNrMatchers; /** The scorerDocQueue contains all subscorers ordered by their current doc(), * with the minimum at the top. *
The scorerDocQueue is initialized the first time next() or skipTo() is called. *
An exhausted scorer is immediately removed from the scorerDocQueue. *
If less than the minimumNrMatchers scorers * remain in the scorerDocQueue next() and skipTo() return false. *

* After each to call to next() or skipTo() * currentSumScore is the total score of the current matching doc, * nrMatchers is the number of matching scorers, * and all scorers are after the matching doc, or are exhausted. */ ScorerDocQueue* scorerDocQueue; int32_t queueSize; // used to avoid size() method calls on scorerDocQueue /** The document number of the current match. */ int32_t currentDoc; float_t currentScore; /** Called the first time next() or skipTo() is called to * initialize scorerDocQueue. */ void initScorerDocQueue(); protected: /** The number of subscorers. */ int32_t nrScorers; /** The subscorers. */ DisjunctionSumScorer::ScorersType subScorers; /** The number of subscorers that provide the current match. */ int32_t _nrMatchers; /** Expert: Collects matching documents in a range. Hook for optimization. * Note that {@link #next()} must be called once before this method is called * for the first time. * @param hc The collector to which all matching documents are passed through * {@link HitCollector#collect(int, float)}. * @param max Do not score documents past this. * @return true if more matching documents may remain. */ bool score( HitCollector* hc, const int32_t max ); /** Advance all subscorers after the current document determined by the * top of the scorerDocQueue. * Repeat until at least the minimum number of subscorers match on the same * document and all subscorers are after that document or are exhausted. *
On entry the scorerDocQueue has at least minimumNrMatchers * available. At least the scorer with the minimum document number will be advanced. * @return true iff there is a match. *
In case there is a match, currentDoc, currentSumScore, * and nrMatchers describe the match. * * @todo Investigate whether it is possible to use skipTo() when * the minimum number of matchers is bigger than one, ie. try and use the * character of ConjunctionScorer for the minimum number of matchers. * Also delay calling score() on the sub scorers until the minimum number of * matchers is reached. *
For this, a Scorer array with minimumNrMatchers elements might * hold Scorers at currentDoc that are temporarily popped from scorerQueue. */ bool advanceAfterCurrent(); public: /** Construct a DisjunctionScorer, using one as the minimum number * of matching subscorers. * @param subScorers A collection of at least two subscorers. * @param minimumNrMatchers The positive minimum number of subscorers that should * match to match this query. *
When minimumNrMatchers is bigger than * the number of subScorers, * no matches will be produced. *
When minimumNrMatchers equals the number of subScorers, * it more efficient to use ConjunctionScorer. */ DisjunctionSumScorer( DisjunctionSumScorer::ScorersType* _subScorers, const int32_t _minimumNrMatchers = 1); virtual ~DisjunctionSumScorer(); /** Scores and collects all matching documents. * @param hc The collector to which all matching documents are passed through * {@link HitCollector#collect(int, float)}. *
When this method is used the {@link #explain(int)} method should not be used. */ void score( HitCollector* hc ); bool next(); /** Returns the score of the current document matching the query. * Initially invalid, until {@link #next()} is called the first time. */ virtual float_t score(); int32_t doc() const; /** Returns the number of subscorers matching the current document. * Initially invalid, until {@link #next()} is called the first time. */ int32_t nrMatchers() const; /** Skips to the first match beyond the current whose document number is * greater than or equal to a given target. *
When this method is used the {@link #explain(int)} method should not be used. *
The implementation uses the skipTo() method on the subscorers. * @param target The target document number. * @return true iff there is such a match. */ bool skipTo( int32_t target ); virtual TCHAR* toString(); /** @return An explanation for the score of a given document. */ Explanation* explain( int32_t doc ); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_ExactPhraseScorer.h000066400000000000000000000016051154025176300244320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_ExactPhraseScorer_ #define _lucene_search_ExactPhraseScorer_ #include "_PhraseScorer.h" CL_NS_DEF(search) class ExactPhraseScorer: public PhraseScorer { public: ExactPhraseScorer(Weight* weight, CL_NS(index)::TermPositions** tps, int32_t* offsets, Similarity* similarity, uint8_t* norms ); virtual ~ExactPhraseScorer(); virtual TCHAR* toString(); protected: //Returns the exact freqency of the phrase float_t phraseFreq(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_FieldCacheImpl.h000066400000000000000000000075271154025176300236470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FieldCacheImpl_ #define _lucene_search_FieldCacheImpl_ CL_CLASS_DEF(index,IndexReader) CL_CLASS_DEF(search,SortComparator) CL_CLASS_DEF(search,SortComparatorSource) #include "FieldCache.h" #include "CLucene/LuceneThreads.h" CL_NS_DEF(search) class fieldcacheCacheType; /** * Expert: The default cache implementation, storing all values in memory. * */ class FieldCacheImpl: public FieldCache { public: DEFINE_MUTEX(THIS_LOCK) /** Expert: Every key in the internal cache is of this type. */ class FileEntry:LUCENE_BASE { const TCHAR* field; // which Field int32_t type; // which SortField type SortComparatorSource* custom; // which custom comparator size_t _hashCode; public: /** Creates one of these objects. */ FileEntry (const TCHAR* field, int32_t type); /** Creates one of these objects for a custom comparator. */ FileEntry (const TCHAR* field, SortComparatorSource* custom); ~FileEntry(); int32_t getType() const{ return type; } /** Two of these are equal iff they reference the same field and type. */ bool equals (FileEntry* other) const; /** Composes a hashcode based on the field and type. */ size_t hashCode(); int32_t compareTo(const FileEntry* other) const; class Compare:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: bool operator()( FileEntry* f1, FileEntry* f2 ) const{ return ( f1->compareTo(f2) < 0 ); } size_t operator()( FileEntry* t ) const{ return t->hashCode(); } }; class Equals:LUCENE_BASE, public CL_NS(util)::Compare::_base // { public: bool operator()( FileEntry* f1, FileEntry* f2 ) const{ return ( f1->compareTo(f2) == 0 ); } }; }; FieldCacheImpl(); virtual ~FieldCacheImpl(); private: /** The internal cache. Maps FileEntry to array of interpreted term values. **/ //todo: make indexreader remove itself from here when the reader is shut fieldcacheCacheType* cache; /** See if an object is in the cache. */ FieldCacheAuto* lookup (CL_NS(index)::IndexReader* reader, const TCHAR* field, int32_t type) ; /** See if a custom object is in the cache. */ FieldCacheAuto* lookup (CL_NS(index)::IndexReader* reader, const TCHAR* field, SortComparatorSource* comparer); /** Put an object into the cache. */ void store (CL_NS(index)::IndexReader* reader, const TCHAR* field, int32_t type, FieldCacheAuto* value); /** Put a custom object into the cache. */ void store (CL_NS(index)::IndexReader* reader, const TCHAR* field, SortComparatorSource* comparer, FieldCacheAuto* value); public: // inherit javadocs FieldCacheAuto* getInts (CL_NS(index)::IndexReader* reader, const TCHAR* field); // inherit javadocs FieldCacheAuto* getFloats (CL_NS(index)::IndexReader* reader, const TCHAR* field); // inherit javadocs FieldCacheAuto* getStrings (CL_NS(index)::IndexReader* reader, const TCHAR* field); // inherit javadocs FieldCacheAuto* getStringIndex (CL_NS(index)::IndexReader* reader, const TCHAR* field); // inherit javadocs FieldCacheAuto* getAuto (CL_NS(index)::IndexReader* reader, const TCHAR* field); // inherit javadocs FieldCacheAuto* getCustom (CL_NS(index)::IndexReader* reader, const TCHAR* field, SortComparator* comparator); /** * Callback for when IndexReader closes. This causes * any cache to be removed for the specified reader. */ static void closeCallback(CL_NS(index)::IndexReader* reader, void* fieldCacheImpl); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_FieldDocSortedHitQueue.h000066400000000000000000000071621154025176300253550ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FieldDocSortedHitQueue_ #define _lucene_search_FieldDocSortedHitQueue_ #include "Sort.h" #include "FieldDoc.h" #include "CLucene/util/PriorityQueue.h" CL_NS_DEF(search) /** * Expert: Collects sorted results from Searchable's and collates them. * The elements put into this queue must be of type FieldDoc. */ class FieldDocSortedHitQueue: public CL_NS(util)::PriorityQueue > { private: DEFINE_MUTEX(THIS_LOCK) // this cannot contain AUTO fields - any AUTO fields should // have been resolved by the time this class is used. SortField** fields; int32_t fieldsLen; void _countsize(){ fieldsLen=0; while(fields[fieldsLen]!=NULL) fieldsLen++; } // used in the case where the fields are sorted by locale // based strings //todo: not implemented in clucene because locales has not been implemented //Collator[] collators; //volatile public: /** * Creates a hit queue sorted by the given list of fields. * @param fields Field names, in priority order (highest priority first). * @param size The number of hits to retain. Must be greater than zero. */ FieldDocSortedHitQueue (SortField** fields, int32_t size); ~FieldDocSortedHitQueue(); /** * Allows redefinition of sort fields if they are NULL. * This is to handle the case using ParallelMultiSearcher where the * original list contains AUTO and we don't know the actual sort * type until the values come back. The fields can only be set once. * This method is thread safe. * @param fields */ void setFields (SortField** fields); /** Returns the fields being used to sort. */ SortField** getFields() { return fields; } /** Returns an array of collators, possibly NULL. The collators * correspond to any SortFields which were given a specific locale. * @param fields Array of sort fields. * @return Array, possibly NULL. private Collator[] hasCollators (SortField[] fields) { if (fields == NULL) return NULL; Collator[] ret = new Collator[fields.length]; for (int32_t i=0; ia is less relevant than b. * @param a FieldDoc * @param b FieldDoc * @return true if document a should be sorted after document b. */ bool lessThan (FieldDoc* docA, FieldDoc* docB); }; /** * Expert: Returned by low-level sorted search implementations. * * @see Searchable#search(Query,Filter,int32_t,Sort) */ class TopFieldDocs: public TopDocs { public: /// The fields which were used to sort results by. SortField** fields; FieldDoc** fieldDocs; /** Creates one of these objects. * @param totalHits Total number of hits for the query. * @param fieldDocs The top hits for the query. * @param scoreDocs The top hits for the query. * @param scoreDocsLen Length of fieldDocs and scoreDocs * @param fields The sort criteria used to find the top hits. */ TopFieldDocs (int32_t totalHits, FieldDoc** fieldDocs, int32_t scoreDocsLen, SortField** fields); ~TopFieldDocs(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_HitQueue.h000066400000000000000000000025031154025176300225740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_HitQueue_ #define _lucene_search_HitQueue_ CL_NS_DEF(search) struct ScoreDoc; /** * An optimised PriorityQueue which takes ScoreDoc structs. Some by-ref passing * and memory related optimisations have been done. */ class HitQueue: LUCENE_BASE { private: ScoreDoc* heap; size_t _size; size_t maxSize; void upHeap(); void downHeap(); protected: bool lessThan(struct ScoreDoc& hitA, struct ScoreDoc& hitB); public: void adjustTop(); struct ScoreDoc& top(); void put(struct ScoreDoc& element); ScoreDoc pop(); /** * Adds element to the PriorityQueue in log(size) time if either * the PriorityQueue is not full, or not lessThan(element, top()). * @param element * @return true if element is added, false otherwise. */ bool insert(struct ScoreDoc& element); /** * Returns the number of elements currently stored in the PriorityQueue. */ size_t size(); HitQueue(const int32_t maxSize); ~HitQueue(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_PhrasePositions.h000066400000000000000000000027451154025176300242050ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_PhrasePositions_ #define _lucene_search_PhrasePositions_ #include "CLucene/index/Terms.h" CL_NS_DEF(search) /** * Position of a term in a document that takes into account the term offset within the phrase. */ class PhrasePositions:LUCENE_BASE { public: int32_t doc; // current doc int32_t position; // position in doc int32_t count; // remaining pos in this doc int32_t offset; // position in phrase CL_NS(index)::TermPositions* tp; // stream of positions PhrasePositions* _next; // used to make lists bool repeats; // there's other pp for same term (e.g. query="1st word 2nd word"~1) PhrasePositions(CL_NS(index)::TermPositions* Tp, const int32_t o); ~PhrasePositions(); bool next(); bool skipTo(int32_t target); void firstPosition(); /** * Go to next location of this term current document, and set * position as location - offset, so that a * matching exact phrase is easily identified when all PhrasePositions * have exactly the same position. */ bool nextPosition(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_PhraseQueue.h000066400000000000000000000023151154025176300232730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_PhraseQueue_ #define _lucene_search_PhraseQueue_ #include "CLucene/util/PriorityQueue.h" #include "_PhrasePositions.h" CL_NS_DEF(search) class PhraseQueue: public CL_NS(util)::PriorityQueue > { public: PhraseQueue(const int32_t size) { initialize(size,false); } virtual ~PhraseQueue(){ } protected: bool lessThan(PhrasePositions* pp1, PhrasePositions* pp2) { if (pp1->doc == pp2->doc){ if (pp1->position == pp2->position) // same doc and pp.position, so decide by actual term positions. // rely on: pp.position == tp.position - offset. return pp1->offset < pp2->offset; else return pp1->position < pp2->position; }else return pp1->doc < pp2->doc; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_PhraseScorer.h000066400000000000000000000051301154025176300234420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_PhraseScorer_ #define _lucene_search_PhraseScorer_ #include "_PhraseQueue.h" #include "Scorer.h" CL_NS_DEF(search) class Explanation; /** Expert: Scoring functionality for phrase queries. *
A document is considered matching if it contains the phrase-query terms * at "valid" positons. What "valid positions" are * depends on the type of the phrase query: for an exact phrase query terms are required * to appear in adjacent locations, while for a sloppy phrase query some distance between * the terms is allowed. The abstract method {@link #phraseFreq()} of extending classes * is invoked for each document containing all the phrase query terms, in order to * compute the frequency of the phrase query in that document. A non zero frequency * means a match. */ class PhraseScorer: public Scorer { private: Weight* weight; protected: uint8_t* norms; float_t value; private: bool firstTime; bool more; protected: float_t freq; //phrase frequency in current doc as computed by phraseFreq(). PhraseQueue* pq; //is used to order the list point to by first and last PhrasePositions* first; //Points to the first in the list of PhrasePositions PhrasePositions* last; //Points to the last in the list of PhrasePositions public: //Constructor PhraseScorer(Weight* _weight, CL_NS(index)::TermPositions** tps, int32_t* offsets, Similarity* similarity, uint8_t* _norms); virtual ~PhraseScorer(); int32_t doc() const; bool next(); float_t score(); bool skipTo(int32_t target); Explanation* explain(int32_t doc); virtual TCHAR* toString(); protected: /** * For a document containing all the phrase query terms, compute the * frequency of the phrase in that document. * A non zero frequency means a match. *
Note, that containing all phrase terms does not guarantee a match - they have to be found in matching locations. * @return frequency of the phrase in current doc, 0 if not found. */ virtual float_t phraseFreq() =0; //Transfers the PhrasePositions from the PhraseQueue pq to //the PhrasePositions list with first as its first element void pqToList(); //Moves first to the end of the list void firstToLast(); private: bool doNext(); void init(); void sort(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_SloppyPhraseScorer.h000066400000000000000000000065521154025176300246620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_SloppyPhraseScorer_ #define _lucene_search_SloppyPhraseScorer_ #include "_PhraseScorer.h" CL_NS_DEF(search) class SloppyPhraseScorer: public PhraseScorer { private: int32_t slop; PhrasePositions** repeats; size_t repeatsLen; bool checkedRepeats; public: SloppyPhraseScorer(Weight* weight, CL_NS(index)::TermPositions** tps, int32_t* offsets, Similarity* similarity, int32_t _slop, uint8_t* norms); virtual ~SloppyPhraseScorer(); protected: /** * Score a candidate doc for all slop-valid position-combinations (matches) * encountered while traversing/hopping the PhrasePositions. *
The score contribution of a match depends on the distance: *
- highest score for distance=0 (exact match). *
- score gets lower as distance gets higher. *
Example: for query "a b"~2, a document "x a b a y" can be scored twice: * once for "a b" (distance=0), and once for "b a" (distance=2). *
Pssibly not all valid combinations are encountered, because for efficiency * we always propagate the least PhrasePosition. This allows to base on * PriorityQueue and move forward faster. * As result, for example, document "a b c b a" * would score differently for queries "a b c"~4 and "c b a"~4, although * they really are equivalent. * Similarly, for doc "a b c b a f g", query "c b"~2 * would get same score as "g f"~2, although "c b"~2 could be matched twice. * We may want to fix this in the future (currently not, for performance reasons). */ float_t phraseFreq(); private: typedef CL_NS(util)::CLHashMap, CL_NS(util)::Equals::Void > PhrasePositionsMap; static int comparePhrasePositions(const void* x, const void* y){ return static_cast(y)->offset - static_cast(x)->offset; } /** * Init PhrasePositions in place. * There is a one time initializatin for this scorer: *
- Put in repeats[] each pp that has another pp with same position in the doc. *
- Also mark each such pp by pp.repeats = true. *
Later can consult with repeats[] in termPositionsDiffer(pp), making that check efficient. * In particular, this allows to score queries with no repetiotions with no overhead due to this computation. *
- Example 1 - query with no repetitions: "ho my"~2 *
- Example 2 - query with repetitions: "ho my my"~2 *
- Example 3 - query with repetitions: "my ho my"~2 *
Init per doc w/repeats in query, includes propagating some repeating pp's to avoid false phrase detection. * @return end (max position), or -1 if any term ran out (i.e. done) * @throws IOException */ int32_t initPhrasePositions(); // disalow two pp's to have the same tp position, so that same word twice // in query would go elswhere in the matched doc bool termPositionsDiffer(PhrasePositions* pp); public: virtual TCHAR* toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/_TermScorer.h000066400000000000000000000052401154025176300231310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_TermScorer_ #define _lucene_search_TermScorer_ #include "Scorer.h" #include "CLucene/index/Terms.h" CL_CLASS_DEF(search,Similarity) #include "SearchHeader.h" CL_NS_DEF(search) /** Expert: A Scorer for documents matching a Term. */ class TermScorer: public Scorer { private: CL_NS(index)::TermDocs* termDocs; uint8_t* norms; Weight* weight; const float_t weightValue; int32_t _doc; int32_t docs[32]; // buffered doc numbers int32_t freqs[32]; // buffered term freqs int32_t pointer; int32_t pointerMax; float_t scoreCache[LUCENE_SCORE_CACHE_SIZE]; public: /** Construct a TermScorer. * @param weight The weight of the Term in the query. * @param td An iterator over the documents matching the Term. * @param similarity The Similarity implementation to be used for score computations. * @param norms The field norms of the document fields for the Term. * * @memory TermScorer takes TermDocs and deletes it when TermScorer is cleaned up */ TermScorer(Weight* weight, CL_NS(index)::TermDocs* td, Similarity* similarity, uint8_t* _norms); virtual ~TermScorer(); /** Returns the current document number matching the query. * Initially invalid, until {@link #next()} is called the first time. */ int32_t doc() const; /** Advances to the next document matching the query. *
The iterator over the matching documents is buffered using * {@link TermDocs#read(int[],int[])}. * @return true iff there is another document matching the query. */ bool next(); float_t score(); /** Skips to the first match beyond the current whose document number is * greater than or equal to a given target. *
The implementation uses {@link TermDocs#skipTo(int)}. * @param target The target document number. * @return true iff there is such a match. */ bool skipTo(int32_t target); /** Returns an explanation of the score for a document. *
When this method is used, the {@link #next()} method * and the {@link #score(HitCollector)} method should not be used. * @param doc The document number for the explanation. */ Explanation* explain(int32_t doc); /** Returns a string representation of this TermScorer. */ virtual TCHAR* toString(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/search/spans/000077500000000000000000000000001154025176300216575ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/search/spans/NearSpansOrdered.cpp000066400000000000000000000201121154025176300255560ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" #include #include #include "_NearSpansOrdered.h" #include "SpanNearQuery.h" CL_NS_DEF2( search, spans ) bool spanDocCompare( Spans * s1, Spans * s2 ) { return s1->doc() < s2->doc(); } NearSpansOrdered::NearSpansOrdered( SpanNearQuery * spanNearQuery, CL_NS(index)::IndexReader * reader ) { firstTime = true; more = false; inSameDoc = false; matchDoc = -1; matchStart = -1; matchEnd = -1; if( spanNearQuery->getClausesCount() < 2 ) { TCHAR * tszQry = spanNearQuery->toString(); size_t bBufLen = _tcslen( tszQry ) + 25; TCHAR * tszMsg = _CL_NEWARRAY( TCHAR, bBufLen ); _sntprintf( tszMsg, bBufLen, _T( "Less than 2 clauses: %s" ), tszQry ); _CLDELETE_LCARRAY( tszQry ); _CLTHROWT_DEL( CL_ERR_IllegalArgument, tszMsg ); } allowedSlop = spanNearQuery->getSlop(); subSpansCount = spanNearQuery->getClausesCount(); subSpans = _CL_NEWARRAY( Spans *, subSpansCount ); subSpansByDoc = _CL_NEWARRAY( Spans *, subSpansCount ); SpanQuery ** clauses = spanNearQuery->getClauses(); for( size_t i = 0; i < subSpansCount; i++ ) { subSpans[ i ] = clauses[ i ]->getSpans( reader ); subSpansByDoc[ i ] = subSpans[ i ]; // used in toSameDoc() } clauses = NULL; query = spanNearQuery; // kept for toString() only. } NearSpansOrdered::~NearSpansOrdered() { for( size_t i = 0; i < subSpansCount; i++ ) _CLLDELETE( subSpans[ i ] ); _CLDELETE_LARRAY( subSpans ); _CLDELETE_LARRAY( subSpansByDoc ); } bool NearSpansOrdered::next() { if( firstTime ) { firstTime = false; for( size_t i = 0; i < subSpansCount; i++ ) { if( ! subSpans[ i ]->next() ) { more = false; return false; } } more = true; } return advanceAfterOrdered(); } bool NearSpansOrdered::skipTo( int32_t target ) { if( firstTime ) { firstTime = false; for( size_t i = 0; i < subSpansCount; i++ ) { if( ! subSpans[ i ]->skipTo( target )) { more = false; return false; } } more = true; } else if( more && ( subSpans[ 0 ]->doc() < target )) { if( subSpans[ 0 ]->skipTo( target )) { inSameDoc = false; } else { more = false; return false; } } return advanceAfterOrdered(); } bool NearSpansOrdered::advanceAfterOrdered() { while( more && ( inSameDoc || toSameDoc() )) { if( stretchToOrder() && shrinkToAfterShortestMatch() ) return true; } return false; // no more matches } bool NearSpansOrdered::toSameDoc() { sort( subSpansByDoc, subSpansByDoc + subSpansCount, spanDocCompare ); size_t firstIndex = 0; int32_t maxDoc = subSpansByDoc[ subSpansCount-1 ]->doc(); while( subSpansByDoc[ firstIndex ]->doc() != maxDoc ) { if( ! subSpansByDoc[ firstIndex ]->skipTo( maxDoc )) { more = false; inSameDoc = false; return false; } maxDoc = subSpansByDoc[ firstIndex ]->doc(); if( ++firstIndex == subSpansCount ) firstIndex = 0; } #ifdef _DEBUG for( size_t i = 0; i < subSpansCount; i++ ) { assert( subSpansByDoc[ i ]->doc() == maxDoc ); // : " NearSpansOrdered.toSameDoc() spans " + subSpansByDoc[0] // + "\n at doc " + subSpansByDoc[i].doc() // + ", but should be at " + maxDoc; } #endif //_DEBUG inSameDoc = true; return true; } bool NearSpansOrdered::docSpansOrdered( Spans * spans1, Spans * spans2 ) { assert( spans1->doc() == spans2->doc() ); // "doc1 " + spans1.doc() + " != doc2 " + spans2.doc(); int32_t start1 = spans1->start(); int32_t start2 = spans2->start(); /* Do not call docSpansOrdered(int,int,int,int) to avoid invoking .end() : */ // CLucene - why? return ( start1 == start2 ) ? ( spans1->end() < spans2->end() ) : ( start1 < start2 ); } bool NearSpansOrdered::docSpansOrdered(int start1, int end1, int start2, int end2) { return ( start1 == start2 ) ? ( end1 < end2 ) : ( start1 < start2 ); } bool NearSpansOrdered::stretchToOrder() { matchDoc = subSpans[ 0 ]->doc(); for( size_t i = 1; inSameDoc && ( i < subSpansCount ); i++ ) { while( ! docSpansOrdered( subSpans[ i-1 ], subSpans[ i ] )) { if( ! subSpans[ i ]->next() ) { inSameDoc = false; more = false; break; } else if( matchDoc != subSpans[ i ]->doc() ) { inSameDoc = false; break; } } } return inSameDoc; } bool NearSpansOrdered::shrinkToAfterShortestMatch() { matchStart = subSpans[ subSpansCount - 1 ]->start(); matchEnd = subSpans[ subSpansCount - 1]->end(); int32_t matchSlop = 0; int32_t lastStart = matchStart; int32_t lastEnd = matchEnd; for( int32_t i = (int32_t)subSpansCount - 2; i >= 0; i-- ) { Spans * prevSpans = subSpans[ i ]; int32_t prevStart = prevSpans->start(); int32_t prevEnd = prevSpans->end(); while( true ) // Advance prevSpans until after (lastStart, lastEnd) { if( ! prevSpans->next() ) { inSameDoc = false; more = false; break; // Check remaining subSpans for final match. } else if( matchDoc != prevSpans->doc() ) { inSameDoc = false; // The last subSpans is not advanced here. break; // Check remaining subSpans for last match in this document. } else { int32_t ppStart = prevSpans->start(); int32_t ppEnd = prevSpans->end(); // Cannot avoid invoking .end() if( ! docSpansOrdered( ppStart, ppEnd, lastStart, lastEnd )) { break; // Check remaining subSpans. } else { // prevSpans still before (lastStart, lastEnd) prevStart = ppStart; prevEnd = ppEnd; } } } assert( prevStart <= matchStart ); if( matchStart > prevEnd ) // Only non overlapping spans add to slop. matchSlop += ( matchStart - prevEnd ); /* Do not break on (matchSlop > allowedSlop) here to make sure * that subSpans[0] is advanced after the match, if any. */ matchStart = prevStart; lastStart = prevStart; lastEnd = prevEnd; } return matchSlop <= allowedSlop; // ordered and allowed slop } TCHAR* NearSpansOrdered::toString() const { CL_NS(util)::StringBuffer buffer; TCHAR * tszQuery = query->toString(); buffer.append( _T( "NearSpansOrdered(" )); buffer.append( tszQuery ); buffer.append( _T( ")@" )); if( firstTime ) buffer.append( _T( "START" )); else if( more ) { buffer.appendInt( doc() ); buffer.append( _T( ":" )); buffer.appendInt( start() ); buffer.append( _T( "-" )); buffer.appendInt( end() ); } else buffer.append( _T( "END" )); _CLDELETE_ARRAY( tszQuery ); return buffer.toString(); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/NearSpansUnordered.cpp000066400000000000000000000164661154025176300261420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/util/StringBuffer.h" #include "_NearSpansUnordered.h" #include "_NearSpansOrdered.h" #include "SpanNearQuery.h" CL_NS_DEF2( search, spans ) ///////////////////////////////////////////////////////////////////////////// NearSpansUnordered::SpansCell::SpansCell( NearSpansUnordered * parentSpans, Spans * spans, int32_t index ) { this->parentSpans = parentSpans; this->spans = spans; this->index = index; this->length = -1; } NearSpansUnordered::SpansCell::~SpansCell() { _CLLDELETE( spans ); } bool NearSpansUnordered::SpansCell::adjust( bool condition ) { if( length != -1 ) parentSpans->totalLength -= length; // subtract old length if( condition ) { length = end() - start(); parentSpans->totalLength += length; // add new length if( ! parentSpans->max || doc() > parentSpans->max->doc() || ( doc() == parentSpans->max->doc() && end() > parentSpans->max->end())) { parentSpans->max = this; } } parentSpans->more = condition; return condition; } TCHAR* NearSpansUnordered::SpansCell::toString() const { CL_NS(util)::StringBuffer buffer; TCHAR * tszSpans = spans->toString(); buffer.append( tszSpans ); buffer.append( _T( "#" )); buffer.appendInt( index ); _CLDELETE_LARRAY( tszSpans ); return buffer.toString(); } ///////////////////////////////////////////////////////////////////////////// bool NearSpansUnordered::CellQueue::lessThan(SpansCell * spans1, SpansCell* spans2 ) { if( spans1->doc() == spans2->doc() ) return NearSpansOrdered::docSpansOrdered( spans1, spans2 ); else return spans1->doc() < spans2->doc(); } ///////////////////////////////////////////////////////////////////////////// NearSpansUnordered::NearSpansUnordered( SpanNearQuery * query, CL_NS(index)::IndexReader * reader ) { // this->ordered = new ArrayList(); this->more = true; this->firstTime = true; this->max = NULL; // CLucene specific, SpansCell::adjust tests this member to NULL this->first = NULL; // CLucene specific this->last = NULL; // CLucene specific, addToList test this member to NULL this->totalLength = 0; // CLucene specific this->query = query; this->slop = query->getSlop(); SpanQuery ** clauses = query->getClauses(); this->queue = _CLNEW CellQueue( query->getClausesCount() ); for( size_t i = 0; i < query->getClausesCount(); i++ ) { SpansCell * cell = _CLNEW SpansCell( this, clauses[ i ]->getSpans( reader ), i ); ordered.push_back( cell ); } clauses = NULL; } NearSpansUnordered::~NearSpansUnordered() { for( list::iterator iCell = ordered.begin(); iCell != ordered.end(); iCell++ ) _CLLDELETE( *iCell ); _CLLDELETE( queue ); } bool NearSpansUnordered::next() { if( firstTime ) { initList( true ); listToQueue(); // initialize queue firstTime = false; } else if( more ) { if( min()->next() ) // trigger further scanning queue->adjustTop(); // maintain queue else more = false; } while( more ) { bool queueStale = false; if( min()->doc() != max->doc() ) // maintain list { queueToList(); queueStale = true; } // skip to doc w/ all clauses while( more && first->doc() < last->doc() ) { more = first->skipTo( last->doc() );// skip first upto last firstToLast(); // and move it to the end queueStale = true; } if( ! more ) return false; // found doc w/ all clauses if( queueStale ) // maintain the queue { listToQueue(); queueStale = false; } if( atMatch() ) return true; more = min()->next(); if( more ) queue->adjustTop(); // maintain queue } return false; // no more matches } bool NearSpansUnordered::skipTo( int32_t target ) { if( firstTime ) // initialize { initList( false ); for( SpansCell * cell = first; more && cell; cell = cell->nextCell ) { more = cell->skipTo( target ); // skip all } if( more ) listToQueue(); firstTime = false; } else { // normal case while( more && min()->doc() < target ) // skip as needed { if( min()->skipTo( target )) queue->adjustTop(); else more = false; } } return more && ( atMatch() || next() ); } TCHAR* NearSpansUnordered::toString() const { CL_NS(util)::StringBuffer buffer; TCHAR * tszQuery = query->toString(); buffer.append( _T( "NearSpansUnordered(" )); buffer.append( tszQuery ); buffer.append( _T( ")@" )); if( firstTime ) buffer.append( _T( "START" )); else if( more ) { buffer.appendInt( doc() ); buffer.append( _T( ":" )); buffer.appendInt( start() ); buffer.append( _T( "-" )); buffer.appendInt( end() ); } else buffer.append( _T( "END" )); _CLDELETE_ARRAY( tszQuery ); return buffer.toString(); } void NearSpansUnordered::initList( bool next ) { for( list::iterator iCell = ordered.begin(); more && iCell != ordered.end(); iCell++ ) { if( next ) more = (*iCell)->next(); // move to first entry if( more ) addToList( *iCell ); // add to list } } void NearSpansUnordered::addToList( SpansCell * cell ) { if( last ) // add next to end of list last->nextCell = cell; else first = cell; last = cell; cell->nextCell = NULL; } void NearSpansUnordered::firstToLast() { last->nextCell = first; // move first to end of list last = first; first = first->nextCell; last->nextCell = NULL; } void NearSpansUnordered::queueToList() { last = NULL; first = NULL; while( queue->top() ) addToList( queue->pop() ); } void NearSpansUnordered::listToQueue() { queue->clear(); // rebuild queue for( SpansCell * cell = first; cell; cell = cell->nextCell ) queue->put( cell ); // add to queue from list } bool NearSpansUnordered::atMatch() { return ( min()->doc() == max->doc() ) && (( max->end() - min()->start() - totalLength ) <= slop ); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanFirstQuery.cpp000066400000000000000000000120111154025176300253150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/StringBuffer.h" #include "SpanFirstQuery.h" #include "Spans.h" CL_NS_DEF2( search, spans ) ///////////////////////////////////////////////////////////////////////////// class SpanFirstQuery::SpanFirstQuerySpans : public Spans { private: Spans * spans; int32_t end_; SpanFirstQuery * parentQuery; public: SpanFirstQuerySpans( SpanFirstQuery * parentQuery, CL_NS(index)::IndexReader * reader ); virtual ~SpanFirstQuerySpans(); bool next(); bool skipTo( int32_t target ); int32_t doc() const { return spans->doc(); } int32_t start() const { return spans->start(); } int32_t end() const { return spans->end(); } TCHAR* toString() const; }; SpanFirstQuery::SpanFirstQuerySpans::SpanFirstQuerySpans( SpanFirstQuery * parentQuery, CL_NS(index)::IndexReader * reader ) { this->parentQuery = parentQuery; this->end_ = parentQuery->end; this->spans = parentQuery->match->getSpans( reader ); } SpanFirstQuery::SpanFirstQuerySpans::~SpanFirstQuerySpans() { _CLLDELETE( spans ); } bool SpanFirstQuery::SpanFirstQuerySpans::next() { while( spans->next() ) // scan to next match { if( spans->end() <= end_ ) return true; } return false; } bool SpanFirstQuery::SpanFirstQuerySpans::skipTo( int32_t target ) { if( ! spans->skipTo( target )) return false; if( spans->end() <= end_ ) // there is a match return true; return next(); // scan to next match } TCHAR* SpanFirstQuery::SpanFirstQuerySpans::toString() const { CL_NS(util)::StringBuffer buffer; TCHAR * tszQry = parentQuery->toString(); buffer.append( _T( "spans(" )); buffer.append( tszQry ); buffer.append( _T( ")" )); _CLDELETE_LARRAY( tszQry ); return buffer.toString(); } ///////////////////////////////////////////////////////////////////////////// SpanFirstQuery::SpanFirstQuery( SpanQuery * match, int32_t end, bool bDeleteQuery ) { this->match = match; this->end = end; this->bDeleteQuery = bDeleteQuery; } SpanFirstQuery::SpanFirstQuery( const SpanFirstQuery& clone ) : SpanQuery( clone ) { this->match = (SpanQuery *) clone.match->clone(); this->end = clone.end; this->bDeleteQuery = true; } SpanFirstQuery::~SpanFirstQuery() { if( bDeleteQuery ) { _CLLDELETE( match ); } } CL_NS(search)::Query * SpanFirstQuery::clone() const { return _CLNEW SpanFirstQuery( *this ); } const char * SpanFirstQuery::getClassName() { return "SpanFirstQuery"; } const char * SpanFirstQuery::getObjectName() const { return getClassName(); } SpanQuery * SpanFirstQuery::getMatch() const { return match; } int32_t SpanFirstQuery::getEnd() const { return end; } const TCHAR * SpanFirstQuery::getField() const { return match->getField(); } void SpanFirstQuery::extractTerms( CL_NS(search)::TermSet * terms ) const { match->extractTerms( terms ); } CL_NS(search)::Query * SpanFirstQuery::rewrite( CL_NS(index)::IndexReader * reader ) { SpanFirstQuery * clone = NULL; SpanQuery * rewritten = (SpanQuery *) match->rewrite( reader ); if( rewritten != match ) { clone = (SpanFirstQuery *) this->clone(); _CLLDELETE( clone->match ); clone->match = rewritten; } if( clone ) return clone; // some clauses rewrote else return this; // no clauses rewrote } TCHAR* SpanFirstQuery::toString( const TCHAR* field ) const { CL_NS(util)::StringBuffer buffer; TCHAR * tszMatch = match->toString( field ); buffer.append( _T( "spanFirst(" )); buffer.append( tszMatch ); buffer.append( _T( ", " )); buffer.appendInt( end ); buffer.append( _T( ")" )); buffer.appendBoost( getBoost() ); _CLDELETE_LARRAY( tszMatch ); return buffer.toString(); } bool SpanFirstQuery::equals( Query * other ) const { if( this == other ) return true; if( other == NULL || !( other->instanceOf( SpanFirstQuery::getClassName() ))) return false; SpanFirstQuery * that = (SpanFirstQuery *) other; return end == that->end && getBoost() == that->getBoost() && match->equals( that->match ); } size_t SpanFirstQuery::hashCode() const { size_t h = match->hashCode(); h ^= (h << 8) | (h >> 25); // reversible h ^= Similarity::floatToByte( getBoost() ) ^ end; return h; } Spans * SpanFirstQuery::getSpans( CL_NS(index)::IndexReader * reader ) { return _CLNEW SpanFirstQuerySpans( this, reader ); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanFirstQuery.h000066400000000000000000000040551154025176300247730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_FirstSpanQuery_ #define _lucene_search_spans_FirstSpanQuery_ CL_CLASS_DEF(index, IndexReader); #include "SpanQuery.h" CL_NS_DEF2( search, spans ) /** Matches spans near the beginning of a field. */ class CLUCENE_EXPORT SpanFirstQuery : public SpanQuery { private: class SpanFirstQuerySpans; private: SpanQuery * match; bool bDeleteQuery; int32_t end; protected: SpanFirstQuery( const SpanFirstQuery& clone ); public: /** Construct a SpanFirstQuery matching spans in match whose end * position is less than or equal to end. */ SpanFirstQuery( SpanQuery * match, int32_t end, bool bDeleteQuery ); virtual ~SpanFirstQuery(); CL_NS(search)::Query * clone() const; static const char * getClassName(); const char * getObjectName() const; /** Return the SpanQuery whose matches are filtered. */ SpanQuery * getMatch() const; /** Return the maximum end position permitted in a match. */ int32_t getEnd() const; const TCHAR * getField() const; /** Returns a collection of all terms matched by this query. * @deprecated use extractTerms instead * @see #extractTerms(Set) */ // public Collection getTerms() { return match.getTerms(); } void extractTerms( CL_NS(search)::TermSet * terms ) const; CL_NS(search)::Query * rewrite( CL_NS(index)::IndexReader * reader ); using Query::toString; TCHAR* toString( const TCHAR* field ) const; bool equals( Query* other ) const; size_t hashCode() const; Spans * getSpans( CL_NS(index)::IndexReader * reader ); }; CL_NS_END2 #endif // _lucene_search_spans_FirstSpanQuery_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanNearQuery.cpp000066400000000000000000000125471154025176300251310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/StringBuffer.h" #include "SpanNearQuery.h" #include "_EmptySpans.h" #include "_NearSpansOrdered.h" #include "_NearSpansUnordered.h" CL_NS_DEF2( search, spans ) SpanNearQuery::SpanNearQuery( const SpanNearQuery& clone ) : SpanQuery( clone ) { this->clauses = _CL_NEWARRAY( SpanQuery *, clone.clausesCount ); for( size_t i = 0; i < clone.clausesCount; i++ ) this->clauses[ i ] = (SpanQuery *) clone.clauses[ i ]->clone(); this->clausesCount = clone.clausesCount; this->bDeleteClauses = true; this->slop = clone.slop; this->inOrder = clone.inOrder; this->field = NULL; setField( clone.field ); } SpanNearQuery::~SpanNearQuery() { if( bDeleteClauses ) { for( size_t i = 0; i < clausesCount; i++ ) _CLLDELETE( clauses[ i ] ); } clausesCount = 0; _CLDELETE_LARRAY( clauses ); _CLDELETE_LARRAY( field ); } CL_NS(search)::Query * SpanNearQuery::clone() const { return _CLNEW SpanNearQuery( *this ); } const char * SpanNearQuery::getClassName() { return "SpanNearQuery"; } const char * SpanNearQuery::getObjectName() const { return getClassName(); } SpanQuery ** SpanNearQuery::getClauses() const { return clauses; } size_t SpanNearQuery::getClausesCount() const { return clausesCount; } void SpanNearQuery::setField( const TCHAR * field ) { _CLDELETE_LARRAY( this->field ); this->field = STRDUP_TtoT( field ); } const TCHAR * SpanNearQuery::getField() const { return field; } int32_t SpanNearQuery::getSlop() const { return slop; } bool SpanNearQuery::isInOrder() const { return inOrder; } void SpanNearQuery::extractTerms( CL_NS(search)::TermSet * terms ) const { for( size_t i = 0; i < clausesCount; i++ ) clauses[ i ]->extractTerms( terms ); } CL_NS(search)::Query * SpanNearQuery::rewrite( CL_NS(index)::IndexReader * reader ) { SpanNearQuery * clone = NULL; for( size_t i = 0; i < clausesCount; i++ ) { SpanQuery * c = clauses[ i ]; SpanQuery * query = (SpanQuery *) c->rewrite( reader ); if( query != c ) { // clause rewrote: must clone if( clone == NULL ) clone = (SpanNearQuery *) this->clone(); _CLLDELETE( clone->clauses[ i ] ); clone->clauses[ i ] = query; } } if( clone ) return clone; // some clauses rewrote else return this; // no clauses rewrote } TCHAR* SpanNearQuery::toString( const TCHAR* field ) const { CL_NS(util)::StringBuffer buffer; buffer.append( _T( "spanNear([" )); for( size_t i = 0; i < clausesCount; i++ ) { if( i != 0 ) buffer.append( _T( ", " )); TCHAR * tszClause = clauses[ i ]->toString( field ); buffer.append( tszClause ); _CLDELETE_ARRAY( tszClause ); } buffer.append( _T( "], " )); buffer.appendInt( slop ); buffer.append( _T( ", " )); buffer.appendBool( inOrder ); buffer.append( _T( ")" )); buffer.appendBoost( getBoost() ); return buffer.toString(); } bool SpanNearQuery::equals( Query* other ) const { if( this == other ) return true; if( other == NULL || !( other->instanceOf( SpanNearQuery::getClassName() ))) return false; SpanNearQuery * that = (SpanNearQuery *) other; if( inOrder != that->inOrder || slop != that->slop || getBoost() != that->getBoost() || 0 != _tcscmp( field, that->field ) ) // CLucene: java version does not compare field names { return false; } if( clausesCount != that->clausesCount ) return false; for( size_t i = 0; i < clausesCount; i++ ) { if( ! clauses[ i ]->equals( that->clauses[ i ] )) return false; } return true; } size_t SpanNearQuery::hashCode() const { size_t result = 1; for( size_t i = 0; i < clausesCount; i++ ) result = 31*result + clauses[ i ]->hashCode(); // Mix bits before folding in things like boost, since it could cancel the // last element of clauses. This particular mix also serves to // differentiate SpanNearQuery hash codes from others. result ^= (result << 14) | (result >> 19); // reversible result += Similarity::floatToByte( getBoost() ); result += slop; result ^= ( inOrder ? 0x99AFD3BD : 0 ); return result; } Spans * SpanNearQuery::getSpans( CL_NS(index)::IndexReader * reader ) { if( clausesCount == 0 ) return _CLNEW EmptySpans(); // CLucene: 0-clause case - different to java version, because java creates SpanOrQuery to call its function to create empty spans if( clausesCount == 1 ) // optimize 1-clause case return clauses[ 0 ]->getSpans( reader ); return inOrder ? (Spans *) _CLNEW NearSpansOrdered( this, reader ) : (Spans *) _CLNEW NearSpansUnordered( this, reader ); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanNearQuery.h000066400000000000000000000071031154025176300245660ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanNearQuery_ #define _lucene_search_spans_SpanNearQuery_ CL_CLASS_DEF(index, IndexReader); #include "SpanQuery.h" CL_NS_DEF2( search, spans ) /** Matches spans which are near one another. One can specify slop, the * maximum number of intervening unmatched positions, as well as whether * matches are required to be in-order. */ class CLUCENE_EXPORT SpanNearQuery : public SpanQuery { private: SpanQuery ** clauses; size_t clausesCount; bool bDeleteClauses; int32_t slop; bool inOrder; TCHAR * field; protected: SpanNearQuery( const SpanNearQuery& clone ); public: /** Construct a SpanNearQuery. Matches spans matching a span from each * clause, with up to slop total unmatched positions between * them. * When inOrder is true, the spans from each clause * must be * ordered as in clauses. */ template SpanNearQuery( ClauseIterator first, ClauseIterator last, int32_t slop, bool inOrder, bool bDeleteClauses ) { // CLucene specific: at least one clause must be here if( first == last ) _CLTHROWA( CL_ERR_IllegalArgument, "Missing query clauses." ); this->bDeleteClauses = bDeleteClauses; this->clausesCount = last - first; this->clauses = _CL_NEWARRAY( SpanQuery *, clausesCount ); this->field = NULL; // copy clauses array into an array and check fields for( size_t i = 0; first != last; first++, i++ ) { SpanQuery * clause = *first; if( i == 0 ) { setField( clause->getField() ); } else if( 0 != _tcscmp( clause->getField(), field )) { _CLTHROWA( CL_ERR_IllegalArgument, "Clauses must have same field." ); } this->clauses[ i ] = clause; } this->slop = slop; this->inOrder = inOrder; } virtual ~SpanNearQuery(); CL_NS(search)::Query * clone() const; static const char * getClassName(); const char * getObjectName() const; /** Return the clauses whose spans are matched. * CLucene: pointer to the internal array */ SpanQuery ** getClauses() const; size_t getClausesCount() const; /** Return the maximum number of intervening unmatched positions permitted.*/ int32_t getSlop() const; /** Return true if matches are required to be in-order.*/ bool isInOrder() const; const TCHAR * getField() const; /** Returns a collection of all terms matched by this query. * @deprecated use extractTerms instead * @see #extractTerms(Set) */ // public Collection getTerms() void extractTerms( CL_NS(search)::TermSet * terms ) const; CL_NS(search)::Query * rewrite( CL_NS(index)::IndexReader * reader ); using Query::toString; TCHAR* toString( const TCHAR* field ) const; bool equals( Query* other ) const; size_t hashCode() const; Spans * getSpans( CL_NS(index)::IndexReader * reader ); protected: void setField( const TCHAR * field ); }; CL_NS_END2 #endif // _lucene_search_spans_SpanNearQuery_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanNotQuery.cpp000066400000000000000000000166401154025176300250020ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/StringBuffer.h" #include "SpanNotQuery.h" #include "Spans.h" CL_NS_DEF2( search, spans ) ///////////////////////////////////////////////////////////////////////////// class SpanNotQuery::SpanNotQuerySpans : public Spans { private: SpanNotQuery * parentQuery; Spans * includeSpans; bool moreInclude; Spans * excludeSpans; bool moreExclude; public: SpanNotQuerySpans( SpanNotQuery * parentQuery, CL_NS(index)::IndexReader * reader ); virtual ~SpanNotQuerySpans(); bool next(); bool skipTo( int32_t target ); int32_t doc() const { return includeSpans->doc(); } int32_t start() const { return includeSpans->start(); } int32_t end() const { return includeSpans->end(); } TCHAR* toString() const; }; SpanNotQuery::SpanNotQuerySpans::SpanNotQuerySpans( SpanNotQuery * parentQuery, CL_NS(index)::IndexReader * reader ) { this->parentQuery = parentQuery; includeSpans = parentQuery->include->getSpans( reader ); moreInclude = true; excludeSpans = parentQuery->exclude->getSpans( reader ); moreExclude = excludeSpans->next(); } SpanNotQuery::SpanNotQuerySpans::~SpanNotQuerySpans() { _CLLDELETE( includeSpans ); _CLLDELETE( excludeSpans ); } bool SpanNotQuery::SpanNotQuerySpans::next() { if( moreInclude ) // move to next include moreInclude = includeSpans->next(); while( moreInclude && moreExclude ) { if( includeSpans->doc() > excludeSpans->doc() ) // skip exclude moreExclude = excludeSpans->skipTo( includeSpans->doc() ); while( moreExclude // while exclude is before && includeSpans->doc() == excludeSpans->doc() && excludeSpans->end() <= includeSpans->start()) { moreExclude = excludeSpans->next(); // increment exclude } if( ! moreExclude // if no intersection || includeSpans->doc() != excludeSpans->doc() || includeSpans->end() <= excludeSpans->start()) break; // we found a match moreInclude = includeSpans->next(); // intersected: keep scanning } return moreInclude; } bool SpanNotQuery::SpanNotQuerySpans::skipTo( int32_t target ) { if( moreInclude ) // skip include moreInclude = includeSpans->skipTo( target ); if( ! moreInclude ) return false; if( moreExclude // skip exclude && includeSpans->doc() > excludeSpans->doc()) { moreExclude = excludeSpans->skipTo( includeSpans->doc() ); } while( moreExclude // while exclude is before && includeSpans->doc() == excludeSpans->doc() && excludeSpans->end() <= includeSpans->start()) { moreExclude = excludeSpans->next(); // increment exclude } if( ! moreExclude // if no intersection || includeSpans->doc() != excludeSpans->doc() || includeSpans->end() <= excludeSpans->start()) { return true; // we found a match } return next(); // scan to next match } TCHAR* SpanNotQuery::SpanNotQuerySpans::toString() const { CL_NS(util)::StringBuffer buffer; TCHAR * tszQry = parentQuery->toString(); buffer.append( _T( "spans(" )); buffer.append( tszQry ); buffer.append( _T( ")" )); _CLDELETE_LARRAY( tszQry ); return buffer.toString(); } ///////////////////////////////////////////////////////////////////////////// SpanNotQuery::SpanNotQuery( SpanQuery * include, SpanQuery * exclude, bool bDeleteQueries ) { this->include = include; this->exclude = exclude; this->bDeleteQueries = bDeleteQueries; if( 0 != _tcscmp( include->getField(), exclude->getField())) _CLTHROWA( CL_ERR_IllegalArgument, "Clauses must have same field." ); } SpanNotQuery::SpanNotQuery( const SpanNotQuery& clone ) : SpanQuery( clone ) { include = (SpanQuery *) clone.include->clone(); exclude = (SpanQuery *) clone.exclude->clone(); bDeleteQueries = true; } SpanNotQuery::~SpanNotQuery() { if( bDeleteQueries ) { _CLLDELETE( include ); _CLLDELETE( exclude ); } } CL_NS(search)::Query * SpanNotQuery::clone() const { return _CLNEW SpanNotQuery( *this ); } const char * SpanNotQuery::getClassName() { return "SpanNotQuery"; } const char * SpanNotQuery::getObjectName() const { return getClassName(); } SpanQuery * SpanNotQuery::getInclude() const { return include; } SpanQuery * SpanNotQuery::getExclude() const { return exclude; } const TCHAR * SpanNotQuery::getField() const { return include->getField(); } void SpanNotQuery::extractTerms( CL_NS(search)::TermSet * terms ) const { include->extractTerms( terms ); } TCHAR* SpanNotQuery::toString( const TCHAR* field ) const { CL_NS(util)::StringBuffer buffer; TCHAR * tmp; buffer.append( _T( "spanNot(" )); tmp = include->toString( field ); buffer.append( tmp ); _CLDELETE_ARRAY( tmp ); buffer.append( _T( ", " )); tmp = exclude->toString( field ); buffer.append( tmp ); _CLDELETE_ARRAY( tmp ); buffer.append( _T( ")" )); buffer.appendFloat( getBoost(), 1 ); return buffer.toString(); } CL_NS(search)::Query * SpanNotQuery::rewrite( CL_NS(index)::IndexReader * reader ) { SpanNotQuery * clone = NULL; SpanQuery * rewrittenInclude = (SpanQuery *) include->rewrite( reader ); if( rewrittenInclude != include ) { clone = (SpanNotQuery *) this->clone(); _CLLDELETE( clone->include ); clone->include = rewrittenInclude; } SpanQuery * rewrittenExclude = (SpanQuery *) exclude->rewrite( reader ); if( rewrittenExclude != exclude ) { if( ! clone ) clone = (SpanNotQuery *) this->clone(); _CLLDELETE( clone->exclude ); clone->exclude = rewrittenExclude; } if( clone ) return clone; // some clauses rewrote else return this; // no clauses rewrote } bool SpanNotQuery::equals( Query* other ) const { if( this == other ) return true; if( other == NULL || !( other->instanceOf( SpanNotQuery::getClassName() ))) return false; SpanNotQuery * that = (SpanNotQuery *) other; return include->equals( that->include ) && exclude->equals( that->exclude ) && getBoost() == that->getBoost(); } size_t SpanNotQuery::hashCode() const { size_t h = include->hashCode(); h = (h << 1) | (h >> 31); // rotate left h ^= exclude->hashCode(); h = (h << 1) | (h >> 31); // rotate left h ^= Similarity::floatToByte( getBoost() ); return h; } Spans * SpanNotQuery::getSpans( CL_NS(index)::IndexReader * reader ) { return _CLNEW SpanNotQuerySpans( this, reader ); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanNotQuery.h000066400000000000000000000041221154025176300244370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanNotQuery_ #define _lucene_search_spans_SpanNotQuery_ CL_CLASS_DEF(index, IndexReader); #include "SpanQuery.h" CL_NS_DEF2( search, spans ) /** Removes matches which overlap with another SpanQuery. */ class CLUCENE_EXPORT SpanNotQuery : public SpanQuery { private: class SpanNotQuerySpans; private: SpanQuery * include; SpanQuery * exclude; bool bDeleteQueries; protected: SpanNotQuery( const SpanNotQuery& clone ); public: /** Construct a SpanNotQuery matching spans from include which * have no overlap with spans from exclude.*/ SpanNotQuery( SpanQuery * include, SpanQuery * exclude, bool bDeleteQueries ); virtual ~SpanNotQuery(); CL_NS(search)::Query * clone() const; static const char * getClassName(); const char * getObjectName() const; /** Return the SpanQuery whose matches are filtered. */ SpanQuery * getInclude() const; /** Return the SpanQuery whose matches must not overlap those returned. */ SpanQuery * getExclude() const; const TCHAR * getField() const; /** Returns a collection of all terms matched by this query. * @deprecated use extractTerms instead * @see #extractTerms(Set) */ // public Collection getTerms() { return include.getTerms(); } void extractTerms( CL_NS(search)::TermSet * terms ) const; CL_NS(search)::Query * rewrite( CL_NS(index)::IndexReader * reader ); using Query::toString; TCHAR* toString( const TCHAR* field ) const; bool equals( Query* other ) const; size_t hashCode() const; Spans * getSpans( CL_NS(index)::IndexReader * reader ); }; CL_NS_END2 #endif // _lucene_search_spans_SpanNotQuery_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanOrQuery.cpp000066400000000000000000000170371154025176300246230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/PriorityQueue.h" #include "SpanOrQuery.h" #include "_EmptySpans.h" CL_NS_DEF2( search, spans ) ///////////////////////////////////////////////////////////////////////////// class SpanOrQuery::SpanQueue : public CL_NS(util)::PriorityQueue > { public: SpanQueue( int32_t size ) { initialize( size, true ); } virtual ~SpanQueue() {} protected: bool lessThan(Spans* spans1, Spans* spans2 ) { if( spans1->doc() == spans2->doc() ) { if( spans1->start() == spans2->start()) return spans1->end() < spans2->end(); else return spans1->start() < spans2->start(); } else return spans1->doc() < spans2->doc(); } }; ///////////////////////////////////////////////////////////////////////////// class SpanOrQuery::SpanOrQuerySpans : public Spans { private: SpanQueue * queue; SpanOrQuery * parentQuery; CL_NS(index)::IndexReader * reader; public: SpanOrQuerySpans( SpanOrQuery * parentQuery, CL_NS(index)::IndexReader * reader ); virtual ~SpanOrQuerySpans(); bool next(); bool skipTo( int32_t target ); int32_t doc() const { return top()->doc(); } int32_t start() const { return top()->start(); } int32_t end() const { return top()->end(); } TCHAR* toString() const; private: Spans * top() const { return queue->top(); } bool initSpanQueue( int32_t target ); }; SpanOrQuery::SpanOrQuerySpans::SpanOrQuerySpans( SpanOrQuery * parentQuery, CL_NS(index)::IndexReader * reader ) { this->parentQuery = parentQuery; this->reader = reader; this->queue = NULL; } SpanOrQuery::SpanOrQuerySpans::~SpanOrQuerySpans() { _CLLDELETE( queue ); } bool SpanOrQuery::SpanOrQuerySpans::next() { if( ! queue ) return initSpanQueue( -1 ); if( queue->size() == 0 ) // all done return false; if( top()->next() ) // move to next { queue->adjustTop(); return true; } _CLLDELETE( queue->pop() ); // exhausted a clause return queue->size() != 0; } bool SpanOrQuery::SpanOrQuerySpans::skipTo( int32_t target ) { if( ! queue ) return initSpanQueue( target ); while( queue->size() != 0 && top()->doc() < target ) { if( top()->skipTo( target )) queue->adjustTop(); else _CLLDELETE( queue->pop() ); } return queue->size() != 0; } TCHAR* SpanOrQuery::SpanOrQuerySpans::toString() const { CL_NS(util)::StringBuffer buffer; TCHAR * tszQry = parentQuery->toString(); buffer.append( _T( "spans(" )); buffer.append( tszQry ); buffer.append( _T( ")" )); _CLDELETE_LARRAY( tszQry ); return buffer.toString(); } bool SpanOrQuery::SpanOrQuerySpans::initSpanQueue( int32_t target ) { queue = _CLNEW SpanQueue( parentQuery->clausesCount ); for( size_t i = 0; i < parentQuery->clausesCount; i++ ) { Spans * spans = parentQuery->clauses[ i ]->getSpans( reader ); if(( target == -1 && spans->next()) || ( target != -1 && spans->skipTo( target ))) queue->put( spans ); else _CLLDELETE( spans ); } return ( queue->size() != 0 ); } ///////////////////////////////////////////////////////////////////////////// SpanOrQuery::SpanOrQuery( const SpanOrQuery& clone ) : SpanQuery( clone ) { this->clauses = _CL_NEWARRAY( SpanQuery *, clone.clausesCount ); for( size_t i = 0; i < clone.clausesCount; i++ ) this->clauses[ i ] = (SpanQuery *) clone.clauses[ i ]->clone(); this->clausesCount = clone.clausesCount; this->bDeleteClauses = true; this->field = NULL; setField( clone.field ); } SpanOrQuery::~SpanOrQuery() { if( bDeleteClauses ) { for( size_t i = 0; i < clausesCount; i++ ) _CLLDELETE( clauses[ i ] ); } clausesCount = 0; _CLDELETE_LARRAY( clauses ); _CLDELETE_LARRAY( field ); } CL_NS(search)::Query * SpanOrQuery::clone() const { return _CLNEW SpanOrQuery( *this ); } const char * SpanOrQuery::getClassName() { return "SpanOrQuery"; } const char * SpanOrQuery::getObjectName() const { return getClassName(); } SpanQuery ** SpanOrQuery::getClauses() const { return clauses; } size_t SpanOrQuery::getClausesCount() const { return clausesCount; } void SpanOrQuery::setField( const TCHAR * field ) { _CLDELETE_LARRAY( this->field ); this->field = STRDUP_TtoT( field ); } const TCHAR * SpanOrQuery::getField() const { return field; } void SpanOrQuery::extractTerms( CL_NS(search)::TermSet * terms ) const { for( size_t i = 0; i < clausesCount; i++ ) clauses[ i ]->extractTerms( terms ); } CL_NS(search)::Query * SpanOrQuery::rewrite( CL_NS(index)::IndexReader * reader ) { SpanOrQuery * clone = NULL; for( size_t i = 0; i < clausesCount; i++ ) { SpanQuery * c = clauses[ i ]; SpanQuery * query = (SpanQuery *) c->rewrite( reader ); if( query != c ) { // clause rewrote: must clone if( clone == NULL ) clone = (SpanOrQuery *) this->clone(); _CLLDELETE( clone->clauses[ i ] ); clone->clauses[ i ] = query; } } if( clone ) return clone; // some clauses rewrote else return this; // no clauses rewrote } TCHAR* SpanOrQuery::toString( const TCHAR* field ) const { CL_NS(util)::StringBuffer buffer; buffer.append( _T( "spanOr([" )); for( size_t i = 0; i < clausesCount; i++ ) { if( i != 0 ) buffer.append( _T( ", " )); TCHAR * tszClause = clauses[ i ]->toString( field ); buffer.append( tszClause ); _CLDELETE_ARRAY( tszClause ); } buffer.append( _T( "])" )); buffer.appendBoost( getBoost() ); return buffer.toString(); } bool SpanOrQuery::equals( Query* other ) const { if( this == other ) return true; if( other == NULL || !( other->instanceOf( SpanOrQuery::getClassName() ))) return false; SpanOrQuery * that = (SpanOrQuery *) other; if( 0 != _tcscmp( field, that->field ) || getBoost() != that->getBoost()) { return false; } if( clausesCount != that->clausesCount ) return false; for( size_t i = 0; i < clausesCount; i++ ) { if( ! clauses[ i ]->equals( that->clauses[ i ] )) return false; } return true; } size_t SpanOrQuery::hashCode() const { size_t h = 1; for( size_t i = 0; i < clausesCount; i++ ) h = 31*h + clauses[ i ]->hashCode(); h ^= (h << 10) | (h >> 23); h ^= Similarity::floatToByte( getBoost() ); return h; } Spans * SpanOrQuery::getSpans( CL_NS(index)::IndexReader * reader ) { if( clausesCount == 0 ) return _CLNEW EmptySpans(); // CLucene: 0-clause case if( clausesCount == 1 ) // optimize 1-clause case return clauses[ 0 ]->getSpans( reader ); return _CLNEW SpanOrQuerySpans( this, reader ); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanOrQuery.h000066400000000000000000000061051154025176300242620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanOrQuery_ #define _lucene_search_spans_SpanOrQuery_ CL_CLASS_DEF(index, IndexReader); #include "SpanQuery.h" CL_NS_DEF2( search, spans ) /** * Matches the union of its clauses. */ class CLUCENE_EXPORT SpanOrQuery : public SpanQuery { private: class SpanQueue; class SpanOrQuerySpans; private: SpanQuery ** clauses; size_t clausesCount; bool bDeleteClauses; TCHAR * field; protected: SpanOrQuery( const SpanOrQuery& clone ); public: /** Construct a SpanOrQuery merging the provided clauses. */ template SpanOrQuery( ClauseIterator first, ClauseIterator last, bool bDeleteClauses ) { // CLucene specific: at least one clause must be here if( first == last ) _CLTHROWA( CL_ERR_IllegalArgument, "Missing query clauses." ); this->bDeleteClauses = bDeleteClauses; this->clausesCount = last - first; this->clauses = _CL_NEWARRAY( SpanQuery *, clausesCount ); this->field = NULL; // copy clauses array into an array and check fields for( size_t i = 0; first != last; first++, i++ ) { SpanQuery * clause = *first; if( i == 0 ) { setField( clause->getField() ); } else if( 0 != _tcscmp( clause->getField(), field )) { _CLTHROWA( CL_ERR_IllegalArgument, "Clauses must have same field." ); } this->clauses[ i ] = clause; } } virtual ~SpanOrQuery(); CL_NS(search)::Query * clone() const; static const char * getClassName(); const char * getObjectName() const; /** Return the clauses whose spans are matched. * CLucene: pointer to the internal array */ SpanQuery ** getClauses() const; size_t getClausesCount() const; const TCHAR * getField() const; /** Returns a collection of all terms matched by this query. * @deprecated use extractTerms instead * @see #extractTerms(Set) */ // public Collection getTerms() void extractTerms( CL_NS(search)::TermSet * terms ) const; CL_NS(search)::Query * rewrite( CL_NS(index)::IndexReader * reader ); using Query::toString; TCHAR* toString( const TCHAR* field ) const; bool equals( Query* other ) const; size_t hashCode() const; /** This returns some kind of lazy spans. The set will be evaluated with the first call * and this query and the given reader must exists at this time */ Spans * getSpans( CL_NS(index)::IndexReader * reader ); protected: void setField( const TCHAR * field ); }; CL_NS_END2 #endif // _lucene_search_spans_SpanOrQuery_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanQuery.h000066400000000000000000000025771154025176300237720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanQuery_ #define _lucene_search_spans_SpanQuery_ #include "CLucene/search/Query.h" #include "CLucene/search/spans/SpanWeight.h" CL_CLASS_DEF2( search, spans, Spans ) CL_NS_DEF2( search, spans ) /** Base class for span-based queries. */ class CLUCENE_EXPORT SpanQuery : public CL_NS(search)::Query { public: /** Expert: Returns the matches for this query in an index. Used internally * to search for spans. */ virtual Spans * getSpans( CL_NS(index)::IndexReader * reader ) = 0; /** Returns the name of the field matched by this query.*/ virtual const TCHAR* getField() const = 0; /** Returns a collection of all terms matched by this query. * @deprecated use extractTerms instead * @see Query#extractTerms(Set) */ // public abstract Collection getTerms(); Weight * _createWeight( CL_NS(search)::Searcher * searcher ) { return _CLNEW SpanWeight( this, searcher ); } }; CL_NS_END2 #endif // _lucene_search_spans_SpanQuery_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanScorer.cpp000066400000000000000000000054531154025176300244510ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/search/SearchHeader.h" #include "CLucene/search/Similarity.h" #include "CLucene/search/Explanation.h" #include "CLucene/util/StringBuffer.h" #include "SpanScorer.h" #include "Spans.h" CL_NS_DEF2(search, spans) SpanScorer::SpanScorer( Spans * spans, Weight * weight, Similarity * similarity, uint8_t* norms ) : Scorer( similarity ), firstTime( true ), more( true ) { this->spans = spans; this->norms = norms; this->weight = weight; this->value = weight->getValue(); doc_ = -1; } SpanScorer::~SpanScorer() { _CLLDELETE( spans ); } bool SpanScorer::next() { if( firstTime ) { more = spans->next(); firstTime = false; } return setFreqCurrentDoc(); } bool SpanScorer::skipTo( int32_t target ) { if( firstTime ) { more = spans->skipTo( target ); firstTime = false; } if( ! more ) return false; if( spans->doc() < target ) { // setFreqCurrentDoc() leaves spans.doc() ahead more = spans->skipTo( target ); } return setFreqCurrentDoc(); } bool SpanScorer::setFreqCurrentDoc() { if( ! more ) return false; doc_ = spans->doc(); freq = 0.0f; while( more && doc_ == spans->doc() ) { int32_t matchLength = spans->end() - spans->start(); freq += getSimilarity()->sloppyFreq( matchLength ); more = spans->next(); } return more || ( freq != 0 ); } int32_t SpanScorer::doc() const { return doc_; } float_t SpanScorer::score() { float_t raw = getSimilarity()->tf( freq ) * value; // raw score return raw * Similarity::decodeNorm( norms[ doc_ ]); // normalize } CL_NS(search)::Explanation * SpanScorer::explain( int32_t docIn ) { Explanation * tfExplanation = _CLNEW Explanation(); skipTo( docIn ); float_t phraseFreq = (doc() == docIn ) ? freq : 0.0f; tfExplanation->setValue( getSimilarity()->tf( phraseFreq )); CL_NS(util)::StringBuffer strBuf( 50 ); strBuf.append( _T( "tf(phraseFreq=" )); strBuf.appendFloat( phraseFreq, 2 ); strBuf.append( _T( ")" )); tfExplanation->setDescription( strBuf.getBuffer() ); return tfExplanation; } TCHAR* SpanScorer::toString() { CL_NS(util)::StringBuffer buf; buf.append( _T( "SpanScorer(" )); TCHAR* tmp = weight->toString(); buf.append( tmp ); _CLDELETE_CARRAY( tmp ); buf.append( _T( ")" )); return buf.toString(); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanScorer.h000066400000000000000000000026551154025176300241170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanScorer_ #define _lucene_search_spans_SpanScorer_ #include "CLucene/search/Scorer.h" CL_CLASS_DEF2(search,spans,Spans) CL_CLASS_DEF(search,Explanation) CL_CLASS_DEF(search,Weight) CL_NS_DEF2(search, spans) /** * Public for extension only. */ class CLUCENE_EXPORT SpanScorer : public CL_NS(search)::Scorer { protected: Spans * spans; CL_NS(search)::Weight * weight; uint8_t* norms; float_t value; bool firstTime; bool more; int32_t doc_; float_t freq; public: SpanScorer( Spans * spans, Weight * weight, Similarity * similarity, uint8_t* norms ); virtual ~SpanScorer(); bool next(); bool skipTo( int32_t target ); int32_t doc() const; float_t score(); CL_NS(search)::Explanation* explain( int32_t docIn ); TCHAR* toString(); protected: bool setFreqCurrentDoc(); }; CL_NS_END2 #endif // _lucene_search_spans_SpanScorer_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanTermQuery.cpp000066400000000000000000000047571154025176300251570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/Term.h" #include "CLucene/search/Similarity.h" #include "CLucene/util/StringBuffer.h" #include "SpanTermQuery.h" #include "_TermSpans.h" CL_NS_DEF2( search, spans ) SpanTermQuery::SpanTermQuery( CL_NS(index)::Term * term ) { this->term = _CL_POINTER( term ); } SpanTermQuery::SpanTermQuery( const SpanTermQuery& clone ) : SpanQuery( clone ) { this->term = _CL_POINTER( clone.term ); } SpanTermQuery::~SpanTermQuery() { _CLLDECDELETE( term ); } CL_NS(search)::Query * SpanTermQuery::clone() const { return _CLNEW SpanTermQuery( *this ); } const char* SpanTermQuery::getClassName() { return "SpanTermQuery"; } const char* SpanTermQuery::getObjectName() const { return getClassName(); } size_t SpanTermQuery::hashCode() const { return Similarity::floatToByte(getBoost()) ^ term->hashCode() ^ 0xD23FE494; } CL_NS(index)::Term * SpanTermQuery::getTerm( bool pointer ) const { if ( pointer ) return _CL_POINTER( term ); else return term; } const TCHAR * SpanTermQuery::getField() const { return term->field(); } void SpanTermQuery::extractTerms( CL_NS(search)::TermSet * terms ) const { if( term && terms->end() == terms->find( term )) terms->insert( _CL_POINTER( term )); } Spans * SpanTermQuery::getSpans( CL_NS(index)::IndexReader * reader ) { return _CLNEW TermSpans( reader->termPositions( term ), term ); } TCHAR* SpanTermQuery::toString( const TCHAR* field ) const { CL_NS(util)::StringBuffer buffer; if( field && 0 == _tcscmp( term->field(), field )) buffer.append( term->text() ); else { TCHAR * tszTerm = term->toString(); buffer.append( tszTerm ); buffer.appendBoost( getBoost() ); _CLDELETE_CARRAY( tszTerm ); } return buffer.toString(); } bool SpanTermQuery::equals( Query* other ) const { if( !( other->instanceOf( SpanTermQuery::getClassName() ))) return false; SpanTermQuery * that = (SpanTermQuery *) other; return ( this->getBoost() == that->getBoost() ) && this->term->equals( that->term ); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanTermQuery.h000066400000000000000000000034271154025176300246150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanTermQuery_ #define _lucene_search_spans_SpanTermQuery_ CL_CLASS_DEF(index, Term); CL_CLASS_DEF(index, IndexReader); #include "SpanQuery.h" CL_NS_DEF2( search, spans ) /** Matches spans containing a term. */ class CLUCENE_EXPORT SpanTermQuery : public SpanQuery { protected: CL_NS(index)::Term * term; protected: SpanTermQuery( const SpanTermQuery& clone ); public: /** Construct a SpanTermQuery matching the named term's spans. */ SpanTermQuery( CL_NS(index)::Term * term ); virtual ~SpanTermQuery(); static const char * getClassName(); const char * getObjectName() const; /** Return the term whose spans are matched. */ CL_NS(index)::Term * getTerm( bool pointer=true ) const; const TCHAR * getField() const; /** Returns a collection of all terms matched by this query. * @deprecated use extractTerms instead * @see #extractTerms(Set) */ // public Collection getTerms() void extractTerms( CL_NS(search)::TermSet * terms ) const; Spans * getSpans( CL_NS(index)::IndexReader * reader ); CL_NS(search)::Query * clone() const; /** Returns true iff o is equal to this. */ bool equals( Query* other ) const; /** Returns a hash code value for this object.*/ size_t hashCode() const; TCHAR* toString( const TCHAR* field ) const; }; CL_NS_END2 #endif //_lucene_search_spans_SpanTermQuery_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanWeight.cpp000066400000000000000000000132261154025176300244400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLucene/index/IndexReader.h" #include "CLucene/search/Similarity.h" #include "CLucene/search/Explanation.h" #include "CLucene/search/Scorer.h" #include "CLucene/util/StringBuffer.h" #include "SpanWeight.h" #include "SpanQuery.h" #include "SpanScorer.h" CL_NS_USE(util) CL_NS_DEF2(search, spans) SpanWeight::SpanWeight( SpanQuery * query, CL_NS(search)::Searcher * searcher ) { this->similarity = query->getSimilarity( searcher ); this->query = query; terms = _CLNEW TermSet(); query->extractTerms( terms ); idf = similarity->idf( terms->begin(), terms->end(), searcher ); } SpanWeight::~SpanWeight() { for( TermSet::iterator iTerm = terms->begin(); iTerm != terms->end(); iTerm++ ) _CLLDECDELETE( *iTerm ); _CLDELETE( terms ); } CL_NS(search)::Query * SpanWeight::getQuery() { return query; } float_t SpanWeight::getValue() { return value; } float_t SpanWeight::sumOfSquaredWeights() { queryWeight = idf * query->getBoost(); // compute query weight return queryWeight * queryWeight; // square it } void SpanWeight::normalize( float_t norm ) { queryNorm = norm; queryWeight *= queryNorm; // normalize query weight value = queryWeight * idf; // idf for document } CL_NS(search)::Scorer * SpanWeight::scorer( CL_NS(index)::IndexReader* reader ) { return _CLNEW SpanScorer( query->getSpans( reader ), this, similarity, reader->norms( query->getField() )); } CL_NS(search)::Explanation * SpanWeight::explain( CL_NS(index)::IndexReader* reader, int32_t doc ) { ComplexExplanation * result = _CLNEW ComplexExplanation(); StringBuffer strBuf(100); const TCHAR * field = ((SpanQuery *)getQuery())->getField(); TCHAR * tQry = getQuery()->toString(); TCHAR * tQryF = getQuery()->toString( field ); strBuf.append( _T( "weight(" )); strBuf.append( tQry ); strBuf.append( _T( " in " )); strBuf.appendInt( doc ); strBuf.append( _T( "), product of:" )); result->setDescription( strBuf.getBuffer() ); CL_NS(util)::StringBuffer docFreqs; for( TermSet::iterator itTerms = terms->begin(); itTerms != terms->end(); itTerms++ ) { CL_NS(index)::Term * term = (*itTerms); docFreqs.append( term->text()); docFreqs.append( _T( "=" )); docFreqs.appendInt( reader->docFreq( term )); if( itTerms != terms->end() ) docFreqs.append( _T( " " )); } strBuf.clear(); strBuf.append( _T( "idf(" )); strBuf.append( field ); strBuf.append( _T( ": " )); strBuf.append( docFreqs.getBuffer()); strBuf.append( _T( ")" )); Explanation * idfExpl = _CLNEW Explanation( idf, strBuf.getBuffer() ); // explain query weight Explanation * queryExpl = _CLNEW Explanation(); strBuf.clear(); strBuf.append( _T( "queryWeight(" )); strBuf.append( tQry ); strBuf.append( _T( "), product of:" )); queryExpl->setDescription( strBuf.getBuffer() ); if( getQuery()->getBoost() != 1.0f ) queryExpl->addDetail( _CLNEW Explanation( getQuery()->getBoost(), _T( "boost" ))); queryExpl->addDetail( idfExpl ); Explanation * queryNormExpl = _CLNEW Explanation( queryNorm, _T( "queryNorm" )); queryExpl->addDetail( queryNormExpl ); queryExpl->setValue( getQuery()->getBoost() * idfExpl->getValue() * queryNormExpl->getValue()); result->addDetail( queryExpl ); // explain field weight ComplexExplanation * fieldExpl = _CLNEW ComplexExplanation(); strBuf.clear(); strBuf.append( _T( "fieldWeight(" )); strBuf.append( field ); strBuf.append( _T( ":" )); strBuf.append( tQryF ); strBuf.append( _T( " in " )); strBuf.appendInt( doc ); strBuf.append( _T( "), product of:" )); fieldExpl->setDescription( strBuf.getBuffer() ); Scorer * pScorer = scorer( reader ); Explanation * tfExpl = pScorer->explain( doc ); fieldExpl->addDetail( tfExpl ); fieldExpl->addDetail( idfExpl->clone() ); Explanation * fieldNormExpl = _CLNEW Explanation(); uint8_t * fieldNorms = reader->norms( field ); float_t fieldNorm = fieldNorms != NULL ? Similarity::decodeNorm( fieldNorms[ doc ] ) : 0.0f; fieldNormExpl->setValue( fieldNorm ); strBuf.clear(); strBuf.append( _T( "fieldNorm(field=" )); strBuf.append( field ); strBuf.append( _T( ", doc=" )); strBuf.appendInt( doc ); strBuf.append( _T( ")" )); fieldNormExpl->setDescription( strBuf.getBuffer()); fieldExpl->addDetail( fieldNormExpl ); fieldExpl->setMatch( tfExpl->isMatch() ); fieldExpl->setValue( tfExpl->getValue() * idfExpl->getValue() * fieldNormExpl->getValue() ); _CLLDELETE( pScorer ); _CLDELETE_LCARRAY( tQry ); _CLDELETE_LCARRAY( tQryF ); if( queryExpl->getValue() == 1.0f ) { _CLLDELETE( result ); return fieldExpl; } else { result->addDetail( fieldExpl ); result->setMatch( fieldExpl->getMatch() ); // combine them result->setValue( queryExpl->getValue() * fieldExpl->getValue() ); return result; } } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/SpanWeight.h000066400000000000000000000030471154025176300241050ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_SpanWeight_ #define _lucene_search_spans_SpanWeight_ #include "CLucene/search/SearchHeader.h" #include "CLucene/search/Query.h" CL_CLASS_DEF2(search,spans,SpanQuery) CL_CLASS_DEF(search,Similarity) CL_CLASS_DEF(search,Searcher) CL_NS_DEF2(search, spans) /** * Expert-only. Public for use by other weight implementations */ class CLUCENE_EXPORT SpanWeight : public CL_NS(search)::Weight { protected: CL_NS(search)::Similarity * similarity; float_t value; float_t idf; float_t queryNorm; float_t queryWeight; CL_NS(search)::TermSet * terms; SpanQuery * query; public: SpanWeight( SpanQuery * query, CL_NS(search)::Searcher * searcher ); virtual ~SpanWeight(); CL_NS(search)::Scorer * scorer( CL_NS(index)::IndexReader* reader ); CL_NS(search)::Explanation * explain( CL_NS(index)::IndexReader* reader, int32_t doc ); CL_NS(search)::Query * getQuery(); float_t getValue(); float_t sumOfSquaredWeights(); void normalize( float_t norm ); }; CL_NS_END2 #endif // _lucene_search_spans_SpanWeight_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/Spans.h000066400000000000000000000037531154025176300231240ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_Spans_ #define _lucene_search_spans_Spans_ CL_NS_DEF2( search, spans ) /** Expert: an enumeration of span matches. Used to implement span searching. * Each span represents a range of term positions within a document. Matches * are enumerated in order, by increasing document number, within that by * increasing start position and finally by increasing end position. */ class CLUCENE_EXPORT Spans { public: /** Empty base destructor */ virtual ~Spans() {}; /** Move to the next match, returning true iff any such exists. */ virtual bool next() = 0; /** Skips to the first match beyond the current, whose document number is * greater than or equal to target.

Returns true iff there is such * a match.

Behaves as if written:

     *   boolean skipTo(int target) {
     *     do {
     *       if (!next())
     * 	     return false;
     *     } while (target > doc());
     *     return true;
     *   }
     * 
* Most implementations are considerably more efficient than that. */ virtual bool skipTo( int32_t target ) = 0; /** Returns the document number of the current match. Initially invalid. */ virtual int32_t doc() const = 0; /** Returns the start position of the current match. Initially invalid. */ virtual int32_t start() const = 0; /** Returns the end position of the current match. Initially invalid. */ virtual int32_t end() const = 0; /** Returns the string representation of the spans */ virtual TCHAR* toString() const = 0; }; CL_NS_END2 #endif // _lucene_search_spans_Spans_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/TermSpans.cpp000066400000000000000000000042271154025176300243040ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include #include "CLucene/_ApiHeader.h" #include #include "CLucene/index/Terms.h" #include "CLucene/index/Term.h" #include "CLucene/util/StringBuffer.h" #include "_TermSpans.h" CL_NS_DEF2(search, spans) TermSpans::TermSpans( CL_NS(index)::TermPositions * positions, CL_NS(index)::Term * term ) { this->positions = positions; this->term = _CL_POINTER( term ); doc_ = -1; freq = 0; count = 0; position = 0; } TermSpans::~TermSpans() { _CLLDELETE( positions ); _CLLDECDELETE( term ); } bool TermSpans::next() { if( count == freq ) { if( ! positions->next()) { doc_ = INT_MAX; return false; } doc_ = positions->doc(); freq = positions->freq(); count = 0; } position = positions->nextPosition(); count++; return true; } bool TermSpans::skipTo( int32_t target ) { // are we already at the correct position? if( doc_ >= target ) return true; if( !positions->skipTo( target )) { doc_ = INT_MAX; return false; } doc_ = positions->doc(); freq = positions->freq(); count = 0; position = positions->nextPosition(); count++; return true; } TCHAR* TermSpans::toString() const { CL_NS(util)::StringBuffer strBuf( 50 ); TCHAR * tszTerm = term->toString(); strBuf.append( _T( "spans(" )); strBuf.append( tszTerm ); strBuf.append( _T( ")@" )); if( doc_ == -1 ) strBuf.append( _T( "START" )); else if( doc_ == INT_MAX ) strBuf.append( _T( "END" )); else { strBuf.appendInt( doc_ ); strBuf.append( _T( "-" )); strBuf.appendInt( position ); } _CLDELETE_CARRAY( tszTerm ); return strBuf.toString(); } CL_NS_END2 clucene-core-2.3.3.4/src/core/CLucene/search/spans/_EmptySpans.h000066400000000000000000000023401154025176300242710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_EmptySpans_ #define _lucene_search_spans_EmptySpans_ #include "Spans.h" #include CL_NS_DEF2( search, spans ) /** CLucene specific: Empty span enumeration, used for optimized cases * when there are no clauses in SpanNearQuery or SpanOrQuery */ class EmptySpans : public Spans { public: EmptySpans() {} virtual ~ EmptySpans() {} bool next() { return false; } bool skipTo( int32_t target ) { return false; } int32_t doc() const { assert( false ); return -1; } int32_t start() const { assert( false ); return 0; } int32_t end() const { assert( false ); return 1; } TCHAR* toString() const { return STRDUP_TtoT( _T( "spans()" )); } }; CL_NS_END2 #endif // _lucene_search_spans_EmptySpans_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/_NearSpansOrdered.h000066400000000000000000000067531154025176300254010ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_NearSpansOrdered_ #define _lucene_search_spans_NearSpansOrdered_ CL_CLASS_DEF(index, IndexReader) CL_CLASS_DEF2(search, spans, SpanNearQuery) #include "Spans.h" CL_NS_DEF2( search, spans ) /** A Spans that is formed from the ordered subspans of a SpanNearQuery * where the subspans do not overlap and have a maximum slop between them. *

* The formed spans only contains minimum slop matches.
* The matching slop is computed from the distance(s) between * the non overlapping matching Spans.
* Successive matches are always formed from the successive Spans * of the SpanNearQuery. *

* The formed spans may contain overlaps when the slop is at least 1. * For example, when querying using *

t1 t2 t3
* with slop at least 1, the fragment: *
t1 t2 t1 t3 t2 t3
* matches twice: *
t1 t2 .. t3      
*
      t1 .. t2 t3
*/ class NearSpansOrdered : public Spans { private: int32_t allowedSlop; bool firstTime; bool more; /** The spans in the same order as the SpanNearQuery */ Spans ** subSpans; size_t subSpansCount; /** Indicates that all subSpans have same doc() */ bool inSameDoc; int32_t matchDoc; int32_t matchStart; int32_t matchEnd; Spans ** subSpansByDoc; SpanNearQuery * query; public: NearSpansOrdered( SpanNearQuery * spanNearQuery, CL_NS(index)::IndexReader * reader ); virtual ~NearSpansOrdered(); bool next(); bool skipTo( int32_t target ); int32_t doc() const { return matchDoc; } int32_t start() const { return matchStart; } int32_t end() const { return matchEnd; } TCHAR* toString() const; /** Check whether two Spans in the same document are ordered. * @param spans1 * @param spans2 * @return true iff spans1 starts before spans2 * or the spans start at the same position, * and spans1 ends before spans2. */ static bool docSpansOrdered( Spans * spans1, Spans * spans2 ); private: /** Advances the subSpans to just after an ordered match with a minimum slop * that is smaller than the slop allowed by the SpanNearQuery. * @return true iff there is such a match. */ bool advanceAfterOrdered(); /** Advance the subSpans to the same document */ bool toSameDoc(); /** Like {@link #docSpansOrdered(Spans,Spans)}, but use the spans * starts and ends as parameters. */ static bool docSpansOrdered( int32_t start1, int32_t end1, int32_t start2, int32_t end2 ); /** Order the subSpans within the same document by advancing all later spans * after the previous one. */ bool stretchToOrder(); /** The subSpans are ordered in the same doc, so there is a possible match. * Compute the slop while making the match as short as possible by advancing * all subSpans except the last one in reverse order. */ bool shrinkToAfterShortestMatch(); }; CL_NS_END2 #endif // _lucene_search_spans_NearSpansOrdered_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/_NearSpansUnordered.h000066400000000000000000000066401154025176300257370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_NearSpansUnordered_ #define _lucene_search_spans_NearSpansUnordered_ CL_CLASS_DEF(index, IndexReader) CL_CLASS_DEF2(search, spans, SpanNearQuery) #include "CLucene/util/PriorityQueue.h" #include "Spans.h" CL_NS_DEF2( search, spans ) class NearSpansUnordered : public Spans { private: ///////////////////////////////////////////////////////////////////////////// class SpansCell : public Spans { private: NearSpansUnordered * parentSpans; Spans * spans; int32_t length; int32_t index; public: SpansCell * nextCell; public: SpansCell( NearSpansUnordered * parentSpans, Spans * spans, int32_t index ); virtual ~SpansCell(); bool next() { return adjust( spans->next() ); } bool skipTo( int32_t target ) { return adjust( spans->skipTo( target )); } int32_t doc() const { return spans->doc(); } int32_t start() const { return spans->start(); } int32_t end() const { return spans->end(); } TCHAR* toString() const; private: bool adjust( bool condition ); }; ///////////////////////////////////////////////////////////////////////////// class CellQueue : public CL_NS(util)::PriorityQueue > { public: CellQueue( int32_t size ) { initialize( size, false ); } // All the span cells will be freed in ~NearSpansUnordered() while frein ordered member virtual ~CellQueue() {} protected: bool lessThan( SpansCell * spans1, SpansCell* spans2 ); }; private: SpanNearQuery * query; list ordered; // spans in query order int32_t slop; // from query SpansCell * first; // linked list of spans SpansCell * last; // sorted by doc only int32_t totalLength; // sum of current lengths CellQueue * queue; // sorted queue of spans SpansCell * max; // max element in queue bool more; // true iff not done bool firstTime; // true before first next() public: NearSpansUnordered( SpanNearQuery * query, CL_NS(index)::IndexReader * reader ); virtual ~NearSpansUnordered(); bool next(); bool skipTo( int32_t target ); int32_t doc() const { return min()->doc(); } int32_t start() const { return min()->start(); } int32_t end() const { return max->end(); } TCHAR* toString() const; private: SpansCell * min() const { return queue->top(); } void initList( bool next ); void addToList( SpansCell * cell ); void firstToLast(); void queueToList(); void listToQueue(); bool atMatch(); }; CL_NS_END2 #endif // _lucene_search_spans_NearSpansUnordered_ clucene-core-2.3.3.4/src/core/CLucene/search/spans/_TermSpans.h000066400000000000000000000026271154025176300241120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TermSpans_ #define _lucene_search_spans_TermSpans_ #include "CLucene/search/spans/Spans.h" CL_CLASS_DEF(index, TermPositions) CL_CLASS_DEF(index, Term) CL_NS_DEF2(search, spans) /** * Expert: * Public for extension only */ class TermSpans : public Spans { protected: CL_NS(index)::TermPositions * positions; CL_NS(index)::Term * term; int32_t doc_; int32_t freq; int32_t count; int32_t position; public: TermSpans( CL_NS(index)::TermPositions * positions, CL_NS(index)::Term * term ); virtual ~TermSpans(); bool next(); bool skipTo( int32_t target ); int32_t doc() const { return doc_; } int32_t start() const { return position; } int32_t end() const { return position + 1; } TCHAR* toString() const; CL_NS(index)::TermPositions * getPositions() { return positions; } }; CL_NS_END2 #endif // _lucene_search_spans_TermSpans_ clucene-core-2.3.3.4/src/core/CLucene/store/000077500000000000000000000000001154025176300204225ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/store/Directory.cpp000066400000000000000000000036261154025176300231010ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Directory.h" #include "LockFactory.h" #include "CLucene/util/Misc.h" CL_NS_DEF(store) Directory::Directory(){ this->lockFactory = NULL; } Directory::~Directory(){ if (lockFactory != NULL) _CLDELETE(lockFactory); } LuceneLock* Directory::makeLock(const char* name) { return lockFactory->makeLock( name ); } void Directory::setLockFactory( LockFactory* lockFactory ) { this->lockFactory = lockFactory; lockFactory->setLockPrefix( getLockID().c_str() ); } LockFactory* Directory::getLockFactory() { return lockFactory; } string Directory::getLockID() { return toString(); } void Directory::clearLock(const char* name) { if ( lockFactory != NULL ) { lockFactory->clearLock( name ); } } bool Directory::deleteFile(const char* name, const bool throwError){ bool ret = doDeleteFile(name); if ( !ret && throwError ){ char buffer[200]; _snprintf(buffer,200,"couldn't delete %s",name); _CLTHROWA(CL_ERR_IO, buffer ); } return ret; } IndexInput* Directory::openInput(const char* name, int32_t bufferSize){ IndexInput* ret; CLuceneError err; if ( ! openInput(name, ret, err, bufferSize) ) throw err; return ret; } char** Directory::list() const{ vector names; list(&names); size_t size = names.size(); char** ret = _CL_NEWARRAY(char*,size+1); for ( size_t i=0;i& names) const{ return list(&names); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/Directory.h000066400000000000000000000067221154025176300225460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_Directory #define _lucene_store_Directory #include "CLucene/util/Equators.h" #include "CLucene/LuceneThreads.h" #include #include CL_CLASS_DEF(store,Lock) CL_CLASS_DEF(store,IndexInput) CL_CLASS_DEF(store,IndexOutput) CL_CLASS_DEF(store,LockFactory) CL_CLASS_DEF(store,LuceneLock) CL_NS_DEF(store) /** A Directory is a flat list of files. Files may be written once, when they * are created. Once a file is created it may only be opened for read, or * deleted. Random access is permitted both when reading and writing. * *

Direct i/o is not used directly, but rather all i/o is * through this API. This permits things such as:

    *
  • implementation of RAM-based indices; *
  • implementation indices stored in a database, via a database; *
  • implementation of an index as a single file; *
* */ class CLUCENE_EXPORT Directory: LUCENE_REFBASE, public CL_NS(util)::NamedObject { protected: LockFactory* lockFactory; Directory(); // Removes an existing file in the directory. virtual bool doDeleteFile(const char* name) = 0; public: DEFINE_MUTEX(THIS_LOCK) virtual ~Directory(); // Returns an null terminated array of strings, one for each file in the directory. char** list() const; virtual bool list(std::vector* names) const = 0; //todo: deprecate this... bool list(std::vector& names) const; // Returns true iff a file with the given name exists. virtual bool fileExists(const char* name) const = 0; // Returns the time the named file was last modified. virtual int64_t fileModified(const char* name) const = 0; // Returns the length of a file in the directory. virtual int64_t fileLength(const char* name) const = 0; // An advanced overload to avoid throwing an error. if result is false, error is filled with the reason virtual bool openInput(const char* name, IndexInput*& ret, CLuceneError& error, int32_t bufferSize = -1) = 0; // Returns a stream reading an existing file. IndexInput* openInput(const char* name, int32_t bufferSize=-1); /// Set the modified time of an existing file to now. */ virtual void touchFile(const char* name) = 0; // Removes an existing file in the directory. virtual bool deleteFile(const char* name, const bool throwError=true); // Renames an existing file in the directory. // If a file already exists with the new name, then it is replaced. // This replacement should be atomic. virtual void renameFile(const char* from, const char* to) = 0; // Creates a new, empty file in the directory with the given name. // Returns a stream writing this file. virtual IndexOutput* createOutput(const char* name) = 0; // Construct a {@link Lock}. // @param name the name of the lock file virtual LuceneLock* makeLock(const char* name); virtual void clearLock(const char* name); // Closes the store. virtual void close() = 0; virtual std::string toString() const = 0; void setLockFactory( LockFactory* lockFactory ); LockFactory* getLockFactory(); virtual std::string getLockID(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/FSDirectory.cpp000066400000000000000000000505131154025176300233270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include #ifdef _CL_HAVE_IO_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif #ifdef _CL_HAVE_DIRECT_H #include #endif #include #include #include "FSDirectory.h" #include "LockFactory.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/IndexWriter.h" #include "CLucene/util/Misc.h" #include "CLucene/util/_MD5Digester.h" #ifdef LUCENE_FS_MMAP #include "_MMapIndexInput.h" #endif CL_NS_DEF(store) CL_NS_USE(util) /** This cache of directories ensures that there is a unique Directory * instance per path, so that synchronization on the Directory can be used to * synchronize access between readers and writers. */ static CL_NS(util)::CLHashMap DIRECTORIES(false,false); STATIC_DEFINE_MUTEX(DIRECTORIES_LOCK) bool FSDirectory::disableLocks=false; class FSDirectory::FSIndexInput:public BufferedIndexInput { /** * We used a shared handle between all the fsindexinput clones. * This reduces number of file handles we need, and it means * we dont have to use file tell (which is slow) before doing * a read. * TODO: get rid of this and dup/fctnl or something like that... */ class SharedHandle: LUCENE_REFBASE{ public: int32_t fhandle; int64_t _length; int64_t _fpos; DEFINE_MUTEX(*SHARED_LOCK) char path[CL_MAX_DIR]; //todo: this is only used for cloning, better to get information from the fhandle SharedHandle(const char* path); ~SharedHandle(); }; SharedHandle* handle; int64_t _pos; FSIndexInput(SharedHandle* handle, int32_t __bufferSize): BufferedIndexInput(__bufferSize) { this->_pos = 0; this->handle = handle; }; protected: FSIndexInput(const FSIndexInput& clone); public: static bool open(const char* path, IndexInput*& ret, CLuceneError& error, int32_t bufferSize=-1); ~FSIndexInput(); IndexInput* clone() const; void close(); int64_t length() const { return handle->_length; } const char* getDirectoryType() const{ return FSDirectory::getClassName(); } const char* getObjectName() const{ return getClassName(); } static const char* getClassName() { return "FSIndexInput"; } protected: // Random-access methods void seekInternal(const int64_t position); // IndexInput methods void readInternal(uint8_t* b, const int32_t len); }; class FSDirectory::FSIndexOutput: public BufferedIndexOutput { private: int32_t fhandle; protected: // output methods: void flushBuffer(const uint8_t* b, const int32_t size); public: FSIndexOutput(const char* path, int filemode); ~FSIndexOutput(); // output methods: void close(); // Random-access methods void seek(const int64_t pos); int64_t length() const; }; bool FSDirectory::FSIndexInput::open(const char* path, IndexInput*& ret, CLuceneError& error, int32_t __bufferSize ) { //Func - Constructor. // Opens the file named path //Pre - path != NULL //Post - if the file could not be opened an exception is thrown. CND_PRECONDITION(path != NULL, "path is NULL"); if ( __bufferSize == -1 ) __bufferSize = CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE; SharedHandle* handle = _CLNEW SharedHandle(path); //Open the file handle->fhandle = ::_cl_open(path, _O_BINARY | O_RDONLY | _O_RANDOM, _S_IREAD ); //Check if a valid handle was retrieved if (handle->fhandle >= 0){ //Store the file length handle->_length = fileSize(handle->fhandle); if ( handle->_length == -1 ) error.set( CL_ERR_IO,"fileStat error" ); else{ handle->_fpos = 0; ret = _CLNEW FSIndexInput(handle, __bufferSize); return true; } }else{ int err = errno; if ( err == ENOENT ) error.set(CL_ERR_IO, "File does not exist"); else if ( err == EACCES ) error.set(CL_ERR_IO, "File Access denied"); else if ( err == EMFILE ) error.set(CL_ERR_IO, "Too many open files"); else error.set(CL_ERR_IO, "Could not open file"); } #ifndef _CL_DISABLE_MULTITHREADING delete handle->SHARED_LOCK; #endif _CLDECDELETE(handle); return false; } FSDirectory::FSIndexInput::FSIndexInput(const FSIndexInput& other): BufferedIndexInput(other){ //Func - Constructor // Uses clone for its initialization //Pre - clone is a valide instance of FSIndexInput //Post - The instance has been created and initialized by clone if ( other.handle == NULL ) _CLTHROWA(CL_ERR_NullPointer, "other handle is null"); SCOPED_LOCK_MUTEX(*other.handle->SHARED_LOCK) handle = _CL_POINTER(other.handle); _pos = other.handle->_fpos; //note where we are currently... } FSDirectory::FSIndexInput::SharedHandle::SharedHandle(const char* path){ fhandle = 0; _length = 0; _fpos = 0; strcpy(this->path,path); #ifndef _CL_DISABLE_MULTITHREADING SHARED_LOCK = new _LUCENE_THREADMUTEX; #endif } FSDirectory::FSIndexInput::SharedHandle::~SharedHandle() { if ( fhandle >= 0 ){ if ( ::_close(fhandle) != 0 ) _CLTHROWA(CL_ERR_IO, "File IO Close error"); else fhandle = -1; } } FSDirectory::FSIndexInput::~FSIndexInput(){ //Func - Destructor //Pre - True //Post - The file for which this instance is responsible has been closed. // The instance has been destroyed FSIndexInput::close(); } IndexInput* FSDirectory::FSIndexInput::clone() const { return _CLNEW FSDirectory::FSIndexInput(*this); } void FSDirectory::FSIndexInput::close() { BufferedIndexInput::close(); #ifndef _CL_DISABLE_MULTITHREADING if ( handle != NULL ){ //here we have a bit of a problem... we need to lock the handle to ensure that we can //safely delete the handle... but if we delete the handle, then the scoped unlock, //won't be able to unlock the mutex... //take a reference of the lock object... _LUCENE_THREADMUTEX* mutex = handle->SHARED_LOCK; //lock the mutex mutex->lock(); //determine if we are about to delete the handle... bool dounlock = ( _LUCENE_ATOMIC_INT_GET(handle->__cl_refcount) > 1 ); //decdelete (deletes if refcount is down to 0 _CLDECDELETE(handle); //printf("handle=%d\n", handle->__cl_refcount); if ( dounlock ){ mutex->unlock(); }else{ delete mutex; } } #else _CLDECDELETE(handle); #endif } void FSDirectory::FSIndexInput::seekInternal(const int64_t position) { CND_PRECONDITION(position>=0 &&position_length,"Seeking out of range") _pos = position; } /** IndexInput methods */ void FSDirectory::FSIndexInput::readInternal(uint8_t* b, const int32_t len) { CND_PRECONDITION(handle!=NULL,"shared file handle has closed"); CND_PRECONDITION(handle->fhandle>=0,"file is not open"); SCOPED_LOCK_MUTEX(*handle->SHARED_LOCK) if ( handle->_fpos != _pos ){ if ( fileSeek(handle->fhandle,_pos,SEEK_SET) != _pos ){ _CLTHROWA( CL_ERR_IO, "File IO Seek error"); } handle->_fpos = _pos; } bufferLength = _read(handle->fhandle,b,len); // 2004.10.31:SF 1037836 if (bufferLength == 0){ _CLTHROWA(CL_ERR_IO, "read past EOF"); } if (bufferLength == -1){ //if (EINTR == errno) we could do something else... but we have //to guarantee some return, or throw EOF _CLTHROWA(CL_ERR_IO, "read error"); } _pos+=bufferLength; handle->_fpos=_pos; } FSDirectory::FSIndexOutput::FSIndexOutput(const char* path, int filemode){ //O_BINARY - Opens file in binary (untranslated) mode //O_CREAT - Creates and opens new file for writing. Has no effect if file specified by filename exists //O_RANDOM - Specifies that caching is optimized for, but not restricted to, random access from disk. //O_WRONLY - Opens file for writing only; if ( filemode <= 0 ){ filemode = 0644; } if ( Misc::dir_Exists(path) ) fhandle = _cl_open( path, _O_BINARY | O_RDWR | _O_RANDOM | O_TRUNC, filemode); else // added by JBP fhandle = _cl_open( path, _O_BINARY | O_RDWR | _O_RANDOM | O_CREAT, filemode); if ( fhandle < 0 ){ int err = errno; if ( err == ENOENT ) _CLTHROWA(CL_ERR_IO, "File does not exist"); else if ( err == EACCES ) _CLTHROWA(CL_ERR_IO, "File Access denied"); else if ( err == EMFILE ) _CLTHROWA(CL_ERR_IO, "Too many open files"); } } FSDirectory::FSIndexOutput::~FSIndexOutput(){ if ( fhandle >= 0 ){ try { FSIndexOutput::close(); }catch(CLuceneError& err){ //ignore IO errors... if ( err.number() != CL_ERR_IO ) throw; } } } /** output methods: */ void FSDirectory::FSIndexOutput::flushBuffer(const uint8_t* b, const int32_t size) { CND_PRECONDITION(fhandle>=0,"file is not open"); if ( size > 0 && _write(fhandle,b,size) != size ) _CLTHROWA(CL_ERR_IO, "File IO Write error"); } void FSDirectory::FSIndexOutput::close() { try{ BufferedIndexOutput::close(); }catch(CLuceneError& err){ //ignore IO errors... if ( err.number() != CL_ERR_IO ) throw; } if ( ::_close(fhandle) != 0 ) _CLTHROWA(CL_ERR_IO, "File IO Close error"); else fhandle = -1; //-1 now indicates closed } void FSDirectory::FSIndexOutput::seek(const int64_t pos) { CND_PRECONDITION(fhandle>=0,"file is not open"); BufferedIndexOutput::seek(pos); int64_t ret = fileSeek(fhandle,pos,SEEK_SET); if ( ret != pos ){ _CLTHROWA(CL_ERR_IO, "File IO Seek error"); } } int64_t FSDirectory::FSIndexOutput::length() const { CND_PRECONDITION(fhandle>=0,"file is not open"); return fileSize(fhandle); } const char* FSDirectory::LOCK_DIR=NULL; const char* FSDirectory::getLockDir(){ #ifdef LUCENE_LOCK_DIR LOCK_DIR = LUCENE_LOCK_DIR; #else #ifdef LUCENE_LOCK_DIR_ENV_1 if ( LOCK_DIR == NULL ) LOCK_DIR = getenv(LUCENE_LOCK_DIR_ENV_1); #endif #ifdef LUCENE_LOCK_DIR_ENV_2 if ( LOCK_DIR == NULL ) LOCK_DIR = getenv(LUCENE_LOCK_DIR_ENV_2); #endif #ifdef LUCENE_LOCK_DIR_ENV_FALLBACK if ( LOCK_DIR == NULL ) LOCK_DIR=LUCENE_LOCK_DIR_ENV_FALLBACK; #endif if ( LOCK_DIR == NULL ) _CLTHROWA(CL_ERR_IO, "Couldn't get determine lock dir"); #endif return LOCK_DIR; } FSDirectory::FSDirectory(): Directory(), refCount(0), useMMap(LUCENE_USE_MMAP) { filemode = 0644; this->lockFactory = NULL; } void FSDirectory::init(const char* _path, LockFactory* lockFactory) { directory = _path; bool doClearLockID = false; if ( lockFactory == NULL ) { if ( disableLocks ) { lockFactory = NoLockFactory::getNoLockFactory(); } else { lockFactory = _CLNEW FSLockFactory( directory.c_str(), this->filemode ); doClearLockID = true; } } setLockFactory( lockFactory ); if ( doClearLockID ) { lockFactory->setLockPrefix(NULL); } if (!Misc::dir_Exists(directory.c_str())){ char* err = _CL_NEWARRAY(char,19+directory.length()+1); //19: len of " is not a directory" strcpy(err,directory.c_str()); strcat(err," is not a directory"); _CLTHROWA_DEL(CL_ERR_IO, err ); } } void FSDirectory::create(){ SCOPED_LOCK_MUTEX(THIS_LOCK) //clear old files vector files; Misc::listFiles(directory.c_str(), files, false); vector::iterator itr = files.begin(); while ( itr != files.end() ){ if ( CL_NS(index)::IndexReader::isLuceneFile(itr->c_str()) ){ if ( _unlink( (directory + PATH_DELIMITERA + *itr).c_str() ) == -1 ) { _CLTHROWA(CL_ERR_IO, "Couldn't delete file "); //todo: make richer error } } itr++; } lockFactory->clearLock( CL_NS(index)::IndexWriter::WRITE_LOCK_NAME ); } void FSDirectory::priv_getFN(char* buffer, const char* name) const{ buffer[0] = 0; strcpy(buffer,directory.c_str()); strcat(buffer, PATH_DELIMITERA ); strcat(buffer,name); } FSDirectory::~FSDirectory(){ } void FSDirectory::setFileMode(int mode){ this->filemode = mode; } int FSDirectory::getFileMode(){ return this->filemode; } void FSDirectory::setUseMMap(bool value){ useMMap = value; } bool FSDirectory::getUseMMap() const{ return useMMap; } const char* FSDirectory::getClassName(){ return "FSDirectory"; } const char* FSDirectory::getObjectName() const{ return getClassName(); } void FSDirectory::setDisableLocks(bool doDisableLocks) { disableLocks = doDisableLocks; } bool FSDirectory::getDisableLocks() { return disableLocks; } bool FSDirectory::list(vector* names) const{ //todo: fix this, ugly!!! CND_PRECONDITION(!directory.empty(),"directory is not open"); return Misc::listFiles(directory.c_str(), *names, false); } bool FSDirectory::fileExists(const char* name) const { CND_PRECONDITION(directory[0]!=0,"directory is not open"); char fl[CL_MAX_DIR]; priv_getFN(fl, name); return Misc::dir_Exists( fl ); } const char* FSDirectory::getDirName() const{ return directory.c_str(); } FSDirectory* FSDirectory::getDirectory(const char* file, bool create, LockFactory* lockFactory){ FSDirectory* dir = getDirectory(file, (LockFactory*)NULL); // This is now deprecated (creation should only be done // by IndexWriter): if (create) { dir->create(); } return dir; } //static FSDirectory* FSDirectory::getDirectory(const char* _file, LockFactory* lockFactory){ FSDirectory* dir = NULL; { if ( !_file || !*_file ) _CLTHROWA(CL_ERR_IO,"Invalid directory"); char buf[CL_MAX_PATH]; char* file = _realpath(_file,buf);//set a realpath so that if we change directory, we can still function if ( !file || !*file ){ strncpy(buf, _file, CL_MAX_PATH); file = buf; } struct cl_stat_t fstat; if ( fileStat(file,&fstat) == 0 && !(fstat.st_mode & S_IFDIR) ){ char tmp[1024]; _snprintf(tmp,1024,"%s not a directory", file); _CLTHROWA(CL_ERR_IO,tmp); } if ( fileStat(file,&fstat) != 0 ) { //todo: should construct directory using _mkdirs... have to write replacement if ( _mkdir(file) == -1 ){ string err = "Couldn't create directory: "; err += string(file); _CLTHROWA(CL_ERR_IO, err.c_str() ); } } SCOPED_LOCK_MUTEX(DIRECTORIES_LOCK) dir = DIRECTORIES.get(file); if ( dir == NULL ){ dir = _CLNEW FSDirectory(); dir->init(_file,lockFactory); DIRECTORIES.put( dir->directory.c_str(), dir); } else { if ( lockFactory != NULL && lockFactory != dir->getLockFactory() ) { _CLTHROWA(CL_ERR_IO,"Directory was previously created with a different LockFactory instance, please pass NULL as the lockFactory instance and use setLockFactory to change it"); } } { SCOPED_LOCK_MUTEX(dir->THIS_LOCK) dir->refCount++; } } return _CL_POINTER(dir); // TODO: Isn't this a double ref increment? } int64_t FSDirectory::fileModified(const char* name) const { CND_PRECONDITION(directory[0]!=0,"directory is not open"); struct cl_stat_t buf; char buffer[CL_MAX_DIR]; priv_getFN(buffer,name); if (fileStat( buffer, &buf ) == -1 ) return 0; else return buf.st_mtime; } //static int64_t FSDirectory::fileModified(const char* dir, const char* name){ struct cl_stat_t buf; char buffer[CL_MAX_DIR]; _snprintf(buffer,CL_MAX_DIR,"%s%s%s",dir,PATH_DELIMITERA,name); fileStat( buffer, &buf ); return buf.st_mtime; } void FSDirectory::touchFile(const char* name){ CND_PRECONDITION(directory[0]!=0,"directory is not open"); char buffer[CL_MAX_DIR]; _snprintf(buffer,CL_MAX_DIR,"%s%s%s",directory.c_str(),PATH_DELIMITERA,name); int32_t r = _cl_open(buffer, O_RDWR, this->filemode); if ( r < 0 ) _CLTHROWA(CL_ERR_IO,"IO Error while touching file"); ::_close(r); } int64_t FSDirectory::fileLength(const char* name) const { CND_PRECONDITION(directory[0]!=0,"directory is not open"); struct cl_stat_t buf; char buffer[CL_MAX_DIR]; priv_getFN(buffer,name); if ( fileStat( buffer, &buf ) == -1 ) return 0; else return buf.st_size; } bool FSDirectory::openInput(const char * name, IndexInput *& ret, CLuceneError& error, int32_t bufferSize) { CND_PRECONDITION(directory[0]!=0,"directory is not open") char fl[CL_MAX_DIR]; priv_getFN(fl, name); #ifdef LUCENE_FS_MMAP //todo: do some tests here... like if the file //is >2gb, then some system cannot mmap the file //also some file systems mmap will fail?? could detect here too if ( useMMap && Misc::file_Size(fl) < LUCENE_INT32_MAX_SHOULDBE ) //todo: would this be bigger on 64bit systems?. i suppose it would be...test first return MMapIndexInput::open( fl, ret, error, bufferSize ); else #endif return FSIndexInput::open( fl, ret, error, bufferSize ); } void FSDirectory::close(){ SCOPED_LOCK_MUTEX(DIRECTORIES_LOCK) { THIS_LOCK.lock(); CND_PRECONDITION(directory[0]!=0,"directory is not open"); if (--refCount <= 0 ) {//refcount starts at 1 Directory* dir = DIRECTORIES.get(getDirName()); if(dir){ DIRECTORIES.remove( getDirName() ); //this will be removed in ~FSDirectory _CLDECDELETE(dir); //NOTE: Don't unlock the mutex, since it has been destroyed now... return; } } THIS_LOCK.unlock(); } } /** * So we can do some byte-to-hexchar conversion below */ char HEX_DIGITS[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; char* FSDirectory::getLockPrefix() const{ char dirName[CL_MAX_PATH]; // name to be hashed if ( _realpath(directory.c_str(),dirName) == NULL ){ _CLTHROWA(CL_ERR_Runtime,"Invalid directory path"); } //to make a compatible name with jlucene, we need to make some changes... if ( dirName[1] == ':' ) dirName[0] = (char)_totupper((char)dirName[0]); char* smd5 = MD5String(dirName); char* ret=_CL_NEWARRAY(char,32+7+1); //32=2*16, 7=strlen("lucene-") strcpy(ret,"lucene-"); strcat(ret,smd5); _CLDELETE_CaARRAY(smd5); return ret; } bool FSDirectory::doDeleteFile(const char* name) { CND_PRECONDITION(directory[0]!=0,"directory is not open"); char fl[CL_MAX_DIR]; priv_getFN(fl, name); return _unlink(fl) != -1; } void FSDirectory::renameFile(const char* from, const char* to){ CND_PRECONDITION(directory[0]!=0,"directory is not open"); SCOPED_LOCK_MUTEX(THIS_LOCK) char old[CL_MAX_DIR]; priv_getFN(old, from); char nu[CL_MAX_DIR]; priv_getFN(nu, to); /* This is not atomic. If the program crashes between the call to delete() and the call to renameTo() then we're screwed, but I've been unable to figure out how else to do this... */ if ( Misc::dir_Exists(nu) ){ //we run this sequence of unlinking an arbitary 100 times //on some platforms (namely windows), there can be a //delay between unlink and dir_exists==false if( Misc::file_Unlink( nu ) == -1 ) { char* err = _CL_NEWARRAY(char,16+strlen(to)+1); //16: len of "couldn't delete " strcpy(err,"couldn't delete "); strcat(err,to); _CLTHROWA_DEL(CL_ERR_IO, err ); } } if ( _rename(old,nu) != 0 ){ //todo: jlucene has some extra rename code - if the rename fails, it copies //the whole file to the new file... might want to implement that if renaming //fails on some platforms char buffer[20+CL_MAX_PATH+CL_MAX_PATH]; strcpy(buffer,"couldn't rename "); strcat(buffer,from); strcat(buffer," to "); strcat(buffer,nu); _CLTHROWA(CL_ERR_IO, buffer ); } } IndexOutput* FSDirectory::createOutput(const char* name) { CND_PRECONDITION(directory[0]!=0,"directory is not open"); char fl[CL_MAX_DIR]; priv_getFN(fl, name); if ( Misc::dir_Exists(fl) ){ if ( Misc::file_Unlink( fl, 1 ) == -1 ) { char tmp[1024]; strcpy(tmp, "Cannot overwrite: "); strcat(tmp, name); _CLTHROWA(CL_ERR_IO, tmp); } assert( ! Misc::dir_Exists(fl) ); } return _CLNEW FSIndexOutput( fl, this->filemode ); } string FSDirectory::toString() const{ return string("FSDirectory@") + this->directory; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/FSDirectory.h000066400000000000000000000122471154025176300227760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_FSDirectory_ #define _lucene_store_FSDirectory_ #include "Directory.h" #include "IndexInput.h" #include "IndexOutput.h" #include #include CL_CLASS_DEF(util,StringBuffer) CL_NS_DEF(store) /** * Straightforward implementation of {@link lucene::store::Directory} as a directory of files. *

If the system property 'disableLuceneLocks' has the String value of * "true", lock creation will be disabled. * * @see Directory */ class CLUCENE_EXPORT FSDirectory:public Directory{ private: class FSIndexOutput; class FSIndexInput; friend class FSDirectory::FSIndexOutput; friend class FSDirectory::FSIndexInput; int filemode; protected: FSDirectory(); virtual void init(const char* path, LockFactory* lockFactory = NULL); void priv_getFN(char* buffer, const char* name) const; private: std::string directory; int refCount; void create(); static const char* LOCK_DIR; static const char* getLockDir(); char* getLockPrefix() const; static bool disableLocks; bool useMMap; protected: /// Removes an existing file in the directory. bool doDeleteFile(const char* name); public: ///Destructor - only call this if you are sure the directory ///is not being used anymore. Otherwise use the ref-counting ///facilities of _CLDECDELETE virtual ~FSDirectory(); /// Get a list of strings, one for each file in the directory. bool list(std::vector* names) const; /// Returns true iff a file with the given name exists. bool fileExists(const char* name) const; /// Returns the text name of the directory const char* getDirName() const; ///Directories are cached, so that, for a given canonical path, the same FSDirectory instance will always be returned. This permits synchronization on directories. @param file the path to the directory. @param create if true, create, or erase any existing contents. @return the FSDirectory for the named file. */ static FSDirectory* getDirectory(const char* file, LockFactory* lockFactory=NULL); /// Returns the time the named file was last modified. int64_t fileModified(const char* name) const; //static /// Returns the time the named file was last modified. static int64_t fileModified(const char* dir, const char* name); //static /// Returns the length in bytes of a file in the directory. int64_t fileLength(const char* name) const; /// Returns a stream reading an existing file. virtual bool openInput(const char* name, IndexInput*& ret, CLuceneError& err, int32_t bufferSize = -1); /// Renames an existing file in the directory. void renameFile(const char* from, const char* to); /** Set the modified time of an existing file to now. */ void touchFile(const char* name); /// Creates a new, empty file in the directory with the given name. /// Returns a stream writing this file. virtual IndexOutput* createOutput(const char* name); ///Decrease the ref-count to the directory by one. If ///the object is no longer needed, then the object is ///removed from the directory pool. void close(); /** * If MMap is available, this can disable use of * mmap reading. */ void setUseMMap(bool value); /** * Gets whether the directory is using MMap for inputstreams. */ bool getUseMMap() const; std::string toString() const; static const char* getClassName(); const char* getObjectName() const; /** * Set whether Lucene's use of lock files is disabled. By default, * lock files are enabled. They should only be disabled if the index * is on a read-only medium like a CD-ROM. */ static void setDisableLocks(bool doDisableLocks); /** * Returns whether Lucene's use of lock files is disabled. * @return true if locks are disabled, false if locks are enabled. */ static bool getDisableLocks(); /** * Sets the file mode for new files. This is passed to new output streams * and to the lock factory. The mode should be a valid octal file mode for * the 3rd parameter of the file open function (such as 0644) * * Tip: _tcstoi64(_T("644"), NULL, 8) is also a valid way of * creating a file mode */ void setFileMode(int mode); /** * Gets the file mode for new files */ int getFileMode(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/IndexInput.cpp000066400000000000000000000205221154025176300232160ustar00rootroot00000000000000 /*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexInput.h" #include "IndexOutput.h" #include "CLucene/util/Misc.h" CL_NS_DEF(store) CL_NS_USE(util) IndexInput::IndexInput(): NamedObject() { } IndexInput::~IndexInput() { } IndexInput::IndexInput(const IndexInput& /*other*/) { } int32_t IndexInput::readInt() { int32_t b = (readByte() << 24); b |= (readByte() << 16); b |= (readByte() << 8); return (b | readByte()); } int32_t IndexInput::readVInt() { uint8_t b = readByte(); int32_t i = b & 0x7F; for (int32_t shift = 7; (b & 0x80) != 0; shift += 7) { b = readByte(); i |= (b & 0x7F) << shift; } return i; } int64_t IndexInput::readLong() { int64_t i = ((int64_t)readInt() << 32); return (i | ((int64_t)readInt() & 0xFFFFFFFFL)); } int64_t IndexInput::readVLong() { uint8_t b = readByte(); int64_t i = b & 0x7F; for (int32_t shift = 7; (b & 0x80) != 0; shift += 7) { b = readByte(); i |= (((int64_t)b) & 0x7FL) << shift; } return i; } void IndexInput::skipChars( const int32_t count) { for (int32_t i = 0; i < count; i++) { TCHAR b = readByte(); if ((b & 0x80) == 0) { // Do Nothing. } else if ((b & 0xE0) != 0xE0) { readByte(); } else { readByte(); readByte(); } } } #ifdef _UCS2 int32_t IndexInput::readString(char* buffer, const int32_t maxLength){ TCHAR* buf = _CL_NEWARRAY(TCHAR,maxLength); int32_t ret = -1; try{ ret = readString(buf,maxLength); STRCPY_TtoA(buffer,buf,ret+1); }_CLFINALLY ( _CLDELETE_CARRAY(buf); ) return ret; } #endif int32_t IndexInput::readString(TCHAR* buffer, const int32_t maxLength){ int32_t len = readVInt(); int32_t ml=maxLength-1; if ( len >= ml ){ readChars(buffer, 0, ml); buffer[ml] = 0; //we have to finish reading all the data for this string! if ( len-ml > 0 ){ //seek(getFilePointer()+(len-ml)); <- that was the wrong way to "finish reading" skipChars(len-ml); } return ml; }else{ readChars(buffer, 0, len); buffer[len] = 0; return len; } } TCHAR* IndexInput::readString(){ int32_t len = readVInt(); if ( len == 0){ return stringDuplicate(LUCENE_BLANK_STRING); } TCHAR* ret = _CL_NEWARRAY(TCHAR,len+1); readChars(ret, 0, len); ret[len] = 0; return ret; } void IndexInput::readBytes( uint8_t* b, const int32_t len, bool /*useBuffer*/) { // Default to ignoring useBuffer entirely readBytes(b, len); } void IndexInput::readChars( TCHAR* buffer, const int32_t start, const int32_t len) { const int32_t end = start + len; TCHAR b; for (int32_t i = start; i < end; ++i) { b = readByte(); if ((b & 0x80) == 0) { b = (b & 0x7F); } else if ((b & 0xE0) != 0xE0) { b = (((b & 0x1F) << 6) | (readByte() & 0x3F)); } else { b = ((b & 0x0F) << 12) | ((readByte() & 0x3F) << 6); b |= (readByte() & 0x3F); } buffer[i] = b; } } BufferedIndexInput::BufferedIndexInput(int32_t _bufferSize): buffer(NULL), bufferSize(_bufferSize>=0?_bufferSize:CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE), bufferStart(0), bufferLength(0), bufferPosition(0) { } BufferedIndexInput::BufferedIndexInput(const BufferedIndexInput& other): IndexInput(other), buffer(NULL), bufferSize(other.bufferSize), bufferStart(other.bufferStart), bufferLength(other.bufferLength), bufferPosition(other.bufferPosition) { /* DSR: Does the fact that sometime clone.buffer is not NULL even when ** clone.bufferLength is zero indicate memory corruption/leakage? ** if ( clone.buffer != NULL) { */ if (other.bufferLength != 0 && other.buffer != NULL) { buffer = _CL_NEWARRAY(uint8_t,bufferLength); memcpy(buffer,other.buffer,bufferLength * sizeof(uint8_t)); } } const char* BufferedIndexInput::getObjectName(){ return getClassName(); } const char* BufferedIndexInput::getClassName(){ return "BufferedIndexInput"; } void BufferedIndexInput::readBytes(uint8_t* b, const int32_t len){ readBytes(b, len, true); } void BufferedIndexInput::readBytes(uint8_t* _b, const int32_t _len, bool useBuffer){ int32_t len = _len; uint8_t* b = _b; if(len <= (bufferLength-bufferPosition)){ // the buffer contains enough data to satisfy this request if(len>0) // to allow b to be null if len is 0... memcpy(b, buffer + bufferPosition, len); bufferPosition+=len; } else { // the buffer does not have enough data. First serve all we've got. int32_t available = bufferLength - bufferPosition; if(available > 0){ memcpy(b, buffer + bufferPosition, available); b += available; len -= available; bufferPosition += available; } // and now, read the remaining 'len' bytes: if (useBuffer && len length()) _CLTHROWA(CL_ERR_IO, "read past EOF"); readInternal(b, len); bufferStart = after; bufferPosition = 0; bufferLength = 0; // trigger refill() on read } } } int64_t BufferedIndexInput::getFilePointer() const{ return bufferStart + bufferPosition; } void BufferedIndexInput::seek(const int64_t pos) { if ( pos < 0 ) _CLTHROWA(CL_ERR_IO, "IO Argument Error. Value must be a positive value."); if (pos >= bufferStart && pos < (bufferStart + bufferLength)) bufferPosition = (int32_t)(pos - bufferStart); // seek within buffer else { bufferStart = pos; bufferPosition = 0; bufferLength = 0; // trigger refill() on read() seekInternal(pos); } } void BufferedIndexInput::close(){ _CLDELETE_ARRAY(buffer); bufferLength = 0; bufferPosition = 0; bufferStart = 0; } BufferedIndexInput::~BufferedIndexInput(){ BufferedIndexInput::close(); } void BufferedIndexInput::refill() { int64_t start = bufferStart + bufferPosition; int64_t end = start + bufferSize; if (end > length()) // don't read past EOF end = length(); bufferLength = (int32_t)(end - start); if (bufferLength <= 0) _CLTHROWA(CL_ERR_IO, "IndexInput read past EOF"); if (buffer == NULL){ buffer = _CL_NEWARRAY(uint8_t,bufferSize); // allocate buffer lazily } readInternal(buffer, bufferLength); bufferStart = start; bufferPosition = 0; } void BufferedIndexInput::setBufferSize( int32_t newSize ) { if ( newSize != bufferSize ) { bufferSize = newSize; if ( buffer != NULL ) { uint8_t* newBuffer = _CL_NEWARRAY( uint8_t, newSize ); int32_t leftInBuffer = bufferLength - bufferPosition; int32_t numToCopy; if ( leftInBuffer > newSize ) { numToCopy = newSize; } else { numToCopy = leftInBuffer; } memcpy( (void*)newBuffer, (void*)(buffer + bufferPosition), numToCopy ); bufferStart += bufferPosition; bufferPosition = 0; bufferLength = numToCopy; _CLDELETE_ARRAY( buffer ); buffer = newBuffer; } } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/IndexInput.h000066400000000000000000000150131154025176300226620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_IndexInput_ #define _lucene_store_IndexInput_ #include "CLucene/LuceneThreads.h" #include "CLucene/util/Equators.h" CL_NS_DEF(store) /** Abstract base class for input from a file in a {@link lucene::store::Directory}. A * random-access input stream. Used for all Lucene index input operations. * @see Directory * @see IndexOutput */ class CLUCENE_EXPORT IndexInput: LUCENE_BASE, public CL_NS(util)::NamedObject { protected: IndexInput(); IndexInput(const IndexInput& clone); public: virtual ~IndexInput(); virtual IndexInput* clone() const =0; DEFINE_MUTEX(THIS_LOCK) /** Reads and returns a single byte. * @see IndexOutput#writeByte(byte) */ virtual uint8_t readByte() =0; /** Reads a specified number of bytes into an array at the specified offset. * @param b the array to read bytes into * @param offset the offset in the array to start storing bytes * @param len the number of bytes to read * @see IndexOutput#writeBytes(byte[],int) */ virtual void readBytes(uint8_t* b, const int32_t len) = 0; /** Reads a specified number of bytes into an array at the * specified offset with control over whether the read * should be buffered (callers who have their own buffer * should pass in "false" for useBuffer). Currently only * {@link BufferedIndexInput} respects this parameter. * @param b the array to read bytes into * @param offset the offset in the array to start storing bytes * @param len the number of bytes to read * @param useBuffer set to false if the caller will handle * buffering. * @see IndexOutput#writeBytes(byte[],int32_t) */ virtual void readBytes(uint8_t* b, const int32_t len, bool useBuffer); /** Reads four bytes and returns an int. * @see IndexOutput#writeInt(int32_t) */ int32_t readInt(); /** Reads an int stored in variable-length format. Reads between one and * five bytes. Smaller values take fewer bytes. Negative numbers are not * supported. * @see IndexOutput#writeVInt(int32_t) */ virtual int32_t readVInt(); /** Reads eight bytes and returns a long. * @see IndexOutput#writeLong(long) */ int64_t readLong(); /** Reads a long stored in variable-length format. Reads between one and * nine bytes. Smaller values take fewer bytes. Negative numbers are not * supported. */ int64_t readVLong(); /** Reads a string * @see IndexOutput#writeString(String) * maxLength is the amount read into the buffer, the whole string is still read from the stream * returns the amount read */ int32_t readString(TCHAR* buffer, const int32_t maxlength); #ifdef _UCS2 /** Reads a string and converts to ascii. * @see IndexOutput#writeString(String) * maxLength is the amount read into the buffer, the whole string is still read from the stream * returns the amount read */ int32_t readString(char* buffer, const int32_t maxlength); #endif /** Reads a string. * @see IndexOutput#writeString(String) */ TCHAR* readString(); /** Reads UTF-8 encoded characters into an array. * @param buffer the array to read characters into * @param start the offset in the array to start storing characters * @param length the number of characters to read * @see IndexOutput#writeChars(String,int32_t,int32_t) */ void readChars( TCHAR* buffer, const int32_t start, const int32_t len); void skipChars( const int32_t count); /** Closes the stream to futher operations. */ virtual void close() =0; /** Returns the current position in this file, where the next read will * occur. * @see #seek(int64_t) */ virtual int64_t getFilePointer() const =0; /** Sets current position in this file, where the next read will occur. * @see #getFilePointer() */ virtual void seek(const int64_t pos) =0; /** The number of bytes in the file. */ virtual int64_t length() const = 0; virtual const char* getDirectoryType() const = 0; virtual const char* getObjectName() const = 0; }; /** Abstract base class for input from a file in a {@link Directory}. A * random-access input stream. Used for all Lucene index input operations. * @see Directory * @see IndexOutput */ class CLUCENE_EXPORT BufferedIndexInput: public IndexInput{ private: uint8_t* buffer; //array of bytes void refill(); protected: int32_t bufferSize; //size of the buffer int64_t bufferStart; // position in file of buffer int32_t bufferLength; // end of valid l_byte_ts int32_t bufferPosition; // next uint8_t to read /** Returns a clone of this stream. * *

Clones of a stream access the same data, and are positioned at the same * point as the stream they were cloned from. * *

Expert: Subclasses must ensure that clones may be positioned at * different points in the input from each other and from the stream they * were cloned from. */ BufferedIndexInput(const BufferedIndexInput& clone); BufferedIndexInput(int32_t bufferSize = -1); public: LUCENE_STATIC_CONSTANT(int32_t, BUFFER_SIZE=LUCENE_STREAM_BUFFER_SIZE); virtual ~BufferedIndexInput(); virtual IndexInput* clone() const = 0; void close(); inline uint8_t readByte(){ if (bufferPosition >= bufferLength) refill(); return buffer[bufferPosition++]; } void readBytes(uint8_t* b, const int32_t len); void readBytes(uint8_t* b, const int32_t len, bool useBuffer); int64_t getFilePointer() const; void seek(const int64_t pos); void setBufferSize( int32_t newSize ); const char* getObjectName(); static const char* getClassName(); protected: /** Expert: implements buffer refill. Reads bytes from the current position * in the input. * @param b the array to read bytes into * @param offset the offset in the array to start storing bytes * @param length the number of bytes to read */ virtual void readInternal(uint8_t* b, const int32_t len) = 0; /** Expert: implements seek. Sets current position in this file, where the * next {@link #readInternal(byte[],int32_t,int32_t)} will occur. * @see #readInternal(byte[],int32_t,int32_t) */ virtual void seekInternal(const int64_t pos) = 0; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/IndexOutput.cpp000066400000000000000000000124711154025176300234230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "IndexOutput.h" #include "IndexInput.h" #include "CLucene/util/Misc.h" CL_NS_USE(util) CL_NS_DEF(store) IndexOutput::IndexOutput() { copyBuffer = NULL; } IndexOutput::~IndexOutput(){ _CLDELETE_LARRAY(copyBuffer); } BufferedIndexOutput::BufferedIndexOutput() { buffer = _CL_NEWARRAY(uint8_t, BUFFER_SIZE ); bufferStart = 0; bufferPosition = 0; } BufferedIndexOutput::~BufferedIndexOutput(){ if ( buffer != NULL ) close(); } void BufferedIndexOutput::close(){ flush(); _CLDELETE_ARRAY( buffer ); bufferStart = 0; bufferPosition = 0; } void BufferedIndexOutput::writeByte(const uint8_t b) { CND_PRECONDITION(buffer!=NULL,"IndexOutput is closed") if (bufferPosition >= BUFFER_SIZE) flush(); buffer[bufferPosition++] = b; } void BufferedIndexOutput::writeBytes(const uint8_t* b, const int32_t length) { if ( length < 0 ) _CLTHROWA(CL_ERR_IllegalArgument, "IO Argument Error. Value must be a positive value."); int32_t bytesLeft = BUFFER_SIZE - bufferPosition; // is there enough space in the buffer? if (bytesLeft >= length) { // we add the data to the end of the buffer memcpy(buffer + bufferPosition, b, length); bufferPosition += length; // if the buffer is full, flush it if (BUFFER_SIZE - bufferPosition == 0) flush(); } else { // is data larger then buffer? if (length > BUFFER_SIZE) { // we flush the buffer if (bufferPosition > 0) flush(); // and write data at once flushBuffer(b, length); bufferStart += length; } else { // we fill/flush the buffer (until the input is written) int64_t pos = 0; // position in the input data int32_t pieceLength; while (pos < length) { if ( length - pos < bytesLeft ) pieceLength = (int32_t)(length - pos); else pieceLength = bytesLeft; memcpy(buffer + bufferPosition, b + pos, pieceLength); pos += pieceLength; bufferPosition += pieceLength; // if the buffer is full, flush it bytesLeft = BUFFER_SIZE - bufferPosition; if (bytesLeft == 0) { flush(); bytesLeft = BUFFER_SIZE; } } } } } void IndexOutput::writeInt(const int32_t i) { writeByte((uint8_t)(i >> 24)); writeByte((uint8_t)(i >> 16)); writeByte((uint8_t)(i >> 8)); writeByte((uint8_t) i); } void IndexOutput::writeVInt(const int32_t vi) { uint32_t i = vi; while ((i & ~0x7F) != 0) { writeByte((uint8_t)((i & 0x7f) | 0x80)); i >>= 7; //doing unsigned shift } writeByte( (uint8_t)i ); } void IndexOutput::writeLong(const int64_t i) { writeInt((int32_t) (i >> 32)); writeInt((int32_t) i); } void IndexOutput::writeVLong(const int64_t vi) { uint64_t i = vi; while ((i & ~0x7F) != 0) { writeByte((uint8_t)((i & 0x7f) | 0x80)); i >>= 7; //doing unsigned shift } writeByte((uint8_t)i); } void IndexOutput::writeString(const string& s ) { writeString(s.c_str(),s.length()); } #ifdef _UCS2 void IndexOutput::writeString(const char* s, const int32_t length ) { TCHAR* buf = _CL_NEWARRAY(TCHAR,length+1); STRCPY_AtoT(buf,s,length); try{ writeString(buf,length); }_CLFINALLY ( _CLDELETE_CARRAY(buf); ) } #endif void IndexOutput::writeString(const TCHAR* s, const int32_t length ) { writeVInt(length); writeChars(s, length); } void IndexOutput::writeChars(const TCHAR* s, const int32_t length){ if ( length < 0 ) _CLTHROWA(CL_ERR_IllegalArgument, "IO Argument Error. Value must be a positive value."); const int32_t end = length; for (int32_t i = 0; i < end; ++i) { const int32_t code = (int32_t)s[i]; if (code >= 0x01 && code <= 0x7F) writeByte((uint8_t)code); else if (((code >= 0x80) && (code <= 0x7FF)) || code == 0) { writeByte((uint8_t)(0xC0 | (code >> 6))); writeByte((uint8_t)(0x80 | (code & 0x3F))); } else { writeByte((uint8_t)(0xE0 | (((uint32_t)code) >> 12))); //unsigned shift writeByte((uint8_t)(0x80 | ((code >> 6) & 0x3F))); writeByte((uint8_t)(0x80 | (code & 0x3F))); } } } int64_t BufferedIndexOutput::getFilePointer() const{ return bufferStart + bufferPosition; } void IndexOutput::copyBytes(CL_NS(store)::IndexInput* input, int64_t numBytes) { int64_t left = numBytes; if (copyBuffer == NULL) copyBuffer = _CL_NEWARRAY(uint8_t, COPY_BUFFER_SIZE); while(left > 0) { int32_t toCopy; if (left > COPY_BUFFER_SIZE) toCopy = COPY_BUFFER_SIZE; else toCopy = (int32_t) left; input->readBytes(copyBuffer, toCopy); writeBytes(copyBuffer, toCopy); left -= toCopy; } } void BufferedIndexOutput::seek(const int64_t pos) { flush(); bufferStart = pos; } void BufferedIndexOutput::flush() { flushBuffer(buffer, bufferPosition); bufferStart += bufferPosition; bufferPosition = 0; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/IndexOutput.h000066400000000000000000000111561154025176300230670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_IndexOutput_ #define _lucene_store_IndexOutput_ CL_NS_DEF(store) class IndexInput; /** Abstract class for output to a file in a Directory. A random-access output * stream. Used for all Lucene index output operations. * @see Directory * @see IndexInput */ class CLUCENE_EXPORT IndexOutput:LUCENE_BASE{ bool isclosed; public: IndexOutput(); virtual ~IndexOutput(); /** Writes a single byte. * @see IndexInput#readByte() */ virtual void writeByte(const uint8_t b) = 0; /** Writes an array of bytes. * @param b the bytes to write * @param length the number of bytes to write * @see IndexInput#readBytes(uint8_t*,int32_t) */ virtual void writeBytes(const uint8_t* b, const int32_t length) = 0; /** Writes an int as four bytes. * @see IndexInput#readInt() */ void writeInt(const int32_t i); /** Writes an int in a variable-length format. Writes between one and * five bytes. Smaller values take fewer bytes. Negative numbers are not * supported. * @see IndexInput#readVInt() */ void writeVInt(const int32_t vi); /** Writes a long as eight bytes. * @see IndexInput#readLong() */ void writeLong(const int64_t i); /** Writes an long in a variable-length format. Writes between one and five * bytes. Smaller values take fewer bytes. Negative numbers are not * supported. * @see IndexInput#readVLong() */ void writeVLong(const int64_t vi); /** Writes a string. * @see IndexInput#readString() */ void writeString(const TCHAR* s, const int32_t length); void writeString(const std::string& s); #ifdef _UCS2 /** Writes an ascii string. converts to TCHAR* before writing * @see IndexInput#readString() */ void writeString(const char* s, const int32_t length); #endif /** Writes a sequence of UTF-8 encoded characters from a string. * @param s the source of the characters * @param start the first character in the sequence * @param length the number of characters in the sequence * @see IndexInput#readChars(char[],int32_t,int32_t) */ void writeChars(const TCHAR* s, const int32_t length); /** Closes this stream to further operations. */ virtual void close() = 0; /** Returns the current position in this file, where the next write will * occur. * @see #seek(long) */ virtual int64_t getFilePointer() const = 0; /** Sets current position in this file, where the next write will occur. * @see #getFilePointer() */ virtual void seek(const int64_t pos) = 0; /** The number of bytes in the file. */ virtual int64_t length() const = 0; /** Forces any buffered output to be written. */ virtual void flush() = 0; private: LUCENE_STATIC_CONSTANT(int32_t, COPY_BUFFER_SIZE = 16384); uint8_t* copyBuffer; public: /** Copy numBytes bytes from input to ourself. */ void copyBytes(CL_NS(store)::IndexInput* input, int64_t numBytes); }; /** Base implementation class for buffered {@link IndexOutput}. */ class CLUCENE_EXPORT BufferedIndexOutput : public IndexOutput{ public: LUCENE_STATIC_CONSTANT(int32_t, BUFFER_SIZE=16384); private: uint8_t* buffer; int64_t bufferStart; // position in file of buffer int32_t bufferPosition; // position in buffer public: BufferedIndexOutput(); virtual ~BufferedIndexOutput(); /** Writes a single byte. * @see IndexInput#readByte() */ virtual void writeByte(const uint8_t b); /** Writes an array of bytes. * @param b the bytes to write * @param length the number of bytes to write * @see IndexInput#readBytes(byte[],int32_t,int32_t) */ virtual void writeBytes(const uint8_t* b, const int32_t length); /** Closes this stream to further operations. */ virtual void close(); /** Returns the current position in this file, where the next write will * occur. * @see #seek(long) */ int64_t getFilePointer() const; /** Sets current position in this file, where the next write will occur. * @see #getFilePointer() */ virtual void seek(const int64_t pos); /** The number of bytes in the file. */ virtual int64_t length() const = 0; /** Forces any buffered output to be written. */ void flush(); protected: /** Expert: implements buffer write. Writes bytes at the current position in * the output. * @param b the bytes to write * @param len the number of bytes to write */ virtual void flushBuffer(const uint8_t* b, const int32_t len) = 0; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/Lock.cpp000066400000000000000000000103761154025176300220250ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Lock.h" #include "_Lock.h" #include "CLucene/util/Misc.h" #ifdef _CL_HAVE_IO_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif #ifdef _CL_HAVE_DIRECT_H #include #endif #include CL_NS_USE(util) CL_NS_DEF(store) LuceneLock::~LuceneLock() { } bool LuceneLock::obtain(int64_t lockWaitTimeout) { bool locked = obtain(); if ( lockWaitTimeout < 0 && lockWaitTimeout != LOCK_OBTAIN_WAIT_FOREVER ) { _CLTHROWA(CL_ERR_IllegalArgument,"lockWaitTimeout should be LOCK_OBTAIN_WAIT_FOREVER or a non-negative number"); } int64_t maxSleepCount = lockWaitTimeout / LOCK_POLL_INTERVAL; int64_t sleepCount = 0; while (!locked) { if ( lockWaitTimeout != LOCK_OBTAIN_WAIT_FOREVER && sleepCount++ == maxSleepCount ) { _CLTHROWA(CL_ERR_IO,"Lock obtain timed out"); } _LUCENE_SLEEP(LOCK_POLL_INTERVAL); locked = obtain(); } return locked; } std::string NoLock::toString() { return "NoLock"; } bool NoLock::obtain() { return true; } void NoLock::release() {} bool NoLock::isLocked() { return false; } const char* NoLock::getClassName(){ return "NoLock"; } const char* NoLock::getObjectName() const{ return getClassName(); } SingleInstanceLock::SingleInstanceLock( LocksType* locks, _LUCENE_THREADMUTEX* locks_LOCK, const char* lockName ) { this->locks = locks; #ifndef _CL_DISABLE_MULTITHREADING this->locks_LOCK = locks_LOCK; #endif this->lockName = lockName; } SingleInstanceLock::~SingleInstanceLock(){ } const char* SingleInstanceLock::getClassName(){ return "SingleInstanceLock"; } const char* SingleInstanceLock::getObjectName() const{ return getClassName(); } bool SingleInstanceLock::obtain() { SCOPED_LOCK_MUTEX(*locks_LOCK); return locks->insert( lockName ).second; } void SingleInstanceLock::release() { SCOPED_LOCK_MUTEX(*locks_LOCK); LocksType::iterator itr = locks->find( lockName ); if ( itr != locks->end() ) { locks->remove(itr, true); } } bool SingleInstanceLock::isLocked() { SCOPED_LOCK_MUTEX(*locks_LOCK); return locks->find( lockName ) == locks->end(); } string SingleInstanceLock::toString() { return string("SingleInstanceLock:") + lockName; } FSLock::FSLock( const char* _lockDir, const char* name, int filemode ) { if ( filemode <= 0 ) this->filemode = 0644; //must do this or file will be created Read only else this->filemode = filemode; this->lockFile = _CL_NEWARRAY(char,CL_MAX_PATH); this->lockDir = STRDUP_AtoA(_lockDir); strcpy(lockFile,_lockDir); strcat(lockFile,PATH_DELIMITERA); strcat(lockFile,name); } FSLock::~FSLock() { _CLDELETE_ARRAY( lockFile ); _CLDELETE_LCaARRAY( lockDir ); } const char* FSLock::getClassName(){ return "FSLock"; } const char* FSLock::getObjectName() const{ return getClassName(); } bool FSLock::obtain() { if ( !Misc::dir_Exists(lockDir) ){ if ( _mkdir(lockDir) == -1 ){ char* err = _CL_NEWARRAY(char,34+strlen(lockDir)+1); //34: len of "Couldn't create lock directory: " strcpy(err,"Couldn't create lock directory: "); strcat(err,lockDir); _CLTHROWA_DEL(CL_ERR_IO, err ); } } int32_t r = _cl_open(lockFile, O_RDWR | O_CREAT | _O_RANDOM | O_EXCL, this->filemode); if ( r < 0 ) { return false; } else { _close(r); return true; } } void FSLock::release() { _unlink( lockFile ); } bool FSLock::isLocked() { return Misc::dir_Exists(lockFile); } string FSLock::toString() { return string("SimpleFSLock@") + lockFile; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/Lock.h000066400000000000000000000032361154025176300214670ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_Lock_ #define _lucene_store_Lock_ #include #include "CLucene/util/Equators.h" CL_NS_DEF(store) class LocksType; class CLUCENE_EXPORT LuceneLock: public CL_NS(util)::NamedObject{ public: LUCENE_STATIC_CONSTANT(int64_t, LOCK_POLL_INTERVAL = 1000); LUCENE_STATIC_CONSTANT(int64_t, LOCK_OBTAIN_WAIT_FOREVER = -1); /** Attempts to obtain exclusive access and immediately return * upon success or failure. * @return true iff exclusive access is obtained */ virtual bool obtain() = 0; /** Attempts to obtain an exclusive lock within amount * of time given. Currently polls once per second until * lockWaitTimeout is passed. * @param lockWaitTimeout length of time to wait in ms * @return true if lock was obtained * @throws IOException if lock wait times out or obtain() throws an IOException */ bool obtain(int64_t lockWaitTimeout); // Release exclusive access. virtual void release() = 0; /** Returns true if the resource is currently locked. Note that one must * still call {@link #obtain()} before using the resource. */ virtual bool isLocked() = 0; virtual ~LuceneLock(); virtual std::string toString() = 0; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/LockFactory.cpp000066400000000000000000000064751154025176300233620ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "LockFactory.h" #include "_Lock.h" #include "CLucene/util/Misc.h" #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif CL_NS_USE(util) CL_NS_DEF(store) LockFactory::LockFactory() { } LockFactory::~LockFactory() { } void LockFactory::setLockPrefix( const char* lockPrefix ) { if ( lockPrefix != NULL ) this->lockPrefix = lockPrefix; else this->lockPrefix.clear(); } const char* LockFactory::getLockPrefix() { return lockPrefix.c_str(); } SingleInstanceLockFactory::SingleInstanceLockFactory() { locks = _CLNEW LocksType(); } SingleInstanceLockFactory::~SingleInstanceLockFactory() { _CLDELETE( locks ); } LuceneLock* SingleInstanceLockFactory::makeLock( const char* lockName ) { #ifdef _CL_DISABLE_MULTITHREADING return _CLNEW SingleInstanceLock( locks, NULL, lockName ); #else return _CLNEW SingleInstanceLock( locks, &locks_LOCK, lockName ); #endif } void SingleInstanceLockFactory::clearLock( const char* lockName ) { SCOPED_LOCK_MUTEX(locks_LOCK); LocksType::iterator itr = locks->find( lockName ); if ( itr != locks->end() ) { locks->remove( itr ); } } NoLockFactory* NoLockFactory::singleton = NULL; NoLock* NoLockFactory::singletonLock = NULL; void NoLockFactory::_shutdown(){ _CLDELETE(NoLockFactory::singleton); _CLDELETE(NoLockFactory::singletonLock); } NoLockFactory* NoLockFactory::getNoLockFactory() { if ( singleton == NULL ) { singleton = _CLNEW NoLockFactory(); } return singleton; } LuceneLock* NoLockFactory::makeLock( const char* /*lockName*/ ) { if ( singletonLock == NULL ) { singletonLock = _CLNEW NoLock(); } return singletonLock; } void NoLockFactory::clearLock( const char* /*lockName*/ ) { } FSLockFactory::FSLockFactory( const char* lockDir, int filemode ) { setLockDir( lockDir ); if ( filemode > 0 ) this->filemode = filemode; else this->filemode = 0644; } FSLockFactory::~FSLockFactory() { } void FSLockFactory::setLockDir( const char* lockDir ) { this->lockDir = lockDir; } LuceneLock* FSLockFactory::makeLock( const char* lockName ) { char name[CL_MAX_DIR]; if ( !lockPrefix.empty() ) { cl_sprintf(name, CL_MAX_DIR, "%s-%s", lockPrefix.c_str(), lockName); } else { cl_strcpy(name,lockName,CL_MAX_DIR); } return _CLNEW FSLock( lockDir.c_str(), name, this->filemode ); } void FSLockFactory::clearLock( const char* lockName ) { if ( Misc::dir_Exists( lockDir.c_str() )) { char name[CL_MAX_DIR]; char path[CL_MAX_DIR]; struct cl_stat_t buf; if ( !lockPrefix.empty() ) { STRCPY_AtoA(name,lockPrefix.c_str(),lockPrefix.length()+1); strcat(name,"-"); strcat(name,lockName); } else { strcpy(name,lockName); } _snprintf(path,CL_MAX_DIR,"%s/%s",lockDir.c_str(),name); int32_t ret = fileStat(path,&buf); if ( ret==0 && !(buf.st_mode & S_IFDIR) && _unlink( path ) == -1 ) { _CLTHROWA(CL_ERR_IO, "Couldn't delete file" ); // TODO: make richer error } } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/LockFactory.h000066400000000000000000000040011154025176300230060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_LockFactory_ #define _lucene_store_LockFactory_ #include "CLucene/LuceneThreads.h" CL_CLASS_DEF(store,LuceneLock) CL_CLASS_DEF(store,NoLock) CL_NS_DEF(store) class LocksType; class CLUCENE_EXPORT LockFactory: LUCENE_BASE { protected: std::string lockPrefix; public: LockFactory(); virtual ~LockFactory(); void setLockPrefix( const char* lockPrefix ); const char* getLockPrefix(); virtual LuceneLock* makeLock( const char* lockName )=0; virtual void clearLock( const char* lockName )=0; }; class CLUCENE_EXPORT SingleInstanceLockFactory: public LockFactory { private: LocksType* locks; DEFINE_MUTEX(locks_LOCK) public: SingleInstanceLockFactory(); ~SingleInstanceLockFactory(); LuceneLock* makeLock( const char* lockName ); void clearLock( const char* lockName ); }; class CLUCENE_EXPORT NoLockFactory: public LockFactory { public: static NoLockFactory* singleton; static NoLock* singletonLock; static NoLockFactory* getNoLockFactory(); LuceneLock* makeLock( const char* lockName ); void clearLock( const char* lockName ); /** called when lucene_shutdown is called */ static CLUCENE_LOCAL void _shutdown(); }; class CLUCENE_EXPORT FSLockFactory: public LockFactory { private: std::string lockDir; int filemode; public: /** Constructs a FS Lock factory. The default file mode is user writable */ FSLockFactory( const char* lockDir=NULL, int filemode=-1 ); ~FSLockFactory(); void setLockDir( const char* lockDir ); LuceneLock* makeLock( const char* lockName ); void clearLock( const char* lockName ); static const char* getClassName(); const char* getObjectName(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/MMapInput.cpp000066400000000000000000000205541154025176300230060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "FSDirectory.h" #include "_MMapIndexInput.h" #include "CLucene/util/Misc.h" #include #ifdef _CL_HAVE_IO_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif #ifdef _CL_HAVE_DIRECT_H #include #endif #ifdef _CL_HAVE_SYS_MMAN_H #include #endif #ifdef _CL_HAVE_WINERROR_H #include #endif #include #if defined(_CL_HAVE_FUNCTION_MAPVIEWOFFILE) typedef int HANDLE; #define GENERIC_READ (0x80000000L) #define FILE_SHARE_READ 0x00000001 #define OPEN_EXISTING 3 #define PAGE_READONLY 0x02 #define SECTION_MAP_READ 0x0004 #define FILE_MAP_READ SECTION_MAP_READ typedef struct _SECURITY_ATTRIBUTES { _cl_dword_t nLength; void* lpSecurityDescriptor; bool bInheritHandle; } SECURITY_ATTRIBUTES; extern "C" __declspec(dllimport) _cl_dword_t __stdcall GetFileSize( HANDLE hFile, _cl_dword_t* lpFileSizeHigh ); extern "C" __declspec(dllimport) bool __stdcall UnmapViewOfFile( void* lpBaseAddress ); extern "C" __declspec(dllimport) bool __stdcall CloseHandle( HANDLE hObject ); extern "C" __declspec(dllimport) HANDLE __stdcall CreateFileA( const char* lpFileName, _cl_dword_t dwDesiredAccess, _cl_dword_t dwShareMode, SECURITY_ATTRIBUTES* lpSecurityAttributes, _cl_dword_t dwCreationDisposition, _cl_dword_t dwFlagsAndAttributes, HANDLE hTemplateFile ); extern "C" __declspec(dllimport) HANDLE __stdcall CreateFileMappingA( HANDLE hFile, SECURITY_ATTRIBUTES* lpFileMappingAttributes, _cl_dword_t flProtect, _cl_dword_t dwMaximumSizeHigh, _cl_dword_t dwMaximumSizeLow, const char* lpName ); extern "C" __declspec(dllimport) void* __stdcall MapViewOfFile( HANDLE hFileMappingObject, _cl_dword_t dwDesiredAccess, _cl_dword_t dwFileOffsetHigh, _cl_dword_t dwFileOffsetLow, _cl_dword_t dwNumberOfBytesToMap ); extern "C" __declspec(dllimport) _cl_dword_t __stdcall GetLastError(); #endif CL_NS_DEF(store) CL_NS_USE(util) class MMapIndexInput::Internal: LUCENE_BASE{ public: uint8_t* data; int64_t pos; #if defined(_CL_HAVE_FUNCTION_MAPVIEWOFFILE) HANDLE mmaphandle; HANDLE fhandle; #elif defined(_CL_HAVE_FUNCTION_MMAP) int fhandle; #else #error no mmap implementation set #endif bool isClone; int64_t _length; Internal(): data(NULL), pos(0), isClone(false), _length(0) { } ~Internal(){ } }; MMapIndexInput::MMapIndexInput(Internal* __internal): _internal(__internal) { } bool MMapIndexInput::open(const char* path, IndexInput*& ret, CLuceneError& error, int32_t __bufferSize ) { //Func - Constructor. // Opens the file named path //Pre - path != NULL //Post - if the file could not be opened an exception is thrown. CND_PRECONDITION(path != NULL, "path is NULL"); Internal* _internal = _CLNEW Internal; #if defined(_CL_HAVE_FUNCTION_MAPVIEWOFFILE) _internal->mmaphandle = NULL; _internal->fhandle = CreateFileA(path,GENERIC_READ,FILE_SHARE_READ, 0,OPEN_EXISTING,0,0); //Check if a valid fhandle was retrieved if (_internal->fhandle < 0){ _cl_dword_t err = GetLastError(); if ( err == ERROR_FILE_NOT_FOUND ) error.set(CL_ERR_IO, "File does not exist"); else if ( err == ERROR_ACCESS_DENIED ) error.set(CL_ERR_IO, "File Access denied"); else if ( err == ERROR_TOO_MANY_OPEN_FILES ) error.set(CL_ERR_IO, "Too many open files"); else error.set(CL_ERR_IO, "Could not open file"); } _cl_dword_t dummy=0; _internal->_length = GetFileSize(_internal->fhandle, &dummy); if ( _internal->_length > 0 ){ _internal->mmaphandle = CreateFileMappingA(_internal->fhandle,NULL,PAGE_READONLY,0,0,NULL); if ( _internal->mmaphandle != NULL ){ void* address = MapViewOfFile(_internal->mmaphandle,FILE_MAP_READ,0,0,0); if ( address != NULL ){ _internal->data = (uint8_t*)address; ret = _CLNEW MMapIndexInput(_internal); return true; } } //failure: int errnum = GetLastError(); CloseHandle(_internal->mmaphandle); char* lpMsgBuf=strerror(errnum); size_t len = strlen(lpMsgBuf)+80; char* errstr = _CL_NEWARRAY(char, len); cl_sprintf(errstr, len, "MMapIndexInput::MMapIndexInput failed with error %d: %s", errnum, lpMsgBuf); error.set(CL_ERR_IO, errstr); _CLDELETE_CaARRAY(errstr); } #else //_CL_HAVE_FUNCTION_MAPVIEWOFFILE _internal->fhandle = ::_cl_open (path, _O_BINARY | O_RDONLY | _O_RANDOM, _S_IREAD); if (_internal->fhandle < 0){ error.set(CL_ERR_IO, strerror(errno)); }else{ // stat it struct stat sb; if (::fstat (_internal->fhandle, &sb)){ error.set(CL_ERR_IO, strerror(errno)); }else{ // get length from stat _internal->_length = sb.st_size; // mmap the file void* address = ::mmap(0, _internal->_length, PROT_READ, MAP_SHARED, _internal->fhandle, 0); if (address == MAP_FAILED){ error.set(CL_ERR_IO, strerror(errno)); }else{ _internal->data = (uint8_t*)address; ret = _CLNEW MMapIndexInput(_internal); return true; } } } #endif _CLDELETE(_internal); return false; } MMapIndexInput::MMapIndexInput(const MMapIndexInput& clone): IndexInput(clone){ //Func - Constructor // Uses clone for its initialization //Pre - clone is a valide instance of FSIndexInput //Post - The instance has been created and initialized by clone _internal = _CLNEW Internal; #if defined(_CL_HAVE_FUNCTION_MAPVIEWOFFILE) _internal->mmaphandle = NULL; _internal->fhandle = NULL; #endif _internal->data = clone._internal->data; _internal->pos = clone._internal->pos; //clone the file length _internal->_length = clone._internal->_length; //Keep in mind that this instance is a clone _internal->isClone = true; } uint8_t MMapIndexInput::readByte(){ return *(_internal->data+(_internal->pos++)); } void MMapIndexInput::readBytes(uint8_t* b, const int32_t len){ memcpy(b, _internal->data+_internal->pos, len); _internal->pos+=len; } int32_t MMapIndexInput::readVInt(){ uint8_t b = *(_internal->data+(_internal->pos++)); int32_t i = b & 0x7F; for (int shift = 7; (b & 0x80) != 0; shift += 7) { b = *(_internal->data+(_internal->pos++)); i |= (b & 0x7F) << shift; } return i; } int64_t MMapIndexInput::getFilePointer() const{ return _internal->pos; } void MMapIndexInput::seek(const int64_t pos){ this->_internal->pos=pos; } int64_t MMapIndexInput::length() const{ return _internal->_length; } MMapIndexInput::~MMapIndexInput(){ //Func - Destructor //Pre - True //Post - The file for which this instance is responsible has been closed. // The instance has been destroyed close(); _CLDELETE(_internal); } IndexInput* MMapIndexInput::clone() const { return _CLNEW MMapIndexInput(*this); } void MMapIndexInput::close() { if ( !_internal->isClone ){ #if defined(_CL_HAVE_FUNCTION_MAPVIEWOFFILE) if ( _internal->data != NULL ){ if ( ! UnmapViewOfFile(_internal->data) ){ CND_PRECONDITION( false, "UnmapViewOfFile(data) failed"); //todo: change to rich error } } if ( _internal->mmaphandle != NULL ){ if ( ! CloseHandle(_internal->mmaphandle) ){ CND_PRECONDITION( false, "CloseHandle(mmaphandle) failed"); } } if ( _internal->fhandle != NULL ){ if ( !CloseHandle(_internal->fhandle) ){ CND_PRECONDITION( false, "CloseHandle(fhandle) failed"); } } _internal->mmaphandle = NULL; _internal->fhandle = NULL; #else if ( _internal->data != NULL ) ::munmap(_internal->data, _internal->_length); if ( _internal->fhandle > 0 ) ::close(_internal->fhandle); _internal->fhandle = 0; #endif } _internal->data = NULL; _internal->pos = 0; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/RAMDirectory.cpp000066400000000000000000000351501154025176300234360ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "RAMDirectory.h" #include "_RAMDirectory.h" #include "Lock.h" #include "LockFactory.h" #include "Directory.h" #include "FSDirectory.h" #include "CLucene/index/IndexReader.h" //#include "CLucene/util/VoidMap.h" #include "CLucene/util/Misc.h" #include CL_NS_USE(util) CL_NS_DEF(store) // ***** // Lock acquisition sequence: RAMDirectory, then RAMFile // ***** class RAMLock: public LuceneLock{ private: RAMDirectory* directory; char* fname; public: RAMLock(const char* name, RAMDirectory* dir); virtual ~RAMLock(); bool obtain(); void release(); bool isLocked(); virtual std::string toString(); }; RAMFile::RAMFile( RAMDirectory* _directory ) { length = 0; lastModified = Misc::currentTimeMillis(); this->directory = _directory; sizeInBytes = 0; } RAMFile::~RAMFile(){ } int64_t RAMFile::getLength() { SCOPED_LOCK_MUTEX(THIS_LOCK); return length; } void RAMFile::setLength( int64_t length ) { SCOPED_LOCK_MUTEX(THIS_LOCK); this->length = length; } uint64_t RAMFile::getLastModified() { SCOPED_LOCK_MUTEX(THIS_LOCK); return lastModified; } void RAMFile::setLastModified( const uint64_t lastModified ) { SCOPED_LOCK_MUTEX(THIS_LOCK); this->lastModified = lastModified; } uint8_t* RAMFile::addBuffer( const int32_t size ) { SCOPED_LOCK_MUTEX(THIS_LOCK); uint8_t* buffer = newBuffer(size); RAMFileBuffer* rfb = _CLNEW RAMFileBuffer(buffer, size); if ( directory != NULL ) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK); buffers.push_back( rfb ); directory->sizeInBytes += size; sizeInBytes += size; } else { buffers.push_back(rfb); } return buffer; } uint8_t* RAMFile::getBuffer( const int32_t index ) { SCOPED_LOCK_MUTEX(THIS_LOCK); return buffers[index]->_buffer; } int32_t RAMFile::numBuffers() const { return buffers.size(); } uint8_t* RAMFile::newBuffer( const int32_t size ) { return _CL_NEWARRAY( uint8_t, size ); } int64_t RAMFile::getSizeInBytes() const { if ( directory != NULL ) { SCOPED_LOCK_MUTEX(directory->THIS_LOCK); return sizeInBytes; } return 0; } RAMOutputStream::~RAMOutputStream(){ if ( deleteFile ){ _CLDELETE(file); }else{ file = NULL; } } RAMOutputStream::RAMOutputStream(RAMFile* f): file(f), deleteFile(false), currentBuffer(NULL), currentBufferIndex(-1), bufferPosition(0), bufferStart(0), bufferLength(0) { } RAMOutputStream::RAMOutputStream(): file(_CLNEW RAMFile), deleteFile(true), currentBuffer(NULL), currentBufferIndex(-1), bufferPosition(0), bufferStart(0), bufferLength(0) { } void RAMOutputStream::writeTo(IndexOutput* out){ flush(); const int64_t end = file->getLength(); int64_t pos = 0; int32_t p = 0; while (pos < end) { int32_t length = BUFFER_SIZE; int64_t nextPos = pos + length; if (nextPos > end) { // at the last buffer length = (int32_t)(end - pos); } out->writeBytes(file->getBuffer(p++), length); pos = nextPos; } } void RAMOutputStream::reset(){ seek((int64_t)0); file->setLength((int64_t)0); } void RAMOutputStream::close() { flush(); } /** Random-at methods */ void RAMOutputStream::seek( const int64_t pos ) { // set the file length in case we seek back // and flush() has not been called yet setFileLength(); if ( pos < bufferStart || pos >= bufferStart + bufferLength ) { currentBufferIndex = (int32_t)(pos / BUFFER_SIZE); switchCurrentBuffer(); } bufferPosition = (int32_t)( pos % BUFFER_SIZE ); } int64_t RAMOutputStream::length() const { return file->getLength(); } void RAMOutputStream::writeByte( const uint8_t b ) { if ( bufferPosition == bufferLength ) { currentBufferIndex++; switchCurrentBuffer(); } currentBuffer[bufferPosition++] = b; } void RAMOutputStream::writeBytes( const uint8_t* b, const int32_t len ) { int32_t srcOffset = 0; while ( srcOffset != len ) { if ( bufferPosition == bufferLength ) { currentBufferIndex++; switchCurrentBuffer(); } int32_t remainInSrcBuffer = len - srcOffset; int32_t bytesInBuffer = bufferLength - bufferPosition; int32_t bytesToCopy = bytesInBuffer >= remainInSrcBuffer ? remainInSrcBuffer : bytesInBuffer; memcpy( currentBuffer+bufferPosition, b+srcOffset, bytesToCopy * sizeof(uint8_t) ); srcOffset += bytesToCopy; bufferPosition += bytesToCopy; } } void RAMOutputStream::switchCurrentBuffer() { if ( currentBufferIndex == file->numBuffers() ) { currentBuffer = file->addBuffer( BUFFER_SIZE ); bufferLength = BUFFER_SIZE; } else { currentBuffer = file->getBuffer( currentBufferIndex ); bufferLength = file->getBufferLen(currentBufferIndex); } assert(bufferLength >=0);// bufferPosition = 0; bufferStart = (int64_t)BUFFER_SIZE * (int64_t)currentBufferIndex; } void RAMOutputStream::setFileLength() { int64_t pointer = bufferStart + bufferPosition; if ( pointer > file->getLength() ) { file->setLength( pointer ); } } void RAMOutputStream::flush() { file->setLastModified( Misc::currentTimeMillis() ); setFileLength(); } int64_t RAMOutputStream::getFilePointer() const { return currentBufferIndex < 0 ? 0 : bufferStart + bufferPosition; } RAMInputStream::RAMInputStream(RAMFile* f): file(f), currentBuffer(NULL), currentBufferIndex(-1), bufferPosition(0), bufferStart(0), bufferLength(0) { _length = f->getLength(); if ( _length/BUFFER_SIZE >= 0x7FFFFFFFL ) { // TODO: throw exception } } RAMInputStream::RAMInputStream(const RAMInputStream& other): IndexInput(other) { file = other.file; _length = other._length; currentBufferIndex = other.currentBufferIndex; currentBuffer = other.currentBuffer; bufferPosition = other.bufferPosition; bufferStart = other.bufferStart; bufferLength = other.bufferLength; } RAMInputStream::~RAMInputStream(){ RAMInputStream::close(); } IndexInput* RAMInputStream::clone() const { return _CLNEW RAMInputStream(*this); } int64_t RAMInputStream::length() const { return _length; } const char* RAMInputStream::getDirectoryType() const{ return RAMDirectory::getClassName(); } const char* RAMIndexInput::getObjectName() const{ return getClassName(); } const char* RAMIndexInput::getClassName(){ return "RAMIndexInput"; } uint8_t RAMInputStream::readByte() { if ( bufferPosition >= bufferLength ) { currentBufferIndex++; switchCurrentBuffer(); } return currentBuffer[bufferPosition++]; } void RAMInputStream::readBytes( uint8_t* _dest, const int32_t _len ) { uint8_t* dest = _dest; int32_t len = _len; while ( len > 0 ) { if ( bufferPosition >= bufferLength ) { currentBufferIndex++; switchCurrentBuffer(); } int32_t remainInBuffer = bufferLength - bufferPosition; int32_t bytesToCopy = len < remainInBuffer ? len : remainInBuffer; memcpy( dest, currentBuffer+bufferPosition, bytesToCopy * sizeof(uint8_t) ); dest += bytesToCopy; len -= bytesToCopy; bufferPosition += bytesToCopy; } } int64_t RAMInputStream::getFilePointer() const { return currentBufferIndex < 0 ? 0 : bufferStart + bufferPosition; } void RAMInputStream::seek( const int64_t pos ) { if ( currentBuffer == NULL || pos < bufferStart || pos >= bufferStart + BUFFER_SIZE ) { currentBufferIndex = (int32_t)( pos / BUFFER_SIZE ); switchCurrentBuffer(); } bufferPosition = (int32_t)(pos % BUFFER_SIZE); } void RAMInputStream::close() { } void RAMInputStream::switchCurrentBuffer() { if ( currentBufferIndex >= file->numBuffers() ) { // end of file reached, no more buffers left _CLTHROWA(CL_ERR_IO, "Read past EOF"); } else { currentBuffer = file->getBuffer( currentBufferIndex ); bufferPosition = 0; bufferStart = (int64_t)BUFFER_SIZE * (int64_t)currentBufferIndex; int64_t bufLen = _length - bufferStart; bufferLength = bufLen > BUFFER_SIZE ? BUFFER_SIZE : static_cast(bufLen); } assert (bufferLength >=0); } bool RAMDirectory::list(vector* names) const{ SCOPED_LOCK_MUTEX(files_mutex); FileMap::const_iterator itr = files->begin(); while (itr != files->end()){ names->push_back( string(itr->first) ); ++itr; } return true; } RAMDirectory::RAMDirectory(): Directory(),files(_CLNEW FileMap(true,true)) { this->sizeInBytes = 0; setLockFactory( _CLNEW SingleInstanceLockFactory() ); } RAMDirectory::~RAMDirectory(){ //todo: should call close directory? _CLDELETE( lockFactory ); _CLDELETE( files ); } void RAMDirectory::_copyFromDir(Directory* dir, bool closeDir) { vector names; dir->list(&names); uint8_t buf[CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE]; for (size_t i=0;iopenInput(names[i].c_str()); // and copy to ram disk //todo: this could be a problem when copying from big indexes... int64_t len = is->length(); int64_t readCount = 0; while (readCount < len) { int32_t toRead = (int32_t)(readCount + CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE > len ? len - readCount : CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE); is->readBytes(buf, toRead); os->writeBytes(buf, toRead); readCount += toRead; } // graceful cleanup is->close(); _CLDELETE(is); os->close(); _CLDELETE(os); } if (closeDir) dir->close(); } RAMDirectory::RAMDirectory(Directory* dir): Directory(),files( _CLNEW FileMap(true,true) ) { this->sizeInBytes = 0; setLockFactory( _CLNEW SingleInstanceLockFactory() ); _copyFromDir(dir,false); } RAMDirectory::RAMDirectory(const char* dir): Directory(),files( _CLNEW FileMap(true,true) ) { this->sizeInBytes = 0; setLockFactory( _CLNEW SingleInstanceLockFactory() ); Directory* fsdir = FSDirectory::getDirectory(dir); try{ _copyFromDir(fsdir,false); }_CLFINALLY( fsdir->close(); _CLDECDELETE(fsdir); ); } bool RAMDirectory::fileExists(const char* name) const { SCOPED_LOCK_MUTEX(files_mutex); return files->exists((char*)name); } int64_t RAMDirectory::fileModified(const char* name) const { SCOPED_LOCK_MUTEX(files_mutex); RAMFile* f = files->get((char*)name); return f->getLastModified(); } int64_t RAMDirectory::fileLength(const char* name) const { SCOPED_LOCK_MUTEX(files_mutex); RAMFile* f = files->get((char*)name); return f->getLength(); } bool RAMDirectory::openInput(const char* name, IndexInput*& ret, CLuceneError& error, int32_t /*bufferSize*/) { SCOPED_LOCK_MUTEX(files_mutex); RAMFile* file = files->get((char*)name); if (file == NULL) { error.set(CL_ERR_IO, "[RAMDirectory::open] The requested file does not exist."); return false; } ret = _CLNEW RAMInputStream( file ); return true; } void RAMDirectory::close(){ SCOPED_LOCK_MUTEX(files_mutex); files->clear(); _CLDELETE(files); } bool RAMDirectory::doDeleteFile(const char* name) { SCOPED_LOCK_MUTEX(files_mutex); FileMap::iterator itr = files->find((char*)name); if (itr != files->end()) { SCOPED_LOCK_MUTEX(this->THIS_LOCK); sizeInBytes -= itr->second->sizeInBytes; files->removeitr(itr); return true; } else { return false; } } void RAMDirectory::renameFile(const char* from, const char* to) { SCOPED_LOCK_MUTEX(files_mutex); FileMap::iterator itr = files->find((char*)from); /* DSR:CL_BUG_LEAK: ** If a file named $to already existed, its old value was leaked. ** My inclination would be to prevent this implicit deletion with an ** exception, but it happens routinely in CLucene's internals (e.g., during ** IndexWriter.addIndexes with the file named 'segments'). */ if (files->exists((char*)to)) { FileMap::iterator itr1 = files->find((char*)to); SCOPED_LOCK_MUTEX(this->THIS_LOCK); sizeInBytes -= itr1->second->sizeInBytes; files->removeitr( itr1 ); } if ( itr == files->end() ){ char tmp[1024]; _snprintf(tmp,1024,"cannot rename %s, file does not exist",from); _CLTHROWT(CL_ERR_IO,tmp); } CND_PRECONDITION(itr != files->end(), "itr==files->end()") RAMFile* file = itr->second; files->removeitr(itr,false,true); files->put(STRDUP_AtoA(to), file); } void RAMDirectory::touchFile(const char* name) { RAMFile* file = NULL; { SCOPED_LOCK_MUTEX(files_mutex); file = files->get((char*)name); } const uint64_t ts1 = file->getLastModified(); uint64_t ts2 = Misc::currentTimeMillis(); //make sure that the time has actually changed while ( ts1==ts2 ) { _LUCENE_SLEEP(1); ts2 = Misc::currentTimeMillis(); }; file->setLastModified(ts2); } IndexOutput* RAMDirectory::createOutput(const char* name) { /* Check the $files VoidMap to see if there was a previous file named ** $name. If so, delete the old RAMFile object, but reuse the existing ** char buffer ($n) that holds the filename. If not, duplicate the ** supplied filename buffer ($name) and pass ownership of that memory ($n) ** to $files. */ SCOPED_LOCK_MUTEX(files_mutex); // get the actual pointer to the output name char* n = NULL; FileMap::const_iterator itr = files->find(const_cast(name)); if ( itr!=files->end() ) { n = itr->first; RAMFile* rf = itr->second; SCOPED_LOCK_MUTEX(this->THIS_LOCK); sizeInBytes -= rf->sizeInBytes; _CLDELETE(rf); } else { n = STRDUP_AtoA(name); } RAMFile* file = _CLNEW RAMFile(); (*files)[n] = file; return _CLNEW RAMOutputStream(file); } std::string RAMDirectory::toString() const{ return "RAMDirectory"; } const char* RAMDirectory::getClassName(){ return "RAMDirectory"; } const char* RAMDirectory::getObjectName() const{ return getClassName(); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/store/RAMDirectory.h000066400000000000000000000065571154025176300231140ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_RAMDirectory_ #define _lucene_store_RAMDirectory_ #include "CLucene/util/VoidMap.h" #include "Directory.h" CL_CLASS_DEF(store,RAMFile) CL_NS_DEF(store) /** * A memory-resident {@link Directory} implementation. Locking * implementation is by default the {@link SingleInstanceLockFactory} * but can be changed with {@link #setLockFactory}. * */ class CLUCENE_EXPORT RAMDirectory:public Directory{ protected: typedef CL_NS(util)::CLHashMap > FileMap; /// Removes an existing file in the directory. virtual bool doDeleteFile(const char* name); /** * Creates a new RAMDirectory instance from a different * Directory implementation. This can be used to load * a disk-based index into memory. *

* This should be used only with indices that can fit into memory. * * @param dir a Directory value * @exception IOException if an error occurs */ void _copyFromDir(Directory* dir, bool closeDir); FileMap* files; // unlike the java Hashtable, FileMap is not synchronized, and all access must be protected by a lock public: int64_t sizeInBytes; //todo DEFINE_MUTABLE_MUTEX(files_mutex) // mutable: const methods must also be able to synchronize properly /// Returns a null terminated array of strings, one for each file in the directory. bool list(std::vector* names) const; /** Constructs an empty {@link Directory}. */ RAMDirectory(); ///Destructor - only call this if you are sure the directory ///is not being used anymore. Otherwise use the ref-counting ///facilities of dir->close virtual ~RAMDirectory(); RAMDirectory(Directory* dir); /** * Creates a new RAMDirectory instance from the {@link FSDirectory}. * * @param dir a String specifying the full index directory path */ RAMDirectory(const char* dir); /// Returns true iff the named file exists in this directory. bool fileExists(const char* name) const; /// Returns the time the named file was last modified. int64_t fileModified(const char* name) const; /// Returns the length in bytes of a file in the directory. int64_t fileLength(const char* name) const; /// Removes an existing file in the directory. virtual void renameFile(const char* from, const char* to); /** Set the modified time of an existing file to now. */ void touchFile(const char* name); /// Creates a new, empty file in the directory with the given name. /// Returns a stream writing this file. virtual IndexOutput* createOutput(const char* name); /// Returns a stream reading an existing file. bool openInput(const char* name, IndexInput*& ret, CLuceneError& error, int32_t bufferSize = -1); virtual void close(); std::string toString() const; static const char* getClassName(); const char* getObjectName() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/_Lock.h000066400000000000000000000064311154025176300216260ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_intlLock_ #define _lucene_store_intlLock_ #include "Lock.h" #include CL_NS_DEF(store) class LocksType: public CL_NS(util)::CLHashSet { public: LocksType() { setDoDelete(false); } virtual ~LocksType(){ } }; class SingleInstanceLock: public LuceneLock { private: const char* lockName; LocksType* locks; DEFINE_MUTEX(*locks_LOCK) public: SingleInstanceLock( LocksType* locks, _LUCENE_THREADMUTEX* locks_LOCK, const char* lockName ); virtual ~SingleInstanceLock(); bool obtain(); void release(); bool isLocked(); std::string toString(); static const char* getClassName(); const char* getObjectName() const; }; class NoLock: public LuceneLock { public: bool obtain(); void release(); bool isLocked(); std::string toString(); static const char* getClassName(); const char* getObjectName() const; }; class FSLock: public LuceneLock { private: char* lockFile; char* lockDir; int filemode; public: FSLock( const char* _lockDir, const char* name, int filemode = -1 ); ~FSLock(); bool obtain(); void release(); bool isLocked(); std::string toString(); static const char* getClassName(); const char* getObjectName() const; }; // Utility class for executing code with exclusive access. template class LuceneLockWith { private: LuceneLock* lock; int64_t lockWaitTimeout; protected: // Code to execute with exclusive access. virtual T doBody() = 0; // Constructs an executor that will grab the named lock. public: /** Constructs an executor that will grab the named lock. * Defaults lockWaitTimeout to LUCENE_COMMIT_LOCK_TIMEOUT. * @deprecated Kept only to avoid breaking existing code. */ LuceneLockWith(LuceneLock* lock, int64_t lockWaitTimeout) { this->lock = lock; this->lockWaitTimeout = lockWaitTimeout; } virtual ~LuceneLockWith(){ } /** Calls {@link #doBody} while lock is obtained. Blocks if lock * cannot be obtained immediately. Retries to obtain lock once per second * until it is obtained, or until it has tried ten times. Lock is released when * {@link #doBody} exits. */ T runAndReturn() { bool locked = false; T ret = NULL; try { locked = lock->obtain(lockWaitTimeout); ret = doBody(); }_CLFINALLY( if (locked) lock->release(); ); return ret; } /** @see runAndReturn * Same as runAndReturn, except doesn't return any value. * The only difference is that no void values are used */ void run() { bool locked = false; try { locked = lock->obtain(lockWaitTimeout); doBody(); }_CLFINALLY( if (locked) lock->release(); ); } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/_MMapIndexInput.h000066400000000000000000000023411154025176300235740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_MMap_ #define _lucene_store_MMap_ #include "IndexInput.h" CL_NS_DEF(store) class MMapIndexInput : public IndexInput { class Internal; Internal* _internal; MMapIndexInput(const MMapIndexInput& clone); MMapIndexInput(Internal* _internal); public: static bool open(const char* path, IndexInput*& ret, CLuceneError& error, int32_t __bufferSize); ~MMapIndexInput(); IndexInput* clone() const; inline uint8_t readByte(); int32_t readVInt(); void readBytes(uint8_t* b, const int32_t len); void close(); int64_t getFilePointer() const; void seek(const int64_t pos); int64_t length() const; const char* getObjectName() const{ return MMapIndexInput::getClassName(); } static const char* getClassName(){ return "MMapIndexInput"; } const char* getDirectoryType() const{ return "MMapDirectory"; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/store/_RAMDirectory.h000066400000000000000000000077721154025176300232530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_intl_RAMDirectory_ #define _lucene_store_intl_RAMDirectory_ #include "IndexInput.h" #include "IndexOutput.h" #include "RAMDirectory.h" //#include "Lock.h" //#include "Directory.h" //#include "CLucene/util/VoidMap.h" //#include "CLucene/util/Arrays.h" CL_NS_DEF(store) class CLUCENE_EXPORT RAMFile:LUCENE_BASE { private: struct RAMFileBuffer:LUCENE_BASE { uint8_t* _buffer; size_t _len; RAMFileBuffer(uint8_t* buf = NULL, size_t len=0) : _buffer(buf), _len(len) {}; virtual ~RAMFileBuffer() { _CLDELETE_LARRAY(_buffer); }; }; CL_NS(util)::CLVector > buffers; int64_t length; int64_t sizeInBytes; // Only maintained if in a directory; updates synchronized on directory // This is publicly modifiable via Directory::touchFile(), so direct access not supported uint64_t lastModified; protected: RAMDirectory* directory; public: DEFINE_MUTEX(THIS_LOCK) // File used as buffer, in no RAMDirectory RAMFile( RAMDirectory* directory=NULL ); virtual ~RAMFile(); // For non-stream access from thread that might be concurrent with writing int64_t getLength(); void setLength( const int64_t _length ); // For non-stream access from thread that might be concurrent with writing uint64_t getLastModified(); void setLastModified( const uint64_t lastModified ); uint8_t* addBuffer( const int32_t size ); uint8_t* getBuffer( const int32_t index ); size_t getBufferLen(const int32_t index) const { return buffers[index]->_len; } int32_t numBuffers() const; uint8_t* newBuffer( const int32_t size ); int64_t getSizeInBytes() const; friend class RAMDirectory; }; class CLUCENE_EXPORT RAMOutputStream: public IndexOutput { protected: RAMFile* file; bool deleteFile; uint8_t* currentBuffer; int32_t currentBufferIndex; int32_t bufferPosition; int64_t bufferStart; int32_t bufferLength; void switchCurrentBuffer(); void setFileLength(); public: LUCENE_STATIC_CONSTANT(int32_t,BUFFER_SIZE=1024); RAMOutputStream(RAMFile* f); RAMOutputStream(); /** Construct an empty output buffer. */ virtual ~RAMOutputStream(); virtual void close(); int64_t length() const; /** Resets this to an empty buffer. */ void reset(); /** Copy the current contents of this buffer to the named output. */ void writeTo(IndexOutput* output); void writeByte(const uint8_t b); void writeBytes(const uint8_t* b, const int32_t len); void seek(const int64_t pos); void flush(); int64_t getFilePointer() const; const char* getObjectName(); static const char* getClassName(); }; typedef RAMOutputStream RAMIndexOutput; //deprecated class CLUCENE_EXPORT RAMInputStream:public IndexInput { private: RAMFile* file; int64_t _length; uint8_t* currentBuffer; int32_t currentBufferIndex; int32_t bufferPosition; int64_t bufferStart; int32_t bufferLength; void switchCurrentBuffer(); protected: /** IndexInput methods */ RAMInputStream(const RAMInputStream& clone); public: LUCENE_STATIC_CONSTANT(int32_t,BUFFER_SIZE=RAMOutputStream::BUFFER_SIZE); RAMInputStream(RAMFile* f); virtual ~RAMInputStream(); IndexInput* clone() const; void close(); int64_t length() const; uint8_t readByte(); void readBytes( uint8_t* dest, const int32_t len ); int64_t getFilePointer() const; void seek(const int64_t pos); const char* getDirectoryType() const; const char* getObjectName() const; static const char* getClassName(); }; typedef RAMInputStream RAMIndexInput; //deprecated CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/000077500000000000000000000000001154025176300202435ustar00rootroot00000000000000clucene-core-2.3.3.4/src/core/CLucene/util/Array.h000066400000000000000000000205051154025176300214740ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_Array_ #define _lucene_util_Array_ #include #include CL_NS_DEF(util) template class CLUCENE_INLINE_EXPORT ArrayBase: LUCENE_BASE{ public: T* values; size_t length; /** * Delete's the values in the array. * This won't do anything if deleteArray or takeArray is called first. * This is overridden in various implementations to provide the appropriate deletor function. */ virtual void deleteValues(){ if ( this->values == NULL ) return; for (size_t i=0;ilength;i++){ deleteValue(this->values[i]); } } /** * Delete's a single value. Used when resizing... */ virtual void deleteValue(T) = 0; /** * Delete's the values in the array and then calls deleteArray(). * This won't do anything if deleteArray or takeArray is called first. * This is overridden in various implementations to provide the appropriate deletor function. */ void deleteAll(){ this->deleteValues(); this->deleteArray(); } /** * Deletes the array holding the values. Do this if you want to take * ownership of the array's values, but not the array containing the values. */ void deleteArray(){ free(this->values); this->values = NULL; } /** * Empties the array. Do this if you want to take ownership of the array * and the array's values. */ T* takeArray(){ T* ret = values; values = NULL; return ret; } ArrayBase(const size_t initialLength = 0) : values(NULL), length(initialLength) { if (initialLength > 0) { this->values = (T*)malloc(sizeof(T)*length); memset(this->values,0,sizeof(T)*length); } } ArrayBase(T* _values, const size_t _length) : values(_values), length(_length) { } virtual ~ArrayBase(){ } const T& operator[](const size_t _Pos) const { if (length <= _Pos){ _CLTHROWA(CL_ERR_IllegalArgument,"vector subscript out of range"); } return (*(values + _Pos)); } T& operator[](const size_t _Pos) { if (length <= _Pos){ _CLTHROWA(CL_ERR_IllegalArgument,"vector subscript out of range"); } return (*(values + _Pos)); } /** * Resize the array * @param deleteValues if shrinking, delete the values that are lost. */ void resize(const size_t newSize, const bool deleteValues=false){ if ( length == newSize ) return; if ( values == NULL ) { values = (T*)malloc(sizeof(T)*newSize); memset(values,0,sizeof(T) * newSize); length = newSize; return; } if (length < newSize) { values = (T*)realloc(values, sizeof(T) * newSize); memset(values + length,0,sizeof(T) * (newSize-length)); } else // length > newSize, including newSize == 0 { if ( deleteValues ){ for ( size_t i=newSize;i class CLUCENE_INLINE_EXPORT ObjectArray: public ArrayBase{ public: ObjectArray():ArrayBase(){} ObjectArray(T** values, size_t length):ArrayBase(values,length){} ObjectArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; for (size_t i=0;ilength;++i){ _CLLDELETE(this->values[i]); } this->deleteArray(); } void deleteUntilNULL(){ if ( this->values == NULL ) return; for (size_t i=0;ilength && this->values[i] != NULL;++i){ _CLLDELETE(this->values[i]); } this->deleteArray(); } void deleteValue(T* v){ _CLLDELETE(v); } virtual ~ObjectArray(){ deleteValues(); } /* Initializes all cells in the array with a NULL value */ void initArray(){ for (size_t i=0;ilength;i++){ this->values[i]=NULL; } } }; /** * Legacy code... don't use, remove all instances of this! */ template class CLUCENE_INLINE_EXPORT Array: public ArrayBase{ public: _CL_DEPRECATED(ObjectArray or ValueArray) Array():ArrayBase(){} _CL_DEPRECATED(ObjectArray or ValueArray) Array(T* values, size_t length):ArrayBase(values,length){} _CL_DEPRECATED(ObjectArray or ValueArray) Array(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; this->deleteArray(); } void deleteValue(T v){} //nothing to do... virtual ~Array(){ } }; /** * An array where the values do not need to be deleted */ template class CLUCENE_INLINE_EXPORT ValueArray: public ArrayBase{ public: ValueArray():ArrayBase(){} ValueArray(T* values, size_t length):ArrayBase(values,length){} ValueArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; this->deleteArray(); } void deleteValue(T /*v*/){} //nothing to do... virtual ~ValueArray(){ deleteValues(); } }; /** A value array for const values (never deleted) */ template class CLUCENE_INLINE_EXPORT ConstValueArray: public ArrayBase{ public: ConstValueArray():ArrayBase(){} ConstValueArray(T* values, size_t length):ArrayBase(values,length){} ConstValueArray(size_t length):ArrayBase(length){} void deleteValues(){} void deleteValue(T /*v*/){} //nothing to do... virtual ~ConstValueArray(){} }; /** * An array of TCHAR strings */ class CLUCENE_INLINE_EXPORT TCharArray: public ArrayBase{ public: TCharArray():ArrayBase(){} TCharArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; for (size_t i=0;ilength;i++) _CLDELETE_CARRAY(this->values[i]); this->deleteArray(); } void deleteValue(TCHAR* v){ _CLDELETE_LCARRAY(v); } virtual ~TCharArray(){ deleteValues(); } }; /** * An array of char strings */ class CLUCENE_INLINE_EXPORT CharArray: public ArrayBase{ public: CharArray():ArrayBase(){} CharArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; for (size_t i=0;ilength;i++) _CLDELETE_CaARRAY(this->values[i]); this->deleteArray(); } virtual ~CharArray(){ deleteValues(); } }; /** * An array of const TCHAR strings */ class CLUCENE_INLINE_EXPORT TCharConstArray: public ArrayBase{ public: TCharConstArray():ArrayBase(){} TCharConstArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; this->deleteArray(); } virtual ~TCharConstArray(){ deleteValues(); } }; /** * An array of const char strings */ class CLUCENE_INLINE_EXPORT CharConstArray: public ArrayBase{ public: CharConstArray():ArrayBase(){} CharConstArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; this->deleteArray(); } virtual ~CharConstArray(){ deleteValues(); } }; /** An array that uses _CLDECDELETE for deletion */ template class CLUCENE_INLINE_EXPORT RefCountArray: public ArrayBase{ public: RefCountArray():ArrayBase(){} RefCountArray(T* values, size_t length):ArrayBase(values,length){} RefCountArray(size_t length):ArrayBase(length){} void deleteValues(){ if ( this->values == NULL ) return; ArrayBase::deleteValues(); this->deleteArray(); } void deleteValue(T v){ _CLDECDELETE(v); } //nothing to do... virtual ~RefCountArray(){ deleteValues(); } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/BitSet.cpp000066400000000000000000000141151154025176300221430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "BitSet.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexInput.h" #include "CLucene/store/IndexOutput.h" CL_NS_USE(store) CL_NS_DEF(util) const uint8_t BitSet::BYTE_COUNTS[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; BitSet::BitSet( const BitSet& copy ) : _size( copy._size ), _count(-1) { int32_t len = (_size >> 3) + 1; bits = _CL_NEWARRAY(uint8_t, len); memcpy( bits, copy.bits, len ); } BitSet::BitSet ( int32_t size ): _size(size), _count(-1) { int32_t len = (_size >> 3) + 1; bits = _CL_NEWARRAY(uint8_t, len); memset(bits,0,len); } BitSet::BitSet(CL_NS(store)::Directory* d, const char* name) { _count=-1; CL_NS(store)::IndexInput* input = d->openInput( name ); try { _size = input->readInt(); // read size if (_size == -1) { readDgaps(input); } else { readBits(input); } } _CLFINALLY ( input->close(); _CLDELETE(input ); ); } void BitSet::write(CL_NS(store)::Directory* d, const char* name) { CL_NS(store)::IndexOutput* output = d->createOutput(name); try { if (isSparse()) { writeDgaps(output); // sparse bit-set more efficiently saved as d-gaps. } else { writeBits(output); } } _CLFINALLY ( output->close(); _CLDELETE(output); ); } BitSet::~BitSet(){ _CLDELETE_ARRAY(bits); } void BitSet::set(const int32_t bit, bool val){ if (bit >= _size) { _CLTHROWA(CL_ERR_IndexOutOfBounds, "bit out of range"); } _count = -1; if (val) bits[bit >> 3] |= 1 << (bit & 7); else bits[bit >> 3] &= ~(1 << (bit & 7)); } int32_t BitSet::size() const { return _size; } int32_t BitSet::count(){ // if the BitSet has been modified if (_count == -1) { int32_t c = 0; int32_t end = (_size >> 3) + 1; for (int32_t i = 0; i < end; i++) c += BYTE_COUNTS[bits[i]]; // sum bits per uint8_t _count = c; } return _count; } BitSet* BitSet::clone() const { return _CLNEW BitSet( *this ); } /** Read as a bit set */ void BitSet::readBits(IndexInput* input) { _count = input->readInt(); // read count bits = _CL_NEWARRAY(uint8_t,(_size >> 3) + 1); // allocate bits input->readBytes(bits, (_size >> 3) + 1); // read bits } /** read as a d-gaps list */ void BitSet::readDgaps(IndexInput* input) { _size = input->readInt(); // (re)read size _count = input->readInt(); // read count bits = _CL_NEWARRAY(uint8_t,(_size >> 3) + 1); // allocate bits int32_t last=0; int32_t n = count(); while (n>0) { last += input->readVInt(); bits[last] = input->readByte(); n -= BYTE_COUNTS[bits[last] & 0xFF]; } } /** Write as a bit set */ void BitSet::writeBits(IndexOutput* output) { output->writeInt(size()); // write size output->writeInt(count()); // write count output->writeBytes(bits, (_size >> 3) + 1); // write bits } /** Write as a d-gaps list */ void BitSet::writeDgaps(IndexOutput* output) { output->writeInt(-1); // mark using d-gaps output->writeInt(size()); // write size output->writeInt(count()); // write count int32_t last=0; int32_t n = count(); int32_t m = (_size >> 3) + 1; for (int32_t i=0; i0; i++) { if (bits[i]!=0) { output->writeVInt(i-last); output->writeByte(bits[i]); last = i; n -= BYTE_COUNTS[bits[i] & 0xFF]; } } } /** Indicates if the bit vector is sparse and should be saved as a d-gaps list, or dense, and should be saved as a bit set. */ bool BitSet::isSparse() { // note: order of comparisons below set to favor smaller values (no binary range search.) // note: adding 4 because we start with ((int) -1) to indicate d-gaps format. // note: we write the d-gap for the byte number, and the byte (bits[i]) itself, therefore // multiplying count by (8+8) or (8+16) or (8+24) etc.: // - first 8 for writing bits[i] (1 byte vs. 1 bit), and // - second part for writing the byte-number d-gap as vint. // note: factor is for read/write of byte-arrays being faster than vints. int32_t factor = 10; if ((_size >> 3) < (1<< 7)) return factor * (4 + (8+ 8)*count()) < size(); if ((_size >> 3) < (1<<14)) return factor * (4 + (8+16)*count()) < size(); if ((_size >> 3) < (1<<21)) return factor * (4 + (8+24)*count()) < size(); if ((_size >> 3) < (1<<28)) return factor * (4 + (8+32)*count()) < size(); return factor * (4 + (8+40)*count()) < size(); } int32_t BitSet::nextSetBit(int32_t fromIndex) const { if (fromIndex < 0) _CLTHROWT(CL_ERR_IndexOutOfBounds, _T("fromIndex < 0")); if (fromIndex >= _size) return -1; while (true) { if ((bits[fromIndex >> 3] & (1 << (fromIndex & 7))) != 0) return fromIndex; if (++fromIndex == _size) return -1; } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/BitSet.h000066400000000000000000000063741154025176300216200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_BitSet_ #define _lucene_util_BitSet_ CL_CLASS_DEF(store,Directory) CL_CLASS_DEF(store,IndexInput) CL_CLASS_DEF(store,IndexOutput) CL_NS_DEF(util) /** Optimized implementation of a vector of bits. This is more-or-less like java.util.BitSet, but also includes the following:

  • a count() method, which efficiently computes the number of one bits;
  • optimized read from and write to disk;
  • inlinable get() method;
  • store and load, as bit set or d-gaps, depending on sparseness;
*/ class CLUCENE_EXPORT BitSet:LUCENE_BASE { int32_t _size; int32_t _count; uint8_t *bits; void readBits(CL_NS(store)::IndexInput* input); /** read as a d-gaps list */ void readDgaps(CL_NS(store)::IndexInput* input); /** Write as a bit set */ void writeBits(CL_NS(store)::IndexOutput* output); /** Write as a d-gaps list */ void writeDgaps(CL_NS(store)::IndexOutput* output); /** Indicates if the bit vector is sparse and should be saved as a d-gaps list, or dense, and should be saved as a bit set. */ bool isSparse(); static const uint8_t BYTE_COUNTS[256]; protected: BitSet( const BitSet& copy ); public: ///Create a bitset with the specified size BitSet ( int32_t size ); BitSet(CL_NS(store)::Directory* d, const char* name); void write(CL_NS(store)::Directory* d, const char* name); ///Destructor for the bit set ~BitSet(); ///get the value of the specified bit ///get the value of the specified bit inline bool get(const int32_t bit) const{ if (bit >= _size) { _CLTHROWA(CL_ERR_IndexOutOfBounds, "bit out of range"); } return (bits[bit >> 3] & (1 << (bit & 7))) != 0; } /** * Returns the index of the first bit that is set to {@code true} * that occurs on or after the specified starting index. If no such * bit exists then {@code -1} is returned. * *

To iterate over the {@code true} bits in a {@code BitSet}, * use the following loop: * *

 {@code
    * for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
    *     // operate on index i here
    * }}
* * @param fromIndex the index to start checking from (inclusive) * @return the index of the next set bit, or {@code -1} if there * is no such bit * @throws IndexOutOfBounds if the specified index is negative * */ int32_t nextSetBit(int32_t fromIndex) const; ///set the value of the specified bit void set(const int32_t bit, bool val=true); ///returns the size of the bitset int32_t size() const; /// Returns the total number of one bits in this BitSet. This is efficiently /// computed and cached, so that, if the BitSet is not changed, no /// recomputation is done for repeated calls. int32_t count(); BitSet *clone() const; }; typedef BitSet BitVector; //Lucene now calls the BitSet a BitVector... CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/CLStreams.h000066400000000000000000000220311154025176300222470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_CLStreams_ #define _lucene_util_CLStreams_ CL_NS_DEF(util) template class CLUCENE_EXPORT CLStream{ public: virtual ~CLStream(){} inline int read(){ const T* buffer; const int32_t nread = read(buffer,1, 1); if ( nread < 0 ) return -1; else return buffer[0]; } /** Read one line, return the length of the line read. * If the string is longer than len, only len of that line will be copied */ inline int32_t readLine(T* buffer, size_t len){ size_t i = 0; while (true && i 0) break; else continue; } buffer[i++] = b; } buffer[i] = 0; return i; } /** * @brief Reads items from the stream and sets @p start to point to * the first item that was read. * * Note: unless stated otherwise in the documentation for that method, * this pointer will no longer be valid after calling another method of * this class. The pointer will also no longer be valid after the class * is destroyed. * * At least @p min items will be read from the stream, unless an error occurs * or the end of the stream is reached. Under no circumstances will more than * @p max items be read. * * If the end of the stream is reached before @p min items are read, the * read is still considered successful and the number of items read will * be returned. * * @param start pointer passed by reference that will be set to point to * the retrieved array of items. If the end of the stream * is encountered or an error occurs, the value of @p start * is undefined * @param min the minimal number of items to read from the stream. This * value should be larger than 0. If it is 0 or smaller, the * result is undefined * @param max the maximal number of items to read from the stream. * If this value is smaller than @p min, there is no limit on * the number of items that can be read * @return the number of items that were read. @c -1 is returned if * end of the stream has already been reached. An error is thrown * if an error occurs. **/ virtual int32_t read(const T*& start, int32_t min, int32_t max) = 0; /** * @brief Skip @p ntoskip items. * * If an error occurs, or the end of the stream is encountered, fewer * than @p ntoskip items may be skipped. This can be checked by comparing * the return value to @p ntoskip. * * Calling this function invalidates the data pointer that was obtained from * StreamBase::read. * * @param ntoskip the number of items that should be skipped * @return the number of items skipped **/ virtual int64_t skip(int64_t ntoskip) = 0; /** * @brief Get the current position in the stream. * The value obtained from this function can be used to reset the stream. **/ virtual int64_t position() = 0; int64_t getPosition(){ return this->position(); } virtual size_t size() = 0; }; template class CLUCENE_EXPORT BufferedStream{ public: virtual ~BufferedStream(){} /** * @brief Repositions this stream to a given position. * * A call to reset is only guaranteed to be successful when * the requested position lies within the segment of a stream * corresponding to a valid pointer obtained from read. * In this case, the pointer will not be invalidated. * * Calling this function invalidates the data pointer that was obtained from * StreamBase::read unless the conditions outlined above apply. * * To read n items, leaving the stream at the same position as before, you * can do the following: * @code * int64_t start = stream.position(); * if ( stream.read(data, min, max) > 0 ) { * stream.reset(start); * // The data pointer is still valid here * } * @endcode * * @param pos the position in the stream you want to go to, relative to * the start of the stream * @return the new position in the stream **/ virtual int64_t reset(int64_t) = 0; /** * @brief Sets the minimum size of the buffer */ virtual void setMinBufSize(int32_t s) = 0; }; class BufferedReader; class CLUCENE_EXPORT Reader: public CLStream{ public: ~Reader(){} virtual BufferedReader* __asBufferedReader(){ return NULL; } }; class CLUCENE_EXPORT BufferedReader: public Reader, public BufferedStream{ public: _CL_DEPRECATED( setMinBufSize ) int64_t mark(int32_t readAheadlimit){ this->setMinBufSize(readAheadlimit); return this->position(); } ~BufferedReader(){} BufferedReader* __asBufferedReader(){ return this; } }; typedef CLStream InputStream; class CLUCENE_EXPORT BufferedInputStream: public InputStream, public BufferedStream{ public: virtual ~BufferedInputStream(){} }; class CLUCENE_EXPORT FilteredBufferedReader: public BufferedReader{ class Internal; Internal* _internal; public: FilteredBufferedReader(Reader* reader, bool deleteReader); virtual ~FilteredBufferedReader(); int32_t read(const TCHAR*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); size_t size(); void setMinBufSize(int32_t minbufsize); }; class CLUCENE_EXPORT FilteredBufferedInputStream: public BufferedInputStream{ class Internal; Internal* _internal; public: FilteredBufferedInputStream(InputStream* input, bool deleteInput); virtual ~FilteredBufferedInputStream(); int32_t read(const signed char*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); size_t size(); void setMinBufSize(int32_t minbufsize); }; class CLUCENE_EXPORT StringReader: public BufferedReader{ protected: const TCHAR* value; bool ownValue; int64_t pos; size_t m_size; size_t buffer_size; public: StringReader ( const TCHAR* value, const int32_t length = -1, bool copyData = true ); void init ( const TCHAR* value, const int32_t length, bool copyData = true ); virtual ~StringReader(); int32_t read(const TCHAR*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); void setMinBufSize(int32_t s); size_t size(); }; class CLUCENE_EXPORT AStringReader: public BufferedInputStream{ signed char* value; bool ownValue; int64_t pos; protected: size_t m_size; public: AStringReader ( const char* value, const int32_t length = -1 ); AStringReader ( char* value, const int32_t length, bool copyData = true ); virtual ~AStringReader(); int32_t read(const signed char*& start, int32_t min, int32_t max); int32_t read(const unsigned char*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); void setMinBufSize(int32_t s); size_t size(); }; /** * A helper class which constructs a FileReader with a specified * simple encodings, or a given inputstreamreader */ class CLUCENE_EXPORT FileInputStream: public BufferedInputStream { class Internal; Internal* _internal; protected: void init(InputStream *i, int encoding); public: LUCENE_STATIC_CONSTANT(int32_t, DEFAULT_BUFFER_SIZE=4096); FileInputStream ( const char* path, int32_t buflen = -1 ); virtual ~FileInputStream (); int32_t read(const signed char*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); size_t size(); void setMinBufSize(int32_t minbufsize); }; class CLUCENE_EXPORT SimpleInputStreamReader: public BufferedReader{ class Internal; Internal* _internal; protected: void init(InputStream *i, int encoding); public: enum{ ASCII=1, UTF8=2, UCS2_LE=3 }; SimpleInputStreamReader(); SimpleInputStreamReader(InputStream *i, int encoding); virtual ~SimpleInputStreamReader(); int32_t read(const TCHAR*& start, int32_t min, int32_t max); int64_t position(); int64_t reset(int64_t); int64_t skip(int64_t ntoskip); void setMinBufSize(int32_t s); size_t size(); }; /** * A helper class which constructs a FileReader with a specified * simple encodings, or a given inputstreamreader. * It is recommended that you use the contribs package for proper * decoding using iconv. This class is provided only as a dependency-less * replacement. */ class CLUCENE_EXPORT FileReader: public SimpleInputStreamReader{ public: FileReader(const char* path, int encoding, int32_t buflen = -1); FileReader(const char* path, const char* encoding, int32_t buflen = -1); virtual ~FileReader(); }; CL_NS_END #define jstreams CL_NS(util) #endif clucene-core-2.3.3.4/src/core/CLucene/util/Equators.cpp000066400000000000000000000105061154025176300225540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Equators.h" #include "CLucene/util/Misc.h" CL_NS_DEF(util) bool Equals::Int32::operator()( const int32_t val1, const int32_t val2 ) const{ return (val1)==(val2); } bool Equals::Char::operator()( const char* val1, const char* val2 ) const{ if ( val1 == val2 ) return true; return (strcmp( val1,val2 ) == 0); } #ifdef _UCS2 bool Equals::WChar::operator()( const wchar_t* val1, const wchar_t* val2 ) const{ if ( val1 == val2 ) return true; return (_tcscmp( val1,val2 ) == 0); } #endif AbstractDeletor::~AbstractDeletor(){ } //////////////////////////////////////////////////////////////////////////////// // Comparors //////////////////////////////////////////////////////////////////////////////// int32_t compare(Comparable* o1, Comparable* o2){ if ( o1 == NULL && o2 == NULL ) return 0; else if ( o1 == NULL ) return 1; else if ( o2 == NULL ) return -1; else return o1->compareTo(o2); } NamedObject::~NamedObject(){ } bool NamedObject::instanceOf(const char* other) const{ const char* t = this->getObjectName(); if ( t==other || strcmp( t, other )==0 ) return true; else return false; } int32_t Compare::Int32::getValue() const{ return value; } Compare::Int32::Int32(int32_t val){ value = val; } Compare::Int32::Int32(){ value = 0; } const char* Compare::Int32::getClassName(){ return "Compare::Int32::getClassName"; } const char* Compare::Int32::getObjectName() const{ return getClassName(); } int32_t Compare::Int32::compareTo(NamedObject* o){ if ( o->getObjectName() != Int32::getClassName() ) return -1; Int32* other = (Int32*)o; if (value == other->value) return 0; // Returns just -1 or 1 on inequality; doing math might overflow. return value > other->value ? 1 : -1; } bool Compare::Int32::operator()( int32_t t1, int32_t t2 ) const{ return t1 > t2 ? true : false; } size_t Compare::Int32::operator()( int32_t t ) const{ return t; } float_t Compare::Float::getValue() const{ return value; } Compare::Float::Float(float_t val){ value = val; } const char* Compare::Float::getClassName(){ return "Compare::Float::getClassName"; } const char* Compare::Float::getObjectName() const{ return getClassName(); } int32_t Compare::Float::compareTo(NamedObject* o){ if ( o->getObjectName() != Float::getClassName() ) return -1; Float* other = (Float*)o; if (value == other->value) return 0; // Returns just -1 or 1 on inequality; doing math might overflow. return value > other->value ? 1 : -1; } bool Compare::Char::operator()( const char* val1, const char* val2 ) const{ if ( val1==val2) return false; return (strcmp( val1,val2 ) < 0); } size_t Compare::Char::operator()( const char* val1) const{ return CL_NS(util)::Misc::ahashCode(val1); } const char* Compare::Char::getValue() const{ return s; } Compare::Char::Char(){ s=NULL; } Compare::Char::Char(const char* str){ this->s = str; } const char* Compare::Char::getClassName(){ return "Compare::Char::getClassName"; } const char* Compare::Char::getObjectName() const{ return getClassName(); } int32_t Compare::Char::compareTo(NamedObject* o){ if ( o->getObjectName() != Char::getClassName() ) return -1; Char* os = (Char*)o; return strcmp(s,os->s); } #ifdef _UCS2 bool Compare::WChar::operator()( const wchar_t* val1, const wchar_t* val2 ) const{ if ( val1==val2) return false; bool ret = (_tcscmp( val1,val2 ) < 0); return ret; } size_t Compare::WChar::operator()( const wchar_t* val1) const{ return CL_NS(util)::Misc::whashCode(val1); } const wchar_t* Compare::WChar::getValue() const{ return s; } Compare::WChar::WChar(){ s=NULL; } Compare::WChar::WChar(const wchar_t* str){ this->s = str; } const char* Compare::WChar::getClassName(){ return "Compare::WChar::getClassName"; } const char* Compare::WChar::getObjectName() const{ return getClassName(); } int32_t Compare::WChar::compareTo(NamedObject* o){ if ( o->getObjectName() != WChar::getClassName() ) return -1; TChar* os = (TChar*)o; return _tcscmp(s,os->s); } #endif CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/Equators.h000066400000000000000000000160511154025176300222220ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_Equators_ #define _lucene_util_Equators_ #include #include #include #include #include //#include "CLucene/LuceneThreads.h" CL_NS_DEF(util) //////////////////////////////////////////////////////////////////////////////// // Equators //////////////////////////////////////////////////////////////////////////////// /** @internal */ class CLUCENE_INLINE_EXPORT Equals{ public: class CLUCENE_INLINE_EXPORT Int32:public CL_NS_STD(binary_function) { public: bool operator()( const int32_t val1, const int32_t val2 ) const; }; class CLUCENE_INLINE_EXPORT Char:public CL_NS_STD(binary_function) { public: bool operator()( const char* val1, const char* val2 ) const; }; #ifdef _UCS2 class CLUCENE_INLINE_EXPORT WChar: public CL_NS_STD(binary_function) { public: bool operator()( const wchar_t* val1, const wchar_t* val2 ) const; }; class CLUCENE_INLINE_EXPORT TChar: public WChar{ }; #else class CLUCENE_INLINE_EXPORT TChar: public Char{ }; #endif template class CLUCENE_INLINE_EXPORT Void:public CL_NS_STD(binary_function) { public: bool operator()( _cl* val1, _cl* val2 ) const{ return val1==val2; } }; }; //////////////////////////////////////////////////////////////////////////////// // Comparors //////////////////////////////////////////////////////////////////////////////// class CLUCENE_EXPORT NamedObject{ public: virtual ~NamedObject(); virtual const char* getObjectName() const = 0; virtual bool instanceOf(const char* otherobject) const; }; class CLUCENE_EXPORT Comparable:public NamedObject{ public: virtual ~Comparable(){ } virtual int32_t compareTo(NamedObject* o) = 0; }; /** @internal */ class CLUCENE_INLINE_EXPORT Compare{ public: class CLUCENE_EXPORT _base { // traits class for hash containers public: enum { // parameters for hash table bucket_size = 4, // 0 < bucket_size min_buckets = 8 }; // min_buckets = 2 ^^ N, 0 < N _base() { } }; class CLUCENE_INLINE_EXPORT Int32:public _base, public Comparable{ int32_t value; public: int32_t getValue() const; Int32(int32_t val); Int32(); int32_t compareTo(NamedObject* o); bool operator()( int32_t t1, int32_t t2 ) const; size_t operator()( int32_t t ) const; static const char* getClassName(); const char* getObjectName() const; }; class CLUCENE_INLINE_EXPORT Float:public Comparable{ float_t value; public: float_t getValue() const; Float(float_t val); int32_t compareTo(NamedObject* o); static const char* getClassName(); const char* getObjectName() const; }; class CLUCENE_EXPORT Char: public _base, public Comparable // { const char* s; public: const char* getValue() const; Char(); Char(const char* str); int32_t compareTo(NamedObject* o); bool operator()( const char* val1, const char* val2 ) const; size_t operator()( const char* val1) const; static const char* getClassName(); const char* getObjectName() const; }; #ifdef _UCS2 class CLUCENE_EXPORT WChar: public _base, public Comparable // { const wchar_t* s; public: const wchar_t* getValue() const; WChar(); WChar(const wchar_t* str); int32_t compareTo(NamedObject* o); bool operator()( const wchar_t* val1, const wchar_t* val2 ) const; size_t operator()( const wchar_t* val1) const; static const char* getClassName(); const char* getObjectName() const; }; typedef WChar TChar; #else typedef Char TChar; #endif template class CLUCENE_INLINE_EXPORT Void:public _base // { public: int32_t compareTo(_cl* o){ if ( this == o ) return o; else return this > o ? 1 : -1; } bool operator()( _cl* t1, _cl* t2 ) const{ return t1 > t2 ? true : false; } size_t operator()( _cl* t ) const{ return (size_t)t; } }; }; int32_t compare(Comparable* o1, Comparable* o2); //////////////////////////////////////////////////////////////////////////////// // allocators //////////////////////////////////////////////////////////////////////////////// /** @internal */ class CLUCENE_INLINE_EXPORT AbstractDeletor{ public: virtual void Delete(void*) = 0; virtual ~AbstractDeletor(); }; class CLUCENE_INLINE_EXPORT Deletor{ public: class CLUCENE_INLINE_EXPORT tcArray: public AbstractDeletor{ public: void Delete(void* _arr){ doDelete((TCHAR*)_arr); } static void doDelete(TCHAR* arr){ _CLDELETE_CARRAY(arr); } }; template class CLUCENE_INLINE_EXPORT vArray: public AbstractDeletor{ public: void Delete(void* arr){ doDelete((_kt*)arr); } static void doDelete(_kt* arr){ _CLDELETE_LARRAY(arr); } }; class CLUCENE_INLINE_EXPORT acArray: public AbstractDeletor{ public: void Delete(void* arr){ doDelete((char*)arr); } static void doDelete(char* arr){ _CLDELETE_CaARRAY(arr); } }; template class CLUCENE_INLINE_EXPORT Object: public AbstractDeletor{ public: void Delete(void* obj){ doDelete((_kt*)obj); } static void doDelete(_kt* obj){ _CLDELETE(obj); } }; template class CLUCENE_INLINE_EXPORT Void: public AbstractDeletor{ public: void Delete(void* obj){ doDelete((_kt*)obj); } static void doDelete(_kt* obj){ _CLVDELETE(obj); } }; class CLUCENE_INLINE_EXPORT Dummy: public AbstractDeletor{ public: void Delete(void*){} static void doDelete(const void*){ //todo: remove all occurances where it hits this point //CND_WARNING(false,"Deletor::Dummy::doDelete run, set deleteKey or deleteValue to false"); } }; class CLUCENE_INLINE_EXPORT DummyInt32: public AbstractDeletor{ public: void Delete(void*){} static void doDelete(const int32_t){ } }; class CLUCENE_INLINE_EXPORT DummyFloat: public AbstractDeletor{ public: void Delete(void*){} static void doDelete(const float_t){ } }; template class CLUCENE_INLINE_EXPORT ConstNullVal: public AbstractDeletor{ public: void Delete(void*){} static void doDelete(const _type){ //todo: remove all occurances where it hits this point //CND_WARNING(false,"Deletor::Dummy::doDelete run, set deleteKey or deleteValue to false"); } }; template class CLUCENE_INLINE_EXPORT NullVal: public AbstractDeletor{ public: void Delete(void*){} static void doDelete(_type){ //todo: remove all occurances where it hits this point //CND_WARNING(false,"Deletor::Dummy::doDelete run, set deleteKey or deleteValue to false"); } }; }; //////////////////////////////////////////////////////////////////////////////// CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/FastCharStream.cpp000066400000000000000000000043571154025176300236270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_FastCharStream.h" #include "CLucene/util/CLStreams.h" CL_NS_DEF(util) const int32_t FastCharStream::maxRewindSize = LUCENE_MAX_WORD_LEN*2; FastCharStream::FastCharStream(BufferedReader* reader): pos(0), rewindPos(0), resetPos(0), col(1), line(1), input(reader) { input->setMinBufSize(maxRewindSize); } FastCharStream::~FastCharStream(){ } void FastCharStream::reset() { pos = 0; rewindPos = 0; resetPos = 0; col = 1; line = 1; input->setMinBufSize(maxRewindSize); } void FastCharStream::readChar(TCHAR &c) { try{ int32_t r = input->read(); if ( r == -1 ) input = NULL; c = r; }catch(CLuceneError& err){ if ( err.number() == CL_ERR_IO ) input = 0; throw err; } } int FastCharStream::GetNext() { if (input == 0 ) // end of file { _CLTHROWA(CL_ERR_IO,"warning : FileReader.GetNext : Read TCHAR over EOS."); } // this is rather inefficient // implementing the functions from the java version of // charstream will be much more efficient. ++pos; TCHAR ch; readChar(ch); if (input == NULL) { // eof return -1; } if (rewindPos == 0) { col += 1; if(ch == '\n') { line++; col = 1; } } else { rewindPos--; } return ch; } void FastCharStream::UnGet(){ // printf("UnGet \n"); if (input == 0) return; if ( pos == 0 ) { _CLTHROWA(CL_ERR_IO,"error : No character can be UnGet"); } rewindPos++; input->reset(pos-1); pos--; } int FastCharStream::Peek() { int c = GetNext(); UnGet(); return c; } bool FastCharStream::Eos() const { return input==NULL; } int32_t FastCharStream::Column() const { return col; } int32_t FastCharStream::Line() const { return line; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/MD5Digester.cpp000066400000000000000000000226371154025176300230350ustar00rootroot00000000000000///////////////////////////////////////////////////////////////////////// // MD5.cpp // Implementation file for MD5 class // // This C++ Class implementation of the original RSA Data Security, Inc. // MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. // All rights reserved. This software is a derivative of the "RSA Data // Security, Inc. MD5 Message-Digest Algorithm" // // You may use this software free of any charge, but without any // warranty or implied warranty, provided that you follow the terms // of the original RSA copyright, listed below. // // Original RSA Data Security, Inc. Copyright notice ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All // rights reserved. // // License to copy and use this software is granted provided that it // is identified as the "RSA Data Security, Inc. MD5 Message-Digest // Algorithm" in all material mentioning or referencing this software // or this function. // License is also granted to make and use derivative works provided // that such works are identified as "derived from the RSA Data // Security, Inc. MD5 Message-Digest Algorithm" in all material // mentioning or referencing the derived work. // RSA Data Security, Inc. makes no representations concerning either // the merchantability of this software or the suitability of this // software for any particular purpose. It is provided "as is" // without express or implied warranty of any kind. // These notices must be retained in any copies of any part of this // documentation and/or software. ///////////////////////////////////////////////////////////////////////// /*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_MD5Digester.h" CL_NS_DEF(util) static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 // PrintMD5: Converts a completed md5 digest into a char* string. char* PrintMD5(uint8_t md5Digest[16]) { char chBuffer[256]; char chEach[10]; int nCount; memset(chBuffer,0,256); memset(chEach, 0, 10); for (nCount = 0; nCount < 16; nCount++) { cl_sprintf(chEach, 10, "%02x", md5Digest[nCount]); strncat(chBuffer, chEach, sizeof(chEach)); } return STRDUP_AtoA(chBuffer); } // MD5String: Performs the MD5 algorithm on a char* string, returning // the results as a char*. char* MD5String(char* szString) { int nLen = strlen(szString); md5 alg; alg.Update((unsigned char*)szString, (unsigned int)nLen); alg.Finalize(); return PrintMD5(alg.Digest()); } // MD5File: Performs the MD5 algorithm on a file (binar or text), // returning the results as a char*. Returns NULL if it fails. char* MD5File(char* szFilename) { FILE* file; md5 alg; int nLen; unsigned char chBuffer[1024]; try { memset(chBuffer, 0, 1024); if ((file = fopen (szFilename, "rb")) != NULL) { while ((nLen = fread (chBuffer, 1, 1024, file))) alg.Update(chBuffer, nLen); alg.Finalize(); fclose (file); return PrintMD5(alg.Digest()); } } catch(...) //todo: only catch IO Err??? { } return NULL; // failed } // md5::Init // Initializes a new context. void md5::Init() { memset(m_Count, 0, 2 * sizeof(uint32_t)); m_State[0] = 0x67452301; m_State[1] = 0xefcdab89; m_State[2] = 0x98badcfe; m_State[3] = 0x10325476; } // md5::Update // MD5 block update operation. Continues an MD5 message-digest // operation, processing another message block, and updating the // context. void md5::Update(uint8_t* chInput, uint32_t nInputLen) { uint32_t i, index, partLen; // Compute number of bytes mod 64 index = (unsigned int)((m_Count[0] >> 3) & 0x3F); // Update number of bits if ((m_Count[0] += (nInputLen << 3)) < (nInputLen << 3)) m_Count[1]++; m_Count[1] += (nInputLen >> 29); partLen = 64 - index; // Transform as many times as possible. if (nInputLen >= partLen) { memcpy( &m_Buffer[index], chInput, partLen ); Transform(m_Buffer); for (i = partLen; i + 63 < nInputLen; i += 64) Transform(&chInput[i]); index = 0; } else i = 0; // Buffer remaining input memcpy( &m_Buffer[index], &chInput[i], nInputLen-i ); } // md5::Finalize // MD5 finalization. Ends an MD5 message-digest operation, writing // the message digest and zeroizing the context. void md5::Finalize() { uint8_t bits[8]; uint32_t index, padLen; // Save number of bits Encode (bits, m_Count, 8); // Pad out to 56 mod 64 index = (unsigned int)((m_Count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); Update(PADDING, padLen); // Append length (before padding) Update (bits, 8); // Store state in digest Encode (m_Digest, m_State, 16); memset(m_Count, 0, 2 * sizeof(uint32_t)); memset(m_State, 0, 4 * sizeof(uint32_t)); memset(m_Buffer,0, 64 * sizeof(uint8_t)); } // md5::Transform // MD5 basic transformation. Transforms state based on block. void md5::Transform (uint8_t* block) { uint32_t a = m_State[0], b = m_State[1], c = m_State[2], d = m_State[3], x[16]; Decode (x, block, 64); // Round 1 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); FF (c, d, a, b, x[ 2], S13, 0x242070db); FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); FF (d, a, b, c, x[ 5], S12, 0x4787c62a); FF (c, d, a, b, x[ 6], S13, 0xa8304613); FF (b, c, d, a, x[ 7], S14, 0xfd469501); FF (a, b, c, d, x[ 8], S11, 0x698098d8); FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); FF (c, d, a, b, x[10], S13, 0xffff5bb1); FF (b, c, d, a, x[11], S14, 0x895cd7be); FF (a, b, c, d, x[12], S11, 0x6b901122); FF (d, a, b, c, x[13], S12, 0xfd987193); FF (c, d, a, b, x[14], S13, 0xa679438e); FF (b, c, d, a, x[15], S14, 0x49b40821); // Round 2 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); GG (d, a, b, c, x[ 6], S22, 0xc040b340); GG (c, d, a, b, x[11], S23, 0x265e5a51); GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); GG (a, b, c, d, x[ 5], S21, 0xd62f105d); GG (d, a, b, c, x[10], S22, 0x2441453); GG (c, d, a, b, x[15], S23, 0xd8a1e681); GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); GG (d, a, b, c, x[14], S22, 0xc33707d6); GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); GG (b, c, d, a, x[ 8], S24, 0x455a14ed); GG (a, b, c, d, x[13], S21, 0xa9e3e905); GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); GG (c, d, a, b, x[ 7], S23, 0x676f02d9); GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); // Round 3 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); HH (d, a, b, c, x[ 8], S32, 0x8771f681); HH (c, d, a, b, x[11], S33, 0x6d9d6122); HH (b, c, d, a, x[14], S34, 0xfde5380c); HH (a, b, c, d, x[ 1], S31, 0xa4beea44); HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); HH (b, c, d, a, x[10], S34, 0xbebfbc70); HH (a, b, c, d, x[13], S31, 0x289b7ec6); HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); HH (b, c, d, a, x[ 6], S34, 0x4881d05); HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); HH (d, a, b, c, x[12], S32, 0xe6db99e5); HH (c, d, a, b, x[15], S33, 0x1fa27cf8); HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); // Round 4 II (a, b, c, d, x[ 0], S41, 0xf4292244); II (d, a, b, c, x[ 7], S42, 0x432aff97); II (c, d, a, b, x[14], S43, 0xab9423a7); II (b, c, d, a, x[ 5], S44, 0xfc93a039); II (a, b, c, d, x[12], S41, 0x655b59c3); II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); II (c, d, a, b, x[10], S43, 0xffeff47d); II (b, c, d, a, x[ 1], S44, 0x85845dd1); II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); II (d, a, b, c, x[15], S42, 0xfe2ce6e0); II (c, d, a, b, x[ 6], S43, 0xa3014314); II (b, c, d, a, x[13], S44, 0x4e0811a1); II (a, b, c, d, x[ 4], S41, 0xf7537e82); II (d, a, b, c, x[11], S42, 0xbd3af235); II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); II (b, c, d, a, x[ 9], S44, 0xeb86d391); m_State[0] += a; m_State[1] += b; m_State[2] += c; m_State[3] += d; memset(x, 0, sizeof(x)); } // md5::Encode // Encodes input (uint32_t) into output (uint8_t). Assumes nLength is // a multiple of 4. void md5::Encode(uint8_t* dest, uint32_t* src, uint32_t nLength) { uint32_t i, j; CND_PRECONDITION(nLength % 4 == 0,"nLength % 4 != 0") for (i = 0, j = 0; j < nLength; i++, j += 4) { dest[j] = (uint8_t)(src[i] & 0xff); dest[j+1] = (uint8_t)((src[i] >> 8) & 0xff); dest[j+2] = (uint8_t)((src[i] >> 16) & 0xff); dest[j+3] = (uint8_t)((src[i] >> 24) & 0xff); } } // md5::Decode // Decodes input (uint8_t) into output (uint32_t). Assumes nLength is // a multiple of 4. void md5::Decode(uint32_t* dest, uint8_t* src, uint32_t nLength) { uint32_t i, j; CND_PRECONDITION(nLength % 4 == 0, "nLength % 4 != 0"); for (i = 0, j = 0; j < nLength; i++, j += 4) { dest[i] = ((uint32_t)src[j]) | (((uint32_t)src[j+1])<<8) | (((uint32_t)src[j+2])<<16) | (((uint32_t)src[j+3])<<24); } } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/PriorityQueue.h000066400000000000000000000125061154025176300232460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_PriorityQueue_ #define _lucene_util_PriorityQueue_ #include CL_NS_DEF(util) /** A PriorityQueue maintains a partial ordering of its elements such that the least element can always be found in constant time. Put()'s and pop()'s require log(size) time. */ template class CLUCENE_INLINE_EXPORT PriorityQueue { private: size_t _size; bool dk; size_t maxSize; protected: _type* heap; //(was object[]) private: void upHeap(){ size_t i = _size; _type node = heap[i]; // save bottom node (WAS object) int32_t j = ((uint32_t)i) >> 1; while (j > 0 && lessThan(node,heap[j])) { heap[i] = heap[j]; // shift parents down i = j; j = ((uint32_t)j) >> 1; } heap[i] = node; // install saved node } void downHeap(){ size_t i = 1; _type node = heap[i]; // save top node size_t j = i << 1; // find smaller child size_t k = j + 1; if (k <= _size && lessThan(heap[k], heap[j])) { j = k; } while (j <= _size && lessThan(heap[j],node)) { heap[i] = heap[j]; // shift up child i = j; j = i << 1; k = j + 1; if (k <= _size && lessThan(heap[k], heap[j])) { j = k; } } heap[i] = node; // install saved node } protected: PriorityQueue():_size(0),dk(false),maxSize(0),heap(NULL){ } // Determines the ordering of objects in this priority queue. Subclasses // must define this one method. virtual bool lessThan(_type a, _type b)=0; // Subclass constructors must call this. void initialize(const int32_t maxSize, bool deleteOnClear){ _size = 0; dk = deleteOnClear; int32_t heapSize; if (0 == maxSize) // We allocate 1 extra to avoid if statement in top() heapSize = 2; else heapSize = maxSize + 1; heap = _CL_NEWARRAY(_type,heapSize); this->maxSize = maxSize; } public: virtual ~PriorityQueue(){ clear(); _CLDELETE_LARRAY(heap); } /** * Adds an Object to a PriorityQueue in log(size) time. * If one tries to add more objects than maxSize from initialize * a RuntimeException (ArrayIndexOutOfBound) is thrown. */ void put(_type element){ if ( _size>=maxSize ) _CLTHROWA(CL_ERR_IndexOutOfBounds,"add is out of bounds"); ++_size; heap[_size] = element; upHeap(); } /** * Adds element to the PriorityQueue in log(size) time if either * the PriorityQueue is not full, or not lessThan(element, top()). * @param element * @return true if element is added, false otherwise. */ bool insert(_type element){ _type t = insertWithOverflow(element); if (t != element) { if (t) _valueDeletor::doDelete(t); return true; } return false; } /** * insertWithOverflow() is the same as insert() except its * return value: it returns the object (if any) that was * dropped off the heap because it was full. This can be * the given parameter (in case it is smaller than the * full heap's minimum, and couldn't be added), or another * object that was previously the smallest value in the * heap and now has been replaced by a larger one, or null * if the queue wasn't yet full with maxSize elements. * NOTE: value is not being deleted - its the user responsibilty * to dispose the returned _type (only if != NULL && != element). */ _type insertWithOverflow(_type element) { if(_size < maxSize){ put(element); return NULL; }else if(_size > 0 && !lessThan(element, heap[1])){ _type ret = heap[1]; heap[1] = element; adjustTop(); return ret; }else return element; } /** * Returns the least element of the PriorityQueue in constant time. */ _type top(){ // We don't need to check size here: if maxSize is 0, // then heap is length 2 array with both entries null. // If size is 0 then heap[1] is already null. return heap[1]; } /** Removes and returns the least element of the PriorityQueue in log(size) * time. */ _type pop(){ if (_size > 0) { _type result = heap[1]; // save first value heap[1] = heap[_size]; // move last to first heap[_size] = (_type)0; // permit GC of objects --_size; downHeap(); // adjust heap return result; } else return (_type)NULL; } /**Should be called when the object at top changes values. Still log(n) worst case, but it's at least twice as fast to
		    { pq.top().change(); pq.adjustTop(); }
		   
instead of
		    { o = pq.pop(); o.change(); pq.push(o); }
		   
*/ void adjustTop(){ downHeap(); } /** * Returns the number of elements currently stored in the PriorityQueue. */ size_t size(){ return _size; } /** * Removes all entries from the PriorityQueue. */ void clear(){ for (size_t i = 1; i <= _size; ++i){ if ( dk ){ _valueDeletor::doDelete(heap[i]); } } _size = 0; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/Reader.cpp000066400000000000000000000332271154025176300221600ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "CLStreams.h" #include "CLucene/util/Misc.h" #include #ifdef _CL_HAVE_IO_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif #ifdef _CL_HAVE_DIRECT_H #include #endif #include #include "_bufferedstream.h" CL_NS_DEF(util) StringReader::StringReader ( const TCHAR* _value, const int32_t _length, bool copyData ) { this->m_size = 0; this->value = NULL; this->ownValue = true; this->buffer_size = 0; this->init(_value,_length,copyData); } void StringReader::init ( const TCHAR* _value, const int32_t _length, bool copyData ){ const size_t length = ( _length < 0 ? _tcslen(_value) : _length ); this->pos = 0; if ( copyData ){ TCHAR* tmp = (TCHAR*)this->value; if ( tmp == NULL || !this->ownValue ){ tmp = _CL_NEWARRAY(TCHAR, length+1); this->buffer_size = length; }else if ( length > this->buffer_size || length < (this->buffer_size/2) ){ //expand, or shrink tmp = (TCHAR*)realloc(tmp, sizeof(TCHAR) * (length+1)); this->buffer_size = length; } _tcsncpy(tmp, _value, length+1); this->value = tmp; }else{ if ( ownValue && this->value != NULL) _CLDELETE_LARRAY( (TCHAR*)this->value); this->value = _value; this->buffer_size = 0; } this->m_size = length; this->ownValue = copyData; } StringReader::~StringReader(){ if ( ownValue && this->value != NULL){ TCHAR* value = (TCHAR*) this->value; _CLDELETE_LARRAY(value); this->value = NULL; } } size_t StringReader::size(){ return m_size; } int32_t StringReader::read(const TCHAR*& start, int32_t min, int32_t max){ if ( m_size == pos ) return -1; start = this->value + pos; int32_t r = (int32_t)cl_min(cl_max(min,max),m_size-pos); pos += r; return r; } int64_t StringReader::position(){ return pos; } void StringReader::setMinBufSize(int32_t /*s*/){ } int64_t StringReader::reset(int64_t pos){ if ( pos >= 0 && pos < this->m_size ) this->pos = pos; return this->pos; } int64_t StringReader::skip(int64_t ntoskip){ int64_t s = cl_min(ntoskip, m_size-pos); this->pos += s; return s; } AStringReader::AStringReader ( char* value, const int32_t length, bool copyData ) { this->m_size = length; this->pos = 0; if ( copyData ){ this->value = _CL_NEWARRAY(signed char, this->m_size); strncpy((char*)this->value, value, this->m_size); }else{ this->value = (signed char*)value; } this->ownValue = copyData; } AStringReader::AStringReader ( const char* value, const int32_t length ){ if ( length >= 0 ) this->m_size = length; else this->m_size = strlen(value); this->pos = 0; this->value = _CL_NEWARRAY(signed char, this->m_size); strncpy((char*)this->value, value, this->m_size); this->ownValue = true; } AStringReader::~AStringReader(){ if ( ownValue ) _CLDELETE_ARRAY(this->value); } size_t AStringReader::size(){ return m_size; } int32_t AStringReader::read(const signed char*& start, int32_t min, int32_t max){ if ( m_size == pos ) return -1; start = this->value + pos; int32_t r = (int32_t)cl_min(cl_max(min,max),m_size-pos); pos += r; return r; } int32_t AStringReader::read(const unsigned char*& start, int32_t min, int32_t max){ if ( m_size == pos ) return -1; start = (unsigned char*)(this->value + pos); int32_t r = (int32_t)cl_min(cl_max(min,max),m_size-pos); pos += r; return r; } int64_t AStringReader::position(){ return pos; } void AStringReader::setMinBufSize(int32_t /*s*/){ } int64_t AStringReader::reset(int64_t pos){ if ( pos >= 0 && pos < this->m_size ) this->pos = pos; return this->pos; } int64_t AStringReader::skip(int64_t ntoskip){ int64_t s = cl_min(ntoskip, m_size-pos); this->pos += s; return s; } class FileInputStream::Internal{ public: class JStreamsBuffer: public BufferedInputStreamImpl{ int32_t fhandle; protected: int32_t fillBuffer(signed char* start, int32_t space){ if (fhandle == 0) return -1; // read into the buffer int32_t nwritten = ::_read(fhandle, start, space); // check the file stream status if (nwritten == -1 ) { m_error = "Could not read from file"; m_status = CL_NS(util)::Error; if ( fhandle > 0 ){ ::_close(fhandle); fhandle = 0; } return -1; }else if ( nwritten == 0 ) { ::_close(fhandle); fhandle = 0; } return nwritten; } public: int encoding; JStreamsBuffer(int32_t fhandle, int32_t buffersize){ this->fhandle = fhandle; m_size = fileSize(fhandle); // no need to know the file length... // allocate memory in the buffer int32_t bufsize = (int32_t)((m_size <= buffersize) ?m_size+1 :buffersize); setMinBufSize(bufsize); } void _setMinBufSize(int32_t bufsize){ this->setMinBufSize(bufsize); } ~JStreamsBuffer(){ if ( fhandle > 0 ){ if ( ::_close(fhandle) != 0 ) _CLTHROWA(CL_ERR_IO, "File IO Close error"); } } }; JStreamsBuffer* jsbuffer; Internal(const char* path, int32_t buffersize){ int32_t fhandle = _cl_open(path, _O_BINARY | O_RDONLY | _O_RANDOM, _S_IREAD ); //Check if a valid handle was retrieved if (fhandle < 0){ int err = errno; if ( err == ENOENT ) _CLTHROWA(CL_ERR_IO, "File does not exist"); else if ( err == EACCES ) _CLTHROWA(CL_ERR_IO, "File Access denied"); else if ( err == EMFILE ) _CLTHROWA(CL_ERR_IO, "Too many open files"); else _CLTHROWA(CL_ERR_IO, "Could not open file"); } jsbuffer = new JStreamsBuffer(fhandle, buffersize); } ~Internal(){ delete jsbuffer; } }; FileInputStream::FileInputStream ( const char* path, int32_t buflen ) { if ( buflen == -1 ) buflen = DEFAULT_BUFFER_SIZE; _internal = new Internal(path, buflen); } size_t FileInputStream::size(){ return (size_t)_internal->jsbuffer->size(); } FileInputStream::~FileInputStream () { delete _internal; } int32_t FileInputStream::read(const signed char*& start, int32_t min, int32_t max){ return _internal->jsbuffer->read(start,min,max); } int64_t FileInputStream::position(){ return _internal->jsbuffer->position(); } int64_t FileInputStream::reset(int64_t to){ return _internal->jsbuffer->reset(to); } int64_t FileInputStream::skip(int64_t ntoskip){ return _internal->jsbuffer->skip(ntoskip); } void FileInputStream::setMinBufSize(int32_t minbufsize){ _internal->jsbuffer->_setMinBufSize(minbufsize); } FileReader::FileReader(const char *path, const char *enc, int32_t buflen) { int encoding; if ( strcmp(enc,"ASCII")==0 ) encoding = ASCII; #ifdef _UCS2 else if ( strcmp(enc,"UTF-8")==0 ) encoding = UTF8; else if ( strcmp(enc,"UCS-2LE")==0 ) encoding = UCS2_LE; #endif else _CLTHROWA(CL_ERR_IllegalArgument,"Unsupported encoding, use jstreams iconv based instead"); init( _CLNEW FileInputStream(path, buflen), encoding); } FileReader::FileReader(const char *path, int encoding, int32_t buflen) { init(_CLNEW FileInputStream(path, buflen), encoding); } FileReader::~FileReader(){ } class SimpleInputStreamReader::Internal{ public: class JStreamsBuffer: public BufferedReaderImpl{ InputStream* input; char utf8buf[6]; //< buffer used for converting utf8 characters protected: int readChar(){ const signed char* buf; if ( encoding == ASCII ){ int32_t ret = this->input->read(buf, 1, 1) ; if ( ret == 1 ){ return buf[0]; }else return -1; }else if ( encoding == UCS2_LE ){ int32_t ret = this->input->read(buf, 2, 2); if ( ret < 0 ) return -1; else if ( ret == 1 ){ return buf[0]; }else{ uint8_t c1 = *buf; uint8_t c2 = *(buf+1); return c1 | (c2<<8); } }else if ( encoding == UTF8 ){ int32_t ret = this->input->read(buf, 1, 1); if ( ret == 1 ){ int len = lucene_utf8charlen(buf[0]); if ( len > 1 ){ *utf8buf = buf[0]; ret = this->input->read(buf, len-1, len-1); }else return buf[0]; if ( ret >= 0 ){ if ( ret == len-1 ){ memcpy(utf8buf+1,buf,ret); wchar_t wcbuf=0; lucene_utf8towc(wcbuf, utf8buf); return wcbuf; } } }else if ( ret == -1 ) return -1; this->m_error = "Invalid multibyte sequence."; this->m_status = CL_NS(util)::Error; }else{ this->m_error = "Unexpected encoding"; this->m_status = CL_NS(util)::Error; } return -1; } int32_t fillBuffer(TCHAR* start, int32_t space){ if ( input == NULL ) return -1; int c; int32_t i; for(i=0;im_status == CL_NS(util)::Ok ){ if ( i == 0 ) return -1; break; } return -1; } start[i] = c; } return i; } public: int encoding; JStreamsBuffer(InputStream* input, int encoding){ this->input = input; this->encoding = encoding; setMinBufSize(1024); } virtual ~JStreamsBuffer(){ _CLDELETE(input); } void _setMinBufSize(int32_t min){ this->setMinBufSize(min); } }; JStreamsBuffer* jsbuffer; Internal(InputStream* input, int encoding){ jsbuffer = new JStreamsBuffer(input, encoding); } ~Internal(){ delete jsbuffer; } }; SimpleInputStreamReader::SimpleInputStreamReader(){ _internal = NULL; } SimpleInputStreamReader::SimpleInputStreamReader(InputStream *i, int encoding){ _internal = new Internal(i, encoding); } void SimpleInputStreamReader::init(InputStream *i, int encoding){ _internal = new Internal(i, encoding); } SimpleInputStreamReader::~SimpleInputStreamReader(){ delete _internal; } int32_t SimpleInputStreamReader::read(const TCHAR*& start, int32_t min, int32_t max){ return _internal->jsbuffer->read(start, min, max); } int64_t SimpleInputStreamReader::position(){ return _internal->jsbuffer->position(); } int64_t SimpleInputStreamReader::reset(int64_t to){ return _internal->jsbuffer->reset(to); } int64_t SimpleInputStreamReader::skip(int64_t ntoskip){ return _internal->jsbuffer->skip(ntoskip); } size_t SimpleInputStreamReader::size(){ return (size_t)_internal->jsbuffer->size(); } void SimpleInputStreamReader::setMinBufSize(int32_t minbufsize){ _internal->jsbuffer->_setMinBufSize(minbufsize); } class FilteredBufferedReader::Internal{ public: class JStreamsFilteredBuffer: public BufferedReaderImpl{ Reader* input; bool deleteInput; protected: int32_t fillBuffer(TCHAR* start, int32_t space){ const TCHAR* buffer; int32_t r = input->read(buffer, 1, space); if ( r > 0 ) _tcsncpy(start, buffer, r); return r; } public: JStreamsFilteredBuffer(Reader* input, bool deleteInput){ this->input = input; this->deleteInput = deleteInput; } ~JStreamsFilteredBuffer(){ if ( deleteInput ) _CLDELETE(input); } void _setMinBufSize(int32_t min){ this->setMinBufSize(min); } }; JStreamsFilteredBuffer* jsbuffer; Internal(Reader* reader, bool deleteReader){ this->jsbuffer = new JStreamsFilteredBuffer(reader, deleteReader); } ~Internal(){ delete jsbuffer; } }; FilteredBufferedReader::FilteredBufferedReader(Reader* reader, bool deleteReader){ _internal = new Internal(reader, deleteReader); } FilteredBufferedReader::~FilteredBufferedReader(){ delete _internal; } int32_t FilteredBufferedReader::read(const TCHAR*& start, int32_t min, int32_t max){ return _internal->jsbuffer->read(start,min,max); } int64_t FilteredBufferedReader::position(){ return _internal->jsbuffer->position(); } int64_t FilteredBufferedReader::reset(int64_t p){ return _internal->jsbuffer->reset(p); } int64_t FilteredBufferedReader::skip(int64_t ntoskip){ return _internal->jsbuffer->skip(ntoskip); } size_t FilteredBufferedReader::size(){ return (size_t)_internal->jsbuffer->size(); } void FilteredBufferedReader::setMinBufSize(int32_t minbufsize){ return _internal->jsbuffer->_setMinBufSize(minbufsize); } class FilteredBufferedInputStream::Internal{ public: class JStreamsFilteredBuffer: public BufferedInputStreamImpl{ InputStream* input; bool deleteInput; protected: int32_t fillBuffer(signed char* start, int32_t space){ const signed char* buffer; int32_t r = input->read(buffer, 1, space); if ( r > 0 ) memcpy(start, buffer, r); return r; } public: JStreamsFilteredBuffer(InputStream* input, bool deleteInput){ this->input = input; this->deleteInput = deleteInput; } ~JStreamsFilteredBuffer(){ if ( deleteInput ) _CLDELETE(input); } void _setMinBufSize(int32_t min){ this->setMinBufSize(min); } }; JStreamsFilteredBuffer* jsbuffer; Internal(InputStream* input, bool deleteInput){ this->jsbuffer = new JStreamsFilteredBuffer(input, deleteInput); } ~Internal(){ delete jsbuffer; } }; FilteredBufferedInputStream::FilteredBufferedInputStream(InputStream* input, bool deleteInput){ _internal = new Internal(input, deleteInput); } FilteredBufferedInputStream::~FilteredBufferedInputStream(){ delete _internal; } int32_t FilteredBufferedInputStream::read(const signed char*& start, int32_t min, int32_t max){ return _internal->jsbuffer->read(start,min,max); } int64_t FilteredBufferedInputStream::position(){ return _internal->jsbuffer->position(); } int64_t FilteredBufferedInputStream::reset(int64_t p){ return _internal->jsbuffer->reset(p); } int64_t FilteredBufferedInputStream::skip(int64_t ntoskip){ return _internal->jsbuffer->skip(ntoskip); } size_t FilteredBufferedInputStream::size(){ return (size_t)_internal->jsbuffer->size(); } void FilteredBufferedInputStream::setMinBufSize(int32_t minbufsize){ return _internal->jsbuffer->_setMinBufSize(minbufsize); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/Reader.h000066400000000000000000000014241154025176300216170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_Reader_ #define _lucene_util_Reader_ #include "CLucene/util/CLStreams.h" CL_NS_DEF(util) #error Reader has been refactored. It is recommended that you use strigi streams #error for all input into CLucene. If, however, you dont want to use that dependency, #error then you'll have to refactor your current code. The jstreams namespace #error was completely removed CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/StringIntern.cpp000066400000000000000000000101451154025176300233760ustar00rootroot00000000000000 /*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "_StringIntern.h" CL_NS_DEF(util) typedef CL_NS(util)::CLHashMap __wcsintrntype; typedef CL_NS(util)::CLHashMap __strintrntype; __wcsintrntype StringIntern_stringPool(true); __strintrntype StringIntern_stringaPool(true); bool StringIntern_blanksinitd=false; __wcsintrntype::iterator StringIntern_wblank; //STATIC_DEFINE_MUTEX(StringIntern_THIS_LOCK); DEFINE_MUTEX(StringIntern_THIS_LOCK) void CLStringIntern::_shutdown(){ #ifdef _DEBUG SCOPED_LOCK_MUTEX(StringIntern_THIS_LOCK) if ( StringIntern_stringaPool.size() > 0 ){ printf("WARNING: stringaPool still contains intern'd strings (refcounts):\n"); __strintrntype::iterator itr = StringIntern_stringaPool.begin(); while ( itr != StringIntern_stringaPool.end() ){ printf(" %s (%d)\n",(itr->first), (itr->second)); ++itr; } } if ( StringIntern_stringPool.size() > 0 ){ printf("WARNING: stringPool still contains intern'd strings (refcounts):\n"); __wcsintrntype::iterator itr = StringIntern_stringPool.begin(); while ( itr != StringIntern_stringPool.end() ){ _tprintf(_T(" %s (%d)\n"),(itr->first), (itr->second)); ++itr; } } #endif } const TCHAR* CLStringIntern::intern(const TCHAR* str){ if ( str == NULL ) return NULL; if ( str[0] == 0 ) return LUCENE_BLANK_STRING; SCOPED_LOCK_MUTEX(StringIntern_THIS_LOCK) __wcsintrntype::iterator itr = StringIntern_stringPool.find((TCHAR*)str); if ( itr==StringIntern_stringPool.end() ){ TCHAR* ret = STRDUP_TtoT(str); StringIntern_stringPool[ret]= 1; return ret; }else{ (itr->second)++; return itr->first; } } bool CLStringIntern::unintern(const TCHAR* str){ if ( str == NULL ) return false; if ( str[0] == 0 ) return false; // warning: a possible memory leak, since str may be never freed! SCOPED_LOCK_MUTEX(StringIntern_THIS_LOCK) __wcsintrntype::iterator itr = StringIntern_stringPool.find((TCHAR*)str); if ( itr != StringIntern_stringPool.end() ){ if ( (itr->second) == 1 ){ StringIntern_stringPool.removeitr(itr); return true; }else (itr->second)--; } return false; } const char* CLStringIntern::internA(const char* str, const int8_t count, const bool use_provided){ if ( str == NULL ) return NULL; if ( str[0] == 0 ) return _LUCENE_BLANK_ASTRING; SCOPED_LOCK_MUTEX(StringIntern_THIS_LOCK) __strintrntype::iterator itr = StringIntern_stringaPool.find((char*)str); if ( itr==StringIntern_stringaPool.end() ){ char* ret = (use_provided) ? const_cast(str) : STRDUP_AtoA(str); StringIntern_stringaPool[ret] = count; return ret; }else{ if (use_provided) _CLDELETE_LCaARRAY((char*)str); // delete the provided string if already exists (itr->second) = (itr->second) + count; return itr->first; } } bool CLStringIntern::uninternA(const char* str, const int8_t count){ if ( str == NULL ) return false; if ( str[0] == 0 ) return false; // warning: a possible memory leak, since str may be never freed! SCOPED_LOCK_MUTEX(StringIntern_THIS_LOCK) __strintrntype::iterator itr = StringIntern_stringaPool.find((char*)str); if ( itr!=StringIntern_stringaPool.end() ){ if ( (itr->second) == count ){ StringIntern_stringaPool.removeitr(itr); return true; }else (itr->second) = (itr->second) - count; } return false; } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/ThreadLocal.cpp000066400000000000000000000164221154025176300231360ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include #include "CLucene/_ApiHeader.h" #include "CLucene/LuceneThreads.h" #include "_ThreadLocal.h" #include "CLucene/config/_threads.h" #include CL_NS_DEF ( util ) /* * The concept of ThreadLocal is that a ThreadLocal class stores specific values for each unique thread. * Several thread-end detection techniques are used to delete the thread data if the thread dies before the ThreadLocal class is shut. * * The class->thread data mapping is stored in the _ThreadLocal class. * The thread->datas mapping is in ThreadData. */ //predefine for the shared code... #if defined(_CL_HAVE_WIN32_THREADS) #define INIT_THREAD(ret) ret=true extern "C"{ //todo: move this to StdHeader and make it usable by other functions... bool __stdcall DllMain( unsigned short hinstDLL, // DLL module handle _cl_dword_t fdwReason, // reason called void*) // reserved { if ( fdwReason == 3 ) _ThreadLocal::UnregisterCurrentThread(); return true; } } #elif defined(_CL_HAVE_PTHREAD) pthread_key_t pthread_threadlocal_key; pthread_once_t pthread_threadlocal_key_once = PTHREAD_ONCE_INIT; #define INIT_THREAD(ret) \ pthread_once(&pthread_threadlocal_key_once, pthread_threadlocal_make_key); \ if (pthread_getspecific(pthread_threadlocal_key) == NULL) { pthread_setspecific(pthread_threadlocal_key, (void*)1); } \ ret = true; //the function that is called when the thread shutsdown void pthread_threadlocal_destructor(void* /*_holder*/){ _ThreadLocal::UnregisterCurrentThread(); } //the key initialiser function void pthread_threadlocal_make_key() { (void) pthread_key_create(&pthread_threadlocal_key, &pthread_threadlocal_destructor); } #endif class _ThreadLocal; /** * List that holds the list of ThreadLocals that this thread has data in. */ class ThreadLocals : private std::set<_ThreadLocal*> { public: void UnregisterThread(); void add(_ThreadLocal* thread); void remove(_ThreadLocal* thread); }; //map of thread<>ThreadLocals typedef CL_NS ( util ) ::CLMultiMap<_LUCENE_THREADID_TYPE, ThreadLocals*, CL_NS ( util ) ::CLuceneThreadIdCompare, CL_NS ( util ) ::Deletor::ConstNullVal<_LUCENE_THREADID_TYPE>, CL_NS ( util ) ::Deletor::Object > ThreadDataType; static ThreadDataType* threadData = NULL; #ifndef _CL_DISABLE_MULTITHREADING //the lock for locking ThreadData //we don't use STATIC_DEFINE_MUTEX, because then the initialization order will be undefined. static _LUCENE_THREADMUTEX *threadData_LOCK = NULL; #endif class _ThreadLocal::Internal { public: typedef CL_NS ( util ) ::CLSet<_LUCENE_THREADID_TYPE, void*, CL_NS ( util ) ::CLuceneThreadIdCompare, CL_NS ( util ) ::Deletor::ConstNullVal<_LUCENE_THREADID_TYPE>, CL_NS ( util ) ::Deletor::ConstNullVal > LocalsType; LocalsType locals; DEFINE_MUTEX ( locals_LOCK ) AbstractDeletor* _deletor; Internal ( AbstractDeletor* _deletor ) : locals ( false,false ) { this->_deletor = _deletor; } ~Internal() { //remove all the thread local data for this object LocalsType::iterator itr = locals.begin(); while ( itr != locals.end() ) { void* val = itr->second; locals.removeitr ( itr ); _deletor->Delete ( val ); itr = locals.begin(); } delete _deletor; } }; _ThreadLocal::_ThreadLocal ( CL_NS ( util ) ::AbstractDeletor* _deletor ) : _internal ( _CLNEW Internal ( _deletor ) ) { } _ThreadLocal::~_ThreadLocal() { setNull(); UnregisterCurrentThread(); RemoveThreadLocal( this ); delete _internal; } void* _ThreadLocal::get() { SCOPED_LOCK_MUTEX(_internal->locals_LOCK) return _internal->locals.get ( _LUCENE_CURRTHREADID ); } void _ThreadLocal::setNull() { //just delete this thread from the locals list _LUCENE_THREADID_TYPE id = _LUCENE_CURRTHREADID; SCOPED_LOCK_MUTEX(_internal->locals_LOCK) Internal::LocalsType::iterator itr = _internal->locals.find ( id ); if ( itr != _internal->locals.end() ) { void* val = itr->second; _internal->locals.removeitr ( itr ); _internal->_deletor->Delete ( val ); } } void _ThreadLocal::set ( void* t ) { if ( t == NULL ){ setNull(); return; } //make sure we have a threadlocal context (for cleanup) bool ret; INIT_THREAD(ret); assert(ret); _LUCENE_THREADID_TYPE id = _LUCENE_CURRTHREADID; //drop a reference to this ThreadLocal in ThreadData { #ifndef _CL_DISABLE_MULTITHREADING //slightly un-usual way of initialising mutex, //because otherwise our initialisation order would be undefined if ( threadData_LOCK == NULL ) threadData_LOCK = _CLNEW _LUCENE_THREADMUTEX; SCOPED_LOCK_MUTEX ( *threadData_LOCK ); #endif if ( threadData == NULL ) threadData = _CLNEW ThreadDataType ( false, true ); ThreadLocals* threadLocals = threadData->get(id); if ( threadLocals == NULL ){ threadLocals = _CLNEW ThreadLocals; threadData->insert( std::pair(id,threadLocals)); } threadLocals->add(this); } { SCOPED_LOCK_MUTEX(_internal->locals_LOCK) Internal::LocalsType::iterator itr = _internal->locals.find ( id ); if ( itr != _internal->locals.end() ) { void* val = itr->second; _internal->locals.removeitr ( itr ); _internal->_deletor->Delete ( val ); } if ( t != NULL ) _internal->locals.put ( id, t ); } } void _ThreadLocal::UnregisterCurrentThread() { if ( threadData == NULL ) return; _LUCENE_THREADID_TYPE id = _LUCENE_CURRTHREADID; SCOPED_LOCK_MUTEX ( *threadData_LOCK ); ThreadDataType::iterator itr = threadData->find(id); if ( itr != threadData->end() ){ ThreadLocals* threadLocals = itr->second; threadLocals->UnregisterThread(); threadData->removeitr(itr); } } void _ThreadLocal::RemoveThreadLocal( _ThreadLocal * tl ) { if ( threadData == NULL ) return; SCOPED_LOCK_MUTEX ( *threadData_LOCK ); ThreadDataType::iterator itr = threadData->begin(); for( ThreadDataType::iterator itr = threadData->begin(); itr != threadData->end(); itr++ ) { ThreadLocals* threadLocals = itr->second; threadLocals->remove( tl ); // Remove empty threadLocals } } void _ThreadLocal::_shutdown() { #ifndef _CL_DISABLE_MULTITHREADING _CLDELETE(threadData_LOCK); #endif _CLDELETE(threadData); } void ThreadLocals::UnregisterThread() { //this should only be accessed from its own thread... if this changes, then this access has to be locked. for( ThreadLocals::iterator iTLocal = begin(); iTLocal != end(); iTLocal++ ) (*iTLocal)->setNull(); clear(); } void ThreadLocals::add(_ThreadLocal* thread) { //this should only be accessed from its own thread... if this changes, then this access has to be locked. if( end() == find( thread ) ) insert( thread ); } void ThreadLocals::remove(_ThreadLocal* thread) { ThreadLocals::iterator iTLocal = find( thread ); if( iTLocal != end() ) erase( iTLocal ); } CL_NS_END clucene-core-2.3.3.4/src/core/CLucene/util/VoidList.h000066400000000000000000000114071154025176300221540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_VoidList_ #define _lucene_util_VoidList_ #include "Equators.h" #include "CLucene/LuceneThreads.h" CL_NS_DEF(util) /** * A template to encapsulate various list type classes * @internal */ template class CLUCENE_INLINE_EXPORT __CLList:public _base,LUCENE_BASE { private: bool dv; protected: typedef _base base; public: typedef typename _base::const_iterator const_iterator; typedef typename _base::iterator iterator; virtual ~__CLList(){ clear(); } __CLList ( const bool deleteValue ): dv(deleteValue) { } void setDoDelete(bool val){ dv=val; } //sets array to the contents of this array. //array must be size void toArray(_kt* into) const{ int i=0; for ( const_iterator itr=base::begin();itr!=base::end();itr++ ){ into[i] = *itr; i++; } } //sets array to the contents of this array, terminating with a NULL pointer //array must be size+1 void toArray_nullTerminated(_kt* into) const{ int i=0; for ( const_iterator itr=base::begin();itr!=base::end();itr++ ){ into[i] = *itr; i++; } into[i] = NULL; } void set(size_t i, _kt val) { if ( dv && i < base::size() ) _valueDeletor::doDelete((*this)[i]); if ( i+1 > base::size() ) base::resize(i+1); (*this)[i] = val; } //todo: check this void delete_back(){ if ( base::size() > 0 ){ iterator itr = base::end(); if ( itr != base::begin()) itr --; _kt key = *itr; base::erase(itr); if ( dv ) _valueDeletor::doDelete(key); } } void delete_front(){ if ( base::size() > 0 ){ iterator itr = base::begin(); _kt key = *itr; base::erase(itr); if ( dv ) _valueDeletor::doDelete(key); } } void clear(){ if ( dv ){ iterator itr = base::begin(); while ( itr != base::end() ){ _valueDeletor::doDelete(*itr); ++itr; } } base::clear(); } void remove(size_t i, bool dontDelete=false){ if ( i < base::size() ){ iterator itr=base::begin(); itr+=i; _kt key = *itr; base::erase( itr ); if ( dv && !dontDelete ) _valueDeletor::doDelete(key); } } void remove(iterator itr, bool dontDelete=false){ _kt key = *itr; base::erase( itr ); if ( dv && !dontDelete ) _valueDeletor::doDelete(key); } }; //growable arrays of Objects (like a collection or list) //a list, so can contain duplicates //it grows in chunks... todo: check jlucene for initial size of array, and growfactors template class CLUCENE_INLINE_EXPORT CLVector:public __CLList<_kt, CL_NS_STD(vector)<_kt> , _valueDeletor> { public: CLVector ( const bool deleteValue=true ): __CLList<_kt, CL_NS_STD(vector)<_kt> , _valueDeletor>(deleteValue) { } }; //An array-backed implementation of the List interface //a list, so can contain duplicates //*** a very simple list - use //(This class is roughly equivalent to Vector, except that it is unsynchronized.) #define CLArrayList CLVector #define CLHashSet CLHashList #define CLList CLVector //implementation of the List interface, provides access to the first and last list elements in O(1) //no comparator is required... and so can contain duplicates //a simple list with no comparator //*** a very simple list - use #ifdef LUCENE_DISABLE_HASHING #define CLHashList CLSetList #else template class CLUCENE_INLINE_EXPORT CLHashList:public __CLList<_kt, CL_NS_HASHING(_CL_HASH_SET)<_kt,_Comparator> , _valueDeletor> { public: CLHashList ( const bool deleteValue=true ): __CLList<_kt, CL_NS_HASHING(_CL_HASH_SET)<_kt,_Comparator> , _valueDeletor>(deleteValue) { } }; #endif template class CLUCENE_INLINE_EXPORT CLLinkedList:public __CLList<_kt, CL_NS_STD(list)<_kt> , _valueDeletor> { public: CLLinkedList ( const bool deleteValue=true ): __CLList<_kt, CL_NS_STD(list)<_kt> , _valueDeletor>(deleteValue) { } }; template class CLUCENE_INLINE_EXPORT CLSetList:public __CLList<_kt, CL_NS_STD(set)<_kt,_Comparator> , _valueDeletor> { public: CLSetList ( const bool deleteValue=true ): __CLList<_kt, CL_NS_STD(set)<_kt,_Comparator> , _valueDeletor>(deleteValue) { } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/VoidMap.h000066400000000000000000000223721154025176300217610ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_VoidMap_ #define _lucene_util_VoidMap_ #include "Equators.h" #include "CLucene/LuceneThreads.h" #if defined(_CL_HAVE_TR1_UNORDERED_MAP) && defined(_CL_HAVE_TR1_UNORDERED_SET) #include #include #elif defined(_CL_HAVE_HASH_MAP) && defined(_CL_HAVE_HASH_SET) //hashing is all or nothing! #include #include #elif defined(_CL_HAVE_EXT_HASH_MAP) && defined(_CL_HAVE_EXT_HASH_SET) #include #include #elif !defined(LUCENE_DISABLE_HASHING) #define LUCENE_DISABLE_HASHING #endif CL_NS_DEF(util) /** * A template to encapsulate various map type classes * @internal */ template class CLUCENE_INLINE_EXPORT __CLMap:public _base,LUCENE_BASE { protected: bool dk; bool dv; typedef _base base; public: typedef typename _base::iterator iterator; typedef typename _base::const_iterator const_iterator; typedef CL_NS_STD(pair)<_kt, _vt> _pair; ///Default constructor for the __CLMap __CLMap (): dk(true), dv(true) { } ///Deconstructor for the __CLMap ~__CLMap (){ clear(); } void setDeleteKey(bool val){ dk = val; } void setDeleteValue(bool val){ dv = val; } ///Construct the VoidMap and set the deleteTypes to the specified values ///\param deleteKey if true then the key variable is deleted when an object is deleted ///\param keyDelType delete the key variable using the specified type ///\param deleteValue if true then the value variable is deleted when an object is deleted ///\param valueDelType delete the value variable using the specified type /*__CLMap ( const bool deleteKey, const bool deleteValue ): dk(deleteKey), dv(deleteValue) { }*/ ///checks to see if the specified key exists ///\param k the key to check for ///\returns true if the key exists bool exists(_kt k)const{ const_iterator itr = base::find(k); bool ret = itr!=base::end(); return ret; } ///using a non-const key, get a non-const value _vt get( _kt k) const { const_iterator itr = base::find(k); if ( itr==base::end() ) return (_vt)NULL; else return itr->second; } /* ///using a non-const key, get the actual key _kt getKey( _kt k) const { const_iterator itr = base::find(k); if ( itr==base::end() ) return NULL; else return itr->first; }*/ void removeitr (iterator itr, const bool dontDeleteKey = false, const bool dontDeleteValue = false){ if ( itr == base::end() ) return; //delete key&val first. This prevents potential loops (deleting object removes itself) _kt key = itr->first; _vt val = itr->second; base::erase(itr); //keys & vals need to be deleted after erase, because the hashvalue is still needed if ( dk && !dontDeleteKey ) _KeyDeletor::doDelete(key); if ( dv && !dontDeleteValue ) _ValueDeletor::doDelete(val); } ///delete and optionally delete the specified key and associated value void remove(_kt key, const bool dontDeleteKey = false, const bool dontDeleteValue = false){ iterator itr = base::find(key); if ( itr!=base::end() ) removeitr(itr,dontDeleteKey,dontDeleteValue); } ///clear all keys and values in the map void clear(){ if ( dk || dv ){ iterator itr = base::begin(); while ( itr!=base::end() ){ #ifdef _CL_HAVE_EXT_HASH_MAP removeitr(itr); itr = base::begin(); #else if ( dk ) _KeyDeletor::doDelete(itr->first); if ( dv ) _ValueDeletor::doDelete(itr->second); ++itr; #endif } } base::clear(); } }; // makes no guarantees as to the order of the map // cannot contain duplicate keys; each key can map to at most one value #define CLHashtable CLHashMap #if defined(LUCENE_DISABLE_HASHING) //a CLSet with CLHashMap traits template class CLUCENE_INLINE_EXPORT CLHashMap:public __CLMap<_kt,_vt, CL_NS_STD(map)<_kt,_vt, _Compare>, _KeyDeletor,_ValueDeletor> { typedef typename CL_NS_STD(map)<_kt,_vt,_Compare> _base; typedef __CLMap<_kt, _vt, CL_NS_STD(map)<_kt,_vt, _Compare>, _KeyDeletor,_ValueDeletor> _this; public: CLHashMap ( const bool deleteKey=false, const bool deleteValue=false ) { _this::setDeleteKey(deleteKey); _this::setDeleteValue(deleteValue); } ///put the specified pair into the map. remove any old items first ///\param k the key ///\param v the value virtual void put(_kt k,_vt v){ //todo: check if this is always right! //must should look through code, for //cases where map is not unique!!! if ( _this::dk || _this::dv ) _this::remove(k); (*this)[k] = v;; } }; #elif defined(_CL_HAVE_EXT_HASH_MAP) //ext/hash_map syntax //HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized template class CLUCENE_INLINE_EXPORT CLHashMap:public __CLMap<_kt,_vt, CL_NS_HASHING(_CL_HASH_MAP)<_kt,_vt, _Hasher,_Equals>, _KeyDeletor,_ValueDeletor> { typedef __CLMap<_kt,_vt, CL_NS_HASHING(_CL_HASH_MAP)<_kt,_vt, _Hasher,_Equals>, _KeyDeletor,_ValueDeletor> _this; public: CLHashMap ( const bool deleteKey=false, const bool deleteValue=false ) { _this::setDeleteKey(deleteKey); _this::setDeleteValue(deleteValue); } ///put the specified pair into the map. remove any old items first ///\param k the key ///\param v the value virtual void put(_kt k,_vt v){ //todo: check if this is always right! //must should look through code, for //cases where map is not unique!!! if ( _this::dk || _this::dv ) _this::remove(k); (*this)[k] = v;; } }; #elif defined(_CL_HAVE_HASH_MAP) //HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized template class CLUCENE_INLINE_EXPORT CLHashMap:public __CLMap<_kt,_vt, CL_NS_HASHING(_CL_HASH_MAP)<_kt,_vt, _Hasher>, _KeyDeletor,_ValueDeletor> { typedef __CLMap<_kt,_vt, CL_NS_HASHING(_CL_HASH_MAP)<_kt,_vt, _Hasher>, _KeyDeletor,_ValueDeletor> _this; public: CLHashMap ( const bool deleteKey=false, const bool deleteValue=false ) { _this::setDeleteKey(deleteKey); _this::setDeleteValue(deleteValue); } ///put the specified pair into the map. remove any old items first ///\param k the key ///\param v the value virtual void put(_kt k,_vt v){ //todo: check if this is always right! //must should look through code, for //cases where map is not unique!!! if ( _this::dk || _this::dv ) _this::remove(k); (*this)[k] = v;; } }; #endif //A collection that contains no duplicates //does not guarantee that the order will remain constant over time template class CLUCENE_INLINE_EXPORT CLSet:public __CLMap<_kt,_vt, CL_NS_STD(map)<_kt,_vt, _Compare>, _KeyDeletor,_ValueDeletor> { typedef typename CL_NS_STD(map)<_kt,_vt,_Compare> _base; typedef __CLMap<_kt, _vt, CL_NS_STD(map)<_kt,_vt, _Compare>, _KeyDeletor,_ValueDeletor> _this; public: CLSet ( const bool deleteKey=false, const bool deleteValue=false ) { _this::setDeleteKey(deleteKey); _this::setDeleteValue(deleteValue); } ///put the specified pair into the map. remove any old items first ///\param k the key ///\param v the value virtual void put(_kt k,_vt v){ //todo: check if this is always right! //must should look through code, for //cases where map is not unique!!! if ( _this::dk || _this::dv ) _this::remove(k); (*this)[k] = v;; } }; //A collection that can contains duplicates template class CLUCENE_INLINE_EXPORT CLMultiMap:public __CLMap<_kt,_vt, CL_NS_STD(multimap)<_kt,_vt>, _KeyDeletor,_ValueDeletor> { typedef typename CL_NS_STD(multimap)<_kt,_vt> _base; typedef __CLMap<_kt, _vt, CL_NS_STD(multimap)<_kt,_vt>, _KeyDeletor,_ValueDeletor> _this; public: CLMultiMap ( const bool deleteKey=false, const bool deleteValue=false ) { _this::setDeleteKey(deleteKey); _this::setDeleteValue(deleteValue); } ///put the specified pair into the map. remove any old items first ///\param k the key ///\param v the value void put(_kt k,_vt v){ //todo: check if this is always right! //must should look through code, for //cases where map is not unique!!! if ( _this::dk || _this::dv ) _this::remove(k); } }; //*** need to create a class that allows duplicates - use //#define CLSet __CLMap CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_Arrays.h000066400000000000000000000107501154025176300220170ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_Arrays_ #define _lucene_util_Arrays_ CL_NS_DEF(util) template class Arrays{ Arrays(){} public: static void fill( _type* a, int32_t alen, _type value ) { for ( int32_t i = 0; i < alen; i++ ) { a[i] = value; } } static void sort(_type* a, int32_t alen, int32_t fromIndex, int32_t toIndex){ CND_PRECONDITION(fromIndex < toIndex,"fromIndex >= toIndex"); CND_PRECONDITION(fromIndex >= 0,"fromIndex < 0"); // First presort the array in chunks of length 6 with insertion // sort. A mergesort would give too much overhead for this length. for (int32_t chunk = fromIndex; chunk < toIndex; chunk += 6) { int32_t end = cl_min(chunk + 6, toIndex); for (int32_t i = chunk + 1; i < end; i++) { if (compare(a[i - 1], a[i]) > 0) { // not already sorted int32_t j = i; _type elem = a[j]; do { a[j] = a[j - 1]; j--; } while (j > chunk && compare(a[j - 1], elem) > 0); a[j] = elem; } } } int32_t len = toIndex - fromIndex; // If length is smaller or equal 6 we are done. if (len <= 6) return; _type* src = a; _type* dest = _CL_NEWARRAY(_type,alen); _type* t = NULL; // t is used for swapping src and dest // The difference of the fromIndex of the src and dest array. int32_t srcDestDiff = -fromIndex; // The merges are done in this loop for (int32_t size = 6; size < len; size <<= 1) { for (int32_t start = fromIndex; start < toIndex; start += size << 1) { // mid is the start of the second sublist; // end the start of the next sublist (or end of array). int32_t mid = start + size; int32_t end = cl_min(toIndex, mid + size); // The second list is empty or the elements are already in // order - no need to merge if (mid >= end || compare(src[mid - 1], src[mid]) <= 0) { memcpy(dest + start + srcDestDiff, src+start, (end-start)*sizeof(_type)); }// The two halves just need swapping - no need to merge else if (compare(src[start], src[end - 1]) > 0) { memcpy(dest+end-size+srcDestDiff, src+start, size * sizeof(_type)); memcpy(dest+start+srcDestDiff, src+mid, (end-mid) * sizeof(_type)); }else{ // Declare a lot of variables to save repeating // calculations. Hopefully a decent JIT will put these // in registers and make this fast int32_t p1 = start; int32_t p2 = mid; int32_t i = start + srcDestDiff; // The main merge loop; terminates as soon as either // half is ended while (p1 < mid && p2 < end) { dest[i++] = src[(compare(src[p1], src[p2]) <= 0 ? p1++ : p2++)]; } // Finish up by copying the remainder of whichever half // wasn't finished. if (p1 < mid) memcpy(dest+i,src+p1, (mid-p1) * sizeof(_type)); else memcpy(dest+i,src+p2, (end-p2) * sizeof(_type)); } } // swap src and dest ready for the next merge t = src; src = dest; dest = t; fromIndex += srcDestDiff; toIndex += srcDestDiff; srcDestDiff = -srcDestDiff; } // make sure the result ends up back in the right place. Note // that src and dest may have been swapped above, so src // contains the sorted array. if (src != a) { // Note that fromIndex == 0. memcpy(a+srcDestDiff,src,toIndex * sizeof(_type)); } } }; template class CLListEquals: public CL_NS_STD(binary_function) { typedef typename class1::const_iterator _itr1; typedef typename class2::const_iterator _itr2; public: CLListEquals(){ } bool equals( class1* val1, class2* val2 ) const{ static _comparator comp; if ( val1 == val2 ) return true; int32_t size = (int32_t)val1->size(); if ( size != (int32_t)val2->size() ) return false; _itr1 itr1 = val1->begin(); _itr2 itr2 = val2->begin(); while ( --size >= 0 ){ if ( !comp(*itr1,*itr2) ) return false; itr1++; itr2++; } return true; } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_FastCharStream.h000066400000000000000000000026021154025176300234220ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_FastCharStream_ #define _lucene_util_FastCharStream_ CL_CLASS_DEF(util,BufferedReader) CL_NS_DEF(util) /** Ported implementation of the FastCharStream class. */ class FastCharStream { static const int32_t maxRewindSize; int32_t pos; int32_t rewindPos; int64_t resetPos; int32_t col; int32_t line; // read character from stream throws an exception on error void readChar(TCHAR &); public: BufferedReader* input; /// Initializes a new instance of the FastCharStream class LUCENE_EXPORT. FastCharStream(BufferedReader* reader); virtual ~FastCharStream(); void reset(); /// Returns the next TCHAR from the stream. int GetNext(); void UnGet(); /// Returns the current top TCHAR from the input stream without removing it. int Peek(); /// Returns True if the end of stream was reached. bool Eos() const; /// Gets the current column. int32_t Column() const; /// Gets the current line. int32_t Line() const; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_MD5Digester.h000066400000000000000000000077521154025176300226420ustar00rootroot00000000000000///////////////////////////////////////////////////////////////////////// // MD5.cpp // Implementation file for MD5 class // // This C++ Class implementation of the original RSA Data Security, Inc. // MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. // All rights reserved. This software is a derivative of the "RSA Data // Security, Inc. MD5 Message-Digest Algorithm" // // You may use this software free of any charge, but without any // warranty or implied warranty, provided that you follow the terms // of the original RSA copyright, listed below. // // Original RSA Data Security, Inc. Copyright notice ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All // rights reserved. // // License to copy and use this software is granted provided that it // is identified as the "RSA Data Security, Inc. MD5 Message-Digest // Algorithm" in all material mentioning or referencing this software // or this function. // License is also granted to make and use derivative works provided // that such works are identified as "derived from the RSA Data // Security, Inc. MD5 Message-Digest Algorithm" in all material // mentioning or referencing the derived work. // RSA Data Security, Inc. makes no representations concerning either // the merchantability of this software or the suitability of this // software for any particular purpose. It is provided "as is" // without express or implied warranty of any kind. // These notices must be retained in any copies of any part of this // documentation and/or software. ///////////////////////////////////////////////////////////////////////// /*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_MD5Digester_H #define _lucene_util_MD5Digester_H CL_NS_DEF(util) typedef unsigned short int uint2; char* PrintMD5(uint8_t md5Digest[16]); char* MD5String(char* szString); char* MD5File(char* szFilename); class md5 { // Methods public: md5() { Init(); } void Init(); void Update(uint8_t* chInput, uint32_t nInputLen); void Finalize(); uint8_t* Digest() { return m_Digest; } private: void Transform(uint8_t* block); void Encode(uint8_t* dest, uint32_t* src, uint32_t nLength); void Decode(uint32_t* dest, uint8_t* src, uint32_t nLength); inline uint32_t rotate_left(uint32_t x, uint32_t n) { return ((x << n) | (x >> (32-n))); } inline uint32_t F(uint32_t x, uint32_t y, uint32_t z) { return ((x & y) | (~x & z)); } inline uint32_t G(uint32_t x, uint32_t y, uint32_t z) { return ((x & z) | (y & ~z)); } inline uint32_t H(uint32_t x, uint32_t y, uint32_t z) { return (x ^ y ^ z); } inline uint32_t I(uint32_t x, uint32_t y, uint32_t z) { return (y ^ (x | ~z)); } inline void FF(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) { a += F(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } inline void GG(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) { a += G(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } inline void HH(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) { a += H(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } inline void II(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) { a += I(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } // Data private: uint32_t m_State[4]; uint32_t m_Count[2]; uint8_t m_Buffer[64]; uint8_t m_Digest[16]; uint8_t m_Finalized; }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_StringIntern.h000066400000000000000000000033101154025176300231760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_StringIntern_H #define _lucene_util_StringIntern_H //#include "Equators.h" //#include "_VoidMap.h" CL_NS_DEF(util) /** Functions for intern'ing strings. This * is a process of pooling strings thus using less memory, * and furthermore allows intern'd strings to be directly * compared: * string1==string2, rather than _tcscmp(string1,string2) */ class CLStringIntern{ public: /** * Internalise the specified string. * \return Returns a pointer to the internalised string */ static const char* internA(const char* str, const int8_t count=1, const bool use_provided=false); /** * Uninternalise the specified string. Decreases * the reference count and frees the string if * reference count is zero * \returns true if string was destroyed, otherwise false */ static bool uninternA(const char* str, const int8_t count=1); /** * Internalise the specified string. * \return Returns a pointer to the internalised string */ static const TCHAR* intern(const TCHAR* str); /** * Uninternalise the specified string. Decreases * the reference count and frees the string if * reference count is zero * \returns true if string was destroyed, otherwise false */ static bool unintern(const TCHAR* str); /** Cleanup static data */ static CLUCENE_LOCAL void _shutdown(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_ThreadLocal.h000066400000000000000000000043761154025176300227470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_ThreadLocal_H #define _lucene_util_ThreadLocal_H CL_NS_DEF ( util ) /** * A class which holds thread specific data. Calls to get() or set() or to the data kept in the _ThreadLocal * is invalid after _ThreadLocal has been destroyed. */ class _ThreadLocal { private: class Internal; Internal* _internal; public: _ThreadLocal ( CL_NS ( util ) ::AbstractDeletor* _deletor ); void* get(); /** * Call this function to clear the local thread data for this * ThreadLocal. Calling set(NULL) does the same thing, except * this function is virtual and can be called without knowing * the template. */ void setNull(); void set ( void* t ); virtual ~_ThreadLocal(); /** * For early cleanup of thread data, call this function. It will clear out any * thread specific data. Useful if you have a long running thread that doesn't * need to access clucene anymore. * The thread local code tries to call this automatically when a thread ends. * Some implementations may be impossible (or not implemented) to detect thread * endings... then you would have to run this function yourself. */ static void UnregisterCurrentThread(); static void RemoveThreadLocal( _ThreadLocal * tl ); /** * Call this function to shutdown CLucene */ static CLUCENE_LOCAL void _shutdown(); /** * A hook called when CLucene is starting or shutting down, * this can be used for setting up and tearing down static * variables */ typedef void ShutdownHook ( bool startup ); }; /** * A templated class of _ThreadLocal * @see _ThreadLocal */ template class ThreadLocal: public _ThreadLocal { public: ThreadLocal() : _ThreadLocal ( _CLNEW _deletor ) { } virtual ~ThreadLocal() { } T get() { return ( T ) _ThreadLocal::get(); } void set ( T t ) { _ThreadLocal::set ( ( T ) t ); } }; CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_VoidList.h000066400000000000000000000013071154025176300223110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_VoidsList_ #define _lucene_util_VoidsList_ /*#if defined(_LUCENE_PRAGMA_WARNINGS) #pragma message ("==================Deprecated!!!==================") #else //#warning "==================Deprecated!!!==================" #endif #include "VoidMapSetDefinitions.h"*/ #include "VoidList.h" #endif clucene-core-2.3.3.4/src/core/CLucene/util/_VoidMap.h000066400000000000000000000013041154025176300221100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_VoidsMap_ #define _lucene_util_VoidsMap_ /*#if defined(_LUCENE_PRAGMA_WARNINGS) #pragma message ("==================Deprecated!!!==================") #else //#warning "==================Deprecated!!!==================" #endif #include "VoidMapSetDefinitions.h"*/ #include "VoidMap.h" #endif clucene-core-2.3.3.4/src/core/CLucene/util/_bufferedstream.h000066400000000000000000000134031154025176300235520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef JSTREAMS_BUFFEREDSTREAM_H #define JSTREAMS_BUFFEREDSTREAM_H #include "_streambase.h" #include "_streambuffer.h" #include CL_NS_DEF(util) /** * @brief Abstract implementation class providing a buffered input stream. * * You can inherit this class to provide buffered access to a * resource. You just need to implement fillBuffer, and * BufferedStream will do the rest. */ template class BufferedStreamImpl : public StreamBase { private: StreamBuffer buffer; bool finishedWritingToBuffer; void writeToBuffer(int32_t minsize, int32_t maxsize); protected: /** * @brief Fill the buffer with the provided data * * This function should be implemented by subclasses. * It should write up to @p space characters from the * stream to the buffer position pointed to by @p start. * * If the end of the stream is encountered, -1 should be * returned. * * If an error occurs, the status should be set to Error, * an error message should be set and -1 should be returned. * * You should @em not call this function yourself. * * @param start where the data should be written to * @param space the maximum amount of data to write * @return Number of characters written, or -1 on error **/ virtual int32_t fillBuffer(T* start, int32_t space) = 0; /** * @brief Resets the buffer, allowing it to be used again * * This function resets the buffer, allowing it to be re-used. */ void resetBuffer() { StreamBase::m_size = -1; StreamBase::m_position = 0; StreamBase::m_error.assign(""); StreamBase::m_status = Ok; buffer.readPos = buffer.start; buffer.avail = 0; finishedWritingToBuffer = false; } /** * @brief Sets the minimum size of the buffer */ void setMinBufSize(int32_t s) { buffer.makeSpace(s); } BufferedStreamImpl(); public: int32_t read(const T*& start, int32_t min, int32_t max); int64_t reset(int64_t pos); virtual int64_t skip(int64_t ntoskip); }; /** Abstract class for a buffered stream of bytes */ typedef BufferedStreamImpl BufferedInputStreamImpl; /** Abstract class for a buffered stream of Unicode characters */ typedef BufferedStreamImpl BufferedReaderImpl; template BufferedStreamImpl::BufferedStreamImpl() { finishedWritingToBuffer = false; } template void BufferedStreamImpl::writeToBuffer(int32_t ntoread, int32_t maxread) { int32_t missing = ntoread - buffer.avail; int32_t nwritten = 0; while (missing > 0 && nwritten >= 0) { int32_t space; space = buffer.makeSpace(missing); if (maxread >= ntoread && space > maxread) { space = maxread; } T* start = buffer.readPos + buffer.avail; nwritten = fillBuffer(start, space); assert(StreamBase::m_status != Eof); if (nwritten > 0) { buffer.avail += nwritten; missing = ntoread - buffer.avail; } } if (nwritten < 0) { finishedWritingToBuffer = true; } } template int32_t BufferedStreamImpl::read(const T*& start, int32_t min, int32_t max) { if (StreamBase::m_status == Error) return -2; if (StreamBase::m_status == Eof) return -1; // do we need to read data into the buffer? if (min > max) max = 0; if (!finishedWritingToBuffer && min > buffer.avail) { // do we have enough space in the buffer? writeToBuffer(min, max); if (StreamBase::m_status == Error) return -2; } int32_t nread = buffer.read(start, max); StreamBase::m_position += nread; if (StreamBase::m_position > StreamBase::m_size && StreamBase::m_size > 0) { // error: we read more than was specified in size // this is an error because all dependent code might have been labouring // under a misapprehension StreamBase::m_status = Error; StreamBase::m_error = "Stream is longer than specified."; nread = -2; } else if (StreamBase::m_status == Ok && buffer.avail == 0 && finishedWritingToBuffer) { StreamBase::m_status = Eof; if (StreamBase::m_size == -1) { StreamBase::m_size = StreamBase::m_position; } // save one call to read() by already returning -1 if no data is there if (nread == 0) nread = -1; } return nread; } template int64_t BufferedStreamImpl::reset(int64_t newpos) { assert(newpos >= 0); if (StreamBase::m_status == Error) return -2; // check to see if we have this position int64_t d = StreamBase::m_position - newpos; if (buffer.readPos - d >= buffer.start && -d < buffer.avail) { StreamBase::m_position -= d; buffer.avail += (int32_t)d; buffer.readPos -= d; StreamBase::m_status = Ok; } return StreamBase::m_position; } template int64_t BufferedStreamImpl::skip(int64_t ntoskip) { const T *begin; int32_t nread; int64_t skipped = 0; while (ntoskip) { int32_t step = (int32_t)((ntoskip > buffer.size) ?buffer.size :ntoskip); nread = read(begin, 1, step); if (nread <= 0) { return skipped; } ntoskip -= nread; skipped += nread; } return skipped; } CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_streambase.h000066400000000000000000000170561154025176300227120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef JSTREAMS_STREAMBASE_H #define JSTREAMS_STREAMBASE_H #include #include #define INT32MAX 0x7FFFFFFFL CL_NS_DEF(util) /** Used to indicate the current status of a Stream */ enum StreamStatus { Ok /**< Stream is capable of being read from */, Eof /**< The end of the Stream has been reached */, Error /**< An error occurred. Use error() to find out more information */ }; // java mapping: long=int64, int=int32, byte=uint8_t /** * The base of all Streams. Do not inherit directly from this class, * but from (an instance of) StreamBase * * This class contains all the non-virtual StreamBase methods * that don't depend on a specific Stream type * * Developer comment: This is needed because of win32 compilation. * When we want to access a function outside a lib, we have to export them, * but we can't export the template class because this would be somewhat * stupid / does not work by design :) * Because of this I've introduced this StreamBaseBase class */ class StreamBaseBase { //krazy:exclude=dpointer protected: /** The size of the stream (-1 if unknown) */ int64_t m_size; /** The position of the stream */ int64_t m_position; /** * @brief String representation of the last error, or * an empty string otherwise */ std::string m_error; /** The status of the stream - see StreamStatus */ StreamStatus m_status; public: /** * @brief Constructor: initialises everything to sane defaults **/ StreamBaseBase() :m_size(-1), m_position(0), m_status(Ok) {} /** * @brief Destructor **/ virtual ~StreamBaseBase() {} /** * @brief Return a string representation of the last error. * If no error has occurred, an empty string is returned. **/ const char* error() const { return m_error.c_str(); } /** * @brief Return the status of the stream. **/ StreamStatus status() const { return m_status; } /** * @brief Get the current position in the stream. * The value obtained from this function can be used to reset the stream. **/ int64_t position() const { return m_position; } /** * @brief Return the size of the stream. * * The size of the stream is always known if the end of the stream * has been reached. In all other cases, this may return -1 to * indicate the size of the stream is unknown. * * @return the size of the stream, if it is known, or -1 if the size * of the stream is unknown **/ int64_t size() const { return m_size; } }; /** * @brief Base class for stream read access to a data source. * * This class is based on the interface java.io.InputStream. It provides * a uniform interface for accessing streamed resources. * * The main difference with the Java equivalent is a performance improvement. * When reading data, data is not copied into a buffer provided by the caller, * but a pointer to the read data is provided. This makes this interface * especially useful for deriving from it and implementing filters or * transformers. */ template class StreamBase : public StreamBaseBase { public: StreamBase() { } virtual ~StreamBase(){} /** * @brief Reads items from the stream and sets @p start to point to * the first item that was read. * * Note: unless stated otherwise in the documentation for that method, * this pointer will no longer be valid after calling another method of * this class. The pointer will also no longer be valid after the class * is destroyed. * * The functions inherited from StreamBaseBase do not invalidate the pointer. * * At least @p min items will be read from the stream, unless an error occurs * or the end of the stream is reached. Under no circumstances will more than * @p max items be read. * * If the end of the stream is reached before @p min items are read, the * read is still considered successful and the number of items read will * be returned. * * @param start pointer passed by reference that will be set to point to * the retrieved array of items. If the end of the stream * is encountered or an error occurs, the value of @p start * is undefined * @param min the minimal number of items to read from the stream. This * value should be larger than 0. If it is 0 or smaller, the * result is undefined * @param max the maximal number of items to read from the stream. * If this value is smaller than @p min, there is no limit on * the number of items that can be read * @return the number of items that were read. @c -1 is returned if * end of the stream has already been reached. @c -2 is returned * if an error has occurred **/ virtual int32_t read(const T*& start, int32_t min, int32_t max) = 0; /** * @brief Skip @p ntoskip items. * * If an error occurs, or the end of the stream is encountered, fewer * than @p ntoskip items may be skipped. This can be checked by comparing * the return value to @p ntoskip. * * Calling this function invalidates the data pointer that was obtained from * StreamBase::read. * * @param ntoskip the number of items that should be skipped * @return the number of items skipped **/ virtual int64_t skip(int64_t ntoskip); /** * @brief Repositions this stream to a given position. * * A call to StreamBase::reset is only guaranteed to be successful when * the requested position lies within the segment of a stream * corresponding to a valid pointer obtained from StreamBase::read. * In this case, the pointer will not be invalidated. * * Calling this function invalidates the data pointer that was obtained from * StreamBase::read unless the conditions outlined above apply. * * To read n items, leaving the stream at the same position as before, you * can do the following: * @code * int64_t start = stream.position(); * if ( stream.read(data, min, max) > 0 ) { * stream.reset(start); * // The data pointer is still valid here * } * @endcode * * @param pos the position in the stream you want to go to, relative to * the start of the stream * @return the new position in the stream **/ virtual int64_t reset(int64_t pos) = 0; }; template int64_t StreamBase::skip(int64_t ntoskip) { const T* begin; int32_t nread; int64_t skipped = 0; while (ntoskip > 0) { // make sure we do not overflow uint32_t int32_t maxstep = (int32_t)((ntoskip > 10000000) ?10000000 :ntoskip); // the default implementation is to simply read the data that we want // to skip nread = read(begin, 1, maxstep); if (nread < -1 ) { // an error occurred return nread; } else if (nread < 1) { // the end of the stream was encountered ntoskip = 0; } else { skipped += nread; ntoskip -= nread; } } return skipped; } CL_NS_END #endif clucene-core-2.3.3.4/src/core/CLucene/util/_streambuffer.h000066400000000000000000000102521154025176300232400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jos van den Oever * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef JSTREAM_STREAMBUFFER_H #define JSTREAM_STREAMBUFFER_H #include #include CL_NS_DEF(util) /** * @internal * @brief Provides a buffer for the use of BufferedStream */ template class StreamBuffer { private: public: /** * @internal * @brief Pointer to the start of the buffer. */ T* start; /** * @internal * @brief Size of the buffer. * * Size of the memory pointed to by @p start, * in multiples of sizeof(T) */ int32_t size; /** * @internal * @brief Pointer to the current position the buffer. */ T* readPos; /** * @internal * @brief The amount of data available in the buffer. * * The size of the used memory in the buffer, starting * from @p readPos. @p readPos + @p avail must be * greater than @p start + @p size. */ int32_t avail; /** * @internal * @brief Constructor: initialises members to sane defaults. */ StreamBuffer(); /** * @internal * @brief Destructor: frees the memory used by the buffer. */ ~StreamBuffer(); /** * @internal * @brief Sets the size of the buffer, allocating the necessary memory * * @param size the size that the buffer should be, in multiples * of sizeof(T) */ void setSize(int32_t size); /** * @internal * @brief Read data from the buffer * * Sets @p start to point to the data, starting * at the item of data following the last item * of data read. * * @param start pointer passed by reference. It will * be set to point to the data read from the buffer * @param max the maximum amount of data to read from * the buffer * @return the size of the data pointed to by @p start * (always less than or equal to @p max) */ int32_t read(const T*& start, int32_t max=0); /** * @internal * @brief Prepares the buffer for a new write. * * This function invalidates any pointers * previously obtained from read. * * @return the number of available places **/ int32_t makeSpace(int32_t needed); }; template StreamBuffer::StreamBuffer() { readPos = start = 0; size = avail = 0; } template StreamBuffer::~StreamBuffer() { std::free(start); } template void StreamBuffer::setSize(int32_t size) { // store pointer information int32_t offset = readPos - start; // allocate memory in the buffer start = (T*)std::realloc(start, size*sizeof(T)); this->size = size; // restore pointer information readPos = start + offset; } template int32_t StreamBuffer::makeSpace(int32_t needed) { // determine how much space is available for writing int32_t space = size - (readPos - start) - avail; if (space >= needed) { // there's enough space return space; } if (avail) { if (readPos != start) { // printf("moving\n"); // move data to the start of the buffer std::memmove(start, readPos, avail*sizeof(T)); space += readPos - start; readPos = start; } } else { // we may start writing at the start of the buffer readPos = start; space = size; } if (space >= needed) { // there's enough space now return space; } // still not enough space, we have to allocate more // printf("resize %i %i %i %i %i\n", avail, needed, space, size + needed - space, size); setSize(size + needed - space); return needed; } template int32_t StreamBuffer::read(const T*& start, int32_t max) { start = readPos; if (max <= 0 || max > avail) { max = avail; } readPos += max; avail -= max; return max; } CL_NS_END #endif clucene-core-2.3.3.4/src/core/CMakeLists.txt000066400000000000000000000241461154025176300205170ustar00rootroot00000000000000PROJECT(clucene-core) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${clucene-shared_SOURCE_DIR}/cmake") #define command line options INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS} -DMAKE_CLUCENE_CORE_LIB) #see if we can hide all symbols by default... MACRO_CHECK_GCC_VISIBILITY(_CL_HAVE_GCCVISIBILITYPATCH) #add the files to our groups and core SOURCE_GROUP("analysis" ./CLucene/analysis/*) #seems to be a bug in cmake, can't put these in analysis\\standard folder :( SOURCE_GROUP("analysis-standard" ./CLucene/analysis/standard/*) SOURCE_GROUP("document" ./CLucene/document/*) SOURCE_GROUP("debug" ./CLucene/debug/*) SOURCE_GROUP("index" ./CLucene/index/*) SOURCE_GROUP("queryParser" ./CLucene/queryParser/*) SOURCE_GROUP("queryParser-legacy" ./CLucene/queryParser/legacy/*) SOURCE_GROUP("search" ./CLucene/search/*) SOURCE_GROUP("search-spans" ./CLucene/search/spans/*) SOURCE_GROUP("store" ./CLucene/store/*) SOURCE_GROUP("util" ./CLucene/util/*) SET(clucene_core_Files ./CLucene/StdHeader.cpp ./CLucene/debug/error.cpp ./CLucene/util/ThreadLocal.cpp ./CLucene/util/Reader.cpp ./CLucene/util/Equators.cpp ./CLucene/util/FastCharStream.cpp ./CLucene/util/MD5Digester.cpp ./CLucene/util/StringIntern.cpp ./CLucene/util/BitSet.cpp ./CLucene/queryParser/FastCharStream.cpp ./CLucene/queryParser/MultiFieldQueryParser.cpp ./CLucene/queryParser/QueryParser.cpp ./CLucene/queryParser/QueryParserTokenManager.cpp ./CLucene/queryParser/QueryToken.cpp ./CLucene/queryParser/legacy/Lexer.cpp ./CLucene/queryParser/legacy/MultiFieldQueryParser.cpp ./CLucene/queryParser/legacy/QueryParser.cpp ./CLucene/queryParser/legacy/QueryParserBase.cpp ./CLucene/queryParser/legacy/QueryToken.cpp ./CLucene/queryParser/legacy/TokenList.cpp ./CLucene/analysis/standard/StandardAnalyzer.cpp ./CLucene/analysis/standard/StandardFilter.cpp ./CLucene/analysis/standard/StandardTokenizer.cpp ./CLucene/analysis/Analyzers.cpp ./CLucene/analysis/AnalysisHeader.cpp ./CLucene/store/MMapInput.cpp ./CLucene/store/IndexInput.cpp ./CLucene/store/Lock.cpp ./CLucene/store/LockFactory.cpp ./CLucene/store/IndexOutput.cpp ./CLucene/store/Directory.cpp ./CLucene/store/FSDirectory.cpp ./CLucene/store/RAMDirectory.cpp ./CLucene/document/Document.cpp ./CLucene/document/DateField.cpp ./CLucene/document/DateTools.cpp ./CLucene/document/Field.cpp ./CLucene/document/FieldSelector.cpp ./CLucene/document/NumberTools.cpp ./CLucene/index/IndexFileNames.cpp ./CLucene/index/IndexFileNameFilter.cpp ./CLucene/index/IndexDeletionPolicy.cpp ./CLucene/index/SegmentMergeInfo.cpp ./CLucene/index/SegmentInfos.cpp ./CLucene/index/MergeScheduler.cpp ./CLucene/index/SegmentTermDocs.cpp ./CLucene/index/FieldsWriter.cpp ./CLucene/index/TermInfosWriter.cpp ./CLucene/index/Term.cpp ./CLucene/index/Terms.cpp ./CLucene/index/MergePolicy.cpp ./CLucene/index/DocumentsWriter.cpp ./CLucene/index/DocumentsWriterThreadState.cpp ./CLucene/index/SegmentTermVector.cpp ./CLucene/index/TermVectorReader.cpp ./CLucene/index/FieldInfos.cpp ./CLucene/index/CompoundFile.cpp ./CLucene/index/SkipListReader.cpp ./CLucene/index/SkipListWriter.cpp ./CLucene/index/IndexFileDeleter.cpp ./CLucene/index/SegmentReader.cpp ./CLucene/index/DirectoryIndexReader.cpp ./CLucene/index/TermVectorWriter.cpp ./CLucene/index/IndexReader.cpp ./CLucene/index/SegmentTermPositions.cpp ./CLucene/index/SegmentMerger.cpp ./CLucene/index/IndexWriter.cpp ./CLucene/index/MultiReader.cpp ./CLucene/index/MultiSegmentReader.cpp ./CLucene/index/Payload.cpp ./CLucene/index/SegmentTermEnum.cpp ./CLucene/index/TermInfo.cpp ./CLucene/index/IndexModifier.cpp ./CLucene/index/SegmentMergeQueue.cpp ./CLucene/index/FieldsReader.cpp ./CLucene/index/TermInfosReader.cpp ./CLucene/index/MultipleTermPositions.cpp ./CLucene/search/Compare.cpp ./CLucene/search/Scorer.cpp ./CLucene/search/ScorerDocQueue.cpp ./CLucene/search/PhraseScorer.cpp ./CLucene/search/SloppyPhraseScorer.cpp ./CLucene/search/DisjunctionSumScorer.cpp ./CLucene/search/ConjunctionScorer.cpp ./CLucene/search/PhraseQuery.cpp ./CLucene/search/PrefixQuery.cpp ./CLucene/search/ExactPhraseScorer.cpp ./CLucene/search/TermScorer.cpp ./CLucene/search/Similarity.cpp ./CLucene/search/BooleanScorer.cpp ./CLucene/search/BooleanScorer2.cpp ./CLucene/search/HitQueue.cpp ./CLucene/search/FieldCacheImpl.cpp ./CLucene/search/ChainedFilter.cpp ./CLucene/search/RangeFilter.cpp ./CLucene/search/CachingWrapperFilter.cpp ./CLucene/search/QueryFilter.cpp ./CLucene/search/TermQuery.cpp ./CLucene/search/FuzzyQuery.cpp ./CLucene/search/SearchHeader.cpp ./CLucene/search/RangeQuery.cpp ./CLucene/search/IndexSearcher.cpp ./CLucene/search/Sort.cpp ./CLucene/search/PhrasePositions.cpp ./CLucene/search/FieldDocSortedHitQueue.cpp ./CLucene/search/WildcardTermEnum.cpp ./CLucene/search/MultiSearcher.cpp ./CLucene/search/Hits.cpp ./CLucene/search/MultiTermQuery.cpp ./CLucene/search/FilteredTermEnum.cpp ./CLucene/search/FieldSortedHitQueue.cpp ./CLucene/search/WildcardQuery.cpp ./CLucene/search/Explanation.cpp ./CLucene/search/BooleanQuery.cpp ./CLucene/search/FieldCache.cpp ./CLucene/search/DateFilter.cpp ./CLucene/search/MatchAllDocsQuery.cpp ./CLucene/search/MultiPhraseQuery.cpp ./CLucene/search/ConstantScoreQuery.cpp ./CLucene/search/CachingSpanFilter.cpp ./CLucene/search/CachingSpanFilter.h ./CLucene/search/SpanFilter.h ./CLucene/search/SpanFilterResult.h ./CLucene/search/SpanQueryFilter.cpp ./CLucene/search/SpanQueryFilter.h ./CLucene/search/spans/_EmptySpans.h ./CLucene/search/spans/_NearSpansOrdered.h ./CLucene/search/spans/_NearSpansUnordered.h ./CLucene/search/spans/_TermSpans.h ./CLucene/search/spans/NearSpansOrdered.cpp ./CLucene/search/spans/NearSpansUnordered.cpp ./CLucene/search/spans/SpanFirstQuery.cpp ./CLucene/search/spans/SpanFirstQuery.h ./CLucene/search/spans/SpanNearQuery.cpp ./CLucene/search/spans/SpanNearQuery.h ./CLucene/search/spans/SpanNotQuery.cpp ./CLucene/search/spans/SpanNotQuery.h ./CLucene/search/spans/SpanOrQuery.cpp ./CLucene/search/spans/SpanOrQuery.h ./CLucene/search/spans/SpanQuery.h ./CLucene/search/spans/Spans.h ./CLucene/search/spans/SpanScorer.cpp ./CLucene/search/spans/SpanScorer.h ./CLucene/search/spans/SpanTermQuery.cpp ./CLucene/search/spans/SpanTermQuery.h ./CLucene/search/spans/SpanWeight.cpp ./CLucene/search/spans/SpanWeight.h ./CLucene/search/spans/TermSpans.cpp ) #if USE_SHARED_OBJECT_FILES then we link directly to the object files (means rebuilding them for the core) IF ( USE_SHARED_OBJECT_FILES ) GET_SHARED_FILES(clucene_shared_Files) ENDIF ( USE_SHARED_OBJECT_FILES ) #find our headers file(GLOB_RECURSE HEADERS ${clucene-core_SOURCE_DIR}/*.h) #create the libraries INCLUDE_DIRECTORIES( ${clucene_SOURCE_DIR}/src/core ) add_library(clucene-core SHARED ${clucene_core_Files} ${clucene_shared_Files} ${HEADERS} ) #set properties on the libraries SET_TARGET_PROPERTIES(clucene-core PROPERTIES VERSION ${CLUCENE_VERSION} SOVERSION ${CLUCENE_SOVERSION} COMPILE_DEFINITIONS_DEBUG _DEBUG ) #link the clucene-core library against the releavent clucene-shared library (if we aren't using the object files) IF ( NOT USE_SHARED_OBJECT_FILES ) TARGET_LINK_LIBRARIES(clucene-core clucene-shared ${EXTRA_LIBS}) ENDIF ( NOT USE_SHARED_OBJECT_FILES ) IF ( BUILD_STATIC_LIBRARIES ) add_library(clucene-core-static STATIC ${clucene_core_Files} ${clucene_shared_Files} ${HEADERS} ) SET_TARGET_PROPERTIES(clucene-core-static PROPERTIES VERSION ${CLUCENE_VERSION} SOVERSION ${CLUCENE_SOVERSION} COMPILE_DEFINITIONS_DEBUG _DEBUG ) #and install library install(TARGETS clucene-core-static DESTINATION ${LIB_DESTINATION} COMPONENT runtime ) ENDIF ( BUILD_STATIC_LIBRARIES ) #install public headers. FOREACH(file ${HEADERS}) get_filename_component(apath ${file} PATH) get_filename_component(aname ${file} NAME) file(RELATIVE_PATH relpath ${CMAKE_SOURCE_DIR}/src/core ${apath}) IF ( NOT aname MATCHES "^_.*" ) install(FILES ${file} DESTINATION include/${relpath} COMPONENT development) ENDIF ( NOT aname MATCHES "^_.*" ) ENDFOREACH(file) #install clucene-shared headers. install(FILES ${clucene-shared_SOURCE_DIR}/CLucene/SharedHeader.h DESTINATION include/CLucene COMPONENT development) install(FILES ${clucene-shared_SOURCE_DIR}/CLucene/LuceneThreads.h DESTINATION include/CLucene COMPONENT development ) # code for installing an script to help cmake applications determine # the CLucene version number file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CLuceneConfig.cmake" " set(CLUCENE_VERSION_MAJOR ${CLUCENE_VERSION_MAJOR}) set(CLUCENE_VERSION_MINOR ${CLUCENE_VERSION_MINOR}) set(CLUCENE_VERSION_REVISION ${CLUCENE_VERSION_REVISION}) set(CLUCENE_VERSION_PATCH ${CLUCENE_VERSION_PATCH}) set(CLUCENE_VERSION ${CLUCENE_VERSION}) set(CLUCENE_SOVERSION ${CLUCENE_SOVERSION}) ") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/CLuceneConfig.cmake" DESTINATION ${LIB_DESTINATION}/CLuceneConfig.cmake) # install pkg-config file IF(NOT WIN32) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libclucene-core.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libclucene-core.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libclucene-core.pc DESTINATION ${LIB_DESTINATION}/pkgconfig ) ENDIF(NOT WIN32) #install non system-independent IF ( LUCENE_SYS_INCLUDES ) install(FILES ${clucene-shared_BINARY_DIR}/CLucene/clucene-config.h DESTINATION ${LUCENE_SYS_INCLUDES}/CLucene COMPONENT development) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CLuceneConfig.cmake DESTINATION ${LUCENE_SYS_INCLUDES}/CLucene COMPONENT development) ELSE ( LUCENE_SYS_INCLUDES ) install(FILES ${clucene-shared_BINARY_DIR}/CLucene/clucene-config.h DESTINATION include/CLucene COMPONENT development) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CLuceneConfig.cmake DESTINATION include/CLucene COMPONENT development) ENDIF ( LUCENE_SYS_INCLUDES ) #and install library install(TARGETS clucene-core DESTINATION ${LIB_DESTINATION} COMPONENT runtime ) clucene-core-2.3.3.4/src/core/files_list.txt000066400000000000000000000357321154025176300206600ustar00rootroot00000000000000Lucene 2.3.2 Files: --------------- DONE ISH analysis\Analyzer.java - Needs testing of mem-leaks caused by the reusableTokenStream interface. See http://permalink.gmane.org/gmane.comp.jakarta.lucene.clucene.devel/3359. Currently all class-specific data is being released on its destructor, and the Tokenizer is never being released by the Analyzer. ? analysis\CachingTokenFilter.java ? analysis\CharArraySet.java ? analysis\CharTokenizer.java ? analysis\ISOLatin1AccentFilter.java ? analysis\KeywordTokenizer.java ? analysis\LetterTokenizer.java ? analysis\LowerCaseFilter.java ? analysis\LowerCaseTokenizer.java ? analysis\SinkTokenizer.java ? analysis\standard\StandardAnalyzer.java ? analysis\standard\StandardFilter.java ? analysis\standard\StandardTokenizer.java ? analysis\standard\StandardTokenizerImpl.java ? analysis\standard\StandardTokenizerImpl.jflex DONE ISH analysis\StopAnalyzer.java - reusableTokenStream and StopAnalyzer(Set stopWords) were not implemented. May need to revisit reusableTokenStream() ? analysis\TeeTokenFilter.java ? analysis\Token.java ? analysis\TokenFilter.java DONE ISH analysis\TokenStream.java - Should we keep next() deprecated for performance reasons, or comply with JL? Also, check to see if reset() is required here at all, or can be defined for Tokenizer only (one level above) DONE ISH analysis\WhitespaceTokenizer.java DONE ISH analysis\WordlistLoader.java - Missing getStemDict DONE ISH document\DateTools.java - TODO: Create a test suite for this based on values tested with Java Lucene DONE ISH queryParser\MultiFieldQueryParser.java - Some tests are missing DONE ISH queryParser\QueryParser.java - Missing Locale and Calendar support (for RangeQuery) and some tests. _tcstod. IRRELEVANT queryParser\QueryParser.jj DONE ISH queryParser\QueryParserConstants.java DONE ISH queryParser\QueryParserTokenManager.java - PrintStream implementation is missing (if at all necessary) DONE ISH queryParser\Token.java - If LUCENE_TOKEN_WORD_LENGTH is still necessary, it needs to be implemented in the new code, and have tests written to make sure it works flawlessly with the new QP. Currently it's half implemented. DONE ISH queryParser\TokenMgrError.java - Integrated within QueryParserTokenManager as functions ? search\BooleanScorer.java ? search\DisjunctionMaxQuery.java - new file, not ported yet ? search\ExtendedFieldCache.java ? search\ExtendedFieldCacheImpl.java ? search\FieldCache.java ? search\FieldCacheImpl.java ? search\FieldDoc.java ? search\FieldDocSortedHitQueue.java ? search\FieldSortedHitQueue.java ? search\FilteredQuery.java DONE ISH search\FilteredTermEnum.java - Can we mend term(void) and term(bool) ? ? search\FilterManager.java DONE ISH search\FuzzyQuery.java - See TODOs. DONE ISH search\FuzzyTermEnum.java - See TODOs. Also, Old similarity code is commented out and marked as "legacy". It looks like some optimizations were made there, but since Fuzzy queries weren't working as they should we had to revert to Java's implementation. Perhaps after tests are complete we could try and get the optimized version to work again. ? search\Hit.java ? search\HitIterator.java DONE ISH search\Hits.java - Needs rethinking of why Query* is used instead of Weight* PARTIAL search\IndexSearcher.java - Almost no difference. See todo and complete comparison between JL and CL. ? search\MultiSearcher.java ? search\PhrasePositions.java ? search\QueryFilter.java ? search\QueryTermVector.java ? search\QueryWrapperFilter.java ? search\RemoteSearchable.java ? search\Searchable.java - Any idea why the explain() function in Searchable and derived differs from Java (accepts Query* instead of Weight*)? can we safely confrom with Java now? ? search\Similarity.java ? search\SimilarityDelegator.java DONE ISH search\TermQuery.java - Missing implementation for extractTerms(Set) ? search\TopDocCollector.java ? search\TopFieldDocCollector.java PARTIAL JW store\NativeFSLockFactory.java - 1 class implemented as FSLockFactory PARTIAL JW store\SimpleFSLockFactory.java - 1 class implemented as FSLockFactory ? store\VerifyingLockFactory.java ? util\ScorerDocQueue.java Pending: waiting on other things... DONE ISH search\Filter.java - Remove virtual toString once CachingWrapperFilter and ChainedFilter (does not exist in JL?) conform to JL. Missing equals() and hashCode() virtual functions, hence all derived miss this as well. PARTIAL ISH search\RangeFilter.java - Missing hashCode() and equals() -- see comment on Filter. Needs testing for bits() and toString(). Finished except a few functions: DONE ISH search\PhraseQuery.java - extractTerms(Set) was never ported (probably not needed). Inconsitency in return value of getPositions getTerms. DONE ISH search\Query.java - Missing implementation for extractTerms(Set terms) DONE ISH search\MultiTermQuery.java - hashcode and equals were never ported DONE ISH search\MatchAllDocsQuery.java - MatchAllDocsWeight::explain needs to support ComplexExplanation in order to set "match", plus we might want to reconsider returning void instead of Explanation* in Weight::explain an derived DONE ISH search\MultiPhraseQuery.java - Complete TODOs (2 unported functions, test hashCode(), clone(), and decide on memory contract for rewrite) DONE ISH index\SegmentTermPositions.java - getPayload is still incomplete DONE ISH search\ConstantScoreQuery.java - See TODOs DONE ISH search\ConstantScoreRangeQuery.java - See TODOs CMake: Check todos in (_)clucene-config.h.cmake. Some checks arent being done yet. for example: _CL_HAVE_PTHREAD_MUTEX_RECURSIVE get rid of Misc.h, repl_* check up on sub-folders bug (analysis/standard) MapViewOfFile issues (cmake not picking up functions in kernel32) Use safe CRT where possible. For example, make _tcsdup / stringDuplicate require n and call the _s version if cmake realizes it exists Misc TODOs: Post v1 Final: DONE ISH analysis\StopFilter.java - Should we implement a CharArraySet or similar? Radix/PATRICIA maybe? DONE ISH analysis\TokenStream.java - Should we keep next() deprecated for performance reasons, or comply with JL? (ben: for me, it's fine as it is now) Also, check to see if reset() is required here at all, or can be defined for Tokenizer only (one level above) DONE ISH analysis\WordlistLoader.java - Missing getStemDict DONE ISH document\DateTools.java - TODO: Create a test suite for this based on values tested with Java Lucene PARTIAL ISH/BEN index\SegmentInfos.java - Still requires some testing of the sub-classes under SegmentInfos used for the retry mechanism, the write function (only after reading totally conforms with JL) ? search\CachingSpanFilter.java ? search\CachingWrapperFilter.java ? index\SortedTermVectorMapper.java -alt ? index\TermVectorEntryFreqSortedComparator.java -alt ? index\PositionBasedTermVectorMapper.java -alt ? index\CheckIndex.java DONE BEN search\BooleanScorer2.java ? search\SpanFilter.java ? search\SpanFilterResult.java ? search\SpanQueryFilter.java ? search\spans\NearSpansOrdered.java ? search\spans\NearSpansUnordered.java ? search\spans\SpanFirstQuery.java ? search\spans\SpanNearQuery.java ? search\spans\SpanNotQuery.java ? search\spans\SpanOrQuery.java ? search\spans\SpanQuery.java ? search\spans\Spans.java ? search\spans\SpanScorer.java ? search\spans\SpanTermQuery.java ? search\spans\SpanWeight.java ? search\spans\TermSpans.java ? search\function\ByteFieldSource.java ? search\function\CustomScoreQuery.java ? search\function\DocValues.java ? search\function\FieldCacheSource.java ? search\function\FieldScoreQuery.java ? search\function\FloatFieldSource.java ? search\function\IntFieldSource.java ? search\function\OrdFieldSource.java ? search\function\ReverseOrdFieldSource.java ? search\function\ShortFieldSource.java ? search\function\ValueSource.java ? search\function\ValueSourceQuery.java ? index\ConcurrentMergeScheduler.java ? index\SnapshotDeletionPolicy.java ? index\ParallelReader.java ? store\LockStressTest.java ? store\LockVerifyServer.java ? search\ParallelMultiSearcher.java ? search\payloads\BoostingTermQuery.java ? search\RemoteCachingWrapperFilter.java "Archived" DONE ISH document\Fieldable.java - Merged into Field DONE ISH document\FieldSelector.java DONE ISH document\FieldSelectorResult.java DONE ISH document\LoadFirstFieldSelector.java DONE ISH document\NumberTools.java DONE BEN document\MapFieldSelector.java DONE BEN document\SetBasedFieldSelector.java (Irrelevent, actually, we achive both in MapFieldSelector) DONE ISH document\Document.java - All Fieldable mentiones were kept Field*. DONE ISH document\Field.java - Still need to complete all TODOs in file DONE ISH queryParser\ParseException.java - Done, integrated within QueryParser as functions (no special Exception class required) DONE ISH/BEN index\TermInfosReader.java DONE ISH index\FieldsReader.java DONE BEN index\FieldsWriter.java DONE ISH index\TermVectorMapper.java DONE ISH index\TermVectorOffsetInfo.java DONE ISH index\TermVectorsReader.java DONE ISH/BEN index\SegmentInfo.java DONE BEN index\StaleReaderException.java DONE BEN index\TermBuffer.java (actually, not nessary, Term has the same functionality) DONE BEN index\TermInfosWriter.java DONE ISH index\FieldInfo.java DONE ISH index\SegmentMergeInfo.java DONE ISH index\SegmentMergeQueue.java DONE ISH index\SegmentTermVector.java DONE ISH index\Term.java DONE ISH index\TermDocs.java DONE ISH index\TermEnum.java DONE ISH index\TermFreqVector.java DONE ISH index\TermInfo.java DONE ISH index\TermPositions.java DONE ISH index\TermPositionVector.java IRRELEVANT LucenePackage.java DONE ISH queryParser\CharStream.java DONE ISH queryParser\FastCharStream.java DONE ISH index\CompoundFileReader.java DONE BEN index\CompoundFileWriter.java DONE BEN index\CorruptIndexException.java DONE ISH index\DefaultSkipListReader.java DONE BEN index\DefaultSkipListWriter.java DONE BEN index\DirectoryIndexReader.java DONE BEN index\DocumentsWriter.java DONE ISH index\FieldInfos.java DONE BEN index\FieldReaderException.java DONE ISH index\FieldSortedTermVectorMapper.java DONE ISH index\FilterIndexReader.java DONE BEN index\IndexCommitPoint.java DONE BEN index\IndexDeletionPolicy.java DONE BEN index\IndexFileDeleter.java DONE BEN index\IndexFileNameFilter.java DONE JW index\IndexFileNames.java DONE BEN index\IndexModifier.java DONE BEN index\IndexReader.java DONE BEN index\IndexWriter.java DONE BEN index\KeepOnlyLastCommitDeletionPolicy.java DONE BEN index\LogByteSizeMergePolicy.java DONE BEN index\LogDocMergePolicy.java DONE BEN index\LogMergePolicy.java DONE BEN index\MergePolicy.java DONE BEN index\MergeScheduler.java DONE ISH index\MultiLevelSkipListReader.java DONE BEN index\MultiLevelSkipListWriter.java DONE BEN index\MultiReader.java DONE BEN index\MultiSegmentReader.java DONE ISH index\Payload.java DONE BEN index\SegmentMerger.java DONE BEN index\SegmentReader.java DONE BEN index\SegmentTermDocs.java DONE BEN index\SegmentTermEnum.java DONE ISH index\SegmentTermPositionVector.java DONE BEN index\SerialMergeScheduler.java DONE BEN index\TermVectorEntry.java DONE BEN index\TermVectorsWriter.java DONE ISH/BEN index\MultipleTermPositions.java DONE BEN search\BooleanQuery.java DONE BEN search\DefaultSimilarity.java DONE BEN search\ConjunctionScorer.java DONE ISH search\SloppyPhraseScorer.java DONE ISH search\ExactPhraseScorer.java DONE BEN search\NonMatchingScorer.java - This class is under BooleanScorer2 - should this ever be used anywhere else in the namespace it's going to be a problem. Perhaps we should move it now already outside to the namespace scope? DONE BEN search\ReqExclScorer.java - This class is under BooleanScorer2 - should this ever be used anywhere else in the namespace it's going to be a problem. Perhaps we should move it now already outside to the namespace scope? DONE BEN search\ReqOptSumScorer.java - This class is under BooleanScorer2 - should this ever be used anywhere else in the namespace it's going to be a problem. Perhaps we should move it now already outside to the namespace scope? DONE BEN search\PhraseQueue.java DONE ISH search\PhraseScorer.java DONE ISH search\DisjunctionSumScorer.java DONE ISH search\ComplexExplanation.java DONE BEN search\HitQueue.java - no changes DONE BEN search\Weight.java DONE BEN search\TopDocs.java DONE ISH search\PrefixQuery.java DONE BEN search\RangeQuery.java DONE ISH search\ScoreDocComparator.java DONE ISH search\Scorer.java DONE BEN search\Searcher.java - no changes DONE BEN search\SortComparator.java DONE BEN search\SortComparatorSource.java DONE BEN search\TopFieldDocs.java - no changes DONE BEN search\WildcardQuery.java DONE BEN search\WildcardTermEnum.java - no changes DONE ISH search\BooleanClause.java - Should we change the flags in Occur to be named with an OCCUR_ prefix, since they're being used as BooleanClause::SHOULD all throughout the code? BEN DONE search\PrefixFilter.java - all done BEN DONE search\SortField.java BEN DONE search\Sort.java BEN DONE search\TermScorer.java DONE ISH search\Explanation.java - Why can't we use TCHAR* for description? DONE ISH search\ScoreDoc.java - Implemented. Java Lucene has a constructor for it, we don't. DONE ISH search\HitCollector.java - No changes, abstract class IRRELEVANT analysis\PorterStemFilter.java - deprecated IRRELEVANT analysis\PorterStemmer.java - deprecated DONE ISH analysis\WhitespaceAnalyzer.java DONE ISH analysis\PerFieldAnalyzerWrapper.java - toString() not yet implemented DONE ISH analysis\LengthFilter.java DONE ISH analysis\KeywordAnalyzer.java DONE ISH analysis\SimpleAnalyzer.java DONE ISH analysis\Tokenizer.java -- Should we delete input on destructor and close? perhaps allow this through an optional parameter? DONE ISH store\IndexInput.java - Clone method implemented as constructor only IRRELEVANT store\AlreadyClosedException.java - Using CL_ERR_IllegalState for this DONE JW store\Directory.java DONE JW store\FSDirectory.java DONE JW store\NoLockFactory.java DONE JW store\RAMDirectory.java DONE JW store\RAMFile.java DONE JW store\RAMInputStream.java DONE JW store\RAMOutputStream.java DONE ISH store\IndexOutput.java DONE JW store\Lock.java DONE JW store\LockFactory.java IRRELEVANT store\LockObtainFailedException.java IRRELEVANT store\LockReleaseFailedException.java IRRELEVANT store\MMapDirectory.java DONE JW store\SingleInstanceLockFactory.java DONE ISH store\BufferedIndexInput.java DONE ISH store\BufferedIndexOutput.java DONE ISH document\AbstractField.java - Merged into Field DEPRECATED document\DateField.java DONE BEN util\BitVector.java DONE BEN util\Constants.java DONE BEN util\Parameter.java DONE BEN util\SmallFloat.java DONE BEN util\StringHelper.java DONE ISH util\ToStringUtils.java DONE JW util\PriorityQueue.java Update jstreams from latest code of Strigi: strigi isn't really used anymore... we can link to it as necessary... Create an auxiliary namespace with all the platform-dependant code, to enable static linking to it by contrib, tests and other apps which might need this: that's what the clucene-shared lib is update Internal* internal to be named otherwise (internal is a preserved word in VS; perhaps ChesireCat* chesCat?)? renamed to _internal clucene-core-2.3.3.4/src/core/libclucene-core.pc.cmake000066400000000000000000000007301154025176300224060ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix}/bin libdir=${prefix}/@LIB_DESTINATION@ includedir=${prefix}/include:${prefix}/include/CLucene/ext Name: libclucene Description: CLucene - a C++ search engine, ported from the popular Apache Lucene Version: @CLUCENE_VERSION_MAJOR@.@CLUCENE_VERSION_MINOR@.@CLUCENE_VERSION_REVISION@.@CLUCENE_VERSION_PATCH@ Libs: -L${prefix}/@LIB_DESTINATION@/ -lclucene-core Cflags: -I${prefix}/include -I${prefix}/include/CLucene/ext ~ clucene-core-2.3.3.4/src/demo/000077500000000000000000000000001154025176300157445ustar00rootroot00000000000000clucene-core-2.3.3.4/src/demo/CMakeLists.txt000066400000000000000000000011351154025176300205040ustar00rootroot00000000000000PROJECT(cl_demo) INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS}) INCLUDE_DIRECTORIES( ${clucene-demo_SOURCE_DIR} ) INCLUDE_DIRECTORIES( ${clucene_SOURCE_DIR}/src/core ) file(GLOB_RECURSE demo_HEADERS ${CMAKE_SOURCE_DIR}/test/*.h) ADD_EXECUTABLE(cl_demo EXCLUDE_FROM_ALL #./DeleteFiles.cpp ./IndexFiles.cpp ./Main.cpp ./SearchFiles.cpp ./Statistics.cpp #${clucene-shared_SOURCE_DIR}/CLucene/util/Misc.cpp #${clucene-shared_SOURCE_DIR}/CLucene/util/dirent.cpp ${demo_HEADERS} ) TARGET_LINK_LIBRARIES(cl_demo clucene-core clucene-shared ${EXTRA_LIBS}) clucene-core-2.3.3.4/src/demo/DeleteFiles.cpp000066400000000000000000000022451154025176300206400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "stdafx.h" #include "CLucene.h" #include using namespace std; using namespace lucene::index; using namespace lucene::util; using namespace lucene::store; using namespace lucene::document; void DeleteFiles(const char* dir) { IndexReader* reader = IndexReader::open(dir); int32_t count = 0; for (int32_t i = 0; i < reader->maxDoc(); i++){ reader->deleteDocument (i); count ++; } printf("Deleted %d files\n", count); reader->close(); _CLDELETE(reader); //OPTIMIZE if ( IndexReader::indexExists(dir) ){ lucene::analysis::SimpleAnalyzer an; if ( IndexReader::isLocked(dir) ){ printf("Index was locked... unlocking it.\n"); IndexReader::unlock(dir); } IndexWriter* writer = _CLNEW IndexWriter( dir, &an, false); writer->optimize(); _CLDELETE(writer); } } clucene-core-2.3.3.4/src/demo/IndexFiles.cpp000066400000000000000000000100701154025176300205000ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include "CLucene/StdHeader.h" #include "CLucene/_clucene-config.h" #include "CLucene.h" #include "CLucene/util/CLStreams.h" #include "CLucene/util/dirent.h" #include "CLucene/config/repl_tchar.h" #include "CLucene/util/Misc.h" #include "CLucene/util/StringBuffer.h" using namespace std; using namespace lucene::index; using namespace lucene::analysis; using namespace lucene::util; using namespace lucene::store; using namespace lucene::document; void FileDocument(const char* f, Document* doc){ // Add the path of the file as a field named "path". Use an indexed and stored field, so // that the index stores the path, and so that the path is searchable. TCHAR tf[CL_MAX_DIR]; STRCPY_AtoT(tf,f,CL_MAX_DIR); doc->add( *_CLNEW Field(_T("path"), tf, Field::STORE_YES | Field::INDEX_UNTOKENIZED ) ); // Add the last modified date of the file a field named "modified". Again, we make it // searchable, but no attempt is made to tokenize the field into words. //doc->add( *_CLNEW Field(_T("modified"), DateTools::timeToString(f->lastModified()), Field::STORE_YES | Field::INDEX_NO)); // Add the contents of the file a field named "contents". This time we use a tokenized // field so that the text can be searched for words in it. // Here we read the data without any encoding. If you want to use special encoding // see the contrib/jstreams - they contain various types of stream readers FILE* fh = fopen(f,"r"); if ( fh != NULL ){ StringBuffer str; char abuf[1024]; TCHAR tbuf[1024]; size_t r; do{ r = fread(abuf,1,1023,fh); abuf[r]=0; STRCPY_AtoT(tbuf,abuf,r); tbuf[r]=0; str.append(tbuf); }while(r>0); fclose(fh); doc->add( *_CLNEW Field(_T("contents"), str.getBuffer(), Field::STORE_YES | Field::INDEX_TOKENIZED) ); } } void indexDocs(IndexWriter* writer, const char* directory) { vector files; std::sort(files.begin(),files.end()); Misc::listFiles(directory,files,true); vector::iterator itr = files.begin(); // Re-use the document object Document doc; int i=0; while ( itr != files.end() ){ const char* path = itr->c_str(); printf( "adding file %d: %s\n", ++i, path ); doc.clear(); FileDocument( path, &doc ); writer->addDocument( &doc ); ++itr; } } void IndexFiles(const char* path, const char* target, const bool clearIndex){ IndexWriter* writer = NULL; lucene::analysis::WhitespaceAnalyzer an; if ( !clearIndex && IndexReader::indexExists(target) ){ if ( IndexReader::isLocked(target) ){ printf("Index was locked... unlocking it.\n"); IndexReader::unlock(target); } writer = _CLNEW IndexWriter( target, &an, false); }else{ writer = _CLNEW IndexWriter( target ,&an, true); } //writer->setInfoStream(&std::cout); // We can tell the writer to flush at certain occasions //writer->setRAMBufferSizeMB(0.5); //writer->setMaxBufferedDocs(3); // To bypass a possible exception (we have no idea what we will be indexing...) writer->setMaxFieldLength(0x7FFFFFFFL); // LUCENE_INT32_MAX_SHOULDBE // Turn this off to make indexing faster; we'll turn it on later before optimizing writer->setUseCompoundFile(false); uint64_t str = Misc::currentTimeMillis(); indexDocs(writer, path); // Make the index use as little files as possible, and optimize it writer->setUseCompoundFile(true); writer->optimize(); // Close and clean up writer->close(); _CLLDELETE(writer); printf("Indexing took: %d ms.\n\n", (int32_t)(Misc::currentTimeMillis() - str)); } clucene-core-2.3.3.4/src/demo/Main.cpp000066400000000000000000000040751154025176300173420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/StdHeader.h" #include "CLucene/_clucene-config.h" #include "CLucene.h" #include "CLucene/util/Misc.h" //test for memory leaks: #ifdef _MSC_VER #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include #include #endif #endif #include #include #include using namespace std; using namespace lucene::util; //void DeleteFiles(const char* dir); void IndexFiles(const char* path, const char* target, const bool clearIndex); void SearchFiles(const char* index); void getStats(const char* directory); int main( int32_t argc, char** argv ){ //Dumper Debug #ifdef _MSC_VER #ifdef _DEBUG _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF ); _crtBreakAlloc=-1; #endif #endif uint64_t str = Misc::currentTimeMillis(); try{ printf("Location of text files to be indexed: "); char files[250]; char* tmp = fgets(files,250,stdin); if ( tmp == NULL ) return 1; files[strlen(files)-1] = 0; printf("Location to store the clucene index: "); char ndx[250]; tmp = fgets(ndx,250,stdin); if ( tmp == NULL ) return 1; ndx[strlen(ndx)-1] = 0; IndexFiles(files,ndx,true); getStats(ndx); SearchFiles(ndx); //DeleteFiles(ndx); }catch(CLuceneError& err){ printf("Error: %s\n", err.what()); }catch(...){ printf("Unknown error\n"); } _lucene_shutdown(); //clears all static memory //print lucenebase debug //Debugging techniques: //For msvc, use this for breaking on memory leaks: // _crtBreakAlloc //for linux, use valgrind printf ("\n\nTime taken: %d\n\n", (int32_t)(Misc::currentTimeMillis() - str)); return 0; } clucene-core-2.3.3.4/src/demo/README000066400000000000000000000001721154025176300166240ustar00rootroot00000000000000A small demonstration program similar to the lucene demo program, except that it runs index,search and delete it one go. clucene-core-2.3.3.4/src/demo/SearchFiles.cpp000066400000000000000000000045051154025176300206440ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include #include #include "CLucene/StdHeader.h" #include "CLucene/_clucene-config.h" #include "CLucene.h" #include "CLucene/config/repl_tchar.h" #include "CLucene/config/repl_wchar.h" #include "CLucene/util/Misc.h" using namespace std; using namespace lucene::analysis; using namespace lucene::index; using namespace lucene::util; using namespace lucene::queryParser; using namespace lucene::document; using namespace lucene::search; void SearchFiles(const char* index){ standard::StandardAnalyzer analyzer; char line[80]; TCHAR tline[80]; TCHAR* buf; IndexReader* reader = IndexReader::open(index); while (true) { printf("Enter query string: "); char* tmp = fgets(line,80,stdin); if ( tmp == NULL ) continue; line[strlen(line)-1]=0; IndexReader* newreader = reader->reopen(); if ( newreader != reader ){ _CLLDELETE(reader); reader = newreader; } IndexSearcher s(reader); if ( strlen(line) == 0 ) break; STRCPY_AtoT(tline,line,80); Query* q = QueryParser::parse(tline,_T("contents"),&analyzer); buf = q->toString(_T("contents")); _tprintf(_T("Searching for: %s\n\n"), buf); _CLDELETE_LCARRAY(buf); uint64_t str = Misc::currentTimeMillis(); Hits* h = s.search(q); uint32_t srch = (int32_t)(Misc::currentTimeMillis() - str); str = Misc::currentTimeMillis(); for ( size_t i=0;ilength();i++ ){ Document* doc = &h->doc(i); //const TCHAR* buf = doc.get(_T("contents")); _tprintf(_T("%d. %s - %f\n"), i, doc->get(_T("path")), h->score(i)); } printf("\n\nSearch took: %d ms.\n", srch); printf("Screen dump took: %d ms.\n\n", (int32_t)(Misc::currentTimeMillis() - str)); _CLLDELETE(h); _CLLDELETE(q); s.close(); } reader->close(); _CLLDELETE(reader); } clucene-core-2.3.3.4/src/demo/Statistics.cpp000066400000000000000000000025221154025176300206030ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include #include #include "CLucene/StdHeader.h" #include "CLucene/_clucene-config.h" #include "CLucene.h" #include "CLucene/config/repl_tchar.h" #include "CLucene/config/repl_wchar.h" #include "CLucene/util/Misc.h" using namespace std; using namespace lucene::analysis; using namespace lucene::index; using namespace lucene::util; using namespace lucene::search; void getStats(const char* directory){ IndexReader* r = IndexReader::open(directory); printf("Statistics for %s\n", directory); printf("==================================\n"); printf("Max Docs: %d\n", r->maxDoc() ); printf("Num Docs: %d\n", r->numDocs() ); int64_t ver = r->getCurrentVersion(directory); _tprintf(_T("Current Version: %f\n"), (float_t)ver ); TermEnum* te = r->terms(); int32_t nterms; for (nterms = 0; te->next() == true; nterms++) { /* empty */ } printf("Term count: %d\n\n", nterms ); _CLLDELETE(te); r->close(); _CLLDELETE(r); } clucene-core-2.3.3.4/src/ext/000077500000000000000000000000001154025176300156205ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/CMakeLists.txt000066400000000000000000000006751154025176300203700ustar00rootroot00000000000000PROJECT(clucene-ext) file(GLOB_RECURSE EXTHEADERS ${clucene-ext_SOURCE_DIR}/boost/*.hpp) #install public headers. FOREACH(file ${EXTHEADERS}) get_filename_component(apath ${file} PATH) get_filename_component(aname ${file} NAME) file(RELATIVE_PATH relpath ${CMAKE_SOURCE_DIR}/src/ext/boost ${apath}) install(FILES ${file} DESTINATION "include/CLucene/ext/boost/${relpath}" COMPONENT development) ENDFOREACH(file) clucene-core-2.3.3.4/src/ext/boost/000077500000000000000000000000001154025176300167465ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/assert.hpp000066400000000000000000000023721154025176300207640ustar00rootroot00000000000000// // boost/assert.hpp - BOOST_ASSERT(expr) // // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. // Copyright (c) 2007 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Note: There are no include guards. This is intentional. // // See http://www.boost.org/libs/utility/assert.html for documentation. // #undef BOOST_ASSERT #if defined(BOOST_DISABLE_ASSERTS) # define BOOST_ASSERT(expr) ((void)0) #elif defined(BOOST_ENABLE_ASSERT_HANDLER) #include namespace boost { void assertion_failed(char const * expr, char const * function, char const * file, long line); // user defined } // namespace boost #define BOOST_ASSERT(expr) ((expr)? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)) #else # include // .h to support old libraries w/o - effect is the same # define BOOST_ASSERT(expr) assert(expr) #endif #undef BOOST_VERIFY #if defined(BOOST_DISABLE_ASSERTS) || ( !defined(BOOST_ENABLE_ASSERT_HANDLER) && defined(NDEBUG) ) # define BOOST_VERIFY(expr) ((void)(expr)) #else # define BOOST_VERIFY(expr) BOOST_ASSERT(expr) #endif clucene-core-2.3.3.4/src/ext/boost/checked_delete.hpp000066400000000000000000000030651154025176300223730ustar00rootroot00000000000000#ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED #define BOOST_CHECKED_DELETE_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/checked_delete.hpp // // Copyright (c) 2002, 2003 Peter Dimov // Copyright (c) 2003 Daniel Frey // Copyright (c) 2003 Howard Hinnant // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/utility/checked_delete.html for documentation. // namespace boost { // verify that types are complete for increased safety template inline void checked_delete(T * x) { // intentionally complex - simplification causes regressions typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete x; } template inline void checked_array_delete(T * x) { typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete [] x; } template struct checked_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * x) const { // boost:: disables ADL boost::checked_delete(x); } }; template struct checked_array_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * x) const { boost::checked_array_delete(x); } }; } // namespace boost #endif // #ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/config.hpp000066400000000000000000000040021154025176300207200ustar00rootroot00000000000000// Boost config.hpp configuration header file ------------------------------// // (C) Copyright John Maddock 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/config for most recent version. // Boost config.hpp policy and rationale documentation has been moved to // http://www.boost.org/libs/config // // CAUTION: This file is intended to be completely stable - // DO NOT MODIFY THIS FILE! // #ifndef BOOST_CONFIG_HPP #define BOOST_CONFIG_HPP // if we don't have a user config, then use the default location: #if !defined(BOOST_USER_CONFIG) && !defined(BOOST_NO_USER_CONFIG) # define BOOST_USER_CONFIG #endif // include it first: #ifdef BOOST_USER_CONFIG # include BOOST_USER_CONFIG #endif // if we don't have a compiler config set, try and find one: #if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG) # include #endif // if we have a compiler config, include it now: #ifdef BOOST_COMPILER_CONFIG # include BOOST_COMPILER_CONFIG #endif // if we don't have a std library config set, try and find one: #if !defined(BOOST_STDLIB_CONFIG) && !defined(BOOST_NO_STDLIB_CONFIG) && !defined(BOOST_NO_CONFIG) # include #endif // if we have a std library config, include it now: #ifdef BOOST_STDLIB_CONFIG # include BOOST_STDLIB_CONFIG #endif // if we don't have a platform config set, try and find one: #if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) && !defined(BOOST_NO_CONFIG) # include #endif // if we have a platform config, include it now: #ifdef BOOST_PLATFORM_CONFIG # include BOOST_PLATFORM_CONFIG #endif // get config suffix code: #include #endif // BOOST_CONFIG_HPP clucene-core-2.3.3.4/src/ext/boost/config/000077500000000000000000000000001154025176300202135ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/config/abi/000077500000000000000000000000001154025176300207465ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/config/abi/borland_prefix.hpp000066400000000000000000000017471154025176300244660ustar00rootroot00000000000000// (C) Copyright John Maddock 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // for C++ Builder the following options effect the ABI: // // -b (on or off - effect emum sizes) // -Vx (on or off - empty members) // -Ve (on or off - empty base classes) // -aX (alignment - 5 options). // -pX (Calling convention - 4 options) // -VmX (member pointer size and layout - 5 options) // -VC (on or off, changes name mangling) // -Vl (on or off, changes struct layout). // In addition the following warnings are sufficiently annoying (and // unfixable) to have them turned off by default: // // 8027 - functions containing [for|while] loops are not expanded inline // 8026 - functions taking class by value arguments are not expanded inline #pragma nopushoptwarn # pragma option push -Vx -Ve -a8 -b -pc -Vmv -VC- -Vl- -w-8027 -w-8026 clucene-core-2.3.3.4/src/ext/boost/config/abi/borland_suffix.hpp000066400000000000000000000004301154025176300244610ustar00rootroot00000000000000// (C) Copyright John Maddock 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) # pragma option pop #pragma nopushoptwarn clucene-core-2.3.3.4/src/ext/boost/config/abi/msvc_prefix.hpp000066400000000000000000000014631154025176300240100ustar00rootroot00000000000000// (C) Copyright John Maddock 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Boost binaries are built with the compiler's default ABI settings, // if the user changes their default alignment in the VS IDE then their // code will no longer be binary compatible with the bjam built binaries // unless this header is included to force Boost code into a consistent ABI. // // Note that inclusion of this header is only necessary for libraries with // separate source, header only libraries DO NOT need this as long as all // translation units are built with the same options. // #if defined(_M_X64) # pragma pack(push,16) #else # pragma pack(push,8) #endif clucene-core-2.3.3.4/src/ext/boost/config/abi/msvc_suffix.hpp000066400000000000000000000003741154025176300240170ustar00rootroot00000000000000// (C) Copyright John Maddock 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #pragma pack(pop) clucene-core-2.3.3.4/src/ext/boost/config/abi_prefix.hpp000066400000000000000000000012721154025176300230360ustar00rootroot00000000000000// abi_prefix header -------------------------------------------------------// // (c) Copyright John Maddock 2003 // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). #ifndef BOOST_CONFIG_ABI_PREFIX_HPP # define BOOST_CONFIG_ABI_PREFIX_HPP #else # error double inclusion of header boost/config/abi_prefix.hpp is an error #endif #include // this must occur after all other includes and before any code appears: #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif #if defined( __BORLANDC__ ) #pragma nopushoptwarn #endif clucene-core-2.3.3.4/src/ext/boost/config/abi_suffix.hpp000066400000000000000000000014151154025176300230440ustar00rootroot00000000000000// abi_sufffix header -------------------------------------------------------// // (c) Copyright John Maddock 2003 // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // This header should be #included AFTER code that was preceded by a #include // . #ifndef BOOST_CONFIG_ABI_PREFIX_HPP # error Header boost/config/abi_suffix.hpp must only be used after boost/config/abi_prefix.hpp #else # undef BOOST_CONFIG_ABI_PREFIX_HPP #endif // the suffix header occurs after all of our code: #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_SUFFIX #endif #if defined( __BORLANDC__ ) #pragma nopushoptwarn #endif clucene-core-2.3.3.4/src/ext/boost/config/auto_link.hpp000066400000000000000000000242011154025176300227100ustar00rootroot00000000000000// (C) Copyright John Maddock 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /* * LOCATION: see http://www.boost.org for most recent version. * FILE auto_link.hpp * VERSION see * DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers. */ /************************************************************************* USAGE: ~~~~~~ Before including this header you must define one or more of define the following macros: BOOST_LIB_NAME: Required: A string containing the basename of the library, for example boost_regex. BOOST_LIB_TOOLSET: Optional: the base name of the toolset. BOOST_DYN_LINK: Optional: when set link to dll rather than static library. BOOST_LIB_DIAGNOSTIC: Optional: when set the header will print out the name of the library selected (useful for debugging). BOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib, rather than a mangled-name version. These macros will be undef'ed at the end of the header, further this header has no include guards - so be sure to include it only once from your library! Algorithm: ~~~~~~~~~~ Libraries for Borland and Microsoft compilers are automatically selected here, the name of the lib is selected according to the following formula: BOOST_LIB_PREFIX + BOOST_LIB_NAME + "_" + BOOST_LIB_TOOLSET + BOOST_LIB_THREAD_OPT + BOOST_LIB_RT_OPT "-" + BOOST_LIB_VERSION These are defined as: BOOST_LIB_PREFIX: "lib" for static libraries otherwise "". BOOST_LIB_NAME: The base name of the lib ( for example boost_regex). BOOST_LIB_TOOLSET: The compiler toolset name (vc6, vc7, bcb5 etc). BOOST_LIB_THREAD_OPT: "-mt" for multithread builds, otherwise nothing. BOOST_LIB_RT_OPT: A suffix that indicates the runtime library used, contains one or more of the following letters after a hiphen: s static runtime (dynamic if not present). d debug build (release if not present). g debug/diagnostic runtime (release if not present). p STLPort Build. BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. ***************************************************************************/ #ifdef __cplusplus # ifndef BOOST_CONFIG_HPP # include # endif #elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__) // // C language compatability (no, honestly) // # define BOOST_MSVC _MSC_VER # define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) # define BOOST_DO_STRINGIZE(X) #X #endif // // Only include what follows for known and supported compilers: // #if defined(BOOST_MSVC) \ || defined(__BORLANDC__) \ || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \ || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) #ifndef BOOST_VERSION_HPP # include #endif #ifndef BOOST_LIB_NAME # error "Macro BOOST_LIB_NAME not set (internal error)" #endif // // error check: // #if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG) # pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors") # pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes") # error "Incompatible build options" #endif // // select toolset if not defined already: // #ifndef BOOST_LIB_TOOLSET // Note: no compilers before 1200 are supported #if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) # ifdef UNDER_CE // vc6: # define BOOST_LIB_TOOLSET "evc4" # else // vc6: # define BOOST_LIB_TOOLSET "vc6" # endif #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1300) // vc7: # define BOOST_LIB_TOOLSET "vc7" #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1310) // vc71: # define BOOST_LIB_TOOLSET "vc71" #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1400) // vc80: # define BOOST_LIB_TOOLSET "vc80" #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1500) // vc90: # define BOOST_LIB_TOOLSET "vc90" #elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1600) // vc10: # define BOOST_LIB_TOOLSET "vc100" #elif defined(__BORLANDC__) // CBuilder 6: # define BOOST_LIB_TOOLSET "bcb" #elif defined(__ICL) // Intel C++, no version number: # define BOOST_LIB_TOOLSET "iw" #elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF ) // Metrowerks CodeWarrior 8.x # define BOOST_LIB_TOOLSET "cw8" #elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF ) // Metrowerks CodeWarrior 9.x # define BOOST_LIB_TOOLSET "cw9" #endif #endif // BOOST_LIB_TOOLSET // // select thread opt: // #if defined(_MT) || defined(__MT__) # define BOOST_LIB_THREAD_OPT "-mt" #else # define BOOST_LIB_THREAD_OPT #endif #if defined(_MSC_VER) || defined(__MWERKS__) # ifdef _DLL # if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS)) # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) # define BOOST_LIB_RT_OPT "-gdp" # elif defined(_DEBUG) # define BOOST_LIB_RT_OPT "-gdp" # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") # error "Build options aren't compatible with pre-built libraries" # else # define BOOST_LIB_RT_OPT "-p" # endif # elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) # define BOOST_LIB_RT_OPT "-gdpn" # elif defined(_DEBUG) # define BOOST_LIB_RT_OPT "-gdpn" # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") # error "Build options aren't compatible with pre-built libraries" # else # define BOOST_LIB_RT_OPT "-pn" # endif # else # if defined(_DEBUG) # define BOOST_LIB_RT_OPT "-gd" # else # define BOOST_LIB_RT_OPT # endif # endif # else # if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS)) # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) # define BOOST_LIB_RT_OPT "-sgdp" # elif defined(_DEBUG) # define BOOST_LIB_RT_OPT "-sgdp" # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") # error "Build options aren't compatible with pre-built libraries" # else # define BOOST_LIB_RT_OPT "-sp" # endif # elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) # if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG)) # define BOOST_LIB_RT_OPT "-sgdpn" # elif defined(_DEBUG) # define BOOST_LIB_RT_OPT "-sgdpn" # pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1") # error "Build options aren't compatible with pre-built libraries" # else # define BOOST_LIB_RT_OPT "-spn" # endif # else # if defined(_DEBUG) # define BOOST_LIB_RT_OPT "-sgd" # else # define BOOST_LIB_RT_OPT "-s" # endif # endif # endif #elif defined(__BORLANDC__) // // figure out whether we want the debug builds or not: // #if __BORLANDC__ > 0x561 #pragma defineonoption BOOST_BORLAND_DEBUG -v #endif // // sanity check: // #if defined(__STL_DEBUG) || defined(_STLP_DEBUG) #error "Pre-built versions of the Boost libraries are not provided in STLPort-debug form" #endif # ifdef _RTLDLL # ifdef BOOST_BORLAND_DEBUG # define BOOST_LIB_RT_OPT "-d" # else # define BOOST_LIB_RT_OPT # endif # else # ifdef BOOST_BORLAND_DEBUG # define BOOST_LIB_RT_OPT "-sd" # else # define BOOST_LIB_RT_OPT "-s" # endif # endif #endif // // select linkage opt: // #if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK) # define BOOST_LIB_PREFIX #elif defined(BOOST_DYN_LINK) # error "Mixing a dll boost library with a static runtime is a really bad idea..." #else # define BOOST_LIB_PREFIX "lib" #endif // // now include the lib: // #if defined(BOOST_LIB_NAME) \ && defined(BOOST_LIB_PREFIX) \ && defined(BOOST_LIB_TOOLSET) \ && defined(BOOST_LIB_THREAD_OPT) \ && defined(BOOST_LIB_RT_OPT) \ && defined(BOOST_LIB_VERSION) #ifndef BOOST_AUTO_LINK_NOMANGLE # pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") # ifdef BOOST_LIB_DIAGNOSTIC # pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") # endif #else # pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") # ifdef BOOST_LIB_DIAGNOSTIC # pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") # endif #endif #else # error "some required macros where not defined (internal logic error)." #endif #endif // _MSC_VER || __BORLANDC__ // // finally undef any macros we may have set: // #ifdef BOOST_LIB_PREFIX # undef BOOST_LIB_PREFIX #endif #if defined(BOOST_LIB_NAME) # undef BOOST_LIB_NAME #endif // Don't undef this one: it can be set by the user and should be the // same for all libraries: //#if defined(BOOST_LIB_TOOLSET) //# undef BOOST_LIB_TOOLSET //#endif #if defined(BOOST_LIB_THREAD_OPT) # undef BOOST_LIB_THREAD_OPT #endif #if defined(BOOST_LIB_RT_OPT) # undef BOOST_LIB_RT_OPT #endif #if defined(BOOST_LIB_LINK_OPT) # undef BOOST_LIB_LINK_OPT #endif #if defined(BOOST_LIB_DEBUG_OPT) # undef BOOST_LIB_DEBUG_OPT #endif #if defined(BOOST_DYN_LINK) # undef BOOST_DYN_LINK #endif #if defined(BOOST_AUTO_LINK_NOMANGLE) # undef BOOST_AUTO_LINK_NOMANGLE #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/000077500000000000000000000000001154025176300220255ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/config/compiler/borland.hpp000066400000000000000000000166521154025176300241710ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright David Abrahams 2002 - 2003. // (C) Copyright Aleksey Gurtovoy 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Borland C++ compiler setup: // // versions check: // we don't support Borland prior to version 5.4: #if __BORLANDC__ < 0x540 # error "Compiler not supported or configured - please reconfigure" #endif // last known compiler version: #if (__BORLANDC__ > 0x613) //# if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" //# else //# pragma message( "Unknown compiler version - please run the configure tests and report the results") //# endif #elif (__BORLANDC__ == 0x600) # error "CBuilderX preview compiler is no longer supported" #endif // // Support macros to help with standard library detection #if (__BORLANDC__ < 0x560) || defined(_USE_OLD_RW_STL) # define BOOST_BCB_WITH_ROGUE_WAVE #elif __BORLANDC__ < 0x570 # define BOOST_BCB_WITH_STLPORT #else # define BOOST_BCB_WITH_DINKUMWARE #endif // // Version 5.0 and below: # if __BORLANDC__ <= 0x0550 // Borland C++Builder 4 and 5: # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # if __BORLANDC__ == 0x0550 // Borland C++Builder 5, command-line compiler 5.5: # define BOOST_NO_OPERATORS_IN_NAMESPACE # endif # endif // Version 5.51 and below: #if (__BORLANDC__ <= 0x551) # define BOOST_NO_CV_SPECIALIZATIONS # define BOOST_NO_CV_VOID_SPECIALIZATIONS # define BOOST_NO_DEDUCED_TYPENAME // workaround for missing WCHAR_MAX/WCHAR_MIN: #include #include #ifndef WCHAR_MAX # define WCHAR_MAX 0xffff #endif #ifndef WCHAR_MIN # define WCHAR_MIN 0 #endif #endif // Borland C++ Builder 6 and below: #if (__BORLANDC__ <= 0x564) # ifdef NDEBUG // fix broken so that Boost.test works: # include # undef strcmp # endif // fix broken errno declaration: # include # ifndef errno # define errno errno # endif #endif // // new bug in 5.61: #if (__BORLANDC__ >= 0x561) && (__BORLANDC__ <= 0x580) // this seems to be needed by the command line compiler, but not the IDE: # define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS #endif // Borland C++ Builder 2006 Update 2 and below: #if (__BORLANDC__ <= 0x582) # define BOOST_NO_SFINAE # define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG # define BOOST_NO_TEMPLATE_TEMPLATES # define BOOST_NO_PRIVATE_IN_AGGREGATE # ifdef _WIN32 # define BOOST_NO_SWPRINTF # elif defined(linux) || defined(__linux__) || defined(__linux) // we should really be able to do without this // but the wcs* functions aren't imported into std:: # define BOOST_NO_STDC_NAMESPACE // _CPPUNWIND doesn't get automatically set for some reason: # pragma defineonoption BOOST_CPPUNWIND -x # endif #endif #if (__BORLANDC__ <= 0x613) // Beman has asked Alisdair for more info // we shouldn't really need this - but too many things choke // without it, this needs more investigation: # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS # define BOOST_NO_IS_ABSTRACT # define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS # define BOOST_NO_USING_TEMPLATE # define BOOST_SP_NO_SP_CONVERTIBLE // Temporary workaround #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS #endif // Borland C++ Builder 2008 and below: # define BOOST_NO_INTEGRAL_INT64_T # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL # define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # define BOOST_NO_TWO_PHASE_NAME_LOOKUP # define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE # define BOOST_NO_NESTED_FRIENDSHIP # define BOOST_NO_TYPENAME_WITH_CTOR #if (__BORLANDC__ < 0x600) # define BOOST_ILLEGAL_CV_REFERENCES #endif // // Positive Feature detection // // Borland C++ Builder 2008 and below: #if (__BORLANDC__ >= 0x599) # pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax #endif // // C++0x Macros: // #if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610) # define BOOST_NO_CHAR16_T # define BOOST_NO_CHAR32_T # define BOOST_NO_DECLTYPE # define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS # define BOOST_NO_EXTERN_TEMPLATE # define BOOST_NO_RVALUE_REFERENCES # define BOOST_NO_SCOPED_ENUMS # define BOOST_NO_STATIC_ASSERT #else # define BOOST_HAS_ALIGNOF # define BOOST_HAS_CHAR16_T # define BOOST_HAS_CHAR32_T # define BOOST_HAS_DECLTYPE # define BOOST_HAS_EXPLICIT_CONVERSION_OPS # define BOOST_HAS_REF_QUALIFIER # define BOOST_HAS_RVALUE_REFS # define BOOST_HAS_STATIC_ASSERT #endif #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS // UTF-8 still not supported #define BOOST_NO_VARIADIC_TEMPLATES #if __BORLANDC__ >= 0x590 # define BOOST_HAS_TR1_HASH # define BOOST_HAS_MACRO_USE_FACET #endif // // Post 0x561 we have long long and stdint.h: #if __BORLANDC__ >= 0x561 # ifndef __NO_LONG_LONG # define BOOST_HAS_LONG_LONG # else # define BOOST_NO_LONG_LONG # endif // On non-Win32 platforms let the platform config figure this out: # ifdef _WIN32 # define BOOST_HAS_STDINT_H # endif #endif // Borland C++Builder 6 defaults to using STLPort. If _USE_OLD_RW_STL is // defined, then we have 0x560 or greater with the Rogue Wave implementation // which presumably has the std::DBL_MAX bug. #if defined( BOOST_BCB_WITH_ROGUE_WAVE ) // is partly broken, some macros define symbols that are really in // namespace std, so you end up having to use illegal constructs like // std::DBL_MAX, as a fix we'll just include float.h and have done with: #include #endif // // __int64: // #if (__BORLANDC__ >= 0x530) && !defined(__STRICT_ANSI__) # define BOOST_HAS_MS_INT64 #endif // // check for exception handling support: // #if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) # define BOOST_NO_EXCEPTIONS #endif // // all versions have a : // #ifndef __STRICT_ANSI__ # define BOOST_HAS_DIRENT_H #endif // // all versions support __declspec: // #ifndef __STRICT_ANSI__ # define BOOST_HAS_DECLSPEC #endif // // ABI fixing headers: // #if __BORLANDC__ != 0x600 // not implemented for version 6 compiler yet #ifndef BOOST_ABI_PREFIX # define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp" #endif #ifndef BOOST_ABI_SUFFIX # define BOOST_ABI_SUFFIX "boost/config/abi/borland_suffix.hpp" #endif #endif // // Disable Win32 support in ANSI mode: // #if __BORLANDC__ < 0x600 # pragma defineonoption BOOST_DISABLE_WIN32 -A #elif defined(__STRICT_ANSI__) # define BOOST_DISABLE_WIN32 #endif // // MSVC compatibility mode does some nasty things: // TODO: look up if this doesn't apply to the whole 12xx range // #if defined(_MSC_VER) && (_MSC_VER <= 1200) # define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP # define BOOST_NO_VOID_RETURNS #endif #define BOOST_COMPILER "Borland C++ version " BOOST_STRINGIZE(__BORLANDC__) clucene-core-2.3.3.4/src/ext/boost/config/compiler/codegear.hpp000066400000000000000000000113251154025176300243110ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright David Abrahams 2002 - 2003. // (C) Copyright Aleksey Gurtovoy 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // CodeGear C++ compiler setup: #if !defined( BOOST_WITH_CODEGEAR_WARNINGS ) // these warnings occur frequently in optimized template code # pragma warn -8004 // var assigned value, but never used # pragma warn -8008 // condition always true/false # pragma warn -8066 // dead code can never execute # pragma warn -8104 // static members with ctors not threadsafe # pragma warn -8105 // reference member in class without ctors #endif // // versions check: // last known and checked version is 0x620 #if (__CODEGEARC__ > 0x620) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # else # pragma message( "Unknown compiler version - please run the configure tests and report the results") # endif #endif // CodeGear C++ Builder 2009 #if (__CODEGEARC__ <= 0x613) # define BOOST_NO_INTEGRAL_INT64_T # define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS # define BOOST_NO_PRIVATE_IN_AGGREGATE # define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE // we shouldn't really need this - but too many things choke // without it, this needs more investigation: # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS # define BOOST_SP_NO_SP_CONVERTIBLE #endif // CodeGear C++ Builder 2010 #if (__CODEGEARC__ <= 0x620) # define BOOST_NO_TYPENAME_WITH_CTOR // Cannot use typename keyword when making temporaries of a dependant type # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # define BOOST_NO_NESTED_FRIENDSHIP // TC1 gives nested classes access rights as any other member # define BOOST_NO_USING_TEMPLATE # define BOOST_NO_TWO_PHASE_NAME_LOOKUP // Temporary hack, until specific MPL preprocessed headers are generated # define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS # ifdef NDEBUG // fix broken so that Boost.test works: # include # undef strcmp # endif // fix broken errno declaration: # include # ifndef errno # define errno errno # endif #endif // // C++0x macros: // #define BOOST_HAS_CHAR16_T #define BOOST_HAS_CHAR32_T #define BOOST_HAS_LONG_LONG // #define BOOST_HAS_ALIGNOF #define BOOST_HAS_DECLTYPE #define BOOST_HAS_EXPLICIT_CONVERSION_OPS // #define BOOST_HAS_RVALUE_REFS #define BOOST_HAS_SCOPED_ENUM // #define BOOST_HAS_STATIC_ASSERT #define BOOST_HAS_STD_TYPE_TRAITS #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES // // TR1 macros: // #define BOOST_HAS_TR1_HASH #define BOOST_HAS_TR1_TYPE_TRAITS #define BOOST_HAS_TR1_UNORDERED_MAP #define BOOST_HAS_TR1_UNORDERED_SET #define BOOST_HAS_MACRO_USE_FACET #define BOOST_NO_INITIALIZER_LISTS // On non-Win32 platforms let the platform config figure this out: #ifdef _WIN32 # define BOOST_HAS_STDINT_H #endif // // __int64: // #if !defined(__STRICT_ANSI__) # define BOOST_HAS_MS_INT64 #endif // // check for exception handling support: // #if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) # define BOOST_NO_EXCEPTIONS #endif // // all versions have a : // #if !defined(__STRICT_ANSI__) # define BOOST_HAS_DIRENT_H #endif // // all versions support __declspec: // #if !defined(__STRICT_ANSI__) # define BOOST_HAS_DECLSPEC #endif // // ABI fixing headers: // #ifndef BOOST_ABI_PREFIX # define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp" #endif #ifndef BOOST_ABI_SUFFIX # define BOOST_ABI_SUFFIX "boost/config/abi/borland_suffix.hpp" #endif // // Disable Win32 support in ANSI mode: // # pragma defineonoption BOOST_DISABLE_WIN32 -A // // MSVC compatibility mode does some nasty things: // TODO: look up if this doesn't apply to the whole 12xx range // #if defined(_MSC_VER) && (_MSC_VER <= 1200) # define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP # define BOOST_NO_VOID_RETURNS #endif #define BOOST_COMPILER "CodeGear C++ version " BOOST_STRINGIZE(__CODEGEARC__) clucene-core-2.3.3.4/src/ext/boost/config/compiler/comeau.hpp000066400000000000000000000031371154025176300240130ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // (C) Copyright Douglas Gregor 2001. // (C) Copyright Peter Dimov 2001. // (C) Copyright Aleksey Gurtovoy 2003. // (C) Copyright Beman Dawes 2003. // (C) Copyright Jens Maurer 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Comeau C++ compiler setup: #include "boost/config/compiler/common_edg.hpp" #if (__COMO_VERSION__ <= 4245) # if defined(_MSC_VER) && _MSC_VER <= 1300 # if _MSC_VER > 100 // only set this in non-strict mode: # define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP # endif # endif // Void returns don't work when emulating VC 6 (Peter Dimov) // TODO: look up if this doesn't apply to the whole 12xx range # if defined(_MSC_VER) && (_MSC_VER < 1300) # define BOOST_NO_VOID_RETURNS # endif #endif // version 4245 // // enable __int64 support in VC emulation mode // # if defined(_MSC_VER) && (_MSC_VER >= 1200) # define BOOST_HAS_MS_INT64 # endif #define BOOST_COMPILER "Comeau compiler version " BOOST_STRINGIZE(__COMO_VERSION__) // // versions check: // we don't know Comeau prior to version 4245: #if __COMO_VERSION__ < 4245 # error "Compiler not configured - please reconfigure" #endif // // last known and checked version is 4245: #if (__COMO_VERSION__ > 4245) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/common_edg.hpp000066400000000000000000000052251154025176300246510ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2002. // (C) Copyright Jens Maurer 2001. // (C) Copyright David Abrahams 2002. // (C) Copyright Aleksey Gurtovoy 2002. // (C) Copyright Markus Schoepflin 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // // Options common to all edg based compilers. // // This is included from within the individual compiler mini-configs. #ifndef __EDG_VERSION__ # error This file requires that __EDG_VERSION__ be defined. #endif #if (__EDG_VERSION__ <= 238) # define BOOST_NO_INTEGRAL_INT64_T # define BOOST_NO_SFINAE #endif #if (__EDG_VERSION__ <= 240) # define BOOST_NO_VOID_RETURNS #endif #if (__EDG_VERSION__ <= 241) && !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) # define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP #endif #if (__EDG_VERSION__ <= 244) && !defined(BOOST_NO_TEMPLATE_TEMPLATES) # define BOOST_NO_TEMPLATE_TEMPLATES #endif #if (__EDG_VERSION__ < 300) && !defined(BOOST_NO_IS_ABSTRACT) # define BOOST_NO_IS_ABSTRACT #endif #if (__EDG_VERSION__ <= 303) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL #endif // See also kai.hpp which checks a Kai-specific symbol for EH # if !defined(__KCC) && !defined(__EXCEPTIONS) # define BOOST_NO_EXCEPTIONS # endif # if !defined(__NO_LONG_LONG) # define BOOST_HAS_LONG_LONG # else # define BOOST_NO_LONG_LONG # endif // // C++0x features // // See above for BOOST_NO_LONG_LONG // #if (__EDG_VERSION__ <= 310) || !defined(BOOST_STRICT_CONFIG) // No support for initializer lists # define BOOST_NO_INITIALIZER_LISTS #endif #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES #ifdef c_plusplus // EDG has "long long" in non-strict mode // However, some libraries have insufficient "long long" support // #define BOOST_HAS_LONG_LONG #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/compaq_cxx.hpp000066400000000000000000000007651154025176300247100ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Tru64 C++ compiler setup (now HP): #define BOOST_COMPILER "HP Tru64 C++ " BOOST_STRINGIZE(__DECCXX_VER) #include "boost/config/compiler/common_edg.hpp" // // versions check: // Nothing to do here? clucene-core-2.3.3.4/src/ext/boost/config/compiler/digitalmars.hpp000066400000000000000000000051031154025176300250350ustar00rootroot00000000000000// Copyright (C) Christof Meerwald 2003 // Copyright (C) Dan Watkins 2003 // // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // Digital Mars C++ compiler setup: #define BOOST_COMPILER __DMC_VERSION_STRING__ #define BOOST_HAS_LONG_LONG #define BOOST_HAS_PRAGMA_ONCE #if (__DMC__ <= 0x833) #define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL #define BOOST_NO_TEMPLATE_TEMPLATES #define BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING #define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS #define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS #endif #if (__DMC__ <= 0x840) || !defined(BOOST_STRICT_CONFIG) #define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS #define BOOST_NO_MEMBER_TEMPLATE_FRIENDS #define BOOST_NO_OPERATORS_IN_NAMESPACE #define BOOST_NO_UNREACHABLE_RETURN_DETECTION #define BOOST_NO_SFINAE #define BOOST_NO_USING_TEMPLATE #define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL #endif // // has macros: #if (__DMC__ >= 0x840) #define BOOST_HAS_DIRENT_H #define BOOST_HAS_STDINT_H #define BOOST_HAS_WINTHREADS #endif #if (__DMC__ >= 0x847) #define BOOST_HAS_EXPM1 #define BOOST_HAS_LOG1P #endif // // Is this really the best way to detect whether the std lib is in namespace std? // #include #if !defined(__STL_IMPORT_VENDOR_CSTD) && !defined(_STLP_IMPORT_VENDOR_CSTD) # define BOOST_NO_STDC_NAMESPACE #endif // check for exception handling support: #ifndef _CPPUNWIND # define BOOST_NO_EXCEPTIONS #endif // // C++0x features // #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES #if __DMC__ < 0x800 #error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version is ...: #if (__DMC__ > 0x848) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/gcc.hpp000066400000000000000000000135451154025176300233020ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Darin Adler 2001 - 2002. // (C) Copyright Jens Maurer 2001 - 2002. // (C) Copyright Beman Dawes 2001 - 2003. // (C) Copyright Douglas Gregor 2002. // (C) Copyright David Abrahams 2002 - 2003. // (C) Copyright Synge Todo 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // GNU C++ compiler setup: #if __GNUC__ < 3 # if __GNUC_MINOR__ == 91 // egcs 1.1 won't parse shared_ptr.hpp without this: # define BOOST_NO_AUTO_PTR # endif # if __GNUC_MINOR__ < 95 // // Prior to gcc 2.95 member templates only partly // work - define BOOST_MSVC6_MEMBER_TEMPLATES // instead since inline member templates mostly work. // # define BOOST_NO_MEMBER_TEMPLATES # if __GNUC_MINOR__ >= 9 # define BOOST_MSVC6_MEMBER_TEMPLATES # endif # endif # if __GNUC_MINOR__ < 96 # define BOOST_NO_SFINAE # endif # if __GNUC_MINOR__ <= 97 # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # define BOOST_NO_OPERATORS_IN_NAMESPACE # endif # define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL # define BOOST_NO_IS_ABSTRACT #elif __GNUC__ == 3 # if defined (__PATHSCALE__) # define BOOST_NO_TWO_PHASE_NAME_LOOKUP # define BOOST_NO_IS_ABSTRACT # endif // // gcc-3.x problems: // // Bug specific to gcc 3.1 and 3.2: // # if ((__GNUC_MINOR__ == 1) || (__GNUC_MINOR__ == 2)) # define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS # endif # if __GNUC_MINOR__ < 4 # define BOOST_NO_IS_ABSTRACT # endif #endif #if __GNUC__ < 4 // // All problems to gcc-3.x and earlier here: // #define BOOST_NO_TWO_PHASE_NAME_LOOKUP # ifdef __OPEN64__ # define BOOST_NO_IS_ABSTRACT # endif #endif #ifndef __EXCEPTIONS # define BOOST_NO_EXCEPTIONS #endif // // Threading support: Turn this on unconditionally here (except for // those platforms where we can know for sure). It will get turned off again // later if no threading API is detected. // #if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__) # define BOOST_HAS_THREADS #endif // // gcc has "long long" // #define BOOST_HAS_LONG_LONG // // gcc implements the named return value optimization since version 3.1 // #if __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) #define BOOST_HAS_NRVO #endif // // RTTI and typeinfo detection is possible post gcc-4.3: // #if __GNUC__ * 100 + __GNUC_MINOR__ >= 403 # ifndef __GXX_RTTI # define BOOST_NO_TYPEID # define BOOST_NO_RTTI # endif #endif // C++0x features not implemented in any GCC version // #define BOOST_NO_CONSTEXPR #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS // C++0x features in 4.3.n and later // #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__) // C++0x features are only enabled when -std=c++0x or -std=gnu++0x are // passed on the command line, which in turn defines // __GXX_EXPERIMENTAL_CXX0X__. # define BOOST_HAS_DECLTYPE # define BOOST_HAS_RVALUE_REFS # define BOOST_HAS_STATIC_ASSERT # define BOOST_HAS_VARIADIC_TMPL #else # define BOOST_NO_DECLTYPE # define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS # define BOOST_NO_RVALUE_REFERENCES # define BOOST_NO_STATIC_ASSERT // Variadic templates compiler: // http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html # ifdef __VARIADIC_TEMPLATES # define BOOST_HAS_VARIADIC_TMPL # else # define BOOST_NO_VARIADIC_TEMPLATES # endif #endif // C++0x features in 4.4.n and later // #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) || !defined(__GXX_EXPERIMENTAL_CXX0X__) # define BOOST_NO_AUTO_DECLARATIONS # define BOOST_NO_AUTO_MULTIDECLARATIONS # define BOOST_NO_CHAR16_T # define BOOST_NO_CHAR32_T # define BOOST_NO_DEFAULTED_FUNCTIONS # define BOOST_NO_DELETED_FUNCTIONS # define BOOST_NO_INITIALIZER_LISTS # define BOOST_NO_SCOPED_ENUMS #endif #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) # define BOOST_NO_SFINAE_EXPR #endif // C++0x features in 4.4.1 and later // #if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ < 40401) || !defined(__GXX_EXPERIMENTAL_CXX0X__) // scoped enums have a serious bug in 4.4.0, so define BOOST_NO_SCOPED_ENUMS before 4.4.1 // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064 # define BOOST_NO_SCOPED_ENUMS #endif // C++0x features in 4.5.n and later // #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__) # define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #endif // ConceptGCC compiler: // http://www.generic-programming.org/software/ConceptGCC/ #ifdef __GXX_CONCEPTS__ # define BOOST_HAS_CONCEPTS # define BOOST_COMPILER "ConceptGCC version " __VERSION__ #else # define BOOST_NO_CONCEPTS #endif #ifndef BOOST_COMPILER # define BOOST_COMPILER "GNU C++ version " __VERSION__ #endif // // versions check: // we don't know gcc prior to version 2.90: #if (__GNUC__ == 2) && (__GNUC_MINOR__ < 90) # error "Compiler not configured - please reconfigure" #endif // // last known and checked version is 4.4 (Pre-release): #if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 4)) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # else // we don't emit warnings here anymore since there are no defect macros defined for // gcc post 3.4, so any failures are gcc regressions... //# warning "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/gcc_xml.hpp000066400000000000000000000016211154025176300241520ustar00rootroot00000000000000// (C) Copyright John Maddock 2006. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // GCC-XML C++ compiler setup: # if !defined(__GCCXML_GNUC__) || ((__GCCXML_GNUC__ <= 3) && (__GCCXML_GNUC_MINOR__ <= 3)) # define BOOST_NO_IS_ABSTRACT # endif // // Threading support: Turn this on unconditionally here (except for // those platforms where we can know for sure). It will get turned off again // later if no threading API is detected. // #if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(linux) && !defined(__linux) && !defined(__linux__) # define BOOST_HAS_THREADS #endif // // gcc has "long long" // #define BOOST_HAS_LONG_LONG #define BOOST_COMPILER "GCC-XML C++ version " __GCCXML__ clucene-core-2.3.3.4/src/ext/boost/config/compiler/greenhills.hpp000066400000000000000000000014571154025176300247010ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Greenhills C++ compiler setup: #define BOOST_COMPILER "Greenhills C++ version " BOOST_STRINGIZE(__ghs) #include "boost/config/compiler/common_edg.hpp" // // versions check: // we don't support Greenhills prior to version 0: #if __ghs < 0 # error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version is 0: #if (__ghs > 0) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/hp_acc.hpp000066400000000000000000000100131154025176300237460ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2001 - 2003. // (C) Copyright Aleksey Gurtovoy 2002. // (C) Copyright David Abrahams 2002 - 2003. // (C) Copyright Toon Knapen 2003. // (C) Copyright Boris Gubenko 2006 - 2007. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // HP aCC C++ compiler setup: #if defined(__EDG__) #include "boost/config/compiler/common_edg.hpp" #endif #if (__HP_aCC <= 33100) # define BOOST_NO_INTEGRAL_INT64_T # define BOOST_NO_OPERATORS_IN_NAMESPACE # if !defined(_NAMESPACE_STD) # define BOOST_NO_STD_LOCALE # define BOOST_NO_STRINGSTREAM # endif #endif #if (__HP_aCC <= 33300) // member templates are sufficiently broken that we disable them for now # define BOOST_NO_MEMBER_TEMPLATES # define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS # define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE #endif #if (__HP_aCC <= 38000) # define BOOST_NO_TWO_PHASE_NAME_LOOKUP #endif #if (__HP_aCC > 50000) && (__HP_aCC < 60000) # define BOOST_NO_UNREACHABLE_RETURN_DETECTION # define BOOST_NO_TEMPLATE_TEMPLATES # define BOOST_NO_SWPRINTF # define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS # define BOOST_NO_IS_ABSTRACT # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS #endif // optional features rather than defects: #if (__HP_aCC >= 33900) # define BOOST_HAS_LONG_LONG # define BOOST_HAS_PARTIAL_STD_ALLOCATOR #endif #if (__HP_aCC >= 50000 ) && (__HP_aCC <= 53800 ) || (__HP_aCC < 31300 ) # define BOOST_NO_MEMBER_TEMPLATE_KEYWORD #endif // This macro should not be defined when compiling in strict ansi // mode, but, currently, we don't have the ability to determine // what standard mode we are compiling with. Some future version // of aCC6 compiler will provide predefined macros reflecting the // compilation options, including the standard mode. #if (__HP_aCC >= 60000) || ((__HP_aCC > 38000) && defined(__hpxstd98)) # define BOOST_NO_TWO_PHASE_NAME_LOOKUP #endif #define BOOST_COMPILER "HP aCC version " BOOST_STRINGIZE(__HP_aCC) // // versions check: // we don't support HP aCC prior to version 33000: #if __HP_aCC < 33000 # error "Compiler not supported or configured - please reconfigure" #endif // // Extended checks for supporting aCC on PA-RISC #if __HP_aCC > 30000 && __HP_aCC < 50000 # if __HP_aCC < 38000 // versions prior to version A.03.80 not supported # error "Compiler version not supported - version A.03.80 or higher is required" # elif !defined(__hpxstd98) // must compile using the option +hpxstd98 with version A.03.80 and above # error "Compiler option '+hpxstd98' is required for proper support" # endif //PA-RISC #endif // // C++0x features // // See boost\config\suffix.hpp for BOOST_NO_LONG_LONG // #if !defined(__EDG__) #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES #endif // // last known and checked version for HP-UX/ia64 is 61300 // last known and checked version for PA-RISC is 38000 #if ((__HP_aCC > 61300) || ((__HP_aCC > 38000) && defined(__hpxstd98))) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/intel.hpp000066400000000000000000000141331154025176300236530ustar00rootroot00000000000000// (C) Copyright John Maddock 2001-8. // (C) Copyright Peter Dimov 2001. // (C) Copyright Jens Maurer 2001. // (C) Copyright David Abrahams 2002 - 2003. // (C) Copyright Aleksey Gurtovoy 2002 - 2003. // (C) Copyright Guillaume Melquiond 2002 - 2003. // (C) Copyright Beman Dawes 2003. // (C) Copyright Martin Wille 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Intel compiler setup: #include "boost/config/compiler/common_edg.hpp" #if defined(__INTEL_COMPILER) # define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER #elif defined(__ICL) # define BOOST_INTEL_CXX_VERSION __ICL #elif defined(__ICC) # define BOOST_INTEL_CXX_VERSION __ICC #elif defined(__ECC) # define BOOST_INTEL_CXX_VERSION __ECC #endif #define BOOST_COMPILER "Intel C++ version " BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION) #define BOOST_INTEL BOOST_INTEL_CXX_VERSION #if defined(_WIN32) || defined(_WIN64) # define BOOST_INTEL_WIN BOOST_INTEL #else # define BOOST_INTEL_LINUX BOOST_INTEL #endif #if (BOOST_INTEL_CXX_VERSION <= 500) && defined(_MSC_VER) # define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS # define BOOST_NO_TEMPLATE_TEMPLATES #endif #if (BOOST_INTEL_CXX_VERSION <= 600) # if defined(_MSC_VER) && (_MSC_VER <= 1300) // added check for <= VC 7 (Peter Dimov) // Boost libraries assume strong standard conformance unless otherwise // indicated by a config macro. As configured by Intel, the EDG front-end // requires certain compiler options be set to achieve that strong conformance. // Particularly /Qoption,c,--arg_dep_lookup (reported by Kirk Klobe & Thomas Witt) // and /Zc:wchar_t,forScope. See boost-root/tools/build/intel-win32-tools.jam for // details as they apply to particular versions of the compiler. When the // compiler does not predefine a macro indicating if an option has been set, // this config file simply assumes the option has been set. // Thus BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP will not be defined, even if // the compiler option is not enabled. # define BOOST_NO_SWPRINTF # endif // Void returns, 64 bit integrals don't work when emulating VC 6 (Peter Dimov) # if defined(_MSC_VER) && (_MSC_VER <= 1200) # define BOOST_NO_VOID_RETURNS # define BOOST_NO_INTEGRAL_INT64_T # endif #endif #if (BOOST_INTEL_CXX_VERSION <= 710) && defined(_WIN32) # define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS #endif // See http://aspn.activestate.com/ASPN/Mail/Message/boost/1614864 #if BOOST_INTEL_CXX_VERSION < 600 # define BOOST_NO_INTRINSIC_WCHAR_T #else // We should test the macro _WCHAR_T_DEFINED to check if the compiler // supports wchar_t natively. *BUT* there is a problem here: the standard // headers define this macro if they typedef wchar_t. Anyway, we're lucky // because they define it without a value, while Intel C++ defines it // to 1. So we can check its value to see if the macro was defined natively // or not. // Under UNIX, the situation is exactly the same, but the macro _WCHAR_T // is used instead. # if ((_WCHAR_T_DEFINED + 0) == 0) && ((_WCHAR_T + 0) == 0) # define BOOST_NO_INTRINSIC_WCHAR_T # endif #endif #if defined(__GNUC__) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) // // Figure out when Intel is emulating this gcc bug // (All Intel versions prior to 9.0.26, and versions // later than that if they are set up to emulate gcc 3.2 // or earlier): // # if ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 2)) || (BOOST_INTEL < 900) || (__INTEL_COMPILER_BUILD_DATE < 20050912) # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL # endif #endif #if (defined(__GNUC__) && (__GNUC__ < 4)) || defined(_WIN32) || (BOOST_INTEL_CXX_VERSION <= 1110) // GCC or VC emulation: #define BOOST_NO_TWO_PHASE_NAME_LOOKUP #endif // // Verify that we have actually got BOOST_NO_INTRINSIC_WCHAR_T // set correctly, if we don't do this now, we will get errors later // in type_traits code among other things, getting this correct // for the Intel compiler is actually remarkably fragile and tricky: // #if defined(BOOST_NO_INTRINSIC_WCHAR_T) #include template< typename T > struct assert_no_intrinsic_wchar_t; template<> struct assert_no_intrinsic_wchar_t { typedef void type; }; // if you see an error here then you need to unset BOOST_NO_INTRINSIC_WCHAR_T // where it is defined above: typedef assert_no_intrinsic_wchar_t::type assert_no_intrinsic_wchar_t_; #else template< typename T > struct assert_intrinsic_wchar_t; template<> struct assert_intrinsic_wchar_t {}; // if you see an error here then define BOOST_NO_INTRINSIC_WCHAR_T on the command line: template<> struct assert_intrinsic_wchar_t {}; #endif #if _MSC_VER+0 >= 1000 # if _MSC_VER >= 1200 # define BOOST_HAS_MS_INT64 # endif # define BOOST_NO_SWPRINTF # define BOOST_NO_TWO_PHASE_NAME_LOOKUP #elif defined(_WIN32) # define BOOST_DISABLE_WIN32 #endif // I checked version 6.0 build 020312Z, it implements the NRVO. // Correct this as you find out which version of the compiler // implemented the NRVO first. (Daniel Frey) #if (BOOST_INTEL_CXX_VERSION >= 600) # define BOOST_HAS_NRVO #endif // // versions check: // we don't support Intel prior to version 5.0: #if BOOST_INTEL_CXX_VERSION < 500 # error "Compiler not supported or configured - please reconfigure" #endif // Intel on MacOS requires #if defined(__APPLE__) && defined(__INTEL_COMPILER) # define BOOST_NO_TWO_PHASE_NAME_LOOKUP #endif // Intel on Altix Itanium #if defined(__itanium__) && defined(__INTEL_COMPILER) # define BOOST_NO_TWO_PHASE_NAME_LOOKUP #endif // // last known and checked version: #if (BOOST_INTEL_CXX_VERSION > 1110) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # elif defined(_MSC_VER) // // We don't emit this warning any more, since we have so few // defect macros set anyway (just the one). // //# pragma message("Unknown compiler version - please run the configure tests and report the results") # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/kai.hpp000066400000000000000000000017361154025176300233110ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // (C) Copyright David Abrahams 2002. // (C) Copyright Aleksey Gurtovoy 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Kai C++ compiler setup: #include "boost/config/compiler/common_edg.hpp" # if (__KCC_VERSION <= 4001) || !defined(BOOST_STRICT_CONFIG) // at least on Sun, the contents of is not in namespace std # define BOOST_NO_STDC_NAMESPACE # endif // see also common_edg.hpp which needs a special check for __KCC # if !defined(_EXCEPTIONS) # define BOOST_NO_EXCEPTIONS # endif // // last known and checked version is 4001: #if (__KCC_VERSION > 4001) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/metrowerks.hpp000066400000000000000000000077001154025176300247440ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // (C) Copyright Darin Adler 2001. // (C) Copyright Peter Dimov 2001. // (C) Copyright David Abrahams 2001 - 2002. // (C) Copyright Beman Dawes 2001 - 2003. // (C) Copyright Stefan Slapeta 2004. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Metrowerks C++ compiler setup: // locale support is disabled when linking with the dynamic runtime # ifdef _MSL_NO_LOCALE # define BOOST_NO_STD_LOCALE # endif # if __MWERKS__ <= 0x2301 // 5.3 # define BOOST_NO_FUNCTION_TEMPLATE_ORDERING # define BOOST_NO_POINTER_TO_MEMBER_CONST # define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS # define BOOST_NO_MEMBER_TEMPLATE_KEYWORD # endif # if __MWERKS__ <= 0x2401 // 6.2 //# define BOOST_NO_FUNCTION_TEMPLATE_ORDERING # endif # if(__MWERKS__ <= 0x2407) // 7.x # define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS # define BOOST_NO_UNREACHABLE_RETURN_DETECTION # endif # if(__MWERKS__ <= 0x3003) // 8.x # define BOOST_NO_SFINAE # endif // the "|| !defined(BOOST_STRICT_CONFIG)" part should apply to the last // tested version *only*: # if(__MWERKS__ <= 0x3207) || !defined(BOOST_STRICT_CONFIG) // 9.6 # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # define BOOST_NO_IS_ABSTRACT # endif #if !__option(wchar_type) # define BOOST_NO_INTRINSIC_WCHAR_T #endif #if !__option(exceptions) # define BOOST_NO_EXCEPTIONS #endif #if (__INTEL__ && _WIN32) || (__POWERPC__ && macintosh) # if __MWERKS__ == 0x3000 # define BOOST_COMPILER_VERSION 8.0 # elif __MWERKS__ == 0x3001 # define BOOST_COMPILER_VERSION 8.1 # elif __MWERKS__ == 0x3002 # define BOOST_COMPILER_VERSION 8.2 # elif __MWERKS__ == 0x3003 # define BOOST_COMPILER_VERSION 8.3 # elif __MWERKS__ == 0x3200 # define BOOST_COMPILER_VERSION 9.0 # elif __MWERKS__ == 0x3201 # define BOOST_COMPILER_VERSION 9.1 # elif __MWERKS__ == 0x3202 # define BOOST_COMPILER_VERSION 9.2 # elif __MWERKS__ == 0x3204 # define BOOST_COMPILER_VERSION 9.3 # elif __MWERKS__ == 0x3205 # define BOOST_COMPILER_VERSION 9.4 # elif __MWERKS__ == 0x3206 # define BOOST_COMPILER_VERSION 9.5 # elif __MWERKS__ == 0x3207 # define BOOST_COMPILER_VERSION 9.6 # else # define BOOST_COMPILER_VERSION __MWERKS__ # endif #else # define BOOST_COMPILER_VERSION __MWERKS__ #endif // // C++0x features // // See boost\config\suffix.hpp for BOOST_NO_LONG_LONG // #if __MWERKS__ > 0x3206 && __option(rvalue_refs) # define BOOST_HAS_RVALUE_REFS #else # define BOOST_NO_RVALUE_REFERENCES #endif #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES #define BOOST_COMPILER "Metrowerks CodeWarrior C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) // // versions check: // we don't support Metrowerks prior to version 5.3: #if __MWERKS__ < 0x2301 # error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version: #if (__MWERKS__ > 0x3205) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/mpw.hpp000066400000000000000000000046211154025176300233440ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2002. // (C) Copyright Aleksey Gurtovoy 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // MPW C++ compilers setup: # if defined(__SC__) # define BOOST_COMPILER "MPW SCpp version " BOOST_STRINGIZE(__SC__) # elif defined(__MRC__) # define BOOST_COMPILER "MPW MrCpp version " BOOST_STRINGIZE(__MRC__) # else # error "Using MPW compiler configuration by mistake. Please update." # endif // // MPW 8.90: // #if (MPW_CPLUS <= 0x890) || !defined(BOOST_STRICT_CONFIG) # define BOOST_NO_CV_SPECIALIZATIONS # define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS # define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_NO_INTRINSIC_WCHAR_T # define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # define BOOST_NO_USING_TEMPLATE # define BOOST_NO_CWCHAR # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS # define BOOST_NO_STD_ALLOCATOR /* actually a bug with const reference overloading */ #endif // // C++0x features // // See boost\config\suffix.hpp for BOOST_NO_LONG_LONG // #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES // // versions check: // we don't support MPW prior to version 8.9: #if MPW_CPLUS < 0x890 # error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version is 0x890: #if (MPW_CPLUS > 0x890) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/pgi.hpp000066400000000000000000000032461154025176300233220ustar00rootroot00000000000000// (C) Copyright Noel Belcourt 2007. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // PGI C++ compiler setup: #define BOOST_COMPILER_VERSION __PGIC__##__PGIC_MINOR__ #define BOOST_COMPILER "PGI compiler version " BOOST_STRINGIZE(_COMPILER_VERSION) // // Threading support: // Turn this on unconditionally here, it will get turned off again later // if no threading API is detected. // #if (__PGIC__ >= 7) #define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL #define BOOST_NO_TWO_PHASE_NAME_LOOKUP #define BOOST_NO_SWPRINTF #else # error "Pgi compiler not configured - please reconfigure" #endif // // C++0x features // // See boost\config\suffix.hpp for BOOST_NO_LONG_LONG // #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES // // version check: // probably nothing to do here? clucene-core-2.3.3.4/src/ext/boost/config/compiler/sgi_mipspro.hpp000066400000000000000000000014061154025176300250720ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // SGI C++ compiler setup: #define BOOST_COMPILER "SGI Irix compiler version " BOOST_STRINGIZE(_COMPILER_VERSION) #include "boost/config/compiler/common_edg.hpp" // // Threading support: // Turn this on unconditionally here, it will get turned off again later // if no threading API is detected. // #define BOOST_HAS_THREADS #define BOOST_NO_TWO_PHASE_NAME_LOOKUP #undef BOOST_NO_SWPRINTF #undef BOOST_DEDUCED_TYPENAME // // version check: // probably nothing to do here? clucene-core-2.3.3.4/src/ext/boost/config/compiler/sunpro_cc.hpp000066400000000000000000000100471154025176300245330ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // (C) Copyright Jens Maurer 2001 - 2003. // (C) Copyright Peter Dimov 2002. // (C) Copyright Aleksey Gurtovoy 2002 - 2003. // (C) Copyright David Abrahams 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Sun C++ compiler setup: # if __SUNPRO_CC <= 0x500 # define BOOST_NO_MEMBER_TEMPLATES # define BOOST_NO_FUNCTION_TEMPLATE_ORDERING # endif # if (__SUNPRO_CC <= 0x520) // // Sunpro 5.2 and earler: // // although sunpro 5.2 supports the syntax for // inline initialization it often gets the value // wrong, especially where the value is computed // from other constants (J Maddock 6th May 2001) # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION // Although sunpro 5.2 supports the syntax for // partial specialization, it often seems to // bind to the wrong specialization. Better // to disable it until suppport becomes more stable // (J Maddock 6th May 2001). # define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # endif # if (__SUNPRO_CC <= 0x530) // Requesting debug info (-g) with Boost.Python results // in an internal compiler error for "static const" // initialized in-class. // >> Assertion: (../links/dbg_cstabs.cc, line 611) // while processing ../test.cpp at line 0. // (Jens Maurer according to Gottfried Ganssauge 04 Mar 2002) # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION // SunPro 5.3 has better support for partial specialization, // but breaks when compiling std::less > // (Jens Maurer 4 Nov 2001). // std::less specialization fixed as reported by George // Heintzelman; partial specialization re-enabled // (Peter Dimov 17 Jan 2002) //# define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION // integral constant expressions with 64 bit numbers fail # define BOOST_NO_INTEGRAL_INT64_T # endif # if (__SUNPRO_CC < 0x570) # define BOOST_NO_TEMPLATE_TEMPLATES // see http://lists.boost.org/MailArchives/boost/msg47184.php // and http://lists.boost.org/MailArchives/boost/msg47220.php # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_NO_SFINAE # define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS # endif # if (__SUNPRO_CC <= 0x580) # define BOOST_NO_IS_ABSTRACT # endif // // Issues that effect all known versions: // #define BOOST_NO_TWO_PHASE_NAME_LOOKUP #define BOOST_NO_ADL_BARRIER // // C++0x features // #if(__SUNPRO_CC >= 0x590) # define BOOST_HAS_LONG_LONG #else # define BOOST_NO_LONG_LONG #endif #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES // // Version // #define BOOST_COMPILER "Sun compiler version " BOOST_STRINGIZE(__SUNPRO_CC) // // versions check: // we don't support sunpro prior to version 4: #if __SUNPRO_CC < 0x400 #error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version is 0x590: #if (__SUNPRO_CC > 0x590) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/compiler/vacpp.hpp000066400000000000000000000052401154025176300236500ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Toon Knapen 2001 - 2003. // (C) Copyright Lie-Quan Lee 2001. // (C) Copyright Markus Schoepflin 2002 - 2003. // (C) Copyright Beman Dawes 2002 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Visual Age (IBM) C++ compiler setup: #if __IBMCPP__ <= 501 # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS #endif #if (__IBMCPP__ <= 502) // Actually the compiler supports inclass member initialization but it // requires a definition for the class member and it doesn't recognize // it as an integral constant expression when used as a template argument. # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_NO_INTEGRAL_INT64_T # define BOOST_NO_MEMBER_TEMPLATE_KEYWORD #endif #if (__IBMCPP__ <= 600) || !defined(BOOST_STRICT_CONFIG) # define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS # define BOOST_NO_INITIALIZER_LISTS #endif // // On AIX thread support seems to be indicated by _THREAD_SAFE: // #ifdef _THREAD_SAFE # define BOOST_HAS_THREADS #endif #define BOOST_COMPILER "IBM Visual Age version " BOOST_STRINGIZE(__IBMCPP__) // // versions check: // we don't support Visual age prior to version 5: #if __IBMCPP__ < 500 #error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version is 600: #if (__IBMCPP__ > 1010) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # endif #endif // Some versions of the compiler have issues with default arguments on partial specializations #define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS // // C++0x features // // See boost\config\suffix.hpp for BOOST_NO_LONG_LONG // #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DECLTYPE #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_LAMBDAS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_STATIC_ASSERT #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES clucene-core-2.3.3.4/src/ext/boost/config/compiler/visualc.hpp000066400000000000000000000173751154025176300242210ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Darin Adler 2001 - 2002. // (C) Copyright Peter Dimov 2001. // (C) Copyright Aleksey Gurtovoy 2002. // (C) Copyright David Abrahams 2002 - 2003. // (C) Copyright Beman Dawes 2002 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Microsoft Visual C++ compiler setup: #define BOOST_MSVC _MSC_VER #if _MSC_FULL_VER > 100000000 # define BOOST_MSVC_FULL_VER _MSC_FULL_VER #else # define BOOST_MSVC_FULL_VER (_MSC_FULL_VER * 10) #endif // turn off the warnings before we #include anything #pragma warning( disable : 4503 ) // warning: decorated name length exceeded #if _MSC_VER < 1300 // 1200 == VC++ 6.0, 1200-1202 == eVC++4 # pragma warning( disable : 4786 ) // ident trunc to '255' chars in debug info # define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS # define BOOST_NO_VOID_RETURNS # define BOOST_NO_EXCEPTION_STD_NAMESPACE # if BOOST_MSVC == 1202 # define BOOST_NO_STD_TYPEINFO # endif // disable min/max macro defines on vc6: // #endif #if (_MSC_VER <= 1300) // 1300 == VC++ 7.0 # if !defined(_MSC_EXTENSIONS) && !defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS) // VC7 bug with /Za # define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS # endif # define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_NO_PRIVATE_IN_AGGREGATE # define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP # define BOOST_NO_INTEGRAL_INT64_T # define BOOST_NO_DEDUCED_TYPENAME # define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE // VC++ 6/7 has member templates but they have numerous problems including // cases of silent failure, so for safety we define: # define BOOST_NO_MEMBER_TEMPLATES // For VC++ experts wishing to attempt workarounds, we define: # define BOOST_MSVC6_MEMBER_TEMPLATES # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS # define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # define BOOST_NO_CV_VOID_SPECIALIZATIONS # define BOOST_NO_FUNCTION_TEMPLATE_ORDERING # define BOOST_NO_USING_TEMPLATE # define BOOST_NO_SWPRINTF # define BOOST_NO_TEMPLATE_TEMPLATES # define BOOST_NO_SFINAE # define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS # define BOOST_NO_IS_ABSTRACT # define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS // TODO: what version is meant here? Have there really been any fixes in cl 12.01 (as e.g. shipped with eVC4)? # if (_MSC_VER > 1200) # define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS # endif #endif #if _MSC_VER < 1400 // although a conforming signature for swprint exists in VC7.1 // it appears not to actually work: # define BOOST_NO_SWPRINTF #endif #if defined(UNDER_CE) // Windows CE does not have a conforming signature for swprintf # define BOOST_NO_SWPRINTF #endif #if _MSC_VER <= 1400 // 1400 == VC++ 8.0 # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS #endif #if _MSC_VER <= 1600 // 1600 == VC++ 10.0 # define BOOST_NO_TWO_PHASE_NAME_LOOKUP #endif #if _MSC_VER == 1500 // 1500 == VC++ 9.0 // A bug in VC9: # define BOOST_NO_ADL_BARRIER #endif #if _MSC_VER <= 1500 || !defined(BOOST_STRICT_CONFIG) // 1500 == VC++ 9.0 # define BOOST_NO_INITIALIZER_LISTS #endif #ifndef _NATIVE_WCHAR_T_DEFINED # define BOOST_NO_INTRINSIC_WCHAR_T #endif #if defined(_WIN32_WCE) || defined(UNDER_CE) # define BOOST_NO_THREADEX # define BOOST_NO_GETSYSTEMTIMEASFILETIME # define BOOST_NO_SWPRINTF #endif // // check for exception handling support: #ifndef _CPPUNWIND # define BOOST_NO_EXCEPTIONS #endif // // __int64 support: // #if (_MSC_VER >= 1200) # define BOOST_HAS_MS_INT64 #endif #if (_MSC_VER >= 1310) && (defined(_MSC_EXTENSIONS) || (_MSC_VER >= 1500)) # define BOOST_HAS_LONG_LONG #else # define BOOST_NO_LONG_LONG #endif #if (_MSC_VER >= 1400) && !defined(_DEBUG) # define BOOST_HAS_NRVO #endif // // disable Win32 API's if compiler extentions are // turned off: // #if !defined(_MSC_EXTENSIONS) && !defined(BOOST_DISABLE_WIN32) # define BOOST_DISABLE_WIN32 #endif #if !defined(_CPPRTTI) && !defined(BOOST_NO_RTTI) # define BOOST_NO_RTTI #endif // // all versions support __declspec: // #define BOOST_HAS_DECLSPEC // // C++0x features // // See above for BOOST_NO_LONG_LONG // C++ features supported by VC++ 10 (aka 2010) // #if _MSC_VER < 1600 #define BOOST_NO_AUTO_DECLARATIONS #define BOOST_NO_AUTO_MULTIDECLARATIONS #define BOOST_NO_DECLTYPE #define BOOST_NO_LAMBDAS #define BOOST_NO_RVALUE_REFERENCES #define BOOST_NO_STATIC_ASSERT #endif // _MSC_VER < 1600 // C++0x features not supported by any versions #define BOOST_NO_CHAR16_T #define BOOST_NO_CHAR32_T #define BOOST_NO_CONCEPTS #define BOOST_NO_CONSTEXPR #define BOOST_NO_DEFAULTED_FUNCTIONS #define BOOST_NO_DELETED_FUNCTIONS #define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_EXTERN_TEMPLATE #define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_INITIALIZER_LISTS #define BOOST_NO_NULLPTR #define BOOST_NO_RAW_LITERALS #define BOOST_NO_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_TEMPLATE_ALIASES #define BOOST_NO_UNICODE_LITERALS #define BOOST_NO_VARIADIC_TEMPLATES // // prefix and suffix headers: // #ifndef BOOST_ABI_PREFIX # define BOOST_ABI_PREFIX "boost/config/abi/msvc_prefix.hpp" #endif #ifndef BOOST_ABI_SUFFIX # define BOOST_ABI_SUFFIX "boost/config/abi/msvc_suffix.hpp" #endif // TODO: // these things are mostly bogus. 1200 means version 12.0 of the compiler. The // artificial versions assigned to them only refer to the versions of some IDE // these compilers have been shipped with, and even that is not all of it. Some // were shipped with freely downloadable SDKs, others as crosscompilers in eVC. // IOW, you can't use these 'versions' in any sensible way. Sorry. # if defined(UNDER_CE) # if _MSC_VER < 1200 // Note: these are so far off, they are not really supported # elif _MSC_VER < 1300 // eVC++ 4 comes with 1200-1202 # define BOOST_COMPILER_VERSION evc4.0 # elif _MSC_VER == 1400 # define BOOST_COMPILER_VERSION evc8 # elif _MSC_VER == 1500 # define BOOST_COMPILER_VERSION evc9 # elif _MSC_VER == 1600 # define BOOST_COMPILER_VERSION evc10 # else # if defined(BOOST_ASSERT_CONFIG) # error "Unknown EVC++ compiler version - please run the configure tests and report the results" # else # pragma message("Unknown EVC++ compiler version - please run the configure tests and report the results") # endif # endif # else # if _MSC_VER < 1200 // Note: these are so far off, they are not really supported # define BOOST_COMPILER_VERSION 5.0 # elif _MSC_VER < 1300 # define BOOST_COMPILER_VERSION 6.0 # elif _MSC_VER == 1300 # define BOOST_COMPILER_VERSION 7.0 # elif _MSC_VER == 1310 # define BOOST_COMPILER_VERSION 7.1 # elif _MSC_VER == 1400 # define BOOST_COMPILER_VERSION 8.0 # elif _MSC_VER == 1500 # define BOOST_COMPILER_VERSION 9.0 # elif _MSC_VER == 1600 # define BOOST_COMPILER_VERSION 10.0 # else # define BOOST_COMPILER_VERSION _MSC_VER # endif # endif #define BOOST_COMPILER "Microsoft Visual C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) // // versions check: // we don't support Visual C++ prior to version 6: #if _MSC_VER < 1200 #error "Compiler not supported or configured - please reconfigure" #endif // // last known and checked version is 1600 (VC10, aka 2010): #if (_MSC_VER > 1600) # if defined(BOOST_ASSERT_CONFIG) # error "Unknown compiler version - please run the configure tests and report the results" # else # pragma message("Unknown compiler version - please run the configure tests and report the results") # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/no_tr1/000077500000000000000000000000001154025176300214155ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/config/no_tr1/cmath.hpp000066400000000000000000000015061154025176300232240ustar00rootroot00000000000000// (C) Copyright John Maddock 2008. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // The aim of this header is just to include but to do // so in a way that does not result in recursive inclusion of // the Boost TR1 components if boost/tr1/tr1/cmath is in the // include search path. We have to do this to avoid circular // dependencies: // #ifndef BOOST_CONFIG_CMATH # define BOOST_CONFIG_CMATH # ifndef BOOST_TR1_NO_RECURSION # define BOOST_TR1_NO_RECURSION # define BOOST_CONFIG_NO_CMATH_RECURSION # endif # include # ifdef BOOST_CONFIG_NO_CMATH_RECURSION # undef BOOST_TR1_NO_RECURSION # undef BOOST_CONFIG_NO_CMATH_RECURSION # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/no_tr1/complex.hpp000066400000000000000000000015261154025176300236010ustar00rootroot00000000000000// (C) Copyright John Maddock 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // The aim of this header is just to include but to do // so in a way that does not result in recursive inclusion of // the Boost TR1 components if boost/tr1/tr1/complex is in the // include search path. We have to do this to avoid circular // dependencies: // #ifndef BOOST_CONFIG_COMPLEX # define BOOST_CONFIG_COMPLEX # ifndef BOOST_TR1_NO_RECURSION # define BOOST_TR1_NO_RECURSION # define BOOST_CONFIG_NO_COMPLEX_RECURSION # endif # include # ifdef BOOST_CONFIG_NO_COMPLEX_RECURSION # undef BOOST_TR1_NO_RECURSION # undef BOOST_CONFIG_NO_COMPLEX_RECURSION # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/no_tr1/functional.hpp000066400000000000000000000015561154025176300242770ustar00rootroot00000000000000// (C) Copyright John Maddock 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // The aim of this header is just to include but to do // so in a way that does not result in recursive inclusion of // the Boost TR1 components if boost/tr1/tr1/functional is in the // include search path. We have to do this to avoid circular // dependencies: // #ifndef BOOST_CONFIG_FUNCTIONAL # define BOOST_CONFIG_FUNCTIONAL # ifndef BOOST_TR1_NO_RECURSION # define BOOST_TR1_NO_RECURSION # define BOOST_CONFIG_NO_FUNCTIONAL_RECURSION # endif # include # ifdef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION # undef BOOST_TR1_NO_RECURSION # undef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/no_tr1/memory.hpp000066400000000000000000000015161154025176300234410ustar00rootroot00000000000000// (C) Copyright John Maddock 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // The aim of this header is just to include but to do // so in a way that does not result in recursive inclusion of // the Boost TR1 components if boost/tr1/tr1/memory is in the // include search path. We have to do this to avoid circular // dependencies: // #ifndef BOOST_CONFIG_MEMORY # define BOOST_CONFIG_MEMORY # ifndef BOOST_TR1_NO_RECURSION # define BOOST_TR1_NO_RECURSION # define BOOST_CONFIG_NO_MEMORY_RECURSION # endif # include # ifdef BOOST_CONFIG_NO_MEMORY_RECURSION # undef BOOST_TR1_NO_RECURSION # undef BOOST_CONFIG_NO_MEMORY_RECURSION # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/no_tr1/utility.hpp000066400000000000000000000015261154025176300236350ustar00rootroot00000000000000// (C) Copyright John Maddock 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // The aim of this header is just to include but to do // so in a way that does not result in recursive inclusion of // the Boost TR1 components if boost/tr1/tr1/utility is in the // include search path. We have to do this to avoid circular // dependencies: // #ifndef BOOST_CONFIG_UTILITY # define BOOST_CONFIG_UTILITY # ifndef BOOST_TR1_NO_RECURSION # define BOOST_TR1_NO_RECURSION # define BOOST_CONFIG_NO_UTILITY_RECURSION # endif # include # ifdef BOOST_CONFIG_NO_UTILITY_RECURSION # undef BOOST_TR1_NO_RECURSION # undef BOOST_CONFIG_NO_UTILITY_RECURSION # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/platform/000077500000000000000000000000001154025176300220375ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/config/platform/aix.hpp000066400000000000000000000015611154025176300233340ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // IBM/Aix specific config options: #define BOOST_PLATFORM "IBM Aix" #define BOOST_HAS_UNISTD_H #define BOOST_HAS_NL_TYPES_H #define BOOST_HAS_NANOSLEEP #define BOOST_HAS_CLOCK_GETTIME // This needs support in "boost/cstdint.hpp" exactly like FreeBSD. // This platform has header named which includes all // the things needed. #define BOOST_HAS_STDINT_H // Threading API's: #define BOOST_HAS_PTHREADS #define BOOST_HAS_PTHREAD_DELAY_NP #define BOOST_HAS_SCHED_YIELD //#define BOOST_HAS_PTHREAD_YIELD // boilerplate code: #include clucene-core-2.3.3.4/src/ext/boost/config/platform/amigaos.hpp000066400000000000000000000006721154025176300241750ustar00rootroot00000000000000// (C) Copyright John Maddock 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. #define BOOST_PLATFORM "AmigaOS" #define BOOST_DISABLE_THREADS #define BOOST_NO_CWCHAR #define BOOST_NO_STD_WSTRING #define BOOST_NO_INTRINSIC_WCHAR_T clucene-core-2.3.3.4/src/ext/boost/config/platform/beos.hpp000066400000000000000000000011211154025176300234730ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // BeOS specific config options: #define BOOST_PLATFORM "BeOS" #define BOOST_NO_CWCHAR #define BOOST_NO_CWCTYPE #define BOOST_HAS_UNISTD_H #define BOOST_HAS_BETHREADS #ifndef BOOST_DISABLE_THREADS # define BOOST_HAS_THREADS #endif // boilerplate code: #include clucene-core-2.3.3.4/src/ext/boost/config/platform/bsd.hpp000066400000000000000000000046451154025176300233310ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Darin Adler 2001. // (C) Copyright Douglas Gregor 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // generic BSD config options: #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) #error "This platform is not BSD" #endif #ifdef __FreeBSD__ #define BOOST_PLATFORM "FreeBSD " BOOST_STRINGIZE(__FreeBSD__) #elif defined(__NetBSD__) #define BOOST_PLATFORM "NetBSD " BOOST_STRINGIZE(__NetBSD__) #elif defined(__OpenBSD__) #define BOOST_PLATFORM "OpenBSD " BOOST_STRINGIZE(__OpenBSD__) #elif defined(__DragonFly__) #define BOOST_PLATFORM "DragonFly " BOOST_STRINGIZE(__DragonFly__) #endif // // is this the correct version check? // FreeBSD has but does not // advertise the fact in : // #if (defined(__FreeBSD__) && (__FreeBSD__ >= 3)) || defined(__DragonFly__) # define BOOST_HAS_NL_TYPES_H #endif // // FreeBSD 3.x has pthreads support, but defines _POSIX_THREADS in // and not in // #if (defined(__FreeBSD__) && (__FreeBSD__ <= 3))\ || defined(__OpenBSD__) || defined(__DragonFly__) # define BOOST_HAS_PTHREADS #endif // // No wide character support in the BSD header files: // #if defined(__NetBSD__) #define __NetBSD_GCC__ (__GNUC__ * 1000000 \ + __GNUC_MINOR__ * 1000 \ + __GNUC_PATCHLEVEL__) // XXX - the following is required until c++config.h // defines _GLIBCXX_HAVE_SWPRINTF and friends // or the preprocessor conditionals are removed // from the cwchar header. #define _GLIBCXX_HAVE_SWPRINTF 1 #endif #if !((defined(__FreeBSD__) && (__FreeBSD__ >= 5)) \ || (__NetBSD_GCC__ >= 2095003) || defined(__DragonFly__)) # define BOOST_NO_CWCHAR #endif // // The BSD has macros only, no functions: // #if !defined(__OpenBSD__) || defined(__DragonFly__) # define BOOST_NO_CTYPE_FUNCTIONS #endif // // thread API's not auto detected: // #define BOOST_HAS_SCHED_YIELD #define BOOST_HAS_NANOSLEEP #define BOOST_HAS_GETTIMEOFDAY #define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE #define BOOST_HAS_SIGACTION // boilerplate code: #define BOOST_HAS_UNISTD_H #include clucene-core-2.3.3.4/src/ext/boost/config/platform/cygwin.hpp000066400000000000000000000024031154025176300240470ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // cygwin specific config options: #define BOOST_PLATFORM "Cygwin" #define BOOST_NO_CWCTYPE #define BOOST_NO_CWCHAR #define BOOST_NO_SWPRINTF #define BOOST_HAS_DIRENT_H #define BOOST_HAS_LOG1P #define BOOST_HAS_EXPM1 // // Threading API: // See if we have POSIX threads, if we do use them, otherwise // revert to native Win threads. #define BOOST_HAS_UNISTD_H #include #if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) # define BOOST_HAS_PTHREADS # define BOOST_HAS_SCHED_YIELD # define BOOST_HAS_GETTIMEOFDAY # define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE # define BOOST_HAS_SIGACTION #else # if !defined(BOOST_HAS_WINTHREADS) # define BOOST_HAS_WINTHREADS # endif # define BOOST_HAS_FTIME #endif // // find out if we have a stdint.h, there should be a better way to do this: // #include #ifdef _STDINT_H #define BOOST_HAS_STDINT_H #endif // boilerplate code: #include clucene-core-2.3.3.4/src/ext/boost/config/platform/hpux.hpp000066400000000000000000000046551154025176300235460ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2001 - 2003. // (C) Copyright David Abrahams 2002. // (C) Copyright Toon Knapen 2003. // (C) Copyright Boris Gubenko 2006 - 2007. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // hpux specific config options: #define BOOST_PLATFORM "HP-UX" // In principle, HP-UX has a nice under the name // However, it has the following problem: // Use of UINT32_C(0) results in "0u l" for the preprocessed source // (verifyable with gcc 2.95.3) #if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__HP_aCC) # define BOOST_HAS_STDINT_H #endif #if !(defined(__HP_aCC) || !defined(_INCLUDE__STDC_A1_SOURCE)) # define BOOST_NO_SWPRINTF #endif #if defined(__HP_aCC) && !defined(_INCLUDE__STDC_A1_SOURCE) # define BOOST_NO_CWCTYPE #endif #if defined(__GNUC__) # if (__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ < 3)) // GNU C on HP-UX does not support threads (checked up to gcc 3.3) # define BOOST_DISABLE_THREADS # elif !defined(BOOST_DISABLE_THREADS) // threads supported from gcc-3.3 onwards: # define BOOST_HAS_THREADS # define BOOST_HAS_PTHREADS # endif #elif defined(__HP_aCC) && !defined(BOOST_DISABLE_THREADS) # define BOOST_HAS_PTHREADS #endif // boilerplate code: #define BOOST_HAS_UNISTD_H #include // the following are always available: #ifndef BOOST_HAS_GETTIMEOFDAY # define BOOST_HAS_GETTIMEOFDAY #endif #ifndef BOOST_HAS_SCHED_YIELD # define BOOST_HAS_SCHED_YIELD #endif #ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE # define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE #endif #ifndef BOOST_HAS_NL_TYPES_H # define BOOST_HAS_NL_TYPES_H #endif #ifndef BOOST_HAS_NANOSLEEP # define BOOST_HAS_NANOSLEEP #endif #ifndef BOOST_HAS_GETTIMEOFDAY # define BOOST_HAS_GETTIMEOFDAY #endif #ifndef BOOST_HAS_DIRENT_H # define BOOST_HAS_DIRENT_H #endif #ifndef BOOST_HAS_CLOCK_GETTIME # define BOOST_HAS_CLOCK_GETTIME #endif #ifndef BOOST_HAS_SIGACTION # define BOOST_HAS_SIGACTION #endif #ifndef BOOST_HAS_NRVO # ifndef __parisc # define BOOST_HAS_NRVO # endif #endif #ifndef BOOST_HAS_LOG1P # define BOOST_HAS_LOG1P #endif #ifndef BOOST_HAS_EXPM1 # define BOOST_HAS_EXPM1 #endif clucene-core-2.3.3.4/src/ext/boost/config/platform/irix.hpp000066400000000000000000000014251154025176300235250ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // SGI Irix specific config options: #define BOOST_PLATFORM "SGI Irix" #define BOOST_NO_SWPRINTF // // these are not auto detected by POSIX feature tests: // #define BOOST_HAS_GETTIMEOFDAY #define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE #ifdef __GNUC__ // GNU C on IRIX does not support threads (checked up to gcc 3.3) # define BOOST_DISABLE_THREADS #endif // boilerplate code: #define BOOST_HAS_UNISTD_H #include clucene-core-2.3.3.4/src/ext/boost/config/platform/linux.hpp000066400000000000000000000046501154025176300237140ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2001 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // linux specific config options: #define BOOST_PLATFORM "linux" // make sure we have __GLIBC_PREREQ if available at all #include // // added to glibc 2.1.1 // We can only test for 2.1 though: // #if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))) // defines int64_t unconditionally, but defines // int64_t only if __GNUC__. Thus, assume a fully usable // only when using GCC. # if defined __GNUC__ # define BOOST_HAS_STDINT_H # endif #endif #if defined(__LIBCOMO__) // // como on linux doesn't have std:: c functions: // NOTE: versions of libcomo prior to beta28 have octal version numbering, // e.g. version 25 is 21 (dec) // # if __LIBCOMO_VERSION__ <= 20 # define BOOST_NO_STDC_NAMESPACE # endif # if __LIBCOMO_VERSION__ <= 21 # define BOOST_NO_SWPRINTF # endif #endif // // If glibc is past version 2 then we definitely have // gettimeofday, earlier versions may or may not have it: // #if defined(__GLIBC__) && (__GLIBC__ >= 2) # define BOOST_HAS_GETTIMEOFDAY #endif #ifdef __USE_POSIX199309 # define BOOST_HAS_NANOSLEEP #endif #if defined(__GLIBC__) && defined(__GLIBC_PREREQ) // __GLIBC_PREREQ is available since 2.1.2 // swprintf is available since glibc 2.2.0 # if !__GLIBC_PREREQ(2,2) || (!defined(__USE_ISOC99) && !defined(__USE_UNIX98)) # define BOOST_NO_SWPRINTF # endif #else # define BOOST_NO_SWPRINTF #endif // boilerplate code: #define BOOST_HAS_UNISTD_H #include #ifndef __GNUC__ // // if the compiler is not gcc we still need to be able to parse // the GNU system headers, some of which (mainly ) // use GNU specific extensions: // # ifndef __extension__ # define __extension__ # endif # ifndef __const__ # define __const__ const # endif # ifndef __volatile__ # define __volatile__ volatile # endif # ifndef __signed__ # define __signed__ signed # endif # ifndef __typeof__ # define __typeof__ typeof # endif # ifndef __inline__ # define __inline__ inline # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/platform/macos.hpp000066400000000000000000000045261154025176300236610ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Darin Adler 2001 - 2002. // (C) Copyright Bill Kempf 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Mac OS specific config options: #define BOOST_PLATFORM "Mac OS" #if __MACH__ && !defined(_MSL_USING_MSL_C) // Using the Mac OS X system BSD-style C library. # ifndef BOOST_HAS_UNISTD_H # define BOOST_HAS_UNISTD_H # endif // // Begin by including our boilerplate code for POSIX // feature detection, this is safe even when using // the MSL as Metrowerks supply their own // to replace the platform-native BSD one. G++ users // should also always be able to do this on MaxOS X. // # include # ifndef BOOST_HAS_STDINT_H # define BOOST_HAS_STDINT_H # endif // // BSD runtime has pthreads, sigaction, sched_yield and gettimeofday, // of these only pthreads are advertised in , so set the // other options explicitly: // # define BOOST_HAS_SCHED_YIELD # define BOOST_HAS_GETTIMEOFDAY # define BOOST_HAS_SIGACTION # if (__GNUC__ < 3) && !defined( __APPLE_CC__) // GCC strange "ignore std" mode works better if you pretend everything // is in the std namespace, for the most part. # define BOOST_NO_STDC_NAMESPACE # endif # if (__GNUC__ == 4) // Both gcc and intel require these. # define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE # define BOOST_HAS_NANOSLEEP # endif #else // Using the MSL C library. // We will eventually support threads in non-Carbon builds, but we do // not support this yet. # if ( defined(TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON ) || ( defined(TARGET_CARBON) && TARGET_CARBON ) # if !defined(BOOST_HAS_PTHREADS) # define BOOST_HAS_MPTASKS # elif ( __dest_os == __mac_os_x ) // We are doing a Carbon/Mach-O/MSL build which has pthreads, but only the // gettimeofday and no posix. # define BOOST_HAS_GETTIMEOFDAY # endif // The MP task implementation of Boost Threads aims to replace MP-unsafe // parts of the MSL, so we turn on threads unconditionally. # define BOOST_HAS_THREADS // The remote call manager depends on this. # define BOOST_BIND_ENABLE_PASCAL # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/platform/qnxnto.hpp000066400000000000000000000013761154025176300241060ustar00rootroot00000000000000// (C) Copyright Jim Douglas 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // QNX specific config options: #define BOOST_PLATFORM "QNX" #define BOOST_HAS_UNISTD_H #include // QNX claims XOpen version 5 compatibility, but doesn't have an nl_types.h // or log1p and expm1: #undef BOOST_HAS_NL_TYPES_H #undef BOOST_HAS_LOG1P #undef BOOST_HAS_EXPM1 #define BOOST_HAS_PTHREADS #define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE #define BOOST_HAS_GETTIMEOFDAY #define BOOST_HAS_CLOCK_GETTIME #define BOOST_HAS_NANOSLEEP clucene-core-2.3.3.4/src/ext/boost/config/platform/solaris.hpp000066400000000000000000000013111154025176300242200ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // sun specific config options: #define BOOST_PLATFORM "Sun Solaris" #define BOOST_HAS_GETTIMEOFDAY // boilerplate code: #define BOOST_HAS_UNISTD_H #include // // pthreads don't actually work with gcc unless _PTHREADS is defined: // #if defined(__GNUC__) && defined(_POSIX_THREADS) && !defined(_PTHREADS) # undef BOOST_HAS_PTHREADS #endif clucene-core-2.3.3.4/src/ext/boost/config/platform/vxworks.hpp000066400000000000000000000014631154025176300242770ustar00rootroot00000000000000// (C) Copyright Dustin Spicuzza 2009. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // vxWorks specific config options: #define BOOST_PLATFORM "vxWorks" #define BOOST_NO_CWCHAR #define BOOST_NO_INTRINSIC_WCHAR_T #if defined(__GNUC__) && defined(__STRICT_ANSI__) #define BOOST_NO_INT64_T #endif #define BOOST_HAS_UNISTD_H // these allow posix_features to work, since vxWorks doesn't // define them itself #define _POSIX_TIMERS 1 #define _POSIX_THREADS 1 // vxworks doesn't work with asio serial ports #define BOOST_ASIO_DISABLE_SERIAL_PORT // boilerplate code: #include clucene-core-2.3.3.4/src/ext/boost/config/platform/win32.hpp000066400000000000000000000031631154025176300235150ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Bill Kempf 2001. // (C) Copyright Aleksey Gurtovoy 2003. // (C) Copyright Rene Rivera 2005. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Win32 specific config options: #define BOOST_PLATFORM "Win32" // Get the information about the MinGW runtime, i.e. __MINGW32_*VERSION. #if defined(__MINGW32__) # include <_mingw.h> #endif #if defined(__GNUC__) && !defined(BOOST_NO_SWPRINTF) # define BOOST_NO_SWPRINTF #endif #if !defined(__GNUC__) && !defined(BOOST_HAS_DECLSPEC) # define BOOST_HAS_DECLSPEC #endif #if defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 2) || ((__MINGW32_MAJOR_VERSION == 2) && (__MINGW32_MINOR_VERSION >= 0))) # define BOOST_HAS_STDINT_H # define __STDC_LIMIT_MACROS # define BOOST_HAS_DIRENT_H # define BOOST_HAS_UNISTD_H #endif // // Win32 will normally be using native Win32 threads, // but there is a pthread library avaliable as an option, // we used to disable this when BOOST_DISABLE_WIN32 was // defined but no longer - this should allow some // files to be compiled in strict mode - while maintaining // a consistent setting of BOOST_HAS_THREADS across // all translation units (needed for shared_ptr etc). // #ifdef _WIN32_WCE # define BOOST_NO_ANSI_APIS #endif #ifndef BOOST_HAS_PTHREADS # define BOOST_HAS_WINTHREADS #endif #ifndef BOOST_DISABLE_WIN32 // WEK: Added #define BOOST_HAS_FTIME #define BOOST_WINDOWS 1 #endif clucene-core-2.3.3.4/src/ext/boost/config/posix_features.hpp000066400000000000000000000072301154025176300237660ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // All POSIX feature tests go in this file, // Note that we test _POSIX_C_SOURCE and _XOPEN_SOURCE as well // _POSIX_VERSION and _XOPEN_VERSION: on some systems POSIX API's // may be present but none-functional unless _POSIX_C_SOURCE and // _XOPEN_SOURCE have been defined to the right value (it's up // to the user to do this *before* including any header, although // in most cases the compiler will do this for you). # if defined(BOOST_HAS_UNISTD_H) # include // XOpen has , but is this the correct version check? # if defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 3) # define BOOST_HAS_NL_TYPES_H # endif // POSIX version 6 requires # if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200100) # define BOOST_HAS_STDINT_H # endif // POSIX version 2 requires # if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199009L) # define BOOST_HAS_DIRENT_H # endif // POSIX version 3 requires to have sigaction: # if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199506L) # define BOOST_HAS_SIGACTION # endif // POSIX defines _POSIX_THREADS > 0 for pthread support, // however some platforms define _POSIX_THREADS without // a value, hence the (_POSIX_THREADS+0 >= 0) check. // Strictly speaking this may catch platforms with a // non-functioning stub , but such occurrences should // occur very rarely if at all. # if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_MPTASKS) # define BOOST_HAS_PTHREADS # endif // BOOST_HAS_NANOSLEEP: // This is predicated on _POSIX_TIMERS or _XOPEN_REALTIME: # if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) \ || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0)) # define BOOST_HAS_NANOSLEEP # endif // BOOST_HAS_CLOCK_GETTIME: // This is predicated on _POSIX_TIMERS (also on _XOPEN_REALTIME // but at least one platform - linux - defines that flag without // defining clock_gettime): # if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) # define BOOST_HAS_CLOCK_GETTIME # endif // BOOST_HAS_SCHED_YIELD: // This is predicated on _POSIX_PRIORITY_SCHEDULING or // on _POSIX_THREAD_PRIORITY_SCHEDULING or on _XOPEN_REALTIME. # if defined(_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING+0 > 0)\ || (defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING+0 > 0))\ || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0)) # define BOOST_HAS_SCHED_YIELD # endif // BOOST_HAS_GETTIMEOFDAY: // BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE: // These are predicated on _XOPEN_VERSION, and appears to be first released // in issue 4, version 2 (_XOPEN_VERSION > 500). // Likewise for the functions log1p and expm1. # if defined(_XOPEN_VERSION) && (_XOPEN_VERSION+0 >= 500) # define BOOST_HAS_GETTIMEOFDAY # if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE+0 >= 500) # define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE # endif # ifndef BOOST_HAS_LOG1P # define BOOST_HAS_LOG1P # endif # ifndef BOOST_HAS_EXPM1 # define BOOST_HAS_EXPM1 # endif # endif # endif clucene-core-2.3.3.4/src/ext/boost/config/requires_threads.hpp000066400000000000000000000066631154025176300243100ustar00rootroot00000000000000// (C) Copyright John Maddock 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_CONFIG_REQUIRES_THREADS_HPP #define BOOST_CONFIG_REQUIRES_THREADS_HPP #ifndef BOOST_CONFIG_HPP # include #endif #if defined(BOOST_DISABLE_THREADS) // // special case to handle versions of gcc which don't currently support threads: // #if defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC_MINOR__ <= 3) || !defined(BOOST_STRICT_CONFIG)) // // this is checked up to gcc 3.3: // #if defined(__sgi) || defined(__hpux) # error "Multi-threaded programs are not supported by gcc on HPUX or Irix (last checked with gcc 3.3)" #endif #endif # error "Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS" #elif !defined(BOOST_HAS_THREADS) # if defined __COMO__ // Comeau C++ # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -D_MT (Windows) or -D_REENTRANT (Unix)" #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) // Intel #ifdef _WIN32 # error "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd" #else # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -openmp" #endif # elif defined __GNUC__ // GNU C++: # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)" #elif defined __sgi // SGI MIPSpro C++ # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -D_SGI_MP_SOURCE" #elif defined __DECCXX // Compaq Tru64 Unix cxx # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread" #elif defined __BORLANDC__ // Borland # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -tWM" #elif defined __MWERKS__ // Metrowerks CodeWarrior # error "Compiler threading support is not turned on. Please set the correct command line options for threading: either -runtime sm, -runtime smd, -runtime dm, or -runtime dmd" #elif defined __SUNPRO_CC // Sun Workshop Compiler C++ # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -mt" #elif defined __HP_aCC // HP aCC # error "Compiler threading support is not turned on. Please set the correct command line options for threading: -mt" #elif defined(__IBMCPP__) // IBM Visual Age # error "Compiler threading support is not turned on. Please compile the code with the xlC_r compiler" #elif defined _MSC_VER // Microsoft Visual C++ // // Must remain the last #elif since some other vendors (Metrowerks, for // example) also #define _MSC_VER # error "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd" #else # error "Compiler threading support is not turned on. Please consult your compiler's documentation for the appropriate options to use" #endif // compilers #endif // BOOST_HAS_THREADS #endif // BOOST_CONFIG_REQUIRES_THREADS_HPP clucene-core-2.3.3.4/src/ext/boost/config/select_compiler_config.hpp000066400000000000000000000072321154025176300254260ustar00rootroot00000000000000// Boost compiler configuration selection header file // (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Martin Wille 2003. // (C) Copyright Guillaume Melquiond 2003. // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/ for most recent version. // one identification macro for each of the // compilers we support: # define BOOST_CXX_GCCXML 0 # define BOOST_CXX_COMO 0 # define BOOST_CXX_DMC 0 # define BOOST_CXX_INTEL 0 # define BOOST_CXX_GNUC 0 # define BOOST_CXX_KCC 0 # define BOOST_CXX_SGI 0 # define BOOST_CXX_TRU64 0 # define BOOST_CXX_GHS 0 # define BOOST_CXX_BORLAND 0 # define BOOST_CXX_CW 0 # define BOOST_CXX_SUNPRO 0 # define BOOST_CXX_HPACC 0 # define BOOST_CXX_MPW 0 # define BOOST_CXX_IBMCPP 0 # define BOOST_CXX_MSVC 0 # define BOOST_CXX_PGI 0 // locate which compiler we are using and define // BOOST_COMPILER_CONFIG as needed: #if defined(__GCCXML__) // GCC-XML emulates other compilers, it has to appear first here! # define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc_xml.hpp" #elif defined __COMO__ // Comeau C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/comeau.hpp" #elif defined __DMC__ // Digital Mars C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/digitalmars.hpp" #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) // Intel # define BOOST_COMPILER_CONFIG "boost/config/compiler/intel.hpp" # elif defined __GNUC__ // GNU C++: # define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc.hpp" #elif defined __KCC // Kai C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/kai.hpp" #elif defined __sgi // SGI MIPSpro C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/sgi_mipspro.hpp" #elif defined __DECCXX // Compaq Tru64 Unix cxx # define BOOST_COMPILER_CONFIG "boost/config/compiler/compaq_cxx.hpp" #elif defined __ghs // Greenhills C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/greenhills.hpp" #elif defined __CODEGEARC__ // CodeGear - must be checked for before Borland # define BOOST_COMPILER_CONFIG "boost/config/compiler/codegear.hpp" #elif defined __BORLANDC__ // Borland # define BOOST_COMPILER_CONFIG "boost/config/compiler/borland.hpp" #elif defined __MWERKS__ // Metrowerks CodeWarrior # define BOOST_COMPILER_CONFIG "boost/config/compiler/metrowerks.hpp" #elif defined __SUNPRO_CC // Sun Workshop Compiler C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/sunpro_cc.hpp" #elif defined __HP_aCC // HP aCC # define BOOST_COMPILER_CONFIG "boost/config/compiler/hp_acc.hpp" #elif defined(__MRC__) || defined(__SC__) // MPW MrCpp or SCpp # define BOOST_COMPILER_CONFIG "boost/config/compiler/mpw.hpp" #elif defined(__IBMCPP__) // IBM Visual Age # define BOOST_COMPILER_CONFIG "boost/config/compiler/vacpp.hpp" #elif defined(__PGI) // Portland Group Inc. # define BOOST_COMPILER_CONFIG "boost/config/compiler/pgi.hpp" #elif defined _MSC_VER // Microsoft Visual C++ // // Must remain the last #elif since some other vendors (Metrowerks, for // example) also #define _MSC_VER # define BOOST_COMPILER_CONFIG "boost/config/compiler/visualc.hpp" #elif defined (BOOST_ASSERT_CONFIG) // this must come last - generate an error if we don't // recognise the compiler: # error "Unknown compiler - please configure (http://www.boost.org/libs/config/config.htm#configuring) and report the results to the main boost mailing list (http://www.boost.org/more/mailing_lists.htm#main)" #endif clucene-core-2.3.3.4/src/ext/boost/config/select_platform_config.hpp000066400000000000000000000055201154025176300254360ustar00rootroot00000000000000// Boost compiler configuration selection header file // (C) Copyright John Maddock 2001 - 2002. // (C) Copyright Jens Maurer 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // locate which platform we are on and define BOOST_PLATFORM_CONFIG as needed. // Note that we define the headers to include using "header_name" not // in order to prevent macro expansion within the header // name (for example "linux" is a macro on linux systems). #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__) // linux, also other platforms (Hurd etc) that use GLIBC, should these really have their own config headers though? # define BOOST_PLATFORM_CONFIG "boost/config/platform/linux.hpp" #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) // BSD: # define BOOST_PLATFORM_CONFIG "boost/config/platform/bsd.hpp" #elif defined(sun) || defined(__sun) // solaris: # define BOOST_PLATFORM_CONFIG "boost/config/platform/solaris.hpp" #elif defined(__sgi) // SGI Irix: # define BOOST_PLATFORM_CONFIG "boost/config/platform/irix.hpp" #elif defined(__hpux) // hp unix: # define BOOST_PLATFORM_CONFIG "boost/config/platform/hpux.hpp" #elif defined(__CYGWIN__) // cygwin is not win32: # define BOOST_PLATFORM_CONFIG "boost/config/platform/cygwin.hpp" #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) // win32: # define BOOST_PLATFORM_CONFIG "boost/config/platform/win32.hpp" #elif defined(__BEOS__) // BeOS # define BOOST_PLATFORM_CONFIG "boost/config/platform/beos.hpp" #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) // MacOS # define BOOST_PLATFORM_CONFIG "boost/config/platform/macos.hpp" #elif defined(__IBMCPP__) || defined(_AIX) // IBM # define BOOST_PLATFORM_CONFIG "boost/config/platform/aix.hpp" #elif defined(__amigaos__) // AmigaOS # define BOOST_PLATFORM_CONFIG "boost/config/platform/amigaos.hpp" #elif defined(__QNXNTO__) // QNX: # define BOOST_PLATFORM_CONFIG "boost/config/platform/qnxnto.hpp" #elif defined(__VXWORKS__) // vxWorks: # define BOOST_PLATFORM_CONFIG "boost/config/platform/vxworks.hpp" #else # if defined(unix) \ || defined(__unix) \ || defined(_XOPEN_SOURCE) \ || defined(_POSIX_SOURCE) // generic unix platform: # ifndef BOOST_HAS_UNISTD_H # define BOOST_HAS_UNISTD_H # endif # include # endif # if defined (BOOST_ASSERT_CONFIG) // this must come last - generate an error if we don't // recognise the platform: # error "Unknown platform - please configure and report the results to boost.org" # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/select_stdlib_config.hpp000066400000000000000000000054071154025176300250770ustar00rootroot00000000000000// Boost compiler configuration selection header file // (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2001 - 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // locate which std lib we are using and define BOOST_STDLIB_CONFIG as needed: // First include to determine if some version of STLport is in use as the std lib // (do not rely on this header being included since users can short-circuit this header // if they know whose std lib they are using.) #include #if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) // STLPort library; this _must_ come first, otherwise since // STLport typically sits on top of some other library, we // can end up detecting that first rather than STLport: # define BOOST_STDLIB_CONFIG "boost/config/stdlib/stlport.hpp" #else // If our std lib was not some version of STLport, then include as it is about // the smallest of the std lib headers that includes real C++ stuff. (Some std libs do not // include their C++-related macros in so this additional include makes sure // we get those definitions) // (again do not rely on this header being included since users can short-circuit this // header if they know whose std lib they are using.) #include #if defined(__LIBCOMO__) // Comeau STL: #define BOOST_STDLIB_CONFIG "boost/config/stdlib/libcomo.hpp" #elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER) // Rogue Wave library: # define BOOST_STDLIB_CONFIG "boost/config/stdlib/roguewave.hpp" #elif defined(__GLIBCPP__) || defined(__GLIBCXX__) // GNU libstdc++ 3 # define BOOST_STDLIB_CONFIG "boost/config/stdlib/libstdcpp3.hpp" #elif defined(__STL_CONFIG_H) // generic SGI STL # define BOOST_STDLIB_CONFIG "boost/config/stdlib/sgi.hpp" #elif defined(__MSL_CPP__) // MSL standard lib: # define BOOST_STDLIB_CONFIG "boost/config/stdlib/msl.hpp" #elif defined(__IBMCPP__) // take the default VACPP std lib # define BOOST_STDLIB_CONFIG "boost/config/stdlib/vacpp.hpp" #elif defined(MSIPL_COMPILE_H) // Modena C++ standard library # define BOOST_STDLIB_CONFIG "boost/config/stdlib/modena.hpp" #elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER) // Dinkumware Library (this has to appear after any possible replacement libraries): # define BOOST_STDLIB_CONFIG "boost/config/stdlib/dinkumware.hpp" #elif defined (BOOST_ASSERT_CONFIG) // this must come last - generate an error if we don't // recognise the library: # error "Unknown standard library - please configure and report the results to boost.org" #endif #endif clucene-core-2.3.3.4/src/ext/boost/config/stdlib/000077500000000000000000000000001154025176300214745ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/config/stdlib/dinkumware.hpp000066400000000000000000000111071154025176300243530ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2001. // (C) Copyright Peter Dimov 2001. // (C) Copyright David Abrahams 2002. // (C) Copyright Guillaume Melquiond 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Dinkumware standard library config: #if !defined(_YVALS) && !defined(_CPPLIB_VER) #include #if !defined(_YVALS) && !defined(_CPPLIB_VER) #error This is not the Dinkumware lib! #endif #endif #if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 306) // full dinkumware 3.06 and above // fully conforming provided the compiler supports it: # if !(defined(_GLOBAL_USING) && (_GLOBAL_USING+0 > 0)) && !defined(__BORLANDC__) && !defined(_STD) && !(defined(__ICC) && (__ICC >= 700)) // can be defined in yvals.h # define BOOST_NO_STDC_NAMESPACE # endif # if !(defined(_HAS_MEMBER_TEMPLATES_REBIND) && (_HAS_MEMBER_TEMPLATES_REBIND+0 > 0)) && !(defined(_MSC_VER) && (_MSC_VER > 1300)) && defined(BOOST_MSVC) # define BOOST_NO_STD_ALLOCATOR # endif # define BOOST_HAS_PARTIAL_STD_ALLOCATOR # if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) // if this lib version is set up for vc6 then there is no std::use_facet: # define BOOST_NO_STD_USE_FACET # define BOOST_HAS_TWO_ARG_USE_FACET // C lib functions aren't in namespace std either: # define BOOST_NO_STDC_NAMESPACE // and nor is # define BOOST_NO_EXCEPTION_STD_NAMESPACE # endif // There's no numeric_limits support unless _LONGLONG is defined: # if !defined(_LONGLONG) && (_CPPLIB_VER <= 310) # define BOOST_NO_MS_INT64_NUMERIC_LIMITS # endif // 3.06 appears to have (non-sgi versions of) & , // and no at all #else # define BOOST_MSVC_STD_ITERATOR 1 # define BOOST_NO_STD_ITERATOR # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS # define BOOST_NO_STD_ALLOCATOR # define BOOST_NO_STDC_NAMESPACE # define BOOST_NO_STD_USE_FACET # define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN # define BOOST_HAS_MACRO_USE_FACET # ifndef _CPPLIB_VER // Updated Dinkum library defines this, and provides // its own min and max definitions, as does MTA version. # ifndef __MTA__ # define BOOST_NO_STD_MIN_MAX # endif # define BOOST_NO_MS_INT64_NUMERIC_LIMITS # endif #endif // // std extension namespace is stdext for vc7.1 and later, // the same applies to other compilers that sit on top // of vc7.1 (Intel and Comeau): // #if defined(_MSC_VER) && (_MSC_VER >= 1310) && !defined(__BORLANDC__) # define BOOST_STD_EXTENSION_NAMESPACE stdext #endif #if (defined(_MSC_VER) && (_MSC_VER <= 1300) && !defined(__BORLANDC__)) || !defined(_CPPLIB_VER) || (_CPPLIB_VER < 306) // if we're using a dinkum lib that's // been configured for VC6/7 then there is // no iterator traits (true even for icl) # define BOOST_NO_STD_ITERATOR_TRAITS #endif #if defined(__ICL) && (__ICL < 800) && defined(_CPPLIB_VER) && (_CPPLIB_VER <= 310) // Intel C++ chokes over any non-trivial use of // this may be an overly restrictive define, but regex fails without it: # define BOOST_NO_STD_LOCALE #endif // C++0x headers implemented in 520 (as shipped by Microsoft) // #if !defined(_CPPLIB_VER) || _CPPLIB_VER < 520 # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE #ifdef _CPPLIB_VER # define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER #else # define BOOST_DINKUMWARE_STDLIB 1 #endif #ifdef _CPPLIB_VER # define BOOST_STDLIB "Dinkumware standard library version " BOOST_STRINGIZE(_CPPLIB_VER) #else # define BOOST_STDLIB "Dinkumware standard library version 1.x" #endif clucene-core-2.3.3.4/src/ext/boost/config/stdlib/libcomo.hpp000066400000000000000000000042001154025176300236250ustar00rootroot00000000000000// (C) Copyright John Maddock 2002 - 2003. // (C) Copyright Jens Maurer 2002 - 2003. // (C) Copyright Beman Dawes 2002 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Comeau STL: #if !defined(__LIBCOMO__) # include # if !defined(__LIBCOMO__) # error "This is not the Comeau STL!" # endif #endif // // std::streambuf is non-standard // NOTE: versions of libcomo prior to beta28 have octal version numbering, // e.g. version 25 is 21 (dec) #if __LIBCOMO_VERSION__ <= 22 # define BOOST_NO_STD_WSTREAMBUF #endif #if (__LIBCOMO_VERSION__ <= 31) && defined(_WIN32) #define BOOST_NO_SWPRINTF #endif #if __LIBCOMO_VERSION__ >= 31 # define BOOST_HAS_HASH # define BOOST_HAS_SLIST #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET // // Intrinsic type_traits support. // The SGI STL has it's own __type_traits class, which // has intrinsic compiler support with SGI's compilers. // Whatever map SGI style type traits to boost equivalents: // #define BOOST_HAS_SGI_TYPE_TRAITS #define BOOST_STDLIB "Comeau standard library " BOOST_STRINGIZE(__LIBCOMO_VERSION__) clucene-core-2.3.3.4/src/ext/boost/config/stdlib/libstdcpp3.hpp000066400000000000000000000110551154025176300242560ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // (C) Copyright Jens Maurer 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // config for libstdc++ v3 // not much to go in here: #ifdef __GLIBCXX__ #define BOOST_STDLIB "GNU libstdc++ version " BOOST_STRINGIZE(__GLIBCXX__) #else #define BOOST_STDLIB "GNU libstdc++ version " BOOST_STRINGIZE(__GLIBCPP__) #endif #if !defined(_GLIBCPP_USE_WCHAR_T) && !defined(_GLIBCXX_USE_WCHAR_T) # define BOOST_NO_CWCHAR # define BOOST_NO_CWCTYPE # define BOOST_NO_STD_WSTRING # define BOOST_NO_STD_WSTREAMBUF #endif #if defined(__osf__) && !defined(_REENTRANT) \ && ( defined(_GLIBCXX_HAVE_GTHR_DEFAULT) || defined(_GLIBCPP_HAVE_GTHR_DEFAULT) ) // GCC 3 on Tru64 forces the definition of _REENTRANT when any std lib header // file is included, therefore for consistency we define it here as well. # define _REENTRANT #endif #ifdef __GLIBCXX__ // gcc 3.4 and greater: # if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \ || defined(_GLIBCXX__PTHREADS) // // If the std lib has thread support turned on, then turn it on in Boost // as well. We do this because some gcc-3.4 std lib headers define _REENTANT // while others do not... // # define BOOST_HAS_THREADS # else # define BOOST_DISABLE_THREADS # endif #elif defined(__GLIBCPP__) \ && !defined(_GLIBCPP_HAVE_GTHR_DEFAULT) \ && !defined(_GLIBCPP__PTHREADS) // disable thread support if the std lib was built single threaded: # define BOOST_DISABLE_THREADS #endif #if (defined(linux) || defined(__linux) || defined(__linux__)) && defined(__arm__) && defined(_GLIBCPP_HAVE_GTHR_DEFAULT) // linux on arm apparently doesn't define _REENTRANT // so just turn on threading support whenever the std lib is thread safe: # define BOOST_HAS_THREADS #endif #if !defined(_GLIBCPP_USE_LONG_LONG) \ && !defined(_GLIBCXX_USE_LONG_LONG)\ && defined(BOOST_HAS_LONG_LONG) // May have been set by compiler/*.hpp, but "long long" without library // support is useless. # undef BOOST_HAS_LONG_LONG #endif #if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0 # define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx # define BOOST_HAS_SLIST # define BOOST_HAS_HASH # define BOOST_SLIST_HEADER # if !defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) # define BOOST_HASH_SET_HEADER # define BOOST_HASH_MAP_HEADER # else # define BOOST_HASH_SET_HEADER # define BOOST_HASH_MAP_HEADER # endif #endif // stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly // __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the stdlibc++ // developers. He also commented: // // "I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in // GCC 4.2.4 it is set to 20080519 but in GCC 4.3.0 it is set to 20080305. // Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support // than any release in the 4.2 series." // // Another resource for understanding stdlibc++ features is: // http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x // C++0x headers in GCC 4.3.0 and later // #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || !defined(__GXX_EXPERIMENTAL_CXX0X__) # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #endif // C++0x headers in GCC 4.4.0 and later // #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) || !defined(__GXX_EXPERIMENTAL_CXX0X__) # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS // --- end --- clucene-core-2.3.3.4/src/ext/boost/config/stdlib/modena.hpp000066400000000000000000000030531154025176300234510ustar00rootroot00000000000000// (C) Copyright Jens Maurer 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Modena C++ standard library (comes with KAI C++) #if !defined(MSIPL_COMPILE_H) # include # if !defined(__MSIPL_COMPILE_H) # error "This is not the Modena C++ library!" # endif #endif #ifndef MSIPL_NL_TYPES #define BOOST_NO_STD_MESSAGES #endif #ifndef MSIPL_WCHART #define BOOST_NO_STD_WSTRING #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #define BOOST_STDLIB "Modena C++ standard library" clucene-core-2.3.3.4/src/ext/boost/config/stdlib/msl.hpp000066400000000000000000000042061154025176300230020ustar00rootroot00000000000000// (C) Copyright John Maddock 2001. // (C) Copyright Darin Adler 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Metrowerks standard library: #ifndef __MSL_CPP__ # include # ifndef __MSL_CPP__ # error This is not the MSL standard library! # endif #endif #if __MSL_CPP__ >= 0x6000 // Pro 6 # define BOOST_HAS_HASH # define BOOST_STD_EXTENSION_NAMESPACE Metrowerks #endif #define BOOST_HAS_SLIST #if __MSL_CPP__ < 0x6209 # define BOOST_NO_STD_MESSAGES #endif // check C lib version for #include #if defined(__MSL__) && (__MSL__ >= 0x5000) # define BOOST_HAS_STDINT_H # if !defined(__PALMOS_TRAPS__) # define BOOST_HAS_UNISTD_H # endif // boilerplate code: # include #endif #if defined(_MWMT) || _MSL_THREADSAFE # define BOOST_HAS_THREADS #endif #ifdef _MSL_NO_EXPLICIT_FUNC_TEMPLATE_ARG # define BOOST_NO_STD_USE_FACET # define BOOST_HAS_TWO_ARG_USE_FACET #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #define BOOST_STDLIB "Metrowerks Standard Library version " BOOST_STRINGIZE(__MSL_CPP__) clucene-core-2.3.3.4/src/ext/boost/config/stdlib/roguewave.hpp000066400000000000000000000125741154025176300242220ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Jens Maurer 2001. // (C) Copyright David Abrahams 2003. // (C) Copyright Boris Gubenko 2007. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // Rogue Wave std lib: #if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER) # include # if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER) # error This is not the Rogue Wave standard library # endif #endif // // figure out a consistent version number: // #ifndef _RWSTD_VER # define BOOST_RWSTD_VER 0x010000 #elif _RWSTD_VER < 0x010000 # define BOOST_RWSTD_VER (_RWSTD_VER << 8) #else # define BOOST_RWSTD_VER _RWSTD_VER #endif #ifndef _RWSTD_VER # define BOOST_STDLIB "Rogue Wave standard library version (Unknown version)" #elif _RWSTD_VER < 0x04010200 # define BOOST_STDLIB "Rogue Wave standard library version " BOOST_STRINGIZE(_RWSTD_VER) #else # ifdef _RWSTD_VER_STR # define BOOST_STDLIB "Apache STDCXX standard library version " _RWSTD_VER_STR # else # define BOOST_STDLIB "Apache STDCXX standard library version " BOOST_STRINGIZE(_RWSTD_VER) # endif #endif // // Prior to version 2.2.0 the primary template for std::numeric_limits // does not have compile time constants, even though specializations of that // template do: // #if BOOST_RWSTD_VER < 0x020200 # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS #endif // Sun CC 5.5 patch 113817-07 adds long long specialization, but does not change the // library version number (http://sunsolve6.sun.com/search/document.do?assetkey=1-21-113817): #if BOOST_RWSTD_VER <= 0x020101 && (!defined(__SUNPRO_CC) || (__SUNPRO_CC < 0x550)) # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS # endif // // Borland version of numeric_limits lacks __int64 specialisation: // #ifdef __BORLANDC__ # define BOOST_NO_MS_INT64_NUMERIC_LIMITS #endif // // No std::iterator if it can't figure out default template args: // #if defined(_RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || defined(RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || (BOOST_RWSTD_VER < 0x020000) # define BOOST_NO_STD_ITERATOR #endif // // No iterator traits without partial specialization: // #if defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) || defined(RWSTD_NO_CLASS_PARTIAL_SPEC) # define BOOST_NO_STD_ITERATOR_TRAITS #endif // // Prior to version 2.0, std::auto_ptr was buggy, and there were no // new-style iostreams, and no conformant std::allocator: // #if (BOOST_RWSTD_VER < 0x020000) # define BOOST_NO_AUTO_PTR # define BOOST_NO_STRINGSTREAM # define BOOST_NO_STD_ALLOCATOR # define BOOST_NO_STD_LOCALE #endif // // No template iterator constructors without member template support: // #if defined(RWSTD_NO_MEMBER_TEMPLATES) || defined(_RWSTD_NO_MEMBER_TEMPLATES) # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS #endif // // RW defines _RWSTD_ALLOCATOR if the allocator is conformant and in use // (the or _HPACC_ part is a hack - the library seems to define _RWSTD_ALLOCATOR // on HP aCC systems even though the allocator is in fact broken): // #if !defined(_RWSTD_ALLOCATOR) || (defined(__HP_aCC) && __HP_aCC <= 33100) # define BOOST_NO_STD_ALLOCATOR #endif // // If we have a std::locale, we still may not have std::use_facet: // #if defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) && !defined(BOOST_NO_STD_LOCALE) # define BOOST_NO_STD_USE_FACET # define BOOST_HAS_TWO_ARG_USE_FACET #endif // // There's no std::distance prior to version 2, or without // partial specialization support: // #if (BOOST_RWSTD_VER < 0x020000) || defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) #define BOOST_NO_STD_DISTANCE #endif // // Some versions of the rogue wave library don't have assignable // OutputIterators: // #if BOOST_RWSTD_VER < 0x020100 # define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN #endif // // Disable BOOST_HAS_LONG_LONG when the library has no support for it. // #if !defined(_RWSTD_LONG_LONG) && defined(BOOST_HAS_LONG_LONG) # undef BOOST_HAS_LONG_LONG #endif // // check that on HP-UX, the proper RW library is used // #if defined(__HP_aCC) && !defined(_HP_NAMESPACE_STD) # error "Boost requires Standard RW library. Please compile and link with -AA" #endif // // Define macros specific to RW V2.2 on HP-UX // #if defined(__HP_aCC) && (BOOST_RWSTD_VER == 0x02020100) # ifndef __HP_TC1_MAKE_PAIR # define __HP_TC1_MAKE_PAIR # endif # ifndef _HP_INSTANTIATE_STD2_VL # define _HP_INSTANTIATE_STD2_VL # endif #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET clucene-core-2.3.3.4/src/ext/boost/config/stdlib/sgi.hpp000066400000000000000000000077051154025176300230000ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2003. // (C) Copyright Darin Adler 2001. // (C) Copyright Jens Maurer 2001 - 2003. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // generic SGI STL: #if !defined(__STL_CONFIG_H) # include # if !defined(__STL_CONFIG_H) # error "This is not the SGI STL!" # endif #endif // // No std::iterator traits without partial specialisation: // #if !defined(__STL_CLASS_PARTIAL_SPECIALIZATION) # define BOOST_NO_STD_ITERATOR_TRAITS #endif // // No std::stringstream with gcc < 3 // #if defined(__GNUC__) && (__GNUC__ < 3) && \ ((__GNUC_MINOR__ < 95) || (__GNUC_MINOR__ == 96)) && \ !defined(__STL_USE_NEW_IOSTREAMS) || \ defined(__APPLE_CC__) // Note that we only set this for GNU C++ prior to 2.95 since the // latest patches for that release do contain a minimal // If you are running a 2.95 release prior to 2.95.3 then this will need // setting, but there is no way to detect that automatically (other // than by running the configure script). // Also, the unofficial GNU C++ 2.96 included in RedHat 7.1 doesn't // have . # define BOOST_NO_STRINGSTREAM #endif // // Assume no std::locale without own iostreams (this may be an // incorrect assumption in some cases): // #if !defined(__SGI_STL_OWN_IOSTREAMS) && !defined(__STL_USE_NEW_IOSTREAMS) # define BOOST_NO_STD_LOCALE #endif // // Original native SGI streams have non-standard std::messages facet: // #if defined(__sgi) && (_COMPILER_VERSION <= 650) && !defined(__SGI_STL_OWN_IOSTREAMS) # define BOOST_NO_STD_LOCALE #endif // // SGI's new iostreams have missing "const" in messages<>::open // #if defined(__sgi) && (_COMPILER_VERSION <= 740) && defined(__STL_USE_NEW_IOSTREAMS) # define BOOST_NO_STD_MESSAGES #endif // // No template iterator constructors, or std::allocator // without member templates: // #if !defined(__STL_MEMBER_TEMPLATES) # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS # define BOOST_NO_STD_ALLOCATOR #endif // // We always have SGI style hash_set, hash_map, and slist: // #define BOOST_HAS_HASH #define BOOST_HAS_SLIST // // If this is GNU libstdc++2, then no and no std::wstring: // #if (defined(__GNUC__) && (__GNUC__ < 3)) # include # if defined(__BASTRING__) # define BOOST_NO_LIMITS // Note: will provide compile-time constants # undef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS # define BOOST_NO_STD_WSTRING # endif #endif // // There is no standard iterator unless we have namespace support: // #if !defined(__STL_USE_NAMESPACES) # define BOOST_NO_STD_ITERATOR #endif // // Intrinsic type_traits support. // The SGI STL has it's own __type_traits class, which // has intrinsic compiler support with SGI's compilers. // Whatever map SGI style type traits to boost equivalents: // #define BOOST_HAS_SGI_TYPE_TRAITS // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #define BOOST_STDLIB "SGI standard library" clucene-core-2.3.3.4/src/ext/boost/config/stdlib/stlport.hpp000066400000000000000000000170071154025176300237210ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2002. // (C) Copyright Darin Adler 2001. // (C) Copyright Jens Maurer 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. // STLPort standard library config: #if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) # include # if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) # error "This is not STLPort!" # endif #endif // // __STL_STATIC_CONST_INIT_BUG implies BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS // for versions prior to 4.1(beta) // #if (defined(__STL_STATIC_CONST_INIT_BUG) || defined(_STLP_STATIC_CONST_INIT_BUG)) && (__SGI_STL_PORT <= 0x400) # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS #endif // // If STLport thinks that there is no partial specialisation, then there is no // std::iterator traits: // #if !(defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || defined(__STL_CLASS_PARTIAL_SPECIALIZATION)) # define BOOST_NO_STD_ITERATOR_TRAITS #endif // // No new style iostreams on GCC without STLport's iostreams enabled: // #if (defined(__GNUC__) && (__GNUC__ < 3)) && !(defined(__SGI_STL_OWN_IOSTREAMS) || defined(_STLP_OWN_IOSTREAMS)) # define BOOST_NO_STRINGSTREAM #endif // // No new iostreams implies no std::locale, and no std::stringstream: // #if defined(__STL_NO_IOSTREAMS) || defined(__STL_NO_NEW_IOSTREAMS) || defined(_STLP_NO_IOSTREAMS) || defined(_STLP_NO_NEW_IOSTREAMS) # define BOOST_NO_STD_LOCALE # define BOOST_NO_STRINGSTREAM #endif // // If the streams are not native, and we have a "using ::x" compiler bug // then the io stream facets are not available in namespace std:: // #ifdef _STLPORT_VERSION # if !(_STLPORT_VERSION >= 0x500) && !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__) # define BOOST_NO_STD_LOCALE # endif #else # if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__) # define BOOST_NO_STD_LOCALE # endif #endif #if defined(_STLPORT_VERSION) && ((_STLPORT_VERSION < 0x500) || (_STLPORT_VERSION >= 0x520)) # define BOOST_NO_STD_UNORDERED #endif #if defined(_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x520) # define BOOST_HAS_TR1_UNORDERED_SET # define BOOST_HAS_TR1_UNORDERED_MAP #endif // // Without member template support enabled, their are no template // iterate constructors, and no std::allocator: // #if !(defined(__STL_MEMBER_TEMPLATES) || defined(_STLP_MEMBER_TEMPLATES)) # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS # define BOOST_NO_STD_ALLOCATOR #endif // // however we always have at least a partial allocator: // #define BOOST_HAS_PARTIAL_STD_ALLOCATOR #if !defined(_STLP_MEMBER_TEMPLATE_CLASSES) || defined(_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) # define BOOST_NO_STD_ALLOCATOR #endif #if defined(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) && defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) # define BOOST_NO_STD_ALLOCATOR #endif // // If STLport thinks there is no wchar_t at all, then we have to disable // the support for the relevant specilazations of std:: templates. // #if !defined(_STLP_HAS_WCHAR_T) && !defined(_STLP_WCHAR_T_IS_USHORT) # ifndef BOOST_NO_STD_WSTRING # define BOOST_NO_STD_WSTRING # endif # ifndef BOOST_NO_STD_WSTREAMBUF # define BOOST_NO_STD_WSTREAMBUF # endif #endif // // We always have SGI style hash_set, hash_map, and slist: // #ifndef _STLP_NO_EXTENSIONS #define BOOST_HAS_HASH #define BOOST_HAS_SLIST #endif // // STLport does a good job of importing names into namespace std::, // but doesn't always get them all, define BOOST_NO_STDC_NAMESPACE, since our // workaround does not conflict with STLports: // // // Harold Howe says: // Borland switched to STLport in BCB6. Defining BOOST_NO_STDC_NAMESPACE with // BCB6 does cause problems. If we detect C++ Builder, then don't define // BOOST_NO_STDC_NAMESPACE // #if !defined(__BORLANDC__) && !defined(__DMC__) // // If STLport is using it's own namespace, and the real names are in // the global namespace, then we duplicate STLport's using declarations // (by defining BOOST_NO_STDC_NAMESPACE), we do this because STLport doesn't // necessarily import all the names we need into namespace std:: // # if (defined(__STL_IMPORT_VENDOR_CSTD) \ || defined(__STL_USE_OWN_NAMESPACE) \ || defined(_STLP_IMPORT_VENDOR_CSTD) \ || defined(_STLP_USE_OWN_NAMESPACE)) \ && (defined(__STL_VENDOR_GLOBAL_CSTD) || defined (_STLP_VENDOR_GLOBAL_CSTD)) # define BOOST_NO_STDC_NAMESPACE # define BOOST_NO_EXCEPTION_STD_NAMESPACE # endif #elif defined(__BORLANDC__) && __BORLANDC__ < 0x560 // STLport doesn't import std::abs correctly: #include namespace std { using ::abs; } // and strcmp/strcpy don't get imported either ('cos they are macros) #include #ifdef strcpy # undef strcpy #endif #ifdef strcmp # undef strcmp #endif #ifdef _STLP_VENDOR_CSTD namespace std{ using _STLP_VENDOR_CSTD::strcmp; using _STLP_VENDOR_CSTD::strcpy; } #endif #endif // // std::use_facet may be non-standard, uses a class instead: // #if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) || defined(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS) # define BOOST_NO_STD_USE_FACET # define BOOST_HAS_STLP_USE_FACET #endif // // If STLport thinks there are no wide functions, etc. is not working; but // only if BOOST_NO_STDC_NAMESPACE is not defined (if it is then we do the import // into std:: ourselves). // #if defined(_STLP_NO_NATIVE_WIDE_FUNCTIONS) && !defined(BOOST_NO_STDC_NAMESPACE) # define BOOST_NO_CWCHAR # define BOOST_NO_CWCTYPE #endif // // If STLport for some reason was configured so that it thinks that wchar_t // is not an intrinsic type, then we have to disable the support for it as // well (we would be missing required specializations otherwise). // #if !defined( _STLP_HAS_WCHAR_T) || defined(_STLP_WCHAR_T_IS_USHORT) # undef BOOST_NO_INTRINSIC_WCHAR_T # define BOOST_NO_INTRINSIC_WCHAR_T #endif // // Borland ships a version of STLport with C++ Builder 6 that lacks // hashtables and the like: // #if defined(__BORLANDC__) && (__BORLANDC__ == 0x560) # undef BOOST_HAS_HASH #endif // // gcc-2.95.3/STLPort does not like the using declarations we use to get ADL with std::min/max // #if defined(__GNUC__) && (__GNUC__ < 3) # include // for std::min and std::max # define BOOST_USING_STD_MIN() ((void)0) # define BOOST_USING_STD_MAX() ((void)0) namespace boost { using std::min; using std::max; } #endif // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #define BOOST_STDLIB "STLPort standard library version " BOOST_STRINGIZE(__SGI_STL_PORT) clucene-core-2.3.3.4/src/ext/boost/config/stdlib/vacpp.hpp000066400000000000000000000025331154025176300233210ustar00rootroot00000000000000// (C) Copyright John Maddock 2001 - 2002. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. #if __IBMCPP__ <= 501 # define BOOST_NO_STD_ALLOCATOR #endif #define BOOST_HAS_MACRO_USE_FACET #define BOOST_NO_STD_MESSAGES // C++0x headers not yet implemented // # define BOOST_NO_0X_HDR_ARRAY # define BOOST_NO_0X_HDR_CHRONO # define BOOST_NO_0X_HDR_CODECVT # define BOOST_NO_0X_HDR_CONCEPTS # define BOOST_NO_0X_HDR_CONDITION_VARIABLE # define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS # define BOOST_NO_0X_HDR_FORWARD_LIST # define BOOST_NO_0X_HDR_FUTURE # define BOOST_NO_0X_HDR_INITIALIZER_LIST # define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS # define BOOST_NO_0X_HDR_MEMORY_CONCEPTS # define BOOST_NO_0X_HDR_MUTEX # define BOOST_NO_0X_HDR_RANDOM # define BOOST_NO_0X_HDR_RATIO # define BOOST_NO_0X_HDR_REGEX # define BOOST_NO_0X_HDR_SYSTEM_ERROR # define BOOST_NO_0X_HDR_THREAD # define BOOST_NO_0X_HDR_TUPLE # define BOOST_NO_0X_HDR_TYPE_TRAITS # define BOOST_NO_STD_UNORDERED // deprecated; see following # define BOOST_NO_0X_HDR_UNORDERED_MAP # define BOOST_NO_0X_HDR_UNORDERED_SET #define BOOST_STDLIB "Visual Age default standard library" clucene-core-2.3.3.4/src/ext/boost/config/suffix.hpp000066400000000000000000000450601154025176300222350ustar00rootroot00000000000000// Boost config.hpp configuration header file ------------------------------// // Copyright (c) 2001-2003 John Maddock // Copyright (c) 2001 Darin Adler // Copyright (c) 2001 Peter Dimov // Copyright (c) 2002 Bill Kempf // Copyright (c) 2002 Jens Maurer // Copyright (c) 2002-2003 David Abrahams // Copyright (c) 2003 Gennaro Prota // Copyright (c) 2003 Eric Friedman // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/ for most recent version. // Boost config.hpp policy and rationale documentation has been moved to // http://www.boost.org/libs/config/ // // This file is intended to be stable, and relatively unchanging. // It should contain boilerplate code only - no compiler specific // code unless it is unavoidable - no changes unless unavoidable. #ifndef BOOST_CONFIG_SUFFIX_HPP #define BOOST_CONFIG_SUFFIX_HPP // // look for long long by looking for the appropriate macros in . // Note that we use limits.h rather than climits for maximal portability, // remember that since these just declare a bunch of macros, there should be // no namespace issues from this. // #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG) \ && !defined(BOOST_MSVC) && !defined(__BORLANDC__) # include # if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX)) # define BOOST_HAS_LONG_LONG # else # define BOOST_NO_LONG_LONG # endif #endif // GCC 3.x will clean up all of those nasty macro definitions that // BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine // it under GCC 3.x. #if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS) # undef BOOST_NO_CTYPE_FUNCTIONS #endif // // Assume any extensions are in namespace std:: unless stated otherwise: // # ifndef BOOST_STD_EXTENSION_NAMESPACE # define BOOST_STD_EXTENSION_NAMESPACE std # endif // // If cv-qualified specializations are not allowed, then neither are cv-void ones: // # if defined(BOOST_NO_CV_SPECIALIZATIONS) \ && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS) # define BOOST_NO_CV_VOID_SPECIALIZATIONS # endif // // If there is no numeric_limits template, then it can't have any compile time // constants either! // # if defined(BOOST_NO_LIMITS) \ && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS # define BOOST_NO_MS_INT64_NUMERIC_LIMITS # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS # endif // // if there is no long long then there is no specialisation // for numeric_limits either: // #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS) # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS #endif // // if there is no __int64 then there is no specialisation // for numeric_limits<__int64> either: // #if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS) # define BOOST_NO_MS_INT64_NUMERIC_LIMITS #endif // // if member templates are supported then so is the // VC6 subset of member templates: // # if !defined(BOOST_NO_MEMBER_TEMPLATES) \ && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) # define BOOST_MSVC6_MEMBER_TEMPLATES # endif // // Without partial specialization, can't test for partial specialisation bugs: // # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) # define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG # endif // // Without partial specialization, we can't have array-type partial specialisations: // # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) # define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS # endif // // Without partial specialization, std::iterator_traits can't work: // # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ && !defined(BOOST_NO_STD_ITERATOR_TRAITS) # define BOOST_NO_STD_ITERATOR_TRAITS # endif // // Without partial specialization, partial // specialization with default args won't work either: // # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) # define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS # endif // // Without member template support, we can't have template constructors // in the standard library either: // # if defined(BOOST_NO_MEMBER_TEMPLATES) \ && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS # endif // // Without member template support, we can't have a conforming // std::allocator template either: // # if defined(BOOST_NO_MEMBER_TEMPLATES) \ && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ && !defined(BOOST_NO_STD_ALLOCATOR) # define BOOST_NO_STD_ALLOCATOR # endif // // without ADL support then using declarations will break ADL as well: // #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL #endif // // Without typeid support we have no dynamic RTTI either: // #if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI) # define BOOST_NO_RTTI #endif // // If we have a standard allocator, then we have a partial one as well: // #if !defined(BOOST_NO_STD_ALLOCATOR) # define BOOST_HAS_PARTIAL_STD_ALLOCATOR #endif // // We can't have a working std::use_facet if there is no std::locale: // # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET) # define BOOST_NO_STD_USE_FACET # endif // // We can't have a std::messages facet if there is no std::locale: // # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES) # define BOOST_NO_STD_MESSAGES # endif // // We can't have a working std::wstreambuf if there is no std::locale: // # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF) # define BOOST_NO_STD_WSTREAMBUF # endif // // We can't have a if there is no : // # if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE) # define BOOST_NO_CWCTYPE # endif // // We can't have a swprintf if there is no : // # if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF) # define BOOST_NO_SWPRINTF # endif // // If Win32 support is turned off, then we must turn off // threading support also, unless there is some other // thread API enabled: // #if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \ && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS) # define BOOST_DISABLE_THREADS #endif // // Turn on threading support if the compiler thinks that it's in // multithreaded mode. We put this here because there are only a // limited number of macros that identify this (if there's any missing // from here then add to the appropriate compiler section): // #if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \ || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \ && !defined(BOOST_HAS_THREADS) # define BOOST_HAS_THREADS #endif // // Turn threading support off if BOOST_DISABLE_THREADS is defined: // #if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS) # undef BOOST_HAS_THREADS #endif // // Turn threading support off if we don't recognise the threading API: // #if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\ && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\ && !defined(BOOST_HAS_MPTASKS) # undef BOOST_HAS_THREADS #endif // // Turn threading detail macros off if we don't (want to) use threading // #ifndef BOOST_HAS_THREADS # undef BOOST_HAS_PTHREADS # undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE # undef BOOST_HAS_PTHREAD_YIELD # undef BOOST_HAS_PTHREAD_DELAY_NP # undef BOOST_HAS_WINTHREADS # undef BOOST_HAS_BETHREADS # undef BOOST_HAS_MPTASKS #endif // // If the compiler claims to be C99 conformant, then it had better // have a : // # if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) # define BOOST_HAS_STDINT_H # ifndef BOOST_HAS_LOG1P # define BOOST_HAS_LOG1P # endif # ifndef BOOST_HAS_EXPM1 # define BOOST_HAS_EXPM1 # endif # endif // // Define BOOST_NO_SLIST and BOOST_NO_HASH if required. // Note that this is for backwards compatibility only. // # if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST) # define BOOST_NO_SLIST # endif # if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH) # define BOOST_NO_HASH # endif // // Set BOOST_SLIST_HEADER if not set already: // #if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER) # define BOOST_SLIST_HEADER #endif // // Set BOOST_HASH_SET_HEADER if not set already: // #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER) # define BOOST_HASH_SET_HEADER #endif // // Set BOOST_HASH_MAP_HEADER if not set already: // #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER) # define BOOST_HASH_MAP_HEADER #endif // // Set BOOST_NO_INITIALIZER_LISTS if there is no library support. // #if defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS) # define BOOST_NO_INITIALIZER_LISTS #endif // BOOST_HAS_ABI_HEADERS // This macro gets set if we have headers that fix the ABI, // and prevent ODR violations when linking to external libraries: #if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS) # define BOOST_HAS_ABI_HEADERS #endif #if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS) # undef BOOST_HAS_ABI_HEADERS #endif // BOOST_NO_STDC_NAMESPACE workaround --------------------------------------// // Because std::size_t usage is so common, even in boost headers which do not // otherwise use the C library, the workaround is included here so // that ugly workaround code need not appear in many other boost headers. // NOTE WELL: This is a workaround for non-conforming compilers; // must still be #included in the usual places so that inclusion // works as expected with standard conforming compilers. The resulting // double inclusion of is harmless. # ifdef BOOST_NO_STDC_NAMESPACE # include namespace std { using ::ptrdiff_t; using ::size_t; } # endif // Workaround for the unfortunate min/max macros defined by some platform headers #define BOOST_PREVENT_MACRO_SUBSTITUTION #ifndef BOOST_USING_STD_MIN # define BOOST_USING_STD_MIN() using std::min #endif #ifndef BOOST_USING_STD_MAX # define BOOST_USING_STD_MAX() using std::max #endif // BOOST_NO_STD_MIN_MAX workaround -----------------------------------------// # ifdef BOOST_NO_STD_MIN_MAX namespace std { template inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { return __b < __a ? __b : __a; } template inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { return __a < __b ? __b : __a; } } # endif // BOOST_STATIC_CONSTANT workaround --------------------------------------- // // On compilers which don't allow in-class initialization of static integral // constant members, we must use enums as a workaround if we want the constants // to be available at compile-time. This macro gives us a convenient way to // declare such constants. # ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment } # else # define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment # endif // BOOST_USE_FACET / HAS_FACET workaround ----------------------------------// // When the standard library does not have a conforming std::use_facet there // are various workarounds available, but they differ from library to library. // The same problem occurs with has_facet. // These macros provide a consistent way to access a locale's facets. // Usage: // replace // std::use_facet(loc); // with // BOOST_USE_FACET(Type, loc); // Note do not add a std:: prefix to the front of BOOST_USE_FACET! // Use for BOOST_HAS_FACET is analogous. #if defined(BOOST_NO_STD_USE_FACET) # ifdef BOOST_HAS_TWO_ARG_USE_FACET # define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast(0)) # define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast(0)) # elif defined(BOOST_HAS_MACRO_USE_FACET) # define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type) # define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type) # elif defined(BOOST_HAS_STLP_USE_FACET) # define BOOST_USE_FACET(Type, loc) (*std::_Use_facet(loc)) # define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) # endif #else # define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc) # define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) #endif // BOOST_NESTED_TEMPLATE workaround ------------------------------------------// // Member templates are supported by some compilers even though they can't use // the A::template member syntax, as a workaround replace: // // typedef typename A::template rebind binder; // // with: // // typedef typename A::BOOST_NESTED_TEMPLATE rebind binder; #ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD # define BOOST_NESTED_TEMPLATE template #else # define BOOST_NESTED_TEMPLATE #endif // BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------// // Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION // is defined, in which case it evaluates to return x; Use when you have a return // statement that can never be reached. #ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION # define BOOST_UNREACHABLE_RETURN(x) return x; #else # define BOOST_UNREACHABLE_RETURN(x) #endif // BOOST_DEDUCED_TYPENAME workaround ------------------------------------------// // // Some compilers don't support the use of `typename' for dependent // types in deduced contexts, e.g. // // template void f(T, typename T::type); // ^^^^^^^^ // Replace these declarations with: // // template void f(T, BOOST_DEDUCED_TYPENAME T::type); #ifndef BOOST_NO_DEDUCED_TYPENAME # define BOOST_DEDUCED_TYPENAME typename #else # define BOOST_DEDUCED_TYPENAME #endif #ifndef BOOST_NO_TYPENAME_WITH_CTOR # define BOOST_CTOR_TYPENAME typename #else # define BOOST_CTOR_TYPENAME #endif // long long workaround ------------------------------------------// // On gcc (and maybe other compilers?) long long is alway supported // but it's use may generate either warnings (with -ansi), or errors // (with -pedantic -ansi) unless it's use is prefixed by __extension__ // #if defined(BOOST_HAS_LONG_LONG) namespace boost{ # ifdef __GNUC__ __extension__ typedef long long long_long_type; __extension__ typedef unsigned long long ulong_long_type; # else typedef long long long_long_type; typedef unsigned long long ulong_long_type; # endif } #endif // BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------// // // Some compilers have problems with function templates whose template // parameters don't appear in the function parameter list (basically // they just link one instantiation of the template in the final // executable). These macros provide a uniform way to cope with the // problem with no effects on the calling syntax. // Example: // // #include // #include // #include // // template // void f() { std::cout << n << ' '; } // // template // void g() { std::cout << typeid(T).name() << ' '; } // // int main() { // f<1>(); // f<2>(); // // g(); // g(); // } // // With VC++ 6.0 the output is: // // 2 2 double double // // To fix it, write // // template // void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... } // // template // void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... } // #if defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS # include "boost/type.hpp" # include "boost/non_type.hpp" # define BOOST_EXPLICIT_TEMPLATE_TYPE(t) boost::type* = 0 # define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) boost::type* # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) boost::non_type* = 0 # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) boost::non_type* # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) \ , BOOST_EXPLICIT_TEMPLATE_TYPE(t) # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) \ , BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) \ , BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) \ , BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) #else // no workaround needed: expand to nothing # define BOOST_EXPLICIT_TEMPLATE_TYPE(t) # define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) #endif // defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS // ---------------------------------------------------------------------------// // // Helper macro BOOST_STRINGIZE: // Converts the parameter X to a string after macro replacement // on X has been performed. // #define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) #define BOOST_DO_STRINGIZE(X) #X // // Helper macro BOOST_JOIN: // The following piece of macro magic joins the two // arguments together, even when one of the arguments is // itself a macro (see 16.3.1 in C++ standard). The key // is that macro expansion of macro arguments does not // occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN. // #define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y ) #define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y) #define BOOST_DO_JOIN2( X, Y ) X##Y // // Set some default values for compiler/library/platform names. // These are for debugging config setup only: // # ifndef BOOST_COMPILER # define BOOST_COMPILER "Unknown ISO C++ Compiler" # endif # ifndef BOOST_STDLIB # define BOOST_STDLIB "Unknown ISO standard library" # endif # ifndef BOOST_PLATFORM # if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \ || defined(_POSIX_SOURCE) # define BOOST_PLATFORM "Generic Unix" # else # define BOOST_PLATFORM "Unknown" # endif # endif #endif clucene-core-2.3.3.4/src/ext/boost/config/user.hpp000066400000000000000000000120451154025176300217040ustar00rootroot00000000000000// boost/config/user.hpp ---------------------------------------------------// // (C) Copyright John Maddock 2001. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // Do not check in modified versions of this file, // This file may be customized by the end user, but not by boost. // // Use this file to define a site and compiler specific // configuration policy: // // define this to locate a compiler config file: // #define BOOST_COMPILER_CONFIG // define this to locate a stdlib config file: // #define BOOST_STDLIB_CONFIG // define this to locate a platform config file: // #define BOOST_PLATFORM_CONFIG // define this to disable compiler config, // use if your compiler config has nothing to set: // #define BOOST_NO_COMPILER_CONFIG // define this to disable stdlib config, // use if your stdlib config has nothing to set: // #define BOOST_NO_STDLIB_CONFIG // define this to disable platform config, // use if your platform config has nothing to set: // #define BOOST_NO_PLATFORM_CONFIG // define this to disable all config options, // excluding the user config. Use if your // setup is fully ISO compliant, and has no // useful extensions, or for autoconf generated // setups: // #define BOOST_NO_CONFIG // define this to make the config "optimistic" // about unknown compiler versions. Normally // unknown compiler versions are assumed to have // all the defects of the last known version, however // setting this flag, causes the config to assume // that unknown compiler versions are fully conformant // with the standard: // #define BOOST_STRICT_CONFIG // define this to cause the config to halt compilation // with an #error if it encounters anything unknown -- // either an unknown compiler version or an unknown // compiler/platform/library: // #define BOOST_ASSERT_CONFIG // define if you want to disable threading support, even // when available: // #define BOOST_DISABLE_THREADS // define when you want to disable Win32 specific features // even when available: // #define BOOST_DISABLE_WIN32 // BOOST_DISABLE_ABI_HEADERS: Stops boost headers from including any // prefix/suffix headers that normally control things like struct // packing and alignment. // #define BOOST_DISABLE_ABI_HEADERS // BOOST_ABI_PREFIX: A prefix header to include in place of whatever // boost.config would normally select, any replacement should set up // struct packing and alignment options as required. // #define BOOST_ABI_PREFIX my-header-name // BOOST_ABI_SUFFIX: A suffix header to include in place of whatever // boost.config would normally select, any replacement should undo // the effects of the prefix header. // #define BOOST_ABI_SUFFIX my-header-name // BOOST_ALL_DYN_LINK: Forces all libraries that have separate source, // to be linked as dll's rather than static libraries on Microsoft Windows // (this macro is used to turn on __declspec(dllimport) modifiers, so that // the compiler knows which symbols to look for in a dll rather than in a // static library). Note that there may be some libraries that can only // be statically linked (Boost.Test for example) and others which may only // be dynamically linked (Boost.Threads for example), in these cases this // macro has no effect. // #define BOOST_ALL_DYN_LINK // BOOST_WHATEVER_DYN_LINK: Forces library "whatever" to be linked as a dll // rather than a static library on Microsoft Windows: replace the WHATEVER // part of the macro name with the name of the library that you want to // dynamically link to, for example use BOOST_DATE_TIME_DYN_LINK or // BOOST_REGEX_DYN_LINK etc (this macro is used to turn on __declspec(dllimport) // modifiers, so that the compiler knows which symbols to look for in a dll // rather than in a static library). // Note that there may be some libraries that can only be statically linked // (Boost.Test for example) and others which may only be dynamically linked // (Boost.Threads for example), in these cases this macro is unsupported. // #define BOOST_WHATEVER_DYN_LINK // BOOST_ALL_NO_LIB: Tells the config system not to automatically select // which libraries to link against. // Normally if a compiler supports #pragma lib, then the correct library // build variant will be automatically selected and linked against, // simply by the act of including one of that library's headers. // This macro turns that feature off. // #define BOOST_ALL_NO_LIB // BOOST_WHATEVER_NO_LIB: Tells the config system not to automatically // select which library to link against for library "whatever", // replace WHATEVER in the macro name with the name of the library; // for example BOOST_DATE_TIME_NO_LIB or BOOST_REGEX_NO_LIB. // Normally if a compiler supports #pragma lib, then the correct library // build variant will be automatically selected and linked against, simply // by the act of including one of that library's headers. This macro turns // that feature off. // #define BOOST_WHATEVER_NO_LIB clucene-core-2.3.3.4/src/ext/boost/config/warning_disable.hpp000066400000000000000000000034341154025176300240600ustar00rootroot00000000000000// Copyright John Maddock 2008 // Use, modification, and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // This file exists to turn off some overly-pedantic warning emitted // by certain compilers. You should include this header only in: // // * A test case, before any other headers, or, // * A library source file before any other headers. // // IT SHOULD NOT BE INCLUDED BY ANY BOOST HEADER. // // YOU SHOULD NOT INCLUDE IT IF YOU CAN REASONABLY FIX THE WARNING. // // The only warnings disabled here are those that are: // // * Quite unreasonably pedantic. // * Generally only emitted by a single compiler. // * Can't easily be fixed: for example if the vendors own std lib // code emits these warnings! // // Note that THIS HEADER MUST NOT INCLUDE ANY OTHER HEADERS: // not even std library ones! Doing so may turn the warning // off too late to be of any use. For example the VC++ C4996 // warning can be omitted from if that header is included // before or by this one :-( // #ifndef BOOST_CONFIG_WARNING_DISABLE_HPP #define BOOST_CONFIG_WARNING_DISABLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1400) // Error 'function': was declared deprecated // http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx // This error is emitted when you use some perfectly conforming // std lib functions in a perfectly correct way, and also by // some of Microsoft's own std lib code ! # pragma warning(disable:4996) #endif #if defined(__INTEL_COMPILER) || defined(__ICL) // As above: gives warning when a "deprecated" // std library function is encountered. # pragma warning(disable:1786) #endif #endif // BOOST_CONFIG_WARNING_DISABLE_HPP clucene-core-2.3.3.4/src/ext/boost/current_function.hpp000066400000000000000000000027221154025176300230510ustar00rootroot00000000000000#ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED #define BOOST_CURRENT_FUNCTION_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/current_function.hpp - BOOST_CURRENT_FUNCTION // // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // http://www.boost.org/libs/utility/current_function.html // namespace boost { namespace detail { inline void current_function_helper() { #if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) # define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__ #elif defined(__DMC__) && (__DMC__ >= 0x810) # define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__ #elif defined(__FUNCSIG__) # define BOOST_CURRENT_FUNCTION __FUNCSIG__ #elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500)) # define BOOST_CURRENT_FUNCTION __FUNCTION__ #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550) # define BOOST_CURRENT_FUNCTION __FUNC__ #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) # define BOOST_CURRENT_FUNCTION __func__ #else # define BOOST_CURRENT_FUNCTION "(unknown)" #endif } } // namespace detail } // namespace boost #endif // #ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/000077500000000000000000000000001154025176300202105ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/detail/algorithm.hpp000066400000000000000000000147741154025176300227240ustar00rootroot00000000000000// (C) Copyright Jeremy Siek 2001. // Distributed under the Boost Software License, Version 1.0. (See accompany- // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * * Copyright (c) 1996 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. */ #ifndef BOOST_ALGORITHM_HPP # define BOOST_ALGORITHM_HPP # include // Algorithms on sequences // // The functions in this file have not yet gone through formal // review, and are subject to change. This is a work in progress. // They have been checked into the detail directory because // there are some graph algorithms that use these functions. #include #include namespace boost { template Iter1 begin(const std::pair& p) { return p.first; } template Iter2 end(const std::pair& p) { return p.second; } template typename boost::detail::iterator_traits::difference_type size(const std::pair& p) { return std::distance(p.first, p.second); } #if 0 // These seem to interfere with the std::pair overloads :( template typename Container::iterator begin(Container& c) { return c.begin(); } template typename Container::const_iterator begin(const Container& c) { return c.begin(); } template typename Container::iterator end(Container& c) { return c.end(); } template typename Container::const_iterator end(const Container& c) { return c.end(); } template typename Container::size_type size(const Container& c) { return c.size(); } #else template typename std::vector::iterator begin(std::vector& c) { return c.begin(); } template typename std::vector::const_iterator begin(const std::vector& c) { return c.begin(); } template typename std::vector::iterator end(std::vector& c) { return c.end(); } template typename std::vector::const_iterator end(const std::vector& c) { return c.end(); } template typename std::vector::size_type size(const std::vector& c) { return c.size(); } #endif template void iota(ForwardIterator first, ForwardIterator last, T value) { for (; first != last; ++first, ++value) *first = value; } template void iota(Container& c, const T& value) { iota(begin(c), end(c), value); } // Also do version with 2nd container? template OutIter copy(const Container& c, OutIter result) { return std::copy(begin(c), end(c), result); } template bool equal(const Container1& c1, const Container2& c2) { if (size(c1) != size(c2)) return false; return std::equal(begin(c1), end(c1), begin(c2)); } template void sort(Container& c) { std::sort(begin(c), end(c)); } template void sort(Container& c, const Predicate& p) { std::sort(begin(c), end(c), p); } template void stable_sort(Container& c) { std::stable_sort(begin(c), end(c)); } template void stable_sort(Container& c, const Predicate& p) { std::stable_sort(begin(c), end(c), p); } template bool any_if(InputIterator first, InputIterator last, Predicate p) { return std::find_if(first, last, p) != last; } template bool any_if(const Container& c, Predicate p) { return any_if(begin(c), end(c), p); } template bool container_contains(InputIterator first, InputIterator last, T value) { return std::find(first, last, value) != last; } template bool container_contains(const Container& c, const T& value) { return container_contains(begin(c), end(c), value); } template std::size_t count(const Container& c, const T& value) { return std::count(begin(c), end(c), value); } template std::size_t count_if(const Container& c, Predicate p) { return std::count_if(begin(c), end(c), p); } template bool is_sorted(ForwardIterator first, ForwardIterator last) { if (first == last) return true; ForwardIterator next = first; for (++next; next != last; first = next, ++next) { if (*next < *first) return false; } return true; } template bool is_sorted(ForwardIterator first, ForwardIterator last, StrictWeakOrdering comp) { if (first == last) return true; ForwardIterator next = first; for (++next; next != last; first = next, ++next) { if (comp(*next, *first)) return false; } return true; } template bool is_sorted(const Container& c) { return is_sorted(begin(c), end(c)); } template bool is_sorted(const Container& c, StrictWeakOrdering comp) { return is_sorted(begin(c), end(c), comp); } } // namespace boost #endif // BOOST_ALGORITHM_HPP clucene-core-2.3.3.4/src/ext/boost/detail/allocator_utilities.hpp000066400000000000000000000121401154025176300247720ustar00rootroot00000000000000/* Copyright 2003-2009 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See Boost website at http://www.boost.org/ */ #ifndef BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP #define BOOST_DETAIL_ALLOCATOR_UTILITIES_HPP #include /* keep it first to prevent nasty warns in MSVC */ #include #include #include #include #include #include #include namespace boost{ namespace detail{ /* Allocator adaption layer. Some stdlibs provide allocators without rebind * and template ctors. These facilities are simulated with the external * template class rebind_to and the aid of partial_std_allocator_wrapper. */ namespace allocator{ /* partial_std_allocator_wrapper inherits the functionality of a std * allocator while providing a templatized ctor and other bits missing * in some stdlib implementation or another. */ template class partial_std_allocator_wrapper:public std::allocator { public: /* Oddly enough, STLport does not define std::allocator::value_type * when configured to work without partial template specialization. * No harm in supplying the definition here unconditionally. */ typedef Type value_type; partial_std_allocator_wrapper(){}; template partial_std_allocator_wrapper(const partial_std_allocator_wrapper&){} partial_std_allocator_wrapper(const std::allocator& x): std::allocator(x) { }; #if defined(BOOST_DINKUMWARE_STDLIB) /* Dinkumware guys didn't provide a means to call allocate() without * supplying a hint, in disagreement with the standard. */ Type* allocate(std::size_t n,const void* hint=0) { std::allocator& a=*this; return a.allocate(n,hint); } #endif }; /* Detects whether a given allocator belongs to a defective stdlib not * having the required member templates. * Note that it does not suffice to check the Boost.Config stdlib * macros, as the user might have passed a custom, compliant allocator. * The checks also considers partial_std_allocator_wrapper to be * a standard defective allocator. */ #if defined(BOOST_NO_STD_ALLOCATOR)&&\ (defined(BOOST_HAS_PARTIAL_STD_ALLOCATOR)||defined(BOOST_DINKUMWARE_STDLIB)) template struct is_partial_std_allocator { BOOST_STATIC_CONSTANT(bool, value= (is_same< std::allocator, Allocator >::value)|| (is_same< partial_std_allocator_wrapper< BOOST_DEDUCED_TYPENAME Allocator::value_type>, Allocator >::value)); }; #else template struct is_partial_std_allocator { BOOST_STATIC_CONSTANT(bool,value=false); }; #endif /* rebind operations for defective std allocators */ template struct partial_std_allocator_rebind_to { typedef partial_std_allocator_wrapper type; }; /* rebind operation in all other cases */ #if BOOST_WORKAROUND(BOOST_MSVC,<1300) /* Workaround for a problem in MSVC with dependent template typedefs * when doing rebinding of allocators. * Modeled after (thanks, Aleksey!) */ template struct rebinder { template struct fake_allocator:Allocator{}; template<> struct fake_allocator { template struct rebind{}; }; template struct result: fake_allocator::value>:: template rebind { }; }; #else template struct rebinder { template struct result { typedef typename Allocator::BOOST_NESTED_TEMPLATE rebind::other other; }; }; #endif template struct compliant_allocator_rebind_to { typedef typename rebinder:: BOOST_NESTED_TEMPLATE result::other type; }; /* rebind front-end */ template struct rebind_to: mpl::eval_if_c< is_partial_std_allocator::value, partial_std_allocator_rebind_to, compliant_allocator_rebind_to > { }; /* allocator-independent versions of construct and destroy */ template void construct(void* p,const Type& t) { new (p) Type(t); } #if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500)) /* MSVC++ issues spurious warnings about unreferencend formal parameters * in destroy when Type is a class with trivial dtor. */ #pragma warning(push) #pragma warning(disable:4100) #endif template void destroy(const Type* p) { #if BOOST_WORKAROUND(__SUNPRO_CC,BOOST_TESTED_AT(0x590)) const_cast(p)->~Type(); #else p->~Type(); #endif } #if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500)) #pragma warning(pop) #endif } /* namespace boost::detail::allocator */ } /* namespace boost::detail */ } /* namespace boost */ #endif clucene-core-2.3.3.4/src/ext/boost/detail/atomic_count.hpp000066400000000000000000000011521154025176300234040ustar00rootroot00000000000000#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED #define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/atomic_count.hpp - thread/SMP safe reference counter // // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/binary_search.hpp000066400000000000000000000143261154025176300235400ustar00rootroot00000000000000// Copyright (c) 2000 David Abrahams. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Copyright (c) 1994 // Hewlett-Packard Company // // Permission to use, copy, modify, distribute and sell this software // and its documentation for any purpose is hereby granted without fee, // provided that the above copyright notice appear in all copies and // that both that copyright notice and this permission notice appear // in supporting documentation. Hewlett-Packard Company makes no // representations about the suitability of this software for any // purpose. It is provided "as is" without express or implied warranty. // // Copyright (c) 1996 // Silicon Graphics Computer Systems, Inc. // // Permission to use, copy, modify, distribute and sell this software // and its documentation for any purpose is hereby granted without fee, // provided that the above copyright notice appear in all copies and // that both that copyright notice and this permission notice appear // in supporting documentation. Silicon Graphics makes no // representations about the suitability of this software for any // purpose. It is provided "as is" without express or implied warranty. // #ifndef BINARY_SEARCH_DWA_122600_H_ # define BINARY_SEARCH_DWA_122600_H_ # include # include namespace boost { namespace detail { template ForwardIter lower_bound(ForwardIter first, ForwardIter last, const Tp& val) { typedef detail::iterator_traits traits; typename traits::difference_type len = boost::detail::distance(first, last); typename traits::difference_type half; ForwardIter middle; while (len > 0) { half = len >> 1; middle = first; std::advance(middle, half); if (*middle < val) { first = middle; ++first; len = len - half - 1; } else len = half; } return first; } template ForwardIter lower_bound(ForwardIter first, ForwardIter last, const Tp& val, Compare comp) { typedef detail::iterator_traits traits; typename traits::difference_type len = boost::detail::distance(first, last); typename traits::difference_type half; ForwardIter middle; while (len > 0) { half = len >> 1; middle = first; std::advance(middle, half); if (comp(*middle, val)) { first = middle; ++first; len = len - half - 1; } else len = half; } return first; } template ForwardIter upper_bound(ForwardIter first, ForwardIter last, const Tp& val) { typedef detail::iterator_traits traits; typename traits::difference_type len = boost::detail::distance(first, last); typename traits::difference_type half; ForwardIter middle; while (len > 0) { half = len >> 1; middle = first; std::advance(middle, half); if (val < *middle) len = half; else { first = middle; ++first; len = len - half - 1; } } return first; } template ForwardIter upper_bound(ForwardIter first, ForwardIter last, const Tp& val, Compare comp) { typedef detail::iterator_traits traits; typename traits::difference_type len = boost::detail::distance(first, last); typename traits::difference_type half; ForwardIter middle; while (len > 0) { half = len >> 1; middle = first; std::advance(middle, half); if (comp(val, *middle)) len = half; else { first = middle; ++first; len = len - half - 1; } } return first; } template std::pair equal_range(ForwardIter first, ForwardIter last, const Tp& val) { typedef detail::iterator_traits traits; typename traits::difference_type len = boost::detail::distance(first, last); typename traits::difference_type half; ForwardIter middle, left, right; while (len > 0) { half = len >> 1; middle = first; std::advance(middle, half); if (*middle < val) { first = middle; ++first; len = len - half - 1; } else if (val < *middle) len = half; else { left = boost::detail::lower_bound(first, middle, val); std::advance(first, len); right = boost::detail::upper_bound(++middle, first, val); return std::pair(left, right); } } return std::pair(first, first); } template std::pair equal_range(ForwardIter first, ForwardIter last, const Tp& val, Compare comp) { typedef detail::iterator_traits traits; typename traits::difference_type len = boost::detail::distance(first, last); typename traits::difference_type half; ForwardIter middle, left, right; while (len > 0) { half = len >> 1; middle = first; std::advance(middle, half); if (comp(*middle, val)) { first = middle; ++first; len = len - half - 1; } else if (comp(val, *middle)) len = half; else { left = boost::detail::lower_bound(first, middle, val, comp); std::advance(first, len); right = boost::detail::upper_bound(++middle, first, val, comp); return std::pair(left, right); } } return std::pair(first, first); } template bool binary_search(ForwardIter first, ForwardIter last, const Tp& val) { ForwardIter i = boost::detail::lower_bound(first, last, val); return i != last && !(val < *i); } template bool binary_search(ForwardIter first, ForwardIter last, const Tp& val, Compare comp) { ForwardIter i = boost::detail::lower_bound(first, last, val, comp); return i != last && !comp(val, *i); } }} // namespace boost::detail #endif // BINARY_SEARCH_DWA_122600_H_ clucene-core-2.3.3.4/src/ext/boost/detail/call_traits.hpp000066400000000000000000000077221154025176300232320ustar00rootroot00000000000000// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // // See http://www.boost.org/libs/utility for most recent version including documentation. // call_traits: defines typedefs for function usage // (see libs/utility/call_traits.htm) /* Release notes: 23rd July 2000: Fixed array specialization. (JM) Added Borland specific fixes for reference types (issue raised by Steve Cleary). */ #ifndef BOOST_DETAIL_CALL_TRAITS_HPP #define BOOST_DETAIL_CALL_TRAITS_HPP #ifndef BOOST_CONFIG_HPP #include #endif #include #include #include #include namespace boost{ namespace detail{ template struct ct_imp2 { typedef const T& param_type; }; template struct ct_imp2 { typedef const T param_type; }; template struct ct_imp { typedef const T& param_type; }; template struct ct_imp { typedef typename ct_imp2::param_type param_type; }; template struct ct_imp { typedef const T param_type; }; } template struct call_traits { public: typedef T value_type; typedef T& reference; typedef const T& const_reference; // // C++ Builder workaround: we should be able to define a compile time // constant and pass that as a single template parameter to ct_imp, // however compiler bugs prevent this - instead pass three bool's to // ct_imp and add an extra partial specialisation // of ct_imp to handle the logic. (JM) typedef typename boost::detail::ct_imp< T, ::boost::is_pointer::value, ::boost::is_arithmetic::value >::param_type param_type; }; template struct call_traits { typedef T& value_type; typedef T& reference; typedef const T& const_reference; typedef T& param_type; // hh removed const }; #if BOOST_WORKAROUND( __BORLANDC__, < 0x5A0 ) // these are illegal specialisations; cv-qualifies applied to // references have no effect according to [8.3.2p1], // C++ Builder requires them though as it treats cv-qualified // references as distinct types... template struct call_traits { typedef T& value_type; typedef T& reference; typedef const T& const_reference; typedef T& param_type; // hh removed const }; template struct call_traits { typedef T& value_type; typedef T& reference; typedef const T& const_reference; typedef T& param_type; // hh removed const }; template struct call_traits { typedef T& value_type; typedef T& reference; typedef const T& const_reference; typedef T& param_type; // hh removed const }; template struct call_traits< T * > { typedef T * value_type; typedef T * & reference; typedef T * const & const_reference; typedef T * const param_type; // hh removed const }; #endif #if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) template struct call_traits { private: typedef T array_type[N]; public: // degrades array to pointer: typedef const T* value_type; typedef array_type& reference; typedef const array_type& const_reference; typedef const T* const param_type; }; template struct call_traits { private: typedef const T array_type[N]; public: // degrades array to pointer: typedef const T* value_type; typedef array_type& reference; typedef const array_type& const_reference; typedef const T* const param_type; }; #endif } #endif // BOOST_DETAIL_CALL_TRAITS_HPP clucene-core-2.3.3.4/src/ext/boost/detail/catch_exceptions.hpp000066400000000000000000000132101154025176300242410ustar00rootroot00000000000000// boost/catch_exceptions.hpp -----------------------------------------------// // Copyright Beman Dawes 1995-2001. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for documentation. // Revision History // 13 Jun 01 report_exception() made inline. (John Maddock, Jesse Jones) // 26 Feb 01 Numerous changes suggested during formal review. (Beman) // 25 Jan 01 catch_exceptions.hpp code factored out of cpp_main.cpp. // 22 Jan 01 Remove test_tools dependencies to reduce coupling. // 5 Nov 00 Initial boost version (Beman Dawes) #ifndef BOOST_CATCH_EXCEPTIONS_HPP #define BOOST_CATCH_EXCEPTIONS_HPP // header dependencies are deliberately restricted to the standard library // to reduce coupling to other boost libraries. #include // for string #include // for bad_alloc #include // for bad_cast, bad_typeid #include // for exception, bad_exception #include // for std exception hierarchy #include // for exit codes # if __GNUC__ != 2 || __GNUC_MINOR__ > 96 # include // for ostream # else # include // workaround GNU missing ostream header # endif # if defined(__BORLANDC__) && (__BORLANDC__ <= 0x0551) # define BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT # endif #if defined(MPW_CPLUS) && (MPW_CPLUS <= 0x890) # define BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT namespace std { class bad_typeid { }; } # endif namespace boost { namespace detail { // A separate reporting function was requested during formal review. inline void report_exception( std::ostream & os, const char * name, const char * info ) { os << "\n** uncaught exception: " << name << " " << info << std::endl; } } // catch_exceptions ------------------------------------------------------// template< class Generator > // Generator is function object returning int int catch_exceptions( Generator function_object, std::ostream & out, std::ostream & err ) { int result = 0; // quiet compiler warnings bool exception_thrown = true; // avoid setting result for each excptn type #ifndef BOOST_NO_EXCEPTIONS try { #endif result = function_object(); exception_thrown = false; #ifndef BOOST_NO_EXCEPTIONS } // As a result of hard experience with strangely interleaved output // under some compilers, there is a lot of use of endl in the code below // where a simple '\n' might appear to do. // The rules for catch & arguments are a bit different from function // arguments (ISO 15.3 paragraphs 18 & 19). Apparently const isn't // required, but it doesn't hurt and some programmers ask for it. catch ( const char * ex ) { detail::report_exception( out, "", ex ); } catch ( const std::string & ex ) { detail::report_exception( out, "", ex.c_str() ); } // std:: exceptions catch ( const std::bad_alloc & ex ) { detail::report_exception( out, "std::bad_alloc:", ex.what() ); } # ifndef BOOST_BUILT_IN_EXCEPTIONS_MISSING_WHAT catch ( const std::bad_cast & ex ) { detail::report_exception( out, "std::bad_cast:", ex.what() ); } catch ( const std::bad_typeid & ex ) { detail::report_exception( out, "std::bad_typeid:", ex.what() ); } # else catch ( const std::bad_cast & ) { detail::report_exception( out, "std::bad_cast", "" ); } catch ( const std::bad_typeid & ) { detail::report_exception( out, "std::bad_typeid", "" ); } # endif catch ( const std::bad_exception & ex ) { detail::report_exception( out, "std::bad_exception:", ex.what() ); } catch ( const std::domain_error & ex ) { detail::report_exception( out, "std::domain_error:", ex.what() ); } catch ( const std::invalid_argument & ex ) { detail::report_exception( out, "std::invalid_argument:", ex.what() ); } catch ( const std::length_error & ex ) { detail::report_exception( out, "std::length_error:", ex.what() ); } catch ( const std::out_of_range & ex ) { detail::report_exception( out, "std::out_of_range:", ex.what() ); } catch ( const std::range_error & ex ) { detail::report_exception( out, "std::range_error:", ex.what() ); } catch ( const std::overflow_error & ex ) { detail::report_exception( out, "std::overflow_error:", ex.what() ); } catch ( const std::underflow_error & ex ) { detail::report_exception( out, "std::underflow_error:", ex.what() ); } catch ( const std::logic_error & ex ) { detail::report_exception( out, "std::logic_error:", ex.what() ); } catch ( const std::runtime_error & ex ) { detail::report_exception( out, "std::runtime_error:", ex.what() ); } catch ( const std::exception & ex ) { detail::report_exception( out, "std::exception:", ex.what() ); } catch ( ... ) { detail::report_exception( out, "unknown exception", "" ); } #endif // BOOST_NO_EXCEPTIONS if ( exception_thrown ) result = boost::exit_exception_failure; if ( result != 0 && result != exit_success ) { out << std::endl << "**** returning with error code " << result << std::endl; err << "********** errors detected; see stdout for details ***********" << std::endl; } #if !defined(BOOST_NO_CPP_MAIN_SUCCESS_MESSAGE) else { out << std::flush << "no errors detected" << std::endl; } #endif return result; } // catch_exceptions } // boost #endif // BOOST_CATCH_EXCEPTIONS_HPP clucene-core-2.3.3.4/src/ext/boost/detail/compressed_pair.hpp000066400000000000000000000402511154025176300241020ustar00rootroot00000000000000// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // // See http://www.boost.org/libs/utility for most recent version including documentation. // compressed_pair: pair that "compresses" empty members // (see libs/utility/compressed_pair.htm) // // JM changes 25 Jan 2004: // For the case where T1 == T2 and both are empty, then first() and second() // should return different objects. // JM changes 25 Jan 2000: // Removed default arguments from compressed_pair_switch to get // C++ Builder 4 to accept them // rewriten swap to get gcc and C++ builder to compile. // added partial specialisations for case T1 == T2 to avoid duplicate constructor defs. #ifndef BOOST_DETAIL_COMPRESSED_PAIR_HPP #define BOOST_DETAIL_COMPRESSED_PAIR_HPP #include #include #include #include #include #ifdef BOOST_MSVC # pragma warning(push) # pragma warning(disable:4512) #endif namespace boost { template class compressed_pair; // compressed_pair namespace details { // JM altered 26 Jan 2000: template struct compressed_pair_switch; template struct compressed_pair_switch {static const int value = 0;}; template struct compressed_pair_switch {static const int value = 3;}; template struct compressed_pair_switch {static const int value = 1;}; template struct compressed_pair_switch {static const int value = 2;}; template struct compressed_pair_switch {static const int value = 4;}; template struct compressed_pair_switch {static const int value = 5;}; template class compressed_pair_imp; #ifdef __GNUC__ // workaround for GCC (JM): using std::swap; #endif // // can't call unqualified swap from within classname::swap // as Koenig lookup rules will find only the classname::swap // member function not the global declaration, so use cp_swap // as a forwarding function (JM): template inline void cp_swap(T& t1, T& t2) { #ifndef __GNUC__ using std::swap; #endif swap(t1, t2); } // 0 derive from neither template class compressed_pair_imp { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_imp() {} compressed_pair_imp(first_param_type x, second_param_type y) : first_(x), second_(y) {} compressed_pair_imp(first_param_type x) : first_(x) {} compressed_pair_imp(second_param_type y) : second_(y) {} first_reference first() {return first_;} first_const_reference first() const {return first_;} second_reference second() {return second_;} second_const_reference second() const {return second_;} void swap(::boost::compressed_pair& y) { cp_swap(first_, y.first()); cp_swap(second_, y.second()); } private: first_type first_; second_type second_; }; // 1 derive from T1 template class compressed_pair_imp : protected ::boost::remove_cv::type { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_imp() {} compressed_pair_imp(first_param_type x, second_param_type y) : first_type(x), second_(y) {} compressed_pair_imp(first_param_type x) : first_type(x) {} compressed_pair_imp(second_param_type y) : second_(y) {} first_reference first() {return *this;} first_const_reference first() const {return *this;} second_reference second() {return second_;} second_const_reference second() const {return second_;} void swap(::boost::compressed_pair& y) { // no need to swap empty base class: cp_swap(second_, y.second()); } private: second_type second_; }; // 2 derive from T2 template class compressed_pair_imp : protected ::boost::remove_cv::type { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_imp() {} compressed_pair_imp(first_param_type x, second_param_type y) : second_type(y), first_(x) {} compressed_pair_imp(first_param_type x) : first_(x) {} compressed_pair_imp(second_param_type y) : second_type(y) {} first_reference first() {return first_;} first_const_reference first() const {return first_;} second_reference second() {return *this;} second_const_reference second() const {return *this;} void swap(::boost::compressed_pair& y) { // no need to swap empty base class: cp_swap(first_, y.first()); } private: first_type first_; }; // 3 derive from T1 and T2 template class compressed_pair_imp : protected ::boost::remove_cv::type, protected ::boost::remove_cv::type { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_imp() {} compressed_pair_imp(first_param_type x, second_param_type y) : first_type(x), second_type(y) {} compressed_pair_imp(first_param_type x) : first_type(x) {} compressed_pair_imp(second_param_type y) : second_type(y) {} first_reference first() {return *this;} first_const_reference first() const {return *this;} second_reference second() {return *this;} second_const_reference second() const {return *this;} // // no need to swap empty bases: void swap(::boost::compressed_pair&) {} }; // JM // 4 T1 == T2, T1 and T2 both empty // Originally this did not store an instance of T2 at all // but that led to problems beause it meant &x.first() == &x.second() // which is not true for any other kind of pair, so now we store an instance // of T2 just in case the user is relying on first() and second() returning // different objects (albeit both empty). template class compressed_pair_imp : protected ::boost::remove_cv::type { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_imp() {} compressed_pair_imp(first_param_type x, second_param_type y) : first_type(x), m_second(y) {} compressed_pair_imp(first_param_type x) : first_type(x), m_second(x) {} first_reference first() {return *this;} first_const_reference first() const {return *this;} second_reference second() {return m_second;} second_const_reference second() const {return m_second;} void swap(::boost::compressed_pair&) {} private: T2 m_second; }; // 5 T1 == T2 and are not empty: //JM template class compressed_pair_imp { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_imp() {} compressed_pair_imp(first_param_type x, second_param_type y) : first_(x), second_(y) {} compressed_pair_imp(first_param_type x) : first_(x), second_(x) {} first_reference first() {return first_;} first_const_reference first() const {return first_;} second_reference second() {return second_;} second_const_reference second() const {return second_;} void swap(::boost::compressed_pair& y) { cp_swap(first_, y.first()); cp_swap(second_, y.second()); } private: first_type first_; second_type second_; }; } // details template class compressed_pair : private ::boost::details::compressed_pair_imp::type, typename remove_cv::type>::value, ::boost::is_empty::value, ::boost::is_empty::value>::value> { private: typedef details::compressed_pair_imp::type, typename remove_cv::type>::value, ::boost::is_empty::value, ::boost::is_empty::value>::value> base; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair() : base() {} compressed_pair(first_param_type x, second_param_type y) : base(x, y) {} explicit compressed_pair(first_param_type x) : base(x) {} explicit compressed_pair(second_param_type y) : base(y) {} first_reference first() {return base::first();} first_const_reference first() const {return base::first();} second_reference second() {return base::second();} second_const_reference second() const {return base::second();} void swap(compressed_pair& y) { base::swap(y); } }; // JM // Partial specialisation for case where T1 == T2: // template class compressed_pair : private details::compressed_pair_imp::type, typename remove_cv::type>::value, ::boost::is_empty::value, ::boost::is_empty::value>::value> { private: typedef details::compressed_pair_imp::type, typename remove_cv::type>::value, ::boost::is_empty::value, ::boost::is_empty::value>::value> base; public: typedef T first_type; typedef T second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair() : base() {} compressed_pair(first_param_type x, second_param_type y) : base(x, y) {} #if !(defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) explicit #endif compressed_pair(first_param_type x) : base(x) {} first_reference first() {return base::first();} first_const_reference first() const {return base::first();} second_reference second() {return base::second();} second_const_reference second() const {return base::second();} void swap(::boost::compressed_pair& y) { base::swap(y); } }; template inline void swap(compressed_pair& x, compressed_pair& y) { x.swap(y); } } // boost #ifdef BOOST_MSVC # pragma warning(pop) #endif #endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP clucene-core-2.3.3.4/src/ext/boost/detail/container_fwd.hpp000066400000000000000000000046561154025176300235560ustar00rootroot00000000000000 // Copyright 2005-2008 Daniel James. // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #if !defined(BOOST_DETAIL_CONTAINER_FWD_HPP) #define BOOST_DETAIL_CONTAINER_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include #if ((defined(__GLIBCPP__) || defined(__GLIBCXX__)) && defined(_GLIBCXX_DEBUG)) \ || BOOST_WORKAROUND(__BORLANDC__, > 0x551) \ || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x842)) \ || (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) #include #include #include #include #include #include #include #include #else #include #if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) && \ defined(__STL_CONFIG_H) #define BOOST_CONTAINER_FWD_BAD_BITSET #if !defined(__STL_NON_TYPE_TMPL_PARAM_BUG) #define BOOST_CONTAINER_FWD_BAD_DEQUE #endif #endif #if defined(BOOST_CONTAINER_FWD_BAD_DEQUE) #include #endif #if defined(BOOST_CONTAINER_FWD_BAD_BITSET) #include #endif #if defined(BOOST_MSVC) #pragma warning(push) #pragma warning(disable:4099) // struct/class mismatch in fwd declarations #endif namespace std { template class allocator; template class basic_string; #if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) template struct string_char_traits; #else template struct char_traits; #endif template class complex; } // gcc 3.4 and greater namespace std { #if !defined(BOOST_CONTAINER_FWD_BAD_DEQUE) template class deque; #endif template class list; template class vector; template class map; template class multimap; template class set; template class multiset; #if !defined(BOOST_CONTAINER_FWD_BAD_BITSET) template class bitset; #endif template struct pair; } #if defined(BOOST_MSVC) #pragma warning(pop) #endif #endif #endif clucene-core-2.3.3.4/src/ext/boost/detail/dynamic_bitset.hpp000066400000000000000000000153401154025176300237220ustar00rootroot00000000000000// ----------------------------------------------------------- // // Copyright (c) 2001-2002 Chuck Allison and Jeremy Siek // Copyright (c) 2003-2006, 2008 Gennaro Prota // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // ----------------------------------------------------------- #ifndef BOOST_DETAIL_DYNAMIC_BITSET_HPP #define BOOST_DETAIL_DYNAMIC_BITSET_HPP #include #include "boost/config.hpp" #include "boost/detail/workaround.hpp" namespace boost { namespace detail { namespace dynamic_bitset_impl { // Gives (read-)access to the object representation // of an object of type T (3.9p4). CANNOT be used // on a base sub-object // template inline const unsigned char * object_representation (T* p) { return static_cast(static_cast(p)); } template struct shifter { static void left_shift(T & v) { amount >= width ? (v = 0) : (v >>= BOOST_DYNAMIC_BITSET_WRAP_CONSTANT(amount)); } }; // ------- count function implementation -------------- typedef unsigned char byte_type; // These two entities // // enum mode { access_by_bytes, access_by_blocks }; // template struct mode_to_type {}; // // were removed, since the regression logs (as of 24 Aug 2008) // showed that several compilers had troubles with recognizing // // const mode m = access_by_bytes // // as a constant expression // // * So, we'll use bool, instead of enum *. // template struct value_to_type { value_to_type() {} }; const bool access_by_bytes = true; const bool access_by_blocks = false; // the table: wrapped in a class template, so // that it is only instantiated if/when needed // template struct count_table { static const byte_type table[]; }; template <> struct count_table { /* no table */ }; const unsigned int table_width = 8; template const byte_type count_table::table[] = { // Automatically generated by GPTableGen.exe v.1.0 // 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; // overload for access by bytes // template inline std::size_t do_count(Iterator first, std::size_t length, int /*dummy param*/, value_to_type* ) { std::size_t num = 0; if (length) { const byte_type * p = object_representation(&*first); length *= sizeof(*first); do { num += count_table<>::table[*p]; ++p; --length; } while (length); } return num; } // overload for access by blocks // template inline std::size_t do_count(Iterator first, std::size_t length, ValueType, value_to_type*) { std::size_t num = 0; while (length){ ValueType value = *first; while (value) { num += count_table<>::table[value & ((1u<>= table_width; } ++first; --length; } return num; } // ------------------------------------------------------- // Some library implementations simply return a dummy // value such as // // size_type(-1) / sizeof(T) // // from vector<>::max_size. This tries to get more // meaningful info. // template typename T::size_type vector_max_size_workaround(const T & v) { typedef typename T::allocator_type allocator_type; const typename allocator_type::size_type alloc_max = v.get_allocator().max_size(); const typename T::size_type container_max = v.max_size(); return alloc_max < container_max? alloc_max : container_max; } // for static_asserts template struct allowed_block_type { enum { value = T(-1) > 0 }; // ensure T has no sign }; template <> struct allowed_block_type { enum { value = false }; }; template struct is_numeric { enum { value = false }; }; # define BOOST_dynamic_bitset_is_numeric(x) \ template<> \ struct is_numeric< x > { \ enum { value = true }; \ } /**/ BOOST_dynamic_bitset_is_numeric(bool); BOOST_dynamic_bitset_is_numeric(char); #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_dynamic_bitset_is_numeric(wchar_t); #endif BOOST_dynamic_bitset_is_numeric(signed char); BOOST_dynamic_bitset_is_numeric(short int); BOOST_dynamic_bitset_is_numeric(int); BOOST_dynamic_bitset_is_numeric(long int); BOOST_dynamic_bitset_is_numeric(unsigned char); BOOST_dynamic_bitset_is_numeric(unsigned short); BOOST_dynamic_bitset_is_numeric(unsigned int); BOOST_dynamic_bitset_is_numeric(unsigned long); #if defined(BOOST_HAS_LONG_LONG) BOOST_dynamic_bitset_is_numeric(::boost::long_long_type); BOOST_dynamic_bitset_is_numeric(::boost::ulong_long_type); #endif // intentionally omitted //BOOST_dynamic_bitset_is_numeric(float); //BOOST_dynamic_bitset_is_numeric(double); //BOOST_dynamic_bitset_is_numeric(long double); #undef BOOST_dynamic_bitset_is_numeric } // dynamic_bitset_impl } // namespace detail } // namespace boost #endif // include guard clucene-core-2.3.3.4/src/ext/boost/detail/endian.hpp000066400000000000000000000046611154025176300221660ustar00rootroot00000000000000// Copyright 2005 Caleb Epstein // Copyright 2006 John Maddock // Distributed under the Boost Software License, Version 1.0. (See accompany- // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. */ /* * Copyright notice reproduced from , from * which this code was originally taken. * * Modified by Caleb Epstein to use with GNU libc and to * defined the BOOST_ENDIAN macro. */ #ifndef BOOST_DETAIL_ENDIAN_HPP #define BOOST_DETAIL_ENDIAN_HPP // GNU libc offers the helpful header which defines // __BYTE_ORDER #if defined (__GLIBC__) # include # if (__BYTE_ORDER == __LITTLE_ENDIAN) # define BOOST_LITTLE_ENDIAN # elif (__BYTE_ORDER == __BIG_ENDIAN) # define BOOST_BIG_ENDIAN # elif (__BYTE_ORDER == __PDP_ENDIAN) # define BOOST_PDP_ENDIAN # else # error Unknown machine endianness detected. # endif # define BOOST_BYTE_ORDER __BYTE_ORDER #elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) # define BOOST_BIG_ENDIAN # define BOOST_BYTE_ORDER 4321 #elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) # define BOOST_LITTLE_ENDIAN # define BOOST_BYTE_ORDER 1234 #elif defined(__sparc) || defined(__sparc__) \ || defined(_POWER) || defined(__powerpc__) \ || defined(__ppc__) || defined(__hpux) || defined(__hppa) \ || defined(_MIPSEB) || defined(_POWER) \ || defined(__s390__) # define BOOST_BIG_ENDIAN # define BOOST_BYTE_ORDER 4321 #elif defined(__i386__) || defined(__alpha__) \ || defined(__ia64) || defined(__ia64__) \ || defined(_M_IX86) || defined(_M_IA64) \ || defined(_M_ALPHA) || defined(__amd64) \ || defined(__amd64__) || defined(_M_AMD64) \ || defined(__x86_64) || defined(__x86_64__) \ || defined(_M_X64) || defined(__bfin__) # define BOOST_LITTLE_ENDIAN # define BOOST_BYTE_ORDER 1234 #else # error The file boost/detail/endian.hpp needs to be set up for your CPU type. #endif #endif clucene-core-2.3.3.4/src/ext/boost/detail/has_default_constructor.hpp000066400000000000000000000016471154025176300256550ustar00rootroot00000000000000 // (C) Copyright Matthias Troyerk 2006. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // // See http://www.boost.org/libs/type_traits for most recent version including documentation. #ifndef BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED #define BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED #include namespace boost { namespace detail { /// type trait to check for a default constructor /// /// The default implementation just checks for a trivial constructor. /// Using some compiler magic it might be possible to provide a better default template struct has_default_constructor : public has_trivial_constructor {}; } } // namespace boost::detail #endif // BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/identifier.hpp000066400000000000000000000063071154025176300230510ustar00rootroot00000000000000// boost/identifier.hpp ----------------------------------------------------// // Copyright Beman Dawes 2006 // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See documentation at http://www.boost.org/libs/utility #ifndef BOOST_IDENTIFIER_HPP #define BOOST_IDENTIFIER_HPP #include #include #include namespace boost { namespace detail { // class template identifier ---------------------------------------------// // Always used as a base class so that different instantiations result in // different class types even if instantiated with the same value type T. // Expected usage is that T is often an integer type, best passed by // value. There is no reason why T can't be a possibly larger class such as // std::string, best passed by const reference. // This implementation uses pass by value, based on expected common uses. template class identifier { public: typedef T value_type; const value_type value() const { return m_value; } void assign( value_type v ) { m_value = v; } bool operator==( const D & rhs ) const { return m_value == rhs.m_value; } bool operator!=( const D & rhs ) const { return m_value != rhs.m_value; } bool operator< ( const D & rhs ) const { return m_value < rhs.m_value; } bool operator<=( const D & rhs ) const { return m_value <= rhs.m_value; } bool operator> ( const D & rhs ) const { return m_value > rhs.m_value; } bool operator>=( const D & rhs ) const { return m_value >= rhs.m_value; } typedef void (*unspecified_bool_type)(D); // without the D, unspecified_bool_type static void unspecified_bool_true(D){} // conversion allows relational operators // between different identifier types operator unspecified_bool_type() const { return m_value == value_type() ? 0 : unspecified_bool_true; } bool operator!() const { return m_value == value_type(); } // constructors are protected so that class can only be used as a base class protected: identifier() {} explicit identifier( value_type v ) : m_value(v) {} #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // 1300 == VC++ 7.0 bug workaround private: #endif T m_value; }; //#ifndef BOOST_NO_SFINAE // template // typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, // Ostream & >::type operator<<( Ostream & os, const Id & id ) // { // return os << id.value(); // } // template // typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, // Istream & >::type operator>>( Istream & is, Id & id ) // { // typename Id::value_type v; // is >> v; // id.value( v ); // return is; // } //#endif } // namespace detail } // namespace boost #endif // BOOST_IDENTIFIER_HPP clucene-core-2.3.3.4/src/ext/boost/detail/indirect_traits.hpp000066400000000000000000000256241154025176300241210ustar00rootroot00000000000000// Copyright David Abrahams 2002. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef INDIRECT_TRAITS_DWA2002131_HPP # define INDIRECT_TRAITS_DWA2002131_HPP # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # include # endif namespace boost { namespace detail { namespace indirect_traits { # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template struct is_reference_to_const : mpl::false_ { }; template struct is_reference_to_const : mpl::true_ { }; # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround template struct is_reference_to_const : mpl::true_ { }; # endif template struct is_reference_to_function : mpl::false_ { }; template struct is_reference_to_function : is_function { }; template struct is_pointer_to_function : mpl::false_ { }; // There's no such thing as a pointer-to-cv-function, so we don't need // specializations for those template struct is_pointer_to_function : is_function { }; template struct is_reference_to_member_function_pointer_impl : mpl::false_ { }; template struct is_reference_to_member_function_pointer_impl : is_member_function_pointer::type> { }; template struct is_reference_to_member_function_pointer : is_reference_to_member_function_pointer_impl { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) }; template struct is_reference_to_function_pointer_aux : mpl::and_< is_reference , is_pointer_to_function< typename remove_cv< typename remove_reference::type >::type > > { // There's no such thing as a pointer-to-cv-function, so we don't need specializations for those }; template struct is_reference_to_function_pointer : mpl::if_< is_reference_to_function , mpl::false_ , is_reference_to_function_pointer_aux >::type { }; template struct is_reference_to_non_const : mpl::and_< is_reference , mpl::not_< is_reference_to_const > > { }; template struct is_reference_to_volatile : mpl::false_ { }; template struct is_reference_to_volatile : mpl::true_ { }; # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround template struct is_reference_to_volatile : mpl::true_ { }; # endif template struct is_reference_to_pointer : mpl::false_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_class : mpl::and_< is_reference , is_class< typename remove_cv< typename remove_reference::type >::type > > { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) }; template struct is_pointer_to_class : mpl::and_< is_pointer , is_class< typename remove_cv< typename remove_pointer::type >::type > > { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_class,(T)) }; # else using namespace boost::detail::is_function_ref_tester_; typedef char (&inner_yes_type)[3]; typedef char (&inner_no_type)[2]; typedef char (&outer_no_type)[1]; template struct is_const_help { typedef typename mpl::if_< is_const , inner_yes_type , inner_no_type >::type type; }; template struct is_volatile_help { typedef typename mpl::if_< is_volatile , inner_yes_type , inner_no_type >::type type; }; template struct is_pointer_help { typedef typename mpl::if_< is_pointer , inner_yes_type , inner_no_type >::type type; }; template struct is_class_help { typedef typename mpl::if_< is_class , inner_yes_type , inner_no_type >::type type; }; template struct is_reference_to_function_aux { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(detail::is_function_ref_tester(t,0)) == sizeof(::boost::type_traits::yes_type)); typedef mpl::bool_ type; }; template struct is_reference_to_function : mpl::if_, is_reference_to_function_aux, mpl::bool_ >::type { }; template struct is_pointer_to_function_aux { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t)) == sizeof(::boost::type_traits::yes_type)); typedef mpl::bool_ type; }; template struct is_pointer_to_function : mpl::if_, is_pointer_to_function_aux, mpl::bool_ >::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_function,(T)) }; struct false_helper1 { template struct apply : mpl::false_ { }; }; template typename is_const_help::type reference_to_const_helper(V&); outer_no_type reference_to_const_helper(...); struct true_helper1 { template struct apply { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(reference_to_const_helper(t)) == sizeof(inner_yes_type)); typedef mpl::bool_ type; }; }; template struct is_reference_to_const_helper1 : true_helper1 { }; template <> struct is_reference_to_const_helper1 : false_helper1 { }; template struct is_reference_to_const : is_reference_to_const_helper1::value>::template apply { }; template struct is_reference_to_non_const_helper1 { template struct apply { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(reference_to_const_helper(t)) == sizeof(inner_no_type)); typedef mpl::bool_ type; }; }; template <> struct is_reference_to_non_const_helper1 : false_helper1 { }; template struct is_reference_to_non_const : is_reference_to_non_const_helper1::value>::template apply { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_non_const,(T)) }; template typename is_volatile_help::type reference_to_volatile_helper(V&); outer_no_type reference_to_volatile_helper(...); template struct is_reference_to_volatile_helper1 { template struct apply { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(reference_to_volatile_helper(t)) == sizeof(inner_yes_type)); typedef mpl::bool_ type; }; }; template <> struct is_reference_to_volatile_helper1 : false_helper1 { }; template struct is_reference_to_volatile : is_reference_to_volatile_helper1::value>::template apply { }; template typename is_pointer_help::type reference_to_pointer_helper(V&); outer_no_type reference_to_pointer_helper(...); template struct reference_to_pointer_impl { static T t; BOOST_STATIC_CONSTANT( bool, value = (sizeof((reference_to_pointer_helper)(t)) == sizeof(inner_yes_type)) ); typedef mpl::bool_ type; }; template struct is_reference_to_pointer : mpl::eval_if, reference_to_pointer_impl, mpl::false_>::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_pointer,(T)) }; template struct is_reference_to_function_pointer : mpl::eval_if, is_pointer_to_function_aux, mpl::false_>::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_function_pointer,(T)) }; template struct is_member_function_pointer_help : mpl::if_, inner_yes_type, inner_no_type> {}; template typename is_member_function_pointer_help::type member_function_pointer_helper(V&); outer_no_type member_function_pointer_helper(...); template struct is_pointer_to_member_function_aux { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof((member_function_pointer_helper)(t)) == sizeof(inner_yes_type)); typedef mpl::bool_ type; }; template struct is_reference_to_member_function_pointer : mpl::if_< is_reference , is_pointer_to_member_function_aux , mpl::bool_ >::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) }; template typename is_class_help::type reference_to_class_helper(V const volatile&); outer_no_type reference_to_class_helper(...); template struct is_reference_to_class { static T t; BOOST_STATIC_CONSTANT( bool, value = (is_reference::value & (sizeof(reference_to_class_helper(t)) == sizeof(inner_yes_type))) ); typedef mpl::bool_ type; BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) }; template typename is_class_help::type pointer_to_class_helper(V const volatile*); outer_no_type pointer_to_class_helper(...); template struct is_pointer_to_class { static T t; BOOST_STATIC_CONSTANT( bool, value = (is_pointer::value && sizeof(pointer_to_class_helper(t)) == sizeof(inner_yes_type)) ); typedef mpl::bool_ type; }; # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION } using namespace indirect_traits; }} // namespace boost::python::detail #endif // INDIRECT_TRAITS_DWA2002131_HPP clucene-core-2.3.3.4/src/ext/boost/detail/interlocked.hpp000066400000000000000000000132461154025176300232320ustar00rootroot00000000000000#ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED #define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/interlocked.hpp // // Copyright 2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #if defined( BOOST_USE_WINDOWS_H ) # include # define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement # define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement # define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange # define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange # define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer # define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer #elif defined(_WIN32_WCE) // under Windows CE we still have old-style Interlocked* functions extern "C" long __cdecl InterlockedIncrement( long* ); extern "C" long __cdecl InterlockedDecrement( long* ); extern "C" long __cdecl InterlockedCompareExchange( long*, long, long ); extern "C" long __cdecl InterlockedExchange( long*, long ); extern "C" long __cdecl InterlockedExchangeAdd( long*, long ); # define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement # define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement # define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange # define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange # define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest),(long)(exchange),(long)(compare))) # define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ ((void*)BOOST_INTERLOCKED_EXCHANGE((long*)(dest),(long)(exchange))) #elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN ) #if defined( __CLRCALL_PURE_OR_CDECL ) extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedIncrement( long volatile * ); extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedDecrement( long volatile * ); extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( long volatile *, long, long ); extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchange( long volatile *, long ); extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( long volatile *, long ); #else extern "C" long __cdecl _InterlockedIncrement( long volatile * ); extern "C" long __cdecl _InterlockedDecrement( long volatile * ); extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long ); extern "C" long __cdecl _InterlockedExchange( long volatile *, long ); extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long ); #endif # pragma intrinsic( _InterlockedIncrement ) # pragma intrinsic( _InterlockedDecrement ) # pragma intrinsic( _InterlockedCompareExchange ) # pragma intrinsic( _InterlockedExchange ) # pragma intrinsic( _InterlockedExchangeAdd ) # if defined(_M_IA64) || defined(_M_AMD64) extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* ); extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* ); # pragma intrinsic( _InterlockedCompareExchangePointer ) # pragma intrinsic( _InterlockedExchangePointer ) # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer # define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer # else # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) # define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) # endif # define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement # define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement # define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange # define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange # define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd #elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ ) namespace boost { namespace detail { extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * ); extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * ); extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long ); extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long ); extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long ); } // namespace detail } // namespace boost # define BOOST_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement # define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement # define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange # define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange # define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) # define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) #else # error "Interlocked intrinsics not available" #endif #endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/is_function_ref_tester.hpp000066400000000000000000000174471154025176300255000ustar00rootroot00000000000000 // (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, // Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #if !defined(BOOST_PP_IS_ITERATING) ///// header body #ifndef BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED #define BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED #include "boost/type_traits/detail/yes_no_type.hpp" #include "boost/type_traits/config.hpp" #if defined(BOOST_TT_PREPROCESSING_MODE) # include "boost/preprocessor/iterate.hpp" # include "boost/preprocessor/enum_params.hpp" # include "boost/preprocessor/comma_if.hpp" #endif namespace boost { namespace detail { namespace is_function_ref_tester_ { template boost::type_traits::no_type BOOST_TT_DECL is_function_ref_tester(T& ...); #if !defined(BOOST_TT_PREPROCESSING_MODE) // preprocessor-generated part, don't edit by hand! template boost::type_traits::yes_type is_function_ref_tester(R (&)(), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23), int); template boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24), int); #else #define BOOST_PP_ITERATION_PARAMS_1 \ (3, (0, 25, "boost/type_traits/detail/is_function_ref_tester.hpp")) #include BOOST_PP_ITERATE() #endif // BOOST_TT_PREPROCESSING_MODE } // namespace detail } // namespace python } // namespace boost #endif // BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED ///// iteration #else #define i BOOST_PP_FRAME_ITERATION(1) template boost::type_traits::yes_type is_function_ref_tester(R (&)(BOOST_PP_ENUM_PARAMS(i,T)), int); #undef i #endif // BOOST_PP_IS_ITERATING clucene-core-2.3.3.4/src/ext/boost/detail/is_incrementable.hpp000066400000000000000000000072251154025176300242320ustar00rootroot00000000000000// Copyright David Abrahams 2004. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef IS_INCREMENTABLE_DWA200415_HPP # define IS_INCREMENTABLE_DWA200415_HPP # include # include # include # include # include // Must be the last include # include namespace boost { namespace detail { // is_incrementable metafunction // // Requires: Given x of type T&, if the expression ++x is well-formed // it must have complete type; otherwise, it must neither be ambiguous // nor violate access. // This namespace ensures that ADL doesn't mess things up. namespace is_incrementable_ { // a type returned from operator++ when no increment is found in the // type's own namespace struct tag {}; // any soaks up implicit conversions and makes the following // operator++ less-preferred than any other such operator that // might be found via ADL. struct any { template any(T const&); }; // This is a last-resort operator++ for when none other is found # if BOOST_WORKAROUND(__GNUC__, == 4) && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2 } namespace is_incrementable_2 { is_incrementable_::tag operator++(is_incrementable_::any const&); is_incrementable_::tag operator++(is_incrementable_::any const&,int); } using namespace is_incrementable_2; namespace is_incrementable_ { # else tag operator++(any const&); tag operator++(any const&,int); # endif # if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \ || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) # define BOOST_comma(a,b) (a) # else // In case an operator++ is found that returns void, we'll use ++x,0 tag operator,(tag,int); # define BOOST_comma(a,b) (a,b) # endif # if defined(BOOST_MSVC) # pragma warning(push) # pragma warning(disable:4913) // Warning about operator, # endif // two check overloads help us identify which operator++ was picked char (& check(tag) )[2]; template char check(T const&); template struct impl { static typename boost::remove_cv::type& x; BOOST_STATIC_CONSTANT( bool , value = sizeof(is_incrementable_::check(BOOST_comma(++x,0))) == 1 ); }; template struct postfix_impl { static typename boost::remove_cv::type& x; BOOST_STATIC_CONSTANT( bool , value = sizeof(is_incrementable_::check(BOOST_comma(x++,0))) == 1 ); }; # if defined(BOOST_MSVC) # pragma warning(pop) # endif } # undef BOOST_comma template struct is_incrementable BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl::value) { BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl::value) BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T)) }; template struct is_postfix_incrementable BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl::value) { BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::postfix_impl::value) BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T)) }; } // namespace detail BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_incrementable) BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_postfix_incrementable) } // namespace boost # include #endif // IS_INCREMENTABLE_DWA200415_HPP clucene-core-2.3.3.4/src/ext/boost/detail/is_xxx.hpp000066400000000000000000000063731154025176300222540ustar00rootroot00000000000000// Copyright David Abrahams 2005. Distributed under the Boost // Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_DETAIL_IS_XXX_DWA20051011_HPP # define BOOST_DETAIL_IS_XXX_DWA20051011_HPP # include # include # include # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) # include # include # define BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs) \ template \ struct is_##name \ { \ typedef char yes; \ typedef char (&no)[2]; \ \ static typename add_reference::type dummy; \ \ struct helpers \ { \ template < BOOST_PP_ENUM_PARAMS_Z(1, nargs, class U) > \ static yes test( \ qualified_name< BOOST_PP_ENUM_PARAMS_Z(1, nargs, U) >&, int \ ); \ \ template \ static no test(U&, ...); \ }; \ \ BOOST_STATIC_CONSTANT( \ bool, value \ = !is_reference::value \ & (sizeof(helpers::test(dummy, 0)) == sizeof(yes))); \ \ typedef mpl::bool_ type; \ }; # else # define BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs) \ template \ struct is_##name : mpl::false_ \ { \ }; \ \ template < BOOST_PP_ENUM_PARAMS_Z(1, nargs, class T) > \ struct is_##name< \ qualified_name< BOOST_PP_ENUM_PARAMS_Z(1, nargs, T) > \ > \ : mpl::true_ \ { \ }; # endif #endif // BOOST_DETAIL_IS_XXX_DWA20051011_HPP clucene-core-2.3.3.4/src/ext/boost/detail/iterator.hpp000066400000000000000000000367301154025176300225630ustar00rootroot00000000000000// (C) Copyright David Abrahams 2002. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Boost versions of // // std::iterator_traits<>::iterator_category // std::iterator_traits<>::difference_type // std::distance() // // ...for all compilers and iterators // // Additionally, if X is a pointer // std::iterator_traits::pointer // Otherwise, if partial specialization is supported or X is not a pointer // std::iterator_traits::value_type // std::iterator_traits::pointer // std::iterator_traits::reference // // See http://www.boost.org for most recent version including documentation. // Revision History // 04 Mar 2001 - More attempted fixes for Intel C++ (David Abrahams) // 03 Mar 2001 - Put all implementation into namespace // boost::detail::iterator_traits_. Some progress made on fixes // for Intel compiler. (David Abrahams) // 02 Mar 2001 - Changed BOOST_MSVC to BOOST_MSVC_STD_ITERATOR in a few // places. (Jeremy Siek) // 19 Feb 2001 - Improved workarounds for stock MSVC6; use yes_type and // no_type from type_traits.hpp; stopped trying to remove_cv // before detecting is_pointer, in honor of the new type_traits // semantics. (David Abrahams) // 13 Feb 2001 - Make it work with nearly all standard-conforming iterators // under raw VC6. The one category remaining which will fail is // that of iterators derived from std::iterator but not // boost::iterator and which redefine difference_type. // 11 Feb 2001 - Clean away code which can never be used (David Abrahams) // 09 Feb 2001 - Always have a definition for each traits member, even if it // can't be properly deduced. These will be incomplete types in // some cases (undefined), but it helps suppress MSVC errors // elsewhere (David Abrahams) // 07 Feb 2001 - Support for more of the traits members where possible, making // this useful as a replacement for std::iterator_traits when // used as a default template parameter. // 06 Feb 2001 - Removed useless #includes of standard library headers // (David Abrahams) #ifndef ITERATOR_DWA122600_HPP_ # define ITERATOR_DWA122600_HPP_ # include # include // STLPort 4.0 and betas have a bug when debugging is enabled and there is no // partial specialization: instead of an iterator_category typedef, the standard // container iterators have _Iterator_category. // // Also, whether debugging is enabled or not, there is a broken specialization // of std::iterator which has no // typedefs but iterator_category. # if defined(__SGI_STL_PORT) # if (__SGI_STL_PORT <= 0x410) && !defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && defined(__STL_DEBUG) # define BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF # endif # define BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION # endif // STLPort <= 4.1b4 && no partial specialization # if !defined(BOOST_NO_STD_ITERATOR_TRAITS) \ && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ && !defined(BOOST_MSVC_STD_ITERATOR) namespace boost { namespace detail { // Define a new template so it can be specialized template struct iterator_traits : std::iterator_traits {}; using std::distance; }} // namespace boost::detail # else # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ && !defined(BOOST_MSVC_STD_ITERATOR) // This is the case where everything conforms except BOOST_NO_STD_ITERATOR_TRAITS namespace boost { namespace detail { // Rogue Wave Standard Library fools itself into thinking partial // specialization is missing on some platforms (e.g. Sun), so fails to // supply iterator_traits! template struct iterator_traits { typedef typename Iterator::value_type value_type; typedef typename Iterator::reference reference; typedef typename Iterator::pointer pointer; typedef typename Iterator::difference_type difference_type; typedef typename Iterator::iterator_category iterator_category; }; template struct iterator_traits { typedef T value_type; typedef T& reference; typedef T* pointer; typedef std::ptrdiff_t difference_type; typedef std::random_access_iterator_tag iterator_category; }; template struct iterator_traits { typedef T value_type; typedef T const& reference; typedef T const* pointer; typedef std::ptrdiff_t difference_type; typedef std::random_access_iterator_tag iterator_category; }; }} // namespace boost::detail # else # include # include # include # ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # include # include # endif # ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION # include # endif # include # include # include // should be the last #include # include "boost/type_traits/detail/bool_trait_def.hpp" namespace boost { namespace detail { BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type) BOOST_MPL_HAS_XXX_TRAIT_DEF(reference) BOOST_MPL_HAS_XXX_TRAIT_DEF(pointer) BOOST_MPL_HAS_XXX_TRAIT_DEF(difference_type) BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category) // is_mutable_iterator -- // // A metafunction returning true iff T is a mutable iterator type // with a nested value_type. Will only work portably with iterators // whose operator* returns a reference, but that seems to be OK for // the iterators supplied by Dinkumware. Some input iterators may // compile-time if they arrive here, and if the compiler is strict // about not taking the address of an rvalue. // This one detects ordinary mutable iterators - the result of // operator* is convertible to the value_type. template type_traits::yes_type is_mutable_iterator_helper(T const*, BOOST_DEDUCED_TYPENAME T::value_type*); // Since you can't take the address of an rvalue, the guts of // is_mutable_iterator_impl will fail if we use &*t directly. This // makes sure we can still work with non-lvalue iterators. template T* mutable_iterator_lvalue_helper(T& x); int mutable_iterator_lvalue_helper(...); // This one detects output iterators such as ostream_iterator which // return references to themselves. template type_traits::yes_type is_mutable_iterator_helper(T const*, T const*); type_traits::no_type is_mutable_iterator_helper(...); template struct is_mutable_iterator_impl { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof( detail::is_mutable_iterator_helper( (T*)0 , mutable_iterator_lvalue_helper(*t) // like &*t )) == sizeof(type_traits::yes_type) ); }; BOOST_TT_AUX_BOOL_TRAIT_DEF1( is_mutable_iterator,T,::boost::detail::is_mutable_iterator_impl::value) // is_full_iterator_traits -- // // A metafunction returning true iff T has all the requisite nested // types to satisfy the requirements for a fully-conforming // iterator_traits implementation. template struct is_full_iterator_traits_impl { enum { value = has_value_type::value & has_reference::value & has_pointer::value & has_difference_type::value & has_iterator_category::value }; }; BOOST_TT_AUX_BOOL_TRAIT_DEF1( is_full_iterator_traits,T,::boost::detail::is_full_iterator_traits_impl::value) # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF BOOST_MPL_HAS_XXX_TRAIT_DEF(_Iterator_category) // is_stlport_40_debug_iterator -- // // A metafunction returning true iff T has all the requisite nested // types to satisfy the requirements of an STLPort 4.0 debug iterator // iterator_traits implementation. template struct is_stlport_40_debug_iterator_impl { enum { value = has_value_type::value & has_reference::value & has_pointer::value & has_difference_type::value & has__Iterator_category::value }; }; BOOST_TT_AUX_BOOL_TRAIT_DEF1( is_stlport_40_debug_iterator,T,::boost::detail::is_stlport_40_debug_iterator_impl::value) template struct stlport_40_debug_iterator_traits { typedef typename T::value_type value_type; typedef typename T::reference reference; typedef typename T::pointer pointer; typedef typename T::difference_type difference_type; typedef typename T::_Iterator_category iterator_category; }; # endif // BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF template struct pointer_iterator_traits; # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template struct pointer_iterator_traits { typedef typename remove_const::type value_type; typedef T* pointer; typedef T& reference; typedef std::random_access_iterator_tag iterator_category; typedef std::ptrdiff_t difference_type; }; # else // In case of no template partial specialization, and if T is a // pointer, iterator_traits::value_type can still be computed. For // some basic types, remove_pointer is manually defined in // type_traits/broken_compiler_spec.hpp. For others, do it yourself. template class please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee; template struct pointer_value_type : mpl::if_< is_same::type> , please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee

, typename remove_const< typename remove_pointer

::type >::type > { }; template struct pointer_reference : mpl::if_< is_same::type> , please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee

, typename remove_pointer

::type& > { }; template struct pointer_iterator_traits { typedef T pointer; typedef std::random_access_iterator_tag iterator_category; typedef std::ptrdiff_t difference_type; typedef typename pointer_value_type::type value_type; typedef typename pointer_reference::type reference; }; # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION // We'll sort iterator types into one of these classifications, from which we // can determine the difference_type, pointer, reference, and value_type template struct standard_iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; }; template struct msvc_stdlib_mutable_traits : std::iterator_traits { typedef typename std::iterator_traits::distance_type difference_type; typedef typename std::iterator_traits::value_type* pointer; typedef typename std::iterator_traits::value_type& reference; }; template struct msvc_stdlib_const_traits : std::iterator_traits { typedef typename std::iterator_traits::distance_type difference_type; typedef const typename std::iterator_traits::value_type* pointer; typedef const typename std::iterator_traits::value_type& reference; }; # ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION template struct is_bad_output_iterator : is_base_and_derived< std::iterator , Iterator> { }; struct bad_output_iterator_traits { typedef void value_type; typedef void difference_type; typedef std::output_iterator_tag iterator_category; typedef void pointer; typedef void reference; }; # endif // If we're looking at an MSVC6 (old Dinkumware) ``standard'' // iterator, this will generate an appropriate traits class. template struct msvc_stdlib_iterator_traits : mpl::if_< is_mutable_iterator , msvc_stdlib_mutable_traits , msvc_stdlib_const_traits >::type {}; template struct non_pointer_iterator_traits : mpl::if_< // if the iterator contains all the right nested types... is_full_iterator_traits // Use a standard iterator_traits implementation , standard_iterator_traits # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF // Check for STLPort 4.0 broken _Iterator_category type , mpl::if_< is_stlport_40_debug_iterator , stlport_40_debug_iterator_traits # endif // Otherwise, assume it's a Dinkum iterator , msvc_stdlib_iterator_traits # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF >::type # endif >::type { }; template struct iterator_traits_aux : mpl::if_< is_pointer , pointer_iterator_traits , non_pointer_iterator_traits >::type { }; template struct iterator_traits { // Explicit forwarding from base class needed to keep MSVC6 happy // under some circumstances. private: # ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION typedef typename mpl::if_< is_bad_output_iterator , bad_output_iterator_traits , iterator_traits_aux >::type base; # else typedef iterator_traits_aux base; # endif public: typedef typename base::value_type value_type; typedef typename base::pointer pointer; typedef typename base::reference reference; typedef typename base::difference_type difference_type; typedef typename base::iterator_category iterator_category; }; // This specialization cuts off ETI (Early Template Instantiation) for MSVC. template <> struct iterator_traits { typedef int value_type; typedef int pointer; typedef int reference; typedef int difference_type; typedef int iterator_category; }; }} // namespace boost::detail # endif // workarounds namespace boost { namespace detail { namespace iterator_traits_ { template struct distance_select { static Difference execute(Iterator i1, const Iterator i2, ...) { Difference result = 0; while (i1 != i2) { ++i1; ++result; } return result; } static Difference execute(Iterator i1, const Iterator i2, std::random_access_iterator_tag*) { return i2 - i1; } }; } // namespace boost::detail::iterator_traits_ template inline typename iterator_traits::difference_type distance(Iterator first, Iterator last) { typedef typename iterator_traits::difference_type diff_t; typedef typename ::boost::detail::iterator_traits::iterator_category iterator_category; return iterator_traits_::distance_select::execute( first, last, (iterator_category*)0); } }} # endif # undef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF # undef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION #endif // ITERATOR_DWA122600_HPP_ clucene-core-2.3.3.4/src/ext/boost/detail/lcast_precision.hpp000066400000000000000000000135541154025176300241120ustar00rootroot00000000000000// Copyright Alexander Nasonov & Paul A. Bristow 2006. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED #define BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED #include #include #include #include #include #ifndef BOOST_NO_IS_ABSTRACT // Fix for SF:1358600 - lexical_cast & pure virtual functions & VC 8 STL #include #include #endif #if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) || \ (defined(BOOST_MSVC) && (BOOST_MSVC<1310)) #define BOOST_LCAST_NO_COMPILE_TIME_PRECISION #endif #ifdef BOOST_LCAST_NO_COMPILE_TIME_PRECISION #include #else #include #endif namespace boost { namespace detail { class lcast_abstract_stub {}; #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION // Calculate an argument to pass to std::ios_base::precision from // lexical_cast. See alternative implementation for broken standard // libraries in lcast_get_precision below. Keep them in sync, please. template struct lcast_precision { #ifdef BOOST_NO_IS_ABSTRACT typedef std::numeric_limits limits; // No fix for SF:1358600. #else typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_< boost::is_abstract , std::numeric_limits , std::numeric_limits >::type limits; #endif BOOST_STATIC_CONSTANT(bool, use_default_precision = !limits::is_specialized || limits::is_exact ); BOOST_STATIC_CONSTANT(bool, is_specialized_bin = !use_default_precision && limits::radix == 2 && limits::digits > 0 ); BOOST_STATIC_CONSTANT(bool, is_specialized_dec = !use_default_precision && limits::radix == 10 && limits::digits10 > 0 ); BOOST_STATIC_CONSTANT(std::streamsize, streamsize_max = boost::integer_traits::const_max ); BOOST_STATIC_CONSTANT(unsigned int, precision_dec = limits::digits10 + 1U); BOOST_STATIC_ASSERT(!is_specialized_dec || precision_dec <= streamsize_max + 0UL ); BOOST_STATIC_CONSTANT(unsigned long, precision_bin = 2UL + limits::digits * 30103UL / 100000UL ); BOOST_STATIC_ASSERT(!is_specialized_bin || (limits::digits + 0UL < ULONG_MAX / 30103UL && precision_bin > limits::digits10 + 0UL && precision_bin <= streamsize_max + 0UL) ); BOOST_STATIC_CONSTANT(std::streamsize, value = is_specialized_bin ? precision_bin : is_specialized_dec ? precision_dec : 6 ); }; #endif template inline std::streamsize lcast_get_precision(T* = 0) { #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION return lcast_precision::value; #else // Follow lcast_precision algorithm at run-time: #ifdef BOOST_NO_IS_ABSTRACT typedef std::numeric_limits limits; // No fix for SF:1358600. #else typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_< boost::is_abstract , std::numeric_limits , std::numeric_limits >::type limits; #endif bool const use_default_precision = !limits::is_specialized || limits::is_exact; if(!use_default_precision) { // Includes all built-in floating-point types, float, double ... // and UDT types for which digits (significand bits) is defined (not zero) bool const is_specialized_bin = limits::radix == 2 && limits::digits > 0; bool const is_specialized_dec = limits::radix == 10 && limits::digits10 > 0; std::streamsize const streamsize_max = (boost::integer_traits::max)(); if(is_specialized_bin) { // Floating-point types with // limits::digits defined by the specialization. unsigned long const digits = limits::digits; unsigned long const precision = 2UL + digits * 30103UL / 100000UL; // unsigned long is selected because it is at least 32-bits // and thus ULONG_MAX / 30103UL is big enough for all types. BOOST_ASSERT( digits < ULONG_MAX / 30103UL && precision > limits::digits10 + 0UL && precision <= streamsize_max + 0UL ); return precision; } else if(is_specialized_dec) { // Decimal Floating-point type, most likely a User Defined Type // rather than a real floating-point hardware type. unsigned int const precision = limits::digits10 + 1U; BOOST_ASSERT(precision <= streamsize_max + 0UL); return precision; } } // Integral type (for which precision has no effect) // or type T for which limits is NOT specialized, // so assume stream precision remains the default 6 decimal digits. // Warning: if your User-defined Floating-point type T is NOT specialized, // then you may lose accuracy by only using 6 decimal digits. // To avoid this, you need to specialize T with either // radix == 2 and digits == the number of significand bits, // OR // radix = 10 and digits10 == the number of decimal digits. return 6; #endif } template inline void lcast_set_precision(std::ios_base& stream, T*) { stream.precision(lcast_get_precision()); } template inline void lcast_set_precision(std::ios_base& stream, Source*, Target*) { std::streamsize const s = lcast_get_precision((Source*)0); std::streamsize const t = lcast_get_precision((Target*)0); stream.precision(s > t ? s : t); } }} #endif // BOOST_DETAIL_LCAST_PRECISION_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/lightweight_mutex.hpp000066400000000000000000000011661154025176300244660ustar00rootroot00000000000000#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED #define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/lightweight_mutex.hpp - lightweight mutex // // Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #include #endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/lightweight_test.hpp000066400000000000000000000047161154025176300243070ustar00rootroot00000000000000#ifndef BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED #define BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/lightweight_test.hpp - lightweight test library // // Copyright (c) 2002, 2009 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // // BOOST_TEST(expression) // BOOST_ERROR(message) // BOOST_TEST_EQ(expr1, expr2) // // int boost::report_errors() // #include #include namespace boost { namespace detail { inline int & test_errors() { static int x = 0; return x; } inline void test_failed_impl(char const * expr, char const * file, int line, char const * function) { std::cerr << file << "(" << line << "): test '" << expr << "' failed in function '" << function << "'" << std::endl; ++test_errors(); } inline void error_impl(char const * msg, char const * file, int line, char const * function) { std::cerr << file << "(" << line << "): " << msg << " in function '" << function << "'" << std::endl; ++test_errors(); } template inline void test_eq_impl( char const * expr1, char const * expr2, char const * file, int line, char const * function, T const & t, U const & u ) { if( t == u ) { } else { std::cerr << file << "(" << line << "): test '" << expr1 << " == " << expr2 << "' failed in function '" << function << "': " << "'" << t << "' != '" << u << "'" << std::endl; ++test_errors(); } } } // namespace detail inline int report_errors() { int errors = detail::test_errors(); if( errors == 0 ) { std::cerr << "No errors detected." << std::endl; return 0; } else { std::cerr << errors << " error" << (errors == 1? "": "s") << " detected." << std::endl; return 1; } } } // namespace boost #define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION)) #define BOOST_ERROR(msg) ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) #define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) ) #endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/lightweight_thread.hpp000066400000000000000000000045331154025176300245740ustar00rootroot00000000000000#ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED #define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // boost/detail/lightweight_thread.hpp // // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #include #include // pthread_create, pthread_join #if defined( BOOST_HAS_PTHREADS ) #include #else #include #include typedef HANDLE pthread_t; int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg ) { HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 ); if( h != 0 ) { *thread = h; return 0; } else { return EAGAIN; } } int pthread_join( pthread_t thread, void ** /*value_ptr*/ ) { ::WaitForSingleObject( thread, INFINITE ); ::CloseHandle( thread ); return 0; } #endif // template int lw_thread_create( pthread_t & pt, F f ); namespace boost { namespace detail { class lw_abstract_thread { public: virtual ~lw_abstract_thread() {} virtual void run() = 0; }; #if defined( BOOST_HAS_PTHREADS ) extern "C" void * lw_thread_routine( void * pv ) { std::auto_ptr pt( static_cast( pv ) ); pt->run(); return 0; } #else unsigned __stdcall lw_thread_routine( void * pv ) { std::auto_ptr pt( static_cast( pv ) ); pt->run(); return 0; } #endif template class lw_thread_impl: public lw_abstract_thread { public: explicit lw_thread_impl( F f ): f_( f ) { } void run() { f_(); } private: F f_; }; template int lw_thread_create( pthread_t & pt, F f ) { std::auto_ptr p( new lw_thread_impl( f ) ); int r = pthread_create( &pt, 0, lw_thread_routine, p.get() ); if( r == 0 ) { p.release(); } return r; } } // namespace detail } // namespace boost #endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/limits.hpp000066400000000000000000000403061154025176300222250ustar00rootroot00000000000000// Copyright 2001 John Maddock // Distributed under the Boost Software License, Version 1.0. (See accompany- // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. */ /* NOTE: This is not portable code. Parts of numeric_limits<> are * inherently machine-dependent, and this file is written for the MIPS * architecture and the SGI MIPSpro C++ compiler. Parts of it (in * particular, some of the characteristics of floating-point types) * are almost certainly incorrect for any other platform. */ /* The above comment is almost certainly out of date. This file works * on systems other than SGI MIPSpro C++ now. */ /* * Revision history: * 21 Sep 2001: * Only include if BOOST_NO_CWCHAR is defined. (Darin Adler) * 10 Aug 2001: * Added MIPS (big endian) to the big endian family. (Jens Maurer) * 13 Apr 2001: * Added powerpc to the big endian family. (Jeremy Siek) * 5 Apr 2001: * Added sparc (big endian) processor support (John Maddock). * Initial sub: * Modified by Jens Maurer for gcc 2.95 on x86. */ #ifndef BOOST_SGI_CPP_LIMITS #define BOOST_SGI_CPP_LIMITS #include #include #include #include #ifndef BOOST_NO_CWCHAR #include // for WCHAR_MIN and WCHAR_MAX #endif namespace std { enum float_round_style { round_indeterminate = -1, round_toward_zero = 0, round_to_nearest = 1, round_toward_infinity = 2, round_toward_neg_infinity = 3 }; enum float_denorm_style { denorm_indeterminate = -1, denorm_absent = 0, denorm_present = 1 }; // The C++ standard (section 18.2.1) requires that some of the members of // numeric_limits be static const data members that are given constant- // initializers within the class declaration. On compilers where the // BOOST_NO_INCLASS_MEMBER_INITIALIZATION macro is defined, it is impossible to write // a standard-conforming numeric_limits class. // // There are two possible workarounds: either initialize the data // members outside the class, or change them from data members to // enums. Neither workaround is satisfactory: the former makes it // impossible to use the data members in constant-expressions, and the // latter means they have the wrong type and that it is impossible to // take their addresses. We choose the former workaround. #ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ enum { __mem_name = __mem_value } #else /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */ # define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ static const __mem_type __mem_name = __mem_value #endif /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */ // Base class for all specializations of numeric_limits. template class _Numeric_limits_base { public: BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, false); static __number min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __number(); } static __number max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __number(); } BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact, false); BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 0); static __number epsilon() throw() { return __number(); } static __number round_error() throw() { return __number(); } BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, false); BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style, has_denorm, denorm_absent); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); static __number infinity() throw() { return __number(); } static __number quiet_NaN() throw() { return __number(); } static __number signaling_NaN() throw() { return __number(); } static __number denorm_min() throw() { return __number(); } BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, round_toward_zero); }; // Base class for integers. template class _Integer_limits : public _Numeric_limits_base<_Int> { public: BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); static _Int min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __imin; } static _Int max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __imax; } BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, (__idigits < 0) ? (int)(sizeof(_Int) * CHAR_BIT) - (__imin == 0 ? 0 : 1) : __idigits); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, (digits * 301) / 1000); // log 2 = 0.301029995664... BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, __imin != 0); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact, true); BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, true); }; #if defined(BOOST_BIG_ENDIAN) template struct float_helper{ static Number get_word() throw() { // sizeof(long double) == 16 const unsigned int _S_word[4] = { Word, 0, 0, 0 }; return *reinterpret_cast(&_S_word); } }; #else template struct float_helper{ static Number get_word() throw() { // sizeof(long double) == 12, but only 10 bytes significant const unsigned int _S_word[4] = { 0, 0, 0, Word }; return *reinterpret_cast( reinterpret_cast(&_S_word)+16- (sizeof(Number) == 12 ? 10 : sizeof(Number))); } }; #endif // Base class for floating-point numbers. template class _Floating_limits : public _Numeric_limits_base<__number> { public: BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, __Digits); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, __Digits10); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, true); BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2); BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent, __MinExp); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent, __MaxExp); BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, __MinExp10); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, __MaxExp10); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, true); BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style, has_denorm, denorm_indeterminate); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); static __number infinity() throw() { return float_helper<__number, __InfinityWord>::get_word(); } static __number quiet_NaN() throw() { return float_helper<__number,__QNaNWord>::get_word(); } static __number signaling_NaN() throw() { return float_helper<__number,__SNaNWord>::get_word(); } BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, __IsIEC559); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps, false /* was: true */ ); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, __RoundStyle); }; // Class numeric_limits // The unspecialized class. template class numeric_limits : public _Numeric_limits_base {}; // Specializations for all built-in integral types. template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; #ifndef BOOST_NO_INTRINSIC_WCHAR_T template<> class numeric_limits #if !defined(WCHAR_MAX) || !defined(WCHAR_MIN) #if defined(_WIN32) || defined(__CYGWIN__) : public _Integer_limits #elif defined(__hppa) // wchar_t has "unsigned int" as the underlying type : public _Integer_limits #else // assume that wchar_t has "int" as the underlying type : public _Integer_limits #endif #else // we have WCHAR_MIN and WCHAR_MAX defined, so use it : public _Integer_limits #endif {}; #endif template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; #ifdef __GNUC__ // Some compilers have long long, but don't define the // LONGLONG_MIN and LONGLONG_MAX macros in limits.h. This // assumes that long long is 64 bits. #if !defined(LONGLONG_MAX) && !defined(ULONGLONG_MAX) # define ULONGLONG_MAX 0xffffffffffffffffLLU # define LONGLONG_MAX 0x7fffffffffffffffLL #endif #if !defined(LONGLONG_MIN) # define LONGLONG_MIN (-LONGLONG_MAX - 1) #endif #if !defined(ULONGLONG_MIN) # define ULONGLONG_MIN 0 #endif #endif /* __GNUC__ */ // Specializations for all built-in floating-point type. template<> class numeric_limits : public _Floating_limits { public: static float min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return FLT_MIN; } static float denorm_min() throw() { return FLT_MIN; } static float max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return FLT_MAX; } static float epsilon() throw() { return FLT_EPSILON; } static float round_error() throw() { return 0.5f; } // Units: ulps. }; template<> class numeric_limits : public _Floating_limits { public: static double min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return DBL_MIN; } static double denorm_min() throw() { return DBL_MIN; } static double max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return DBL_MAX; } static double epsilon() throw() { return DBL_EPSILON; } static double round_error() throw() { return 0.5; } // Units: ulps. }; template<> class numeric_limits : public _Floating_limits { public: static long double min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return LDBL_MIN; } static long double denorm_min() throw() { return LDBL_MIN; } static long double max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return LDBL_MAX; } static long double epsilon() throw() { return LDBL_EPSILON; } static long double round_error() throw() { return 4; } // Units: ulps. }; } // namespace std #endif /* BOOST_SGI_CPP_LIMITS */ // Local Variables: // mode:C++ // End: clucene-core-2.3.3.4/src/ext/boost/detail/named_template_params.hpp000066400000000000000000000137121154025176300252470ustar00rootroot00000000000000// (C) Copyright Jeremy Siek 2001. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Revision History: // 04 Oct 2001 David Abrahams // Changed name of "bind" to "select" to avoid problems with MSVC. #ifndef BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP #define BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP #include #include // for is_reference #if defined(__BORLANDC__) #include #endif namespace boost { namespace detail { struct default_argument { }; struct dummy_default_gen { template struct select { typedef default_argument type; }; }; // This class template is a workaround for MSVC. template struct default_generator { typedef detail::dummy_default_gen type; }; template struct is_default { enum { value = false }; typedef type_traits::no_type type; }; template <> struct is_default { enum { value = true }; typedef type_traits::yes_type type; }; struct choose_default { template struct select { typedef typename default_generator::type Gen; typedef typename Gen::template select::type type; }; }; struct choose_arg { template struct select { typedef Arg type; }; }; #if defined(__BORLANDC__) template struct choose_arg_or_default { typedef choose_arg type; }; template <> struct choose_arg_or_default { typedef choose_default type; }; #else template struct choose_arg_or_default { typedef choose_arg type; }; template <> struct choose_arg_or_default { typedef choose_default type; }; #endif template class resolve_default { #if defined(__BORLANDC__) typedef typename choose_arg_or_default::type>::type Selector; #else // This usually works for Borland, but I'm seeing weird errors in // iterator_adaptor_test.cpp when using this method. enum { is_def = is_default::value }; typedef typename choose_arg_or_default::type Selector; #endif public: typedef typename Selector ::template select::type type; }; // To differentiate an unnamed parameter from a traits generator // we use is_convertible. struct named_template_param_base { }; template struct is_named_param_list { enum { value = is_convertible::value }; }; struct choose_named_params { template struct select { typedef Prev type; }; }; struct choose_default_arg { template struct select { typedef detail::default_argument type; }; }; template struct choose_default_dispatch_; template <> struct choose_default_dispatch_ { typedef choose_named_params type; }; template <> struct choose_default_dispatch_ { typedef choose_default_arg type; }; // The use of inheritance here is a Solaris Forte 6 workaround. template struct choose_default_dispatch : public choose_default_dispatch_ { }; template struct choose_default_argument { enum { is_named = is_named_param_list::value }; typedef typename choose_default_dispatch::type Selector; typedef typename Selector::template select::type type; }; // This macro assumes that there is a class named default_##TYPE // defined before the application of the macro. This class should // have a single member class template named "select" with two // template parameters: the type of the class being created (e.g., // the iterator_adaptor type when creating iterator adaptors) and // a traits class. The select class should have a single typedef // named "type" that produces the default for TYPE. See // boost/iterator_adaptors.hpp for an example usage. Also, // applications of this macro must be placed in namespace // boost::detail. #define BOOST_NAMED_TEMPLATE_PARAM(TYPE) \ struct get_##TYPE##_from_named { \ template \ struct select { \ typedef typename NamedParams::traits NamedTraits; \ typedef typename NamedTraits::TYPE TYPE; \ typedef typename resolve_default::type type; \ }; \ }; \ struct pass_thru_##TYPE { \ template struct select { \ typedef typename resolve_default::type type; \ };\ }; \ template \ struct get_##TYPE##_dispatch { }; \ template <> struct get_##TYPE##_dispatch<1> { \ typedef get_##TYPE##_from_named type; \ }; \ template <> struct get_##TYPE##_dispatch<0> { \ typedef pass_thru_##TYPE type; \ }; \ template \ class get_##TYPE { \ enum { is_named = is_named_param_list::value }; \ typedef typename get_##TYPE##_dispatch::type Selector; \ public: \ typedef typename Selector::template select::type type; \ }; \ template <> struct default_generator { \ typedef default_##TYPE type; \ } } // namespace detail } // namespace boost #endif // BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP clucene-core-2.3.3.4/src/ext/boost/detail/no_exceptions_support.hpp000066400000000000000000000037151154025176300254000ustar00rootroot00000000000000#ifndef BOOST_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP_ #define BOOST_DETAIL_NO_EXCEPTIONS_SUPPORT_HPP_ #if (defined _MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif //---------------------------------------------------------------------- // (C) Copyright 2004 Pavel Vozenilek. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) // // // This file contains helper macros used when exception support may be // disabled (as indicated by macro BOOST_NO_EXCEPTIONS). // // Before picking up these macros you may consider using RAII techniques // to deal with exceptions - their syntax can be always the same with // or without exception support enabled. // /* Example of use: void foo() { BOOST_TRY { ... } BOOST_CATCH(const std::bad_alloc&) { ... BOOST_RETHROW } BOOST_CATCH(const std::exception& e) { ... } BOOST_CATCH_END } With exception support enabled it will expand into: void foo() { { try { ... } catch (const std::bad_alloc&) { ... throw; } catch (const std::exception& e) { ... } } } With exception support disabled it will expand into: void foo() { { if(true) { ... } else if (false) { ... } else if (false) { ... } } } */ //---------------------------------------------------------------------- #include #include #if !(defined BOOST_NO_EXCEPTIONS) # define BOOST_TRY { try # define BOOST_CATCH(x) catch(x) # define BOOST_RETHROW throw; # define BOOST_CATCH_END } #else # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) # define BOOST_TRY { if ("") # define BOOST_CATCH(x) else if (!"") # else # define BOOST_TRY { if (true) # define BOOST_CATCH(x) else if (false) # endif # define BOOST_RETHROW # define BOOST_CATCH_END } #endif #endif clucene-core-2.3.3.4/src/ext/boost/detail/none_t.hpp000066400000000000000000000011701154025176300222020ustar00rootroot00000000000000// Copyright (C) 2003, Fernando Luis Cacciola Carballal. // // Use, modification, and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/lib/optional for documentation. // // You are welcome to contact the author at: // fernando_cacciola@hotmail.com // #ifndef BOOST_DETAIL_NONE_T_17SEP2003_HPP #define BOOST_DETAIL_NONE_T_17SEP2003_HPP namespace boost { namespace detail { struct none_helper{}; typedef int none_helper::*none_t ; } // namespace detail } // namespace boost #endif clucene-core-2.3.3.4/src/ext/boost/detail/numeric_traits.hpp000066400000000000000000000151541154025176300237570ustar00rootroot00000000000000// (C) Copyright David Abrahams 2001, Howard Hinnant 2001. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Template class numeric_traits -- // // Supplies: // // typedef difference_type -- a type used to represent the difference // between any two values of Number. // // Support: // 1. Not all specializations are supplied // // 2. Use of specializations that are not supplied will cause a // compile-time error // // 3. Users are free to specialize numeric_traits for any type. // // 4. Right now, specializations are only supplied for integer types. // // 5. On implementations which do not supply compile-time constants in // std::numeric_limits<>, only specializations for built-in integer types // are supplied. // // 6. Handling of numbers whose range of representation is at least as // great as boost::intmax_t can cause some differences to be // unrepresentable in difference_type: // // Number difference_type // ------ --------------- // signed Number // unsigned intmax_t // // template typename numeric_traits::difference_type // numeric_distance(Number x, Number y) // computes (y - x), attempting to avoid overflows. // // See http://www.boost.org for most recent version including documentation. // Revision History // 11 Feb 2001 - Use BOOST_STATIC_CONSTANT (David Abrahams) // 11 Feb 2001 - Rolled back ineffective Borland-specific code // (David Abrahams) // 10 Feb 2001 - Rolled in supposed Borland fixes from John Maddock, but // not seeing any improvement yet (David Abrahams) // 06 Feb 2001 - Factored if_true out into boost/detail/select_type.hpp // (David Abrahams) // 23 Jan 2001 - Fixed logic of difference_type selection, which was // completely wack. In the process, added digit_traits<> // to compute the number of digits in intmax_t even when // not supplied by numeric_limits<>. (David Abrahams) // 21 Jan 2001 - Created (David Abrahams) #ifndef BOOST_NUMERIC_TRAITS_HPP_DWA20001901 # define BOOST_NUMERIC_TRAITS_HPP_DWA20001901 # include # include # include # include # include # include namespace boost { namespace detail { // Template class is_signed -- determine whether a numeric type is signed // Requires that T is constructable from the literals -1 and 0. Compile-time // error results if that requirement is not met (and thus signedness is not // likely to have meaning for that type). template struct is_signed { #if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) || defined(BOOST_MSVC) && BOOST_MSVC <= 1300 BOOST_STATIC_CONSTANT(bool, value = (Number(-1) < Number(0))); #else BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits::is_signed); #endif }; # ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS // digit_traits - compute the number of digits in a built-in integer // type. Needed for implementations on which numeric_limits is not specialized // for intmax_t (e.g. VC6). template struct digit_traits_select; // numeric_limits is specialized; just select that version of digits template <> struct digit_traits_select { template struct traits { BOOST_STATIC_CONSTANT(int, digits = std::numeric_limits::digits); }; }; // numeric_limits is not specialized; compute digits from sizeof(T) template <> struct digit_traits_select { template struct traits { BOOST_STATIC_CONSTANT(int, digits = ( sizeof(T) * std::numeric_limits::digits - (is_signed::value ? 1 : 0)) ); }; }; // here's the "usable" template template struct digit_traits { typedef digit_traits_select< ::std::numeric_limits::is_specialized> selector; typedef typename selector::template traits traits; BOOST_STATIC_CONSTANT(int, digits = traits::digits); }; #endif // Template class integer_traits -- traits of various integer types // This should probably be rolled into boost::integer_traits one day, but I // need it to work without template struct integer_traits { # ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS private: typedef Integer integer_type; typedef std::numeric_limits x; # if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 // for some reason, MSVC asserts when it shouldn't unless we make these // local definitions BOOST_STATIC_CONSTANT(bool, is_integer = x::is_integer); BOOST_STATIC_CONSTANT(bool, is_specialized = x::is_specialized); BOOST_STATIC_ASSERT(is_integer); BOOST_STATIC_ASSERT(is_specialized); # endif public: typedef typename if_true<(int(x::is_signed) && (!int(x::is_bounded) // digits is the number of no-sign bits || (int(x::digits) + 1 >= digit_traits::digits)))>::template then< Integer, typename if_true<(int(x::digits) + 1 < digit_traits::digits)>::template then< signed int, typename if_true<(int(x::digits) + 1 < digit_traits::digits)>::template then< signed long, // else intmax_t >::type>::type>::type difference_type; #else BOOST_STATIC_ASSERT(boost::is_integral::value); typedef typename if_true<(sizeof(Integer) >= sizeof(intmax_t))>::template then< typename if_true<(is_signed::value)>::template then< Integer, intmax_t >::type, typename if_true<(sizeof(Integer) < sizeof(std::ptrdiff_t))>::template then< std::ptrdiff_t, intmax_t >::type >::type difference_type; # endif }; // Right now, only supports integers, but should be expanded. template struct numeric_traits { typedef typename integer_traits::difference_type difference_type; }; template typename numeric_traits::difference_type numeric_distance(Number x, Number y) { typedef typename numeric_traits::difference_type difference_type; return difference_type(y) - difference_type(x); } }} #endif // BOOST_NUMERIC_TRAITS_HPP_DWA20001901 clucene-core-2.3.3.4/src/ext/boost/detail/ob_call_traits.hpp000066400000000000000000000074061154025176300237110ustar00rootroot00000000000000// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // // See http://www.boost.org/libs/utility for most recent version including documentation. // // Crippled version for crippled compilers: // see libs/utility/call_traits.htm // /* Release notes: 01st October 2000: Fixed call_traits on VC6, using "poor man's partial specialisation", using ideas taken from "Generative programming" by Krzysztof Czarnecki & Ulrich Eisenecker. */ #ifndef BOOST_OB_CALL_TRAITS_HPP #define BOOST_OB_CALL_TRAITS_HPP #ifndef BOOST_CONFIG_HPP #include #endif #ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP #include #endif #ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP #include #endif namespace boost{ #ifdef BOOST_MSVC6_MEMBER_TEMPLATES // // use member templates to emulate // partial specialisation: // namespace detail{ template struct standard_call_traits { typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef const T& param_type; }; template struct simple_call_traits { typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef const T param_type; }; template struct reference_call_traits { typedef T value_type; typedef T reference; typedef T const_reference; typedef T param_type; }; template struct call_traits_chooser { template struct rebind { typedef standard_call_traits type; }; }; template <> struct call_traits_chooser { template struct rebind { typedef simple_call_traits type; }; }; template <> struct call_traits_chooser { template struct rebind { typedef reference_call_traits type; }; }; template struct call_traits_sizeof_chooser2 { template struct small_rebind { typedef simple_call_traits small_type; }; }; template<> struct call_traits_sizeof_chooser2 { template struct small_rebind { typedef standard_call_traits small_type; }; }; template <> struct call_traits_chooser { template struct rebind { enum { sizeof_choice = (sizeof(T) <= sizeof(void*)) }; typedef call_traits_sizeof_chooser2<(sizeof(T) <= sizeof(void*))> chooser; typedef typename chooser::template small_rebind bound_type; typedef typename bound_type::small_type type; }; }; } // namespace detail template struct call_traits { private: typedef detail::call_traits_chooser< ::boost::is_pointer::value, ::boost::is_arithmetic::value, ::boost::is_reference::value > chooser; typedef typename chooser::template rebind bound_type; typedef typename bound_type::type call_traits_type; public: typedef typename call_traits_type::value_type value_type; typedef typename call_traits_type::reference reference; typedef typename call_traits_type::const_reference const_reference; typedef typename call_traits_type::param_type param_type; }; #else // // sorry call_traits is completely non-functional // blame your broken compiler: // template struct call_traits { typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef const T& param_type; }; #endif // member templates } #endif // BOOST_OB_CALL_TRAITS_HPP clucene-core-2.3.3.4/src/ext/boost/detail/ob_compressed_pair.hpp000066400000000000000000000405671154025176300245740ustar00rootroot00000000000000// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // // See http://www.boost.org/libs/utility for most recent version including documentation. // see libs/utility/compressed_pair.hpp // /* Release notes: 20 Jan 2001: Fixed obvious bugs (David Abrahams) 07 Oct 2000: Added better single argument constructor support. 03 Oct 2000: Added VC6 support (JM). 23rd July 2000: Additional comments added. (JM) Jan 2000: Original version: this version crippled for use with crippled compilers - John Maddock Jan 2000. */ #ifndef BOOST_OB_COMPRESSED_PAIR_HPP #define BOOST_OB_COMPRESSED_PAIR_HPP #include #ifndef BOOST_OBJECT_TYPE_TRAITS_HPP #include #endif #ifndef BOOST_SAME_TRAITS_HPP #include #endif #ifndef BOOST_CALL_TRAITS_HPP #include #endif namespace boost { #ifdef BOOST_MSVC6_MEMBER_TEMPLATES // // use member templates to emulate // partial specialisation. Note that due to // problems with overload resolution with VC6 // each of the compressed_pair versions that follow // have one template single-argument constructor // in place of two specific constructors: // template class compressed_pair; namespace detail{ template struct best_conversion_traits { typedef char one; typedef char (&two)[2]; static A a; static one test(T1); static two test(T2); enum { value = sizeof(test(a)) }; }; template struct init_one; template <> struct init_one<1> { template static void init(const A& a, T1* p1, T2*) { *p1 = a; } }; template <> struct init_one<2> { template static void init(const A& a, T1*, T2* p2) { *p2 = a; } }; // T1 != T2, both non-empty template class compressed_pair_0 { private: T1 _first; T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_0() : _first(), _second() {} compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {} template explicit compressed_pair_0(const A& val) { init_one::value>::init(val, &_first, &_second); } compressed_pair_0(const ::boost::compressed_pair& x) : _first(x.first()), _second(x.second()) {} #if 0 compressed_pair_0& operator=(const compressed_pair_0& x) { cout << "assigning compressed pair 0" << endl; _first = x._first; _second = x._second; cout << "finished assigning compressed pair 0" << endl; return *this; } #endif first_reference first() { return _first; } first_const_reference first() const { return _first; } second_reference second() { return _second; } second_const_reference second() const { return _second; } void swap(compressed_pair_0& y) { using std::swap; swap(_first, y._first); swap(_second, y._second); } }; // T1 != T2, T2 empty template class compressed_pair_1 : T2 { private: T1 _first; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_1() : T2(), _first() {} compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {} template explicit compressed_pair_1(const A& val) { init_one::value>::init(val, &_first, static_cast(this)); } compressed_pair_1(const ::boost::compressed_pair& x) : T2(x.second()), _first(x.first()) {} #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 // Total weirdness. If the assignment to _first is moved after // the call to the inherited operator=, then this breaks graph/test/graph.cpp // by way of iterator_adaptor. compressed_pair_1& operator=(const compressed_pair_1& x) { _first = x._first; T2::operator=(x); return *this; } #endif first_reference first() { return _first; } first_const_reference first() const { return _first; } second_reference second() { return *this; } second_const_reference second() const { return *this; } void swap(compressed_pair_1& y) { // no need to swap empty base class: using std::swap; swap(_first, y._first); } }; // T1 != T2, T1 empty template class compressed_pair_2 : T1 { private: T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_2() : T1(), _second() {} compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {} template explicit compressed_pair_2(const A& val) { init_one::value>::init(val, static_cast(this), &_second); } compressed_pair_2(const ::boost::compressed_pair& x) : T1(x.first()), _second(x.second()) {} #if 0 compressed_pair_2& operator=(const compressed_pair_2& x) { cout << "assigning compressed pair 2" << endl; T1::operator=(x); _second = x._second; cout << "finished assigning compressed pair 2" << endl; return *this; } #endif first_reference first() { return *this; } first_const_reference first() const { return *this; } second_reference second() { return _second; } second_const_reference second() const { return _second; } void swap(compressed_pair_2& y) { // no need to swap empty base class: using std::swap; swap(_second, y._second); } }; // T1 != T2, both empty template class compressed_pair_3 : T1, T2 { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_3() : T1(), T2() {} compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {} template explicit compressed_pair_3(const A& val) { init_one::value>::init(val, static_cast(this), static_cast(this)); } compressed_pair_3(const ::boost::compressed_pair& x) : T1(x.first()), T2(x.second()) {} first_reference first() { return *this; } first_const_reference first() const { return *this; } second_reference second() { return *this; } second_const_reference second() const { return *this; } void swap(compressed_pair_3& y) { // no need to swap empty base classes: } }; // T1 == T2, and empty template class compressed_pair_4 : T1 { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_4() : T1() {} compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {} // only one single argument constructor since T1 == T2 explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {} compressed_pair_4(const ::boost::compressed_pair& x) : T1(x.first()), m_second(x.second()) {} first_reference first() { return *this; } first_const_reference first() const { return *this; } second_reference second() { return m_second; } second_const_reference second() const { return m_second; } void swap(compressed_pair_4& y) { // no need to swap empty base classes: } private: T2 m_second; }; // T1 == T2, not empty template class compressed_pair_5 { private: T1 _first; T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair_5() : _first(), _second() {} compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {} // only one single argument constructor since T1 == T2 explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {} compressed_pair_5(const ::boost::compressed_pair& c) : _first(c.first()), _second(c.second()) {} first_reference first() { return _first; } first_const_reference first() const { return _first; } second_reference second() { return _second; } second_const_reference second() const { return _second; } void swap(compressed_pair_5& y) { using std::swap; swap(_first, y._first); swap(_second, y._second); } }; template struct compressed_pair_chooser { template struct rebind { typedef compressed_pair_0 type; }; }; template <> struct compressed_pair_chooser { template struct rebind { typedef compressed_pair_1 type; }; }; template <> struct compressed_pair_chooser { template struct rebind { typedef compressed_pair_2 type; }; }; template <> struct compressed_pair_chooser { template struct rebind { typedef compressed_pair_3 type; }; }; template <> struct compressed_pair_chooser { template struct rebind { typedef compressed_pair_4 type; }; }; template <> struct compressed_pair_chooser { template struct rebind { typedef compressed_pair_5 type; }; }; template struct compressed_pair_traits { private: typedef compressed_pair_chooser::value, is_empty::value, is_same::value> chooser; typedef typename chooser::template rebind bound_type; public: typedef typename bound_type::type type; }; } // namespace detail template class compressed_pair : public detail::compressed_pair_traits::type { private: typedef typename detail::compressed_pair_traits::type base_type; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair() : base_type() {} compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {} template explicit compressed_pair(const A& x) : base_type(x){} first_reference first() { return base_type::first(); } first_const_reference first() const { return base_type::first(); } second_reference second() { return base_type::second(); } second_const_reference second() const { return base_type::second(); } }; template inline void swap(compressed_pair& x, compressed_pair& y) { x.swap(y); } #else // no partial specialisation, no member templates: template class compressed_pair { private: T1 _first; T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits::param_type first_param_type; typedef typename call_traits::param_type second_param_type; typedef typename call_traits::reference first_reference; typedef typename call_traits::reference second_reference; typedef typename call_traits::const_reference first_const_reference; typedef typename call_traits::const_reference second_const_reference; compressed_pair() : _first(), _second() {} compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {} explicit compressed_pair(first_param_type x) : _first(x), _second() {} // can't define this in case T1 == T2: // explicit compressed_pair(second_param_type y) : _first(), _second(y) {} first_reference first() { return _first; } first_const_reference first() const { return _first; } second_reference second() { return _second; } second_const_reference second() const { return _second; } void swap(compressed_pair& y) { using std::swap; swap(_first, y._first); swap(_second, y._second); } }; template inline void swap(compressed_pair& x, compressed_pair& y) { x.swap(y); } #endif } // boost #endif // BOOST_OB_COMPRESSED_PAIR_HPP clucene-core-2.3.3.4/src/ext/boost/detail/quick_allocator.hpp000066400000000000000000000011361154025176300240760ustar00rootroot00000000000000#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED #define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/quick_allocator.hpp // // Copyright (c) 2003 David Abrahams // Copyright (c) 2003 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #include #endif // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/reference_content.hpp000066400000000000000000000057161154025176300244220ustar00rootroot00000000000000//----------------------------------------------------------------------------- // boost detail/reference_content.hpp header file // See http://www.boost.org for updates, documentation, and revision history. //----------------------------------------------------------------------------- // // Copyright (c) 2003 // Eric Friedman // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_DETAIL_REFERENCE_CONTENT_HPP #define BOOST_DETAIL_REFERENCE_CONTENT_HPP #include "boost/config.hpp" #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) # include "boost/mpl/bool.hpp" # include "boost/type_traits/has_nothrow_copy.hpp" #else # include "boost/mpl/if.hpp" # include "boost/type_traits/is_reference.hpp" #endif #include "boost/mpl/void.hpp" namespace boost { namespace detail { /////////////////////////////////////////////////////////////////////////////// // (detail) class template reference_content // // Non-Assignable wrapper for references. // template class reference_content { private: // representation RefT content_; public: // structors ~reference_content() { } reference_content(RefT r) : content_( r ) { } reference_content(const reference_content& operand) : content_( operand.content_ ) { } private: // non-Assignable reference_content& operator=(const reference_content&); public: // queries RefT get() const { return content_; } }; /////////////////////////////////////////////////////////////////////////////// // (detail) metafunction make_reference_content // // Wraps with reference_content if specified type is reference. // template struct make_reference_content; #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template struct make_reference_content { typedef T type; }; template struct make_reference_content< T& > { typedef reference_content type; }; #else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template struct make_reference_content : mpl::if_< is_reference , reference_content , T > { }; #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround template <> struct make_reference_content< mpl::void_ > { template struct apply : make_reference_content { }; typedef mpl::void_ type; }; } // namespace detail /////////////////////////////////////////////////////////////////////////////// // reference_content type traits specializations // #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template struct has_nothrow_copy< ::boost::detail::reference_content< T& > > : mpl::true_ { }; #endif // !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) } // namespace boost #endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP clucene-core-2.3.3.4/src/ext/boost/detail/scoped_enum_emulation.hpp000066400000000000000000000036371154025176300253100ustar00rootroot00000000000000// scoped_enum_emulation.hpp ---------------------------------------------------------// // Copyright Beman Dawes, 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // Generates C++0x scoped enums if the feature is present, otherwise emulates C++0x // scoped enums with C++03 namespaces and enums. The Boost.Config BOOST_NO_SCOPED_ENUMS // macro is used to detect feature support. // // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf for a // description of the scoped enum feature. Note that the committee changed the name // from strongly typed enum to scoped enum. // // Caution: only the syntax is emulated; the semantics are not emulated and // the syntax emulation doesn't include being able to specify the underlying // representation type. // // The emulation is via struct rather than namespace to allow use within classes. // Thanks to Andrey Semashev for pointing that out. // // Helpful comments and suggestions were also made by Kjell Elster, Phil Endecott, // Joel Falcou, Mathias Gaunard, Felipe Magno de Almeida, Matt Calabrese, Vincente // Botet, and Daniel James. // // Sample usage: // // BOOST_SCOPED_ENUM_START(algae) { green, red, cyan }; BOOST_SCOPED_ENUM_END // ... // BOOST_SCOPED_ENUM(algae) sample( algae::red ); // void foo( BOOST_SCOPED_ENUM(algae) color ); // ... // sample = algae::green; // foo( algae::cyan ); #ifndef BOOST_SCOPED_ENUM_EMULATION_HPP #define BOOST_SCOPED_ENUM_EMULATION_HPP #include #ifdef BOOST_NO_SCOPED_ENUMS # define BOOST_SCOPED_ENUM_START(name) struct name { enum enum_t # define BOOST_SCOPED_ENUM_END }; # define BOOST_SCOPED_ENUM(name) name::enum_t #else # define BOOST_SCOPED_ENUM_START(name) enum class name # define BOOST_SCOPED_ENUM_END # define BOOST_SCOPED_ENUM(name) name #endif #endif // BOOST_SCOPED_ENUM_EMULATION_HPP clucene-core-2.3.3.4/src/ext/boost/detail/select_type.hpp000066400000000000000000000021521154025176300232410ustar00rootroot00000000000000// (C) Copyright David Abrahams 2001. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org for most recent version including documentation. // Revision History // 09 Feb 01 Applied John Maddock's Borland patch Moving // specialization to unspecialized template (David Abrahams) // 06 Feb 01 Created (David Abrahams) #ifndef SELECT_TYPE_DWA20010206_HPP # define SELECT_TYPE_DWA20010206_HPP namespace boost { namespace detail { // Template class if_true -- select among 2 types based on a bool constant expression // Usage: // typename if_true<(bool_const_expression)>::template then::type // HP aCC cannot deal with missing names for template value parameters template struct if_true { template struct then { typedef T type; }; }; template <> struct if_true { template struct then { typedef F type; }; }; }} #endif // SELECT_TYPE_DWA20010206_HPP clucene-core-2.3.3.4/src/ext/boost/detail/sp_typeinfo.hpp000066400000000000000000000041661154025176300232670ustar00rootroot00000000000000#ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED #define BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // detail/sp_typeinfo.hpp // // Copyright 2007 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #if defined( BOOST_NO_TYPEID ) #include #include namespace boost { namespace detail { class sp_typeinfo { private: sp_typeinfo( sp_typeinfo const& ); sp_typeinfo& operator=( sp_typeinfo const& ); char const * name_; public: explicit sp_typeinfo( char const * name ): name_( name ) { } bool operator==( sp_typeinfo const& rhs ) const { return this == &rhs; } bool operator!=( sp_typeinfo const& rhs ) const { return this != &rhs; } bool before( sp_typeinfo const& rhs ) const { return std::less< sp_typeinfo const* >()( this, &rhs ); } char const* name() const { return name_; } }; template struct sp_typeid_ { static sp_typeinfo ti_; static char const * name() { return BOOST_CURRENT_FUNCTION; } }; template sp_typeinfo sp_typeid_< T >::ti_( sp_typeid_< T >::name() ); template struct sp_typeid_< T & >: sp_typeid_< T > { }; template struct sp_typeid_< T const >: sp_typeid_< T > { }; template struct sp_typeid_< T volatile >: sp_typeid_< T > { }; template struct sp_typeid_< T const volatile >: sp_typeid_< T > { }; } // namespace detail } // namespace boost #define BOOST_SP_TYPEID(T) (boost::detail::sp_typeid_::ti_) #else #include namespace boost { namespace detail { #if defined( BOOST_NO_STD_TYPEINFO ) typedef ::type_info sp_typeinfo; #else typedef std::type_info sp_typeinfo; #endif } // namespace detail } // namespace boost #define BOOST_SP_TYPEID(T) typeid(T) #endif #endif // #ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/detail/templated_streams.hpp000066400000000000000000000043021154025176300244350ustar00rootroot00000000000000//----------------------------------------------------------------------------- // boost detail/templated_streams.hpp header file // See http://www.boost.org for updates, documentation, and revision history. //----------------------------------------------------------------------------- // // Copyright (c) 2003 // Eric Friedman // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_DETAIL_TEMPLATED_STREAMS_HPP #define BOOST_DETAIL_TEMPLATED_STREAMS_HPP #include "boost/config.hpp" /////////////////////////////////////////////////////////////////////////////// // (detail) BOOST_TEMPLATED_STREAM_* macros // // Provides workaround platforms without stream class templates. // #if !defined(BOOST_NO_STD_LOCALE) #define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) \ template < typename E , typename T > #define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) \ template < typename E , typename T , typename A > #define BOOST_TEMPLATED_STREAM_ARGS(E,T) \ typename E , typename T #define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) \ typename E , typename T , typename A #define BOOST_TEMPLATED_STREAM_COMMA , #define BOOST_TEMPLATED_STREAM_ELEM(E) E #define BOOST_TEMPLATED_STREAM_TRAITS(T) T #define BOOST_TEMPLATED_STREAM_ALLOC(A) A #define BOOST_TEMPLATED_STREAM(X,E,T) \ BOOST_JOIN(std::basic_,X)< E , T > #define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \ BOOST_JOIN(std::basic_,X)< E , T , A > #else // defined(BOOST_NO_STD_LOCALE) #define BOOST_TEMPLATED_STREAM_TEMPLATE(E,T) /**/ #define BOOST_TEMPLATED_STREAM_TEMPLATE_ALLOC(E,T,A) /**/ #define BOOST_TEMPLATED_STREAM_ARGS(E,T) /**/ #define BOOST_TEMPLATED_STREAM_ARGS_ALLOC(E,T,A) /**/ #define BOOST_TEMPLATED_STREAM_COMMA /**/ #define BOOST_TEMPLATED_STREAM_ELEM(E) char #define BOOST_TEMPLATED_STREAM_TRAITS(T) std::char_traits #define BOOST_TEMPLATED_STREAM_ALLOC(A) std::allocator #define BOOST_TEMPLATED_STREAM(X,E,T) \ std::X #define BOOST_TEMPLATED_STREAM_WITH_ALLOC(X,E,T,A) \ std::X #endif // BOOST_NO_STD_LOCALE #endif // BOOST_DETAIL_TEMPLATED_STREAMS_HPP clucene-core-2.3.3.4/src/ext/boost/detail/utf8_codecvt_facet.hpp000066400000000000000000000153471154025176300244720ustar00rootroot00000000000000// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu) // Andrew Lumsdaine, Indiana University (lums@osl.iu.edu). // Distributed under the Boost Software License, Version 1.0. (See accompany- // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_UTF8_CODECVT_FACET_HPP #define BOOST_UTF8_CODECVT_FACET_HPP // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // utf8_codecvt_facet.hpp // This header defines class utf8_codecvt_facet, derived fro // std::codecvt, which can be used to convert utf8 data in // files into wchar_t strings in the application. // // The header is NOT STANDALONE, and is not to be included by the USER. // There are at least two libraries which want to use this functionality, and // we want to avoid code duplication. It would be possible to create utf8 // library, but: // - this requires review process first // - in the case, when linking the a library which uses utf8 // (say 'program_options'), user should also link to the utf8 library. // This seems inconvenient, and asking a user to link to an unrevieved // library is strange. // Until the above points are fixed, a library which wants to use utf8 must: // - include this header from one of it's headers or sources // - include the corresponding .cpp file from one of the sources // - before including either file, the library must define // - BOOST_UTF8_BEGIN_NAMESPACE to the namespace declaration that must be used // - BOOST_UTF8_END_NAMESPACE to the code to close the previous namespace // - declaration. // - BOOST_UTF8_DECL -- to the code which must be used for all 'exportable' // symbols. // // For example, program_options library might contain: // #define BOOST_UTF8_BEGIN_NAMESPACE // namespace boost { namespace program_options { // #define BOOST_UTF8_END_NAMESPACE }} // #define BOOST_UTF8_DECL BOOST_PROGRAM_OPTIONS_DECL // #include "../../detail/utf8/utf8_codecvt.cpp" // // Essentially, each library will have its own copy of utf8 code, in // different namespaces. // Note:(Robert Ramey). I have made the following alterations in the original // code. // a) Rendered utf8_codecvt with using templates // b) Move longer functions outside class definition to prevent inlining // and make code smaller // c) added on a derived class to permit translation to/from current // locale to utf8 // See http://www.boost.org for updates, documentation, and revision history. // archives stored as text - note these ar templated on the basic // stream templates to accommodate wide (and other?) kind of characters // // note the fact that on libraries without wide characters, ostream is // is not a specialization of basic_ostream which in fact is not defined // in such cases. So we can't use basic_ostream but rather // use two template parameters // // utf8_codecvt_facet // This is an implementation of a std::codecvt facet for translating // from UTF-8 externally to UCS-4. Note that this is not tied to // any specific types in order to allow customization on platforms // where wchar_t is not big enough. // // NOTES: The current implementation jumps through some unpleasant hoops in // order to deal with signed character types. As a std::codecvt_base::result, // it is necessary for the ExternType to be convertible to unsigned char. // I chose not to tie the extern_type explicitly to char. But if any combination // of types other than is used, then std::codecvt must be // specialized on those types for this to work. #include #include // for mbstate_t #include // for std::size_t #include #include #if defined(BOOST_NO_STDC_NAMESPACE) namespace std { using ::mbstate_t; using ::size_t; } #endif #if !defined(__MSL_CPP__) && !defined(__LIBCOMO__) #define BOOST_CODECVT_DO_LENGTH_CONST const #else #define BOOST_CODECVT_DO_LENGTH_CONST #endif // maximum lenght of a multibyte string #define MB_LENGTH_MAX 8 BOOST_UTF8_BEGIN_NAMESPACE struct BOOST_UTF8_DECL utf8_codecvt_facet : public std::codecvt { public: explicit utf8_codecvt_facet(std::size_t no_locale_manage=0) : std::codecvt(no_locale_manage) {} protected: virtual std::codecvt_base::result do_in( std::mbstate_t& state, const char * from, const char * from_end, const char * & from_next, wchar_t * to, wchar_t * to_end, wchar_t*& to_next ) const; virtual std::codecvt_base::result do_out( std::mbstate_t & state, const wchar_t * from, const wchar_t * from_end, const wchar_t* & from_next, char * to, char * to_end, char * & to_next ) const; bool invalid_continuing_octet(unsigned char octet_1) const { return (octet_1 < 0x80|| 0xbf< octet_1); } bool invalid_leading_octet(unsigned char octet_1) const { return (0x7f < octet_1 && octet_1 < 0xc0) || (octet_1 > 0xfd); } // continuing octets = octets except for the leading octet static unsigned int get_cont_octet_count(unsigned char lead_octet) { return get_octet_count(lead_octet) - 1; } static unsigned int get_octet_count(unsigned char lead_octet); // How many "continuing octets" will be needed for this word // == total octets - 1. int get_cont_octet_out_count(wchar_t word) const ; virtual bool do_always_noconv() const throw() { return false; } // UTF-8 isn't really stateful since we rewind on partial conversions virtual std::codecvt_base::result do_unshift( std::mbstate_t&, char * from, char * /*to*/, char * & next ) const { next = from; return ok; } virtual int do_encoding() const throw() { const int variable_byte_external_encoding=0; return variable_byte_external_encoding; } // How many char objects can I process to get <= max_limit // wchar_t objects? virtual int do_length( BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &, const char * from, const char * from_end, std::size_t max_limit #if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) ) const throw(); #else ) const; #endif // Largest possible value do_length(state,from,from_end,1) could return. virtual int do_max_length() const throw () { return 6; // largest UTF-8 encoding of a UCS-4 character } }; BOOST_UTF8_END_NAMESPACE #endif // BOOST_UTF8_CODECVT_FACET_HPP clucene-core-2.3.3.4/src/ext/boost/detail/workaround.hpp000066400000000000000000000157561154025176300231320ustar00rootroot00000000000000// Copyright David Abrahams 2002. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef WORKAROUND_DWA2002126_HPP # define WORKAROUND_DWA2002126_HPP // Compiler/library version workaround macro // // Usage: // // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // // workaround for eVC4 and VC6 // ... // workaround code here // #endif // // When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the // first argument must be undefined or expand to a numeric // value. The above expands to: // // (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300 // // When used for workarounds that apply to the latest known version // and all earlier versions of a compiler, the following convention // should be observed: // // #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301)) // // The version number in this case corresponds to the last version in // which the workaround was known to have been required. When // BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro // BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates // the workaround for any version of the compiler. When // BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or // error will be issued if the compiler version exceeds the argument // to BOOST_TESTED_AT(). This can be used to locate workarounds which // may be obsoleted by newer versions. # ifndef BOOST_STRICT_CONFIG #include #ifndef __BORLANDC__ #define __BORLANDC___WORKAROUND_GUARD 1 #else #define __BORLANDC___WORKAROUND_GUARD 0 #endif #ifndef __CODEGEARC__ #define __CODEGEARC___WORKAROUND_GUARD 1 #else #define __CODEGEARC___WORKAROUND_GUARD 0 #endif #ifndef _MSC_VER #define _MSC_VER_WORKAROUND_GUARD 1 #else #define _MSC_VER_WORKAROUND_GUARD 0 #endif #ifndef _MSC_FULL_VER #define _MSC_FULL_VER_WORKAROUND_GUARD 1 #else #define _MSC_FULL_VER_WORKAROUND_GUARD 0 #endif #ifndef BOOST_MSVC #define BOOST_MSVC_WORKAROUND_GUARD 1 #else #define BOOST_MSVC_WORKAROUND_GUARD 0 #endif #ifndef __GNUC__ #define __GNUC___WORKAROUND_GUARD 1 #else #define __GNUC___WORKAROUND_GUARD 0 #endif #ifndef __GNUC_MINOR__ #define __GNUC_MINOR___WORKAROUND_GUARD 1 #else #define __GNUC_MINOR___WORKAROUND_GUARD 0 #endif #ifndef __GNUC_PATCHLEVEL__ #define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1 #else #define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0 #endif #ifndef __IBMCPP__ #define __IBMCPP___WORKAROUND_GUARD 1 #else #define __IBMCPP___WORKAROUND_GUARD 0 #endif #ifndef __SUNPRO_CC #define __SUNPRO_CC_WORKAROUND_GUARD 1 #else #define __SUNPRO_CC_WORKAROUND_GUARD 0 #endif #ifndef __DECCXX_VER #define __DECCXX_VER_WORKAROUND_GUARD 1 #else #define __DECCXX_VER_WORKAROUND_GUARD 0 #endif #ifndef __MWERKS__ #define __MWERKS___WORKAROUND_GUARD 1 #else #define __MWERKS___WORKAROUND_GUARD 0 #endif #ifndef __EDG__ #define __EDG___WORKAROUND_GUARD 1 #else #define __EDG___WORKAROUND_GUARD 0 #endif #ifndef __EDG_VERSION__ #define __EDG_VERSION___WORKAROUND_GUARD 1 #else #define __EDG_VERSION___WORKAROUND_GUARD 0 #endif #ifndef __HP_aCC #define __HP_aCC_WORKAROUND_GUARD 1 #else #define __HP_aCC_WORKAROUND_GUARD 0 #endif #ifndef __hpxstd98 #define __hpxstd98_WORKAROUND_GUARD 1 #else #define __hpxstd98_WORKAROUND_GUARD 0 #endif #ifndef _CRAYC #define _CRAYC_WORKAROUND_GUARD 1 #else #define _CRAYC_WORKAROUND_GUARD 0 #endif #ifndef __DMC__ #define __DMC___WORKAROUND_GUARD 1 #else #define __DMC___WORKAROUND_GUARD 0 #endif #ifndef MPW_CPLUS #define MPW_CPLUS_WORKAROUND_GUARD 1 #else #define MPW_CPLUS_WORKAROUND_GUARD 0 #endif #ifndef __COMO__ #define __COMO___WORKAROUND_GUARD 1 #else #define __COMO___WORKAROUND_GUARD 0 #endif #ifndef __COMO_VERSION__ #define __COMO_VERSION___WORKAROUND_GUARD 1 #else #define __COMO_VERSION___WORKAROUND_GUARD 0 #endif #ifndef __INTEL_COMPILER #define __INTEL_COMPILER_WORKAROUND_GUARD 1 #else #define __INTEL_COMPILER_WORKAROUND_GUARD 0 #endif #ifndef __ICL #define __ICL_WORKAROUND_GUARD 1 #else #define __ICL_WORKAROUND_GUARD 0 #endif #ifndef _COMPILER_VERSION #define _COMPILER_VERSION_WORKAROUND_GUARD 1 #else #define _COMPILER_VERSION_WORKAROUND_GUARD 0 #endif #ifndef _RWSTD_VER #define _RWSTD_VER_WORKAROUND_GUARD 1 #else #define _RWSTD_VER_WORKAROUND_GUARD 0 #endif #ifndef BOOST_RWSTD_VER #define BOOST_RWSTD_VER_WORKAROUND_GUARD 1 #else #define BOOST_RWSTD_VER_WORKAROUND_GUARD 0 #endif #ifndef __GLIBCPP__ #define __GLIBCPP___WORKAROUND_GUARD 1 #else #define __GLIBCPP___WORKAROUND_GUARD 0 #endif #ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC #define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1 #else #define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0 #endif #ifndef __SGI_STL_PORT #define __SGI_STL_PORT_WORKAROUND_GUARD 1 #else #define __SGI_STL_PORT_WORKAROUND_GUARD 0 #endif #ifndef _STLPORT_VERSION #define _STLPORT_VERSION_WORKAROUND_GUARD 1 #else #define _STLPORT_VERSION_WORKAROUND_GUARD 0 #endif #ifndef __LIBCOMO_VERSION__ #define __LIBCOMO_VERSION___WORKAROUND_GUARD 1 #else #define __LIBCOMO_VERSION___WORKAROUND_GUARD 0 #endif #ifndef _CPPLIB_VER #define _CPPLIB_VER_WORKAROUND_GUARD 1 #else #define _CPPLIB_VER_WORKAROUND_GUARD 0 #endif #ifndef BOOST_INTEL_CXX_VERSION #define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1 #else #define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0 #endif #ifndef BOOST_INTEL_WIN #define BOOST_INTEL_WIN_WORKAROUND_GUARD 1 #else #define BOOST_INTEL_WIN_WORKAROUND_GUARD 0 #endif #ifndef BOOST_DINKUMWARE_STDLIB #define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1 #else #define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0 #endif #ifndef BOOST_INTEL #define BOOST_INTEL_WORKAROUND_GUARD 1 #else #define BOOST_INTEL_WORKAROUND_GUARD 0 #endif // Always define to zero, if it's used it'll be defined my MPL: #define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0 # define BOOST_WORKAROUND(symbol, test) \ ((symbol ## _WORKAROUND_GUARD + 0 == 0) && \ (symbol != 0) && (1 % (( (symbol test) ) + 1))) // ^ ^ ^ ^ // The extra level of parenthesis nesting above, along with the // BOOST_OPEN_PAREN indirection below, is required to satisfy the // broken preprocessor in MWCW 8.3 and earlier. // // The basic mechanism works as follows: // (symbol test) + 1 => if (symbol test) then 2 else 1 // 1 % ((symbol test) + 1) => if (symbol test) then 1 else 0 // // The complication with % is for cooperation with BOOST_TESTED_AT(). // When "test" is BOOST_TESTED_AT(x) and // BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined, // // symbol test => if (symbol <= x) then 1 else -1 // (symbol test) + 1 => if (symbol <= x) then 2 else 0 // 1 % ((symbol test) + 1) => if (symbol <= x) then 1 else divide-by-zero // # ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS # define BOOST_OPEN_PAREN ( # define BOOST_TESTED_AT(value) > value) ?(-1): BOOST_OPEN_PAREN 1 # else # define BOOST_TESTED_AT(value) != ((value)-(value)) # endif # else # define BOOST_WORKAROUND(symbol, test) 0 # endif #endif // WORKAROUND_DWA2002126_HPP clucene-core-2.3.3.4/src/ext/boost/exception/000077500000000000000000000000001154025176300207445ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/exception/all.hpp000066400000000000000000000025121154025176300222250ustar00rootroot00000000000000//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_316FDA946C0D11DEA9CBAE5255D89593 #define UUID_316FDA946C0D11DEA9CBAE5255D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef BOOST_NO_EXCEPTIONS #include #include #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/current_exception_cast.hpp000066400000000000000000000016711154025176300262340ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_7E83C166200811DE885E826156D89593 #define UUID_7E83C166200811DE885E826156D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif namespace boost { template inline E * current_exception_cast() { try { throw; } catch( E & e ) { return &e; } catch( ...) { return 0; } } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/detail/000077500000000000000000000000001154025176300222065ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/exception/detail/attribute_noreturn.hpp000066400000000000000000000010121154025176300266500ustar00rootroot00000000000000//Copyright (c) 2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_61531AB0680611DEADD5846855D89593 #define UUID_61531AB0680611DEADD5846855D89593 #if defined(_MSC_VER) #define BOOST_ATTRIBUTE_NORETURN __declspec(noreturn) #elif defined(__GNUC__) #define BOOST_ATTRIBUTE_NORETURN __attribute__((noreturn)) #else #define BOOST_ATTRIBUTE_NORETURN #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/detail/error_info_impl.hpp000066400000000000000000000031251154025176300261050ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_CE6983AC753411DDA764247956D89593 #define UUID_CE6983AC753411DDA764247956D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include namespace boost { namespace exception_detail { class error_info_base { public: virtual char const * tag_typeid_name() const = 0; virtual std::string value_as_string() const = 0; protected: ~error_info_base() throw() { } }; } template class error_info: public exception_detail::error_info_base { public: typedef T value_type; error_info( value_type const & value ); ~error_info() throw(); value_type const & value() const { return value_; } value_type & value() { return value_; } private: char const * tag_typeid_name() const; std::string value_as_string() const; value_type value_; }; } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/detail/exception_ptr.hpp000066400000000000000000000306511154025176300256070ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_618474C2DE1511DEB74A388C56D89593 #define UUID_618474C2DE1511DEB74A388C56D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #ifdef BOOST_NO_EXCEPTIONS #error This header requires exception handling to be enabled. #endif #include #include #include #include #include #include #include #include namespace boost { #ifndef BOOST_NO_RTTI typedef error_info original_exception_type; inline std::string to_string( original_exception_type const & x ) { return x.value()->name(); } #endif class exception_ptr; exception_ptr current_exception(); void rethrow_exception( exception_ptr const & ); class exception_ptr { typedef bool exception_ptr::*unspecified_bool_type; friend exception_ptr current_exception(); friend void rethrow_exception( exception_ptr const & ); shared_ptr c_; bool bad_alloc_; struct bad_alloc_tag { }; explicit exception_ptr( bad_alloc_tag ): bad_alloc_(true) { } explicit exception_ptr( shared_ptr const & c ): c_(c), bad_alloc_(false) { BOOST_ASSERT(c); } void rethrow() const { BOOST_ASSERT(*this); if( bad_alloc_ ) throw enable_current_exception(std::bad_alloc()); else c_->rethrow(); } bool empty() const { return !bad_alloc_ && !c_; } public: exception_ptr(): bad_alloc_(false) { } ~exception_ptr() throw() { } operator unspecified_bool_type() const { return empty() ? 0 : &exception_ptr::bad_alloc_; } friend bool operator==( exception_ptr const & a, exception_ptr const & b ) { return a.c_==b.c_ && a.bad_alloc_==b.bad_alloc_; } friend bool operator!=( exception_ptr const & a, exception_ptr const & b ) { return !(a==b); } }; class unknown_exception: public exception, public std::exception, public exception_detail::clone_base { public: unknown_exception() { } explicit unknown_exception( std::exception const & e ) { add_original_type(e); } explicit unknown_exception( boost::exception const & e ): boost::exception(e) { add_original_type(e); } ~unknown_exception() throw() { } private: exception_detail::clone_base const * clone() const { return new unknown_exception(*this); } void rethrow() const { throw*this; } template void add_original_type( E const & e ) { #ifndef BOOST_NO_RTTI (*this) << original_exception_type(&typeid(e)); #endif } }; namespace exception_detail { template class current_exception_std_exception_wrapper: public T, public boost::exception, public clone_base { public: explicit current_exception_std_exception_wrapper( T const & e1 ): T(e1) { add_original_type(e1); } current_exception_std_exception_wrapper( T const & e1, boost::exception const & e2 ): T(e1), boost::exception(e2) { add_original_type(e1); } ~current_exception_std_exception_wrapper() throw() { } private: clone_base const * clone() const { return new current_exception_std_exception_wrapper(*this); } void rethrow() const { throw *this; } template void add_original_type( E const & e ) { #ifndef BOOST_NO_RTTI (*this) << original_exception_type(&typeid(e)); #endif } }; #ifdef BOOST_NO_RTTI template exception const * get_boost_exception( T const * ) { try { throw; } catch( exception & x ) { return &x; } catch(...) { return 0; } } #else template exception const * get_boost_exception( T const * x ) { return dynamic_cast(x); } #endif template inline shared_ptr current_exception_std_exception( T const & e1 ) { if( boost::exception const * e2 = get_boost_exception(&e1) ) return shared_ptr const>(new current_exception_std_exception_wrapper(e1,*e2)); else return shared_ptr const>(new current_exception_std_exception_wrapper(e1)); } inline shared_ptr current_exception_unknown_exception() { return shared_ptr(new unknown_exception()); } inline shared_ptr current_exception_unknown_boost_exception( boost::exception const & e ) { return shared_ptr(new unknown_exception(e)); } inline shared_ptr current_exception_unknown_std_exception( std::exception const & e ) { if( boost::exception const * be = get_boost_exception(&e) ) return current_exception_unknown_boost_exception(*be); else return shared_ptr(new unknown_exception(e)); } inline shared_ptr current_exception_impl() { try { throw; } catch( exception_detail::clone_base & e ) { return shared_ptr(e.clone()); } catch( std::domain_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::invalid_argument & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::length_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::out_of_range & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::logic_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::range_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::overflow_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::underflow_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::ios_base::failure & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::runtime_error & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::bad_alloc & e ) { return exception_detail::current_exception_std_exception(e); } #ifndef BOOST_NO_TYPEID catch( std::bad_cast & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::bad_typeid & e ) { return exception_detail::current_exception_std_exception(e); } #endif catch( std::bad_exception & e ) { return exception_detail::current_exception_std_exception(e); } catch( std::exception & e ) { return exception_detail::current_exception_unknown_std_exception(e); } catch( boost::exception & e ) { return exception_detail::current_exception_unknown_boost_exception(e); } catch( ... ) { return exception_detail::current_exception_unknown_exception(); } } } inline exception_ptr current_exception() { try { return exception_ptr(exception_detail::current_exception_impl()); } catch( std::bad_alloc & ) { } catch( ... ) { try { return exception_ptr(exception_detail::current_exception_std_exception(std::bad_exception())); } catch( std::bad_alloc & ) { } catch( ... ) { BOOST_ASSERT(0); } } return exception_ptr(exception_ptr::bad_alloc_tag()); } template inline exception_ptr copy_exception( T const & e ) { try { throw enable_current_exception(e); } catch( ... ) { return current_exception(); } } inline void rethrow_exception( exception_ptr const & p ) { p.rethrow(); } inline std::string diagnostic_information( exception_ptr const & p ) { if( p ) try { rethrow_exception(p); } catch( ... ) { return current_exception_diagnostic_information(); } return ""; } inline std::string to_string( exception_ptr const & p ) { std::string s='\n'+diagnostic_information(p); std::string padding(" "); std::string r; bool f=false; for( std::string::const_iterator i=s.begin(),e=s.end(); i!=e; ++i ) { if( f ) r+=padding; char c=*i; r+=c; f=(c=='\n'); } return r; } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/detail/is_output_streamable.hpp000066400000000000000000000025071154025176300271550ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_898984B4076411DD973EDFA055D89593 #define UUID_898984B4076411DD973EDFA055D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include namespace boost { namespace to_string_detail { template char operator<<( std::basic_ostream &, T const & ); template struct is_output_streamable_impl { static std::basic_ostream & f(); static T const & g(); enum e { value=1!=(sizeof(f()< > struct is_output_streamable { enum e { value=to_string_detail::is_output_streamable_impl::value }; }; } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/detail/object_hex_dump.hpp000066400000000000000000000027671154025176300260720ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_6F463AC838DF11DDA3E6909F56D89593 #define UUID_6F463AC838DF11DDA3E6909F56D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include #include #include #include namespace boost { namespace exception_detail { template inline std::string object_hex_dump( T const & x, std::size_t max_size=16 ) { std::ostringstream s; s << "type: " << type_name() << ", size: " << sizeof(T) << ", dump: "; std::size_t n=sizeof(T)>max_size?max_size:sizeof(T); s.fill('0'); s.width(2); unsigned char const * b=reinterpret_cast(&x); s << std::setw(2) << std::hex << (unsigned int)*b; for( unsigned char const * e=b+n; ++b!=e; ) s << " " << std::setw(2) << std::hex << (unsigned int)*b; return s.str(); } } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/detail/type_info.hpp000066400000000000000000000035211154025176300247140ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_C3E1741C754311DDB2834CCA55D89593 #define UUID_C3E1741C754311DDB2834CCA55D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include namespace boost { template inline char const * tag_type_name() { #ifdef BOOST_NO_TYPEID return BOOST_CURRENT_FUNCTION; #else return typeid(T*).name(); #endif } template inline char const * type_name() { #ifdef BOOST_NO_TYPEID return BOOST_CURRENT_FUNCTION; #else return typeid(T).name(); #endif } namespace exception_detail { struct type_info_ { detail::sp_typeinfo const & type_; explicit type_info_( detail::sp_typeinfo const & type ): type_(type) { } friend bool operator<( type_info_ const & a, type_info_ const & b ) { return 0!=(a.type_.before(b.type_)); } }; } } #define BOOST_EXCEPTION_STATIC_TYPEID(T) ::boost::exception_detail::type_info_(BOOST_SP_TYPEID(T)) #ifndef BOOST_NO_RTTI #define BOOST_EXCEPTION_DYNAMIC_TYPEID(x) ::boost::exception_detail::type_info_(typeid(x)) #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/diagnostic_information.hpp000066400000000000000000000121301154025176300262030ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_0552D49838DD11DD90146B8956D89593 #define UUID_0552D49838DD11DD90146B8956D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include #include #include #include #include #ifndef BOOST_NO_EXCEPTIONS #include namespace boost { namespace exception_detail { std::string diagnostic_information_impl( boost::exception const *, std::exception const *, bool ); } inline std::string current_exception_diagnostic_information() { boost::exception const * be=current_exception_cast(); std::exception const * se=current_exception_cast(); if( be || se ) return exception_detail::diagnostic_information_impl(be,se,true); else return "No diagnostic information available."; } } #endif namespace boost { namespace exception_detail { inline exception const * get_boost_exception( exception const * e ) { return e; } inline exception const * get_boost_exception( ... ) { return 0; } inline std::exception const * get_std_exception( std::exception const * e ) { return e; } inline std::exception const * get_std_exception( ... ) { return 0; } inline char const * get_diagnostic_information( exception const & x, char const * header ) { if( error_info_container * c=x.data_.get() ) #ifndef BOOST_NO_EXCEPTIONS try { #endif return c->diagnostic_information(header); #ifndef BOOST_NO_EXCEPTIONS } catch(...) { } #endif return 0; } inline std::string diagnostic_information_impl( boost::exception const * be, std::exception const * se, bool with_what ) { if( !be && !se ) return "Unknown exception."; #ifndef BOOST_NO_RTTI if( !be ) be=dynamic_cast(se); if( !se ) se=dynamic_cast(be); #endif char const * wh=0; if( with_what && se ) { wh=se->what(); if( be && exception_detail::get_diagnostic_information(*be,0)==wh ) return wh; } std::ostringstream tmp; if( be ) { if( char const * const * f=get_error_info(*be) ) { tmp << *f; if( int const * l=get_error_info(*be) ) tmp << '(' << *l << "): "; } tmp << "Throw in function "; if( char const * const * fn=get_error_info(*be) ) tmp << *fn; else tmp << "(unknown)"; tmp << '\n'; } #ifndef BOOST_NO_RTTI tmp << std::string("Dynamic exception type: ") << (be?BOOST_EXCEPTION_DYNAMIC_TYPEID(*be):BOOST_EXCEPTION_DYNAMIC_TYPEID(*se)).type_.name() << '\n'; #endif if( with_what && se ) tmp << "std::exception::what: " << wh << '\n'; if( be ) if( char const * s=exception_detail::get_diagnostic_information(*be,tmp.str().c_str()) ) if( *s ) return s; return tmp.str(); } } template std::string diagnostic_information( T const & e ) { return exception_detail::diagnostic_information_impl(exception_detail::get_boost_exception(&e),exception_detail::get_std_exception(&e),true); } inline char const * diagnostic_information_what( exception const & e ) throw() { char const * w=0; #ifndef BOOST_NO_EXCEPTIONS try { #endif (void) exception_detail::diagnostic_information_impl(&e,0,false); return exception_detail::get_diagnostic_information(e,0); #ifndef BOOST_NO_EXCEPTIONS } catch( ... ) { } #endif return w; } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/enable_current_exception.hpp000066400000000000000000000004061154025176300265230ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include clucene-core-2.3.3.4/src/ext/boost/exception/enable_error_info.hpp000066400000000000000000000004061154025176300251270ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_api_function.hpp000066400000000000000000000012071154025176300256570ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_DDFBB4546C1211DEA4659E9055D89593 #define UUID_DDFBB4546C1211DEA4659E9055D89593 #include "boost/exception/error_info.hpp" namespace boost { //Usage hint: //if( api_function(....)!=0 ) // BOOST_THROW_EXCEPTION( // failure() << // errinfo_api_function("api_function") ); typedef error_info errinfo_api_function; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_at_line.hpp000066400000000000000000000010431154025176300246120ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_E7255CE26C1211DE85800C9155D89593 #define UUID_E7255CE26C1211DE85800C9155D89593 namespace boost { template class error_info; //Use with parsing errors exceptions, for example in a XML file parser. typedef error_info errinfo_at_line; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_errno.hpp000066400000000000000000000022671154025176300243350ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_F0EE17BE6C1211DE87FF459155D89593 #define UUID_F0EE17BE6C1211DE87FF459155D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include "boost/exception/info.hpp" #include #include namespace boost { typedef error_info errinfo_errno; //Usage hint: //if( c_function(....)!=0 ) // BOOST_THROW_EXCEPTION( // failure() << // errinfo_errno(errno) << // errinfo_api_function("c_function") ); inline std::string to_string( errinfo_errno const & e ) { std::ostringstream tmp; int v=e.value(); tmp << v << ", \"" << strerror(v) << "\""; return tmp.str(); } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_file_handle.hpp000066400000000000000000000010441154025176300254320ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_F79E6EE26C1211DEB26E929155D89593 #define UUID_F79E6EE26C1211DEB26E929155D89593 #include namespace boost { template class weak_ptr; template class error_info; typedef error_info > errinfo_file_handle; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_file_name.hpp000066400000000000000000000013231154025176300251170ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_FEE5120A6C1211DE94E8BC9155D89593 #define UUID_FEE5120A6C1211DE94E8BC9155D89593 #include namespace boost { template class error_info; //Usage hint: //FILE * f=fopen(name,mode); //if( !f ) // BOOST_THROW_EXCEPTION( // file_open_error() << // errinfo_file_name(name) << // errinfo_file_open_mode(mode) ); typedef error_info errinfo_file_name; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_file_open_mode.hpp000066400000000000000000000013351154025176300261470ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_056F1F266C1311DE8E74299255D89593 #define UUID_056F1F266C1311DE8E74299255D89593 #include namespace boost { template class error_info; //Usage hint: //FILE * f=fopen(name,mode); //if( !f ) // BOOST_THROW_EXCEPTION( // file_open_error() << // errinfo_file_name(name) << // errinfo_file_open_mode(mode) ); typedef error_info errinfo_file_open_mode; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_nested_exception.hpp000066400000000000000000000010131154025176300265340ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_45CC9A82B77511DEB330FC4956D89593 #define UUID_45CC9A82B77511DEB330FC4956D89593 namespace boost { template class error_info; class exception_ptr; typedef error_info errinfo_nested_exception; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/errinfo_type_info_name.hpp000066400000000000000000000011751154025176300262010ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_0E11109E6C1311DEB7EA649255D89593 #define UUID_0E11109E6C1311DEB7EA649255D89593 #include namespace boost { template class error_info; //Usage hint: //BOOST_THROW_EXCEPTION( // bad_type() << // errinfo_type_info_name(typeid(x).name()) ); typedef error_info errinfo_type_info_name; } #endif clucene-core-2.3.3.4/src/ext/boost/exception/error_info.hpp000066400000000000000000000004401154025176300236170ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) namespace boost { template class error_info; } clucene-core-2.3.3.4/src/ext/boost/exception/exception.hpp000066400000000000000000000233071154025176300234600ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_274DA366004E11DCB1DDFE2E56D89593 #define UUID_274DA366004E11DCB1DDFE2E56D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif namespace boost { namespace exception_detail { template class refcount_ptr { public: refcount_ptr(): px_(0) { } ~refcount_ptr() { release(); } refcount_ptr( refcount_ptr const & x ): px_(x.px_) { add_ref(); } refcount_ptr & operator=( refcount_ptr const & x ) { adopt(x.px_); return *this; } void adopt( T * px ) { release(); px_=px; add_ref(); } T * get() const { return px_; } private: T * px_; void add_ref() { if( px_ ) px_->add_ref(); } void release() { if( px_ ) px_->release(); } }; } //////////////////////////////////////////////////////////////////////// template class error_info; typedef error_info throw_function; typedef error_info throw_file; typedef error_info throw_line; template <> class error_info { public: typedef char const * value_type; value_type v_; explicit error_info( value_type v ): v_(v) { } }; template <> class error_info { public: typedef char const * value_type; value_type v_; explicit error_info( value_type v ): v_(v) { } }; template <> class error_info { public: typedef int value_type; value_type v_; explicit error_info( value_type v ): v_(v) { } }; template E const & operator<<( E const &, error_info const & ); template E const & operator<<( E const &, throw_function const & ); template E const & operator<<( E const &, throw_file const & ); template E const & operator<<( E const &, throw_line const & ); class exception; template class shared_ptr; namespace exception_detail { class error_info_base; struct type_info_; struct error_info_container { virtual char const * diagnostic_information( char const * ) const = 0; virtual shared_ptr get( type_info_ const & ) const = 0; virtual void set( shared_ptr const &, type_info_ const & ) = 0; virtual void add_ref() const = 0; virtual void release() const = 0; protected: ~error_info_container() throw() { } }; template struct get_info; template <> struct get_info; template <> struct get_info; template <> struct get_info; char const * get_diagnostic_information( exception const &, char const * ); } class exception { protected: exception(): throw_function_(0), throw_file_(0), throw_line_(-1) { } #ifdef __HP_aCC //On HP aCC, this protected copy constructor prevents throwing boost::exception. //On all other platforms, the same effect is achieved by the pure virtual destructor. exception( exception const & x ) throw(): data_(x.data_), throw_function_(x.throw_function_), throw_file_(x.throw_file_), throw_line_(x.throw_line_) { } #endif virtual ~exception() throw() #ifndef __HP_aCC = 0 //Workaround for HP aCC, =0 incorrectly leads to link errors. #endif ; #if defined(__MWERKS__) && __MWERKS__<=0x3207 public: #else private: template friend E const & operator<<( E const &, throw_function const & ); template friend E const & operator<<( E const &, throw_file const & ); template friend E const & operator<<( E const &, throw_line const & ); friend char const * exception_detail::get_diagnostic_information( exception const &, char const * ); template friend E const & operator<<( E const &, error_info const & ); template friend struct exception_detail::get_info; friend struct exception_detail::get_info; friend struct exception_detail::get_info; friend struct exception_detail::get_info; #endif mutable exception_detail::refcount_ptr data_; mutable char const * throw_function_; mutable char const * throw_file_; mutable int throw_line_; }; inline exception:: ~exception() throw() { } template E const & operator<<( E const & x, throw_function const & y ) { x.throw_function_=y.v_; return x; } template E const & operator<<( E const & x, throw_file const & y ) { x.throw_file_=y.v_; return x; } template E const & operator<<( E const & x, throw_line const & y ) { x.throw_line_=y.v_; return x; } //////////////////////////////////////////////////////////////////////// namespace exception_detail { template struct error_info_injector: public T, public exception { explicit error_info_injector( T const & x ): T(x) { } ~error_info_injector() throw() { } }; struct large_size { char c[256]; }; large_size dispatch( exception * ); struct small_size { }; small_size dispatch( void * ); template struct enable_error_info_helper; template struct enable_error_info_helper { typedef T type; }; template struct enable_error_info_helper { typedef error_info_injector type; }; template struct enable_error_info_return_type { typedef typename enable_error_info_helper::type type; }; } template inline typename exception_detail::enable_error_info_return_type::type enable_error_info( T const & x ) { typedef typename exception_detail::enable_error_info_return_type::type rt; return rt(x); } //////////////////////////////////////////////////////////////////////// namespace exception_detail { class clone_base { public: virtual clone_base const * clone() const = 0; virtual void rethrow() const = 0; virtual ~clone_base() throw() { } }; inline void copy_boost_exception( exception * a, exception const * b ) { *a = *b; } inline void copy_boost_exception( void *, void const * ) { } template class clone_impl: public T, public clone_base { public: explicit clone_impl( T const & x ): T(x) { copy_boost_exception(this,&x); } ~clone_impl() throw() { } private: clone_base const * clone() const { return new clone_impl(*this); } void rethrow() const { throw*this; } }; } template inline exception_detail::clone_impl enable_current_exception( T const & x ) { return exception_detail::clone_impl(x); } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/get_error_info.hpp000066400000000000000000000070331154025176300244630ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_1A590226753311DD9E4CCF6156D89593 #define UUID_1A590226753311DD9E4CCF6156D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include #include namespace boost { namespace exception_detail { template struct get_info { static typename ErrorInfo::value_type * get( exception const & x ) { if( exception_detail::error_info_container * c=x.data_.get() ) if( shared_ptr eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) ) { #ifndef BOOST_NO_RTTI BOOST_ASSERT( 0!=dynamic_cast(eib.get()) ); #endif ErrorInfo * w = static_cast(eib.get()); return &w->value(); } return 0; } }; template <> struct get_info { static char const * * get( exception const & x ) { return x.throw_function_ ? &x.throw_function_ : 0; } }; template <> struct get_info { static char const * * get( exception const & x ) { return x.throw_file_ ? &x.throw_file_ : 0; } }; template <> struct get_info { static int * get( exception const & x ) { return x.throw_line_!=-1 ? &x.throw_line_ : 0; } }; template struct get_error_info_return_type { typedef R * type; }; template struct get_error_info_return_type { typedef R const * type; }; } #ifdef BOOST_NO_RTTI template inline typename ErrorInfo::value_type const * get_error_info( boost::exception const & x ) { return exception_detail::get_info::get(x); } template inline typename ErrorInfo::value_type * get_error_info( boost::exception & x ) { return exception_detail::get_info::get(x); } #else template inline typename exception_detail::get_error_info_return_type::type get_error_info( E & some_exception ) { if( exception const * x = dynamic_cast(&some_exception) ) return exception_detail::get_info::get(*x); else return 0; } #endif } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/info.hpp000066400000000000000000000110771154025176300224160ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_8D22C4CA9CC811DCAA9133D256D89593 #define UUID_8D22C4CA9CC811DCAA9133D256D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include #include #include #include namespace boost { template inline typename enable_if,std::string>::type to_string( error_info const & x ) { return to_string(x.value()); } template inline error_info:: error_info( value_type const & value ): value_(value) { } template inline error_info:: ~error_info() throw() { } template inline char const * error_info:: tag_typeid_name() const { return tag_type_name(); } template inline std::string error_info:: value_as_string() const { return to_string_stub(*this); } namespace exception_detail { class error_info_container_impl: public error_info_container { public: error_info_container_impl(): count_(0) { } ~error_info_container_impl() throw() { } void set( shared_ptr const & x, type_info_ const & typeid_ ) { BOOST_ASSERT(x); info_[typeid_] = x; diagnostic_info_str_.clear(); } shared_ptr get( type_info_ const & ti ) const { error_info_map::const_iterator i=info_.find(ti); if( info_.end()!=i ) { shared_ptr const & p = i->second; #ifndef BOOST_NO_RTTI BOOST_ASSERT( BOOST_EXCEPTION_DYNAMIC_TYPEID(*p).type_==ti.type_ ); #endif return p; } return shared_ptr(); } char const * diagnostic_information( char const * header ) const { if( header ) { BOOST_ASSERT(*header!=0); std::ostringstream tmp; tmp << header; for( error_info_map::const_iterator i=info_.begin(),end=info_.end(); i!=end; ++i ) { shared_ptr const & x = i->second; tmp << '[' << x->tag_typeid_name() << "] = " << x->value_as_string() << '\n'; } tmp.str().swap(diagnostic_info_str_); } return diagnostic_info_str_.c_str(); } private: friend class boost::exception; typedef std::map< type_info_, shared_ptr > error_info_map; error_info_map info_; mutable std::string diagnostic_info_str_; mutable int count_; void add_ref() const { ++count_; } void release() const { if( !--count_ ) delete this; } }; } template inline E const & operator<<( E const & x, error_info const & v ) { typedef error_info error_info_tag_t; shared_ptr p( new error_info_tag_t(v) ); exception_detail::error_info_container * c=x.data_.get(); if( !c ) x.data_.adopt(c=new exception_detail::error_info_container_impl); c->set(p,BOOST_EXCEPTION_STATIC_TYPEID(error_info_tag_t)); return x; } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/info_tuple.hpp000066400000000000000000000036531154025176300236300ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_63EE924290FB11DC87BB856555D89593 #define UUID_63EE924290FB11DC87BB856555D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include namespace boost { template < class E, class Tag1,class T1, class Tag2,class T2 > inline E const & operator<<( E const & x, tuple< error_info, error_info > const & v ) { return x << v.template get<0>() << v.template get<1>(); } template < class E, class Tag1,class T1, class Tag2,class T2, class Tag3,class T3 > inline E const & operator<<( E const & x, tuple< error_info, error_info, error_info > const & v ) { return x << v.template get<0>() << v.template get<1>() << v.template get<2>(); } template < class E, class Tag1,class T1, class Tag2,class T2, class Tag3,class T3, class Tag4,class T4 > inline E const & operator<<( E const & x, tuple< error_info, error_info, error_info, error_info > const & v ) { return x << v.template get<0>() << v.template get<1>() << v.template get<2>() << v.template get<3>(); } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/to_string.hpp000066400000000000000000000040411154025176300234640ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_7E48761AD92811DC9011477D56D89593 #define UUID_7E48761AD92811DC9011477D56D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include namespace boost { namespace to_string_detail { template typename disable_if,char>::type to_string( T const & ); template struct has_to_string_impl; template struct has_to_string_impl { enum e { value=1 }; }; template struct has_to_string_impl { static T const & f(); enum e { value=1!=sizeof(to_string(f())) }; }; } template inline typename enable_if,std::string>::type to_string( T const & x ) { std::ostringstream out; out << x; return out.str(); } template struct has_to_string { enum e { value=to_string_detail::has_to_string_impl::value>::value }; }; template inline std::string to_string( std::pair const & x ) { return std::string("(") + to_string(x.first) + ',' + to_string(x.second) + ')'; } inline std::string to_string( std::exception const & x ) { return x.what(); } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/exception/to_string_stub.hpp000066400000000000000000000053201154025176300245220ustar00rootroot00000000000000//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //Distributed under the Boost Software License, Version 1.0. (See accompanying //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef UUID_E788439ED9F011DCB181F25B55D89593 #define UUID_E788439ED9F011DCB181F25B55D89593 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma GCC system_header #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(push,1) #endif #include #include #include namespace boost { namespace exception_detail { template struct to_string_dispatcher { template static std::string convert( T const & x, Stub ) { return to_string(x); } }; template <> struct to_string_dispatcher { template static std::string convert( T const & x, Stub s ) { return s(x); } template static std::string convert( T const & x, std::string s ) { return s; } template static std::string convert( T const & x, char const * s ) { BOOST_ASSERT(s!=0); return s; } }; namespace to_string_dispatch { template inline std::string dispatch( T const & x, Stub s ) { return to_string_dispatcher::value>::convert(x,s); } } template inline std::string string_stub_dump( T const & x ) { return "[ " + exception_detail::object_hex_dump(x) + " ]"; } } template inline std::string to_string_stub( T const & x ) { return exception_detail::to_string_dispatch::dispatch(x,&exception_detail::string_stub_dump); } template inline std::string to_string_stub( T const & x, Stub s ) { return exception_detail::to_string_dispatch::dispatch(x,s); } } #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) #pragma warning(pop) #endif #endif clucene-core-2.3.3.4/src/ext/boost/memory_order.hpp000066400000000000000000000023711154025176300221650ustar00rootroot00000000000000#ifndef BOOST_MEMORY_ORDER_HPP_INCLUDED #define BOOST_MEMORY_ORDER_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // boost/memory_order.hpp // // Defines enum boost::memory_order per the C++0x working draft // // Copyright (c) 2008, 2009 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) namespace boost { // // Enum values are chosen so that code that needs to insert // a trailing fence for acquire semantics can use a single // test such as: // // if( mo & memory_order_acquire ) { ...fence... } // // For leading fences one can use: // // if( mo & memory_order_release ) { ...fence... } // // Architectures such as Alpha that need a fence on consume // can use: // // if( mo & ( memory_order_acquire | memory_order_consume ) ) { ...fence... } // enum memory_order { memory_order_relaxed = 0, memory_order_acquire = 1, memory_order_release = 2, memory_order_acq_rel = 3, // acquire | release memory_order_seq_cst = 7, // acq_rel | 4 memory_order_consume = 8 }; } // namespace boost #endif // #ifndef BOOST_MEMORY_ORDER_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/shared_ptr.hpp000066400000000000000000000010331154025176300216070ustar00rootroot00000000000000#ifndef BOOST_SHARED_PTR_HPP_INCLUDED #define BOOST_SHARED_PTR_HPP_INCLUDED // // shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001-2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include #endif // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/000077500000000000000000000000001154025176300207615ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/smart_ptr/bad_weak_ptr.hpp000066400000000000000000000026301154025176300241150ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/smart_ptr/bad_weak_ptr.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #ifdef __BORLANDC__ # pragma warn -8026 // Functions with excep. spec. are not expanded inline #endif namespace boost { // The standard library that comes with Borland C++ 5.5.1, 5.6.4 // defines std::exception and its members as having C calling // convention (-pc). When the definition of bad_weak_ptr // is compiled with -ps, the compiler issues an error. // Hence, the temporary #pragma option -pc below. #if defined(__BORLANDC__) && __BORLANDC__ <= 0x564 # pragma option push -pc #endif class bad_weak_ptr: public std::exception { public: virtual char const * what() const throw() { return "tr1::bad_weak_ptr"; } }; #if defined(__BORLANDC__) && __BORLANDC__ <= 0x564 # pragma option pop #endif } // namespace boost #ifdef __BORLANDC__ # pragma warn .8026 // Functions with excep. spec. are not expanded inline #endif #endif // #ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/000077500000000000000000000000001154025176300222235ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count.hpp000066400000000000000000000064571154025176300254340ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/atomic_count.hpp - thread/SMP safe reference counter // // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // typedef boost::detail::atomic_count; // // atomic_count a(n); // // (n is convertible to long) // // Effects: Constructs an atomic_count with an initial value of n // // a; // // Returns: (long) the current value of a // // ++a; // // Effects: Atomically increments the value of a // Returns: (long) the new value of a // // --a; // // Effects: Atomically decrements the value of a // Returns: (long) the new value of a // // Important note: when --a returns zero, it must act as a // read memory barrier (RMB); i.e. the calling thread must // have a synchronized view of the memory // // On Intel IA-32 (x86) memory is always synchronized, so this // is not a problem. // // On many architectures the atomic instructions already act as // a memory barrier. // // This property is necessary for proper reference counting, since // a thread can update the contents of a shared object, then // release its reference, and another thread may immediately // release the last reference causing object destruction. // // The destructor needs to have a synchronized view of the // object to perform proper cleanup. // // Original example by Alexander Terekhov: // // Given: // // - a mutable shared object OBJ; // - two threads THREAD1 and THREAD2 each holding // a private smart_ptr object pointing to that OBJ. // // t1: THREAD1 updates OBJ (thread-safe via some synchronization) // and a few cycles later (after "unlock") destroys smart_ptr; // // t2: THREAD2 destroys smart_ptr WITHOUT doing any synchronization // with respect to shared mutable object OBJ; OBJ destructors // are called driven by smart_ptr interface... // #include #include #ifndef BOOST_HAS_THREADS namespace boost { namespace detail { typedef long atomic_count; } } #elif defined(BOOST_AC_USE_PTHREADS) # include #elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) # include #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # include #elif defined( BOOST_SP_HAS_SYNC ) # include #elif defined(__GLIBCPP__) || defined(__GLIBCXX__) # include #elif defined(BOOST_HAS_PTHREADS) # define BOOST_AC_USE_PTHREADS # include #else // Use #define BOOST_DISABLE_THREADS to avoid the error #error Unrecognized threading platform #endif #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count_gcc.hpp000066400000000000000000000027001154025176300262330ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED // // boost/detail/atomic_count_gcc.hpp // // atomic_count for GNU libstdc++ v3 // // http://gcc.gnu.org/onlinedocs/porting/Thread-safety.html // // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. // Copyright (c) 2002 Lars Gullik Bjønnes // Copyright 2003-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #if __GNUC__ * 100 + __GNUC_MINOR__ >= 402 # include #else # include #endif namespace boost { namespace detail { #if defined(__GLIBCXX__) // g++ 3.4+ using __gnu_cxx::__atomic_add; using __gnu_cxx::__exchange_and_add; #endif class atomic_count { public: explicit atomic_count( long v ) : value_( v ) {} long operator++() { return __exchange_and_add( &value_, +1 ) + 1; } long operator--() { return __exchange_and_add( &value_, -1 ) - 1; } operator long() const { return __exchange_and_add( &value_, 0 ); } private: atomic_count(atomic_count const &); atomic_count & operator=(atomic_count const &); mutable _Atomic_word value_; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp000066400000000000000000000027571154025176300267540ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED // // boost/detail/atomic_count_gcc_x86.hpp // // atomic_count for g++ on 486+/AMD64 // // Copyright 2007 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // namespace boost { namespace detail { class atomic_count { public: explicit atomic_count( long v ) : value_( static_cast< int >( v ) ) {} long operator++() { return atomic_exchange_and_add( &value_, +1 ) + 1; } long operator--() { return atomic_exchange_and_add( &value_, -1 ) - 1; } operator long() const { return atomic_exchange_and_add( &value_, 0 ); } private: atomic_count(atomic_count const &); atomic_count & operator=(atomic_count const &); mutable int value_; private: static int atomic_exchange_and_add( int * pw, int dv ) { // int r = *pw; // *pw += dv; // return r; int r; __asm__ __volatile__ ( "lock\n\t" "xadd %1, %0": "+m"( *pw ), "=r"( r ): // outputs (%0, %1) "1"( dv ): // inputs (%2 == %1) "memory", "cc" // clobbers ); return r; } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count_pthreads.hpp000066400000000000000000000033721154025176300273170ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED // // boost/detail/atomic_count_pthreads.hpp // // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include // // The generic pthread_mutex-based implementation sometimes leads to // inefficiencies. Example: a class with two atomic_count members // can get away with a single mutex. // // Users can detect this situation by checking BOOST_AC_USE_PTHREADS. // namespace boost { namespace detail { class atomic_count { private: class scoped_lock { public: scoped_lock(pthread_mutex_t & m): m_(m) { pthread_mutex_lock(&m_); } ~scoped_lock() { pthread_mutex_unlock(&m_); } private: pthread_mutex_t & m_; }; public: explicit atomic_count(long v): value_(v) { pthread_mutex_init(&mutex_, 0); } ~atomic_count() { pthread_mutex_destroy(&mutex_); } long operator++() { scoped_lock lock(mutex_); return ++value_; } long operator--() { scoped_lock lock(mutex_); return --value_; } operator long() const { scoped_lock lock(mutex_); return value_; } private: atomic_count(atomic_count const &); atomic_count & operator=(atomic_count const &); mutable pthread_mutex_t mutex_; long value_; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count_solaris.hpp000066400000000000000000000022051154025176300271530ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED // // boost/detail/atomic_count_solaris.hpp // based on: boost/detail/atomic_count_win32.hpp // // Copyright (c) 2001-2005 Peter Dimov // Copyright (c) 2006 Michael van der Westhuizen // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include namespace boost { namespace detail { class atomic_count { public: explicit atomic_count( uint32_t v ): value_( v ) { } long operator++() { return atomic_inc_32_nv( &value_ ); } long operator--() { return atomic_dec_32_nv( &value_ ); } operator uint32_t() const { return static_cast( value_ ); } private: atomic_count( atomic_count const & ); atomic_count & operator=( atomic_count const & ); uint32_t value_; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count_sync.hpp000066400000000000000000000022531154025176300264560ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED // // boost/detail/atomic_count_sync.hpp // // atomic_count for g++ 4.1+ // // http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html // // Copyright 2007 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #if defined( __ia64__ ) && defined( __INTEL_COMPILER ) # include #endif namespace boost { namespace detail { class atomic_count { public: explicit atomic_count( long v ) : value_( v ) {} long operator++() { return __sync_add_and_fetch( &value_, 1 ); } long operator--() { return __sync_add_and_fetch( &value_, -1 ); } operator long() const { return __sync_fetch_and_add( &value_, 0 ); } private: atomic_count(atomic_count const &); atomic_count & operator=(atomic_count const &); mutable long value_; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/atomic_count_win32.hpp000066400000000000000000000022451154025176300264450ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/atomic_count_win32.hpp // // Copyright (c) 2001-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include namespace boost { namespace detail { class atomic_count { public: explicit atomic_count( long v ): value_( v ) { } long operator++() { return BOOST_INTERLOCKED_INCREMENT( &value_ ); } long operator--() { return BOOST_INTERLOCKED_DECREMENT( &value_ ); } operator long() const { return static_cast( value_ ); } private: atomic_count( atomic_count const & ); atomic_count & operator=( atomic_count const & ); long value_; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/lightweight_mutex.hpp000066400000000000000000000026211154025176300264760ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/lightweight_mutex.hpp - lightweight mutex // // Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // typedef boost::detail::lightweight_mutex; // // boost::detail::lightweight_mutex is a header-only implementation of // a subset of the Mutex concept requirements: // // http://www.boost.org/doc/html/threads/concepts.html#threads.concepts.Mutex // // It maps to a CRITICAL_SECTION on Windows or a pthread_mutex on POSIX. // #include #if !defined(BOOST_HAS_THREADS) # include #elif defined(BOOST_HAS_PTHREADS) # include #elif defined(BOOST_HAS_WINTHREADS) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # include #else // Use #define BOOST_DISABLE_THREADS to avoid the error # error Unrecognized threading platform #endif #endif // #ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/lwm_nop.hpp000066400000000000000000000012761154025176300244150ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/lwm_nop.hpp // // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // namespace boost { namespace detail { class lightweight_mutex { public: typedef lightweight_mutex scoped_lock; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/lwm_pthreads.hpp000066400000000000000000000033311154025176300254250ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/lwm_pthreads.hpp // // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include namespace boost { namespace detail { class lightweight_mutex { private: pthread_mutex_t m_; lightweight_mutex(lightweight_mutex const &); lightweight_mutex & operator=(lightweight_mutex const &); public: lightweight_mutex() { // HPUX 10.20 / DCE has a nonstandard pthread_mutex_init #if defined(__hpux) && defined(_DECTHREADS_) BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 ); #else BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 ); #endif } ~lightweight_mutex() { BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 ); } class scoped_lock; friend class scoped_lock; class scoped_lock { private: pthread_mutex_t & m_; scoped_lock(scoped_lock const &); scoped_lock & operator=(scoped_lock const &); public: scoped_lock(lightweight_mutex & m): m_(m.m_) { BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 ); } ~scoped_lock() { BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 ); } }; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/lwm_win32_cs.hpp000066400000000000000000000042731154025176300252500ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/lwm_win32_cs.hpp // // Copyright (c) 2002, 2003 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #ifdef BOOST_USE_WINDOWS_H # include #endif namespace boost { namespace detail { #ifndef BOOST_USE_WINDOWS_H struct critical_section { struct critical_section_debug * DebugInfo; long LockCount; long RecursionCount; void * OwningThread; void * LockSemaphore; #if defined(_WIN64) unsigned __int64 SpinCount; #else unsigned long SpinCount; #endif }; extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(critical_section *); extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(critical_section *); extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(critical_section *); extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(critical_section *); #else typedef ::CRITICAL_SECTION critical_section; #endif // #ifndef BOOST_USE_WINDOWS_H class lightweight_mutex { private: critical_section cs_; lightweight_mutex(lightweight_mutex const &); lightweight_mutex & operator=(lightweight_mutex const &); public: lightweight_mutex() { InitializeCriticalSection(&cs_); } ~lightweight_mutex() { DeleteCriticalSection(&cs_); } class scoped_lock; friend class scoped_lock; class scoped_lock { private: lightweight_mutex & m_; scoped_lock(scoped_lock const &); scoped_lock & operator=(scoped_lock const &); public: explicit scoped_lock(lightweight_mutex & m): m_(m) { EnterCriticalSection(&m_.cs_); } ~scoped_lock() { LeaveCriticalSection(&m_.cs_); } }; }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/operator_bool.hpp000066400000000000000000000026001154025176300256000ustar00rootroot00000000000000// This header intentionally has no include guards. // // Copyright (c) 2001-2009 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #if ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, < 0x570) ) || defined(__CINT__) operator bool () const { return px != 0; } #elif defined( _MANAGED ) static void unspecified_bool( this_type*** ) { } typedef void (*unspecified_bool_type)( this_type*** ); operator unspecified_bool_type() const // never throws { return px == 0? 0: unspecified_bool; } #elif \ ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \ ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) ) || \ ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) ) typedef T * (this_type::*unspecified_bool_type)() const; operator unspecified_bool_type() const // never throws { return px == 0? 0: &this_type::get; } #else typedef T * this_type::*unspecified_bool_type; operator unspecified_bool_type() const // never throws { return px == 0? 0: &this_type::px; } #endif // operator! is redundant, but some compilers need it bool operator! () const // never throws { return px == 0; } clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/quick_allocator.hpp000066400000000000000000000120211154025176300261040ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/quick_allocator.hpp // // Copyright (c) 2003 David Abrahams // Copyright (c) 2003 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include // ::operator new, ::operator delete #include // std::size_t namespace boost { namespace detail { template union freeblock { typedef typename boost::type_with_alignment::type aligner_type; aligner_type aligner; char bytes[size]; freeblock * next; }; template struct allocator_impl { typedef freeblock block; // It may seem odd to use such small pages. // // However, on a typical Windows implementation that uses // the OS allocator, "normal size" pages interact with the // "ordinary" operator new, slowing it down dramatically. // // 512 byte pages are handled by the small object allocator, // and don't interfere with ::new. // // The other alternative is to use much bigger pages (1M.) // // It is surprisingly easy to hit pathological behavior by // varying the page size. g++ 2.96 on Red Hat Linux 7.2, // for example, passionately dislikes 496. 512 seems OK. #if defined(BOOST_QA_PAGE_SIZE) enum { items_per_page = BOOST_QA_PAGE_SIZE / size }; #else enum { items_per_page = 512 / size }; // 1048560 / size #endif #ifdef BOOST_HAS_THREADS static lightweight_mutex & mutex() { static freeblock< sizeof( lightweight_mutex ), boost::alignment_of< lightweight_mutex >::value > fbm; static lightweight_mutex * pm = new( &fbm ) lightweight_mutex; return *pm; } static lightweight_mutex * mutex_init; #endif static block * free; static block * page; static unsigned last; static inline void * alloc() { #ifdef BOOST_HAS_THREADS lightweight_mutex::scoped_lock lock( mutex() ); #endif if(block * x = free) { free = x->next; return x; } else { if(last == items_per_page) { // "Listen to me carefully: there is no memory leak" // -- Scott Meyers, Eff C++ 2nd Ed Item 10 page = ::new block[items_per_page]; last = 0; } return &page[last++]; } } static inline void * alloc(std::size_t n) { if(n != size) // class-specific new called for a derived object { return ::operator new(n); } else { #ifdef BOOST_HAS_THREADS lightweight_mutex::scoped_lock lock( mutex() ); #endif if(block * x = free) { free = x->next; return x; } else { if(last == items_per_page) { page = ::new block[items_per_page]; last = 0; } return &page[last++]; } } } static inline void dealloc(void * pv) { if(pv != 0) // 18.4.1.1/13 { #ifdef BOOST_HAS_THREADS lightweight_mutex::scoped_lock lock( mutex() ); #endif block * pb = static_cast(pv); pb->next = free; free = pb; } } static inline void dealloc(void * pv, std::size_t n) { if(n != size) // class-specific delete called for a derived object { ::operator delete(pv); } else if(pv != 0) // 18.4.1.1/13 { #ifdef BOOST_HAS_THREADS lightweight_mutex::scoped_lock lock( mutex() ); #endif block * pb = static_cast(pv); pb->next = free; free = pb; } } }; #ifdef BOOST_HAS_THREADS template lightweight_mutex * allocator_impl::mutex_init = &allocator_impl::mutex(); #endif template freeblock * allocator_impl::free = 0; template freeblock * allocator_impl::page = 0; template unsigned allocator_impl::last = allocator_impl::items_per_page; template struct quick_allocator: public allocator_impl< sizeof(T), boost::alignment_of::value > { }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/shared_array_nmt.hpp000066400000000000000000000063311154025176300262610ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED // // detail/shared_array_nmt.hpp - shared_array.hpp without member templates // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation. // #include #include #include #include #include // for std::ptrdiff_t #include // for std::swap #include // for std::less #include // for std::bad_alloc namespace boost { template class shared_array { private: typedef detail::atomic_count count_type; public: typedef T element_type; explicit shared_array(T * p = 0): px(p) { #ifndef BOOST_NO_EXCEPTIONS try // prevent leak if new throws { pn = new count_type(1); } catch(...) { boost::checked_array_delete(p); throw; } #else pn = new count_type(1); if(pn == 0) { boost::checked_array_delete(p); boost::throw_exception(std::bad_alloc()); } #endif } ~shared_array() { if(--*pn == 0) { boost::checked_array_delete(px); delete pn; } } shared_array(shared_array const & r) : px(r.px) // never throws { pn = r.pn; ++*pn; } shared_array & operator=(shared_array const & r) { shared_array(r).swap(*this); return *this; } void reset(T * p = 0) { BOOST_ASSERT(p == 0 || p != px); shared_array(p).swap(*this); } T * get() const // never throws { return px; } T & operator[](std::ptrdiff_t i) const // never throws { BOOST_ASSERT(px != 0); BOOST_ASSERT(i >= 0); return px[i]; } long use_count() const // never throws { return *pn; } bool unique() const // never throws { return *pn == 1; } void swap(shared_array & other) // never throws { std::swap(px, other.px); std::swap(pn, other.pn); } private: T * px; // contained pointer count_type * pn; // ptr to reference counter }; // shared_array template inline bool operator==(shared_array const & a, shared_array const & b) { return a.get() == b.get(); } template inline bool operator!=(shared_array const & a, shared_array const & b) { return a.get() != b.get(); } template inline bool operator<(shared_array const & a, shared_array const & b) { return std::less()(a.get(), b.get()); } template void swap(shared_array & a, shared_array & b) { a.swap(b); } } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/shared_count.hpp000066400000000000000000000223701154025176300254160ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/shared_count.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #ifdef __BORLANDC__ # pragma warn -8027 // Functions containing try are not expanded inline #endif #include #include #include #include #include #include #include // In order to avoid circular dependencies with Boost.TR1 // we make sure that our include of doesn't try to // pull in the TR1 headers: that's why we use this header // rather than including directly: #include // std::auto_ptr #include // std::less #include // std::bad_alloc namespace boost { namespace detail { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) int const shared_count_id = 0x2C35F101; int const weak_count_id = 0x298C38A4; #endif struct sp_nothrow_tag {}; class weak_count; class shared_count { private: sp_counted_base * pi_; #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) int id_; #endif friend class weak_count; public: shared_count(): pi_(0) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { } template explicit shared_count( Y * p ): pi_( 0 ) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { #ifndef BOOST_NO_EXCEPTIONS try { pi_ = new sp_counted_impl_p( p ); } catch(...) { boost::checked_delete( p ); throw; } #else pi_ = new sp_counted_impl_p( p ); if( pi_ == 0 ) { boost::checked_delete( p ); boost::throw_exception( std::bad_alloc() ); } #endif } #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) template shared_count( Y * p, D d ): pi_(0) #else template shared_count( P p, D d ): pi_(0) #endif #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) typedef Y* P; #endif #ifndef BOOST_NO_EXCEPTIONS try { pi_ = new sp_counted_impl_pd(p, d); } catch(...) { d(p); // delete p throw; } #else pi_ = new sp_counted_impl_pd(p, d); if(pi_ == 0) { d(p); // delete p boost::throw_exception(std::bad_alloc()); } #endif } template shared_count( P p, D d, A a ): pi_( 0 ) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { typedef sp_counted_impl_pda impl_type; typedef typename A::template rebind< impl_type >::other A2; A2 a2( a ); #ifndef BOOST_NO_EXCEPTIONS try { pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); } catch(...) { d( p ); if( pi_ != 0 ) { a2.deallocate( static_cast< impl_type* >( pi_ ), 1 ); } throw; } #else pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); if( pi_ != 0 ) { new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); } else { d( p ); boost::throw_exception( std::bad_alloc() ); } #endif } #ifndef BOOST_NO_AUTO_PTR // auto_ptr is special cased to provide the strong guarantee template explicit shared_count( std::auto_ptr & r ): pi_( new sp_counted_impl_p( r.get() ) ) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { #ifdef BOOST_NO_EXCEPTIONS if( pi_ == 0 ) { boost::throw_exception(std::bad_alloc()); } #endif r.release(); } #endif ~shared_count() // nothrow { if( pi_ != 0 ) pi_->release(); #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) id_ = 0; #endif } shared_count(shared_count const & r): pi_(r.pi_) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { if( pi_ != 0 ) pi_->add_ref_copy(); } #if defined( BOOST_HAS_RVALUE_REFS ) shared_count(shared_count && r): pi_(r.pi_) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { r.pi_ = 0; } #endif explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0 shared_count( weak_count const & r, sp_nothrow_tag ); // constructs an empty *this when r.use_count() == 0 shared_count & operator= (shared_count const & r) // nothrow { sp_counted_base * tmp = r.pi_; if( tmp != pi_ ) { if( tmp != 0 ) tmp->add_ref_copy(); if( pi_ != 0 ) pi_->release(); pi_ = tmp; } return *this; } void swap(shared_count & r) // nothrow { sp_counted_base * tmp = r.pi_; r.pi_ = pi_; pi_ = tmp; } long use_count() const // nothrow { return pi_ != 0? pi_->use_count(): 0; } bool unique() const // nothrow { return use_count() == 1; } bool empty() const // nothrow { return pi_ == 0; } friend inline bool operator==(shared_count const & a, shared_count const & b) { return a.pi_ == b.pi_; } friend inline bool operator<(shared_count const & a, shared_count const & b) { return std::less()( a.pi_, b.pi_ ); } void * get_deleter( sp_typeinfo const & ti ) const { return pi_? pi_->get_deleter( ti ): 0; } }; class weak_count { private: sp_counted_base * pi_; #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) int id_; #endif friend class shared_count; public: weak_count(): pi_(0) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(weak_count_id) #endif { } weak_count(shared_count const & r): pi_(r.pi_) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(weak_count_id) #endif { if(pi_ != 0) pi_->weak_add_ref(); } weak_count(weak_count const & r): pi_(r.pi_) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(weak_count_id) #endif { if(pi_ != 0) pi_->weak_add_ref(); } // Move support #if defined( BOOST_HAS_RVALUE_REFS ) weak_count(weak_count && r): pi_(r.pi_) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(weak_count_id) #endif { r.pi_ = 0; } #endif ~weak_count() // nothrow { if(pi_ != 0) pi_->weak_release(); #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) id_ = 0; #endif } weak_count & operator= (shared_count const & r) // nothrow { sp_counted_base * tmp = r.pi_; if( tmp != pi_ ) { if(tmp != 0) tmp->weak_add_ref(); if(pi_ != 0) pi_->weak_release(); pi_ = tmp; } return *this; } weak_count & operator= (weak_count const & r) // nothrow { sp_counted_base * tmp = r.pi_; if( tmp != pi_ ) { if(tmp != 0) tmp->weak_add_ref(); if(pi_ != 0) pi_->weak_release(); pi_ = tmp; } return *this; } void swap(weak_count & r) // nothrow { sp_counted_base * tmp = r.pi_; r.pi_ = pi_; pi_ = tmp; } long use_count() const // nothrow { return pi_ != 0? pi_->use_count(): 0; } bool empty() const // nothrow { return pi_ == 0; } friend inline bool operator==(weak_count const & a, weak_count const & b) { return a.pi_ == b.pi_; } friend inline bool operator<(weak_count const & a, weak_count const & b) { return std::less()(a.pi_, b.pi_); } }; inline shared_count::shared_count( weak_count const & r ): pi_( r.pi_ ) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { if( pi_ == 0 || !pi_->add_ref_lock() ) { boost::throw_exception( boost::bad_weak_ptr() ); } } inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_( r.pi_ ) #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif { if( pi_ != 0 && !pi_->add_ref_lock() ) { pi_ = 0; } } } // namespace detail } // namespace boost #ifdef __BORLANDC__ # pragma warn .8027 // Functions containing try are not expanded inline #endif #endif // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/shared_ptr_nmt.hpp000066400000000000000000000073301154025176300257500ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED // // detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include #include #include #include #ifndef BOOST_NO_AUTO_PTR # include // for std::auto_ptr #endif #include // for std::swap #include // for std::less #include // for std::bad_alloc namespace boost { template class shared_ptr { private: typedef detail::atomic_count count_type; public: typedef T element_type; typedef T value_type; explicit shared_ptr(T * p = 0): px(p) { #ifndef BOOST_NO_EXCEPTIONS try // prevent leak if new throws { pn = new count_type(1); } catch(...) { boost::checked_delete(p); throw; } #else pn = new count_type(1); if(pn == 0) { boost::checked_delete(p); boost::throw_exception(std::bad_alloc()); } #endif } ~shared_ptr() { if(--*pn == 0) { boost::checked_delete(px); delete pn; } } shared_ptr(shared_ptr const & r): px(r.px) // never throws { pn = r.pn; ++*pn; } shared_ptr & operator=(shared_ptr const & r) { shared_ptr(r).swap(*this); return *this; } #ifndef BOOST_NO_AUTO_PTR explicit shared_ptr(std::auto_ptr & r) { pn = new count_type(1); // may throw px = r.release(); // fix: moved here to stop leak if new throws } shared_ptr & operator=(std::auto_ptr & r) { shared_ptr(r).swap(*this); return *this; } #endif void reset(T * p = 0) { BOOST_ASSERT(p == 0 || p != px); shared_ptr(p).swap(*this); } T & operator*() const // never throws { BOOST_ASSERT(px != 0); return *px; } T * operator->() const // never throws { BOOST_ASSERT(px != 0); return px; } T * get() const // never throws { return px; } long use_count() const // never throws { return *pn; } bool unique() const // never throws { return *pn == 1; } void swap(shared_ptr & other) // never throws { std::swap(px, other.px); std::swap(pn, other.pn); } private: T * px; // contained pointer count_type * pn; // ptr to reference counter }; template inline bool operator==(shared_ptr const & a, shared_ptr const & b) { return a.get() == b.get(); } template inline bool operator!=(shared_ptr const & a, shared_ptr const & b) { return a.get() != b.get(); } template inline bool operator<(shared_ptr const & a, shared_ptr const & b) { return std::less()(a.get(), b.get()); } template void swap(shared_ptr & a, shared_ptr & b) { a.swap(b); } // get_pointer() enables boost::mem_fn to recognize shared_ptr template inline T * get_pointer(shared_ptr const & p) { return p.get(); } } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_convertible.hpp000066400000000000000000000033341154025176300257550ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // detail/sp_convertible.hpp // // Copyright 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE ) # define BOOST_SP_NO_SP_CONVERTIBLE #endif #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ < 303 ) # define BOOST_SP_NO_SP_CONVERTIBLE #endif #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ <= 0x620 ) # define BOOST_SP_NO_SP_CONVERTIBLE #endif #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) namespace boost { namespace detail { template< class Y, class T > struct sp_convertible { typedef char (&yes) [1]; typedef char (&no) [2]; static yes f( T* ); static no f( ... ); enum _vt { value = sizeof( f( static_cast(0) ) ) == sizeof(yes) }; }; struct sp_empty { }; template< bool > struct sp_enable_if_convertible_impl; template<> struct sp_enable_if_convertible_impl { typedef sp_empty type; }; template<> struct sp_enable_if_convertible_impl { }; template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_if_convertible_impl< sp_convertible< Y, T >::value > { }; } // namespace detail } // namespace boost #endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base.hpp000066400000000000000000000047221154025176300260760ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base.hpp // // Copyright 2005, 2006 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include #if defined( BOOST_SP_DISABLE_THREADS ) # include #elif defined( BOOST_SP_USE_SPINLOCK ) # include #elif defined( BOOST_SP_USE_PTHREADS ) # include #elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 ) # include #elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) # include #elif defined( __GNUC__ ) && defined( __ia64__ ) && !defined( __INTEL_COMPILER ) # include #elif defined(__HP_aCC) && defined(__ia64) # include #elif defined( __MWERKS__ ) && defined( __POWERPC__ ) # include #elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) ) # include #elif defined( __GNUC__ ) && ( defined( __mips__ ) || defined( _mips ) ) # include #elif defined( BOOST_SP_HAS_SYNC ) # include #elif defined(__GNUC__) && ( defined( __sparcv9 ) || ( defined( __sparcv8 ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 402 ) ) ) # include #elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined(__CYGWIN__) # include #elif !defined( BOOST_HAS_THREADS ) # include #else # include #endif #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp000066400000000000000000000060201154025176300275200ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED // // detail/sp_counted_base_acc_ia64.hpp - aC++ on HP-UX IA64 // // Copyright 2007 Baruch Zilber // Copyright 2007 Boris Gubenko // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // #include #include namespace boost { namespace detail { inline void atomic_increment( int * pw ) { // ++*pw; _Asm_fetchadd(_FASZ_W, _SEM_REL, pw, +1, _LDHINT_NONE); } inline int atomic_decrement( int * pw ) { // return --*pw; int r = static_cast(_Asm_fetchadd(_FASZ_W, _SEM_REL, pw, -1, _LDHINT_NONE)); if (1 == r) { _Asm_mf(); } return r - 1; } inline int atomic_conditional_increment( int * pw ) { // if( *pw != 0 ) ++*pw; // return *pw; int v = *pw; for (;;) { if (0 == v) { return 0; } _Asm_mov_to_ar(_AREG_CCV, v, (_UP_CALL_FENCE | _UP_SYS_FENCE | _DOWN_CALL_FENCE | _DOWN_SYS_FENCE)); int r = static_cast(_Asm_cmpxchg(_SZ_W, _SEM_ACQ, pw, v + 1, _LDHINT_NONE)); if (r == v) { return r + 1; } v = r; } } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); // TODO use ld.acq here } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp000066400000000000000000000057101154025176300274270ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_cw_ppc.hpp - CodeWarrior on PowerPC // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // // Thanks to Ben Hitchings for the #weak + (#shared != 0) // formulation // #include namespace boost { namespace detail { inline void atomic_increment( register long * pw ) { register int a; asm { loop: lwarx a, 0, pw addi a, a, 1 stwcx. a, 0, pw bne- loop } } inline long atomic_decrement( register long * pw ) { register int a; asm { sync loop: lwarx a, 0, pw addi a, a, -1 stwcx. a, 0, pw bne- loop isync } return a; } inline long atomic_conditional_increment( register long * pw ) { register int a; asm { loop: lwarx a, 0, pw cmpwi a, 0 beq store addi a, a, 1 store: stwcx. a, 0, pw bne- loop } return a; } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); long use_count_; // #shared long weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp000066400000000000000000000060721154025176300272740ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_cw_x86.hpp - CodeWarrion on 486+ // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // Copyright 2005 Rene Rivera // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // // Thanks to Ben Hitchings for the #weak + (#shared != 0) // formulation // #include namespace boost { namespace detail { inline int atomic_exchange_and_add( int * pw, int dv ) { // int r = *pw; // *pw += dv; // return r; asm { mov esi, [pw] mov eax, dv lock xadd dword ptr [esi], eax } } inline void atomic_increment( int * pw ) { //atomic_exchange_and_add( pw, 1 ); asm { mov esi, [pw] lock inc dword ptr [esi] } } inline int atomic_conditional_increment( int * pw ) { // int rv = *pw; // if( rv != 0 ) ++*pw; // return rv; asm { mov esi, [pw] mov eax, dword ptr [esi] L0: test eax, eax je L1 mov ebx, eax inc ebx lock cmpxchg dword ptr [esi], ebx jne L0 L1: } } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_exchange_and_add( &use_count_, -1 ) == 1 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp000066400000000000000000000070331154025176300275330ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED // // detail/sp_counted_base_gcc_ia64.hpp - g++ on IA64 // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2006 Peter Dimov // Copyright 2005 Ben Hutchings // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // #include namespace boost { namespace detail { inline void atomic_increment( int * pw ) { // ++*pw; int tmp; // No barrier is required here but fetchadd always has an acquire or // release barrier associated with it. We choose release as it should be // cheaper. __asm__ ("fetchadd4.rel %0=%1,1" : "=r"(tmp), "=m"(*pw) : "m"( *pw )); } inline int atomic_decrement( int * pw ) { // return --*pw; int rv; __asm__ (" fetchadd4.rel %0=%1,-1 ;; \n" " cmp.eq p7,p0=1,%0 ;; \n" "(p7) ld4.acq %0=%1 " : "=&r"(rv), "=m"(*pw) : "m"( *pw ) : "p7"); return rv; } inline int atomic_conditional_increment( int * pw ) { // if( *pw != 0 ) ++*pw; // return *pw; int rv, tmp, tmp2; __asm__ ("0: ld4 %0=%3 ;; \n" " cmp.eq p7,p0=0,%0 ;; \n" "(p7) br.cond.spnt 1f \n" " mov ar.ccv=%0 \n" " add %1=1,%0 ;; \n" " cmpxchg4.acq %2=%3,%1,ar.ccv ;; \n" " cmp.ne p7,p0=%0,%2 ;; \n" "(p7) br.cond.spnt 0b \n" " mov %0=%1 ;; \n" "1:" : "=&r"(rv), "=&r"(tmp), "=&r"(tmp2), "=m"(*pw) : "m"( *pw ) : "ar.ccv", "p7"); return rv; } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); // TODO use ld.acq here } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp000066400000000000000000000063461154025176300277460ustar00rootroot00000000000000#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED #define BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_gcc_mips.hpp - g++ on MIPS // // Copyright (c) 2009, Spirent Communications, Inc. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // #include namespace boost { namespace detail { inline void atomic_increment( int * pw ) { // ++*pw; int tmp; __asm__ __volatile__ ( "0:\n\t" "ll %0, %1\n\t" "addiu %0, 1\n\t" "sc %0, %1\n\t" "beqz %0, 0b": "=&r"( tmp ), "=m"( *pw ): "m"( *pw ) ); } inline int atomic_decrement( int * pw ) { // return --*pw; int rv, tmp; __asm__ __volatile__ ( "0:\n\t" "ll %1, %2\n\t" "addiu %0, %1, -1\n\t" "sc %0, %2\n\t" "beqz %0, 0b\n\t" "addiu %0, %1, -1": "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ): "m"( *pw ): "memory" ); return rv; } inline int atomic_conditional_increment( int * pw ) { // if( *pw != 0 ) ++*pw; // return *pw; int rv, tmp; __asm__ __volatile__ ( "0:\n\t" "ll %0, %2\n\t" "beqz %0, 1f\n\t" "addiu %1, %0, 1\n\t" "sc %1, %2\n\t" "beqz %1, 0b\n\t" "addiu %0, %0, 1\n\t" "1:": "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ): "m"( *pw ): "memory" ); return rv; } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp000066400000000000000000000066231154025176300275560ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_gcc_ppc.hpp - g++ on PowerPC // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // // Thanks to Ben Hitchings for the #weak + (#shared != 0) // formulation // #include namespace boost { namespace detail { inline void atomic_increment( int * pw ) { // ++*pw; int tmp; __asm__ ( "0:\n\t" "lwarx %1, 0, %2\n\t" "addi %1, %1, 1\n\t" "stwcx. %1, 0, %2\n\t" "bne- 0b": "=m"( *pw ), "=&b"( tmp ): "r"( pw ), "m"( *pw ): "cc" ); } inline int atomic_decrement( int * pw ) { // return --*pw; int rv; __asm__ __volatile__ ( "sync\n\t" "0:\n\t" "lwarx %1, 0, %2\n\t" "addi %1, %1, -1\n\t" "stwcx. %1, 0, %2\n\t" "bne- 0b\n\t" "isync": "=m"( *pw ), "=&b"( rv ): "r"( pw ), "m"( *pw ): "memory", "cc" ); return rv; } inline int atomic_conditional_increment( int * pw ) { // if( *pw != 0 ) ++*pw; // return *pw; int rv; __asm__ ( "0:\n\t" "lwarx %1, 0, %2\n\t" "cmpwi %1, 0\n\t" "beq 1f\n\t" "addi %1, %1, 1\n\t" "1:\n\t" "stwcx. %1, 0, %2\n\t" "bne- 0b": "=m"( *pw ), "=&b"( rv ): "r"( pw ), "m"( *pw ): "cc" ); return rv; } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp000066400000000000000000000065721154025176300301070ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // detail/sp_counted_base_gcc_sparc.hpp - g++ on Sparc V8+ // // Copyright (c) 2006 Piotr Wyderski // Copyright (c) 2006 Tomas Puverle // Copyright (c) 2006 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // // Thanks to Michael van der Westhuizen #include #include // int32_t namespace boost { namespace detail { inline int32_t compare_and_swap( int32_t * dest_, int32_t compare_, int32_t swap_ ) { __asm__ __volatile__( "cas [%1], %2, %0" : "+r" (swap_) : "r" (dest_), "r" (compare_) : "memory" ); return swap_; } inline int32_t atomic_fetch_and_add( int32_t * pw, int32_t dv ) { // long r = *pw; // *pw += dv; // return r; for( ;; ) { int32_t r = *pw; if( __builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1) ) { return r; } } } inline void atomic_increment( int32_t * pw ) { atomic_fetch_and_add( pw, 1 ); } inline int32_t atomic_decrement( int32_t * pw ) { return atomic_fetch_and_add( pw, -1 ); } inline int32_t atomic_conditional_increment( int32_t * pw ) { // long r = *pw; // if( r != 0 ) ++*pw; // return r; for( ;; ) { int32_t r = *pw; if( r == 0 ) { return r; } if( __builtin_expect( ( compare_and_swap( pw, r, r + 1 ) == r ), 1 ) ) { return r; } } } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int32_t use_count_; // #shared int32_t weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 1 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 1 ) { destroy(); } } long use_count() const // nothrow { return const_cast< int32_t const volatile & >( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp000066400000000000000000000067221154025176300274210ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_gcc_x86.hpp - g++ on 486+ or AMD64 // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // // Thanks to Ben Hitchings for the #weak + (#shared != 0) // formulation // #include namespace boost { namespace detail { inline int atomic_exchange_and_add( int * pw, int dv ) { // int r = *pw; // *pw += dv; // return r; int r; __asm__ __volatile__ ( "lock\n\t" "xadd %1, %0": "=m"( *pw ), "=r"( r ): // outputs (%0, %1) "m"( *pw ), "1"( dv ): // inputs (%2, %3 == %1) "memory", "cc" // clobbers ); return r; } inline void atomic_increment( int * pw ) { //atomic_exchange_and_add( pw, 1 ); __asm__ ( "lock\n\t" "incl %0": "=m"( *pw ): // output (%0) "m"( *pw ): // input (%1) "cc" // clobbers ); } inline int atomic_conditional_increment( int * pw ) { // int rv = *pw; // if( rv != 0 ) ++*pw; // return rv; int rv, tmp; __asm__ ( "movl %0, %%eax\n\t" "0:\n\t" "test %%eax, %%eax\n\t" "je 1f\n\t" "movl %%eax, %2\n\t" "incl %2\n\t" "lock\n\t" "cmpxchgl %2, %0\n\t" "jne 0b\n\t" "1:": "=m"( *pw ), "=&a"( rv ), "=&r"( tmp ): // outputs (%0, %1, %2) "m"( *pw ): // input (%3) "cc" // clobbers ); return rv; } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_exchange_and_add( &use_count_, -1 ) == 1 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp000066400000000000000000000040541154025176300265750ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_nt.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include namespace boost { namespace detail { class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); long use_count_; // #shared long weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { ++use_count_; } bool add_ref_lock() // true on success { if( use_count_ == 0 ) return false; ++use_count_; return true; } void release() // nothrow { if( --use_count_ == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { ++weak_count_; } void weak_release() // nothrow { if( --weak_count_ == 0 ) { destroy(); } } long use_count() const // nothrow { return use_count_; } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp000066400000000000000000000055751154025176300266100ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_pt.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include namespace boost { namespace detail { class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); long use_count_; // #shared long weak_count_; // #weak + (#shared != 0) mutable pthread_mutex_t m_; public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { // HPUX 10.20 / DCE has a nonstandard pthread_mutex_init #if defined(__hpux) && defined(_DECTHREADS_) pthread_mutex_init( &m_, pthread_mutexattr_default ); #else pthread_mutex_init( &m_, 0 ); #endif } virtual ~sp_counted_base() // nothrow { pthread_mutex_destroy( &m_ ); } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { pthread_mutex_lock( &m_ ); ++use_count_; pthread_mutex_unlock( &m_ ); } bool add_ref_lock() // true on success { pthread_mutex_lock( &m_ ); bool r = use_count_ == 0? false: ( ++use_count_, true ); pthread_mutex_unlock( &m_ ); return r; } void release() // nothrow { pthread_mutex_lock( &m_ ); long new_use_count = --use_count_; pthread_mutex_unlock( &m_ ); if( new_use_count == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { pthread_mutex_lock( &m_ ); ++weak_count_; pthread_mutex_unlock( &m_ ); } void weak_release() // nothrow { pthread_mutex_lock( &m_ ); long new_weak_count = --weak_count_; pthread_mutex_unlock( &m_ ); if( new_weak_count == 0 ) { destroy(); } } long use_count() const // nothrow { pthread_mutex_lock( &m_ ); long r = use_count_; pthread_mutex_unlock( &m_ ); return r; } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp000066400000000000000000000047211154025176300276310ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED // // detail/sp_counted_base_solaris.hpp // based on: detail/sp_counted_base_w32.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // Copyright 2006 Michael van der Westhuizen // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // // Thanks to Ben Hitchings for the #weak + (#shared != 0) // formulation // #include #include namespace boost { namespace detail { class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); uint32_t use_count_; // #shared uint32_t weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_inc_32( &use_count_ ); } bool add_ref_lock() // true on success { for( ;; ) { uint32_t tmp = static_cast< uint32_t const volatile& >( use_count_ ); if( tmp == 0 ) return false; if( atomic_cas_32( &use_count_, tmp, tmp + 1 ) == tmp ) return true; } } void release() // nothrow { if( atomic_dec_32_nv( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_inc_32( &weak_count_ ); } void weak_release() // nothrow { if( atomic_dec_32_nv( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp000066400000000000000000000052631154025176300271300ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_spin.hpp - spinlock pool atomic emulation // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include namespace boost { namespace detail { inline int atomic_exchange_and_add( int * pw, int dv ) { spinlock_pool<1>::scoped_lock lock( pw ); int r = *pw; *pw += dv; return r; } inline void atomic_increment( int * pw ) { spinlock_pool<1>::scoped_lock lock( pw ); ++*pw; } inline int atomic_conditional_increment( int * pw ) { spinlock_pool<1>::scoped_lock lock( pw ); int rv = *pw; if( rv != 0 ) ++*pw; return rv; } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); int use_count_; // #shared int weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_exchange_and_add( &use_count_, -1 ) == 1 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 ) { destroy(); } } long use_count() const // nothrow { spinlock_pool<1>::scoped_lock lock( &use_count_ ); return use_count_; } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp000066400000000000000000000056701154025176300271350ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // detail/sp_counted_base_sync.hpp - g++ 4.1+ __sync intrinsics // // Copyright (c) 2007 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #include #if defined( __ia64__ ) && defined( __INTEL_COMPILER ) # include #endif namespace boost { namespace detail { #if INT_MAX >= 2147483647 typedef int sp_int32_t; #else typedef long sp_int32_t; #endif inline void atomic_increment( sp_int32_t * pw ) { __sync_fetch_and_add( pw, 1 ); } inline sp_int32_t atomic_decrement( sp_int32_t * pw ) { return __sync_fetch_and_add( pw, -1 ); } inline sp_int32_t atomic_conditional_increment( sp_int32_t * pw ) { // long r = *pw; // if( r != 0 ) ++*pw; // return r; sp_int32_t r = *pw; for( ;; ) { if( r == 0 ) { return r; } sp_int32_t r2 = __sync_val_compare_and_swap( pw, r, r + 1 ); if( r2 == r ) { return r; } else { r = r2; } } } class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); sp_int32_t use_count_; // #shared sp_int32_t weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { atomic_increment( &use_count_ ); } bool add_ref_lock() // true on success { return atomic_conditional_increment( &use_count_ ) != 0; } void release() // nothrow { if( atomic_decrement( &use_count_ ) == 1 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { atomic_increment( &weak_count_ ); } void weak_release() // nothrow { if( atomic_decrement( &weak_count_ ) == 1 ) { destroy(); } } long use_count() const // nothrow { return const_cast< sp_int32_t const volatile & >( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_base_w32.hpp000066400000000000000000000055341154025176300265730ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_base_w32.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // // Lock-free algorithm by Alexander Terekhov // // Thanks to Ben Hitchings for the #weak + (#shared != 0) // formulation // #include #include #include namespace boost { namespace detail { class sp_counted_base { private: sp_counted_base( sp_counted_base const & ); sp_counted_base & operator= ( sp_counted_base const & ); long use_count_; // #shared long weak_count_; // #weak + (#shared != 0) public: sp_counted_base(): use_count_( 1 ), weak_count_( 1 ) { } virtual ~sp_counted_base() // nothrow { } // dispose() is called when use_count_ drops to zero, to release // the resources managed by *this. virtual void dispose() = 0; // nothrow // destroy() is called when weak_count_ drops to zero. virtual void destroy() // nothrow { delete this; } virtual void * get_deleter( sp_typeinfo const & ti ) = 0; void add_ref_copy() { BOOST_INTERLOCKED_INCREMENT( &use_count_ ); } bool add_ref_lock() // true on success { for( ;; ) { long tmp = static_cast< long const volatile& >( use_count_ ); if( tmp == 0 ) return false; #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1200 ) // work around a code generation bug long tmp2 = tmp + 1; if( BOOST_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp2, tmp ) == tmp2 - 1 ) return true; #else if( BOOST_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp + 1, tmp ) == tmp ) return true; #endif } } void release() // nothrow { if( BOOST_INTERLOCKED_DECREMENT( &use_count_ ) == 0 ) { dispose(); weak_release(); } } void weak_add_ref() // nothrow { BOOST_INTERLOCKED_INCREMENT( &weak_count_ ); } void weak_release() // nothrow { if( BOOST_INTERLOCKED_DECREMENT( &weak_count_ ) == 0 ) { destroy(); } } long use_count() const // nothrow { return static_cast( use_count_ ); } }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_counted_impl.hpp000066400000000000000000000120361154025176300261220ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // detail/sp_counted_impl.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. // Copyright 2004-2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #if defined(BOOST_SP_USE_STD_ALLOCATOR) && defined(BOOST_SP_USE_QUICK_ALLOCATOR) # error BOOST_SP_USE_STD_ALLOCATOR and BOOST_SP_USE_QUICK_ALLOCATOR are incompatible. #endif #include #include #if defined(BOOST_SP_USE_QUICK_ALLOCATOR) #include #endif #if defined(BOOST_SP_USE_STD_ALLOCATOR) #include // std::allocator #endif #include // std::size_t namespace boost { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) void sp_scalar_constructor_hook( void * px, std::size_t size, void * pn ); void sp_scalar_destructor_hook( void * px, std::size_t size, void * pn ); #endif namespace detail { template class sp_counted_impl_p: public sp_counted_base { private: X * px_; sp_counted_impl_p( sp_counted_impl_p const & ); sp_counted_impl_p & operator= ( sp_counted_impl_p const & ); typedef sp_counted_impl_p this_type; public: explicit sp_counted_impl_p( X * px ): px_( px ) { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_constructor_hook( px, sizeof(X), this ); #endif } virtual void dispose() // nothrow { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_destructor_hook( px_, sizeof(X), this ); #endif boost::checked_delete( px_ ); } virtual void * get_deleter( detail::sp_typeinfo const & ) { return 0; } #if defined(BOOST_SP_USE_STD_ALLOCATOR) void * operator new( std::size_t ) { return std::allocator().allocate( 1, static_cast(0) ); } void operator delete( void * p ) { std::allocator().deallocate( static_cast(p), 1 ); } #endif #if defined(BOOST_SP_USE_QUICK_ALLOCATOR) void * operator new( std::size_t ) { return quick_allocator::alloc(); } void operator delete( void * p ) { quick_allocator::dealloc( p ); } #endif }; // // Borland's Codeguard trips up over the -Vx- option here: // #ifdef __CODEGUARD__ # pragma option push -Vx- #endif template class sp_counted_impl_pd: public sp_counted_base { private: P ptr; // copy constructor must not throw D del; // copy constructor must not throw sp_counted_impl_pd( sp_counted_impl_pd const & ); sp_counted_impl_pd & operator= ( sp_counted_impl_pd const & ); typedef sp_counted_impl_pd this_type; public: // pre: d(p) must not throw sp_counted_impl_pd( P p, D d ): ptr(p), del(d) { } virtual void dispose() // nothrow { del( ptr ); } virtual void * get_deleter( detail::sp_typeinfo const & ti ) { return ti == BOOST_SP_TYPEID(D)? &reinterpret_cast( del ): 0; } #if defined(BOOST_SP_USE_STD_ALLOCATOR) void * operator new( std::size_t ) { return std::allocator().allocate( 1, static_cast(0) ); } void operator delete( void * p ) { std::allocator().deallocate( static_cast(p), 1 ); } #endif #if defined(BOOST_SP_USE_QUICK_ALLOCATOR) void * operator new( std::size_t ) { return quick_allocator::alloc(); } void operator delete( void * p ) { quick_allocator::dealloc( p ); } #endif }; template class sp_counted_impl_pda: public sp_counted_base { private: P p_; // copy constructor must not throw D d_; // copy constructor must not throw A a_; // copy constructor must not throw sp_counted_impl_pda( sp_counted_impl_pda const & ); sp_counted_impl_pda & operator= ( sp_counted_impl_pda const & ); typedef sp_counted_impl_pda this_type; public: // pre: d( p ) must not throw sp_counted_impl_pda( P p, D d, A a ): p_( p ), d_( d ), a_( a ) { } virtual void dispose() // nothrow { d_( p_ ); } virtual void destroy() // nothrow { typedef typename A::template rebind< this_type >::other A2; A2 a2( a_ ); this->~this_type(); a2.deallocate( this, 1 ); } virtual void * get_deleter( detail::sp_typeinfo const & ti ) { return ti == BOOST_SP_TYPEID( D )? &reinterpret_cast( d_ ): 0; } }; #ifdef __CODEGUARD__ # pragma option pop #endif } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/sp_has_sync.hpp000066400000000000000000000022321154025176300252440ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/smart_ptr/detail/sp_has_sync.hpp // // Copyright (c) 2008, 2009 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Defines the BOOST_SP_HAS_SYNC macro if the __sync_* intrinsics // are available. // #if defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) #define BOOST_SP_HAS_SYNC #if defined( __arm__ ) || defined( __armel__ ) #undef BOOST_SP_HAS_SYNC #endif #if defined( __hppa ) || defined( __hppa__ ) #undef BOOST_SP_HAS_SYNC #endif #if defined( __m68k__ ) #undef BOOST_SP_HAS_SYNC #endif #if defined( __sparc__ ) #undef BOOST_SP_HAS_SYNC #endif #if defined( __INTEL_COMPILER ) && !defined( __ia64__ ) && ( __INTEL_COMPILER < 1100 ) #undef BOOST_SP_HAS_SYNC #endif #endif // __GNUC__ * 100 + __GNUC_MINOR__ >= 401 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock.hpp000066400000000000000000000025401154025176300245570ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/spinlock.hpp // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // struct spinlock // { // void lock(); // bool try_lock(); // void unlock(); // // class scoped_lock; // }; // // #define BOOST_DETAIL_SPINLOCK_INIT // #include #include #if defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ ) # include #elif defined( BOOST_SP_HAS_SYNC ) # include #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # include #elif defined(BOOST_HAS_PTHREADS) # include #elif !defined(BOOST_HAS_THREADS) # include #else # error Unrecognized threading platform #endif #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp000066400000000000000000000027271154025176300262410ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include namespace boost { namespace detail { class spinlock { public: int v_; public: bool try_lock() { int r; __asm__ __volatile__( "swp %0, %1, [%2]": "=&r"( r ): // outputs "r"( 1 ), "r"( &v_ ): // inputs "memory", "cc" ); return r == 0; } void lock() { for( unsigned k = 0; !try_lock(); ++k ) { boost::detail::yield( k ); } } void unlock() { __asm__ __volatile__( "" ::: "memory" ); *const_cast< int volatile* >( &v_ ) = 0; } public: class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( spinlock & sp ): sp_( sp ) { sp.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; } // namespace detail } // namespace boost #define BOOST_DETAIL_SPINLOCK_INIT {0} #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock_nt.hpp000066400000000000000000000026701154025176300252640ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include namespace boost { namespace detail { class spinlock { public: bool locked_; public: inline bool try_lock() { if( locked_ ) { return false; } else { locked_ = true; return true; } } inline void lock() { BOOST_ASSERT( !locked_ ); locked_ = true; } inline void unlock() { BOOST_ASSERT( locked_ ); locked_ = false; } public: class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( spinlock & sp ): sp_( sp ) { sp.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; } // namespace detail } // namespace boost #define BOOST_DETAIL_SPINLOCK_INIT { false } #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock_pool.hpp000066400000000000000000000053711154025176300256150ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/detail/spinlock_pool.hpp // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // spinlock_pool<0> is reserved for atomic<>, when/if it arrives // spinlock_pool<1> is reserved for shared_ptr reference counts // spinlock_pool<2> is reserved for shared_ptr atomic access // #include #include #include namespace boost { namespace detail { template< int I > class spinlock_pool { private: static spinlock pool_[ 41 ]; public: static spinlock & spinlock_for( void const * pv ) { std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41; return pool_[ i ]; } class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( void const * pv ): sp_( spinlock_for( pv ) ) { sp_.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; template< int I > spinlock spinlock_pool< I >::pool_[ 41 ] = { BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT }; } // namespace detail } // namespace boost #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock_pt.hpp000066400000000000000000000024421154025176300252630ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include namespace boost { namespace detail { class spinlock { public: pthread_mutex_t v_; public: bool try_lock() { return pthread_mutex_trylock( &v_ ) == 0; } void lock() { pthread_mutex_lock( &v_ ); } void unlock() { pthread_mutex_unlock( &v_ ); } public: class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( spinlock & sp ): sp_( sp ) { sp.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; } // namespace detail } // namespace boost #define BOOST_DETAIL_SPINLOCK_INIT { PTHREAD_MUTEX_INITIALIZER } #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock_sync.hpp000066400000000000000000000027231154025176300256160ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #if defined( __ia64__ ) && defined( __INTEL_COMPILER ) # include #endif namespace boost { namespace detail { class spinlock { public: int v_; public: bool try_lock() { int r = __sync_lock_test_and_set( &v_, 1 ); return r == 0; } void lock() { for( unsigned k = 0; !try_lock(); ++k ) { boost::detail::yield( k ); } } void unlock() { __sync_lock_release( &v_ ); } public: class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( spinlock & sp ): sp_( sp ) { sp.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; } // namespace detail } // namespace boost #define BOOST_DETAIL_SPINLOCK_INIT {0} #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/spinlock_w32.hpp000066400000000000000000000036321154025176300252550ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // Copyright (c) 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include // BOOST_COMPILER_FENCE #if defined(__INTEL_COMPILER) #define BOOST_COMPILER_FENCE __memory_barrier(); #elif defined( _MSC_VER ) && _MSC_VER >= 1310 extern "C" void _ReadWriteBarrier(); #pragma intrinsic( _ReadWriteBarrier ) #define BOOST_COMPILER_FENCE _ReadWriteBarrier(); #elif defined(__GNUC__) #define BOOST_COMPILER_FENCE __asm__ __volatile__( "" : : : "memory" ); #else #define BOOST_COMPILER_FENCE #endif // namespace boost { namespace detail { class spinlock { public: long v_; public: bool try_lock() { long r = BOOST_INTERLOCKED_EXCHANGE( &v_, 1 ); BOOST_COMPILER_FENCE return r == 0; } void lock() { for( unsigned k = 0; !try_lock(); ++k ) { boost::detail::yield( k ); } } void unlock() { BOOST_COMPILER_FENCE *const_cast< long volatile* >( &v_ ) = 0; } public: class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( spinlock & sp ): sp_( sp ) { sp.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; } // namespace detail } // namespace boost #define BOOST_DETAIL_SPINLOCK_INIT {0} #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/detail/yield_k.hpp000066400000000000000000000045731154025176300243650ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED #define BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // yield_k.hpp // // Copyright (c) 2008 Peter Dimov // // void yield( unsigned k ); // // Typical use: // // for( unsigned k = 0; !try_lock(); ++k ) yield( k ); // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #include // BOOST_SMT_PAUSE #if defined(_MSC_VER) && _MSC_VER >= 1310 && ( defined(_M_IX86) || defined(_M_X64) ) extern "C" void _mm_pause(); #pragma intrinsic( _mm_pause ) #define BOOST_SMT_PAUSE _mm_pause(); #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) ) #define BOOST_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" ); #endif // #if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ ) #if defined( BOOST_USE_WINDOWS_H ) # include #endif namespace boost { namespace detail { #if !defined( BOOST_USE_WINDOWS_H ) extern "C" void __stdcall Sleep( unsigned ms ); #endif inline void yield( unsigned k ) { if( k < 4 ) { } #if defined( BOOST_SMT_PAUSE ) else if( k < 16 ) { BOOST_SMT_PAUSE } #endif else if( k < 32 ) { Sleep( 0 ); } else { Sleep( 1 ); } } } // namespace detail } // namespace boost #elif defined( BOOST_HAS_PTHREADS ) #include #include namespace boost { namespace detail { inline void yield( unsigned k ) { if( k < 4 ) { } #if defined( BOOST_SMT_PAUSE ) else if( k < 16 ) { BOOST_SMT_PAUSE } #endif else if( k < 32 || k & 1 ) { sched_yield(); } else { // g++ -Wextra warns on {} or {0} struct timespec rqtp = { 0, 0 }; // POSIX says that timespec has tv_sec and tv_nsec // But it doesn't guarantee order or placement rqtp.tv_sec = 0; rqtp.tv_nsec = 1000; nanosleep( &rqtp, 0 ); } } } // namespace detail } // namespace boost #else namespace boost { namespace detail { inline void yield( unsigned ) { } } // namespace detail } // namespace boost #endif #endif // #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/enable_shared_from_this.hpp000066400000000000000000000033271154025176300263250ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED #define BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED // // enable_shared_from_this.hpp // // Copyright 2002, 2009 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // // http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html // #include #include #include #include namespace boost { template class enable_shared_from_this { protected: enable_shared_from_this() { } enable_shared_from_this(enable_shared_from_this const &) { } enable_shared_from_this & operator=(enable_shared_from_this const &) { return *this; } ~enable_shared_from_this() { } public: shared_ptr shared_from_this() { shared_ptr p( weak_this_ ); BOOST_ASSERT( p.get() == this ); return p; } shared_ptr shared_from_this() const { shared_ptr p( weak_this_ ); BOOST_ASSERT( p.get() == this ); return p; } public: // actually private, but avoids compiler template friendship issues // Note: invoked automatically by shared_ptr; do not call template void _internal_accept_owner( shared_ptr const * ppx, Y * py ) const { if( weak_this_.expired() ) { weak_this_ = shared_ptr( *ppx, py ); } } private: mutable weak_ptr weak_this_; }; } // namespace boost #endif // #ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/enable_shared_from_this2.hpp000066400000000000000000000055571154025176300264160ustar00rootroot00000000000000#ifndef BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED #define BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED // // enable_shared_from_this2.hpp // // Copyright 2002, 2009 Peter Dimov // Copyright 2008 Frank Mori Hess // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #include #include #include #include namespace boost { namespace detail { class esft2_deleter_wrapper { private: shared_ptr deleter_; public: esft2_deleter_wrapper() { } template< class T > void set_deleter( shared_ptr const & deleter ) { deleter_ = deleter; } template< class T> void operator()( T* ) { BOOST_ASSERT( deleter_.use_count() <= 1 ); deleter_.reset(); } }; } // namespace detail template< class T > class enable_shared_from_this2 { protected: enable_shared_from_this2() { } enable_shared_from_this2( enable_shared_from_this2 const & ) { } enable_shared_from_this2 & operator=( enable_shared_from_this2 const & ) { return *this; } ~enable_shared_from_this2() { BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling shared_ptr objects exist } private: mutable weak_ptr weak_this_; mutable shared_ptr shared_this_; public: shared_ptr shared_from_this() { init_weak_once(); return shared_ptr( weak_this_ ); } shared_ptr shared_from_this() const { init_weak_once(); return shared_ptr( weak_this_ ); } private: void init_weak_once() const { if( weak_this_._empty() ) { shared_this_.reset( static_cast< T* >( 0 ), detail::esft2_deleter_wrapper() ); weak_this_ = shared_this_; } } public: // actually private, but avoids compiler template friendship issues // Note: invoked automatically by shared_ptr; do not call template void _internal_accept_owner( shared_ptr * ppx, Y * py ) const { BOOST_ASSERT( ppx != 0 ); if( weak_this_.use_count() == 0 ) { weak_this_ = shared_ptr( *ppx, py ); } else if( shared_this_.use_count() != 0 ) { BOOST_ASSERT( ppx->unique() ); // no weak_ptrs should exist either, but there's no way to check that detail::esft2_deleter_wrapper * pd = boost::get_deleter( shared_this_ ); BOOST_ASSERT( pd != 0 ); pd->set_deleter( *ppx ); ppx->reset( shared_this_, ppx->get() ); shared_this_.reset(); } } }; } // namespace boost #endif // #ifndef BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/intrusive_ptr.hpp000066400000000000000000000145441154025176300244170ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED // // intrusive_ptr.hpp // // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/intrusive_ptr.html for documentation. // #include #ifdef BOOST_MSVC // moved here to work around VC++ compiler crash # pragma warning(push) # pragma warning(disable:4284) // odd return type for operator-> #endif #include #include #include #include // for std::less #if !defined(BOOST_NO_IOSTREAM) #if !defined(BOOST_NO_IOSFWD) #include // for std::basic_ostream #else #include #endif #endif namespace boost { // // intrusive_ptr // // A smart pointer that uses intrusive reference counting. // // Relies on unqualified calls to // // void intrusive_ptr_add_ref(T * p); // void intrusive_ptr_release(T * p); // // (p != 0) // // The object is responsible for destroying itself. // template class intrusive_ptr { private: typedef intrusive_ptr this_type; public: typedef T element_type; intrusive_ptr(): px( 0 ) { } intrusive_ptr( T * p, bool add_ref = true ): px( p ) { if( px != 0 && add_ref ) intrusive_ptr_add_ref( px ); } #if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES) template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) intrusive_ptr( intrusive_ptr const & rhs, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else intrusive_ptr( intrusive_ptr const & rhs ) #endif : px( rhs.get() ) { if( px != 0 ) intrusive_ptr_add_ref( px ); } #endif intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px ) { if( px != 0 ) intrusive_ptr_add_ref( px ); } ~intrusive_ptr() { if( px != 0 ) intrusive_ptr_release( px ); } #if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES) template intrusive_ptr & operator=(intrusive_ptr const & rhs) { this_type(rhs).swap(*this); return *this; } #endif // Move support #if defined( BOOST_HAS_RVALUE_REFS ) intrusive_ptr(intrusive_ptr && rhs): px( rhs.px ) { rhs.px = 0; } intrusive_ptr & operator=(intrusive_ptr && rhs) { this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this); return *this; } #endif intrusive_ptr & operator=(intrusive_ptr const & rhs) { this_type(rhs).swap(*this); return *this; } intrusive_ptr & operator=(T * rhs) { this_type(rhs).swap(*this); return *this; } void reset() { this_type().swap( *this ); } void reset( T * rhs ) { this_type( rhs ).swap( *this ); } T * get() const { return px; } T & operator*() const { BOOST_ASSERT( px != 0 ); return *px; } T * operator->() const { BOOST_ASSERT( px != 0 ); return px; } // implicit conversion to "bool" #include void swap(intrusive_ptr & rhs) { T * tmp = px; px = rhs.px; rhs.px = tmp; } private: T * px; }; template inline bool operator==(intrusive_ptr const & a, intrusive_ptr const & b) { return a.get() == b.get(); } template inline bool operator!=(intrusive_ptr const & a, intrusive_ptr const & b) { return a.get() != b.get(); } template inline bool operator==(intrusive_ptr const & a, U * b) { return a.get() == b; } template inline bool operator!=(intrusive_ptr const & a, U * b) { return a.get() != b; } template inline bool operator==(T * a, intrusive_ptr const & b) { return a == b.get(); } template inline bool operator!=(T * a, intrusive_ptr const & b) { return a != b.get(); } #if __GNUC__ == 2 && __GNUC_MINOR__ <= 96 // Resolve the ambiguity between our op!= and the one in rel_ops template inline bool operator!=(intrusive_ptr const & a, intrusive_ptr const & b) { return a.get() != b.get(); } #endif template inline bool operator<(intrusive_ptr const & a, intrusive_ptr const & b) { return std::less()(a.get(), b.get()); } template void swap(intrusive_ptr & lhs, intrusive_ptr & rhs) { lhs.swap(rhs); } // mem_fn support template T * get_pointer(intrusive_ptr const & p) { return p.get(); } template intrusive_ptr static_pointer_cast(intrusive_ptr const & p) { return static_cast(p.get()); } template intrusive_ptr const_pointer_cast(intrusive_ptr const & p) { return const_cast(p.get()); } template intrusive_ptr dynamic_pointer_cast(intrusive_ptr const & p) { return dynamic_cast(p.get()); } // operator<< #if !defined(BOOST_NO_IOSTREAM) #if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) && (__GNUC__ < 3) ) template std::ostream & operator<< (std::ostream & os, intrusive_ptr const & p) { os << p.get(); return os; } #else // in STLport's no-iostreams mode no iostream symbols can be used #ifndef _STLP_NO_IOSTREAMS # if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT) // MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL using std::basic_ostream; template basic_ostream & operator<< (basic_ostream & os, intrusive_ptr const & p) # else template std::basic_ostream & operator<< (std::basic_ostream & os, intrusive_ptr const & p) # endif { os << p.get(); return os; } #endif // _STLP_NO_IOSTREAMS #endif // __GNUC__ < 3 #endif // !defined(BOOST_NO_IOSTREAM) } // namespace boost #ifdef BOOST_MSVC # pragma warning(pop) #endif #endif // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/make_shared.hpp000066400000000000000000000365071154025176300237500ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED #define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED // make_shared.hpp // // Copyright (c) 2007, 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // // See http://www.boost.org/libs/smart_ptr/make_shared.html // for documentation. #include #include #include #include #include #include namespace boost { namespace detail { template< std::size_t N, std::size_t A > struct sp_aligned_storage { union type { char data_[ N ]; typename boost::type_with_alignment< A >::type align_; }; }; template< class T > class sp_ms_deleter { private: typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type; bool initialized_; storage_type storage_; private: void destroy() { if( initialized_ ) { reinterpret_cast< T* >( storage_.data_ )->~T(); initialized_ = false; } } public: sp_ms_deleter(): initialized_( false ) { } // optimization: do not copy storage_ sp_ms_deleter( sp_ms_deleter const & ): initialized_( false ) { } ~sp_ms_deleter() { destroy(); } void operator()( T * ) { destroy(); } void * address() { return storage_.data_; } void set_initialized() { initialized_ = true; } }; #if defined( BOOST_HAS_RVALUE_REFS ) template< class T > T&& forward( T &&t ) { return t; } #endif } // namespace detail // Zero-argument versions // // Used even when variadic templates are available because of the new T() vs new T issue template< class T > boost::shared_ptr< T > make_shared() { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T(); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T(); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS ) // Variadic templates, rvalue reference template< class T, class... Args > boost::shared_ptr< T > make_shared( Args && ... args ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( detail::forward( args )... ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Args && ... args ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( detail::forward( args )... ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } #else // C++03 version template< class T, class A1 > boost::shared_ptr< T > make_shared( A1 const & a1 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a ); detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt ); void * pv = pd->address(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); pd->set_initialized(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return boost::shared_ptr< T >( pt, pt2 ); } #endif } // namespace boost #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/scoped_array.hpp000066400000000000000000000047741154025176300241610ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // http://www.boost.org/libs/smart_ptr/scoped_array.htm // #include #include #include // in case ptrdiff_t not in std #include #include // for std::ptrdiff_t namespace boost { // Debug hooks #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) void sp_array_constructor_hook(void * p); void sp_array_destructor_hook(void * p); #endif // scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to // is guaranteed, either on destruction of the scoped_array or via an explicit // reset(). Use shared_array or std::vector if your needs are more complex. template class scoped_array // noncopyable { private: T * px; scoped_array(scoped_array const &); scoped_array & operator=(scoped_array const &); typedef scoped_array this_type; void operator==( scoped_array const& ) const; void operator!=( scoped_array const& ) const; public: typedef T element_type; explicit scoped_array( T * p = 0 ) : px( p ) // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_array_constructor_hook( px ); #endif } ~scoped_array() // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_array_destructor_hook( px ); #endif boost::checked_array_delete( px ); } void reset(T * p = 0) // never throws { BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors this_type(p).swap(*this); } T & operator[](std::ptrdiff_t i) const // never throws { BOOST_ASSERT( px != 0 ); BOOST_ASSERT( i >= 0 ); return px[i]; } T * get() const // never throws { return px; } // implicit conversion to "bool" #include void swap(scoped_array & b) // never throws { T * tmp = b.px; b.px = px; px = tmp; } }; template inline void swap(scoped_array & a, scoped_array & b) // never throws { a.swap(b); } } // namespace boost #endif // #ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/scoped_ptr.hpp000066400000000000000000000056311154025176300236410ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // http://www.boost.org/libs/smart_ptr/scoped_ptr.htm // #include #include #include #ifndef BOOST_NO_AUTO_PTR # include // for std::auto_ptr #endif namespace boost { // Debug hooks #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) void sp_scalar_constructor_hook(void * p); void sp_scalar_destructor_hook(void * p); #endif // scoped_ptr mimics a built-in pointer except that it guarantees deletion // of the object pointed to, either on destruction of the scoped_ptr or via // an explicit reset(). scoped_ptr is a simple solution for simple needs; // use shared_ptr or std::auto_ptr if your needs are more complex. template class scoped_ptr // noncopyable { private: T * px; scoped_ptr(scoped_ptr const &); scoped_ptr & operator=(scoped_ptr const &); typedef scoped_ptr this_type; void operator==( scoped_ptr const& ) const; void operator!=( scoped_ptr const& ) const; public: typedef T element_type; explicit scoped_ptr( T * p = 0 ): px( p ) // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_constructor_hook( px ); #endif } #ifndef BOOST_NO_AUTO_PTR explicit scoped_ptr( std::auto_ptr p ): px( p.release() ) // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_constructor_hook( px ); #endif } #endif ~scoped_ptr() // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_destructor_hook( px ); #endif boost::checked_delete( px ); } void reset(T * p = 0) // never throws { BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors this_type(p).swap(*this); } T & operator*() const // never throws { BOOST_ASSERT( px != 0 ); return *px; } T * operator->() const // never throws { BOOST_ASSERT( px != 0 ); return px; } T * get() const // never throws { return px; } // implicit conversion to "bool" #include void swap(scoped_ptr & b) // never throws { T * tmp = b.px; b.px = px; px = tmp; } }; template inline void swap(scoped_ptr & a, scoped_ptr & b) // never throws { a.swap(b); } // get_pointer(p) is a generic way to say p.get() template inline T * get_pointer(scoped_ptr const & p) { return p.get(); } } // namespace boost #endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/shared_array.hpp000066400000000000000000000066561154025176300241530ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED #define BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED // // shared_array.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation. // #include // for broken compiler workarounds #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) #include #else #include // TR1 cyclic inclusion fix #include #include #include #include #include // for std::ptrdiff_t #include // for std::swap #include // for std::less namespace boost { // // shared_array // // shared_array extends shared_ptr to arrays. // The array pointed to is deleted when the last shared_array pointing to it // is destroyed or reset. // template class shared_array { private: // Borland 5.5.1 specific workarounds typedef checked_array_deleter deleter; typedef shared_array this_type; public: typedef T element_type; explicit shared_array(T * p = 0): px(p), pn(p, deleter()) { } // // Requirements: D's copy constructor must not throw // // shared_array will release p by calling d(p) // template shared_array(T * p, D d): px(p), pn(p, d) { } // generated copy constructor, assignment, destructor are fine void reset(T * p = 0) { BOOST_ASSERT(p == 0 || p != px); this_type(p).swap(*this); } template void reset(T * p, D d) { this_type(p, d).swap(*this); } T & operator[] (std::ptrdiff_t i) const // never throws { BOOST_ASSERT(px != 0); BOOST_ASSERT(i >= 0); return px[i]; } T * get() const // never throws { return px; } // implicit conversion to "bool" #include bool unique() const // never throws { return pn.unique(); } long use_count() const // never throws { return pn.use_count(); } void swap(shared_array & other) // never throws { std::swap(px, other.px); pn.swap(other.pn); } private: T * px; // contained pointer detail::shared_count pn; // reference counter }; // shared_array template inline bool operator==(shared_array const & a, shared_array const & b) // never throws { return a.get() == b.get(); } template inline bool operator!=(shared_array const & a, shared_array const & b) // never throws { return a.get() != b.get(); } template inline bool operator<(shared_array const & a, shared_array const & b) // never throws { return std::less()(a.get(), b.get()); } template void swap(shared_array & a, shared_array & b) // never throws { a.swap(b); } } // namespace boost #endif // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) #endif // #ifndef BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/shared_ptr.hpp000066400000000000000000000422261154025176300236330ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED // // shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001-2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include // for broken compiler workarounds #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) #include #else // In order to avoid circular dependencies with Boost.TR1 // we make sure that our include of doesn't try to // pull in the TR1 headers: that's why we use this header // rather than including directly: #include // std::auto_ptr #include #include #include #include #include #include #if !defined(BOOST_SP_NO_ATOMIC_ACCESS) #include #include #endif #include // for std::swap #include // for std::less #include // for std::bad_cast #if !defined(BOOST_NO_IOSTREAM) #if !defined(BOOST_NO_IOSFWD) #include // for std::basic_ostream #else #include #endif #endif #ifdef BOOST_MSVC // moved here to work around VC++ compiler crash # pragma warning(push) # pragma warning(disable:4284) // odd return type for operator-> #endif namespace boost { template class shared_ptr; template class weak_ptr; template class enable_shared_from_this; template class enable_shared_from_this2; namespace detail { struct static_cast_tag {}; struct const_cast_tag {}; struct dynamic_cast_tag {}; struct polymorphic_cast_tag {}; template struct shared_ptr_traits { typedef T & reference; }; template<> struct shared_ptr_traits { typedef void reference; }; #if !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS) template<> struct shared_ptr_traits { typedef void reference; }; template<> struct shared_ptr_traits { typedef void reference; }; template<> struct shared_ptr_traits { typedef void reference; }; #endif // enable_shared_from_this support template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe ) { if( pe != 0 ) { pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) ); } } template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr * ppx, Y const * py, boost::enable_shared_from_this2< T > const * pe ) { if( pe != 0 ) { pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) ); } } #ifdef _MANAGED // Avoid C4793, ... causes native code generation struct sp_any_pointer { template sp_any_pointer( T* ) {} }; inline void sp_enable_shared_from_this( sp_any_pointer, sp_any_pointer, sp_any_pointer ) { } #else // _MANAGED inline void sp_enable_shared_from_this( ... ) { } #endif // _MANAGED #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_AUTO_PTR ) // rvalue auto_ptr support based on a technique by Dave Abrahams template< class T, class R > struct sp_enable_if_auto_ptr { }; template< class T, class R > struct sp_enable_if_auto_ptr< std::auto_ptr< T >, R > { typedef R type; }; #endif } // namespace detail // // shared_ptr // // An enhanced relative of scoped_ptr with reference counted copy semantics. // The object pointed to is deleted when the last shared_ptr pointing to it // is destroyed or reset. // template class shared_ptr { private: // Borland 5.5.1 specific workaround typedef shared_ptr this_type; public: typedef T element_type; typedef T value_type; typedef T * pointer; typedef typename boost::detail::shared_ptr_traits::reference reference; shared_ptr(): px(0), pn() // never throws in 1.30+ { } template explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete { boost::detail::sp_enable_shared_from_this( this, p, p ); } // // Requirements: D's copy constructor must not throw // // shared_ptr will release p by calling d(p) // template shared_ptr(Y * p, D d): px(p), pn(p, d) { boost::detail::sp_enable_shared_from_this( this, p, p ); } // As above, but with allocator. A's copy constructor shall not throw. template shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a ) { boost::detail::sp_enable_shared_from_this( this, p, p ); } // generated copy constructor, destructor are fine template explicit shared_ptr(weak_ptr const & r): pn(r.pn) // may throw { // it is now safe to copy r.px, as pn(r.pn) did not throw px = r.px; } template shared_ptr( weak_ptr const & r, boost::detail::sp_nothrow_tag ): px( 0 ), pn( r.pn, boost::detail::sp_nothrow_tag() ) // never throws { if( !pn.empty() ) { px = r.px; } } template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) shared_ptr( shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else shared_ptr( shared_ptr const & r ) #endif : px( r.px ), pn( r.pn ) // never throws { } // aliasing template< class Y > shared_ptr( shared_ptr const & r, T * p ): px( p ), pn( r.pn ) // never throws { } template shared_ptr(shared_ptr const & r, boost::detail::static_cast_tag): px(static_cast(r.px)), pn(r.pn) { } template shared_ptr(shared_ptr const & r, boost::detail::const_cast_tag): px(const_cast(r.px)), pn(r.pn) { } template shared_ptr(shared_ptr const & r, boost::detail::dynamic_cast_tag): px(dynamic_cast(r.px)), pn(r.pn) { if(px == 0) // need to allocate new counter -- the cast failed { pn = boost::detail::shared_count(); } } template shared_ptr(shared_ptr const & r, boost::detail::polymorphic_cast_tag): px(dynamic_cast(r.px)), pn(r.pn) { if(px == 0) { boost::throw_exception(std::bad_cast()); } } #ifndef BOOST_NO_AUTO_PTR template explicit shared_ptr(std::auto_ptr & r): px(r.get()), pn() { Y * tmp = r.get(); pn = boost::detail::shared_count(r); boost::detail::sp_enable_shared_from_this( this, tmp, tmp ); } #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) template explicit shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr::type = 0 ): px( r.get() ), pn() { typename Ap::element_type * tmp = r.get(); pn = boost::detail::shared_count( r ); boost::detail::sp_enable_shared_from_this( this, tmp, tmp ); } #endif // BOOST_NO_SFINAE, BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION #endif // BOOST_NO_AUTO_PTR // assignment shared_ptr & operator=( shared_ptr const & r ) // never throws { this_type(r).swap(*this); return *this; } #if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1400) template shared_ptr & operator=(shared_ptr const & r) // never throws { this_type(r).swap(*this); return *this; } #endif #ifndef BOOST_NO_AUTO_PTR template shared_ptr & operator=( std::auto_ptr & r ) { this_type(r).swap(*this); return *this; } #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) template typename boost::detail::sp_enable_if_auto_ptr< Ap, shared_ptr & >::type operator=( Ap r ) { this_type( r ).swap( *this ); return *this; } #endif // BOOST_NO_SFINAE, BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION #endif // BOOST_NO_AUTO_PTR // Move support #if defined( BOOST_HAS_RVALUE_REFS ) shared_ptr( shared_ptr && r ): px( r.px ), pn() // never throws { pn.swap( r.pn ); r.px = 0; } template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) shared_ptr( shared_ptr && r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else shared_ptr( shared_ptr && r ) #endif : px( r.px ), pn() // never throws { pn.swap( r.pn ); r.px = 0; } shared_ptr & operator=( shared_ptr && r ) // never throws { this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); return *this; } template shared_ptr & operator=( shared_ptr && r ) // never throws { this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); return *this; } #endif void reset() // never throws in 1.30+ { this_type().swap(*this); } template void reset(Y * p) // Y must be complete { BOOST_ASSERT(p == 0 || p != px); // catch self-reset errors this_type(p).swap(*this); } template void reset( Y * p, D d ) { this_type( p, d ).swap( *this ); } template void reset( Y * p, D d, A a ) { this_type( p, d, a ).swap( *this ); } template void reset( shared_ptr const & r, T * p ) { this_type( r, p ).swap( *this ); } reference operator* () const // never throws { BOOST_ASSERT(px != 0); return *px; } T * operator-> () const // never throws { BOOST_ASSERT(px != 0); return px; } T * get() const // never throws { return px; } // implicit conversion to "bool" #include bool unique() const // never throws { return pn.unique(); } long use_count() const // never throws { return pn.use_count(); } void swap(shared_ptr & other) // never throws { std::swap(px, other.px); pn.swap(other.pn); } template bool _internal_less(shared_ptr const & rhs) const { return pn < rhs.pn; } void * _internal_get_deleter( boost::detail::sp_typeinfo const & ti ) const { return pn.get_deleter( ti ); } bool _internal_equiv( shared_ptr const & r ) const { return px == r.px && pn == r.pn; } // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. (Matthew Langston) #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS private: template friend class shared_ptr; template friend class weak_ptr; #endif T * px; // contained pointer boost::detail::shared_count pn; // reference counter }; // shared_ptr template inline bool operator==(shared_ptr const & a, shared_ptr const & b) { return a.get() == b.get(); } template inline bool operator!=(shared_ptr const & a, shared_ptr const & b) { return a.get() != b.get(); } #if __GNUC__ == 2 && __GNUC_MINOR__ <= 96 // Resolve the ambiguity between our op!= and the one in rel_ops template inline bool operator!=(shared_ptr const & a, shared_ptr const & b) { return a.get() != b.get(); } #endif template inline bool operator<(shared_ptr const & a, shared_ptr const & b) { return a._internal_less(b); } template inline void swap(shared_ptr & a, shared_ptr & b) { a.swap(b); } template shared_ptr static_pointer_cast(shared_ptr const & r) { return shared_ptr(r, boost::detail::static_cast_tag()); } template shared_ptr const_pointer_cast(shared_ptr const & r) { return shared_ptr(r, boost::detail::const_cast_tag()); } template shared_ptr dynamic_pointer_cast(shared_ptr const & r) { return shared_ptr(r, boost::detail::dynamic_cast_tag()); } // shared_*_cast names are deprecated. Use *_pointer_cast instead. template shared_ptr shared_static_cast(shared_ptr const & r) { return shared_ptr(r, boost::detail::static_cast_tag()); } template shared_ptr shared_dynamic_cast(shared_ptr const & r) { return shared_ptr(r, boost::detail::dynamic_cast_tag()); } template shared_ptr shared_polymorphic_cast(shared_ptr const & r) { return shared_ptr(r, boost::detail::polymorphic_cast_tag()); } template shared_ptr shared_polymorphic_downcast(shared_ptr const & r) { BOOST_ASSERT(dynamic_cast(r.get()) == r.get()); return shared_static_cast(r); } // get_pointer() enables boost::mem_fn to recognize shared_ptr template inline T * get_pointer(shared_ptr const & p) { return p.get(); } // operator<< #if !defined(BOOST_NO_IOSTREAM) #if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) && (__GNUC__ < 3) ) template std::ostream & operator<< (std::ostream & os, shared_ptr const & p) { os << p.get(); return os; } #else // in STLport's no-iostreams mode no iostream symbols can be used #ifndef _STLP_NO_IOSTREAMS # if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT) // MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL using std::basic_ostream; template basic_ostream & operator<< (basic_ostream & os, shared_ptr const & p) # else template std::basic_ostream & operator<< (std::basic_ostream & os, shared_ptr const & p) # endif { os << p.get(); return os; } #endif // _STLP_NO_IOSTREAMS #endif // __GNUC__ < 3 #endif // !defined(BOOST_NO_IOSTREAM) // get_deleter #if ( defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3) ) || \ ( defined(__EDG_VERSION__) && BOOST_WORKAROUND(__EDG_VERSION__, <= 238) ) || \ ( defined(__HP_aCC) && BOOST_WORKAROUND(__HP_aCC, <= 33500) ) // g++ 2.9x doesn't allow static_cast(void *) // apparently EDG 2.38 and HP aCC A.03.35 also don't accept it template D * get_deleter(shared_ptr const & p) { void const * q = p._internal_get_deleter(BOOST_SP_TYPEID(D)); return const_cast(static_cast(q)); } #else template D * get_deleter(shared_ptr const & p) { return static_cast(p._internal_get_deleter(BOOST_SP_TYPEID(D))); } #endif // atomic access #if !defined(BOOST_SP_NO_ATOMIC_ACCESS) template inline bool atomic_is_lock_free( shared_ptr const * /*p*/ ) { return false; } template shared_ptr atomic_load( shared_ptr const * p ) { boost::detail::spinlock_pool<2>::scoped_lock lock( p ); return *p; } template inline shared_ptr atomic_load_explicit( shared_ptr const * p, memory_order /*mo*/ ) { return atomic_load( p ); } template void atomic_store( shared_ptr * p, shared_ptr r ) { boost::detail::spinlock_pool<2>::scoped_lock lock( p ); p->swap( r ); } template inline void atomic_store_explicit( shared_ptr * p, shared_ptr r, memory_order /*mo*/ ) { atomic_store( p, r ); // std::move( r ) } template shared_ptr atomic_exchange( shared_ptr * p, shared_ptr r ) { boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p ); sp.lock(); p->swap( r ); sp.unlock(); return r; // return std::move( r ) } template shared_ptr atomic_exchange_explicit( shared_ptr * p, shared_ptr r, memory_order /*mo*/ ) { return atomic_exchange( p, r ); // std::move( r ) } template bool atomic_compare_exchange( shared_ptr * p, shared_ptr * v, shared_ptr w ) { boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p ); sp.lock(); if( p->_internal_equiv( *v ) ) { p->swap( w ); sp.unlock(); return true; } else { shared_ptr tmp( *p ); sp.unlock(); tmp.swap( *v ); return false; } } template inline bool atomic_compare_exchange_explicit( shared_ptr * p, shared_ptr * v, shared_ptr w, memory_order /*success*/, memory_order /*failure*/ ) { return atomic_compare_exchange( p, v, w ); // std::move( w ) } #endif } // namespace boost #ifdef BOOST_MSVC # pragma warning(pop) #endif #endif // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) #endif // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/smart_ptr/weak_ptr.hpp000066400000000000000000000121031154025176300233030ustar00rootroot00000000000000#ifndef BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED // // weak_ptr.hpp // // Copyright (c) 2001, 2002, 2003 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/smart_ptr/weak_ptr.htm for documentation. // #include // boost.TR1 include order fix #include #include #ifdef BOOST_MSVC // moved here to work around VC++ compiler crash # pragma warning(push) # pragma warning(disable:4284) // odd return type for operator-> #endif namespace boost { template class weak_ptr { private: // Borland 5.5.1 specific workarounds typedef weak_ptr this_type; public: typedef T element_type; weak_ptr(): px(0), pn() // never throws in 1.30+ { } // generated copy constructor, assignment, destructor are fine // // The "obvious" converting constructor implementation: // // template // weak_ptr(weak_ptr const & r): px(r.px), pn(r.pn) // never throws // { // } // // has a serious problem. // // r.px may already have been invalidated. The px(r.px) // conversion may require access to *r.px (virtual inheritance). // // It is not possible to avoid spurious access violations since // in multithreaded programs r.px may be invalidated at any point. // template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) weak_ptr( weak_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else weak_ptr( weak_ptr const & r ) #endif : px(r.lock().get()), pn(r.pn) // never throws { } #if defined( BOOST_HAS_RVALUE_REFS ) template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) weak_ptr( weak_ptr && r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else weak_ptr( weak_ptr && r ) #endif : px( r.lock().get() ), pn( static_cast< boost::detail::weak_count && >( r.pn ) ) // never throws { r.px = 0; } // for better efficiency in the T == Y case weak_ptr( weak_ptr && r ): px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) ) // never throws { r.px = 0; } // for better efficiency in the T == Y case weak_ptr & operator=( weak_ptr && r ) // never throws { this_type( static_cast< weak_ptr && >( r ) ).swap( *this ); return *this; } #endif template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) weak_ptr( shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else weak_ptr( shared_ptr const & r ) #endif : px( r.px ), pn( r.pn ) // never throws { } #if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1300) template weak_ptr & operator=(weak_ptr const & r) // never throws { px = r.lock().get(); pn = r.pn; return *this; } #if defined( BOOST_HAS_RVALUE_REFS ) template weak_ptr & operator=( weak_ptr && r ) { this_type( static_cast< weak_ptr && >( r ) ).swap( *this ); return *this; } #endif template weak_ptr & operator=(shared_ptr const & r) // never throws { px = r.px; pn = r.pn; return *this; } #endif shared_ptr lock() const // never throws { return shared_ptr( *this, boost::detail::sp_nothrow_tag() ); } long use_count() const // never throws { return pn.use_count(); } bool expired() const // never throws { return pn.use_count() == 0; } bool _empty() const // extension, not in std::weak_ptr { return pn.empty(); } void reset() // never throws in 1.30+ { this_type().swap(*this); } void swap(this_type & other) // never throws { std::swap(px, other.px); pn.swap(other.pn); } void _internal_assign(T * px2, boost::detail::shared_count const & pn2) { px = px2; pn = pn2; } template bool _internal_less(weak_ptr const & rhs) const { return pn < rhs.pn; } // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. (Matthew Langston) #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS private: template friend class weak_ptr; template friend class shared_ptr; #endif T * px; // contained pointer boost::detail::weak_count pn; // reference counter }; // weak_ptr template inline bool operator<(weak_ptr const & a, weak_ptr const & b) { return a._internal_less(b); } template void swap(weak_ptr & a, weak_ptr & b) { a.swap(b); } } // namespace boost #ifdef BOOST_MSVC # pragma warning(pop) #endif #endif // #ifndef BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/throw_exception.hpp000066400000000000000000000041311154025176300226770ustar00rootroot00000000000000#ifndef BOOST_THROW_EXCEPTION_HPP_INCLUDED #define BOOST_THROW_EXCEPTION_HPP_INCLUDED // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // // boost/throw_exception.hpp // // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. // Copyright (c) 2008-2009 Emil Dotchevski and Reverge Studios, Inc. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // http://www.boost.org/libs/utility/throw_exception.html // #include #include #include #include #if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x593) ) # define BOOST_EXCEPTION_DISABLE #endif #if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1310 ) # define BOOST_EXCEPTION_DISABLE #endif #if !defined( BOOST_EXCEPTION_DISABLE ) # include # include # define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(::boost::enable_error_info(x) <<\ ::boost::throw_function(BOOST_CURRENT_FUNCTION) <<\ ::boost::throw_file(__FILE__) <<\ ::boost::throw_line(__LINE__)) #else # define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x) #endif namespace boost { #ifdef BOOST_NO_EXCEPTIONS void throw_exception( std::exception const & e ); // user defined #else inline void throw_exception_assert_compatibility( std::exception const & ) { } template BOOST_ATTRIBUTE_NORETURN inline void throw_exception( E const & e ) { //All boost exceptions are required to derive from std::exception, //to ensure compatibility with BOOST_NO_EXCEPTIONS. throw_exception_assert_compatibility(e); #ifndef BOOST_EXCEPTION_DISABLE throw enable_current_exception(enable_error_info(e)); #else throw e; #endif } #endif } // namespace boost #endif // #ifndef BOOST_THROW_EXCEPTION_HPP_INCLUDED clucene-core-2.3.3.4/src/ext/boost/version.hpp000066400000000000000000000021441154025176300211450ustar00rootroot00000000000000// Boost version.hpp configuration header file ------------------------------// // (C) Copyright John maddock 1999. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/config for documentation #ifndef BOOST_VERSION_HPP #define BOOST_VERSION_HPP // // Caution, this is the only boost header that is guarenteed // to change with every boost release, including this header // will cause a recompile every time a new boost version is // released. // // BOOST_VERSION % 100 is the patch level // BOOST_VERSION / 100 % 1000 is the minor version // BOOST_VERSION / 100000 is the major version #define BOOST_VERSION 104200 // // BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION // but as a *string* in the form "x_y[_z]" where x is the major version // number, y is the minor version number, and z is the patch level if not 0. // This is used by to select which library version to link to. #define BOOST_LIB_VERSION "1_42" #endif clucene-core-2.3.3.4/src/ext/zlib/000077500000000000000000000000001154025176300165605ustar00rootroot00000000000000clucene-core-2.3.3.4/src/ext/zlib/ChangeLog000077500000000000000000001236601154025176300203450ustar00rootroot00000000000000 ChangeLog file for zlib Changes in 1.2.3 (18 July 2005) - Apply security vulnerability fixes to contrib/infback9 as well - Clean up some text files (carriage returns, trailing space) - Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] Changes in 1.2.2.4 (11 July 2005) - Add inflatePrime() function for starting inflation at bit boundary - Avoid some Visual C warnings in deflate.c - Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit compile - Fix some spelling errors in comments [Betts] - Correct inflateInit2() error return documentation in zlib.h - Added zran.c example of compressed data random access to examples directory, shows use of inflatePrime() - Fix cast for assignments to strm->state in inflate.c and infback.c - Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] - Move declarations of gf2 functions to right place in crc32.c [Oberhumer] - Add cast in trees.c t avoid a warning [Oberhumer] - Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] - Update make_vms.com [Zinser] - Initialize state->write in inflateReset() since copied in inflate_fast() - Be more strict on incomplete code sets in inflate_table() and increase ENOUGH and MAXD -- this repairs a possible security vulnerability for invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for discovering the vulnerability and providing test cases. - Add ia64 support to configure for HP-UX [Smith] - Add error return to gzread() for format or i/o error [Levin] - Use malloc.h for OS/2 [Necasek] Changes in 1.2.2.3 (27 May 2005) - Replace 1U constants in inflate.c and inftrees.c for 64-bit compile - Typecast fread() return values in gzio.c [Vollant] - Remove trailing space in minigzip.c outmode (VC++ can't deal with it) - Fix crc check bug in gzread() after gzungetc() [Heiner] - Add the deflateTune() function to adjust internal compression parameters - Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) - Remove an incorrect assertion in examples/zpipe.c - Add C++ wrapper in infback9.h [Donais] - Fix bug in inflateCopy() when decoding fixed codes - Note in zlib.h how much deflateSetDictionary() actually uses - Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) - Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] - Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] - Add gzdirect() function to indicate transparent reads - Update contrib/minizip [Vollant] - Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] - Add casts in crc32.c to avoid warnings [Oberhumer] - Add contrib/masmx64 [Vollant] - Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] Changes in 1.2.2.2 (30 December 2004) - Replace structure assignments in deflate.c and inflate.c with zmemcpy to avoid implicit memcpy calls (portability for no-library compilation) - Increase sprintf() buffer size in gzdopen() to allow for large numbers - Add INFLATE_STRICT to check distances against zlib header - Improve WinCE errno handling and comments [Chang] - Remove comment about no gzip header processing in FAQ - Add Z_FIXED strategy option to deflateInit2() to force fixed trees - Add updated make_vms.com [Coghlan], update README - Create a new "examples" directory, move gzappend.c there, add zpipe.c, fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. - Add FAQ entry and comments in deflate.c on uninitialized memory access - Add Solaris 9 make options in configure [Gilbert] - Allow strerror() usage in gzio.c for STDC - Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] - Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] - Use z_off_t for adler32_combine() and crc32_combine() lengths - Make adler32() much faster for small len - Use OS_CODE in deflate() default gzip header Changes in 1.2.2.1 (31 October 2004) - Allow inflateSetDictionary() call for raw inflate - Fix inflate header crc check bug for file names and comments - Add deflateSetHeader() and gz_header structure for custom gzip headers - Add inflateGetheader() to retrieve gzip headers - Add crc32_combine() and adler32_combine() functions - Add alloc_func, free_func, in_func, out_func to Z_PREFIX list - Use zstreamp consistently in zlib.h (inflate_back functions) - Remove GUNZIP condition from definition of inflate_mode in inflate.h and in contrib/inflate86/inffast.S [Truta, Anderson] - Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] - Update projects/README.projects and projects/visualc6 [Truta] - Update win32/DLL_FAQ.txt [Truta] - Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] - Deprecate Z_ASCII; use Z_TEXT instead [Truta] - Use a new algorithm for setting strm->data_type in trees.c [Truta] - Do not define an exit() prototype in zutil.c unless DEBUG defined - Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] - Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() - Fix Darwin build version identification [Peterson] Changes in 1.2.2 (3 October 2004) - Update zlib.h comments on gzip in-memory processing - Set adler to 1 in inflateReset() to support Java test suite [Walles] - Add contrib/dotzlib [Ravn] - Update win32/DLL_FAQ.txt [Truta] - Update contrib/minizip [Vollant] - Move contrib/visual-basic.txt to old/ [Truta] - Fix assembler builds in projects/visualc6/ [Truta] Changes in 1.2.1.2 (9 September 2004) - Update INDEX file - Fix trees.c to update strm->data_type (no one ever noticed!) - Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] - Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) - Add limited multitasking protection to DYNAMIC_CRC_TABLE - Add NO_vsnprintf for VMS in zutil.h [Mozilla] - Don't declare strerror() under VMS [Mozilla] - Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize - Update contrib/ada [Anisimkov] - Update contrib/minizip [Vollant] - Fix configure to not hardcode directories for Darwin [Peterson] - Fix gzio.c to not return error on empty files [Brown] - Fix indentation; update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas [Truta] - Update mkasm.bat in contrib/masmx86 [Truta] - Update contrib/untgz [Truta] - Add projects/README.projects [Truta] - Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] - Update win32/DLL_FAQ.txt [Truta] - Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] - Remove an unnecessary assignment to curr in inftrees.c [Truta] - Add OS/2 to exe builds in configure [Poltorak] - Remove err dummy parameter in zlib.h [Kientzle] Changes in 1.2.1.1 (9 January 2004) - Update email address in README - Several FAQ updates - Fix a big fat bug in inftrees.c that prevented decoding valid dynamic blocks with only literals and no distance codes -- Thanks to "Hot Emu" for the bug report and sample file - Add a note to puff.c on no distance codes case. Changes in 1.2.1 (17 November 2003) - Remove a tab in contrib/gzappend/gzappend.c - Update some interfaces in contrib for new zlib functions - Update zlib version number in some contrib entries - Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] - Support shared libraries on Hurd and KFreeBSD [Brown] - Fix error in NO_DIVIDE option of adler32.c Changes in 1.2.0.8 (4 November 2003) - Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas - Add experimental NO_DIVIDE #define in adler32.c - Possibly faster on some processors (let me know if it is) - Correct Z_BLOCK to not return on first inflate call if no wrap - Fix strm->data_type on inflate() return to correctly indicate EOB - Add deflatePrime() function for appending in the middle of a byte - Add contrib/gzappend for an example of appending to a stream - Update win32/DLL_FAQ.txt [Truta] - Delete Turbo C comment in README [Truta] - Improve some indentation in zconf.h [Truta] - Fix infinite loop on bad input in configure script [Church] - Fix gzeof() for concatenated gzip files [Johnson] - Add example to contrib/visual-basic.txt [Michael B.] - Add -p to mkdir's in Makefile.in [vda] - Fix configure to properly detect presence or lack of printf functions - Add AS400 support [Monnerat] - Add a little Cygwin support [Wilson] Changes in 1.2.0.7 (21 September 2003) - Correct some debug formats in contrib/infback9 - Cast a type in a debug statement in trees.c - Change search and replace delimiter in configure from % to # [Beebe] - Update contrib/untgz to 0.2 with various fixes [Truta] - Add build support for Amiga [Nikl] - Remove some directories in old that have been updated to 1.2 - Add dylib building for Mac OS X in configure and Makefile.in - Remove old distribution stuff from Makefile - Update README to point to DLL_FAQ.txt, and add comment on Mac OS X - Update links in README Changes in 1.2.0.6 (13 September 2003) - Minor FAQ updates - Update contrib/minizip to 1.00 [Vollant] - Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] - Update POSTINC comment for 68060 [Nikl] - Add contrib/infback9 with deflate64 decoding (unsupported) - For MVS define NO_vsnprintf and undefine FAR [van Burik] - Add pragma for fdopen on MVS [van Burik] Changes in 1.2.0.5 (8 September 2003) - Add OF to inflateBackEnd() declaration in zlib.h - Remember start when using gzdopen in the middle of a file - Use internal off_t counters in gz* functions to properly handle seeks - Perform more rigorous check for distance-too-far in inffast.c - Add Z_BLOCK flush option to return from inflate at block boundary - Set strm->data_type on return from inflate - Indicate bits unused, if at block boundary, and if in last block - Replace size_t with ptrdiff_t in crc32.c, and check for correct size - Add condition so old NO_DEFLATE define still works for compatibility - FAQ update regarding the Windows DLL [Truta] - INDEX update: add qnx entry, remove aix entry [Truta] - Install zlib.3 into mandir [Wilson] - Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] - Adapt the zlib interface to the new DLL convention guidelines [Truta] - Introduce ZLIB_WINAPI macro to allow the export of functions using the WINAPI calling convention, for Visual Basic [Vollant, Truta] - Update msdos and win32 scripts and makefiles [Truta] - Export symbols by name, not by ordinal, in win32/zlib.def [Truta] - Add contrib/ada [Anisimkov] - Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] - Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] - Add contrib/masm686 [Truta] - Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm [Truta, Vollant] - Update contrib/delphi; rename to contrib/pascal; add example [Truta] - Remove contrib/delphi2; add a new contrib/delphi [Truta] - Avoid inclusion of the nonstandard in contrib/iostream, and fix some method prototypes [Truta] - Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip [Truta] - Avoid the use of backslash (\) in contrib/minizip [Vollant] - Fix file time handling in contrib/untgz; update makefiles [Truta] - Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines [Vollant] - Remove contrib/vstudio/vc15_16 [Vollant] - Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] - Update README.contrib [Truta] - Invert the assignment order of match_head and s->prev[...] in INSERT_STRING [Truta] - Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings [Truta] - Compare function pointers with 0, not with NULL or Z_NULL [Truta] - Fix prototype of syncsearch in inflate.c [Truta] - Introduce ASMINF macro to be enabled when using an ASM implementation of inflate_fast [Truta] - Change NO_DEFLATE to NO_GZCOMPRESS [Truta] - Modify test_gzio in example.c to take a single file name as a parameter [Truta] - Exit the example.c program if gzopen fails [Truta] - Add type casts around strlen in example.c [Truta] - Remove casting to sizeof in minigzip.c; give a proper type to the variable compared with SUFFIX_LEN [Truta] - Update definitions of STDC and STDC99 in zconf.h [Truta] - Synchronize zconf.h with the new Windows DLL interface [Truta] - Use SYS16BIT instead of __32BIT__ to distinguish between 16- and 32-bit platforms [Truta] - Use far memory allocators in small 16-bit memory models for Turbo C [Truta] - Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in zlibCompileFlags [Truta] - Cygwin has vsnprintf [Wilson] - In Windows16, OS_CODE is 0, as in MSDOS [Truta] - In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] Changes in 1.2.0.4 (10 August 2003) - Minor FAQ updates - Be more strict when checking inflateInit2's windowBits parameter - Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well - Add gzip wrapper option to deflateInit2 using windowBits - Add updated QNX rule in configure and qnx directory [Bonnefoy] - Make inflate distance-too-far checks more rigorous - Clean up FAR usage in inflate - Add casting to sizeof() in gzio.c and minigzip.c Changes in 1.2.0.3 (19 July 2003) - Fix silly error in gzungetc() implementation [Vollant] - Update contrib/minizip and contrib/vstudio [Vollant] - Fix printf format in example.c - Correct cdecl support in zconf.in.h [Anisimkov] - Minor FAQ updates Changes in 1.2.0.2 (13 July 2003) - Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons - Attempt to avoid warnings in crc32.c for pointer-int conversion - Add AIX to configure, remove aix directory [Bakker] - Add some casts to minigzip.c - Improve checking after insecure sprintf() or vsprintf() calls - Remove #elif's from crc32.c - Change leave label to inf_leave in inflate.c and infback.c to avoid library conflicts - Remove inflate gzip decoding by default--only enable gzip decoding by special request for stricter backward compatibility - Add zlibCompileFlags() function to return compilation information - More typecasting in deflate.c to avoid warnings - Remove leading underscore from _Capital #defines [Truta] - Fix configure to link shared library when testing - Add some Windows CE target adjustments [Mai] - Remove #define ZLIB_DLL in zconf.h [Vollant] - Add zlib.3 [Rodgers] - Update RFC URL in deflate.c and algorithm.txt [Mai] - Add zlib_dll_FAQ.txt to contrib [Truta] - Add UL to some constants [Truta] - Update minizip and vstudio [Vollant] - Remove vestigial NEED_DUMMY_RETURN from zconf.in.h - Expand use of NO_DUMMY_DECL to avoid all dummy structures - Added iostream3 to contrib [Schwardt] - Replace rewind() with fseek() for WinCE [Truta] - Improve setting of zlib format compression level flags - Report 0 for huffman and rle strategies and for level == 0 or 1 - Report 2 only for level == 6 - Only deal with 64K limit when necessary at compile time [Truta] - Allow TOO_FAR check to be turned off at compile time [Truta] - Add gzclearerr() function [Souza] - Add gzungetc() function Changes in 1.2.0.1 (17 March 2003) - Add Z_RLE strategy for run-length encoding [Truta] - When Z_RLE requested, restrict matches to distance one - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE - Correct FASTEST compilation to allow level == 0 - Clean up what gets compiled for FASTEST - Incorporate changes to zconf.in.h [Vollant] - Refine detection of Turbo C need for dummy returns - Refine ZLIB_DLL compilation - Include additional header file on VMS for off_t typedef - Try to use _vsnprintf where it supplants vsprintf [Vollant] - Add some casts in inffast.c - Enchance comments in zlib.h on what happens if gzprintf() tries to write more than 4095 bytes before compression - Remove unused state from inflateBackEnd() - Remove exit(0) from minigzip.c, example.c - Get rid of all those darn tabs - Add "check" target to Makefile.in that does the same thing as "test" - Add "mostlyclean" and "maintainer-clean" targets to Makefile.in - Update contrib/inflate86 [Anderson] - Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] - Add msdos and win32 directories with makefiles [Truta] - More additions and improvements to the FAQ Changes in 1.2.0 (9 March 2003) - New and improved inflate code - About 20% faster - Does not allocate 32K window unless and until needed - Automatically detects and decompresses gzip streams - Raw inflate no longer needs an extra dummy byte at end - Added inflateBack functions using a callback interface--even faster than inflate, useful for file utilities (gzip, zip) - Added inflateCopy() function to record state for random access on externally generated deflate streams (e.g. in gzip files) - More readable code (I hope) - New and improved crc32() - About 50% faster, thanks to suggestions from Rodney Brown - Add deflateBound() and compressBound() functions - Fix memory leak in deflateInit2() - Permit setting dictionary for raw deflate (for parallel deflate) - Fix const declaration for gzwrite() - Check for some malloc() failures in gzio.c - Fix bug in gzopen() on single-byte file 0x1f - Fix bug in gzread() on concatenated file with 0x1f at end of buffer and next buffer doesn't start with 0x8b - Fix uncompress() to return Z_DATA_ERROR on truncated input - Free memory at end of example.c - Remove MAX #define in trees.c (conflicted with some libraries) - Fix static const's in deflate.c, gzio.c, and zutil.[ch] - Declare malloc() and free() in gzio.c if STDC not defined - Use malloc() instead of calloc() in zutil.c if int big enough - Define STDC for AIX - Add aix/ with approach for compiling shared library on AIX - Add HP-UX support for shared libraries in configure - Add OpenUNIX support for shared libraries in configure - Use $cc instead of gcc to build shared library - Make prefix directory if needed when installing - Correct Macintosh avoidance of typedef Byte in zconf.h - Correct Turbo C memory allocation when under Linux - Use libz.a instead of -lz in Makefile (assure use of compiled library) - Update configure to check for snprintf or vsnprintf functions and their return value, warn during make if using an insecure function - Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that is lost when library is used--resolution is to build new zconf.h - Documentation improvements (in zlib.h): - Document raw deflate and inflate - Update RFCs URL - Point out that zlib and gzip formats are different - Note that Z_BUF_ERROR is not fatal - Document string limit for gzprintf() and possible buffer overflow - Note requirement on avail_out when flushing - Note permitted values of flush parameter of inflate() - Add some FAQs (and even answers) to the FAQ - Add contrib/inflate86/ for x86 faster inflate - Add contrib/blast/ for PKWare Data Compression Library decompression - Add contrib/puff/ simple inflate for deflate format description Changes in 1.1.4 (11 March 2002) - ZFREE was repeated on same allocation on some error conditions. This creates a security problem described in http://www.zlib.org/advisory-2002-03-11.txt - Returned incorrect error (Z_MEM_ERROR) on some invalid data - Avoid accesses before window for invalid distances with inflate window less than 32K. - force windowBits > 8 to avoid a bug in the encoder for a window size of 256 bytes. (A complete fix will be available in 1.1.5). Changes in 1.1.3 (9 July 1998) - fix "an inflate input buffer bug that shows up on rare but persistent occasions" (Mark) - fix gzread and gztell for concatenated .gz files (Didier Le Botlan) - fix gzseek(..., SEEK_SET) in write mode - fix crc check after a gzeek (Frank Faubert) - fix miniunzip when the last entry in a zip file is itself a zip file (J Lillge) - add contrib/asm586 and contrib/asm686 (Brian Raiter) See http://www.muppetlabs.com/~breadbox/software/assembly.html - add support for Delphi 3 in contrib/delphi (Bob Dellaca) - add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) - do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) - use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) - added a FAQ file - Support gzdopen on Mac with Metrowerks (Jason Linhart) - Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) - define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) - avoid some warnings with Borland C (Tom Tanner) - fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) - emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) - allow several arguments to configure (Tim Mooney, Frodo Looijaard) - use libdir and includedir in Makefile.in (Tim Mooney) - support shared libraries on OSF1 V4 (Tim Mooney) - remove so_locations in "make clean" (Tim Mooney) - fix maketree.c compilation error (Glenn, Mark) - Python interface to zlib now in Python 1.5 (Jeremy Hylton) - new Makefile.riscos (Rich Walker) - initialize static descriptors in trees.c for embedded targets (Nick Smith) - use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) - add the OS/2 files in Makefile.in too (Andrew Zabolotny) - fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) - fix maketree.c to allow clean compilation of inffixed.h (Mark) - fix parameter check in deflateCopy (Gunther Nikl) - cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) - Many portability patches by Christian Spieler: . zutil.c, zutil.h: added "const" for zmem* . Make_vms.com: fixed some typos . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists . msdos/Makefile.msc: remove "default rtl link library" info from obj files . msdos/Makefile.*: use model-dependent name for the built zlib library . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) - use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) - replace __far with _far for better portability (Christian Spieler, Tom Lane) - fix test for errno.h in configure (Tim Newsham) Changes in 1.1.2 (19 March 98) - added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) See http://www.winimage.com/zLibDll/unzip.html - preinitialize the inflate tables for fixed codes, to make the code completely thread safe (Mark) - some simplifications and slight speed-up to the inflate code (Mark) - fix gzeof on non-compressed files (Allan Schrum) - add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) - use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) - added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) - add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) - do not wrap extern "C" around system includes (Tom Lane) - mention zlib binding for TCL in README (Andreas Kupries) - added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) - allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) - allow "configure --prefix $HOME" (Tim Mooney) - remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) - move Makefile.sas to amiga/Makefile.sas Changes in 1.1.1 (27 Feb 98) - fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) - remove block truncation heuristic which had very marginal effect for zlib (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the compression ratio on some files. This also allows inlining _tr_tally for matches in deflate_slow. - added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) Changes in 1.1.0 (24 Feb 98) - do not return STREAM_END prematurely in inflate (John Bowler) - revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) - compile with -DFASTEST to get compression code optimized for speed only - in minigzip, try mmap'ing the input file first (Miguel Albrecht) - increase size of I/O buffers in minigzip.c and gzio.c (not a big gain on Sun but significant on HP) - add a pointer to experimental unzip library in README (Gilles Vollant) - initialize variable gcc in configure (Chris Herborth) Changes in 1.0.9 (17 Feb 1998) - added gzputs and gzgets functions - do not clear eof flag in gzseek (Mark Diekhans) - fix gzseek for files in transparent mode (Mark Diekhans) - do not assume that vsprintf returns the number of bytes written (Jens Krinke) - replace EXPORT with ZEXPORT to avoid conflict with other programs - added compress2 in zconf.h, zlib.def, zlib.dnt - new asm code from Gilles Vollant in contrib/asm386 - simplify the inflate code (Mark): . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() . ZALLOC the length list in inflate_trees_fixed() instead of using stack . ZALLOC the value area for huft_build() instead of using stack . Simplify Z_FINISH check in inflate() - Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 - in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) - in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with the declaration of FAR (Gilles VOllant) - install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) - read_buf buf parameter of type Bytef* instead of charf* - zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) - do not redeclare unlink in minigzip.c for WIN32 (John Bowler) - fix check for presence of directories in "make install" (Ian Willis) Changes in 1.0.8 (27 Jan 1998) - fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) - fix gzgetc and gzputc for big endian systems (Markus Oberhumer) - added compress2() to allow setting the compression level - include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) - use constant arrays for the static trees in trees.c instead of computing them at run time (thanks to Ken Raeburn for this suggestion). To create trees.h, compile with GEN_TREES_H and run "make test". - check return code of example in "make test" and display result - pass minigzip command line options to file_compress - simplifying code of inflateSync to avoid gcc 2.8 bug - support CC="gcc -Wall" in configure -s (QingLong) - avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) - fix test for shared library support to avoid compiler warnings - zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) - check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) - do not use fdopen for Metrowerks on Mac (Brad Pettit)) - add checks for gzputc and gzputc in example.c - avoid warnings in gzio.c and deflate.c (Andreas Kleinert) - use const for the CRC table (Ken Raeburn) - fixed "make uninstall" for shared libraries - use Tracev instead of Trace in infblock.c - in example.c use correct compressed length for test_sync - suppress +vnocompatwarnings in configure for HPUX (not always supported) Changes in 1.0.7 (20 Jan 1998) - fix gzseek which was broken in write mode - return error for gzseek to negative absolute position - fix configure for Linux (Chun-Chung Chen) - increase stack space for MSC (Tim Wegner) - get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) - define EXPORTVA for gzprintf (Gilles Vollant) - added man page zlib.3 (Rick Rodgers) - for contrib/untgz, fix makedir() and improve Makefile - check gzseek in write mode in example.c - allocate extra buffer for seeks only if gzseek is actually called - avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) - add inflateSyncPoint in zconf.h - fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def Changes in 1.0.6 (19 Jan 1998) - add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) - Fix a deflate bug occurring only with compression level 0 (thanks to Andy Buckler for finding this one). - In minigzip, pass transparently also the first byte for .Z files. - return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() - check Z_FINISH in inflate (thanks to Marc Schluper) - Implement deflateCopy (thanks to Adam Costello) - make static libraries by default in configure, add --shared option. - move MSDOS or Windows specific files to directory msdos - suppress the notion of partial flush to simplify the interface (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) - suppress history buffer provided by application to simplify the interface (this feature was not implemented anyway in 1.0.4) - next_in and avail_in must be initialized before calling inflateInit or inflateInit2 - add EXPORT in all exported functions (for Windows DLL) - added Makefile.nt (thanks to Stephen Williams) - added the unsupported "contrib" directory: contrib/asm386/ by Gilles Vollant 386 asm code replacing longest_match(). contrib/iostream/ by Kevin Ruland A C++ I/O streams interface to the zlib gz* functions contrib/iostream2/ by Tyge Løvset Another C++ I/O streams interface contrib/untgz/ by "Pedro A. Aranda Guti\irrez" A very simple tar.gz file extractor using zlib contrib/visual-basic.txt by Carlos Rios How to use compress(), uncompress() and the gz* functions from VB. - pass params -f (filtered data), -h (huffman only), -1 to -9 (compression level) in minigzip (thanks to Tom Lane) - use const for rommable constants in deflate - added test for gzseek and gztell in example.c - add undocumented function inflateSyncPoint() (hack for Paul Mackerras) - add undocumented function zError to convert error code to string (for Tim Smithers) - Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. - Use default memcpy for Symantec MSDOS compiler. - Add EXPORT keyword for check_func (needed for Windows DLL) - add current directory to LD_LIBRARY_PATH for "make test" - create also a link for libz.so.1 - added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) - use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) - added -soname for Linux in configure (Chun-Chung Chen, - assign numbers to the exported functions in zlib.def (for Windows DLL) - add advice in zlib.h for best usage of deflateSetDictionary - work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) - allow compilation with ANSI keywords only enabled for TurboC in large model - avoid "versionString"[0] (Borland bug) - add NEED_DUMMY_RETURN for Borland - use variable z_verbose for tracing in debug mode (L. Peter Deutsch). - allow compilation with CC - defined STDC for OS/2 (David Charlap) - limit external names to 8 chars for MVS (Thomas Lund) - in minigzip.c, use static buffers only for 16-bit systems - fix suffix check for "minigzip -d foo.gz" - do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) - use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) - added makelcc.bat for lcc-win32 (Tom St Denis) - in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) - Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. - check for unistd.h in configure (for off_t) - remove useless check parameter in inflate_blocks_free - avoid useless assignment of s->check to itself in inflate_blocks_new - do not flush twice in gzclose (thanks to Ken Raeburn) - rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h - use NO_ERRNO_H instead of enumeration of operating systems with errno.h - work around buggy fclose on pipes for HP/UX - support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) - fix configure if CC is already equal to gcc Changes in 1.0.5 (3 Jan 98) - Fix inflate to terminate gracefully when fed corrupted or invalid data - Use const for rommable constants in inflate - Eliminate memory leaks on error conditions in inflate - Removed some vestigial code in inflate - Update web address in README Changes in 1.0.4 (24 Jul 96) - In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF bit, so the decompressor could decompress all the correct data but went on to attempt decompressing extra garbage data. This affected minigzip too. - zlibVersion and gzerror return const char* (needed for DLL) - port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) - use z_error only for DEBUG (avoid problem with DLLs) Changes in 1.0.3 (2 Jul 96) - use z_streamp instead of z_stream *, which is now a far pointer in MSDOS small and medium models; this makes the library incompatible with previous versions for these models. (No effect in large model or on other systems.) - return OK instead of BUF_ERROR if previous deflate call returned with avail_out as zero but there is nothing to do - added memcmp for non STDC compilers - define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) - define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) - better check for 16-bit mode MSC (avoids problem with Symantec) Changes in 1.0.2 (23 May 96) - added Windows DLL support - added a function zlibVersion (for the DLL support) - fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) - Bytef is define's instead of typedef'd only for Borland C - avoid reading uninitialized memory in example.c - mention in README that the zlib format is now RFC1950 - updated Makefile.dj2 - added algorithm.doc Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] - fix array overlay in deflate.c which sometimes caused bad compressed data - fix inflate bug with empty stored block - fix MSDOS medium model which was broken in 0.99 - fix deflateParams() which could generated bad compressed data. - Bytef is define'd instead of typedef'ed (work around Borland bug) - added an INDEX file - new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) - speed up adler32 for modern machines without auto-increment - added -ansi for IRIX in configure - static_init_done in trees.c is an int - define unlink as delete for VMS - fix configure for QNX - add configure branch for SCO and HPUX - avoid many warnings (unused variables, dead assignments, etc...) - no fdopen for BeOS - fix the Watcom fix for 32 bit mode (define FAR as empty) - removed redefinition of Byte for MKWERKS - work around an MWKERKS bug (incorrect merge of all .h files) Changes in 0.99 (27 Jan 96) - allow preset dictionary shared between compressor and decompressor - allow compression level 0 (no compression) - add deflateParams in zlib.h: allow dynamic change of compression level and compression strategy. - test large buffers and deflateParams in example.c - add optional "configure" to build zlib as a shared library - suppress Makefile.qnx, use configure instead - fixed deflate for 64-bit systems (detected on Cray) - fixed inflate_blocks for 64-bit systems (detected on Alpha) - declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) - always return Z_BUF_ERROR when deflate() has nothing to do - deflateInit and inflateInit are now macros to allow version checking - prefix all global functions and types with z_ with -DZ_PREFIX - make falloc completely reentrant (inftrees.c) - fixed very unlikely race condition in ct_static_init - free in reverse order of allocation to help memory manager - use zlib-1.0/* instead of zlib/* inside the tar.gz - make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion -Wstrict-prototypes -Wmissing-prototypes" - allow gzread on concatenated .gz files - deflateEnd now returns Z_DATA_ERROR if it was premature - deflate is finally (?) fully deterministic (no matches beyond end of input) - Document Z_SYNC_FLUSH - add uninstall in Makefile - Check for __cpluplus in zlib.h - Better test in ct_align for partial flush - avoid harmless warnings for Borland C++ - initialize hash_head in deflate.c - avoid warning on fdopen (gzio.c) for HP cc -Aa - include stdlib.h for STDC compilers - include errno.h for Cray - ignore error if ranlib doesn't exist - call ranlib twice for NeXTSTEP - use exec_prefix instead of prefix for libz.a - renamed ct_* as _tr_* to avoid conflict with applications - clear z->msg in inflateInit2 before any error return - initialize opaque in example.c, gzio.c, deflate.c and inflate.c - fixed typo in zconf.h (_GNUC__ => __GNUC__) - check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) - fix typo in Make_vms.com (f$trnlnm -> f$getsyi) - in fcalloc, normalize pointer if size > 65520 bytes - don't use special fcalloc for 32 bit Borland C++ - use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... - use Z_BINARY instead of BINARY - document that gzclose after gzdopen will close the file - allow "a" as mode in gzopen. - fix error checking in gzread - allow skipping .gz extra-field on pipes - added reference to Perl interface in README - put the crc table in FAR data (I dislike more and more the medium model :) - added get_crc_table - added a dimension to all arrays (Borland C can't count). - workaround Borland C bug in declaration of inflate_codes_new & inflate_fast - guard against multiple inclusion of *.h (for precompiled header on Mac) - Watcom C pretends to be Microsoft C small model even in 32 bit mode. - don't use unsized arrays to avoid silly warnings by Visual C++: warning C4746: 'inflate_mask' : unsized array treated as '__far' (what's wrong with far data in far model?). - define enum out of inflate_blocks_state to allow compilation with C++ Changes in 0.95 (16 Aug 95) - fix MSDOS small and medium model (now easier to adapt to any compiler) - inlined send_bits - fix the final (:-) bug for deflate with flush (output was correct but not completely flushed in rare occasions). - default window size is same for compression and decompression (it's now sufficient to set MAX_WBITS in zconf.h). - voidp -> voidpf and voidnp -> voidp (for consistency with other typedefs and because voidnp was not near in large model). Changes in 0.94 (13 Aug 95) - support MSDOS medium model - fix deflate with flush (could sometimes generate bad output) - fix deflateReset (zlib header was incorrectly suppressed) - added support for VMS - allow a compression level in gzopen() - gzflush now calls fflush - For deflate with flush, flush even if no more input is provided. - rename libgz.a as libz.a - avoid complex expression in infcodes.c triggering Turbo C bug - work around a problem with gcc on Alpha (in INSERT_STRING) - don't use inline functions (problem with some gcc versions) - allow renaming of Byte, uInt, etc... with #define. - avoid warning about (unused) pointer before start of array in deflate.c - avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c - avoid reserved word 'new' in trees.c Changes in 0.93 (25 June 95) - temporarily disable inline functions - make deflate deterministic - give enough lookahead for PARTIAL_FLUSH - Set binary mode for stdin/stdout in minigzip.c for OS/2 - don't even use signed char in inflate (not portable enough) - fix inflate memory leak for segmented architectures Changes in 0.92 (3 May 95) - don't assume that char is signed (problem on SGI) - Clear bit buffer when starting a stored block - no memcpy on Pyramid - suppressed inftest.c - optimized fill_window, put longest_match inline for gcc - optimized inflate on stored blocks. - untabify all sources to simplify patches Changes in 0.91 (2 May 95) - Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h - Document the memory requirements in zconf.h - added "make install" - fix sync search logic in inflateSync - deflate(Z_FULL_FLUSH) now works even if output buffer too short - after inflateSync, don't scare people with just "lo world" - added support for DJGPP Changes in 0.9 (1 May 95) - don't assume that zalloc clears the allocated memory (the TurboC bug was Mark's bug after all :) - let again gzread copy uncompressed data unchanged (was working in 0.71) - deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented - added a test of inflateSync in example.c - moved MAX_WBITS to zconf.h because users might want to change that. - document explicitly that zalloc(64K) on MSDOS must return a normalized pointer (zero offset) - added Makefiles for Microsoft C, Turbo C, Borland C++ - faster crc32() Changes in 0.8 (29 April 95) - added fast inflate (inffast.c) - deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this is incompatible with previous versions of zlib which returned Z_OK. - work around a TurboC compiler bug (bad code for b << 0, see infutil.h) (actually that was not a compiler bug, see 0.81 above) - gzread no longer reads one extra byte in certain cases - In gzio destroy(), don't reference a freed structure - avoid many warnings for MSDOS - avoid the ERROR symbol which is used by MS Windows Changes in 0.71 (14 April 95) - Fixed more MSDOS compilation problems :( There is still a bug with TurboC large model. Changes in 0.7 (14 April 95) - Added full inflate support. - Simplified the crc32() interface. The pre- and post-conditioning (one's complement) is now done inside crc32(). WARNING: this is incompatible with previous versions; see zlib.h for the new usage. Changes in 0.61 (12 April 95) - workaround for a bug in TurboC. example and minigzip now work on MSDOS. Changes in 0.6 (11 April 95) - added minigzip.c - added gzdopen to reopen a file descriptor as gzFile - added transparent reading of non-gziped files in gzread. - fixed bug in gzread (don't read crc as data) - fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). - don't allocate big arrays in the stack (for MSDOS) - fix some MSDOS compilation problems Changes in 0.5: - do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but not yet Z_FULL_FLUSH. - support decompression but only in a single step (forced Z_FINISH) - added opaque object for zalloc and zfree. - added deflateReset and inflateReset - added a variable zlib_version for consistency checking. - renamed the 'filter' parameter of deflateInit2 as 'strategy'. Added Z_FILTERED and Z_HUFFMAN_ONLY constants. Changes in 0.4: - avoid "zip" everywhere, use zlib instead of ziplib. - suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush if compression method == 8. - added adler32 and crc32 - renamed deflateOptions as deflateInit2, call one or the other but not both - added the method parameter for deflateInit2. - added inflateInit2 - simplied considerably deflateInit and inflateInit by not supporting user-provided history buffer. This is supported only in deflateInit2 and inflateInit2. Changes in 0.3: - prefix all macro names with Z_ - use Z_FINISH instead of deflateEnd to finish compression. - added Z_HUFFMAN_ONLY - added gzerror() clucene-core-2.3.3.4/src/ext/zlib/FAQ000077500000000000000000000353501154025176300171230ustar00rootroot00000000000000 Frequently Asked Questions about zlib If your question is not there, please check the zlib home page http://www.zlib.org which may have more recent information. The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 1. Is zlib Y2K-compliant? Yes. zlib doesn't handle dates. 2. Where can I get a Windows DLL version? The zlib sources can be compiled without change to produce a DLL. See the file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the precompiled DLL are found in the zlib web site at http://www.zlib.org. 3. Where can I get a Visual Basic interface to zlib? See * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm * contrib/visual-basic.txt in the zlib distribution * win32/DLL_FAQ.txt in the zlib distribution 4. compress() returns Z_BUF_ERROR. Make sure that before the call of compress, the length of the compressed buffer is equal to the total size of the compressed buffer and not zero. For Visual Basic, check that this parameter is passed by reference ("as any"), not by value ("as long"). 5. deflate() or inflate() returns Z_BUF_ERROR. Before making the call, make sure that avail_in and avail_out are not zero. When setting the parameter flush equal to Z_FINISH, also make sure that avail_out is big enough to allow processing all pending input. Note that a Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be made with more input or output space. A Z_BUF_ERROR may in fact be unavoidable depending on how the functions are used, since it is not possible to tell whether or not there is more output pending when strm.avail_out returns with zero. 6. Where's the zlib documentation (man pages, etc.)? It's in zlib.h for the moment, and Francis S. Lin has converted it to a web page zlib.html. Volunteers to transform this to Unix-style man pages, please contact us (zlib@gzip.org). Examples of zlib usage are in the files example.c and minigzip.c. 7. Why don't you use GNU autoconf or libtool or ...? Because we would like to keep zlib as a very small and simple package. zlib is rather portable and doesn't need much configuration. 8. I found a bug in zlib. Most of the time, such problems are due to an incorrect usage of zlib. Please try to reproduce the problem with a small program and send the corresponding source to us at zlib@gzip.org . Do not send multi-megabyte data files without prior agreement. 9. Why do I get "undefined reference to gzputc"? If "make test" produces something like example.o(.text+0x154): undefined reference to `gzputc' check that you don't have old files libz.* in /usr/lib, /usr/local/lib or /usr/X11R6/lib. Remove any old versions, then do "make install". 10. I need a Delphi interface to zlib. See the contrib/delphi directory in the zlib distribution. 11. Can zlib handle .zip archives? Not by itself, no. See the directory contrib/minizip in the zlib distribution. 12. Can zlib handle .Z files? No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt the code of uncompress on your own. 13. How can I make a Unix shared library? make clean ./configure -s make 14. How do I install a shared zlib library on Unix? After the above, then: make install However, many flavors of Unix come with a shared zlib already installed. Before going to the trouble of compiling a shared version of zlib and trying to install it, you may want to check if it's already there! If you can #include , it's there. The -lz option will probably link to it. 15. I have a question about OttoPDF. We are not the authors of OttoPDF. The real author is on the OttoPDF web site: Joel Hainley, jhainley@myndkryme.com. 16. Can zlib decode Flate data in an Adobe PDF file? Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ . To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ . 17. Why am I getting this "register_frame_info not found" error on Solaris? After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib generates an error such as: ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: symbol __register_frame_info: referenced symbol not found The symbol __register_frame_info is not part of zlib, it is generated by the C compiler (cc or gcc). You must recompile applications using zlib which have this problem. This problem is specific to Solaris. See http://www.sunfreeware.com for Solaris versions of zlib and applications using zlib. 18. Why does gzip give an error on a file I make with compress/deflate? The compress and deflate functions produce data in the zlib format, which is different and incompatible with the gzip format. The gz* functions in zlib on the other hand use the gzip format. Both the zlib and gzip formats use the same compressed data format internally, but have different headers and trailers around the compressed data. 19. Ok, so why are there two different formats? The gzip format was designed to retain the directory information about a single file, such as the name and last modification date. The zlib format on the other hand was designed for in-memory and communication channel applications, and has a much more compact header and trailer and uses a faster integrity check than gzip. 20. Well that's nice, but how do I make a gzip file in memory? You can request that deflate write the gzip format instead of the zlib format using deflateInit2(). You can also request that inflate decode the gzip format using inflateInit2(). Read zlib.h for more details. 21. Is zlib thread-safe? Yes. However any library routines that zlib uses and any application- provided memory allocation routines must also be thread-safe. zlib's gz* functions use stdio library routines, and most of zlib's functions use the library memory allocation routines by default. zlib's Init functions allow for the application to provide custom memory allocation routines. Of course, you should only operate on any given zlib or gzip stream from a single thread at a time. 22. Can I use zlib in my commercial application? Yes. Please read the license in zlib.h. 23. Is zlib under the GNU license? No. Please read the license in zlib.h. 24. The license says that altered source versions must be "plainly marked". So what exactly do I need to do to meet that requirement? You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In particular, the final version number needs to be changed to "f", and an identification string should be appended to ZLIB_VERSION. Version numbers x.x.x.f are reserved for modifications to zlib by others than the zlib maintainers. For example, if the version of the base zlib you are altering is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also update the version strings in deflate.c and inftrees.c. For altered source distributions, you should also note the origin and nature of the changes in zlib.h, as well as in ChangeLog and README, along with the dates of the alterations. The origin should include at least your name (or your company's name), and an email address to contact for help or issues with the library. Note that distributing a compiled zlib library along with zlib.h and zconf.h is also a source distribution, and so you should change ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes in zlib.h as you would for a full source distribution. 25. Will zlib work on a big-endian or little-endian architecture, and can I exchange compressed data between them? Yes and yes. 26. Will zlib work on a 64-bit machine? It should. It has been tested on 64-bit machines, and has no dependence on any data types being limited to 32-bits in length. If you have any difficulties, please provide a complete problem report to zlib@gzip.org 27. Will zlib decompress data from the PKWare Data Compression Library? No. The PKWare DCL uses a completely different compressed data format than does PKZIP and zlib. However, you can look in zlib's contrib/blast directory for a possible solution to your problem. 28. Can I access data randomly in a compressed stream? No, not without some preparation. If when compressing you periodically use Z_FULL_FLUSH, carefully write all the pending data at those points, and keep an index of those locations, then you can start decompression at those points. You have to be careful to not use Z_FULL_FLUSH too often, since it can significantly degrade compression. 29. Does zlib work on MVS, OS/390, CICS, etc.? We don't know for sure. We have heard occasional reports of success on these systems. If you do use it on one of these, please provide us with a report, instructions, and patches that we can reference when we get these questions. Thanks. 30. Is there some simpler, easier to read version of inflate I can look at to understand the deflate format? First off, you should read RFC 1951. Second, yes. Look in zlib's contrib/puff directory. 31. Does zlib infringe on any patents? As far as we know, no. In fact, that was originally the whole point behind zlib. Look here for some more information: http://www.gzip.org/#faq11 32. Can zlib work with greater than 4 GB of data? Yes. inflate() and deflate() will process any amount of data correctly. Each call of inflate() or deflate() is limited to input and output chunks of the maximum value that can be stored in the compiler's "unsigned int" type, but there is no limit to the number of chunks. Note however that the strm.total_in and strm_total_out counters may be limited to 4 GB. These counters are provided as a convenience and are not used internally by inflate() or deflate(). The application can easily set up its own counters updated after each call of inflate() or deflate() to count beyond 4 GB. compress() and uncompress() may be limited to 4 GB, since they operate in a single call. gzseek() and gztell() may be limited to 4 GB depending on how zlib is compiled. See the zlibCompileFlags() function in zlib.h. The word "may" appears several times above since there is a 4 GB limit only if the compiler's "long" type is 32 bits. If the compiler's "long" type is 64 bits, then the limit is 16 exabytes. 33. Does zlib have any security vulnerabilities? The only one that we are aware of is potentially in gzprintf(). If zlib is compiled to use sprintf() or vsprintf(), then there is no protection against a buffer overflow of a 4K string space, other than the caller of gzprintf() assuring that the output will not exceed 4K. On the other hand, if zlib is compiled to use snprintf() or vsnprintf(), which should normally be the case, then there is no vulnerability. The ./configure script will display warnings if an insecure variation of sprintf() will be used by gzprintf(). Also the zlibCompileFlags() function will return information on what variant of sprintf() is used by gzprintf(). If you don't have snprintf() or vsnprintf() and would like one, you can find a portable implementation here: http://www.ijs.si/software/snprintf/ Note that you should be using the most recent version of zlib. Versions 1.1.3 and before were subject to a double-free vulnerability. 34. Is there a Java version of zlib? Probably what you want is to use zlib in Java. zlib is already included as part of the Java SDK in the java.util.zip package. If you really want a version of zlib written in the Java language, look on the zlib home page for links: http://www.zlib.org/ 35. I get this or that compiler or source-code scanner warning when I crank it up to maximally-pedantic. Can't you guys write proper code? Many years ago, we gave up attempting to avoid warnings on every compiler in the universe. It just got to be a waste of time, and some compilers were downright silly. So now, we simply make sure that the code always works. 36. Valgrind (or some similar memory access checker) says that deflate is performing a conditional jump that depends on an uninitialized value. Isn't that a bug? No. That is intentional for performance reasons, and the output of deflate is not affected. This only started showing up recently since zlib 1.2.x uses malloc() by default for allocations, whereas earlier versions used calloc(), which zeros out the allocated memory. 37. Will zlib read the (insert any ancient or arcane format here) compressed data format? Probably not. Look in the comp.compression FAQ for pointers to various formats and associated software. 38. How can I encrypt/decrypt zip files with zlib? zlib doesn't support encryption. The original PKZIP encryption is very weak and can be broken with freely available programs. To get strong encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib compression. For PKZIP compatible "encryption", look at http://www.info-zip.org/ 39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? "gzip" is the gzip format, and "deflate" is the zlib format. They should probably have called the second one "zlib" instead to avoid confusion with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate specficiation in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to an unfortunate choice of name on the part of the HTTP 1.1 authors. Bottom line: use the gzip format for HTTP 1.1 encoding. 40. Does zlib support the new "Deflate64" format introduced by PKWare? No. PKWare has apparently decided to keep that format proprietary, since they have not documented it as they have previous compression formats. In any case, the compression improvements are so modest compared to other more modern approaches, that it's not worth the effort to implement. 41. Can you please sign these lengthy legal documents and fax them back to us so that we can use your software in our product? No. Go away. Shoo. clucene-core-2.3.3.4/src/ext/zlib/INDEX000077500000000000000000000024461154025176300173630ustar00rootroot00000000000000ChangeLog history of changes FAQ Frequently Asked Questions about zlib INDEX this file Makefile makefile for Unix (generated by configure) Makefile.in makefile for Unix (template for configure) README guess what algorithm.txt description of the (de)compression algorithm configure configure script for Unix zconf.in.h template for zconf.h (used by configure) amiga/ makefiles for Amiga SAS C as400/ makefiles for IBM AS/400 msdos/ makefiles for MSDOS old/ makefiles for various architectures and zlib documentation files that have not yet been updated for zlib 1.2.x projects/ projects for various Integrated Development Environments qnx/ makefiles for QNX win32/ makefiles for Windows zlib public header files (must be kept): zconf.h zlib.h private source files used to build the zlib library: adler32.c compress.c crc32.c crc32.h deflate.c deflate.h gzio.c infback.c inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h trees.c trees.h uncompr.c zutil.c zutil.h source files for sample programs: example.c minigzip.c unsupported contribution by third parties See contrib/README.contrib clucene-core-2.3.3.4/src/ext/zlib/README000077500000000000000000000131001154025176300174360ustar00rootroot00000000000000ZLIB DATA COMPRESSION LIBRARY zlib 1.2.3 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). These documents are also available in other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example of the library is given in the file example.c which also tests that the library is working correctly. Another example is given in the file minigzip.c. The compression library itself is composed of all source files except example.c and minigzip.c. To compile all files and run the test program, follow the instructions given at the top of Makefile. In short "make test; make install" should work for most machines. For Unix: "./configure; make test; make install". For MSDOS, use one of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. The zlib home page is http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available in http://dogma.net/markn/articles/zlibtool/zlibtool.htm The changes made in version 1.2.3 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory "contrib". A Java implementation of zlib is available in the Java Development Kit http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html See the zlib home page http://www.zlib.org for details. A Perl interface to zlib written by Paul Marquess is in the CPAN (Comprehensive Perl Archive Network) sites http://www.cpan.org/modules/by-module/Compress/ A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see http://www.python.org/doc/lib/module-zlib.html A zlib binding for TCL written by Andreas Kupries is availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant , is available in the contrib/minizip directory of zlib. Notes for some targets: - For Windows DLL versions, please see win32/DLL_FAQ.txt - For 64-bit Irix, deflate.c must be compiled without any optimization. With -O, one libpng test fails. The test works in 32 bit mode (with the -n32 compiler flag). The compiler bug has been reported to SGI. - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. - On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. - gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - For PalmOs, see http://palmzlib.sourceforge.net/ - When building a shared, i.e. dynamic library on Mac OS X, the library must be installed before testing (do "make install" before "make test"), since the library location is specified in the library. Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2004 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions. clucene-core-2.3.3.4/src/ext/zlib/adler32.c000077500000000000000000000107171154025176300201710ustar00rootroot00000000000000/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" #define BASE 65521UL /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); /* use NO_DIVIDE if your processor does not do division in hardware */ #ifdef NO_DIVIDE # define MOD(a) \ do { \ if (a >= (BASE << 16)) a -= (BASE << 16); \ if (a >= (BASE << 15)) a -= (BASE << 15); \ if (a >= (BASE << 14)) a -= (BASE << 14); \ if (a >= (BASE << 13)) a -= (BASE << 13); \ if (a >= (BASE << 12)) a -= (BASE << 12); \ if (a >= (BASE << 11)) a -= (BASE << 11); \ if (a >= (BASE << 10)) a -= (BASE << 10); \ if (a >= (BASE << 9)) a -= (BASE << 9); \ if (a >= (BASE << 8)) a -= (BASE << 8); \ if (a >= (BASE << 7)) a -= (BASE << 7); \ if (a >= (BASE << 6)) a -= (BASE << 6); \ if (a >= (BASE << 5)) a -= (BASE << 5); \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) # define MOD4(a) \ do { \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE # define MOD4(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long sum2; unsigned n; /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; if (adler >= BASE) adler -= BASE; sum2 += adler; if (sum2 >= BASE) sum2 -= BASE; return adler | (sum2 << 16); } /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { adler += *buf++; sum2 += adler; } if (adler >= BASE) adler -= BASE; MOD4(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); MOD(adler); MOD(sum2); } /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { len -= 16; DO16(buf); buf += 16; } while (len--) { adler += *buf++; sum2 += adler; } MOD(adler); MOD(sum2); } /* return recombined sums */ return adler | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32_combine(adler1, adler2, len2) uLong adler1; uLong adler2; z_off_t len2; { unsigned long sum1; unsigned long sum2; unsigned rem; /* the derivation of this formula is left as an exercise for the reader */ rem = (unsigned)(len2 % BASE); sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 > BASE) sum1 -= BASE; if (sum1 > BASE) sum1 -= BASE; if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); if (sum2 > BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } clucene-core-2.3.3.4/src/ext/zlib/algorithm.txt000077500000000000000000000221701154025176300213140ustar00rootroot000000000000001. Compression algorithm (deflate) The deflation algorithm used by gzip (also zip and zlib) is a variation of LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in the input data. The second occurrence of a string is replaced by a pointer to the previous string, in the form of a pair (distance, length). Distances are limited to 32K bytes, and lengths are limited to 258 bytes. When a string does not occur anywhere in the previous 32K bytes, it is emitted as a sequence of literal bytes. (In this description, `string' must be taken as an arbitrary sequence of bytes, and is not restricted to printable characters.) Literals or match lengths are compressed with one Huffman tree, and match distances are compressed with another tree. The trees are stored in a compact form at the start of each block. The blocks can have any size (except that the compressed data for one block must fit in available memory). A block is terminated when deflate() determines that it would be useful to start another block with fresh trees. (This is somewhat similar to the behavior of LZW-based _compress_.) Duplicated strings are found using a hash table. All input strings of length 3 are inserted in the hash table. A hash index is computed for the next 3 bytes. If the hash chain for this index is not empty, all strings in the chain are compared with the current input string, and the longest match is selected. The hash chains are searched starting with the most recent strings, to favor small distances and thus take advantage of the Huffman encoding. The hash chains are singly linked. There are no deletions from the hash chains, the algorithm simply discards matches that are too old. To avoid a worst-case situation, very long hash chains are arbitrarily truncated at a certain length, determined by a runtime option (level parameter of deflateInit). So deflate() does not always find the longest possible match but generally finds a match which is long enough. deflate() also defers the selection of matches with a lazy evaluation mechanism. After a match of length N has been found, deflate() searches for a longer match at the next input byte. If a longer match is found, the previous match is truncated to a length of one (thus producing a single literal byte) and the process of lazy evaluation begins again. Otherwise, the original match is kept, and the next match search is attempted only N steps later. The lazy match evaluation is also subject to a runtime parameter. If the current match is long enough, deflate() reduces the search for a longer match, thus speeding up the whole process. If compression ratio is more important than speed, deflate() attempts a complete second search even if the first match is already long enough. The lazy match evaluation is not performed for the fastest compression modes (level parameter 1 to 3). For these fast modes, new strings are inserted in the hash table only when no match was found, or when the match is not too long. This degrades the compression ratio but saves time since there are both fewer insertions and fewer searches. 2. Decompression algorithm (inflate) 2.1 Introduction The key question is how to represent a Huffman code (or any prefix code) so that you can decode fast. The most important characteristic is that shorter codes are much more common than longer codes, so pay attention to decoding the short codes fast, and let the long codes take longer to decode. inflate() sets up a first level table that covers some number of bits of input less than the length of longest code. It gets that many bits from the stream, and looks it up in the table. The table will tell if the next code is that many bits or less and how many, and if it is, it will tell the value, else it will point to the next level table for which inflate() grabs more bits and tries to decode a longer code. How many bits to make the first lookup is a tradeoff between the time it takes to decode and the time it takes to build the table. If building the table took no time (and if you had infinite memory), then there would only be a first level table to cover all the way to the longest code. However, building the table ends up taking a lot longer for more bits since short codes are replicated many times in such a table. What inflate() does is simply to make the number of bits in the first table a variable, and then to set that variable for the maximum speed. For inflate, which has 286 possible codes for the literal/length tree, the size of the first table is nine bits. Also the distance trees have 30 possible values, and the size of the first table is six bits. Note that for each of those cases, the table ended up one bit longer than the ``average'' code length, i.e. the code length of an approximately flat code which would be a little more than eight bits for 286 symbols and a little less than five bits for 30 symbols. 2.2 More details on the inflate table lookup Ok, you want to know what this cleverly obfuscated inflate tree actually looks like. You are correct that it's not a Huffman tree. It is simply a lookup table for the first, let's say, nine bits of a Huffman symbol. The symbol could be as short as one bit or as long as 15 bits. If a particular symbol is shorter than nine bits, then that symbol's translation is duplicated in all those entries that start with that symbol's bits. For example, if the symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a symbol is nine bits long, it appears in the table once. If the symbol is longer than nine bits, then that entry in the table points to another similar table for the remaining bits. Again, there are duplicated entries as needed. The idea is that most of the time the symbol will be short and there will only be one table look up. (That's whole idea behind data compression in the first place.) For the less frequent long symbols, there will be two lookups. If you had a compression method with really long symbols, you could have as many levels of lookups as is efficient. For inflate, two is enough. So a table entry either points to another table (in which case nine bits in the above example are gobbled), or it contains the translation for the symbol and the number of bits to gobble. Then you start again with the next ungobbled bit. You may wonder: why not just have one lookup table for how ever many bits the longest symbol is? The reason is that if you do that, you end up spending more time filling in duplicate symbol entries than you do actually decoding. At least for deflate's output that generates new trees every several 10's of kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code would take too long if you're only decoding several thousand symbols. At the other extreme, you could make a new table for every bit in the code. In fact, that's essentially a Huffman tree. But then you spend two much time traversing the tree while decoding, even for short symbols. So the number of bits for the first lookup table is a trade of the time to fill out the table vs. the time spent looking at the second level and above of the table. Here is an example, scaled down: The code being decoded, with 10 symbols, from 1 to 6 bits long: A: 0 B: 10 C: 1100 D: 11010 E: 11011 F: 11100 G: 11101 H: 11110 I: 111110 J: 111111 Let's make the first table three bits long (eight entries): 000: A,1 001: A,1 010: A,1 011: A,1 100: B,2 101: B,2 110: -> table X (gobble 3 bits) 111: -> table Y (gobble 3 bits) Each entry is what the bits decode as and how many bits that is, i.e. how many bits to gobble. Or the entry points to another table, with the number of bits to gobble implicit in the size of the table. Table X is two bits long since the longest code starting with 110 is five bits long: 00: C,1 01: C,1 10: D,2 11: E,2 Table Y is three bits long since the longest code starting with 111 is six bits long: 000: F,2 001: F,2 010: G,2 011: G,2 100: H,2 101: H,2 110: I,3 111: J,3 So what we have here are three tables with a total of 20 entries that had to be constructed. That's compared to 64 entries for a single table. Or compared to 16 entries for a Huffman tree (six two entry tables and one four entry table). Assuming that the code ideally represents the probability of the symbols, it takes on the average 1.25 lookups per symbol. That's compared to one lookup for the single table, or 1.66 lookups per symbol for the Huffman tree. There, I think that gives you a picture of what's going on. For inflate, the meaning of a particular symbol is often more than just a letter. It can be a byte (a "literal"), or it can be either a length or a distance which indicates a base value and a number of bits to fetch after the code that is added to the base value. Or it might be the special end-of-block code. The data structures created in inftrees.c try to encode all that information compactly in the tables. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu References: [LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, pp. 337-343. ``DEFLATE Compressed Data Format Specification'' available in http://www.ietf.org/rfc/rfc1951.txt clucene-core-2.3.3.4/src/ext/zlib/compress.c000077500000000000000000000046711154025176300205720ustar00rootroot00000000000000/* compress.c -- compress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; } clucene-core-2.3.3.4/src/ext/zlib/crc32.c000077500000000000000000000316111154025176300176450ustar00rootroot00000000000000/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results in about a * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #define local static /* Find a four-byte integer type for crc32_little() and crc32_big(). */ #ifndef NOBYFOUR # ifdef STDC /* need ANSI C limits.h to determine sizes */ # include # define BYFOUR # if (UINT_MAX == 0xffffffffUL) typedef unsigned int u4; # else # if (ULONG_MAX == 0xffffffffUL) typedef unsigned long u4; # else # if (USHRT_MAX == 0xffffffffUL) typedef unsigned short u4; # else # undef BYFOUR /* can't find a four-byte integer type! */ # endif # endif # endif # endif /* STDC */ #endif /* !NOBYFOUR */ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ /* Local functions for crc concatenation */ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; local unsigned long FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const unsigned long FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { unsigned long c; int n, k; unsigned long poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* See if another task is already doing this (not thread-safe, but better than nothing -- significantly reduces duration of vulnerability in case the advice about DYNAMIC_CRC_TABLE is ignored) */ if (first) { first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0UL; for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) poly |= 1UL << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (unsigned long)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = REV(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = REV(c); } } #endif /* BYFOUR */ crc_table_empty = 0; } else { /* not first */ /* wait for the other guy to finish (not efficient, but rare) */ while (crc_table_empty) ; } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const unsigned long FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const unsigned long FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const unsigned long FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const unsigned long FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { u4 endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = (u4)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const u4 FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = REV((u4)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const u4 FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(REV(c)); } #endif /* BYFOUR */ #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ /* ========================================================================= */ local unsigned long gf2_matrix_times(mat, vec) unsigned long *mat; unsigned long vec; { unsigned long sum; sum = 0; while (vec) { if (vec & 1) sum ^= *mat; vec >>= 1; mat++; } return sum; } /* ========================================================================= */ local void gf2_matrix_square(square, mat) unsigned long *square; unsigned long *mat; { int n; for (n = 0; n < GF2_DIM; n++) square[n] = gf2_matrix_times(mat, mat[n]); } /* ========================================================================= */ uLong ZEXPORT crc32_combine(crc1, crc2, len2) uLong crc1; uLong crc2; z_off_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ /* degenerate case */ if (len2 == 0) return crc1; /* put operator for one zero bit in odd */ odd[0] = 0xedb88320L; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; row <<= 1; } /* put operator for two zero bits in even */ gf2_matrix_square(even, odd); /* put operator for four zero bits in odd */ gf2_matrix_square(odd, even); /* apply len2 zeros to crc1 (first square will put the operator for one zero byte, eight zero bits, in even) */ do { /* apply zeros operator for this bit of len2 */ gf2_matrix_square(even, odd); if (len2 & 1) crc1 = gf2_matrix_times(even, crc1); len2 >>= 1; /* if no more bits set, then done */ if (len2 == 0) break; /* another iteration of the loop with odd and even swapped */ gf2_matrix_square(odd, even); if (len2 & 1) crc1 = gf2_matrix_times(odd, crc1); len2 >>= 1; /* if no more bits set, then done */ } while (len2 != 0); /* return combined crc */ crc1 ^= crc2; return crc1; } clucene-core-2.3.3.4/src/ext/zlib/crc32.h000077500000000000000000000735501154025176300176620ustar00rootroot00000000000000/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const unsigned long FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; clucene-core-2.3.3.4/src/ext/zlib/deflate.c000077500000000000000000001752431154025176300203470ustar00rootroot00000000000000/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #endif local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); dictionary += dictLength - length; /* use the tail of the dictionary */ } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; strm->state->bi_valid = bits; strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= */ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) z_streamp strm; int good_length; int max_lazy; int nice_length; int max_chain; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; s->good_match = good_length; s->max_lazy_match = max_lazy; s->nice_match = nice_length; s->max_chain_length = max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds * for every combination of windowBits and memLevel, as well as wrap. * But even the conservative upper bound of about 14% expansion does not * seem onerous for output buffer allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong destLen; /* conservative upper bound */ destLen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; /* if can't get parameters, return conservative bound */ if (strm == Z_NULL || strm->state == Z_NULL) return destLen; /* if not default parameters, return conservative bound */ s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) return destLen; /* default settings: return tight bound for that case */ return compressBound(sourceLen); } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } #ifdef GZIP if (s->status == EXTRA_STATE) { if (s->gzhead->extra != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) break; } put_byte(s, s->gzhead->extra[s->gzindex]); s->gzindex++; } if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (s->gzindex == s->gzhead->extra_len) { s->gzindex = 0; s->status = NAME_STATE; } } else s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) { s->gzindex = 0; s->status = COMMENT_STATE; } } else s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) s->status = HCRC_STATE; } else s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) flush_pending(strm); if (s->pending + 2 <= s->pending_buf_size) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); s->status = BUSY_STATE; } } else s->status = BUSY_STATE; } #endif /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != EXTRA_STATE && status != NAME_STATE && status != COMMENT_STATE && status != HCRC_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy(dest, source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; zmemcpy(ds, ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #endif /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 or strategy == Z_RLE only */ local uInt longest_match_fast(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ #ifdef FASTEST if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { s->match_length = longest_match_fast (s, hash_head); } #else if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } #endif /* longest_match() or longest_match_fast() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } /* longest_match() or longest_match_fast() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* FASTEST */ #if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt run; /* length of run */ uInt max; /* maximum length of run */ uInt prev; /* byte at distance one to match */ Bytef *scan; /* scan for end of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the longest encodable run. */ if (s->lookahead < MAX_MATCH) { fill_window(s); if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ run = 0; if (s->strstart > 0) { /* if there is a previous byte, that is */ max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; scan = s->window + s->strstart - 1; prev = *scan++; do { if (*scan++ != prev) break; } while (++run < max); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (run >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, run); _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); s->lookahead -= run; s->strstart += run; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif clucene-core-2.3.3.4/src/ext/zlib/deflate.h000077500000000000000000000275221154025176300203500ustar00rootroot00000000000000/* deflate.h -- internal compression state * Copyright (C) 1995-2004 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 #define COMMENT_STATE 91 #define HCRC_STATE 103 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ uInt pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ int last_eob_len; /* bit length of EOB code for last block */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ /* in trees.c */ void _tr_init OF((deflate_state *s)); int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); void _tr_align OF((deflate_state *s)); void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch _length_code[]; extern uch _dist_code[]; #else extern const uch _length_code[]; extern const uch _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ clucene-core-2.3.3.4/src/ext/zlib/gzio.c000077500000000000000000000745771154025176300177230ustar00rootroot00000000000000/* gzio.c -- IO on .gz files * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. */ /* @(#) $Id$ */ #include #include "zutil.h" #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef Z_BUFSIZE # ifdef MAXSEG_64K # define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ # else # define Z_BUFSIZE 16384 # endif #endif #ifndef Z_PRINTF_BUFSIZE # define Z_PRINTF_BUFSIZE 4096 #endif #ifdef __MVS__ # pragma map (fdopen , "\174\174FDOPEN") FILE *fdopen(int, const char *); #endif #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif #define ALLOC(size) malloc(size) #define TRYFREE(p) {if (p) free(p);} static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ typedef struct gz_stream { z_stream stream; int z_err; /* error code for last stream operation */ int z_eof; /* set if end of input file */ FILE *file; /* .gz file */ Byte *inbuf; /* input buffer */ Byte *outbuf; /* output buffer */ uLong crc; /* crc32 of uncompressed data */ char *msg; /* error message */ char *path; /* path name for debugging only */ int transparent; /* 1 if input file is not a .gz file */ char mode; /* 'w' or 'r' */ z_off_t start; /* start of compressed data in file (header skipped) */ z_off_t in; /* bytes into deflate or inflate */ z_off_t out; /* bytes out of deflate or inflate */ int back; /* one character push-back */ int last; /* true if push-back is last character */ } gz_stream; local gzFile gz_open OF((const char *path, const char *mode, int fd)); local int do_flush OF((gzFile file, int flush)); local int get_byte OF((gz_stream *s)); local void check_header OF((gz_stream *s)); local int destroy OF((gz_stream *s)); local void putLong OF((FILE *file, uLong x)); local uLong getLong OF((gz_stream *s)); /* =========================================================================== Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb"). The file is given either by file descriptor or path name (if fd == -1). gz_open returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ local gzFile gz_open (path, mode, fd) const char *path; const char *mode; int fd; { int err; int level = Z_DEFAULT_COMPRESSION; /* compression level */ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ char *p = (char*)mode; gz_stream *s; char fmode[80]; /* copy of mode, without the compression level */ char *m = fmode; if (!path || !mode) return Z_NULL; s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; s->stream.zalloc = (alloc_func)0; s->stream.zfree = (free_func)0; s->stream.opaque = (voidpf)0; s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; s->file = NULL; s->z_err = Z_OK; s->z_eof = 0; s->in = 0; s->out = 0; s->back = EOF; s->crc = crc32(0L, Z_NULL, 0); s->msg = NULL; s->transparent = 0; s->path = (char*)ALLOC(strlen(path)+1); if (s->path == NULL) { return destroy(s), (gzFile)Z_NULL; } strcpy(s->path, path); /* do this early for debugging */ s->mode = '\0'; do { if (*p == 'r') s->mode = 'r'; if (*p == 'w' || *p == 'a') s->mode = 'w'; if (*p >= '0' && *p <= '9') { level = *p - '0'; } else if (*p == 'f') { strategy = Z_FILTERED; } else if (*p == 'h') { strategy = Z_HUFFMAN_ONLY; } else if (*p == 'R') { strategy = Z_RLE; } else { *m++ = *p; /* copy the mode */ } } while (*p++ && m != fmode + sizeof(fmode)); if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateInit2(&(s->stream), level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); /* windowBits is passed < 0 to suppress zlib header */ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); #endif if (err != Z_OK || s->outbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } else { s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); err = inflateInit2(&(s->stream), -MAX_WBITS); /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are * present after the compressed stream. */ if (err != Z_OK || s->inbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } s->stream.avail_out = Z_BUFSIZE; errno = 0; s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); if (s->file == NULL) { return destroy(s), (gzFile)Z_NULL; } if (s->mode == 'w') { /* Write a very simple .gz header: */ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); s->start = 10L; /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * start anyway in write mode, so this initialization is not * necessary. */ } else { check_header(s); /* skip the .gz header */ s->start = ftell(s->file) - s->stream.avail_in; } return (gzFile)s; } /* =========================================================================== Opens a gzip (.gz) file for reading or writing. */ gzFile ZEXPORT gzopen (path, mode) const char *path; const char *mode; { return gz_open (path, mode, -1); } /* =========================================================================== Associate a gzFile with the file descriptor fd. fd is not dup'ed here to mimic the behavio(u)r of fdopen. */ gzFile ZEXPORT gzdopen (fd, mode) int fd; const char *mode; { char name[46]; /* allow for up to 128-bit integers */ if (fd < 0) return (gzFile)Z_NULL; sprintf(name, "", fd); /* for debugging */ return gz_open (name, mode, fd); } /* =========================================================================== * Update the compression level and strategy */ int ZEXPORT gzsetparams (file, level, strategy) gzFile file; int level; int strategy; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; /* Make room to allow flushing */ if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; } s->stream.avail_out = Z_BUFSIZE; } return deflateParams (&(s->stream), level, strategy); } /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte(s) gz_stream *s; { if (s->z_eof) return EOF; if (s->stream.avail_in == 0) { errno = 0; s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) s->z_err = Z_ERRNO; return EOF; } s->stream.next_in = s->inbuf; } s->stream.avail_in--; return *(s->stream.next_in)++; } /* =========================================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ local void check_header(s) gz_stream *s; { int method; /* method byte */ int flags; /* flags byte */ uInt len; int c; /* Assure two bytes in the buffer so we can peek ahead -- handle case where first byte of header is at the end of the buffer after the last gzip segment */ len = s->stream.avail_in; if (len < 2) { if (len) s->inbuf[0] = s->stream.next_in[0]; errno = 0; len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; s->stream.avail_in += len; s->stream.next_in = s->inbuf; if (s->stream.avail_in < 2) { s->transparent = s->stream.avail_in; return; } } /* Peek ahead to check the gzip magic header */ if (s->stream.next_in[0] != gz_magic[0] || s->stream.next_in[1] != gz_magic[1]) { s->transparent = 1; return; } s->stream.avail_in -= 2; s->stream.next_in += 2; /* Check the rest of the gzip header */ method = get_byte(s); flags = get_byte(s); if (method != Z_DEFLATED || (flags & RESERVED) != 0) { s->z_err = Z_DATA_ERROR; return; } /* Discard time, xflags and OS code: */ for (len = 0; len < 6; len++) (void)get_byte(s); if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ len = (uInt)get_byte(s); len += ((uInt)get_byte(s))<<8; /* len is garbage if EOF but the loop below will quit anyway */ while (len-- != 0 && get_byte(s) != EOF) ; } if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; } /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. */ local int destroy (s) gz_stream *s; { int err = Z_OK; if (!s) return Z_STREAM_ERROR; TRYFREE(s->msg); if (s->stream.state != NULL) { if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateEnd(&(s->stream)); #endif } else if (s->mode == 'r') { err = inflateEnd(&(s->stream)); } } if (s->file != NULL && fclose(s->file)) { #ifdef ESPIPE if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ #endif err = Z_ERRNO; } if (s->z_err < 0) err = s->z_err; TRYFREE(s->inbuf); TRYFREE(s->outbuf); TRYFREE(s->path); TRYFREE(s); return err; } /* =========================================================================== Reads the given number of uncompressed bytes from the compressed file. gzread returns the number of bytes actually read (0 for end of file). */ int ZEXPORT gzread (file, buf, len) gzFile file; voidp buf; unsigned len; { gz_stream *s = (gz_stream*)file; Bytef *start = (Bytef*)buf; /* starting point for crc computation */ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_STREAM_END) return 0; /* EOF */ next_out = (Byte*)buf; s->stream.next_out = (Bytef*)buf; s->stream.avail_out = len; if (s->stream.avail_out && s->back != EOF) { *next_out++ = s->back; s->stream.next_out++; s->stream.avail_out--; s->back = EOF; s->out++; start++; if (s->last) { s->z_err = Z_STREAM_END; return 1; } } while (s->stream.avail_out != 0) { if (s->transparent) { /* Copy first the lookahead bytes: */ uInt n = s->stream.avail_in; if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > 0) { zmemcpy(s->stream.next_out, s->stream.next_in, n); next_out += n; s->stream.next_out = next_out; s->stream.next_in += n; s->stream.avail_out -= n; s->stream.avail_in -= n; } if (s->stream.avail_out > 0) { s->stream.avail_out -= (uInt)fread(next_out, 1, s->stream.avail_out, s->file); } len -= s->stream.avail_out; s->in += len; s->out += len; if (len == 0) s->z_eof = 1; return (int)len; } if (s->stream.avail_in == 0 && !s->z_eof) { errno = 0; s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) { s->z_err = Z_ERRNO; break; } } s->stream.next_in = s->inbuf; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = inflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err == Z_STREAM_END) { /* Check CRC and original size */ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); start = s->stream.next_out; if (getLong(s) != s->crc) { s->z_err = Z_DATA_ERROR; } else { (void)getLong(s); /* The uncompressed length returned by above getlong() may be * different from s->out in case of concatenated .gz files. * Check for such files: */ check_header(s); if (s->z_err == Z_OK) { inflateReset(&(s->stream)); s->crc = crc32(0L, Z_NULL, 0); } } } if (s->z_err != Z_OK || s->z_eof) break; } s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); if (len == s->stream.avail_out && (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) return -1; return (int)(len - s->stream.avail_out); } /* =========================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ int ZEXPORT gzgetc(file) gzFile file; { unsigned char c; return gzread(file, &c, 1) == 1 ? c : -1; } /* =========================================================================== Push one byte back onto the stream. */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; s->back = c; s->out--; s->last = (s->z_err == Z_STREAM_END); if (s->last) s->z_err = Z_OK; s->z_eof = 0; return c; } /* =========================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { char *b = buf; if (buf == Z_NULL || len <= 0) return Z_NULL; while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; *buf = '\0'; return b == buf && len > 0 ? Z_NULL : b; } #ifndef NO_GZCOMPRESS /* =========================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of bytes actually written (0 in case of error). */ int ZEXPORT gzwrite (file, buf, len) gzFile file; voidpc buf; unsigned len; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.next_in = (Bytef*)buf; s->stream.avail_in = len; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; break; } s->stream.avail_out = Z_BUFSIZE; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err != Z_OK) break; } s->crc = crc32(s->crc, (const Bytef *)buf, len); return (int)(len - s->stream.avail_in); } /* =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ #ifdef STDC #include int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) { char buf[Z_PRINTF_BUFSIZE]; va_list va; int len; buf[sizeof(buf) - 1] = 0; va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(buf, format, va); va_end(va); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = vsprintf(buf, format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(buf, sizeof(buf), format, va); va_end(va); len = strlen(buf); # else len = vsnprintf(buf, sizeof(buf), format, va); va_end(va); # endif #endif if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, (unsigned)len); } #else /* not ANSI C */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { char buf[Z_PRINTF_BUFSIZE]; int len; buf[sizeof(buf) - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(buf); # else len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, len); } #endif /* =========================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned char cc = (unsigned char) c; /* required for big endian systems */ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; } /* =========================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ int ZEXPORT gzputs(file, s) gzFile file; const char *s; { return gzwrite(file, (char*)s, (unsigned)strlen(s)); } /* =========================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. */ local int do_flush (file, flush) gzFile file; int flush; { uInt len; int done = 0; gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.avail_in = 0; /* should be zero already anyway */ for (;;) { len = Z_BUFSIZE - s->stream.avail_out; if (len != 0) { if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { s->z_err = Z_ERRNO; return Z_ERRNO; } s->stream.next_out = s->outbuf; s->stream.avail_out = Z_BUFSIZE; } if (done) break; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), flush); s->out -= s->stream.avail_out; /* Ignore the second of two consecutive flushes: */ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; } return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } int ZEXPORT gzflush (file, flush) gzFile file; int flush; { gz_stream *s = (gz_stream*)file; int err = do_flush (file, flush); if (err) return err; fflush(s->file); return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } #endif /* NO_GZCOMPRESS */ /* =========================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. */ z_off_t ZEXPORT gzseek (file, offset, whence) gzFile file; z_off_t offset; int whence; { gz_stream *s = (gz_stream*)file; if (s == NULL || whence == SEEK_END || s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { return -1L; } if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return -1L; #else if (whence == SEEK_SET) { offset -= s->in; } if (offset < 0) return -1L; /* At this point, offset is the number of zero bytes to write. */ if (s->inbuf == Z_NULL) { s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ if (s->inbuf == Z_NULL) return -1L; zmemzero(s->inbuf, Z_BUFSIZE); } while (offset > 0) { uInt size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (uInt)offset; size = gzwrite(file, s->inbuf, size); if (size == 0) return -1L; offset -= size; } return s->in; #endif } /* Rest of function is for reading only */ /* compute absolute position */ if (whence == SEEK_CUR) { offset += s->out; } if (offset < 0) return -1L; if (s->transparent) { /* map to fseek */ s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; s->in = s->out = offset; return offset; } /* For a negative seek, rewind and use positive seek */ if (offset >= s->out) { offset -= s->out; } else if (gzrewind(file) < 0) { return -1L; } /* offset is now the number of bytes to skip. */ if (offset != 0 && s->outbuf == Z_NULL) { s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); if (s->outbuf == Z_NULL) return -1L; } if (offset && s->back != EOF) { s->back = EOF; s->out++; offset--; if (s->last) s->z_err = Z_STREAM_END; } while (offset > 0) { int size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (int)offset; size = gzread(file, s->outbuf, (uInt)size); if (size <= 0) return -1L; offset -= size; } return s->out; } /* =========================================================================== Rewinds input file. */ int ZEXPORT gzrewind (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return -1; s->z_err = Z_OK; s->z_eof = 0; s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; s->crc = crc32(0L, Z_NULL, 0); if (!s->transparent) (void)inflateReset(&s->stream); s->in = 0; s->out = 0; return fseek(s->file, s->start, SEEK_SET); } /* =========================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. */ z_off_t ZEXPORT gztell (file) gzFile file; { return gzseek(file, 0L, SEEK_CUR); } /* =========================================================================== Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ int ZEXPORT gzeof (file) gzFile file; { gz_stream *s = (gz_stream*)file; /* With concatenated compressed files that can have embedded * crc trailers, z_eof is no longer the only/best indicator of EOF * on a gz_stream. Handle end-of-stream error explicitly here. */ if (s == NULL || s->mode != 'r') return 0; if (s->z_eof) return 1; return s->z_err == Z_STREAM_END; } /* =========================================================================== Returns 1 if reading and doing so transparently, otherwise zero. */ int ZEXPORT gzdirect (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return 0; return s->transparent; } /* =========================================================================== Outputs a long in LSB order to the given file */ local void putLong (file, x) FILE *file; uLong x; { int n; for (n = 0; n < 4; n++) { fputc((int)(x & 0xff), file); x >>= 8; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets z_err in case of error. */ local uLong getLong (s) gz_stream *s; { uLong x = (uLong)get_byte(s); int c; x += ((uLong)get_byte(s))<<8; x += ((uLong)get_byte(s))<<16; c = get_byte(s); if (c == EOF) s->z_err = Z_DATA_ERROR; x += ((uLong)c)<<24; return x; } /* =========================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. */ int ZEXPORT gzclose (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL) return Z_STREAM_ERROR; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return Z_STREAM_ERROR; #else if (do_flush (file, Z_FINISH) != Z_OK) return destroy((gz_stream*)file); putLong (s->file, s->crc); putLong (s->file, (uLong)(s->in & 0xffffffff)); #endif } return destroy((gz_stream*)file); } #ifdef STDC # define zstrerror(errnum) strerror(errnum) #else # define zstrerror(errnum) "" #endif /* =========================================================================== Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ const char * ZEXPORT gzerror (file, errnum) gzFile file; int *errnum; { char *m; gz_stream *s = (gz_stream*)file; if (s == NULL) { *errnum = Z_STREAM_ERROR; return (const char*)ERR_MSG(Z_STREAM_ERROR); } *errnum = s->z_err; if (*errnum == Z_OK) return (const char*)""; m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); TRYFREE(s->msg); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); strcpy(s->msg, s->path); strcat(s->msg, ": "); strcat(s->msg, m); return (const char*)s->msg; } /* =========================================================================== Clear the error and end-of-file flags, and do the same for the real file. */ void ZEXPORT gzclearerr (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL) return; if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; s->z_eof = 0; clearerr(s->file); } clucene-core-2.3.3.4/src/ext/zlib/inffast.c000077500000000000000000000304301154025176300203610ustar00rootroot00000000000000/* inffast.c -- fast decoding * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - M68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; unsigned char FAR *in; /* local strm->next_in */ unsigned char FAR *last; /* while in < last, enough input available */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code this; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT dmax = state->dmax; #endif wsize = state->wsize; whave = state->whave; write = state->write; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = lcode[hold & lmask]; dolen: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op == 0) { /* literal */ Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); PUP(out) = (unsigned char)(this.val); } else if (op & 16) { /* length base */ len = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = dcode[hold & dmask]; dodist: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op & 16) { /* distance base */ dist = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } from = window - OFF; if (write == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (write < op) { /* wrap around window */ from += wsize + write - op; op -= write; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (write < len) { /* some from start of window */ op = write; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += write - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ this = dcode[this.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ this = lcode[this.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and write == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ clucene-core-2.3.3.4/src/ext/zlib/inffast.h000077500000000000000000000006271154025176300203730ustar00rootroot00000000000000/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void inflate_fast OF((z_streamp strm, unsigned start)); clucene-core-2.3.3.4/src/ext/zlib/inffixed.h000077500000000000000000000143071154025176300205350ustar00rootroot00000000000000 /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; clucene-core-2.3.3.4/src/ext/zlib/inflate.c000077500000000000000000001375211154025176300203620ustar00rootroot00000000000000/* inflate.c -- zlib decompression * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common write == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, unsigned out)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; strm->adler = 1; /* to support ill-conceived Java test suite */ state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; state->wsize = 0; state->whave = 0; state->write = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflatePrime(strm, bits, value) z_streamp strm; int bits; int value; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += value << state->bits; state->bits += bits; return Z_OK; } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; if (windowBits < 0) { state->wrap = 0; windowBits = -windowBits; } else { state->wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } if (windowBits < 8 || windowBits > 15) { ZFREE(strm, state); strm->state = Z_NULL; return Z_STREAM_ERROR; } state->wbits = (unsigned)windowBits; state->window = Z_NULL; return inflateReset(strm); } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, out) z_streamp strm; unsigned out; { struct inflate_state FAR *state; unsigned copy, dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->write = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); state->write = 0; state->whave = state->wsize; } else { dist = state->wsize - state->write; if (dist > copy) dist = copy; zmemcpy(state->window + state->write, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); state->write = copy; state->whave = state->wsize; } else { state->write += dist; if (state->write == state->wsize) state->write = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Reverse the bytes in a 32-bit value */ #define REVERSE(q) \ ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); len = BITS(4) + 8; if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } state->dmax = 1U << len; Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->head != Z_NULL) { state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && state->head->extra != Z_NULL) { len = state->head->extra_len - state->length; zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->length = 0; state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) state->head->name[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) state->head->comment[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } if (state->head != Z_NULL) { state->head->hcrc = (int)((state->flags >> 9) & 1); state->head->done = 1; } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = REVERSE(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); break; } for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; if ((int)(this.op) == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); state->mode = LIT; break; } if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(this.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); state->mode = DIST; case DIST: for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; state->extra = (unsigned)(this.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif if (state->offset > state->whave + out - left) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->write) { copy -= state->write; from = state->window + (state->wsize - copy); } else from = state->window + (state->write - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif REVERSE(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long id; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary id */ if (state->mode == DICT) { id = adler32(0L, Z_NULL, 0); id = adler32(id, dictionary, dictLength); if (id != state->check) return Z_DATA_ERROR; } /* copy dictionary to window */ if (updatewindow(strm, strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } if (dictLength > state->wsize) { zmemcpy(state->window, dictionary + dictLength - state->wsize, state->wsize); state->whave = state->wsize; } else { zmemcpy(state->window + state->wsize - dictLength, dictionary, dictLength); state->whave = dictLength; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } int ZEXPORT inflateGetHeader(strm, head) z_streamp strm; gz_headerp head; { struct inflate_state FAR *state; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; /* save header structure */ state->head = head; head->done = 0; return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; unsigned wsize; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ zmemcpy(dest, source, sizeof(z_stream)); zmemcpy(copy, state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) { wsize = 1U << state->wbits; zmemcpy(window, state->window, wsize); } copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK; } clucene-core-2.3.3.4/src/ext/zlib/inflate.h000077500000000000000000000134341154025176300203630ustar00rootroot00000000000000/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN, /* i: waiting for length/lit code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ LENGTH, /* i: waiting for 32-bit length (gzip) */ DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to the BAD or MEM mode -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE Read deflate blocks: TYPE -> STORED or TABLE or LEN or CHECK STORED -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN Read deflate codes: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 7K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ gz_headerp head; /* where to save gzip header information */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ }; clucene-core-2.3.3.4/src/ext/zlib/inftrees.c000077500000000000000000000326741154025176300205620ustar00rootroot00000000000000/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code this; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ this.op = (unsigned char)64; /* invalid code marker */ this.bits = (unsigned char)1; this.val = (unsigned short)0; *(*table)++ = this; /* make a table to force an error */ *(*table)++ = this; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } for (min = 1; min <= MAXBITS; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || max != 1)) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked when a LENS table is being made against the space in *table, ENOUGH, minus the maximum space needed by the worst case distance code, MAXD. This should never happen, but the sufficiency of ENOUGH has not been proven exhaustively, hence the check. This assumes that when type == LENS, bits == 9. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if (type == LENS && used >= ENOUGH - MAXD) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ this.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { this.op = (unsigned char)0; this.val = work[sym]; } else if ((int)(work[sym]) > end) { this.op = (unsigned char)(extra[work[sym]]); this.val = base[work[sym]]; } else { this.op = (unsigned char)(32 + 64); /* end of block */ this.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; min = fill; /* save offset to next table */ do { fill -= incr; next[(huff >> drop) + fill] = this; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += min; /* here min is 1 << curr */ /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if (type == LENS && used >= ENOUGH - MAXD) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* Fill in rest of table for incomplete codes. This loop is similar to the loop above in incrementing huff for table indices. It is assumed that len is equal to curr + drop, so there is no loop needed to increment through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ this.op = (unsigned char)64; /* invalid code marker */ this.bits = (unsigned char)(len - drop); this.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; this.bits = (unsigned char)len; } /* put invalid code marker in table */ next[huff >> drop] = this; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; } /* set return parameters */ *table += used; *bits = root; return 0; } clucene-core-2.3.3.4/src/ext/zlib/inftrees.h000077500000000000000000000045051154025176300205570ustar00rootroot00000000000000/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of dynamic tree. The maximum found in a long but non- exhaustive search was 1444 code structures (852 for length/literals and 592 for distances, the latter actually the result of an exhaustive search). The true maximum is not known, but the value below is more than safe. */ #define ENOUGH 2048 #define MAXD 592 /* Type of code to build for inftable() */ typedef enum { CODES, LENS, DISTS } codetype; extern int inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); clucene-core-2.3.3.4/src/ext/zlib/trees.c000077500000000000000000001257731154025176300200700ustar00rootroot00000000000000/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2005 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ #define Buf_size (8 * 2*sizeof(char)) /* Number of bits used within bi_buf. (bi_buf might be implemented on * more than 16 bits on some systems.) */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local void set_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (value << s->bi_valid); put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (val << s->bi_valid);\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void _tr_stored_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. * The current inflate code requires 9 bits of lookahead. If the * last two codes for the previous block (real code plus EOB) were coded * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode * the last real code. In this case we send two empty static blocks instead * of one. (There are no problems if the previous block is stored or fixed.) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ void _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); /* Of the 10 bits for the empty block, we have already sent * (10 - bi_valid) bits. The lookahead for the last real code (before * the EOB of the previous block) was thus at least one plus the length * of the EOB plus what we have just sent of the empty static block. */ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; #endif bi_flush(s); } s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void _tr_flush_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is binary or text */ if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) set_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, eof); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+eof, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+eof, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (eof) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*eof)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; ct_data *ltree; /* literal tree */ ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Set the data type to BINARY or TEXT, using a crude approximation: * set it to Z_TEXT if all symbols are either printable characters (33 to 255) * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. * IN assertion: the fields Freq of dyn_ltree are set. */ local void set_data_type(s) deflate_state *s; { int n; for (n = 0; n < 9; n++) if (s->dyn_ltree[n].Freq != 0) break; if (n == 9) for (n = 14; n < 32; n++) if (s->dyn_ltree[n].Freq != 0) break; s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } clucene-core-2.3.3.4/src/ext/zlib/trees.h000077500000000000000000000203741154025176300200640ustar00rootroot00000000000000/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; clucene-core-2.3.3.4/src/ext/zlib/zconf.h000077500000000000000000000225101154025176300200530ustar00rootroot00000000000000/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define deflatePrime z_deflatePrime # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define zError z_zError # define alloc_func z_alloc_func # define free_func z_free_func # define in_func z_in_func # define out_func z_out_func # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ clucene-core-2.3.3.4/src/ext/zlib/zlib.h000077500000000000000000002012141154025176300176740ustar00rootroot00000000000000/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.3, July 18th, 2005 Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.3" #define ZLIB_VERNUM 0x1230 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumualte before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called immediately after inflateInit2() or inflateReset() and before any call of inflate() to set the dictionary. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns 1 if file is being read directly without decompression, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); /* Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is NULL, this function returns the required initial value for the for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ clucene-core-2.3.3.4/src/ext/zlib/zutil.c000077500000000000000000000157401154025176300201050ustar00rootroot00000000000000/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch (sizeof(uInt)) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch (sizeof(uLong)) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch (sizeof(voidpf)) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch (sizeof(z_off_t)) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif #ifdef NO_GZIP flags += 1L << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1L << 20; #endif #ifdef FASTEST flags += 1L << 21; #endif #ifdef STDC # ifdef NO_vsnprintf flags += 1L << 25; # ifdef HAS_vsprintf_void flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1L << 26; # endif # endif #else flags += 1L << 24; # ifdef NO_snprintf flags += 1L << 25; # ifdef HAS_sprintf_void flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void flags += 1L << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int z_verbose = verbose; void z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ int errno = 0; #endif #ifndef HAVE_MEMCPY void zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ clucene-core-2.3.3.4/src/ext/zlib/zutil.h000077500000000000000000000153131154025176300201060ustar00rootroot00000000000000/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef ZUTIL_H #define ZUTIL_H #define ZLIB_INTERNAL #include "zlib.h" #ifdef STDC # ifndef _WIN32_WCE # include # endif # include # include #endif #ifdef NO_ERRNO_H # ifdef _WIN32_WCE /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. We rename it to * avoid conflict with other libraries that use the same workaround. */ # define errno z_errno # endif extern int errno; #else # ifndef _WIN32_WCE # include # endif #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = (char*)ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) # if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #ifdef OS2 # define OS_CODE 0x06 # ifdef M_I86 #include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #ifdef WIN32 # ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ # define OS_CODE 0x0b # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0f #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(__CYGWIN__) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #ifndef HAVE_VSNPRINTF # ifdef MSDOS /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif # ifdef __TURBOC__ # define NO_vsnprintf # endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # define vsnprintf _vsnprintf # endif # endif # ifdef __SASC # define NO_vsnprintf # endif #endif #ifdef VMS # define NO_vsnprintf #endif #if defined(pyr) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int z_verbose; extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} #endif /* ZUTIL_H */ clucene-core-2.3.3.4/src/htdocs/000077500000000000000000000000001154025176300163045ustar00rootroot00000000000000clucene-core-2.3.3.4/src/htdocs/README000066400000000000000000000004411154025176300171630ustar00rootroot00000000000000How to upload: #create your shell space: ssh ustramooner,clucene@shell.sf.net create #upload (make sure you upload with group write permissions otherwise other people can't overwrite) rsync --chmod=ug=rwX -Pav htdocs/ ustramooner,clucene@shell.sf.net:/home/groups/c/cl/clucene/htdocs/ clucene-core-2.3.3.4/src/htdocs/_footer.html000066400000000000000000000063361154025176300206370ustar00rootroot00000000000000

 
 
clucene-core-2.3.3.4/src/htdocs/_header.html000066400000000000000000000024531154025176300205650ustar00rootroot00000000000000 CLucene - lightning fast C++ search engine
clucene-core-2.3.3.4/src/htdocs/_index.php000066400000000000000000000004641154025176300202670ustar00rootroot00000000000000 clucene-core-2.3.3.4/src/htdocs/clucene.jpg000066400000000000000000000164101154025176300204260ustar00rootroot00000000000000ÿØÿàJFIFHHÿí ÊPhotoshop 3.08BIMí ResolutionGÿ´Gÿ´8BIM FX Global Lighting Anglex8BIMFX Global Altitude8BIMó Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMõColor Halftone SettingsH/fflff/ff¡™š2Z5-8BIMøColor Transfer Settingspÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM Layer State8BIM Layer Groups8BIMGuides@@8BIM URL overrides8BIMSlicesoFöcluceneöF8BIMICC Untagged Flag8BIMLayer ID Generator Base 8BIM New Windows Thumbnailïp P*ÓÿØÿàJFIFHHÿîAdobed€ÿÛ„            ÿÀ p"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?ï~±dåQM>Ž@Å®ËËmÓp÷7ÏõU*3~²e=‡zXÕľÆ9íIÖû=ßèñýéžÓÕþ±zë†ßP·ÅÇèÐ?ô×Jh h€4pŒ"M-ˆ"M.´ðr¿ç/N€vÞdÇó/ÐK]íömiÕkm­¶²C^†àZ`þóµÍ\Ûw¬/2t²¯ÄÚNŒ 7k¡"núRKÁ¿.θàëí5µÛ}2ïd9ßÍÿY+ïÊ=|0dZÚ«s¦× Ë]½ŸEÞÔ¸ôºëJ÷4ºëÂôI.rìþµÔs­ÇéÏQD5Ï ÅÇÝ«ìÞÖmk›ùª¾mÝf‡²œÛ­‰úU„´é½–ãŠÚÿOÛú;)ÿ=/sÀ×t›ètëÑêÒ\Ŷååæ²¼œ»1ðÚʈôË«/h>­¶7oèÞïgügóŠÅ=Q–XÜ,Áe0àë]goÑncƒýgçÒÿÒ3ü\dì?ŠDï`魯;2ºPôÆe·kñkœö¹0ó²ÇY±ìü×րɶˆ?«àô©.w:Ì¼Žªqò²_‰„Â4¬šË.ÚçZØýÑgÓþqèø8yÔçcezø@‘fëM²Øö·c¿š¹ŽüúßúOÜDNÎÝkÇìO»u¯äÿÐìkÉ'©ä‹k.}îh ëÚÆMn~Ö¹Õ>¿u¹wüºÏ¬t¹ðì{ZßÞŽÜí®Ç}¥“UvÔE”¶ý¾æÖð$XÌXz–e•×Ó+Â{-[±ÁÍ wüUm÷µ¿K¥é¨ÍÇb|©ŠW‰ò«UG§þÕÈÉõƒ¨·  i°¹¬Ú79Þö­ ¿­Xm¨ýˆ:ëÑk˜æ¶–çìö­vcRÖ5…vƆÉtÔ×´í­»£Û å@þ ˆ×Áæq3iÆÍ»&Ð]c‹X$ÕƒŸ¥ô”Ô(³©[˜öšª,eoþuá®Ü}:›¹¿ô7úŒVúF%ÿoÈû^1pµåÎ6³ÚÐÀÆQé=Àµî»è-çãÑcZÛ+cÚÏ¢Ð@þ¬¦Æ$­W‚ØÀ‘½Q:SÏtÞ²0÷úô< ’rÖènæg¯W·üé)ÿ‹±,Ÿ¬w߯caã’—ZÆï—{Y²·—û78º ±±¯heÕ2Ö·VµíùnCwNÀsC]VÖ͇÷†‰Üª]Á*¡'š?dý£ëõ{u„0±ºíôËG騬nõ+±ßÎz_Ì«}+©9ýMÔ`bS^ˆ,­Ìy;ô»´o§_Ñ÷Ö·ŒêÛSªc«d0´ˆãkT«¦ª1¬ÐäH@ƒ¿Š†2†µ³ßíyühjêÜð-ûA†k:Ök7u‹ƒ«ÿª[›[»t ÃÝcd›1ú•¶:›lm‚³Y­…ÀÁ÷ÍZWšŒh}mϽ¸ÌêöYÕÞ÷mwèªÔ´Wþ–¦çw;ùßOßSºS'©š:v5,Ãsƒ]²·1î»)ÿŠ÷®†Új¹»-clo;\„ÿi*骠ELm`òÿ©G‚އ­ø«Û èk[þ·ÚÿÿÙ8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG QualityÿîAdobed€ÿÛ„              ÿÀFö"ÿÝÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?ï²H±#HÝTä?Yó¤ÖR k8æU9T€+Ä9TþÎK§ŒK¡4uÎsªE–¬—3º²0ôP´ jGüUö²œÆB¨Õµf2ÒkÍ“Xy™ý eÕ‘ Ð)BhOí˸öÀrþ`éé/­¥•øHH"×6·ÚµÁw¸õbÿuzq¹,¿Ïé(ø9•†úw•.YC˜Lj»ó˜ØÄ+¿ú핉e;°isKh|ȲY¶—©AªÚ-庲«¥QAÁ™0'—ÊiébÅH,fyäÇ­O8Ù|ó,!Y´·(â¨ë(e#Ù‚å¾,FÒ»önñcÍ»c›#>n{©R)´é"çÆœ\9W^+Ç$ù8ÈHXgÆ[ÄÛ³fÍ’dìÙ³b®Í›6*ìÙ³b®Í›6*ìÙ³b®Í›6*ìÙ³b®Í›6*ìÙ³b®Í›6*ìÙ³b¯ÿÐíæ ¶°2rã±goœæöpͯêfáÔ²r }·?ÿÆï‡žs¼fâ†wà£âoø× ü•¦¬Q †]ÑAÿg&çîN9Œy’º¼È!Ðsdznn#Z4­¼²Svoéü¸76lɶH 7˜6ëQ]ò iq$¶¦Ù·Hg”¯Òrwæ÷~yÓ±Ìâé?^cdþóàãgúǹèZ*Ätø¥X´ƒ“7-âpÇhšm¸ÿ'æDys‘¤{”®e0BÒR½ŽC¯¼ã©Ãtmím"z sȵw$v#Ã%·ÿï$Ÿ,ç.¼µi?ãÿÄŽSšR /¹«<¤(DÕ³W—W·’Yàú¼‘·•ä¥j؆¹¯M¥$†(•Ê)aÈžß,¯+¯yÿ׫ |ãö'ÿŒgøaœ¤1]ïÞ“) \W½soNó†§quWv("••D‘’ †ïCʹ/–h Bò°UÎ@tĤ¶§Ý?†ón¯,Hþ“ÕôâÄõoö*0 †0$›î¶0ÈD ¤x©5¿ó¶•bæ yFÅP¾äàX|ÿfç÷ÖSÆ¿Î(Ãéû9Ѽ»sxké™& 1 x¢¸æû·/òæòŽ£eÑ­Z‚¦>øbùsïìaç—¨u"ï<ß(A.œ±MåÙƒ žJ ²‘‚t¿0ßËxm5;hâR†Hî"'‹´¿ Tî§!òYPÍiõ{ÑÖ%%£•iñ…åñò\3Òn=N2ÇÖô8n¯.û`ŒåŹ?¡FIñMyt)®³çD°>•´BYOÙöñ8Ržgó4ÉëN%#’Ç-#ñþc¿Â?ÖÀ eú…ÌÓT¼\­RY¿Ø“½" )ôÞpQ„ÕæÝÁ_‡ûc9›2#ÊÓ’r Ë„t[ù¯ZÄÃ{m^.c ŠÔ¯VåÛ¦»óŒ)cõËXÉQ‘þÐzӇϖ2ãÊ—aå6—1ú3m,¡¡ªÊj¬¸›ù6F°h È’¬? •ãüÇc“áÊý¬ë0$]Šçæ—Ãæ4\ŸR!l(9›n®ùŠ×–o;ú6m%Ì;” ú¯SÔíÇ6* èüú§tÚ¼¹ôþZæËn]Ý?Ù6\û‡Óçw?ÿÑ™ëð=Þ£en?nIâ#'Z ‚ñ ó54öiÿ ‘=u Ž¥mvãà·˜;¨ß þ2=~mYa6íwdçÔ…¢#’‡øº´ö†c@ˆÊF]î4H„äeøÙ™fÈ{yúßö4ë‚}è?®)oç«g#ëV7èÝ”æ£çJ´f‡ØÛãcþriæ÷~y ÑÓ”ø¾O×’ý^â Ë(§¶q$rnŒ½Ȧ€ñÉñ«UÄÎÔö'c•O|ƒÜÓ–ŽAîgzP¦Ÿÿ'à)íൊ9eD`7RÀ׌¿Õ,à€²ÜÇËÄ:íøåÜqr6ór"úEÿûÉ'Ë9ò/-b_ù‡_ø™Ë—ÌW·º¤ÚNÆÜº)T¢ˆïüìØè8þ™—‘ýzÿ®r‰LNQ#mÜl“"ºeÞ]^0Kþ°ýXKç±?ú‡ø`»wOÓ=K{Éaÿy þËmF^]˜‘Íw^‹W™ílT?0CÌÕ«]ÿë¬9%ß¹”ç †Å÷uL4ô5¶#­õ CY´Z…ŒMJ3Lûôªð?ñØ.Ä}Z%º•càÞªT/Ùmð–mjk«”ºXiŒ‹Æ»­H)¿óÂßùy¾ØX£Ö¾Ç£iÖÑÚÚ"FAåñ³Ú-½p^D,<Í”ÂÇQfkRÙÞ(, MöÀø¾³ƒ¯<ã¡Ç 0Ý,ŽFÁCL¼e€êº9Ë`WBQ×Ú&xD—©e5WäPƒâJà4²Ð´ÓõËvõdŽª£Õ2P‘¸Ýš™¾ÔZ¼ª©[HAgåÕ«ÜûŸ²˜ol"‚þÞ1­wXÉãÓ§\«Å2²"6ùµxÂGÓk©ýM[WŽãQÿ@µS^^72ÿ©üp‚üWV¶ñcÿÄ2I¡­.$ÿWøàÇõë8Çï¿ô7æ/±Ì~¼‹i©[(ϻĎJ|Åö#ùבÝ!+a÷oø‘Æ_ÞrryðeWWÐYØÆ²Ä øOJS¾@N©%Æ¢Òi6ˆr>¯ó¯Ùãþ¶I<É ¦ÐèѰªÓ ´èí,m£h‡¨Žž©¯V#ûÄÿYw\â3« ”ÌÈFø@[m¡k71ú–ÆA’Û\4šõô¢@ÜS¹%òöŸªØz«}+"où¯+üuãiÿ7ü×“ÌØ|(w2ð1ÿ5ƒÿ…&ÓÐ\‚>aY7ãñ³ 'Œºüª!!Q²†éþ±É־춛t=NA4”Ayy©^8X‹I øò?³Oõ~ÎS88€)§,DeÄP»)³ù[T¹OXÔ¦eCïÁ‘¸ÿ°l“·(ò"7hã%|YZOöX¢Ü5Ö™o+‚/¯Šü'åÃõͺ8±š•s`çËï¦-¦0Ï/¦Ž’4oò¸âÊÔÃ-7ÊpÛÛIÈNn8„J•QÔîwf>9&͇ÃÝ'‡0[*êöÜ¢µÞY–,°ÈÜ ëé½?^V¾‘¨l$Oõ¤†•ÿYA?ð¹Ñ3`8 Q,0‘º§Ÿ\ùoVµ¶"ÚØHÇìÇô$S™g+ÍÇìÿ. дÝZ­¡¸†CÔKë"¨U¥(¤3œfÄbˆ6-|±LRÿÊSšçJ¸X$}¤ŽAÊ7 ¸TÞQÕË10Æ¥þÛ[ܺù«£g@Í„âè™b„¹† e䛈Ü3¬QîÌÓ7ÜB'á’ë 6ßO€Ã I}ä‘·f>'fÃF<‚aŠúCÕ|§-ôñÏop±”bÜ]Xƒ]¨x²à½C¸Ó.y¥B8â­y|lØ{›ݺx#|UºEæ/±Ì~¼%Ѻl'ÝÿâGüƧÐWðþ t™¡‹IU’EÔÊ ª»tÊ¥ýé÷4Ïûσ-kh®mV)V ¨†F.¼£y¹Ó'ŒÃ!«[N Jø«Š6ÿW%vβ[Äèj¬ ƒìF+–˜ƒÌ7‰ żôù?Uehڈƥ#ºnÿªÈp~äÉa`f1À½ý2düè«þÅ2g›"1@¦0nŸ£m‰Ó½?ôb8•úkZÿ5wÍ‚ódèwy6pŽáʾÿÓïøœþ—¤Þ±¢Sâ'< ›}qeå©u&kmJ{{ §ÔX£f‡R±4|~g‚ÓËÑg¿k„ýµXø§û?EßëgŒse;_ð4N¸¿ƒão¾àô}ú¿Fƒ‡”öÅ3À²æñÉ÷þlðlU÷µè¶00»4‹¹È¤vÞUiæ6—·ÛzÊ‹)޽ºÇÇ—òñÏfÈOüß‹ òéñ}í`-Eœ"ÈÖßîÎûzï‚sÀ²Cd9wGßù³À°¥÷þlðlU÷þlðlU÷þlðlU÷þlðlU÷þlðlU÷ž¤¶mnEëpǯð9†Ã@c#Zê· 6ä†2S—ípõ"ÿˆç³esçü?my9o_ÞZJÛ&ŸÙ¹’Ü/îÝ“ƒsÀ²cg¤{º>ÿ͞ͅ/¿óg€3b¯ÿÙclucene-core-2.3.3.4/src/htdocs/contribute.shtml000066400000000000000000000060621154025176300215370ustar00rootroot00000000000000

How to contribute?

We at CLucene would welcome any help from any capable person. Wether you are a developer, just a user, platform owner, or a webmaster, here is how you could help evolve and become the strongest and fastest indexing library out there:

C++ developers

Well, CLucene is written in C++ after all...

We need several tasks to be performed by experienced C++ developers. Examples for such include: porting of new code (Java Lucene always has new code to port), writing or porting miscellenous contribs, writing useful utilities (benchmarker for example), finding new ways to improve the speed of CLucene (memory pooling or special ways to handle strings for example), move lagacy code out and replace it with code from Boost libs, and much more...

There is really a lot to do, and if you like programming this is where you can get the best out of yourself.

Even if you can't actively participate in the project, we would really like to hear what you think of it, and if you find anything you think should be improved, don't hasitate dropping us a line!

Other developers

Write wrappers, use and file bug reports or feature requests

Being written in cross-platform C++, CLucene can be used from virtually any language and on any platform. If you can write or maintain (or both...) a decent wrapper for .NET, Perl, PHP, or any other language or platform, please do so. We will give you any help you need, and will host your project if necessary. Please contact us before starting any work on this, we might have exta info or pointers you would find useful (for example, there is a SWIG project in our SVN repository you can jump start from).

Alternatively, just use CLucene on your projects and report back any bugs or drawbacks you find. If you find it useful, please don't be shy to spread the word :)

Testers

Make CLucene crash!

Yes, thats correct. We are looking for ways to crash CLucene, or at least stress-test any part of it. If you can provide us with creative ways to do so, please do!

Platform owners

Help us test CLucene on more platforms

If you have access, or own, a non-standard platform, or one that CLucene has not been tested on yet, please take 5 minutes to test it and let us know how it went. If broken it is, fix it we would.

Webmasters

Help make this pretty website even prettier

We need this website to contain loads of useful content, and someone to keep it up to date. That shouldn't be a tremendous task, but it requires a certain level of expertise.

Oh, and the pages you're seeing now are static HTML pages. We can install any LAMP CMS.

clucene-core-2.3.3.4/src/htdocs/download.shtml000066400000000000000000000165041154025176300211720ustar00rootroot00000000000000

What version to get?

For most new projects we recommend using the code in our git master HEAD. This version conforms with Java Lucene 2.3.2, and is considerably faster than any previous version of CLucene. It also uses cmake as it's build system, and continuesly evolves to be stronger and faster.

There is also the 0.9.21b version we release quite a while ago. It is proven to be stable, but we provide almost no support for it nowadays. Use it only if you have a compelling reason not to use the one in the git master HEAD.

For more info on this, please read this thread. You are welcome to ask any follow-up questions in our mailing list. Also, don't forget to check on how you can contribute.

The 2_3_2 branch from the git master HEAD

Being continuesly updated

The recommended branch to use. Easier to build and maintain.

Use a git client to keep in sync with our working copy:

git clone git://clucene.git.sourceforge.net/gitroot/clucene/clucene

Alternatively, you can download a tarball through our WebGUI (click "snapshot").

Build instructions (more info in the INSTALLATION and README files):

Building from source:
--------------------

Dependencies:
* CMake version 2.4.2 or later (2.6 or later recommended due to an improved FindBoost module)
* Boost libs (http://www.boost.org/), latest version recommended
* A functioning and fairly new C++ compiler. We test mostly on GCC and Visual Studio 6+.
Anything other than that may not work.
* Something to unzip/untar the source code.

Build instructions:
1.) Download the latest sourcecode of the HEAD of the master branch in our git repository
2.) Unpack the tarball/zip/bzip/whatever if downloaded as such
3.) Open a command prompt, terminal window, or cygwin session.
4.) Change directory into the root of the sourcecode (from now on referred to as )
# cd 
5.) Create and change directory into an 'out-of-source' directory for your build. 
    [This is by far the easiest way to build,  it has the benefit of being able to 
    create different types of builds in the same source-tree.]
# mkdir /build-name
# cd /build-name
5*.) Windows users: make sure Boost environment variables are defined at least for the current
   command prompt session. You can check this by typing "set" (no quotes). If you have any doubts,
   just type the following 3 commands to set those variables, as follows (boost_1_40_0 being the
   current Boost version):
	set BOOST_BUILD_PATH=C:\{parent directory for boost}\boost_1_40_0\tools\build\v2
	set BOOST_PATH=C:\{parent directory for boost}
	set BOOST_ROOT=C:\{parent directory for boost}\boost_1_40_0
6.) Configure using cmake. This can be done many different ways, but the basic syntax is
# cmake [-G "Script name"] ..
    [Where "Script name" is the name of the scripts to build (e.g. Visual Studio 8 2005).
    A list of supported build scripts can be found by]
# cmake --help
7.) You can configure several options such as the build type, debugging information, 
    mmap support, etc, by using the CMake GUI or by calling 
# ccmake ..
    Make sure you call configure again if you make any changes.
8.) Start the build. This depends on which build script you specified, but it would be something like
# make
or
# nmake
    Or open the solution files with your IDE.

    [You can also specify to just build a certain target (such as cl_test, cl_demo, 
    clucene-core (shared library), clucene-core-static (static library).]
9.) The binary files will be available in build-name/bin
10.)Test the code. (After building the tests - this is done by default, or by calling make cl_test)
# ctest -V
11.)At this point you can install the library:
# make install
    [There are options to do this from the IDE, but I find it easier to create a 
    distribution (see instructions below) and install that instead.]
or
# make cl_demo
    [This creates the demo application, which demonstrates a simple text indexing and searching].
or
	Adjust build values using ccmake or the Cmake GUI and rebuild.
	
12.)Now you can develop your own code. This is beyond the scope of this document.
    Read the README for information about documentation or to get help on the mailinglist.

Release 0.9.21b

October 23rd, 2008

This is the latest stable official release.

Installation notes

Rebuilding the autobuild scripts
--------------------------------
If you made changes to the configure.ac or any of the Makefile.am 
files you will also need to run through this process.

Requirements:
GNU autotools is required. I have the following versions installed:
Autoconf 2.57
Automake 1.72
Libtool 1.5a

If you use significantly older versions, I can almost guarantee
issues.  This is because each of the autotools is constantly changing
with little regard to backward compatability or even compatiability
with the other autotools.

Run the autogen.sh file in the root directory of clucene to run the necessary commands.


Building
--------
The following will get you building assuming that you have suffciently
recent buld tools installed.  
1.) unpack tarball 
2.) cd into clucene
3.) if you downloaded a tar version skip to 5
4.) run ./autogen.sh
5.) run ./configure
6.) run make
7.) things will churn for a very long time, the clucene library will
be built as well as the examples.
8.) check the src/demo, test and src directory

In src/demo you should see:
cl_demo

In test you should see
cl_test

In src you should see:
libclucene.so.0.0.0 libclucene.la libclucene.a 
and symbolic links to these files.

9.) If you want to run make install to copy the clucene files into the system 
    include and lib directories
10.) You may have to run
export LD_LIBRARY_PATH=/path/to/clucene/lib 

11.) run ./cl_test in the test directory and check that the tests all run

Alternative (faster) way of building:
-------------------------------------
This method does not create library files, so depending on your needs you may not
find this method useful.

* Do steps 1-5 of the previous build process.
* Change directory into src/
* run make monolithic
* Change directory into test/ (cd ../test/)
* run make monolithic
* You should see cl_test_monolithic in this directory
* run ./cl_test_monolithic and check that the tests all run
clucene-core-2.3.3.4/src/htdocs/images/000077500000000000000000000000001154025176300175515ustar00rootroot00000000000000clucene-core-2.3.3.4/src/htdocs/images/disk.png000066400000000000000000000011541154025176300212120ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<þIDATÁ=‹]UеÏì;C‚’¨`„DD Ve ñ£‚…h‘*BÐ"¥6VV"¢c¡Ø v‚ba•"ÁNÅB´Å Þ™{ö~×j‡o|÷Ãóx÷‘Ž&ÀÞÒ,K“”*ÿìoü¼=]ß»óñË_v<}tëÚuš§.R±±[ËÞÒœ9X´Æñ¶ŸÌs¿þy|åóo~ùäðÆ×ç¼ |uç_’¸ùáªBk6½Y–f7b»–QÚ´ô×^ºüЙƒý<TÅ:Ê:ÖŠ¾Ç¦7U±Ý•u„Ä÷wïÙßìÙžŽý޳£‚Øî ,­6}Ñ4'kÙžF%*Tâ¿NHZ'}&NGÀÛ¯_±é‹¾°Îøï´Œ*UD¤Ê:¦¤t´šH¼ûÙZk–Ʀ/FÅ%8þAëØ#Ñ…J©š¾p‘FQ¡ª$Q‰ª¢5ë:Hé0' РQED‚DK$e]›¤t³Ñ4I¤JDUS*¢œ®!¥³Bxç•KàÖÑOƈ¤ô¥5³ˆHøàöupóê‘9‡Ý‰®Q píÒ«j–¹¥'ɬ4nÿþxöÑÍ9­3’¤Wü¶õø3—Ïj7ŸûÀ…ûËœ¿ÛáoßOò$¹*y€’„”¤HIЉ$HÈ=m¹û?!|n‹m°¢IEND®B`‚clucene-core-2.3.3.4/src/htdocs/images/img01.gif000066400000000000000000000036311154025176300211600ustar00rootroot00000000000000GIF89aBÕßñúÝðúãçíÞðúBIT=DOAHSÞñú?GQ6=H19C:AL8@J2:D8?J3:EEP7>I18C?FQ;BMÀÄÉáåëÜàæÉÍÒÍÐÖBJTÐÔÙÕÙÞÿÿÿßâè07BÆÉÎÃÆÌØÜâ!ù,Bÿ@€pH Èq)L:™Kg:HªÐz dµÜëzèZ@¹‹Ö®¯mªY™ž§v°y KùL~N€D‚Iq}fˆŠufwyZ‘P“”Ž]i†H‹K›G…’—¤™˜W¨R¥r­Œlš£TŸF¡C•L¹Q¯¼§¦©ªOz±Äp²Å®Çn³dÍLo«ÂSÓH¬bÈØÆÙN·BÑÞiá‡ã½¾ÁÀÒêI„¢]îU{ÝåÌÉÎ÷ÐçEû¸ýMð赈$Þ–|KÈq2‡ˆÂ#×Ò)“hI­yÛ´µ‘cÆzM\7r;kÕ ¦4QÜÇ…/Au¤seM•7Ϭ¤Y’ZNÿž°,& ÓˆÁ‡© ÕioYO›OqFeYÔËLƒjY éth× R¾áù7VdEŠèHžU«ëŸV±ogŠÝÅÏl[»uѦ59¨§gÊ o^¶{}®å»Xqc¨`]r +w¥Ø¥—;$KןaÏܪbÕ:š°ÍC03Ô{˜ñ]Ö 5оÚ1³iÕM·vüZw쳃O‰ïkBÔà8+ÿ\8ôpàÏ Ö®\îrØÍ}gçro×Ý“z¥\}fK𻽇gÚ÷<÷ôR#C/;:–Ü’‹“Wм,vÿÚˆÞADÙgm²GqòÁÔÞNî©÷Û{JXa|÷ކƒq¸ÿ…Z"†ðQõS„$v¸ß‚²(Ó‰Æø Œ4º(^ƒ/&8×mýáÆs‚¤ˆC(œ[h›‡§ñdg#š8Ui"IåŠú8ÉäR(JùXŠ&i%‚J®†åqZe‘^~'Ý‘8Yfyt&Ø¥_ëáYâ|ZFŽæÉ8ãT;>yv¤‘9æ[öØßšº…Q‚W:§‚—ZgZ¤†2ÇéPÆU'’…‚zè€lꦪQ²** £ºIä§ÚÑŠjª’š«¬7¢Ùhš·Ú*䤋R:~ úzæfšÚl}ÅFç’˦æè³Ážú¦±pf˜_–¿†«¦¶³Vyi¥ÐN»ÿ«·ß²;,¹`FÙg_bên‹™J/¯m®Wê¸Ø‚˜h·Zªl»ÌŠ‹ðªóz®¢Ã*±®ûæÙ0¿¬â*h¾±Þ›c½ +¢Èñj<1Ç'[¼1Æ+«\±Š Èä«õRs“ ¿p¹BEÌ휌V›°:;ktºË)mÒ6'›°Ð8@ÂÔTWmõÕXg­õÖ\_àõ×`‡-öØd—möÙ ¤­öÚl·íöÛpÇ-wt×m÷Ýxç­÷Þ|÷ýÀ߀.øà„nøáˆG øâŒ7îøãG.ùäTnùå˜g®ùæœwîy ‡.ú褗nú騧nÁꬷîúë°Ç.ûì´;`ÿûí¸ç®ûî¼÷îûï /üðÄoüñÈ'¯üÌ7ïüóÐG/ýôÔW¿ÀõØg¯ýöÜwïý÷àg þøä—oþù觯þú´ïþûðÇ/ÿüô×oøç¯ÿþü÷ïÿÿ  HÀ °L ÈÀ:ðŒ &HÁ Zð‚Ì 7ÈAxðƒ ¡GHšð„H¡ WȺð…0Œ¡ @ÃÚð†8Ì¡wÈÃúð‡@ ¢ @Ä"ñˆHL¢—ÈÄ&:ñ‰PŒ¢?@Å*ZñŠXÌ¢·ÈÅ.Jñ‹` £Ç8F!šñŒhL£Õ(Ã6ºñp”À çHÇ:ÚÿÌ£÷ÈG Dð€ ¤ +`ÀBòˆLd"íÇÈF:ò‘XŸ$'IÉJf|˜Ì¤&7¹€êyò“  å”GÊRšò” ø*WÉÊV:€v°Œ¥,giÔÙò–¸Ìe<ÇË^úò—˜œ0‡IÌbFqÈL¦2—ù€¾9ó™ÐŒfäFÍjZóš 8›6·ÉÍn^@à §8ÇIÎršóœèL§ÖÉÎvºóðŒ§<çIOØóžøÌ§>÷ÉÏ~úóŸ%¨@JЂô M¨B;ÀІ:ô¡¨D'JÑŠzà¢ͨF7ÊÑŽzô£ HGJÒ’šô¤(M©JW‚–ºô¥¶0©LgJÓšÚô8Í©NwÊÓžúô§@ *†JÔ¢õ¨HMªR—ÊÔ8õ©PªT§JÕªZõªȪV·ÊÕ®zõ«` «X@Ö²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­Zƒ;clucene-core-2.3.3.4/src/htdocs/images/img02.gif000066400000000000000000000256461154025176300211730ustar00rootroot00000000000000GIF89aÈ–÷ßñúÝðúÞðúÞñúaaaWWW```XXXZZZÜî÷\\\ØéñYYY^_`ÚìôÓãë^^^hjkÕæîÐàèw{}\\]ƒ‰Œ|„___fhieffabc]]]pstËÛ♢§’šž»ÉÐrvx˜›[[[z~Ïàé¼ÊÐÆÕÝÙëõqstÛìõlno©³¹cddž¨­Úí÷ÄÒÙmpr¦°¶¦¯´°¼Âš¢§ÊÙᘠ¤ÔåïÛí÷‹’•‰’Ýî÷jll•˜ÓåîÆÔÛ¡«°uyzÄÓÛÉØáµÁÈÎÞæ³¿Åkmo…ˆ¥ª—› ª¯Š“ÁÏÖ­¹¿«·½·ÄËhiiÏß盥ª¸ÆÍ ª°cefÖèñ|€ƒ¸ÄË•¡Øëô†‰‘šžÊÚâjmouy{¼ÉÐÒãìºÇÍÀÎÖx{}§³¹oqrÔäìÃÑØ‡‰Öèò¿ÍÔÉØß¡ª¯¶ÄËÑâë½ÌÓ”¡Ç×ߨ²·œ¦ª~ƒ…— ¤ËÛ䆌ˆ’Øéò—Ÿ¤_`a“›ž‡‰“–¡ªµºª¶¼¥°¶ÂÑØvyz~„†svw–™ƒ…œ¥©z~€cdež§¬~ƒ†ž§­”˜psuÅÔÝ¥¯´¹ÇÎÒã뙢¦†ˆ”œ¡¾ÍÔqtuostÓäìÐá霥ª¡ª°dee›¤©¥°µ“šžjlmÕæïŽ•˜€…‡ÄÒÚ“› dfgÚëõ±¾ÅÌÝæ³ÁȬ·½™¡¦…ŠŒ’–¢¬±egh†‹¶ÂÈ„‰‹gij¹ÆÍÀÎÕÖæï¯ºÀ__`ˆŽ—›ÉØàª´ºÑáéruvvz|ÍÜ䬷¼ÍÞçÊÚ㯻ÁÏàèikltwybccŸ©®±¼Â¿ÌÓ©´º{€‚È×àÏßæ­·½Îß茓–È×Þuxz·ÃÉ}ƒswy§²·£¬±¾ÌÒ½ÌÔfgh¬¸¿!ù,È–ÿH0€Áƒ\(0¡C† &„XPâAŠ-^Ä@£AŽ=‚ô¨#É‘"M¦ÄxR¥F”/]Z„9S¦Dš7m>Ô9‘'Bœ;Y®¤ØRhL£5‘æT”èPˆE•š”êR«M¡>eUëT¯UÁ^›•ëÖˆg+~5»– €´ßjÀQ®EºíJÄKQoÙ…~ò…á`†… W`bƒ‹ÝzŒwrÝÆ ìØr^Ï}1kæœ4aÓˆE£f<÷rëÏm%¿=ûtíÔ±+ßf}×uoØaqÿ¦=Üvqác‘;$=Ú÷^çeçýxuˆVÌ®QGî½cÿ/Qïtý,ç8G×Ð|.tx׫ÞAK)¨óý«¤j@æJ›á¨– 2À€6{ÚÆ¤=,éLg5ÂÎï7¬jsØÕ­Žõ©+ k ߕֲðƒQ]k]‹šÕ¶Æõ¬%ì×b×ÇPîòEJ“Ù ¿B¶KãpxºÍá˜kEe%m{yÉÇò¶œá=jûÜ‘Í'^Ç=åpgÝ÷Ml&× o ËÛ¡ôÎw¼ln}Û[ÙL춸çºhG DÎ.€ ^£TÍ×&À}è‚Ó¹»{F´Æ-h03ÚÎyyÆ9®hŠ'ºâ&ÿßxÊIŽòGÛ׼?ÐT÷F!âmί7jSÃ\ØîùðrÝà_ï<ØÄg©‡ŽôUýçI'j¤=u¥SÔW÷Ù‡‰¾õa§ºé½n"i¤=Î3BÄ(€ Êís¶Ÿ8;»Þ﹟“Ád¿{Bé7wv¹ìP_©Ýíéó¾oÓ£|Ï;á;›x½3Þñå6|9ïÙøÅðMÔòÉ7hÍÿ´J € “{žå›?ýÊÕ è’Sõ*ýê[dî6z¶¶¹”/~û&7\ÐZϽž1ízàÿ÷—:ïuOü–Ÿk î}ñí›üå}ö6Œ>ó‘ïôç;Ÿúu>ÿ·!ßRÌW~žèG|ÀÉÿwöý~÷ûû-_~÷TŒ×<¿úéßþ¶ó?þ/'yƒ—~x‡W€ÿw€~"ge'~45r¦{¨§z´—z8ØW}¾÷€ È[܇qhphcxær‚ÞÇyx±·‚/X‚ßÇ€*(ƒ,¸4(|è5˜ƒ!(}3(‚?¸}¨}v|g„E÷tKY@ׄQw3I¸t‘§„S˜uLw}Lx…ï%…Txo`ÇsÈ…U§|…G†Xgu]x†_UmjûFÞ6‡A&‡!ÌPGFn[_tøné¶oìníÆ`Èeƒ˜…ß¶‡…Hˆ…ÿwˆ|p¿‰Èˆ8pþÖa—ˆ‚a˜‰ –P=(„ë•bfÒ0Óçƒ<¨ƒ£„7è‚-ƒµhƒ1èŠ$¨‹Ö·ƒ»HŠ¿(‹¹ˆ]Vø†c˜8Ð!ÕÖf!†GÈuÍPøuZø„hȆ5W†iÈÇ·†Š˜ÐgŒ[8üVHhŽpˆêxŒXX6âX…3õ—€;g°’`@fªØfµÐ¸wm€“§ùxü×X9€Þ¨ yy©€ùi숑ø—Ž™yå=ж¨a;pdqmæ)p‹óF‹&Y’(“Àˆ{CÿIöŠ»d4É%>‰‹÷'”3I”‹Áp9yU\ ’ÐŒ×v8x“ H•­h•A(Œ6©•SÉ•2ù•?i”aÉ‹Ué•c)# `YÓñc¦’€sj’ Žw¹myŽæg€åؑτ–{ÙQH€)˜z™˜”÷‘¹˜ïè–Ši˜x ™ŽÙH»W3B`iÁXw1"Ðl*É’×–€àf†•Ø•D¸“›©“8É“³”d)g²‰š·•«ùš­é‹ºÙ‹{V›f9›C2T°-àlßÐPÕô“NÙi8çi€¶‰›®Y–¹‰×y•Á)œ³x–ÝYªÿ¹Y™ÜižåIžßiøkÐðH P•Vmg”‰9àg°¸&s ÑIp °1 `„Éž}y˜ahvv¹Ÿáè—‰‘Y‘•i‘š—Ú*™*Ê î8˜I¢(ú<—y$+Œà 6àlÿ¨Ò’ @6Dw@@¹ðo€*imJFZö™1€”žèÙe¼©ÒV¥ç¥biƒÀ9¥·9žXZ{Kù›Ö¦T ¥y&+€ ½Ð™< |Pi$àiCpr: ž¦ .ä%—ÎÆIJàl%ðhz¨°˜¨cª¨°ÿ¹›ˆº¨Ú¨¾É¨ŽJ©“©­YŒðñ ‹€0pPd•@sî$×6 ðjÑÎF Ñy •vð {)t*¢!:Ž%ÚžN¸‘ät¡¾º¢Ä *¬^˜z¬ßƒ«#Ú¡Ïš¬¹½º«!9‚p@GP˜@Ðl0>@Z‰xvpm°£CöN  ‡¤º¤`«”èˆX‰U†ˆCŠ–8°&ȉÿ¶®b‰+‰ ¨°õ¦‰ýʯÿê°¬w°+° ° ˆcK±Ÿ¸oº:%K áÎÙ!ÐQÊÉ770mv '€UwÿpÿX  Pi𩪆•º”Jø³f˜¥fꆘڋCk©ß´¸´IÛ´—ú´L+g1& )&jGŽAŸ*†qøŠJ«eÖªôÈ—FŽ(V˜êVpK·e3·Ú†V·“é¶vû˜€û·}«¢:¸®¢·I¸žˆ·ÔøšÇÑð Gàœ|`°{\#àlö PI`ɶ°¦°Û‡þš°«Ë°¤¯®Ëš«ºµ{¦š‹±¶±»»K»½;»·¹›ºÂË»¿;¼g8°1à-°ö Q+9yຳ?žÜë¥eJ´Sÿë´â¾äk¥àk¾U›žGû½é»žìS¸‰Bð€ ‚‹XDP—õQ ¨PЪÑ¡×øoëè¸á£¸ˆ ¢>ÃÀŒŽd‡'z¸ð‹¸ì·‰{·{¸›À݇ÀœÁyËÁ‹ ¼êôöù€` ±÷¥ð£*ñ¨º »§»œ¹¹¾ĸ ÃëÃZª»Ç›¼È+Ä=ü±°ëÄ@œÄ¬«¼Fìm—»ÆK¼UŒ‰²ÅH¼°#$ Pp°P½ps‡d@Iº³LJ¿ë ¦çk´u¬¾wì¾â –[êÃØ½êùÇÞKÇí+Èq²Œ¡$ÿ¦@ •§’Cq.À³P3@¯Pm»kq{¸ž¬À ìªÜÉF÷É‹œÈÅ Ê#,µŠüÊì…ùÛÊ«œÊ£<Á¢LËÔxÅDÅ € Œ%&m†kÀ<@f𠽌Äó×ÌYܸ‚WÄ^l¼ÏüºQ¼°×ܺM,›ÍÅ+»ÛLÅÕ,ΨËÃáœlã¼ÝÅë¬Äð,Äì‹Æ c@ pFŠ¿ã‹¾h¬Ç€<Ç|ìÇó,©þlÐv\ÈÝÏ ýψ†È·\Ê:e ‡ *~ ¨PYpÐ ¶|ʹü—@Ò$]´†kÒÁÚÁ,Ò,ÍÊ·6Ò¨ìʱÿ Ë)MÓ7]Ó:¬³|Ò…§xƪ_sò.pmZà î9ƒ`б‚²¼úÔŠÔÑ*îÔÕ:~¿ ­hÕÌZÀ?ÜÕÀ*ÔÔ Öúw­ÒJÕ[=Õ vRmÖh½Ä=¥DŸK@NÐfpšƒÜÅRªž]ÈçÜ×+ØýÄm¦†Ç‹Ý¾ýÏÐÓêÐV%! š8g° „=HP+Ù“ Ú†¼_Ý]ŸÍÐ<-Ú•­Ð'tÚå[˽›®Û?=ÖÃ*ÖQª–@À&:¡çØÖP­‘'Ü:Ü»lÛÍŠÛ\}ÛìiÜÄ}Öï|ÖkMtÐMÝxÝo}ÜQ­Ü¿ÿ½Ò{\Ø4A Ú ýÍç]“„Ü“ ½J‘ÚC¬ÚèÞ\ÚÞÅôÞ¯=Å´}ßëݨ“\ P³*t (@•:€Ç¬]ÚÇ£ÍàöÝÐò­àÞ‰íàý­(Ú÷©¦|Ò:¨0£H· .Ñ!D Ê© Ó3 Û;ý¸|«Ë..¸ ã(Ú*®À3îÓ6mã*ã4ÑüÒ=îÌ‘ <ÐûÊÎ>‚§Ñ Ç$»ˆñœÄ  Ò3`Î[ŒÅZ^Î¥›ÎRNK>åÚ æc.ÄvÈå_ˆÔÜæàÌæoîåa.Åçxæt^æ[ÍÔ ð®p6`áDb*Ùd–ŒxÿqB& z@ p|}Ø}Lß^é žà®é˜>á–þé™NÙ3R•öéÐ ` |& w€èžPaP$ì Š Éà ¼¬­Þâ5Ž´-­ã,žÓÌã%½ãÇÊBíÒ~ÂCNÊ^]ëÙ®©É¾â)~í¹öa"P5KtÕì—và gÀÇ#Ö©ñd¶ ‡ÀÝ EíÈpg¤e@âͽÜÓŽïØ­ìѽÝÏ)*Ý ð ÜÕ ðjÝð ñ4ñß=Í‘ÌYÎy ê~ fLÀf0ÐE ·³XàÛ-Šàì=êü ó´ÿùàÑ…ßûݱðý¥Ø4Ÿš;Ÿ¦i‘ÌðÀ5A’.Ø6‘ m¦R`hªzm´ºžê¾é õWŸô”~é^êUöJÿóp³u šdæå±4PzW=Õß,MÐ’²0*Ôp®×º0ŸÚ.ïdmÜq¯¬?ðñ}¯ÕÈíðÇŽøŠoìŽøÎÊøò×ðˆÿ.@¯ÎÖJ‰Tp[ õ(Ü\Q mÖ­N¢sŸòd– G öoû1OöQ'(*É FpcÀ‹àûîE€m¦ ŸP5ÑÀdFõ]ûÛÿoõ9û¼ßàœþõÞŸßq­û\/è^$Åïix!À«è „ï÷Å~ø+@>`­e  ÀA„ ,dhà@LX1À‚ ´ˆP€F;ørãȃ%MRD‰q%Ë‘*MŠì($M‹6C¢¼øfMŸ8+êÌ(4!Ñ“-ƒòD:Шǥ(›þ´èråÓ”QcjúkO¯L¹æ;´lB«3ņ•z*Û‘io®½JWm[¸åîÄ[·ïÝ­/í”Ñ0D €30†„ŒY¬ ô €g€ÊƒA^ÎÌ“` ¡™c1#x¨Y#gŸ°{Žýפÿ앸oÓž¸÷ÈΔk ÿMv8ðãƒ#/n6¹ÅåÊŸWŒî¼9õé «c¿þ¶;ÂíÚ³ƒO2<ùïÏ«/?Õ2ïÜðwŸÏd‰Ã8œ^Èbš¶ „Èù6+ðµ3ÒÍ@úX ƒlh %㢠{¯Aí«Oºô0+OÄ×#1>LQÁIkqÂ]ŒF;ÅUÌ‘Å7ÜQÆi¼ñCèF4ñH#“,QI‡´±È%£lÊ)¹«R<¿‚ÄÏ0ø[ˆhp£llãË7Àœ<³«,Ù$h2 ª"bzh9çIJMãø´.Í>µRУÜÊ*¯@çêÿñ«©5Ô{‹©ï|S?x‡Ïžªû•Ø×x|…ãßùå—Øý®E¿~þ9&?ã‘ÙbÿÓúÎ׸ôp}$H1ä´(¸!4&C™ °€¬Ïn’k’¤”ÿ? ò̓4ãàÞ:È$Ž0…(|ÛÝPgB¾P†=›!ÛbHCÚ°†s;á[XÂ2N„,L[{HB#ÞðFâàA&Pà ÎX€ˆ0:â]шÇ3]9×#.Î΋ŸÛbì’‡¼×}w]<ã¨v—1~wB4B樺8¢.Œ¿»#ât§F8¶QŒ|É‹çG4º¹Kä c%“l Ol8ÌPF@d“³ž׳@j~÷ód!GÙÉP“ Leùð·?ÿµ€°D%ÄÔ·ÈZ’~ýËe/YÉKQʲ€Y%0UYÇY¦­˜º4¦Òñ¼ ?'3–!Ò9ÿ)‘‡Ú¤#7õÄoæp›à„9](Înšˆè §ÙYÎwžÓóg<×IÏtÚ3‰êܧ>UøÃ~â³@›A:¸eT< ä˜ÇE™±‘||Te*HŠr¢‡´#DÙvÑj±f)CúÅJÔ¤+ÝšEUêH–þÎ¥k„iMeêQFÆ”£,©MwêºN)îù)€%åüÈ€@ÍL&IÂeúò˜†$&.ƒÉT æ/ªWefNµjÕ©Ðs·4¥0·úÔ¯–«gí¨÷ÔÚU©¶5=lmê*ÃJÓÒu˜vuåKó Ö¾ S# Øî@T T¨ðÂ&±‰ 4ÿŸ…'eåYOËÞ³›,g%ûÙÊz6´%-h/[ÚÑšV³¨=­j*ÚÖ¦V¶±¥íj]ûÏ"â6k&通P”`±`X¡„9 5£iÄèOGŠEêT¤8¥cO—+]”òкΥ.Ò¶;Ýæjq¦<)ŸkÄïfWxå]w•ËÝèú¼ìE]zÍë^èjd D5ª±~[€0LF\8Þ ú*_./Yw¥`ˆÙ×Á½z„½ú×ÖYafƒ)Œ`ºiØa–o‚+|bOxk">&‡ÜaãU™(~°¡‚¢F?ÊO²"F^l÷:DæÖ­IÿΠnMLÄ&CùÉLÞàkY{ä#®Ê!v2’‘øÉ.g `–²—µ Õ0{s¶XVsm­,µäGÁ],â$„ h¸'®Œ^~¦¹¾.³˜oºeCG9¾JF´ ÛÛhB/ZÑ_.ô£) éˆú³ÐŽŽô¥=­HLgvs5¨ä%3™€!ÂkÙ†*þÐ8@½x\ò‡kœâ¯úÅ2®j†iŒ].ûZØ ÎµÄH|Ý´ÞZÙÀVñïX\>ëZÚÆö댇mkf{ÃÚ6%‰…2ç'šî Íf3úÓc®õ™ÝÍî¹ ZÓñÞt§“½nu¿ÛÚ¡6ò›Ë—è*Ë;–óÆwÿ¯ùýg2ü¶íÖÈ 3磷Uè7AnÜàf†wÁ^o‚ë{Ò"ÿ¸Â×ìo7 ¼â Ï,Êm{r•#œå+7yÊg.󚿜l(Dº„²‡,V0 BR W“ª†‰À}%=_`Û×ÒQ¯6Ô[ŠßüR=ÓäÕ:ׯb©W}Öb ;¯ÇŽô¯Ó×ìNg®Ú½ŽìC»ýÂðm{×çnuh…1Š•87a‚ÀRê lè@"<ðJ¢–\k]‘™ÕÅßu­€Íz'ÿÖÆC>ñŽG¼Sw¾r¾”íûãõzzÊkÞó¢7kê=×ùÐöýè߇ÕÚ·ó;ôÿCg‰“ G·yÎ]~ü˜/ܸɇùÍ•ïqŽç»ã$þȧ}égßúÚ/9ô7þý6ë\üÈw~ó·,’[\2è‹=@5ˆ_y¸ÓÔr_¯Ý«[ú²¿ý§ã=Ûíï]ü Àµ›ºó¿$ÀøÃ;ùK»ÿ{//¬S½³ƒ¿ý‹Àó:/þ«¿;šH¾.Jˆ,hã¶ÀiÛ¶]Ó?-z6Ç;¶t¶_[±dÁ#sÁœÀ$Á@lÁ”@2¢A!œÁ„A°ûÁ!<¤¶|©3˜"‰+r(‚磾tÛ>,ì¾{³Âðs9ì±7ì38ïë„C0Ü73 9 [¾òs<ÿð;C1äB8œ²4l¹éø/Y?¢"^¨Â0ÔÂ?¬>@ä>A,Ä7TCBÿfVVÝg¦fiþÁ`ÜæËífæfoÆfÙEáà•䲄äæàðasÖÝw^vNgt¶'wVa NäM–ÎK6MÆ`à­`uþçæd®ç~¶äVhLh‚žçJÞçsÕæÿpþæq^f ]gnfh®ÍiØjÞèkÆèŠöåÖßÿåöh¾hÖâ“ö_õUir¶æ &ás>h†è̺g}?ŸŽdxÆç hzÖiy6j{æi# ê€Æi¤†êžj©®êx¶j¢Fè…–è­vhƒ¦ê«묎jB¤h–¶è’&iŠ éŽJ¶þh²}kqNë—nIºF陾å˜Ni™†i¹Fë³®iciÂnëÇÅêŸvêVl¯eìˆÖ®öB¦¾2ÇNh_ì|ê¤ÖjÊžlþjÄÖìÐ~êÑ~h¥¶l¯~ì‚VmÏfèFæê†^mÔ¡lÃNåÛFæôÛ¿IÿÞvi¼´•ÖèI5_¸ömàîküí»îkæl~nâ>îZn¶ÖÍ\Õã]2äœc¢¥ÒC.a:~ã?o<æî%ín?&ï¡FVíægðVïòaùfïð¦ïA¶ïúVV6¾o£ÍÛÒöä×hñuí±í0+pØŽå¿ZOí\ÆìJíõ¤pú´p°½Ya¶ÛE•X÷ð#&dT.ÕPe&VT'b@¶×¶ÍS½6qÜîð &åq@ Vçh¬pÖùÖïüæo÷^oÿòñòý>ì?ò$Oï%ïo%/g'oò Çï(¯ò)oï"ò+'òóŽo&·ò,—ò›ó.pÙ–pƒÎ6óÖnp6‡p4'ë±ë8pÖ>í7—óŸvñ]¦i`^qeßpPÝYßP §X,tDpBtoôEÿð?qãIqJ7éçâqóÙûî,r$÷ô=sRcPwRï.õ2ÿ]V/õTÏnQÿò-×ò0‡òZ'sìî՟媀;clucene-core-2.3.3.4/src/htdocs/images/img03.gif000066400000000000000000000000571154025176300211610ustar00rootroot00000000000000GIF89a2€$*4!ù,2„©Ë;clucene-core-2.3.3.4/src/htdocs/images/img04.jpg000066400000000000000000000116211154025176300211740ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀ<ÈÿÄ R’Õ–W³t6!‘BS’SÑ1ÁA‚ÂCQa3ÿÚ ?ú‚øÇ6ÛÈùŸ›ÄŸb?ãüxÃñ“ÿ³;Üq„±È›äa?éüíúÿÏètxxý;ùrÙ¶tÓúGý¹¿å2;º¿óá¿~Ýuý&cþ+WП½µÅÈ›¼xööS}Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"웽•H±µ} ûÛ\\ˆñãÛÙL|=Ù7{*‘cjú÷¶¸¹ãÇ·²˜ø{²nöU"ÆÕô'ïmqr#Çoe1ð÷dÝìªE«èOÞÚâäGÞÊcáîÉ»ÙT‹WП½µÅÈ=½”ÇÃÝ“w²©6¯¡?{k‹‘<{{)‡»&ïeR,m_B~ö×"›ü‡ë³óû.ÿ þßíÿ'[Ñÿ“l¶g}GY7õÛùý.?õü~íaiÇx~M®>Ùãõ†ì/×wã÷fÈþŸŸØÑÿ“l¶g}GXÍývþcúþ?vŽ0´€ ã¼?&×lñúCvë»ñû³dOÏìhÿɶ?Û3¾£¬fþ»?±ý»GZ@qÞ“k¶xýF¡» õÝøýÙ²?§çöÿÙclucene-core-2.3.3.4/src/htdocs/images/img05.jpg000066400000000000000000000010641154025176300211750ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀÈÿÄX ³t6Á1AÿÚ ?ÛUÓXúÐ쒵ݹó4›Ÿqj9 N7‡M\kLrEqgÔZnMMcëC²JÎÜùš9÷£©ãxtÕÆ´Ç$Qw}E¦èÔÓÿÙclucene-core-2.3.3.4/src/htdocs/images/img06.jpg000066400000000000000000000046061154025176300212030ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀ<ÈÿÄm ‘ÑT³t6A!qÁ1AÿÚ ?öÕàÿ“yÛiÞ¦Ö»öüÿ>}&üÿ~=¨ä*@8ùÃäÞ8öÛ©ª.ü_?×i¿GןGƒþMäm§z›Yû~Ÿ>Ï÷ãÚŽB¤œ>Mãm¸úš¢ïÅóýxö›ô}yôx?äÞGöÚw©µŸ·çùóèüÿ~=¨ä*@8ùÃäÞ8öÛ©ª.ü_?×i¿GןGƒþMäm§z›Yû~Ÿ>Ï÷ãÚŽB¤œ>Mãm¸úš¢ïÅóýxö›ô}yôx?äÞGöÚw©µŸ·çùóèüÿ~=¨ä*@8ùÃäÞ8öÛ©ª.ü_?×i¿GןNøBÿMäom§ú›Qû~Ÿ>Ï÷ãÚB¤—›áôÞ9öÛ‡©ª®ü_?×i¿GןLuñŸèwŸÆ·³ýnþ?_§åõûÿ?eÓ?)m›ó6……jQ£ž!·§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä§3hXV¥Azs6……jQ¡Ä­#JñŸètoʨ³ým~_O¯ãõû?wQ ¶Ö?ÿÙclucene-core-2.3.3.4/src/htdocs/images/img07.gif000066400000000000000000000007251154025176300211670ustar00rootroot00000000000000GIF89a€ÄãçíBIT.6B/7C@GR2:E=EPAHS/7B;BN4I4;G9@K-5A:BM7?J>FQ9AL_Øïø¼~Ïïûÿz‚ƒ„…†‡ˆ‰‰ŒŽ‘’“”•˜™š›œžŸŸ¢£¤¥¦§¨©© ¬­®¯°±²³´µ°¸¹º»¼½¾¿¿ÂÃÄÅÆÇÈÉÉÌÍÎÏÐÑÒÓÓÖרÙÚÛÜÝÝàáâãäåæççêëìíîïðññôõö÷øùúûû þÿ H° Áƒ(\Ȱ¡Ã‡#FÔ@±¢Å‹3jܸ±€Ç CŠI²¤É“"3R¨\ɲ¥Ë—0cÆl@³¦Í›8sêÜɳ'Î@ƒ J´¨Ñ£H“*UŠ ©Ó§P£JJµªÕ¨²jÝʵ«×¯`ÊK¶¬ÖhÓª]˶­Û·oC;clucene-core-2.3.3.4/src/htdocs/images/img08.jpg000066400000000000000000000235231154025176300212040ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀÀ¼ÿÄ‚ ðQa‘¡ñáq!1A4!Qa1AðqÑ2ÿÚ ?ûwÿiþÓü¯ö¿å/ùä/ß×Ï×ßÓÿñIúÿ‡øêðøþ?ŠÇæ??Ýÿ»¿õsíÇÿþ?ñÿãÏú?è̳Ýÿ}×çå—ÿ7ùòïüŸòÕ³wÌÿlÏ™Ž´»­tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]tÐ@]uË;³³³»;=YÙÝ¿³³ÿÉ›æ—sÜÿW¢ÿôßìÿòóì,»úgõßÿZÿ¯ÛYFóZÓúoètñÿãÿÜÿûó’§û_³ÿ_^þSü¯ûOûn¶ßþßïÏËÿ¿ÿèóuCÑ:á7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA „ÝPBá7T¸MÕ.uA Œêj'ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:a/«ìÅ&2Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ /«ìÂ`Kêû0˜ú¾Ì&¾¯³ ƒ:äâëȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§Er.ȺtW"éÑ\‹§IªR1ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:*!ÑQŠˆtTC¢¢訇ED:c5S|§ý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOé5QÉý&ª9?¤ÕG'ôš¨äþ“UŸÒj£“úMTrIªŽOë eŠD®’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂIe„.’Ë]%–ºK,!t–XBé,°…ÒYa ¤²ÂSKê}À§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tKÀ§D°)Ñ, tÂo}½ç¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…Âo}½p¸Mï·¡Î ½öô9Âá7¾Þ‡8\&÷ÛÐç „Þûzáp›ßoCœ.{íès…ÄóuÁNRô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž“uÀäô›®'¤Ýp9=&ëÉé7\OIºàrzMדÒn¸ž¦ìÆþŠòóú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡ÉpìÆþ‡%óú—Ìoèr\;1¿¡Éq4™Tæ%t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÒLª!t“*ˆ]$Ê¢I2¨…ÔÒk¶¥f¥Ñ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&k¶¢iÑ&»j&&©X—ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQ´¨‡ZTC­*!Ö•ëJˆu¥D:Ò¢iQµ4Þ﫚O¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWDÞ遲¢owÕÁÑ7»êàè›ÝõptMîú¸:&÷}\{¾®‰½ßWIfë‚“¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|&ë0¹ð›®ÂçÂn¸ Ÿ ºàL.|O7\•å;Ÿ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çé7\ŽKŸ¤Ýr9.~“uÈä¹úM×#’çênÆÊòm+§ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äNÆÊò §ceyÓ±²¼‚éØÙ^Atìl¯ ºv6W];+È.•äRͲ¼›å;¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºM²¼ŽK¤Û+ÈäºÂMvÔ¤Jé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÒMvÔBé&»j!t“]µºI®Úˆ]$×mD.’k¶¢I5ÛQ ¤ší¨…ÔÕü+è¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚üè¯à‡E:+ø!Ñ_ÁŠþtWðC¢¿‚'›® xŸ„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀð𛮇„Ýp<<&ëáá7\ ºàxxM×ÃÂn¸uÀðñŒÙPç–.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ïÒl¨9.ý&ʃ’ï×ÿÙclucene-core-2.3.3.4/src/htdocs/images/img09.jpg000066400000000000000000000030431154025176300212000ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀ¼ÿÄ] Q!a¡±!qÿÚ ?궦‰Œ§è¨‡¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆz*!訇¢¢Šˆzg’¾Ëf¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& I_b`¤•ö& ”‘øIUé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø ÒHüé$~ô’?zI€½$À^’Gà/I#ð¤‘ø Ô/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËà/€l¾²øËàÿÙclucene-core-2.3.3.4/src/htdocs/images/img10.jpg000066400000000000000000000020571154025176300211740ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀ¼ÿÄ„  a!1"AQ#cƒ$d”5E' !1Aa"b‚’C&3ÿÚ ?êaÒ.Iùo‡.\9ñÏ.<§.3Ç—é11ôLL2ɹs¹ê͛߈êi1 M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ †¦ˆL54Ba©¢ M˜jh„ÃSD&š!0ÔÑ ‰çævûØžÖû}Γžæu޾ígÛÓêc}^\oµ*xosxÙ}+;ü½è¯W'éÝñ¿?Íúö|£Ì7ÏÅùWOÌvüG]uû=õíüxŒy·–}?3ádžpïçÇß…Þ2rí«Gæ>GçWÊ9óç½NîŸ;ítüeïð·dUK¦ŸËÆøwwÛßço¦ñÖ7|;Ï»¯³ª6Íã9NÄú¼yg+ÆöÎùèmüoý;ýÓú§é}Qê ûOá?±÷ÍyýOíoüý=•ù¹rø¹{«ü_éŸvu}Þ¿_ËÇÃÇßÿÙclucene-core-2.3.3.4/src/htdocs/images/img11.gif000066400000000000000000000004201154025176300211520ustar00rootroot00000000000000GIF89aÜ(³-5AÿÿÿûûûSYc§ª¯chq[ak19Eèé꟣©9@KW]g!ù,Ü(½0AÊ8ëÍ»ÿ`(ŽdižhŠ!H²¨tmßx®ç2 » pH,‚„qÉl: ÃsJ­ZGÅuËí2µÞ°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~†Áø€l~„‡e„†ˆŽ]†…’•W‘”–›O‘šœ¡FŸ¢¦E Š§«D š¬±8~¯°²·7´¸»5ƒ¼¿(‹ÀÃ$Š®ÄÈÇÉÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßà²;clucene-core-2.3.3.4/src/htdocs/images/spacer.gif000066400000000000000000000000531154025176300215130ustar00rootroot00000000000000GIF89a€!ù,D;clucene-core-2.3.3.4/src/htdocs/index.shtml000066400000000000000000000045611154025176300204720ustar00rootroot00000000000000

What is CLucene?

CLucene is a high-performance, scalable, cross platform, full-featured, open-source indexing and searching API. Specifically, CLucene is the guts of a search engine, the hard stuff. You write the easy stuff: the UI and the process of selecting and parsing your data files to pump them into the search engine yourself, and any specialized queries to pull it back for display or further processing.

CLucene is a port of the very popular Java Lucene text search engine API. CLucene aims to be a good alternative to Java Lucene when performance really matters or if you want to stick to good old C++. CLucene is faster than Lucene as it is written in C++, meaning it is being compiled into machine code, has no background GC operations, and requires no any extra setup procedures.

Being written in pure cross-platform C++ code, and utilizing the flexible cmake build system, CLucene can virtually be used for any purpose, on any machine. From PCs running Windows or Linux to Mobile devices. The sky is the limit.

Current status

Currently you can get CLucene in two flavors - one is the 0.9.21 release, which has been proven to be stable over time, but is only compatiable with Java Lucene 1.9.1. Another option is our current working copy on git, which conforms with Java Lucene 2.3.2. A detailed status and info on how to decide which one to use was posted on our Mailing List not long ago.

Since we all are very busy people, unfortunately we cannot dedicate all the time we would have wanted to in this project. We do believe in what we do, but the work on this is never ending. Please, if you believe in open-source software, like we do, see if you can contribute to the project.

More info and download instructions on our downloads page.

clucene-core-2.3.3.4/src/htdocs/style.css000066400000000000000000000110251154025176300201550ustar00rootroot00000000000000/* Design by Free CSS Templates http://www.freecsstemplates.org Released for free under a Creative Commons Attribution 2.5 License */ body { margin: 0; padding: 0; background: #E3E7ED url(images/img01.gif) repeat-x left top; font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #787878; } h1, h2, h3 { margin: 0; padding: 0; font-family: Georgia, "Times New Roman", Times, serif; font-weight: normal; color: #000; } h1 { font-size: 2em; } h2 { font-size: 1.6em; } h3 { font-size: 1.6em; } p, ul, ol { margin-top: 0; line-height: 180%; } ul, ol { } a { text-decoration: none; border-bottom: 1px dotted #999999; color: #417FDA; } a:hover { } #wrapper { width: 968px; margin: 0 auto; padding: 0; } /* Header */ #header { width: 968px; height: 150px; margin: 0 auto; background: url(images/img02.gif) no-repeat left top; } /* Logo */ #logo { float: left; width: 968px; height: 60px; color: #616161; } #logo h1, #logo p { margin: 0; padding: 0; } #logo h1 { float: left; padding: 80px 0 0 80px; letter-spacing: -1px; text-transform: lowercase; font-size: 2.6em; } #logo p { float: left; margin: 0; padding: 90px 10px; font: normal 14px Georgia, "Times New Roman", Times, serif; font-style: italic; } #logo a { border: none; background: none; text-decoration: none; color: #616161; } /* Search */ #search { float: right; width: 230px; padding: 0; } #search form { height: 41px; margin: 0; padding: 70px 0 0 0px; } #search fieldset { margin: 0; padding: 0; border: none; } #search-text { width: 210px; border: none; text-transform: lowercase; font: bold 1.2em Arial, Helvetica, sans-serif; color: #FFFFFF; } #search-submit { display: none; } /* Menu */ #menu { width: 968px; height: 50px; margin: 0 auto; padding: 0; } #menu ul { margin: 0; padding: 0; padding-left: 10px; list-style: none; line-height: normal; } #menu li { float: left; height: 50px; background: url(images/img03.gif) no-repeat right top; } #menu a { display: block; margin-top: 10px; margin-right: 3px; padding: 7px 20px 7px 20px; text-decoration: none; font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #FFFFFF; border: none; } #menu a:hover, #menu .current_page_item a { } #menu a:hover { text-decoration: underline; } /* Page */ #page { width: 968px; margin: 0 auto; background: url(images/img05.jpg) repeat-y left top; } #page-bgtop { background: url(images/img04.jpg) no-repeat left top; } #page-bgbtm { background: url(images/img06.jpg) no-repeat left bottom; } /* Content */ #content { float: right; width: 700px; padding: 60px 20px 0 0; } .post { margin-bottom: 8px; background: url(images/img09.jpg) repeat-y left top; } .post-bgtop { background: url(images/img08.jpg) no-repeat left top; } .post-bgbtm { background: url(images/img10.jpg) no-repeat left bottom; } .whitepost {padding-left: 20px;} .whitepost .title {color:#000000;padding-bottom:15px;} .post .title { padding-top: 15px; padding-left: 20px; color: #000000; } .post .title a { color: #000000; border: none; } .post .meta { border-bottom: 1px dashed #B5DEF4; padding-left: 20px; padding-bottom: 5px; text-align: left; font-family: Arial, Helvetica, sans-serif; font-size: 11px; font-style: italic; } .post .entry { padding: 10px 20px 15px 20px; text-align: justify; } /* Sidebar */ #sidebar { float: left; width: 220px; padding: 60px 0 0 20px; color: #787878; } #sidebar ul { margin: 0; padding: 0; list-style: none; } #sidebar li { margin: 0; padding: 0; } #sidebar li ul { padding-bottom: 30px; } #sidebar li li { line-height: 35px; border-bottom: 1px dashed #D2D4C9; } #sidebar li li span { display: block; margin-top: -20px; padding: 0; font-size: 11px; font-style: italic; } #sidebar h2 { height: 32px; padding: 8px 0 0 30px; background: url(images/img11.gif) no-repeat left top; letter-spacing: -.5px; color: #FFFFFF; } #sidebar p { padding-bottom: 20px; text-align: justify; } #sidebar a { color: #417FDA; border: none; } #sidebar a:hover { text-decoration: underline; color: #787878; } /* Calendar */ #calendar { } #calendar_wrap { padding: 20px; } #calendar table { width: 100%; } #calendar tbody td { text-align: center; } #calendar #next { text-align: right; } /* Footer */ #footer { height: 50px; margin: 0 auto; padding: 0px 0 15px 0; font-family: Arial, Helvetica, sans-serif; color: #B2B2B2; } #footer p { margin: 0; line-height: normal; font-size: 9px; text-transform: uppercase; text-align: center; } #footer a { color: #3D444F; }clucene-core-2.3.3.4/src/shared/000077500000000000000000000000001154025176300162665ustar00rootroot00000000000000clucene-core-2.3.3.4/src/shared/CLucene/000077500000000000000000000000001154025176300176045ustar00rootroot00000000000000clucene-core-2.3.3.4/src/shared/CLucene/CLSharedMonolithic.cpp000066400000000000000000000023021154025176300237600ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ /* * this is a monolithic file that can be used to compile clucene using one source file. * it simplifies some build processes by avoiding static & dynamic compalation pitfalls. * * note: when creating a project add either this file, or all the other .cpp files, not both! */ #include "CLucene/SharedHeader.cpp" #include "CLucene/config/gunichartables.cpp" #include "CLucene/config/repl_tcscasecmp.cpp" #include "CLucene/config/repl_tcslwr.cpp" #include "CLucene/config/repl_tcstod.cpp" #include "CLucene/config/repl_lltot.cpp" #include "CLucene/config/repl_tcstoll.cpp" #include "CLucene/config/repl_tprintf.cpp" #include "CLucene/config/threads.cpp" #include "CLucene/config/utf8.cpp" #include "CLucene/debug/condition.cpp" #include "CLucene/util/Misc.cpp" #include "CLucene/util/dirent.cpp" #include "CLucene/util/StringBuffer.cpp" clucene-core-2.3.3.4/src/shared/CLucene/LuceneThreads.h000066400000000000000000000153701154025176300225110ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _LuceneThreads_h #define _LuceneThreads_h CL_NS_DEF(util) class CLuceneThreadIdCompare; #if defined(_CL_DISABLE_MULTITHREADING) #define SCOPED_LOCK_MUTEX(theMutex) #define DEFINE_MUTEX(x) #define DEFINE_MUTABLE_MUTEX(x) #define DEFINE_CONDITION(x) #define STATIC_DEFINE_MUTEX(x) #define CONDITION_WAIT(theMutex, theCondition) #define CONDITION_NOTIFYALL(theCondition) #define _LUCENE_CURRTHREADID 1 #define _LUCENE_THREADID_TYPE int #define _LUCENE_THREAD_FUNC(name, argName) int name(void* argName) #define _LUCENE_THREAD_FUNC_RETURN(val) return (int)val; #define _LUCENE_THREAD_CREATE(func, arg) (*func)(arg) #define _LUCENE_THREAD_JOIN(value) //nothing to do... #define _LUCENE_THREADMUTEX void* #define _LUCENE_ATOMIC_INC(theInteger) (++(*theInteger)) #define _LUCENE_ATOMIC_DEC(theInteger) (--(*theInteger)) #define _LUCENE_ATOMIC_INT int #else #if defined(_LUCENE_DONTIMPLEMENT_THREADMUTEX) //do nothing #else class mutexGuard; #if defined(_CL_HAVE_PTHREAD) #define _LUCENE_THREADID_TYPE pthread_t #define _LUCENE_THREAD_FUNC(name, argName) void* name(void* argName) //< use this macro to correctly define the thread start routine #define _LUCENE_THREAD_FUNC_RETURN(val) return (void*)val; typedef void* (luceneThreadStartRoutine)(void* lpThreadParameter ); class CLUCENE_SHARED_EXPORT mutex_thread { public: struct Internal; Internal* _internal; mutex_thread(const mutex_thread& clone); mutex_thread(); ~mutex_thread(); void lock(); void unlock(); static _LUCENE_THREADID_TYPE _GetCurrentThreadId(); static _LUCENE_THREADID_TYPE CreateThread(luceneThreadStartRoutine* func, void* arg); static void JoinThread(_LUCENE_THREADID_TYPE id); void Wait(mutex_thread* shared_lock); void NotifyAll(); }; class CLUCENE_SHARED_EXPORT shared_condition{ private: class Internal; Internal* _internal; public: shared_condition(); ~shared_condition(); void Wait(mutex_thread* shared_lock); void NotifyAll(); }; #ifdef _CL_HAVE_GCC_ATOMIC_FUNCTIONS #define _LUCENE_ATOMIC_INT uint32_t #define _LUCENE_ATOMIC_INT_SET(x,v) x=v #define _LUCENE_ATOMIC_INT_GET(x) x #else class CLUCENE_SHARED_EXPORT __LUCENE_ATOMIC_INT{ public: int value; CL_NS(util)::mutex_thread THIS_LOCK; }; #define _LUCENE_ATOMIC_INT CL_NS(util)::__LUCENE_ATOMIC_INT #define _LUCENE_ATOMIC_INT_SET(x,v) x.value=v #define _LUCENE_ATOMIC_INT_GET(x) x.value #endif class CLUCENE_SHARED_EXPORT atomic_threads{ public: static int32_t atomic_increment(_LUCENE_ATOMIC_INT* theInteger); static int32_t atomic_decrement(_LUCENE_ATOMIC_INT* theInteger); }; #define _LUCENE_ATOMIC_INC(theInteger) CL_NS(util)::atomic_threads::atomic_increment(theInteger) #define _LUCENE_ATOMIC_DEC(theInteger) CL_NS(util)::atomic_threads::atomic_decrement(theInteger) #elif defined(_CL_HAVE_WIN32_THREADS) #define _LUCENE_THREADID_TYPE uint64_t #define _LUCENE_THREAD_FUNC(name, argName) void __stdcall name(void* argName) //< use this macro to correctly define the thread start routine #define _LUCENE_THREAD_FUNC_RETURN(val) CL_NS(util)::mutex_thread::_exitThread(val) #define _LUCENE_ATOMIC_INC(theInteger) CL_NS(util)::mutex_thread::atomic_increment(theInteger) #define _LUCENE_ATOMIC_DEC(theInteger) CL_NS(util)::mutex_thread::atomic_decrement(theInteger) #ifdef _M_X64 #define _LUCENE_ATOMIC_INT long long #else #define _LUCENE_ATOMIC_INT long #endif #define _LUCENE_ATOMIC_INT_SET(x,v) x=v #define _LUCENE_ATOMIC_INT_GET(x) x typedef void (__stdcall luceneThreadStartRoutine)(void* lpThreadParameter ); class CLUCENE_SHARED_EXPORT mutex_thread { private: struct Internal; Internal* _internal; public: mutex_thread(const mutex_thread& clone); mutex_thread(); ~mutex_thread(); void lock(); void unlock(); static void _exitThread(int ret); static _LUCENE_THREADID_TYPE _GetCurrentThreadId(); static _LUCENE_THREADID_TYPE CreateThread(luceneThreadStartRoutine* func, void* arg); static void JoinThread(_LUCENE_THREADID_TYPE id); static int32_t atomic_increment(_LUCENE_ATOMIC_INT* theInteger); static int32_t atomic_decrement(_LUCENE_ATOMIC_INT* theInteger); }; class CLUCENE_SHARED_EXPORT shared_condition{ private: class Internal; Internal* _internal; public: shared_condition(); ~shared_condition(); void Wait(mutex_thread* shared_lock); void NotifyAll(); }; #else #error A valid thread library was not found #endif //mutex types #define _LUCENE_THREAD_CREATE(func, arg) CL_NS(util)::mutex_thread::CreateThread(func,arg) #define _LUCENE_THREAD_JOIN(id) CL_NS(util)::mutex_thread::JoinThread(id) #define _LUCENE_CURRTHREADID CL_NS(util)::mutex_thread::_GetCurrentThreadId() #define _LUCENE_THREADMUTEX CL_NS(util)::mutex_thread #define _LUCENE_THREADCOND CL_NS(util)::shared_condition #endif //don't implement /** @internal */ class CLUCENE_SHARED_EXPORT mutexGuard { private: _LUCENE_THREADMUTEX* mrMutex; mutexGuard(const mutexGuard& clone); public: mutexGuard( _LUCENE_THREADMUTEX& rMutex ); ~mutexGuard(); }; #define SCOPED_LOCK_MUTEX(theMutex) CL_NS(util)::mutexGuard theMutexGuard(theMutex); #define DEFINE_MUTEX(theMutex) _LUCENE_THREADMUTEX theMutex; #define DEFINE_CONDITION(theCondition) _LUCENE_THREADCOND theCondition; #define DEFINE_MUTABLE_MUTEX(theMutex) mutable _LUCENE_THREADMUTEX theMutex; #define STATIC_DEFINE_MUTEX(theMutex) static _LUCENE_THREADMUTEX theMutex; #define CONDITION_WAIT(theMutex, theCondition) theCondition.Wait(&theMutex); #define CONDITION_NOTIFYALL(theCondition) theCondition.NotifyAll(); #endif //_CL_DISABLE_MULTITHREADING CL_NS_END #endif clucene-core-2.3.3.4/src/shared/CLucene/SharedHeader.cpp000066400000000000000000000017001154025176300226250ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" #ifdef _CL_HAVE_SYS_STAT_H #include #endif const TCHAR* _LUCENE_BLANK_STRING=_T(""); const char* _LUCENE_BLANK_ASTRING=""; #if defined(_ASCII) #if defined(_LUCENE_PRAGMA_WARNINGS) #pragma message ("==================Using ascii mode!!!==================") #else #warning "==================Using ascii mode!!!==================" #endif #endif wchar_t* lucene_wcsdup( const wchar_t* str ){ size_t len = wcslen(str); wchar_t* ret = (wchar_t*)malloc( (len + 1) * sizeof(wchar_t) ); wcscpy(ret, str); return ret; } clucene-core-2.3.3.4/src/shared/CLucene/SharedHeader.h000066400000000000000000000160141154025176300222760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef lucene_sharedheader_h #define lucene_sharedheader_h /** * This header contains definitions and macros for helping create cross-platform code. * It is primarily for use by the clucene-core library, but is split off so that * other applications such as the demo, test, benchmarks, etc can benefit from the * cross platform code. Cross platform code is not distributed with the clucene-core * and is not available through the shared library. */ #include "CLucene/clucene-config.h" //some early definitions #if defined(_MSC_VER) || defined(__BORLANDC__) #define _LUCENE_PRAGMA_WARNINGS //tell lucene to display warnings using pragmas instead of #warning #endif //////////////////////////////////////////////////////// //Are we in unicode mode? //////////////////////////////////////////////////////// #if defined(_MBCS) || defined(_ASCII) #undef _ASCII #undef _UCS2 #define _ASCII #elif defined(_UNICODE) #ifndef _UCS2 #define _UCS2 #endif #elif !defined(_UCS2) #define _UCS2 #endif //msvc needs unicode define so that it uses unicode library #ifdef _UCS2 #undef _UNICODE #define _UNICODE #undef _ASCII #else #undef _UNICODE #undef _UCS2 #endif //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //platform includes that MUST be included for the public headers to work... //////////////////////////////////////////////////////// #include //need this for wchar_t, size_t, NULL #ifdef _CL_HAVE_STDINT_H #include //need this for int32_t, etc #endif #include //required for float_t #include //need to include this really early... #ifdef _CL_HAVE_TCHAR_H #include //required for _T and TCHAR #endif //////////////////////////////////////////////////////// //namespace helper //////////////////////////////////////////////////////// #if defined(_LUCENE_DONTIMPLEMENT_NS_MACROS) //do nothing #elif !defined(DISABLE_NAMESPACE) && defined(_CL_HAVE_NAMESPACES) #define CL_NS_DEF(sub) namespace lucene{ namespace sub{ #define CL_NS_DEF2(sub,sub2) namespace lucene{ namespace sub{ namespace sub2 { #define CL_NS_END }} #define CL_NS_END2 }}} #define CL_NS_USE(sub) using namespace lucene::sub; #define CL_NS_USE2(sub,sub2) using namespace lucene::sub::sub2; #define CL_NS(sub) lucene::sub #define CL_NS2(sub,sub2) lucene::sub::sub2 #define CL_STRUCT_DEF(sub,clazz) namespace lucene { namespace sub{ struct clazz; } } #define CL_CLASS_DEF(sub,clazz) namespace lucene { namespace sub{ class clazz; } } #define CL_CLASS_DEF2(sub,sub2, clazz) namespace lucene { namespace sub{ namespace sub2{ class clazz; } } } #define CL_TEMPATE_DEF(sub, clazz, typedefs) namespace lucene { namespace sub{ template class clazz; }} #define CL_TYPE_DEF(sub, clazz, def) namespace lucene { namespace sub{ typedef def clazz; }} #else #define CL_NS_DEF(sub) #define CL_NS_DEF2(sub, sub2) #define CL_NS_END #define CL_NS_END2 #define CL_NS_USE(sub) #define CL_NS_USE2(sub,sub2) #define CL_NS(sub) #define CL_NS2(sub,sub2) #define CL_CLASS_DEF(sub,clazz) class clazz; #define CL_CLASS_DEF2(sub,sub2, clazz) class clazz; #endif #if defined(LUCENE_NO_STDC_NAMESPACE) //todo: haven't actually tested this on a non-stdc compliant compiler #define CL_NS_STD(func) ::func #else #define CL_NS_STD(func) std::func #endif // //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // EXPORTS definition //////////////////////////////////////////////////////// #if defined(_WIN32) || defined(_WIN64) #define CLUCENE_EXPORT_DECL __declspec(dllexport) #define CLUCENE_IMPORT_DECL __declspec(dllimport) #define CLUCENE_LOCAL_DECL #elif defined(_CL_HAVE_GCCVISIBILITYPATCH) #define CLUCENE_EXPORT_DECL __attribute__ ((visibility("default"))) #define CLUCENE_LOCAL_DECL __attribute__ ((visibility("hidden"))) #define CLUCENE_IMPORT_DECL #else #define CLUCENE_EXPORT_DECL #define CLUCENE_IMPORT_DECL #define CLUCENE_LOCAL_DECL #endif //define for the libraries #if defined(clucene_shared_EXPORTS) #define CLUCENE_SHARED_EXPORT CLUCENE_EXPORT_DECL #define CLUCENE_LOCAL CLUCENE_LOCAL_DECL #elif defined(MAKE_CLUCENE_SHARED_LIB) #define CLUCENE_SHARED_EXPORT //don't export if we are building a static library #else #define CLUCENE_SHARED_EXPORT CLUCENE_IMPORT_DECL #endif #if defined(clucene_core_EXPORTS) #define CLUCENE_EXPORT CLUCENE_EXPORT_DECL #define CLUCENE_LOCAL CLUCENE_LOCAL_DECL #elif defined(MAKE_CLUCENE_CORE_LIB) #define CLUCENE_EXPORT #else #define CLUCENE_EXPORT CLUCENE_IMPORT_DECL #endif #if defined(clucene_contribs_lib_EXPORTS) #define CLUCENE_CONTRIBS_EXPORT CLUCENE_EXPORT_DECL #define CLUCENE_LOCAL CLUCENE_LOCAL_DECL #elif defined(MAKE_CLUCENE_CONTRIBS_LIB) #define CLUCENE_CONTRIBS_EXPORT #else #define CLUCENE_CONTRIBS_EXPORT CLUCENE_IMPORT_DECL #endif #ifndef CLUCENE_LOCAL #define CLUCENE_LOCAL #endif //inline definitions #if defined(__MINGW32__) || defined(_MSC_VER) #define CLUCENE_SHARED_INLINE_EXPORT #define CLUCENE_INLINE_EXPORT #define CLUCENE_CONTRIBS_INLINE_EXPORT #else #define CLUCENE_SHARED_INLINE_EXPORT CLUCENE_SHARED_EXPORT #define CLUCENE_INLINE_EXPORT CLUCENE_EXPORT #define CLUCENE_CONTRIBS_INLINE_EXPORT CLUCENE_CONTRIBS_EXPORT #endif //////////////////////////////////////////////////////// //todo: put this logic in cmake #if defined(_MSC_VER) #if _MSC_FULL_VER >= 140050320 #define _CL_DEPRECATE_TEXT(_Text) __declspec(deprecated(_Text)) #elif _MSC_VER >= 1300 #define _CL_DEPRECATE_TEXT(_Text) __declspec(deprecated) #else #define _CL_DEPRECATE_TEXT(_Text) #endif #elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define _CL_DEPRECATE_TEXT(_Text) __attribute__((__deprecated__)) #else #define _CL_DEPRECATE_TEXT(_Text) #endif #define _CL_DEPRECATED(_NewItem) _CL_DEPRECATE_TEXT("This function or variable has been superceded by newer library or operating system functionality. Consider using " #_NewItem " instead. See online help for details.") // //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // boost stuff //////////////////////////////////////////////////////// #if defined(_MSC_VER) # pragma warning (disable : 4251) // disable exported dll function # endif //////////////////////////////////////////////////////// //Class interfaces //////////////////////////////////////////////////////// #include "CLucene/debug/lucenebase.h" //////////////////////////////////////////////////////// //memory handling macros/functions #include "CLucene/debug/mem.h" #ifdef DMALLOC #include #include #include #endif #endif //lucene_sharedheader_h clucene-core-2.3.3.4/src/shared/CLucene/_SharedHeader.h000066400000000000000000000044511154025176300224370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef lucene_internal_sharedheader_h #define lucene_internal_sharedheader_h #define LUCENE_INT32_MAX_SHOULDBE 0x7FFFFFFFL #include "CLucene/_clucene-config.h" #include "CLucene/SharedHeader.h" //don't show deprecated warnings while building internally... #undef _CL_DEPRECATE_TEXT #define _CL_DEPRECATE_TEXT(_Text) #define LUCENE_INT64_MAX_SHOULDBE _ILONGLONG(0x7FFFFFFFFFFFFFFF) #define LUCENE_INT64_MIN_SHOULDBE (-LUCENE_INT64_MAX_SHOULDBE - _ILONGLONG(1) ) //required globally (internally only) #include #include //we always need this stuff.... #include "CLucene/debug/_condition.h" #include "CLucene/LuceneThreads.h" #include "CLucene/config/repl_tchar.h" #include "CLucene/config/repl_wchar.h" #include "CLucene/config/repl_wctype.h" //replacements for functions #define cl_min(a,b) ((a)>(b) ? (b) : (a)) #define cl_min3(a,b,c) ((a)<(b) ? ((a)<(c) ? (a) : (c)) : ((b)<(c) ? (b) : (c))) #define cl_max(a,b) ((a)>(b) ? (a): (b)) #define cl_max3(a,b,c) ((a)>(b) ? ((a)>(c) ? (a) : (c)) : ((b)>(c) ? (b) : (c))) #ifdef _CL_HAVE_SAFE_CRT #define cl_sprintf sprintf_s #define cl_stprintf _stprintf_s #define cl_strcpy(Dst,Src,DstLen) strcpy_s(Dst,DstLen,Src) #else #define cl_sprintf _snprintf #define cl_stprintf _sntprintf #define cl_strcpy(Dst,Src,DstLen) strcpy(Dst,Src) #endif ///a blank string... CLUCENE_SHARED_EXPORT extern const TCHAR* _LUCENE_BLANK_STRING; #define LUCENE_BLANK_STRING _LUCENE_BLANK_STRING CLUCENE_SHARED_EXPORT extern const char* _LUCENE_BLANK_ASTRING; #define LUCENE_BLANK_ASTRING _LUCENE_BLANK_ASTRING #if defined(_WIN32) || defined(_WIN64) #define PATH_DELIMITERA "\\" #else #define PATH_DELIMITERA "/" #endif #define _LUCENE_SLEEP(ms) CL_NS(util)::Misc::sleep(ms) //if a wide character is being converted to a ascii character and it //cannot fit, this character is used instead. #define LUCENE_OOR_CHAR(c) ((char)(((unsigned short)c)&0xFF)) #endif //lucene_internal_sharedheader_h clucene-core-2.3.3.4/src/shared/CLucene/_clucene-config.h.cmake000066400000000000000000000065261154025176300240650ustar00rootroot00000000000000#ifndef _SRC_CLUCENE_INTERNAL_CLUCENE_CONFIG_H #define _SRC_CLUCENE_INTERNAL_CLUCENE_CONFIG_H 1 /* src/shared/CLucene/_clucene-config.h. * Generated automatically at end of cmake. * These are internal definitions, and this file does not need to be distributed */ /* CMake will look for these functions: */ #cmakedefine _CL_HAVE_FUNCTION__VSNWPRINTF #cmakedefine _CL_HAVE_FUNCTION__SNWPRINTF #cmakedefine _CL_HAVE_FUNCTION_WCSCASECMP #cmakedefine _CL_HAVE_FUNCTION_WCSCAT 1 #cmakedefine _CL_HAVE_FUNCTION_WCSCHR 1 #cmakedefine _CL_HAVE_FUNCTION_WCSCMP 1 #cmakedefine _CL_HAVE_FUNCTION_WCSCPY 1 #cmakedefine _CL_HAVE_FUNCTION_WCSCSPN 1 #cmakedefine _CL_HAVE_FUNCTION_WCSICMP #cmakedefine _CL_HAVE_FUNCTION_WCSLEN 1 #cmakedefine _CL_HAVE_FUNCTION_WCSNCMP 1 #cmakedefine _CL_HAVE_FUNCTION_WCSNCPY 1 #cmakedefine _CL_HAVE_FUNCTION_WCSSTR 1 #cmakedefine _CL_HAVE_FUNCTION_WCSTOD 1 #cmakedefine _CL_HAVE_FUNCTION_WCSDUP 1 #cmakedefine _CL_HAVE_FUNCTION_WCSTOLL 1 #cmakedefine _CL_HAVE_FUNCTION_WCSUPR 1 #cmakedefine _CL_HAVE_FUNCTION_GETTIMEOFDAY 1 #cmakedefine _CL_HAVE_FUNCTION_MAPVIEWOFFILE 1 #cmakedefine _CL_HAVE_FUNCTION_LLTOA 1 #cmakedefine _CL_HAVE_FUNCTION_LLTOW 1 #cmakedefine _CL_HAVE_FUNCTION_PRINTF 1 #cmakedefine _CL_HAVE_FUNCTION_SNPRINTF 1 #cmakedefine _CL_HAVE_FUNCTION_MMAP 1 #cmakedefine _CL_HAVE_FUNCTION_STRLWR 1 #cmakedefine _CL_HAVE_FUNCTION_STRTOLL 1 #cmakedefine _CL_HAVE_FUNCTION_STRUPR 1 #cmakedefine _CL_HAVE_FUNCTION_GETPAGESIZE 1 #cmakedefine _CL_HAVE_FUNCTION_USLEEP 1 #cmakedefine _CL_HAVE_FUNCTION_SLEEP 1 ${SYMBOL_CL_MAX_PATH} //this is the max filename... for now its just the same, //but this could change, so we use a different name #define CL_MAX_NAME CL_MAX_PATH //this used to be CL_MAX_NAME * 32, but as Alex Hudson points out, this could come to be 128kb. //the above logic for CL_MAX_NAME should be correct enough to handle all file names #define CL_MAX_DIR CL_MAX_PATH ${SYMBOL__O_RANDOM} ${SYMBOL__O_BINARY} ${SYMBOL__S_IREAD} ${SYMBOL__S_IWRITE} ${TYPE__TIMEB} #define _ILONG(x) x ## L #define _ILONGLONG(x) ${_CL_ILONGLONG_VALUE} ${FUNCTION_FILESTAT} ${TYPE_CL_STAT_T} ${FUNCTION_FILESIZE} ${FUNCTION_FILESEEK} ${FUNCTION_FILETELL} ${FUNCTION_FILEHANDLESTAT} ${FUNCTION__REALPATH} ${FUNCTION__RENAME} ${FUNCTION__CLOSE} ${FUNCTION__READ} ${FUNCTION__CL_OPEN} ${FUNCTION__WRITE} ${FUNCTION__SNPRINTF} ${FUNCTION__MKDIR} ${FUNCTION__UNLINK} ${FUNCTION__FTIME} ${FUNCTION_SLEEPFUNCTION} /* CMake will determine these specifics. Things like bugs, etc */ /* Does not support new float byte<->float conversions */ #cmakedefine _CL_HAVE_NO_FLOAT_BYTE 1 /* Define if recursive pthread mutexes are available */ #cmakedefine _CL_HAVE_PTHREAD_MUTEX_RECURSIVE 1 /** define if you would like to force clucene to use the internal * character functions. * Tests may display unpredictable behaviour if this is not defined. */ #ifndef LUCENE_USE_INTERNAL_CHAR_FUNCTIONS #cmakedefine LUCENE_USE_INTERNAL_CHAR_FUNCTIONS 1 #endif /** fix ansi for loop scope */ #if @CMAKE_ANSI_FOR_SCOPE@==0 #define for if (0); else for #endif /* Compiler oddities */ //not sure why, but cygwin reports _S_IREAD, but doesn't actually work... //TODO: make this work properly (this bit shouldn't be necessary) #ifdef __CYGWIN__ #define _S_IREAD 0333 #define _S_IWRITE 0333 #endif #ifdef __BORLANDC__ //borland compiler #define O_RANDOM 0 #endif #endif clucene-core-2.3.3.4/src/shared/CLucene/clucene-config.h.cmake000066400000000000000000000101261154025176300237150ustar00rootroot00000000000000#ifndef _SRC_CLUCENE_CLUCENE_CONFIG_H #define _SRC_CLUCENE_CLUCENE_CONFIG_H 1 /* src/shared/CLucene/clucene-config.h. * Generated automatically at end of cmake. */ /* CMake will look for these headers: */ #cmakedefine _CL_HAVE_STRING_H 1 #cmakedefine _CL_HAVE_MEMORY_H 1 #cmakedefine _CL_HAVE_UNISTD_H 1 #cmakedefine _CL_HAVE_IO_H 1 #cmakedefine _CL_HAVE_DIRECT_H 1 #cmakedefine _CL_HAVE_DIRENT_H 1 #cmakedefine _CL_HAVE_SYS_DIR_H #cmakedefine _CL_HAVE_SYS_NDIR_H #cmakedefine _CL_HAVE_ERRNO_H 1 #cmakedefine _CL_HAVE_WCHAR_H 1 #cmakedefine _CL_HAVE_WCTYPE_H #cmakedefine _CL_HAVE_CTYPE_H 1 #cmakedefine _CL_HAVE_WINDOWS_H 1 #cmakedefine _CL_HAVE_WINDEF_H 1 #cmakedefine _CL_HAVE_SYS_TYPES_H 1 #cmakedefine _CL_HAVE_DLFCN_H 1 #cmakedefine _CL_HAVE_EXT_HASH_MAP 1 #cmakedefine _CL_HAVE_EXT_HASH_SET 1 #cmakedefine _CL_HAVE_TR1_UNORDERED_MAP 1 #cmakedefine _CL_HAVE_TR1_UNORDERED_SET 1 #cmakedefine _CL_HAVE_HASH_MAP #cmakedefine _CL_HAVE_HASH_SET #cmakedefine _CL_HAVE_NDIR_H #cmakedefine _CL_HAVE_SYS_STAT_H 1 #cmakedefine _CL_HAVE_SYS_TIMEB_H 1 #cmakedefine _CL_HAVE_SYS_TIME_H 1 #cmakedefine _CL_HAVE_TCHAR_H 1 #cmakedefine _CL_HAVE_SYS_MMAN_H 1 #cmakedefine _CL_HAVE_WINERROR_H 1 #cmakedefine _CL_HAVE_STDINT_H 1 // our needed types ${TYPE_INT8_T} ${TYPE_UINT8_T} ${TYPE_INT16_T} ${TYPE_UINT16_T} ${TYPE_INT32_T} ${TYPE_UINT32_T} ${TYPE_INT64_T} ${TYPE_UINT64_T} ${TYPE_FLOAT_T} ${TYPE__CL_DWORD_T} ${TYPE_SIZE_T} /* tchar & _T definitions... */ ${TYPE_TCHAR} ${SYMBOL__T} /* CMake will determine these specifics. Things like bugs, etc */ /* if we can't support the map/set hashing */ #cmakedefine LUCENE_DISABLE_HASHING 1 /* Define if you have POSIX threads libraries and header files. */ #cmakedefine _CL_HAVE_PTHREAD 1 /* Define if you have Win32 threads libraries and header files. */ #cmakedefine _CL_HAVE_WIN32_THREADS 1 /* Define if we have gcc atomic functions */ #cmakedefine _CL_HAVE_GCC_ATOMIC_FUNCTIONS 1 /* Define what eval method is required for float_t to be defined (for GCC). */ #cmakedefine _FLT_EVAL_METHOD ${_FLT_EVAL_METHOD} /* If we use hashmaps, which namespace do we use: */ #define CL_NS_HASHING(func) ${CL_NS_HASHING_VALUE} /* If we use hashmaps, which classes do we use: */ #define _CL_HASH_MAP ${_CL_HASH_MAP} #define _CL_HASH_SET ${_CL_HASH_SET} /* define if the compiler implements namespaces */ #cmakedefine _CL_HAVE_NAMESPACES /* Defined if the snprintf overflow test fails */ #cmakedefine _CL_HAVE_SNPRINTF_BUG /* Defined if the swprintf test fails */ #cmakedefine _CL_HAVE_SNWPRINTF_BUG /* How to define a static const in a class */ #define LUCENE_STATIC_CONSTANT(type, assignment) ${LUCENE_STATIC_CONSTANT_SYNTAX} /* Define to the necessary symbol if this constant uses a non-standard name on your system. */ //todo: not checked #cmakedefine _CL_PTHREAD_CREATE_JOINABLE /* Define to 1 if the `S_IS*' macros in do not work properly. */ //todo: not being checked for... //#cmakedefine _CL_STAT_MACROS_BROKEN /* Define to 1 if you can safely include both and . */ //not actually used for anything... //#cmakedefine _CL_TIME_WITH_SYS_TIME 1 /* Define that we will be using -fvisibility=hidden, and * make public classes visible using __attribute__ ((visibility("default"))) */ #cmakedefine _CL_HAVE_GCCVISIBILITYPATCH 1 /* Versions, etc */ /* Name of package */ #define _CL_PACKAGE "clucene-core" /* Version number of package */ #define _CL_VERSION "@CLUCENE_VERSION@" /* So-Version number of package */ #define _CL_SOVERSION "@CLUCENE_SOVERSION@" /* A comparable version number */ #define _CL_INT_VERSION @CLUCENE_INT_VERSION@ /* Configured options (from command line) */ /* Forces into Ascii mode */ #cmakedefine _ASCII /* Conditional Debugging */ #cmakedefine _CL__CND_DEBUG /* debuging option */ #cmakedefine _DEBUG /* Disable multithreading */ #cmakedefine _CL_DISABLE_MULTITHREADING #ifdef __BORLANDC__ //borland compiler //todo: bcc incorrectly detects this... fix this in cmake #undef LUCENE_STATIC_CONSTANT #define LUCENE_STATIC_CONSTANT(type, assignment) enum { assignment } #endif #endif clucene-core-2.3.3.4/src/shared/CLucene/config/000077500000000000000000000000001154025176300210515ustar00rootroot00000000000000clucene-core-2.3.3.4/src/shared/CLucene/config/_gunichartables.h000066400000000000000000024462361154025176300243750ustar00rootroot00000000000000/* This file is automatically generated. DO NOT EDIT! Instead, edit gen-unicode-tables.pl and re-run. */ #ifndef CHARTABLES_H #define CHARTABLES_H #define G_UNICODE_DATA_VERSION "4.0" #define G_UNICODE_LAST_CHAR 0x10ffff #define G_UNICODE_MAX_TABLE_INDEX 10000 #define G_UNICODE_LAST_CHAR_PART1 0x2FAFF #define G_UNICODE_LAST_PAGE_PART1 762 static const char type_data[][256] = { { /* page 0, index 0 */ G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_FORMAT, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 1, index 1 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 2, index 2 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL }, { /* page 3, index 3 */ G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 4, index 4 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 5, index 5 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 6, index 6 */ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_FORMAT, G_UNICODE_ENCLOSING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER }, { /* page 7, index 7 */ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 9, index 8 */ G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 10, index 9 */ G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 11, index 10 */ G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 12, index 11 */ G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 13, index 12 */ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 14, index 13 */ G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 15, index 14 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 16, index 15 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 17, index 16 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 18, index 17 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 19, index 18 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 20, index 19 */ G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 22, index 20 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 23, index 21 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 24, index 22 */ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 25, index 23 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL }, { /* page 29, index 24 */ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 30, index 25 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 31, index 26 */ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED }, { /* page 32, index 27 */ G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_LINE_SEPARATOR, G_UNICODE_PARAGRAPH_SEPARATOR, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_OTHER_NUMBER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 33, index 28 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL }, { /* page 35, index 29 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 36, index 30 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER }, { /* page 37, index 31 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL }, { /* page 38, index 32 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 39, index 33 */ G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL }, { /* page 41, index 34 */ G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL }, { /* page 43, index 35 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 46, index 36 */ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 47, index 37 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 48, index 38 */ G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 49, index 39 */ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 50, index 40 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED }, { /* page 77, index 41 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL }, { /* page 159, index 42 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 164, index 43 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 215, index 44 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 250, index 45 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 251, index 46 */ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 253, index 47 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 254, index 48 */ G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT }, { /* page 255, index 49 */ G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 256, index 50 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 257, index 51 */ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 259, index 52 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 260, index 53 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 264, index 54 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 464, index 55 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 465, index 56 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 467, index 57 */ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 468, index 58 */ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 469, index 59 */ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 470, index 60 */ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 471, index 61 */ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER }, { /* page 678, index 62 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 762, index 63 */ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 3584, index 64 */ G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 3585, index 65 */ G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 4095, index 66 */ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 4351, index 67 */ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED } }; /* U+0000 through U+2FAFF */ static const gint16 type_table_part1[763] = { 0 /* page 0 */, 1 /* page 1 */, 2 /* page 2 */, 3 /* page 3 */, 4 /* page 4 */, 5 /* page 5 */, 6 /* page 6 */, 7 /* page 7 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 8 /* page 9 */, 9 /* page 10 */, 10 /* page 11 */, 11 /* page 12 */, 12 /* page 13 */, 13 /* page 14 */, 14 /* page 15 */, 15 /* page 16 */, 16 /* page 17 */, 17 /* page 18 */, 18 /* page 19 */, 19 /* page 20 */, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 20 /* page 22 */, 21 /* page 23 */, 22 /* page 24 */, 23 /* page 25 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 24 /* page 29 */, 25 /* page 30 */, 26 /* page 31 */, 27 /* page 32 */, 28 /* page 33 */, G_UNICODE_MATH_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, 29 /* page 35 */, 30 /* page 36 */, 31 /* page 37 */, 32 /* page 38 */, 33 /* page 39 */, G_UNICODE_OTHER_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, 34 /* page 41 */, G_UNICODE_MATH_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, 35 /* page 43 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 36 /* page 46 */, 37 /* page 47 */, 38 /* page 48 */, 39 /* page 49 */, 40 /* page 50 */, G_UNICODE_OTHER_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 41 /* page 77 */, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 42 /* page 159 */, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 43 /* page 164 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 44 /* page 215 */, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 45 /* page 250 */, 46 /* page 251 */, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 47 /* page 253 */, 48 /* page 254 */, 49 /* page 255 */, 50 /* page 256 */, 51 /* page 257 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 52 /* page 259 */, 53 /* page 260 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 54 /* page 264 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 55 /* page 464 */, 56 /* page 465 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, 57 /* page 467 */, 58 /* page 468 */, 59 /* page 469 */, 60 /* page 470 */, 61 /* page 471 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 62 /* page 678 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 63 /* page 762 */ }; /* U+E0000 through U+10FFFF */ static const gint16 type_table_part2[768] = { 64 /* page 3584 */, 65 /* page 3585 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, 66 /* page 4095 */, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, 67 /* page 4351 */ }; static const gunichar attr_data[][256] = { { /* page 0, index 0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x039c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x1000000, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x0178 }, { /* page 1, index 1 */ 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x0107, 0x0106, 0x0109, 0x0108, 0x010b, 0x010a, 0x010d, 0x010c, 0x010f, 0x010e, 0x0111, 0x0110, 0x0113, 0x0112, 0x0115, 0x0114, 0x0117, 0x0116, 0x0119, 0x0118, 0x011b, 0x011a, 0x011d, 0x011c, 0x011f, 0x011e, 0x0121, 0x0120, 0x0123, 0x0122, 0x0125, 0x0124, 0x0127, 0x0126, 0x0129, 0x0128, 0x012b, 0x012a, 0x012d, 0x012c, 0x012f, 0x012e, 0x1000007, 0x0049, 0x0133, 0x0132, 0x0135, 0x0134, 0x0137, 0x0136, 0x0000, 0x013a, 0x0139, 0x013c, 0x013b, 0x013e, 0x013d, 0x0140, 0x013f, 0x0142, 0x0141, 0x0144, 0x0143, 0x0146, 0x0145, 0x0148, 0x0147, 0x1000086, 0x014b, 0x014a, 0x014d, 0x014c, 0x014f, 0x014e, 0x0151, 0x0150, 0x0153, 0x0152, 0x0155, 0x0154, 0x0157, 0x0156, 0x0159, 0x0158, 0x015b, 0x015a, 0x015d, 0x015c, 0x015f, 0x015e, 0x0161, 0x0160, 0x0163, 0x0162, 0x0165, 0x0164, 0x0167, 0x0166, 0x0169, 0x0168, 0x016b, 0x016a, 0x016d, 0x016c, 0x016f, 0x016e, 0x0171, 0x0170, 0x0173, 0x0172, 0x0175, 0x0174, 0x0177, 0x0176, 0x00ff, 0x017a, 0x0179, 0x017c, 0x017b, 0x017e, 0x017d, 0x0053, 0x0000, 0x0253, 0x0183, 0x0182, 0x0185, 0x0184, 0x0254, 0x0188, 0x0187, 0x0256, 0x0257, 0x018c, 0x018b, 0x0000, 0x01dd, 0x0259, 0x025b, 0x0192, 0x0191, 0x0260, 0x0263, 0x01f6, 0x0269, 0x0268, 0x0199, 0x0198, 0x0000, 0x0000, 0x026f, 0x0272, 0x0220, 0x0275, 0x01a1, 0x01a0, 0x01a3, 0x01a2, 0x01a5, 0x01a4, 0x0280, 0x01a8, 0x01a7, 0x0283, 0x0000, 0x0000, 0x01ad, 0x01ac, 0x0288, 0x01b0, 0x01af, 0x028a, 0x028b, 0x01b4, 0x01b3, 0x01b6, 0x01b5, 0x0292, 0x01b9, 0x01b8, 0x0000, 0x0000, 0x01bd, 0x01bc, 0x0000, 0x01f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x01c6, 0x0000, 0x01c4, 0x01c9, 0x0000, 0x01c7, 0x01cc, 0x0000, 0x01ca, 0x01ce, 0x01cd, 0x01d0, 0x01cf, 0x01d2, 0x01d1, 0x01d4, 0x01d3, 0x01d6, 0x01d5, 0x01d8, 0x01d7, 0x01da, 0x01d9, 0x01dc, 0x01db, 0x018e, 0x01df, 0x01de, 0x01e1, 0x01e0, 0x01e3, 0x01e2, 0x01e5, 0x01e4, 0x01e7, 0x01e6, 0x01e9, 0x01e8, 0x01eb, 0x01ea, 0x01ed, 0x01ec, 0x01ef, 0x01ee, 0x10000ad, 0x01f3, 0x0000, 0x01f1, 0x01f5, 0x01f4, 0x0195, 0x01bf, 0x01f9, 0x01f8, 0x01fb, 0x01fa, 0x01fd, 0x01fc, 0x01ff, 0x01fe }, { /* page 2, index 2 */ 0x0201, 0x0200, 0x0203, 0x0202, 0x0205, 0x0204, 0x0207, 0x0206, 0x0209, 0x0208, 0x020b, 0x020a, 0x020d, 0x020c, 0x020f, 0x020e, 0x0211, 0x0210, 0x0213, 0x0212, 0x0215, 0x0214, 0x0217, 0x0216, 0x0219, 0x0218, 0x021b, 0x021a, 0x021d, 0x021c, 0x021f, 0x021e, 0x019e, 0x0000, 0x0223, 0x0222, 0x0225, 0x0224, 0x0227, 0x0226, 0x0229, 0x0228, 0x022b, 0x022a, 0x022d, 0x022c, 0x022f, 0x022e, 0x0231, 0x0230, 0x0233, 0x0232, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0181, 0x0186, 0x0000, 0x0189, 0x018a, 0x0000, 0x018f, 0x0000, 0x0190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0193, 0x0000, 0x0000, 0x0194, 0x0000, 0x0000, 0x0000, 0x0000, 0x0197, 0x0196, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x019c, 0x0000, 0x0000, 0x019d, 0x0000, 0x0000, 0x019f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01a6, 0x0000, 0x0000, 0x01a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x01ae, 0x0000, 0x01b1, 0x01b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 3, index 3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac, 0x0000, 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce, 0x100008f, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x0000, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x0386, 0x0388, 0x0389, 0x038a, 0x100009e, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, 0x038e, 0x038f, 0x0000, 0x0392, 0x0398, 0x0000, 0x0000, 0x0000, 0x03a6, 0x03a0, 0x0000, 0x03d9, 0x03d8, 0x03db, 0x03da, 0x03dd, 0x03dc, 0x03df, 0x03de, 0x03e1, 0x03e0, 0x03e3, 0x03e2, 0x03e5, 0x03e4, 0x03e7, 0x03e6, 0x03e9, 0x03e8, 0x03eb, 0x03ea, 0x03ed, 0x03ec, 0x03ef, 0x03ee, 0x039a, 0x03a1, 0x03f9, 0x0000, 0x03b8, 0x0395, 0x0000, 0x03f8, 0x03f7, 0x03f2, 0x03fb, 0x03fa, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 4, index 4 */ 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f, 0x0461, 0x0460, 0x0463, 0x0462, 0x0465, 0x0464, 0x0467, 0x0466, 0x0469, 0x0468, 0x046b, 0x046a, 0x046d, 0x046c, 0x046f, 0x046e, 0x0471, 0x0470, 0x0473, 0x0472, 0x0475, 0x0474, 0x0477, 0x0476, 0x0479, 0x0478, 0x047b, 0x047a, 0x047d, 0x047c, 0x047f, 0x047e, 0x0481, 0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x048b, 0x048a, 0x048d, 0x048c, 0x048f, 0x048e, 0x0491, 0x0490, 0x0493, 0x0492, 0x0495, 0x0494, 0x0497, 0x0496, 0x0499, 0x0498, 0x049b, 0x049a, 0x049d, 0x049c, 0x049f, 0x049e, 0x04a1, 0x04a0, 0x04a3, 0x04a2, 0x04a5, 0x04a4, 0x04a7, 0x04a6, 0x04a9, 0x04a8, 0x04ab, 0x04aa, 0x04ad, 0x04ac, 0x04af, 0x04ae, 0x04b1, 0x04b0, 0x04b3, 0x04b2, 0x04b5, 0x04b4, 0x04b7, 0x04b6, 0x04b9, 0x04b8, 0x04bb, 0x04ba, 0x04bd, 0x04bc, 0x04bf, 0x04be, 0x0000, 0x04c2, 0x04c1, 0x04c4, 0x04c3, 0x04c6, 0x04c5, 0x04c8, 0x04c7, 0x04ca, 0x04c9, 0x04cc, 0x04cb, 0x04ce, 0x04cd, 0x0000, 0x04d1, 0x04d0, 0x04d3, 0x04d2, 0x04d5, 0x04d4, 0x04d7, 0x04d6, 0x04d9, 0x04d8, 0x04db, 0x04da, 0x04dd, 0x04dc, 0x04df, 0x04de, 0x04e1, 0x04e0, 0x04e3, 0x04e2, 0x04e5, 0x04e4, 0x04e7, 0x04e6, 0x04e9, 0x04e8, 0x04eb, 0x04ea, 0x04ed, 0x04ec, 0x04ef, 0x04ee, 0x04f1, 0x04f0, 0x04f3, 0x04f2, 0x04f5, 0x04f4, 0x0000, 0x0000, 0x04f9, 0x04f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 5, index 5 */ 0x0501, 0x0500, 0x0503, 0x0502, 0x0505, 0x0504, 0x0507, 0x0506, 0x0509, 0x0508, 0x050b, 0x050a, 0x050d, 0x050c, 0x050f, 0x050e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535, 0x0536, 0x0537, 0x0538, 0x0539, 0x053a, 0x053b, 0x053c, 0x053d, 0x053e, 0x053f, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0546, 0x0547, 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, 0x054e, 0x054f, 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, 0x1000044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 6, index 6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 9, index 7 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 10, index 8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 11, index 9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 12, index 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 13, index 11 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 14, index 12 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 15, index 13 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 16, index 14 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 19, index 15 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 23, index 16 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 24, index 17 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 25, index 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 30, index 19 */ 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06, 0x1e09, 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e, 0x1e11, 0x1e10, 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16, 0x1e19, 0x1e18, 0x1e1b, 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e, 0x1e21, 0x1e20, 0x1e23, 0x1e22, 0x1e25, 0x1e24, 0x1e27, 0x1e26, 0x1e29, 0x1e28, 0x1e2b, 0x1e2a, 0x1e2d, 0x1e2c, 0x1e2f, 0x1e2e, 0x1e31, 0x1e30, 0x1e33, 0x1e32, 0x1e35, 0x1e34, 0x1e37, 0x1e36, 0x1e39, 0x1e38, 0x1e3b, 0x1e3a, 0x1e3d, 0x1e3c, 0x1e3f, 0x1e3e, 0x1e41, 0x1e40, 0x1e43, 0x1e42, 0x1e45, 0x1e44, 0x1e47, 0x1e46, 0x1e49, 0x1e48, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4c, 0x1e4f, 0x1e4e, 0x1e51, 0x1e50, 0x1e53, 0x1e52, 0x1e55, 0x1e54, 0x1e57, 0x1e56, 0x1e59, 0x1e58, 0x1e5b, 0x1e5a, 0x1e5d, 0x1e5c, 0x1e5f, 0x1e5e, 0x1e61, 0x1e60, 0x1e63, 0x1e62, 0x1e65, 0x1e64, 0x1e67, 0x1e66, 0x1e69, 0x1e68, 0x1e6b, 0x1e6a, 0x1e6d, 0x1e6c, 0x1e6f, 0x1e6e, 0x1e71, 0x1e70, 0x1e73, 0x1e72, 0x1e75, 0x1e74, 0x1e77, 0x1e76, 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c, 0x1e7f, 0x1e7e, 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87, 0x1e86, 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e, 0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0x10000b6, 0x10000bf, 0x10000c8, 0x10000d1, 0x10000da, 0x1e60, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea1, 0x1ea0, 0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6, 0x1ea9, 0x1ea8, 0x1eab, 0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae, 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2, 0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6, 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd, 0x1ebc, 0x1ebf, 0x1ebe, 0x1ec1, 0x1ec0, 0x1ec3, 0x1ec2, 0x1ec5, 0x1ec4, 0x1ec7, 0x1ec6, 0x1ec9, 0x1ec8, 0x1ecb, 0x1eca, 0x1ecd, 0x1ecc, 0x1ecf, 0x1ece, 0x1ed1, 0x1ed0, 0x1ed3, 0x1ed2, 0x1ed5, 0x1ed4, 0x1ed7, 0x1ed6, 0x1ed9, 0x1ed8, 0x1edb, 0x1eda, 0x1edd, 0x1edc, 0x1edf, 0x1ede, 0x1ee1, 0x1ee0, 0x1ee3, 0x1ee2, 0x1ee5, 0x1ee4, 0x1ee7, 0x1ee6, 0x1ee9, 0x1ee8, 0x1eeb, 0x1eea, 0x1eed, 0x1eec, 0x1eef, 0x1eee, 0x1ef1, 0x1ef0, 0x1ef3, 0x1ef2, 0x1ef5, 0x1ef4, 0x1ef7, 0x1ef6, 0x1ef9, 0x1ef8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 31, index 20 */ 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0x0000, 0x0000, 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x0000, 0x0000, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x0000, 0x0000, 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, 0x10000e3, 0x1f59, 0x10000ee, 0x1f5b, 0x10000fd, 0x1f5d, 0x100010c, 0x1f5f, 0x0000, 0x1f51, 0x0000, 0x1f53, 0x0000, 0x1f55, 0x0000, 0x1f57, 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb, 0x0000, 0x0000, 0x10001b7, 0x10001c4, 0x10001d1, 0x10001de, 0x10001eb, 0x10001f8, 0x1000205, 0x1000212, 0x100021f, 0x1000229, 0x1000233, 0x100023d, 0x1000247, 0x1000251, 0x100025b, 0x1000265, 0x100026f, 0x100027c, 0x1000289, 0x1000296, 0x10002a3, 0x10002b0, 0x10002bd, 0x10002ca, 0x10002d7, 0x10002e1, 0x10002eb, 0x10002f5, 0x10002ff, 0x1000309, 0x1000313, 0x100031d, 0x1000327, 0x1000334, 0x1000341, 0x100034e, 0x100035b, 0x1000368, 0x1000375, 0x1000382, 0x100038f, 0x1000399, 0x10003a3, 0x10003ad, 0x10003b7, 0x10003c1, 0x10003cb, 0x10003d5, 0x1fb8, 0x1fb9, 0x100041e, 0x10003df, 0x100042b, 0x0000, 0x100011b, 0x1000466, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x10003eb, 0x0000, 0x0399, 0x0000, 0x0000, 0x0000, 0x1000436, 0x10003f4, 0x1000443, 0x0000, 0x1000126, 0x1000475, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1000400, 0x0000, 0x0000, 0x0000, 0x1fd8, 0x1fd9, 0x1000131, 0x1000140, 0x0000, 0x0000, 0x100014f, 0x100015a, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fe8, 0x1fe9, 0x1000169, 0x1000178, 0x1000187, 0x1fec, 0x1000192, 0x100019d, 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100044e, 0x1000409, 0x100045b, 0x0000, 0x10001ac, 0x1000484, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1000415, 0x0000, 0x0000, 0x0000 }, { /* page 33, index 21 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03c9, 0x0000, 0x0000, 0x0000, 0x006b, 0x00e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 251, index 22 */ 0x100000f, 0x1000016, 0x100001d, 0x1000024, 0x100002d, 0x1000036, 0x100003d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100004f, 0x100005a, 0x1000065, 0x1000070, 0x100007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 255, index 23 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 260, index 24 */ 0x10428, 0x10429, 0x1042a, 0x1042b, 0x1042c, 0x1042d, 0x1042e, 0x1042f, 0x10430, 0x10431, 0x10432, 0x10433, 0x10434, 0x10435, 0x10436, 0x10437, 0x10438, 0x10439, 0x1043a, 0x1043b, 0x1043c, 0x1043d, 0x1043e, 0x1043f, 0x10440, 0x10441, 0x10442, 0x10443, 0x10444, 0x10445, 0x10446, 0x10447, 0x10448, 0x10449, 0x1044a, 0x1044b, 0x1044c, 0x1044d, 0x1044e, 0x1044f, 0x10400, 0x10401, 0x10402, 0x10403, 0x10404, 0x10405, 0x10406, 0x10407, 0x10408, 0x10409, 0x1040a, 0x1040b, 0x1040c, 0x1040d, 0x1040e, 0x1040f, 0x10410, 0x10411, 0x10412, 0x10413, 0x10414, 0x10415, 0x10416, 0x10417, 0x10418, 0x10419, 0x1041a, 0x1041b, 0x1041c, 0x1041d, 0x1041e, 0x1041f, 0x10420, 0x10421, 0x10422, 0x10423, 0x10424, 0x10425, 0x10426, 0x10427, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 471, index 25 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009 } }; /* U+0000 through U+2FAFF */ static const gint16 attr_table_part1[763] = { 0 /* page 0 */, 1 /* page 1 */, 2 /* page 2 */, 3 /* page 3 */, 4 /* page 4 */, 5 /* page 5 */, 6 /* page 6 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 7 /* page 9 */, 8 /* page 10 */, 9 /* page 11 */, 10 /* page 12 */, 11 /* page 13 */, 12 /* page 14 */, 13 /* page 15 */, 14 /* page 16 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 15 /* page 19 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 16 /* page 23 */, 17 /* page 24 */, 18 /* page 25 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 19 /* page 30 */, 20 /* page 31 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 21 /* page 33 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 22 /* page 251 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 23 /* page 255 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 24 /* page 260 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 25 /* page 471 */, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX }; /* U+E0000 through U+10FFFF */ static const gint16 attr_table_part2[768] = { 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX, 0x0000 + G_UNICODE_MAX_TABLE_INDEX }; static const gunichar title_table[][3] = { { 0x01c5, 0x01c4, 0x01c6 }, { 0x01c8, 0x01c7, 0x01c9 }, { 0x01cb, 0x01ca, 0x01cc }, { 0x01f2, 0x01f1, 0x01f3 }, { 0x1f88, 0x0000, 0x1f80 }, { 0x1f89, 0x0000, 0x1f81 }, { 0x1f8a, 0x0000, 0x1f82 }, { 0x1f8b, 0x0000, 0x1f83 }, { 0x1f8c, 0x0000, 0x1f84 }, { 0x1f8d, 0x0000, 0x1f85 }, { 0x1f8e, 0x0000, 0x1f86 }, { 0x1f8f, 0x0000, 0x1f87 }, { 0x1f98, 0x0000, 0x1f90 }, { 0x1f99, 0x0000, 0x1f91 }, { 0x1f9a, 0x0000, 0x1f92 }, { 0x1f9b, 0x0000, 0x1f93 }, { 0x1f9c, 0x0000, 0x1f94 }, { 0x1f9d, 0x0000, 0x1f95 }, { 0x1f9e, 0x0000, 0x1f96 }, { 0x1f9f, 0x0000, 0x1f97 }, { 0x1fa8, 0x0000, 0x1fa0 }, { 0x1fa9, 0x0000, 0x1fa1 }, { 0x1faa, 0x0000, 0x1fa2 }, { 0x1fab, 0x0000, 0x1fa3 }, { 0x1fac, 0x0000, 0x1fa4 }, { 0x1fad, 0x0000, 0x1fa5 }, { 0x1fae, 0x0000, 0x1fa6 }, { 0x1faf, 0x0000, 0x1fa7 }, { 0x1fbc, 0x0000, 0x1fb3 }, { 0x1fcc, 0x0000, 0x1fc3 }, { 0x1ffc, 0x0000, 0x1ff3 } }; /* Table of special cases for case conversion; each record contains * First, the best single character mapping to lowercase if Lu, * and to uppercase if Ll, followed by the output mapping for the two cases * other than the case of the codepoint, in the order [Ll],[Lu],[Lt], * encoded in UTF-8, separated and terminated by a null character. */ static const gchar special_case_table[] = { "\x00\x53\x53\x00\x53\x73\0" /* offset 0 */ "\x69\x69\xcc\x87\x00\xc4\xb0\0" /* offset 7 */ "\x00\x46\x46\x00\x46\x66\0" /* offset 15 */ "\x00\x46\x49\x00\x46\x69\0" /* offset 22 */ "\x00\x46\x4c\x00\x46\x6c\0" /* offset 29 */ "\x00\x46\x46\x49\x00\x46\x66\x69\0" /* offset 36 */ "\x00\x46\x46\x4c\x00\x46\x66\x6c\0" /* offset 45 */ "\x00\x53\x54\x00\x53\x74\0" /* offset 54 */ "\x00\x53\x54\x00\x53\x74\0" /* offset 61 */ "\x00\xd4\xb5\xd5\x92\x00\xd4\xb5\xd6\x82\0" /* offset 68 */ "\x00\xd5\x84\xd5\x86\x00\xd5\x84\xd5\xb6\0" /* offset 79 */ "\x00\xd5\x84\xd4\xb5\x00\xd5\x84\xd5\xa5\0" /* offset 90 */ "\x00\xd5\x84\xd4\xbb\x00\xd5\x84\xd5\xab\0" /* offset 101 */ "\x00\xd5\x8e\xd5\x86\x00\xd5\x8e\xd5\xb6\0" /* offset 112 */ "\x00\xd5\x84\xd4\xbd\x00\xd5\x84\xd5\xad\0" /* offset 123 */ "\x00\xca\xbc\x4e\x00\xca\xbc\x4e\0" /* offset 134 */ "\x00\xce\x99\xcc\x88\xcc\x81\x00\xce\x99\xcc\x88\xcc\x81\0" /* offset 143 */ "\x00\xce\xa5\xcc\x88\xcc\x81\x00\xce\xa5\xcc\x88\xcc\x81\0" /* offset 158 */ "\x00\x4a\xcc\x8c\x00\x4a\xcc\x8c\0" /* offset 173 */ "\x00\x48\xcc\xb1\x00\x48\xcc\xb1\0" /* offset 182 */ "\x00\x54\xcc\x88\x00\x54\xcc\x88\0" /* offset 191 */ "\x00\x57\xcc\x8a\x00\x57\xcc\x8a\0" /* offset 200 */ "\x00\x59\xcc\x8a\x00\x59\xcc\x8a\0" /* offset 209 */ "\x00\x41\xca\xbe\x00\x41\xca\xbe\0" /* offset 218 */ "\x00\xce\xa5\xcc\x93\x00\xce\xa5\xcc\x93\0" /* offset 227 */ "\x00\xce\xa5\xcc\x93\xcc\x80\x00\xce\xa5\xcc\x93\xcc\x80\0" /* offset 238 */ "\x00\xce\xa5\xcc\x93\xcc\x81\x00\xce\xa5\xcc\x93\xcc\x81\0" /* offset 253 */ "\x00\xce\xa5\xcc\x93\xcd\x82\x00\xce\xa5\xcc\x93\xcd\x82\0" /* offset 268 */ "\x00\xce\x91\xcd\x82\x00\xce\x91\xcd\x82\0" /* offset 283 */ "\x00\xce\x97\xcd\x82\x00\xce\x97\xcd\x82\0" /* offset 294 */ "\x00\xce\x99\xcc\x88\xcc\x80\x00\xce\x99\xcc\x88\xcc\x80\0" /* offset 305 */ "\x00\xce\x99\xcc\x88\xcc\x81\x00\xce\x99\xcc\x88\xcc\x81\0" /* offset 320 */ "\x00\xce\x99\xcd\x82\x00\xce\x99\xcd\x82\0" /* offset 335 */ "\x00\xce\x99\xcc\x88\xcd\x82\x00\xce\x99\xcc\x88\xcd\x82\0" /* offset 346 */ "\x00\xce\xa5\xcc\x88\xcc\x80\x00\xce\xa5\xcc\x88\xcc\x80\0" /* offset 361 */ "\x00\xce\xa5\xcc\x88\xcc\x81\x00\xce\xa5\xcc\x88\xcc\x81\0" /* offset 376 */ "\x00\xce\xa1\xcc\x93\x00\xce\xa1\xcc\x93\0" /* offset 391 */ "\x00\xce\xa5\xcd\x82\x00\xce\xa5\xcd\x82\0" /* offset 402 */ "\x00\xce\xa5\xcc\x88\xcd\x82\x00\xce\xa5\xcc\x88\xcd\x82\0" /* offset 413 */ "\x00\xce\xa9\xcd\x82\x00\xce\xa9\xcd\x82\0" /* offset 428 */ "\xe1\xbe\x88\xe1\xbc\x88\xce\x99\x00\xe1\xbe\x88\0" /* offset 439 */ "\xe1\xbe\x89\xe1\xbc\x89\xce\x99\x00\xe1\xbe\x89\0" /* offset 452 */ "\xe1\xbe\x8a\xe1\xbc\x8a\xce\x99\x00\xe1\xbe\x8a\0" /* offset 465 */ "\xe1\xbe\x8b\xe1\xbc\x8b\xce\x99\x00\xe1\xbe\x8b\0" /* offset 478 */ "\xe1\xbe\x8c\xe1\xbc\x8c\xce\x99\x00\xe1\xbe\x8c\0" /* offset 491 */ "\xe1\xbe\x8d\xe1\xbc\x8d\xce\x99\x00\xe1\xbe\x8d\0" /* offset 504 */ "\xe1\xbe\x8e\xe1\xbc\x8e\xce\x99\x00\xe1\xbe\x8e\0" /* offset 517 */ "\xe1\xbe\x8f\xe1\xbc\x8f\xce\x99\x00\xe1\xbe\x8f\0" /* offset 530 */ "\xe1\xbe\x80\x00\xe1\xbc\x88\xce\x99\0" /* offset 543 */ "\xe1\xbe\x81\x00\xe1\xbc\x89\xce\x99\0" /* offset 553 */ "\xe1\xbe\x82\x00\xe1\xbc\x8a\xce\x99\0" /* offset 563 */ "\xe1\xbe\x83\x00\xe1\xbc\x8b\xce\x99\0" /* offset 573 */ "\xe1\xbe\x84\x00\xe1\xbc\x8c\xce\x99\0" /* offset 583 */ "\xe1\xbe\x85\x00\xe1\xbc\x8d\xce\x99\0" /* offset 593 */ "\xe1\xbe\x86\x00\xe1\xbc\x8e\xce\x99\0" /* offset 603 */ "\xe1\xbe\x87\x00\xe1\xbc\x8f\xce\x99\0" /* offset 613 */ "\xe1\xbe\x98\xe1\xbc\xa8\xce\x99\x00\xe1\xbe\x98\0" /* offset 623 */ "\xe1\xbe\x99\xe1\xbc\xa9\xce\x99\x00\xe1\xbe\x99\0" /* offset 636 */ "\xe1\xbe\x9a\xe1\xbc\xaa\xce\x99\x00\xe1\xbe\x9a\0" /* offset 649 */ "\xe1\xbe\x9b\xe1\xbc\xab\xce\x99\x00\xe1\xbe\x9b\0" /* offset 662 */ "\xe1\xbe\x9c\xe1\xbc\xac\xce\x99\x00\xe1\xbe\x9c\0" /* offset 675 */ "\xe1\xbe\x9d\xe1\xbc\xad\xce\x99\x00\xe1\xbe\x9d\0" /* offset 688 */ "\xe1\xbe\x9e\xe1\xbc\xae\xce\x99\x00\xe1\xbe\x9e\0" /* offset 701 */ "\xe1\xbe\x9f\xe1\xbc\xaf\xce\x99\x00\xe1\xbe\x9f\0" /* offset 714 */ "\xe1\xbe\x90\x00\xe1\xbc\xa8\xce\x99\0" /* offset 727 */ "\xe1\xbe\x91\x00\xe1\xbc\xa9\xce\x99\0" /* offset 737 */ "\xe1\xbe\x92\x00\xe1\xbc\xaa\xce\x99\0" /* offset 747 */ "\xe1\xbe\x93\x00\xe1\xbc\xab\xce\x99\0" /* offset 757 */ "\xe1\xbe\x94\x00\xe1\xbc\xac\xce\x99\0" /* offset 767 */ "\xe1\xbe\x95\x00\xe1\xbc\xad\xce\x99\0" /* offset 777 */ "\xe1\xbe\x96\x00\xe1\xbc\xae\xce\x99\0" /* offset 787 */ "\xe1\xbe\x97\x00\xe1\xbc\xaf\xce\x99\0" /* offset 797 */ "\xe1\xbe\xa8\xe1\xbd\xa8\xce\x99\x00\xe1\xbe\xa8\0" /* offset 807 */ "\xe1\xbe\xa9\xe1\xbd\xa9\xce\x99\x00\xe1\xbe\xa9\0" /* offset 820 */ "\xe1\xbe\xaa\xe1\xbd\xaa\xce\x99\x00\xe1\xbe\xaa\0" /* offset 833 */ "\xe1\xbe\xab\xe1\xbd\xab\xce\x99\x00\xe1\xbe\xab\0" /* offset 846 */ "\xe1\xbe\xac\xe1\xbd\xac\xce\x99\x00\xe1\xbe\xac\0" /* offset 859 */ "\xe1\xbe\xad\xe1\xbd\xad\xce\x99\x00\xe1\xbe\xad\0" /* offset 872 */ "\xe1\xbe\xae\xe1\xbd\xae\xce\x99\x00\xe1\xbe\xae\0" /* offset 885 */ "\xe1\xbe\xaf\xe1\xbd\xaf\xce\x99\x00\xe1\xbe\xaf\0" /* offset 898 */ "\xe1\xbe\xa0\x00\xe1\xbd\xa8\xce\x99\0" /* offset 911 */ "\xe1\xbe\xa1\x00\xe1\xbd\xa9\xce\x99\0" /* offset 921 */ "\xe1\xbe\xa2\x00\xe1\xbd\xaa\xce\x99\0" /* offset 931 */ "\xe1\xbe\xa3\x00\xe1\xbd\xab\xce\x99\0" /* offset 941 */ "\xe1\xbe\xa4\x00\xe1\xbd\xac\xce\x99\0" /* offset 951 */ "\xe1\xbe\xa5\x00\xe1\xbd\xad\xce\x99\0" /* offset 961 */ "\xe1\xbe\xa6\x00\xe1\xbd\xae\xce\x99\0" /* offset 971 */ "\xe1\xbe\xa7\x00\xe1\xbd\xaf\xce\x99\0" /* offset 981 */ "\xe1\xbe\xbc\xce\x91\xce\x99\x00\xe1\xbe\xbc\0" /* offset 991 */ "\xe1\xbe\xb3\x00\xce\x91\xce\x99\0" /* offset 1003 */ "\xe1\xbf\x8c\xce\x97\xce\x99\x00\xe1\xbf\x8c\0" /* offset 1012 */ "\xe1\xbf\x83\x00\xce\x97\xce\x99\0" /* offset 1024 */ "\xe1\xbf\xbc\xce\xa9\xce\x99\x00\xe1\xbf\xbc\0" /* offset 1033 */ "\xe1\xbf\xb3\x00\xce\xa9\xce\x99\0" /* offset 1045 */ "\x00\xe1\xbe\xba\xce\x99\x00\xe1\xbe\xba\xcd\x85\0" /* offset 1054 */ "\x00\xce\x86\xce\x99\x00\xce\x86\xcd\x85\0" /* offset 1067 */ "\x00\xe1\xbf\x8a\xce\x99\x00\xe1\xbf\x8a\xcd\x85\0" /* offset 1078 */ "\x00\xce\x89\xce\x99\x00\xce\x89\xcd\x85\0" /* offset 1091 */ "\x00\xe1\xbf\xba\xce\x99\x00\xe1\xbf\xba\xcd\x85\0" /* offset 1102 */ "\x00\xce\x8f\xce\x99\x00\xce\x8f\xcd\x85\0" /* offset 1115 */ "\x00\xce\x91\xcd\x82\xce\x99\x00\xce\x91\xcd\x82\xcd\x85\0" /* offset 1126 */ "\x00\xce\x97\xcd\x82\xce\x99\x00\xce\x97\xcd\x82\xcd\x85\0" /* offset 1141 */ "\x00\xce\xa9\xcd\x82\xce\x99\x00\xce\xa9\xcd\x82\xcd\x85\0" /* offset 1156 */ }; /* Table of casefolding cases that can't be derived by lowercasing */ static const struct { guint16 ch; gchar data[7]; } casefold_table[] = { { 0x00b5, "\xce\xbc" }, { 0x00df, "\x73\x73" }, { 0x0130, "\x69\xcc\x87" }, { 0x0149, "\xca\xbc\x6e" }, { 0x017f, "\x73" }, { 0x01f0, "\x6a\xcc\x8c" }, { 0x0345, "\xce\xb9" }, { 0x0390, "\xce\xb9\xcc\x88\xcc\x81" }, { 0x03b0, "\xcf\x85\xcc\x88\xcc\x81" }, { 0x03c2, "\xcf\x83" }, { 0x03d0, "\xce\xb2" }, { 0x03d1, "\xce\xb8" }, { 0x03d5, "\xcf\x86" }, { 0x03d6, "\xcf\x80" }, { 0x03f0, "\xce\xba" }, { 0x03f1, "\xcf\x81" }, { 0x03f5, "\xce\xb5" }, { 0x0587, "\xd5\xa5\xd6\x82" }, { 0x1e96, "\x68\xcc\xb1" }, { 0x1e97, "\x74\xcc\x88" }, { 0x1e98, "\x77\xcc\x8a" }, { 0x1e99, "\x79\xcc\x8a" }, { 0x1e9a, "\x61\xca\xbe" }, { 0x1e9b, "\xe1\xb9\xa1" }, { 0x1f50, "\xcf\x85\xcc\x93" }, { 0x1f52, "\xcf\x85\xcc\x93\xcc\x80" }, { 0x1f54, "\xcf\x85\xcc\x93\xcc\x81" }, { 0x1f56, "\xcf\x85\xcc\x93\xcd\x82" }, { 0x1f80, "\xe1\xbc\x80\xce\xb9" }, { 0x1f81, "\xe1\xbc\x81\xce\xb9" }, { 0x1f82, "\xe1\xbc\x82\xce\xb9" }, { 0x1f83, "\xe1\xbc\x83\xce\xb9" }, { 0x1f84, "\xe1\xbc\x84\xce\xb9" }, { 0x1f85, "\xe1\xbc\x85\xce\xb9" }, { 0x1f86, "\xe1\xbc\x86\xce\xb9" }, { 0x1f87, "\xe1\xbc\x87\xce\xb9" }, { 0x1f88, "\xe1\xbc\x80\xce\xb9" }, { 0x1f89, "\xe1\xbc\x81\xce\xb9" }, { 0x1f8a, "\xe1\xbc\x82\xce\xb9" }, { 0x1f8b, "\xe1\xbc\x83\xce\xb9" }, { 0x1f8c, "\xe1\xbc\x84\xce\xb9" }, { 0x1f8d, "\xe1\xbc\x85\xce\xb9" }, { 0x1f8e, "\xe1\xbc\x86\xce\xb9" }, { 0x1f8f, "\xe1\xbc\x87\xce\xb9" }, { 0x1f90, "\xe1\xbc\xa0\xce\xb9" }, { 0x1f91, "\xe1\xbc\xa1\xce\xb9" }, { 0x1f92, "\xe1\xbc\xa2\xce\xb9" }, { 0x1f93, "\xe1\xbc\xa3\xce\xb9" }, { 0x1f94, "\xe1\xbc\xa4\xce\xb9" }, { 0x1f95, "\xe1\xbc\xa5\xce\xb9" }, { 0x1f96, "\xe1\xbc\xa6\xce\xb9" }, { 0x1f97, "\xe1\xbc\xa7\xce\xb9" }, { 0x1f98, "\xe1\xbc\xa0\xce\xb9" }, { 0x1f99, "\xe1\xbc\xa1\xce\xb9" }, { 0x1f9a, "\xe1\xbc\xa2\xce\xb9" }, { 0x1f9b, "\xe1\xbc\xa3\xce\xb9" }, { 0x1f9c, "\xe1\xbc\xa4\xce\xb9" }, { 0x1f9d, "\xe1\xbc\xa5\xce\xb9" }, { 0x1f9e, "\xe1\xbc\xa6\xce\xb9" }, { 0x1f9f, "\xe1\xbc\xa7\xce\xb9" }, { 0x1fa0, "\xe1\xbd\xa0\xce\xb9" }, { 0x1fa1, "\xe1\xbd\xa1\xce\xb9" }, { 0x1fa2, "\xe1\xbd\xa2\xce\xb9" }, { 0x1fa3, "\xe1\xbd\xa3\xce\xb9" }, { 0x1fa4, "\xe1\xbd\xa4\xce\xb9" }, { 0x1fa5, "\xe1\xbd\xa5\xce\xb9" }, { 0x1fa6, "\xe1\xbd\xa6\xce\xb9" }, { 0x1fa7, "\xe1\xbd\xa7\xce\xb9" }, { 0x1fa8, "\xe1\xbd\xa0\xce\xb9" }, { 0x1fa9, "\xe1\xbd\xa1\xce\xb9" }, { 0x1faa, "\xe1\xbd\xa2\xce\xb9" }, { 0x1fab, "\xe1\xbd\xa3\xce\xb9" }, { 0x1fac, "\xe1\xbd\xa4\xce\xb9" }, { 0x1fad, "\xe1\xbd\xa5\xce\xb9" }, { 0x1fae, "\xe1\xbd\xa6\xce\xb9" }, { 0x1faf, "\xe1\xbd\xa7\xce\xb9" }, { 0x1fb2, "\xe1\xbd\xb0\xce\xb9" }, { 0x1fb3, "\xce\xb1\xce\xb9" }, { 0x1fb4, "\xce\xac\xce\xb9" }, { 0x1fb6, "\xce\xb1\xcd\x82" }, { 0x1fb7, "\xce\xb1\xcd\x82\xce\xb9" }, { 0x1fbc, "\xce\xb1\xce\xb9" }, { 0x1fbe, "\xce\xb9" }, { 0x1fc2, "\xe1\xbd\xb4\xce\xb9" }, { 0x1fc3, "\xce\xb7\xce\xb9" }, { 0x1fc4, "\xce\xae\xce\xb9" }, { 0x1fc6, "\xce\xb7\xcd\x82" }, { 0x1fc7, "\xce\xb7\xcd\x82\xce\xb9" }, { 0x1fcc, "\xce\xb7\xce\xb9" }, { 0x1fd2, "\xce\xb9\xcc\x88\xcc\x80" }, { 0x1fd3, "\xce\xb9\xcc\x88\xcc\x81" }, { 0x1fd6, "\xce\xb9\xcd\x82" }, { 0x1fd7, "\xce\xb9\xcc\x88\xcd\x82" }, { 0x1fe2, "\xcf\x85\xcc\x88\xcc\x80" }, { 0x1fe3, "\xcf\x85\xcc\x88\xcc\x81" }, { 0x1fe4, "\xcf\x81\xcc\x93" }, { 0x1fe6, "\xcf\x85\xcd\x82" }, { 0x1fe7, "\xcf\x85\xcc\x88\xcd\x82" }, { 0x1ff2, "\xe1\xbd\xbc\xce\xb9" }, { 0x1ff3, "\xcf\x89\xce\xb9" }, { 0x1ff4, "\xcf\x8e\xce\xb9" }, { 0x1ff6, "\xcf\x89\xcd\x82" }, { 0x1ff7, "\xcf\x89\xcd\x82\xce\xb9" }, { 0x1ffc, "\xcf\x89\xce\xb9" }, { 0x2160, "\xe2\x85\xb0" }, { 0x2161, "\xe2\x85\xb1" }, { 0x2162, "\xe2\x85\xb2" }, { 0x2163, "\xe2\x85\xb3" }, { 0x2164, "\xe2\x85\xb4" }, { 0x2165, "\xe2\x85\xb5" }, { 0x2166, "\xe2\x85\xb6" }, { 0x2167, "\xe2\x85\xb7" }, { 0x2168, "\xe2\x85\xb8" }, { 0x2169, "\xe2\x85\xb9" }, { 0x216a, "\xe2\x85\xba" }, { 0x216b, "\xe2\x85\xbb" }, { 0x216c, "\xe2\x85\xbc" }, { 0x216d, "\xe2\x85\xbd" }, { 0x216e, "\xe2\x85\xbe" }, { 0x216f, "\xe2\x85\xbf" }, { 0x24b6, "\xe2\x93\x90" }, { 0x24b7, "\xe2\x93\x91" }, { 0x24b8, "\xe2\x93\x92" }, { 0x24b9, "\xe2\x93\x93" }, { 0x24ba, "\xe2\x93\x94" }, { 0x24bb, "\xe2\x93\x95" }, { 0x24bc, "\xe2\x93\x96" }, { 0x24bd, "\xe2\x93\x97" }, { 0x24be, "\xe2\x93\x98" }, { 0x24bf, "\xe2\x93\x99" }, { 0x24c0, "\xe2\x93\x9a" }, { 0x24c1, "\xe2\x93\x9b" }, { 0x24c2, "\xe2\x93\x9c" }, { 0x24c3, "\xe2\x93\x9d" }, { 0x24c4, "\xe2\x93\x9e" }, { 0x24c5, "\xe2\x93\x9f" }, { 0x24c6, "\xe2\x93\xa0" }, { 0x24c7, "\xe2\x93\xa1" }, { 0x24c8, "\xe2\x93\xa2" }, { 0x24c9, "\xe2\x93\xa3" }, { 0x24ca, "\xe2\x93\xa4" }, { 0x24cb, "\xe2\x93\xa5" }, { 0x24cc, "\xe2\x93\xa6" }, { 0x24cd, "\xe2\x93\xa7" }, { 0x24ce, "\xe2\x93\xa8" }, { 0x24cf, "\xe2\x93\xa9" }, { 0xfb00, "\x66\x66" }, { 0xfb01, "\x66\x69" }, { 0xfb02, "\x66\x6c" }, { 0xfb03, "\x66\x66\x69" }, { 0xfb04, "\x66\x66\x6c" }, { 0xfb05, "\x73\x74" }, { 0xfb06, "\x73\x74" }, { 0xfb13, "\xd5\xb4\xd5\xb6" }, { 0xfb14, "\xd5\xb4\xd5\xa5" }, { 0xfb15, "\xd5\xb4\xd5\xab" }, { 0xfb16, "\xd5\xbe\xd5\xb6" }, { 0xfb17, "\xd5\xb4\xd5\xad" }, }; static const struct { gunichar ch; gunichar mirrored_ch; } bidi_mirroring_table[] = { { 0x0028, 0x0029 }, { 0x0029, 0x0028 }, { 0x003c, 0x003e }, { 0x003e, 0x003c }, { 0x005b, 0x005d }, { 0x005d, 0x005b }, { 0x007b, 0x007d }, { 0x007d, 0x007b }, { 0x00ab, 0x00bb }, { 0x00bb, 0x00ab }, { 0x2039, 0x203a }, { 0x203a, 0x2039 }, { 0x2045, 0x2046 }, { 0x2046, 0x2045 }, { 0x207d, 0x207e }, { 0x207e, 0x207d }, { 0x208d, 0x208e }, { 0x208e, 0x208d }, { 0x2208, 0x220b }, { 0x2209, 0x220c }, { 0x220a, 0x220d }, { 0x220b, 0x2208 }, { 0x220c, 0x2209 }, { 0x220d, 0x220a }, { 0x2215, 0x29f5 }, { 0x223c, 0x223d }, { 0x223d, 0x223c }, { 0x2243, 0x22cd }, { 0x2252, 0x2253 }, { 0x2253, 0x2252 }, { 0x2254, 0x2255 }, { 0x2255, 0x2254 }, { 0x2264, 0x2265 }, { 0x2265, 0x2264 }, { 0x2266, 0x2267 }, { 0x2267, 0x2266 }, { 0x2268, 0x2269 }, { 0x2269, 0x2268 }, { 0x226a, 0x226b }, { 0x226b, 0x226a }, { 0x226e, 0x226f }, { 0x226f, 0x226e }, { 0x2270, 0x2271 }, { 0x2271, 0x2270 }, { 0x2272, 0x2273 }, { 0x2273, 0x2272 }, { 0x2274, 0x2275 }, { 0x2275, 0x2274 }, { 0x2276, 0x2277 }, { 0x2277, 0x2276 }, { 0x2278, 0x2279 }, { 0x2279, 0x2278 }, { 0x227a, 0x227b }, { 0x227b, 0x227a }, { 0x227c, 0x227d }, { 0x227d, 0x227c }, { 0x227e, 0x227f }, { 0x227f, 0x227e }, { 0x2280, 0x2281 }, { 0x2281, 0x2280 }, { 0x2282, 0x2283 }, { 0x2283, 0x2282 }, { 0x2284, 0x2285 }, { 0x2285, 0x2284 }, { 0x2286, 0x2287 }, { 0x2287, 0x2286 }, { 0x2288, 0x2289 }, { 0x2289, 0x2288 }, { 0x228a, 0x228b }, { 0x228b, 0x228a }, { 0x228f, 0x2290 }, { 0x2290, 0x228f }, { 0x2291, 0x2292 }, { 0x2292, 0x2291 }, { 0x2298, 0x29b8 }, { 0x22a2, 0x22a3 }, { 0x22a3, 0x22a2 }, { 0x22a6, 0x2ade }, { 0x22a8, 0x2ae4 }, { 0x22a9, 0x2ae3 }, { 0x22ab, 0x2ae5 }, { 0x22b0, 0x22b1 }, { 0x22b1, 0x22b0 }, { 0x22b2, 0x22b3 }, { 0x22b3, 0x22b2 }, { 0x22b4, 0x22b5 }, { 0x22b5, 0x22b4 }, { 0x22b6, 0x22b7 }, { 0x22b7, 0x22b6 }, { 0x22c9, 0x22ca }, { 0x22ca, 0x22c9 }, { 0x22cb, 0x22cc }, { 0x22cc, 0x22cb }, { 0x22cd, 0x2243 }, { 0x22d0, 0x22d1 }, { 0x22d1, 0x22d0 }, { 0x22d6, 0x22d7 }, { 0x22d7, 0x22d6 }, { 0x22d8, 0x22d9 }, { 0x22d9, 0x22d8 }, { 0x22da, 0x22db }, { 0x22db, 0x22da }, { 0x22dc, 0x22dd }, { 0x22dd, 0x22dc }, { 0x22de, 0x22df }, { 0x22df, 0x22de }, { 0x22e0, 0x22e1 }, { 0x22e1, 0x22e0 }, { 0x22e2, 0x22e3 }, { 0x22e3, 0x22e2 }, { 0x22e4, 0x22e5 }, { 0x22e5, 0x22e4 }, { 0x22e6, 0x22e7 }, { 0x22e7, 0x22e6 }, { 0x22e8, 0x22e9 }, { 0x22e9, 0x22e8 }, { 0x22ea, 0x22eb }, { 0x22eb, 0x22ea }, { 0x22ec, 0x22ed }, { 0x22ed, 0x22ec }, { 0x22f0, 0x22f1 }, { 0x22f1, 0x22f0 }, { 0x22f2, 0x22fa }, { 0x22f3, 0x22fb }, { 0x22f4, 0x22fc }, { 0x22f6, 0x22fd }, { 0x22f7, 0x22fe }, { 0x22fa, 0x22f2 }, { 0x22fb, 0x22f3 }, { 0x22fc, 0x22f4 }, { 0x22fd, 0x22f6 }, { 0x22fe, 0x22f7 }, { 0x2308, 0x2309 }, { 0x2309, 0x2308 }, { 0x230a, 0x230b }, { 0x230b, 0x230a }, { 0x2329, 0x232a }, { 0x232a, 0x2329 }, { 0x2768, 0x2769 }, { 0x2769, 0x2768 }, { 0x276a, 0x276b }, { 0x276b, 0x276a }, { 0x276c, 0x276d }, { 0x276d, 0x276c }, { 0x276e, 0x276f }, { 0x276f, 0x276e }, { 0x2770, 0x2771 }, { 0x2771, 0x2770 }, { 0x2772, 0x2773 }, { 0x2773, 0x2772 }, { 0x2774, 0x2775 }, { 0x2775, 0x2774 }, { 0x27d5, 0x27d6 }, { 0x27d6, 0x27d5 }, { 0x27dd, 0x27de }, { 0x27de, 0x27dd }, { 0x27e2, 0x27e3 }, { 0x27e3, 0x27e2 }, { 0x27e4, 0x27e5 }, { 0x27e5, 0x27e4 }, { 0x27e6, 0x27e7 }, { 0x27e7, 0x27e6 }, { 0x27e8, 0x27e9 }, { 0x27e9, 0x27e8 }, { 0x27ea, 0x27eb }, { 0x27eb, 0x27ea }, { 0x2983, 0x2984 }, { 0x2984, 0x2983 }, { 0x2985, 0x2986 }, { 0x2986, 0x2985 }, { 0x2987, 0x2988 }, { 0x2988, 0x2987 }, { 0x2989, 0x298a }, { 0x298a, 0x2989 }, { 0x298b, 0x298c }, { 0x298c, 0x298b }, { 0x298d, 0x2990 }, { 0x298e, 0x298f }, { 0x298f, 0x298e }, { 0x2990, 0x298d }, { 0x2991, 0x2992 }, { 0x2992, 0x2991 }, { 0x2993, 0x2994 }, { 0x2994, 0x2993 }, { 0x2995, 0x2996 }, { 0x2996, 0x2995 }, { 0x2997, 0x2998 }, { 0x2998, 0x2997 }, { 0x29b8, 0x2298 }, { 0x29c0, 0x29c1 }, { 0x29c1, 0x29c0 }, { 0x29c4, 0x29c5 }, { 0x29c5, 0x29c4 }, { 0x29cf, 0x29d0 }, { 0x29d0, 0x29cf }, { 0x29d1, 0x29d2 }, { 0x29d2, 0x29d1 }, { 0x29d4, 0x29d5 }, { 0x29d5, 0x29d4 }, { 0x29d8, 0x29d9 }, { 0x29d9, 0x29d8 }, { 0x29da, 0x29db }, { 0x29db, 0x29da }, { 0x29f5, 0x2215 }, { 0x29f8, 0x29f9 }, { 0x29f9, 0x29f8 }, { 0x29fc, 0x29fd }, { 0x29fd, 0x29fc }, { 0x2a2b, 0x2a2c }, { 0x2a2c, 0x2a2b }, { 0x2a2d, 0x2a2c }, { 0x2a2e, 0x2a2d }, { 0x2a34, 0x2a35 }, { 0x2a35, 0x2a34 }, { 0x2a3c, 0x2a3d }, { 0x2a3d, 0x2a3c }, { 0x2a64, 0x2a65 }, { 0x2a65, 0x2a64 }, { 0x2a79, 0x2a7a }, { 0x2a7a, 0x2a79 }, { 0x2a7d, 0x2a7e }, { 0x2a7e, 0x2a7d }, { 0x2a7f, 0x2a80 }, { 0x2a80, 0x2a7f }, { 0x2a81, 0x2a82 }, { 0x2a82, 0x2a81 }, { 0x2a83, 0x2a84 }, { 0x2a84, 0x2a83 }, { 0x2a8b, 0x2a8c }, { 0x2a8c, 0x2a8b }, { 0x2a91, 0x2a92 }, { 0x2a92, 0x2a91 }, { 0x2a93, 0x2a94 }, { 0x2a94, 0x2a93 }, { 0x2a95, 0x2a96 }, { 0x2a96, 0x2a95 }, { 0x2a97, 0x2a98 }, { 0x2a98, 0x2a97 }, { 0x2a99, 0x2a9a }, { 0x2a9a, 0x2a99 }, { 0x2a9b, 0x2a9c }, { 0x2a9c, 0x2a9b }, { 0x2aa1, 0x2aa2 }, { 0x2aa2, 0x2aa1 }, { 0x2aa6, 0x2aa7 }, { 0x2aa7, 0x2aa6 }, { 0x2aa8, 0x2aa9 }, { 0x2aa9, 0x2aa8 }, { 0x2aaa, 0x2aab }, { 0x2aab, 0x2aaa }, { 0x2aac, 0x2aad }, { 0x2aad, 0x2aac }, { 0x2aaf, 0x2ab0 }, { 0x2ab0, 0x2aaf }, { 0x2ab3, 0x2ab4 }, { 0x2ab4, 0x2ab3 }, { 0x2abb, 0x2abc }, { 0x2abc, 0x2abb }, { 0x2abd, 0x2abe }, { 0x2abe, 0x2abd }, { 0x2abf, 0x2ac0 }, { 0x2ac0, 0x2abf }, { 0x2ac1, 0x2ac2 }, { 0x2ac2, 0x2ac1 }, { 0x2ac3, 0x2ac4 }, { 0x2ac4, 0x2ac3 }, { 0x2ac5, 0x2ac6 }, { 0x2ac6, 0x2ac5 }, { 0x2acd, 0x2ace }, { 0x2ace, 0x2acd }, { 0x2acf, 0x2ad0 }, { 0x2ad0, 0x2acf }, { 0x2ad1, 0x2ad2 }, { 0x2ad2, 0x2ad1 }, { 0x2ad3, 0x2ad4 }, { 0x2ad4, 0x2ad3 }, { 0x2ad5, 0x2ad6 }, { 0x2ad6, 0x2ad5 }, { 0x2ade, 0x22a6 }, { 0x2ae3, 0x22a9 }, { 0x2ae4, 0x22a8 }, { 0x2ae5, 0x22ab }, { 0x2aec, 0x2aed }, { 0x2aed, 0x2aec }, { 0x2af7, 0x2af8 }, { 0x2af8, 0x2af7 }, { 0x2af9, 0x2afa }, { 0x2afa, 0x2af9 }, { 0x3008, 0x3009 }, { 0x3009, 0x3008 }, { 0x300a, 0x300b }, { 0x300b, 0x300a }, { 0x300c, 0x300d }, { 0x300d, 0x300c }, { 0x300e, 0x300f }, { 0x300f, 0x300e }, { 0x3010, 0x3011 }, { 0x3011, 0x3010 }, { 0x3014, 0x3015 }, { 0x3015, 0x3014 }, { 0x3016, 0x3017 }, { 0x3017, 0x3016 }, { 0x3018, 0x3019 }, { 0x3019, 0x3018 }, { 0x301a, 0x301b }, { 0x301b, 0x301a }, { 0xff08, 0xff09 }, { 0xff09, 0xff08 }, { 0xff1c, 0xff1e }, { 0xff1e, 0xff1c }, { 0xff3b, 0xff3d }, { 0xff3d, 0xff3b }, { 0xff5b, 0xff5d }, { 0xff5d, 0xff5b }, { 0xff5f, 0xff60 }, { 0xff60, 0xff5f }, { 0xff62, 0xff63 }, { 0xff63, 0xff62 } }; #endif /* CHARTABLES_H */ clucene-core-2.3.3.4/src/shared/CLucene/config/_threads.h000066400000000000000000000077631154025176300230300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _config_threads_h #define _config_threads_h #ifndef _CL_DISABLE_MULTITHREADING #if defined(_LUCENE_DONTIMPLEMENT_THREADMUTEX) //do nothing #elif defined(_CL_HAVE_WIN32_THREADS) //we have not explicity included windows.h and windows.h has //not been included (check _WINBASE_), then we must define //our own definitions to the thread locking functions: #ifndef _WINBASE_ extern "C"{ struct CRITICAL_SECTION { struct critical_section_debug * DebugInfo; long LockCount; long RecursionCount; void * OwningThread; void * LockSemaphore; _cl_dword_t SpinCount; }; __declspec(dllimport) void __stdcall InitializeCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall EnterCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall LeaveCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall DeleteCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall ExitThread(_cl_dword_t); __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(); #ifdef _M_X64 __declspec(dllimport) long long __stdcall _InterlockedIncrement64(__inout long long volatile*); __declspec(dllimport) long long __stdcall _InterlockedDecrement64(__inout long long volatile*); #else __declspec(dllimport) long __stdcall InterlockedIncrement(long volatile*); __declspec(dllimport) long __stdcall InterlockedDecrement(long volatile*); #endif typedef struct _SECURITY_ATTRIBUTES { _cl_dword_t nLength; void* lpSecurityDescriptor; bool bInheritHandle; } SECURITY_ATTRIBUTES; __declspec(dllimport) _cl_dword_t __stdcall WaitForSingleObject( void* hHandle, _cl_dword_t dwMilliseconds ); __declspec(dllimport) void* __stdcall CreateEventA( SECURITY_ATTRIBUTES* lpEventAttributes, bool bManualReset, bool bInitialState, char* lpName ); __declspec(dllimport) bool __stdcall SetEvent(void* hEvent); __declspec(dllimport) bool __stdcall CloseHandle(void* hObject); void* _beginthread( void( __stdcall *start_address )( void * ), unsigned stack_size, void *arglist ); } #endif //_WINBASE_ #elif defined(_CL_HAVE_PTHREAD) #include #endif #endif CL_NS_DEF(util) #ifndef _CL_DISABLE_MULTITHREADING #if defined(_LUCENE_DONTIMPLEMENT_THREADMUTEX) #elif defined(_CL_HAVE_WIN32_THREADS) class CLuceneThreadIdCompare { public: enum { // parameters for hash table bucket_size = 4, // 0 < bucket_size min_buckets = 8 }; // min_buckets = 2 ^^ N, 0 < N bool operator()( uint64_t t1, uint64_t t2 ) const{ return t1 < t2; } }; #elif defined(_CL_HAVE_PTHREAD) class CLuceneThreadIdCompare { public: enum { // parameters for hash table bucket_size = 4, // 0 < bucket_size min_buckets = 8 }; // min_buckets = 2 ^^ N, 0 < N bool operator()( pthread_t t1, pthread_t t2 ) const{ //pthread_equal should be used, but it returns only non-zero if equal, so we can't use it for order compare return t1 < t2; } }; #endif //thread impl choice #else //!_CL_DISABLE_MULTITHREADING class CLuceneThreadIdCompare { public: enum { // parameters for hash table bucket_size = 4, // 0 < bucket_size min_buckets = 8 }; // min_buckets = 2 ^^ N, 0 < N bool operator()( char t1, char t2 ) const{ return t1 < t2; } }; #endif //!_CL_DISABLE_MULTITHREADING CL_NS_END #endif //_config_threads_h clucene-core-2.3.3.4/src/shared/CLucene/config/gunichartables.cpp000066400000000000000000000246171154025176300245620ustar00rootroot00000000000000/* * Copyright (C) 1999 Tom Tromey * Copyright (C) 2000 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * 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. * * ************************************************ * Also licensed with permission from Tom Tromey * and Owen Taylor under the Apache license. * Original location: * http://cvs.gnome.org/viewcvs/glib/glib/guniprop.c?view=log ************************************************ * * Copyright 2003-2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_SharedHeader.h" typedef unsigned long gunichar; typedef unsigned short guint16; typedef short gint16; typedef char gchar; typedef unsigned char guchar; /* These are the possible character classifications. * See http://www.unicode.org/Public/UNIDATA/UnicodeData.txt or http://www.unicode.org/Public/UNIDATA/UCD.html. todo: i think there is a new version of the unicode, which we should use. data is licensed like this: http://www.unicode.org/copyright.html... not sure but looks apache compatible */ typedef enum { G_UNICODE_CONTROL, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_PRIVATE_USE, G_UNICODE_SURROGATE, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_COMBINING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LINE_SEPARATOR, G_UNICODE_PARAGRAPH_SEPARATOR, G_UNICODE_SPACE_SEPARATOR } GUnicodeType; #include "_gunichartables.h" #define ATTR_TABLE(Page) (((Page) <= G_UNICODE_LAST_PAGE_PART1) \ ? attr_table_part1[Page] \ : attr_table_part2[(Page) - 0xe00]) #define ATTTABLE(Page, Char) \ ((ATTR_TABLE(Page) == G_UNICODE_MAX_TABLE_INDEX) ? 0 : (attr_data[ATTR_TABLE(Page)][Char])) #define TTYPE_PART1(Page, Char) \ ((type_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (type_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (type_data[type_table_part1[Page]][Char])) #define TTYPE_PART2(Page, Char) \ ((type_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (type_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (type_data[type_table_part2[Page]][Char])) #define TYPE(Char) \ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ ? TTYPE_PART1 ((Char) >> 8, (Char) & 0xff) \ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ ? TTYPE_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ : G_UNICODE_UNASSIGNED)) /* Count the number of elements in an array. The array must be defined * as such; using this with a dynamically allocated array will give * incorrect results. */ #define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) #if defined(LUCENE_USE_INTERNAL_CHAR_FUNCTIONS) #ifdef _LUCENE_PRAGMA_WARNINGS #pragma message ("===== Note: using internal character function for compatibility =====") #else #warning "===== Note: using internal character function for compatibility =====" #endif bool cl_isletter(gunichar c) { int t = TYPE (c); switch(t) { case G_UNICODE_LOWERCASE_LETTER: return true; case G_UNICODE_TITLECASE_LETTER: return true; case G_UNICODE_UPPERCASE_LETTER: return true; case G_UNICODE_MODIFIER_LETTER: return true; case G_UNICODE_OTHER_LETTER: return true; default: return false; } } bool cl_isalnum(gunichar c) { int t = TYPE (c); switch(t) { case G_UNICODE_LOWERCASE_LETTER: return true; case G_UNICODE_TITLECASE_LETTER: return true; case G_UNICODE_UPPERCASE_LETTER: return true; case G_UNICODE_MODIFIER_LETTER: return true; case G_UNICODE_OTHER_LETTER: return true; case G_UNICODE_DECIMAL_NUMBER: return true; case G_UNICODE_LETTER_NUMBER: return true; case G_UNICODE_OTHER_NUMBER: return true; default: return false; } } bool cl_isdigit(gunichar c) { int t = TYPE (c); switch(t) { case G_UNICODE_DECIMAL_NUMBER: return true; case G_UNICODE_LETTER_NUMBER: return true; case G_UNICODE_OTHER_NUMBER: return true; default: return false; } } /** * cl_isspace: * @c: a Unicode character * * Determines whether a character is a space, tab, or line separator * (newline, carriage return, etc.). Given some UTF-8 text, obtain a * character value with lucene_utf8towc(). * * (Note: don't use this to do word breaking; you have to use * Pango or equivalent to get word breaking right, the algorithm * is fairly complex.) * * Return value: %TRUE if @c is a punctuation character **/ bool cl_isspace (gunichar c) { switch (c) { /* special-case these since Unicode thinks they are not spaces */ case '\t': case '\n': case '\r': case '\f': return true; default: { int t = TYPE ((gunichar)c); return (t == G_UNICODE_SPACE_SEPARATOR || t == G_UNICODE_LINE_SEPARATOR || t == G_UNICODE_PARAGRAPH_SEPARATOR); } } } /** * cl_tolower: * @c: a Unicode character. * * Converts a character to lower case. * * Return value: the result of converting @c to lower case. * If @c is not an upperlower or titlecase character, * or has no lowercase equivalent @c is returned unchanged. **/ TCHAR cl_tolower (TCHAR ch) { gunichar c=ch; int t = TYPE ((gunichar)c); if (t == G_UNICODE_UPPERCASE_LETTER) { gunichar val = ATTTABLE (c >> 8, c & 0xff); if (val >= 0x1000000) { const gchar *p = special_case_table + val - 0x1000000; wchar_t ret=0; lucene_utf8towc(ret,p); #ifdef _UCS2 return ret; #else return LUCENE_OOR_CHAR(ret); #endif }else return val ? val : c; }else if (t == G_UNICODE_TITLECASE_LETTER){ unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c) return title_table[i][2]; } } return c; } /** * cl_toupper: * @c: a Unicode character * * Converts a character to uppercase. * * Return value: the result of converting @c to uppercase. * If @c is not an lowercase or titlecase character, * or has no upper case equivalent @c is returned unchanged. **/ TCHAR cl_toupper (TCHAR ch) { gunichar c=ch; int t = TYPE (c); if (t == G_UNICODE_LOWERCASE_LETTER) { gunichar val = ATTTABLE (c >> 8, c & 0xff); if (val >= 0x1000000) { const gchar *p = special_case_table + val - 0x1000000; wchar_t ret=0; lucene_utf8towc(ret,p); #ifdef _UCS2 return ret; #else return LUCENE_OOR_CHAR(ret); #endif //return lucene_utf8towc (p); } else return val ? val : c; } else if (t == G_UNICODE_TITLECASE_LETTER) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c) return title_table[i][1]; } } return c; } /** * cl_tcasefold: * @str: a unicode string * * Converts a string into a form that is independent of case. The * result will not correspond to any particular case, but can be * compared for equality or ordered with the results of calling * cl_tcasefold() on other strings. * * Note that calling cl_tcasefold() followed by g_utf8_collate() is * only an approximation to the correct linguistic case insensitive * ordering, though it is a fairly good one. Getting this exactly * right would require a more sophisticated collation function that * takes case sensitivity into account. GLib does not currently * provide such a function. * * Return value: a newly allocated string, that is a * case independent form of @str. **/ TCHAR cl_tcasefold(const TCHAR ch){ int start = 0; int end = G_N_ELEMENTS (casefold_table); if (ch >= casefold_table[start].ch && ch <= casefold_table[end - 1].ch) { while (1) { int half = (start + end) / 2; if (ch == casefold_table[half].ch) { wchar_t ret=0; lucene_utf8towc(ret,casefold_table[half].data); #ifdef _UCS2 return ret; #else return LUCENE_OOR_CHAR(ret); #endif }else if (half == start){ break; }else if (ch > casefold_table[half].ch){ start = half; }else{ end = half; } } } return cl_tolower(ch); } //this function was not taken from gnome TCHAR* cl_tcscasefold( TCHAR * str, int len ) //len default is -1 { TCHAR *p = str; while ((len < 0 || p < str + len) && *p) { *p = cl_tcasefold(*p); p++; } return str; } //this function was not taken from gnome int cl_tcscasefoldcmp(const TCHAR * dst, const TCHAR * src){ TCHAR f,l; do{ f = cl_tcasefold( (*(dst++)) ); l = cl_tcasefold( (*(src++)) ); } while ( (f) && (f == l) ); return (int)(f - l); } #endif clucene-core-2.3.3.4/src/shared/CLucene/config/repl_lltot.cpp000066400000000000000000000022321154025176300237340ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" TCHAR* lucene_i64tot( int64_t value, /* [I] Value to be converted */ TCHAR* str, /* [O] Destination for the converted value */ int radix) /* [I] Number base for conversion */ { uint64_t val; int negative; TCHAR buffer[65]; TCHAR* pos; int digit; if (value < 0 && radix == 10) { negative = 1; val = -value; } else { negative = 0; val = value; } /* if */ pos = &buffer[64]; *pos = '\0'; do { digit = (int)(val % radix); val = val / radix; if (digit < 10) { *--pos = '0' + digit; } else { *--pos = 'a' + digit - 10; } /* if */ } while (val != 0L); if (negative) { *--pos = '-'; } /* if */ _tcsncpy(str,pos,&buffer[64] - pos + 1); //needed for unicode to work return str; } clucene-core-2.3.3.4/src/shared/CLucene/config/repl_tchar.h000066400000000000000000000140141154025176300233450ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _REPL_TCHAR_H #define _REPL_TCHAR_H #ifndef _CL_HAVE_TCHAR_H #if defined(_UCS2) //note: descriptions with * in front have replacement functions //formatting functions #define _sntprintf swprintf //* make a formatted a string #define _tprintf wprintf //* print a formatted string //this one has no replacement functions yet, but it is only used in the tests #define _vsntprintf vsnwprintf //* print a formatted string using variable arguments //we are using the internal functions of the compiler here //if LUCENE_USE_INTERNAL_CHAR_FUNCTIONS is defined, thesse //will be replaced by internal functions #define _istalnum iswalnum //* alpha/numeric char check #define _istalpha iswalpha //* alpha char check #define _istspace iswspace //* space char check #define _istdigit iswdigit //* digit char check #define _totlower towlower //* convert char to lower case #define _totupper towupper //* convert char to lower case #define _tcslwr wcslwr //* convert string to lower case //these are the string handling functions //we may need to create wide-character/multi-byte replacements for these #define _tcscpy wcscpy //copy a string to another string #define _tcsncpy wcsncpy //copy a specified amount of one string to another string. #define _tcscat wcscat //copy a string onto the end of the other string #define _tcsncat wcsncat #define _tcschr wcschr //find location of one character #define _tcsstr wcsstr //find location of a string #define _tcslen wcslen //get length of a string #define _tcscmp wcscmp //case sensitive compare two strings #define _tcsncmp wcsncmp //case sensitive compare two strings #define _tcscspn wcscspn //location of any of a set of character in a string //string compare #ifdef _CL_HAVE_FUNCTION_WCSICMP #define _tcsicmp wcsicmp //* case insensitive compare two string #else #define _tcsicmp wcscasecmp //* case insensitive compare two string #endif #if defined(_CL_HAVE_FUNCTION_WCSDUP) #define _tcsdup wcsdup #else #define _tcsdup lucene_wcsdup #endif //conversion functions #define _tcstod wcstod //convert a string to a double #define _tcstoi64 wcstoll //* convers a string to an 64bit bit integer #define _itot _i64tot #define _i64tot lltow //* converts a 64 bit integer to a string (with base) #else //if defined(_ASCII) //formatting functions #define _sntprintf snprintf #define _tprintf printf #define _vsntprintf vsnprintf //we are using the internal functions of the compiler here //if LUCENE_USE_INTERNAL_CHAR_FUNCTIONS is defined, thesse //will be replaced by internal functions #define _istalnum isalnum #define _istalpha isalpha #define _istspace isspace #define _istdigit isdigit #define _totlower tolower #define _totupper toupper #define _tcslwr strlwr //these are the string handling functions #define _tcscpy strcpy #define _tcsncpy strncpy #define _tcscat strcat #define _tcsncat strncat #define _tcschr strchr #define _tcsstr strstr #define _tcslen strlen #define _tcscmp strcmp #define _tcsncmp strncmp #define _tcsicmp strcasecmp #define _tcscspn strcspn #define _tcsdup strdup //string duplicate //converstion methods #define _tcstod strtod #define _tcstoi64 strtoll #define _itot _i64tot #define _i64tot lltoa #endif #else //HAVE_TCHAR_H #include //some tchar headers miss these... #ifndef _tcstoi64 #if defined(_UCS2) #define _tcstoi64 wcstoll //* convers a string to an 64bit bit integer #else #define _tcstoi64 strtoll #endif #endif #endif //HAVE_TCHAR_H #ifndef _ttoi #define _ttoi(x) (int)_tcstoi64(x,NULL,10) #endif #ifndef _itot #define _itot(i, buf, radix) lucene_i64tot(i, buf, radix) #endif namespace std { #ifndef tstring #ifdef _UNICODE typedef wstring tstring; #else typedef string tstring; #endif #endif }; #define STRCPY_AtoA(target,src,len) strncpy(target,src,len) #define STRDUP_AtoA(x) strdup(x) #if defined(_UCS2) #define stringDuplicate(x) _tcsdup(x) #if defined(_CL_HAVE_FUNCTION_WCSDUP) #define STRDUP_WtoW wcsdup #else #define STRDUP_WtoW lucene_wcsdup #endif #define STRDUP_TtoT STRDUP_WtoW #define STRDUP_WtoT STRDUP_WtoW #define STRDUP_TtoW STRDUP_WtoW #define STRDUP_AtoW(x) CL_NS(util)::Misc::_charToWide(x) #define STRDUP_AtoT STRDUP_AtoW #define STRDUP_WtoA(x) CL_NS(util)::Misc::_wideToChar(x) #define STRDUP_TtoA STRDUP_WtoA #define STRCPY_WtoW(target,src,len) _tcsncpy(target,src,len) #define STRCPY_TtoW STRCPY_WtoW #define STRCPY_WtoT STRCPY_WtoW //#define _tcscpy STRCPY_WtoW #define STRCPY_AtoW(target,src,len) CL_NS(util)::Misc::_cpycharToWide(src,target,len) #define STRCPY_AtoT STRCPY_AtoW #define STRCPY_WtoA(target,src,len) CL_NS(util)::Misc::_cpywideToChar(src,target,len) #define STRCPY_TtoA STRCPY_WtoA #else #define stringDuplicate(x) strdup(x) #define STRDUP_AtoT STRDUP_AtoA #define STRDUP_TtoA STRDUP_AtoA #define STRDUP_TtoT STRDUP_AtoA #define STRDUP_WtoT(x) xxxxxxxxxxxxxxx //not possible #define STRCPY_WtoT(target,src,len) xxxxxxxxxxxxxxx //not possible #define STRCPY_AtoT STRCPY_AtoA #define STRCPY_TtoA STRCPY_AtoA //#define _tcscpy STRCPY_AtoA #endif #endif //_REPL_TCHAR_H clucene-core-2.3.3.4/src/shared/CLucene/config/repl_tcscasecmp.cpp000066400000000000000000000012651154025176300247300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" int lucene_tcscasecmp(const TCHAR * sa, const TCHAR * sb){ TCHAR ca,cb; if (sa == sb) return 0; do{ ca = _totlower( (*(sa++)) ); cb = _totlower( (*(sb++)) ); } while ( ca != L'\0' && (ca == cb) ); return (int)(ca - cb); } clucene-core-2.3.3.4/src/shared/CLucene/config/repl_tcslwr.cpp000066400000000000000000000010421154025176300241120ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" TCHAR* lucene_tcslwr( TCHAR* str ) { TCHAR* ret = str; for ( ; *str; str++) *str = _totlower(*str); return ret; } clucene-core-2.3.3.4/src/shared/CLucene/config/repl_tcstod.cpp000066400000000000000000000014311154025176300240760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" #include "CLucene/util/Misc.h" #ifndef _ASCII double lucene_tcstod(const TCHAR *value, TCHAR **end){ int32_t len = _tcslen(value)+1; char* avalue=_CL_NEWARRAY(char,len); char* aend=NULL; STRCPY_TtoA(avalue,value,len); double ret = strtod(avalue,&aend); *end=(TCHAR*)value+(aend-avalue); _CLDELETE_CaARRAY(avalue); return ret; } #endif clucene-core-2.3.3.4/src/shared/CLucene/config/repl_tcstoll.cpp000066400000000000000000000024471154025176300242720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" int64_t lucene_tcstoi64(const TCHAR* str, TCHAR**end, int radix){ #define LUCENE_TCSTOI64_RADIX(x,r) ((x>=_T('0') && x<=_T('9'))?x-_T('0'):((x>=_T('a') && x<=_T('z'))?x-_T('a')+10:((x>=_T('A') && x<=_T('Z'))?x-_T('A')+10:1000))) if (radix < 2 || radix > 36) return 0; /* Skip white space. */ while (_istspace (*str)) ++str; int sign=1; if ( str[0] == _T('+') ) str++; else if ( str[0] == _T('-') ){ sign = -1; str++; } *end=(TCHAR*)str; long r = -1; while ( (r=LUCENE_TCSTOI64_RADIX(*end[0],radix)) >=0 && r=str;p-- ){ int i=LUCENE_TCSTOI64_RADIX(p[0],radix); if ( pos == 0 ) ret=i; else ret += (int64_t)pow((float_t)radix,(float_t)pos) * i; //todo: might be quicker with a different pow overload pos++; } return sign*ret; } clucene-core-2.3.3.4/src/shared/CLucene/config/repl_tprintf.cpp000066400000000000000000000067421154025176300242760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" #include "CLucene/util/StringBuffer.h" #include //MB_LEN_MAX CL_NS_USE(util) //print a variable argument to a stream //currently special number formatting is not supported. it is very minimalistic void lucene_vfnwprintf(StringBuffer* buffer, size_t /*count*/, const wchar_t * format, va_list& valist){ const wchar_t *iter = format; StringBuffer* tmp = NULL; if ( buffer == NULL ) tmp = _CLNEW StringBuffer; else tmp = buffer; while (*iter) { while (*iter && *iter != '%') { tmp->appendChar(*iter++); } if (*iter == '%') { if (iter[1] == '%') { //just print a % tmp->appendChar('%'); iter += 2; continue; } iter++; switch (*iter) { case 's': { //todo: this is faulty. it doesn't heed count //print a string or null const TCHAR *wstr = va_arg(valist, TCHAR *); if ( !wstr ) wstr = _T("(null)"); tmp->append(wstr); iter++; break; } case 'c': tmp->appendChar((TCHAR)va_arg(valist, int)); iter++; break; default: { //todo: this is faulty. it doesn't heed count if (*iter == 'p') tmp->appendInt((int32_t)va_arg(valist, long)); else { if (*iter == 'a' || *iter == 'A' || *iter == 'e' || *iter == 'E' || *iter == 'f' || *iter == 'F' || *iter == 'g' || *iter == 'G') tmp->appendFloat((float_t)va_arg(valist, double),8); else if (*iter == 'd' || *iter == 'i' ){ tmp->appendInt((int32_t)va_arg(valist, int)); }else if (*iter == 'l' ){ TCHAR b[100]; _i64tot((int64_t)va_arg(valist, int64_t),b,10); tmp->append(b); }/*else{ TCHAR b[100]; _i64tot((int64_t)va_arg(valist, void*),b,10); tmp->append(b); }*/ } iter++; break; } } } } if ( buffer == NULL ){ //we are supposed to be writing to the console #ifdef _UCS2 TCHAR* pointer = tmp->getBuffer(); char ob[MB_LEN_MAX]; size_t v; size_t len = tmp->length(); for (size_t i=0;i 0 ){ ob[v]='\0'; fputs(ob,stdout); } pointer++; } #else fputs(tmp->getBuffer(),stdout); #endif _CLDELETE(tmp); } } #ifdef _UCS2 //print a list of arguments to a string int lucene_snwprintf(wchar_t* strbuf, size_t count, const wchar_t * format, ...){ va_list ap; va_start(ap, format); StringBuffer buffer; lucene_vfnwprintf(&buffer,count,format,ap); va_end(ap); size_t ret = cl_min(count,(size_t)(buffer.length()+1)); wcsncpy(strbuf,buffer.getBuffer(),ret); return ret; } //print a list of arguments to the stdout void lucene_wprintf(const wchar_t * format, ...){ va_list ap; va_start(ap, format); lucene_vfnwprintf(NULL,LUCENE_INT32_MAX_SHOULDBE,format,ap); va_end(ap); } //print a variable argument to a string int lucene_vsnwprintf(wchar_t * strbuf, size_t count, const wchar_t * format, va_list& ap){ StringBuffer buffer; lucene_vfnwprintf(&buffer,count,format,ap); int ret = cl_min((size_t)count,buffer.length()+1); wcsncpy(strbuf,buffer.getBuffer(),ret); return ret; } #endif clucene-core-2.3.3.4/src/shared/CLucene/config/repl_wchar.h000066400000000000000000000075471154025176300233650ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_repl_wchar_h #define _lucene_repl_wchar_h #include #include "repl_tchar.h" #ifdef _CL_HAVE_STRING_H #include #endif #ifdef _CL_HAVE_WCHAR_H #include #endif CLUCENE_SHARED_EXPORT int cl_tcscasefoldcmp(const TCHAR * dst, const TCHAR * src); CLUCENE_SHARED_EXPORT TCHAR* cl_tcscasefold( TCHAR * str, int len=-1 ); //we provide utf8 conversion functions CLUCENE_SHARED_EXPORT size_t lucene_utf8towc (wchar_t& ret, const char *s); CLUCENE_SHARED_EXPORT size_t lucene_utf8towcs(wchar_t *, const char *, size_t maxslen); CLUCENE_SHARED_EXPORT size_t lucene_wctoutf8 (char * ret, const wchar_t str); CLUCENE_SHARED_EXPORT size_t lucene_wcstoutf8 (char *, const wchar_t *, size_t maxslen); #ifdef _ASCII #define lucene_wcstoutf8string(str,strlen) str #else CLUCENE_SHARED_EXPORT std::string lucene_wcstoutf8string(const wchar_t* str, size_t strlen); #endif CLUCENE_SHARED_EXPORT size_t lucene_utf8charlen(const unsigned char p); //< the number of characters that this first utf8 character will expect //string function replacements #if defined(LUCENE_USE_INTERNAL_CHAR_FUNCTIONS) || (defined(_UCS2) && !defined(_CL_HAVE_FUNCTION_WCSCASECMP)) || (defined(_ASCII) && !defined(_CL_HAVE_FUNCTION_STRCASECMP)) CLUCENE_SHARED_EXPORT int lucene_tcscasecmp(const TCHAR *, const TCHAR *); #undef _tcsicmp #define _tcsicmp lucene_tcscasecmp #endif #if defined(LUCENE_USE_INTERNAL_CHAR_FUNCTIONS) || (defined(_UCS2) && !defined(_CL_HAVE_FUNCTION_WCSLWR)) || (defined(_ASCII) && !defined(_CL_HAVE_FUNCTION_STRLWR)) CLUCENE_SHARED_EXPORT TCHAR* lucene_tcslwr( TCHAR* str ); #undef _tcslwr #define _tcslwr lucene_tcslwr #endif //conversion functions #if (defined(_ASCII) && !defined(_CL_HAVE_FUNCTION_LLTOA)) || (defined(_UCS2) && !defined(_CL_HAVE_FUNCTION_LLTOW)) CLUCENE_SHARED_EXPORT TCHAR* lucene_i64tot( int64_t value, TCHAR* str, int radix); #undef _i64tot #define _i64tot lucene_i64tot #endif #if !defined(_CL_HAVE_FUNCTION_WCSDUP) CLUCENE_SHARED_EXPORT wchar_t* lucene_wcsdup( const wchar_t* str); #endif #if (defined(_UCS2) && !defined(_CL_HAVE_FUNCTION_WCSTOLL)) || (defined(_ASCII) && !defined(_CL_HAVE_FUNCTION_STRTOLL)) CLUCENE_SHARED_EXPORT int64_t lucene_tcstoi64(const TCHAR* str, TCHAR**end, int radix); #undef _tcstoi64 #define _tcstoi64 lucene_tcstoi64 #endif #if defined(_UCS2) && !defined(_CL_HAVE_FUNCTION_WCSTOD) CLUCENE_SHARED_EXPORT double lucene_tcstod(const TCHAR *value, TCHAR **end); #undef _tcstod #define _tcstod lucene_tcstod #endif //printf functions #if (defined(_UCS2) && (!defined(_CL_HAVE_FUNCTION__SNWPRINTF)) || defined(_CL_HAVE_SNWPRINTF_BUG) ) #undef _sntprintf #define _sntprintf lucene_snwprintf CLUCENE_SHARED_EXPORT int lucene_snwprintf(wchar_t* strbuf, size_t count, const wchar_t * format, ...); #endif #if defined(_UCS2) && !defined(_CL_HAVE_FUNCTION_WPRINTF) #undef _tprintf #define _tprintf lucene_wprintf CLUCENE_SHARED_EXPORT void lucene_wprintf(const wchar_t * format, ...); #endif #if defined(_UCS2) && (!defined(_CL_HAVE_FUNCTION__VSNWPRINTF) || defined(_CL_HAVE_SNWPRINTF_BUG) ) #undef _vsntprintf #define _vsntprintf lucene_vsnwprintf CLUCENE_SHARED_EXPORT int lucene_vsnwprintf(wchar_t * strbuf, size_t count, const wchar_t * format, va_list& ap); #endif //todo: if _CL_HAVE_SNPRINTF_BUG fails(snprintf overflow),we should use our own //function. but we don't have it currently, and our functions are dubious anyway... #endif //end of _lucene_repl_wchar_h clucene-core-2.3.3.4/src/shared/CLucene/config/repl_wctype.h000066400000000000000000000051531154025176300235630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_repl_wctype_h #define _lucene_repl_wctype_h //////////////////////////////////////////////////////// // Character functions. // Here we decide whose character functions to use //////////////////////////////////////////////////////// #if defined(LUCENE_USE_INTERNAL_CHAR_FUNCTIONS) #define stringCaseFold cl_tcscasefold #define stringCaseFoldCmp cl_tcscasefoldcmp #undef _istspace #undef _istdigit #undef _istalnum #undef _istalpha #undef _totlower #undef _totupper #define _istalnum cl_isalnum #define _istalpha cl_isletter #define _istspace cl_isspace #define _istdigit cl_isdigit #define _totlower cl_tolower #define _totupper cl_toupper //here are some functions to help deal with utf8/ucs2 conversions //lets let the user decide what mb functions to use... we provide pure utf8 ones no matter what. /*#undef _mbtowc #undef _mbstowcs #undef _wctomb #undef _wcstombs #define _mbtowc lucene_mbstowc #define _mbsstowcs lucene_mbstowcs #define _wctomb lucene_wcto_mb #define _wcstombs lucene_wcstombs*/ #else //we are using native functions //here are some functions to help deal with utf8/ucs2 conversions /*#define _mbtowc mbtowc #define _wctomb wctomb #define _mbstowcs mbstowcs #define _wcstombs wcstombs*/ //we are using native character functions #if defined(_ASCII) #undef _istspace #undef _istdigit #undef _istalnum #undef _istalpha #undef _totlower #undef _totupper #define _istspace(x) isspace((unsigned char)x) #define _istdigit(x) isdigit((unsigned char)x) #define _istalnum(x) isalnum((unsigned char)x) #define _istalpha(x) isalpha((unsigned char)x) #define _totlower(x) tolower((unsigned char)x) #define _totupper(x) toupper((unsigned char)x) #endif #endif //the methods contained in gunichartables.h typedef unsigned long clunichar; CLUCENE_SHARED_EXPORT bool cl_isletter(clunichar c); CLUCENE_SHARED_EXPORT bool cl_isalnum(clunichar c); CLUCENE_SHARED_EXPORT bool cl_isdigit(clunichar c); CLUCENE_SHARED_EXPORT bool cl_isspace (clunichar c); CLUCENE_SHARED_EXPORT TCHAR cl_tolower (TCHAR c); CLUCENE_SHARED_EXPORT TCHAR cl_toupper (TCHAR c); #endif clucene-core-2.3.3.4/src/shared/CLucene/config/threads.cpp000066400000000000000000000173441154025176300232200ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_SharedHeader.h" #include "CLucene/LuceneThreads.h" #include "_threads.h" #include CL_NS_DEF(util) #ifndef _CL_DISABLE_MULTITHREADING #if defined(_LUCENE_DONTIMPLEMENT_THREADMUTEX) //do nothing #if defined(_LUCENE_PRAGMA_WARNINGS) #pragma message ("==================Not implementing any thread mutex==================") #else #warning "==================Not implementing any thread mutex==================" #endif #elif defined(_CL_HAVE_WIN32_THREADS) struct mutex_thread::Internal{ CRITICAL_SECTION mtx; }; mutex_thread::mutex_thread(const mutex_thread& clone): _internal(new Internal) { InitializeCriticalSection(&_internal->mtx); } mutex_thread::mutex_thread(): _internal(new Internal) { InitializeCriticalSection(&_internal->mtx); } mutex_thread::~mutex_thread() { DeleteCriticalSection(&_internal->mtx); delete _internal; } void mutex_thread::lock() { EnterCriticalSection(&_internal->mtx); } void mutex_thread::unlock() { LeaveCriticalSection(&_internal->mtx); } _LUCENE_THREADID_TYPE mutex_thread::_GetCurrentThreadId(){ return GetCurrentThreadId(); } void mutex_thread::_exitThread(int val){ ExitThread(val); } int32_t mutex_thread::atomic_increment(_LUCENE_ATOMIC_INT *theInteger){ #ifdef _M_X64 return _InterlockedIncrement64(theInteger); #else return InterlockedIncrement(theInteger); #endif } int32_t mutex_thread::atomic_decrement(_LUCENE_ATOMIC_INT *theInteger){ #ifdef _M_X64 return _InterlockedDecrement64(theInteger); #else return InterlockedDecrement(theInteger); #endif } class shared_condition::Internal{ public: void* _event; Internal(){ _event = CreateEventA( NULL, false, false, NULL ); } ~Internal(){ CloseHandle( _event ); } }; shared_condition::shared_condition(){ _internal = new Internal; } shared_condition::~shared_condition(){ delete _internal; } void shared_condition::Wait(mutex_thread* shared_lock){ shared_lock->unlock(); _cl_dword_t dwRes = WaitForSingleObject( _internal->_event, 0xFFFFFFFF ); assert ( 0x0 == dwRes ); shared_lock->lock(); } void shared_condition::NotifyAll(){ bool bRes = SetEvent(_internal->_event); assert( bRes ); } _LUCENE_THREADID_TYPE mutex_thread::CreateThread(luceneThreadStartRoutine* func, void* arg){ return (_LUCENE_THREADID_TYPE) ::_beginthread (func, 0, arg); } void mutex_thread::JoinThread(_LUCENE_THREADID_TYPE id){ WaitForSingleObject((void*)id, 0xFFFFFFFF); } #elif defined(_CL_HAVE_PTHREAD) #ifndef _REENTRANT #error ACK! You need to compile with _REENTRANT defined since this uses threads #endif #ifdef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE bool mutex_pthread_attr_initd=false; pthread_mutexattr_t mutex_thread_attr; #endif #ifdef _CL__CND_DEBUG #define _CLPTHREAD_CHECK(c,m) CND_PRECONDITION(c==0,m) #else #define _CLPTHREAD_CHECK(c,m) c; #endif struct mutex_thread::Internal{ pthread_mutex_t mtx; #ifndef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE pthread_t lockOwner; unsigned int lockCount; #endif }; mutex_thread::mutex_thread(const mutex_thread& /*clone*/): _internal(new Internal) { #ifdef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE _CLPTHREAD_CHECK(pthread_mutex_init(&_internal->mtx, &mutex_thread_attr), "mutex_thread(clone) constructor failed") #else #if defined(__hpux) && defined(_DECTHREADS_) _CLPTHREAD_CHECK(pthread_mutex_init(&_internal->mtx, pthread_mutexattr_default), "mutex_thread(clone) constructor failed") #else _CLPTHREAD_CHECK(pthread_mutex_init(&_internal->mtx, 0), "mutex_thread(clone) constructor failed") #endif _internal->lockCount=0; _internal->lockOwner=0; #endif } mutex_thread::mutex_thread(): _internal(new Internal) { #ifdef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE if ( mutex_pthread_attr_initd == false ){ pthread_mutexattr_init(&mutex_thread_attr); pthread_mutexattr_settype(&mutex_thread_attr, PTHREAD_MUTEX_RECURSIVE); mutex_pthread_attr_initd = true; } _CLPTHREAD_CHECK(pthread_mutex_init(&_internal->mtx, &mutex_thread_attr), "mutex_thread(clone) constructor failed") #else #if defined(__hpux) && defined(_DECTHREADS_) _CLPTHREAD_CHECK(pthread_mutex_init(&_internal->mtx, pthread_mutexattr_default), "mutex_thread(clone) constructor failed") #else _CLPTHREAD_CHECK(pthread_mutex_init(&_internal->mtx, 0), "mutex_thread(clone) constructor failed") #endif _internal->lockCount=0; _internal->lockOwner=0; #endif } mutex_thread::~mutex_thread() { _CLPTHREAD_CHECK(pthread_mutex_destroy(&_internal->mtx), "~mutex_thread destructor failed") delete _internal; } _LUCENE_THREADID_TYPE mutex_thread::_GetCurrentThreadId(){ return pthread_self(); } int32_t atomic_threads::atomic_increment(_LUCENE_ATOMIC_INT *theInteger){ #ifdef _CL_HAVE_GCC_ATOMIC_FUNCTIONS return __sync_add_and_fetch(theInteger, 1); #else SCOPED_LOCK_MUTEX(theInteger->THIS_LOCK) return ++theInteger->value; #endif } int32_t atomic_threads::atomic_decrement(_LUCENE_ATOMIC_INT *theInteger){ #ifdef _CL_HAVE_GCC_ATOMIC_FUNCTIONS return __sync_sub_and_fetch(theInteger, 1); #else SCOPED_LOCK_MUTEX(theInteger->THIS_LOCK) return --theInteger->value; #endif } _LUCENE_THREADID_TYPE mutex_thread::CreateThread(luceneThreadStartRoutine* func, void* arg){ _LUCENE_THREADID_TYPE ret; int nRes = pthread_create(&ret, NULL, func, arg); assert( nRes == 0 ); return ret; } void mutex_thread::JoinThread(_LUCENE_THREADID_TYPE id){ pthread_join(id, NULL); } void mutex_thread::lock() { #ifndef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE pthread_t currentThread = pthread_self(); if( pthread_equal( _internal->lockOwner, currentThread ) ) { ++_internal->lockCount; } else { _CLPTHREAD_CHECK(pthread_mutex_lock(&_internal->mtx), "mutex_thread::lock") _internal->lockOwner = currentThread; _internal->lockCount = 1; } #else _CLPTHREAD_CHECK(pthread_mutex_lock(&_internal->mtx), "mutex_thread::lock") #endif } void mutex_thread::unlock() { #ifndef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE --_internal->lockCount; if( _internal->lockCount == 0 ) { _internal->lockOwner = 0; _CLPTHREAD_CHECK(pthread_mutex_unlock(&_internal->mtx), "mutex_thread::unlock") } #else _CLPTHREAD_CHECK(pthread_mutex_unlock(&_internal->mtx), "mutex_thread::unlock") #endif } struct shared_condition::Internal{ pthread_cond_t condition; Internal(){ pthread_cond_init (&condition, NULL); } ~Internal(){ pthread_cond_destroy(&condition); } }; shared_condition::shared_condition(){ _internal = new Internal; } shared_condition::~shared_condition(){ delete _internal; } void shared_condition::Wait(mutex_thread* shared_lock){ int res = 0; res = pthread_cond_wait(&_internal->condition, &shared_lock->_internal->mtx); assert(res == 0); } void shared_condition::NotifyAll(){ int res = 0; res = pthread_cond_broadcast(&_internal->condition); assert(res == 0); } #endif //thread impl choice mutexGuard::mutexGuard(const mutexGuard& /*clone*/){ //no autoclone mrMutex = NULL; } mutexGuard::mutexGuard( _LUCENE_THREADMUTEX& rMutex ) : mrMutex(&rMutex) { mrMutex->lock(); } mutexGuard::~mutexGuard() { mrMutex->unlock(); } #endif //!_CL_DISABLE_MULTITHREADING CL_NS_END clucene-core-2.3.3.4/src/shared/CLucene/config/utf8.cpp000066400000000000000000000145041154025176300224470ustar00rootroot00000000000000/* * Copyright (C) 1999 Tom Tromey * Copyright (C) 2000 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * 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. * * ************************************************ * Also licensed with permission from Tom Tromey * and Owen Taylor under the Apache license. * Original location: * http://cvs.gnome.org/viewcvs/glib/glib/gutf8.c?rev=1.50&view=log ************************************************ * * Copyright 2003-2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CLucene/_SharedHeader.h" typedef unsigned long gunichar; typedef unsigned char guchar; #define UTF8_COMPUTE(Char, Mask, Len) \ if (Char < 128) \ { \ Len = 1; \ Mask = 0x7f; \ } \ else if ((Char & 0xe0) == 0xc0) \ { \ Len = 2; \ Mask = 0x1f; \ } \ else if ((Char & 0xf0) == 0xe0) \ { \ Len = 3; \ Mask = 0x0f; \ } \ else if ((Char & 0xf8) == 0xf0) \ { \ Len = 4; \ Mask = 0x07; \ } \ else if ((Char & 0xfc) == 0xf8) \ { \ Len = 5; \ Mask = 0x03; \ } \ else if ((Char & 0xfe) == 0xfc) \ { \ Len = 6; \ Mask = 0x01; \ } \ else \ Len = -1; /*#define UTF8_LENGTH(Char) \ ((Char) < 0x80 ? 1 : \ ((Char) < 0x800 ? 2 : \ ((Char) < 0x10000 ? 3 : \ ((Char) < 0x200000 ? 4 : \ ((Char) < 0x4000000 ? 5 : 6)))))*/ #define UTF8_GET(Result, Chars, Count, Mask, Len) \ (Result) = (Chars)[0] & (Mask); \ for ((Count) = 1; (Count) < (Len); ++(Count)) \ { \ if (((Chars)[(Count)] & 0xc0) != 0x80) \ { \ (Result) = -1; \ break; \ } \ (Result) <<= 6; \ (Result) |= ((Chars)[(Count)] & 0x3f); \ } /** * lucene_wctoutf8: * @c: a ISO10646 character code * @outbuf: output buffer, must have at least 6 bytes of space. * If %NULL, the length will be computed and returned * and nothing will be written to @outbuf. * * Converts a single character to UTF-8. * * Return value: number of bytes written **/ size_t lucene_wctoutf8(char * outbuf, const wchar_t ch) { gunichar c = ch; guchar len = 0; int first; int i; if (c < 0x80) { first = 0; len = 1; } else if (c < 0x800) { first = 0xc0; len = 2; } else if (c < 0x10000) { first = 0xe0; len = 3; } else if (c < 0x200000) { first = 0xf0; len = 4; } else if (c < 0x4000000) { first = 0xf8; len = 5; } else { first = 0xfc; len = 6; } if (outbuf) { for (i = len - 1; i > 0; --i) { outbuf[i] = (char)((c & 0x3f) | 0x80); c >>= 6; } outbuf[0] = (char)(c | first); } return len; } /** * lucene_utf8towc: * @p: a pointer to Unicode character encoded as UTF-8 * * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. * If @p does not point to a valid UTF-8 encoded character, results are * undefined. If you are not sure that the bytes are complete * valid Unicode characters, you should use lucene_utf8towc_validated() * instead. * * Return value: the number of p consumed for the character, or 0 on error **/ size_t lucene_utf8towc(wchar_t& pwc, const char *p) { int i, mask = 0; int result; unsigned char c = (unsigned char) *p; int len=0; UTF8_COMPUTE (c, mask, len); if (len == -1) return 0; UTF8_GET (result, p, i, mask, len); pwc = result; return len; } //this function was not taken from gnome size_t lucene_wcstoutf8(char * result, const wchar_t * str, size_t result_length){ char *p=result; int i = 0; while (p < result + result_length-1 && str[i] != 0) p += lucene_wctoutf8(p,str[i++]); *p = '\0'; return p-result; } //this function was not taken from gnome size_t lucene_utf8towcs(wchar_t * result, const char * str, size_t result_length){ char *sp = const_cast(str); wchar_t *rp = result; while (rp < result + result_length && *sp!=0){ size_t r = lucene_utf8towc(*rp,sp); if ( r == 0 ) return 0; sp += r; rp++; } size_t ret = sp-str; if ( ret < result_length ) *rp = '\0'; return ret; } //get the number of bytes that make up the utf8 character. //this function was not taken from gnome size_t lucene_utf8charlen(const unsigned char c) { int mask = 0; int len=0; UTF8_COMPUTE (c, mask, len); return len; } #ifndef _ASCII //convert unicode string to a utf8 string std::string lucene_wcstoutf8string(const wchar_t* str, size_t strlen){ size_t i = 0; std::string result; char p[6]; while (i < strlen && str[i] != 0){ result.append(p, lucene_wctoutf8(p,str[i++])); } return result; } #endif clucene-core-2.3.3.4/src/shared/CLucene/debug/000077500000000000000000000000001154025176300206725ustar00rootroot00000000000000clucene-core-2.3.3.4/src/shared/CLucene/debug/_condition.h000066400000000000000000000064511154025176300231760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef __CONDITION_H #define __CONDITION_H //todo: this is a hack #undef CND_PRECONDITION /* To enable condition debugging uncomment _CND_DEBUG in CLConfig.h */ #ifdef _CL__CND_DEBUG /* Don't include the debug code */ /* _CL__CND_DEBUG defined, include debug code */ #ifdef _CND_NODEBUGTEXT #define CND_PRECONDITION(cond,usermessage) CND__EXITCONDITION(cond,__FILE__,__LINE__,CND_STR_PRECONDITION,NULL) #define CND_CONDITION(cond,usermessage) CND__EXITCONDITION(cond,__FILE__,__LINE__,CND_STR_CONDITION,NULL) #define CND_WARNING(cond,usermessage) CND__CONDITION(cond,__FILE__,__LINE__,CND_STR_WARNING,NULL) #define CND_MESSAGE(cond,usermessage) CND__CONDITION(cond,__FILE__,__LINE__,CND_STR_MESSAGE,NULL) #define CND_DEBUGMESSAGE(usermessage) CND__MESSAGE(__FILE__,__LINE__,CND_STR_DEBUGMESSAGE,NULL) #else #define CND_PRECONDITION(cond,usermessage) CND__EXITCONDITION(cond,__FILE__,__LINE__,CND_STR_PRECONDITION,usermessage) #define CND_CONDITION(cond,usermessage) CND__EXITCONDITION(cond,__FILE__,__LINE__,CND_STR_CONDITION,usermessage) #define CND_WARNING(cond,usermessage) CND__CONDITION(cond,__FILE__,__LINE__,CND_STR_WARNING,usermessage) #define CND_MESSAGE(cond,usermessage) CND__CONDITION(cond,__FILE__,__LINE__,CND_STR_MESSAGE,usermessage) #define CND_DEBUGMESSAGE(usermessage) CND__MESSAGE(__FILE__,__LINE__,CND_STR_DEBUGMESSAGE,usermessage) #endif //if _CND_DEBUG_DONTIMPLEMENT_OUTDEBUG is defined, then you must implement //this routine in the client application. The debug callback can then //be better customised to the host application. //Here is the default implementation: void _Cnd_OutDebug( const char* FormattedMsg, const char* StrTitle, const char* File, int32_t Line, int32_t Title, const char* Mes2, int32_t fatal ); void CLUCENE_SHARED_EXPORT __cnd_FormatDebug( const char* File, int32_t Line, int32_t Title, const char* Mes2, int32_t fatal ); #define CND__EXIT(file,line,title,mes2) {__cnd_FormatDebug(file,line,title,mes2,1);} #define CND__EXITCONDITION(cond,file,line,title,mes2) {if(!(cond)){__cnd_FormatDebug(file,line,title,mes2,1);}} #define CND__CONDITION(cond,file,line,title,mes2) {if(!(cond)){__cnd_FormatDebug(file,line,title,mes2,0);}} #define CND__MESSAGE(file,line,title,mes2) {__cnd_FormatDebug(file,line,title,mes2,0);} #else #define CND_PRECONDITION(cond, usermessage) #define CND_CONDITION(cond, usermessage) #define CND_WARNING(cond,usermessage) #define CND_MESSAGE(cond,usermessage) #define CND_DEBUGMESSAGE(usermessage) #endif #ifndef CND_STR_DEFINES #define CND_STR_DEFINES #define CND_STR_PRECONDITION 1 #define CND_STR_CONDITION 2 #define CND_STR_WARNING 3 #define CND_STR_MESSAGE 4 #define CND_STR_DEBUGMESSAGE 5 #define CND_STR_EXIT 6 #endif //cnd-debug exit command #ifndef debugFatalExit #define debugFatalExit(ret) exit(ret) #endif #endif clucene-core-2.3.3.4/src/shared/CLucene/debug/condition.cpp000066400000000000000000000047371154025176300233770ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #define _CL__CND_DEBUG #include "CLucene/_SharedHeader.h" #include "_condition.h" #include "CLucene/util/Misc.h" #define __CND_STR_PRECONDITION "PRECONDITION" #define __CND_STR_CONDITION "CONDITION" #define __CND_STR_WARNING "WARNING" #define __CND_STR_MESSAGE "MESSAGE" #define __CND_STR_DEBUGMESSAGE "DEBUG MESSAGE" #define __CND_STR_EXIT "EXIT" #ifndef _CND_DEBUG_DONTIMPLEMENT_OUTDEBUG void _Cnd_OutDebug( const char* FormattedMsg, const char* StrTitle, const char* File, int32_t Line, int32_t Title, const char* Mes2, int32_t fatal ){ #ifdef __WINDOWS_H /*Display a standard messagebox*/ MessageBox(NULL, FormattedMsg, StrTitle, (fatal==1 ? MB_ICONSTOP:MB_ICONEXCLAMATION) | MB_OK | MB_TASKMODAL); #else printf("%s\n",FormattedMsg); #endif #if defined(_CND_DEBUG_WARN_DEBUGGER) /*attempt to signal windows debugger*/ OutputDebugString(FormattedMsg); DebugBreak(); /*Position debugger just before exit program*/ #endif if ( fatal ) debugFatalExit(1); } #endif void __cnd_FormatDebug( const char* File, int32_t Line, int32_t Title, const char* Mes2, int32_t fatal ) { char M[512]; const char* StrTitle = NULL; if( Mes2 ) _snprintf(M,512,"file:%s line:%d\n%s",File,Line,Mes2); else _snprintf(M,512,"file:%s line:%d",File,Line); /*Determine which title to use*/ switch( Title ) { case CND_STR_PRECONDITION: { StrTitle = __CND_STR_PRECONDITION; break; } case CND_STR_CONDITION: { StrTitle = __CND_STR_CONDITION; break; } case CND_STR_WARNING: { StrTitle = __CND_STR_WARNING; break; } case CND_STR_MESSAGE: { StrTitle = __CND_STR_MESSAGE; break; } case CND_STR_DEBUGMESSAGE: { StrTitle = __CND_STR_DEBUGMESSAGE; break; } case CND_STR_EXIT: { StrTitle = __CND_STR_EXIT; break; } default: break; }/*switch*/ _Cnd_OutDebug(M, StrTitle, File, Line, Title, Mes2, fatal); } clucene-core-2.3.3.4/src/shared/CLucene/util/000077500000000000000000000000001154025176300205615ustar00rootroot00000000000000clucene-core-2.3.3.4/src/shared/CLucene/util/Misc.cpp000066400000000000000000000406211154025176300221630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "Misc.h" #include #include #include #if defined(_CL_HAVE_SYS_TIME_H) # include #elif defined(_CL_HAVE_TIME_H) # include #endif #ifdef _CL_HAVE_SYS_TIMEB_H #include #endif #if defined(_CL_HAVE_SYS_STAT_H) #include #endif #ifdef _CL_HAVE_STRINGS_H #include #endif #ifdef _CL_HAVE_UNISTD_H #include #endif #include #include #include "CLucene/util/dirent.h" //if we have dirent, then the native one will be used //for zlib... #include "zlib.h" #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) #else # define SET_BINARY_MODE(file) #endif #define CL_Z_DEFAULT_CHUNK 1024 #ifdef _CL_HAVE_FUNCTION_SLEEP //don't ignore windows.h... breaks mingw32 in some cases. Define Sleep instead extern "C" __declspec(dllimport) void __stdcall Sleep(_cl_dword_t); #endif CL_NS_DEF(util) size_t Misc::ahashCode(const char* str){ // Compute the hash code using a local variable to be reentrant. size_t hashCode = 0; while ( *str != 0 ) hashCode = hashCode * 31 + *str++; return hashCode; } size_t Misc::ahashCode(const char* str, size_t len){ // Compute the hash code using a local variable to be reentrant. size_t hashCode = 0; for (size_t i = 0; i 50 ) // if it still doesn't show up, then we do some sleeping for the last 50ms _LUCENE_SLEEP( 1 ); } if( maxAttempts > 0 ) maxAttempts--; } return 0; } //static TCHAR* Misc::join ( const TCHAR* a, const TCHAR* b, const TCHAR* c, const TCHAR* d,const TCHAR* e,const TCHAR* f ) { #define LEN(x) (x == NULL ? 0 : _tcslen(x)) const size_t totalLen = LEN(a) + LEN(b) + LEN(c) + LEN(d) + LEN(e) + LEN(f) + sizeof(TCHAR); /* Space for terminator. */ TCHAR* buf = _CL_NEWARRAY(TCHAR,totalLen); buf[0]=0; if ( a != NULL) _tcscat(buf,a); if ( b != NULL) _tcscat(buf,b); if ( c != NULL) _tcscat(buf,c); if ( d != NULL) _tcscat(buf,d); if ( e != NULL) _tcscat(buf,e); if ( f != NULL) _tcscat(buf,f); return buf; } char* Misc::ajoin ( const char* a, const char* b, const char* c, const char* d,const char* e,const char* f ) { #define aLEN(x) (x == NULL ? 0 : strlen(x)) const size_t totalLen = aLEN(a) + aLEN(b) + aLEN(c) + aLEN(d) + aLEN(e) + aLEN(f) + sizeof(char); /* Space for terminator. */ char* buf = _CL_NEWARRAY(char,totalLen); buf[0]=0; if ( a != NULL) strcat(buf,a); if ( b != NULL) strcat(buf,b); if ( c != NULL) strcat(buf,c); if ( d != NULL) strcat(buf,d); if ( e != NULL) strcat(buf,e); if ( f != NULL) strcat(buf,f); return buf; } //static bool Misc::priv_isDotDir( const TCHAR* name ) { if( name[0] == '\0' ) { return (false); } if( name[0] == '.' && name[1] == '\0' ) { return (true); } if( name[1] == '\0' ) { return (false); } if( name[0] == '.' && name[1] == '.' && name[2] == '\0' ) { return (true); } return (false); } //internal static function shared for clucene string Misc::segmentname( const char* segment, const char* ext, const int32_t x ){ //Func - Returns an allocated buffer in which it creates a filename by // concatenating segment with ext and x //Pre ext != NULL and holds the extension // x contains a number //Post - A buffer has been instantiated an when x = -1 buffer contains the concatenation of // segment and ext otherwise buffer contains the contentation of segment, ext and x CND_PRECONDITION(ext != NULL, "ext is NULL"); if ( x!=-1 ){ char buf[30]; _snprintf(buf,10,"%d",x); return string(segment) + ext + buf; }else{ return string(segment) + ext; } } void Misc::segmentname(char* buffer,int32_t bufferLen, const char* Segment, const char* ext, const int32_t x){ //Func - Static Method // Creates a filename in buffer by concatenating Segment with ext and x //Pre - buffer != NULL // Segment != NULL and holds the name of the segment // ext != NULL and holds the extension // x contains a number //Post - When x = -1 buffer contains the concatenation of Segment and ext otherwise // buffer contains the contentation of Segment, ext and x CND_PRECONDITION(buffer != NULL, "buffer is NULL"); CND_PRECONDITION(Segment != NULL, "Segment is NULL"); CND_PRECONDITION(ext != NULL, "ext is NULL"); if ( x== -1 ) _snprintf(buffer,bufferLen,"%s%s", Segment,ext ); else _snprintf(buffer,bufferLen,"%s%s%d", Segment,ext,x ); } //static int32_t Misc::stringDifference(const TCHAR* s1, const int32_t len1, const TCHAR* s2, const int32_t len2) { int32_t len = len1 < len2 ? len1 : len2; for (int32_t i = 0; i < len; i++) if ( s1[i] != s2[i]) return i; return len; } TCHAR* Misc::stringTrim(TCHAR* text) { size_t j, i; size_t len = _tcslen(text); for ( i=0;i i; --j ){ // find the last non-space character and store it as j if ( ! _istspace(text[j]) ) { break; } } if (i==0 && j==len-1) // prevent unnecessary copy return text; if (i==0) text[j+1]=0; else { j++; _tcsncpy(text, text+i, j-i); text[j-i] = 0; } return text; } TCHAR* Misc::wordTrim(TCHAR* text) { size_t j, i; size_t len = _tcslen(text); for ( i=0;i buf && value ); memcpy( retval, ptr, end - ptr ); retval[end-ptr] = 0; return end-ptr; } int64_t Misc::base36ToLong( const char* value ) { char* ptr = (char*)value; int64_t lval = 0; while ( *ptr != '\0' ) { lval = isdigit(*ptr) ? ( 36 * lval ) + ( *ptr - '0' ) : ( 36 * lval ) + ( *ptr - 'a' + 10 ); ptr++; } return lval; } bool Misc::listFiles(const char* directory, std::vector& files, bool fullPath){ //clear old files DIR* dir = opendir(directory); if ( dir == NULL ) return false; struct dirent* fl = readdir(dir); struct cl_stat_t buf; string path; while ( fl != NULL ){ path = string(directory) + "/" + fl->d_name; int32_t ret = fileStat(path.c_str(),&buf); if ( ret==0 && !(buf.st_mode & S_IFDIR) ) { if ( (strcmp(fl->d_name, ".")) && (strcmp(fl->d_name, "..")) ) { if ( fullPath ){ files.push_back(path); }else{ files.push_back(fl->d_name); } } } fl = readdir(dir); } closedir(dir); return true; } std::string Misc::toString(const bool value){ return value ? "true" : "false"; } std::string Misc::toString(_LUCENE_THREADID_TYPE value){ static int32_t nextindex = 0; static std::map<_LUCENE_THREADID_TYPE, int32_t> ids; if (ids.find(value) == ids.end()) { ids[value] = nextindex++; } return toString(ids[value]); } std::string Misc::toString(const int32_t value){ char buf[20]; TCHAR tbuf[20]; _i64tot(value, tbuf, 10); STRCPY_TtoA(buf,tbuf,20); return buf; } std::string Misc::toString(const int64_t value){ char buf[20]; TCHAR tbuf[20]; _i64tot(value, tbuf, 10); STRCPY_TtoA(buf,tbuf,20); return buf; } std::string Misc::toString(const float_t value){ char buf[20]; _snprintf(buf,20,"%0.2f",(double)value); return buf; } void Misc::zerr(int ret, string& err) { switch (ret) { case Z_ERRNO: err = "error occurred while reading or writing from the zlib streams"; break; case Z_STREAM_ERROR: err = "invalid compression level"; break; case Z_DATA_ERROR: err = "invalid or incomplete deflate data"; break; case Z_MEM_ERROR: err = "out of memory"; break; case Z_VERSION_ERROR: err ="zlib version mismatch"; } } /* Compress from file source to file dest until EOF on source. def() returns Z_OK on success, Z_MEM_ERROR if memory could not be allocated for processing, Z_STREAM_ERROR if an invalid compression level is supplied, Z_VERSION_ERROR if the version of zlib.h and the version of the library linked do not match, or Z_ERRNO if there is an error reading or writing the files. */ bool Misc::deflate(const uint8_t* in, size_t inlen, std::ostream& dest, string& err, int CHUNK, int level) { int ret, flush; unsigned have; z_stream strm; if ( level == -1 ) level = Z_BEST_COMPRESSION; if ( CHUNK == -1 ) CHUNK = CL_Z_DEFAULT_CHUNK; uint8_t* out = (uint8_t*)malloc(CHUNK); /* allocate deflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; ret = deflateInit(&strm, level); if (ret != Z_OK){ free(out); zerr(ret, err); return false; } /* compress until end of file */ do { strm.avail_in = inlen; strm.next_in = (uint8_t*)in; flush = Z_FINISH; /* run deflate() on input until output buffer not full, finish compression if all of source has been read in */ do { strm.avail_out = CHUNK; strm.next_out = out; ret = ::deflate(&strm, flush); /* no bad return value */ assert(ret != Z_STREAM_ERROR); /* state not clobbered */ have = CHUNK - strm.avail_out; dest.write( (char*)out,have); if ( dest.fail() ) { (void)deflateEnd(&strm); free(out); zerr(Z_ERRNO, err); return false; } } while (strm.avail_out == 0); assert(strm.avail_in == 0); /* all input will be used */ /* done when last data in file processed */ } while (flush != Z_FINISH); assert(ret == Z_STREAM_END); /* stream will be complete */ /* clean up and return */ (void)deflateEnd(&strm); free(out); return true; } /* Decompress from file source to file dest until stream ends or EOF. inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be allocated for processing, Z_DATA_ERROR if the deflate data is invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and the version of the library linked do not match, or Z_ERRNO if there is an error reading or writing the files. */ bool Misc::inflate(const uint8_t* in, size_t inlen, std::ostream& dest, string& err, int CHUNK) { int ret; unsigned have; z_stream strm; if ( CHUNK == -1 ) CHUNK = CL_Z_DEFAULT_CHUNK; uint8_t* out = (uint8_t*)malloc(CHUNK); /* allocate inflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = 0; strm.next_in = Z_NULL; ret = inflateInit(&strm); if (ret != Z_OK){ free(out); zerr(ret, err); return false; } /* decompress until deflate stream ends or end of file */ do { strm.avail_in = inlen; if (strm.avail_in == 0) break; strm.next_in = (uint8_t*)in; /* run inflate() on input until output buffer not full */ do { strm.avail_out = CHUNK; strm.next_out = out; ret = ::inflate(&strm, Z_NO_FLUSH); assert(ret != Z_STREAM_ERROR); /* state not clobbered */ switch (ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; /* and fall through */ case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd(&strm); free(out); zerr(ret, err); return false; } have = CHUNK - strm.avail_out; dest.write( (char*)out,have); if ( dest.fail() ) { (void)inflateEnd(&strm); free(out); zerr(Z_ERRNO, err); return false; } } while (strm.avail_out == 0); /* done when inflate() says it's done */ } while (ret != Z_STREAM_END); /* clean up and return */ (void)inflateEnd(&strm); free(out); if ( ret == Z_STREAM_END ) return true; zerr(Z_DATA_ERROR, err); return false; } CL_NS_END clucene-core-2.3.3.4/src/shared/CLucene/util/Misc.h000066400000000000000000000111371154025176300216300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_Misc_H #define _lucene_util_Misc_H #include CL_NS_DEF(util) /** A class containing various functions. */ class CLUCENE_SHARED_EXPORT Misc{ static void zerr(int ret, std::string& err); public: static uint64_t currentTimeMillis(); static const TCHAR* replace_all( const TCHAR* val, const TCHAR* srch, const TCHAR* repl ); static bool dir_Exists(const char* path); static int64_t file_Size(const char* path); static int64_t filelength(int handle); static void sleep(const int ms); /** * Unlinks the given file, waits until dir_Exists is false. It makes maxAttempts * attempts to remove the file. If maxAttemps is less than 0 then unlimited * count of attempts is done. * Returns 1 if deleted and dir_Exists returns false * Returns 0 if deleted and dir_Exists returns still true * Returns -1 if file can not be deleted. */ static int32_t file_Unlink(const char* path, int32_t maxAttempts = -1); static size_t ahashCode(const char* str); static size_t ahashCode(const char* str, size_t len); static TCHAR* join ( const TCHAR* a, const TCHAR* b, const TCHAR* c=NULL, const TCHAR* d=NULL,const TCHAR* e=NULL,const TCHAR* f=NULL ); static char* ajoin ( const char* a, const char* b, const char* c=NULL, const char* d=NULL,const char* e=NULL,const char* f=NULL ); static bool priv_isDotDir( const TCHAR* name ); //Creates a filename by concatenating Segment with ext and x static std::string segmentname(const char* segment, const char* ext, const int32_t x=-1 ); //Creates a filename in buffer by concatenating Segment with ext and x static void segmentname(char* buffer,int32_t bufferLen, const char* Segment, const char* ext, const int32_t x=-1); /** * Compares two strings, character by character, and returns the * first position where the two strings differ from one another. * * @param s1 The first string to compare * @param s1Len The length of the first string to compare * @param s2 The second string to compare * @param s2Len The length of the second string to compare * @return The first position where the two strings differ. */ static int32_t stringDifference(const TCHAR* s1, const int32_t s1Len, const TCHAR* s2, const int32_t s2Len); // In-place trimming for strings and words ("te st" will be returned by stringTrim, while wordTrim will return "te") // This is by design only meant for use with on-memory strings, and calling it like stringTrim(_T("test")) will // be errorneous static TCHAR* stringTrim(TCHAR* s); static TCHAR* wordTrim(TCHAR* s); static size_t longToBase( int64_t value, int32_t base, char* to ); //< length of to should be at least ((sizeof(unsigned long) << 3) + 1). returns actual length used static int64_t base36ToLong( const char* value ); static std::string toString(const int32_t value); static std::string toString(const int64_t value); static std::string toString(const _LUCENE_THREADID_TYPE value); static std::string toString(const bool value); static std::string toString(const float_t value); static std::string toString(const TCHAR* s, int32_t len=-1); #ifdef _UCS2 static size_t whashCode(const wchar_t* str); static size_t whashCode(const wchar_t* str, size_t len); #define thashCode whashCode static char* _wideToChar(const wchar_t* s); static wchar_t* _charToWide(const char* s); static void _cpycharToWide(const char* s, wchar_t* d, size_t len); static void _cpywideToChar(const wchar_t* s, char* d, size_t len); #else #define thashCode ahashCode #endif /** List all files in dir. * @param bool fullPath True to return entire path */ static bool listFiles(const char* dir, std::vector& files, bool fullPath=false); /** uncompress the source stream into the dest stream. * Default CHUNK size is 1k */ static bool inflate(const uint8_t* source, size_t sourcelen, std::ostream& dest, std::string& err, int CHUNK=-1); /** compress the source stream into the dest stream. * Default CHUNK size is 1k * Default level is Z_BEST_COMPRESSION */ static bool deflate(const uint8_t* source, size_t sourcelen, std::ostream& dest, std::string& err, int CHUNK=-1, int level=-1); }; CL_NS_END #endif clucene-core-2.3.3.4/src/shared/CLucene/util/StringBuffer.cpp000066400000000000000000000353341154025176300236750ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #include "StringBuffer.h" #include "Misc.h" #include CL_NS_DEF(util) StringBuffer::StringBuffer(TCHAR* buf,size_t maxlen, const bool consumeBuffer){ buffer = buf; bufferLength = maxlen; bufferOwner = !consumeBuffer; len = 0; } StringBuffer::StringBuffer(){ //Func - Constructor. Allocates a buffer with the default length. //Pre - true //Post - buffer of length bufferLength has been allocated //Initialize bufferLength = LUCENE_DEFAULT_TOKEN_BUFFER_SIZE; len = 0; //Allocate a buffer of length bufferLength buffer = _CL_NEWARRAY(TCHAR,bufferLength); bufferOwner = true; } StringBuffer::StringBuffer(const size_t initSize){ //Func - Constructor. Allocates a buffer of length initSize + 1 //Pre - initSize > 0 //Post - A buffer has been allocated of length initSize + 1 //Initialize the bufferLength to initSize + 1 The +1 is for the terminator '\0' bufferLength = initSize + 1; len = 0; //Allocate a buffer of length bufferLength buffer = _CL_NEWARRAY(TCHAR,bufferLength); bufferOwner = true; } StringBuffer::StringBuffer(const TCHAR* value){ //Func - Constructor. // Creates an instance of Stringbuffer containing a copy of the string value //Pre - value != NULL //Post - An instance of StringBuffer has been created containing the copy of the string value //Initialize the length of the string to be stored in buffer len = (size_t) _tcslen(value); //Calculate the space occupied in buffer by a copy of value const size_t occupiedLength = len + 1; // Minimum allocated buffer length is LUCENE_DEFAULT_TOKEN_BUFFER_SIZE. bufferLength = (occupiedLength >= LUCENE_DEFAULT_TOKEN_BUFFER_SIZE ? occupiedLength : LUCENE_DEFAULT_TOKEN_BUFFER_SIZE); //Allocate a buffer of length bufferLength buffer = _CL_NEWARRAY(TCHAR,bufferLength); bufferOwner = true; //Copy the string value into buffer _tcsncpy(buffer, value, occupiedLength); //Assert that the buffer has been terminated at the end of the string CND_PRECONDITION (buffer[len] == '\0', "Buffer was not correctly terminated"); } StringBuffer::~StringBuffer() { // Func - Destructor // Pre - true // Post - Instanc has been destroyed if( bufferOwner ){ _CLDELETE_CARRAY(buffer); }else buffer = NULL; } void StringBuffer::clear(){ //Func - Clears the Stringbuffer and resets it to it default empty state //Pre - true //Post - pre(buffer) has been destroyed and a new one has been allocated // TODO: Should we really delete and recreate the buffer - perhaps just reseting len should suffice? // We should really look into at least providing both options //Destroy the current buffer if present _CLDELETE_LCARRAY(buffer); //Initialize len = 0; bufferLength = LUCENE_DEFAULT_TOKEN_BUFFER_SIZE; //Allocate a buffer of length bufferLength buffer = _CL_NEWARRAY(TCHAR,bufferLength); } void StringBuffer::appendChar(const TCHAR character) { //Func - Appends a single character //Pre - true //Post - The character has been appended to the string in the buffer //Check if the current buffer length is sufficient to have the string value appended if (len + 1 > bufferLength){ //Have the size of the current string buffer increased because it is too small growBuffer(len + 1); } //Put character at position len which is the end of the string in the buffer //Note that this action might overwrite the terminator of the string '\0', which //is kind of tricky buffer[len] = character; //Increase the len by to represent the correct length of the string in the buffer len++; } void StringBuffer::append(const TCHAR* value) { //Func - Appends a copy of the string value //Pre - value != NULL //Post - value has been copied and appended to the string in buffer append(value, _tcslen(value)); } void StringBuffer::append(const TCHAR* value, size_t appendedLength) { //Func - Appends a copy of the string value //Pre - value != NULL // appendedLength contains the length of the string value which is to be appended //Post - value has been copied and appended to the string in buffer //Check if the current buffer length is sufficient to have the string value appended if (len + appendedLength + 1 > bufferLength){ //Have the size of the current string buffer increased because it is too small growBuffer(len + appendedLength + 1); } //Copy the string value into the buffer at postion len _tcsncpy(buffer + len, value, appendedLength); //Add the length of the copied string to len to reflect the new length of the string in //the buffer (Note: len is not the bufferlength!) len += appendedLength; } void StringBuffer::appendInt(const int64_t value, const int32_t _Radix) { //Func - Appends an integer (after conversion to a character string) //Pre - true //Post - The converted integer value has been appended to the string in buffer //instantiate a buffer of 30 charactes for the conversion of the integer TCHAR buf[30]; //Convert the integer value to a string buf using _Radix _i64tot(value, buf, _Radix); //Have the converted integer now stored in buf appended to the string in buffer append(buf); } void StringBuffer::appendFloat(const float_t value, const size_t digits){ //Func - Appends a float_t (after conversion to a character string) //Pre - digits > 0. Indicates the minimum number of characters printed //Post - The converted float_t value has been appended to the string in buffer //using sprintf("%f" was not reliable on other plaforms... we use a custom float convertor //bvk: also, using sprintf and %f seems excessivelly slow assert(digits <= 8); //the maximum number of characters that int64 will hold is 23. so we need 23*2+2 TCHAR buf[48]; //the buffer to hold int64_t v = (int64_t)value; //the integer value of the float _i64tot(v,buf,10); //add the whole number size_t l = 99-_tcslen(buf); //how many digits we have to work with? size_t dig = l< (size_t)digits ? l : digits; if ( dig > 0 ){ _tcscat(buf,_T(".")); //add a decimal point int64_t remi=(int64_t)((value-v)*pow((float_t)10,(float_t)(dig+1))); //take the remainder and make a whole number if ( remi<0 ) remi*=-1; int64_t remadj=remi/10; if ( remi-(remadj*10) >=5 ) remadj++; //adjust remainder // add as many zeros as necessary between the decimal point and the // significant part of the number. Fixes a bug when trying to print // numbers that have zeros right after the decimal point if (remadj) { size_t numZeros = dig - (size_t)log10((float_t)remadj) - 1; while(numZeros-- > 0 && numZeros < 10) _tcscat(buf,_T("0")); //add a zero before the decimal point } _i64tot(remadj,buf+_tcslen(buf),10); //add the remainder } append(buf); } void StringBuffer::appendBoost(const float_t boost){ if (boost != 1.0f) { appendChar(_T('^')); appendFloat(boost,1); } } void StringBuffer::appendBool(const bool value){ append( value ? _T( "true" ) : _T( "false" )); } void StringBuffer::prepend(const TCHAR* value){ //Func - Puts a copy of the string value infront of the current string in the StringBuffer //Pre - value != NULL //Post - The string in pre(buffer) has been shifted n positions where n equals the length of value. // The string value was then copied to the beginning of stringbuffer prepend(value, _tcslen(value)); } void StringBuffer::prepend(const TCHAR* value, const size_t prependedLength) { //Func - Puts a copy of the string value in front of the string in the StringBuffer //Pre - value != NULL // prependedLength contains the length of the string value which is to be prepended //Post - A copy of the string value is has been in front of the string in buffer //todo: something is wrong with this code, i'm sure... it only grows (and therefore moves if the buffer is to small) //Check if the current buffer length is sufficient to have the string value prepended if (prependedLength + len + 1 > bufferLength){ //Have the size of the current string buffer increased because it is too small //Because prependedLength is passed as the second argument to growBuffer, //growBuffer will have left the first prependedLength characters empty //when it recopied buffer during reallocation. growBuffer(prependedLength + len + 1, prependedLength); } //Copy the string value into the buffer at postion 0 _tcsncpy(buffer, value, prependedLength); //Add the length of the copied string to len to reflect the new length of the string in //the buffer (Note: len is not the bufferlength!) len += prependedLength; } size_t StringBuffer::length() const{ //Func - Returns the length of the string in the StringBuffer //Pre - true //Post - The length len of the string in the buffer has been returned return len; } TCHAR* StringBuffer::toString(){ //Func - Returns a copy of the current string in the StringBuffer sized equal to the length of the string // in the StringBuffer. //Pre - true //Post - The copied string has been returned //Instantiate a buffer equal to the length len + 1 TCHAR* ret = _CL_NEWARRAY(TCHAR,len + 1); if (ret){ //Copy the string in buffer _tcsncpy(ret, buffer, len); //terminate the string ret[len] = '\0'; } //return the the copy return ret; } TCHAR* StringBuffer::getBuffer() { //Func - '\0' terminates the buffer and returns its pointer //Pre - true //Post - buffer has been '\0' terminated and returned // Check if the current buffer is '\0' terminated if (len == bufferLength){ //Make space for terminator, if necessary. growBuffer(len + 1); } //'\0' buffer so it can be returned properly buffer[len] = '\0'; return buffer; } TCHAR* StringBuffer::giveBuffer() { TCHAR* ret = getBuffer(); buffer = NULL; len = 0; bufferLength = 0; bufferOwner = false; return ret; } void StringBuffer::reserve(const size_t size){ if ( bufferLength >= size ) return; bufferLength = size; //Allocate a new buffer of length bufferLength TCHAR* tmp = _CL_NEWARRAY(TCHAR,bufferLength); _tcsncpy(tmp, buffer, len); tmp[len] = '\0'; //destroy the old buffer if (buffer){ _CLDELETE_CARRAY(buffer); } //Assign the new buffer tmp to buffer buffer = tmp; } void StringBuffer::growBuffer(const size_t minLength, const size_t skippingNInitialChars) { //Func - Has the buffer grown to a minimum length of minLength or bigger and shifts the // current string in buffer by skippingNInitialChars forward //Pre - After growth, must have at least enough room for contents + terminator so // minLength >= skippingNInitialChars + len + 1 // skippingNInitialChars >= 0 //Post - The buffer has been grown to a minimum length of minLength or bigger and // if skippingNInitialChars > 0, the contents of the buffer has beeen shifted // forward by skippingNInitialChars positions as the buffer is reallocated, // leaving the first skippingNInitialChars uninitialized (presumably to be // filled immediately thereafter by the caller). CND_PRECONDITION (minLength >= skippingNInitialChars + len + 1,"skippingNInitialChars is not large enough"); //More aggressive growth strategy to offset smaller default buffer size: if ( !bufferOwner ){ assert(bufferLength>=minLength); return; } bufferLength *= 2; //Check that bufferLength is bigger than minLength if (bufferLength < minLength){ //Have bufferLength become minLength because it still was too small bufferLength = minLength; } //Allocate a new buffer of length bufferLength TCHAR* tmp = _CL_NEWARRAY(TCHAR,bufferLength); memset(tmp, 0, sizeof(TCHAR) * skippingNInitialChars); //The old buffer might not have been null-terminated, so we _tcsncpy //only len bytes, not len+1 bytes (the latter might read one char off the //end of the old buffer), then apply the terminator to the new buffer. _tcsncpy(tmp + skippingNInitialChars, buffer, len); tmp[skippingNInitialChars + len] = '\0'; //destroy the old buffer _CLDELETE_LCARRAY(buffer); //Assign the new buffer tmp to buffer buffer = tmp; } void StringBuffer::setCharAt(size_t pos, const TCHAR chr) { CND_PRECONDITION (pos < len, "pos is not in string"); buffer[pos] = chr; } TCHAR StringBuffer::charAt(size_t pos) { CND_PRECONDITION (pos < len, "pos is not in string"); return buffer[pos]; } void StringBuffer::insert(const size_t pos, TCHAR chr) { CND_PRECONDITION (pos <= len, "pos is larger than string len"); growBuffer(len + 1, 0); memmove(&buffer[pos + 1], &buffer[pos], sizeof(TCHAR) * (len - pos)); buffer[pos] = chr; len++; } void StringBuffer::insert(const size_t pos, const TCHAR* chrs, size_t length) { CND_PRECONDITION (pos <= len, "pos is larger than string len"); if (length == -1) { length = _tcslen(chrs); } if (length > 0) { growBuffer(len + length, 0); memmove(&buffer[pos + length], &buffer[pos], sizeof(TCHAR) * (len - pos)); memcpy(&buffer[pos], chrs, sizeof(TCHAR) * (length)); len += length; } } void StringBuffer::deleteCharAt(size_t pos) { CND_PRECONDITION (pos < len, "pos is larger than string len"); memmove(&buffer[pos], &buffer[pos + 1], sizeof(TCHAR) * (len - pos)); len--; buffer[len] = _T('\0'); } void StringBuffer::deleteChars(size_t start, size_t end) { CND_PRECONDITION (start <= end && end <= len, "start/end is not in string"); if (start < end) { memmove(&buffer[start], &buffer[end], sizeof(TCHAR) * (len - end)); buffer[len - (end - start)] = _T('\0'); len -= end - start; } } void StringBuffer::toLower() { _tcslwr(buffer); } bool StringBuffer::substringEquals(size_t start, size_t end, const TCHAR* str, size_t length) const { if (length == -1) { length = _tcslen(str); } if (end - start != length) { return false; } for (size_t c = start; c < end; c++) { if (buffer[c] != str[c - start]) { return false; } } return true; } CL_NS_END clucene-core-2.3.3.4/src/shared/CLucene/util/StringBuffer.h000066400000000000000000000077151154025176300233440ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_util_StringBuffer_ #define _lucene_util_StringBuffer_ CL_NS_DEF(util) class CLUCENE_SHARED_EXPORT StringBuffer{ public: ///Constructor. Allocates a buffer with the default length. StringBuffer(); ///Constructor. Allocates a buffer of length initSize + 1 StringBuffer(const size_t initSize); ///Constructor. Creates an instance of Stringbuffer containing a copy of ///the string value StringBuffer(const TCHAR* value); ///Constructs a StringBuffer using another buffer. The StringBuffer can ///the be used to easily manipulate the buffer. StringBuffer(TCHAR* buf,size_t maxlen, const bool consumeBuffer); ///Destructor virtual ~StringBuffer(); ///Clears the Stringbuffer and resets it to it default empty state void clear(); ///Appends a single character void appendChar(const TCHAR chr); ///Appends a copy of the string value void append(const TCHAR* value); ///Appends a copy of the string value void append(const TCHAR* value, size_t appendedLength); ///Appends an integer (after conversion to a character string) with a default radix of 10. Radixes lower than 10 not supported. void appendInt(const int64_t value, const int32_t _Radix = 10); ///Appends a float_t (after conversion to a character string) void appendFloat(const float_t value, const size_t digits); ///Appends a Lucene boost, formatted in the format used in the toString() functions; replaces JL's ToStringUtils::boost void appendBoost(const float_t boost); ///Appends a bool in the same way as java StringBuffer does (i.e. "true", "false" ) void appendBool(const bool value); ///Puts a copy of the string value in front of the current string in the StringBuffer void prepend(const TCHAR* value); ///Puts a copy of the string value in front of the current string in the StringBuffer void prepend(const TCHAR* value, size_t prependedLength); StringBuffer& operator<< (const TCHAR* value) { append(value); return *this; } StringBuffer& operator<< (const int64_t value) { appendInt(value); return *this; } void setCharAt(size_t pos, const TCHAR chr); TCHAR charAt(size_t pos); void insert(const size_t pos, TCHAR chr); void insert(const size_t pos, const TCHAR* chrs, size_t length = -1); void deleteCharAt(size_t pos); void deleteChars(size_t start, size_t end); void toLower(); bool substringEquals(size_t start, size_t end, const TCHAR* str, size_t length = -1) const; ///Contains the length of string in the StringBuffer ///Public so that analyzers can edit the length directly size_t len; ///Returns the length of the string in the StringBuffer size_t length() const; ///Returns a copy of the current string in the StringBuffer TCHAR* toString(); ///Returns a null terminated reference to the StringBuffer's text TCHAR* getBuffer(); /** Returns a null terminated reference to the StringBuffer's text * the StringBuffer's buffer is released so that the text doesn't need to be copied */ TCHAR* giveBuffer(); ///reserve a minimum amount of data for the buffer. ///no change made if the buffer is already longer than length void reserve(const size_t length); private: ///A buffer that contains strings TCHAR* buffer; ///The length of the buffer size_t bufferLength; bool bufferOwner; ///Has the buffer grown to a minimum length of minLength or bigger and shifts the ///current string in buffer by skippingNInitialChars forward void growBuffer(const size_t minLength, const size_t skippingNInitialChars=0); }; CL_NS_END #endif clucene-core-2.3.3.4/src/shared/CLucene/util/deflate.cpp000066400000000000000000001743711154025176300227060ustar00rootroot00000000000000/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "zlib/deflate.h" const char deflate_copyright[] = " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #endif local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, int stream_size) { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_( z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size) { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary ( z_streamp strm, const Bytef *dictionary, uInt dictLength ){ deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); dictionary += dictLength - length; /* use the tail of the dictionary */ } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (z_streamp strm) { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateSetHeader ( z_streamp strm, gz_headerp head) { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime ( z_streamp strm, int bits, int value ){ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; strm->state->bi_valid = bits; strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams( z_streamp strm, int level, int strategy ){ deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= */ int ZEXPORT deflateTune( z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain ){ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; s->good_match = good_length; s->max_lazy_match = max_lazy; s->nice_match = nice_length; s->max_chain_length = max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds * for every combination of windowBits and memLevel, as well as wrap. * But even the conservative upper bound of about 14% expansion does not * seem onerous for output buffer allocation. */ uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) { deflate_state *s; uLong destLen; /* conservative upper bound */ destLen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; /* if can't get parameters, return conservative bound */ if (strm == Z_NULL || strm->state == Z_NULL) return destLen; /* if not default parameters, return conservative bound */ s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) return destLen; /* default settings: return tight bound for that case */ return compressBound(sourceLen); } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (deflate_state *s, uInt b) { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(z_streamp strm) { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (z_streamp strm, int flush) { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } #ifdef GZIP if (s->status == EXTRA_STATE) { if (s->gzhead->extra != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) break; } put_byte(s, s->gzhead->extra[s->gzindex]); s->gzindex++; } if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (s->gzindex == s->gzhead->extra_len) { s->gzindex = 0; s->status = NAME_STATE; } } else s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) { s->gzindex = 0; s->status = COMMENT_STATE; } } else s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) s->status = HCRC_STATE; } else s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) flush_pending(strm); if (s->pending + 2 <= s->pending_buf_size) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); s->status = BUSY_STATE; } } else s->status = BUSY_STATE; } #endif /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (z_streamp strm) { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != EXTRA_STATE && status != NAME_STATE && status != COMMENT_STATE && status != HCRC_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (z_streamp dest, z_streamp source) { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy(dest, source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; zmemcpy(ds, ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(z_streamp strm, Bytef *buf, unsigned size) { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (deflate_state *s) { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #endif /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 or strategy == Z_RLE only */ local uInt longest_match_fast(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ #ifdef FASTEST if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { s->match_length = longest_match_fast (s, hash_head); } #else if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } #endif /* longest_match() or longest_match_fast() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } /* longest_match() or longest_match_fast() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* FASTEST */ #if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt run; /* length of run */ uInt max; /* maximum length of run */ uInt prev; /* byte at distance one to match */ Bytef *scan; /* scan for end of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the longest encodable run. */ if (s->lookahead < MAX_MATCH) { fill_window(s); if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ run = 0; if (s->strstart > 0) { /* if there is a previous byte, that is */ max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; scan = s->window + s->strstart - 1; prev = *scan++; do { if (*scan++ != prev) break; } while (++run < max); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (run >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, run); _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); s->lookahead -= run; s->strstart += run; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif clucene-core-2.3.3.4/src/shared/CLucene/util/dirent.cpp000066400000000000000000000112421154025176300225520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Matt J. Weinstein * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CLucene/_ApiHeader.h" #if !defined(_CL_HAVE_DIRENT_H) && !defined(_CL_HAVE_SYS_NDIR_H) && !defined(_CL_HAVE_SYS_DIR_H) && !defined(_CL_HAVE_NDIR_H) #include "dirent.h" #include #include DIR * opendir (const char *szPath) { DIR *nd; char szFullPath[CL_MAX_PATH]; errno = 0; if (!szPath) { errno = EFAULT; return NULL; } if (szPath[0] == '\0') { errno = ENOTDIR; return NULL; } /* Attempt to determine if the given path really is a directory. */ struct cl_stat_t rcs; if ( fileStat(szPath,&rcs) == -1) { /* call GetLastError for more error info */ errno = ENOENT; return NULL; } if (!(rcs.st_mode & _S_IFDIR)) { /* Error, entry exists but not a directory. */ errno = ENOTDIR; return NULL; } /* Make an absolute pathname. */ _realpath(szPath,szFullPath); /* Allocate enough space to store DIR structure and the complete * directory path given. */ //nd = (DIR *) malloc (sizeof (DIR) + _tcslen (szFullPath) + _tcslen (DIRENT_SLASH) + // _tcslen (DIRENT_SEARCH_SUFFIX)+1); nd = new DIR; if (!nd) { /* Error, out of memory. */ errno = ENOMEM; return NULL; } /* Create the search expression. */ strcpy (nd->dd_name, szFullPath); /* Add on a slash if the path does not end with one. */ if (nd->dd_name[0] != '\0' && nd->dd_name[strlen (nd->dd_name) - 1] != '/' && nd->dd_name[strlen (nd->dd_name) - 1] != '\\') { strcat (nd->dd_name, DIRENT_SLASH); } /* Add on the search pattern */ strcat (nd->dd_name, DIRENT_SEARCH_SUFFIX); /* Initialize handle to -1 so that a premature closedir doesn't try * to call _findclose on it. */ nd->dd_handle = -1; /* Initialize the status. */ nd->dd_stat = 0; /* Initialize the dirent structure. ino and reclen are invalid under * Win32, and name simply points at the appropriate part of the * findfirst_t structure. */ //nd->dd_dir.d_ino = 0; //nd->dd_dir.d_reclen = 0; nd->dd_dir.d_namlen = 0; nd->dd_dir.d_name = nd->dd_dta.name; return nd; } struct dirent * readdir (DIR * dirp) { errno = 0; /* Check for valid DIR struct. */ if (!dirp) { errno = EFAULT; return NULL; } if (dirp->dd_dir.d_name != dirp->dd_dta.name) { /* The structure does not seem to be set up correctly. */ errno = EINVAL; return NULL; } bool bCallFindNext = true; if (dirp->dd_stat < 0) { /* We have already returned all files in the directory * (or the structure has an invalid dd_stat). */ return NULL; } else if (dirp->dd_stat == 0) { /* We haven't started the search yet. */ /* Start the search */ dirp->dd_handle = _findfirst (dirp->dd_name, &(dirp->dd_dta)); if (dirp->dd_handle == -1) { /* Whoops! Seems there are no files in that * directory. */ dirp->dd_stat = -1; } else { dirp->dd_stat = 1; } /* Dont call _findnext first time. */ bCallFindNext = false; } while (dirp->dd_stat > 0) { if (bCallFindNext) { /* Get the next search entry. */ if (_findnext (dirp->dd_handle, &(dirp->dd_dta))) { /* We are off the end or otherwise error. */ _findclose (dirp->dd_handle); dirp->dd_handle = -1; dirp->dd_stat = -1; return NULL; } else { /* Update the status to indicate the correct * number. */ dirp->dd_stat++; } } /* Successfully got an entry. Everything about the file is * already appropriately filled in except the length of the * file name. */ dirp->dd_dir.d_namlen = strlen (dirp->dd_dir.d_name); bool bThisFolderOrUpFolder = dirp->dd_dir.d_name[0] == '.' && (dirp->dd_dir.d_name[1] == 0 || (dirp->dd_dir.d_name[1] == '.' && dirp->dd_dir.d_name[2] == 0)); if (!bThisFolderOrUpFolder) { struct cl_stat_t buf; char buffer[CL_MAX_DIR]; size_t bl = strlen(dirp->dd_name)-strlen(DIRENT_SEARCH_SUFFIX); strncpy(buffer,dirp->dd_name,bl); buffer[bl]=0; strcat(buffer, dirp->dd_dir.d_name); if ( fileStat(buffer,&buf) == 0 ) { /* Finally we have a valid entry. */ return &dirp->dd_dir; } } /* Allow to find next file. */ bCallFindNext = true; } return NULL; } int32_t closedir (DIR * dirp) { int32_t rc; errno = 0; rc = 0; if (!dirp) { errno = EFAULT; return -1; } if (dirp->dd_handle != -1) { rc = _findclose (dirp->dd_handle); } /* Delete the dir structure. */ _CLVDELETE(dirp); return rc; } #endif //HAVE_DIRENT_H clucene-core-2.3.3.4/src/shared/CLucene/util/dirent.h000066400000000000000000000054721154025176300222270ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Matt J. Weinstein * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef lucene_util_dirent_H #define lucene_util_dirent_H #if !defined(_CL_HAVE_DIRENT_H) && !defined(_CL_HAVE_SYS_NDIR_H) && !defined(_CL_HAVE_SYS_DIR_H) && !defined(_CL_HAVE_NDIR_H) #ifdef _WIN64 typedef __int64 intptr_t; #else typedef int intptr_t; #endif #include /** * dirent.c * * Derived from DIRLIB.C by Matt J. Weinstein * This note appears in the DIRLIB.H * DIRLIB.H by M. J. Weinstein Released to public domain 1-Jan-89 * * Updated by Jeremy Bettis * Significantly revised and rewinddir, seekdir and telldir added by Colin * Cut down again & changed by Ben van Klinken * Peters * */ /** dirent structure - used by the dirent.h directory iteration functions */ struct CLUCENE_SHARED_INLINE_EXPORT dirent { unsigned short d_namlen; /* Length of name in d_name. */ char *d_name; /* File name. */ }; /** DIR structure - used by the dirent.h directory iteration functions*/ struct CLUCENE_SHARED_INLINE_EXPORT DIR { /** disk transfer area for this dir */ struct _finddata_t dd_dta; /* dirent struct to return from dir (NOTE: this makes this thread * safe as long as only one thread uses a particular DIR struct at * a time) */ struct dirent dd_dir; /** _findnext handle */ intptr_t dd_handle; /** * Status of search: * 0 = not started yet (next entry to read is first entry) * -1 = off the end * positive = 0 based index of next entry */ int32_t dd_stat; /** given path for dir with search pattern (struct is extended) */ char dd_name[CL_MAX_DIR]; }; #define DIRENT_SEARCH_SUFFIX "*" #define DIRENT_SLASH PATH_DELIMITERA /** * Returns a pointer to a DIR structure appropriately filled in to begin * searching a directory. */ CLUCENE_SHARED_EXPORT DIR* opendir (const char* filespec); /** * Return a pointer to a dirent structure filled with the information on the * next entry in the directory. */ CLUCENE_SHARED_EXPORT struct dirent* readdir (DIR* dir); /** * Frees up resources allocated by opendir. */ CLUCENE_SHARED_EXPORT int32_t closedir (DIR* dir); #elif defined (_CL_HAVE_DIRENT_H) # include # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if defined(_CL_HAVE_SYS_NDIR_H) # include # endif # if defined(_CL_HHAVE_SYS_DIR_H) # include # endif # if defined(_CL_HHAVE_NDIR_H) # include # endif #endif //HAVE_DIRENT_H #endif clucene-core-2.3.3.4/src/shared/CMakeLists.txt000066400000000000000000000322431154025176300210320ustar00rootroot00000000000000PROJECT(clucene-shared) #define command line options INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS} -DMAKE_CLUCENE_SHARED_LIB) # include specific modules set(CMAKE_MODULE_PATH "${clucene-shared_SOURCE_DIR}/cmake") INCLUDE (CheckIncludeFiles) INCLUDE (CheckIncludeFileCXX) INCLUDE (CheckCXXSourceCompiles) INCLUDE (CheckCXXSourceRuns) INCLUDE (CheckFunctionExists) #local macros INCLUDE (MacroMustDefine) INCLUDE (MacroChooseType) INCLUDE (MacroChooseMisc) INCLUDE (MacroChooseFunction) INCLUDE (MacroChooseSymbol) INCLUDE (MacroCheckGccVisibility) INCLUDE (DefineFloat) INCLUDE (DefineDword) INCLUDE (DefineLongLongSyntax) INCLUDE (DefineStaticSyntax) INCLUDE (DefineMAXPATHValue) INCLUDE (CheckFloatByte) INCLUDE (CheckErrorHandling) INCLUDE (CheckHashmaps) INCLUDE (CheckNamespace) INCLUDE (CheckSnprintf) INCLUDE (CheckStdCallFunctionExists) find_package(Threads REQUIRED) INCLUDE (CheckPthread) INCLUDE (CheckAtomicFunctions) find_package(ZLIB) IF ( ZLIB_FOUND ) SET ( EXTRA_LIBS ${EXTRA_LIBS} ${ZLIB_LIBRARY} ) ELSEIF ( ZLIB_FOUND ) MESSAGE( "ZLIB not found, using local: ${clucene-ext_SOURCE_DIR}/zlib" ) SET(ZLIB_INCLUDE_DIR ${clucene-ext_SOURCE_DIR}/zlib ) SET(ZLIB_LIBRARY ${clucene-ext_BINARY_DIR}) ENDIF ( ZLIB_FOUND ) INCLUDE_DIRECTORIES( ${ZLIB_INCLUDE_DIR} ) ######################################################################## # test for headers ######################################################################## CHECK_INCLUDE_FILES ("sys/time.h;time.h" _CL_TIME_WITH_SYS_TIME) CHECK_REQUIRED_HEADERS ( stdlib.h stdarg.h stdio.h stddef.h ctype.h algorithm functional map vector list set math.h fcntl.h limits.h) CHECK_OPTIONAL_HEADERS ( string.h sys/time.h memory.h sys/types.h stdint.h unistd.h io.h direct.h sys/dir.h sys/ndir.h dirent.h wctype.h fcntl.h stat.h sys/stat.h stdexcept errno.h fcntl.h windef.h windows.h wchar.h hash_map hash_set ext/hash_map ext/hash_map tr1/unordered_set tr1/unordered_map sys/timeb.h tchar.h strings.h stdexcept sys/mman.h winerror.h ) ######################################################################## # test for types ######################################################################## #find int_t types CHOOSE_TYPE(int8_t 1 signed "int8_t;char") CHOOSE_TYPE(uint8_t 1 unsigned "uint8_t;char") CHOOSE_TYPE(int16_t 2 signed "int16_t;short") CHOOSE_TYPE(uint16_t 2 unsigned "uint16_t;short") CHOOSE_TYPE(int32_t 4 signed "int32_t;int;long") CHOOSE_TYPE(uint32_t 4 unsigned "uint32_t;int;long") CHOOSE_TYPE(int64_t 8 signed "int64_t;long long;__int64") CHOOSE_TYPE(uint64_t 8 unsigned "uint64_t;long long;__int64") CHOOSE_TYPE(size_t -1 unsigned "size_t;int" ) CHOOSE_MISC(TYPE__TIMEB HAVE_TYPE__TIMEB "struct _timeb x\;" "/* #undef _timeb */" "_timeb" "struct timeb x\;" "#define _timeb timeb" "timeb" ) #run macro for checking float. (and _FLT_EVAL_METHOD) DEFINE_FLOAT() DEFINE_DWORD() ######################################################################## # Test for functions ######################################################################## CHECK_REQUIRED_FUNCTIONS( printf strftime wcscpy wcsncpy wcscat wcschr wcsstr wcslen wcscmp wcsncmp wcscspn ) #todo: wcstoq is bsd equiv of wcstoll, we can use that... CHECK_OPTIONAL_FUNCTIONS( wcsupr wcscasecmp wcsicmp wcstoll wprintf lltow wcstod wcsdup strupr strlwr lltoa strtoll gettimeofday _vsnwprintf mmap "MapViewOfFile(0,0,0,0,0)" ) #make decisions about which functions to use... CHOOSE_FUNCTION(fileHandleStat "fstati64;_fstati64;fstat64;fstat;_fstat") IF ( _CL_HAVE_FUNCTION_FSTATI64 OR _CL_HAVE_FUNCTION__FSTATI64 OR _CL_HAVE_FUNCTION_FSTAT64 ) SET ( USE_STAT64 1 ) ENDIF ( _CL_HAVE_FUNCTION_FSTATI64 OR _CL_HAVE_FUNCTION__FSTATI64 OR _CL_HAVE_FUNCTION_FSTAT64 ) IF ( USE_STAT64 ) CHOOSE_FUNCTION(fileStat "stati64;_stati64;stat64;stat;_stat") CHOOSE_FUNCTION(fileSize "filelengthi64;_filelengthi64;filelength;_filelength" "#define fileSize CL_NS(util)::Misc::filelength") CHOOSE_FUNCTION(fileSeek "lseeki64;_lseeki64;lseek64;lseek;_lseek") CHOOSE_MISC(TYPE_CL_STAT_T HAVE_TYPE_CL_STAT_T "struct stati64 x\;" "#define cl_stat_t stati64" "stati64" "struct _stati64 x\;" "#define cl_stat_t _stati64" "_stati64" "struct stat64 x\;" "#define cl_stat_t stat64" "stat64" "struct stat x\;" "#define cl_stat_t stat" "stat" "struct _stat x\;" "#define cl_stat_t _stat" "_stat" ) ELSE( USE_STAT64 ) #borland doesn't have a fstat64, so we have to fallback to non 64 bit everything... CHOOSE_FUNCTION(fileStat "stat;_stat") CHOOSE_FUNCTION(fileSize "filelength;_filelength" "#define fileSize CL_NS(util)::Misc::filelength") CHOOSE_FUNCTION(fileSeek "lseek;_lseek") CHOOSE_MISC(TYPE_CL_STAT_T HAVE_TYPE_CL_STAT_T "struct stat x\;" "#define cl_stat_t stat" "stat" "struct _stat x\;" "#define cl_stat_t _stat" "_stat" ) ENDIF( USE_STAT64 ) #ftell (and probably soon ftell64) are POSIX standard functions, but tell and #tell64 are not, so we define fileTell in terms of fileSeek. CHOOSE_FUNCTION(fileTell "telli64;_telli64;tell64;tell;_tell" "#define fileTell(fhandle) fileSeek(fhandle, 0, SEEK_CUR)") CHOOSE_FUNCTION(_realpath "realpath" "#define _realpath(rel,abs) ::_fullpath(abs,rel,CL_MAX_PATH)") CHOOSE_FUNCTION(_rename "rename") CHOOSE_FUNCTION(_close "_close((int)0);close") CHOOSE_FUNCTION(_read "_read((int)0, (void*)0, (unsigned int)0);read") CHOOSE_FUNCTION(_cl_open "_open(0,0,0);open") CHOOSE_FUNCTION(_write "_write((int)0, (const void*)0, (unsigned int)0);write") CHOOSE_FUNCTION(_unlink "_unlink((const char*)0);unlink") CHOOSE_FUNCTION(_ftime "_ftime(0);ftime") CHOOSE_FUNCTION(_mkdir "_mkdir((const char*)0)" "#define _mkdir(x) mkdir(x,0777)") CHOOSE_FUNCTION(SLEEPFUNCTION "usleep;Sleep(0);_sleep") CHOOSE_FUNCTION(_snprintf "snprintf;_snprintf") CHOOSE_FUNCTION(_snwprintf "snwprintf;_snwprintf") ######################################################################## # test for symbols ######################################################################## CHOOSE_SYMBOL (_O_RANDOM "_O_RANDOM;O_RANDOM") CHOOSE_SYMBOL (_O_BINARY "_O_BINARY;O_BINARY") CHOOSE_SYMBOL (_S_IREAD "_S_IREAD;S_IREAD") CHOOSE_SYMBOL (_S_IWRITE "_S_IWRITE;S_IWRITE") #define defaults IF ( NOT HAVE_SYMBOL__O_RANDOM ) SET (SYMBOL__O_RANDOM "#define _O_RANDOM 0") ENDIF ( NOT HAVE_SYMBOL__O_RANDOM ) IF ( NOT HAVE_SYMBOL__O_BINARY ) SET (SYMBOL__O_BINARY "#define _O_BINARY 0") ENDIF ( NOT HAVE_SYMBOL__O_BINARY) IF ( NOT HAVE_SYMBOL__S_IREAD ) SET (SYMBOL__S_IREAD "#define _S_IREAD 0333") ENDIF ( NOT HAVE_SYMBOL__S_IREAD ) IF ( NOT HAVE_SYMBOL__S_IWRITE ) SET (SYMBOL__S_IWRITE "#define _S_IWRITE 0333") ENDIF ( NOT HAVE_SYMBOL__S_IWRITE ) #try and figure out the actual value of what _CL_MAX_PATH is DEFINE_MAXPATH_VALUE (SYMBOL_CL_MAX_PATH) ######################################################################## # test for tchar replacments ######################################################################## IF ( ENABLE_ASCII_MODE ) CHOOSE_TYPE(TCHAR 1 "" "TCHAR;char" SYMBOL_TCHAR ) ELSE ( ENABLE_ASCII_MODE ) CHOOSE_TYPE(TCHAR -1 "" "TCHAR;wchar_t;unsigned short" SYMBOL_TCHAR) ENDIF ( ENABLE_ASCII_MODE ) IF ( NOT SYMBOL_TCHAR STREQUAL "TCHAR" ) SET( SYMBOL_TCHAR "#define TCHAR ${SYMBOL_TCHAR}" ) ELSE ( NOT SYMBOL_TCHAR STREQUAL "TCHAR" ) SET( SYMBOL_TCHAR "/* #undef TCHAR */" ) ENDIF ( NOT SYMBOL_TCHAR STREQUAL "TCHAR" ) CHOOSE_SYMBOL (_T "_T" SYMBOL__T) IF ( NOT HAVE_SYMBOL__T ) IF ( ENABLE_ASCII_MODE ) SET (SYMBOL__T "#define _T(x) x") ELSE ( ENABLE_ASCII_MODE ) SET (SYMBOL__T "#define _T(x) L ## x") ENDIF ( ENABLE_ASCII_MODE ) ELSE ( NOT HAVE_SYMBOL__T ) SET( SYMBOL__T "/* #undef _T */" ) ENDIF ( NOT HAVE_SYMBOL__T ) ######################################################################## # test for compiler capabilities. ######################################################################## #check for pthreads IF ( CMAKE_USE_WIN32_THREADS_INIT ) SET ( _CL_HAVE_WIN32_THREADS 1 ) ENDIF ( CMAKE_USE_WIN32_THREADS_INIT ) IF ( CMAKE_USE_PTHREADS_INIT ) SET ( _CL_HAVE_PTHREAD 1 ) ENDIF (CMAKE_USE_PTHREADS_INIT) IF ( CMAKE_USE_SPROC_INIT OR CMAKE_HP_PTHREADS_INIT ) MESSAGE(FATAL_ERROR "Threads library not implemented") ENDIF( CMAKE_USE_SPROC_INIT OR CMAKE_HP_PTHREADS_INIT ) #define if we have pthreads with recursive capabilities CHECK_PTHREAD_RECURSIVE(_CL_HAVE_PTHREAD _CL_HAVE_PTHREAD_MUTEX_RECURSIVE) CHECK_HAVE_GCC_ATOMIC_FUNCTIONS(_CL_HAVE_GCC_ATOMIC_FUNCTIONS) #see if we can hide all symbols by default... MACRO_CHECK_GCC_VISIBILITY(_CL_HAVE_GCCVISIBILITYPATCH) #Check that we can handle try/catch CHECK_HAVE_FUNCTION_TRY_BLOCKS (_CL_HAVE_TRY_BLOCKS) #check that we support new float byte<->float conversions CHECK_FLOAT_BYTE_WORKS(_CL_HAVE_NO_FLOAT_BYTE, 1) #check how to use hashmaps CHECK_HASH_MAPS (CL_NS_HASHING_VALUE LUCENE_DISABLE_HASHING) #check that we have namespace support CHECK_NAMESPACE (_CL_HAVE_NAMESPACES) #check if snprintf functions are buggy CHECK_SNPRINTF() #define how we are going to define 64bit numbers DEFINE_LONGLONG_SYNTAX() #define how to define a static const (or fallback to enum) DEFINE_STATIC_SYNTAX() #test for ansi for scope (needed for msvc6) INCLUDE(TestForANSIForScope) IF ( CMAKE_ANSI_FOR_SCOPE ) SET ( CMAKE_ANSI_FOR_SCOPE 1 ) ELSE ( CMAKE_ANSI_FOR_SCOPE ) SET ( CMAKE_ANSI_FOR_SCOPE 0 ) ENDIF ( CMAKE_ANSI_FOR_SCOPE ) #check that all these definitions are set, or fail... MUSTDEFINE_VAR("HAVE_TYPE_INT8_T;HAVE_TYPE_UINT8_T;HAVE_TYPE_INT16_T;HAVE_TYPE_UINT16_T;HAVE_TYPE_UINT16_T;" ) MUSTDEFINE_VAR("HAVE_TYPE_INT32_T;HAVE_TYPE_UINT32_T;HAVE_TYPE_INT64_T;HAVE_TYPE_UINT64_T;HAVE_TYPE_SIZE_T;HAVE_TYPE_CL_STAT_T") MUSTDEFINE_VAR("_CL_HAVE_TRY_BLOCKS") #must have timeb OR GETTIMEOFDAY IF ( NOT HAVE_TYPE__TIMEB AND NOT _CL_HAVE_FUNCTION_GETTIMEOFDAY ) MESSAGE( FATAL_ERROR "timeb or gettimeofday must be available." ) ENDIF ( NOT HAVE_TYPE__TIMEB AND NOT _CL_HAVE_FUNCTION_GETTIMEOFDAY ) #now write out our configuration.... CONFIGURE_FILE(${clucene-shared_SOURCE_DIR}/CLucene/clucene-config.h.cmake ${clucene-shared_BINARY_DIR}/CLucene/clucene-config.h) CONFIGURE_FILE(${clucene-shared_SOURCE_DIR}/CLucene/_clucene-config.h.cmake ${clucene-shared_BINARY_DIR}/CLucene/_clucene-config.h) #add the files to our groups SOURCE_GROUP("config" ./CLucene/config/*) SOURCE_GROUP("debug" ./CLucene/debug/*) SOURCE_GROUP("util" ./CLucene/util/*) SOURCE_GROUP("zlib" ./zlib/*) MACRO (GET_SHARED_FILES result) IF ( "" STREQUAL "${ARGV2}" ) SET ( rel ${clucene-shared_SOURCE_DIR} ) ELSE ( "" STREQUAL "${ARGV2}" ) SET ( rel ${ARGV2} ) ENDIF ( "" STREQUAL "${ARGV2}" ) SET(${result} ${rel}/CLucene/SharedHeader.cpp ${rel}/CLucene/config/gunichartables.cpp ${rel}/CLucene/config/repl_tcslwr.cpp ${rel}/CLucene/config/repl_tcstoll.cpp ${rel}/CLucene/config/repl_tcscasecmp.cpp ${rel}/CLucene/config/repl_tprintf.cpp ${rel}/CLucene/config/repl_lltot.cpp ${rel}/CLucene/config/repl_tcstod.cpp ${rel}/CLucene/config/utf8.cpp ${rel}/CLucene/config/threads.cpp ${rel}/CLucene/debug/condition.cpp ${rel}/CLucene/util/StringBuffer.cpp ${rel}/CLucene/util/Misc.cpp ${rel}/CLucene/util/dirent.cpp ) IF ( NOT ZLIB_FOUND ) SET(${result} ${${result}} ${clucene-ext_SOURCE_DIR}/zlib/adler32.c ${clucene-ext_SOURCE_DIR}/zlib/compress.c ${clucene-ext_SOURCE_DIR}/zlib/crc32.c ${clucene-ext_SOURCE_DIR}/zlib/deflate.c ${clucene-ext_SOURCE_DIR}/zlib/gzio.c ${clucene-ext_SOURCE_DIR}/zlib/inffast.c ${clucene-ext_SOURCE_DIR}/zlib/inflate.c ${clucene-ext_SOURCE_DIR}/zlib/inftrees.c ${clucene-ext_SOURCE_DIR}/zlib/trees.c ${clucene-ext_SOURCE_DIR}/zlib/zutil.c ) ENDIF ( NOT ZLIB_FOUND ) ENDMACRO (GET_SHARED_FILES) GET_SHARED_FILES(clucene_shared_Files ".") #find our headers file(GLOB_RECURSE HEADERS ${clucene-shared_SOURCE_DIR}/*.h) add_library(clucene-shared SHARED ${clucene_shared_Files} ${HEADERS} ) #set properties on the libraries SET_TARGET_PROPERTIES(clucene-shared PROPERTIES VERSION ${CLUCENE_VERSION} SOVERSION ${CLUCENE_SOVERSION} COMPILE_DEFINITIONS_DEBUG _DEBUG ) TARGET_LINK_LIBRARIES(clucene-shared ${CMAKE_THREAD_LIBS_INIT}) IF ( EXTRA_LIBS ) TARGET_LINK_LIBRARIES(clucene-shared ${EXTRA_LIBS}) ENDIF ( EXTRA_LIBS ) install(TARGETS clucene-shared DESTINATION ${LIB_DESTINATION} COMPONENT development ) IF ( BUILD_STATIC_LIBRARIES ) add_library(clucene-shared-static STATIC ${clucene_shared_Files} ${HEADERS} ) SET_TARGET_PROPERTIES(clucene-shared-static PROPERTIES VERSION ${CLUCENE_VERSION} SOVERSION ${CLUCENE_SOVERSION} COMPILE_DEFINITIONS_DEBUG _DEBUG ) TARGET_LINK_LIBRARIES(clucene-shared-static ${CMAKE_THREAD_LIBS_INIT}) install(TARGETS clucene-shared-static DESTINATION ${LIB_DESTINATION} COMPONENT runtime ) ENDIF ( BUILD_STATIC_LIBRARIES ) clucene-core-2.3.3.4/src/shared/README000066400000000000000000000005601154025176300171470ustar00rootroot00000000000000This package creates a library that is used in all the CLucene projects. It provides cross-platform macros and functions that used to be inside CLucene. Since we need to be able to link against the shared clucene-core library, we need these functions to be seperate. They provide things like cl_* string macros, file handling functions, replacement functions, etc. clucene-core-2.3.3.4/src/shared/cmake/000077500000000000000000000000001154025176300173465ustar00rootroot00000000000000clucene-core-2.3.3.4/src/shared/cmake/CheckAtomicFunctions.cmake000066400000000000000000000010641154025176300244140ustar00rootroot00000000000000INCLUDE(CheckCXXSourceRuns) MACRO ( CHECK_HAVE_GCC_ATOMIC_FUNCTIONS result ) # Do step by step checking, CHECK_CXX_SOURCE_RUNS(" #include int main() { unsigned value = 0; void* ptr = &value; __sync_add_and_fetch(&value, 1); __sync_synchronize(); __sync_sub_and_fetch(&value, 1); if (!__sync_bool_compare_and_swap(&value, 0, 1)) return EXIT_FAILURE; if (!__sync_bool_compare_and_swap(&ptr, ptr, ptr)) return EXIT_FAILURE; return EXIT_SUCCESS; } " ${result} ) ENDMACRO ( CHECK_HAVE_GCC_ATOMIC_FUNCTIONS result ) clucene-core-2.3.3.4/src/shared/cmake/CheckErrorHandling.cmake000066400000000000000000000006771154025176300240560ustar00rootroot00000000000000#check if we can do try and catch. #bit useless, since we don't have any alternatives to try and catch currently MACRO ( CHECK_HAVE_FUNCTION_TRY_BLOCKS result ) #check for try/catch blocks CHECK_CXX_SOURCE_RUNS(" void foo() { try{ return; } catch( ... ){} } int main(){ foo(); return 0; }" ${result}) IF ( NOT ${result} ) SET ( ${result} 1 FORCE) ENDIF ( NOT ${result} ) ENDMACRO ( CHECK_HAVE_FUNCTION_TRY_BLOCKS ) clucene-core-2.3.3.4/src/shared/cmake/CheckFloatByte.cmake000066400000000000000000000026561154025176300232100ustar00rootroot00000000000000# - Check if our methods for converting from floats to bytes and back work. # CHECK_FLOAT_BYTE_WORKS(RESULT reverse) # reverse: set to false if the check succeeds # # CMAKE_REQUIRED_FLAGS = string of compile command line flags # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) # CMAKE_REQUIRED_INCLUDES = list of include directories # CMAKE_REQUIRED_LIBRARIES = list of libraries to link # CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in MACRO(CHECK_FLOAT_BYTE_WORKS RESULT reverse) IF("${RESULT}" MATCHES "^${RESULT}$") MESSAGE(STATUS "Checking support new float byte<->float conversions") CONFIGURE_FILE("${clucene-shared_SOURCE_DIR}/cmake/CheckFloatByte.cpp.in" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckFloatByte.cpp" IMMEDIATE @ONLY) TRY_COMPILE(${RESULT} ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckFloatByte.cpp" OUTPUT_VARIABLE OUTPUT) IF(${RESULT}) MESSAGE(STATUS "Checking support new float byte<->float conversions - yes") ELSE(${RESULT}) MESSAGE(STATUS "Checking support new float byte<->float conversions - no") ENDIF(${RESULT}) #reverse decision if required. IF (${reverse}) IF (${RESULT}) SET ( ${RESULT} 0 ) ELSE (${RESULT}) SET ( ${RESULT} 1 ) ENDIF (${RESULT}) ENDIF (${reverse}) ENDIF("${RESULT}" MATCHES "^${RESULT}$") ENDMACRO(CHECK_FLOAT_BYTE_WORKS) clucene-core-2.3.3.4/src/shared/cmake/CheckFloatByte.cpp.in000066400000000000000000000034121154025176300233060ustar00rootroot00000000000000 typedef long double float_t; typedef long int32_t; typedef char uint8_t; //float to bits conversion utilities... union clvalue { int32_t i; float f; //must use a float type, else types dont match up }; int32_t floatToIntBits(float_t value) { clvalue u; int32_t e, f; u.f = value; e = u.i & 0x7f800000; f = u.i & 0x007fffff; if (e == 0x7f800000 && f != 0) u.i = 0x7fc00000; return u.i; } float_t intBitsToFloat(int32_t bits) { clvalue u; u.i = bits; return u.f; } float_t byteToFloat(uint8_t b) { if (b == 0) // zero is a special case return 0.0f; int32_t mantissa = b & 7; int32_t exponent = (b >> 3) & 31; int32_t bits = ((exponent+(63-15)) << 24) | (mantissa << 21); return intBitsToFloat(bits); } uint8_t floatToByte(float_t f) { if (f < 0.0f) // round negatives up to zero f = 0.0f; if (f == 0.0f) // zero is a special case return 0; int32_t bits = floatToIntBits(f); // parse float_t into parts int32_t mantissa = (bits & 0xffffff) >> 21; int32_t exponent = (((bits >> 24) & 0x7f) - 63) + 15; if (exponent > 31) { // overflow: use max value exponent = 31; mantissa = 7; } if (exponent < 0) { // underflow: use min value exponent = 0; mantissa = 1; } return (uint8_t)((exponent << 3) | mantissa); // pack into a uint8_t } #ifdef __CLASSIC_C__ int main(){ int ac; char*av[]; #else int main(int ac, char*av[]){ #endif //well known conversion if ( floatToByte(0.5f) != 120 ) return 1; //converting back works? if ( floatToByte(byteToFloat(57)) != 57 ) return 1; return 0; } clucene-core-2.3.3.4/src/shared/cmake/CheckHashmaps.cmake000066400000000000000000000047311154025176300230570ustar00rootroot00000000000000#check how to use hashmaps (which namespace) #HashingValue is filled with namespace definition #DisableHashing is set if we can't support hashing INCLUDE (Macro_ChooseStatus) #find hashing namespace (internal, use CHECK_HASH_MAPS) ... MACRO(HASHMAP_TEST HashingValue namespace) IF ( NOT ${HashingValue} ) IF ( _CL_HAVE_TR1_UNORDERED_MAP ) SET(_CL_HASH_MAP unordered_map) SET(_CL_HASH_SET unordered_set) SET(CMAKE_REQUIRED_DEFINITIONS "-D_CL_HAVE_TR1_UNORDERED_MAP=1") ELSE ( _CL_HAVE_TR1_UNORDERED_MAP ) IF ( _CL_HAVE_HASH_MAP ) SET(_CL_HASH_MAP hash_map) SET(_CL_HASH_SET hash_set) SET(CMAKE_REQUIRED_DEFINITIONS "-D_CL_HAVE_HASH_MAP=1") ELSE ( _CL_HAVE_HASH_MAP ) IF ( _CL_HAVE_EXT_HASH_MAP ) SET(_CL_HASH_MAP hash_map) SET(_CL_HASH_SET hash_set) SET(CMAKE_REQUIRED_DEFINITIONS "-D_CL_HAVE_EXT_HASH_MAP=1") ENDIF ( _CL_HAVE_EXT_HASH_MAP ) ENDIF ( _CL_HAVE_HASH_MAP ) ENDIF ( _CL_HAVE_TR1_UNORDERED_MAP ) STRING(TOUPPER ${namespace} NAMESPACE) STRING(REPLACE / _ NAMESPACE ${NAMESPACE}) STRING(REPLACE : _ NAMESPACE ${NAMESPACE}) CHECK_CXX_SOURCE_COMPILES(" #if defined(_CL_HAVE_HASH_MAP) #include #elif defined(_CL_HAVE_EXT_HASH_MAP) #include #elif defined(_CL_HAVE_TR1_UNORDERED_MAP) #include #endif int main() { ${namespace}::${_CL_HASH_MAP} a; return 0; } " _CL_HAVE_${NAMESPACE}_HASHMAP) IF ( _CL_HAVE_${NAMESPACE}_HASHMAP ) SET (${HashingValue} "${namespace}::func") ENDIF ( _CL_HAVE_${NAMESPACE}_HASHMAP ) ENDIF ( NOT ${HashingValue} ) ENDMACRO(HASHMAP_TEST) MACRO ( CHECK_HASH_MAPS HashingValue DisableHashing) IF ( _CL_HAVE_EXT_HASH_MAP OR _CL_HAVE_HASH_MAP ) _CHOOSE_STATUS(PROGRESS "hashmaps" "namespace") HASHMAP_TEST (${HashingValue} "std::tr1") HASHMAP_TEST (${HashingValue} std) HASHMAP_TEST (${HashingValue} stdext) HASHMAP_TEST (${HashingValue} __gnu_cxx) IF ( NOT ${HashingValue} ) _CHOOSE_STATUS(END "hashmaps" "namespace" "failed") SET(${DisableHashing} 1) ELSE ( NOT ${HashingValue} ) _CHOOSE_STATUS(END "hashmaps" "namespace" ${${HashingValue}}) ENDIF ( NOT ${HashingValue} ) ENDIF ( _CL_HAVE_EXT_HASH_MAP OR _CL_HAVE_HASH_MAP ) SET(CMAKE_REQUIRED_DEFINITIONS) ENDMACRO ( CHECK_HASH_MAPS ) clucene-core-2.3.3.4/src/shared/cmake/CheckNamespace.cmake000066400000000000000000000005101154025176300231760ustar00rootroot00000000000000#check if we support namespaces MACRO ( CHECK_NAMESPACE haveNamespace ) #Check if namespaces work in the compiler CHECK_CXX_SOURCE_RUNS(" namespace Outer { namespace Inner { int i = 0; }} int main(){ using namespace Outer::Inner; return i; }" ${haveNamespace} ) ENDMACRO ( CHECK_NAMESPACE haveNamespace )clucene-core-2.3.3.4/src/shared/cmake/CheckPthread.cmake000066400000000000000000000015031154025176300226740ustar00rootroot00000000000000#define if we have pthreads with recusrive capabilities MACRO ( CHECK_PTHREAD_RECURSIVE ifpthread result) IF ( ${ifpthread} ) SET ( CMAKE_REQUIRED_FLAGS "${CMAKE_THREAD_LIBS_INIT}") CHECK_CXX_SOURCE_RUNS(" #include #include #include int main() { pthread_mutexattr_t attr; pthread_mutex_t m; exit (pthread_mutexattr_init(&attr) || pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) || pthread_mutex_init(&m, &attr)); } " ${result} ) #NOTE: pthread_mutexattr_setkind_np is the deprecated name for pthread_mutexattr_settype. old compilers might need it SET ( CMAKE_REQUIRED_FLAGS) ENDIF ( ${ifpthread} ) ENDMACRO ( CHECK_PTHREAD_RECURSIVE ) clucene-core-2.3.3.4/src/shared/cmake/CheckSnprintf.cmake000066400000000000000000000024441154025176300231150ustar00rootroot00000000000000#checks if snprintf have bugs MACRO ( CHECK_SNPRINTF ) #check that our snprintf works correctly... IF ( _CL_HAVE_FUNCTION_SNPRINTF ) CHECK_CXX_SOURCE_RUNS(" #include int main(){ char ovbuf[7]; int i; for (i=0; i<7; i++) ovbuf[i]='x'; snprintf(ovbuf, 4,\"foo%s\", \"bar\"); if (ovbuf[5]!='x') return 1; snprintf(ovbuf, 4,\"foo%d\", 666); if (ovbuf[5]!='x') return 1; return 0; }" _CL_HAVE_NO_SNPRINTF_BUG) IF ( NOT _CL_HAVE_NO_SNPRINTF_BUG ) SET ( _CL_HAVE_SNPRINTF_BUG 1 ) MESSAGE ( FATAL_ERROR "snprintf has a bug, and we don't have a replacement!" ) ENDIF ( NOT _CL_HAVE_NO_SNPRINTF_BUG ) ENDIF ( _CL_HAVE_FUNCTION_SNPRINTF ) #check that our swnprintf works correctly... IF ( _CL_HAVE_FUNCTION_SNWPRINTF ) CHECK_CXX_SOURCE_RUNS(" #include #include int main(void) { wchar_t buf[5]; snwprintf(buf,5,L\"%s\",L\"foo\"); if ( wcslen(buf) != 3 ) return 1; return 0; }" _CL_HAVE_NO_SNWPRINTF_BUG) IF ( NOT _CL_HAVE_NO_SNWPRINTF_BUG ) SET ( _CL_HAVE_SNWPRINTF_BUG 1 ) ENDIF ( NOT _CL_HAVE_NO_SNWPRINTF_BUG ) ENDIF ( _CL_HAVE_FUNCTION_SNWPRINTF ) ENDMACRO ( CHECK_SNPRINTF ) clucene-core-2.3.3.4/src/shared/cmake/CheckStdCallFunctionExists.cmake000066400000000000000000000110201154025176300255340ustar00rootroot00000000000000# - Check if the STDCALL function exists. # This works for non-cdecl functions (kernel32 functions, for example) # CHECK_STDCALL_FUNCTION_EXISTS(FUNCTION FUNCTION_DUMMY_ARGS VARIABLE) # - macro which checks if the stdcall function exists # FUNCTION_DECLARATION - the definition of the function ( e.g.: Sleep(500) ) # VARIABLE - variable to store the result # # The following variables may be set before calling this macro to # modify the way the check is run: # # CMAKE_REQUIRED_FLAGS = string of compile command line flags # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) # CMAKE_REQUIRED_INCLUDES = list of include directories # CMAKE_REQUIRED_LIBRARIES = list of libraries to link # CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in MACRO(CHECK_STDCALL_FUNCTION_EXISTS FUNCTION_DECLARATION VARIABLE) IF("${VARIABLE}" MATCHES "^${VARIABLE}$") #get includes SET(CHECK_STDCALL_FUNCTION_PREMAIN) FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES}) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"${def}\"\n") ENDFOREACH(def) #add some default includes IF ( HAVE_WINDOWS_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"windows.h\"\n") ENDIF ( HAVE_WINDOWS_H ) IF ( HAVE_UNISTD_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"unistd.h\"\n") ENDIF ( HAVE_UNISTD_H ) IF ( HAVE_DIRECT_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"direct.h\"\n") ENDIF ( HAVE_DIRECT_H ) IF ( HAVE_IO_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"io.h\"\n") ENDIF ( HAVE_IO_H ) IF ( HAVE_SYS_TIMEB_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"sys/timeb.h\"\n") ENDIF ( HAVE_SYS_TIMEB_H ) STRING(REGEX REPLACE "(\\(.*\\))" "" CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION ${FUNCTION_DECLARATION} ) SET(MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS "${CMAKE_REQUIRED_FLAGS}") MESSAGE(STATUS "Looking for ${CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION}") IF(CMAKE_REQUIRED_LIBRARIES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") ELSE(CMAKE_REQUIRED_LIBRARIES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES) ENDIF(CMAKE_REQUIRED_LIBRARIES) IF(CMAKE_REQUIRED_INCLUDES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") ELSE(CMAKE_REQUIRED_INCLUDES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES) ENDIF(CMAKE_REQUIRED_INCLUDES) SET(CHECK_STDCALL_FUNCTION_DECLARATION ${FUNCTION_DECLARATION}) CONFIGURE_FILE("${clucene-shared_SOURCE_DIR}/cmake/CheckStdCallFunctionExists.cpp.in" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" IMMEDIATE @ONLY) FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" CHECK_STDCALL_FUNCTION_CONTENT) TRY_COMPILE(${VARIABLE} ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS} "${CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES}" "${CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES}" OUTPUT_VARIABLE OUTPUT) IF(${VARIABLE}) SET(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}") MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - found") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Determining if the stdcall function ${FUNCTION_DECLARATION} exists passed with the following output:\n" "${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n") ELSE(${VARIABLE}) MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - not found") SET(${VARIABLE} "" CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Determining if the stdcall function ${FUNCTION_DECLARATION} exists failed with the following output:\n" "${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n") ENDIF(${VARIABLE}) ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") ENDMACRO(CHECK_STDCALL_FUNCTION_EXISTS) clucene-core-2.3.3.4/src/shared/cmake/CheckStdCallFunctionExists.cpp.in000066400000000000000000000002721154025176300256520ustar00rootroot00000000000000@CHECK_STDCALL_FUNCTION_PREMAIN@ #ifdef __CLASSIC_C__ int main(){ int ac; char*av[]; #else int main(int ac, char*av[]){ #endif @CHECK_STDCALL_FUNCTION_DECLARATION@; return 0; } clucene-core-2.3.3.4/src/shared/cmake/DefineDword.cmake000066400000000000000000000007341154025176300225460ustar00rootroot00000000000000#defines a dword replacement MACRO ( DEFINE_DWORD ) IF ( HAVE_WINDOWS_H ) SET (CMAKE_EXTRA_INCLUDE_FILES "${CMAKE_EXTRA_INCLUDE_FILES};windows.h") ENDIF ( HAVE_WINDOWS_H ) CHECK_TYPE_SIZE ( DWORD _CL_HAVE_TYPE_DWORD ) IF ( _CL_HAVE_TYPE_DWORD ) CHOOSE_TYPE(_cl_dword_t ${_CL_HAVE_TYPE_DWORD} unsigned "long;long long;__int64;short;int" ) ENDIF ( _CL_HAVE_TYPE_DWORD ) SET ( CMAKE_EXTRA_INCLUDE_FILES ) ENDMACRO ( DEFINE_DWORD ) clucene-core-2.3.3.4/src/shared/cmake/DefineFloat.cmake000066400000000000000000000016261154025176300225350ustar00rootroot00000000000000MACRO ( DEFINE_FLOAT ) #find float symbol CHECK_CXX_SOURCE_COMPILES(" #include int main(){ float_t x=0.0; }" HAVE_SYMBOL_FLOAT_T) IF ( NOT HAVE_SYMBOL_FLOAT_T ) #try using FLT_EVAL_METHOD CHECK_CXX_SOURCE_COMPILES(" #define FLT_EVAL_METHOD 2 #include int main(){ float_t x=0.0; }" HAVE_SYMBOL_FLOAT_T) IF ( HAVE_SYMBOL_FLOAT_T ) SET ( _FLT_EVAL_METHOD 2 ) SET ( TYPE_FLOAT_T "/* undef float_t*/" ) ENDIF ( HAVE_SYMBOL_FLOAT_T ) ELSE ( NOT HAVE_SYMBOL_FLOAT_T ) SET ( TYPE_FLOAT_T "/* undef float_t*/" ) ENDIF ( NOT HAVE_SYMBOL_FLOAT_T ) IF ( NOT HAVE_SYMBOL_FLOAT_T ) #todo: could we do a better guess here? SET ( TYPE_FLOAT_T "typedef double float_t;" ) ENDIF ( NOT HAVE_SYMBOL_FLOAT_T ) ENDMACRO ( DEFINE_FLOAT ) clucene-core-2.3.3.4/src/shared/cmake/DefineLongLongSyntax.cmake000066400000000000000000000012361154025176300244130ustar00rootroot00000000000000MACRO ( DEFINE_LONGLONG_SYNTAX ) #check how to define a long (and longlong number) CHECK_CXX_SOURCE_COMPILES("int main(){ int x = (int)(1234LL); }" _CL_ILONGLONG_LL) IF ( _CL_ILONGLONG_LL ) SET(_CL_ILONGLONG_VALUE "x ## LL") ELSE ( _CL_ILONGLONG_LL ) CHECK_CXX_SOURCE_COMPILES("int main(){ int x = (int)(1234i64); }" _CL_ILONGLONG_i64) IF ( _CL_ILONGLONG_i64 ) SET(_CL_ILONGLONG_VALUE "x ## i64") ELSE ( _CL_ILONGLONG_i64 ) MESSAGE( FATAL_ERROR "_CL_ILONGLONG_VALUE could not be determined" ) ENDIF ( _CL_ILONGLONG_i64 ) ENDIF ( _CL_ILONGLONG_LL ) ENDMACRO ( DEFINE_LONGLONG_SYNTAX ) clucene-core-2.3.3.4/src/shared/cmake/DefineMAXPATHValue.cmake000066400000000000000000000017361154025176300235710ustar00rootroot00000000000000#checks if snprintf have bugs MACRO ( DEFINE_MAXPATH_VALUE MaxPathValue ) # also check for MAXPATHLEN #or this: #path_max = pathconf (path, _PC_PATH_MAX); #if (path_max <= 0) #path_max = 4096; #use CHOOSE_SYMBOL mechanism to determine which variable to use... #CHOOSE_SYMBOL (_CL_MAX_PATH "PATH_MAX;MAX_PATH;_MAX_PATH;_POSIX_PATH_MAX" DefineMaxPathValue) #IF ( DefineMaxPathValue ) #now try and find its value... # Include ( MacroGetVariableValue ) # SET ( _CL_MAX_PATH_VALUE ) # GET_VARIABLE_VALUE (${DefineMaxPathValue} d _CL_MAX_PATH_VALUE) # IF ( _CL_MAX_PATH_VALUE ) # SET( ${MaxPathValue} "#define ${MaxPathValue} ${_CL_MAX_PATH_VALUE}" ) # ENDIF( _CL_MAX_PATH_VALUE ) #ELSE ( DefineMaxPathValue ) # MESSAGE ( FATAL_ERROR "_CL_MAX_PATH could not be determined") #ENDIF ( DefineMaxPathValue ) #SET (CMAKE_REQUIRED_DEFINITIONS) #HACK!!! #todo: fix this SET( ${MaxPathValue} "#define CL_MAX_PATH 4096") ENDMACRO ( DEFINE_MAXPATH_VALUE ) clucene-core-2.3.3.4/src/shared/cmake/DefineStaticSyntax.cmake000066400000000000000000000011601154025176300241170ustar00rootroot00000000000000#defines how we can define a static const (or fallback to using an enum) MACRO ( DEFINE_STATIC_SYNTAX ) #check which syntax of static const to use CHECK_CXX_SOURCE_RUNS("class x{public: static const int SCI=55; }; int main(){ x a; if ( a.SCI!=55 ) throw \"err\"; return 0; }" LUCENE_STATIC_CONSTANT_SYNTAX) IF ( LUCENE_STATIC_CONSTANT_SYNTAX ) SET ( LUCENE_STATIC_CONSTANT_SYNTAX "static const type assignment") ELSE ( LUCENE_STATIC_CONSTANT_SYNTAX ) SET ( LUCENE_STATIC_CONSTANT_SYNTAX "enum { assignment }") ENDIF ( LUCENE_STATIC_CONSTANT_SYNTAX ) ENDMACRO ( DEFINE_STATIC_SYNTAX ) clucene-core-2.3.3.4/src/shared/cmake/MacroCheckGccVisibility.cmake000066400000000000000000000047311154025176300250410ustar00rootroot00000000000000# # Copyright (c) 2006, Alexander Neundorf # Copyright (c) 2006, Laurent Montel, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro(MACRO_CHECK_GCC_VISIBILITY GccVisibility) if (CMAKE_COMPILER_IS_GNUCXX) include(CheckCXXCompilerFlag) include(MacroEnsureVersion) # visibility support check_cxx_compiler_flag(-fvisibility=hidden ${GccVisibility}) # get the gcc version exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") if (NOT _gcc_version) # clang reports: clang version 1.1 (trunk 95754) string (REGEX MATCH "clang version ([123]\\.[0-9])" _gcc_version "${_gcc_version_info}") if ( _gcc_version ) string(REGEX REPLACE "clang version (.*)" "\\1.0" _gcc_version "${_gcc_version}" ) endif ( _gcc_version ) # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the patch level, handle this here: if (NOT _gcc_version) string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") endif (NOT _gcc_version) endif (NOT _gcc_version) macro_ensure_version("4.1.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_1) macro_ensure_version("4.2.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_2) set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE) if (GCC_IS_NEWER_THAN_4_1) exec_program(${CMAKE_C_COMPILER} ARGS -v OUTPUT_VARIABLE _gcc_alloc_info) string(REGEX MATCH "(--enable-libstdcxx-allocator=mt)" _GCC_COMPILED_WITH_BAD_ALLOCATOR "${_gcc_alloc_info}") endif (GCC_IS_NEWER_THAN_4_1) if (${GccVisibility} AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") set (KDE4_C_FLAGS "${KDE4_C_FLAGS}" "-fvisibility=hidden") if (GCC_IS_NEWER_THAN_4_2) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden") endif (GCC_IS_NEWER_THAN_4_2) else (${GccVisibility} AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) set (${GccVisibility} 0) endif (${GccVisibility} AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) else (CMAKE_COMPILER_IS_GNUCXX) set(${GccVisibility} FALSE) endif (CMAKE_COMPILER_IS_GNUCXX) endmacro(MACRO_CHECK_GCC_VISIBILITY) clucene-core-2.3.3.4/src/shared/cmake/MacroChooseFunction.cmake000066400000000000000000000040541154025176300242630ustar00rootroot00000000000000 INCLUDE (CheckFunctionExists) INCLUDE (Macro_ChooseStatus) #macro that sets OUTPUT as the value of oneof options (if _CL_HAVE_OPTION exists) MACRO(CHOOSE_FUNCTION name options) STRING(TOUPPER ${name} NAME) FOREACH(option ${options}) IF ( NOT FUNCTION_${NAME} ) STRING(TOUPPER ${option} OPTION) SET( option1 ${option} ) STRING(REGEX MATCH "[(|)]+" MACRO_CHOOSE_FUNCTION_MATCH ${option} ) IF ( MACRO_CHOOSE_FUNCTION_MATCH STREQUAL "" ) _CHOOSE_STATUS(PROGRESS ${name} "function" ) CHECK_FUNCTION_EXISTS (${option} _CL_HAVE_FUNCTION_${OPTION}) ELSE ( MACRO_CHOOSE_FUNCTION_MATCH STREQUAL "" ) STRING(REGEX REPLACE "(\\(.*\\))" "" option ${option} ) STRING(TOUPPER ${option} OPTION) _CHOOSE_STATUS(PROGRESS ${name} "function" ) CHECK_STDCALL_FUNCTION_EXISTS (${option1} _CL_HAVE_FUNCTION_${OPTION}) ENDIF ( MACRO_CHOOSE_FUNCTION_MATCH STREQUAL "" ) IF ( _CL_HAVE_FUNCTION_${OPTION} ) _CHOOSE_STATUS(END ${name} function ${option}) IF ( option STREQUAL ${name} ) #already have it, ignore this... SET (FUNCTION_${NAME} "/* undef ${name} ${option} */" ) ELSE ( option STREQUAL ${name} ) SET (FUNCTION_${NAME} "#define ${name} ${option}") ENDIF ( option STREQUAL ${name} ) ENDIF ( _CL_HAVE_FUNCTION_${OPTION} ) ENDIF( NOT FUNCTION_${NAME} ) ENDFOREACH(option ${options}) IF ( NOT FUNCTION_${NAME} ) IF ( NOT ${ARGV2} STREQUAL "" ) _CHOOSE_STATUS(END ${name} function "using default") SET (FUNCTION_${NAME} ${ARGV2} ) ELSE ( NOT ${ARGV2} STREQUAL "" ) _CHOOSE_STATUS(END ${name} function "not found") SET (FUNCTION_${NAME} "/* undef ${name} */" ) ENDIF ( NOT ${ARGV2} STREQUAL "" ) ENDIF ( NOT FUNCTION_${NAME} ) IF ( FUNCTION_${NAME} ) SET (HAVE_FUNCTION_${NAME} 1) ENDIF ( FUNCTION_${NAME} ) ENDMACRO(CHOOSE_FUNCTION) clucene-core-2.3.3.4/src/shared/cmake/MacroChooseMisc.cmake000066400000000000000000000057231154025176300233750ustar00rootroot00000000000000#macro that sets result to one of results (and have_result to true) when the first option TRY_COMPILE is successful. #this is mainly to get around the fact that some compilers couldn't do sizeof(structs), therefore CHOOSE_TYPE wasn't going to work #syntax: CHOOSE_TYPE ( TYPE_X HAVE_TYPE_X "struct stat x\;" "typedef stat cl_stat" "stat" ) (the last 3 options can be repeated indefinately in pairs of 3) INCLUDE (Macro_ChooseStatus) MACRO(CHOOSE_MISC result have_result ) IF ( HAVE_SYS_STAT_H ) SET (HEADERS "${HEADERS} #include \"sys/stat.h\"") ENDIF ( HAVE_SYS_STAT_H ) IF ( HAVE_SYS_TIMEB_H ) SET (HEADERS "${HEADERS} #include \"sys/timeb.h\"") ENDIF ( HAVE_SYS_TIMEB_H ) SET ( M_TEST ) SET ( M_SUCCESS ) SET ( M_name ) SET ( M_RESULT ) SET ( M_HAVE_RESULT ) FOREACH(optiong ${ARGV}) #MESSAGE( STATUS "m ${optiong}" ) SET ( m_continue ) #this will only happen the first round... IF ( NOT m_continue AND NOT M_RESULT ) SET ( M_RESULT "${optiong}") SET ( m_continue 1 ) ENDIF ( NOT m_continue AND NOT M_RESULT ) IF ( NOT m_continue AND NOT M_HAVE_RESULT ) SET ( M_HAVE_RESULT "${optiong}") SET ( m_continue 1 ) ENDIF ( NOT m_continue AND NOT M_HAVE_RESULT ) #test and success in pairs... IF ( NOT m_continue AND NOT M_TEST ) SET ( M_TEST "${optiong}") SET ( m_continue 1 ) ENDIF ( NOT m_continue AND NOT M_TEST ) IF ( NOT m_continue AND NOT M_SUCCESS ) SET ( M_SUCCESS "${optiong}") SET ( m_continue 1 ) ENDIF ( NOT m_continue AND NOT M_SUCCESS ) IF ( NOT m_continue AND NOT M_name ) SET ( M_name "${optiong}") STRING(TOUPPER ${M_name} M_NAME) #this one doesn't continue... ENDIF ( NOT m_continue AND NOT M_name ) IF ( NOT m_continue ) _CHOOSE_STATUS(PROGRESS ${M_HAVE_RESULT} "option" ${M_TEST}) IF ( NOT ${M_HAVE_RESULT} ) CHECK_CXX_SOURCE_COMPILES( "${HEADERS} int main(){ ${M_TEST} }" _CL_HAVE_OPTION_${M_NAME} ) IF ( _CL_HAVE_OPTION_${M_NAME} ) SET (${M_RESULT} "${M_SUCCESS}") SET (${M_HAVE_RESULT} 1 ) _CHOOSE_STATUS(END ${M_HAVE_RESULT} "option" "${M_name}") ENDIF ( _CL_HAVE_OPTION_${M_NAME} ) ENDIF ( NOT ${M_HAVE_RESULT} ) #reset for next round SET ( M_TEST ) SET ( M_SUCCESS ) SET ( M_name ) ENDIF ( NOT m_continue ) ENDFOREACH(optiong) IF ( NOT ${M_HAVE_RESULT} ) _CHOOSE_STATUS(END ${M_HAVE_RESULT} option "not found") ENDIF ( NOT ${M_HAVE_RESULT} ) SET(CMAKE_EXTRA_INCLUDE_FILES) ENDMACRO(CHOOSE_MISC) clucene-core-2.3.3.4/src/shared/cmake/MacroChooseSymbol.cmake000066400000000000000000000042531154025176300237440ustar00rootroot00000000000000 INCLUDE (CheckSymbolExists) INCLUDE (Macro_ChooseStatus) MACRO(CHOOSE_SYMBOL name options) #note: don't add windows.h to this list, since we don't want to find things #in there (bcc might make you think otherwise, but it's true!)... IF ( CYGWIN ) #cygwin requires this to determine some things... SET ( CMAKE_REQUIRED_DEFINITIONS "-D_WIN32") ENDIF( CYGWIN ) IF ( HAVE_LIMITS_H ) SET (CHOOSE_SYMBOL_INCLUDES "${CHOOSE_SYMBOL_INCLUDES};limits.h") ENDIF ( HAVE_LIMITS_H ) IF ( HAVE_STAT_H ) SET (CHOOSE_SYMBOL_INCLUDES "${CHOOSE_SYMBOL_INCLUDES};stat.h") ENDIF ( HAVE_STAT_H ) IF ( HAVE_SYS_STAT_H ) SET (CHOOSE_SYMBOL_INCLUDES "${CHOOSE_SYMBOL_INCLUDES};sys/stat.h") ENDIF ( HAVE_SYS_STAT_H ) IF ( HAVE_TCHAR_H ) SET (CHOOSE_SYMBOL_INCLUDES "${CHOOSE_SYMBOL_INCLUDES};tchar.h") ENDIF ( HAVE_TCHAR_H ) SET (CHOOSE_SYMBOL_INCLUDES "${CHOOSE_SYMBOL_INCLUDES};fcntl.h") STRING(TOUPPER ${name} NAME) FOREACH(option ${options}) IF ( NOT SYMBOL_${NAME} ) STRING(TOUPPER ${option} OPTION) _CHOOSE_STATUS(PROGRESS ${name} "symbol" ) CHECK_SYMBOL_EXISTS (${option} "${CHOOSE_SYMBOL_INCLUDES}" _CL_HAVE_SYMBOL_${OPTION}) IF ( _CL_HAVE_SYMBOL_${OPTION} ) IF ( option STREQUAL ${name} ) #already have it, ignore this... SET (SYMBOL_${NAME} "/* undef ${name} ${option} */" ) ELSE ( option STREQUAL ${name} ) SET (SYMBOL_${NAME} "#define ${name} ${option}") ENDIF ( option STREQUAL ${name} ) IF ( NOT "${ARGV2}" STREQUAL "" ) SET ( ${ARGV2} "${option}" ) ENDIF ( NOT "${ARGV2}" STREQUAL "" ) _CHOOSE_STATUS(END ${name} "symbol" ${option}) ENDIF ( _CL_HAVE_SYMBOL_${OPTION} ) ENDIF( NOT SYMBOL_${NAME} ) ENDFOREACH(option ${options}) IF ( NOT SYMBOL_${NAME} ) SET (SYMBOL_${NAME} "/* undef ${name} */" ) _CHOOSE_STATUS(END ${name} "symbol" "not found" ) ELSE ( NOT SYMBOL_${NAME} ) SET (HAVE_SYMBOL_${NAME} 1) ENDIF ( NOT SYMBOL_${NAME} ) SET (CHOOSE_SYMBOL_INCLUDES) SET (CMAKE_REQUIRED_DEFINITIONS) ENDMACRO(CHOOSE_SYMBOL) clucene-core-2.3.3.4/src/shared/cmake/MacroChooseType.cmake000066400000000000000000000035611154025176300234210ustar00rootroot00000000000000 INCLUDE (CheckTypeSize) INCLUDE (Macro_ChooseStatus) #macro that sets OUTPUT as the value of oneof options (if _CL_HAVE_OPTION exists) MACRO(CHOOSE_TYPE name size sign options) #note: don't add windows.h to this list, since we don't want to find things #in there (bcc might make you think otherwise, but it's true!)... IF ( HAVE_TCHAR_H ) SET (CMAKE_EXTRA_INCLUDE_FILES "${CMAKE_EXTRA_INCLUDE_FILES};tchar.h") ENDIF ( HAVE_TCHAR_H ) STRING(TOUPPER ${name} NAME) FOREACH(option ${options}) IF ( NOT TYPE_${NAME} ) STRING(TOUPPER ${option} OPTION) STRING(REPLACE " " "" OPTION ${OPTION}) STRING(REPLACE "_" "" SO_OPTION ${OPTION}) _CHOOSE_STATUS(PROGRESS ${name} "type") CHECK_TYPE_SIZE(${option} _CL_HAVE_TYPE_${OPTION}) IF ( _CL_HAVE_TYPE_${OPTION} ) IF ( option STREQUAL ${name} ) #already have it, ignore this... SET (TYPE_${NAME} "/* undef ${name} ${option} */" ) ELSE ( option STREQUAL ${name} ) IF ( ${size} LESS 0 OR _CL_HAVE_TYPE_${OPTION} EQUAL ${size} ) SET (TYPE_${NAME} "typedef ${sign} ${option} ${name};") ENDIF ( ${size} LESS 0 OR _CL_HAVE_TYPE_${OPTION} EQUAL ${size}) ENDIF ( option STREQUAL ${name} ) IF ( NOT "${ARGV4}" STREQUAL "" ) SET ( ${ARGV4} "${option}" ) ENDIF ( NOT "${ARGV4}" STREQUAL "" ) _CHOOSE_STATUS(END ${name} "type" "${sign} ${option}") ENDIF ( _CL_HAVE_TYPE_${OPTION} ) ENDIF( NOT TYPE_${NAME} ) ENDFOREACH(option ${options}) IF ( NOT TYPE_${NAME} ) SET (TYPE_${NAME} "/* undef ${name} */" ) _CHOOSE_STATUS(END ${name} "type" "not found") ELSE ( NOT TYPE_${NAME} ) SET (HAVE_TYPE_${NAME} 1) ENDIF ( NOT TYPE_${NAME} ) SET(CMAKE_EXTRA_INCLUDE_FILES) ENDMACRO(CHOOSE_TYPE) clucene-core-2.3.3.4/src/shared/cmake/MacroEnsureVersion.cmake000066400000000000000000000066561154025176300241560ustar00rootroot00000000000000# This macro compares version numbers of the form "x.y.z" # MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) # will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION # where both have to be in a 3-part-version format, leading and trailing # text is ok, e.g. # MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) # which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system # Copyright (c) 2006, David Faure, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) # parse the parts of the version string STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_major_vers "${requested_version}") STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" req_minor_vers "${requested_version}") STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_patch_vers "${requested_version}") STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" found_minor_vers "${found_version}") STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_patch_vers "${found_version}") # compute an overall version number which can be compared at once MATH(EXPR req_vers_num "${req_major_vers}*10000 + ${req_minor_vers}*100 + ${req_patch_vers}") MATH(EXPR found_vers_num "${found_major_vers}*10000 + ${found_minor_vers}*100 + ${found_patch_vers}") if (found_vers_num LESS req_vers_num) set( ${var_too_old} FALSE ) else (found_vers_num LESS req_vers_num) set( ${var_too_old} TRUE ) endif (found_vers_num LESS req_vers_num) ENDMACRO(MACRO_ENSURE_VERSION) # This macro compares version numbers of the form "x.y" # MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) # will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION # where both have to be in a 2-part-version format, leading and trailing # text is ok, e.g. # MACRO_ENSURE_VERSION( "0.5" "foo 0.6" VERSION_OK) # which means 0.5 is required and "foo 0.6" is what was found on the system # Copyright (c) 2006, David Faure, # Copyright (c) 2007, Pino Toscano, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. MACRO(MACRO_ENSURE_VERSION2 requested_version found_version var_too_old) # parse the parts of the version string STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" req_major_vers "${requested_version}") STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" req_minor_vers "${requested_version}") STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+).*" "\\1" found_minor_vers "${found_version}") # compute an overall version number which can be compared at once MATH(EXPR req_vers_num "${req_major_vers}*100 + ${req_minor_vers}") MATH(EXPR found_vers_num "${found_major_vers}*100 + ${found_minor_vers}") if (found_vers_num LESS req_vers_num) set( ${var_too_old} FALSE ) else (found_vers_num LESS req_vers_num) set( ${var_too_old} TRUE ) endif (found_vers_num LESS req_vers_num) ENDMACRO(MACRO_ENSURE_VERSION2) clucene-core-2.3.3.4/src/shared/cmake/MacroGetVariableValue.c.in000066400000000000000000000004131154025176300242610ustar00rootroot00000000000000 #include #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_STAT_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif int main(){ printf("%${}", ${}); return 0; } clucene-core-2.3.3.4/src/shared/cmake/MacroGetVariableValue.cmake000066400000000000000000000026131154025176300245160ustar00rootroot00000000000000 #macro that sets OUTPUT as the value of oneof options (if _CL_HAVE_OPTION exists) MACRO(GET_VARIABLE_VALUE variable printfType result) SET ( GET_VARIABLE_VALUE_DEFINITIONS "-DVARIABLENAME=${variable} -DPRINTFTYPE=${printfType}") IF ( HAVE_WINDOWS_H ) SET ( GET_VARIABLE_VALUE_DEFINITIONS "${GET_VARIABLE_VALUE_DEFINITIONS} -DHAVE_WINDOWS_H") ENDIF ( HAVE_WINDOWS_H ) IF ( HAVE_LIMITS_H ) SET (GET_VARIABLE_VALUE_DEFINITIONS "${GET_VARIABLE_VALUE_DEFINITIONS} -DHAVE_LIMITS_H") ENDIF ( HAVE_LIMITS_H ) IF ( HAVE_STAT_H ) SET (GET_VARIABLE_VALUE_DEFINITIONS "${GET_VARIABLE_VALUE_DEFINITIONS} -DHAVE_STAT_H") ENDIF ( HAVE_STAT_H ) IF ( HAVE_SYS_STAT_H ) SET (GET_VARIABLE_VALUE_DEFINITIONS "${GET_VARIABLE_VALUE_DEFINITIONS} -DHAVE_SYS_STAT_H") ENDIF ( HAVE_SYS_STAT_H ) CONFIGURE_FILE("${${PROJECT_SOURCE_DIR}}/cmake/MacroGetVariableValue.c.in" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/MacroGetVariableValue.c" IMMEDIATE @ONLY) TRY_COMPILE(HAVE_${VARIABLE} ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSizeC.c" COMPILE_DEFINITIONS ${GET_VARIABLE_VALUE_DEFINITIONS} OUTPUT_VARIABLE OUTPUT COPY_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/MacroGetVariablesValue.bin" ) MESSAGE(FATAL_ERROR stop) SET(GET_VARIABLE_VALUE_DEFINITIONS) ENDMACRO(GET_VARIABLE_VALUE) clucene-core-2.3.3.4/src/shared/cmake/MacroMustDefine.cmake000066400000000000000000000046071154025176300234040ustar00rootroot00000000000000#this macro throws an error if any of the vars are not defined MACRO(MUSTDEFINE_VAR VARS) foreach(ARG ${VARS}) IF ( NOT ${ARG} ) MESSAGE( FATAL_ERROR "The symbol '${ARG}' was not defined." ) ENDIF ( NOT ${ARG} ) endforeach(ARG) ENDMACRO(MUSTDEFINE_VAR) #required headers MACRO(CHECK_REQUIRED_HEADERS COMPULSARY_HEADERS) FOREACH(func ${ARGV}) STRING(TOUPPER ${func} FUNC) STRING(REPLACE . _ FUNC ${FUNC}) CHECK_INCLUDE_FILE_CXX (${func} HAVE_${FUNC}) IF ( HAVE_${FUNC} ) SET(_CL_HAVE_${FUNC} ${FUNC}) ENDIF ( HAVE_${FUNC} ) IF ( NOT HAVE_${FUNC} ) MESSAGE ( FATAL_ERROR "${func} could not be found" ) ENDIF ( NOT HAVE_${FUNC} ) ENDFOREACH(func ${COMPULSARY_HEADERS}) ENDMACRO(CHECK_REQUIRED_HEADERS) #optional headers MACRO(CHECK_OPTIONAL_HEADERS OPTIONAL_HEADERS) FOREACH(func ${ARGV}) STRING(TOUPPER ${func} FUNC) STRING(REPLACE . _ FUNC ${FUNC}) STRING(REPLACE / _ FUNC ${FUNC}) CHECK_INCLUDE_FILE_CXX (${func} HAVE_${FUNC}) IF ( HAVE_${FUNC} ) SET(_CL_HAVE_${FUNC} ${FUNC}) ENDIF ( HAVE_${FUNC} ) ENDFOREACH(func ${OPTIONAL_HEADERS}) ENDMACRO(CHECK_OPTIONAL_HEADERS) #check for compulsary functions MACRO(CHECK_REQUIRED_FUNCTIONS COMPULSARY_FUNCTIONS) FOREACH(func ${ARGV}) CHECK_OPTIONAL_FUNCTIONS ( ${func} ) IF ( NOT _CL_HAVE_FUNCTION_${FUNC} ) MESSAGE ( FATAL_ERROR "${func} could not be found" ) ENDIF ( NOT _CL_HAVE_FUNCTION_${FUNC} ) ENDFOREACH(func ${COMPULSARY_FUNCTIONS}) SET( CMAKE_EXTRA_INCLUDE_FILES ) ENDMACRO(CHECK_REQUIRED_FUNCTIONS) #check for optional functions MACRO(CHECK_OPTIONAL_FUNCTIONS OPTIONAL_FUNCTIONS) FOREACH(func ${ARGV}) STRING(TOUPPER ${func} FUNC) STRING(REGEX MATCH "[(|)]+" CHECK_OPTIONAL_FUNCTIONS_MATCH ${func} ) IF ( CHECK_OPTIONAL_FUNCTIONS_MATCH STREQUAL "" ) CHECK_FUNCTION_EXISTS (${func} _CL_HAVE_FUNCTION_${FUNC}) ELSE ( CHECK_OPTIONAL_FUNCTIONS_MATCH STREQUAL "" ) STRING(REGEX REPLACE "(\\(.*\\))" "" CHECK_OPTIONAL_FUNCTIONS_MATCH ${func} ) STRING( TOUPPER ${CHECK_OPTIONAL_FUNCTIONS_MATCH} FUNC ) CHECK_STDCALL_FUNCTION_EXISTS (${func} _CL_HAVE_FUNCTION_${FUNC}) ENDIF ( CHECK_OPTIONAL_FUNCTIONS_MATCH STREQUAL "" ) ENDFOREACH(func ${OPTIONAL_FUNCTIONS}) ENDMACRO(CHECK_OPTIONAL_FUNCTIONS)clucene-core-2.3.3.4/src/shared/cmake/Macro_ChooseStatus.cmake000066400000000000000000000016021154025176300241140ustar00rootroot00000000000000#internal macro for choose_* macros. MACRO(_CHOOSE_STATUS status name type) STRING(TOUPPER ${name} NAME) STRING(TOUPPER ${type} TYPE) IF ( ${status} STREQUAL "PROGRESS" ) IF ( "" STREQUAL "${_CHOOSE_STATUS_${TYPE}_${NAME}}" ) MESSAGE ( STATUS "Choosing ${type} for ${name}" ) SET ( _CHOOSE_STATUS_${TYPE}_${NAME} "XXX" ) ENDIF ( "" STREQUAL "${_CHOOSE_STATUS_${TYPE}_${NAME}}" ) ENDIF ( ${status} STREQUAL "PROGRESS" ) IF ( ${status} STREQUAL "END" ) IF ( "XXX" STREQUAL "${_CHOOSE_STATUS_${TYPE}_${NAME}}" ) MESSAGE ( STATUS "Choosing ${type} for ${name} - ${ARGV3}" ) SET ( _CHOOSE_STATUS_${TYPE}_${NAME} ON CACHE INTERNAL "Chose ${type} for ${name} - ${ARGV3}" ) ENDIF ( "XXX" STREQUAL "${_CHOOSE_STATUS_${TYPE}_${NAME}}" ) ENDIF ( ${status} STREQUAL "END" ) ENDMACRO(_CHOOSE_STATUS) clucene-core-2.3.3.4/src/test/000077500000000000000000000000001154025176300157775ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/CLMonolithic_Test.cpp000066400000000000000000000050261154025176300220310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ /* * this is a monolithic file that can be used to compile clucene tests using one source file. * * note: when creating a project add either this file, or all the other .cpp files, not both! */ #include "CuTest.cpp" #include "testall.cpp" #include "tests.cpp" #include "analysis/TestAnalysis.cpp" #include "analysis/TestAnalyzers.cpp" #include "debug/TestError.cpp" #include "document/TestDateTools.cpp" #include "document/TestDocument.cpp" #include "document/TestField.cpp" #include "document/TestNumberTools.cpp" #include "index/IndexWriter4Test.cpp" #include "index/TestAddIndexesNoOptimize.cpp" #include "index/TestHighFreqTerms.cpp" #include "index/TestIndexModifier.cpp" #include "index/TestIndexReader.cpp" #include "index/TestIndexWriter.cpp" #include "index/TestReuters.cpp" #include "index/TestTermVectorsReader.cpp" #include "index/TestThreading.cpp" #include "index/TestUtf8.cpp" #include "queryParser/TestMultiFieldQueryParser.cpp" #include "queryParser/TestQueryParser.cpp" #include "search/BaseTestRangeFilter.cpp" #include "search/CheckHits.cpp" #include "search/QueryUtils.cpp" #include "search/spans/TestBasics.cpp" #include "search/spans/TestNearSpansOrdered.cpp" #include "search/spans/TestSpanExplanations.cpp" #include "search/spans/TestSpanExplanationsOfNonMatches.cpp" #include "search/spans/TestSpanQueries.cpp" #include "search/spans/TestSpansAdvanced2.cpp" #include "search/spans/TestSpansAdvanced.cpp" #include "search/spans/TestSpans.cpp" #include "search/TestBoolean.cpp" #include "search/TestConstantScoreRangeQuery.cpp" #include "search/TestDateFilter.cpp" #include "search/TestExplanations.cpp" #include "search/TestExtractTerms.cpp" #include "search/TestForDuplicates.cpp" #include "search/TestIndexSearcher.cpp" #include "search/TestQueries.cpp" #include "search/TestRangeFilter.cpp" #include "search/TestSearch.cpp" #include "search/TestSort.cpp" #include "search/TestTermVector.cpp" #include "search/TestWildcard.cpp" #include "store/MockRAMDirectory.cpp" #include "store/TestRAMDirectory.cpp" #include "store/TestStore.cpp" #include "util/English.cpp" #include "util/TestBitSet.cpp" #include "util/TestPriorityQueue.cpp" #include "util/TestStringBuffer.cpp" clucene-core-2.3.3.4/src/test/CMakeLists.txt000066400000000000000000000231161154025176300205420ustar00rootroot00000000000000PROJECT(clucene-test) INCLUDE (DefineOptions) DEFINE_OPTIONS(EXTRA_OPTIONS EXTRA_LIBS) ADD_DEFINITIONS(${EXTRA_OPTIONS}) INCLUDE_DIRECTORIES( ${clucene-test_SOURCE_DIR} ) SOURCE_GROUP("unit_testing" ./*.cpp) SOURCE_GROUP("analysis" ./analysis/*) SOURCE_GROUP("debug" ./debug/*) SOURCE_GROUP("document" ./document/*) SOURCE_GROUP("index" ./index/*) SOURCE_GROUP("queryParser" ./queryParser/*) SOURCE_GROUP("search" ./search/*) SOURCE_GROUP("search-spans" ./search/spans/*) SOURCE_GROUP("store" ./store/*) SOURCE_GROUP("util" ./util/*) IF ( BUILD_CONTRIBS_LIB ) SET(test_contribs_lib_files ./contribs-lib/analysis/de/TestGermanStemFilter.cpp) SET(EXTRA_LIBS ${EXTRA_LIBS} clucene-contribs-lib) ADD_DEFINITIONS(-DTEST_CONTRIB_LIBS) INCLUDE_DIRECTORIES(${clucene-test_SOURCE_DIR} ${clucene-contribs-lib_SOURCE_DIR}) SOURCE_GROUP("contribs-lib" REGULAR_EXPRESSION ./contribs-lib/*) SOURCE_GROUP("contribs-lib\\analysis" REGULAR_EXPRESSION ./contribs-lib/analysis/*) SOURCE_GROUP("contribs-lib\\analysis\\de" FILES ${test_contribs_lib_files}) ENDIF ( BUILD_CONTRIBS_LIB ) file(GLOB_RECURSE test_HEADERS ${CMAKE_SOURCE_DIR}/test/*.h) SET(test_files ./tests.cpp ./CuTest.cpp ./testall.cpp ./queryParser/TestQueryParser.cpp ./queryParser/TestMultiFieldQueryParser.cpp ./analysis/TestAnalysis.cpp ./analysis/TestAnalyzers.cpp ./debug/TestError.cpp ./document/TestDateTools.cpp ./document/TestDocument.cpp ./document/TestNumberTools.cpp ./document/TestField.cpp ./store/TestStore.cpp ./store/MockRAMDirectory.cpp ./store/TestRAMDirectory.cpp ./search/MockScorer.h ./search/MockHitCollector.h ./search/TestBoolean.cpp ./search/TestDateFilter.cpp ./search/TestForDuplicates.cpp ./search/TestQueries.cpp ./search/TestRangeFilter.cpp ./search/TestSearch.cpp ./search/TestSort.cpp ./search/TestWildcard.cpp ./search/TestTermVector.cpp ./search/TestExtractTerms.cpp ./search/TestConstantScoreRangeQuery.cpp ./search/TestIndexSearcher.cpp ./index/IndexWriter4Test.cpp ./search/BaseTestRangeFilter.h ./search/BaseTestRangeFilter.cpp ./search/QueryUtils.h ./search/QueryUtils.cpp ./search/CheckHits.h ./search/CheckHits.cpp ./search/TestExplanations.cpp ./search/TestExplanations.h ./search/spans/TestSpans.h ./search/spans/TestSpans.cpp ./search/spans/TestSpanQueries.cpp ./search/spans/TestBasics.h ./search/spans/TestBasics.cpp ./search/spans/TestSpansAdvanced.cpp ./search/spans/TestSpansAdvanced.h ./search/spans/TestSpansAdvanced2.cpp ./search/spans/TestSpansAdvanced2.h ./search/spans/TestNearSpansOrdered.cpp ./search/spans/TestNearSpansOrdered.h ./search/spans/TestSpanExplanations.cpp ./search/spans/TestSpanExplanations.h ./search/spans/TestSpanExplanationsOfNonMatches.cpp ./search/spans/TestSpanExplanationsOfNonMatches.h ./index/TestIndexModifier.cpp ./index/TestIndexWriter.cpp ./index/TestIndexModifier.cpp ./index/TestIndexReader.cpp ./index/TestThreading.cpp ./index/TestUtf8.cpp ./index/TestHighFreqTerms.cpp ./index/TestReuters.cpp ./index/TestAddIndexesNoOptimize.cpp ./index/TestTermVectorsReader.cpp ./util/TestPriorityQueue.cpp ./util/TestBitSet.cpp ./util/TestStringBuffer.cpp ./util/English.cpp ${test_HEADERS} ) IF ( USE_SHARED_OBJECT_FILES ) GET_SHARED_FILES(clucene_shared_Files) ENDIF ( USE_SHARED_OBJECT_FILES ) #todo: do glob header and include header files for IDE. ADD_EXECUTABLE(cl_test EXCLUDE_FROM_ALL ${clucene_shared_Files} ${test_files} ${test_contribs_lib_files}) #link the executable against the releavent clucene-shared library (if we aren't using the object files) IF ( NOT USE_SHARED_OBJECT_FILES ) TARGET_LINK_LIBRARIES(cl_test clucene-core clucene-shared ${EXTRA_LIBS}) ENDIF ( NOT USE_SHARED_OBJECT_FILES ) ############################ #special tests: ############################ IF ( ENABLE_COMPILE_TESTS ) #define zlib library requirements... find_package(ZLIB) IF ( ZLIB_FOUND ) SET ( EXTRA_LIBS ${EXTRA_LIBS} ${ZLIB_LIBRARY} ) INCLUDE_DIRECTORIES( ${ZLIB_INCLUDE_DIR} ) ENDIF ( ZLIB_FOUND ) SET(test_monolithic_Files ${clucene-core_SOURCE_DIR}/CLucene/CLMonolithic.cpp ./CLMonolithic_Test.cpp) SET (TESTS_CXX_FLAGS "-DMAKE_CLUCENE_SHARED_LIB -DMAKE_CLUCENE_CORE_LIB") SET (TESTS_EXE_LINKER_FLAGS "${CMAKE_THREAD_LIBS_INIT}") ADD_EXECUTABLE(cl_test-ascii EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-ascii "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-ascii PROPERTIES COMPILE_DEFINITIONS "_ASCII" COMPILE_FLAGS "${TESTS_CXX_FLAGS}" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS}") ADD_CUSTOM_TARGET(test-ascii COMMENT "Running cl_test-ascii" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-ascii DEPENDS cl_test-ascii) ADD_EXECUTABLE(cl_test-namespace EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-namespace "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-namespace PROPERTIES COMPILE_DEFINITIONS "DISABLE_NAMESPACE" COMPILE_FLAGS "${TESTS_CXX_FLAGS}" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS}") ADD_CUSTOM_TARGET(test-namespace COMMENT "Running cl_test-namespace" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-namespace DEPENDS cl_test-namespace) ADD_EXECUTABLE(cl_test-mmap EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-mmap "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-mmap PROPERTIES COMPILE_DEFINITIONS "LUCENE_FS_MMAP" COMPILE_FLAGS "${TESTS_CXX_FLAGS}" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS}") ADD_CUSTOM_TARGET(test-mmap COMMENT "Running cl_test-mmap" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-mmap DEPENDS cl_test-mmap) ADD_EXECUTABLE(cl_test-singlethreading EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-singlethreading "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-singlethreading PROPERTIES COMPILE_DEFINITIONS "_CL_DISABLE_MULTITHREADING" COMPILE_FLAGS "${TESTS_CXX_FLAGS}" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS}") ADD_CUSTOM_TARGET(test-singlethreading COMMENT "Running cl_test-singlethreading" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-singlethreading DEPENDS cl_test-singlethreading) ADD_EXECUTABLE(cl_test-refcnt EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-refcnt "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-refcnt PROPERTIES COMPILE_DEFINITIONS "LUCENE_ENABLE_REFCOUNT" COMPILE_FLAGS "${TESTS_CXX_FLAGS}" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS}") ADD_CUSTOM_TARGET(test-refcnt COMMENT "Running cl_test-refcnt" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-refcnt DEPENDS cl_test-refcnt) ADD_EXECUTABLE(cl_test-platform-charfuncs EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-platform-charfuncs "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-platform-charfuncs PROPERTIES COMPILE_DEFINITIONS "LUCENE_USE_INTERNAL_CHAR_FUNCTIONS=0" COMPILE_FLAGS "${TESTS_CXX_FLAGS}" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS}") #this one just tests that the compile works... tests will (mostly) fail, since the #internal functions do not produce the exact results expected. ADD_CUSTOM_TARGET(test-platform-charfuncs COMMENT "Running cl_test-platform-charfuncs" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-platform-charfuncs DEPENDS cl_test-platform-charfuncs) #this one last so we only have pedantic for test-pedantic ADD_EXECUTABLE(cl_test-pedantic EXCLUDE_FROM_ALL ${test_monolithic_Files}) TARGET_LINK_LIBRARIES(cl_test-pedantic "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-pedantic PROPERTIES COMPILE_DEFINITIONS "" COMPILE_FLAGS "${TESTS_CXX_FLAGS} -std=gnu++98 -pedantic -Wnon-virtual-dtor -Wundef -Wcast-align -Wchar-subscripts -W -Wformat-security -Wextra -Wall -Wno-long-long -Wno-sign-compare" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS} -Wall") ADD_CUSTOM_TARGET(test-pedantic COMMENT "Running cl_test-pedantic" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-pedantic DEPENDS cl_test-pedantic) CHECK_CXX_ACCEPTS_FLAG("-fprofile-arcs -ftest-coverage" GccFlagGcov) IF ( GccFlagGcov ) ADD_EXECUTABLE(cl_test-gcov EXCLUDE_FROM_ALL ${test_monolithic_Files} ) TARGET_LINK_LIBRARIES(cl_test-gcov "${EXTRA_LIBS}") SET_TARGET_PROPERTIES(cl_test-gcov PROPERTIES COMPILE_FLAGS "${TESTS_CXX_FLAGS} -fprofile-arcs -ftest-coverage" LINK_FLAGS "${TESTS_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") ADD_CUSTOM_TARGET(test-gcov COMMENT "Running cl_test-gcov" COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-gcov COMMAND lcov --directory CMakeFiles/cl_test-gcov.dir/__/core/CLucene -c -o clucene-coverage.info COMMAND lcov --remove clucene-coverage.info "\"/usr/*\"" -o clucene-coverage.clean COMMAND genhtml -o ${CMAKE_BINARY_DIR}/clucene-coverage clucene-coverage.clean DEPENDS cl_test-gcov) ENDIF ( GccFlagGcov ) #target for running all tests ADD_CUSTOM_TARGET(test-all COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-pedantic COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-ascii COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-namespace COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-mmap COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-singlethreading COMMAND ${EXECUTABLE_OUTPUT_PATH}/cl_test-refcnt DEPENDS cl_test-pedantic cl_test-ascii cl_test-namespace cl_test-mmap cl_test-singlethreading cl_test-refcnt cl_test-platform-charfuncs ) ENDIF ( ENABLE_COMPILE_TESTS ) ############################ IF ( BUILD_STATIC_LIBRARIES ) PROJECT(clucene-test-static) ADD_EXECUTABLE(cl_test-static EXCLUDE_FROM_ALL ${clucene_shared_Files} ${test_files} ) IF ( UNIX ) TARGET_LINK_LIBRARIES(cl_test-static clucene-core-static clucene-shared-static pthread ${EXTRA_LIBS}) ELSE () TARGET_LINK_LIBRARIES(cl_test-static clucene-core-static clucene-shared-static ${EXTRA_LIBS}) ENDIF ( UNIX ) ENDIF ( BUILD_STATIC_LIBRARIES ) ############################ clucene-core-2.3.3.4/src/test/CuTest.cpp000066400000000000000000000366761154025176300177340ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CuTest.h" #include #include #include #include static int verbose = 0; static int messyPrinting = 0; void CuInit(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) { if (!strcmp(argv[i], "-v")) { verbose = 1; } if (!strcmp(argv[i], "-p")) { messyPrinting = 1; } } } /*-------------------------------------------------------------------------* * CuTcs *-------------------------------------------------------------------------*/ TCHAR* CuStrAlloc(int size) { TCHAR* n = (TCHAR*) malloc( sizeof(TCHAR) * (size) ); return n; } TCHAR* CuTcsCopy(TCHAR* old) { int len = _tcslen(old); TCHAR* n = CuStrAlloc(len + 1); _tcscpy(n, old); return n; } TCHAR* CuTcsCat(TCHAR* orig, TCHAR* add) { int len = _tcslen(orig) + _tcslen(add); TCHAR* n = CuStrAlloc(len + 1); _tcscpy(n, orig); _tcscat(n, add); return n; } /*-------------------------------------------------------------------------* * CuString *-------------------------------------------------------------------------*/ TCHAR* CuTcsAlloc(int size) { TCHAR* n = (TCHAR*) malloc( sizeof(TCHAR) * (size) ); return n; } TCHAR* CuTcsCopy(const TCHAR* old) { int len = _tcslen(old); TCHAR* n = CuTcsAlloc(len + 1); _tcscpy(n, old); return n; } /*-------------------------------------------------------------------------* * CuString *-------------------------------------------------------------------------*/ void CuStringInit(CuString* str) { str->length = 0; str->size = STRING_MAX; str->buffer = (TCHAR*) malloc(sizeof(TCHAR) * str->size); str->buffer[0] = '\0'; } CuString* CuStringNew(void) { CuString* str = (CuString*) malloc(sizeof(CuString)); str->length = 0; str->size = STRING_MAX; str->buffer = (TCHAR*) malloc(sizeof(TCHAR) * str->size); str->buffer[0] = '\0'; return str; } void CuStringFree(CuString* str){ free(str->buffer); free(str); } void CuStringResize(CuString* str, int newSize) { str->buffer = (TCHAR*) realloc(str->buffer, sizeof(TCHAR) * newSize); str->size = newSize; } void CuStringAppend(CuString* str, const TCHAR* text) { int length = _tcslen(text); if (str->length + length + 1 >= str->size) CuStringResize(str, str->length + length + 1 + STRING_INC); str->length += length; _tcscat(str->buffer, text); } void CuStringAppendChar(CuString* str, TCHAR ch) { TCHAR text[2]; text[0] = ch; text[1] = '\0'; CuStringAppend(str, text); } void CuStringAppendFormat(CuString* str, const TCHAR* format, ...) { TCHAR buf[HUGE_STRING_LEN]; va_list argp; va_start(argp, format); _vsntprintf(buf, HUGE_STRING_LEN,format, argp); va_end(argp); CuStringAppend(str, buf); } void CuStringRead(CuString *str, TCHAR *path) { path = NULL; CU_TDUP(path,str->buffer); } /*-------------------------------------------------------------------------* * CuTest *-------------------------------------------------------------------------*/ void CuTestInit(CuTest* t, const TCHAR* name, TestFunction function) { t->name = CuTcsCopy(name); t->notimpl = 0; t->failed = 0; t->ran = 0; t->message = NULL; t->function = function; // t->jumpBuf = NULL; } CuTest* CuTestNew(const TCHAR* name, TestFunction function) { CuTest* tc = CU_ALLOC(CuTest); CuTestInit(tc, name, function); return tc; } void CuTestDelete(CuTest* tst){ free(tst->name); if ( tst->message != NULL ) free(tst->message); free(tst); } void CuNotImpl(CuTest* tc, const TCHAR* message) { CuString* newstr = CuStringNew(); CuStringAppend(newstr, message); CuStringAppend(newstr, _T(" not implemented on this platform")); tc->notimpl = 1; CuMessage(tc,newstr->buffer); CuStringFree(newstr); // if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); } void CuFail(CuTest* tc, const TCHAR* format, ...) { tc->failed = 1; TCHAR buf[HUGE_STRING_LEN]; va_list argp; va_start(argp, format); _vsntprintf(buf, HUGE_STRING_LEN, format, argp); va_end(argp); // CuMessage(tc,buf); _CLTHROWT(CL_ERR_Runtime, buf); } void CuFail(CuTest* tc, CLuceneError& e) { tc->failed = 1; throw e; } void CuMessageV(CuTest* tc, const TCHAR* format, va_list& argp){ TCHAR buf[HUGE_STRING_LEN]; _vsntprintf(buf, HUGE_STRING_LEN, format, argp); TCHAR* old = tc->message; if ( messyPrinting ){ _tprintf(_T("%s"),buf); }else{ if ( old == NULL ){ tc->message = CuTcsCopy(buf); }else{ tc->message = CuTcsCat(old,buf); free(old); } } } void CuMessage(CuTest* tc, const TCHAR* format, ...){ va_list argp; va_start(argp, format); CuMessageV(tc,format,argp); va_end(argp); } void CuMessageA(CuTest* tc, const char* format, ...){ va_list argp; char buf[HUGE_STRING_LEN]; TCHAR tbuf[HUGE_STRING_LEN]; va_start(argp, format); vsprintf(buf, format, argp); va_end(argp); TCHAR* old = tc->message; STRCPY_AtoT(tbuf,buf,HUGE_STRING_LEN); if ( messyPrinting ){ _tprintf(_T("%s"),buf); }else{ if ( old == NULL ){ tc->message = CuTcsCopy(tbuf); }else{ tc->message = CuTcsCat(old,tbuf); free(old); } } } void CuAssert(CuTest* tc, const TCHAR* message, int condition) { if (condition) return; CuFail(tc, message); } void CuAssertTrue(CuTest* tc, int condition, const TCHAR* msg) { if (condition) return; if (msg != NULL) CuFail(tc, msg); else CuFail(tc, _T("assert failed")); } void CuAssertEquals(CuTest* tc, const int32_t expected, const int32_t actual, const TCHAR* msg) { CuAssertIntEquals(tc, msg, expected, actual); } void CuAssertStrEquals(CuTest* tc, const TCHAR* preMessage, const TCHAR* expected, TCHAR* actual, bool bDelActual){ CuString* message; if (_tcscmp(expected, actual) == 0) { if (bDelActual) _CLDELETE_LCARRAY(actual); return; } message = CuStringNew(); if (preMessage) { CuStringAppend(message, preMessage); CuStringAppend(message, _T(" : ") ); } CuStringAppend(message, _T("expected\n---->\n")); CuStringAppend(message, expected); CuStringAppend(message, _T("\n<----\nbut saw\n---->\n")); CuStringAppend(message, actual); if (bDelActual) _CLDELETE_LCARRAY(actual); CuStringAppend(message, _T("\n<----")); CuFail(tc, message->buffer); CuStringFree(message); } void CuAssertStrEquals(CuTest* tc, const TCHAR* preMessage, const TCHAR* expected, const TCHAR* actual) { CuString* message; if (_tcscmp(expected, actual) == 0) { return; } message = CuStringNew(); if (preMessage) { CuStringAppend(message, preMessage); CuStringAppend(message, _T(" : ") ); } CuStringAppend(message, _T("expected\n---->\n")); CuStringAppend(message, expected); CuStringAppend(message, _T("\n<----\nbut saw\n---->\n")); CuStringAppend(message, actual); CuStringAppend(message, _T("\n<----")); CuFail(tc, message->buffer); CuStringFree(message); } void CuAssertIntEquals(CuTest* tc, const TCHAR* preMessage, int expected, int actual) { if (expected == actual) return; TCHAR buf[STRING_MAX]; if (preMessage != NULL){ _sntprintf(buf, STRING_MAX, _T("%s : expected <%d> but was <%d>"), preMessage, expected, actual); } else { _sntprintf(buf, STRING_MAX, _T("Assert failed : expected <%d> but was <%d>"), expected, actual); } CuFail(tc, buf); } void CuAssertSizeEquals(CuTest* tc, const TCHAR* preMessage, size_t expected, size_t actual) { if (expected == actual) return; TCHAR buf[STRING_MAX]; if (preMessage != NULL){ _sntprintf(buf, STRING_MAX, _T("%s : expected <%d> but was <%d>"), preMessage, expected, actual); } else { _sntprintf(buf, STRING_MAX, _T("Assert failed : expected <%d> but was <%d>"), expected, actual); } CuFail(tc, buf); } void CuAssertPtrEquals(CuTest* tc, const TCHAR* preMessage, const void* expected, const void* actual) { TCHAR buf[STRING_MAX]; if (expected == actual) return; _sntprintf(buf, STRING_MAX,_T("%s : expected pointer <%p> but was <%p>"), preMessage, expected, actual); CuFail(tc, buf); } void CuAssertPtrNotNull(CuTest* tc, const TCHAR* preMessage, const void* pointer) { TCHAR buf[STRING_MAX]; if (pointer != NULL ) return; _sntprintf(buf,STRING_MAX, _T("%s : null pointer unexpected, but was <%p>"), preMessage, pointer); CuFail(tc, buf); } void CuTestRun(CuTest* tc) { // jmp_buf buf; // tc->jumpBuf = &buf; // if (setjmp(buf) == 0) // { tc->ran = 1; (tc->function)(tc); // } // tc->jumpBuf = 0; } /*-------------------------------------------------------------------------* * CuSuite *-------------------------------------------------------------------------*/ void CuSuiteInit(CuSuite* testSuite, const TCHAR *name) { testSuite->name = NULL; CU_TDUP(testSuite->name,name); testSuite->count = 0; testSuite->failCount = 0; testSuite->notimplCount = 0; testSuite->timeTaken = 0; } CuSuite* CuSuiteNew(const TCHAR *name) { CuSuite* testSuite = CU_ALLOC(CuSuite); CuSuiteInit(testSuite, name); return testSuite; } void CuSuiteDelete(CuSuite* suite){ free(suite->name); for ( int i=0;icount;i++ ){ CuTestDelete(suite->list[i]); } free(suite); } void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase) { assert(testSuite->count < MAX_TEST_CASES); testSuite->list[testSuite->count] = testCase; testSuite->count++; } void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2) { int i; for (i = 0 ; i < testSuite2->count ; ++i) { CuTest* testCase = testSuite2->list[i]; CuSuiteAdd(testSuite, testCase); } } void CuSuiteRun(CuSuite* testSuite) { int i; uint64_t start = Misc::currentTimeMillis(); for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; try{ CuTestRun(testCase); }catch(CLuceneError& err){ testCase->failed=1; CuMessage(testCase,err.twhat()); } testSuite->timeTaken = Misc::currentTimeMillis() - start; if (testCase->failed) { testSuite->failCount += 1; } if (testCase->notimpl) { testSuite->notimplCount += 1; } } } void CuSuiteSummary(CuSuite* testSuite, CuString* summary, bool times) { int i; for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; CuStringAppend(summary, testCase->failed ? _T("F") : testCase->notimpl ? _T("N"): _T(".")); } if ( times ){ int bufferLen = 25-summary->length-10; for (int i=0;itimeTaken); } CuStringAppend(summary, _T("\n")); } void CuSuiteOverView(CuSuite* testSuite, CuString* details) { CuStringAppendFormat(details, _T("%d %s run: %d passed, %d failed, ") _T("%d not implemented.\n"), testSuite->count, testSuite->count == 1 ? "test" : "tests", testSuite->count - testSuite->failCount - testSuite->notimplCount, testSuite->failCount, testSuite->notimplCount); } void CuSuiteDetails(CuSuite* testSuite, CuString* details) { int i; int failCount = 0; if (testSuite->failCount != 0 && verbose) { CuStringAppendFormat(details, _T("\nFailed tests in %s:\n"), testSuite->name); for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; if (testCase->failed) { failCount++; CuStringAppendFormat(details, _T("%d) %s: %s\n"), failCount, testCase->name, testCase->message); } } } if (testSuite->notimplCount != 0 && verbose) { CuStringAppendFormat(details, _T("\nNot Implemented tests in %s:\n"), testSuite->name); for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; if (testCase->notimpl) { failCount++; CuStringAppendFormat(details, _T("%d) %s: %s\n"), failCount, testCase->name, testCase->message); } } } } /*-------------------------------------------------------------------------* * CuSuiteList *-------------------------------------------------------------------------*/ CuSuiteList* CuSuiteListNew(const TCHAR *name) { CuSuiteList* testSuite = CU_ALLOC(CuSuiteList); testSuite->name = NULL; CU_TDUP(testSuite->name,name); testSuite->count = 0; return testSuite; } void CuSuiteListDelete(CuSuiteList* lst){ free(lst->name); for ( int i=0;icount;i++ ){ CuSuiteDelete(lst->list[i]); } free(lst); } void CuSuiteListAdd(CuSuiteList *suites, CuSuite *origsuite) { assert(suites->count < MAX_TEST_CASES); suites->list[suites->count] = origsuite; suites->count++; } void CuSuiteListRun(CuSuiteList* testSuite) { int i; for (i = 0 ; i < testSuite->count ; ++i) { CuSuite* testCase = testSuite->list[i]; CuSuiteRun(testCase); } } static const TCHAR *genspaces(int i) { TCHAR *str = (TCHAR*)malloc((i + 1) * sizeof(TCHAR)); for ( int j=0;jname); for (i = 0 ; i < testSuite->count ; ++i) { bool hasprinted=false; CuSuite* testCase = testSuite->list[i]; CuString *str = CuStringNew(); size_t len = _tcslen(testCase->name); const TCHAR* spaces = len>31?NULL:genspaces(31 - len); _tprintf(_T(" %s:%s"), testCase->name, len>31?_T(""):spaces); free((void*)spaces); fflush(stdout); CuSuiteRun(testCase); if ( verbose ){ for ( int i=0;icount;i++ ){ if ( testCase->list[i]->ran ){ if ( testCase->list[i]->message != NULL ){ if ( !hasprinted ) printf("\n"); _tprintf(_T(" %s:\n"),testCase->list[i]->name); TCHAR* msg = testCase->list[i]->message; bool nl = true; //write out message, indenting on new lines while ( *msg != '\0' ){ if ( nl ){ printf(" "); nl=false; } if ( *msg == '\n' ) nl = true; putc(*msg,stdout); msg++; } if ( testCase->list[i]->message[_tcslen(testCase->list[i]->message)-1] != '\n' ) printf("\n"); hasprinted=true; } } } } CuSuiteSummary(testCase, str, times); if ( hasprinted ) _tprintf(_T(" Result: %s\n"), str->buffer); else _tprintf(_T(" %s"), str->buffer); CuStringFree(str); } _tprintf(_T("\n")); } int CuSuiteListDetails(CuSuiteList* testSuite, CuString* details) { int i; int failCount = 0; int notImplCount = 0; int count = 0; for (i = 0 ; i < testSuite->count ; ++i) { failCount += testSuite->list[i]->failCount; notImplCount += testSuite->list[i]->notimplCount; count += testSuite->list[i]->count; } CuStringAppendFormat(details, _T("%d %s run: %d passed, %d failed, ") _T("%d not implemented.\n"), count, count == 1 ? _T("test") : _T("tests"), count - failCount - notImplCount, failCount, notImplCount); if (failCount != 0 && verbose) { for (i = 0 ; i < testSuite->count ; ++i) { CuString *str = CuStringNew(); CuSuite* testCase = testSuite->list[i]; if (testCase->failCount) { CuSuiteDetails(testCase, str); CuStringAppend(details, str->buffer); } CuStringFree(str); } } if (notImplCount != 0 && verbose) { for (i = 0 ; i < testSuite->count ; ++i) { CuString *str = CuStringNew(); CuSuite* testCase = testSuite->list[i]; if (testCase->notimplCount) { CuSuiteDetails(testCase, str); CuStringAppend(details, str->buffer); } CuStringFree(str); } } return failCount; } clucene-core-2.3.3.4/src/test/CuTest.h000066400000000000000000000113141154025176300173570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef CU_TEST_H #define CU_TEST_H /* CuString */ TCHAR* CuWstrAlloc(int size); TCHAR* CuWstrCopy(const TCHAR* old); #define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE))) #define CU_TDUP(dest,src) dest=((TCHAR*)malloc(sizeof(TCHAR)*_tcslen(src)+sizeof(TCHAR)));_tcscpy(dest,src); #define HUGE_STRING_LEN 8192 #define STRING_MAX 256 #define STRING_INC 256 #define CLUCENE_ASSERT(x) CuAssert(tc,_T("Assert Failed: ") _T(#x),x) typedef struct { int length; int size; TCHAR* buffer; } CuString; void CuStringInit(CuString* str); CuString* CuStringNew(void); void CuStringFree(CuString* str); void CuStringRead(CuString* str, TCHAR* path); void CuStringAppend(CuString* str, const TCHAR* text); void CuStringAppendChar(CuString* str, TCHAR ch); void CuStringAppendFormat(CuString* str, const TCHAR* format, ...); void CuStringResize(CuString* str, int newSize); /* CuTest */ typedef struct CuTest CuTest; typedef void (*TestFunction)(CuTest *); struct CuTest { TCHAR* name; TestFunction function; int notimpl; int failed; int ran; TCHAR* message; // jmp_buf *jumpBuf; }; void CuInit(int argc, char *argv[]); void CuTestInit(CuTest* t, const TCHAR* name, TestFunction function); CuTest* CuTestNew(const TCHAR* name, TestFunction function); void CuTestDelete(CuTest* tst); void CuFail(CuTest* tc, const TCHAR* format, ...); void CuFail(CuTest* tc, CLuceneError& e); void CuMessage(CuTest* tc, const TCHAR* message,...); void CuMessageV(CuTest* tc, const TCHAR* format, va_list& argp); void CuMessageA(CuTest* tc, const char* format, ...); void CuNotImpl(CuTest* tc, const TCHAR* message); void CuAssert(CuTest* tc, const TCHAR* message, int condition); void CuAssertTrue(CuTest* tc, int condition, const TCHAR* msg = NULL); void CuAssertEquals(CuTest* tc, const int32_t expected, const int32_t actual, const TCHAR* msg = NULL); void CuAssertStrEquals(CuTest* tc, const TCHAR* preMessage, const TCHAR* expected, const TCHAR* actual); void CuAssertStrEquals(CuTest* tc, const TCHAR* preMessage, const TCHAR* expected, TCHAR* actual, bool bDelActual = false); void CuAssertIntEquals(CuTest* tc, const TCHAR* preMessage, int expected, int actual); void CuAssertSizeEquals(CuTest* tc, const TCHAR* preMessage, int expected, int actual); void CuAssertPtrEquals(CuTest* tc, const TCHAR* preMessage, const void* expected, const void* actual); void CuAssertPtrNotNull(CuTest* tc, const TCHAR* preMessage, const void* pointer); void CuTestRun(CuTest* tc); /* CuSuite */ #define MAX_TEST_CASES 1024 #define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(_T(#TEST), TEST)) /* * Macros used to make porting of Java Lucene tests easier. Assumes CuTest exists in the scope as tc */ #define assertTrue(CND) CuAssertTrue(tc, CND) #define assertTrueMsg(MSG, CND) CuAssertTrue(tc, CND, MSG) #define assertEquals(EXPECTED, ACTUAL) CuAssertEquals(tc, EXPECTED, ACTUAL) #define assertEqualsMsg(MSG, EXPECTED, ACTUAL) CuAssertEquals(tc, EXPECTED, ACTUAL, MSG) extern char clucene_data_location[1024]; typedef struct { TCHAR *name; int count; CuTest* list[MAX_TEST_CASES]; int failCount; int notimplCount; uint64_t timeTaken; } CuSuite; void CuSuiteInit(CuSuite* testSuite, const TCHAR* name); CuSuite* CuSuiteNew(const TCHAR* name); void CuSuiteDelete(CuSuite* suite); void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase); void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2); void CuSuiteRun(CuSuite* testSuite); void CuSuiteSummary(CuSuite* testSuite, CuString* summary, bool times); void CuSuiteOverView(CuSuite* testSuite, CuString* details); void CuSuiteDetails(CuSuite* testSuite, CuString* details); typedef struct { TCHAR *name; int count; CuSuite* list[MAX_TEST_CASES]; } CuSuiteList; struct unittest { const char *testname; CuSuite *(*func)(void); }; CuSuiteList* CuSuiteListNew(const TCHAR* name); void CuSuiteListDelete(CuSuiteList* lst); void CuSuiteListAdd(CuSuiteList* testSuite, CuSuite *testCase); void CuSuiteListRun(CuSuiteList* testSuite); void CuSuiteListRunWithSummary(CuSuiteList* testSuite, bool verbose, bool times); //void CuSuiteListSummary(CuSuiteList* testSuite, CuString* summary); /* Print details of test suite results; returns total number of * tests which failed. */ int CuSuiteListDetails(CuSuiteList* testSuite, CuString* details); #endif /* CU_TEST_H */ clucene-core-2.3.3.4/src/test/README000066400000000000000000000177011154025176300166650ustar00rootroot00000000000000Writing CLucene tests The Full Suite -------------- /* The driver function. This must return a CuSuite variable, which will * then be used to actually run the tests. Essentially, all Suites are a * collection of tests. The driver will take each Suite, and put it in a * SuiteList, which is a collection of Suites. */ CuSuite *testtime(void) { /* The actual suite, this must be created for each test program. Please * give it a useful name, that will inform the user of the feature being * tested. */ CuSuite *suite = CuSuiteNew("Test Time"); /* Each function must be added to the suite. Each function represents * a single test. It is possible to test multiple features in a single * function, although no tests currently do that. */ SUITE_ADD_TEST(suite, test_now); SUITE_ADD_TEST(suite, test_gmtstr); SUITE_ADD_TEST(suite, test_localstr); SUITE_ADD_TEST(suite, test_exp_get_gmt); SUITE_ADD_TEST(suite, test_exp_get_lt); SUITE_ADD_TEST(suite, test_imp_gmt); SUITE_ADD_TEST(suite, test_rfcstr); SUITE_ADD_TEST(suite, test_ctime); SUITE_ADD_TEST(suite, test_strftime); SUITE_ADD_TEST(suite, test_strftimesmall); SUITE_ADD_TEST(suite, test_exp_tz); SUITE_ADD_TEST(suite, test_strftimeoffset); /* You must return the suite so that the driver knows which suites to * run. */ return suite; } Building the full driver ------------------------ All you need to do to build the full driver is run: make testall To run it, run: ./testall Caveats ------- Currently, some tests are known to fail in certain circumstances: * 'testpoll' opens 64 sockets concurrently; ensure that resource limits are high enough to allow this (using ulimit or limit); for instance, Solaris <=2.7 and HP-UX 11.00 both set the limit to <=64 by default * 'testipsub' will tickle the Solaris 8 getaddrinfo() IPv6 bug, causing the test to hang. Configure with --disable-ipv6 if using an unpatched Solaris 8 installation. * The 'testdso' tests will not work if configured with --disable-shared since the loadable modules cannot be built. Running individual tests --------------------------------- It is not possible to build individual tests, however it is possible to run individual tests. When running the test suite, specify the name of the tests that you want to run on the command line. For example: ./testall teststr testrand Will run the Strings and Random generator tests. Reading the test suite output ----------------------------- Once you run the test suite, you will get output like: All APR Tests: Test Strings: .... Test Time: ............ 16 tests run: 16 passed, 0 failed, 0 not implemented. There are a couple of things to look at with this. First, if you look at the first function in this document, you should notice that the string passed to the CuSuiteNew function is in the output. That is why the string should explain the feature you are testing. Second, this test passed completely. This is obvious in two ways. First, and most obvious, the summary line tells you that 16 tests were run and 16 tests passed. However, the results can also be found in the lines above. Every '.' in the output represents a passed test. If a test fails, the output will look like: All APR Tests: Test Strings: .... Test Time: ..F......... 16 tests run: 15 passed, 1 failed, 0 not implemented. This is not very useful, because you don't know which test failed. However, once you know that a test failed, you can run the suite again, with the -v option. If you do this, you will get something like: All APR Tests: Test Strings: .... Test Time: ..F......... 16 tests run: 15 passed, 1 failed, 0 not implemented. Failed tests: 1) test_localstr: assert failed In this case, we know the test_localstr function failed, and there is an Assert in this that failed (I modified the test to fail for this document). Now, you can look at what that test does, and why it would have failed. There is one other possible output for the test suite (run with -v): All APR Tests: Test Strings: .... Test Time: ..N......... 16 tests run: 15 passed, 0 failed, 1 not implemented. Not Implemented tests: Not Implemented tests: 1) test_localstr: apr_time_exp_lt not implemented on this platform The 'N' means that a function has returned APR_ENOTIMPL. This should be treated as an error, and the function should be implemented as soon as possible. Adding New test Suites to the full driver ------------------------------------------- To add a new Suite to the full driver, you must make a couple of modifications. 1) Edit test_apr.h, and add the prototype for the function. 2) Edit testall.c, and add the function and name to the tests array. 3) Edit Makefile.in, and add the .lo file to the testall target. Once those four things are done, your tests will automatically be added to the suite. Writing tests ------------- There are a couple of rules for writing good tests for the test suite. 1) All tests can determine for themselves if it passed or not. This means that there is no reason for the person running the test suite to interpret the results of the tests. 2) Never use printf to add to the output of the test suite. The suite library should be able to print all of the information required to debug a problem. 3) Functions should be tested with both positive and negative tests. This means that you should test things that should both succeed and fail. 4) Just checking the return code does _NOT_ make a useful test. You must check to determine that the test actually did what you expected it to do. An example test --------------- Finally, we will look at a quick test: /* All tests are passed a CuTest variable. This is how the suite determines * if the test succeeded or failed. */ static void test_localstr(CuTest *tc) { apr_status_t rv; apr_time_exp_t xt; time_t os_now; rv = apr_time_exp_lt(&xt, now); os_now = now / APR_USEC_PER_SEC; /* If the function can return APR_ENOTIMPL, then you should check for it. * This allows platform implementors to know if they have to implement * the function. */ if (rv == APR_ENOTIMPL) { CuNotImpl(tc, "apr_time_exp_lt"); } /* It often helps to ensure that the return code was APR_SUCESS. If it * wasn't, then we know the test failed. */ CuAssertTrue(tc, rv == APR_SUCCESS); /* Now that we know APR thinks it worked properly, we need to check the * output to ensure that we got what we expected. */ CuAssertStrEquals(tc, "2002-08-14 12:05:36.186711 -25200 [257 Sat] DST", print_time(p, &xt)); } Notice, the same test can fail for any of a number of reasons. The first test to fail ends the test. CuTest ------ CuTest is an open source test suite written by Asim Jalis. It has been released under the zlib/libpng license. That license can be found in the CuTest.c and CuTest.h files. The version of CuTest that is included in the APR test suite has been modified from the original distribution in the following ways: 1) The original distribution does not have a -v flag, the details are always printed. 2) The NotImplemented result does not exist. 3) SuiteLists do not exist. In the original distribution, you can add suites to suites, but it just adds the tests in the first suite to the list of tests in the original suite. The output wasn't as detailed as I wanted, so I created SuiteLists. The first two modifications have been sent to the original author of CuTest, but they have not been integrated into the base distribution. The SuiteList changes will be sent to the original author soon. The modified version of CuTest is not currently in any CVS or Subversion server. In time, it will be hosted at rkbloom.net. There are currently no docs for how to write tests, but the teststr and testtime programs should give an idea of how it is done. In time, a document should be written to define how tests are written. clucene-core-2.3.3.4/src/test/analysis/000077500000000000000000000000001154025176300176225ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/analysis/TestAnalysis.cpp000066400000000000000000000046701154025176300227600ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" void test(CuTest *tc,Reader* reader, bool verbose, int64_t bytes) { StandardAnalyzer analyzer; TokenStream* stream = analyzer.tokenStream(NULL, reader); uint64_t start = Misc::currentTimeMillis(); int32_t count = 0; CL_NS(analysis)::Token t; while ( stream->next(&t) != NULL ) { if (verbose) { CuMessage(tc, _T("Text=%s start=%d end=%d\n"), t.termBuffer(), t.startOffset(), t.endOffset() ); } count++; } uint64_t end = Misc::currentTimeMillis(); int64_t time = end - start; CuMessageA (tc,"%d milliseconds to extract ", (int32_t)time); CuMessageA (tc,"%d tokens\n", count); CuMessageA (tc,"%f microseconds/token\n",(time*1000.0)/count ); CuMessageA (tc,"%f megabytes/hour\n", (bytes * 1000.0 * 60.0 * 60.0)/(time * 1000000.0) ); _CLDELETE(stream); } /*todo: move this to contribs because we have no filereader void _testFile(CuTest *tc,const char* fname, bool verbose) { struct cl_stat_t buf; fileStat(fname,&buf); int64_t bytes = buf.st_size; CuMessageA(tc," Reading test file containing %d bytes.\n", bytes ); FileReader fr (fname); const TCHAR *start; size_t total = 0; do { size_t numRead = fr.read(start, numRead); total += numRead; } while (numRead >= 0); test(tc,&fr, verbose, total); fr.close(); }*/ void _testText(CuTest *tc,const TCHAR* text, bool verbose) { CuMessage(tc, _T(" Tokenizing string: %s\n"), text ); StringReader reader(text); test(tc, &reader, verbose, _tcslen(text)); } void testText(CuTest *tc){ _testText(tc,_T("This is a test"),true); } /* void testFile(CuTest *tc){ CuAssert(tc,_T("words.txt does not exist"),Misc::dir_Exists(CLUCENE_LOCATION "reuters-21578/feldman-cia-worldfactbook-data.txt")); _testFile(tc,CLUCENE_LOCATION "reuters-21578/feldman-cia-worldfactbook-data.txt",false); }*/ CuSuite *testanalysis(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Analysis Test")); // SUITE_ADD_TEST(suite, testFile); SUITE_ADD_TEST(suite, testText); return suite; } // EOF clucene-core-2.3.3.4/src/test/analysis/TestAnalyzers.cpp000066400000000000000000000616451154025176300231520ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/analysis/standard/StandardTokenizer.h" // Ported from Java Lucene tests void assertAnalyzesTo(CuTest *tc,Analyzer* a, const TCHAR* input, const TCHAR* output){ Reader* reader = _CLNEW StringReader(input); TokenStream* ts = a->tokenStream(_T("dummy"), reader ); const TCHAR* pos = output; TCHAR buffer[80]; const TCHAR* last = output; CL_NS(analysis)::Token t; while( (pos = _tcsstr(pos+1, _T(";"))) != NULL ) { int32_t len = (int32_t)(pos-last); _tcsncpy(buffer,last,len); buffer[len]=0; CLUCENE_ASSERT(ts->next(&t)!=NULL); CLUCENE_ASSERT( t.termLength() == _tcslen(buffer) ); CLUCENE_ASSERT(_tcscmp( t.termBuffer(), buffer) == 0 ); last = pos+1; } CLUCENE_ASSERT(ts->next(&t)==NULL); //Test failed, more fields than expected. ts->close(); _CLDELETE(reader); _CLDELETE(ts); } void assertReusableAnalyzesTo(CuTest *tc,Analyzer* a, const TCHAR* input, const TCHAR* output){ Reader* reader = _CLNEW StringReader(input); TokenStream* ts = a->reusableTokenStream(_T("dummy"), reader ); const TCHAR* pos = output; TCHAR buffer[80]; const TCHAR* last = output; CL_NS(analysis)::Token t; while( (pos = _tcsstr(pos+1, _T(";"))) != NULL ) { int32_t len = (int32_t)(pos-last); _tcsncpy(buffer,last,len); buffer[len]=0; CLUCENE_ASSERT(ts->next(&t)!=NULL); CLUCENE_ASSERT( t.termLength() == _tcslen(buffer) ); CLUCENE_ASSERT(_tcscmp( t.termBuffer(), buffer) == 0 ); last = pos+1; } CLUCENE_ASSERT(ts->next(&t)==NULL); //Test failed, more fields than expected. ts->close(); _CLLDELETE(reader); } void testSimpleAnalyzer(CuTest *tc){ Analyzer* a = _CLNEW SimpleAnalyzer(); assertAnalyzesTo(tc,a, _T("foo bar FOO BAR"), _T("foo;bar;foo;bar;") ); assertAnalyzesTo(tc,a, _T("foo bar . FOO <> BAR"), _T("foo;bar;foo;bar;")); assertAnalyzesTo(tc,a, _T("foo.bar.FOO.BAR"), _T("foo;bar;foo;bar;")); assertAnalyzesTo(tc,a, _T("U.S.A."), _T("u;s;a;") ); assertAnalyzesTo(tc,a, _T("C++"), _T("c;") ); assertAnalyzesTo(tc,a, _T("B2B"), _T("b;b;")); assertAnalyzesTo(tc,a, _T("2B"), _T("b;")); assertAnalyzesTo(tc,a, _T("\"QUOTED\" word"), _T("quoted;word;")); _CLLDELETE(a); } void useKeywordTokenizer(CuTest *tc, const TCHAR* text) { StringReader reader(text); KeywordTokenizer tokenizer(&reader, 1); Token t; CuAssertTrue(tc, tokenizer.next(&t) != NULL, _T("token expected")); CuAssertStrEquals(tc, _T(""), text, t.termBuffer(), false); CuAssertTrue(tc, tokenizer.next(&t) == NULL, _T("no further token expected")); } // Tracker-Id: 3106808 void testKeywordTokenizer(CuTest *tc) { useKeywordTokenizer(tc, _T("1")); useKeywordTokenizer(tc, _T("12")); useKeywordTokenizer(tc, _T("123")); useKeywordTokenizer(tc, _T("1234")); useKeywordTokenizer(tc, _T("12345")); useKeywordTokenizer(tc, _T("123456")); useKeywordTokenizer(tc, _T("1234567")); useKeywordTokenizer(tc, _T("12345678")); useKeywordTokenizer(tc, _T("123456789")); useKeywordTokenizer(tc, _T("1234567812345678")); useKeywordTokenizer(tc, _T("123456781234567812345678")); } void testKeywordAnalyzer(CuTest *tc){ Analyzer* a = _CLNEW KeywordAnalyzer(); assertAnalyzesTo(tc,a, _T("foo bar FOO BAR"), _T("foo bar FOO BAR;") ); assertAnalyzesTo(tc,a, _T("foo bar . FOO <> BAR"), _T("foo bar . FOO <> BAR;")); assertAnalyzesTo(tc,a, _T("foo.bar.FOO.BAR"), _T("foo.bar.FOO.BAR;")); assertAnalyzesTo(tc,a, _T("U.S.A."), _T("U.S.A.;") ); assertAnalyzesTo(tc,a, _T("C++"), _T("C++;") ); assertAnalyzesTo(tc,a, _T("B2B"), _T("B2B;")); assertAnalyzesTo(tc,a, _T("2B"), _T("2B;")); assertAnalyzesTo(tc,a, _T("\"QUOTED\" word"), _T("\"QUOTED\" word;")); _CLDELETE(a); } void testNull(CuTest *tc){ Analyzer* a = _CLNEW WhitespaceAnalyzer(); assertAnalyzesTo(tc,a, _T("foo bar FOO BAR"), _T("foo;bar;FOO;BAR;")); assertAnalyzesTo(tc,a, _T("foo bar . FOO <> BAR"), _T("foo;bar;.;FOO;<>;BAR;")); assertAnalyzesTo(tc,a, _T("foo.bar.FOO.BAR"), _T("foo.bar.FOO.BAR;")); assertAnalyzesTo(tc,a, _T("U.S.A."), _T("U.S.A.;")); assertAnalyzesTo(tc,a, _T("C++"), _T("C++;")); assertAnalyzesTo(tc,a, _T("B2B"), _T("B2B;")); assertAnalyzesTo(tc,a, _T("2B"), _T("2B;")); assertAnalyzesTo(tc,a, _T("\"QUOTED\" word"), _T("\"QUOTED\";word;") ); _CLLDELETE(a); } void testStop(CuTest *tc){ Analyzer* a = _CLNEW StopAnalyzer(); assertAnalyzesTo(tc,a, _T("foo bar FOO BAR"), _T("foo;bar;foo;bar;")); assertAnalyzesTo(tc,a, _T("foo a bar such FOO THESE BAR"), _T("foo;bar;foo;bar;")); _CLLDELETE(a); } class BuffTokenFilter : public TokenFilter { public: std::list* lst; BuffTokenFilter(TokenStream* input) : TokenFilter(input), lst(NULL) { } virtual ~BuffTokenFilter() { _CLLDELETE(lst); } Token* next(Token* t) { if (lst == NULL) { lst = new std::list(); for(;;) { if (input->next(t) == NULL) break; lst->push_back(t); } } if (lst->size()==0) return NULL; Token* ret = lst->back(); lst->pop_back(); return ret; } }; class PayloadSetter : public TokenFilter { public: ValueArray* data; Payload* p; PayloadSetter(TokenStream* input) : TokenFilter(input), data(_CLNEW ValueArray) { p = _CLNEW Payload(data->values, 1, false); } Token* next(Token* target) { if (input->next(target) == NULL) return NULL; target->setPayload(p); // reuse the payload / byte[] data->values[0]++; return target; } }; void verifyPayload(CuTest* tc, TokenStream* ts) { Token* t = _CLNEW Token(); for(uint8_t b=1;;b++) { t->clear(); if ( ts->next(t) ) break; // System.out.println("id="+System.identityHashCode(t) + " " + t); // System.out.println("payload=" + (int)t.getPayload().toByteArray()[0]); const ValueArray* pl = t->getPayload()->toByteArray(); assertTrue(b == pl->values[0]); _CLLDELETE(pl); } _CLLDELETE(t); } // Make sure old style next() calls result in a new copy of payloads void testPayloadCopy(CuTest* tc) { const TCHAR* s = _T("how now brown cow"); TokenStream* ts; ts = _CLNEW WhitespaceTokenizer(_CLNEW StringReader(s)); ts = _CLNEW BuffTokenFilter(ts); ts = _CLNEW PayloadSetter(ts); verifyPayload(tc, ts); _CLLDELETE(ts); ts = _CLNEW WhitespaceTokenizer(_CLNEW StringReader(s)); ts = _CLNEW PayloadSetter(ts); ts = _CLNEW BuffTokenFilter(ts); verifyPayload(tc, ts); _CLLDELETE(ts); } // LUCENE-1150: Just a compile time test, to ensure the // StandardAnalyzer constants remain publicly accessible void _testStandardConstants() { int x = standard::ALPHANUM; x = standard::APOSTROPHE; x = standard::ACRONYM; x = standard::COMPANY; x = standard::EMAIL; x = standard::HOST; x = standard::NUM; x = standard::CJK; // TODO: Java Lucene 2.3.2 declares this as CJ // const TCHAR** y = standard::tokenImage; <-- TODO: Failing compile time test } // TestPerFieldAnalzyerWrapper.Java void testPerFieldAnalzyerWrapper(CuTest *tc){ const TCHAR* text = _T("Qwerty"); PerFieldAnalyzerWrapper analyzer(_CLNEW WhitespaceAnalyzer()); analyzer.addAnalyzer(_T("special"), _CLNEW SimpleAnalyzer()); StringReader reader(text); TokenStream* tokenStream = analyzer.tokenStream( _T("field"), &reader); CL_NS(analysis)::Token token; CLUCENE_ASSERT( tokenStream->next(&token) != NULL ); CuAssertStrEquals(tc,_T("token.termBuffer()"), _T("Qwerty"), token.termBuffer()); _CLDELETE(tokenStream); StringReader reader2(text); tokenStream = analyzer.tokenStream(_T("special"), &reader2); CLUCENE_ASSERT( tokenStream->next(&token) != NULL ); CuAssertStrEquals(tc, _T("token.termBuffer()"), _T("qwerty"), token.termBuffer()); _CLDELETE(tokenStream); } // A CLucene-specific test #define USE_PER_FIELD_ANALYZER //#define SUB_ANALYZER_TYPE lucene::analysis::WhitespaceAnalyzer #define SUB_ANALYZER_TYPE lucene::analysis::standard::StandardAnalyzer void testPerFieldAnalzyerWrapper2(CuTest *tc){ try { #ifdef USE_PER_FIELD_ANALYZER lucene::analysis::PerFieldAnalyzerWrapper analyzer( _CLNEW lucene::analysis::standard::StandardAnalyzer()); analyzer.addAnalyzer(_T("First"), _CLNEW SUB_ANALYZER_TYPE()); analyzer.addAnalyzer(_T("Second"), _CLNEW SUB_ANALYZER_TYPE()); analyzer.addAnalyzer(_T("Third"), _CLNEW SUB_ANALYZER_TYPE()); analyzer.addAnalyzer(_T("Fourth"), _CLNEW SUB_ANALYZER_TYPE()); analyzer.addAnalyzer(_T("Fifth"), _CLNEW SUB_ANALYZER_TYPE()); #else lucene::analysis::WhitespaceAnalyzer analyzer; #endif char INDEX_PATH[CL_MAX_PATH]; sprintf(INDEX_PATH,"%s/%s",cl_tempDir, "test.analyzers"); lucene::index::IndexWriter writer(INDEX_PATH, &analyzer, true); lucene::document::Document doc; int flags = lucene::document::Field::STORE_YES | lucene::document::Field::INDEX_TOKENIZED; for (int i = 0; i < 100/*00000*/; i++) { doc.clear(); doc.add(*(_CLNEW lucene::document::Field( _T("First"), _T("Blah blah blah"), flags))); doc.add(*(_CLNEW lucene::document::Field( _T("Second"), _T("Blah blah-- blah"), flags))); doc.add(*(_CLNEW lucene::document::Field( _T("Fifth"), _T("Blah blah__ blah"), flags))); doc.add(*(_CLNEW lucene::document::Field( _T("Eigth"), _T("Blah blah blah++"), flags))); doc.add(*(_CLNEW lucene::document::Field( _T("Ninth"), _T("Blah123 blah blah"), flags))); writer.addDocument(&doc); } writer.close(); } catch (CLuceneError err) { printf("CLuceneError: %s", err.what()); } } void testEmptyStopList(CuTest *tc) { const TCHAR* stopWords = { NULL }; StandardAnalyzer a(&stopWords); RAMDirectory ram; IndexWriter writer(&ram, &a, true); Document doc; doc.add(*(_CLNEW lucene::document::Field( _T("First"), _T("Blah blah blah"), Field::STORE_YES | Field::INDEX_TOKENIZED))); writer.addDocument(&doc); writer.close(); IndexSearcher searcher(&ram); Query* q = QueryParser::parse(_T("blah"), _T("First"), &a); Hits* h = searcher.search(q); _CLLDELETE(h); _CLLDELETE(q); } void testStandardAnalyzer(CuTest *tc){ Analyzer* a = _CLNEW StandardAnalyzer(); //todo: check this assertAnalyzesTo(tc,a, _T("[050-070]"), _T("050;-070;") ); assertReusableAnalyzesTo(tc,a, _T("[050-070]"), _T("050;-070;") ); assertReusableAnalyzesTo(tc,a, _T("[050-070]"), _T("050;-070;") ); _CLDELETE(a); } void testISOLatin1AccentFilter(CuTest *tc){ TCHAR str[200]; _tcscpy(str, _T("Des mot cl\xe9s \xc0 LA CHA\xceNE \xc0 \xc1 \xc2 ") //Des mot cl?s ? LA CHA?NE ? ? ? _T("\xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf") //? ? ? ? ? ? ? ? ? ? ? ? ? _T(" \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd8 \xde \xd9 \xda \xdb") //? ? ? ? ? ? ? ? ? ? ? ? ? _T(" \xdc \xdd \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 ") //? ? ? ? ? ? ? ? ? ? ? _T("\xea \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 ") //? ? ? ? ? ? ? ? ? ? ? ? ? _T("\xf8 \xdf \xfe \xf9 \xfa \xfb \xfc \xfd \xff") //? ? ? ? ? ? ? ? ? _T(" ") ); //room for extra latin stuff #ifdef _UCS2 int p = _tcslen(str)-6; str[p+1] = 0x152;// ? str[p+3] = 0x153;// ? str[p+5] = 0x178;//? #endif StringReader reader(str); WhitespaceTokenizer ws(&reader); ISOLatin1AccentFilter filter(&ws,false); CL_NS(analysis)::Token token; CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("Des"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("mot"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("cles"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("LA"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("CHAINE"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("A"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("AE"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("C"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("E"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("E"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("E"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("E"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("I"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("I"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("I"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("I"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("D"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("N"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("O"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("O"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("O"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("O"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("O"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("O"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("TH"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("U"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("U"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("U"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("U"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("Y"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("a"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("a"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("a"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("a"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("a"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("a"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("ae"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("c"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("e"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("e"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("e"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("e"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("i"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("i"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("i"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("i"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("d"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("n"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("o"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("o"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("o"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("o"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("o"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("o"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("ss"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("th"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("u"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("u"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("u"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("u"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("y"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("y"), token.termBuffer()); #ifdef _UCS2 CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("OE"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("oe"), token.termBuffer()); CLUCENE_ASSERT(filter.next(&token) != NULL); CuAssertStrEquals(tc, _T("Token compare"), _T("Y"), token.termBuffer()); #endif CLUCENE_ASSERT(filter.next(&token)==NULL); } void testWordlistLoader(CuTest *tc){ char stopwordsfile[1024]; strcpy(stopwordsfile, clucene_data_location); strcat(stopwordsfile, "/StopWords.test"); Analyzer* a = _CLNEW StopAnalyzer(stopwordsfile); assertAnalyzesTo(tc,a, _T("foo bar FOO BAR"), _T("foo;bar;foo;bar;")); assertAnalyzesTo(tc,a, _T("foo a bar such FOO THESE BAR"), _T("foo;bar;foo;bar;")); _CLDELETE(a); TCHAR testString[10]; _tcscpy(testString, _T("test")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T("test ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T("test ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T(" test")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T(" test")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T(" test ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T(" test ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T(" test ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("test")); _tcscpy(testString, _T(" te st ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("te")); _tcscpy(testString, _T("tes t")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("tes")); _tcscpy(testString, _T(" t est ")); CuAssertStrEquals(tc, _T("stringTrim compare"), CL_NS(util)::Misc::wordTrim(testString), _T("t")); } void testMutipleDocument(CuTest *tc) { RAMDirectory dir; KeywordAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter(&dir,&a, true); Document* doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("partnum"), _T("Q36"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(doc); doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("partnum"), _T("Q37"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(doc); writer->close(); _CLLDELETE(writer); IndexReader* reader = IndexReader::open(&dir); Term* t = _CLNEW Term(_T("partnum"), _T("Q36")); TermDocs* td = reader->termDocs(t); _CLDECDELETE(t); CLUCENE_ASSERT(td->next()); t = _CLNEW Term(_T("partnum"), _T("Q37")); td = reader->termDocs(t); _CLDECDELETE(t); reader->close(); CLUCENE_ASSERT(td->next()); _CLLDELETE(reader); } CuSuite *testanalyzers(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Analyzers Test")); // Ported from TestAnalyzers.java SUITE_ADD_TEST(suite, testSimpleAnalyzer); SUITE_ADD_TEST(suite, testNull); SUITE_ADD_TEST(suite, testStop); SUITE_ADD_TEST(suite, testKeywordTokenizer); SUITE_ADD_TEST(suite, testStandardAnalyzer); //SUITE_ADD_TEST(suite, testPayloadCopy); // <- TODO: Finish Payload and remove asserts before enabling this test // Ported from TestPerFieldAnalzyerWrapper.java + 1 test of our own SUITE_ADD_TEST(suite, testPerFieldAnalzyerWrapper); SUITE_ADD_TEST(suite, testPerFieldAnalzyerWrapper2); // Still incomplete: // Ported from TestKeywordAnalyzer.java //SUITE_ADD_TEST(suite, testMutipleDocument); // <- TODO: This is failing with an exception "Terms are out of order" // Ported from TestISOLatin1AccentFilter.java SUITE_ADD_TEST(suite, testISOLatin1AccentFilter); SUITE_ADD_TEST(suite, testWordlistLoader); SUITE_ADD_TEST(suite, testEmptyStopList); // TODO: Remove testStandardAnalyzer and port TestStandardAnalyzer.java as a whole return suite; } // EOF clucene-core-2.3.3.4/src/test/contribs-lib/000077500000000000000000000000001154025176300203665ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/contribs-lib/analysis/000077500000000000000000000000001154025176300222115ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/contribs-lib/analysis/de/000077500000000000000000000000001154025176300226015ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/contribs-lib/analysis/de/TestGermanStemFilter.cpp000066400000000000000000000043371154025176300273640ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/util/CLStreams.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/analysis/de/GermanStemmer.h" #include "CLucene/analysis/de/GermanStemFilter.h" #include "CLucene/analysis/standard/StandardTokenizer.h" CL_NS_USE(util) CL_NS_USE(analysis) CL_NS_USE2(analysis,de) void check(CuTest* tc, const TCHAR* input, const TCHAR* expected) { StandardTokenizer* tokenStream = new StandardTokenizer(new StringReader(input)); GermanStemFilter filter(tokenStream, true); Token t; if (filter.next(&t) == NULL) CuFail(tc, _T("Token expected!")); CuAssertStrEquals(tc, _T(""), expected, t.termBuffer()); filter.close(); } void testStemming(CuTest *tc) { try { // read test cases from external file: char path[CL_MAX_PATH]; strcpy(path, clucene_data_location); strcat(path, "/contribs-lib/analysis/de/data.txt"); CuAssert(tc, _T("File with test data does not exist"), Misc::dir_Exists(path)); FileReader reader(path, "UTF-8"); TCHAR buffer[1024]; while (true) { int32_t len = reader.readLine(buffer, 1024); if (len == 0) break; Misc::wordTrim(buffer); if (_tcslen(buffer) == 0 || buffer[0] == _T('#')) continue; // ignore comments and empty lines const TCHAR* pos = _tcsstr(buffer, _T(";")); TCHAR part0[1024], part1[1024]; if (pos != NULL) { _tcsncpy(part0, buffer, pos - buffer); _tcscpy(part1, pos + 1); part0[pos - buffer] = '\0'; check(tc, part0, part1); } else { check(tc, buffer, _T("")); } } } catch (CLuceneError &e) { CuFail(tc, e); } } CuSuite *testGermanAnalyzer() { CuSuite *suite = CuSuiteNew(_T("CLucene GermanAnalyzer Test")); SUITE_ADD_TEST(suite, testStemming); return suite; } clucene-core-2.3.3.4/src/test/data/000077500000000000000000000000001154025176300167105ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/StopWords.test000066400000000000000000000000571154025176300215570ustar00rootroot00000000000000a an and are as at be but such these will with clucene-core-2.3.3.4/src/test/data/contribs-lib/000077500000000000000000000000001154025176300212775ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/contribs-lib/analysis/000077500000000000000000000000001154025176300231225ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/contribs-lib/analysis/de/000077500000000000000000000000001154025176300235125ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/contribs-lib/analysis/de/data.txt000066400000000000000000000022021154025176300251600ustar00rootroot00000000000000# German special characters are replaced: häufig;haufig # here the stemmer works okay, it maps related words to the same stem: abschließen;abschliess abschließender;abschliess abschließendes;abschliess abschließenden;abschliess tisch;tisch tische;tisch tischen;tisch haus;hau hauses;hau häuser;hau häusern;hau # here's a case where overstemming occurs, i.e. a word is # mapped to the same stem as unrelated words: hauen;hau # here's a case where understemming occurs, i.e. two related words # are not mapped to the same stem. This is the case with basically # all irregular forms: drama;drama dramen;dram # replace "ß" with 'ss': ausmaß;ausmass # fake words to test if suffixes are cut off: xxxxxe;xxxxx xxxxxs;xxxxx xxxxxn;xxxxx xxxxxt;xxxxx xxxxxem;xxxxx xxxxxer;xxxxx xxxxxnd;xxxxx # the suffixes are also removed when combined: xxxxxetende;xxxxx # words that are shorter than four charcters are not changed: xxe;xxe # -em and -er are not removed from words shorter than five characters: xxem;xxem xxer;xxer # -nd is not removed from words shorter than six characters: xxxnd;xxxnd # words where section sign will be used machen;mach clucene-core-2.3.3.4/src/test/data/french_unicode.bin000066400000000000000000000127441154025176300223650ustar00rootroot00000000000000réputé comédie Hitch - expert en séduction Alex Hitchens est un entremetteur (marieur) professionnel qui utilise des moyens peu orthodoxes pour coacher ses clients et jouer avec le destin. Il réussit ainsi avec succès à unir des hommes ordinaires avec des femmes extraordinaires. Malgré tout cela, Hitch ne croit pas en l'amour. Pourtant sa rencontre avec Sara, une jeune journaliste sexy qui partage les mêmes points de vue cyniques sur les relations amoureuses va les amener sur un territoire inconnu... Vidéos : bande annonce Interviews Amber Valletta Kevin James Eva Mendes Andy Tennant À propos du film Notes de production : WILL SMITH COMME JAMAIS& Will Smith est l une des plus célèbres stars de Hollywood. Héros d action réputé pour son charme et son humour, il n avait cependant encore jamais joué dans une comédie romantique. James Lassiter, producteur de HITCH et associé de Will Smith dans leur société de production, Overbrook Entertainment, explique : « Cela faisait des années que nous cherchions un bon scénario de comédie romantique pour Will. Ce n est pas aussi facile que ça en a l air. Ce genre de scénario est finalement assez rare, et les bons le sont encore plus ! » James Lassiter et Teddy Zee ont été séduits par le scénario de Kevin Bisch, qui semblait fait pour Smith. Un « conseiller en séduction », un homme cool et sûr de lui aide, contre un peu d argent, des hommes timides et qui ne brillent pas en société à gagner le cSur de n importe quelle femme. James Lassiter explique : « C est la légende urbaine parfaite : l histoire d un homme si charismatique qu il peut enseigner aux autres comment s y prendre pour séduire. « Selon la philosophie de Hitch, poursuit-il, trois jours suffisent pour mettre en lumière le « vrai vous » et conquérir la femme de vos rêves. » Teddy Zee, également producteur chez Overbrook, a lui aussi vu tout de suite le potentiel de l histoire. « Il y a à la fois quelque chose de très urbain et de très raffiné dans ce scénario ; c est contemporain, chic et très humain. Il faut aussi noter que l histoire est racontée du point de vue masculin, ce qui est extrêmement rare dans les comédies romantiques. » Le scénariste Kevin Bisch a puisé son inspiration dans ses expériences personnelles à l université. Après une suite de rendez-vous plus ou moins réussis avec différentes jeunes filles, il a réalisé qu il finissait généralement assis au bord du lit avec elles, à feuilleter longuement des albums photos& « J ai eu une révélation, confie-t-il en souriant. Comment avais-je pu être aussi bête ? Elles ne faisaient que tuer le temps en attendant que je les embrasse. Après ça, je me suis intéressé de près à la mécanique et au timing des débuts d une relation avec une femme, et aux petits détails infimes& » clucene-core-2.3.3.4/src/test/data/readme.txt000066400000000000000000000030211154025176300207020ustar00rootroot00000000000000Reuters-21578 is the data set we use to test for index compatibility. Retuers-21578-index directory contains an index created using java lucene version 1.4.3. The following changes were made to the java demo to create this index: * The FileDocument is using f.getName() instead of f.getPath() for the path field. * The modified field was removed * The indexwriter must not use compound file: writer.setUseCompoundFile(false) * The files are sorted using java.util.Arrays.sort(files, String.CASE_INSENSITIVE_ORDER); * Used a special analyser instead of StandardAnalyzer. This is because the text classification of java differs to that of clucene. See the TestReuters.cpp code for implementation. Java version used exactly the same implementation. The java equivalent analyzer is: static class ReutersTokenizer extends org.apache.lucene.analysis.CharTokenizer { // Construct a new LetterTokenizer. public ReutersTokenizer(java.io.Reader in){ super(in); } protected boolean isTokenChar(char c){ if ( c == ' ' || c == '\t' || c == '-' || c == '.' || c == '\n' || c == '\r' || c == ',' || c == '<' || c == '>' || c<=9){ return false; }else return true; } protected char normalize(char c){ return c; } } static class ReutersAnalyzer extends org.apache.lucene.analysis.Analyzer { public org.apache.lucene.analysis.TokenStream tokenStream(String fieldName, java.io.Reader reader){ return new ReutersTokenizer(reader); } }; clucene-core-2.3.3.4/src/test/data/reuters-21578-index/000077500000000000000000000000001154025176300221725ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.f0000066400000000000000000000000371154025176300230310ustar00rootroot00000000000000qpjlldalbaaaaaaaaaaaaaaaaaaaaaaclucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.f1000066400000000000000000000000371154025176300230320ustar00rootroot00000000000000|||||||||||||||||||||||||||||||clucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.fdt000066400000000000000000000011501154025176300232760ustar00rootroot00000000000000all-exchanges-strings.lc.txtall-orgs-strings.lc.txtall-people-strings.lc.txtall-places-strings.lc.txtall-topics-strings.lc.txtcat-descriptions_120396.txt"feldman-cia-worldfactbook-data.txt LEWIS.DTD README.TXT reut2-000.sgm reut2-001.sgm reut2-002.sgm reut2-003.sgm reut2-004.sgm reut2-005.sgm reut2-006.sgm reut2-007.sgm reut2-008.sgm reut2-009.sgm reut2-010.sgm reut2-011.sgm reut2-012.sgm reut2-013.sgm reut2-014.sgm reut2-015.sgm reut2-016.sgm reut2-017.sgm reut2-018.sgm reut2-019.sgm reut2-020.sgm reut2-021.sgmclucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.fdx000066400000000000000000000003701154025176300233050ustar00rootroot00000000000000 ;Xu’±×äò%6GXiz‹œ­¾Ïàñ$5FWclucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.fnm000066400000000000000000000000211154025176300232750ustar00rootroot00000000000000contentspathclucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.frq000066400000000000000000002620441154025176300233240ustar00rootroot00000000000000  -   + ( /Mƒ '1       %    N !';19 !1    )    !   9;  )9 ;    %               X      ;; ; 5'   '! 9%          + +  #   !%# P P %  57 = 1  ! 3/ 8       9  7   79  R 9     ) )    $ "  + ( !        #   )  P P  ;   P7;=   0    #    =   Z   ;  ''   9     39 N     9!         # [)       ;  ;       2   9   51    R ! 9  /+59          ' !; ;   3      87- #       #  V'-      ; * #  ;      =   =    5    5          =    ;;   /      6  *     J3   )  ;9+ ! # +  1      !-  5     '  2    5    1  3   3      1   ' +     '                  )   73         3   = )+ 3  %#+ '      3+; % 3           /1 # $%   3   9              #       9  5      ! 5 1 3        %           '       17       #%9 !  /      %          3 7 3    *       %3 + #    '  %             '     ;    #) ! 5!)        % !-     '  1      -      ;%  73      -       3 3    =   ;   ;  #   -1     !  '   7*  -&  999%;%;;;9;99;;;;%;;;;;;;;;;;%;;;%;;;; ' ;'; '    ;'!     !!! !  !!  ! !!!!!!!!!!!!!!!!!!!!!!!!!! 7777711117111171171711177111711777/ //77/// ////////////1/ ////////// //1/////////////7////// // 7////////1/////// /7///1171777771177177+++171177+ ++1+ +1+++++1+1111+++111+1++77++7+7+++ 5+7+7+75+ + ++++++ ++ ++++5++++5++555555555555------5------'''''----'5'5'''-''-5'''-5'-5-------'-''---'''5--''--'''-'''---''-'''''''''''''''''''''')))))))))))))))))))))))))))))))))))))))))))%%%%%%)%%)%%%%%%%)))%)%%)%))%%%%#%%##%%##%##%#%##%%####%%#%%%####%%%%%###%##%###%%%#%###%%%##=##===###===##==##3#3#=3=33 ====3 3 ========3 33 =3 =3==33=333 =====3 3=333=3=333=33=333 333=3=3==33 33==3 3 3=3=333333 3======55555555555555555559999999999999999999999999999999999/;9"'9>.,76812G=4/:(0Dÿ /:9!&9=.+65701G=3.9(/Dü _   “- x& '%&+" ' 8í- . . )    ¾.   /; %(1$6'1'%(%='54(/),;$113(,--&!&!9+02+00!;8 3!) /%03&0(%%,,))**= +% 1% 5<'$ <=*$-)71&&<2=)-(,()5++'4 5#6<31991;6*&0;6&25(4+<<31##4 (7=0/=#" "<11,, 5-! 0(,=) -!9'%$4" !"&4  -&"+6!&$)7%+0)1=1-(/;56!)=%;$ %33421&398'77''0%0<33""=40*%1) 1;*3<+&(;997#$' 1#'7=,)"(< 1,)%;%-'%99=;/)1)1/6<(2*%%;$;$833=)4 53!-)6#.&66(7077,6/<<(''%=31;=)$6,<)&+*3-+)(=&"4<-35+$=2!%=1.=#=<2=<(,8&&)#$ 0)""+)'''38 %4##0! '#  8=1<*=++)<,$(%*2= ()3' 1*)1)4%%*##'1%!#+=1$1<;(60#29/# '1 & "353511)7=& -'=  5 1#  )1)   ; =   ! 9  4  9 %;;+ / + !   - %%=' ' ! 5 ' = '%   / ) !*    , 1 %  3 - $   !1 %3 ! ) !  *  1  % %3 9  7 5 1   ;   )/  % ; 9 - 3    !  %  ! 7  ! +    + 9 ; #99; / ! 9=      ' % !)3+ =   #;!     !$   ;;/#;!#951= " 7+%! 397'9'+     /=  i 6-! %7#+'$'% %76/3-#17%1  '!/'  !<%-60 %58&(//5*.&8,+/!8ç/;:"'9>.,76812G>4/:)0D 3hcsSPg~U\ea_eXvedcRkw¯0;:"'9>.,76812G>4/:)0D¥ -70!&59&)006+/&8-+0! 8ù=/;:"'9>.,76812G>4/:)0D 571-5/;:"'9>.,76812G>4/:)0D =0;:"'9>.,76812G>4/:)0DŸ 0;:"'9>.,76812G>4/:)0DŸ /:9!&8=.+65701G=3.9(/D› +9/:9!&9=.+65701G=3.9(/Dš /;9"'9>-+76810(<2.:(0C¢ 0;:"'9>.,76812G>4/:)0D¡ +/;:"'9>.,76812G=4/:(0D        N" Ÿ)  +%/#2> ,-7"! #3%7÷/6       30+!     %  !  6     &     !  #          !'                   !         !             9;9;;;;2%    ,-  )      '  # '/"  )% #'3)%'999/: #'#;;;;;;;v;"(9>/-8696Í) +'+;;;;;;;;12H>51Õ/39)! ;;;;;;;;;;;;;;;< =//;;;;;;;;;; ;(';%='/ '#!!!!!!!!!!!!!!!!K3+3!!!!!!!!!!!!!!!!!>';!)-!!!!!  !!!!!!"5'#. =8/(,(#231O%%"& 2Ê/9 Œ// &+        6Lõ/ Ž //% %/    /// / /777771111711711177117111777711717777711771717111711711117117717711117777177177771711y     Ä / . /# /# !/-  /" #  .1./7///+///+71//+/////////////7/////7//7/+++///+/.//7///+//1/+++/1/1///+////////1111/11 111+1//1/1//7//7///+/+7+/7//+7+7+7++77+++++++++5++++++5+5+++++55++++5++555        Õ  % /  /  // -  //55'55'55'55'5''''''5''''5'''''5'''55''''''--5'-'''5-5''-''''---5----'1¬ Å -/   -     '5''-----'''''''''-'--'-----'-------------------------=!    ‡/ ! 5././    ))))))))))))))))===)====))====)))=)========)==============       ï  A)  - //3# /////)=)=====)==)=====+))=))==))=)=)====))))==))==== === ) )))))))%) %!! Œ  //////...//.//.+   %))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%333%##%%3·.É %  // $-%#%##%%3%3%##3##3###3#33#3#3######33#3#33#33##333####333#3#3#3#33  `k   !; =##3#333##33##3#3#33333353533353359999595Š Åó ! ; /:  -- !+7/%*7-79%  %7 9!          ô   =9E@B1AH28@9B57MA;:=-1N¦ #= !< N !        "5595595599 /#%$ „ •-///‰   zµ/`#!11'%-';!999999955959599ZN )   /'/999555999 ^ !// - +999 1<-/1  # '''39999;99;9;¡î  ' 1 /)5/)/     Æ &- 1/0  1 ŽŸ†5..5  V)55'%1  . . s!/'+' /# C)    9  ‰r ô #/.    ¨ ã+ N /7-     Ä  -  1 /=!!//!#+%1 A) &#/)!4!9/ >)()!)            Ï  I5%/=5)-) '% //=!' !) !;+ 3# #2/ % 3-A5=#  N / /54)5455F=5 555 55 5 5-//5#%5 -4/"- 1 =.//!= /.% #!    z  ¯ 5!I5 .4/--#)317,1/ ') ='-+ [   /!3 !! / 1 ! 4 ! )5!     =;;  # / 3      ˆ  ‹@/ .) 7)!/  ;3+//=/=////1/ / !+%   % N-')/'/3;)!&  &  ' #5'6 ) '&;!  D      l  ¬ 7H / 9.5/)../).//.// /.% .// / .#3 +1))//.*//./;/.//////:-///////////.///35'=/  ) %9//' / 2 )   #/!= /=-  E&)    Ñ_ _  3   3            ™ ./!  / 5);7=&= 681   1)  ./    ! *" $./:/ (6(% !   .;   #% .#  ;5 8    %3/33 .% , ## )68*-1+)4=$ 9./ 4)/   , (72& 5  * 5 3)  3 (89 /  :(&%17 *12U>4/..//./+ /#  : 3/7 ---%0 2  089)= 6 &2%9 !1#+ 1%% 3  $<0) $"3 42(. / ) .4 ;00%00"<(/ + 4 5 +  #%6  +/= 7=  % -/1## 7 61   3     !   =  d !4  ) 2   2=-);3'   1  91 5  6 3. *+  4599/ -'/  '     ‰ =, <' ;)       ' & !  =!!3   )5 )5  31!)+ ()'    /3KF/Ë7+ .8 2    $)1   #  #  2=3 80 )   ;  9'; !!  O! +7% 2 # !<1 3-3(.+ &    * '1% !'0!  1= 5 Y # !&  #78) %    %*(! 76-++; 0  <"%( 1 $//;1(&5/.' :%,;:!9>-*66710F=2-9(0@Ö    = ..0*$  " + ./ $% , < )0* /  7   !  &7 )0#'$ -70!&59&)008+/&8-+0! 8«3,3% !  - 21/  + 796(= '7 * %  6511,   6' 6 $#(% # # 6%  $ '  , < ') 559 .9   /.//   ' %%    7   +#    7!   ; 0        ò  =    ((  4;!  / 0)('! #'  '%27  5   6+/), !)  --1 1 *)= $( &''1*   j"  +1#)79 # -%   !  !+     $$'       ,!   !!0 *  57!9 118 7%#, 3   9 ! "(     !1%  #=7 =,)')   ˆ1C1$% B   2  5 9<$) (  #(#+=6,+)) # */7<"')=#1'   $ -  -  < #=. +< 7=/9&&$0;:"'9>/,76812G>4:)0D¦  5$./  /*!'$  +/ 6) 3 #6=,# 3 & /$,   <0%   *1/ !;.;+# 7&  11 /'     ##$ ,5 ##=.%/$ 41 1./;:"';>.,77812G>4/:)0DÔ 1%  ,   4$" ;'(7=   /)) . 2;07 '  1%8:,  :     s98$/ !  ' 1 < =,  )) .16!74$#/<= ;;61*  ('6<455 ' ) % #"  #  !  <=G  #% $7 #) C"    F8" <7,  ' 1*'5    66 - <  ##'115 33.1*% &  .  ! ),= %  9!451  80   #)  7$!5 -   $+ 3!  " %9 %    .()&   ! !;)7= &"  #9 =& = %#, %& #   ,33';          ü   +2)   :   ,  % !$  - !3!9=   ! s  4 3    % 8#      '  + ,!/=75  17 / ' - )& &7   39' ' + "#'  77+9 ,   ) /0=        ó )1   %4    3'  1< <79'6"  ,<; &7  ) 1 #4 3 )7< '1%#+ ' icsSPg€U]ga_eXwedcRkwÌ '  +$-- 0;:"':>/,76812I>4/:)0DÖ-70!&59&)006+/&8-+0! 8¨55    591 6# 3 ..9137#  7!9- 9  #:)* 9/2#! (   7 1-/=;*1 -./00==/ %7713%'*&#5,#%%:*#;; 7// "0$5 0=%$")/.5 !*#&/4<"<% 7-!=5   !+5/,,   *  %+ *5   7    .// c27% 9;94   /8-- #! '! 3+ !22  ! '#%'h)- #; )   =+/ 11   3 ,+1 ;#)!;001* '= +<29);+  <  !'4   ))  &    =845#' 520 +939  .  ')''  #+ & %( 55=1   # < #-   ,+ %& "$"$   ,,###' 6 96 74#. 5 $*="  #1 7/"-1"< !/)#'! 4 .' &/2) &0=- *#+.  1$ (" $='. .  *)//!3 &  )75   /;:"'9>.,76813G>4/:)0Dˆ59+&':+%+   ##) !  )#%           %" !    ' #%1   ' #  < 9) 5.  7)# #  3==)&#7&==1 9 5 '   % '==01=*1*;<= /#  5 0 ,  )=#     K% )7    ‹)   &-   + !    }  :%' 6 &4 -2 "   01$ 1  $,(10 ./   %   //* 9$/    (0=  ' +=1-1 --   ./* 0, 6,.) 3'3!//6 +;:_; ''  =9)#  ! '* 33==  6.4)- ++* 88 3 != :& 4 4 /27"9%  717=( )55    ¡  $7   [' // 9"   /% *  & ( 1/#8 - . } 17  #- - -. 9    :*3 7   1 ' '/ &     1 )  ! 11    '   @# / )%*!  9  -  *  # % #  9 `/  8$( %% /  /$& 5&7    #  -54   2 +!8=7; &6&& $.,$ 3 61) ;  D85& "%  +" 9  $ )2 3,  /9 3$ -  1 #*<$   c!=7)    %      , =)# '!-#13!1 "  /+;2  ) & &1&  "- #3+! 7 3! , 639%'#" !   Q ;# $% 1+  /" 3 !5 $   2  7&  )(  ( %0=7 <*(+   '+  -!:6110&)#% . 1 0  !  $. 3 1 . + ;3.+  3! =  , 7=5//1 1-, "( ! %!  ) 9)   4%= 3   5 (189= % .  9-     Ô =  '//30 & ++"(  '!$ " & . 7 '5;;#   ' = /  '!  547  .  :/ + 3)     k /   9C=2 - 99!  C;% 4 , 6  *  3 : 5  - 05 4 32  ''999 %&   Ÿ    »)+) )1"  1   ()-+ )$3,3!! .#4!- 3#   $<3)// 9;-- 0'=,91%   575%54-# 3 -- /2() $   2 7'  ; ' 5    !6    1 7%;           5!12! =#     Ã=    á +  ! %3      # .#     /    #:    $< +  ;7 51 )&' 32320    Œ=  1 !    & ' '  6-   #    A <          ‹3  !      U7"% 9, )./   -1/7 $ =&  0/..6:)./7  ;!   ;  1##  /#'+ ¢5    { !  }  ( *#5. +'#  1  5   % ;   %! +  '3 !83=../// @<-L5/ -3+    Ÿ*%  '   . <    $; +5)+;' =  =,  ) 9;& 1:= .9;79:2)  15: 0< ; =  % '  ) =7 ;231 &     '        '"039  12 /- 7-44= 5  L %/;,;<3("-< ) =/, .,   .53"4! $(7  *" 5 ! '=$0>4:)0E0;:"'9>/,76812G 2    .81' "''79 ) 7 /!!72/" / %&#.=-!  =(4.. 0,9%  1." ;.  = / .;, ;  -*%  -'  / 3"3 + ! <= <  '#1)  69 ;    ;)#*  #%1  4 =3   3 "&   )4 =2  ,   ./%  # "'$)*#(-! 9/& 19! '9%1#    X+   /)% 5"   :4     } +  1#3   +7   7  `    ** 3#3 5 $641   %  1: 7!7))!6*=;;"'9>/-768./7"&9. ==0/ ;* ..0 $ -59& $) 0-, /4%  '&'- <1 6=3 $.(.:  33:1%  #*%$0.-5 !8+ ! ( '';  '=5".!  "8.  a% ' 6 / <$)- ""1 3=#  0 . )"  "#'/% 137-7.  )/*(=" '  '$% !)$  9)-;9 : 0    = # 8  '8 ,- '  !/   ?2#&C=*2F1@  Œ#9/  31    !-  33$'= - 6) *+ '<     r/../5 #4"%%);/837  '0% !197; %),)  '+ '4   %4(% 0 )1    5  9!;7-' <$+ .  + 01;=  ++ * !1   Ý/ 7 #' 4 3 13-3" '' 3#   #    $)  . +  2      ;(!3'# 33#  =/   $ %'' 3! <' ##$ =  3 5- - )"1  V#5 -   2)//3# 5$+ ==2" #  9 ;' 2%"== 2€25 '                ñ3''''''''''''''''''''''''''''''''''''''''''''''''''''''))))))))))))))))))))))))))))))))))))))))))))))))))))))))+++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------///////////////////////////////////////////////////////////////////////11111111111111111111111111111111111111111111111111111111111111333333333333333333333333333333333333333333333333333355555555555555555555555555555555555555555555555777777777777777777777777777777777777777777777777777777777799999999999999999999999999999999999999999;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;====================================================================!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!############################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5-(++1#%% " $: 6.7 /-  /$ 7! 7% j #- .! 33$"1 .,(    ,33 ;  $1 0' M + %  #!   ($  )) #&+ 2    Û3  #   Ž#7(  ; 33    " ,! +   6 ;!  )+!,0;=  ! % - 6 2'/ ) $ % &  % 0 +7 '' .+#0D./*  9  f&   '' &  *1 @35' 3/' /+ 7*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!############################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''''''''''''''''''''''''''''''''''''''''''''''''''''''5555555555555555555))))))))))))))))))))))))))))))))))))))))))))))))))))))))--------------------------------------------------====================================================================;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5555555555555555555555555555+++++++++++++++++++++++++++++++++++++++++++++++++///////////////////////////////////////////////////////////////////////111111111111111111111111111111111111111111111111111111111111113333333333333333333333333333333333333333333333333333999999999999999999999999999999999999999997777777777777777777777777777777777777777777777777777777777 %K = <, #!(5%1' 99-&'    6 /;:"'9>.,76812G>4/:)0Dˆ6# 7' 7&  '/  3).(. #    </   )  '   $3;' ;5= =/  :;   / ;=; #  +  6#3% - 5'0  ':"91.(0  !  )  <&6 < /  =, 1.'0  4 283#32235&.0  %5 ! ;; h- ;;1 6 0;:"'9>.,76812G>4/:)0D/6 /!<6$8  3%618:  0/ *8)5 $-3 #' 0;:"'9>.,76812G>4/:)0D) - 1+== - 8#91 :; 8:/"&==5 !)9& $-!6 ! =6)) ):5   ',/**()% # 7&)()%   3173$2--), 94)9#.&9'%$&%%.  /= / = ( -7# / ; 0' 11581 1=  9 & 54- ' 9 +&'-- ; 0"     ) 3' & = =(7   +  =5 5   "    $))   6 ;;% %) 15 $1  -+ %  !!7) +) + 3.  ;  )   ')  ! ! / =#) !  !25%/ #% "=7 % !77-3 1 .| /  37 ) %)'1  ! 2"!     = .  - +1 )!')1)9#'  !/  )3 %     «=*1 (&/*1 7# + )-%;    %2%  !9/9    * !2 / ';0'  '##/2 9 :. ; ' $(=+) ) - -7&,. (77=7! 5%.;**7<%))9-  7 * 3 - 3%  -+=/5&% %%5!  É0;:"'9>/,76812I>4/:*0EÞ++ '= *)#==$ ,=# .   91  ‰=%"3&1  <4   <1./&  & )5 = 3 '-1 / 7+;  " 5 2 ,10   ! =*09';')  (//-!((" !96-- 3 %%9<<% -   &33 5       1+ !!# ,,)"63 )-)5$,!4-&&8„ 6  ¬  -!*5+        ¿()2# )" 5 5 %   -'=-   ! #  1;+   *& =5 !"# 01# 0#  7 =5 /) +<=31 ! '2 '   (  5*  0  %$#1 3;!2!Ú!-  ;3<3& $    77(   # = "6= #     _= $0'' +=: $,"  !  +< ;7.!%82-(  #!..<;%7  )0;:"'9>/,76812G>4:)0D¦ ;567%- /  //9  #   / 7&<*  49-) ;- + 7 # /<.; )!'89. 597 .  "(4 5(  4 +<$ 5/  $)/4 9='/ !   1.-.=4 59,- /2%! %#  % "$+, &4<;/;/ :9/ , 4 :-- ) " ' &!9+;'11 % 8##5: %"1 0"   $ 3";&% .;% =! 55 1 ;<,, 9 1      ! <+  <  0" 7! , 5 '  /1 $4 =03 )6<05   "&!-"-1- O #; `1  ==9;2=5 9. ///## 85    +2 !    ! +&&9-5; )' !;=      ñ*-(:2;6< /  1'6 2     % : 393)  &;"3 % !   /93 &$ B:#0(%4 #)3 0+    # 1)$   # !&" ' +<2   5*; 14/ /55 8 9" 8,53  & %7 3 # P7 = <==// /*   % #-   %  /' ;.*1;;  ; 14- #   0#"    # 81 "83"9 ' %3 1;%9 ';- % )&' : !=     8 32=     [ - &% ")%     9:3: $! !5++ !3;  ,( #=#-=)( : 32,11*<-% 3 $///;:"'9>.,76812G=4/;(0DÖ(%-: ='  =!/7/"+);#;8 8)!5!*5.5*34 /;9"'9>-+76810(<2/:(0CÍ       ª   3) 45/7%+ 00;:"'9>.,76812G>4/:)0DÂ:   $¾  '#)'&$",+ )Ï9 * '*&/( #8(<)   ;$$,: *#0!+' 12-- /  /5'     l  #2 <  9%; :%3) ; ;) #1  !! 7+-9-)&=!9 1,-      3,11' #   )(#:  #  + /+D->25+G:+.2786==>72à9!   1  99#  h/  71 #!- .3  !  7 / ) ;/- 1++5.. 9.;**    +/+ -(  T(%/ ;()6!1   <= /5  H%$-/10' %   )  45 ! !% #+"/.. *  2"ÿ &: $   ! . .! 9! !1 5*  $ _1 1/;:"'9>.,76812G>4/:)0DÌ*7=5.//j(''#$ % #   $'*+       :$< /)-+ 1  ! c1 1  '5)+;  //)    !! ;)  =$==   =6% "77$ 0, - 7$01  !0 1 3  7 % = = 2$1=)    ! 71 96;$ 6);% 3!   6%!' *+;&   + :;" /   )(,%  )' ®:= < $10$0 7::9  6     7<* =/8#68)) ' ( 21 %%5 31- 1!3) ;% ()#6    /!5' )#(/<!# 5#    ! = /;0! 9*1 +*"19)5     i/ !  +)  ) !1  == < )2 :   $;1 -)  8 = 42&&/! =7  )'  !   F ;*      ]"' #_9  '$      ¾! 7-" "  / %  k;     *:$ &: 2 $    !;+3  <% ;# #                                             $                                                                   # 5  Ulti¬‘bP Œrqu‹}/r\n{z_!½ /# )9     #          ™  A ;7;33;! &7!;#   ' '+  #+  '+   151)#-9!#$ 79 ;+  — :-# J1 ;   " P 9 '       -7   t::5  3+  # )7;-   $  #    %9/ !-   ;; ; -%  4'=7    991*) 9%        Ì 1 5  “  -  %+ 9  K7I)    Ž   # 5   7  % /3,-)%1#-    ­3% #)573 +15'1  8  *    &C            ß 72 9) 09  +(!=E%  1     ¯;   c3)#3) BÑ€‚qt ˆvu‡›yzqs‰Kg˜€†‘oh%õ  ,' =U9# + P! ;!3 8#   -,%4'!  u3!8' !   ! ' )) )   "%6''=9 31+  @ D5+ -.; 5!99# 9        ê   ;  %;-;;')  Q;   #$, 3' *0   # ! Ë - 5  28)    7  T% ;! -  3 #!3'= +! .-$#%#&)!÷=)- &5+  !  !(  1 -#33/! 4+ %%/  ! $     + ) 7)3;'  N=B#'# #' 5       …15=-% 561 57% 7   5+    5  ¡'% #  !'  ‘ 7 + 0 '   ''  './= `=91    #Q55'9 !-*")/# /"1#1'! ‹ = :  ) !%  |  +1  -               ó"  M. # ;   N9      #3   ,  ).//'  / 7 9  ”    '            11% $"7   %   3 +  A24   ' (  )  9'56  !     £= 1++  =$ #!'%  1 )   y13!9= --  327   ) '=%4))     K '68:*!5-,! 9  /  /* 756     =88!+ ! =!%:   3Y 6=    :-/ ;'/3! !-#&'9  m   -3        ôH   )  #<'!/(!(*!"+)0! 2!2 2 5!3  S        d#  i1#!+ 0!"           a9!)%59  + ' -+; *& #/   +/ ;     k 3 '*''  8'5  )     3#  - .!!  731  59  / +/   $5 3H6%   =   ^777 9/    )7   %%   =  -4  -39%)33%. 91/<#%+%%  +    77=  =!13=53=   ##'5I#   7,/#   1#3  2    %5'"  -!89'&!0'-- ' '" ! ! #/)+=   F#  ' '  )       ²-#/=  8 `   % ÁN+  h  +3# 3   +)  B' " =  *%)  7/  3  -  %  2##+  1!1     ' +54!   5% *# )5#  3; ;%  !   1 %  7+5;%  %! -%,#5+ /' %+ 7   #3   !  )  79#+9-+# #G  7' c !# ;%  # 9 6) ) 9'9+  =  '!77%; -;  +    ,    9 0  &51</   3)      ­!  6! % #+< #/#9 e D 99/ 1 *  7   1   7/  =   !55' 7   "" +  ! 5        *   b3) 3   + #+#%Aé$    #1  G\ #9*    b!=  /=!      ‚ '  !    '1+:--3; TQ+1 J# N+>!#*,A    =;+ -     É/ 7#9% -@  !'%RB  + %89 9-    7)     )  h7 '  :'; ! 1/+*  %5/    #7 4 1 +7#7%  5))     %97  -7/ '  #   -)    #;   1+-+!%7 !%9 !  &=;;567=# %==!=     G#93 & (9 +9-)+ 7R#%$';1%2!1!5  -94$'<==# +   )  ; 210 )-##!+2  +   #%  ;1-2) ;%       1)7;/#9%)% %9;) 55      13 & 5 ) ')'%    '       ÊC4>B++WC99H8>P/6'Ü=#. ',T3 )3  3    ‚ 5  3': 5    +$5 +7= 3   7;d #3% !;! 3$ +7  #"#' !%'1    =7   1 17  ! #"%!6 ' \ %  ]'3  n ]-     ­  %Y  /  9 +  9    n!;         V ! ;&%%+ >*!  '  # 3 7 =  +7    9 9# -++ )# %) 39 )$  =+*989!  +; +2'#&   # % ' 45       …+3m  , % =/'' 1+4-;!   ='   '' 92  !%% 1)  #)53 5=#   +  A  %/4)1<<===%   )   %! ;8  3) )!% 1%5'  =/   1 9%=%  7 )      # %; ' 3+9 c9%' -  %71- D88   %  5  !!4        ?3)! !*')'&' ""   ##-    W +    / ]         6  - 1% % 0?@#(<C6-<::63IA72@0@MÌ   /   "*  9 /  '  #&  92%  / % ;/7       1! 9- :1 7    591 5# /2 !&   .  1      g ;  %%   . '  3!  /!  @)  J'  =#%6!#7 G )    o'/)52 -9.+S-*  )      ¥  Z9        ¡<9!= 9  /% ; ;1 '  + =' 9 9       )  7 5C9<IUH&2PH/>@M?GHE7/,Ø 9   3%  ,%    ™!3!  )+   1     !/79/  +  ='  †    % ;   77  7)"37 5%5-!   '-6"!-%%41 *,³ * #      #5 '@  ) 9    ! W1@  KB' 9% 5     & $659   -& W-  9 '&'  #%; 5..!;  -;;;) # #     3 B + #- 8!    Ÿ 19  ,   X    !  #5 3 1:   2;  +5      k   " +` ! 9% #  95)=+5# 1         ³#71 # #7 !/%3  % ; 1< ! =1/ 05  &"   ”=-        !Û5    ;57   / á"   1-   +$+ +0)##  003#%.)> ==U  &';  '.!8  K l . 1  ( %+7   x'*9/   .5%   43 )   !=% '#=7%1 #    ;* #;D. 1% + 9/ 4     3'     –!   73);!%"  ))   + 01#'!*  -59=   ; !    !  =  #! ! 7!   %;  odri²vUp³resX_eRssl{—’h Ä /   *  =%1;)' `9 Pb    N*;59# )     • \  #5  1;-# %3  ! )#    !! 1;' 5:%% F'%      n -';%#9;#9;% 6 : 3%'= ) 1-  <  1+3,/# %738!!- )-3 ) 7  - -  99- ,  :9;  7#   -*%   4         ¹#   #7&+ =915 Q)#% %    u7=     %   [ 9  J9% #%, )    !#  +3 *,&"-))+0.+!%. +42.=Ø'';;5  Z@  .?)C#),%B"?4613'!.ú    */'"&#0!E71$3$!” -= %2I#15  -%  '#% 7( , # &* 5*     1-1%4 3=$- 3 -' %   / (5  =   9   -1 /  0     -1          £3;    #     ,'- 3      U%  # '5/! %! K !    !  +559 -   !3 F!3 3- J )  9- 9  =*7!     !) 8/#   ;#3%.3% 1(%   :*      +1-/        '   '    &4=  !! !/)!   ##' ;V       9!9  ;- " .  ú  /   M #, '    ) ! !;0     #3    ' 2+ ) 7   ##   Š *O     ; 531      _7'   5  - 1 %=   ;6   '  Q5 '#  % %    .ƒ! ); #9   v!+#  '$*=     %;! ) # 9   x  (%0  /')     "## #5'    t+=11   --9' 3&1'# ;9         & %=    !";;#  /* //'3C'# 5  1< +1    -)   --     !971=      /  7 # "+997-;3#/ =45   );.-ID^H8LRW3>:8:Y/N)(J¤ +1' $ 3 )'#"7/1 1//    w5 +=   ’#   “3        Ð  ,   ] <$'' # /3=)I       85 J +/9  ) . '-   3!-    9%   1 = 2  - +#    9-'      % #!=(       ™3  !)  5             ð  )5  + +  p  &  1;5A)9 '   ›  6 V  ! ''%'=  -%'   1 &    'Ä#  ]77  #;55'97 t  =  `   5.)'  %  %5# !;1*    )  #&+;  G8¿©«ŸÓÓ™˜ÇÄÀ±ÎÉ­O¯ž» Ã®~)— H     ” h "      T& s #!  =-   º +    #=  / /#%3 3.-?2)$-8,'!8,#:5!1Cç          è-# e;/1  # ) ') 1  ˆ .   3  3#      ,;          à  = -7  !  ) 97    =     Ô =  /U97! s-;6 5;!))        &g!      ½ 1;93(9 % ==  #2);;  !@G    0   /3 /   H -1;   1'/7 + %5   95 4W' % ) $!  " )  )         3: 3*/0/;@=5%=1#   0!  9(M&1d3/.8(=4)½89 / 3 -##    )' '/         */! 31' l=-7!!    )#%# -7 $ ## = : %3% ! & )&  +#5'93 !)'   /.5  '!, 7) d-%  F A1;)1   & ;*< == //+ !+79/#*7;:  9    8 6!9  D3,#79%;  '7,  3       9   Q-    $% 9 5    7 #+  1=! ';+! +   )+%&'77-7  - '' 5 3#9  7U  7 ;   03)1 3%  IF      ¡      %    13N! !  S  11)5  6;  $ %    "            u  1.   ` G &0   ß    9;W1%     '!  5! 96!538,)  !3 37 '   -1! #N#-!   ;    #'5! + ) A     18"   %"+ ( ;!'; _' 3     #; =*P) 5++   5!#" 7# /  %+-%  #  q7# # + 9 .!   .    ¿+   # < & % 1      / 5+#  !   /   9-  #       ž"   W  7  )!!1  /   ; = +7 ,  ''"% +7! ' 775 !!70+)+)#  1 ?9!D!5 =!+1 #5 &  (8=+  [ / #% "#11-  '- 5+>    *9 #7 ! ) +%1       3!    !  99'9,'5! !59#!)) '5' #/  7+  &%#   9*++7&)%9 ''*   ! )     -9 33337=3*   !  75016!;#'9!***%%7 + %)!    )! !% #    o h   199  -            #-3#$    '      J./ ! "!9 / )% ) #%   #   ;%   93+- +/%   %H    O  !-,,;;  1%)  2  !   < =#11$ /-! +%9!;  3  !   3 9#+ +19<(%'* /  /7-';=   %3 391w    = %  '/+/; " ##  9 5 x1  ='; %5   5%%!  7   17   /77- 4%#twh±{z‚‘ˆ’n…7exlw‡–o%þ!  6! ^    ·%67  !S)  ;=3' + : 1    @   +93+ '/'  : ;/-559 %+;&7  ) /     "#1+  T ; #  ! X   <)),3    3;==)    G  &   $- 3) #*D-  !9   "   9 % '  ! h# , "!L!? 5:- ');#!;       î 3 J;1:;        ÿ   ;;'=< %=3'1;       " 9 '- Z ) 3 '     ]- 1 #%85  89   +;    !  92       % 99"#h3  #.!   =9+1f  .# +)=1   :- 75/.5 5! ! ! !!;!!/3;  1 99 7'#-'+; O'%  %  `9 13#-2!8,   §#  # #) 1     -  \ ' 140   //+ %  !93 ;1  -3  !%; 1 ' ;/++:5+ -;; q9   '.  9;  55+9#  !..' !##!   8)5!E%* ! %%0  1E %N     5 #  5,% !7  /   :;/./!     77  /; !:#! ;       * Ž 99 /:: 3  3 / ;3'    3 +9 '''   # '!  +F -    %+)% = !  %! 5#5"711 ) d   !%)    !9  C !#3 :!     13 1 % $##" - #  ) 011 7==!0#/# 35     N K))/9;' 1'' /  +"' ( 1  33==39%=!3#"9' #% !%'# {!! % - 8'+-57- %V --  -- U  9;3 3$ '%  !)!95     ;== _£"8  3 ! 4 !39  4 5' =-'  ;# / + 7k;''="H';3        3       Ð9 7 'C,7"!)$$/>9/*)/«3#  §˜õû°ì€·š¸®•Ÿ˜ôÈÙðÕéè+ê=    ºO'* 113 ~' a=       Ý7     ?    $       ã L  5+ <! =%!  ²!  #    2$ # # /;     r/3  9!  1 /=+35 ]©ˆ•½ìžˆ¸¢«¥«Ä^¡¤§Á²m+‰       %    Ä;"-%+ ;  e     7  59+1  |#   +  &;    #   Õ  =  4 m ==9''  '!7 #   ! (## 9  ; ! "7% 7;:/,#;- ! '52  !--   :1 / !  25     µ%#  5        1  ¤% { % 1'5%5! - /;   µ%#  #- 5#-  + ')    $3 );'95 7  *-5 , ' 5k& #):3%* !7;);=#+ :7'<!;7/=) );;;F%  -;;+        ÿ-)#%'9%4=="5%3"   *)#-. "/%1#$'+3èR j'   % '" #=41 13R       3"    !3          7-7  5-933% // ! =#749!! ="/   '- 55' -/" ! . 330 =75G==.-/)e#) !% %/ 5- #  +  %7;%=1 *= '  ' !% # (,(""" *€!7'/  % %; #   s  ) ;+ #1'       ­  / !': ==           ð    ?+     ;'n/+          ~ !  }     ;     /-)5+ "&&'40.2 :#ï4 4 ;-!9- 4+'1;7!# 0 ' &/2-   "Ò+-  )%3755)'#       # 7 ))!0   2* 57# ' ! à 5'  -" %  '   5"-# ## Õ&-   ‰5  )9    + %7 9%  (  +   !#%')+-/13579;=clucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.prx000066400000000000000000013672161154025176300233550ustar00rootroot00000000000000˜RÚ  R¾Úò„0ž ´˜~l ‹Ò ÅR¥ê…u^y·³Ëéºèj턌ýÂÜqÚ…_›'#Èâ#§#¸WÅ…­½%P/b^µ(Ê7#ç—µ?›ü‡8¡¦œ%ê,Þ”¼R+¿£!ö#͈ µ„©¹Á 3$5ÅZcâÉ<;¡ÃŸ¬¬A°ëR€1¯ÛpŒõI¡RiU'GŽ…)Ö¨ÆÇÞ :~ád§‘=Ó•);໩¸õÔXeÀAe"ØÈ.ï+¦ ² áÏÙ 1ä­æá¯ëöYˆ ×>³ øÝ /ÃdŸ¼G ¤Û¶wmö-CNôÇIsÎC±ìTœ(z­™<=4á e‰‰ämSÇð8ÑçŽø?~Vì1’» º G”ÿ†º]Þ;¸$–Eæ–¸Ð5Û ïn1@ï—‹ìDF”^³D( – ÛçÏâœù¯#šè­™× OKŽ +´[$y ¶ ‰OKÛÄV#q‹;‡cF’ ¨ "#œ£ ;4Žü0¯g¶)© "§§¨RŽ­ûÿ­°®ÿ%)¯:."7Ï÷:Y+4ó #1ø ó"Ä$õ¹NK à³K–±ö;‚ X’O'P'‹c¦õ€}Æ )±Úê~·Ø"WRá «½ „Ù¥£”P#; ÿ15m™®¥^O¨á+q¨Õ ×Þ ƒ'^å’ô%KÉB×&° º 4'4_G'Ϊ‘1f.bÉ6€—é ‰ôÐ3&Mì.cy'&_(B.+}ç'E $Ñ?±*à„òOBžUžI)\ß¶ð2 ›:eN!»ÔÚþ“—Ë*£+à(æ)É+€+…­²ÁèÍéØ×wºeÇ v)׃¸ò# "§ '«8CÉéòîé“Ù*½,žDÍ ˆKÑ$²È Î<Ï<'„‰¡ †ã¬“Žyær”uÒ¡ “‘ ¬)¿ “†èíŽ …甑 ¬)•‘ –Ž*Á­&¨G’©Ï·ê†ã«œå“Žyæ†u±Ä݆ËÍï›ÑŽ9Ö"&ᆓUFzB¢Ïj2¹‰åk–‡`u†Zh„eƒšx`f•‚vl˜²„]œz›ºILŸuLŠŸ«š”ªunk˜„rTgwRw{¥]P¢‡T˜]x…%˜'ñEç3§ÝB>Æ)°"—™†%ËHæHü›)‹­KêC­/ßF*Ÿ ˆ ë ¢âÝ Þ#¡í"¼ó.Áµ+õçÆ6$…'‹®KæJV²Ê ¿•"¬“‡ûÇ ²7Õ ‡ÅôBÚ(ûE ¼º%Ž Ÿàæ5QÛ)Œ« ˆú¡xöç¥/œ)Ò¸ÙÜ)é"ß?ûú‹ó?þ,¼Ñĺ%á€%’”€ŒÝ³€ÿâËö É=î9“•‹Ý²%>9³7Ñ‹±„¦ä]€œ é‹{䯿ÎÌåÑŒ–Ñw¢†Ë—”•‹Ý¦Œ Œ‡3Œ–Ñ‹¢ •½ö䬒ˆúÈ ´ ¶7¸,Í6ç ä¿=·7©¸Øÿ#è ä› ­¤Ï„ ¼.„(ää͉¦Ü#ÏÄ÷ ðÒŸ€ }®zŒ‡ŽSH€S­«\C:“xZ€kŒsNƒyŽJu]m*zYvuyun¬š„_–‡µ›-F©ywW°§~‹¡rvx xŒw;vy PS…„¡PO…êFxê;¾'ÿú!¦ú&&œ›øNÏæú#›È1àG´‘ó(åû!¦ã!“7ºù?ü=ˆZô-«L„Lµ¿q)Û#¼(*%6+6/5Õ(Za0¸@ëœ= î,œ=Ï æ‡é äÈ'¤Ï„ ë;”ë¨ œ¬ ž ) ™ó¸ê¯ç’Œá†s²¨ËÞ.Âê äš ®¥Î„ •¬é‹Ýăà۰꜀¯Ñæ â˾7РظâöØ Áæ§ÜEù<óœ,Í5àÞ0Å1ÖŽ±ü!‰&â@À8óÚIð=Á(éØý<‚(ÒI™  |±YSTpt×|<š’xg{–|tX„a`Œrr‹ylm”|`“š˜i‡‘“²nJ|ŠˆVv‰·uÅzpi“‰ŒeJ‚xKztS–}\yœbH³vªXU_c΃1¢“tfz˜}r[Ždb„ru‘wik”yc•Ÿ’h‰–°jKŠˆVt¦Š¯‘yÆpth’‘‚‚_OƒyNvw—wS”ƒS•gFÃIÅ9Å&‚˜ü¬é}‚ŒÝ}Òuîÿîˆ}ãÅû¸¨©}ç΂¨ðœŽ²s»é…Ë×'Ó8Æ2‹.é­3‘¢ 謑Œ}ç’ Øqìõ)§*• Ô)‰ «@›1ýFÕŒÜéщýñÁţő ‘/Òí¨@µ“9Ý$ƒ˜ö¬Ý}‚ŒÝ~Ñvêï‡}äÂè‘‚Þ£}çË‚¨•r隣¹ê‚ÍÇã/ÉÑÛ‚ŒÝ}Äñí‡}檑„å é˃§‡…îìÏ™®­þ!à ¸>ø0Î ’>¹zŠ‹ÈÞ*ÈŸÜ ˆ´»¼…$eÄ ƒ¶”ÚÚäÒž.ꇚø5´—3ÔÐLÝ0… +¢1Æò¹#žL®(µ=ñ ì„„MÔ9Ç6Ñâ ™&¡ºî8çžGÊ4ºÄ Í®ƒ˜¯;¡ ¼Ä1ý £ýªZÃÓ(† òÃ0ƒ0î,!k„ k€&ô ôô ¾ƒGŒˆ·.ýÅ þ¡ìûÊÖ Ïîü9Úê…&‡ÝÒÜÝ­þ ñ›à(µ;£°Ü°àâÁäˆËƒ¨Èx¥Ïë ¨ ‡÷¹™å]‚ŒÝ|Ð{êí‰{çÀ鑇²²¡}êΨ’s훌¯x¥‚âëˆ÷¹™å]‚ŒÝ|ˈbþï‰{çÁ葇²²¡}êΨ’à›Œ¯x¹ì‚Íš4æÖãë¥ ˆÎ¨òó ºÚŒÝ|µîëÀù‡²³Ö¨ƒïš»±óz͉²—Äé|Ðzëî‡{©ç’‡²³Ÿ}ëϸsïš‹§ºîÍ®HáŠÊ Ü„å±ó븋ï Ö€§Ë7Þ'Ì,‹žõ»—ÅŠÞ}Ïzëð…{ë¾ç“†²Ó|³‡ªrïš‹§ºï€ÌŒžõ“„ŠÞÆëð…{ë¾ç™²´Ÿ|ìΪrïš‹®yºï€ÌÝ8­žõ¼•ä^~†ŠÞ~È…fð…{ë¾ç’‡²´Ÿ|ìÆˆªqïš‹iEz¹ïÞî¥5Žžõ¼•ä^~Þ~Ì|ëð…{ë¾ç’‡²´Ÿ|ìøqïš‹®z¹ïß︭õ¼×~‡‰ÜÈ„àüæ¾€²´‡ÅŠ©ïš‹hFz¹ïßïà8¡Ò9ì(®±Õúð´ÌŠ©åÞÉy†#Á;ÍÒ&µ™0Ò ô½“ä_…è}Ë}äö†ç½ù‰å~ëÆŠ©…áðÌìÛ=Ú ·°Åì“ääŠÛ³ïb®’‰²³›ëиáÑ|¨Íí$æ°"•@±qTì“ä`„ŠwäÊêï‡ç£’‰²³›cˆÐ©á™´¹îÝð–ÉãÛ®‚ ƒåÖ©ð™¨×Û‰ª±Š ©Á{õ ð*‘}¦²Ô}‰‰våÊ€é÷ø‡ybŒ£’‹±µ˜€ëÒ©â™ñH{¸ð~Ýòö Ä4ó(Þ-þ :² º §.§–…ÿ-¦î+½zžŠ=Á{ŸTUc^ŠÊ~2«‰yfz•‚o\Š„bbƒsu“zhg•„uh“¢Žgˆ˜´dK‚ІX{£…³Ž‚ºuth“„€[T„yOtr¢oT“…P‘lHÆ}¢XLoP™Æt7²‡ugs™…mZ‘†Wi€o{’zi`˜†ve˜§‰až“´^KŠ…ˆV¢•Ÿ”ˆ´rtj—TX…zUr{›hS™…L‘nC·4Ý.ÍHäË)óCºƒÅOÛ”ºÔ‚—XHsKŸÇo6µƒvkt˜†ib‰‡Yh|q|–zg]˜‰sj—ªˆb™€“¹XK€S‚Ÿ–¡‘¨uth•”}P]†yVpw¦`TšˆFqCµ+˜(±FýDÊ¿\\„².±<œJÑ"ä½ê"²”8߀ Ž‹5°Æ)Ùóà3… Ä °Ž‘ñÀ韣0»âòÛ,¤ðà:ôƒòEï5ÌI âÍ4¢ç­† ´©¼ƒj¨ÏåTÙÚ2¬ ú½4¨M¯Ð(ÌóÖñãw¸§ ­‡é‚³´¤Qê³Ó€á²ù†‡ Ö­º±ç }ÈdÇÕ•Ï•-– »+ïI«+á)ã@§ å)çãÛɆæí™è‡†æí™’}¦´Ò}‰ŠÛ~Ìçï‡ybŒ£’¼·–ëûoõ˸ð~Ïö(Z‘ˆ›OC‹4£³fB*„_~sŽvOƒu“IhŒe|Ž[frŽƒvi¬ „Yž…˜¿1=¸h…Tt¨°ƒˆ—¥to|†ƒ{?p†XO„|§TN‹JSƒ—Ï ø*ƒÑ ¬@ª(Ü Ì5£1Â'ðµ H‡«º)aûŽ9½ï+“$êŠMë×äìí.ç)Ã!Ò!õ–¤1£1ö³ £}Œ‡SFVªªÙ“x\~‚ŒŒNƒzJv‘Z—‘Xtuyvm¬œ„`“‡µIC©yyo~®§~Œ¡ryu {‹u;w›NR…„¢Qi‡èFxõ0×Ä ýVµ<•å¨Eè)Ü(Za0—÷÷Jüû.‰å!è@œß7ø ääš%¿þ “£ÃÃ}“Û~Ƀçöú†ybŒ£’°¶–¼·oõ˨~Ñò-Á#šÜ7À ‚›Þ7ü Á ôŽÀ­“8‰ ª ¢ŸFc•†”OEˆ;‹²bEš|^}„xO€wJlŽby‡YrmŒ€vp£¡„_Ÿ©­1@³oUxª­~Œ“§rq{”ƒ„z>t‚UN†‚¢SQŠŒL¤K€¥ˆGé)– æ ðMþ%»ãö è ¡¥Øò ¯ Ø·€Nùùš · ê‰Ñ?ý ç ÿ!©$èA¯Â'Š4â)×·4ìÜ+¦·ƒ ¸ìÉÐÛÊçë´æã• d‘—¹…›ðÿˆì‡éƨ~Ñç> ‘¹Õ$Û …ç×9å”}©£ ÞŠã§ûíµˆô éî ~Ì;Ô †í²æã§—µ èŸæâù “•λ…E“"Ú-× ì »8$ïÑ.ú ÀGÏBõ1ÄFôîÕ’ìLÏÚ•í³­¹¿ÂÚ“ƒ’ép†æª!ìC]Zˆ˜,­0¹›µ(ü -ºäºŠÛð"Ã'((¶Ü,­#@& èwŒ‡TH€Q¯«\}“xYjŒŒNƒyŽJu_—Œ[vuyun¬™„^˜‡µšGH©yvV±§~Š‘¡ruy wŒx;v–RT…„ Pl„Œ_Fxš%Õ(Æ(Xa2É@üÇÀD|Ôâ,ÝïM¥ ¥FÓ@ë(¾&œyÆà·Í´ †3­ ­¾Ð*¢¶™FÆ©Ú(ó¿œ¥Ä Ô/úÆ $úå£ÄEÇ $úÃ<å+¯Aü:ƒ(ü0ôÎÛ°Ï+Ò3ç!ÓÍ£ ‡€ÚˆàÁ!ô-¶ Ž*†6· ¬3Ð2<áGÁ8ä@Û¹#Ï› ½ ½’ ¸ýèÚÖ‰ ªà ê±Qv‚ ß# ´/ØÎå©Aæ&ðFŠ¢&Å'î²Å»ÊF»@Ô˜ŒLøô¹ ñ8ä*ï ¦Êä^ì)§˜ ‚)¤(јØý˜Fœ)8›HÎ>ÐØÊ©›ÄχÇÚÊ1(¹ ˜ËÏÛÌ”îýã&ƒ ²5ˆ ªÜö0¥¾Ë‚üÙA˜â-ŒK‚Z7/õœüJ˜æ$ý…× žÊη é ³ª³ûBœ ­è Ô›£Í dÞÃ$¨º0‰IÓ2­½=ƒ,“$ê†œá “+Î ô!Û¾-Í9ž2Ûœ@íèÇ 0úé'÷#ˆ¹²»›J¬'ê Þ3}Þ¸Å0¯• mô™'#˜>ô™ Ë.Ö%^â^«'ŸÇŸ þÕ)úèJ¬KÐ µ ë.`·*¤4°Ð¹"¡“ˆôØ »¨‹Ï‰†ØÓ Ãàýíå ê"“õˆŒÀ„ׯ*œ•}ª„èɉΎˆa}‹ˆsL›€Ç‡voƒñg•ƒzb’“æ’ÍžŒ´‘±†oe”‚’…gI}ºmˆü|Ú’d©*÷‘Â Š ö½µîêÖ× –}­‚ç̆Ζa}‹ˆ¿›€Ç‡võîg•ƒzb’¢í”ެº’…ÉžŒ´‘pÁˆme”†Ž…gI}ºmˆü|Ú’dÝÃÀDÚ ôç=²¼"ð)—}­‚ç̆·a}‹ˆtK›€Îvo†Õ•ƒzb¢¡Ž¬º’…ÉžŒ´‘pÁõf“†“gI¦†Òö×/éê8ÚË õ–Ý ÂµÕ‰ìÛº ´ ©…欘}®´…Ð⋈tM™È†vo‡éƒì”Ÿî“Ž­º‘…ÉžŒÅpÃ…nf“†„¯¹p…ü{Û’cŠÖCp…ÇùåíˆÛ©p…Çé7”îêÜ Íß íÚ%ÅÅú懋 µ´Ô#Ï’ ‡íƒ Î ûÕÅÍú"ñäÎEÉDüÐ ÅÓí’ À Åð”M—Ê)ïĺÓòƤ ƒ˜¬°¶õûûÞdÿÓ·¿¬°º Ý Ž™}¯€»~Õ~c€tS”Ȇvr‡èk“ƒ{`’™ší“’´±…猵sÆnf“Š‹„fI€½rŽí{Û–dÀ‡!Ö’¢ÌõÔÙëôãùÅ Âᴰ𬆻8ùB˹úÚ±ÛþꑞrîÝÚðI×Õ!®.ýÿ*¼ŸaŸ,°äãš ½Ä!6—í?¨›®£)†Å®£ •Æ€åÖãðÈ“€ÍèˆÕ™ší“’åÞžÀŒ“•ðí{ÕÒáFÓ$ì Øš}°»Ò‘Ý”ÚÍñÐ•ÜØøËÞrÇÓ¨²¯ç×;Ô˜¯ä×|Ö‘ß~’tV’Íçˆèj•ûa’™ší““²´Œ†ËÁ¹}pf”‰‹±¼së|ðdâ ” üæ—¯ ™¯»|Ö‘ß‘~tV”ÌðÑ•û󚆓“²´’˨¶sÆç‰‹îsë|ðdé1­»Ò‘ñÇ”¼Ñ•û`“˜›“²´’èÁƒ˜•‰¼°ë|Ô»5¢š“ÔÆ}’tçµð€ î—Ò¨ûpæJ–é ¸¡ í¢ØÞ#ž­€»ÔÛÍïæû`“³“²´’èÁ‹•‰¼«|Ô´9ŽÎØ+]šK‡ ÇßE¢ âð †ÂÚ–´¸>Û ñ&˜9¢ Ÿ Þ{^ç‘Äî¸#ç‚%·ñE𤼺‹ ŽðÐ Åÿ° – °$ 1:ת&Š,þ3§Dù#ò ™ Ö?G‰-ÿ5ûí ”(¬1È ž3ÑCƒ ”6Á(ê” ÛcÙ3ËEω1À ¨KØ ’¸¡ œÑÆÜ èâE£™ ŠŸ¤ªÙ«)½Ù÷!Õ þ+š6¨(Ú;ê ðL ç;À Â0ù£ ÓõõŒÎ¥Æ©F ” Û3Ñß Ü äéåô «‘Ç#Ìú?Ð1”1Õý0ܳÝô­=îüÄÔ‡Ù Ñ@ºI™‘ —eš)Ð/ýð*€7ú+Ç<—€5Á¤'”Œúøè¢2¦F†÷,º.¨ó–⛞Ÿ¬ Êêº'’„Nñ”kü¡Šãê Ç$åAâ¨Ð £M°XÅ÷×譧щ ¯å9ñÛ Äû ™„–ø• ˆ¶ þ¦2¥3Þj“ ¬Ä˜kaä³õͿԡ'¢(«/ÑL‡0‘å¦áŠé6’ ¬—§Ô¦Ü2ú˜Ù=ðŸš"ëø¿ÛÎÓ—Î “!Œ:ßî %Œ¡ÃÝ´¶½^³§¬ÐA¯Ü3µFí2ÃJÅ4Œè± ¸º ©1àûÃöpR÷_itÑÅŒ*â‚ÛÈU#¤uˆ…¬ža#ø û‰ù€“t«þïç²/Þœ ¥(ÒFØíhÛ뀵€ ß‹D†56â2”5Ë%ž §%÷§¢ õ¶Ð*Æä²á©ùÿ-.hv¦ ¡ð Y˜Œ»»O3Ò ˜à°¹!ì3‰£ Œ¤GÐ:’éÉÃ-îÄ ²›Hó‹ ½†:šÑª˜,Õ?èÏ¡EÄ”çß‹¶4ÀîŽÿþ  ‡ú Ù&ðßÌôäßÓì¯ï Ÿôë…¾¤Õ”¯– Öc˜«€ë’‰ƒÔ¥Ú ³Â¸þ§EÈKÅ+ê›+i–®Á½®Î Œ []™u‰‚ƒ…  ¹µ µ¹„ȤßÒ/׬)‡ þ –7·;î×~°’ö•¸ƒ úÂþá)Žå ¨ï¢ú¤%›ÔŠ ’ Ý²Ý 9:ÏôGåK–<ò»þ é¤ãuíÊ ü£ Ú¡ ÎfÁ ––ƒ­‰þš±8ùÅï’1¬K¨'ãúþ/¥Ö2¬A÷„$ƒÖ+€#ô²Æ@‡  ßõ¡ £Ýº3-­,×Ä’à!ËGEòMÉ@³5ˆ Õ/¸…0”7¸3”¦5ˆ š!®Yñ:èÚ«/ „þç4·ð$×àòÙ!Þ‘¢°åúš…™Ú a¡rÃÎŒñ®‘še†Ã… ±Á•¤ ¶µÝù«/õó!ÈöDÈ'„;Þ£œÜïâºÄ‡i‡m‹©…Æ¡G8‹|³z”Ž~á©ÅÔÑJ´·… تî㸉õ‡ƒ=°¼ÿ ~ò»åxÞÌ×cßÓÔû¨ Ÿ­Ç-˜:è ‡Š³º2ËKÜ@ðþ‹äø¢ Ý «í ú•Ü@ãCÛøú €•)¥Kôò7™ ÷'«  ä)ÃÌ¢Ïö ÔÀ ±B&ׯ, áÀþ¤9Á*Ô’á„!ã!“!Þ¡#ÙÜ!ãAHüŽ(¯Àíî Í„ÿþ %Úÿ?#È­¢›÷)à ’8ô›£!ºáÁé9þÎ%õ 4‘6ñÓ'Å%5›„%˜3ü¢ËÍ>ĤßóÞ@©ßôá@Ø ûA’7€7 DëKɹš!nÒ4åã Nò#œz«£µ·/õ ŠÆŠ7Þ±C­ ×!—% ѱÿ~øÙ†&Ì8͘ޜo“åBZ©øÌKQº ïÏÅl<·„Ö·õ?A@ ‚â ¼ ß¡ì&Î>… ‹ãFÀò/ì&ð8¾!·!ž.ñÞÌ$ÃÓFå¹ü ˆ­µA÷;þ—ܔЮuÜãÊ´ÇÓë¦-Ôá“§ 9ŽŸ3»ú)Ú ÑÏ(žÁM¸´ 赬'ۈΧ Ù¤ ü8é¥+ߣ(Û†q†M Û½H¬úˆ6ºªÁ™â­ƒòuëÐá4îð»„]9Õ‚Õ/œJÌ(¾ œ>ÑMþŽ°Û˜(äýžÜo‹°©Cë´ Ê™Ï˜ÅŒ Ý¿*Ü­&è Œ þþÈä±ÈJö5ÿÕß0… ¿Bþøê9ç3¬†A#ž*ʼº;ºÉ=ŸÙö !öÓ©ÍÄ3Š –8“#¨C’3—,®(Ù¯–ØG³¢ Ö®>¹!ã€..²#öµš¹¥Ðá!ãÉÖ»{µ¢ÎnûgɰðâN ±ÙN~‚ê¾#µ ÖÚ† ƒœ° ¿ ýÀΉ Å…§ZÁÖü´ ï ‰ù?»3ÚÐõ6ùز+팊œ<†1<ÌÙÉ ˆˆ/Ž‹êº(Æ,³ù › ñÜ ð@Å£ ò¢ù µ» ̧ڟ öøÜž Ú¬ í:Ê$r:ï æ ©£ ¡%¸+°.¾ Ó ½?ßK È ÌÂ,öFû íºAÙA”ÿ4´8ž Èòéß !¹“ô 垪2Ѐ7‡2ˆE–AŒ ‘¥¨Ú÷Ѫî íõNÇK«ó øéFá!¯ãLÎ-‿Ì*!›»?»Jø¬qù}žú°Ïß&µ’ ò•? 'ü"§ ¦%  ¸ûƒ â ýIí.†½G„Ê.‚ÉÓ‰÷ö‹¶®±4íÑëÉ3û Óè«8ÚDØžŽ:˜ºFüß „Gþã+ä’-» Ïà2©© œ è € Ý·ó ‡ Ö?¡(’­ Ï ä£› GÖ£« ³ ã±^¢.êî ¸îÀÇ ¨ ‘ † öÈ ¡)ƒþ©1É2‘ zø  À ÕÏF¹5¸Œ0ô»-Þ ‘¸Û·ó‰ ¶¨¹© Ÿƒïš Á ‹Øò¨ ì¡üÚ· ³çlÚ3Õ¬µàjÖ;£-Ó0Œ!“ò › Ýî#µ@Ø*š“ Ù—•ú#£Ñ ¹ ¼v÷{Ÿè—€…"[ô«ÑgФ–ˆ¯ák°¬~¿¢Íþ ãÏúËJ¡ƒ ò-£øØã7ÓDõ/ˆC§F°ôçÛÿî©?ÏŸ?€æ*LäÄ÷®ôê7ÅBÛþíÕ{ñ ¿¨AÅGE˜„â̓盟 µ mªþ Öbö ­”¢.¤&ÅJ±Eî&û‘¸Ø‘Žß²4§Ñ8‹0= ýš Ñ(ž‘íõßž³ÐKÃ*«¹8é ì÷®«Äƒë ý̨ýâØ õÙ&ñ1ãK¢M¬ — à^ö ˜&ïñÅ Ÿ0º¯;†ƒ¡œ××ÊÁq𱀕6ÒHü)¦ ¼G鈔 ÷5¥­ÌÜrË»ð„õö«ì‹ƒ à$³’Hä6›ÍÈCª=¬;ð;œî×±’,¾,°#ƒB¸!ˆ €'ªÂ5âÓŸ<þŸ²‹ ‡>î)娧Ÿz¼‚J§Aö ±µHSÖá"ñ¾%„.©²Ö‘ äxƒ…Ú¹ô‡nˆÎî#ô'Ô'\OV :R“ë:,£K‹<ò=ú?±ú‚©²ñ»L¥ ƒ–à æ é â °¶¬EØôIÔë¶ŒN£­¦´ÄùØÂâÊ»!÷#’Õšéý$‹Ü%š'þ'ï±ö…*„+Ë+é,þ.»/“›Í2¸‡3Ê3Æ4Ø5ù˜6‡7Ú7ùš ÷8ì:ð;ë<ò>Â?Ã@ø!îA'”G®HÃ"­õ#·Jµ‰î ã ù%¶Kø'¼L„N¤-Ÿ2±ëÿ4¤ÜíÁŸ—›ò5¸¶6(ý6þ„89á9Áà‹;…¹?¹â±žA“¡“ Ñ ßA”!©Bí"öÇD¬$åEóÿˆ%­Fö€&ç(‹* ü+î-ó ýHð ó.Ä ˆ0Ù£2¹Èå3ÿ»5ò9Û¢;Ë<Ô=ƒLúÌÇLôè™'ÃÝ>æ ó?™Û@Âî!›Aë$ýAîBõ%‚DüDõEä&žG†„HÒšÜHäîI¯ð º Þ'¢K‡ ø(å â)ë*Õ+‹„-Ò-úô/(ÕàÌûø‡ô0…˜Ö1È2¤Ø3á½ìë7×9ô:Õ<™#É=ë$…?è&¤'¯)Á*A†,¿Bò.CÖCÑDÈ0F´1•H¾IÚJ4ôKëL³Mõ6ç7õ8»<‰?¦BéB¥D¬FÚGõJ›LµM/ö€øž û¨ Øåƒ‚šžè«ÃœÃÕÚÒ ’#«$à ‚ Í%Õ&·'¼ Ð)ß Ý*¹Ñ+·.Ê/Ô5ƒ÷6š»7°8¾ü9ó:ó;ä<$º=Æ>ÇÆ?åð@Ôë“ ‘B˹CØDÿEàЕGÙJL—„“ð!˜'é†)Ìèú¢+°0µ5Ë"‡&‰(ô*Ð6¡,•- /•0š9þ0Ø1Ã6È?ˆ:<½=í>“A×AíB¡DíAëC±EòG'õJœL÷LÉF*¾‚õƒ'‚Ù×ôË¿ 侨  ´ˆá²ˆ ðÑ ¦ » ¾µÿ˜³Žõ™ÁÕ!ÆÍœÅ›é¬ÍÌ­ÁòÛᆠÆò ï ¿ ¡ ’ ԺϤŸ©•濘Û϶€¸ÌÁËñݳ¸Ÿ!†éÏ âŠ!Ì!™"·#¶ž%Ô¦&Üÿ&Ë Á'ö(¤,ª"ü-°/‘"ö$0Õ0·1ý2ï%º3ö4â&Õ(š6ý6Í7¥9ö"¼:‚;‡<Ì<Ý$Á=Õ%ƒ>â&œ?ó'ã@¡AñA»BÓ*¶C§,¸FˆGÎHÓ(Ë)“-Š*¾.ï0˜24ñ4§.Ø1É5Â6î2Ê7Ö9ß:'•å8þ;Þ=«9™;©>@„Õ@äÇ ã;ù ÙA‡ ¦=Ï ñ ¢?ã“ÖÄ@‡ÄA«B¨C‚D’EãîFð‡„H¾I“Kñ†L±ìŸMÜDºG™ Š"»Hñ"¬Iˆ$ï$ò*ìI/‘0«J“1ïJ‰2µKâÉ3ÄM»4Ðó5´6Ë7Æ9¨:ú:Úº;¯=õ°@¸AªC¡DëE÷GçH€JÔÝKŠM‚ † ÁžÂÍÇÝãÆ­ƒ$Å ë¦Ãü• ­ Ï Å  $ºœñçü¢«ý€ ˜!¼ „"˜ ó– ê"®ŒÁöÉÆÇ¢*Œ˜É´ž Þ+ö´!Ì,Ÿ"Œ#ï#à$¼%¥'°(¹Ž)Ò*Ðͨ.—1¼2´3¸ Ý!Í4î"Û0‰6¿8õ#÷$ª9Ï:ã=Ÿ&¹'Õ(Ñ>ä?Ý)½*û*îA—HšIÉ-¸.–J§/ÐLá/Ý1 2¬6¤7Í8Ô:ç;¯=¤>µ@§AñC„EÕE÷FõI¼JöKåLÇM&ÿ„õëÞ¢Ê é ‹ ™ Мő·—øâÕçó•×Ñ Ç"Š$è$ø%Ó(ì)Õ+¢-Ñ.Þ/ø0Ý1÷2µ6Ì7ß8”:µ;$®óæ±ýå<öÞä?Þ€  Á Ð ‰ŽëAíBöCçƒE¸FÀ§¼G°H¯IñJúK£M—Ë· '¾!Î"©÷ê#â%á&ý¸ ¢'ª Ñ ƒ(º ™)£Î*šù-Ž/ŽÒÑÅ0à1ÕÖ3Ž5£6嵬ï6™È7†8ƒ9­:‚;Œ µ!é"<%³&ô?»,-­DŒ.³F«G˜IÇ/ÐJ›0•4”5ÀKÀLŽM•6¶7ëM:©;æLƒLÎJ…JÅ=ÄIÔ>Ï?òH³H‡GÚAÆCÄFßDÈE·IàB&¬Jdª«K™Bþ˜AÀ ¬@Ÿ?ä=Â<³;ø¿: é9õ8ë6ô5ý4þ3Š3‹2µ0Ù É/ƒÓà.ì-Ýó,ò+ºÖ*ß)­Ûý(¬¿‚ã'ª&%ù#ˆ#·"´÷!ïç À!Þ"ð#ʘ&Û£'±(Ò)˜Ü*È0õú1“34ʆ6Å6°7¨°8¦:¨Œ;ž<›Õ=“?¿Áî?íî@ú‹BêD½ÆEƒFGŠHõH—JÁ ‹Mš É…p!¶1Ô2Ç4·5¯6Î7™9–:Ò?æ@¬B§DëE„GäH¡LåL©MøM$®þüÍèû ¡ ‚”ѓϗýÔߦ¢!ñ!³"Ü#Ð$ô%'ú(¡*Ð/–1Ó2õ3¼5Â7&ÌäÔÞÒô¬¹ ª š Š Ü ¢ ­Þ¹¿‘ ƒœÑæçé«´÷ Í!Ä"Ï#ï$Ã%ª'¾()·+«,Ù-Ê/¯0—1ê1­2Û3Ð4î6Ý7¥9Œ:‰;€?û@®B‡C¬DöDÝFîG‹K¸L;ȉw¦‹²Œ™„ÉÄo§“~À˜£‡c™Œt效¤EDüw€rT¨¢¨ž©”ö4™Ådþ‰z¥UÔ”a޹[ŸÔ§ô±¨¤ˆþŠm{›i‰j±N¡~cq“’ëžás¼Š³MG{½†ª›wF4‰J®I“‘®¦ùÓž˜ÌkŠzµ_mkﻈ_»fˆ~F “?‘;C|“>qRœõ…{‡O‚¨¨š‰€…6¤®ŒþuG™h½¼¤ÙÌ––Œ¤­ã¨í˜’‡šÉ®¦ýˆƒ¦[2¢›ï™¦º„Én‹Ùᜓª§¼„ê­ssj[éÅ–ž°§E•³šÙš4…‰Ôåôž±¼¶¸“S]v‡FaY©Orq>CÚ½]xé£ññ‚—œÂ×¶¯ª‰†™fAar”{xªfU•´3§—oŒr£·roqQG‹²Ú…Rcš´–€‚CˆÃWwžUå—Q¦t®ñdgVA°rŸpÈg|÷ü²Z¤L摞­4ò©ÄMHJJÂJMÞ¥ðÛŠ–¢ŠÀ[­°Ñû>Œ‘ÃîÕlÜåsÅÏ›A¾‰¬œ§˜4P†·t¨iè÷õD~uPxlq«µ¤¥ˆT|¼Rý|£çœ{‹ëƒîu~0ŠÆtLIyè¢CýºƒÛYf‡^Œ³ï„šú€Ab•µ«•Âö¸–KY?}ªT‚ñ¹ˆvë¹pM1”dÕö˜¼Ý~˜HÓ²¬Á—~l¢”ˆ§šœˆ_@Ïnn;ûDuª‡”Çu’qË“P£ýG»na2Ù†qurC¨¡¢¶L©Ì§ßbjr“Œ£ÀøùÂ^ŽÝ™ì˯™d½—“´ ±€†‚‰µ…tPñ‰©3oùv`c±H¢q°C±\Ž–k?;®ðg—h‚Ÿ‚vÀs·A—üaS?ö‡òwlêp™Þ«1 Û˺žR™£uG”£xf‰Sv˜µ†‚ëë–jndqZèŒ_ÄÅ¥w™»¸k¤”n”‰©„z»-®OLB¢bBj…¥l~ObsÀgkƒnP[X5hJËv®íªde=ALžæŠYA´±Õ´bDcÄ>»¥cP×™F„EvA™É=QH{PÇ4ZX}tšXdgY¨JT•ÝœY‚‰¨…‰Œ]|‡¨SžˆoÄhæx‘aw?³”øEðHÃþ¡€f~ZÜ—ºÕs˜2?ETCß٘Ǭϋ\t®P–Á´¸ÑŸ«‹žŠì³™xû@j€ìp’¶½\€žÞ\=Žyk¢ô<³n‡Ÿti°„¹Ý¤Œú—†aç×ylc¹»pÛ´[›öpyžÊ~¼’Åýř߿DDO6•EñòËšÜý@LyJuª¡•ðV±T¬ÓŒËzsó€Ôi¬²¨èqWy‰ˆžâJçF„àr@?EEŽ1‰N„N›”¤â’=B‹Ãu¤aíû÷BsŽPzmp¨µ¤¦ˆU|»Qý¦ç‹š’k–îûùtx‹ÂxLJfú€¢Cú“µƒßY]’[ƒ°ùˆœô‰<`–´¬•’½ü¸’M[?|§U‚ð·ˆxæÂm~F“Záꥼٛ>Ú³µÃ”€k¥‘„‚§ž™‹c<Ílu8ûA‹wª‡“Èa¨rÇ—A¬ƒG·obÜ…qsvBªŸŸŽªV«Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§_†|]f«E¦eÁA°^Š˜m<@¬îj’`—‡yÀo»?™øbPFïzhëo•â­¢×Í· R—£tK©uj‰Rv“»‚„êé—kmhrYæ‹a»Î¢w¶¼h¥”qÿºƒy·­OMC bEg‡¥b‡QaqÂgi†kRW[7aPÆy«ì¯d^CBLœãYCµ®Ø´`FbÆ<¼¤dEßšF†DvA”Ì?PJt‚SÆÅ[[yv˜^bhU«GS™ÚžH”Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}>œ±€BíL¡›¦€d}]ŒÝ™µÚp™rBCPFÖÚ”¿ÂЀdp²P’´¾Îž‘¬‹‹£‹é²œzøAjvós޵Â]€œÜ^@‰|k›ø¾kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³_žïqw Ë{¾ŒÎøÆ™ä³OAE”Kó€ÿ˘ÚùGCwN|¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßDô@‚€Ý†vB>B@‹LÿF¦–¦Þ–>??Bå׈ÊçšHF¡{¦›éŸ¸É¼ ´•° â±Á–ÜŒ§ÛØH¥´OEA«èD@OD“œÂƒ¡ÝHµÿ¦÷ërHB‰›@ ·î?A¥žDÕ†AB D·Ž­„CxsQqéu˜~~¥¬¨?k¡‘BPn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†FøéC®@QE=½_Œ@ö6D¸ ‹ù °íƒé Ú ½Ì#Àù ñ—Ô­í­€Ãä"¦Á þÛ6”NE¹ò„‚ÕŒÖ&« ñ±˜Ž‰ Ð) *ÓÆ©1-ï ôÂå ´Ü'¶ ø‰À¬Ü‘ ¹Š&Ž °*ú°€·«‡¶Îµ §ÏüЕª å–¬¹<õ…¾¥ðþ0𦱙ìÎÅ ·éû “úøÜ¤ŸÄ0é ªµóÞØ ¨»¾É ¤ È(ÏŽ ÍØ é¸-¥í×l¤")ÔÕé²Ú–ž©™ í#šMžÄ>ªýÚê¡ ÊNÞ “˜Ì¡ äϘ ˜ÿñ.èÚ7Ò · ê“ÿçø£¢ Ó¡'¸¼ †åžÊÛ÷Ï© €ÔŽý¯ ÀÂ-î#–—Í áŸ ¿†#à&‘Ǹ—$ôŠyà‹ ˜„ÊÃq¹}Ø£ê™Ú­ûw€qVŒËî–„îªV}ع~\ŸÒ¨ò…Šƒj‰jŸâ‚“ìát¼Ñ{â&ŠÀøù‰Ë𞔊h­†_¨Gð’:C|’@oïõ…{‡PÑš‰†ÈúŒÓhÚ§ ¸ …˜ ›ÊÒÿ±ÆžïõÎüÕ’§©½Ž iŸ öD&Ç ôŸ£¸‘TÖ„ãbY©O႘\߇͙ˆ—¨b…z¢fˈŠÎqppRF—†ác™´™BÌVw«TçtŸeh–£ž·gòýŒÖ&›íØä¹±´C¼‡ïš&‚ §ÉôD”Çmsݤ¦ˆT}»Î‰¨òñò#ŠÅŠá€¢‰…ÙYï^± œ÷€¢Ë«•îáY>}ªUó¿x¥p#øä¼Ü–›ð—}k¥‘‡‚§›œˆ`>Îoo¶Ïw±“ȆrÊ„€ob#Û…qvs쟢ªÌ¦àajs’ððÃ^ôéüšeتµÑÿ‡‚‰µ„Åð²&Ý`cˆÄôj¨ñg¢vÀr¸A—ûb‡ûwkëpö­#¡áŒ¾¶ß‰RvÎ…í€km¯ê‹^‰¥‘¼¶k¹n›«ƒ|Ë‘Áß ¨œ÷PÆ&²òóbh€IêÝ›Žš]€ªTžˆoÆÌx‘—ò «€g}Zì–s™rcFÎܯÐç¡Q’ÂïÑžº‹Ž«ì²™z¸k܇[€œùÙ‘›˜¯ø—‡c½yâ nêžã—˹Úý ô¨¤…‡ÞÌyäÔñépXy”ºEæpA>#ŠO듦á‹ÃÆßö åНÈüÝþJÔ† ä¼ÀysTÚr›~¢’ŠÒQq¤·œbwœytilÖtwwŠtVt¢»lÈäC¬?RAIµb†Þ$ËŽ¾ § &š¤0 Ø-ÿ† ô"¬Ê’ˆ’-ñÍbq’…¦á‡Ë ”-¹¼%Å åƒ ¼ŽA³#£>ø ¬Â›ÙŽÑ(”©ŽÂõ€ÎªÚóœÁøËä'¤¹vHíÀ ÀÂƒé™ ƒ%« ˜Ú˜ˆÈ­ˆ Å © ó¹äÕÍ‹ ˘íLHJŒJ«¦ïÛ‹˜¬½\« Ç…Ûær¢ÑôÁæ¯öꪵ˜ ˆ ï ÿ € ƒÈõ” ½!ý´#ÉøšEÅc¿ËEËŸ˜­å"®8Úk–¬¼¿ †çÖ ™à½D“ôÿËõ¼¯ €ô Å„ÙûQÕNB©t¤†§²é†ê Ș*㤳JâCEO£ã‡Lö¡ÝK·þ¬úÔDçî¯å¨žâôÔõLŒå@îJ¤ ÌÔ?Ï+ùŽ—ëN´» Ç˨ãè1ñÑäKš¯àé †ð €Þýã8Áü$Ø¢¦@ˆó¼DÕÚŒw¤.áÎ~Hæ×‹Ç绺’¨˜Ôó+˜)½ Í¡¯Ò(¿Ï‹.×§%þoΡ2£,Œ:ì<ø…1…†-²Ÿ'ï º"é¾)»!°²¨*Ü*¾"¼ *½F ç™%ƒ1¦' Ç ÓGÝ„ À0â 4ç=Ç óB ì ­2Ã0öL“ ÉJâ æ …å ú$”) †:”/ âF 2 ùè&ò&øDûC ¯9 ‡9ð!ê<÷" û ä H§H) Ÿ‘$æ(ÿ“/Û"Ï4Ú% ÞÚ A & ‡ óà ˆD ™K «D‚+½%øÌC Û ¥'¥“K¯<;Ž1µ ¡,›¨•.Ï7§ö3L­³JÚ6‡ ‡Ì…? Žñ7 Í(Ê@ º² ½' Ý9 ¡ Ü/ˆ ã$ ÁG ½(‡˜(Á% ’ ŒL¹í?Ï3 íH ý%Ð:°ú&Í ¼+ È ”)Û(˜ë< /dó+ˆ…'²Š6Ä!ø<) ’; ñ´¼Bûý ‡!³áJª6²+µï&À,  ´Ü1 ‚ °²D õ&åB ù: ’Ð7   ª £0 Þ4¼>‰ Þ šG Ÿ ÐÆöÔ)Ê> ì–,ô" ã) Ì=‡,î9 Ø) ÑýǪ´÷J Ôýû “¢L ×Õ6×Bç/°CºCÈáëˆ ÃGÛBô6 Ìà*–²*  ¬, ¯& ¹:Ç$—'é›A “#Ÿ#œ'ü9°¿FŒEÚ ˜1 ¬A ¾Í? îI¥ Ø ¨'°" ò: “E ¾. €2 Õù/ þ Ì ›2Î/ ŒG ® %«ä)Ñ ¤<¯<Ê,¤ Ý3 Ý9Þ"Š ‚'—#ÚÐ À/ Û+¾ É" °?¿%…-Ø/›4 †©* †6ê=â§( Ö6±»5Ø í ìõº¯Ä¯á4ÖMçCëÍLì2ÄMJŸL ¤M + ‚ ó ‚E §1É"Mù; »M ¥& üCÓIµà;ë*´;ª,Ã:ˆ; »1 ª9 –H× Ñø €4¥ ù#Ú> ûK Ô7 þ5Ô=Ž+“#‰ ¶& Î "ž#¯ ˆ¢-± ê Ì åC¿ - ÷C øÍHIå1 ‘ $„$ˆN²Lº ô8ð6 Úú êäÂ(ê8ì Ÿ; ˜B ³GǪ9†4 Ï= ã1ù â% Ïɉ:˜Ï)ò%ÊÄ! ”Ų®<Ú"û"½'ü*²I°Ù0¼é ó@ è*¹¾' ©¦'¿?Õ6 ˆ;  Ê+ö2ÖGÇ? Ÿ2ª2èH‚ «Ïñ ¦ ßÖ … Ž †¥, Ì4 ò É% @ß ²@ ¾/Òô?þ?ú% Bî" ½I œ½5 ¨<ÉA ‰ £.ÐE’õ-ªAÒ€.çÂØ"»®: ý#¬ “4  ¡+Ý9³= ½ ¿8‹‚ ´;‡×DÑ<•4Ü„F áDœ-¼J“5 ÌHö ³7›Bô ó›.ƪ#ˆ9Â2 ÑGŸ ˆE Ü* »+ö¾ Èù ¶IŒ ü¦•:„Î3Ë=ñA©Ø4¨<Úçö%ýÑ ý)Û ËF¡ “ — Æ  * ý ¸6 Œ—£ æÒK¢å Ñ ù ‚%ƒš 9×Gþ- à/ņ,Øí…5× Ô ‘5èGÈ2'æ>Š%ј÷%»æFò<ý<È6 ø<Ä ÕH ƒ<ƒ% ÂJ ¤ ÷4 Û9 Õ. ˜ ü8 ʳ± ü$- í †%…&à1 ¥‡>»¾ú: œÜ@ ¾ Ý€ øH , ¸'$ ¾%Í Á6Ü+ ÂBŒ¼ ‡$©AÁ-½«­'šù7¢ÒÔ* ñ>£ ŸI ò- §ž ±D˜† øå"ð"óI´'šML©M ø> × º@ ’% Ëó ¥IÙ? £% 1±, Æ!†Iï+9ú? Ì5¬¨' ¸ñ>íJ¡Dá ª9 ¸!¡-º÷+ ôò¦ú5ƒ4 ö°å8 犆 Ú0Ñ<§ ­ ŠL ü# ”DÏà!ëL Ò é*ã ½ ôŒL àÊ Ë= •º.œ"´-Ñ-É Ý-Œ …í ü Ãô%š! Í4 á6Ø( ¡ ¡IžDý&»²%µ"Â÷Ù¨ŠøA¢%„¿ ‰9 Ñ, €$´ ‹$‘³Ò! ù? ¯; ÜA &æ. É è ö>Í9Ø9È Ï3 üAÎ »9›3Ú Ä8 ã ‰ ñ$ •—%ÀÀ ‘“8° „Ø)Ä;ܺ ý$ é? ü/ð© ÇB¹ð%À¯Ìë3 Ÿ"˜ÜC É!È.ßá ùê š0 €7è) ñ …#“:ýG 7, ž:Ø ã †<ß¡8Û< ÅL£:¦1¦ Ž)ù'ºF ƒ(%š%ó ç ¥8Û ³GÊ ¯C ù˜? ÌGÎ%­:§£ãÚB¶ê § Ž «&ɪ/ ½ ±F ý( û ù%Ù œH‡ îDdžè݇#Ä9ðŠ6€Dò±6 Ú+ 7)ÂFŸ°ÓE¨‰K¾H±1ã¡>½ÁÙò$Rèï¾-‡ç-Ö Œ.…Êöñ.–飅Ӹ>ÁGÛF’.³Ú-Ý„8×Â>òŽ Ûɾ.Æ.²“÷ à-9É.ªö.ïÊÿÉÖ.Þµ.Ð.ã’—½ÏÃ.²ÄÂÊ@ª¬Ó ´<µÏ î;àÕç • Í¥´˜Ù çñáÛúEúÈGœé5î ôâ™·>¢,—¸.²“ÚÀÞΦù±Á§…ö,Í ¥/€Ž Ÿ ÙªÆ Ë°7Ê­ å¢ðÝM¹¼˜ ª °®¶¯¹´*ì"õ…0’ Ž ¥   逈ÑóºÀÿ“¨ø±7Ÿ¦­ºÌÖ †C­–¾¾âñ†˜ ”½&Ÿ8ÿ9Ÿ8¿Ù+±Œÿ8ØÊ¢D ƒÂΈÂù Å„²Šß¹,õñš2”°¢AÃ&À‹†Í *º™EÍî¾<ý(ö¹„’ð:›¶Ä¡¶˜4¾ÂÑŠ ’4ÇÞ ê«ªíÅ °û†šàò ¬8¼8¬*“Ý„E€JÌ™Ú4¿þÙþŒCó2þß…¸4´À¤"¹Àœ«¶Ó¹ëû‹ ç¹¾”)ú ž±«”7»Ö ”¨ÝûŸ˜¼'Ä>Êù‰¯ ±íˆìæÇ› ÷ ì ê ‘ Ëä ú± ‚¶5ô$ƒþ¨*’£ Ž’LŸAÌ—›¡¥¬ùã#°ÎµÔŸÐË·º¾ÂÆÚÐÕÖøA á*™ìijÁ ϧK„<é-© Œ´ æáâØÔÙÐå ÿÜ ü Û+¶Ñ åÙ½á“ÈÓ£ Ý ƒßCåï ‡éíéÆòß*Ʀ ’»ßä çñ «í Ïèž“é–.¤ªò« ­<ù×7ƒäõBü Ç ˆ™(Òýì™ß"–8° ³  À õ߯‹6†º¹ØÐ/žó0† ŽÅ=˜Ž¢íõ … ‘?0—÷µ‡ðå£(¿üîç—Mý⪦ŸÂ¶>ƒÈ¯Âä†GæÉ­½¸–¨‹$éøAž)¨ êÄÌœ'À°ª›;Ô&üÊ÷¥8¡ÜÄØž ·¹÷§Ø«´³±öû¤¡¶¼ ùçó³Ì£¨« ª¬©Î É0µ ¯ûœ´ºÓ éØë⪦š Ó¸¹òÓÕ– ¶ ¼Òˆö À„¤8Ç„ ×Ï£F‚ã Å¢É ÉËÙìÇ´öˆ<¤ñ Á Ä©ÇÀ¿­àó%ÀøC«G®"€ˆ—1’Ͱ%ïõ—ÅèâÿßËÌ æ éuÈ » ¹ ÿ ǢȌ½ ¸ бÞì øk‚ÉñÆ ¸ã ‰ ôÌì “5Ç'Ž Ä¤ Á•„C¬(Ù3ðâ£.<Œ†E™Ü@Ï4¿¼C„:ý½­öG¼J´"ž“ ‡ <‘Q.÷Nð.‚¶" RøˆLê(óŠ>Ð@»ß;´´G„.ÄB“ à qü ¹$Þ:ùÿ ÁŠ‹F‰™Œ,¨-¡$’ ®K£.º. 8–õŽ<†*®&Ïú‰š ÁàýÏz®¡8Ò¼5âÁÙ+³Œõ%À 'î(ŒÕ-ôÑF•3Òê1¨B…7E“-¼MÞ ¾øÌùмˆ AÆÛ>ˆ é Ø « ÀáHJŒJ£¿¶æõLÍá¤ù¼ëÞðêó• ‹ß ?ÂˆÓ Ý ­– ¬–›3?™‰4¿°LDDÌó@Å©*±œ @?E• =B<ÔOõ ¬CEÔBGK¶ úDæþE†.å¹ Úß¼&‘@çúùû“°I¦ªB—§6û6ðI­õ­Á*„ Ϋ/‹3Œ î1ÄLˆEà ùIå&¶”@«3hÕ>‹7·º’Ñ2ˆ+Ï)ÂÌ7— —Aíé8°Dµ*ØÈC¿7ˆ-êKþ:¹²Ó µá1Ü5”Ö»±Ù ¨× Ñã`ä +¯œýß3¦?ù¾G©DëÊÊ"¤ˆî)§´0¤;‡¾Žé °áæÏ캳Û#€Àð*—‹‡3ô Ƚ®…º# º²ÊHöÔ­ˆÒʉ®¢ ú„?Õ+˜ÓŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥†w€nV‹„¦¢££¥™Ã´ŒœÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«ô|cr““ìšãu¹«”½ˆ«œ”x’õÖŽ¬­ì㙚Ñð}ޱcc§eåȆ_½d‹‚ß—Óö•¯ìò…{‡S ±“‰È£³ŽÿvÜh»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S¥žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°Ö°•›Ò—‡„Ùèô™³²Ä¸ŽT`v‡“²V©Rpt×ÀYyà¬èù‡‘’Ï׳³§‰ˆšg s’zxªfWŒº“ª•s‡p©¸nsmUË©æ†UŒf™®†ŠÃÈVz†¢Tç—ùt­ïehQîzžpÊd€òý²Z£³—¬÷¦Äìò§îÜŽ˜ ˆ½_°©Ð†Ã“ÁêØjàäuƒ¿ßžù¦££št‡ÉÃu¤aíû÷ÃsŽPzmp¨µ¤¦ˆÑ»Qý¦ç‹š’k–îûùtxŒÂxüú€¢½“µƒßY]’[ƒ°ùˆœô‰œ–´¬•’½ü¸’¨»§U‚ð·ˆxæÂm~”Záꥼٛ˜Ã‚³µÃ”€k¥‘„‚§ž™‹c‰lu³Ìwª‡“Èa¨rÇ—íƒþobÝ…qsvìŸŸŽªÍ©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§`†|]f«ëeÁñ^Š˜m¨îj’`—‡yÀo»ØøbP´ƒŒïzhëo•â­£×Í· R—£tÚ©uj‰Rv“»‚„êé—kmh±‹a»Î¢w¶¼h¥”qÿºƒy·®ÿެb‡²q’ñ©ó«ì¯ÂíãYø®Œ`椈šFÊËÌÍ‚SÆÅ\[yv˜^bhU«š™ÚžÜФ‰‰‰]}ƒªTžˆoÆ^ñxŽ`}Ú±€¯í›¦€d}]ŒÝ™µÚp™r֜ڔ¿ÂЀdp‚’´¾Îž‘¬‹‹£‹é²œzø«vós޵Ÿ€œÜ^É|k›ø¿kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³_žïqw Ë{¾ŒÎøÆ™ä³•¾€ÿ˘Úùʨ¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡Ÿß¸Â€Ý†v’ŒLÿì–¦Þ–ã׈Ê皯{¦›éŸ¸É¼ ´•° â±Á–ÝŒ§ÛØí´€èªœÂƒ¡Ýýÿ¦÷ër“›à·î¥ž™†ãûŽ­„»sQqéu˜~~¥¬¨ª¡‘’n§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†¾Ú‘¿_Œ–#€,þ­+ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢§Ÿ¨–ô$šÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¤ˆýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJ$ŠH°H‘’®§ùÓœšËk‹zŽ´`j hð½†_½dˆGž”>’:C|’@oRõ…{‡P§ªš‰†È%¤¯ŒþvH—hÀº£ÚÊ–—Ц­ã¨î—“…›Êª¨ÿ‡ƒ§Z!£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’·‘˜Ú˜$…‡ÖåôŸ°¸»¸‘T]y„œGbY©Opq?CØÀ\vé£ñ󄔜Â×¶°ª‰ˆ—gAbp•zxªfW’´!¨˜pŠs£¸qppRF‹°Ü†Rc™´–€ƒBˆÄVwŠ¡Tç”R§t®ñehRD­vžmÊg}õý²Z¤J螬$ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÅÏC¼‡®›¦š$‚M…½r§héøôDs‘Pwms¨µ¤¦ˆT}»Tú£ç‹zŠî‚ït~!ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆxé¼pN!•cÕö™¼Ü~˜GÔ˱®Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒwª‡“Èu‘rÊ‘S €F»ob!Û…qvsD¨Ÿ¢Ž¶LªÌ¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆª$múv`c²I¡r±C±[˜j?<­ñg•iƒžƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­!¡ÚʽR—£uI“£xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“ˆ«ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJ{‚PÆ$ZX|v˜[bhX¨IT–Ý›Z‚Ѝ…‰Œ]z†ªTžˆoÆdèx‘`w@±•÷GîHÄü£€g}ZÝ–¸×s™r"?FSCßٗůЉ^s®Q’´»Ñž‘©‹Ž ‹ì²™zø@kíp‘¸¾[€œß\>yk¢ô+´nŠšwh®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½”ÆûÄ™à½DDO'“Dôò˘Ýý?MwJw¨¤“òU²S¬Ô‹Ìyrò€Ôl©²ªépXy†ŽˆžÜMëEƒ„Ý‚pA>EFŽ!ŠOÿQ›“¦á=B—ö]M?ïù‰íwfæk‘ר¡Õʵ˜M’  jD sg‰Rv’·€èä’fh¯å†^»Ã rš´¶f¢n‹÷§ƒy´Ý Ô ¢çíʦ׎ ÷PÆUXwq“[bhU  FO–Ú “G~Š¢…‰‡Xz¥O™…jÁYäxŒ[·±~¹éH¡õ£€bxZŠØ–µÓn”m;CM<ÓÉŠ­¯Ð~Yk©L ¹­ µÌ™Œ©‹‰ ‹ç­™zöBkväpެ¹[€œÚ^<Šwk›ë²i…•t ]®…©Ùø’‡cÛÖy`^¶¸n×®[žílt›Æw¸‡½õ½–à²BAABô€ð˘Øõ;Dj@s¨Ÿ“òU¯ M¤Ô‹ÌtmïüÔl¤ª¥äkXtƒŠˆž¢§€úÓ}¸<‰ŠLú <’“¦Ü‘áÒÂâ“H;žo¢šé™«Æ¼ ¯€¨ àбÀÔ‰ žÙÆAŸ©GA>›éC9N?ƒ™ ·€¡ã@³ù£æÙmD>‚š;™¥ª;—¤;ÐŒ8V“E¸ŒŸÀysOlØr–yy©áhœ—;Ql¤ˆ©•brœ|todgÑztzrr…tQoŠ¢¶gÈ÷Ü>ªAPµ]´ÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒšÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšät¹«NNx½ˆ«œ”xJ<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££š…=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆZ[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³^žïqw Ë{¾ŒÎøÆ™ä³NAE“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_ŒóË}¡‰´Œž˜†ÈÄm¬¿–¨‡b™Štçš‚¬þvƒqS‹„¤¥§Ÿ«™¼ºB™Å‹h€…}£S€Õ’bŽ»€XŸÖ¦õ°¨¤†ÿ‰l|œj‰k€ {en—ëátºÅ{¾ƒ«»CÔö’’®§øÓ™¹‹w‹²aol_¸hˆÆŸÓ|Ò¿õ†z…R‚¨¨˜‹€„G¡®Œþ»œh¾º£ÚÎ’—Œ¤­ìŸìš‘‰˜Îª¥ÿ†„¥ZA¢šï¡Ÿ¹‡ÅmÝÝž“«§»…é«tŒskaãÅ—¯ë—²ŽžÙ™BƒŒÜÜô¡®½·¸“S\w‡á`]§Nvïܹ_xé¢òò…’Âß­¯«Š†—§cq–zw«fT•³B¨–ls ¹ŒvlpšŠ²Ü„Pb›´–ýLjÃVwŸTåê¦s«öae–²rŸoÉi€ðþ³Yð䓞®Cô¥îÛß¡ôÜ…•£ŠÂZ´«Ñ·Ž‘ÀðÒoÜår‘ÅÎÞ¼Šª¥˜Eψ²u©iïñ¸€tŽN|lq©¸ «Û{¹Zõ|¤å›yŒëŠæv„=ŠÉ†yèƒåý‘¸ÞYf‡]Œ¹ì…Œ™ùÂe“´­”Áø¸ß–€¬Q†ð¸Šsì³vÍ?•dÖô›·Þ€àÓÀ³«Ã–|n ”Œ}¨˜ž† Ðm©Äqª‡“ÇvsÌá¥Å¹n`@Ù…utº£ž¤‚§Ò§Übnp¤¿ùøÃ_ŽÞ–íÊ«‘™d¼—”³¢­…ƒ„ˆ‹µ‡pUð‰©Bvñvab²Ø pô°]Ž•ã²ðfšn€˜‚v¿vø–þ]”þøˆóumèr™ß¨AÛ˽œR˜¥º•¡xi†Xr˜·††æë–km®ë‰a˾¥t¹¹k£”q’Œ¥†x»;ŒÀó¹YàJ¡èÅáƒv²æ“¬žäŒš²…Éø¿ÓןÊö› yƒMÊC[V}sžTejVóR—ßðƒˆª…‰[~ЦT›ˆnÄjäx‘c´ž´˜¸¹Äü €gXŒÞ˜¹Ør•ÄšÛڛ˦ÏY£P™½·µÐ¤‹¬‹ë±šv½k~ìp’ó\œß™Žxj¤ôJ±r†Ÿvh¯…·á ù•‰]îÓwžli²»qÙ¶YõryžÉ…¶‘ÄýÅÙEÜîŽñËØ‰Æs­—ñ{X±U«ÔŒË|põ€Ôg¬µ¨ärWzŠŒˆ›®±}„â÷C„PÒ¢Ž¢æäÙ‹Ç試vŸžì¯¥Æ»¥ÇŠ£¢å²ÊMÑŽ¢õ‡¬¡‰ˆ›Â€¡¬°†€­÷Þþ‰Ú­­ðŸéÒÊŽÙ´¡¥¶~sT‚Ùrœ}¦©åpžÑMu¥‰¸ž_z{tgjÖ€v€tzŠrVtŽ¡¼lʤíÚ·bž ¡)ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢§Ÿ¨–ô"šÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¤ˆýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJ"ŠH°H‘’®§ùÓœšËk‹zŽ´`j hð½†_½dˆGž”>’:C|’@oRõ…{‡P§ªš‰†È#¤¯ŒþvH—hÀº£ÚÊ–—Ц­ã¨î—“…›Êª¨ÿ‡ƒ§Z£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’·‘˜Ú˜"…‡ÖåôŸ°¸»¸‘T]y„œGbY©Opq?CØÀ\vé£ñ󄔜Â×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qppRF‹°Ü†Rc™´–€ƒBˆÄVwŠ¡Tç”R§t®ñehRD­vžmÊg}õý²Z¤J螬"ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÅÏC¼‡®›¦š"‚M…½r§héøôDs‘Pwms¨µ¤¦ˆT}»Tú£ç‹zŠî‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆxé¼pN•cÕö™¼Ü~˜GÔ˱®Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒwª‡“Èu‘rÊ‘S €F»obÛ…qvsD¨Ÿ¢Ž¶LªÌ¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆª"múv`c²I¡r±C±[˜j?<­ñg•iƒžƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­¡ÚʽR—£uI“£xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“ˆ«ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJ{‚PÆ"ZX|v˜[bhX¨IT–Ý›Z‚Ѝ…‰Œ]z†ªTžˆoÆdèx‘`w@±•÷GîHÄü£€g}ZÝ–¸×s™r ?FSCßٗůЉ^s®Q’´»Ñž‘©‹Ž ‹ì²™zø@kíp‘¸¾[€œß\>yk¢ô)´nŠšwh®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½”ÆûÄ™à½DDO%“Dôò˘Ýý?MwJw¨¤“òU²S¬Ô‹Ìyrò€Ôl©²ªépXy†ŽˆžÜMëEƒ„Ý‚pA>EFŽŠOÿQ›“¦á=B’:C|’@oRõ…{‡P§ªš‰†È!¤¯ŒþvH—hÀºàÊ–—Ц­ã¨î—“…›Êª¨ÿ‡ƒ§Z£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’·‘˜Ú˜ …‡ÖåôŸ°¸»¸‘T]y„œGbY©Opq?CØÀ\vé£îö„”œÂ×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qpmUF‹°Ü†Rc™´–€ƒBˆÁYwŠ¡Tç”R§t®ñehRA°vžmÊg}õý²Z¤J螬 ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÅÏC¼‡®›¦š ‚M…½r§eìøôDs‘Pwms¨µ¤£‹T}»Tú£ç‹zŠî‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆuì¼pN•cÕö™¼Ü~˜GÔÈ´®Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒw§Š“Èu‘rÊ‘S €F»obÛ…qvsD¨Ÿ¢Ž¶F°Ì¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆª múv`c²I¡r±C±[˜j?<­ñg•f†žƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­¡ÚʽR— xI©xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“ˆ«ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJx…PÆ ZX|v˜[bhU«IT–ÚžZ‚Ѝ…‰Œ]z†ªTžˆoÆdèx‘`w@±•÷GîHÄü£€g}ZÝ–¸×s™r?FSCßٗůЉ^s®Qű¾Ñž‘©‹Ž ‹ì²™zø@kíp‘¸¾[€œß\>yk¢ô'´nŠštk®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½”ÆûÄ™à½DDO#“Dôò˘Ýý?MwJw¨¤“òU¯V¬Ô‹Ìyrò€Ôl©²ªépXy†ŽˆžÜMëEƒ„Ý‚pA>EFŽŠOÿQ›“¦á=BJ ›LЃFO•C¸š§{EysT}Ýr›~¢¬¢DnœŽDQq¤·œbwœytilÖtwwŠtVt¢»l€HÿåC¬?RAIµb†œA‰%ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢££¨–ôšÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¡‹ýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJŠH°H‘’®§ùÓœšËa•zŽ´`j hð½†_½a‹Gž”>’:C|’@oO õ…{‡P¤­š‰†È¤¯ŒþvH—hÀºàÊ–—Цªæ¨î—“…›Êª¨ÿ„†§V£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’´”˜Ú•…‡ÖåôŸ°µ¾¸‘T]y„œGbY©Opq?CØÀ\væ¦îö„”œÂ×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qpmUF‹ªâ†Rc™±–ƒƒBˆÁYwŠ¡Tç”R§t®ñehRA°vžmÊg}õý²Z¤G똯ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÂÒC¼‡®›¦š‚M…½r§eìøôDs‘Pwms¨µ¤£‹T}»Tú£ç‹tî‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆuì¼pN•cÕö™¼Ü~˜GÔȱ±Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒw§Š“Èr”rÊ‘P£€F»obÛ…qvsD¨Ÿ¢Ž¶F°Ì¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆªmúv`c²‰M¡nµC±[˜j?<­ñg•f†žƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­¡ÚʽR— xI©xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“‚±ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJx…PÆZX|v˜[bhU«IT–ÚžW…Ѝ…‰Œ]z†ªTžˆoÆaëx‘`w@±•÷GîHÄü£€g}ZÝ–µÚs™r?FSCÜܔȯЉ^s®Q´¾Ñž‘©‹Ž ‹ì²™zø@kyópŽ»¾[€œß\>ykŸ÷%´nŠštk®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½ÊûÄ™à½DDO!“Dôò˘Ýý?MwGz¨¤“òU¯V¬Ô‹ÌyrïƒÔl©²ªépXyƒ‘ˆžÜJîEƒ„Ý‚pA>BIŽŠOüQž“¦á=BJ ›LЃFO•C¸š§{EysT}Ýr›~¢¬¢DnœŽDQq¤·œbwœytilÖtwwŠtVt¢»l€HüèC¬?RAIµb†½ý#ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™s玣DFûw€qV‹©¢££¨–ôšÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¡‹ýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJŠH°H‘’®¤üÓœšËa•zŽ´`j híÀ†_½a‹Gž”>’:C|’@oO õ…{‡P ±š‰†È¤¯ŒþvH—hÀºàÊ–—Цªã«î—“…›Êª¨ÿ„†§V£žï–¥º€ÎlÕ䜒§©½é¯uŠviSîÇ—œ°ªD’´”˜Ö™…‡ÖåôŸ°µ¾¸‘T]y„œGbY©Opq?CØÀ\væ¦îö„‘ŸÂ×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qpmUF‹¦æ†Rc™±‰ƒB„ÅYw†¥Tç‘Rªt®ñehRA°vžmÊg}õý²Z K딳ò©ÄLHJKÁJMÞ¦ïÛ‹˜ ‰À\¯­Òý<‹’ÅìÖiÞærŽÂÒC¼‡®›¦š‚M…½r§eìøôDs‘Pwms¨µ¤£‹T}»Tú£ç‹q“î‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆ™ú€Aa–µ«•Ãö¸•LY>}ªUó·ˆuì¼pK•cÕóœ¼Ü~˜GÔȱ±Ã—}k¥‘‡‚§›œˆ`>Îoo:ü@w§Š“Èr”rÊ‘J©€F»obÛ…qvsD¨Ÿ¢Ž¶F°Ì¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆªmúv`c²‰M¡nµ@´[˜j;@­ñg•`Œš‡vÀr¸A—ûbMEòƒ‰òwkëp”â­¡ÚʽR— xI©xg‰Rv—·…íé—kmbq\ê‹^¾Ë¥wš¼¶k¥”n“ÿ´ƒ|·¬NMC¡aEh†¦hPbqÁgj…lQXZ7bOÌt®ï©cc>BLé‡YB¶®×µ`EbÆ<½¤cLÜ—F…EuA•Ì>PJx…PÆZX|v˜[bhU«IT–ÚžW…Ѝ…‰Œ]z†ªTžˆoÆaëx‘`w@±•÷GîH¦š£€g}ZÝ–µÚs™rCFOGØà”ȯЉ^s®Q´¾Ñž‘©‹Ž ‹ì²™zø@kyópŽ»¾[€œßXBŠ|k›û ·nŠštk®…ºÞ¢ø—‡cçÖy›lc»½nܳ[žòqw Ë|½ÊøÇ™à½DDLMô€ÿ˘ÝúBJwJz¨¤“òU¯V¬Ô‹ÌyrïƒÔl©²ªépXyƒ‘ˆžÜFòE€„à‚pA>BC‘ŠOüQž“¦á=??Eæ×‹ÇçšKE¦t§šéª°Æ¼£Æ€° åŠ±È˜ ׉§ó½J©¹CEO¦àCGHVˆ™Å€¡ÚN³£ýèoDK‡•HŸ¶è>G£›LЃFO•C¸š§{EysT}Ýr›~¢¬¢DnœŽDQq¤±¢bwœytilÖtwwŠtVt¢»l€HüèC¬?RAIµb†£ öÕŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒžÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšãu¹«NNx½ˆ«œ”xJ”<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¥³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S§žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—‰„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¬•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬ù¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št‰=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŽÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E–Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obß…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§b†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¥×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·°NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆÅ^[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™rDCQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›øÁkŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³_žïqw Ë{¾ŒÎøÆ™ä³NAE—Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŽLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ߌ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@D¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œ?™ºìØÔŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšãu¹«NNx½ˆ«œ”xJ“<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¤³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S¦žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—ˆ„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº“«•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬ø¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££štˆ=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E•Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÞ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§a†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¤×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¯NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆÅ][yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™rCCQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›øÀkŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³_žïqw Ë{¾ŒÎøÆ™ä³NAE–Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘LÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ÞŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@C¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œ?@̈v¨ˆ´Œ˜ˆÈÃn¥•€¿–¦ˆb™Št畈¬F:üwƒqS‹„¥¤¨žª”õ=™ÅŠiÿ…~£SÖ‘cº€Y Ö¥ö°§£ˆþ‰m|›kˆi¿Dž}cp–ìátºŒ¾N:{Àƒ«}=>ŒH¶?“‘¯§øÓ™œÓe‹y‰´ao›m_ºhˆ‡=¡•;”=@}‘@uLœõ†z†Pƒ©¦šŠƒB¡®Œþ<šhÀ¹¤ÙÏ’—‹¤®ã¨ì™‘‰˜È¯§þ‡„¥Z<¡›ï›¥¸ˆÅmÛß‘­§¹†ë«srk]èÅ–ž¯­>—²ŽžØš<„ŒÕãô ¯½´¹”S\w‡£?_\¨Ntu@<Ý·`yé¢òòƒ“žÁÚ³®¬‰‡—l:cr”{v¬eV•³<§—ms ·ulqZ@‹²Ú…Pbšµ—ýˆ>‰ÂVwVä¢I¤r®ôbfZ;²sžpÉg|öý³YªGä’Ÿ®>ô¥šIL?ÌJEß¡ôÜ…•£ŠÂZ®±Ñú=Ž‘ÀðÒoÛærÆÍ£<»Š«¥˜>‚Oˆ²u©iè÷ú>sŽO|lq©¶¡¥àz»Tû|¤å›Ž|‹ëƒíu€7ŠÉƒJ9zç„§>ý‘·‚ÞYf‡\²óƒŒšúƒ?d“´¬•Áù¶£=]:¬Q‡íº‰tëµu„J:’f×ôš·Þ›EÒÁŽ´«¼›}l£“‹§™‡d;Ðmn<€>’q«†”Çvr̘J¥‡=¹na:Ù†sty;«£ÁA§Ñ§Üamp’¤¾øùÂ_Ý—ìʬ™e»˜”³¢­ƒ…ƒ‡Œµ‡qTC=YAÜٛƬÎY£Pš½·´Ñ¢«‹‘œì¯œvÿ=j€ìp’ñ]€žÞ_:yj¥ôE±q‡žuj¯„¸ß¢Žù–ˆ^èÕzŸlc·¼pÚµYžõqyžÉ»’ÅýÅÙÈAE@›AîŽñËØCE€Fr¬Ÿ–ñ|W²U«Ô‹Ë}pô€Õg¬µ§ärW{ŠŠ‰œçGíB„áv>B@BŽ=„Q‰I›”¢æ”??B=äÙ‹Çè£F@¦u í¨ªÆ½¥Ç„©¢åвÉCÖŽ¡ñÍ?«¾EAL¡ê@ODJˆÂ€¡èD°†û­üÞ{BA‰š@­­êAEŸ£AÒ‰A>Fž@³¨7}rTÜtš~€¦©§>p”°:\=D·aŒÞΊv¨‹°‹ ˜„ÊÃq¤•}ºž£†d™m펦AFûw€qV‹©¢£ «–ôŒšÇŽcý‹x§V}Ô”a¹~\ŸÒ¨î¶ª¡‹ýŠnz›j‰j®N£|fr“ìát¼Š®NK{ºˆ«œšuJB¶E‘’«§ïàœšÎA²zŽ´`j hæÇ†_½a‹‚D›š;•:@|•=rL õ…{‡P ±–†È¤¯‹ÿyE—h¼»ãÇ™—Ц é¬ñ—“…›Êª¨ÿ€‰¨V£žï–¥ºýÑlÕ្¤¬½é¯uŠviSëÇš™°°A’´”˜Ö–…‡Óèô™³¸¾¸‘T]y„™JbY©Opt?@ØÀ\væ¦îö„‘ŸÂ×¶°ª‰ˆ—j>bp•zxªfW·¨˜pŠs£¸qpmXC…©é†Rc™±Œ‰Š?ÈYw†¥Tç”Oªt­òehU>°vžmÊg}ò€²Z J씳ò©ÄLHJKÄGJá¦ïÛ‹˜ ˆÁ[°¬Ðƒ8ÅéØjÝäu޾ա@¹Š­œ¦š…J…½r§eìø÷As‘Pwms¨µ¤£‹T}»Qý|‚£ç‹k™î‚ït{ŠÅuKJnó€¥?þ¹‚ÜYcŒ^†±òˆ™÷†>a–µ«•Ãö¸˜I\;}ªUó·ˆué¿p‚E•WáðŸ¼Ü~›DÔË®±Ã—}k¥‘‡ª›œˆc;Îor7ÿ=w§Š“Èe¡rÊ”D¬ƒC»obÛ…qsyA¨ŸŸŽ¹F¬Ð¦àajs’Œ¡¿þöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„pUðˆªjúy`c²ŒG¤e¾@´[˜m;=­ñg•]š‡vÀr»>—ûbMEòwkëp‘å­¡Úʺ R— xI©xg‰Rv—·…íé—kmeqYê‹^»Î¥wš¹¹k¢—nÿ·ƒy·¬NMC¡aEh†¦e„PbqÁgj…lQXZ7bOÉw«ì¯cc>BLãYB¶®×µ`EbÆ<½¤cIÜšF…EuA•Ì>PJu…PÆZX|v˜[bhU®FT–Ú¡G’Ч†‰Œ]z†ªTž…rÆaëx‘`z=±•úDîH¦š£€g}ZÝ–µÚs™rCCRDØàŠÒ¯Ð†as®Q´¾Ñž‘©‹Ž ‹ì²™zû=kvöpŽ»¾[€œß[?Š|k›ûºnŠštk®…ºÞ¢ø—‡cçÖy˜kg»½nܳ[žòqt£Ë|½ŒÎõÍ–àºJAIJô€ÿ˘ÝýBGzGz¨¤“òU¯V¬Ô‹ÌyrïƒÔl©²ªépXyƒ‘‡ŸßCõB€„à‚sA>B@‘ŠL‚K¡“¦á“=??Bæ×‹ÇçKB¦t¦›éª°Æ¼ ·’° åŠ±È’×Œ§ÞÕG©µJEE¬äCDKJ‘™Å€¡ÝK²ÿ¦ýèrDEŠ˜B¡·ë>A¦žFÓ†CFž@¸”ªBysTtær›~~¥©¨Am‘AQq¤®¥bwœytilÖtwwŠtVt¢»lƒEüèC¯DÚ½]xé£ññ‚—œÂ×¶¯ª‰†™eBar”{xªfU•´1§—oŒr£·roqPH‹²Ú…Rcš´–€DˆÃWwžUå–R¦t®ñdgUB°rŸpÈg|÷ü²Z£M摞­2ò©ÃMHJKÁJNÞ¥ðÛŠ–¢ŠÀ[­°Ñú?Œ‘ÃîÕlÜåsÅÏšB¾‰¬œ§˜2€Q†·t¨iè÷ôE~uPxlq«µ¤¥‡U|¼Rý|£çœ{‹ëƒîu~.ŠÆsLJyè¡DýºƒÛYf‡^Œ³ï„šúBb•µ«•Âö¸•LX@}ªT‚ñ¹ˆvë¹p€N/”dÕö˜¼Ý~—IÓ²¬Á—~l¢”ˆ§šœˆ^AÏnm<úEuª‡”Çu’qË’Q£üH»na0Ù†quqD¨¡¢µM©Ì§ßbjr“Œ£ÀøùÂ^ŽÝ™ì˯™d½—“´ ±€†‚‰µ…tPñ‰©1oùv`c±ŽI¢q¯D±\Ž–j?<®ðg—h‚Ÿ‚vÀs¶B—üaR@ö‡òwlêp™Þ«/ Û˺žR™£tH”£xf‰Sv˜µ†‚ëë–jncq[èŒ_ÄÅ¥w™»¸k¤”n”‰©„z»+­OLC¡bCi†¥l}PbrÀhj„mQZX6gJÌv®í©ed=AMžæŠXB´°Ö´aDcÄ?»¤cQ×™E…DvB™È=QI{PÇ2ZX}tšXdgY§KT•Ý›Z‚‰¨…‰Œ]|‡¨SžˆoÄhæx‘av@³”÷FïIÃþ¡€f~ZÜ—ºÕs˜/?FSDß٘Ǭϋ\s¯P–Á´¸ÑŸ«‹žŠì³™xúAj€ìp’µ¾\€žÞ[>Žyk¢ô:³n‡Ÿti°„¹Ý¤Œú—†aç×ylc¹»pÛ´[›öpyžÊ~¼’Åýř߾DDP4”FñòËšÜü@MxKuª¡•ðV±T¬ÓŒËzsó€Ôi¬²¨èqWy‰ˆžáKæG„àq@?EFŽ/‰NƒO›”¤â‘=Bøóîâ·:×Ã.ï<ˆ1ù$¦ ̸ݲʰ Á"·B¦‹$½Ž²C³öŽH” ´ðÏ‹þ:ËîöÊó9ˬ'ÈE§+òºHôóD‰¥L€!À¢2ì´ø 1à†)Õ¦Ô/ç·%Ë‘$Ö!ŽLÞ&ˆa¸îLÊå0¶2¹Û è “$޵$ø6Âî¹(†7"é.é0µ#Œ «,Å¥Ÿô*˜"¶î´ Ã,¿ ¿F1¨"ˆ5µà¤A¸0·6‚û £!®‹ö-Ò âê®Dç–#Ä›?Á5ÄH¤¿¡6¨G̸=“"Éü0¡'¯9Ô-n ü'ù%¤ú;ä’%ý,‚)Ú Ãœ…B©ìÅ4¾!Õ<¶@Ÿ$­7˜-æ)³CÖÔ/Ð>‹DÑ0¶É8³,“3ê¼MÀJ¡ý?ý€LØÁ'Ê ¶ž0¬ÃÙJ®áýŸÐ6Ãô®1ƒ$ü‡Ö€HÅBªì±ý;ÿ%£ ó.¨&«/1ᆿ@qÿÇCÒ3°ñ'ÿK ŒªDÍåº7à@¤û Ó+ûÆ3æ+þ6Þ>¨M€ˆ5Û ß1óî€$²‡÷FÇæ* ŠÁ+¥¢‡ ¹à½H#ãHØ4¾M¢ ˜ì=Ý(Ò5 ûÊ)µJöB¤IÜ¿#Šu‰ú º¾Úæ1Žæ>œ1Þ0ÅŠ4ñ¨£ôæ$¶± Ô3ž-— ¦:•2Œ×!ð ”.Æ2ã1ÿ$Ø/›Bã3õ<Ö”ãß<ÿ#ðÞ=‰—æ#ü=Ã=þ/Þ(õ)šGØ7è)    ì&ÉKø"ÕÁó(ÅGÚ)¬ ˜/Û.Êè"èô(„£À.õ:…Üó&ß3±Ý:­'Ïý:*ôCË*ñ$ª Ý.Ø•ï ð"æ%Ú%þœÞþ1½6×7Ü Ì ƒé±öä €Ø÷.Ü(‘GÛ)í=õ¢Ï›5ë%£µÂ)…ïLõ$èþ?á+ÿ4×¾4†7¿ å–ûCš0ù#§$û ‰õ7г'È!§%Ø¢&â ÚÇ€ã ë)ï¤ä!ìÎ1Å%²ÏÖ‘ ¨!Á´&Ȱ§<Õ<µå ´™$º)ƒ.ú‚ ”2Ë„á9Œ•Ê ˆ’å0½Ý=à*• ÅL÷Bô¦:ûJú". Ð­'Õ¡×%þÒ¶/’ýÕõE¬*Ò(äJŽNÌ6Ý ÿ%ðH¼;Ð4À5êÿÁFħ î@è•;Žó"«Þ¹½0üG½ÏÅ ‚ ©ÿääî)Ôå6G¿6Ú>ŒFÖ,ÛÈ ë3‡IÚ+ûä7ã1·Fª2î< J3½"ŠçÕãGœ6×"ì™ó1ÿ#ŠF Ÿþ>¥¿%àÆ6ñ#.ò ñ÷ƒ@¦ ‚ 1Í3ì­™"£” ØH•Bᥴ"œ#×Ú6¬KÛ#—5Ô7¦?°.ÔÇI¿7…+Þ¿!ÁAÔÎ ÞÑ0Ä :® $ê'áA¿Ýé1Ö7×Ã;ê©Û2ß*¨ù@ƒô ðó ê£'Ô"Š&·ÏCΗ!’2÷®ç¨Ô ª „&×JÙ=žæ?ùÑ ˜¾æEŽ9ŸØ-è>ŸMí Š ž0ºë­û4oùv`c±ŽI¢q¯D±\Ž–j?<®ðg—h‚Ÿ‚vÀs¶B—üaR@ö‡òwlêp™Þ«˜ ’XÅý ê!þ9é;½‡ ¦!…°öÕØAÙ©õì ÃL™4û –û'›Eõì&è•Æ5¤ü(Ü €Ž:Ä!ó&é Ô¬ò ÙL§ç6„)ƒxÍ@ú.ã-õ$¼&%ýØ:£"ê¢É!ôÁ À1ïî$ÌŽô¹ä“Ü.¦Á!ü.Á³¦©¨Ù œ®· ™Ñÿ(° ¶E˹0ÆLž!ðˆ.¤#ê߸ ¯,ÈIº6©–-ò¬*ë'8ÈÑ8à9Í ØŒ©áÍ è<‚3œ ÷@Ýœ-6ó1éDžG£¢'š ¹:þE³ àÆÚ ë/£ î?µ–“*ʨý¬ ¯ÑL—½•'‹HÑŠµ ÂתC1ý&¾!”$£)‰ ¹ëŠI´9ì;”M³Bâ Üý%š³±™Ñ4ÔáDËÌ&‡(Æ”(‰?ˆ€·±¯¾Â3 ŸÀÁ1í¯=Ú$šÃ?òýÃCºé!Üó(Ú–ÁØ º8¶ÍMó‘G­€Š8‘†ã0…€„L’M˜)¥ ­?Êö·îƒNú0¹”¤ ´$þ*€9·D¬-Ñ Á#ÿŒìíH߃¿×Å=ø Û£”4Ú ³+¥»¹=ÝÜ*Â÷2Ë«*¤»¬Â͘«;›)ÿJ¢ûù$ê¤ Ê<—LÑ?šî?û*ªÊþ3³BŸ1Å ‘0ÇþÞEçKô9˜–*—…A³;±ÅJß(† 1℞-Ä <•ŒE×….ì »’ øIñ»0ŽHž"áJõ>*åD˜Aó,Ôé8Å Þ+½;æ‚ñ;ù¢….á ø"Ä3€Mˆ¤ Ë'÷ š Ž2Ñ"Ñ/Ö4Ì ‰  IÊü9‡,¢0Ó°D¬KòÈ.Ö8õAí2£)âF—¥-Æ,—EØIîM6ȉw¦‹²Œ™„ÉÄo§“~À˜£‡c™Œt效£EEüw€rT¨¢¨ž©”ö–rÈ5›…Lªø.Û"°Á@é¥ 2”FñòËšÜü@MxKuª¡•ðV±T¬ÓŒËzsó€Ôi¬²¨èqWy‰ˆžáKæG„àq@?EFŽç‰<„ ñÖ" Ì.¤›<—<èBwòÀ…ÆòÚ½&/˜ÄŒcýˆy¤T~Ó“`¸~ZžÓ¦ó°§£‡ý‰lzšhˆi¯N }bp’‘êàr»‰±LGz¼…©œšuF/ˆK­J“‘®¦ùÓžzËlŠzµ_mkﻈ_»fˆ}G ’@;D|’?pSœõ…{‡O‚¨¨š‰€…É1¤®ŒþtH™h½¼¤ÙÌ––Œ¤­ã¨í˜’‡šÉ®¦ýˆƒ¦[-¢›ï™¦º„Én‹Ùᜓª ‡¼„ê­ssj[éÅ–ž°¦F•³šÙš/…‰Ôåôž±¼¶¸“S]v‡œGaY©Orp>DÚ½]xé£ññ‚—œÂ×¶¯ª‰†™eBar”{xªfU•´.§—oŒr£·roqPH‹²Ú…Rcš´–€DˆÃWwžUå–R¦t®ñdgUB°rŸpÈg|÷ü²Z£M摞­/ò©ÃMHJKÁJNÞ¥ðÛŠ–¢ŠÀ[”°Ñú?Œ‘ÃîÕlÜåsÅÏšB¾‰¬œ§˜/€Q†·t¨iè÷ôE~uPxlq«µ¤¥‡U|¼Rý|£çœ{‹ëƒîu]!+ŠÆsLJyè¡DýºƒÛYf‡^Œ³ï„šúhBb•µ«•Âö¸•LX@}ªT‚ñ¹ˆvë¹p€N,”dÕö˜¼Ý~—IÓ²¬Á—~l¢”ˆ§šœˆ^AÏnm<úEuª‡”Çu’qË’Q£üH»na-Ù†quYD¨¡¢µM©Ì§ßbjr“Œ£ÀøùÂ^ŽÝ™ì˯™d½—“´ ±€†‚‰µ…tPñ‰©- Û˺žR"w£tH”£xf‰7v˜‡®†‚ëë–jncq[èŒ_ÄÅ¥w™»¸k¤”n”‰©„]»Ý'`ôLÝ‘°é:Ž8@±„ôðº?À*ø Ç3û9µ"â=€¯"—Cݬð„ âå† é9‡ ÿ!±"û3±§é#ËÁ‹¦ðÒ$.oùv`c±ŽI¢q¯D±\Ž–j?<®ðg—h‚Ÿ‚vÀs¶B—üaR@ö‡òwlêp™Þ«, Û˺žR™£tH”£xf‰Sv˜µ†‚ëë–jncq[èŒ_ÄÅ¥w™»¸k¤”n”‰©„z»(­OLC¡bCi†¥l}PbrÀhj„mQZX6gJÌv®í©ed=AMžæŠXB´—Ö´aDcÄ?»¤cQ×™E…DvB™È=QI{PÇ/ZX}tšXdgY§KT•Ý›Z‚‰¨…‰Œ]|‡¨SžˆoÄhÌx‘av@³”÷FïIÃþ¡€f~ZÜ—ºÕs˜,?FSDß٘Ǭϋ\s¯P–Á´¸ÑŸ«‹žpì³™xúAj€ìp’µ¾\€žÞ[>Žyk¢ô7³n‡Ÿti°„¹Ý¤Œú—†aç×ylc¹»p¾´[›öpyž^l~¼’Åýř߾DDPÁ5ì ”Fßÿ+Â#ºB¤Bé;ú.¬#œ Ï'ã!ª"à#á%à'†-ý1è4Ú5¡6ã6í7ˆ9Ç9è:Ý#×;Ó0ˆK­J“‘®¦ùÓž˜ËlŠzµ_mkﻈ_»Gˆ}G ’@;D|’?pSœõ…{‡O‚¨¨š‰€jÉó(ŽI‚#­1ß á úÔ/­ñÔ  å›Ÿ/¹òù.Ì>”.ÕþØŸ?A±äËAŒB²DÐE“FòéHñïK¯L¯ä1ôà¡»à'èÌèƒ ô#髃;1”FñòËšÜü@MxKuª¡•ðV±T¬ÓŒËzsó€Ôi¬²¨èqW\‰ˆžáKæG„àq@?EFŽ,‰NƒO›”¤â‘=BB´°Ö–aDcÄ?»¤cQ×™E…DvB™È=QI{PǼ‹>†>ä3Š*³"–E„I䄌ɨØ#Ñ$×&'š)­*î+Ø.°0š1ú3çç’ê.–·Ø7›1òîH– Û;0ZX}tšXdgY§KT•Ý›Z‚‰¨…‰Œ]|‡SUSžˆoÄhæx‘av@³”÷FïIÃþ¡€f~ZÜ—ºÕs˜ÜIþòŸD´C¦7$²±%“.É"¼«)Þ6Ó7Ö8•<ô>¬Ã« ’Bæ ÕB‹D˜F¥  ¾G¢ìáJ„LžMþ˜ ÌàË!'ò(†+0ž5¹6†9Òã8ž2¤®ŒþtH™h½¼¤ÙÌ––Œ¤­ã¨í˜’‡šÉ®¦ýˆƒ¦[‚2–õ-«!À ¦-«è²¯ ý.-?FSDß٘Ǭϋ\s¯P–Á´¸ÑŸ«‹žŠ˜Ô³™xúAj€ìp’µ¾\€žÞ[>Žyk¢ôÔE«ÑHŸ"¾.£$„ ãÈ%…jÛ-â²Dë­?ØA×CÐGàJˆLÛL ªÜîÿ•Úëù¥ âÒ ¾ ¡ßçÛº† Ô¥Ü æ•’Ù  °° Á¥á±êèħÎdz˜!à#æ$Å%‚'ãµæ'àË«Ï Ô!×$á%ñ)ó*Ì&´+Ò,é.§/¼2Æ'ä(ö2³3óD\¬ ÈCð’ýÎk=Ã%«“Øü‰Ü¸” »Ýb >¸bãžÚ‰/¤¬CáØÀ÷à ¶¬–Ò¨ÉÓ©G ’2 õÿÌ ÕÚ xEŽ»Bº)/î;€MÞØXÇV&ÏËÜÊ ©™ì å²'´£Ð ÆŽ¬¼—s! E¥Æ qʉ©ƒr¨ ”˜÷  f±À%|˧í çÙAª (YDròeõâ )‹¥»ú Ý_ þ­Nºš´+´àÙš ôÓüpƒz‡ ¹³™sÅ ¡” ‚4ƒd+ŒÜýãˆ!À¾Þ#ݨԫˆ½þ aŸ‚›ÂªáM–! l påW5¸Ê—ɻبÏëIøž RJ`R1†…™  `d­ ƒoMeÉ(žÉ ~ %æ‹h€ çŠý¥b‹ ž%ä eç‰ô¾ËÂgôô±Ü}ž¯î •Ó/± » ÖÙòB'áœúì €„ Å+K ±â»\„| ”° 4*Lº7E1,5  1z8/)D5 S163^7 2E1¾@Ã5W1¾5#"085%g2=5`9©6N)1aö¥ @¦¥v’…  ç^ãIÑ<² ””\B æ ü(Yµ ÂY Aa~êŽ çJ®ÿÕ»  ¢ÒM 1p ü á¬Cö 3ûp¯à뾳ߗ¤‰dß&Ë °œ  À .A[YÖvªïæ(Ú o˜8ö~ÎA=.w  “¨|Í¢ûù ‘·” YÅëå¬Àç~ò¿Ëb§ç!,ÑÉ ð%é ‚º¿"ãZñ ƒ ¹° ó Ñ‚”Ò³œ›œÃ)å¨ (»«¸ ङåÁcå ‰ Þ¢ š¸¿“ÁÙø¡  Ѐo&]° ¦æ÷êÏ^ti~ g ô¹Í8Æ ÿ˜ôÖ,˜4ûÊ¢)ë!¾(ÓÀ&¦Ð¼ø¸ †üŽÍ<™ Æ — Ä+!ëªî #M”—NW Ð! ç  § å|ý.[. áÐ ƒç ×Ï,‚8º-é$à ôÅ…2·#ý… G±<Ú]Ì9„­+.íÈúçªñ ¥ Z[  ïÞõ Õ ¬ «*˜;Ù»ôʧ‡Kò*濪0ióÐ9ÿ û<ð„# å*™Ø‡ŽÖ­S»ô‘ï¥“Ö  Å› Iÿ†û °Ò üÏó˰ ”Z¸ á·ŠÌëi!» Ù À ¸‹s’Óbáö“qþ˜áë %-Šë¬ *Ö †ˆä« ³ñ Ý ÷ s˜ÕÅ¿œI² #tÁùÚ² ú¶¿¤ È aK‘ £¯ŽÀ…ºŒàê ðät‰ ªß‰ŸˆÊÊ ªÙ¨<Œ šÌ†µ±¦  ƒ‹ò î ë Ò)|¡Û ЬÂX º "À¹°Œþ²$¶ º=Ý—_Ŏú ÖàB„Ž ‘ p‚Í”%ÌÞÖ4׌¢ó ¢I7rºCEO¢ãBGKPˆÂ€¡ÞK²‚ƒý®úßtDFˆ˜D«®áEJŸFˆÊê„E':o§F¶š¨{B{(JS~ÝUš£z/¤BqAOs(|·›bxœyskiØ~uI7uxŠtUtŽ£»Ž1:‚F€ãE«@Q@J·a…‰˜ ÷+Ⱦ-÷. ¾Ø6àÝ¢-ñ™ ¢ ª ù…¢|ò¥×°£®á¡Øßú×ý˜—¶Ë=ÿßJ­Ò²Å^ì­ ƒ óöŽþ»ø ¨‰ ؈–ƒ8ºçœ½Ò«Æú£&,–ü¶ä¸ ÝìÀ‡µõàŒ8 ñ¿¿ý! ö¥Æ Õì–÷.¹Îœ&†,‰Åꉦë¡;É¥ ð©ÌË[mÌ Ï-‡,-¬ú‰Ò!° ¬´<þ á“…3ù ¢¬M¯¹ ³$²ÈüŸ&³øŒIÞ•7³1„ß#ñŽ*â˜?ó?¬¯öŸ>”ý¯6ý·¸Í Üõµ‰Cœ„)ÿåÎ;‚-¾ð)¶Mų à?ƒ-èþ»ˆ2˜‹%…;»²4Ç5Ë)Ô*Á+ì,6º-à/ö6¶7â8Ô:Ù;£Ô<Û>í®?Ü0áá¿1jž±2¯@à´Ì« ÏAªŒôÄ3€Gà “HÉ×7Ã9 JÝ:Á<ôµ=ŸK–¨LðMº Ž § Üî>Ÿ—û@䟦BáæôB‰ªÂCÀ²±û…†ºDµ÷E‹ÿG©ªI±ÆJ²‹!»Ä¡ÚK–"žÒL¡â$ËœMŸ½ÅØ%´ ú!Ê&¼(Ø"¿*“,É$Á%Î&Ü'ÿ,¥.Ô02¼(ê3Ú4¹)µ5«6±7Â9ö)É:“.Ä1úת ÉÔ ¾€äâÁHùqÚ£“ÎÏéºÞô".†¬ !ð lÁß)ì!‡!Ë(• <"ߤ$«!j!^"U0ó Ê?o]%³#v$=%À%C6#+¨)§å'á#$B%v(÷##b#{&^!z Ÿ']*ùÖ Ý ì…nÔ ñ Ï »'‘¡ˆ®äÞµ4Iè´ÖÙâ² Œ—Þ Ê‚±"ð £% × ÓÌðíÔ0›Ÿ$м¡‚Ó Dõ Œ‚óªB!§ Ö €Ë ²ô ´¸ Ú¶‹ Éî w¥*4õ ©Ÿç,(ÆU¤Òÿõ Ùšöìš‹é×)*"‹ÇæÚ ‹¶åeÆ”‚âóе@°&Í;ÞÓŽ—H´ñ"Ô þŽþ°¦” Ÿ*Á¹Gµ9¾’/íýÈ6éCŠA˜Â˜%‡ˆ*ú,èµë™óEÐA°º½è<º”@ö>‹¾5Õ$­-Ü!ܱ¥˜AÜ#ý. Ž­êÄ2Ð Ò’ó«W¸Í¼è;Š×Àš»œánÇ=Ó8ÉÏôõ× ”9Þ ® ©“˜‚;„Õ­Š>‡¾Ç ïµ·¯ÿ?ÚÆ¾@õðÍೠؘ· ù Þ »!Á/†‡"¥ ¤#ÁA“ ‡%”&í&î ¯'å(Í;“,² Ù ¾ê-ï<Ÿ/Š?ÿ/Ä0¦1ÿì2¨3å4‰6ì6† ±7‘9’;ó È °@‹ °A“”B‘C¼îC«:úD×F¢¿¨ðGý¥IÿJðïKñ:ö;ˆM»<úM°=‰ñ=ÁD†?ïˆÒ@žGAàAªBΟCؤHð¡FšIôFºHÝÛI˜¶™JØÛJ… ó!Å›K¬MËÝ"Õï#”˜à Ï$¶!°"Þ*¶#õ/ü0Ø$¬%“'ª(õ1µ3¤4ß56·7ó(¯9‘:á:Φ;¹•=˜@¤A£+—,“CÄ-D³/˜0€1Ñ1Ö2¿3ÜõD¹4×6àGÇ7‘9õ9ÏHõ:ç>äIä@–BÔðBÆK“DóL¼ÙDÆFí ò ÓGêJ–L+òñíáŸì·¤ù›Ê ¨ û!x Ç Ç0žµ ‘šÜØÎÚ ”‡‹Ø ☠Â$¿Üªè4蟾ŽÜêî­²Ÿ—ÆÐ 5ð  É žïµÊ–Ì óß|÷|¶ Å”í ÅÕ ²€Šì…¨ÀIÛ"ŠŸã‰”  Œ·å¤ª×ž$¹ ô€ë¬² ¤ì Î ˜ —Ó Ž'‡ ß‚ˆ« ™>ê˧ ºý5€›äý´‰Ï „ ã‚&¼¹ñè *îÆ²Ë•#§‰®‚ßINÛ+¡Äð+奰ŠN乚Lè6‰ú œ-æ9¬ÌËÕòüHõÁ:³?± «$ ÈþB¥À?¼ «$ ŸE¥ÔìJýKåþ ×-¬Ž¿;ß.$¦”õBÉ´7Æ'£"šÇGŠ=ö.Ó=ü0¡&®$—*á ¿ ëÑJ¦:×6·Ž%£Ý‡©¹¢±ÅüϲÝÇì¨ ‚ ïÚµøúè­â¥¹¹ú ¤ É!Ú"å!Ï"Þ#à$‡&¥'¾(É)±*¬*ˆç*µ-¡.Ç+Õ¸,–/Í/ŒÉ1‰2•6Œ7¬þ• ‘.¸ ¬ ö †¶8·¦žæ€ƒ å €½qžÞ Ó  “#õ„žëù ì PÏÊÏ!sÿ¼Šæ ϛ磕 #Q#R(Ÿ#« à h%z#~-…†\ #* D T `)$#1'"s"@!>"$ ¦"Š*#D"¬+o"µ+¼#Q]$Ý.!¤!ø€$~ v#T#R!f 6#/!* `"D#B#u#0#!Y*~$ÍBó·¹ ¨ä ¬œ !ÞâÄ ê¸ ˜ËþܲګQô ìß)òšðçÜ#—ñâТƒë Ã Ó «8É Ã÷8¦Ó Àãõ"Õ®°¤Ðâ ¯*¿ ð¡?ö;­È šø=ò$ê!ÅB£7—A…§ ìŽ.¾4˜*ü’‹Nö ¼$¤@É8…>…"¥8î¡<Šå œ Ê%Ã-Rº !³Œ® òA.æ?¢L§8”³8 ©9ª$¨Iš± ÁBÝ ª$ùJÙ$˜@¡ ½:Ä0Ð;˜=¯¤Ž—éù=¡@“AÚCñD±EÞFáI§JßßKò­ÎL¯³† !°Mˆ"õ"Ý#Î$§%Ž'™(ú(µ*ƒ1¥2œ3¹4ï5«8“9¸:Ì=½>Ê?ÉAƒH†IÿI¶LŽ'êä’'Š ®× Ü«§ ムۃ é æ«©Î—&ª ¹ œßì½õÎ ¸5Í¡ý Ì ‹ Ó´ ÷ œÁÀŽ µ ¸ùû» 㪥’íŽ#‚ ¶µ„ÍïçŒá ®©‰Š£Ð œÌkê# Òõæ1žâÚ»ÀêݯýÓÎͶ ëAÌ8¯Ç Äæ uî-Š0­šè—$šF%êƒìàÖ õIŒ±BÉFÂ8¦$ŠŠAö ‘ Ò)¥AD:Ú«–š$Ž’´$Â2‚ü<à0…K±‹+²æ>û=›IÒT ¸:çŸ1¾8‹¶'œñ‚2ÎëðáÔÊ‹¶ Õ ô ‚ ¬­ú£ÚMÎLïKƒ±JôI°IÞHŸHáËðF­FÅDÌBÁÓ߇B€A˜@ˆ?Ð=«<œ;¨:Õ9¿Þ8Ô6Ý5æ4ê3ó2ô1ž0²/É.Õ-Ü,Þ+¿*ˆ¤çäš~ȃœ ­ ÿùPÍÝ«ëÏ©ñ€÷Ï–±×îš„ä@Ì€ÆØªœ¿ ¬$®¤ ùÛŽøÕðßÎo¤ÃÍŠÚ x‰ ‹ÁÍò Ì ßë ú•×"ì¨ B   H‚þ؆  èÅͯApà “µ«¢)  ›†à™ ÉÑìÒ'’½þ—ƒ«±Ž A?熇 ã®Þ”M ˜«Æ9P9ÌѬ ‚G™Ü™ýÏ– H‰òË”j§ý Šÿü5« +Ù“ –˜ ì ô °˜ ¿Æâ4ýØÍ¨œ¬õ; ïMË&4üKõĈ!Í¢ #€»%D˜çà;®á©ÞÆþ §¥½ ‰¢ Ú ´Dö&ð-¤-«;ðš ‚8ä= Ä=ÿ@È «$ òEâLùŽ3 $È=é,‘I­Eû4%€ø< ¡Ë2¡#¶. 1Ÿ$å,‹/¢7†I 7¥ÃE¾ ®Ï2ž7º Ë)³"áæ(ëÁ'“&‰%â#ó#ô"£"Ñ$â!áÑ •°Ä÷ ™†òÚ Î ì ÄÞá%Ϻ(ì²Õ)ëÁ+ƒç„Ñš-”º.‘ˆÇ/á0¬ÌÈùÉ1Ö„›ªÙªã2æÁŠ6±7» ò"È8í«€:;§ ú–$ì´€‡š¹%¼&ç 'ñ¹)É*P¶+ .̲/¢ËÑ<½5 À €!Ø"â6˜$§7í7Ð?è9ß:ñ$ß;ê%Í<Ê(£=®>²?Ø@ö)Þ+úA×-CÀDåEÔAþFÁJõKÖBNÞ.ï/2ßCÐ3ìD§5¤FÚ9¥G’HíH;ÝJš´<øB›C†*ëÑЋ© Òš — u“Ǫ­èÜ ¹ã¦Ò½‚ó· ¦Ò ï˜÷ ‰ Ç»´·½ Η ³Òï•*û¯%¤(Þ³©¢÷ íè#Ôp…¿š •‘ ( öÈþ÷­ù §3© ™-º+Ð íˆ-™±îTÄÁ>åÌ ‰… RÝ.©A˰7ƒâMÔ0æ1Þü*¨)Ç©Ÿ!Ó2œ7ø ©Ï" +£0D™7­6bÑ:›<ø@Ž­×2À,Á"öΧ$±ª$ñ »/Ó9#ÓÕ¬´%øáþ!É ¯.Õ&å&õ$ñ1®Bš4ÀE–ü' 9÷ ÜåK½=ŒMÔŸéÐÊÅ>ß?ÊÆ@‡Aì æAÙBëC® © ¼ åDÝEñô‡GíGÄHÓÐI¬‰›ŠKöù©¢ ª!·"Ó#Ç%Ð&‹'ì'‚)¶*â-÷.‰0Æ1Â3ú4Œ6Ø6´7ò7ï8–:ë:í;Ý?P“”D•ÒœF”G䕈%¼« &`í ˜´Ô­·¯˜C¿,ÿ§*‡ò "t!a#>Y$:&p ˆ\>#;<#!%#R&q/¥#O" \"2i |&×- º'ˆL!#P'"#G V'i#$±"c!(*ò @ !¾#-"4! % "x)@!ì"="˜ 3#J¼$É#}#$#n##*±#Z'Þ.l/ùî¸Å)¥ ê:ž?Ú”Ì!¸ ” î4‡»æ‚ãÚ|É«@„m¬Ü ŒÓ›ŠÕö÷„/mšƒÕÏ á‰·!ã"±²å Üô‰Øä)¼Aÿ@íí!”•!œ!÷4Â%Èø ù †!¥!¦!§!¨!©!ú û ü ý Ž!‡!þ ¼(þÿ ²!àVŠíòH¾ œ™UÏ §$îöF¥+ÞúH¡ – ¼J©K©§L€ìLº › Úˆƒî ú»½­ °ï¿¾¿Î£ž˜…õ!Ò"“Äö$•œ&§é¤,Ûø,õ-©!Ç"Ø#°/0þ3ý4„&'š(ü5½)¢7È*‰:±0”;ã1ÿ2›Ý=‚µ#ÿ»ê 1½ æõ…ÁøƒÌ Û {Ëà£Ó š£ û ­®)Û° Ä´æœ °#´˜)¬šé/ñ9¶ŠÍÃŒhÒ² ¾'Ì9ªì,'˰´ 5ýø²ê¹˜¶ è® U!Ì% /ø#Ú!…®#^!!$%±$¤%Ó'’$4~%ä '($~+P$‚!z ¶$X-ò!–Œ q"’6ß%‹ ¢Tç3¨3ö÷ ß çÕ<þº=«¢Ä)ƒ–8þø7Ô §$À!ÖŠ Ž"¼º¬‚Ú€à.°#®=À>ù3«?ñ5±6œ7ÁA³¯CÑ’8…:ªEÀ£IÍû ø:µ—J†ƒÚ?ïÚ@ÿöAÒD¢1°EÀ2ÑïEùFõG¯4µÑàHûIãóLÿ 5šæ¶"ó%ñ'Ý*å—6ª‰,û,·7Í ï«‡‰š‘)n˜.‚ ³à€±Ã)Ëø(íôâ Ç #À M%#‘"*#%#&$(#}!'#''¦!î#»%FÝ$Õ hs X"2Y%(!~‹%˜&Í!Ù"^ Ž"V!NX& #8%©!±"A R,€2š"ê%™%Ö!r'ë q$f"BÆëÁÐEåF‚ 7¾-‘­ˆ¤ÀÙç Æ¨Ê‘Ÿÿ Ù²}·£‚âèó9³‰¦vŸç ÇŠ£¢±$Ùú! (Õ (³$h$µ°á‹` %*á$"ƒ ],é'H$M B !=.¤"@ f"H#I&o$u!t!!9&j"] ! ?#q j#P+,h"/D#i J#D#="2$7!£#L"C I$@"C#Ó#@ !"?"Z!qˆ"< 8"R'Æ&YX!"#|  %"(…!-#2 ž¬Óœ±,©)±ùü®HÿDË8ºÒH€)ÿ¯"ÉòÚ0ä;‡&ýù°¨„‹AµÖ ׆?Ö °ï3‘?„¯“<¦@ÇÎ>¤C©Œ=‚ÉÉHÉ?L»¾>À+ú°ÆM§&öJ‚ ¾¦6»/åÒ<°Û.Ë(©óBùРĬœ@›´ ´D§æUŸ'•θÌ5–K—¦'ó>öIòLÑ ÒÔ“<Ž=¡»˜K¾'¦Š:Î Ô@ûŒ1¢ Ä. í“Ð5ÁÍ í 0ª˜ê ÷°¦äˆ¨Ä» Õ • þ º Óëäî¾É)˜µe«Þô„»L뻤 Ü3ß ë‚(¯4ϬF80÷˜§• «‚ Ò„¦ˆ-öÚÄ ’­€;ج‘Û€´¢ ‚ Û¹ÏÛ"l«¢ñ3cžÿ› 5Œþ:½¤õ>€ÀHˆâDº“côvË®”Ĩ¥uºº®± yÕçǬǫ æ°õU’³‚ `ìBÄš‰.Oš 5vN Â#н$XŸ) *:ž 8ÀÿÆY­ É ‘ Æ ´—D› ;â Š£ ä ó¡1×_¯ÕaŽŽßáÀs…Nê¿ §/~ÉÜç X·sבF·­‘ñ‰Úý©¶ÀÍ ç‡Œ˜ ô!æÐù «ñŽá“/d ¢ þ.#— ž hµÈÔ!Å0Ò¹!qW› î L)³™„íÖ­ ߦò-”–ƒ <5Œ âÙ 2ȉɚ7öÚ Å=­/ƒ¨õš– ñê ê6-£“÷©•£‚« Ú€– ñ Ï  |ùóÏEæ3«‚ %ƒIÔ *,DMŠ˜3ëÞ§ Ì œâ$²#© ¼ ÑŠv–õØ‹} P/˜ÍÃt¤•z·¤£ƒd™xmÔ–’‹¥EFûw€nV‹„¦:)?££¥™ÃJPŒšÄ‘cýˆt«V}בdŒ¹~_œ›·«›P¶ª¤…ƒlkzs+g‰mN¦|cr“ášìšät¹)ÍNNx½ˆ«œ”xJ³Ý<¦Eެ‚+ì㙚ÑA¯}ޱcA"§C"åȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’š¡g¬”C*F.3d«'#)€6ñc2m‡_07¼+ 0›Í§«ÿC I!ÉG¨S£žï®ºýÑl¹WÒqsœ’œ·ù=þì¬r/;•yfSëÇšœ­°A•°•›,¢7Í—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@‹MpPYyà¬èù‡‘–*RÏ×w¼³§‰ˆšgA_s’zxªfWŒ‘ ¨•s‡pfC¸nsmUCa'©æ†UŒf™®†Š?„ÈVz†¢Tç—IY"tlAïehQEzžpÊd€¡EŒý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜþ˜ ˆ½_°ö³Ð†8‹“ÁêØj¨‹-äuƒ¿ßžC¶¦££š…=Œ…åÙu”aíû÷A‚cŽPzm`¨µ¤¦ˆT}»Qý¦HT§k š’k–îû½}§U‚ð·Ð!xæÂm~E’Záꥼٛ=Û³µÃúš€k¥‘„0R§ž™‹c;Î\u7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA‰¢ŸŸ~ªU¬Í©|d^jv’Œ¡¿ûùa_^Ù›ìÌ­šhšº”—¸eOÿ„‚g"=5Fm[*¸ˆ§^†|]f«D§eÁ@¼õ^Š˜m;@­îj’`—‡yÀo»>šwbPEïzh,£o•â­¡×Í· Rr%£tJ©ujb'Rv“»‚„êÙ—kmhqYç‹a»Î¢g¶¼h¥”qÿºƒY ·¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJul!O …SÆnZ[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒy1TžˆoÆ^ñxŽ`}=‹¦€AîK¢›¦€d}]ŒÝ™µÚpm,r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘)õ‹w£{Á¨²œzø@kvós޵Á^€œÜ^?Š|k›øX=½kŠ™xh±…fEên4, ¬”ŠcÝày’kj€-ºqÙ³^žïO"w ’9{¾ŒÎø<Š™ä&ÿNAE“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯yép[v†k¦‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿ6ÕR–¦Þ–=??BæöaˆÊçšGF¢{¦›éŸ¸É¼ ´•° âó±Á–ÛŒ§Ûª®G¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQnw Š®¥etm2~ytYlÖfw|ww§cwSt… ¸i†EùyoCŸ?RD=¾_ŒÊÚ%´Å)¼)UÏ«8œ*äžÇé$ñ!™ã¸Ö˜.áŠ/Ðò,40ɬ ÷Œ!œé:¡€„—ç–-ó ”ô"Ë ¨‚Á=¯âáIǯFèF %…ÕŠâ¿4Vþ ÀÂ-rÅ&¨Û ”ª%ÜCŒ-•DÇ#0¶M‰“È‚œŠÈ¤à!²FÄÏ „¼%—.‹ ×1Þ$(Àö0Ü ¦"ÖŒ¸2Úò‰á*qÌɤÑ4ž±%Z¹Ú7ù¼ò=‚‘‹ù¶´ ‹)Ä ’%Md'0ã)³Ù&¡Ÿ‚òù;‚úEᅢ+ÍMª ä;Æ–M"ÛD%–'#´-²*ƒ ºL¡*ý ³EÔü4ÕÝ–<Ê,XÖÕ©®<„Ké&ç;ù²°*­ª)³*À&Ø;ŸK¨#‚9ý9ˆ/Ñ0ç0º1¥6»?ì9†<¢=Ï>ÿ@ÀAÕB…DÇ@ç •BD ë †È ³‘üŽBÐd¨' Ê£ã¦Å&– µ £Ú4‹ †&ù#—ì¤ âÞDöµB€Ž:åƒèÜñ×ûàÓ³ D úÚ3Ü7QžqÉGmÝ© ™Ò¨ Á“ †Ï–• âe)ŵ ˜øì粋éî…j–?÷ $cä ¢‰dŒŠŒ!ç  &Æî9ì Èz· ª/¦»H²¸°Ò¬JM¤éú댒ô‹Ò³ †ðÛjÉÕØo·k|K«ö ç" À õ®’Öeì‹´¦ è@“f–evÞ M û ’‹¸Nä  –“ˆ:b # þ‚!‚ ˆìï¸ï‚ذ ú-é\å ø Û݉é•"8ß°µ¬«J  ƵñW½¡hÀø۴#¬ï¿·²)È ÆËà‘„Þ¯ÜÐϼ‘ š úÝM^W¹”ÕŽP)íÑž cë–q‹­,OÀ 5ô„ì' ô¥Ý“G¿ ø ?ž&lÄ É ‡™£¨ˆþ™²Ñ°üfg_Tn»Ÿ1ˆýÚå¯ ‚פ øÁÓ Ù»î Œ†ãçmžÄ˜ 7\J6'—0P>Á0›0Z- /#8$3³ &QFC:>M;B1w6X2d3~A2M.'1~3#2t7£1Z2š1E7;5½8Ë5Ÿ570v6ù< A%7²2>4'0F4R8Ù3C4k0¯0<¹?9*3Í7qµB@7Ú5–ŸŸæ”Ó’„ä Öí.Aû ľӸ Ž·¦æÒž˜ó¢ãpƒ¬ùgñÀÀ³Wúë1 Þ,œ-Æ,Ø/± ¹Œ …>=Îé ¢¶´ª˜F®ñ„—É €Áœò°`GÎÓß’˜ Ó×™¼šÌžã õ “%µ©È ÚÜ #N2È,Ζ  Fu#-+±&!"›("#NA![#Û""I :> u##í#G,"Ð! &"F!†"#Á#K N"sd:˜\!æ#o 80Õ%·"Ç*ÏD F&¥  Ô‡Ó Ÿ ´Ë© ‰³Þ-¼®¯ ø ú™¢ü žÖOÙ2(´f§Íγ‰à¼ÉÛ¤ä¯ üä— “Æß âùŸÄØÆŠ‹­Œ¿® ù¿'çÏ­Ï ò“ãLÑŽp¼7Œ!&#r&z,"!$! /k%² #!&)"".S"g#Ž#Ï p ¬!&%}!Î%Ç#í+·.«"?$#!!%T#O %l/ö&·% !)ì"k!"$› Ï!$Ø"»˜ º ÷Ûœ Ž ’ª ‹* $§Ó"Õ(˜”ÈþßÓ†þ¢( SÂ…,›"÷±¿øªÒ I›'œ “ŒˆËƒÝ ž0œ.¬:š ôÚ*­Í3̇¦ GÇþîIÌ>)<3+âŒì«†@¼DÇêJÜ× œ*œ*–%ü$ çÂ<žD¶&¥DŽ/ìß:øMÉšE¾ý¼þä»ÓEìFÃÐHƒLôŽ!…ø° Ÿ¨·óÇ'Ú ã&„“.Š,èЛ¶˜%Æ Ú#°&àÉ —€)ñ8Ìþ¢ÂÚ Ñ® KüÞ‰6Ë0ök—*‚ <#T ç&@"2#û"Q!w/ª"k$[ (œ"ß%T!®)  F a+.,,% 6S!? §"#û‡¨‘Ñçþ=ðµÀAÍó;ªìе5šü ïäMü.á-ß6Ù%׃„>¡@°#£$ÁË'Œ~$%0–äÝuîܦÝþYWÁ-Wkh´aÍ½äŸ Œõ-¶Û›-Ì*©¦BÙ¬$§©3ã6–BµF‡KÕ!›"½#ÑL’M×M¸$žLÞ%ù&°ÇZ~Û<ªäݦ#¯·!Ù$´Ìáë1›×2ª—ã°Á >‹ Ï“Å?— +ñ¬‚ÂîÛ3ü® ë¯Ö¥ ¶©Î ›Î ©ÖÜ¢³ †Êá0é)œá|œ¤#¬ «Å!¨´ ê É%ƒ —;ÙÄÒ.ˆA飖Р¶É(À?ÀCޅЫ ™ƒ/Ñ6Ü뙌(’M÷!ñ·&¼ôü‘(à)ûä©$Ýü7½â(*¹/º ÒÀçù Ã3’ä]ŧìF쀘€?èÄ É4±Ö ;“$›C‰%•ÏÏCÝ¥#™ ô ÷ úÞ ¤A 3®î ›hQ¦Ÿ1 nÀ$<#A%h#•"G%€#V)“ Ç%¡$u$À”*$ !#".™½­>Ò .Ū¬!“›>¦Å"š%è…&Ç÷<ÚGý/‘&† «(è«C¬+Ë ˜MœÔ–MÝ(ÿ!Ò•Mô*…“#‚1¾2Þ3’5§7×:ë÷;÷„ ôþ<®‚ Ñ=Ì¾í­™Þšø3ø ©ÊZ÷«Ú [“#B-+81¹Q p#!È#^ ‚%M%«!&!**V*"P+t.´$P X"h Ã&S#-$^#C<$÷#/0#] t%Ɔ`"*") N u#"O"¹#€%Ð%>#±(‡ A"I$!-—/¦&‹ÐHæòùÇõ R‡Œ·Æ .¥-›ÅÙ „/¬#ï ÅÛ‡¶³ ˆ¤ ¬õ#‰¶¥Ïî(6ÅÀ@€6¨+–‹¦ »î-ã.ëãŒ+»DÕÉ‹…(ÊÇé+€ ´*'Æ÷‹¯„ £Œ« Ô$™ ¸ðŒÌª¿ÎÕùàÚÄÕ¢íÝ ‹â ¼ÈÛ“Œ¡íØøÊ­ÆÓ÷µºÇ j °Ü(•ʇ"Þ ÝÐæ ¼²^ŽÃ²ªw¨ÀÚ쿌#–Ñ —ª ä$»Ç܂ܟô¹ªîœ »—‰ŽÆ_Ò•"*üð Ï.RŽžª¿Ñ¬Æ§ Òb˜¼¾ãõÝô Ú$ò"™$øëLÕ,ºµM?™)ìÇE— ™%Ð ¨>‘M»:Á„ —Ÿ" ©üO©$Ìù•Kú£)…¤A=ÀD硃¾:à+ˆ:½,¢ ß-Ž Ÿ1”:î@1 * š!X F!›Ä1³G‚!Y"j"K"ä#M&”"#?v!›ÄJ#‚,g t O$,#ã#Z=&³"^%Ï"r % &Ì E O :$"W$P!r#p#n(j#p'^"ˆ"€$ÕÅÞþÃÕ<²Ø-…Iïpß'Ô ýÒ&Ù4Ê a"&,£ ·,艫#N i!(¡ ‘Ó*w)y ‘¼&!L; rc S$I#s#ij"W4! !9A Ë"#àó$="v"Ó"_#”".6à C—#b"/n%Ì( …#;"/!–¢Å¦’Þ÷ Î͘6†Î¿óÆŸÁÈ#û­¦ ƒ#£ —×4¡ ¶±.Š£ ¹ñ#¨ ¹ñ#®À-Y†ð>X‡¡ÙŽ Œüß&¡§÷ ¦¡°ý ¿ ðë°°‘Ïé+šÖ–¶ÀA½BÞ éã×Nã½,‹†7Ò"Ý$ä,½Â«™#†à¡@šò§Í¬ ¢%Ä7Œƒ ,¶©–*­ ¹ñ#ÙÙø./¯¢5‹.ÛC–ôµ.« ¢$Ž-ÅJž ¹ñ#ÝG¤@æ4ˆáOì5Ç ÿ9à ¹ï#èMç0°A¸ ¨$×C¨-¨´ ¦$¢›‰Þ¨„ – ¤®Ù ûѲŒÒ²Ù Ô+ÏÇ@Ѥ»'½tª» žÌ €¶ ¼C–ŽÀ §³ ¯&Œø"0z›¼ƒ)— |ßËäÛ² ¬ ù­Oâû´Ã‰÷˜ÎÏ¥ (ßùH­ä!û¯¨ÖÚ ° æ:”M¾"¾ ¹ð#á<·D‡5­@Á ¸ ¹Í ñâ/Ã+È8Ÿ5Ä4ÊLË1ã<¼ ›+¦ ‘A¯>ª –”5€ çè,è:ÄÁž%бË!µ-ÝÁ*ÀÛ§2¦#¿:ƒà6ì ™û›ˆ˜0êÌê°8Ë&Ÿò"’ ‰…ÞÁ™•'Û Ô ¤#÷²1Ý(¤ÝJ…%þ5Üš)Bî%Ä)²B(ÊÑÖ¶:úFbú¢-z…¶C »C´ Ñ Í ‚ É«9¤@ªÿ-°<óõ.õC ¬ù·ñÍ šß î '¦6!¿ôã ™ ‡ ¯Û ߀ 4f3‘4I.53Ê6R3A0c4ß1»0j3¨0D0‰1.®3xN41G4‰5Ó0&%0l1c:#J3ŠÉµÇî­A䃋T(‹ ˜¯è35Ÿš&½,gª–¼†¥‚ –¿+‰ ¡Eš ~^‹šû´ ƒ Ð÷‹¼ FÈõ'ç –Ÿåö‘á t„–äì6ø‹"Ýg¾CêäË7ѱÆ!Ýüði¡œ% w»ã V úqð¾lç;졽>ê‡äg׌.¹ c¨{½ Ä Š ¿» å#™1ˆpÕ ç(¬óýu Œ¢ó¸û è 3&H/"†3š1†7i33d4ï6>J2^7ò/F201 N.$4B0c5O·1Q5Ï79$-!3¶5b47494N#= 0·4W2/2qBŒ2p5B2 N2„¼65p3á3>3Z8ÇEõ0S3F2…6ûÐE¡ À¾£nu¢Š ˆ®B‰ &— ”iÛª ؃–îç¸Æ-t /  2"à Øí±´¡ÉHÆÔÇÈ×­Úæ8ˆ"É&ìÏëÿÐ  (6ØÓ Ì ñÿ ò¾ ºŒ ÕgÅè »”¤ ç\¶àžž»çŸæÏŪèîñ‘  ‹ý¾ÒÍÙÓ¼,êþGô,æ, ¦ æ–<²%†iÒ;ă,Ä Áþ¦ Ë:º#òÄ6Á+§~'˜o¥¹kICÝ!Šô ÚGºK}ï9®<™É-÷ú"û‰Ž(›;óf÷!û ¦Ô…² ÒÎ9"Ìó+åâ(Ü5ÑÆ ÁÏÙ½Ré ˜Xø ô'†êâ€é +÷¬ g…¾àÛ ¿–‰‰^ú…Ç.F–+àýµÌþý™ £ !©U A ?"A$ Í&op"Z#w.'&v#œ"s ¬.#6#>` ] o"ï#Ø Æ ?O")"Z ¥$b"¸"—!z#\#e"4j!‡$_'_#ƒm"Ñ Ð"O"T"Y"†R#8*#¾ V!t#Fó‰â ”Ÿ ÖÜî…ᠾߪÑáæ"ææÞ ¼ê ÙQÓà ã¨ÇâÐ ÖõÛ „âè÷'äTÌ!åÖ!¬"g–¬  ºë¦ ¾Þýÿe+¤Õû¹#¼óôI§:Ù,ºÛž#³2í×ÍóîŽ+³/z´! ¥ Š“ë4…,Å#¡/îÔ" Ù˜ˆ&¼¸ŽØ8Їþ µª$b"¿2«5É)¯Ìü›5Û6Í’Ñæé±ËÚBŠA°%™É¶7¯J”$Á¼ºØµ ¢CËT¬ÂÓ ™ý‹§à º©³Ì#å„”Ï ÖÅñæ’ Hh† â õÝ äÖô€ÌŽkŸÎÖ å¹Œ ³)<’žË”¾"ô†ìæýˆÉ×Ä ‹î¥·ª¨ýžÔ÷É È™Œ ø¶ ô¦î¦­{ƒ{ë L½$û ý¹–°¼!Ø ¼—ÝËÒ– ².(Í‚· æ ŸÅ ±5–Ì!…” ÕëL¢)ˆ”&´ ÷>‹#¤$²E±Ä-†õMÜÚ Ç.÷9¡+ÿ²#‡+³ë<¼ö.¡ ¦ #á( §>‘%ãÿÀ¹Ä9ïïúŒ"Òð@¹¿ÑFV×Ñ?ðE¤Œ+ùºµŠ€/è¤é•,†:Õï õ­ôàæ” jä¶ã‘ÌÖü>³6¬Cˆ¶+ÙÃù4À ÖB¬Ô3ó‚êøÍÚÕ3Û:Œ/…A¡òÄ Â9ÉÑ3âÔGöøã ¸î°Ù6¨¡â€"úfĉ«"‹VÈ;¡ Qº¿ª ¹ÐË. Ñ"†¸'ݺˆ  ¬6œÞ§äŽ*É?Éà;±@„¿.ú>"üP‚Ó#ê ù6°DÜØƒŸ:ÒC%+ß’/³'«@º™ Î4‘ ·áGðëJ¬ñ<×'…#ËÊ;€ý—† ÖŒ€%È Ï£&ðÚ¶ô?”,Ëš=^ù5­A©áŒCÄ9ý‹¥¶CÑ Ä?„1­%ã:ê<ÏGÉ àË ”#ÜŽ “é ¡Ìꊨß)„”ÍØ’Œ ˜wÈ-瑱&Œ&©Ç¤>oˆÀ ÄÌɲò› ô(ÞÛІ"‘AÉÊ•„­AÖ9èŸaüCöª ¨3Ô «$ ȲÁJ—Â/¾ õ4æ<è<ò¿?ëó9Ÿ «ÜØ@ Çσ‚û¾Ë ë ¤ÌY‘øH•.Îø$œ –-ùí–·¤Á ç –Ã4`ê´ô'‚ª âÀI)Ä „/Õ «$ æ'Ã*º/³#æ÷ „+ßì<Ïá*­ºÓ'Ç?™*†AòÍ€Hü ËÚ É2‰9½£Á ‡çïù ðÄÀKÓ Ò Þ€þ"ý¨± ‰Ö†<Ç ÄÜžµë/‚œ­3©Û0‘Ú×Ù&Åš+€Ë¥*Ÿ=¨+åEû8Â*î·ýI‡*«ä.Í3¡=Â.“òMÓMÊ*ä;ãÓ Ï2‡9ÚÏ Ë(ö:Ç1á$Õœ#þï êÅö$¤’ð)¾,áª2Eœ8’0Ý µý'öÎ'yû !¿ø$¦ò›6•-ÇÛ'¬)À'É4 $د3‰ åÉ'þ)”/µ'OþØÌ ± ´8¿úÉæDY”ÖB¢ ª º£Œ û<ùà€8˜Aãà· º°-ÒA¬#Å’3Ç Å;ô8ß.¤$Ï:Œû>"±àƒ0õ6hõJ KƒEé¾5ÛBN¿ì.ë¢Ýå ç(Š õôµ'ñ"É5Œ ÐÒÛ}Ô Üž–õtƒÉßùǦèžK½5Ôš)_Ƶʰ¶} |ÁÚ<¬Þ ‘ rùhÑÎÜûŸÇ•’ÄùzÈ]Á’– 6ÅŒ‘ÒÒØ ßé•¾Ò ¶ÆÛßè %Šƒ½\‡ Ý f-(– ó]î Ë´ ’ ¼± † “S õE`/ ° ðõ ×í Û ‚Ú< ª 2è'›†[ ‹Ÿ —‘Ͳ& æû Eßâ·U•€Àʤ¦"­É úéÌÀ ‚ܤŸôѺ’¯… ±ï£’ .éŠÝ Ûú^d®xï±Ä¨P±Ê¤ Ý Ó…Û©ƒŠåb˜†ßªú¥zÜŸ 7” ÚŒf• ¨© ¸ßþ Ž =/¸‹ ¸#´˜ù¦¨&û˜±¿%èsÄŠZÚ â•…ÅÊ-Î,® Þ « *² ˜º ¿ ž$ô d;kó&Ý”&Å Žâ ÛÍ—ð/²ï Ø3ß Ò#¾$ú! ê ™“ ˆÜ‡ªÃFSÅmœó›– ꉇËqÓàÌÝ¿ ’ ã"„Â5ð µéª.œÜ Í Ù¹ öµ yþ)²ôã”F¸–#Ãëw°ê o°G”"Þ'Ö©LŠÝ ¸,¥" ‡Œ€>Æò.‰7¤+þ …=ÜÏ*„(œI¬5¦8–7$Â4¿*Ã%°Dí ß Õ:ÃŒ»1žØô ï-«ç û4øíæ9¥4䆫8» Á„"‚:ÙÝü«)³ (¿ö'¦×MÚ:ý*½£1’¥9™­$™%ô<ƒ8Ô”*¡Â+ž=×õ Ù›¶9í ¬)¤ ÿ#Ë— Á¿™È™‰ìì›Ó • ãúóµ¥þþ› â£Fµ=òJWŸ<æ ÀÔ۴$ÊI»$¦1ÚøŒž>é(Ê¡«þ>" Þš Ù!†¦ãë´ µÌÚ½:‡ ÛH®ÖÞË™%ú§%λ.ã ¿ ê ðß ÅËÚªÝ ˆŠ"ü Ÿ<óßÓ¯KŒ<à –1ñâª&!‹>°'É'þ?”>˜Lƒú9± Œ ’«µ3æÀGµ™?Â*ÜFÈ…öËÄ+óÁ €5Òð‰™®áÈ Ïó‚®BðC´È Ý>ËŒ–..ªäÑ”¶äÒ¢ç.àHê‘£ì(þ*®3¥@¶?Ë"©B…)Þ‰ äºÞ(ܰ,Ö1ßá ‚ íAë¶Š¼ õ™ ûÆIñ¡2ªíôõ”Ÿ‡A‹7Û¿ Ù8¹%ÑÂ'”ˆ š öG–åí@¥?™Â5ëï!ªIÝ*—Tª@õ=ëA©!›+×'«!ŠAÖÏ9ÐBÄá/ŽŽ5ï£8®ÖB£©á â… žÒ¾$¼êŽ4í‹8²*ä5ë ¿¨ °Ÿ*ú&ެ· ¸ þ:ÞD¤"¾©+{ÞE˜Iœ+.‡=“8¯)ªß9¾Bƒ6ž <½‚ §Ð ¸'¾Á«¶Å+Ý ‚ÂÒ<Ò ËkìÞ*y©Î<«Ð)¾#¿ˆ…›ªE°#¢Dþ9´ýPŸ-Îà:·ÅJˆ)ÿ7•*×- ß˜.Š>»½H¸D¥Ê«Ï0‹:ü (4¶ÂÈ †8ÄŒ5 …£H°4ÙÀ€,’ á Ж ð$êâý§7ͦ@²öÿ²7˜Åå«J»«ê7¤Ÿí<†Gä†=Š“7½:€Ìø(Â:×3³Há:=ÂBœ(‘=¡,«´ Ѭ0Τë%¾›Ë,ø4­ ’£#¬Œ!  ¸Á#U­Mœ"°þ‰›.÷3óg™ °Ä&Ñ,/õFêMð=ß0æMè;Ÿ"‰Ý8‘Ààý ©$¬2’/÷ ã%¿.¾¨ÿä„ Í˜êûÈ? „êî¨zÌ ù“¨¨ó Í­½ ²Ñ —# . ‘4•/ Ê.øÁ û$ƒŒó"³¾é@²%ÞŠ-³œ˜>›Må!ŠGü)‡*Õ²Ž³Ò¼´Ž ¤ÿ“…€ ·â Êhº“ ç ¦é䢰 ʬµ 5Û<=;AE57%6X:r<4@ˆ2T5*5ˆ044×1QAž5â>3â:=7H4a:7/.Ak2À5P6E5Ò3 2O3m;ö2a7›;5!)6S1—•U¹Š²Ó0˜'u¢]"„œ Ü¢à— ˜” C´â,ŒÎÑ ó æòšÙØä€äµ“ Õ‹éýOõ‚‡°ßˆ‹‘J·¯"!¸ bÅ.÷Ÿ¦¦‡XT v ž ·# ùÿµ‰ æÕ” ØKK„&ˆ ÉáÛÞ g¯,Ê ÐVΟóå  #¬n¾ )ȳ¹Ë Aå… ¦ç ›Õš ’‚ LJ    éÙï8¶í    ̪Ï}Þ†ò º´ ÔÀÎRíØ³\²£4ÃÏ ãñ ¡± å r ÊË Û–¥¦k¦¢’†­ÿh3Á³ °†ÜǪì Àº” : 3˜ òÑ¡‰ Í’½Õ ‘ͽØì ƒ…5  »ô³ ¿;Á£ÈÏÿ'ÒûŽx× ÷kÿÛÓ äãÍØ ×Gú ›­;·•½Û“ö ƒ/šë¸‡+£± «Â\º†ã •ªb¢áÊï ¿ç“ ºŸ¼Ñ¤ìéL ¾ Á ú)åù¬2‡È ÎØ¤Ä %O#Iõ Åe˜ÏÌë:ð†ÒŒî‘ — Ÿ¨)Ó½.áÖ‘© ÉÀÀ<òbÎ  ÌŸnÍ€kì   ¹  Û)è«ê ÷ê °¿˜² ã²ÿˆñ Ô­µÍù öDþöCÃé–¨° §Ñ† ›Mç)®$º$Ø4Ëõ+þ¦ Áº,Î&æ¬"Û— Î;$ï y¹+ž"ËUK¥ æì¸÷ 7¢&Îì • „ ëo#Çù àß!é*ýçÍ ï(Ä.¿ пÂè§T ë4aµ4`ÀÆøå-#Éy¶&† ô-­ %1g¾ ” ’©‹"ªš† …:š5‡†ƒ#³)í ©$ó ¤$è-»‡©$¸"¾$¸œ3fó¾Ñ¤>ì¶&é)»îª"íк²=åžù®Ü-›Ü 1¼Ã;Ÿ«ã4”ϵ ¦í'ŽT™Š ¶ÌC—8È=ç0à ô¹‡Ú“ÂÆ‚Û'ÿ/¿5³,Òæ?£$‰ ’ß?ç=Ð0$€:  «.ì?¢AÁƬ!çšœŽ#àùæä”Ðô Ö-YÞ-üÍ/ï‚£7ü× ä"‚ å´Š ±®%¾ÏÄKâHCàþë ¶ÿ%”$—+—Çæ*@ÝH¨3Ÿ$Àµ?ò9¶™DÀ:Õ%ì! ¥Š¦ó ¢µ*Ó ‚8 ¥õ¿GüÇ Þ!µ<Ù Œø¥Ï)æ ­õ¢ Ä–2©%ÈîÝö 3üDžD’C²Jë”°+\¡š$¤)b÷¤ ¿* èæ çÁŸ5”‹™» î AË®•òD¨1¶"°¿Žµß$“ð7ŠÿèÏ[O‡Ó:‘.üE•=Ü.¸›‘EÒ ¼DÌ"ñÃ!¾ž5ðñ ÏêÁ!üøÐ(¬¹T¹"…:ØÖ˜›kÈ—ÞË/ÖFÃöŽá'QúÝóñ+Ó;¹*è<¨ß:ëá.Í#¶-ªå:Ü.áBß?Ã4ÕGÝBä:L‚Ž ´€H¦ í¼e½ (òò”’ɉ0Ί4ý×8®/Ò ì´ ©áçˆ ’áÛ…±­$Ø ¶¾&¸8å6ç¢;⨠Ã&À´ž%ë4í ˆ)ÿú—C”õ$’%Õ8“/Æ ¿àÕ=„ÛŽ É ‰9µ þÍ-Í…>ç6àCÉ!¤¨%˜ºå°'7ö£ÊJãAï ¼ Ï*µ!».õ/Ô± Ï@†Šž ¬è—=Õ »D©*æ>µ ¾ÁAÿ=˜,í,jðG¯ˆ–ñÙ#ÌžéïÆ¼€ï …™1íˆ(¹ Š²Ò‘"lj°î¤ˆ%Ø8ÕCñ)¡3Íø(Ó2¤Ùà.â4íÎò‚ÑãÚ;óºCú»#¡-¾$å*ñÛ'ˆ"äå%Ü>— «8íð$:Ô × ƒüª8ñ.ù/ŠFõ)²3¾-¼»+êºâM¨-Ú#±<¶#Û(Ô“É ÓŽ¿J1¼ ˆ÷ù³áß»ñyÒÕ+½ Kdb¸…lÐŒ/zÜP]I¶ î>¹÷ ª†Pï’Ó}$ ‘*¼í¢£êÓåöÒ‹!à €éš¢ ìÜò ¸.Æ 1|ÝŠ ¥Ÿ1β]µ{ñ­†Ñ£# à!,ƒ5¤cF‰Ð È– P•¢W§¤A ‘“ ±ÂêÒ ™ÍJ¿$IéŠðòˆ ³ ΄’Å êÔû „ ¤ ‘ÂÖËïà ¨ çÏ࣠pѦæ&õðeûË þÜ µÃë Šµ– ô ñ#¼¹ÊøÒ ¸ÜãÆ½ áÞšý´¶ºß±¿ –™ƒÖ Ô„Î-ªóc¦˜.Ç t9ô• ëÖ ¡ÑS’æB‘ûÈËšˆ‰bÁÓq~¢ ÷Ä†Ò Œ„ô ›èÿö„,Í Ž0¯¶åÜý þ濵¡*  œ1dz €ÍqÔû ‡ ( “ °µ“Á·$¥Kº°¼ Ô ö‰/¡/¬˜Ë+Û é ì'å$Žª9¯’ú‚C² íðÊš…1 ,š+Æ Ø›/¨ûØ4Þ+ÖB«<ÈAñÈ*¥4¸?Þ7¥½2:¦ Æ>1±0Ƈ¤Þì¹#®‘ îó)k®Üú3ÿÿ½*§#ÿ*¤D³:»Ž:­ÓBÎ3ÌõA§B§ Æù«EŠ=²C®Ö)â:íŒí2Ï ÚÚû —› ×Í » ÷¿@ë¡D¸C÷èŠ?‡%å¢>»-Ì*ÜãÓ¹9ÄA¯»-°>ñ Ø)‘Ï †÷$¥›£Û}žÕ-ŸÕ>½Ä ¸%â®§2ò3Û!}äDä2È(òE«#Ž>õ.’AÖ4ËF¾Á8ð.õEÌBú¸)Ù,Ž;· xó ý'»-€É8½ ˆÌƒ7Ü Ø §@:¤*: ¶î7ÓȲ Œ$½ü #ÞF©-²%枉>È#£ò ¥2jœ-á % Ð,ú’;¹É²<ã¶‘€Í _þ)Û%÷¶ð•%â0x‡a’î žÛ#Åô*€-BéìÄ Æ–Š*ž!€Ÿˆ/óÈ.°%ë —œFƒH çêý Þ ê ¬ Ò·àÒ†¨µ ¢®½âJ‚ Î ¡+Ž-î˜7Û‘ X· ¯ï íÈ+¢ ’° õª%ö‚­0æ-›0ÌCË.‚5“+áÁ'©<Þ5ØËE¡>Ž '‘/Î ;Ž …W˜ 쨦–ÔÑÆ‹ãDºŽãîà Ÿ?þóMÁ5³ÝŽ•ø¬"âÿÂ…ñ×ä*öõ5î”0вÄ3¿ “F+£#áÅÛ × § Û  ?š.± È ¶ø)¸1à eåSÅ3‡)ö Ðâ±3åð<… øÇ6Íâ …Ð>Û9’ ë¢ã-Çâï.ž‹Å ðÞ*ƒÎñ% …ÑæêJ¬Û©'›BÈ8‰5L§+¤ ®<’7è‹$ƒ ®¶9/î6°0öÁ%«BÎ'¶;é¼Ë6ã‹KýÊ4üBb¹¶+¿6°®»ù,þ.¨Î¼÷™$±ÎÛ4¼Ø9Ã3¿4­0õ «:Œ#µ0®0¾:Õ9Ö,²Bƒøû(é´0²0¤}¯+‰F®"íàòæŸáýÈËÝužØæÏý ³ˆ_#¦)#³£‘í¾‡› =ʦ†pFª€©Ã7ºŒ›‰æbÙ ÕBë•/ É¥úÍÆ ïïÔˆ c½•ì¬ñô€>¦¸ÏÀÅ Ó"ºyŸc#¨¡ÏY´þ€½’ò¯š!( ɰ¢  *Øü ±4ËÐ(ð!‚ Œ¯ó"µÞ ì÷ 5Ø Ä¶<:̇¨>݇A¬ñçú Ú  ®„޳ ˆÊÛ žñ ß± ‡Í -NMC/ra+(@†-yb7P&*b(IÁ%<0:…)CQ1'Z7)9,#Æ5E1z8´2}'<3,B+*"0m1²2[1(+0†,‚×,‰`)(:¡%â—#·¤5³4݆D©“ý#Î+n½¶-è9ýœ‰¬Þ"¸Ô÷E¼-ß3®FŽ7âг:ˆI³%í.Ä Í¦‚'®ÍJ” ™–Ôí»:ßÞ¬ƒ·ñGªª@µ›¾H™Èü×àâ9»&×'€=à ¶šŸ,Ù2òÒ—Ú(°@°Có쥔'´„Œ íLâ6Œ¤Cˆ ¼‚…&¡„HÁ¢;¸%áåCÎA™M±'¾+Ì ÆJo8ˆ7ºàJ½"Ø —›<Û™Ö/²ú”Œ ÞòŒ©Œ Á¿•ä‚ýã£Ú¯1— „ç&Á” ñÄ0ó.óâÆ!”ì¹å:Ƶ‡éÊðõ§'ô üß 4žc<ëþï¼ú:Ê+¹µ%¯ ø•#ã÷éìÓã0Ú+ý5€BÒ²$¯¾A‚;è3‰º(ò×ëÂ'©#…q“Ðßü Ô#ï‚F䇅 §1”‘¥2Ä:àŒ9+ñ:¯ž)´#·3Ј½(Â"®þ.ã9 .€/³©8þ Æò)í9¬Iõü±/ŠÂ)ŽDè ¡ÄÚþ)²0Ë Ö«+н(ß"õÊÛJ„žö¸ÛŽÚÑxìþï‡}æÂè‘„å£}éË¿rëšÞì‚Í­´Â+í*Ì@ÛMö‚ ¸á,³D©I¬éí,¼ û Ð €-çæ ˜1Ö ŽÉ#§"õŽ×±õ­-–+â˜Ì Ž H¼9– ‰>ùÇDñAú5ØÄEȵ$Ç*÷8ቨè¾Ä¸"²£'ç•C±'ÿ ÿHº/øŠÆà ØÀ>nËD¬9¿ÿBîJì.ŠIü9â5ò<™5Õ'«»£¨ ¬Òì E%.é»ÿ(ޝî$Kƒú–ôƒ´€ºŒ«è2÷ &ž„Úò µ ° ‡ÕÝ£ì¬ ðQì ç…‘ â­¾ ; ±ŠíÓ¸ ÒGáoú#£‹Š€Žó*Œ$6·ùÊÅ ÷ ” ú‘܆¸ØÔ ûų¾Èß3¤ 䡸æ¢$ƒ¬²î ³¡T.¬ ª€™¼ ý©’ µ² ìÚ³ôíÑM–¾ñ€¥õÌ ¢0 5%6%1H5#2f8&.4173"4wF64å2™7gGBS0Z.v4Õ0Y0Y4)2K3P:p6 6h3U3<2”0.¾ …Ââæ(ß+ó<¿‚ è þ*êæ"@„»3¡åÛÕ€ì´Í%ÆÀ=å$É Ú 2è‰?­µ$†2ýŠFž9–ä +ò× ˜³1Ȧ û1—% $¶ Ðûé!£,Þ#ÒÚ(»Kµ$÷;Ìž$‰#€+˜ ¿´)’,ê ƒ9‚0Ÿ“©š¼œ© á'Ö ©.­Ð󈙘À°L¿3­™)»8¹û<˸8Ý(Î:¥&Ó,ÀC¨#»CûÌ´3Ð)äªÈÚš)ë ¹È%ê6à¬+º½Œ(mú‚êó ‚þ"À*µÖ!ã);’õ<‹+Ï -¼Aé)Ý)¿*Œý<í>Ù(ÅÈ/ÌÖàË%6è*ö »· 3¡Ì/Ç ü3–%Ù±@yä0«¹?ñ?Á"üø9¾û£)…˜;ÿF‰¾­'ô Ò$Ì'ù÷´"ᦠì6‹ª)ÀÅ0œ§6™%Ú—6äì §ˆ®“è0ÕB–+º:‘I ˆ/À„,í.ð š*9¯ô*à œ—¢Ù$ð-°ï zø ³ Õ~›¦‹ ؘ Ôõž!˜ ¶îÍ Û û!ÎåÙ#+Å‚*é$µÚ ˆBÕàHè.’<ÁIâ'ßò/Ú Ã¾<õ*ç$¤.˜J…=Ö#™$öð ó ð¾ ݧ@µŽA¸ ¦$š=–=€>îHÕAœ=Ø-“"Ä%°Ñ@¶ÞE’9dž Êé¡™@ššƒ/¤ÑH!—¡Ã½ç¼BÚ'š)ˆ÷î Í ïü?Ä#¦Eé³9½$>ïò+–Bã«Ý0—5¢©»«ê7ÕÓH·ö ƒ ®­ùã ª!”ئ¯BÄ"íÚBŠÄº ½¡¨ÜF·#¾µ7É ô3¹À-Òå5‡ ãÏ-¦ Œ'ÕÝ× Ù†‰¤1Û?§ <¼*®ž)¦)ˆŒMš&Œ)ÿž&¤-“+¶$¦¥è5‡»Â›ÄáAç Ý †‘¦¦Í ¬ž—‹•ô½—¿ ¢Ýr³ ™ÙÄ 9h9z4Z2Í1EE1f626…9†4i:¦4–8Ú8b5Ó9s1cJ¡Kë4½”5Ò?Ò7d4™5ò8ó2€M2Yî?Ñ3u0#7…Öî!8šƒ” ) ÏÜô ´˜¢\¯ †é颠 ,M yø&¾-Zì•ö–á ¡Ú ÙŠ rýée§ëŸ½ š’ ¥&Ù ³ â ¤›¦º¨¥ ¬¿¼Ì „ û þê4 ŒË§Ži!ôטiѲ󯹿3Zé³¢ Ê ; iþ Í¥ @C3E7 ;Ÿ;YB}Nô+ ’1O>&3 3054^;‡6þ9…0ž2l8Y2ú2Y2Y7l1?3˜–5'V4h2H.Ê@383C;¸4?1]5€.“2,0P1k1«4?0Z4H0;/l8À4<‚U› Tj6ûÂצð ê'Ž &S ×ܿ܄² ð ÒÍæ ë»Äðþ€ß£Ñ›¦þ Á7ŽþGçJÿ¯‚ ‡ÐâÔ5û¡úí È!_¡·Ç„ –*§ßLÏ"¤Úlªù#“8ä À*ò®%Þ ¿þ1Ü@¬ ½@À6ÛŒ'³¾èÊ'V9ƒôÆœ!ã:¸á3¶.Ë<ç3¸3®Ú6È9Ý6¤*Á6Ð6Â6º:Ó6¹6·6Ë6º6¸6©7°Î6Æ6§?ŽB¼6Ç6É6„)’+‡ ß.¸’”9¿í/ª¢¼=ð¡0 U½ Ò1‚’B¨+ ñ½6>Å+¹$®ì )˜¦•¿-‚=ƒ>ì #½ ›@—I«•-œ ³ì:ð?Ê1«ôÀð™»!”.Èõ¹…ÞB¨–1”1¯î—1‘11’1ÀÀHŒ1Š11±%Ó'»‡1…1†1ˆ1•…)ý<µâÞ£6Á‡ ä?â£Ó"ƒ)7ÀËé Ð ø1Æ ü"¿öü® â“ ‚ÁÜAÿ +à‚1€11ƒ1ý0û0ü0þ0ø0ö0÷0á.Ã*ˆ+ó0ñ0ò0ô0ã3¦;ÂÀ"È3Ì3Ž•#‹ ­ ƒK®?«ÝÆ€kŠ„ ö–BЬæÇ ¬D·E‹ çË*Ä5Ï.Ù- mÖ'œ>Ä9ÃÖ ªä§1è‡<œ%êí¦ ÏLbô.ðô!”,¹ Ô ×+ÒÜ0®Ž)´"¶ã#¼ ¥9ÅØ¤ê ?Œ+’+–7“¤"ã8é:˜+¾“CØ%Ý, 7«¡(°Å«Œµ<‰ Åº.ÖB¢ß*­êiâ /ò ¢²„¨p¨×5ž Ž©&ºÐß Þ«ˆ®$‘B†0îÒA·'™ÜLü ÍÅå­õ •Í,…æ³ äõHˆ0úì ‡ •*Ìö¹%ôI4¨*¥>ˆ Ç2Ã.Ô%ôB§üº->Ý ² É û°²šˆ¯ôý ç-ð8²E¨/ØÌèð<Û@ó†À@·+Ê'±$®BÉ,–…Ë3KÈ >êH† ’Ñ å™$”Ñ"‰³Ê Çî  žã<»(œ‚û Ù£ý#ùS³¹"«í ÈÖ0ß%Š%ž)ˆ¦äÐâ4ʶÎH°)¢õÍ,À × –:!ô¡¦¶ïö(e@  &  ;")   4%     ( )+ '   =  7'     >  # !**  6 8   GJ ) D    + )  1 &    C   D  8     ,    $    7 ?  K=F     :     7     U  M    N  D>    X     ,      B :      Q ") (    X 1% %   +"1  ù&                ’ ×   ÷&ƒ+¨+ËÉÀ 1+K 215'',+)279& %95%%&4')L"'ŽÀ»Ì+À»§ 1+K 125'',+)278& %95%%%4')K#(ÎёȌ ('À'è'¹(ˆ)¾)é)Ÿ*Î*ã(Õ§¥Çëšç ßÿÆž¬ ›Þɦ†@Sä “ °ÓèuŸìÓ„ë¯ ¾VŒ©ç v½…Ôã åáÈ ¶(ûxÎ ûºª¡¸ðÆÛí >ã ሠí­Ô² ªŠøË¦´ Ú­óàÑÙŠ €¹¡~õ쎜 Ó CØ-O… Ö¤Ùœ-Š ù!šì à‹¥$‘ À¶êŒÊ/Ì;Ž ‘ð œã ÛºÇºŠµ ëÞ é¡9àË 0¶‰ó¯ —¥##Ÿ¤žÅ Jþ"Ø–Ê5æš {àè½ Qº¤»è·k–ÅÔ ³÷À¹"* Ë ÄÒ‡Ö -*ìÌ̲” ’ˆý¸ 8ã *ޤ¹¨ÇÒÁâé Ç Ú œ¢›Óœü¶;§ï&äò¸±Ø¡+ œÃø'´õ, »%ÁB æÝ=ÎÆ6øG Ö¾BÓ÷ ßÿ ¾  ˆ,¢CÇ* åðç%Å Ã<¾Ëó&Ô ø. ’ ÷#Èé1°L˜…Æ3:Ê'Œ ‘-“4rÞ/ÁÝ à7ÉŸFãÙL‘;ÑGÞŽøØ æ/‘L4ˆá3 ÿ û à ëŸÙÈ °9 ÷ “% °9 „<( éL гÒÝ ÜÑ=ñB ê æ ñ   ÿK Ð)  ª2Õ¡#¦ § ä: ßG ÐÈ “­#ê³ Ñ Í ‚ É¡-¹© €CŠ ÕL˜'£ ÆEÎý9‹¶"AÃÞ¦HÓKàŸß¥ ã ‘" ¶0 ‚´B¿˜¿6·MîýÉ¿ ™LµK•àÎ?á’ È Ïð!B©ž§²ïê Ș+ã×JâCEO†‡Â‹„"¸Ç,— ñý ç ŒGNûJ ‰ é  ²!ë(áÅ Ô'ø? ®; ü$ ï1ö “) …Œî‰F“F½ ­-Ÿ0Š3â † ÷0ö1™ ûÉ ²’) ÖÄ7ä ¬4þ %Øåúˆ6×¼I< ç —‘ …áF 2 ÒŒ6í+á Ø’/ ¾„>› ûì ׎¸… è�ù¼µ°€´ìBž0›Ià1Ì ´±(4ô¬“ ý)é@ÆÅ —7s϶ î æ )Íõ<È=½Ó=Ú… ò»J µBþÊC Ù( õ ì$ û ¢Ó À Ž6 Ð æ& Å! ¸; ®9 ž Ž%Ñ ÿ ( Å,úC Ï ú 0â ÕI¸Èõ¿Eä3Æ0¾—4ôÏ ïDÖ) ˆ ¡ §„ à‡ £G ´ €™ï Ÿ ÂÜ - â1¨ ‚%¼# º ø ³+¡ ´ õ‚&› í Ÿ úI – ‡ô ‚ ÜÌ1–)¤“ʃ+ÔLî¶0Á&‡%ÀÞÃ6à§?¢L,ˆ&Ð< 6î¼øØLá™ ½ª?¦! „ ò"Æ9†ž &Ã0³6¾5£Ô Ñ- ð7²F ¼F Ø= ³0 è ‘ ØLçÛ5¨0ËŸ…(Ÿ”^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¬NMC¡a)h†¦b‡PbqÁgj…lQXZ7bO#xz«ì¯%>_B)LãYB¶®×µ`'&<Æ<½¤'<&àš)…(uA•Ì)P)!u‚SÆZ[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³^žïqw Ë{¾ŒÎøÆ™ä³NAEÊ)¶%  ŸÆ¸Ë©Ã'í¦EÁÂ…û´¯Ú¦e™ ³¢®Ùôë›Õ û4å½ôöéHÙ,Û… ið¥Ýý ý ¼ Ü?¨?Í,ÇJž;ã‹%¬ ™- Œ0 ó2 ŸA é>š‰ ®I§ ¡5÷8µ åœ& ¦ˆ>«0‚ ã› ¼Ö°ÐL¿=ÖGÙ% ÅGÚÂ5 Ù6¡ ‡Ú£! © ÁL š )‘4 “†4•FîAù?‡7óâJÇ)±Bí ð E»BÈIÜ Š ³>ØôB ú«—Òö ó Ŧ Ö=›Å*˜¿ï*ˆ:×"¶™0¾.ƒì1Ò!ú)ú éª1²: Ï" Â0† òF Éã2ˆ9 &8Ð, O«IÈ9$Í=­   œ4§5 ´7 Ë" ÷ œ&ßÃÐ&ñ£›æÑ ˆG Æ7 µE й؉èù6 Gê‹Êʇ"§ƒï)¢´0Ÿ;‚¹Žé ¯âáÊìµ®Û#€Àë*—†ƒ3ï ý®€º# º²ÉDöÔ­ˆÒÊ…®¢ „J¹9¬ ¬&ÈA ó- Ü) ¬ Ÿ Èã †D —K Ú Ñî)­ æ8 ‚&÷@âÐ Ëâ×Ó6%ʧ•Äè Ø#½$¾¹‡6Þ.Éá!‹æ ¦Kü …'œ »6ó;˜(™#¤ÜºI¼+ë@ÍM…EðF€<ÈÌ)Ü-¡øÞù3‰8Ò À-ÓÃ>•:ô0úë‹= ˜Œ©(ÊÌy寜–;“(Ö(Za0?ÔL†1©Ò¸Ì>ìœ(Óƒ!ÌŒÌ,ñ‘ð˜)+‹é9¸XÌ<ƒüغ ¯6$ö#Á«H”–³G$JÇ ù3þ:©“M˜ ÷Iå æ Ÿ­÷!¤ , ÿŒ^ª ?$¨ 0¯$€F7ú 5ï;– ‚Jª#Œ>Å"šŸ äÑÉØ ø¸Å2ƒ:³š®!Ù(Za0©Îo»ì$Ðüœ#ý¸>½¡Ú(§™MB½<ÊÐW1*/x,)Ai.»]= Lng`m0€#¼ Ï'³ÊèÖåüôõ „Öû­Ž8¢=´ ä-Ÿ•¨úÆÕ35ŒàƒÓ¶$È%’à‹/‡É ³ö,‘7Þ…¡ Ä ˆ¢¼Èûë‘@Ï;•%°1 ²)q¡ ò'âƒè6º¥1±%ú3eo|¸«@ É;˜%®)Ñ"ú6º¡2¶0¼ð…§?õ“ï•Kkè—4ì!©é¨8¯°:¹¦ ë9—è!ðD­)qëç«•Ú뮑 ¶9ª6¤Ÿ ›Ó¸EÁ•¬ û”%” À¿¾J†FÞ*ÊÅã«I箊ٯ2ýK’‰"ªB䟜=ÿ6ƒ:G¯ùF"§2<¹8¤  Å$Ó §=è ° ŠŒÛ Ý ¤Š.ú=¡ û£ Ê謠 ­£*Ñ –Ð=Œò<ÔJµ)¨MÍ »)a’?º>ñ!¾„BüLO¼%ëSð=÷³—™Ä0ㆠõ.›°ù%Ù;Ó8ç"±L¥!²Lˆ …Í ­ê…„Ð ¿Iãá€4ÿ*ž •ŸÑ­¾ ÐÇ,ÿ ªËÀ †úÿ3©‰ éŒüüþˆñ!ú† …Š% $ãa>%Cí!ö!.0  ƒc‚}¢Æ ‰&  3µ)‡š ™ó!Æ#2鯫Å+ê*',Ü!'êÚðú)‚#¨!g†C„ ´÷Š6—–î  ½#„%ü • È9?ús%¸ù 4ÑA< n\üå8ï4×*ÀH’º˜I“D§>„™·¤.öç¹:¬éë¾ü Ë-Ð7ÂHô9ÅF¤(Ã.ã›=3¢÷5•Cç*•Ié’îýƒ5ô>¶%î:‡Ò<'Ø9»ÇÂG²>”© Î-«$û&V¡ êEÇ—=É ² ÀÀçÇ9ô˽ ÖÉj× Ø ËÉ'ÜB­¦Å$ü:£,ù3ì%‡Î&µCŠ$$œ »pz­ÍL„(Ñ÷)©‡ŽAŒ¬·èG ý=…°‹7ûÿ%ºBÍö‡8Œ"·ŽK›I DÞ2¹à1å3ÓF 5BõFˆ(¨:ã'ì0¥åC Ð0“¬‰$#ü ¼ ¹âÕ ¥‡èÒá)÷¨$\ëF·Èæä‚ Ž´ Ÿü&ÔÕÍŽÐíðÏ ÔŸ eÀÛÂæ ‹ š€ í s1¤‚Í ¼ òÿ’¿ƒíù–‰«Î¶Î½«•K½™þ,"À;¢œí:ƒ @ f]”vab²Ø]Cpô°]Ž•ã²ðfšn€˜‚v¿vø–þ]”þøˆóuÕV™ß¨?ÛË/Ž­A˜¥º•¡xiÞr˜ÍX††æë–km®ë?«Ë°Ž¥t¹FVk£”ƒŒ¥†x»9ÆFIÓ’Ü v²æ¿žä¦²Ô±cÇ¿ÓØÞ›™ƒMA[V}sžTejVóR5 ÕdôÚƒˆª…‰[~ЦT›?CnÄSäxJG C´‚´˜#£|öëNÄü €gXŒÞ˜NVØr•šÛڛ˦AL? Pm /LP™¦·žÐ^F‹¬‹EXDB­¾±šv½k~ìp-M® "J\œß™Žxj¤H±øŸvh¯…·á ù•‰ËÓwžli£»qÙ“£YõryžÉù½‘ÄýÅVGÙÏ¡1  #º!* á7Ï nË!ŸüтϼsÎû&&ðàÏB™˜6sÉA óÝ “) zY˳J‰FÝÔ1›×ÕÚª"ðH»I=€•5º ä„D  Æ'5°0@&— ²-3é-Öìßõ%†#®Ë¯«L‹;·A§!û- ² ÍIã¼èx© ÊÿäÊýÝ/á')˜E« Ñ.¶&û¬Òbó"Šσ×Þš³4Àò2’ž ßâ#ûöŒBÌ… ¼Éò û7¢>0ð% ´È ˆ†ô!’ ê4°a—Ç:j„ Uÿ îÖÎã ½!ç5Å nÿž“*‰$ð7îàM0M³(Ü,ÙÖ%F€³ŠCÕ,Ð)Ì3ÅÝM¸Þä¢8çÉ þ㪠¨Œ •;äÚŸ‹ÛN@N›éˆ6”!ýõ ˜8Í,Ȉ™=ú×'íý§Î.™ËGH@ÃG%Û±[à2 êÊBþ*£¥¿°3º Ô'ÖIJ$Ç® Ã9€=¯'ãFÙ=§LŠ(Èî’¸*ê9µš8» ý­ÎNáÚÜ>ª¤ƒ2+¼ï!³ öÓš,Ü×Óú(©'‰>(.‡0Ñ0(&ÁG­Sª¤5½Mí7å"6Õ˜$”É$äâ úä0qõê½ ÑÞJŽ îì©Þ«ŠÉ:ÂÇ#÷$‚Ý õ £ ˜¨ Ì"Ô"N† · ëÊE¥Gëú3à½\ù¯‹´. ì"g"šH#Ìà ”Aœ7í¢3À%À‚³Lì'Ïø’ ¤>…GŒJš+ëàA¿<ƒ®'×H“4Õ'°$’"÷)˜<-ùÖ'+ &±&"« ~&¥ è‡èŸj&³ž ¶° ï ð‡$²t‰ Ç$%Ó'¨)å#¡*#ň´2¸Î!&¥ ™#Ô (Û³½DÔÞãÝ—¢ “ ¿"Ì‹æ'‡“ ã5Ý( دøHéè“ ‰Ç¾"°®ø*Á"Í1O ¦L­„’¢#ìã#šéIÃ' 3ÞÒ5שKÜI ÚßIÎ ïÊ+Ë’4¾;ë9Ö$ ð1‚-Ô=ê3  )ì«)”7‹®±D¶+ØÈC³Kâ Ë  Ü Ó ÁÕ í ø 6Ø— §@Æ Æ âóB Æ „Í3 ÀG È1ˆ.™¥!õ4 Ó4© Ý4à á †¹;Ã;›Iîƒ5 ï7 Û1 Ð °F®:û í • · ÙÅ ± ¸ & Î é Î ¦ îÂDÞ³&à ƒ' —E Ã8çïE ô ®ËD ÒŽ?Ï ß+Ë £FñA –4 î žEï§! „ þ# À‚BÞF €L ðç(¿á©,Ð Œ–’5‚1DæÆ(Ô(ÓÎ?þ,ì˜ â§-þ"Ö ú›*¡4 ËHËKÎH‰—@Ú»62ÇŠx¦Š°ž˜„ÊÃq§’}À™¢ˆb™tæ£DFûw€qVŒ€ª¡¨Æ–Ä+™ÄŽcýŒw§V}Ô•`¹~\ŸÒ¨ô±ª£ˆýŠozšj‰j¯N¢€br“ìát¼Š°NI{¼ˆ©œšwH*ŠI¯H’“­¦ùÔž—ËmŠy޵_j hñ¼†_¾d‡Gž•=’:C|’@oSõ„{‡P«¦š‰†È+¤¯ŒþvH—iù£ÚÊ—–Ž¢­ã¨î—“…›Ê®¥þ‡ƒ§['£¤àÌmåÿ’¨©¼‚ë­t‹uiZëÚöDÚ˜Ú˜*†ˆÔåõž°º¹¸‘T^x„FbY©Opr>CÙ¿\xç¤ñò…•›ÂÖ·°©‰‰–h@bq”zy©fX’´)¦˜pŠt¢¸qppRF‹±Û†Rc™µ•‚B‰ÃVw‹ Tç”R§t®ñehSC®užoÈg}÷û³Y¥Jç‘­*ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÆÎÿ‡®›¦š*‚N†»r§ié÷ôDtPwms©´¤¦ˆT}»Î¡çŒœ{‹ì‚ïu'ŠÅsKLy耢Bÿ¹…ÙYgˆ^Š´ì‡œøAa–µ«•Ãö¸•LY>}ªUó¹†x¥p€N'–bÕö™¼Ü~˜HÓÃŒ±­Ã—}k¥‘‡‚¨šœˆ`>Îoo:üCŒx©‡“Èu‘rÊ“Q¢þGºob)Ù…qvsD¨Ÿ¢Ž·L©Ì¦àajs’Œ¢ÂúöÃ^Û™éͯšÿ¾—“µ¡°ÿ‡‚‰µ„tQð‰©*núu`c²ŽH¢r°C±\—j@;­ñg—gƒŸ‚vÀr¸A—ûbR@õˆòwlêp™Ý­'¡ÛË»R˜¢vH“£yf‰Rv™µ…íê–kmcq\é‹^ÄÅ¥x™òk¥”n“Š©ƒ¶$¬OMC¡`Ei†¥l}PbqÂfj…lQYY7gJÌuœ©cf;BMžçˆYBµ®Ø´`EbÆ=¼¤cPØ—F…EuB™Ç>PJ{‚PÆ*[W~t™ZbhY§IU•Ý›[‚‰¨…‰Œ]{…ªTžˆoÆeçx‘`x?±–÷FîJÃü¢€g}ZÜ–ºÕs™)>FTBàØáªÐŠ]s®Q“ò»Ñž’¨‹Ž¡Šì²™ó?k€ío’·¾[€ß\=zk¢ô2³nŠ›vi®„»Ý¤‹ú–†cçÖyœlf¸¼nܳ[žópxŸË}¼ÕÄ™à½DDO-”DóŽñË™Üþ>NwJv¨¤”ñV±S¬Ô‹ÌysóþÔl«±©épXyˆŒ‰ŸàKçE‡Þq@?DF'ŠÎQ›“¦á’=BŠÉ†yèƒåý‘¸ÞYf‡]Œ¹ì…Œ™ùÂe“´­”Áø¸ß–€¬Q†ð¸Šsì³vÍ@•dÖô›·Þ€àÓÀ³«Ã–|n ”Œ}¨˜ž† Ðm©Äqª‡“ÇvsÌá¥Å¹n`AÙ…utº£ž¤‚§Ò§Übnp¤¿ùøÃ_ŽÞ–íÊ«‘™d„ ¼—”³¢­…ƒ„ˆ‹µ‡pUð‰©Cvñvab²Ø pô°]Ž•ã²ðfšn€˜‚v¿vø–þ]”þøˆóumèr™ß¨BÛ˽œR˜¥º•¡xi†Xr˜·††æë–km®ë‰a˾¥t¹¹k£”q’Œ¥†x»<ŒÀó¹YàJ¡èÅáƒv²æ“¬žäŒš²…Éø¿ÓןÊö› yƒMÊD[V}sžTejVóR—ßðƒˆª…‰[~ЦT›ˆnÄjäx‘c´ž´˜¸¹Äü €gXŒÞ˜¹Ør•ÅšÛڛ˦ÏY£P™½·µÐ¤‹¬‹ë±šv½k~ìp’ó\œß™Žxj¤ôK±r†Ÿvh¯…·á ù•‰]îÓwžli²»qÙ¶YõryžÉ…¶‘ÄýÅÙFÜîŽñËØ‰Æs­—ñ{X±U«ÔŒË|põ€Ôg¬µ¨ärWzŠŒˆ›®±}„â÷D„PÒ¢Ž¢æäÙ‹Ç試vŸžì¯¥Æ»¥ÇŠ£¢å²ÊNÑŽ¢õ‡¬¡‰ˆ›Â€¡¬°†€­÷Þþ‰Ú­­ðŸéÒÊÙ´¡¥¶~sT‚Ùrœ}¦©åpžÑMu¥‰¸ž_z{tgjÖ€v€tzŠrVtŽ¡¼lʤíÚ·bÍ6›JÙ6•Fø#¬ ’&úû6ô¸Ù¬ Ú‰Ó âÎ%”&å)µ*êöG ù÷ ¹œ!Ùâ¡#€ ¾ á* Õ6à «;ÿ˜Úä¿úᅵ8ó)”Ù€á=¸ì «Ù ¡†-üÈ;÷ô% —¿? \Ý$ ÉöD¸/:þF¹²2™ Ò;þB“)…7ýœLÌ?  á@ ÇËÕ? œI ¾; ô € þ( .  ×+á+°Mò‰0›Lñ> ¬µ õ¢ Ó: ÷ ÿï ´+… ÙE ½MÆ †@ù ‰Gë Ç6 ˜A£AýøœCŒ8 ‘ Ð"Ù ü0 ¯  üIÅ Û9 ‚ì>Ü2ŠHÿ䣋 äFÅ7Ø œ ð ŸB„ï"ù%Ï7 ™ ¿ ŸB ¼ ¬-ž0‰3–Þ6 Ñ!† âHä„í7 ¼ „‡( ‚3 € ¤ÜÌ0 Ì!…À% ‡Ã: ˆÃå· Ÿì Í*ëíá,ë+à»+ Ô õ ¾+ ¦¹±&ʧ1àÉ@ È Æ÷ÆÝÙŽýÛIÍ©AÚ7Ò›Gë µH ñÍ0 í° a „ Ä"°Û=ø‡Mù3:ÂF•‹JˆDÜ=Øå¬žB„ †»ß ¹#ÞÔ™ ÆKÔ<„±ñçîý7ç#Ô=P•/ó='  NwÚÉ)è“LàáC»ÓZ"÷7/€"%ëõ ,Ô¢'" °0ðf†E¾Ñ*Ù>¾)AÞ ’ˆNå=à ¬!Þï(z Æ÷%»ÝD·¨. ÃþEü<@æ%ö0–áˉ"µÍ7ÝØU!ÑÑ¿8‚íË‘, 'ê '¨ô'à@é8Í„I?Vð&Ð,ÏŸ¾6ç-  ï= @ú+ð•b¢,"þ ŸºÎ¸Ý³>ã+¬ Ê©A¬ÈE†–7F©-ºNÚ ËþŒÎóÏ=ε›¯AÖÙ@‡ ú ‰ß £ ÃòIL‹J¢ÆÁéŽJÅÝÍšúÉæ¼¨öúöå è ¯© ¬ž?C–ˆ4¾ÀLAEÜïCŦ*´ >B@‡¨EA×@ODº ÷Bä„A‡œ?ä¹ ×ß© ¤î–=èï‚‹4±"°ìÁø$ÊJ†œ5èA¬à-¨˜ $Ù"– Û,Ù4²í…¿2”:ƒ Ç;’À$Î Ý Û-ñóô¹3ž°­ ÎÑÍ ò2ð ñ¿ ù Í9ƒ«½Ñ±Jìö6º÷K†7«¨$Ž$*"ÂF;ZÞÝÒ!=»“Ÿ ®. IV”P¤+ ÷;?”ŸG⹘ò³iÄ6¬7ó-†&âAÕ ùK†!ãI¹ œ+…=æ ·„Ì Ë´À8‹0…åDJÎ$ÔÅAÿª*扗 ðôAü á¿+à¿+¹Á Œ·.ÃmXëFž2Ö[ó@½I6 ú'2÷)䧪û=š åú-°{Üú Iô?¶ ø†ý"þÁC”³Å$¦$î?FÓ=ûç»@µI×;þË>M:ŒQà š)ƒ¤@ˆ;3LOœ3ç ‡1®Œ ± ½AË þú1Ëî•9µLൈ?»ÎÙ=¶Ã)«+>u{D§· ‘>² » 7Ä8Ä ÒK¡%ÆúÔ+—ô ŠEµ›LÇ„ “‹Ùš .¦ÃJæÙÂ2ý%¾V/N’¬,Ì„ çÒÈ Ž–~÷þ9Â>¸é?êœ@é Á‘¡¬IøCà6¼ ¶C¬& ¼'¡'ñ Rž í0†/£8×@H1µIrýÙ1ë2 ‹€ö8û*Àè9è¿ïæ³1´%—öCóJ’,ÍËŽ8« £â èMÊ ¡,¨ ±Ö'*:$A±2•%ã ó9êuØ¿6¡ ˆ;§œ'™©ÿF Š0¦4ó1ºÍ‡_ë ¶¸xš& µ ¤1°%ù3eo|ªAÝ7‡8ƒHÅ"¤(¤G-–"gGùIö&í é=º6 ñ 'ÿ¤³&±<€ ÑHêEä*øAê6—;»:Ý$×%ƒ Þ9çì;¬ ¸ˆˆ ¢-Ä„—,ñ×DΑŢ8“C°Á<×"Ÿ"¿œ ²ª¸cë¶òòH®Šeœô÷œÉ‹%Õ Ó±Ërðž%à÷Ö¼™ÿ˜‡'Ú‹Ž#¥aœl;oÄ÷ Âá*Ëá„£Ôõ÷¿ãò%Àò× Žª+ˆò‡1¬™Ç« ùÐú‡ÿ)à ¿áÓÌyuò"òf|œª Ð ÷‘XNÉ¢ ¼ßÉ®×+(á@ßà<€.ãʈ"§„ï)£´0 ;ƒºé ¯ââËûñ鶯Û#€Àì*—‡„3Ľ®»* º²ÉEöÔ­ˆÒʆ®¢ ÷©º;Üå¦ÕÚ ½.¸›¹.Œ7 Þ‚ˆ³"¹ê„¢ ¤üàHþ Ùø nÙ…† Σ '˜ ÉÆÓD¡Ô û%Ø=©*È¡¡Þ–@½Kµ=õÁ¼)aÊõ)× ¸–6•°+¸ŠNΛ ”Úë­ÆB©6°9ž Ó °ºÞJ;Ÿ ¾Eí Þ2û>ħJáD ®B Ð –®& ) ™9´ŽŠù ‹ÃB@ Ñ Ôí7Æ!ú ï ééð˜ 1 r GÛ † ô9Ï ª Ž: §0ª «¶H É » å®!lÇI|ã Á+ ©5ÅE® Ø ßJ£ £" ü–ÊFã ¨5÷:Ò% ô&‹K°$ £4ï ©® õ"  ª' ‡< í!§9û# œ)ÕL÷D¦ Ä À°$ Ï7 ÈKâß õ&í9 ÎÙ­ 7Ñ=â1Ø<Ï œ6 å Í" á7ö&¿=ÁÅž7âÚü?… lÊ*˜ ¥JÑ.£'Ÿ;Þà yØ xŒ,­þ#€ý²g ÀÖ¦óÜ Ì ³#9‰Jà 8È;Zʼn ÷: ÑI™*é;( #BE-U Ì… ãá7£Î è&:ÿ# ’š0ŒÃ#ì7Ç õ'ù9„:†þžÕ׆T$Ë) 52ú n$¼:Ò !Hî ”› )àdÁ å§ å ½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³ßÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒšÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšãu¹«NNx½ˆ«œ”xJ<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št…=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆZ[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›øš1žïqw Ë{¾ŒÎøÆ™ä³NAE“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œ ‹•Š“M ­õ Øñ)î É"‡ Õ,ò$©K ­ˆ$©µ*‡)Õõ µ$ ¢ý$‹KÎÒ* ªH¹0•›¾š2ÿ@ ™G ¸æ ºœHÝ,€ëçÐKŠ–,Ý%é i<Š=ý‡ôHØ8Ä–$·ÁÈ ­;ö ç ôÑžGÂ. ©—™Mì ˜êŽ ‰ âEà ×( ‘; Ã!—&Ù¬1º¹ÜMß3·%‰H ò" ´0 ð ª  å,±D Ñ4 ÆšÓ»Ñ+@Òé8‘ Ð.Ù› ¹ñ#ÌøË’ % ß ¦5‰Kæ/ÆŒ,Õ¨0¸—Hë9ë ™Žª¦æú&°' á) —0ÿõG Æ12Œ# Ô… DÆbÂÊ÷BªIŽÙ û( Š —ü³2¢< ò6 é¬MЍ Ó* Ÿ:Ñ Ì? ‚% ŠCÀ޲G’ Á € ãø —ºãñ* › = äø ÎL„5 îÐ íð)ô2þ2æí,ž ŸÇ4 ª”ª ÈŸËÍCã' ˆM¾œ ™ Ρ ¦4 µ@“)ŒÍ ¡0 ­'»™™ ƒÜ ðûÀ±°&ˆ5:VŽGš Ÿ £A˜µK… Ÿ ¨ é â)ë “ Ù ²Aì  Â‚ ¨:€A¦* Ð+Ò2ÃÙ+„¤5ÌÚ1 ¥D O¬Á*ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢§Ÿ¨–ô#šÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¤ˆýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJ#ŠH°H‘’®§ùÓœšËk‹zŽ´`j hð½†_½dˆGž”>’:C|’@oRõ…{‡P§ªš‰†È$¤¯ŒþvH—hÀº£ÚÊ–—Ц­ã¨î—“…›Êª¨ÿ‡ƒ§Z £žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’·‘˜Ú˜#…‡ÖåôŸ°¸»¸‘T]y„œG NY©Opq?CØÀ\vé£ñ󄔜Â×¶°ª‰ˆ—gAbp•zxªfW’´ ¨˜pŠs£¸qppRF‹°Ü†Rc™´–€ƒBˆÄVwŠ¡Tç”R§t®ñehRD­vžmÊg}õý²Z¤J螬#ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÅÏC¼‡®›¦š#‚M…½r§héøôDs‘Pwms¨µ¤¦ˆT}»Tú£ç‹zŠî‚ït~ ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆxé¼pN •cÕö™¼Ü~˜GÔ˱®Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒwª‡“Èu‘rÊ‘6 €F»ob Û…qvsD¨Ÿ¢Ž¶LªÌ¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆª#múv`c²I¡r±C±[˜j?<­ñg•iƒžƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­ ¡ÚʽR—£uI“£xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“ˆ«ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJ{‚PÆ#ZX|v˜[bhX¨IT–Ý›Z‚Ѝ…‰Œ]z†ªTžˆoÆdèx‘`w@±•÷GîHÄü£€g}ZÝ–¸×s™r!?FSCßٗůЉ^s®Q’´»Ñž‘©‹Ž ‹ì²™zø@kíp‘¸¾[€œß\>yk¢ô*´nŠšwh®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½”ÆûÄ™à½DDO&“Dôò˘Ýý?MwJw¨¤“òU²S¬Ô‹Ìyrò€Ôl©²ªépXy†ŽˆžÜMëEƒ„Ý‚pA>EFŽ ŠOÿQ›“¦á=Be3’4¾çÅI™FçD«, Î0ÀI± ¯$ ¶ ‡/¦€Ø£ Å!Õ ßÎ;þž É!žº0£È0°XÅ(°D¸ Ñ ÐI®C »Ã5éÁ6ÏëøLð, ±”L¹6 õZúº<¹K ØO‡ '®úë&ñ@œ$¢ ¨@Ø öB¥åð1=ùGžËÍFõ*üAÓ7”C‰Á! „HÜ¡CÛ"€2ï¶?Ú ¥*ƒ"Ú(‘¹!5Ã=Ó™(Š ƒ Ù( }˜ ¡×Õ  Œ$ ¢ð±+U ë&¤‹,7íç¶ç7Ø:Ð+2Sy# B.ò+ §AȽ-à8ޤÉ&ÌÆ&3#—' òAš‹€Eï²ã$šÚ‰‚ÈôhXÞÄîÜØa¾¡–Cê§5ªä˜-ÎF¼ã7ºÀÉä*Á³‚é »è7ç/ÆÙ´ú‘ôzа· Ü‘€ö¶¿³Ÿ¿1¦Ó (ɧ>ÜCò·)¤$¡íFâ/•½­ Í"‘ºF²M8$•$°‡ Mú7c‚&¤.ˆSç3"¹´ûÄG‹Í¯E'Ô"³½ñ¢-Ìjgô øê3¥ŽÁ-Ì¯È ½î˜ ûîÕ-Õ8ÛqS¥= ö ”>GÑHõ.‡ wó"ÿ‹6©D½!nº'œÁ ÝÙ,:ê ¬‹ ùÅz¸¡*²ÙÊ.… ¡%#Þ,+3üJJ½½1K¸ó%‡' ŒX–.(‹ ©C›¦Y´Û'ª!Š·¢°<;2ó$¯†(*/Ë$ :ã’4<§4ZÕLè78"ØK4©Ðº šI÷óM·8ò='IÚ‰ÿ'Ž'$+' >5Ï‹ äµ…B¸‡: SôÀ»×𪠄)¦Å íÍ<ÛB™!ª'ãóò ÿÊŠ5È2*¯ÈÞÙŽÓ+‰-̆'…2é ß ÷9– Ï=¦ ú=¡KË¥Ê øžŒ'Ohë3”)ðʲ®¼D.4#.$7U…&§;À«(•@ÍÐHûA°ª/¸õ9½-³/ôÜê$ñç0  3 ¤d!",+) '07Y(-4:%HLR$™Ã2ݤ0±,Ø;îä¢,*Í:úåE¢<þŒ=ŽOt^Vº<»Jø<κ'ŒH²LÇ =¡ Å!×ÊÞ*” @ H-ø^Ö¤4ö4²€ Œú‡2³[ …!¯Ffší"Ó›ˆÛºð)¥?‘ ÁšÒí Õ!›%Žé”+ò Ä5 À!>”:É ì ˜†«’‚F–*Œ>EØ?ð3à,¾J 鯩?‹Ö.ü'Õˆ=Ó» œ5‹Ä$ÁøÓ!ÇE±@ë*P@!iÛ0( › 0µ+»-¤ ³@„8¹GN20+`ÎI à¨2Ä>¼ð‡· 'ž ÌŽJÀJs±~'²½7Ð"™8ÏÅ÷Ò)—8õá¿J櫲´"ï!ñ î á“:Æ ª7¦(ðB±ô†;„õÅêCÿJ”¤0È-¦Ô.ÜÜ3B¼ý¢-Ø ?¤Eˆ‘­“œ;Òs¨I…@¡ç» ‡ø1…=k‚KÞ$ʼ!Ü œÜÒ3‹+ó ¨ã,æ)å W6³#ÕØ!5ö< ¬:>C+©;³¾8”=½È Ý&¹*Ћ ^µœL·îAü'ˆ:‹##í±¼.ä1­'º;Ø!ƒM=¥M¯@OÑ-³+ú õ’Kã$ÌDô&èDÌHë4œ,º›,ø&qÀ)ª'ØËš´Ó ˜4ãÅòYØ03bŽ(ô ‡(… ñ3â5  „ -¬Ú âÿ3€ï!Â5£™Ð$†—é>B5£>”½ “(ø)ª ä!1ÿÜË)•"ø ºù¯Ú{‹è—õ À™ñ ¶ ƒ™¯Ôü Ê ú©“!¦»ÕÙ‰K¥º_†Í Ë „èè וÔÖâÁÈ ¶ á%þ Çô ãÚÐ/ʆ¸ òô8¨B'ö¸©-¡Á ‰Ò³ Í æ½Wë¹—âN_…GAPìÒŸ’¸ŒÍë®2Ç—Í5¹ €¯Û· „Íá3‰ŠçšÀ ¥ÔÌ%•bòˆ ñïö‚À“‘° À°‡åIœÛY©ã Åñòèõ —¤Å"ÓëèÇñ‰•ç ŠÂÆµà·¯û æ òÛÛ¡ÊåCé=ò(÷6±²ö2Ô°9/²>5¹;º>-©?¹ÈŒ€Æ¼½A¡Ï  „G"• 8X m ÉÀ»ù¿×C(©M;Ó#¹—Ô5­Ž(NÏ@õ7³ˆ Á ë'=º—ˆî#͸+Ÿ$»0* •:­!Ñ …%Þ Å')4Çû± ¿ù9¨Í3 ?È… “‹/ÄJÿ¹Øóîÿ+)Œ(È+fClŸg¤ n¨8•ÄEÂ=ŸÄœ·ÙøÂ"'âK–û¡1­ µ¼E ‚(%Ž(!èù6ºMÎ   ¾nÈŠ´– Ô¯ ‘„'ÞÏ!‹-Á ’ðÏö€Êñ";!3 “$í@¯4ÞôÄòÁü†&Ù¯7Å âõ ÆŒü” Šê8ª³ îß—æ!Œ¦SÄÐ ïÄ´)áKC®:ø0‰÷á*ë>¢’9×/ñ ®FˆwÓ5“3€ÄKgì ÑB¢1¹­µ ç-^æê§ò›& “1óFÔ4û Ò?5°#šÈ­:¶Ö«*í¬¸€£ ˜Ù(ÚM–ÂÍ/ª°òù'Ž1¾*›ëʳGñLÙ!ÔBb¶;ô ¹ ´¤Ô/˜C¯Êó1‹"²HÄDžü˜EÍá>í­0¡œ"ü(ö ØÝ hú´GžIìGõ#܃D)Õ'è¸ø%² JÇâò¿:ßF‡ÁÁ$S‚(Ë ¸Là«Có(˜ ¼%™ ½:Ç'å9ªÐïuŸ93D¹LÔFá­¢$ C§å•;ð?Q8’Bwt07H09%=÷â š+Ü'Ìß'&Ô,¦)˜š1ZÉÃØâ1À¸ ,ã"Þ(¦ô,Bœ ß~ˆ1  «.¤¦ýŒ#‰û'0-© «¾Bó$> «× Š:üŽ1É+ ÁdÌ̃CðDá$Ò$ö‰%¤%™;¢"ˆ?ŽIóîÑ5ß’ßøHP‰®gvAPì‘ùBå3Éå*¥ «;½ À>“=µÞ´ ÂG¨Ï)“8¨I ä>›!÷ª›2à#©î)ÁGÙB66Ø' È;Ô¬E!7A†Å<”-ôýHPÚ'¶/‰Å$„ﲄÓ9¾<ã¬S»Þðhõ&ݶ·Ië!Ò69‹8ÎßÈA—ÞJòöÿ3[g|†G‡Æ· *è ã$ž!™ø Õ }ô—ˆ™¬ y®² ˆ¤ ãœá ¾Î¹‘ Ž· Ç׌ƒå® «ƒ³ D˜ÖºÎÒ ÃÚ×ê4ÁíËÒ§Uެ²T²ì›¾ð J÷]òäõ –× Õ”ôð ä ý»óhv„ WÆÂ» ºÕù±‡ñ÷#ª —호¾×ôŸ»¦ ¥©€bdzö éÛ\ꄨBOÊ…­ ±—Ô˜ õ– C)Ÿñòñ¤ ¾ù¼Ò÷ö¯ ¹ÜªÞ¼Æï‹¨ ¢÷ú® €Î‡‹ >¹ÀíÖÚù0ŸDžÇ .Nxo¶)Û _¼GFü’€”Ÿ|šÂœ ³óîµ£øûõ ñ Ôëo¹EŒnÉ Ç;Wü̹ ¥¸ Å´ ÏæäPͨ rÚLÉÎÊ"–JÙ2Ò¡%è"ï û¤úÛˆ˜Ý¢I”¯/²šùÂGþ©!Ì;Š Mý«¸–%'â²ýïæ6­ï—)Ž+‹²#œÈâ ¯:¤¸¹ »!›)! Œ4žË7–)ÇE¬A³ž'“Í ¤L¥ºE¦A9–‘ÆAúpS ©Ó³Çå°\¿ µó ßÑ ²*›Ë ½5æ „–MæµÿB^¹´™"Õ²Nµ¢‚ íFÿ?¥ Ø5‡L¢Ù² ïÅ1•5‘ ²)´ Ž3î ÀÐ&¼¨> 4ë¢D½Fâ§ž8?UÈ, ½'&Ó±#™›È®:©7Ù!5—‚ (Êå*¥ ¹çDöKÙ+€C^í:Ü0( ò=Ý3ëuñ+$ï#÷5ÛA§åJÕ ù¤/¿>«£#¥3à˜'•ÛL ¹Ô I£ ˜ Èò;˜à-Ï­±FÂûlÌ(¶J׸$øØ´Bó.èå øß×!€8·3Í!ÓE• ÝHÉK¦<é6Ï À §$Ú¬ ¹2&Æ3JŒíŸ¶ ÞçO6+6/5ÇŠv‘á°‹›z“|žq¤’x²™D__”mâ„ GFûw€lQ†¤ž™ ‘¾¯‡—¿Žcý†o¢QxÔaŠ´y\šÍ¨é®¥¡ zýŠiu›e„j©I£|^m“ì˜át·Š©IKvºˆ«œ’pEÇ®EŒ‰£¤åÓ—•‚zޝ`a cà¶Z¸a„Á›’@Š|Ͱ™ð€v‚P ¦‘„z†È›ª‹ÿtE’c¶¸š ÏÇ‘‚¦’̣€–Ê¥¨ÿ÷þ¨Q£žï‹¥ºýÅlÐá——©½üé¥m…vdNÞ¿’™¨¨A’®ˆ˜ÐŒ€Óåô™­­·¸ŒO]t„‘BbT¤OpóØÀWvÞŸæ è„‘‹Â×±°¥„ƒ—eC]pus¥aR‡¯‘“p…k2q¸lpm JC…£ÓRŠc™¬…ó‚?À Kw†›Oâ–E¥t­í`cLC žq™mÊb}òø­U ?߈‘™ò¤¿GCDF¾HEØ¡éÖ‹˜ ˆµ[°§Ë¸‰•¿äÐeØär²ÊœE´‡¤œ¡•€=ú¸r¢\ ÛóòAsŒ‹Kwmn£°Ÿ£ ýOx¶Lõ|z£ç‹˜kïéöïtvŠÀŠeꀠDù³}ÙY[‰Y:D¥ìˆ‹™í¼\‘¯¦»ö¸IW@}¥Pî²ìu Û¼kyAWÕè—¼×~ÖÔÀ ¢ªÃ’}k¥‘‚¢›—ˆžÎj©úB…r§ üŽÃ\rÅÒ—þH¶j]Û…qsqA¨ŸŸ‹¥F  Ç¦à\es’Œ¡¿öö¾Y‹Ô•éÌ«ˆ•eš¸Žµ›±ÿ‚}„ˆµhRðˆ¥Yòv[c©‡ ;œ`®@ª[ˆ“h;;­ìg]ý•}vÀm¶>—ö]M@ïù‰íwfæj‘ب¡Õʵ˜M’  iD sg‰Rv‘·€èä’fh¯å†^»Ã rš´¶f¢n‹÷§ƒy´Û Ô ¢çìʥ׫ × ÷PÆUXwq“[bhU  FO–Ú “G~Š¢ñ‰‡Xz¥O™…jÁYäxŒ[·±~¹éH ö£€bxZŠØ–µÓn”m‚š;™¥ª;—¤;ÐŒ8T“E¸ŒŸÀysOlØr–yy©ág—;Ql¤ˆ©•brœ|todgÑztzrr…tQoŠ¢¶gÈ÷Ü>ªAPµ]Í,üà3Ê7È Ã:®øÀ ÷Æ(΢BÂC‰ λªˆÍØì3üâ) Ã3› €- ®" ¦* &³ ÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´Œ šÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšät¹«NNx½ˆ«œ”xJ <¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È ¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S £žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò— …„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳0ƒ§‰ˆšgA_s’zxªfWŒº ¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬ õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št …=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtx ŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E ’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸ob Û…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§ ^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­ ¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy· ¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®-VTµ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆ Z[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r @CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø ½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³^žïqw Ë{¾ŒÎøÆ™ä³NAE “Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á– ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@ @¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_ŒDòÄ|¢ˆ´Œ˜ˆÈÃn«€¿–¦ˆb™Št盂¬üwƒqS‹„¥¤¨žªš½µ>™ÅŠiÿ…~£SÖ‘cº€Y Ö¥ö°§£ˆþ‰m|›kˆiƒž}cp–ìátºŒÆ{Àƒ«º?Ôõ“‘¯§øÓ™œ¸‹y‰´ao›m_ºhˆÄ¡Ð‘}ÑÁœõ†z†Pƒ©¦šŠƒC¡®Œþ»šhÀ¹¤ÙÏ’—‹¤®ìŸì™‘‰˜Î©§þ‡„¥Z=¡›ï¡Ÿ¸ˆÅmÛß‘­§¹†ë«srkbãÅ–ž¯ë—²ŽžØš=„ŒÛÝô ¯½´¹”S\w‡â_\¨NtñÝ·`yé¢òòƒ“žÁà­®¬‰‡—¦cr”{v¬eV•³=§—ms ·ulqš‹²Ú…Pbšµ—ýƉÂVwVäë¤r®ôbf•²sžpÉg‚ðý³Yñä’Ÿ®?ô¥îÛß¡ôÜ…•£ŠÂZ´«Ñ·Ž‘ÀðÒoÛærÆÍ߻Ы¥˜?ш²u©iîñ¸sŽO|lq©¶¡«Úz»Zõ|¤å›Ž|‹ëŠæu†8ŠÉ†zç„åý‘·‚ÞYf‡\¸íƒŒšúÂd“´¬•Áù¶à—¬Q‡íº‰tëµuÎ;’f×ôš·ÞàÒÁŽ´«Â•}l£“‹§™‡ŸÐmªÄŒq«†”ÇvrÌâ¥Ä¹na;Ù†stº¥£‚§Ñ§Üamp’¤¾øùÂ_Ý—ìʬ™e»˜”³¢­ƒ…ƒ‡Œµ‡qT=wñuac°Ú pô°\•ã±ðf›n€˜‚uÀv÷•ÿ]•þøˆòtnéqšÞ¨=œÛ̼œS˜¤º– yh‡Vs™·…†æì”km°êŠa˽¥uš¼¹i¥“p”Œ¤…z»7ŒÁò»WâIŸêÃãÿx³æ’¬ŸäŒš²…Ëö¾ÔסÊô›ŸzOÉ<]V}tœUfgYòS—Þñ‚‰¨‡‰Œ\}ЦSœ‡oÄkäwcµž´—¸¹Åû¡f‚XݘºÕt–¿šÜ̦ٛÎY£Pš½·´Ñ¢«‹‘œì¯œv¼j€ìp’ñ]€žÞ™yj¥ôF±q‡žuj¯„¸ß¢Žù–ˆ^îÏzŸli±¼pÚµYžõqyžÉ…µ’ÅýÅÙAÜîŽñËØ‰Ær¬Ÿ–ñ|W²U«Ô‹Ë}pô€Õg¬µ§ärW{ŠŠ‰œ®¯„áøŽ>„QÒ¡Ž¢æ‘äÙ‹Ç試u í®¤Æ½¥ÇŠ£¢å²ÊIÑŽ¡ö‡«¡‡ˆÂ€¡¬°†€­÷Þþ‰Ú­­ðŸéÒÊŠÙ³¢£¸}rT„×tš~€¦©åpÐOt¥‰¹^{œzshkÖ€u€tyŠsVsŽ£»lÊ¥êÝ·aDЉ´—4„ʦLß?Ö Š ÿ¯I×$ BüÄÚC¶ ‹œLã2ð#Ö œHüJ Œ)®> Ù–D‘Œ)¿JÑJë î–)ÿâ› Ž šúà à¾8ð¿;¢é Ý š6à)—Ä8ˆ¦ÕØE¦-ÁÒÇ6”ºòŸ´Ñ°ñëòðL )ÑÈ(0‹Á §´Kì1Œ³éAí-î*Ò<¼Fâ$µå£C Ê7ñ … š Ë ­B½¯B ‹× ¢ ÔÁ< ê$±þ1 ˜5– —,Î € £ü µ ³L¢$öÚ6á úIì é' …JÇ á2±6ίLÚ?Þ³2· ï7­ ™)” ô:ω#Ôò!>œ#ø×¥ÒIü#…$ü¯ €G¤! † ²Óô/–5¦D š¸¸5 ‘E û,„=¥:ÐFä>ޝ‰¦™0â°B  Y Ñï@­ äÜ/ø/ © …5é(ð*÷&Ü(ç(¸.üL ÜE.Æ ±$»$¸/…þ À$¼. Õ:ØCæEºBß:§!Ï/ç) ð é9ö1ïA©6µ6æ9 Ž2 ž©æ "ƒ#Ø ´GÚ/Ä:‘ŠJ€Ì¹-ð* ´( ùBŽ û<…?ï“1„•2øÓÙMž$;ÏGÖŸ Hß Ü&½ûÀ7¤ˆ<‹ ˆ™+¿¦A¯×ÿ1ѦÀÛmýYí“ Ü Ó8Ï­ÀÐÄ Ù‰z³‹ï#êA‘7GŒ›<·¶uÖ)ô ýýÚ êå x¶ Ï÷=Í é±BÇùÍÙ= ­ñC€û" Ï ù2ö* » µ œ è Æ‰ùI 1 Ô¥¦Ë  Ù €ˆK¸9¿D´ ý% :Á ì÷êJ‚B€“ å ˆ8 ó/Ó ©Ö§; H a ‰Û«6îG9®å5Ÿ5â8Ó»BÔÂ/Í/š4Ô<¦Aµ¼ï…(Ê? ‹C ëAÒÅHË*à ºÊ Í/ ÄIÎI´0 ª ú. Ö ‹G Õ8×å Á-þ.¢ôóLÖŒ µÉ!&ó‚;¸:¥Ô Ê…©"À*·Ú7ˆ£/·/§$¹I!Ó ²û3,€‹‹:ÁÀF²¤.ù)¶™È"02P2ý'ÃwD&áæ2Œ~oŸž1‡$«8€*«AÍØC È1å óñ.I€ ߣ4îHÎGˆ¼$„©Ü+.©—!õ0ð „È °(‚ý+‰B˜K#'žH‡Ò 6³)>ñ'¡5¢$ú0²Kï•–®®"Б´ïüK3" ‚ù Ð2ê‡1’?Ð#î€ú¥FsŸ@þ#!!]º ™±È§Ò(„²² é <¡ ‚ ¸#“ËóÞ áÇ €(ó"ä'•Êÿ¨ì·6—.ĨK…<ˆ'ß(+©7À8ƒ+æaç ƒ2ð %ü Õpë­Üø á’SÓ8‡7ç>â"Š-Í.&IÀá?¤»ÍŒ8×ñ@¶5ç¥Ö-˜%(ÙI€4‡§_¶5¯1×Ù Á˜Þ"¤4¢3Þÿ(ž1Õõ…¼‚ ·GÎDÈ›) Á3ëƒä ¤#ÅWãG¶/Ç÷ ú1»àŽæ7È ™€NÜ=çç)ÄÃ÷IÞÀÓ ÚCÁós½ „Ë‘.é ´ÊØè4¡ ÁÇÎ×Ò)²Æ„ß,Ãdífµíðäñpû,”•” ú %Â(« ì%ÖƒÔê#À¿è È  Ù/P“ý½E åæ$7â¡&%ÌHì;ÍåM¹ª8÷Á ¥Aì¬õ(å Òõ¾ÍÝ5ðMŽ8¹Ý¤AÉLªÒB¯7¾¾<¤J®ˆ ÊBäG·Öå'ÒÈ+µ!Ð4‚½6Ÿ<Ã" Í² Z¦ Ž #Ý)ç=ÃñòÉ$Ȭô@Íå*¥ ùÏñ>ÒGÅG¾!†žÓ•!Á…L±¼1K¾D°‰;+¶ªE%#tÅFð7üèC²5öHÉBØ!G#áD”<þ“0½ —1å í N ´œ 3Æ2ëFìuÝä Õè:5‰$Œ0óµ/¼8€*ŠâóõAâý9¦2–:\¬ Ö ÛDˆïÍGà5Øòâ !°Èç$ §(ÇA¡5ÌJC—Áî1î˜Î½+æGß$EÝç(ê&Þõ1­=Þ'õ+9ž‡0 ‘?Ì ¤qøÄKrŸ(ë ’½L©"‘…G¶ ³:ð¯A׺©‰ûõBö¿2Û5ïA†¼Þ&ù­“‡!6"mÍœ&#?B¨9«9P|Ó'Êù7Ö$”ÿó‚÷ß+y†5¯‹ï ÏÝ9æë;X« ·‡¡-½8¨(Ø4‡=ç?"ëI"‹B¥C¿'¦#¾"­ …Â0˜(ÃA++#!½Û€á¨ç/¸-¡BYŠ.¸ ý³J˜Ì0Ç?Fš òI½Ë í)ñ ¢õÏ£G[œ¾"Î ‹ © ¶ «¬«dú*Î ×!ÚAQ•–0Ð~Gæ×‹Ççßñò¡< ùDó"  ×Ö á è —?=ã ® •E¡EÝå*’Ï3ÀEƒ+ÛL¨¯5û$ “¿, ÌË/ Ä Œ0( ËI-².A¿×Üê )ª² % S¡ ?XãÙ á ú¬ÎHü´ ²Õ·™‚N­ñ&×)„¢: Û3 ú3 Õ ª'›Hâ)³'ÎÜ ÿ à ÿ…&Ì Ã+ªMÏL¨4À=ø* Š$Æ6”ã ØIî. Ê% ÂG ô=ò6 ¢ ª2 + é ´= ðA ® ÓH â$ ĨJ¾ î ¤ …' Ð ù&ÛåÒ ãH¯ µMí¶/¶Œ# Ï ¿/ ß$ÌŽ¯Ï+ À áK ½;ˆ½&Ÿ9 È" £? è"¥G£% °G÷, Êÿ#缫ˆÞ&ö8kÔ) ™4 &½A‡,ùÿŠ* Ñ7ú 3 Ð † (ï!ß!ÕÄ!'±Ã!'è ª Ÿ Ρ;ˆ‰Éï1´!÷* 3Û0å0«ÕÙ°›³óˆ Ǯĩ:ʼn‡8ùJ Á!'€: ù Ó™&ï«â=ô‘¾ NH  ÔR(ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢§Ÿ¨–ô!šÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¡‹ýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJ!ŠH°H‘’®§ùÓœšËk‹zŽ´`j hð½†_½dˆGž”>’:C|’@oRõ…{‡P§ªš‰†È"¤¯ŒþvH—hÀºàÊ–—Ц­ã¨î—“…›Êª¨ÿ‡ƒ§Z£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’·‘˜Ú˜!…‡ÖåôŸ°¸»¸‘T]y„œGbY©Opq?CØÀ\vé£îö„”œÂ×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qpmUF‹°Ü†Rc™´–€ƒBˆÁYwŠ¡Tç”R§t®ñehRA°vžmÊg}õý²Z¤J螬!ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÅÏC¼‡®›¦š!‚M…½r§eìøôDs‘Pwms¨µ¤£‹T}»Tú£ç‹zŠî‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆuì¼pN•cÕö™¼Ü~˜GÔÈ´®Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒw§Š“Èu‘rÊ‘S €F»obÛ…qvsD¨Ÿ¢Ž¶F°Ì¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆª!múv`c²I¡r±C±[˜j?<­ñg•f†žƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­¡ÚʽR— xI!ˆxg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“ˆ«ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJx…PÆ!ZX|v˜[bhU«IT–ÚžZ‚Ѝ…‰Œ]z†ªTžˆoÆdèx‘`w@±•÷GîHÄü£€g}ZÝ–¸×s™r?FSCßٗůЉ^s®Qű¾Ñž‘©‹Ž ‹ì²™zø@kíp‘¸¾[€œß\>yk¢ô(´nŠštk®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½”ÆûÄ™à½DDO$“Dôò˘Ýý?MwJw¨¤“òU¯V¬Ô‹Ìyrò€Ôl©²ªépXy†ŽˆžÜMëEƒ„Ý‚pA>EFŽŠOÿQ›“¦á=BJ ›LЃFO•C¸š§{EysT}Ýr›~¢¬¢DnœŽDQq¤·œbwœytilÖtwwŠtVt¢»l€HÿåC¬?RAIµb†ÛÁL Ö«—¼ +¶ ¼0œ2˜86¾F Ù àÐ Ð ¨? ÁG ©àA ©> Ñ7 Á …:Å&ð>½Bë+‘8­í7›-‚ ´áš ÊÐ¥-ü ˆ$ö'«BÄ ¶Bô ËC ‡:ÁMÀ@ú/ ™ñ@ “&òG ë €-ªùU2·¸!Ž6Ý —!‰ ډطMÙDà,óÊ!“ü † éÀ욣¶É;Õ*3ãë!íò6®¡†“)ÄjáIÞMžJƒ>Ì ÎÕ¥–åö†Ü ‹… òIƒ9—%4ø3Ú9ë"‡ßº rÆ·  Ê–î v‘Úv±Â)ã·ñƒÓ9˜Iñ=ÎîI×?«/-¼Ñ – <ì]Q#é±B*+â³H1é-‰ àË!‹œ¸¬â:¨Þ‡ Vqí2 :8*Ž~z²A‡FËG^¼¶/»žGŠ”‘!¸8 Êì8½«I¼*Lµ±9Õ4¿*+íŽ1‘ Ší1óEñ=™ ¹Ð—‡5ÑøIÖäi#™B« ù ;ý’§ 0º8–Ú µ3óú2ÂK¦ê Ð ÿ&"7+©+!­:–ô0³F?ðÉ"–4;žþ3¸1ôƒ£ ð(û ¯ â°ÌC³Hó ݪæ!Ù4§4°"Ñ£#ËCµ´‹ˆ0’#.ÝH˜ž"ÎK¥£ ã*¾îR½ ÂP„f·*¾®Sˆ¡Æ*’gö+ÂøLASLì øŸ1­ ¾B„ ïHù$šÛ2”EèÝ ïÖ … ¯ ‡š äƒL½ÚÂû»È Ï € öy˜CÄ*E‹ÎùMóŠû½ªöêž4êüì ³&£¹#ª#æ1†4§:Ú/¨¾0²G úGüKEÁýK(xÓ&1 â&°… é÷'¾%&µâ í «(€)™ € ©ìê§’×3« ¶²8"½KŠ#ìÅ'c‹ˆ"è,Ù‘„ÄvÏ “>  /îÞ–7˜à/ê£Ã!Â-ðè ÷ÚKŒ9îú é•(•õ¬¾ò ËÒ=‹"ÿ²+ÃDç¶ ø„Œ“"þú¢’™ý4å¾I­¸Ô ±Õø ¤%½Á œ"û(öH°Ý ɤ)#¤8±•Îñ™”@˜Eš:Š ‘°˜ÿ  ©Ñ´– ƒ ¡õ 9L»"‹‘¿ ö€Êñ"· Áˆ Ëó ð ƒ ÄíÆü…&½(±ø ô ø Úü” è ¡ìœò ¡6²(¬ ÞC¡” Í)—¤ ²ô‹´Ø¦œ—Ð ïŸD»EÎ § 6 “£žø ñ¹÷0’›7-¸´)…F™*> EÛ?ðÏ4­ µ”(ÚL! !ëC³)á× #–)Å/:‹?†7Ç ‰ÿEžCü#ú½È(©öì:¬>Û—!å „•M´*ÏM›%#€+»%ˆ>%äC.0  ‚F‘)šƒH©&liÈÄ/7 .9†ù=®H "ñ ÙÔ&ñªþÚê¡ ˜”¼ÜÌ× ®äš¶™è ˜ÿŒ èà û̈ Ôõ%æÒ ¢ñ&Å · ðWŒ¯ò¹ÉC‡$Ÿœø ƒÊÞ*ÔŽý¸= ÿ ‚'¯ ï#–—¿ø– ¿ý‰–Ë ü’,ȸ—ºß¦5›Œ Òˆ8 ô! Ñ7Ùà ŠÅ8°ÜÈ Þ ÙŠMÎ*ëÞ + ¶?¢# %—6•¡’Ö ˆM¬¸ÝÐíÇö;×2Ãû„#Ú Ã ¿ ¢ † ‹-˜-ÂI „JÔ †¥Ú( ¯ ƒ( ƒ< ¥ õ†ŸÛ¹6¸ 0$à ä8 7È—3ÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´Œ½Ñ"ß/žÖ > ¤-µ'•Ä6€C¾C·'øó"„µ°ù'÷È?Ù2Ê𙕊¦ ƒ² ÷…ÂE¹2ê ¨ò¨Ô*ŸMÿBû1Þ Ò „@< §? ú  3×±ã<Ô ¥* ÐL”Eç ¸M ú#Ï2 ¹ »" ë é' „JÇ óß- àºòƒ%À›-? ¡®Ü9 ª;Æ Ö§C5ô µ$ ± 3ú;ð(Ú"Ý?* £M º²üÌ’Í š,µì Ò ×´ Ù ‘3 ôæÅ8 ÆÃ) † ì;Ü1 "Áú ‡œ Ü&ŠàG ô6 ˜Eš"ó? È1Õ ¡ 1Ý)€¢òà4º ´›;Ã2æ>€E ÂH™ æ% ¥2 ÿµ( ž5Ÿ'Õ3ö$À÷; ·M ÀL í1‘;þL £& %ÀÎ2„ Üë æ þ$ Ûæ ™G€9®. çå= ê ø ± ¿,”EÜ«JŒ%˜# ðL¼Æ“ð6"Ð(E%™#¤+ü Ÿ€N™-…5ðÏ#%¹"ý‰(2 õ&ü × ¢0 ® ö„$î ’ ǘ#Ü š•' ⣠þ èž é ™³’ Õ#‹ ¹6؃ ¿ì“/‘J¤ƒ ÚõæÖ  àƒ·Ï ¦ÄÜ‘€ ¨*ù"æ ØÕ <ÙŽ‹²5û ‹Ò· Ó–ÔÚL› ¨ˆH Õ6=öŠ? Á0‰ü:°  Ë ¥ —EÜ< ¼$•9æ%¨-ê?Ê;êHˆØ› á/Ò(Á × ™Ž< ¶Ò × Ÿ ö ˜?ü¼°1į‘"Õç ¡ ‰)Ž$–ýKõ ß7 ×*2¾ÆÏ¸í þŒ Ò úJ Ø6‚H¹1 áù& ¤´8 Å ­> ›1 —9ò@Þ(Ì ò1ùñ¯Ì9­¥ ˆ~êÖ&;£IÑ=Š ýD¿Šk‘½Îü! ›!Æ í,œÖ §º Å* ð: ï: õ ð š(¼ <É(ßJ Œ7ÐLƒ1 ‹ ö! Ÿ ò2 Ð"Ä€¼Ð ¯ „ ‹ L¨ºª € É Ÿš£8;F<Š ä"(Õ‘S/…¼HV#2:¬.º:¬Dï%îF¶A·Œ<‹ …JŽç!Àû(¾–É,ÎMý.µ þ8+ƒ4Á{Ò”7& " ß9ž7äÄM¶$ôC̈}¡‰/9TŒž˜†ÈÄm¬¿–¨‡b™Štçš‚¬þvƒqS‹„¤¥§Ÿ«™¼·ØªŒ‚† ô(ÿ§$×ÝJñö}¿ô†‡ãÈùÉ ¹á"&ÿöÄП ò6· 2IB®º€µ•‘ !– š ª²¿%Õ$Îü#Ô'6É•ÜÀ%)‚ %ZC7h7 )6°>(/ºz „ ñ:‰‚©ÄËA }ô÷´ Óà +hf1Ü*Ü9ŒÕ +êÿÎÑ ï¼ PœEÎû ÂÛC÷M4ó4„Û8Ñ)ûÚ?¦®3 "F d4#Þï½@»ÿ*’K6_ 1-ùoÍ,{ˆB° ß Ë•D­Ž ,þ;‘ê'í£ö×4°â Ž_à1•G¼íÅ ÿ À$Ê ’( ®¸ Ž Û-¸À «K“ ýî§§1á®­ ÌÓ–7øìЬ»ç  áMˆ,Õ’.¤×ÉŽ×Å‹‘Á–ô ‡M¬(L ¾œ¬–$Gý®;jjøDÂ+ºÍ î-æ ŽŒ0š0²iÙLð «7· î Ÿ¼&ñó#ˆ…&áAÔ ±Ÿå€ ˜àŒM…!ƒñ'ê-ºçKÚø € ¸ƒ‹)Ú=”è%ò–%Â$Â¥.æ*ñ ŠD¾Œ¾:Õ2¢ª«4§'‚ Þ,›à'!Ê'øL0é ¹ «'Ÿ;ôA¹ ÈöaÌÑ ˆ' ¦(æüIÖ40ñ Ðñ¼0y¼é"†»MùÓ"ú$¦'™-R•)ñÓ²£½Å‰¿8[)‘ ªþ¯,ü¨ˆŠº ö5¦M;ó'³¯#Ô˜ç= ¢HBõ6°´Û¹ èC˜ï—M'²…" ¦›/×'*:$ )ûôî>ГK“4š6 &©4¿×4èK§öAè-™‚*¦,Ù0ó:úû¢-¸þ ¤±íø6 «*¾H4¼·¶¼¹GÍü æ)¬€Hˆ Ãþ6{È3¼-À¤ë ï Ù7è:ç(ñ)õ1×GíØð+¿é<æ+Ž˜KÊ ´É!&¤#Ó‡ »§ <ž>”º(·ª 4 .£üØ+Ì’0‡  !Z²2?Ü¥øHˆ7læ1÷ù&©¾ ˆù+¿î=Î8+0=åï)߇ ÿ-’ ®ë"¸ ¬3»½0ý'§F€"„,±'›ô³7U«ò´ŽÔ® …‰.³•:¶ÖŠ ›‡ƒÓ ©Ûǰ£"Ô²±+õå™;¿û'†;é7‹(ߘ/²)ˆ»%“À"Ò3ìÿ•œläê¥1‚æ ” øJÀ¦A•Ÿ3 Ф7É g×Âéí¹ú ðí?»;Ž ôû(ÇBÌùɬׅ ‘ º í ›•ú°€·—³¶Î¨œ ö üѤ?º<ö…à:¦ðþ0ÈÏÅ ·ä”ÍLÓÞå£4†–í2Í ‚ Õ ‡Á)•À×l¯¤$é²Ú´ÝLž‰º§-‚$Ž; í ⪯ »¤ Ô$ ©9 ½ + †; ¨¶ÍE Â4 œ1 „ º¼6 5M»Óðº1 Q…IÕBœ Ò3,Ž+¡3±ïLªŸŠúš÷ 2Ÿñ&ó „ Ý  ­ ÿ ƒ ³;Õ µ Õ + ‡ Ê Û Ç< ÃI þêL î(Þ- ©' •ú# Î ©ÐÛ=ݵ¿ à¿ »÷ ô ±™ âÐ m¼í M íš!¢ ±ú ® ²Dƒ ëÌ6 ­, Á ½¾þÊ·)Š Ö†& Ã)ÎLã4ˆIç7Ò7 ¸ »#Öqv—?´ ìÒ"Õ% Í rN‘‡F Ü7ð,·.™µCæ¿-õ¿XàðDÍ?ݼ¦, & â çÌ ê Ñ ê ›* õC „& º šúK Ô .þ0® Þ‹ ¯ ç# ÿ2½¸ … Ò@¡$# ¡ ±: Ï û«KÄ! •ÀÚç‹à 1™8ûE¶ŠJßç5‡Ç# ï þÅ= óA ò ï § ÈÁ•- Š( ñ í í ŒŠ6Á Á(þ8€çð; Ú@ ‹ ¨! „ A ¢ ä … @Kç ˜9Ô õ@í 9“ ¥–) ËCǘÉ" ° àÄÆÛC Ë Ð Èù@Ø> ¹£´ ʰ~î#Á= @©‘7t Â÷΄ÃCÓú±9‚:AŽÊÑ(2 ¸ è2rƒŽI+  ½Œ-›Œ%ò$Â9ªžž;&¸¶˜cå¨.œ2³:ç¶1;ø…2µƒ3Ñ’!¸ŒÈü å/ü1D('Ÿ - #ͽ¶® N _:¦ï ™… •ÔŸŒø¦&YÏØ¤° Мüª"ÊÃôÑ=Ð Í! 'Ü.¡Î»§ Ž#(ž@¡$+É%»ä$¼02<2¢ ùç6ß;Ó =áI:Œ ‚†.›ë ¥)…§F‹2íâŠå ÷Lž¨×´ ƒÄš3— 0È."#3.GŸ3Ê Ó Äš ’ÁÀæ=Þ<ÎMëß Ö ›?d/7ì"`…:O Û¤Â'¤ Ó …G¢)úã=¨íÿÉ §ÚÎ ;ûMú Ë ”ûaÓ·ŸG–‘$å3¹"Ø= µœÆå Q‰þ÷ Ç8 K¶ ¿2Ñ%¸$ÝÄþ‡;ïªKÌ KÖ ½ Ùœ:æ©Ó>Ý’œ¨>¾ è7Ôô!¤ºü=†8¸.¢M… ù ¿/¿=:÷ çڮ㻠&µ÷›ü“Ø- +Òî;ï)‹:®$@°­öý;îGÛ@ªÔ>º¼Ô6¼íÿ,íë²H€4²KÉ(gÜÝ °àˆÏ±›ý(Æ-šáõ¢ 9R ¡d!%)p'37~+6]H+#f'­ã!˜G߯“‹XŽø7Õ Ç•Ø(Œ ±‚† $7àCçºOÛ!'«œ¥®æÿ9“ºE#06ƒ¡ Û9‘ØFÑ$Í1“@Î*¼8¨,Õ¿MšE>Ö§à#k»Ž1¡Õ‘)Ü»9«ïTôÀÙ Ê—ð#í¶¡âþˆ …‰æ"ô ¿Í8¢&ø4« D“ º™µ§M0ß _Ø » ·¢ÿSA£ ¯Æá1ê÷³Ù"½8Ò0ºæ‹ ¾ó.(ÔÐ ±Lã"ËÔü3Ê(î:Ê(ñ›(‰ê ™/ž!ôCæ ç ’-§AãMë¾4ó>·,   Ø'ƒ²—è(ò)ÂÊ.¶A§ ý!¸   ‡H $3è³-’†5õ2¾>ÅÅÐ(' £ŠEóÈ2%Ræ•<€ø/'tzÍkOHý03þ=§-%;ܯ¯ ¶ú!þ ˜<)Ÿ‹?Âa“4 ï “.ŽD‹@¸û.‰Žñ˜ Ô Ç0Â9ûÐÑÑ<¹ í Í= ÏF Þ •%ØK¬9•B Ø Øò&öô'„ñ‡—B ß ë ; ÿ Õ ­L‚/è“ š 𘠡)Ñ ÅÑ!å × úì+‘" ǶDø"î9±#ö(²ô iÅïÆ )²ôÁÕþK’ß¾DÃÁ#˜#íGÇ Ú ¼K ‡D ² ù5 …4 Ú(å(é5· ‰E ç ×ã¦;ó8ï6 ½ … ´L‚#Óê1¨0D££bÃÊå2©G•?¦-®à*- ¶Gé!“I¢)Õ¸À´Ž¿Œ Œ@åŒ#ž Hõ; »â4ô%Ãèâ7) ½ :•G ûœ×1ïížýá šø ° ζ„% ¢?Ú5£ ¹BšE‰%‚ • Ì”‚#é ø ™-? §Œ ˆ È ËÑŒ3€ Ò§4û ÿB—0Þ/ÉÂ< ÄÝà% 9 ²2„@Å= tò&Ê ± ÈI~ø* Û ‚%× ö £ –G õ0 ŒÙ5 …–î9³L‹@ôFæ.ŠψÕ4Àá’!”Š„ÇÜó}Ñ% ˆF ãµ( Õð@Ž9ç‚ å ×à7Ð ð7 É)‰0(°!ì#Ñ ¤çøƒF£JŽ.êè/¨ "$„ EɆ>à1õ‰Hã:ÀÂ.ÿ‰Û šDý(ƒ¼&§òAˆ¯ …ªð0¯§HðKóïI–Hž×‘Š@è ¸ßÞƒ:ê)Û˜í §ó„8‚, Â6ÿ$H­%¯ ÿŒÜ ŠJ$´>® Î9A¢;!ω„t%)$è(•(÷½*ù ° ʵ†Š³†œÎ òƒŠ± ’Î_œŒ¨®žÝ Vš Ì!}’¤e÷â¸N'EBû|” =¹½(…ä7Ï¿í¤&Áÿ ñˆ¯ ‚Ëú L7Ó-2 ž­7º †É3çÏš*&-=9æ#šµ°é¹ ¾þRÀ{³ª —(ûÀ’Ó./™»+Šhí ÔAg-;~göÿ .R3#›"ã ó‘£Iïqaí GªÿO''¾º ‚ã ʈØ4ìŽ ×š â«Ëæ ¸ô|*Q b¼K»ì Ùƒñ±¨2;§ ò ê €†[™ cÒ´K Šòü9 ×K4ñ’0ž4£î®ï2å,`ÆØ;ô3Ñ/·šG*Z25·“ûü;­ÝFFrP‡9-‹7C ŒA†·.õ ËˆàÿRéþ:À™E>5Î$ìð1¥#¿ º—0¿¥!ç Õ ™(Ø(°5ý?íE‡4¡$‡î&WŒR—9ÄÇ:©Â'‡E‘ñ2ô–?éJꢺš Õö —.ãë ·0ëG¶·È9’9 8é ‰Ú('ü.°L• Ø,ˆCÀ¶¹,ÿ À$Ë § Ô8¨%ï2é8´?ò($Œ—† £G2ãàçþÕ)¡5Zí UïBFC ‘°ˆoíÍ2>™§ ® šD®Lþ&ê‡ î6ç ¯ ÀB'¨ ôÜ$ß ­Ó3³6 Ð 3‚é%w’Ô×Ñ$ï&úš ÛÔ+•K<šÖMÇ ¨ÄÙ;”1 Û*sü5™¶*“½ ±G©%ACZ¨»lËø« œ‡_šÛÂÍ/ª°òœÝ ‹ÉÚ-¢—й£ã ø‰"úóß*Õ›)’+š<-oÔ5ë¹8¢9ß ­ÔÇ­ÒÃsNšó©ûä'Ì8Ô0¶ Ú Þ>öÙ%›F•¢$¤½ê#ãgè6’Ö)±Ñ© …<љͪ¹ç6¥$í%• ÔIå?̧D° ”@ìU ¸ ‚4ÜA—Wß&ð‰88Ë$¦ šã).îÛ=ñÏåàï% ü¦º ú ƒ.Ö¬*ƒ¥w¡ƒVÁ¹ôé<òè3Ó(!E2ÅF3ÒÃ'Ž"æ#†½73 $‰* Ñ Ø-Ó>0¹K‘À ø:/ â Ü"ãC—¾Cƒ ä6 ×É Î/ — â;½C %!æM  Ñ(¶3=ÊYÕA±§"ò<–è`0 Ô1Ñ œ8§ âŽ$+ ¿µîê® ¨µTŽ© ²„µ7œ+g_ÿï*Ñ",î;ç ±¯;Ë‹<Þ ®)’$¬EèDì9à2Þò@ í.Ï/8îùƒ ÀEéJ“ €?¹>Å;Û?€ §1±%½' ,’7¹  ;Ò’KîÎ:Å à(àŠÍ ¦º—ÝÞ'¹îšžÊÑ ï£ § ¨ ûëGÜòÜ’ ºÎŒ 5Ù⦻ƒ¥¡¦• • öÈãŠrç †ÞÎ Ú ¦­ýáÖê¶ü• ¬" ¼š ¦ Œ3”Ô’Ï% Þã¼&ÙÁÅžšíè爀‰"™ã®Ä õ ÓÒ ‰ ç㑠Ž"ù —©Ÿ Ä ¹ §ž ß ‹ ír é½ÊÖ ?È Ì ÷¬ Æ ÕÞ ÿ Û ç¦‡n ã ÿ: ‹ |  ˺“ • , „ЦZÛ› ¼¼ Áã Ó ­ Çù$Ý  ê Ï-ˆ Ø É Ò c öÓ ˜ ãùç% N ¿ ¶ © "' ü ˯ „&Ÿ8 å¦ ‰ г ì ¡ ùî‰1—Î"‹HÙ"–H£Û ( Ö(õò/ê(›03¥0ÚÈ7È6žB¨ª¥¦ú6 #Ç´*Õê9Ê ÕG±&%’'£ä$ÙýÕ!ð) – „5–ã9æ$ õˆKÿÂ Ì µÚö= £5è úE ¼&û$ÖD ð< º6 ­ Ø ž9 Î5 ‚) ›4ÉIžLš º.?«9° ƒ:˜EŽ:« å‰H¢EÂ! ÓJ Þ âðC ®' ¾FÈFâÑÛ¯ ø ý0 Ù Ñ  '­ ‡$Ú+ ° ¼J £ ù? “' ¥ ï*  * Ã=Ÿ° ÑŒû¡ªœ*Í7í Œ/µ ° ý Ø7Á ° à » êòEâDýEß…ç2çøJŽ †8 ½$òƒKŽ3š Ö Óæ˜ æ û ¦C±$ ü³0õ>àÆëºHÔ6 ”Î0 # ×3œuÍ5ÜëDÎ Ì=ý,7 Þ‘Ü( Â=à³ ä¸>©!,PÞ6»è ¿Dã?Äû7û ßËÇÞ³¥)Ž&â Š<ý þ+œŒEŸ4– å¿ –; ‡å ˜• š ¨ ×‰¥ €°Š çï, Žå ï˜ w¢5•²I s ª4£F€¸BÏ ¼L ú äù ÅDá ‹ ž óÛ ¡ß "Þ/çMåµ$€'„:ĵ è°c‘‹øæ “C¬ÙMÚ%dˆ‰ •Gó Êò!¹@ü?Ó ÕÁ&·KÞ ±¥ÅÀ Oêà”ô ¨ßM¤Úè²½'Î „+¿µ³¨¼=Ĩ7'çKñæ*‹AY·° ­>Û4Ä?ÞMû!ˆ8Ç÷Ö΀ÍX2©ï UÉ Ô€ŠfÂÚ•ä ² ÒÅ ô¼ç²uË–é è¬û ÔŠâ ’ò¢à¢ä ÿïœÝ0™ ¥V˜'Y‘ë¬"»þ•Á •ŹÏ'·…‰Ê„é€=’£ ךì>‚ëèé¥÷á¥!ÉÉ¿&ü¿áÁÅËÖûè O%Š4½Žò ¾ Ú}§R6§ Á™÷ù œ •¯ÁsGí ŠŒŒÓ ¨{•°àñ Ìú… ø—¿ ð0‡ÃUôšë €•ÀÁ½½ÊÜÃw”ê …š?ùºÛ w†ô˜ê“„^€’âR¹{ñÈœŠ¯·  èððè ´òÐC†%©¶»þ ÍF—¥ mKíùÚŽäÖ˜Gª ¿ ¦¬‘R²£²æ Ї:‡¶ ý{Ç ô =óŽ.'½ ë« ­ËAÅõ….ï ̾ ¿/‚šØ§O N»Š¼‚R™bmÁ­òBÅŽ…¢  ¹i¸éüÔ ÝÉ’!¥’ ÍûÖÔ‘¿Úš ¿¨3±Ç àŒ­‰óæÂ–܇ۜ $z‰Ríà ôÖ èóclU¶ Íñ¡¸Y–ÊŸÈèÖDõO.d– Üʤțà ä [sSÄ“ù¸¹ wƉ Y±Ò¾ ”­žžõ\N“UŠñVÑŠì»'ÅÛØÑ ç ®Á« 0õ“ª j Ëø£JüËé¶ü§ž‚%‚†¡LHÆÛ6»8öJC7 -#ÌÍò0š»(Ñô0æÏ.ŽÚ!ÿ)­ 1´I±&÷ 5ãÅ­'„+N\ ¬à2œ¿¼Iú'’žº³A•¼ë!µç!Ý)&½=¡Ç–(½À6Í#£ £ )mÆ;áE#ä5í ¢ûM±5 eZš&»K´£*ñ ¡-’FÕ'û?ÄMÒ&" Цœ„ÔJ¡Fõ9ú ãíþúçÊî-µ ¥*Æ™ ñÆ’ê‰ÿ.çè/™ðD âöUú7Ñû¦?”.¤Ë­ ©Â&ÀÓ.X«ý*£ï ÂðIª2ç)ë¡9 æ !0¶#ÝpŠ-«'6ñ%Àæ9›Á ³ €™I·óÐóÌ6ÖÈß!îJO•F‡(ø™ Ѱ§ ©Ÿ4Í¿-3¬Žü ‘(›#ü›õ!ß,+O£Œ,þã/Ž#Ú1ÛˆG­E— ö9îoÆ ÆGÚýL Ä Œ%ÑûCÀä ± &é9 ñÖ.éÍ'°§â'Ä2Ï‚I‹(ÛË$öC¨ì…$©>¬9€€ dš ß"ˆJ Ì-²9Á( ¼?°IâI·(å‘3‚ù±*f¤;Î(Õ«Mè@™¼!Ó ƒL&P´ ¶ 3æÖ)ÖCÍá Æ» Øí5Á˜ä õ¯è° ‘ º&Û©ECIü’›i½ ‰ƒÐ ª è Ë ¼ Ù —ó é%#™” Ø× u†—3–‰ŒØòdX¯´ ð(©ôÌ¢s˜¬¯*ç唺â±Þ!‚þƒ ›6 ¼ ú¸'@þ àò3’,º½ …( K0š0— »é@Ï‹F«!À“K‚E•/à5É%/ºß!©<‹™Ø3« £/È$© ’4ö/ƒîË’(ñI@©Kí6XL³6Úü/샓Ñ-J6Þ ô#‡·’8PK<&ÜEK5’+B+-¦0¶.„Exôù²-cß=Ʀš7 ¸;GÑŽ¿ï)ìÌ-—¯H(zEÙ=¸Å²2 ¼“ ¬-xí=â-ƒÍNþ¸2Òù$œ ãÿ‘C)‰(þ,‚+Ÿ?ƒð'Àê,ƒÛŠ#›CÑÄ'®1¤4®7— ï•î+÷A Ë.†&ó Ò  ž    Ì® °  Të³Ó ».ï!ÌJþ»‹Û¿Û±òÜïÿÂïýúäœòâ ÀÏÈÄý¹Â„í㦵Œ´-Ð;&!>§Êì ª„ò ® -° æ `ö‚ÓÄ  ލJ¦¼ˆãg À î‘$ï%̸‹£é« ü+ìéŽáû<ü Õp¥Îá— Á‡ñ¶ ®²¨_ÙI¢òôá4bãÚu¢9”‘Ìõ ¨Z±ø¢õé{…ܾ ÒÔ‰¿ÇȽ÷ñ3-,¢øÚøøáÑgÜÊÌŽ¿å¢™‚š ½ ïú!.ƨΠï–Î »°‡§xðÆø"Ç —î$°¾àÀ ºÆŸ(ÞòÁô±Ò Ê䊸 …ÕÈJÎ>/¨KÏþ'¡—€( Iƒã=¸ò>ý •ØLèÍ‘n€¤)Ž$WÄ'((÷%›Fþ ÛïŠÜÃÃ,«!“ܱÛËÿ çú#î>ç @’$€Þ·"mÂñ Ä… ‡£¤ À0’2¸¼ Ÿ›Ì Ú<ƒ&Ì,‘è)å*˜¤+ ˆ>À ø(§Jv^ 甀%Æ? ü“­6þý· Õ®€ÝóÌ÷—ô0ï ;ã-»‡›,‹$ö÷•¨-ð– ±øÅ§Là?F°IØ5 ë-¼ÅˆF³¼þï ò> ÆÂD‹  û´H ;ú?œ! ¬ € Ñ! ¥*“ Þ ¢ ž Ö ™ é˜6«D® ‚< @ô ôŽK5¿Û´#½$% é@ÅL 9­+ºþÕý:…7À œ2 ꬔ:Òý@* ¢äNðž´Ç ¹›êû øMú“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–¾'ʪÃ''ïó=‘ ³žB þ¥ Á-Ç‹>Æ/Œ*À:ÌA·(ô1ÃK†‡à¦÷1÷=” EIH<öåí ß*ÉCõ5ÒÛ!˜ÿÓŸ½'ÖMèñ"þ¯0ð…EÐ*á÷8½øDù+ƒëFå<£#º$à?ü é ‚'µ8® ¶-²ì »ú@Ê%ß,¹ÊÅVÙ­3Ö¿„ *§ùá * % Í$™.ÿ»û2¦ Ç" ¥9â†)š¿ "çÊZŠë6Æ¥h'â0 «Î0 ¨ˆA€ Á?&“ è/êŒ ˜Gÿ³º”8ù·’4ã ÑÏ ‹›ÚK½ü—4¶5ùæ§/ÓÐ"©›%7£ü„(WË3ªÀà3¬ ?ÐÐ &…)åÄ(” ì   ¹<8fÂHV&?-­qˆ.Ά7¾s´%ã0¼ ÁŠãƒ+ޔ؉¡ÿZ¨œ¾GŠ ÿ ·!À!Ï ¦áì< ' +&: ­8Ø š¹çád•(ɦ†ÆÁ‰ƒžý8Cç"‹!Ò?é%ÕD©&ÀÊ+tƒ„>ÃD®<å"–„¹ öWå³?(ƒ¯ç° 0SXÉ à6ÃУ( #"r^» &ô ‘)7J õ63¡©6š%+‘& Ï7+Ü+‘& ¾ ²+4Þ PA- 7'á00þ4þ=ô½¬$áÃæã•=Î9‡:9d'X%G Zâ ÃÅ{CÓ  Ä ˜§3Å1ëø Ó –¦9àþ3²K¨#.ƒE³Á>íCU'Y í¿È¼ ùHà!O¼ ”,t_ˆ&ïÁ«5Õ² ¼'ë ©÷7©'âñ×0Ì¿å#=¶ — »0•hhTÌ$” G¡‡G–1Ä9ø>.·-á¸8µ‹Ùƒ;ÿÀ ñ7!IFÛ/†QÔ'¾¤    Œ?×$¸2g•­+ŸJÅ„Âv£ \âH§0H®GƒK»0¨ Ê€"´á ç¦è0ÌÂûÅ*€52à5ô;˜ ’1Kï Sœ%˜<¬¥à ‹¦Õ£Ô œ„µúÄ …B°šÙ±Ôì6¢Iœ?Šöìϱ"† «Ó‘³<®  \Ñ¡&°§Œ ²¶®–!ÿ*“$¬0D²NÄÊÐ%¥ Ï«(‡ ˜ XJ¹­+¾ÀŠèß ²ß(Öÿ.!§ó­»¹Ø)šž(ª šù ´&Ò‰óþÄ!Á#ÇCÜîŽñËTIØôÆs3r—ñ{X±U$)E%¯ŒË|p¯F½CÔg¬µ¨ärW8BŠŒˆ›®±}„â÷A„PÒ¢ŽæäÄ•‹Ç4´©?JvŸžì¯a5Æ»¥ÇŠ¢¢rs²Ê–.Aèàï˜û¤Ñ;l°"‹/ûû9 ›Æ1üË û õBe†÷ ¤ +- ü ²@‹ã Ç% 7ÛB £Æ ô ƒ õº `¥é Â Ô œ± — ú6ì $Ä #þ<– ý K½35T*.Ë.’35T*.ù*H‡¥[OíH¨+!Ôµ£À K¿Õ8×8€hˆÏ “ ÉMMìÕ Ö ð%š ¹ñ#÷ƒ ‰ ˜É6ð+îò! þýõ Ý ˜ ãçý¤/ ˜5_S (°@ –Ü3 …  ûÎ.Ó¨4û Ï!Œ ‰" ù% ¤ &öÝ7… =¦W+òòëïÊÀ–¯á*Þ;–9¨ ¹Ìö²Ò Ž ‘è:*¾÷MÌ£.‹.Ë ç˜"‘#ë=Ã;Ö¼*ØÖ‡Ý(Za0—Ù#”0¾,³ Ï8)/Œ8Ê °)†M¢ñ(Çñ ¼Õ Èr˜Ö†!¥Ø#Œø.à!«Ö#‰#Š"îIˬ5Ã…@öÔÊ> ãåú´7àÑá9û+ø<¢  7 á•ÃÝ/â>ˆ$µ.·Ôó;É@®Å"ÀB›Åü*¼õ0Œ@-«@Ñѹ#Ÿ1Ü ×3 ç”ù33 /< XÛ9Ï ì"@ˆà4£:Þψx”ä ¿þäàÿ™½¢5Eí UðBFC öékò öƒý¯"h²†â3ö÷?0¤"Ñ› ú’ìk—$ϯ°üã!¢úMù• Û ô¸á5à*O©/^ì%'7/íæ ‰Ðÿ .EÕ+û ïJš8Æ £ÿ è¼ÏÀâ ®É'ߤ¦ aþ ĵüý+¨KÔ& ÔíÓ¯+˜îû/™HÆ¿.¥ –þ <Ð °*ú°€´¶j¹ ð I«$W“$¶žÆ+ ë …¥›,«µÖüÝ­¿¾Û…Æ"Úü½.L¡ …Ççü8¸²”´„7ëê@ÿÀFã6¹ ¥ ­ø, §G™Ó»”%»é' Ú ¼I Þ… ¿= Í …Cñá/¤H”3¤ £šD³ÅH¯‰c÷ …DÆbÃÊÛŽ* «“7È;Ìç%Î?´ç ª ûÚ?ÐI¿× ¢5Ò, …·KÂ(àD ½? å º ä6·5é— û çIoí æ² ¶ ± ç ô&Í0 ÷ óŒ Ñ Û* ³ Ù× â* Ö ÷ ˜:‘„ õ õÁ=èAÒ×…ä´âÒŠÕã‹™ ™ gÀ ¬ß ‰É½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³Z[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø™1žïqw Ë{¾ŒÎøÆ™ä³NAE“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œ?‚ÊÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒšÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšãu¹«NNx½ˆ«œ”xJ<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št…=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆùÌŒ ·»'÷ò? ‘: ù÷ ’8´ú†0ð$ ÇÛ ¬ B ù% •0 : » Y µ ¿ £ ¿,â~˜HË ð ‚û ½KžÏ e$Ó8Ü8éÂIñ#¨ Lç˜Eˆ/¦¢5à“F÷ ÌþóÒ ë€A Ý ß‹,”,á8ª-Å è ܾ ü( ÔŠ.ìùá@ †JÀ*è± Ñ Í ‚ ÄϯÛÈ –,‡8§-‡9“?¯í$ »5 Í Å!'§ž6 ÑC’ ¿Àá5@œÁ D”œÑ Ý‹ ƒ?´ÉЋ‹»æÙôÜ…•£ÌÏ Ã rÿ°óí­'¯° ¦¹š—€Àò*ô—ê º Éæ— € : ž µ ¿ ¸Ô Ú¯‰ŒGŒŽž ÿ« „8ÚÚð¾¦Þ)—þD Ø* ‡ Ï5¡’Ê‚+ÓLíµ0À&¦Bš÷Ú‰$Õ¢×ÓÛå­{Ã0Þ ï§ ¸ªýÄ ‰Ì.§“ò‹m‰× ©š¸÷•ÿÞÀÍð‹9€3é åÀB »I Ä,Và ÿ©0DÆbÃÊײ“Â0³–(®ä&L$ Ñã × QèÂ;ÍÃ,VÜ,Ë> ©'æ¨, ë@ÿ¾B¢6§' Ìî “ûDžI 1ðóñü#ûä7ˆ XÃÔ!4>n}©>¼'Ú2Ñ@ÿѯè,£þ?Ýû> 8(ÓîÐ ˜)Ñ ›,º»­ä/¨ ÞÒ!ÞèºOŒÁ*'ß9è­ ô,¹‰ˆ £-À”ÔI#”H°ÜéG™ ÍŽÞ&®þ#ŸëØ•ÒC¡ù=¼FÅE "ô*ÑüF“:ÕÝ à8ñ–ë(ßÿÇŽ"î® ±—‡%Ñ¡8þïCª Ï ýBñ'«&´5Eµ,–J€… Å$ת4ФHï ­7›î<œJ‡ ʃ ­,ÜŽÈ®¥¼¶)k:‡F›*¢E C)09Ý?6(@Ò Pš@»Ÿ…9§4‡4ÝÅØGå…GÛ+†')¾ðÎÊIâÝ7µõÞí«HâCõ* G4»&Â>'’ÓˆÅ$ú*À€€ó³%— L0Å °6ÿÞ-ØKçMÉ Xѯ*•>ò ¢ ôÎÐÜJð× (-œ"É <ŒD‡&4‰pŸ®©Ôe5¾(*%6aŸÛ ö=Þï2ÈÁ8x²Ù«–@&õ*І ½J…FŽü«¦& ŸKüL !‹%]ôRúC6¦L§L‰(¯‘&$éCË‚Fû)ÏIÇâ¶M‹#î Û$?î%ùÁ. çMÏ'(­’C€(ÅJ¥F ÷D±1 ™'‡´œA÷Fð ,ꆺÅCñ¹¸–.§àÊ™"³% ÔEˆMÑ (ÅGô "-ú)Ù,‰C¿±Z· ÿ À$Ì “( ñ•À"©%ð2Â9ÕíM²8ïº+•+ÚDùõçå™O³0â#‚1ÚúŒ ñó¶'   …ÎÇ"-Þ?úÀ «†HÂĆ–ñ-µÿ ’%«¾Ù1Ö”Qd‚ÁŠ †‰bã<Õ CDúˆ Ž’² Û€‰*ÍéE ¤ÿ ‰#šDôA×+±Ò*ý:ÆÇÜDæDø3ë%†Í&÷¥<’ ÓI#½BÝ ·M»›2ß!ü+¬ñ"·)ÄD»lŸ!OîÂ"´öfbð¨ü»Þö·B®! ¤2¦!D†÷-%¥+”YŠÞ3ÞI⃔¶Ý¥›xÛ!ž Uýš”àÙÿ3! ›ã ¹ë éú°ÆÒ’` Vœ‰ùù û °Ô‰ýŒ$°ÿÁ­€6¥ÈÝ ô¦³Ú":ó1t$f¹ ™úËçwHÖñ‡ У²è èFžÆÝ-è´ ½¿¤ ¨0Ý-„KŠ ÅÑ€ þ†“ò;üE’ËéEÖ¼ûúù âíMÝ¢K§Eu¡þåŒ ÊÅ î¥Ö#ú8Ù9É Š ‚Fñ¤=¸ˆ$„:'&!¡ß¥®»%æ‚Ñ ÏΜàÔ¸°º€Ð ‘ °*ú°€ì"¶æ¸,Æó [¤ÚA¼‚+f†$Ø Ô Ý4³ƒ‡Ý ÈÛ ú ÓÕ3bÿ 46°,®ýLõ*(/  í¶üÜ Ñ€* DÏ ÿ“ .-­*ú… 5;jmû(×6;÷  ö ÷5 Œ ý¼ºJ8þ¾.åJ³ã&) Ä. ­. Š#™ + ‹EÝü% .‡&á £L ˜Ý/ÁŽ.Ò› º5 9£ ’4f € ¥Ü ‚ ƒ … ùöJâ6ž<šGƒKŽ3ï*ŒD›,˜@ÿ ¸)²H õ% Œ ®šÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšät¹«NNx½ˆ«œ”xJ<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò3R{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št…=ŒÃu¤aí/Ì÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§+òKõ¤·Ò¡ðˆ-„<’Áô"  ´ ˆH›š„Ñ–±.• ¤Þ6˜ ¾9 ç—3 Ë5—». ‹ÁJ ª ‚Ã: æ2€Š7ý ƒCÉ ‹ / ¦Bœ;è  º€ ÜE§Iݳ €FÐG‹€ #–#¼ ç% <‘&’» ƒ ò È% † Á£ Ÿû »$ˆ Š ½ °€ û6™;÷ä ¶DÞ8« °• š”=ˆ â· Ä0àN!² º«ðé æ öKüº ÃÍù³ Ü2ÕD Ï ® ƒF ß„”'Ÿ ç§-   Œ}ÖÕ’ŽN†&š- ñ ï ‹L ¢ µ"‘# ç ž"ð Ÿ'“3Ò¥/ó1½9߉DÎ"±A÷ Ÿõ­;½>Â3Œóä ù8 ê¿:¾ïô/õ=¾BÐ ù.óhå/Ãñ –ÔJ þ ߇E Ñ#%¶ Œ Ò» ÊÆ!Ð!»"ôFãJ%¼ ÊM®ÔBÇà"Ü*…ñ¨;Ëþ ƒ ²;ü ±¿K¬: ›<À2 Ž‘ ç& Š ¯ ç# ÿAó@ô$ ‘(Œ!¹†.ËM¶&>¤"Æ<3˜±7‹ £ ®#§, Ä– Æ  * þFÛEÈ6 Ý ì «I×* ‡ åEÛ( ê ݈ ¡% Lð*‡ ‰?Ãɵ ¹ñ#¿Û@Ä Ã,²&ï*ê< ô âÍ,‘‘ó%Ô*È Hb/–8È ù3 < 3ŽPÈ©Ný7÷Š‚¿ˆ™+Èîáó@×Èæ‡Ðð ¢§®ï ­É à ¥ÀÛmå —Yíø’ ö Û ò Ü ¶À#˜ ²€‹ h9‘5Œ"é"tÒ+»‚¢,ÊîH²7›-B “+<ö% ²6Ž ò- í ´ â ² ·*ŸÞý6 ü È . ¦ç Â Ê » ‹G ÏGÈ" ‰*Ú* ¢ ’5 ÐGÁ9‰+”+é ä “‹+팯‰¦Ë õŠÔ É3ñÞJ ÷ ù;Ú) ùH ü#ý!â?² Š%ÊC;îI‰J‰"ŠÈ¹ ø ˜8ÃÔ ëÖ ³ ´* ‹ ¬0Í œ ©ÉÒ+˜ Ó  ˆ á+ʃý ‚¯0’ ¦æ0Ã4Õ,±8+î#¢#¦0DÆbÃʵ ‹5™Û+µ?¹…3í® „ªÅ3§H…Ó'Ù¸ šþ ½‡¼+éL º îÚ"û @%®'´ ²Hç ÜMŸ‘·Õ*À µ» 9¬¼‰«­‹ù @™ÅBIhR®…}£S€ÕQAbŽ»€Xõ¦õ°¨¤†ÿ‰l|œj‰k€ Ken—ëátºÅ{¾ƒ«i»7AÔ1Å’’®§øÓ™¹‹w.J²Ðl_ ˆÆŸÓ`Ò¿ûz…@‚¨¨˜‹€„E¡®Œþ¨œh¾º£ÚÎ’—Œ¤­ìŸìš­d‰˜Îª¥ÿ†„¥Z?¢šï¡Ÿ¹‡ÅúÝÝž“«§ñ¿é«tŒskQãÜ¯ë—²ŽžÙ™@ƒŒÜÜ%Ï¡®½·¸“S\w‡á`]§>vïܦ_xé¢òò…%mÂß›ÿ¯«Š†—cq 5 Dzw«fT•S T@¨–l‚ XNŒvl.BšŠ²Ü„PBNb›´–ýLjÃGwŸDåê¦s«öae–²rŸoÉi€ðþ³Yðä±®Aô”îÛß¡ôº¢…•£ŠÂZ´«Ñ·Ž‘ÀðÒoÜår‘\éÎÞ¼y‘ª¥˜CϺu©Oùu žÈ¸ctŽN|lqgB¸ ^M‹Ð{¹Zõ|¤A¤›yŒëŠæ*L„;ŠÉ†yèƒåý ; ùÞYf*]]Œ¹¦ÆhŒ™ùÂeGFœ%Ò¶”}Dè&iß{€¬Q† Lu†¯‰ŠsŸvÍ=•dÖôUÆ·Þ€àÓÀ³«Ã–|n ”Œ}¨˜ž† Ðm©Äqª‡“ÇvsÌá¥Å¹n`>Ù…utº|§ž¤‚§Ò§I“bnp9k¿ùøÃDŽÞ0 GíÊ«‘™d¼—"r³¢›ƒ‚ƒ„ˆ‹µ‡pUð‰©Ä À Ãþõý JÅu=--Ë Æ&@É !4ô áC‚K´¤ó§& ;ÿÂ<Õ³"Ë• ‡'VVW€?ãá.$.Õ $7°;Ý C&¼‚ð÷V"ÑC/ËBò½1²†Ú&Àö+‹™ð/%ƯØ>¦'¶âÛJŸ ‹ ì0 AÀFöEôü”*ý½ ì“I¼Õé&©;™3÷ÂBªMêM¢Fö(«#œ§ZµÓD¸¢÷ ´ç4¿ +ã%7ã Ä.؉Â+ï ‚Ê>¼›5¶ú<¾Ù7å• I)Î ø–¬0²Aìš:í.µœaµÚÑFëž ¼'Í1˜Ž—)øsù(Á ñKE1æ+¶Ò †9Ò‰®¾ôã ¹ËÑG,Ø¢‹F¿ A,)ÔÜÄ%ä³Å'ÿÀ4ÏÆ²1óîë+¾€.† °ÌÌ͉œà …#§³³1¬ûõ³%´þ£ÆŠ¾ãÝòë§0ý2ü ô 9P9 ˆ¯Ê‹Â/è—Ç Í ³ ‰ òœ ºô ÅÚ¹À7'Çå'Ü–æ›  ÿ“Íã³¶ ¾ ‰¦Í Â!ì Á©Lí=×M$ÎH4Ö"ï.ÌÆ È €;Ÿ:—@‰€(* FîDwËò@º1¥2mÁÃKgå>ƒ>š8Ѫ+‹®+ HÇ-ü¦L,Àü>çE¶Ä"É1»¹'ï'ê0ÝÂûÇ*¦4¬J¬2ä7¤:­ˆ ã~—:­5ß5…Gã3´6¸¸cï â³Á*µÂ‚)’I¿9´ä=éFèõ,8‹ ÊÅ í¤Ö#Wù8Ø9È Š FöA¢)açèJ» T  žE<á‘ê*.%@ª©ML–@ÀLØÚ-…>­A™Þ ʫӴ!»$à%–Ëü “+ó£$ˆ#Hé)ðÐâ/» Úä/ºï1ò—KºFJÿ:š)‘+‚ ‰ìC¦-h‚#ê΂ºóÇèÔ‡)¿: ú ìFÿ'¥&YÊ;º=·'Ø”!Àž:Öô;¨#Ú2™:­µ:ñ6­ÌBÍÔ¥éE3¹À(™-‚',ó2´­/ØðA‹Â›¬¯õàñ¥Ö™ö‡L ­1é2à"–:ŠåÊ Ý¡äâLª óô‚Í Ø Ð¿Ÿ ›À/%Öƒ´–EÏ#Ø Íû&Ü/õ#±Ä ž)FÃG™B—   ! ' %  , (    &     ‚œ жЋAȼ4õCñ  Ü“¬ Ë+ù1¹I…Ú.“—ÛM𥕆ø+$A¬ú$A˜å= RíDÆüÇèÜiÊ’ã ÎÌú ¨ … ’:Šº¶Hª)`£ ƽ)çu·M¨ ƒ:ÖDó;þ—.µ ´$¶Þ¶ < û#°,Ó³¼G¾ ­ÃÄÐ.‘'¼ ‡“‹ÈÚ%õÈé† ¿ §‰4×'ëIø¡3œÛÉ+æNß<’4há/ìÎÿL‹"þ¶.¢IKÀ7§BX%ñB¬Æ°‰>%ªT«Ú+³'ðËœ¥ù à Þ©Â-«" ¦ëú<»*ŠÊ#µñ -¬Ÿ±ñJùé;å>_‹ŒŠ ž&Ž «¶•!† «0ºD¨ºÕ • úûÄj„Á ©å ¥¯;—Aý;À¢‹á#Àã3‚¿ý¸&—̬5+êGÉ*ú ŒŸ°öÏÌÜÙ”ú¦ †ý%Ǥ÷J‚/D½ñ<ÉK€V «+ñ¯5¸>¶Ð…C– —,ºŽ,ëˆ Ü"œ)˜ØÁ½¶CCÏ÷,ŠB K“Ú‰þ,«ÂCõ®ƒ‚Œ¯ ÙªŸ ² Êû1æ ˆ¤?¶3Íæ6#ˆ/‡È7˜µ¼;ɬB:21ÝüžKéGˆ(®¹ÌA¤Ä¶LÑ!¹]Lš#Þ2µÈ à€{¡ äéŠ÷农,è’ ¼ æßƒ#¸²å"­ ü† Ñ À“'Æ np” Œ·DÊìmÍõ … älûÕ?£¤ À0–¹³Þ Ý ¾˜¸™£÷µ¸¹¶#ÿ% ³Çß ± áE„"¸DÒ/Ä›!â>ã* ú? ¬Íè å:å) ” ß ¸£?Ï6®?œM®5µ!¯G ø Š!Ÿ ¹Hœ ë€ß•ý- öKêù+®« õ ° ‰ ÿ = 2 Ï Ô/ ½ ‘ œÌ« ®;ÌE Õ<—·'íÐÿ F ç ä ú »G† (ÕÐ ü¬K: E¯ã þ ”ž¡A›ÙF«A– ü ­ˆ‹‹Ž„ ‘€êÇ"†½Æç –Æ€¶“Š ´ “ õÌ÷—…  =‹ Ù Û ·'Œ‰« ¾Ý ¢ ý$‚ƒù¡Îë—ãõã¦Sô%Í£… Ú‚ q—ɺí@åÔÛŒÔ ¥¸zs©õtÌßùÇÆ ¶ ˜ ³— ø: ÉFœ ¾"“,š üë‡û…t¦œ£ç‚%‰Ô ö;Èá îª ’ õ†ÆÓ ý£ š æÎ «ß‚ ž ¾§Ò…©ñ À\Íú»µ¿h>¾¥ šœ½ÔÞ º€ ²“9­ ŠÝñ 䛊æ’áõꬠ“ê¬ÿ ùá± ”¡‘Ø ƒ — <îÄ Ì¼ˆ òëŽù¦Ñ ¥­“ ÅúÚŽ ºçÛü¾œ× ¥å KÍìâœáŠ• °ßÀ ÀêÚì è ½± Þjé u¥’± „š¾¬ÖÔ Ø–×ÄŒ‹ ê†?ÈŽ¢æš²ØË ¢Ý ñ‘ ¬ lÊö „AWÄ ’ï æ ÷ØÂç£ ü ý ˜Õ°óõ¨Ý ´´¥Ÿ Ä!Õ"Ù#Û$‚& '¹(Ä)§*éâ*°-œ.‘/È/Ä1„26‡7±8ú¸:Ë;“=ô=œ@ŽAÕCìD¬EÙFÝÜI¢JÚKÉL«MÚâÖ × Ô « ¼ ¬åãÂÞ°ÛÆü¦Ê Ï!Ò$Ü%Ç&Á'ß(Æ)Ï*¼+ç,µ-Û/×0º1¬2¿3Ò7¾9Ø:¼<°=é>ö@¡BïB½CµDòEúG¥IÁJÕKÍL—Mþ æëÜÏņ± Ð ï ý §ü¨õžþÜÆ¼ÎÚûºµ ®"î#Ì$Ü%µ(Ð)¼+ˆ-µ.Â/Ü0Ä1Þ2˜6¬7Ã8û9˜;Ì<Ë?ÏAÑBÚCçDŸF GHèHØJàK‡Mÿ iïëÈ® Ù é ­ Ô ¹úºëÉÓëØ“Ó€ î!Ø"ê#Ê$Ù*ð/÷0ð1°3Ÿ4Ú5˜6²7ª9Œ:Ü:¡;=“@ŸAŽCˆDðDÛGÊHßIÁKîLÌ ¬ƒÐ‡§ù ³ § ñ ªŸ‰’äÚí¨ª®˜ ˜!ƒ"ð"Ø#É$¢%‰'”(õ(°*þ0 2—3´4ê5¦8Ž9³:Ç=¸>Å?ÄAþGIúI±L‡  ·…Ò•¶—ÜÄÊðÒ Ù © ‹ ü ½¤Ž“ÿШ‚¹›ê°ªÕÁðÓ² ô ¶!‚"Ÿ#‚%&è&ª'à(Ž,å-š/ú/¿0¡1ç2£3à4„6ç6¬7Œ9¦:ì:ñ;¶<«=ì=?Í@‹AÛA¥BšCœFïFµHƒ eÀ¹¯Ç¥‡ïÄïµ ‰ ¢ üšáö€¤­¶¿œ™œÆš¸À¯ õ!Ó"Ä$¼%É&×'·(´)ñ)Ž.¿1¿2Î89ý:È;ê<…?«@«ABŒCéCõDÒFëG IúJêKƒMõM§ KŽß¤ûÕé ¨ 꺺žŽ¿¢ä˜Ö¤!Â"Ó#ÿ%Š'•(¸)Ã*¬0Þ1ú2ô3ì5¬6—78€:ó:<¶=÷>Õ?Õ@ñAÍD«EêEôFðGÛHöIîL¼ É´¾×Ï·è í ˜‚¤´¬ÀÊ­Šêãõ à!Ê"ˆ*Â+³,Œ.¿01»2ª4›5’6²7ý8ø9¶?Â@BˆDÎEçFËHþKÌLMÒM¶ žèÜÜÛ¦ ¾ ˜‘ך’ßÜ„¥»­¬°†¬†!‘"Ý$Ó%Å&·(º*Ž,ú, .Ï0ü1å3Õ4°5¦6¬7½9Ä:ã;Â=…>ú?¹@¼A¼D™GŸH•IÖI”JÖJ–K§Mí" •áà¥Ìâ ˆ æ ü¹ø·ùß¶¾ˆï‰!Ð!–"¸#³$Ù%ô&Ý(ü)´/ý0¹2Ù35¢7Ò:ò;Ô=á?’EÓIéMÜ‘$ æò™ôÌ “¹í »€Áí՘اëÿ››Ýà Þ!¥"Û#Ü%Û'-×ø1ã4Õ5œ6Þ6è7ƒ9Â9ã:š?ˆAÆA‡B­DËEŽFäHêKªLÕæô  Í ¹ œµÏ á›«Ü¿¢É®“!Û#á$À%ý&á'ì)î*¯+Í,ä.¢/·2ñ2®3­4Â5ü5ñ6±7Ý8Ï:Ô;Ï<Ö>©?ª@ÊAûFŽH›JšK£LëM´% Kì¯çõ¢ ¦èáÔ¥–ÿôŒŠˆ­Ù¿«Ì Ý!ž"ï"Ý#„%Ž&¼'á(Æ)º*Ù+×,Ð-Ä.­/™0ï1î2å3á4Ø5Ï6Ù8Ð9£:—;¦<Ë=ƒ?“@ü@‚BÇBÀD¨FëFšHÙH«IïI¬JêKÉLÕM·&›'´)Ä*±+›.­/¸5æÝ6 ¬ßíìâ§¾¦ á   ½ çù“›ÇÛÆ!ü&í(+ˆ0™5´69¨?ÓAÒCËGÛJƒLÖL¢7è7ã9Ú:Ú;È<ž=©>­?ÜÓ@ ®Ì»Èö °­þêṵ́ÌÞú±"î%ì'Ø*„,ö,ƒ/ü/â0µ1 6ç9<=Ê>ú@»AÐB€D•E°F‚K™LõA˜C»DàEùF¼JðKüMò ”íÕ É â•Ç‹ÃÑ¥…û‚•âÇÆ˜ˆü» û Ó"“$ì$å%Å(ñ)Ù+Ò-Ù.ê/ü1Ë3¢5Õ9ˆ;¯<¸=À>Ú?Á@‚AáAÔBæCàDØE‚GèG¿HËI…Kç ³È»Â²Û“  Ž î à † Ž·£ø„ꃱÀÆÐ“Û ±!«"±#Ó$§%Ž'¥(î(ž+’,¿-®/“0û0Ì1‘2º3´4Ò6Â7Œ9ð9ð:â>ß@‘BëBŽDÔDÁFÎGåJ‘L¿ €¦ê¶þÇ“Ö ž è È ïݹÇßÿ‡Ä£Óü"Ì$Ò&Š'•)¨*é+Ó.«0•1õ3Ù6Î7Ñ8<ï>BÐB†D“F¹GÜJÿK™MNÊ ÍÙœ ‘ µ – ƒþõ¶¸«¹É™“€ð˜!Í"ñ$—&Ÿ,ó,ð-«/ü/ù3ø4÷57„:;©=»>¦?¼AªC¥EžI’JŠKç •×ÏšäËÅÅç © ¤ · ìïΧ„–ñô¤ ¥!²"Î#Â%Ë&†'ç'ý(±*Ý-ò.„0Á1½3õ4‡6Ó6¯7í7ê8‘:æ:è;Ø?D—FGõH·J¤K¢LçL Ð5á>• Æ  * í5òüˆ(‡>Ž-ü†ž ô¥4  ¡ ã:ï$ ÇóKý ¯(Ð ’Ý èD‡ * ýD ¸1 è/ ‘JþM ï¹# ÄŸ ‘Ùü –™'®õ £ ¥#ë>ð) Ÿ–ÄK ˜°>õ‘¥ »>õ &ù ×# ê(¹ß8‹6‡ü" ’B Ò¯) ò úÊ· Ç„À$Õµ0ÏÛÙÑÔߥ¬AÎ醇áÐè×çÙ ŽöÖ }õ-Úÿá/­$„ˆˆ «“Ŧ‚RÁ£ÎÞ„ ð'ÞF˜…¢%¨&þÀâ´ªê꽘 ²½#¦Î¢—>Ð"Þ,Þ!‰<Ø š¸·-Ü=± ±"€«$„Mĉ>ÅŸ&›è ª&÷ ”- Ú( õ Ê›•¢© · œ ú*‰Ñ D î Ÿ Ó Î ã 7W±2 )‘)£Kó$ß «Fû! ôÞж+á0ãrÏøG°×• $·¸¾‘—Àì#f!®ªà›vóç²"•  ¨ƒ›¹´ ¿°ð0š‹‡éèÓ͉ ÔÊ ‰‡_Ç#ƒ¸ù aí¤gžMÍŒ†ŒèôMòÊ#ŽØ³š‘$ï» ÉáÅß‘#÷Únì ô àh¨…¨ðß Þ÷ok™sÖF¦äÝ ™‡b$Á%ÆÜ£R¢.Ü5Ë£#õåÊ©Ê!&äÁôk£ž ú÷^\§âZð±Æâ#œ‚áó1¨Ö:Û=ß NúÜ) %‘; œDµó*‡,âü ÊÝ ¤/êê Å( )( ‘(®/ûîø¥ °Á Ï œ*t_Ù¿ ¼²2‘ó¨±î ʤ¨Ó « úü¼„Þ‘F“&§·ÜÐ ´¤K› ©Ú„¬ë «Úï ¡ïØÏ$Š † Å$ʦ LÞÑÈZ€îR¨”¹‘ø ‰A‘Ž´¨¬Œ˜×–‘ÁÅˉª 68”þ<ÿœÙú&°Nö ž)1‚J÷ ÿ'²©KÆÆÈ Ù£À +û>î)‚2ÁöBŒé=Á»µ)†Fš*¡EÜ?ð¬õ: “õ fßEî;&wÐ&øŠ;ÀÃ+´ß§0æË¥.Žá‘Ž)ˆ™Ø'È Íí5™ôÛ†}Ñ Ï›úr‚ÌÞƒã1ç%‡RùC6õ!þKÍ'ÓŸ9»?–ÎíGœ>Ëà%ÒÀ+ú,Ñ·X×… Ñ+ 3‘ °.˜Þ-•.Ыž›:ˆ&ë=îÔGº–@Ș˜Ã¡šÚ'ÙMîG¸B:© ¨´ìf†É6ã&ÞMƒ‹IÞK¥Ø%ƒ £Ñ×>¯Û ï3/ *)‹Ãâ÷F÷°Ð“é®ÝµÊ¦„ ÀÌGé0éä ¶@¸î듯 ü4¾Ó½6ÿÌÐ;˜®4ž0jŸ°5¨ ›IÛ Ìï3¶ž’ª™ úÇ)tÐ ô@åí-ÄBàIé+¹Cî)ñÈ5û •€›5¸(ÿ% … ÞIîI€¤#˜#è¼8¶)‡Þ˨/ý8Á–@jüé… ú¤ ¬Îܤ Ü Â‰ —ÿ°B÷ œr ³¡˜ àÎ  ƒm s^ nÈ €h öl ó W¥ð§ ÕñÅ&¨/^É1'–¾Aô; p Ï"ûL±5õØ ¨$½:Ô2— À»5 ¤6ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œì¯ ±äó ב BT€õÆ#ù¦ß/ ã¤ó ÿãÑ · ¶*Í – • Œ·u² ô ó ž Ÿ' è@ž þõ«àâöü2´©ï K£Ž7þá Å<ƒ ãž ¸ ¸ ¥ Œ²•–  ”èî­!ýÆ Ð ¥ Íâ§ ‰ÒÃ5 ®)‘ åÓ¡4ç» —ƒ#η6ù;â6¿ë!û¨åã ² «—  ý8ÿ,‰£äß» AãÉð™8¶-¬º Ÿ)–}Ì?™EÏØí™+Ä·ÚòäA Þ öȧ x°‘‡9®:Ì" Ú ¼"‹8 ™±<õ"£·9‡NÚ ¬DIL‹JÄ4€#ŒÆ¶² û@¦µ¹Bæ/ ê8 µ ÏE¥(é¢ ôÀLÄ  û ¦Ù2À© ääŠ ê¬)û À4 Ÿš!ŸÇÅ Õ ÎJ ì~±Š¸*ˆ‹ ñé>³DûD ÅÐ<àö£?çí(ñˆà9Ø×2 ß ¡€À$T … ²ÇºÁ±Ú’Ÿ € í  … ¶œ¢÷ƒé‚°¿ÅÏŽ’Ú °!ª"°#Ò$¦%'¤(í(+‘,¾-­/’0ú0Ë12¹3³4Ñ6Á7‹9ï9ï:á>Þ@BêBDÓDÀFÍGäJL ÿ¥éµýÆ’Õ ç Ç îܸÆÞþ†Ã¢Òû"Ë$Ñ&‰'”)§*è+Ò.ª0”1ô3Ø6Í7Ð8<î>ŒBÏB…D’F¸GÛJþK˜MŒN ÌØ› ´ • ‚ýôµ·ª¸È˜’ÿï—!Ì"ð$–&ž,ò,ï-ª/û/ø3÷4ö5œ7»Aƒ:Ž;¨=º>¥?©C¤EI‘J‰K ”ÖΙãÊÄÄæ ¨ £ ¶ ëîͦƒ•ðó£œ ¤!±"Í#Á%Ê&…'æ'ü(°*Ü-ñ.ƒ0À1¼3ô4†6Ò6®7ì7é8:å:ç;×?ŽD–FŽGôH¶J£K¡LæL œö×Áæ¢ û ü —Ô¯òô§Ü³³ž Ã!Ô"Ø#Ú$&Ÿ'¸(Ã)¦*á*Ÿ¯-›./Ç/Ã1ƒ26†7°8·:Ê;’=ó=›@AÔCëD«EØFÛI¡JÙKÈLªM ¤èùÜÙáÕ€ Ö Ó ª »Ÿ«äâÁݯÚÅû¥É Î!Ñ$Û%Æ&À'Þ(Å)Î*»+æ,´-Ú/Ö0¹1«2¾3Ñ7½9»<×:¯=è>õ@ BîB¼C´DñEùG¤IÀJÔKÌL–Mº2œ1©4š5‘6±7ü8÷9µ?Á@B‡DÍEæFÊHýKËLŒMÑM åêÛÎÄ…° Ï î ü ¦û§ôýÛÅ»ÍÙú¹´ ­"í#Ë$Û%´(Ï)»+‡-´.Á/Û0Ã1Ý2—6«7Â8ú9—;Ë<Ê?ÎAÐBÙCæDžFŸGŒHçH×JßK†M šÖÔåóŸ Ì ¸ ›´ÎŸàŒšªÛ¾¡È­’!Ú#à$¿%ü&à'ë)í*®+Ì,ã.¶2ð2­3¬4Á5û5ð6°7Ü8Î:Ó;Î<Õ>¨?©@ÉAúFHšJ™K¢LêM¡/ «Þìëᦽ¥ à Ÿ ¼ œæø’šÆÚÅ!û&ì(€+‡0˜5³6€9§?ÒAÑCÊGÚJ‚LÕL «‚φ¦ø ² ¦ 𠀩žˆ‘ãÙì§©­—€ —!‚"ï"×#È$¡%ˆ'“(ô(¯*ý0Ÿ2–3³4é5¥89²:Æ=·>Ä?ÃAýG€IùI°LÔMÈLéK«JîIªIØH™HêF§F¿DÆBBû@’@‚?Ê=¥<–;¢:Ï9Ø8Î6×5à4ä3í2î1˜0¬/Ã.Ï-Ö,Ø+¹*Å)à(»'&ƒ%Ü#î""Ü!Ë ª¾€Ø¬‡‰‹óþ•¤Óà祡 ôæ®ëJ åñ˜óË ’¸ìºÿÀìԗצêþšÜ߀ Ý!¤"Ú#Û%Ú'€-÷1â4Ô5›6Ý6ç7‚9Á9â:™?‡AÅA†B¬DÊEFãHéK©L ȳ½Öζç ì —£³«¿É¬‰éâô ß!É"‡*Á+²,‹.¾0… hîêÇ­ Ø è ¬ Ó ¸ù¹êÈÒê×’Òÿí!×"é#É$Ø*ï/ö0ï1¯3ž4Ù5—6±7©9‹:Û: ;=’@žAC‡DïDÚGÉHÞIÀKíL ¶„Ñ”µ–ÛÃÉïÑ Ø ¨ Š û ¼£’þϧ¸šé¯©ÔÀïÒ± ó µ!"ž#%Ž&ç&©'ß(,ä-™/ù/¾0 1æ2¢3ß4ƒ6æ6«7‹9¥:ë:ð;µ<ª=ë=€?Ì@ŠAÚA¤B™C›FîF´H d¿¸®Æ¤†îÃî´ ˆ û™àõÿ£¬µ¾›˜›Å™·¿ô!Ò"Ã$»%È&Ö'¶(³)¾1Í8Ž9ü:Ç;„?ª@ªAŽB‹CèCôDÑFêGŸIùJéK‚MôM¡ ® ð).¾2é< JÞ£úÔè § é¹¹¾¡ã—Õ£!Á"Ò#þ%‰'”(·)Â*«0Ý1ù2ó3ë5«6–7Œ8ÿ9ò:€<µ=ö>Ô?Ô@ðAÌDªEéEóFïGÚHõIíL ÛåÛñ æ ¾ÉæåýþËŽ‚¦»µ ì"$³%¶&š'³)Ã*°+š.¬/·5Ü6¡7ç7â9Ù:Ù;Ç<=¨>¬?Ò@ôA—CºDßEøF»JïKûM ”àߤËá ‡ å û¸÷¶øÞµ½‡îˆ!Ï!•"·#²$Ø%ó&Ü(û)³/ü0¸2Ø3Œ5¡7Ñ:ñ;Ó=à?‘EÒIèM çÛÛÚ¥ ½ —Ö™‘ÞÛƒ¤º¬«€¯…«…!"Ü$Ò%Ä&¶(¹*,ù,Ÿ.Î0û1ä3Ô4¯5¥6«7¼9Ã:â;Á=„>ù?¸@»A»D˜GžH”IÕI“JÕJ•K¦M ­ËºÇõ ¯¬ýéù˯ËÝù°"í%ë'×*ƒ,õ,‚/û/á0´1Ÿ6æ9€<œ=É>ù@ºAÏBÿC”E¯FK˜L “ìÔ È á”ÆŠÂФ„ú”áÆœÅ—‡ûº ú Ò"’$ë$ä%Ä(ð)Ø+Ñ-Ø.é/û1Ê3¡5Ô9‡;®<·=¿>Ù?À@AàAÓBåCßD×EGçG¾HÊI„KŽ ˆ «& § ÔKâ+Ä FÉú ý Ñ ä³Æ ò­º ì •" ìµ+ »BÎÈ!ö)ˆÌô12 ó˜ „+§ µ´ ß=ß1 ¬4ÿfÿ)>ŽÇ Ã!ËÅ¤Ú ™%® Ææ!¾ŒF´/Hƒ‘; — ×* ’ 9ð9¬ÂL „é1¡"ÞåD u§E†$“Ó'‰8 ·<¼û9€*ñë* ™8°ô&øæ­;ò­;…Ç7Ð7´×õë2hbÈ5¨®ÊD÷% ¤Ú9 ˆªðÁÀ,ß ’' ¨'æKP” äO&ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢££¨–ôšÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¡‹ýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJŠH°H‘’®§ùÓœšËa•zŽ´`j hð½†_½a‹Gž”>’:C|’@oO õ…{‡P¤­š‰†È ¤¯ŒþvH—hÀºàÊ–—Цªæ¨î—“…›Êª¨ÿ„†§V£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’´”˜Ú•…‡ÖåôŸ°µ¾¸‘T]y„œGbY©Opq?CØÀ\væ¦îö„”œÂ×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qpmUF‹ªâ†Rc™±–ƒƒBˆÁYwŠ¡Tç”R§t®ñehRA°vžmÊg}õý²Z¤G똯ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÂÒC¼‡®›¦š‚M…½r§eìøôDs‘Pwms¨µ¤£‹T}»Tú£ç‹tî‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆuì¼pN•cÕö™¼Ü~˜GÔȱ±Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒw§Š“Èr”rÊ‘P£€F»obÛ…qvsD¨Ÿ¢Ž¶F°Ì¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆªmúv`c²‰M¡nµC±[˜j?<­ñg•f†žƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­¡ÚʽR— xI©xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“‚±ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJx…PÆZX|v˜[bhU«IT–ÚžW…Ѝ…‰Œ]z†ªTžˆoÆaëx‘`w@±•÷GîHÄü£€g}ZÝ–µÚs™r?FSCÜܔȯЉ^s®Q´¾Ñž‘©‹Ž ‹ì²™zø@kyópŽ»¾[€œß\>ykŸ÷&´nŠštk®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½ÊûÄ™à½DDO"“Dôò˘Ýý?MwGz¨¤“òU¯V¬Ô‹ÌyrïƒÔl©²ªépXyƒ‘ˆžÜJîEƒ„Ý‚pA>BIŽŠOüQž“¦á=BJ ›LЃFO•C¸š§{EysT}Ýr›~¢¬¢DnœŽDQq¤·œbwœytilÖtwwŠtVt¢»l€HüèC¬?RAIµb†Æ6 ÎIÍ6Á>¡®äÆ ‹Çè¥'ÉÀJ ‰9à-ä'«'Ü3î'ë-ž ˜æ3î!¨Ûí òD‡÷&êDˆ9”J„ Ñê¡;è< ° 6Ü"ÒH ˜: ‰ ÜÎü‚ ÌE²”95,Dõ½â>…ƒ² $¢%KÑŽ¢õ‡¬¡‰ˆ›Â€¡¬°†€­÷Þþ‰Ú­­ðŸéÒʌٴ¡¥¶jsT‚Ùrœ}¦©åpžÑMu¥‰¸ž_z{tgjÖ€v€tzŠrVtŽ¡¼lÊý§íÈ·b!¨65þŠèMôÁÓ¦¡ù»FùÎãÔ¼Æ=¡ Ù;~é9“EàÙ›EÅ‚ñ"©ñ ´ “² ¶ âMäÚ#ýž-ÙµPö”DçJˆ†3,þÀò«Î (õ7‡Iß¿þ/Û=Â8õ‘ Ù0¶½Ší!µ“ C²¢%°!š ý'Ðüщ5Øà ƒ¬˜ ¢Ì ‹”/Î æ=´‰3’ŽÐò ¸ ºEÉB9QÜ-ö¶¯ ½2¯…ª×Ùì:¾ÙøBúMü2¾»ô7Ê Ê½.ñ•=‘ » ¿™Sç*¬Î1ƒ?‹³ýÍŒG¨Ë69š:Ïè'ªKý;ݸd—<™ ²%œ»ˆ Ó<Š í6ð(ˆY¢Ø+íÂ÷ÖÓB©¥   Íï¡ öEæïDù ùÝ>©ŽŠœJã3("  ¡4…  u  ú%  è  Š  Á Å' Ï Ò  Ú ‰*  · ‚   ¥ ÿ"é ä4‚ *™ õ* Ý=‰Ù<éC»¼ž/pžHÓ@£*´)¬åôý$›%ÅAÙ:õ9–L·>¾ q9ñü ç3ìË- ί¶1’M÷ÿIžAØC˜®¢ È9ß6õÖ>å!¦ûäK‰ £­$×!˜2ã!–ùÃ"à   Ÿ5ƒ†?î 0.ÒÄ!¬›¥(Œ'%ÀË1+JÙ–¾^â Ñ—™"ƒ'ì=Ä;´ÈÚJÑ š³@ª ¼M%ú¼Õ>´‡îH"°:%„ ž‚ð'àô Ç.î µÓ§ô+¨>kñ Èš ¬$WÎ- Ãî÷ у%¸ ø ýÖ,4a+4`¹®+ÿ½Ï5ç´:£†ÃØ È ¿:›1 ËH’çà%è+’(“œé3®Öµ‰Kò¯ Y¦Aã ²6 Û+ ¸ © öH øµù°, £.ý×Ë ª žß1 ö0 æ ö5À ¥7 ê Âã)á ¬ ¯ à"ƒ øšÝåÛ6´˜.èØæôÂ9¬D® Ûæ Ì0 ÃIÕ$   —GéÀ‰œ"”œ"¢GôH®ž³Dï Ô” + ‚‡°6 Ù+ —)ÜFˆ1Í'Ÿ(ö„%æ ‚7º:÷=›(ç-•ð!ØV #ÁF‡4åF/¬GÖHâ¼Dð£ Ï΃½Æ³–†#Ι Ý(G«?GFÕ¶Ü Ì”/¯ŠÈ¼Bœ$Ì© ¸¹( ¬ì˹.â™Õ „Ö ÒŒÚ"­®#)×Û=å/¯.40»‚“Ôé 7 Í5 WIˆ ôLÏ $ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™s玣DFûw€qV‹©¢££¨–ôšÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¡‹ýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJŠH°H‘’®¤üÓœšËa•zŽ´`j híÀ†_½a‹Gž”>’:C|’@oO õ…{‡P ±š‰†È¤¯ŒþvH—hÀºàÊ–—Цªã«î—“…›Êª¨ÿ„†§V£žï–¥º€ÎlÕ䜒§©½é¯uŠviSîÇ—œ°ªD’´”˜Ö™…‡ÖåôŸ°µ¾¸‘T]y„œGbY©Opq?CØÀ\væ¦îö„‘ŸÂ×¶°ª‰ˆ—gAbp•zxªfW’´¨˜pŠs£¸qpmUF‹¦æ†Rc™±‰ƒB„ÅYw†¥Tç‘Rªt®ñehRA°vžmÊg}õý²Z K딳ò©ÄLHJKÁJMÞ¦ïÛ‹˜ ‰À\¯­Òý<‹’ÅìÖiÞærŽÂÒC¼‡®›¦š‚M…½r§eìøôDs‘Pwms¨µ¤£‹T}»Tú£ç‹q“î‚ït~ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆ™ú€Aa–µ«•Ãö¸•LY>}ªUó·ˆuì¼pK•cÕóœ¼Ü~˜GÔȱ±Ã—}k¥‘‡‚§›œˆ`>Îoo:ü@w§Š“Èr”rÊ‘J©€F»obÛ…qvsD¨Ÿ¢Ž¶F°Ì¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆªmúv`c²‰M¡nµ@´[˜j;@­ñg•`Œš‡vÀr¸A—ûbMEòƒ‰òwkëp”â­¡ÚʽR— xI©xg‰Rv—·…íé—kmbq\ê‹^¾Ë¥wš¼¶k¥”n“ÿ´ƒ|·¬NMC¡aEh†¦hPbqÁgj…lQXZ7bOÌt®ï©cc>BLé‡YB¶®×µ`EbÆ<½¤cLÜ—F…EuA•Ì>PJx…PÆZX|v˜[bhU«IT–ÚžW…Ѝ…‰Œ]z†ªTžˆoÆaëx‘`w@±•÷GîH¦š£€g}ZÝ–µÚs™rCFOGØà”ȯЉ^s®Q´¾Ñž‘©‹Ž ‹ì²™zø@kyópŽ»¾[€œßXBŠ|k›û!·nŠštk®…ºÞ¢ø—‡cçÖy›lc»½nܳ[žòqw Ë|½ÊøÇ™à½DDLMô€ÿ˘ÝúBJwJz¨¤“òU¯V¬Ô‹ÌyrïƒÔl©²ªépXyƒ‘ˆžÜFòE€„à‚pA>BC‘ŠOüQž“¦á=??Eæ×‹ÇçšKE¦t§šéª°Æ¼£Æ€° åŠ±È˜!׉§ó½J©¹CEO¦àCGHVˆ™Å€¡ÚN³£ýèoDK‡•HŸ¶è>G£›LЃFO•C¸š§{EysT}Ýr›~¢¬¢DnœŽDQq¤±¢bwœytilÖtwwŠtVt¢»l€HüèC¬?RAIµb†÷ó% §A 3ŠKþ ­«-ú$ Ç ™ û ° Á¹! ¾M“5úD»'˜ ø: † Ù@ µMŠ&þ? ±F Š, ²  ³-Ï" ëì7…#Î3 È Çâ¶M´±† ܦJºƒJž1·7½!ãÙ2Ç!ã2Ì'Â7QGü „Jã ôΊv¨‹°‹ ˜„ÊÃq¤•}ºž£†d™m펦AFûw€qV‹©¢£ «–ôŒšÇŽcý‹x§V}Ô”a¹~\ŸÒ¨î¶ª¡‹ýŠnz›j‰j®N£|fr“ìát¼Š®NK{ºˆ«œšuJB¶E‘’«§ïàœšÎA²zŽ´`j hæÇ†_½a‹‚D›š;•:@|•=rL õ…{‡P ±–†È¤¯‹ÿyE—h¼»ãÇ™—Ц é¬ñ—“…›Êª¨ÿ€‰¨V£žï–¥ºýÑlÕ្¤¬½é¯uŠviSëÇš™°°A’´”˜Ö–…‡Óèô™³¸¾¸‘T]y„™JbY©Opt?@ØÀ\væ¦îö„‘ŸÂ×¶°ª‰ˆ—j>bp•zxªfW·¨˜pŠs£¸qpmXC…©é†Rc™±Œ‰Š?ÈYw†¥Tç”Oªt­òehU>°vžmÊg}ò€²Z J씳ò©ÄLHJKÄGJá¦ïÛ‹˜ ˆÁ[°¬Ðƒ8ÅéØjÝäu޾ա@¹Š­œ¦š…J…½r§eìø÷As‘Pwms¨µ¤£‹T}»Qý|‚£ç‹k™î‚ït{ŠÅuKJnó€¥?þ¹‚ÜYcŒ^†±òˆ™÷†>a–µ«•Ãö¸˜I\;}ªUó·ˆué¿p‚E•WáðŸ¼Ü~›DÔË®±Ã—}k¥‘‡ª›œˆc;Îor7ÿ=w§Š“Èe¡rÊ”D¬ƒC»obÛ…qsyA¨ŸŸŽ¹F¬Ð¦àajs’Œ¡¿þöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„pUðˆªjúy`c²ŒG¤e¾@´[˜m;=­ñg•]š‡vÀr»>—ûbMEòwkëp‘å­¡Úʺ R— xI©xg‰Rv—·…íé—kmeqYê‹^»Î¥wš¹¹k¢—nÿ·ƒy·¬NMC¡aEh†¦e„PbqÁgj…lQXZ7bOÉw«ì¯cc>BLãYB¶®×µ`EbÆ<½¤cIÜšF…EuA•Ì>PJu…PÆZX|v˜[bhU®FT–Ú¡G’Ч†‰Œ]z†ªTž…rÆaëx‘`z=±•úDîH¦š£€g}ZÝ–µÚs™rCCRDØàŠÒ¯Ð†as®Q´¾Ñž‘©‹Ž ‹ì²™zû=kvöpŽ»¾[€œß[?Š|k›ûºnŠštk®…ºÞ¢ø—‡cçÖy˜kg»½nܳ[žòqt£Ë|½ŒÎõÍ–àºJAIJô€ÿ˘ÝýBGzGz¨¤“òU¯V¬Ô‹ÌyrïƒÔl©²ªépXyƒ‘‡ŸßCõB€„à‚sA>B@‘ŠL‚K¡“¦á“=??Bæ×‹ÇçKB¦t¦›éª°Æ¼ ·’° åŠ±È’×Œ§ÞÕG©µJEE¬äCDKJ‘™Å€¡ÝK²ÿ¦ýèrDEŠ˜B¡·ë>A¦žFÓ†CFž@¸”ªBysTtær›~~¥©¨Am‘AQq¤®¥bwœytilÖtwwŠtVt¢»lƒEüèC¯¸ ÌœùHuþÊ‹N¼'YÇ ð…$äÉ9ÒEÙ5¿C¡Õß7³ ÀBœ' Œ+ ƒI ¿ Œ(ÿ²)7í Ô7ô! ; ý†¾ ÏØ³³ ¤2 Ù0¬ã ü½ï‚¶( ½8æ$Ë? ÆÌ€¾3 ® †ð —- µ ‡/á  „"Ý=¼ª, €;‚Ö ö ± œ Ô!ª0DÆbÃÊÐÆ ‰E“Eݯ:¸7µ ø"ÀCËC€"ˆ@ÀGùÏÿ?¼. )¤" ä˜á$‹#ÝÞ«­ ½¶2žÉ6«, úLÅÀ º!ŒŽ$ û# š:Œ.Ê'¤:¡¶7 þ ò ®0©JÑ5ÿ!¿JÛ(ÿË©2 ¡ ¾C « ²­) …FÕˆ å(ÿ¿"ª$BÞ<³èë µ Ãð# „ •;Œ‰¢ ÒIš*ß!<*íDê ‰À, ã/ Œ È ô ÎCæ1õô&ü ±ž6µ8 ±DôAþA‘Ì Ž<¨ ñ:œ: ý?û:¨‘F „ Í *;>÷Ê;â1ÆKñßBçEù ·/¶¯€.‹.ÚFß÷ À! •ˆò†CÿHÃC…@ì?ªâ ('!‹ ýAØBÇ!¹+µ1;–7 ƒ/Ë7¡4˜2¾-²* ¦ÃKÖø+7)íÐÑ5Øô!Ñ Ë,F¬8‚ž4>n}»%êP²Ç®‹D3¡ù ´A¥ í&šCJ•!¼–«Kì §ÿGù³$3Ú#Qž8¯'È*© ã!­ÆFþÜjZð>­9šEkãA ½º!Ì3Á¨R‡'ÀÛHþHŒ ü9Òiè=úí-õ ›ž ù<ÎÒI¾ ßð2È)¬qïÂ8•Ìì;¯¿I­§ ‘…=ý>†×„Õ² ª¨?¡I;²M“'¡,Õ.’ Ášá¢Œ$а§›‹8E=þM˜?þ¤1”ó¿)hô¢¥ ˆˆö+7)Lÿ9ø Á€ÎДʼ&Ø,“Õ:è>ã«Üˤ"¦ø)Ê1Ò—!â9ü+ù<£ A ¦Û¦7! Ô  >Ç'—<½ŠÒ¸Þ+È š1ç ¢!à! “.Œ,ÌËMå5” ÐÀ.Ä" æMÆÉ&ç å"ò(—ì‚HÑ ©C,“%2Ñ̼9¦À.±A¬’¼L[· ¯¦›:þ9ˬ ù-·»µñ…+N\¬Añ ºôO÷ C¶³•9œ°ë"©*Ð/IšŽ¸)ÙAa5Ú7À>ñûø2¤Î ò’1èü¥ê!ú"Ç;\ü¢”(!Îõ(µ—)º-Š+ª ë µ=r0ËGŸ@Ôf%(Õú(4Û£,Ã6± ›>B)‚£†>¹&ê"J&AQ‹*Ø %Ê8 £8öÉ)¦å3•± GŠ%KÚ'$RO ÊÅ ×áËAó3CË)ô#£4àMŒ+Ž ð"è0¼5 $ù2ô(‘Ü.¹ö!ù²¸—!Fà×·Ê“´Ž Ñé …¥›Ž,7Ôã “¤8Ççô”’µ'-4AŠêL,éš"6‡O!O>:í=ö5 Mã’eP&F%¸"dƒ£ÎêE€”Û(ÜMä“0¾:‘Ã2aö ›G  Ù+̲è?"ìIŽJí7¥+R*LÑ"ü,ïô…4]Þ‚)õšL§Hã«Û"¥9Œ#×3¢û@øH¡3À¢8Š¢D¥0Á ¯-¦/ø¡/d¨é/Ó/¡òƒ#ˆ “;‚¢ž.Ù>ÃÌ ¢D¥7„ û þ.ü>´J¼ º:ÑIë.VPG”Ûöšš?¿BËë… #Ý‚žþ9þ+†å þ>¥8áH»:ª’ 3%*27x5'+ +##‰/LA9.JZUB<" ‡èÊÖì ¨"ï ’ Ä+´¾ú£ü‡wÎã Ó1ï¯+Ð1‰ ž ´Ú0¾6Ò æ×#“¢,¦å¦#GØBÒÇ&ˆ Ü&ë§ï ¬Ç ø¿Ô¯)Æ"©Ø8«¾'ÀàÞ‰ ³;Š<«Ø '¶LÖß2”;Ï!Á2¡’÷1’/—?õJ˜3Ø ª 6I0SH5'.&O"(9Q H$£'H7/‚<ÇÜ;ø1„Ú.ñM𥛳+AÊA—r’<È1ìDÆï$Ê’ÍÆ„ ¨$ÏL¯(€¸6ƒ/Î;¥&§AŽûE×î"¤,0‚ò!Ã Ž ©ý8í² ºAœ(Ã=Þ2‰ÒM«ÀÛŸ4å ½1×’µcÝ'i¶’)Ò5 C¾ Ë@¡·)‡Ê1Þå 5â@ûÿ7™;þ#ü½ç3ÆË(±"Ыö £>Ø(Za0ì ö!”"þ¥*¿ý/ßþ“(‚:¨å­!Þ'š;á±F+=þ8ðæí„ž$èBªËI“8›J¨$àK´7ûHÉ.0ï"è. 'HÁ&æ¼F¡ ¶ á>3©'ú<’1Ù/‰JÏÿÌ´ÇĨÿä„ Í™êìÈ7 …»¯îÏ ÙzÌ ýý“¨üÔÕéŠ æç„¢‡yÝò̲ܒd¡ : Ü#z»†®$í¨è(ã§Ñ¤ õ‡ ƒŒóž"³ë¶'Ë£ã¦Sò%Ì£P³ Û4o—˺‡&žE屘ÓÛ}³¡¥ÞÙžxs«õtƒÉßùǦè6ˆ CùK š¥D ð- Ýâ/©1¿…I› œ “F ±?…CÞ‰ÒL› Í ¬öªã/„=mõMŽ?œ1ÿ¾)fŽ%£ Ð,Í:Dß𠺆ÆÉŠÌ¯‹ ôñ:Õ¶9½Dõ)"$! #³¶‘‹Hå:¥>„<ØH¸¬H¡£ñ ß'  ÿ ¹±´ ý Òš6ßý÷!• Õ) Úâ" ±G¨ æ‘ÐLŸ) êÅù<ºÖíûˆŠ ×Mž& Ä ÷= ÷LÔ7³ÙëG”¯?Ÿƒ‡ÂH¯!ÓA¢$Ôª6’C­Õ(B  þ ¤À ½’†å©­Œ‘; †ÿ À$¿ ò§¤4î*Á$§' Ê €/ß5¸Õ × ûH¹HÐI¯B çÛÎ/ŽÐúJ ”G ι ç' Ý/ÄBø –3 Ð Ì æ5Ì/ ž Ð à/ÏEÚEúx£5”˜å2óI ‡@ß4þ' ‘?¼C Ž@"ÝDˆÜ ËA¼@í¾JÇ@ÖAä)ç% §M ”ꦃH¶7¯â º1 ² “8;ŠG²E ¬1Þ7ù>þ̸! Âö> ±ÀÕ8¹ ¿ÿ ã„?ƒ¼Ã  ËÕÅ>ÎÆ ¤A9 ðFŒì5–ï0©I¡? Œ;À;þÊ;þ:ÒJ â*ö<õ ×ë?ö?èú*Ö+ û‘ËÏ ¨> ¸,µ.âƒ7Ý€ ” º …š*© 7+ ”×…IÎ=€ 2˜Lð3·?‹À=¶(ûI»Ê=³ ï)ã" ± ©·â3 Ø*ü †J@éDÈK¤ú‘Ë5×7¡ ŽÚö /ó%¹6 èã+ À(ì ‚B œ1 — ± ¾,á É1‰í; ÚÁD‰#”ž–¯#´Ï§»ð¦íü»Ë ”ž ã­¥ ö·¡³ŽÿvÜßþá ñ”˜ ¨¥FÒ—ˆ¤Íœ#õ¦Äìò§îÜŽ˜ ˆ½_°ù†Ã“ÁÂjàäuƒžžÏí3Ä æ #ܱݫðÉà]‘—  … î&É ¬úÑ Œ¿Ïë®’‰¾ÞÕ©ä³Ñʘӛå ùŽ­#{¦›éŸ¸É¼ ´•° â±Á–ÛŒ§ÛØí´€èªœÂƒ¡Ýýÿ¦÷ër“›à·î¥ž™†žF<þ  À*³ ÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒšÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšãu¹«NNx½ˆ«œ”xJ<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št…=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEà# mF…EuA•Ì>PJu‚SÆZ[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³_žïqw Ë{¾ŒÎøÆ™ä³NAE“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿE§>ئޖ=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œ?äK‹) ïKµåÆà85 î1ú ÅH²2 •4 Ù ¢-÷Ù‘( “ Ð ‰6ŽLÛ,ªÉ Õ ê@ýë@ŽœŠ¼©' þ<° Ÿ%½9µ Ñ ÙŽ¥LÞ?‹F®I®à ïÕ•Š·2µØÏ ˆ¤0Ø@˜Gã›G ûÿ½Þ‡+ü¼9‰$‰ ˆJ>äìùŽ˜ëNíNÞ µÊ#žôø èò½Ì$¹ñ›ñ¥ ¬Ää"¦Ü åKŠ â*“NƒEóÅ%öÞ<âÎàé †êÂ˜Ç ’ Ï!ñ Ä —"²˜šýÄü%Ø¢ŸÃÐôÑôÒ Û½DÕÚŒw Æ¾%ና ¡8ò1í;™J³Ê´,ÔŠ‡=N›? §1—ó¿)h¾1ã¨ãØ:Oÿ9ëû Á€Ñӗʱ‹ öF»Dã/„ªŒ>ÒFC"ÁMEb†/¿Cʽ»Ú±ÜA< Fô(ƒEïFÀ2;â*ž¸@4‡?Ѓ › ¶6Ò (Ïð ºI‚?û2¼K€K ™%3ò ¼Ù+®›±ƒ)¾‚“"Ì)üÁ5’8˜ô7»Fœ¼:ñ=Ñš7W°A± Ȥ , ÿÁ ž  Œ¡IÖIÃ042µùB¯Ì¬L}÷ ñÐïDý%öÁ ×Ecæ 0©#å&>è<ÛæZ*70µ®Ê(¨!„CÉ,â/ Ëæ3÷?ë' Ë-ã Ž_à1–G Û-Â?” ø'–¿3ç 7¯­ Ÿ/–7øˆŠÏ*©Ã¥ ç5 ”@ .a- & ¦6ÁEÒ,ƒø”/5Ò­”*²&˜ ,ü£%»/Ø!‹ ج£0’5œDÖ† Ž#Ô±3ýÁ¯=—(ç,JÙ'ð(pŠÙAÃB§Î/ÑŠv–õã˜ÍÃt¤•z·¤£ƒd™mê’‹¥†w€nV‹„¦¢££¥™Ã´ŒšÄ‘c…t}×õÅ~_œÒ«ë¶ª¤…kzžg‰m«ô|cr¦ì𨹏”½ˆ«¨…ÖŽ¬­èšÑð}ޱccŒåȆ_½d‹áêö•¯ìò…{‡S ±“Œ‰È› »¿Ç’ΔëÂù§«ÿù£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°Ö°•…„Ùèô™³²Ä¸ŽT`v‡“²V©Rpt×ÀYyà¬èù‡‘o£Ï׳³§‰ˆšg s’zxªfWŒº“¨•s‡p©ÅnsmUˆUò™®ÃÈVz†¢Tç—ùt­ïehQîzžpÊd€ï²Z£³—¬ñ"× ½ ö¦Æšt…ÉÃu¤aíK°÷ÃsŽPzmp¨µ¤¦ˆU|»Qý¦ç‹š’k„ûùtxŠÂxüú€¢½“µƒßY]’Þ°ùˆœô‰œ–´¬•’½ü¸’¨»ü‚ð·ˆxæÂm~’Záêáٳõµ×€k¥‘„‚§ž™‹c‰lu³Ãª‡“Èa¨rÇ—ðþobÛ…qsvìŸŸŽªÍ©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§^†|]f«ëeÁÏŠ˜m¨îj’`­ ¹o»ØøbPÃïzhëo•â­¡×Í· RºtÚ©uj‰Rv“»‚„êé—kmhr¿‹a»ðw¶¼h¥…ÿºƒy·‹ Ž¬éQÒ©iñ©ó«ì¯ÂÑœðYøºÆ¤ˆšÛÛ¾ÕÆÅZ[yv˜^bhU«š™Úžæ­’]}ƒªTžˆoÆ^ñxŽ`}Ú±œ€›¦€d}]ŒÝ™µÚp™rԜڔ¿ÂЀdp‚’´¾Îž‘¬‹‹£‹é²œzø«vós޵Â]€œÜ^É|k›ø½kŠ™xh±…«ê¢ø”ŠcÝÙ’kj¾ºqÙ’žïqw Ë{¾ŒÎ÷Ç“¾ÿ½úʨ¡–òU¯V€×vròƒÔlÕ­ép[v†‘‡Ÿß¸Â€ãvŠLÿì–¦Þ–=~¨×ˆÊçš áûŽ­„»sQqéu˜~~¥¬¨ª¡‘’n§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†¾Ú‘¿_Œy$!C– ¤‹S‚u€Ä*Ü—ö}ênŠGW‘0-<h/ ±6Êè™ 1Ê3—ÅÍÐ‡Àö!äÂÿµ*—ì ¸² µÑô ½Žé °`åÎ쫹Ʋ­® aô«Àa˜ï*.‹Þ*нý á €óå—"ÇòË£³Ø™1ô"ÿ ž…µÞ±£C‡Ð8ƒ†8“8ï;Õ(ˆ ÀBø+«òå.Ð'½!›àí¹M0 ¬@ÌMÜ‘-˜&™˜Àî"²á—_~&´´å ¡¤‡é“—…êò'‹‡¿#‰§ òŒ Ú „Uòìà_ˆÿ³Ë'Žà ɸ‘#øÚ“ð#×i‹ ¥½Þ’Û æôpk¦ñ$Á%ÈÚ— ‡ìô4pÿ° …A˰줮âX¶Åâ#®LE°LË4s²(ë "ÿ+ Ã'¤7ú µàAª0 õ §A¸À9áLðXð)ëž3Ø5£=äDÚ´ Ÿ†(ÝØ‹(¯Î¢ýØ:²+ö™Ä“®K¦Ö*£?ø@È%‡4©;ݧùÌKœ¬ (ª £„+ƒüü%Á4ưä!ÓÆDÃ/© Üñ”=°Ð2DЕ(”>K‹ #2 /õ†8’ŽF›&©%ò%Ç)׬ú £Iô T˜Æºð¯G¨«(¥,Úçá5åMÈ •3 ¾%ÅÄ„K–IöÚ,häê8¦»½%û”) ³ñ“;®”º™"Ê,Fáç Œ,Þª@Ð@â ³ %äϰ‘1õú–Ù(!ò߸3‰'ß´ ™(—£¬Ìå*¥ .© È¥Jçœ"µÝ—¶(»(Ø‰ê‚ fIQ¹ 7"ͯô1˜©r ò%+ >: Ô©ã A ½ÒŽò›obŸ õU\(µÊ€Í£*8Fþ½šÖ$[2%,':ª) 'šŸ¦ šl:* Ë7Û§ !T'•üÈ€*ˆ ×—øë ìA,<ÉOk¦¿€³“â® !¸TR!%Ñ ² Õʼ … † ,š¬„Þ × ,¨ € ç Ø6 ×>þ "¢Må ÐLE 3ó  .؈/ÌQ–Œ 3x"MK’®"ÆHoÂݤ º '|" 9µµ&“ª #¦Í³Ï ÃG¡ s¡ÂŽÜ\ÓYë >—ï ‡  26™ Âd -¯T(*"fF€#,¹ì­ ‘ å:àĽ™™9VZÕ‘íCøôP §6ø  ¦J¹eΑ\”05‰¯º|=Íó‡ Õéîç ×ËØÓ£Q.bR8E ÇC½ñš Ö‚éN .–¢ ò§ ˆ89ªæ¢t#ª¡ç 󬕞’ 1зKÎ Vš½ Ή„ñš Dˆ ŸÔ×7rÎJw)Q1]3ŠG²¢ ,4aŒSR$C12 +4`…“9 ½™â e²º7ø¢Ú—  Ô]%G–™#$ã¿Û…XÐ !*±êÍ»„߇ ›…Äæ Ò ßÝÄ­ Ñß²‹Ê ‡í¢Xc- (Š´ýô' I) A7p 1(”ÝÝ Ê × æ#18 œ,CÉóú uý!` Æ¥³" '1‹ƒ & *À°IDï¶@ö¶"IüB²× £ ׬ ÎKþK ŽH ºž ‰.ÁÊI¥©½ …&  È7‚4 ë ¥ š3Ð ã ¥3à0 ±I s î ÖIÍ;½¬ˆÝ •Ì ¼Bß뺞°MÞ–1Ú5 š-? =Žð™•Ц ƒ½Æ´…‚#Η9ñ ú?¡:Å×@™3 ‰  Ú Å.Ð. ˜Ó» B®¶* Û “:˜ƒ=>“¤:û¼ÏF¼ª¯1ü@üK¤ , °ã3° ¥5ã8 šå/Æ‹,½—€7œö. Ó“ Ð Ú* / —Ó&¥5ú» ùJ ¹M õ$ íB¨- , œH ÊFû$ ú8 Ü=‚, ²,É1»K©!è5ÿù §Õî, È ´ ª ÿ‡Þò ï øä ã å âìÆºÓ , è>˜Ô? ¨6 žMÌ*ëî˜ Â̲ ç Ô œ 7?™— è0•ª ¯M à ¨ ó ‘ Ë Ž€ ª¶ ¾ õ « Û £ 3ب; ¦ —üÚ¾ è% ˜)ŠL ëLõLè=²˜ ñ&Þý9  ú:©”Ù× †JþDÀ”.ŽÃ Í? ²G Ô õì<Ï'Ò%Õ…!§É0š0Ÿ³+ö/t¡ Ø29(=ÖFÙ?…;Ü3 «¨K Ö> á °%ÀÜà ô)ž' ²Ù%·D” ª”ˆ¶ÿ@ä ÅIÆ;ÇÝÙŽÀFì íº ½–   ¼;ÍJ¯ Õ è ¼B³*çŘ Ò<í…,Õ/Æà* Þ/Æœ6× ÷ ™ ÷"…8 ºK½ ’ÜŸ‰&èNñž³‡žêÇúî¤ ïs‹$õ6÷G •äDˆD£¡# ë á §/ÿ6™Eò¯a­ï'†?½˜$ÖDÆbÃÊ¡"½ À Ü7Ò ·J!&Kà ÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´Œ šÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšãu¹«NNx½ˆ«œ”xJ <¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È ¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S £žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò— …„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº ¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬ õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££št …=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtx ŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E ’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸ob Û…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§ ^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­ ¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy· ¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆ Z[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r @CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø›1žïqw Ë{¾ŒÎøÆ™ä³NAE “Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á– ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@ @¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_Œ÷IµDÒ7É'¹ ‡ •A Ó ÷4 ‘1õ¨1G äâ 7J$ ã ‰:ÿ9Ï p¯ó&»ˆ%¬ Ü ùH ë*9Í%¿ õJÐà7´Ÿ˜¦ 8ºü,'ƒ®¹¸5 ’E ž(ŠÝEɤ Êx|¿M¹À? ñ™Jæ ç>¼9ÉÂ5§0ƒ íÍ+í η1Ñ Í ­&™ ö&¹ "Žù…«  ª> AÓ³á* Õ ¾BúÙCÈM ¦ °¶ Ô8¹-Ä0éÊKù# ‰L ¬ ƒó Ëê ‰×MØ<õî5‚ ¢'¿@‘/î@ñ ̦@Û NÝD ¤¯ À5 ²— ©Á †D šGŽ7ñç%èC¼§Ë ¼" Ü7ß%Û+ ¤G’,¼±Žÿ#† çÐ Éà Ô5Š-  ¾ ¢ ê9ÄŠ+¿B˜ü9êF ú;ÔÂ%M©Ê †F ŠJÖ øK „/à,öìCã €@ËŠ@ÂI î7 ¦- ¿‰LÐÈJÅ ´é ÛEœ6ÆIÉ É CÍæ¡+ ú …"Å1Ç Ò/  ¿ # Ø!éŽ" ²Iˆ" ã: ø% ¬ Ë4 Ð=¹.ÊH’‡#êL â ¼ Ç6 ó­;ÒÞ5”° ذ¦µ)æé¬. Ë Èã#ÄÝÒ8î#š;…1ø úŠ9èE”I‚ „ ‘¤ Ü3–µÍK¶/ÊÊH§æÜ5ð™Ñ ö; È €B‚¯‰¦¾„—Ý ¿÷ÇJoMËKÌ  (ÿ(ü œ‡<î Æþ ƒ ÏDî Ò–ïDÔL?¥ ö&´Hø=‘%Íà…/ºúõ8Ó!‡ñ+‚>š8˜;¡"Þ½L £ú ï; Ç ­M É= ð$ ‡ “;Ì3BÌÞ¢+ ­ ¬2þ Á2 Ýå$Ï þ á0 ¬ Ö"ÂBÛDÍBã%åÃ! ã(ìH «- ÁEÞ"†'ùü ü ‘' Y ¯ Ž ˜*A‰ õȉʇ¬¶6 ó:á# ÄDÑ"•µÅŠ)ÃÛ"Ú Ë ôË'È"¦÷Ÿ óÄ7½ ì—Þ6 Ãú à Â$ ‹;ÿ;´%· å¶6ÿ? ¥“(Ê ËÕ¨ ‚ª —³F ͇L í3˜! Î ¯ÒÎþ ~º † ¨6í í…³6 ÇÕ<«0•üG ù ê Ä Ê ‘# ?EÍŒ&±³ Á ê*å - Ì'üCŽ(¢4çæ¹B›¤ ¡´2Í à!Â Í ÿ#¼òI Ï ÷#°& —èJƒ  Ä; Ò Ì « é§* è>èÏ%Ó éAší ˜Á-×( “- ÂCœ  » Ü  è ÙÆ< ¼Ù> Ë » —Gˆ ÂÆû Ð ›M‚C¹& ËÐ- ÑKþ( Ñ Ó ¢% ÛË ˜¹­Õ ¸M@ GÞ7Ä ì1Ö ˆÓ,Ü ©'æÔ ¶9‘ž’ï3ºK òè ¯ Þ,Öå· ±“IAÕIä» &µøœü”Ù-ž +èI‚'«4£ô²G<üÄ !ŠÆHŽJ¸?±„ ©$»I!Ú ûá×ð5ÿ"ó- ®ÅœÌ¿j&ÄÒ â× ù ð‡$ö¢è8À †)¥ò ­åÈ =£›âþ/&ª)Ûø[ËŠç9è¿›"‹'òJ» Öõ8ÊÍ â  ,¶!š,ºà0Ò , Ã=€  ¢È*ù çCç:ïA‹…KD=Ç1Cý8+‚4Á{Ò®7“7  " §à¢MûLO/=‹J+ìô* G4ª™ ¤/€ I¿)©ÕB¨†ˆ>‹Ï•€@ )‘#¬¥*ûöš°'–K ²JˆFž4Š"¼;‡G<ò 6Ì,ªC# Þ¸…í˜ GšX’Ë Î#@)ëG”%‹3À9å=Aé/¤Eø×Ü>Œ&ç/I†ê 'Å/.PÞH#KI#C¾1Í Ñ'Å9¢4)à¡ ÌŒ¥L,òs%ìÊ6÷3¦‹•<ô…8‘'ˆ1‘0­®õ*¯²Ó –5ù›38ö ü Lë*É®’„E¦1š=ü4Ïœ ï„°;™ ‹1yíßÙÈCä#Ÿ3uða!®, ë0þÓŸ½' =ªÏ”G’íÔ´ ¦#ðÔ.Ï*×>¼‘çCÄ.‚Áš3ä<è ß Ý”ÑËüÈÛ'ª*ÃÏ´– ƒ ŽˆÐ‰¶ ö€Êñ"òº5º.£!ñij üƒ&È‚ˆïhŠ Òü” ‡9Àç8þ7Í)—ã!Œ¦š—Ð ïBéBâî%§´,õ0¤,Á°*¢…1ª‘! $ ¾ Û´ Í!Ï’,²,ø†¨*ùÃ:³1¨ü*£ü9—,¼,Ý$§L[?®ü8Ú$ϬFTÜC^ºü¹³”0s!?h³ ›Ìî³#û1+—˜+øÍ7ÜF-ôBÉ™"ô(¤œ8ÖÏ&¢ †D²NÃʨ¢Æ ƒ ¸9 ¦kÓ(ÈM»ôCõIÅÛî ‰ êJ½J—Ö â ïùšâó±š -Ïóê ºü4ôL¸óÐ ¦ ùs )0íŒ0¿ø˜A¼Ž=×ù9“(„Æ:¾!FÌØ¬'6Ô!=€áK§<“!· ¸ ‘I…C¥ÖÆI„!…ûÈL7ŽË)Ç”Ÿ!$±é6 Ѫ5ñ„ Ô·$§ó¦+øÍ9Ý­>A¥ –Eà"êÚ Ê  ™¿Cž(Š;+«E%#t›¶È'Ì&·.ë©&±AÄ0³ ÑG»•D“0"³H×Hû*ÝK¦‘-²¯/ù*¦ÿfCÿòÉD L0Ä °6#1þÝ-×KæMÈ XàEßàÄ&¬ RÖ'ÍŽÒ¤MÇ7Ò6ÉÊ-3ê¨@›ã>̧€'&Æ£LÚMŸ ô;ŠÕ@G·’Ž#Âì#h®¢ß º«é²" þ© ¶· ¿¯¡ä|‹èàÓ΋ Ò̉‡`Âý¸ù dê¤ežœŠˆÞîGòÈ#ä—’“$í´ ËßÅá#÷Ú•nì õ áj¢…¥ðâ Öûkm™q äô‰X Ä%ÄÖP£.Ö5Ë’&åÌ£É!$ÞÃöm£¡ ÷õ`\§â\î´Çâ!Œ2í(ã‹öŒ™›Å`º2ZIØ=÷ ¢.Ä×Ó3`bó‘(­ð ÍÇ"É åñ"dÜ£å¯è!¹¡;ú0Ò Ô‹âM'º*£ ,œ#ˆK‘B%7çÉÄ.ƒ&û~Ä6·Ì '°°¹Œ¶g¸í)ñî ×ÝI ©¹$Õ<À1É-„ªÂCÜCÓ¦»;Ò9ñH¢.ò êÃ>ý-ãKíÉ5gClŸgôÊÅ ÝÜ:è)•”8ë Üû0»F&Ÿ‡›Iqˆ ’K©¤Öè9Ž àI:õ!¹6ÏÀ-G¨L„H¨·; ¥À4„ãCÐö ¦·Ê¨Ö¹#žû&è ë £ ›–$µž‰8ìæÏùƒ ­È®9˜ åœÎ®øîEtêü ›Þ&Î Ië°6¬„Kíß;Ä+#‚“3>9 Í–Û¯MÑB Й “1žÌ”±Fü…CQðò ¬‚‰¹1ˆ?$„á3˜Ž” ú Ö#òOõÜ>j0¢ÿ7œ0Æ £"àý:æ5æG “Â9œIxã,ÿ8+†å.:€•7 é.Þ!‰Mü]ÓQ²j*à6#  \!†#CÂ+Fµ#)AÄ쀲–È ³œ’(«AÜM~7SøEØÿŠ # ØG ˜â‰0†2«Ã.ìêJU*Ö'1øÔ¬4ê íI¨ñ!¾˜‚JÏ6 (ôº´ È(ë±5ŸÇ½ó,¾ÁóçØ!•¥4Î"–#©Ì› + = 2uÄ Ç®¥§ÿ!Î+’'‘ ÷¾ @/þ Bœ ÔCÊ“/¹;;á ('!ƒ4]Þ‹µ €)õ˜LíôÄ*á«ð ¦ç.èÕ*ÕO‰%íû"ÊË/þ  gE´Eí1}í቉“uôœ$é<™AÑL·Ö´ Û2ŸÆ.Ã!£%ž §$פFŒðú ¶C„f°¡ní ”D•×™Ô1£Ô!Ç ä2@2e®ˆœ Š8µIéÇå½Ú Úò0°¹ ÈÅ ÌØÀ µ€æ<>Ξ ž 5³ˆ Uë=»^'›û‹Lë Û…3,éE©F³ý.á?Éßçþ@†(ù%Œ± ˜8¸´kà!ó(Ä …I?’'®‹%Àí*Ú Ž–0Þ!¤;ñâ†+‹üO×;¾CÄúœ å)ä ï'õ=C‹Ù,°*ý%+1ÅÒ–  %°&ô€#ŠŠ¶ Áˆ Ë£'•ëô)œñ ÍÖ(Ž¡˜)žD¦”Eõ 6 “£žø ñ¹Ú<¯ÎÇÔÁ ç=ß<Ÿ4Ä¡L• ²!^/Å6 ×Á¢:ù+õ€(ÆF¢æ*Œ%Àî*ÞBË2‰3Æ“HÞ‰6ÎGŽÊà&,Œ$…Kñ€Ì*¤=­Wä?”;a÷ ³°<é  ŸHžEµ ¥,ú+¯áª“.·EíG§2Çå*¥ ÑÝ2Àé”J¨ ŸE~¾ Ê?±¥I­*…*Ä¡JäXÎõJºÒ;¿AéÁæ5¨>N× ±iª7÷K…7Ç û+m‡¬>¢BTÑ?‡‰>– { a¼¬â*é·;ñ(˜:›)ªì‰‰PRðÈ3ºiõ ë7†=­5Ï&ÒòŒ€ˆß<@’=Àô>†Lú1¡Ä1±)£ËŒ&œ‹*Ø ë-‹K4Ø Êá õ˜Î³–©!æ² ¹%ކ L4Hùë «®Ï ì+ô/ö ÇÀÇ.¾+£8ÄøÔåB?*ÞŽŽC‰ÇÓ5Ì4s“ …ö'œÙÈ'A>¶£:ç9Õ¢¿&øí%ÂGÙ+¡Ó ÕK4²0ÆLñ %Û Ô·–@ò%ÀÞ¨L.½?à “'”ð“.ŠC ·'¾ø ÒÝò–¶½†„’ °*ú°€× ¬¬9.Ä$¢ þ ü—I—º…÷å Û%øŽøÜ• ¡ Àß稦9´ŒØ ¦ S„˜(¥ ±ç'Ø ²ê0.¬0þÖõ´ßLÛ¦ú óÉ壸‹LÓúÔ­H¢A9 ø% â… ì(ÿØ”J× Å Î!øI à1ÎGüCˆ@†D°:ôÒì1” Ë%¨º ü ½ ‰M;Ó/ ×%ºB‡ò˜ ¹! ÇÓܼ=þ6Û¦'ñ‚7 ä=— Ù § Ÿ ±ü$/ú7».;•JÁ7 Ê´D×(¥ Å9*ûÇ7áäB>FÙ ÙÔç³Ý ¶ÃŠžÀ:Å ™! µ0« ¥ ¿0–ž9 â/  L ‘.†š.Å3Ÿ'÷ ª'È  ÕF­Ê¯ïA ’ ä?Èݰâ ÀM„5 âç× æ*’§²„þ Ëõ‰ß)—Õº›.ì )ä. ‡ Åø&¬ Ý1 Ó9” ó  °æ ½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³ü Ñ! €É-„ Ð ÷? ® õ0 ¾ª„á ·; ;Q×*':ȉw¦‹²Œ™„ÉÄo§“~À˜£‡c™Œt效£EEüw€rT¨¢¨ž©”ö3™Ådþ‰z¥UÔ”a޹[ŸÔ§ô±¨¤ˆþŠm{›i‰j°O¡~cq“’ëžás¼Š²MH{½†ª›vG3ˆK­J“‘®¦ùÓž˜ËlŠzµ_mkﻈ_»fˆ}G ’@;D|’?pSœõ…{‡O‚¨¨š‰€…É5¤®ŒþtH™h½¼¤ÙÌ––Œ¤­ã¨í˜’‡šÉ®¦ýˆƒ¦[1¢›ï™¦º„Én‹Ùᜓª§¼„ê­ssj[éÅ–ž°¦F•³šÙš3…‰Ôåôž±¼¶¸“S]v‡œGaY©Orp>DÚ½]xé£ññ‚—œÂ×¶¯ª‰†™eBar”{xªfU•´2§—oŒr£·roqPH‹²Ú…Rcš´–€DˆÃWwžUå–R¦t®ñdgUB°rŸpÈg|÷ü²Z£M摞­3ò©ÃMHJKÁJNÞ¥ðÛŠ–¢ŠÀ[­°Ñú?Œ‘ÃîÕlÜåsÅÏšB¾‰¬œ§˜3€Q†·t¨iè÷ôE~uPxlq«µ¤¥‡U|¼Rý|£çœ{‹ëƒîu~/ŠÆsLJyè¡DýºƒÛYf‡^Œ³ï„šúBb•µ«•Âö¸•LX@}ªT‚ñ¹ˆvë¹p€N0”dÕö˜¼Ý~—IÓ²¬Á—~l¢”ˆ§šœˆ^AÏnm<úEuª‡”Çu’qË’Q£üH»na1Ù†quqD¨¡¢µM©Ì§ßbjr“Œ£ÀøùÂ^ŽÝ™ì˯™d½—“´ ±€†‚‰µ…tPñ‰©2oùv`c±ŽI¢q¯D±\Ž–j?<®ðg—h‚Ÿ‚vÀs¶B—üaR@ö‡òwlêp™Þ«0 Û˺žR™£tH”£xf‰Sv˜µ†‚ëë–jncq[èŒ_ÄÅ¥w™»¸k¤”n”‰©„z»,­OLC¡bCi†¥l}PbrÀhj„mQZX6gJÌv®í©ed=AMžæŠXB´°Ö´aDcÄ?»¤cQ×™E…DvB™È=QI{PÇ3ZX}tšXdgY§KT•Ý›Z‚‰¨…‰Œ]|‡¨SžˆoÄhæx‘av@³”÷FïIÃþ¡€f~ZÜ—ºÕs˜0?FSDß٘Ǭϋ\s¯P–Á´¸ÑŸ«‹žŠì³™xúAj€ìp’µ¾\€žÞ[>Žyk¢ô;³n‡Ÿti°„¹Ý¤Œú—†aç×ylc¹»pÛ´[›öpyžÊ~¼’Åýř߾DDP5”FñòËšÜü@MxKuª¡•ðV±T¬ÓŒËzsó€Ôi¬²¨èqWy‰ˆžáKæG|„àq@?EFŽ0‰NƒO›”¤â‘=B€<ȉw¦‹²Œ™„ÉÄo§“~À˜£‡c™Œt效¥ECüw€rT¨¢¨ž©”ö5™Ådþ‰z¥UÔ”a޹[ŸÔ§ô±¨¤ˆþŠm{›i‰j²M¡~cq“’ëžás¼Š´MF{½†ª›xE5ŠI¯H“‘®¦ùÓž˜ÍjŠzµ_mkﻈ_»fˆE ”>’;B|”=rQœõ…{‡O‚¨¨š‰€…7¤®ŒþvF™h½¼¤ÙÌ––Œ¤­ã¨í˜’‡šÉ®¦ýˆƒ¦[3¢›ï™¦º„Én‹Ùᜓª§¼„ê­ssj[éÅ–ž°¨D•³šÙš5…‰Ôåôž±¼¶¸“S]v‡žEaY©Orr>BÚ½]xé£ññ‚—œÂ×¶¯ª‰†™g@ar”{xªfU•´4§—oŒr£·roqRF‹²Ú…Rcš´–€ƒBˆÃWwžUå˜P¦t®ñdgW@°rŸpÈg|÷ü²Z¥K摞­5ò©’HJIÃJLÞ¥ðÛŠ–¢ŠÀ[­°Ñü=Œ‘ÃîÕlÜåsÅÏœ@¾‰¬œ§˜5‚O†·t¨iè÷öC~uPxlq«µ¤¥Ü|¼Rý|£çœ{‹ëƒîu~1ŠÆuLHyè£BýºƒÛYf‡^Œ³ï„šú@b•µ«•Âö¸—JZ>}ªT‚ñ¹ˆvë¹p‚L2”dÕö˜¼Ý~™GÓ²¬Á—~l¢”ˆ§šœˆ`?Ïno:üCuª‡”Çu’qË”O£þF»na3Ù†qusB¨¡¢·K©Ì§ßbjr“Œ£ÀøùÂ^ŽÝ™ì˯™d½—“´ ±€†‚‰µ…tPñ‰©4oùv`c±G¢q±B±\Ž–l?:®ðg—h‚Ÿ‚vÀs¸@—üaT>ö‡òwlêp™Þ«2 Û˺žR™£vF”£xf‰Sv˜µ†‚ëë–jn¯èŒ_ÄÅ¥w™»¸k¤”n”‰©„z».‹Æï¥lÍbšî¾èýv®íŽfɞ抚´†´Î=»Ø×™Êü™Ÿ{PÇ5ZX}tšXdgY©IT•ÝX‚‰¨…‰Œ]|‡¨SžˆoÄhæx‘ax>³”ùD¸Ãþ¡€f~ZÜ—ºÕs˜4?DUBß٘Ǭϋ\¢P–Á´¸ÑŸ«‹žŠì³™xü?j€ìp’ó\€žÞ]<Žyk¢ô=³n‡Ÿti°„¹Ý¤Œú—†aç×ylc¹»pÛ´[›öpyžÊ~¼’ÅýÅ™ßÀDDN7–DñòËšÜþ@KzIuª¡•ðV±T¬ÓŒËzsó€Ôi¬²¨èqWy‰ˆžãIèE„às@?EDŽ2‰N…M›”¤â“=BS@H·a‡ý £¾ Ö ×ü åç œ êƒô£ÆJȤí Ü& ƒ • “ýºÏ„ Ð# þÞƒ› Ò ÀäÿÓ ã ô “ß õ ° ù¥ ” Œ! Ø Š ˆÙ€â § Ȭ ‚Š Ò Â —¿º ò ä ˜“Û ïëæ†š ™ áz –© ¬ Ÿ Š ’ í… Î á 焇 Öïø•… “ – ûƒ ˸ڊ Ž ¢ˆ óe„¼®µšy ˆû ÆÁ 4ÛOƒ1é·—%Å ­ – Å •Ä á è  ³á~A¢…•‹ žŸŠˆ Ï¯á ™ ó&‘ Ùå ÷Ó Ê ¾6 ËÊŒÙëù i ‡ Ç »Û •   Õ ±  8âù´ p † ¤–· ¶ è µÒß èÛ •¢ ãÖ°è*¾DÁö“<ô#™ô¢JÑŽž »º ¡¬¶­Ÿë Ðá7ÓÝ æŠ. !ƒ‡Îð¬!m“ô6×LñKõ8µ ̧ A¿ /$ !:› çwÁÛ  S ¸À[,hÑŠv–õØ‹˜ÍÃt¤•z·¤£ƒd™mê’‹¥EFûw€nV‹„¦¢££¥™Ã´ŒšÄ‘cýˆt«V}בdŒ¹~_œÒ«ë¶ª¤…ƒŠkzžg‰m«N¦|cr““ìšät¹«NNx½ˆ«œ”xJ<¹E‘ެ­ì㙚ÑA¯}ޱcc§eåȆ_½d‹‚Až—>•:=•:u@¬ò…{‡S ±“‰È¡³ŽÿvE—h»¿àÊ’šˆ¬”ë¶ñ”‡‘›Í§«ÿù¨S£žï®ºýÑlÒ䜒œ·½þì¬ryfSëÇšœ­°A•°•›Ò—…„Ùèô™³²Ä¸ŽT`v‡“MeV©Rpt?@ØÀYyà¬èù‡‘’Ï׳³§‰ˆšgA_s’zxªfWŒº¨•s‡p©¸nsmUCˆ©æ†UŒf™®†Š?„ÈVz†¢Tç—I°t­ïehQE©zžpÊd€òý²Z£Fí—¬õ¦ÄLHILÃHJà§îÜŽ˜ ˆ½_°©Ð†8‹“ÁêØjàäuƒ¿ßžC¶¦££š…=ŒÃu¤aíû÷A‚sŽPzmp¨µ¤¦ˆT}»Qý¦ç‹š’k–îûùtxŠÂxKJgú€¢Bû“µƒßY]’[ƒ°ùˆœô‰;a–´¬•’½ü¸’L\>}§U‚ð·ˆxæÂm~E’Záꥼٛ=Û³µÃ”€k¥‘„‚§ž™‹c;Îlu7ü@Œwª‡“Èa¨rÇ—@­ƒF¸obÛ…qsvA«ŸŸŽªU¬Í©à^jv’Œ¡¿ûùÀ^Ù›ìÌ­šhšº”—¸´ÿ„‚‰¸m[ðˆ§^†|]f«D§eÁ@±^Š˜m;@­îj’`—‡yÀo»>šøbPEïzhëo•â­¡×Í· R—£tJ©uj‰Rv“»‚„êé—kmhqYç‹a»Î¢w¶¼h¥”qÿºƒy·¬NMC¡aEh†¦b‡PbqÁgj…lQXZ7bOÆz«ì¯c_BBLãYB¶®×µ`EbÆ<½¤cEàšF…EuA•Ì>PJu‚SÆZ[yv˜^bhU«FT™ÚžG•Ф‰‰‰]}ƒªTžˆoÆ^ñxŽ`}=±€AîK¢›¦€d}]ŒÝ™µÚp™r@CQE×Ú”¿ÂЀdp±Q’´¾Îž‘¬‹‹£‹é²œzø@kvós޵Á^€œÜ^?Š|k›ø½kŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³^žïqw Ë{¾ŒÎøÆ™ä³NAE“Jô€ÿ˘ÚùFCxM}¨¡–òU¯V¦Ú‹ÌvròƒÔl¦¯­ép[v†‘‡ŸßCõ?ƒ€Ý†vA>B@‘ŠLÿE§–¦Þ–=??Bæ×ˆÊçšGF¢{¦›éŸ¸É¼ ´•° â±Á–ÛŒ§ÛØG¦´NEA¬èC@OD”œÂƒ¡ÝG¶ÿ¦÷ërGBŠ›?¡·î>A¦žCÖ†@@¡C¸Ž­„BysQqéu˜~~¥¬¨>l¡‘AQn§Š®¥etŸ~ytilÖw|wwŠwSt¥¸i†EùèC¯?RD=¾_ŒŒ0œÓ#q¬NMC¡aEh†¦éPbqÁgj…lQXZ7bOÀÆc¡BLðYB¶®×µ`Eb‚½¤c¿F…EuA•Ì>PJŠ 4ˆ ׊vãÄ ¤•Õ³éõFûwÓŽšÕàè ™ïˆŠàŸä“ìýuÆÇµˆ–²Ï„íŽ”Š˜ ßÕ•:¼•¯¸Ñ¨È質ൠ…Òÿ‰¨Çï»·½Æ¨Å³àÐ ô™³ö¸„Ñ£@ØÀÆ É¸ ú®ˆØámɳ™½›Ð†ôùt­Ò±Êäž ×‚Ë 8žÍ ú áÃÉŒ § Ûm—ᥞŠÏá€äŽ—Yï ©ý¹ ¹¸ø}þ§ ¨ìá¼õ˜Ã­”k¥‘†Å¤c;Îá7¼­ërÞÛ…qsŸ¬öྒŒ¡¿ôŽ ˆ·ÑÿÔÉðµ¢&EþÀ¡¤ãΈ‰RÄ†Ç »„ ÿ…Æ ƒy·ÐìÁå ¥Ž ÕÆ»åbhUÞÚúÊ „x¨À Ý€ÀµÞ Ðè´¾©‹¹·z¸kvæŽÔ€œº?Š|k›Ã†™…Çøžc½yÐ ëõö ÙJô€ÿ˘ž ¨·òU¯V€‹ÌÚƒÔ¢ ü‘‡ŸßCõÂÙA>B@‘ŠL ¦ô=??Bæ×ÒçĦ›é ¼ É° ï±áŒ§³G¨EÕCôÅ¡Ýýÿ¦› ç…>A¦ž™†¤¸¿Bys å¨Ë‘AQ•“ŒëûÈïE’–ûë?€ Í Ãˆç õã˜Íç·Çƒd™ýê¥ýnV‹ª¢£È™Ã´Œäô…t«V}בdŒ¹~ûÒ–¶ª©øzžg‰˜N¢cr¬‘¸NÆðœ”xJ̹E‘ެ™üš’¯ÌÆŒåȆ_½ïõÊε¬ò…{‡ôÄ¡³vE—h»¼ÜšˆÀë§”‡‘›ô£‹£šèÎüÒ€’œ·½þ˜ryfSëǚɰAŕ헅„ÙÚ ŠT`v‡“M»©Âtðyà¬èù˜’ÏŠ³§‰ˆA_…zxªfWŒº½úp©³µCˆ†UŒ­•Š?„ž¢TçàÀehQîzžžòý²ZéíÃõ¦ÄLHILÃHJà§îÜŽ˜ Å_°©ÐÉÔêØjÄuƒ¿ýù³Æšt…=ŒÃ™aíû÷AõŽPרµ¤®T}»Qýþ‹šý–îûùtxÒxK±œ½Èƒ•탰ù•Äa–´¬•ÏÆL\âUò·ˆÞ¯~E˜¥ºØ ³µ×¥©·ã¨Ìw±“Èaá×­ƒF¸obÀA«ÌªÎçjï¹^Ù›¸­š‚º”—Õ·‚‰¹mÓ§^†|]f«D§eÁñ^Š˜m;@­îj’`—‡yÀo»>šøb„ƒûzhëo÷­þ„ R——J¹u»“½îé—km²ç‹ê¢wÓ¼h¹þÿÍ Þ ‚ úðZÔv˜¨FT‘GŸ¤‰‰‰]}ƒªTž÷Æ^„`}‹€ÐîK¢›Š}]ŒÝ¨p™rFCQE×ÚÓ’dp±Q” ž‘£ô²Ž”¶ÁÖ¡¨Š™àáꢜÊëkj¾ºÊ³ýïq—Ë{¾ŒÎ¾™—NAEùFCxMƇ§rµ¦¯­épÑ“ ƒÝ†ÛE§šØ ËGF¢Ä¸ÙÇÿ –éŴԬ듔ÞÈÓër‰ŠÚ¡·ôœF¡‰­ƒqé~~¥’l²±®¥ÙytilÖówwŠÊtÝùÄèC¯‘‹ É7ø&‘ Œ¡ >û+€òHº'ÑòÒ  Ê-…$øç2ú&äó$ µ ¤®$Ú/‹ ˆ ú# ø:›ˆ û’ Õ% î1æ‚”è¨" Ÿ0 …û2 †%±Ì 6… šMþÐ5, ô€ ˆ!ü! ò ¾2®"‰‚ Ì´ò 5² é< ãD–FÌ Ž3 Ð ºMõ,Z§K òB Å û8½Ð ¸ ù$ÀÕ á 5Ø— §@Æ Î/“Iï$ † â Ã8 ©- Î3 Þ › ¯ é*ÚÄ&Þ % ùBà4ü ß"¹ ŽJÁ˜3 ™H¹5 é Í/ Ì õ@ ¾ º$½Ú«" à Š â ÀÐãö)ŸÂ ­Ê¦/ ¾²) ÌŠ è@­I‰Ù* 5oˆ³^ƒ7E‘-¼MÞ ¼øÌùÐ;Ò¯†žAÄÛ>ˆ ç Ø « ÀßHJŒJ«¿´æóLÍá¤ùºë¶¨ðèó“ ‹ß ?ÂˆÑ Û ­” ¬–›1?™‰4¿®LDDÊó@Å©*±œ @?E‹• =B<ÔOó ¬CEÔBGK¶ úDæþE†,å¹ Úߣ ©ð‘@çÄ’Æ,ü#qÚOLäb¬”¤ÀÒñ«XJ† †A³¦ëDcâc†Év£=Q¦;¹§)ìD÷Á'¿ WóA¦C - «&&- '&ÇCš¬H­"ÛïÞ!vMã3øù?…LlD¨JÅ•L«Ü/ØÙ>ZèªHæ1>É,믿»7ă½±‚ÇÔ ÐªÒüœ#ÿº>¿ÑÑ)IÅîF¹(ªHã*œ–(#Ï$±+× Ÿ7¿ ¡(ħ¤¾õ î0¸I“,‘"¥ ö-ðÐ=É¿ ¹L"¡(çF•;ý ë'ž/¢(p® .šÒBô'º%Ý3 ”4‚ç>¤9í,…#¥£€é>¢9×è ë,öA‘ ßµ6À÷Kã!„ ëç=Ð+‹¼3½Ð¥Ø+ 9JDðÙF'Ø8®LƒÆ4=¹Ð¾Ì±ÊšÖ Ž ú"ýé!$º‘8²Ö)›§*Œ £;¡ ío‡² ÍÎø˜<œ6Å >˜"¤”%¿½!å‘£3Ø-Ôð™å.ø(Ì; !žÊcÂÊ Ò&)A'Q<^3Ó‡û<„@¥@<ÿ If’®Ô²DÆ6»Iò ìü ™/’CÂ,¼Ó#È#‹œ“³‡oÛ&À÷+‹šÏî'ÿ,è :¶É ä™% Š”28‹Ûý´H‡I¡®5ò«Ae6Ÿ!Y¿!s¬øË­j*8O÷ãçgr“_mØCÓÀ6} ;vÛ1¢—l`=b͆ÿŒ¾ -‘!ë?MIR35æ¨ÛKïà„ƒ17š‹ÆX;1w"‘Byd+ií§ ßÇ¡sœ¸Ó*J#ÅÕ{C{*Œ_Ÿµ³ÄÎEÜ"+0±ÂÒª‹œ•iâÊÞ€ªè3Ç- ^&$0R0œ“Ê||åèÆ!¯Œ¨ú •ý8<ñ3ÄÞ3c¦§sVxœû"à·mÝÜ/Çø$$¿]½"nœ Å Wu•6h¯|”h%0¯‘¤r.ýo:“7dªYJj@¥ u§ðk§· 5†0?oš¥}Äže ;J‡\‚Þ(ÇŒ';L–e©[áʤWé“Í ˆ !0G¦Ú6œ{F€ˆÝ`v>?nn0š³¹’Þ”õÝþ·$‹+e‘;Lº!×í ¹“ŸÊXÏ¥ßV &‰Ei£š´àßȉ¢ïÇ>Æ"¡˜º—Á™3ö²:oÁ¾!ºŠÔ?ëµ"Ç0sƆ±†Ø¦klÔ–q²Ðgχ¢—׆n&äÛ+õÙ%Îä0;"ö½K†Îù8$¤á‚·’Œ—ó¦@ØX€Â$2~i†˜™#2}®3Úé$ !JYk)5Ì ï9$áB=â`5Ðh}.ê‚ô¹L.,É ’iÞÊëod¬*0Œ‰–ú#|fœÉêÓÿ:‰y}m Ê ¶æ9l…7‚|EQ¿!€õYÒ’/¨S[è ˆÆ,¤Ñ‡ ¡!ÅtŠËX”#›DÓ 6Ýá³âø™B*è!-þü³ÛÂÐOÛ%G-™n‹Šœ\6”k"aLªNÞþ'W$¾¼Ð“M[hy"{š ‚Ûšç‚cŒ—õ;ÀøI!<ÜŽ¸¼o›ÿþ´"{äÑVp¥;0W1·'¨ãSh‹,Ò ÇÀºo/ ûÈ¿µÝíéc$–ïáIûäèð1˶™ ²…æ§7¨F³žÊ€ÏBÐ0£”4ƒ øòrÌ7¥ KÅ ï³sÖ¡ ƒêÅG&ïð ŠH£Bò-— Ñ<„BÁCÕ'‰,¡ëì»5#îÇÏ4²2ÜÔ<–æ ò´&”®9ûï¤/²3Âã©çô+Þ.߬a’ •¥H¸¡)ž —ÝŠï—ð}jb‘˜•­ ±Ê&Œ ‘}Ö𢠪­ùž ¥º¸ïþü¯„ þ…5Œ*ã™ ðï íü¢ í $Ð 6ôô!ýÉ ¥ÔæFé4£ ñ"¡Žþ.Ÿ8ƒÚ5˜<Ç&‘Ó¿6¬1ôA— ”G·¥F¸±±7U¯„½H–ù« Š6¶=Þ¨H7SõÍ/ã!Õú3ó §I¿ðR¾ ñχƒÆM£§ ¾ ±ïœ+ÊŸ þî–³ð ­K½¦¼¿á*ˆ© ®'™- ÚŒ+’€u–î» Ÿ7ñ,ëž<ûCÿº$!ì â  6 “‘,‡«¡*¤(Èž?À œð …?Å&ò)Ž©5:Ä=–,ºÃ£$Á…A‰ô7½‰´:œ ™:Ý4­Nà*•%‹¬‰‹™(ZžþH‡ ü'*Z–„DÝ:¡-é8¹)ï//F”· ã÷  Kžº9 ¨”‘")ßsëöÏ 3®£;•>+ÇòAùá¦2šä Ôüœ#ž-« ‘3½0–:À&À›.6X«à"£ó¤ ï¸Mï>É;Á˜˜ Õ˶ث*íºŠú&… åIñ.ôÌ›ÿ± Š8›+¡œ ”­ÇC  9%äì ó8ê0¡ýÓŸàÝ!ß:¨¶Äª÷­-‰F›­0ðƒEÎ*Ï=‡»‘çCù*ë»Íã<ë5ÆC— ýˆ%ìùÝ8ê3¨4÷Ó/Ð<Ü5ðAð±B®Ð‰íÞGÜIÃ-•H“å»ÖçW%šÙ3« ‹A;¶* ¾Ñ6³ÎK™$Ì'—¶´°ƒû nMª ÏMˆ äH•â'îHø£#Ì@ûÜ*¸FëB&†êܺ(Ø‚fIQ¹ 7"ͯó1˜9 äõ%+ >EÔ©ðM½àò« obŸ õWwTL(µÊ€Íþ ™*8FÈšÖ$[2%,':ª) ', ៦ †@* Ë7Û§ !T'ó —üÈ€*ˆ –øë ìA,<ÉOk¦¿€³õ ® !¸TR!%Ñ " Ôʼ … ,Ö„Þ × ,¨ € ö ØA“"¢Mä ÐLE 3ó .žB ¾ ˆ/ –Œ 3x"M¢:Œ •R ƒ õº `¥é ŽHoý ÕÁe± ƒ º '|" îµ&ê¦Í²ÛÃG” ¡ÐÜÙ·\ÓY÷L—ï ‡  26™ ¦ -¯T(*"fF€#,Çì­ ‘ å:àÄÖ˜9VZÙ $¹‘íCøôP §6¥ 𹲑\”05‰¯º|=Íó‡ Õ× ç ×ËØÓ€Q.bR8E Kí€ñš ÖÊ3‰*.È.sN .–® º3‰*.§ ˆ79ˆ*H‡¥[OŒt#ªôHÌóÁ’ 1зKM!` ýÍ µ‰¿ KîÑ æŸÔ¬ Ç7rÎ>w)Q1]3ŠG²“Svt™ˆ 9 ½ûe²"½7÷¢Ú—  Ô]%G–™#$ãš …XÐ !*±êÍ»„ß’ Äñ߀¹ÕÛ²ŠÊ ô¢Xc- (Š´ýô' I) A7o 1(”ÝÝ Ê ½#18 œ,Œóï‹uihˆ$!`Ó¥²" '1‹ƒ & *À°IDý @ö¶"Iä ¾Á /ÁG€æ ûL ù‡LÖ ; “ Ö* ‡ è õ™ ‡ø.Œ μŸ Ë»¨È Ú0‡Ìä2´‡;ð$ü Á ±9¶EÍ2 ¿E ®Ã »9áóáø5—»þ ø; ¥ Ä Ê Í-á» ’ ‹È ÷)å ùíà3ȧæ - …$ù× Ë Ú" ä ¡ * ®ÔÓŠ ù Ò Ã ƒ6“ ¥ É € «9 Ì  Þ*õ þ Â- ‰ Û ñ† Ð µÈÇ §$¥ ô;». ÚC ᪠®º/»"MÃ,ÇŠy¥‹°‹ ˜„ÊÃq§’}¿™£†d™sç’‹£DFûw€qV‹©¢§Ÿ¨–ô%šÄŽcý‹x§V}Ô”a¹~\ŸÒ¨ñ³ª¤ˆýŠnz›j‰j®N£cr“ìát¼Š®NK{ºˆ«œšuJ%ŠH°H‘’®§ùÓœšËk‹zŽ´`j hð½†_½dˆGž”>’:C|’@oRõ…{‡P§ªš‰†È&¤¯ŒþvH—hÀº£ÚÊ–—Ц­ã¨î—“…›Êª¨ÿ‡ƒ§Z"£žï–¥º‡ÇlÕ䜒§©½ì¬uŠviYèÇ—œ°ªD’·‘˜Ú˜%…‡ÖåôŸ°¸»¸‘T]y„œGbY©Opq?CØÀ\vé£ñ󄔜Â×¶°ª‰ˆ—gAbp•zxªfW’´"¨˜pŠs£¸qppRF‹°Ü†Rc™´–€ƒBˆÄVwŠ¡Tç”R§t®ñehRD­vžmÊg}õý²Z¤J螬%ò©ÄLHJKÁJMÞ¦ïÛ‹˜ Œ½\¯­Òý<‹’ÅìÖlÛærŽÅÏC¼‡®›¦š%‚M…½r§héøôDs‘Pwms¨µ¤¦ˆT}»Tú£ç‹zŠî‚ït~"ŠÅrKMx逢Bþ¹…ÙYf‰^‰´ìˆœ÷€Aa–µ«•Ãö¸•LY>}ªUó·ˆxé¼pN"•cÕö™¼Ü~˜GÔ˱®Ã—}k¥‘‡‚§›œˆ`>Îoo:üCŒwª‡“Èu‘rÊ‘S €F»ob"Û…qvsD¨Ÿ¢Ž¶LªÌ¦àajs’Œ¡ÃúöÃ^Úšḛ́šeš¾–”µ ±ÿ‡‚‰µ„sRðˆª%múv`c²I¡r±C±[˜j?<­ñg•iƒžƒvÀr¸A—ûbQAõ€‰òwkëp˜Þ­"¡ÚʽR—£uI“£xg‰Rv—·…íé—kmbq\ê‹^ÄÅ¥wš¼¶k¥”n“ˆ«ƒ|·¬NMC¡aEh†¦k~PbqÁgj…lQXZ7bOÌt±ì©cf;BLé‡YB¶®×µ`EbÆ<½¤cOÙ—F…EuA•Ì>PJ{‚PÆ%ZX|v˜[bhX¨IT–Ý›Z‚Ѝ…‰Œ]z†ªTžˆoÆdèx‘`w@±•÷GîHÄü£€g}ZÝ–¸×s™r#?FSCßٗůЉ^s®Q’´»Ñž‘©‹Ž ‹ì²™zø@kíp‘¸¾[€œß\>yk¢ô,´nŠšwh®…ºÞ¢ø—‡cçÖy›lf¸½nܳ[žòqw Ë|½”ÆûÄ™à½DDO(“Dôò˘Ýý?MwJw¨¤“òU²S¬Ô‹Ìyrò€Ôl©²ªépXy†ŽˆžÜMëEƒ„Ý‚pA>EFŽ"ŠOÿQ›“¦á=B *§#Æ'Ä$^Ÿ)Ñ ÂŽˆ™\)½Ð7 ïâ­ûùÜ­… »ÐÄ ö &нkŠ™xh±…«ê¢ø”ŠcÝày’kj¾ºqÙ³Ó‡·2SÇ2µ ¡<ßí<š ¿ð ƒFì é ¦ KÊ&3K —¸çM§Ò+q’MqŸ*ŸYš.¤Ô¿D€Á*§Jãé*”5½ Ýò[Ø-¹Ì1Õë¿Iß'ÿ1âú<Ù† ™‹ð#£)a¶ò8þ ²§Ø –!Ñ 9å”çÍž ž 5³‡ UÉ<¢º^'›ûŒÃ ÷(úÃ"ö:9Ã0Ù5òì7ˆŽ>†Èå´ˆàß„:ë)î ©¿&áLëHëÿ6î+»è6ß!¾ ¹”8ÌIÂüH®)Æâ  þ½BN–ž…>ã3‚¶ ½Cø…îÃç¼KÏ$¤ÈÁ¶ €¬úÔDçîÚ â¬!* Ùà ñ@ªÄƃ ‹/ÂJ·ð ™0 ò äLØ'³$£Ï<›D´ŽÕ ô Š) –:Ý ãD ã+:­+ºÿþ:Žè'ó6 ®¸ç#£ É¥›å bî3ˆæ) : ï Š ö â+Êó'ËՕՃ˜ž2 š €î÷íøÕ ûG ÇKç Ä”M ö ßò л. ï Å ¥ Õ‡ @"€$Œà!Õ“œ ë; ÷0ù* ì÷ƒ1’F Š8 1¨C“/ò@õ Щ@Û ²Bêèá8+F‰Ù< ÿ<—1¸GÐ ‹­4¤¯ ÿ Ž%·?ž$aK]8ÅM¸ýº"î§ù*õ*ëÄ3ñí+~>©)>_§M¶@ó 5=(ƒFá;í ®-¢*¸M"“E1ã<–P†À$   åç¢(†7ÒÞ× çÊîœ1¢#ŸM¦êþ1¼ÿ)‰ü¸:ÀÞ-†3áð º2gË:„#;Ð óƒ« û<ª4ô—Iö9þ­>ŽÝ.¹ÝLŽ0ݳMC“ ª„)4×£6"#?k%4<¦y¢¾ø¶:…ù8ÝÄ?š(µô,‘Gž<ÉI²ÞIÿ €™OË å6õ¢Œ3 ö%ç&½,S = â%œŒù# ‹€Ø • 3·& É ‘# >ê¶ Þ â# ‘ –;ý=•+ž Ù ‘œóA ‡ ‘" á2Á5 ±0–´îšÈ@×AÅ7œ Ì6½2´ ö–© ‚¬Ù²¼¹ƒ”Èò·2š … ’Ô+© Àù¬êθüº Îê’³ë ÓŸÓÙ C‘ˆÑÜlqÄá ŒÐý‘¹ÞYf‡é¥£÷ ·‹î*ì«á ÑÚ ¤à ä ðéµ´  ÿ   Ð Ä òéê ‰ Û- *Ÿ¶ä¼ö•çîø ðýíö ÖžüÙႵä”Ô0Û— ‡ Óè9ÂÉ’$) Þ9·F ’÷' .8”7Øê(ßß À Ú3 ì!Œ% ¬C ß̾>î £ñ…ø Â,› ¨' ¢.–°5¦GŒ  ”–@«ú ‡á¢@©Á € = Ç¥—# ˆLŽ éö(«º œ Ÿµœ Í-‰õé›"Ì¢G ÅJñ è • ¢ ™¬6ó¥“ Ù ãEæ ÃD‘B Ñ‚ ªAÐ ­³ É à?¦/— x ‹¤%ÅH²!lÞ-–ÐÛ ¡I ®%©' ŒÓ7 Æ —? ¥"ºM ¡: ¤& á%ý¥%¦GÅãþ$úû(ÏGù?Óñ$¦2 ÿ6ñ1ó&ˆô·8Ö£íŠË!¦3 Ž = ê±#‘ ;™…K±+¤·>¨"Â8&í œ ±@ ’I£M‰©-Ë;ù ä ˆÖíAÂ7Ï7Ãâ5¢ ›.@-·u¯2¨]Ç º Ù5Š:>ÍGÉß&,‹$„KðË*£=¬Vä?”;a÷ ³¸ „ ©Æý ¢M´-á$Ñï— Õ*°ì=‘"ÆÎ„D$ã…:Ä*ó,œù(´¼.Œº¦8Ê6ñ+®Hñû(މ0W™²‹Êš ú† å Ç?Í1‡ •Œ(ˆ¥ê©)ׄ¡7ï¤ã²MÚ ª_È2ïŸÉGB% C1ök‹ýEû<§!£2mÁÁKgÀó /ø­Ìúå˜ ^®$×4Á0¡¯;¯M礔ˆÚ?‡:Î Æ1¢4™2÷-Ž( ”"Ï1ÎÇMÕ¬ø75¡HžA‰‰\ìDƒI†2ê ß *Jñ'Ŧ,Ñ+‚'&Ê©5›50±Ùæ!ÆEýõH埥³"êß Ê%úaÓŠ-Ÿ¯¿"s†ä3¸"„:1è”Á'¶ Ó Û´œû¡ ¾½ ùÌå Ë%ŒP‰þô – ãžÓ€‘Ø3Æ8ŸKµ Ä5ùíÿ˜Úoó;î,ü%úÌ/ ÛtÚG¨løÝÍ4̄ĥ‹5GæÂç ¸§öÏ1Ú ÞÄÇÉÚ È㟱:šÃ˜'…³"ã-¶¾ Î3çüH€È/Ž=(ë–&û)¥*óº2­Ï 3”K<áϳ &˜¼ ¼&`Êø« „#"@*Ï®¡µ _â Í” æ²Ç2Ú·ùAî… £øò©/ÖDŠ4ý8à+¡(Õ Êß ¢8º•ç>Þ¼ ­ ʘMÏ:ÿ@(‚'À& 7]€i%I>m‰"ÍC&3—2Ò žß-¨„Ô@Å4®? ³+U í&¤,7íçûH·&©?˜€9ÑM¸:½&]¿=· ÃüʦB‘@â,£)ê‹@Èೡ¯!à ÆCÉ ±(þ+—¦3Ÿä!¢ÏŠÎ÷%?Å“­"±›+éÖ/+¢"ìÌ(뉚'è"»,º$ŽË Ʋ WÛ# pî ˜H‰1Š#4Ø:#¿/¼n ïŸ%DÍ·"¼ÛIä8¾á Œ$Ðú;›6¡&:ã&£Ê6Ë,Ö®4ì ²×ï&Ö  QÉ'A>Ô,°F Þ ú O]IÌF+ Ü ø õ§6Éî1€•á0õ¡©½â Üž%¡ Š Œ ‘„#¸ØÅ æ"Ÿ ÖÝ«¦þ„ ¸DTë>ålûÕ@–¹³0켾駭 ¸¾›ð9ž2´ó¢Â-Úü( ù 8¡ÿëœ4¬Ö+ Uåªë‰½ˆ€¢æžµ¾'ëê ‘-Æáü¸ª ßî(ŠÍ ö£¬˜üŠ Íúio¤†ÆC”ã2 ðé0™ÕÞ3ìü ¦#« Ù½ lÜ ¿! ­)É ýòûŠt¦œŠƒ%‰ç „á î¼õ†ÆÔ ýåš æÎ à‚ ž ¾§Ò…ªñ À\Ç»µ§?¾¥ šœ‘û Þ€ ²“9­ ŠÞñ 䛊“áõ–  “ê¬ÿ ýâÏ¡‘Ø ƒ — =îÄ Ì¼£ùú¦…úÛŽ ºçÛÛ× Š¬ë ን À ÀêÛ«š(jꥒ± „جÖìîÄ‘õ†@ÈŽ¢æ¤€!‚ ¬ lÊö Ö‚ Ú Ûá™,Ú7¼•)’9‰Ôݵ+‹îDÆÏƱ∇ºøê®ñ÷ ꥉ¶ ›—ÌÑ Öªß ™—#‘£]‰ ˜4Å/Ë î´ øÒ oŸ%‹ûû´"ƒ¢¦GâöŽ@ È#÷ã“#éú$ð!E\Ã5>šÙ(»¶ˆùâ( )( ‘(ï7 ò ëÛî7’ó¨Ÿ Ë¤Ú ü%¬ úü¼„’F“&§¸ÜÐ Ø!L› ©Ú„ì –ð ¡Ù)Ð$Æ$§ LÞÑÈZîR¨Þ1”$ܬ™×–Ò ‰Äÿ<ÿF”Š8œ?£6ÈÒ¹ îï>Г$Mq¦ìòˆ2GI;ÇÆ€& « §„ … ú" ë  H œ(â' ‡ §! ˆ<ä Ý Í#âÖ ÷@‚ſŊȈ!K:™Ð•#1œÖ3랤.’Å­þD"á&‡º²Há ‡ ñž(ù'©¤#!¸â ö-•*ÉÓ…£ž!·•6§;4”H‡*ŸÝŒ"ºØFÒ(µ1Ñý?xæL¸ È/‡ˆ¨G‰BÒ.«œ‹¸#¸ž0³&ÞMÕ%¶0„´ß °,Â?Ê>Ç8Ñ$°Ûæ2ÛB´D¦7Ù-Ë'ó@˜ƒK¾=¸Eè+Ç<© ì…» ´Ù‹5¤J¯Cà ή:Ë  L¹9®˜I¡+´‘’ ª-ˆ¬u†vm¬€“Žyær”ëܺהŒÝ²š Þ»ì˻РÊáŠí ÀéLö@¾ “†¶Ÿ Ž ìÚ)ù8Žï¢E».µý³ ²=~§º×›Å?²+Íý+ ƒ6ÿÌ/Í È=6æ ŠÛäÀ=Æ »”¸&œIŠ*‹†£L³,šÈ2Ô›,®Õ.®ˆ·¬ ñ¯µ“‘5•É»­½Ø(» ì2æÊ<Ÿ&žúVö» ÜŒ„ ô¿—ÜFö![òž;¡©7Á¯ ôB¢²?¯Ê8Ó"£ ±Âß í®ÎÛû ý*È Æ ô¡C›J¿8îI–.À´àF¹@æx# ï Þž!lœâÚE†½®<Ù%Ã6ê Ë’š7áMì¨ü¸)¢:’4·DôÔ•BäM†¬Jªè ç“ ’Û û{Ñ!ªÇ-—Hô·Î>® ºÜ-Î'ÃÌâÀ’æ/¦ ¬0Ž5¦DÈ?ľ »#¦œ¬G»E¡!„ù‹™6Õ$ª;³â¼9œ ºÓ!ñ — Šº0ˆ Õ(²:àÛIöìå6±ü>ØMB²C—%ñ†K€@¾!·î$܇ßBÊ5¹‚ 3ø3¾¢‚°ž ²Ðÿ}ÆÓ ܉ßêŸçwˆÊŒ V’‚°¬ë‹ ÇÉ4Î ùí+‹9¹1"â é2‡ú˜é ý*œC€ÐÀÓ3¢ ¬)µ%ƒ§ùžð²3¡K†¹&¨JîÃÛ ¥Ë¥½€4ï1¥ ‹¹GÇÌ(Õ &×¢ ±¦ âÏý‹1ƒG…²&™ Ç(G"Î Œ,Ü/ø+ª†…î „óª Ú¡ è<¸ÑФ‰ €É³FõK'­<À A„7úãÍôÌ:¢¢%Åú$P¸ñû è ô½”?‚×ùâöÕŸûÍãÊ Ä ñ‹ ÚË Æ¼ ò+Ýꯕ g¢ X°Á‡ ø…‚,±»8Í û/¡Œ ‹Ý̉5¹ ö¬Õ®’,ÖÝ¿J·?¤ ˜ ¡ £9Š6ÀKó8±0â×8ñ„-êÒé›4õ§!üï ‡‘9ŽE¨¾Ûš kðxŠÖö¨œ ñ íÿtó½±ù „Ç Û"ç!Ã)­ ´6ÁÃL½L°ù7‰ ýD…†õŒ Ž ¦5’&Âè0Á ®ý–d³žØþîUÒµ»îæ-â#œ ‰‚àœŠ¨Ü$%ð Š–‰¨ÑÌŒ×ŽŠ ·5Η®À#ÝJùIÌIƒ™.Îä•ä(ù†o¹×:MŸ Mžæ¡ QÑc™Ûo–=#4͇ g¾8È'ÌÁ++Ò¦.üß àGà ëÚý©ã¼+š$èÚèÙ“ç0œ Ù!GÓ*í¯ç°‡ï4™õ?æF–¾£ ò+…:ÊBí?œ ‹£FÙú"´û²%ü:¢@ÕˆãÙý“ì ÑÁ «è†*Ͷ9½Ž¾Ÿì™’´áí éê ¬¡ ð;Æã%þ-â™Ú/¶ ÀBœB˜ ÞÀ«£Ó„µ* Ùñ&ÊÅK¼B*ó~sžvT™žžï„Ó1õíTçÉo´XOûNäö&Ñ ÿŠÙÇ,dýCÇÉÀ»])Š-Þ *ÅË& ¿- 4&TnHC4s B9Õ0 ?Ý 1*"q!"T{*1‚„ï{Mˆ9D™+9 ¦ ŸÒ‡P5” 6–]çM¥ #šd§;Èë:µ6–]‹"t* L ŸEHˆR3& ót ! » +&à 3 ™7¿/åÍRmÌS «˜F6Tí 0I,Z­‹Z(ะ, ³7×c  o¹ë a7ç$"#+œÏã!ÅE  x ¶ Z ( 0> µ+NaœiP™ˆ( ”!þ n.|%Ç –[ž ŸÑ]Ö*+­W&o '"̃< „û" 8¢±‡0žûlcä1>n ̼ hR¦ áfº HT<œ©/Z ê·P-u¸ uH£Î é"› 9Aj+4}0 #- y™LËÇK0+H$ ! )9  'PƒG,dbHŸ¬T \&„ (KO-^M']'¹@r/\%ŒU6 #N R - 2 ³% iä1 %l:*ŠQHf †zz V"2>v ,F ZhW¡KI DtƒD N(g ) Pc b9N HÅl l ôµ»'R¤ >`ƒ Lî Û…4"' !%+>3xX'_¶#hÀƒ&öbR‡=I Ñ[òÏ":_žsG×(%Jœ(-  M渥  Dp¸ è7€äh‘Ó :?-• €€—Ùcv'“4µP! i2jcü…„Ž|‘ P&M‘ç#¯”Ö@l6 Ý ˜J?h­h"–«`$9££1:Õ½QâI`÷# £ê*WhdŸê $ ’°7p6U!9Mƒt/•*y:N ÒÉʨd6Ÿ +' 62U $:—“ 8_@S:ÐHrVŸ@ ›4SEN›ù!r  +Ih ) gl71ƒG09‹Tþ% &0˜"C2”d+- à)  " »œ/- - H Q.P)¸'¨½)I,”@fÕ)-(² :>$u %¤ [Ø ec²Hs‚3L9o>2T… I&ZCù¿(?Xþ V–  z70%*Yj1û‰Ó " …6 äH 0OÔp{#(ŠE –¢¬/]ò --®, H {t#Y šW푦/Œ+be G3DÃxäÂÅ#$Q é!"lѱ”‚è¬Y74–  9M(SW}×D2–nˆÖ?xË28 ;S) Æ!KP• :ßkÿœ%T$u;'³)7A $†q ð” Ž8O !¯Ú# AÚDŸ Aü! r%þs . ש0}ˆ Š©Ï Sèh| cŸ ”"!X'f ù@ h9„>…» ™¿Yœ1 "ÚYõ \ '™·   { ,‚–Þ=-pa `ò€ ç+ mŽ4d+  yØ _ † ÊY&k$F6L˜Âd.t1¤ÂÖ>E A ³!S+ c|è«–0Û—< M COf&h r]W 6A(6.@`à``ˆ N5ÿB4¦< M CÕB4Û¨9 79n}4b! É2X)k= S Ôdž !³¼sRÓž<2Eʺ ©®8 î¼<å¼>^2571‹ =+_‡’‡'“A;·l& š /F%!ê]25Ž.GŽ*&d& ™+.œ /N øÒy+O}  -»;ˆ=Œ²÷ % ^Á½`RšŒk’“'( )…9+LøwËV(Qg‰ì• ͺ ; &Þt-ш8  F O Xm H=d¾ ß8ö--ß‘Q ´•„/ “" y,WQ [€¸0D¶2%0Œ7q »ˆ\{ K>5T%u½q_¯$+Ÿ4 /”½ fu ;¤%ŠÙpA‹N’%¾·!5¤Ü£¸F kŽYjC¿)P`1–p<ƒˆJÝù, ¥#§Å=QÙ( 2(¤ å ?¥ b2§KD sb WB½2G%J±¥/~5$,=.! Spp° /)T’',á*e‘Ð j3 ß-5)%¾eßh ';] 8i"*iÑŠ~É`]k4Y.ú") öA" akРb³9J1•W"ϲ8nFÇ&n] •Š p©¶ Dƒ}œ Þ>^& <& ]A $/Q _‚à 9#l19[.Ó‚‘#&U3L$ º Iqå W! H“(7Âe 0P5å 2~ {-' $!-ÀY—ÊAf0»#ß {&\Î 'ˆ‡|1¢ñ TÓw3&U¹$“4Ó'ÄëͲ¸ äIÍè@Ú$‘4-éò˜¸'¡ô,Óã ñ’;Ž Í šš ñ9ÛF¨ 6%Ð&à-½4‘ {š„ª®.¢ þ/õùœÃ´5 ŒÎ G˜Æ€ ʪ„ ‹¥Ï—ä ¢žº ’êJ˜‚ ;ó4±)Îì Ô–®Š’ Œ ó ¶®Æºù—Xnꊬ Ž*SÚ Ì ‘¼ÝÕ¾°; €ôßæJ¨ Ô)¤•+  ÝÏÈ"/≠¡"ÀTª5ñŠü“ Û…÷Î †Á¬‰.½=¶®’<ß×¶™ŒÂÑ2cÖêçƒî âLnšs¨ûÕú Då “ ÚÐ ð¿ ï”å1( ™ ÒöD¶ È Õïó é ©vöÄ×ÛÌû ¤ú ­ÌÃp¯üÉ ¹ 6æ ™š Á·ÔzýêÎ«ÐØ °”´† Ž øéç©5sÛøÂ²½y¦¶ÝŠîÍÑR†«ª­ §Í n˜ µšRÔ"°=ï€ÈغŠÀ9ÍŸõô Ñ šF2ÌΖ$¤çFŸøÍø·Í šò ¥#ë× ëD‰¶"…â˵C¶L±×0Ð.›!ïMå”Ê ¾‚,‚ÿ>ǯ;Ü&—û?ÏC’@€ ¿Gþ2ÛB…ÒJ”3¦H„14ØL–0‰1á#Û,ù"þI¯ º:Å4º 5•¿™ôMÒÃÔ8“6ù›„/æFÏ#³'æ=‘<íÔ ¿Àµ#ŸÈÔÙ%hÂ)êŽ,ý;þÍê&Ðð“3ˆ†9ù=³ êEâM¢‡€A¬) Â- Ãþ9†6ï&ö5ß íKÄ%å>Š+—Mþ#†Ã÷ã0¯(²ö&"{!Ûªó"±?•-ơ椉Ð6Ó­ñ"±)• Ä@ï;£– ÔëD‘#©«C€¿0­›Ø,üÔ@ƒÍ©Ò–äKÀ<  MÇ·"„ðKÓ)gü¥„6…Ö<“MØ»>” äÎ!´*»¥ Ì/ÜÆè-öLâGñ<³õò–7ìð0¡ˆ1¥+Ð„î ´C… Â<÷ å/㯘†éJ¶± ¢•4þMï$ׇŸ(Ï £1´ê,ø #åÍ$ 笶ˆ?‡½1#þ Ç ní-«úD²@ðœÞ/™º—ÿôà –ß ³Íà° ÷ä˜ „AA’£"Ò¼Ì ?¢öÄÖÖ$‡ ºùùššîò ¨Ù¹ñ Š Á ›çë·òÏïÎ‘Æ Ï— ç— Æçã ÿŸã”‘ê¹ îˆw÷¹º®ã“¨¸Û ™UŠÏñ—À”÷Èæ œ‚Îý ¯ · épÑÖò7ÚØö¶‹á Ÿ lÖàÈ‚ C¯‘´€2¹—°"îÆ-ÐÄL”½.¥Ã&ß&õ ßÕÑÝ’Â:š'UÚó/½…çª.‘ñ™Œç úò…?» ­ö#ç=ÂB› Jé×- .çØ,è!›‡,¢4îÕ$ †Èì%’:Á¶G¹òæÕ¡T¾&ŒŸ ˆ#G»)g€Mß ê×(Ùï,¯ß ë!Ñ;Ð&¨@Žê Á°‡Û3—(Ÿ è:ï –5Î:›7=ê9Ú Š ï÷ ?Ì § ÿö$°AþÈŠ Oxà(·'´ž)¶â–Þ4N  Ñ'/9× ® ô¾ ‰Ã²I¤)ûFŸÊœ˜Iø$À+á.à'ô&±‹.ç 2—5³I«+¼ Ì/Ð>и'È#Þ ”$¿~ûl„¾à,¶4ë Ç ë+¬,² ç1‹ ÑCâ Õ ´1µDÎ&ò Î ¼ ê%Êeî²|édž3ŒÞ ýí´ ‚ ý Ç8Ð7í!š2†Ÿ‡I—”(Ï1Ñ&…ö!ë(¡Ó®Š ¶ß·Å(§Ýó$Å5ª 4ᆇ „Á*ö<Ò$Ë è ÈFºŸ#™'W²“ ë+œ+ͧ@\ÀɆÖKé#ª²<î”òÕçD÷ — —¯Ã. G¦Á)ŒšDü²?¹˜”ÇÔŠãJÍ%   '–=4‰Dßͧ´â«ŽP óÊ ô  î6— sõ Êž Ïùâ¼=Æ Òý÷² Õô ã(œ ™ Žúé:Ž ¥ Ì‘ –Š †Ë­¯,ko¯›L““ 8‚û‰“¯&Û Œ÷º ”ˆï ÃÖì ˜ã8Ö¾í ¼g/$—êûаŸã”>¼ ï Ò@“ Þ-þö)‚ê@ ”(ç5˜î4„ Ê4¹I©<ê/뉹¹(î„ ×å óç>ü ò&¢ä · ú ×ÑEÌ9ú œ%¬ ë • æ0âö,1û‹4šA”#{å“;â#Ñû ¥ô¶,åרì¾/´#¸;äŸ ô/äŠ$â†Kˆ Ö• ê ÚÅå! ‡"ÐÞÁø+—4„*¢™ø:¬(Œa]mØ4— Þ1Á;¡KQñ2Š^ÂÑFû/ÜN½4sž=½(Þ=·2Ø,ú3µª´¨(ú ™3³ þ5åˆ.dMÑÌEë#Ø ¢›*†e7ª9•l2 Á$œ)£”ÿ À$’3Õ»§’´Ö  Å+ËÓ2†/¾.Ö ÷ ³ñ;ÿ¤ :Ãå‡é>Ý©*Ëíú)µIî6ŠE‚ Š–‰¨ÑÌý+_>‘Eć.«î ° ÐªÏ ìˆMÓ=Ac¬GÃÞ:›Å“|Þ™*ó6 š ‘ý‚Ã'·Ñ3š7—©©Mï3Ò «-Š1½Žóú!s³” ü¨:xåÍ9‰=È Ä2£0Æ…$þ ‹Ï' š€Ò*ØÈ 9žš7x‰Ì ŠÌ¿4¹Fž-‘\Ô@Œ=Õ8»ž)ü=šº#âµ3ŠE€ ƒ0Ý>¨¬9—ŤL´G‹ ìîÙ æáé@–BÍAþ½-°‡Ì¨CßÉ>ü.èJÇA—,š(Ì.šBÁGñ+Ûµ?Š †LÜJÖF‹=òDÆåGÞÏ,Ô3¬²ä)c–™,–ÊKß0¦Òî>ï(à8Õ§;´(„™.¨ò%¶ œ 8¹:‹¨-‰ÉÃÔ»qøœ_¥ Ï3²8µ8õ!±)™–4› Ñ„7Ç î>Ë<ŠºÚ&ñB¾<º<þžL†<‰Þ>¤Š õ ÙŒ#Á$Êü Ñ:)Œ¹É®» ˆ  iþ ³«(é&!މ2šÙƒ’” ¡ ¦­•Yô§ íuÅãúÜð­¿ü<ÀÙ('ñÔß)ŸÐ ¢­&篃´+ÊMÕ %‚ ÇÎ ëÏÌ!’ò¦ ÷­,0ŠãÙû)xäÀ 5ìÜ׉³´ §² É ‡°Ò •$gH8þ1ô €j…·ø0ù Ŷ…¸™æfùù9‹¼}+· …ù‚ Ï öû9É¡³ö ˆ· t§\Ú•'¼õ‰ ó"äCöÊìë òŒ”ž¹4£ Š@Þ‘E…€ ˜ì<Ï4¨"³4…åKóHì+À.“Ò&ä …'ù#ê © 9·1ñ‘˜ ¯0ñžÙ‰"ïªÕÓ ˜…¿ÇŠš†ý#•7Ü¹Ò Ÿ›:!¡:ªŠø˜6„%"æ*á Ì <¸¸¢Ž¤”H ¥! ͉ 'ïŸÿ՜٬Á ÷ÏâÀ «±+« ¤õ å$ j©Å ñHŒ¦)è _îêæÐ  •ÜûŽ, ·%—è × ¥ '°×ý"èjŽŸ|¨è1Ü;âBáG¿0¤«:›(Ï”-Þ4à© ïØ 4¶:ñEº3¨Eñ™‰'˜š+”.Ž.iؽ;¤KÈ»;õ ¦,‹Š¢ è ƒ!}íÃëó4)Ó ,­)о3º¡”œ‹&¬¥òÊ ðÚ&ÝÈ-‡‹"ÏÍ!™†÷8ƒÂÜÿ¨Dÿº î ¬/'ŸXê) ѹ•Öê"(Ò ç‹¦Øôã8}„Ñ·¦+Wô+·ñâ-UÞ¥ôâ–üMéÿ©-¶ñ ¥#l€Ä ˆì:‚¡ µ"ï&å’&W»žåã6ñü´$‹'ýÑ‹(Å”+»²!¤r› ¯!ƒÜóŘ« ÅÃõºÃ¸ æ¡ é¶£Ñè¶Ö7ç ‰¿ é=5¬ ØÔ*"Üø¬B– Õöµàâ¿Õ 9­Èº^LÃÍ Ù2ôí ´+‹V6F0¤Í ª â þa­ Ü ÃȨ¯,4‘Iž$±‹Ô2¨—ËÌMÌHë õ¡Õ/‹4ºHÂÖ ÔÔ?¤Œ6°~ÆEú@ç ïŒDÄ7ÚK3µ=’ë"1½Á ,øº)>°œ(ÊÖàDóLÙó9åJ)Œù Ö°¤!¦Ÿ;ß8çà)è;ªª)«¸Cã?”㯆 ‘˜ Î$l¡ h”%3‚ µÝ˜°®ýLîF–KÈ%ê2À7ù(¹†3æ5Ý ®ÞÞµ+Å.Ó+‹2•5º¨/Ô×Ù'ö:¢ ßÒ Þ œ8Û ¨1…<Ý ðäÎLÀ:àJŒGŒ2øô+×ÇåÔäõŠ8„´@„ûÃÄFëÓ-ÎJ¾ÙDŸm\Å ²±äÂ!º7ê?òJûô– ´ÌÂãô ¦„Êa;þ«ÑÌ¥"¦æùLƒú£¼¬ª é ¤G¡‰¾{1蚣¹êÏ'ãÚŒ¶ÏÚÏ–ü ²k¼&¬ÖÄ Îƒ ÷ѱ lŠ çå• ùœùÐQh‡ñâ ‡Ž ›Ëá$ÔÏà¸$þŸ »¥µ‚¯‰¦$· É„Ð%âk†ö © ÕÝü£?½ªÿä¤í£ ÍÛ‘”Š¥‹ÞÅ&ž$ª›7ÐÙ Ç$¨$Ç×L÷ö15à2ŠÖ0€?$Œˆ7Q£ù'Þ ½¶ ¦@–< °<›j¬ ã„ úJYˆ ò’*›´$ô7›Éƒ·E¶%ç š<Í#ï ‹è–!†H7²sç?ÛÕHÅ3½)¨ñJ ‡Á0ÇG‹ ³…6ÉÏ(»÷ z妒?­#¹)§,“I›?¬áÑŒ¶ÆŒ(ÑlŸ0Œ?‹9¯ÿ;ÖBÚ ˆEí †"¥G¥±6ØÑù ¯1øßµ%Š(ÚËGÀœ4åMÔ*»Ç€3Ø#Ö € ‹‹Åü+Òš‘yö .˜ íÉ6ÿ:Ç Å+©–<©(õÐ ”) Å"Ù#æ7tàá+½4Æ4‰ õDåű¬í ÉòÞ¥žH÷ ˆØ ƒK»ç ž¿ Ï­ÊÄž*¹øó Úá׃  õ …©€õ ¢/ßýÜó Ž,“⬻ ç™‰†‡È ““Çœ¬ªét³‰‰÷Í[@‹­ ,䎿 ¶º• 5ÜÎÓà À©¬¶>Ñ-Ŀڔ ©Çϯ‚âÓ©‹Ø öì.7Ÿóáð +yö¿*Þ¥6³€¯á¥ïdƒØ³Í8ëé ‹šçÄ̰ۨô¡™*Z‹ µ<¬÷²¨ß‹ A8É‚÷ ŽdÕöÞ€ŠÜ–®Á ¸ !ä }¬Û½‹×ª³ —ã˜ìƒ â ¼ÝÄ © ܉‡*¹M¤§ì çü é ‡­òÌ û²€›ò–›.YÜ´d©Ñ¬ˆ©r´»¦ ˜ ÇΗ ûþß¿€Š§²®kÍå ¸Üðá«£¤O›ô8£°ˆ ú í— Ã<·*ùE’Ÿ&Ž ò¾CØÀB½Ä °LH¶^¼c×óñ*|Ê3«,¥<þ‚ÿÛÝײ$½¬!Á4Þ=•—>³@’;‘¡Šß˜5Ë•³œ‚ '’ B‰@ï8ž…6ŸLï,—„Gªƒ™Š*–‹“=%7æF°3CÉ¢Š'Ѷø0ºAƒ ÐÃLêBù³*½êª4Ñ4ñEáÏ(’B¡Îã ²¾‘ïà Ó#Õ ˆ=üÜÍ,‰L•-”®¨B»ÿ­Ò‚a Ñ®ÌúZòó Ú+œ£ã E~½£ì5Û¼ú<ò Ú?ãB³…"þDžÈíl¡…0åH%Ž Ä@ªBß»ã¹;Ñß'ÕÆ"Ÿ”•¥JˆÖJ³§Ðü^¹XÁå ð Ž h“¡ ¨…Ø ’ •ÓêÍ­ü+Tòp± ϸÚÝž¡ô ·— )p!]mû•Ê Ô ž Š ‡…ºîQ¿—„…ˆÿ©©ºŸÊý„íï ’Nˆ^ƒ§¶åô ¯z:ÃÕ@ï‹‚ =ŒÐ­µàq˜ÛÔÉ’ßêu¤ ¦çÁŒUª½´¼ ´ó“™ …‹øÚ†åÛ ‡È˜Ë ª!¬€ë‡« ¾¸Î*œ:·…½8„*¾   Ìú‘Áœ®ž t¸ŠçÝú#„ § Ÿ¬™Û -† ´žŽÌ7rÎ ÌüÛÊQÁ“­ ž½ËÔZ®îa¢òág*YÔØŒî½¯Y·Ž ˆ‹ ã¶l“ÛéÝ-‰ þŸ¿‚ áÓvÅsàØY eÆÆÄ>댠ܥ »Ì­ b²Ì„ȉ  ªçê å]ãÒ¤“ÊŠÜoÁß–:ÓÛªƒ»àŠßíÂÖŒÅ" þø   œ¯ÉŽâ¼ð4 ƒÆ¨‹àWÀì5{ðÐ6"ÝÂŒ …–òÞ ²—ò—Ž ·*äò‹þÛ©¬ê¡ï±ºîŽ¬Ðº<™kæÒ® NFz×Æàª 4Æ1þÄÅ)KŠGÈC‰ MT©MT¡‹¿ˆ:Ÿi€g–Ö³¤I¿ ç¶=ëæ–üÍ*Î×hù0ǵK®*w­K®*wíØª  Ž4«ù«"×2Ë›ú­Ä;9Jfý ¾Áн<·'âìß(íÀÅè"ì/É$–‚®I«H…ÔÑhBÀCŽ+Âã#…*ÉD÷*Ï=o¬‹G  & FV/Ý)d!B.%B4 #a %92s ) 56 F£BW/F   X/H*;_Y N5 "  ŠK(4PQY~3y{ RX( mµ“ [ ®Æ? ˆ\3|T t Q2 . ¡`Š$±µ•¢Â+  gO !@! t Q)\ G÷ Itx @# nd d .¨ |V !f6&«3,>"#( nH  !I1x*Za ¨ÕK›?R$"b5V5q[&HH7T3d Ne¡' X52 ˆ±mv#! [#9% / !%$WvJ    i$~\*€?=Lú•¦‡Ÿ3w ñ ÎDh*€?=L¨÷0ˆ lr ÚŽ îK?"<,É›H<2:);ÿþ ñ \wÜ sÒ&&4¢ \F4€€Rì†$¡sÙVù’Þh²Ä4`">"¨i$ñ%Š$ ™X€õÌ$ éÔ“hcx> V l!]Tæ O4/c$ —š ncO"}}&Y$7a! „õc 'ˆÌ>é&Eg)›€/ô.1ÂD[š $®2î°N:¸šÁ" o É‚|ƒ9å t$H{¿ö8 o $jœµUJç®$h&•þK˜ ^ Éçæ HŒ·f;f3T#2¥r{; )#/ Ov]Ösm” ‹/jq 5B @Ku™-‚ 2++hË£ 14u 1/ Z"'8Ž!'®U8¶Â'Z1#9U‚Z'3%„6á³ ­…%Žç=)>1# :Gx*# ¨ ǧ7 Ó g…=ל§hJ6 q' °Ÿ5OŒ!.tl’2HÈWU' %"'ÑX/mk E8™~kÛp€1—à n65¼ƒK/¦m ©.M ºb€–0i?c"#%W ;’„ï!‰Kø;~(ÚiX-‡V ŒÁ &àOŸ)}'…5¦lxð­mr÷Ih¾VUM 8<"w'a-guø‚/ U-gê¨~–EÇqW)XB… þ(œ. ;³y^Ö| ’»= †_§–ÍPbç4 ·<kÅï¶ }hV=P ‹-gŸ 6 p8‘öT(nþ3ñùúm[ Th“ëc J§"k‚-,ˆC  ¡©oHD8°Bg¯BÇ \¡1l( `* +9 $¸ž  O3Õ³#3DW'5ä < …,h1z^.ÝZ6¶j_+3" n$ êñ ûx1q5k5sÿ 6Î-3M'rf\ p¨”.ç“ ¤%$K¡ N¬; + 4?Ó@Bš€…¥Ì&¨¢Äš *›Ñ?_E=J‹î•;)`g?¦VRú£+MÅCcÔ-Tf+F#ƒ^ò¦}( 6Í+¸)–“6’…µ5>z¤](§ _%š!ª^™ªŠµá3} YôéÚÀœ¾Ò@Ž:9.ñŠ);I<ƒë ‘É8A+a 3X"ƒ.8D &¢Y Dr ” ¥È.¹£8A+¤§ji'  *B Ôœx. '¸, († ¤Á"š”ÞV 1O¶#x 2c`V*6CÃ!{Ø bslæJ˜þ7@03"X'žH"… c3Ye #  Sq³ Q B]Ï8ߌ^9& ;~-0 4©  bj'f = Gý ´ #´ ð •9o*Qˆ¸LFF5ÚÍÑB[!6À 8ä iÝxi ´ wO°–ŠF'¶™÷ lÞñ=–v ¶ø‹„bÑc"¢*Ìf ycÚðl8 7 ?%5wê %-(==8=@<3߯ *ÚÉ´"˜.›µZ¤¡ë »20K!6Žx7 ” 8o# A*ÑÉœe4;Ã2Š4[4:€ 8I×\6’z b 0ê$aö)/‚X2†Ú .'«\}a‰O‡ –RQ+ <‹ oMgÝ¿¡i‚—Û©gk.=5¶¼}Ù $Ç#¡Â )7 .O€w!^Ö - Šv&W –uZ "Uj" Ö«Z/ß £Œ)ˆHງ3 VP+ç‡iZ–¤ERшi^2¨+øÅlU¶( p€p(ä2Éf ½V ")$d aŠ-&½–&… e # 7( \Åeˆµ !½(M84 $ù#Ž:F¿.+XL  2Z'•õ(U­³] 7   %êoO§1 %b ‚Iû›¥«0-¤£g0 Ù£ V  l ó8–O z“ % WL0¯Ö5.( ['6&œœp ' .«›AsU’ \ 4A“j6&C `4€«j8ȸŒ© ,@“”VÉ”* \`‡‡‰þ%D 0a1J1Ó|²J ¢‰r  X v_*ÁÉÚ&5 ên»|¿@+A ƒØ7l  _ªJ&Q¨gÃ?4A,8ý ö–Š   Ñè(£c‡ ™@Ä©T Á`;‘D еw 1 ¥‰ ÀOcK*¦9êGŠÎíç¥(  °!®!¿6­,‰’ÞHêG¡#Þ¹­+€Ó"ÂL‡FÛCB²<¯€$$ÊÒ)þ½zÃý¾ Ô,¿Ò «)éã'Öõ¡ðÓ#CžÁèêšù?ÝÀ®Œ NIŠ È„ä ŒbÔ ‰ØôÛá›™$¶žçô ¥ ±#ÖóÑô7»-÷˜&¨°Ð’É Û8èÇ:Ç­E¸J·7Ž#õ%œ:Ž´$ÉâÔ Ä ã ‰.úëÍ ÊÁ$¢ ë ÕÀ ¹!¡Î…2îê¿À(©©µ Ç!ÞWó´  ­è.¡³ “9ÚædšÂÌú »µ½ä–Æ+–Áâ,«Bì#úº8ͽG¢KÇCॠø4ü¼ÕIî±ç9¯-ä‹36ÌÄÀ)ÓŒ,®%âA¯ø'—&Šõ)þæ /„¢ù û0ÜÚ ™¢¨Ø0,ˆ •:¥ ó0¢Þ.î ž%¬L² ˜ ®«3ž'À£L ת "Ù(Ú!yÌDÛ-íŒ+òÉ-ê;pì7å¤ºÊ  î3,‚ž.øž#ˆ!Ñ1‘ ý<¡ ¡Eãß„uÈ –Qµ¢Æ~´ þ ®žø$Ö/À¥CÓpª èê7ÑÉ É‰ê¦nüBÛ2؈æÿ法ðµäê Ï+×­ÚâÄ –˜Ýø³+¤â¸¶)p¶÷>¤òé «œ¨Žôí‰ÙÁôÔˆ#ù è ðº,Ž ¤ Ê8óóF†FÙ Æ"£Fï‹ ì ­­ „Â.³ Ô£‚½Fœ=ÀðÒM¶â#ú¦(à>¡=®ô!‚8©H«"à3Å4£5Ý+í‚4ý Àöó Õ è€#í<ž9û 30ÍL±H·¬ÀM–‘I¦ŒóL³9Ì •’ü„¦Å ¸½à±†H¿Æ´ › Ç'‹C‘Mà ¸ §•Cõ¹ ê'â …š(¼CšK×DÏ-ƒ ´M»H Û4þ2÷½Š‰#ºÖš:˜HøI¢ßC«…‚Û‡ñ±+ËØ®>»ÙC‰»$O¬ÖJ®Û!@‰ŽIšCµ4Ô Ý(#á'ÈLå µBÑË-™BÌ8ߦìÁ/µ5 Bâ ¥ðŽÊ0š0פ‹ÉÇݧgÎ/Ü£ þ¢EΜ1®3ª(¿æ0òœ0ι&íÁ Àðx=¸:ï;âEá+‘7»4Ñ9¤%¬´&úÌÜ î Ç ó8,÷ ¼ ‡#ð è·0¼Láí@Ê$d Ô,¾ å‘ù‘-–/.ºŒöŸ û­†%ŠÒ픆ԻÙ)¹8œ¼Ê#úûDô T ¢9Á ³,&˜I¤» —1™=ó!ëƒý*Ý<Õ­… º•£M £9Ë€#œèJˆ ô?'@ô2® -”® ‰HÏG” Ê‚8Ž;…ôuí±®“œÔ˜.ã N0$å!(T:>B0”K‰/…«Y~ «` n¶0èìZd3aÖªŒ‰Åº­ º í ¶Ì ¡˜´‘¬ ¹²Å.½¬ŸÎ¬Ñâ¤B΄ a©Ò»ÐÒ\ÊõÁ¢óRƒƒ¢ ,ÉN¡LÞ±PÑÊ” µ¡ë ÿ‰‡ì„YH¤µø Ùô ¿ î²¹ô ¼ )‰Œ?úÿÌLŽ …ì¬ Ÿ/( )Ÿåކ• ¬«šŸÂ@ é­â úŽáÛ£X ™ † « ÏŒ­ ¥Š¨š‰ ª h˜’ 1’ Ò—œ¡Y-Á§š ¿¼½¦úD±Žƒî' ‚ «³!µØ@Ô–»ýÿŒ½ß† ã ÛOÓýÅ©ÿޤÚÇ¬Ê î¤‚ Ùoå  › ¾Ô÷ê«8æúÝ»›©¿ 1 —†_­(Ô½œÖ€üGö&¬¥aç ’Šá Ë•›ô„duÈœ¤‚¬›mÛ¶¶° ´ôÚ¬ƒ.ÚEã± ç0žŒ"€’2ß­›¢ q€†Öí"y½ Ü  ªí3¾+›FŽ è‡– × „I¢E¬G±8Ì3´û$ä±Ä$«, › ˆ-ö/ê$à2¶†H…FÝB Ý0ÓŸ­F`µ—%×+‹ôC£3ý/ë—ß ¶ê  öšHŒç=?½È©Êã¢ÙµÐÕSÑÓ«ëö"C¼ Ö(œ Ï&åøò´ãc„•ì ‡¥ÕŠò y° —(“ó,†ì ì éšE"²ÀÀ›¯a –Ö ­K‘>¢Ò-„4ô?Ÿ˜l°³ó,ñîC€&¼IåÈ,Ê"ðÊ;࣠® ÿ¾*¹î ¨µF«>·5—;†ûr‰9ô'Ó ÉI½<éH§´ ”;íÊ=Ý=¢ ê25Ï,C¯  5ö*¢3À6â3§$Ѳ Â: È6‚ó É Þ áÃàŒJœè¤DGZ ‡¤ÍæÆôõpiå± . ¿K˜°Ô˜Áý‡K˜¾×šþº=ð¯Á¼œ¯Î ž EÙÄÝœ…€ØI„ÝÕ×Kèˆ ª î0òýÄÿ §È §úy èöákˆ¬Àߣàj}h¹è‚àÅI‡îƒë–Ð32“½Ü þ Ä¡ Y‹P­¹’Ç ŸK¼‰°èÇ'/Ã%³ ­äð— ÖŽ¡Ì“ì»æ/fw—Ÿ$¤hÖ ÆˆC€âŒ Óç&ïçû ®ÉÊN‡y¤ €ñ€¨É¨›'C§òä·ªÃ-¸§ë¥3Ã5¥¬ü´»ÊE‘¶ üŒ Á'ú¾yæ ÙøéäZ‘±¢Œ–‘颜õ ¥Ñô Ò 7Éß €N]tÅç Éóç[®·—ƒ “ï ¦ïÖȬ?“¨hëDígˆ€ÁÁ–F\Ò Û§ óã©PQÃñކ”± ²ó‘¨¿´”Ɖ§ƒŠ²‚¤Ò²2ŠrÛÏËþ ¬Râç ›&œ¯Zì0½åƒzõ&° ­DšìЦɕ‘Ú7°Å2äL·üKQ²±±þEÕ嬆ôåø,–²^Š-¥+ÜL”üÈ9¯ £àêíÊÅʵß/°¼/² ˆ=‘³?øÔÈT— ‡È%­ Œ%¨Ê ‘þ-—:ÓM½ßDÛGá?÷! úÚCß2¿4)*™4'¶¶ˆù,ÔD´;°%ÔÏÞÏ¿L¶H¼*„ Á<ëû/ÊÄ% æ4ÐA¤€,¶1°É€;ô©*ŠÇl¾ì M³Ä"\ ë#±†F©¨&™´°¡Â À€ è â &wmÐ «øëÉ)‹„ 5‡3²(0r?ø ñ)¨åRª Œû RÔ¯-òÊ<öEùȲ™,ãC¨ ðFšŽååÞ)«%ôCnü)¼Ç5žC¿GE‚N—?øÝ' Ð#Â(³C à©¥4 Ò+nO¶$„ º5“ÅLá*ý#öGC$ÇÚI• Šò*¶;ÂBÑ:¾!ƒò 4áËC¡,‰‘ÇJ›Iì=*Ò8¤E*Ñ3W(þ%è –ÿ*ÁN]ˇ”ã†yμæÂ7ŠØšè¤¥êá Ù<¥ Ç)š‚»Ð´â èÑ<ù õ—Ê•EZ­Õ±Ì…Ô ¬!!&)º Úß[«® Çà€‡¡ Ë>­‰¿      ÿ¡å‚ÀSºÄ€3Ï  Ÿ„=šä +âØï˜Ë § EV Rðí’“•ù}kÅžó®ûBÎ+‡pű®·' N’˜ó.Äa–Í($JÚ¿¯ Ãùˆ— `ë— Š á’ŒíTÇž PúæõÙ§ "Ò½PMÌs¼¶väÀW.22- á0Ý ‰¥ÃRÐýªØ*ôø„Ç “ªç­ÖwŽò¡uŒ«¨Œg ×#‚² §jç£= éÙ 9Ô )±†ª gëÒÿÌŸ{ ‘Z‰Ì ·‹“å…Ëjɶ & QäqÔÙö×±d°ŽÝ×g`_  ·CþLÁ‹kÔOº›Õ ¢ˆ©…úˆÌ…Þ$t)t«ìœ¢Ü†‹‰"¤Ù{á 8Gq²¢“É Á˜r…·¸I¡ Ê}sò|æÔI;]ߨȈ•K£Òðö©\ö½ÈšÛ┄Äëµ€s«†ší´Aˆd±Ò íµl…É,€ÝŠŠÀÙ)×’‡[žë¦Æ6´ ÑÞ ‚µ ñ Ѩ‚Žy $©µ 0˜G­KíHž.à=%à´”(‡º†°K·T¶«-ƒÚÛ¬JÙ-§æïdžL¨à Î%ñ,è&À¼Ü­½%¯2í¾–² æ,°?ó#·$æ>ù"·&Ö±¥.¤DŒ‘@Ù2õ0ù¤º™.Œ?ç »M¹/™ š&õ½GèEâ ù ’E¯&Å#Š?Ù+§L•1Ô ¿$…F£Ä ¤Ü †º.Ú9í.Õ.¾ ½Ë ƒ}Ó-ï Xÿ8þÆ*²_5í £è8ˆ›7-‘ß/è×<È ¯;¥Á’=­ý!râ2[ ¤EäC÷F½è‰ î@è6ø&&#(()*%6+6/5%$Ö,–2Œ$Ò-¥ €”4Þ)Â5ìÉ-…Ÿ/ä5×8ŠM眔¨J€È4ñ/Ѽ0’ Ý+ø â#ÈþÊzø9ŠÃ&ò5¤4†§¸ ,Í=bà-¶7¤#–#Ôù!´ò5ʈ2£)Å#ƒ2üÇõóIì0ÅÊGÍ#Þ ›Ob^¼¶º¡ † ° ëŒ ¹‹íõ½Þ'°¼"Ý$ô ïΖµŸûÜ ˜"½ø%½• •ŠEÑD¶œCµ º§ä€ˆ‰“ »÷)Ó!þ 'ƒƒÜî ÄŸº8Å ¢ $ñ.’ðëÒ×ÏÐÆù*øÚ Î…%£Ê8$‚9• °Ä:°ô gÇ Œè ô(­ ƒ+T®>£0Ï <¢Ó ËÆ'˜÷!ÆÑ‹íM¼ê&ÎMÉú ì2ÿð¶0¥HäžK¯0§ í âE×Ö%©¥(Ä*‚(1Ð8ý2Ú#…:»ç'8í"ùƒÔn ©çÈ'ßê×õ ûþ>íHâ<¿°Küä$ñ/»‘.ò ÿÒ+ê þ  ÷Ü$ˆ„³Œà ù=Ì¿’Ÿ)›í…Œ¦0®ˆ¹ Ž ßõ¹±³²ÍË ¥ ‡š©£ ¦ïÛ‹˜éÎ þ‘÷Ø“¨/¶ÊÐù%çÖøÜ®!ïŠ%"ŒÅÄ ³ ¡œ§– Ž—Ò ½‹­‰é« Ãüe¼æ0‘0Æö>™à”ƒóŽÕ§  €Ÿ  Ü q@?ü ¸©ô ¡ ¹Ï‹È®†Dû@åö¼ ¿BŽ Ä „׫ÁÆ'Ò¨ð©É9¬4´Ô#žT‰ 1À ÝLÜ'¼A¥…ÿ=…ŸØ;céÆ2$ì„=¨Ê!MÃê/ãG¬³4^÷Õ"ìíJó8Ì Š:£/`© ÝÃ1µ#í?óå3¦%û#‚JÍ è?2; í6]ªï7¯>‰ÜAÂÖ9ÌÜ›Ý Ú¥àé †š=ØŸ©@Î÷¶Æ#€+ "6įÈìØ…Ô)š »›Aí‘Dº'æÀ÷1óú3ö Ö<9öÛ(-yŒCß âå;Љ(² Þ ©1ÄE…=¿±üÃÐ#Ó  ‚* ß ò4»éÊ‚ÛÂÞøñ”@VŸ Ô4ú +ƒ2Mà ½$ê#ÌD;!€ìæ2З ¼ ‹ìD‡ø1‘<€ Ý… +{'*k®9 ê ’÷“=ïC'Àó'Ü ù-ð 7ù5“¯æ¾ ð >Ì 0’‹ù# Þè8ÍMœ–òÝ*µç@-ŸslÏ#ì «÷ø‹Ä¢I¾(¥€+ÆúËH†”MÑMÆE&×÷"ö=‹cù ‡,4±Ô"M¶Jž/רø ¾’±L¹Jx¢+µ'“'•±"Ú éŒ)*§4æ ·%ÿ XS¿ †K÷×ü=]#G)Î å-ŒõÝDÁ¦Ä’ëú6î8çCìÑ@³’"Ú˜)Ž9j <Á €$¦$º¹aÁF%\ÐÂ,8W%FÒ$ÕîZœýÜ0+7’2"8È Kq3 [ur¼¼” èØ@3kÿŸ ++D« o '&ÜÆ÷à&(‚"6¡,êÇ‹¿3¯3ñ“2ÖÃÃ8 ÃIwp Ê;"-  ¾-ïO©´(2­1·ÚB©H¼0Ô<ü<éK»¿å6­íë&š$¬5‚)… ÁLÁ7P6ب‚¹0;Á®#š;-ÍLÁ ߃úëFô)¹0D?ê3žMâÄÕ \íýrôH‚Ç,8êJ$ €"ñª) ‰ %ƒE£8¥8ù0÷õHù"½3ˇM“÷)´‹ º†ëÐI›8^-æ1•4³ž)¨â$‰IÇ(¿ Ã*ý62Ø¥ UÉSúéÌ^» í´ ’0Û$µ×­¹³ ©Ÿ/½û™æ@Õ õ+—ç’ޱмK”¬è CVñ£ó¥ªé*®œâÛ$¼ö Û¨1¦$ƒ…Ü#²ûÓå„ ˆ± Ì+ô÷6¶…ÜíÚ¦5 9©Ö Ñ">ÄA‹-«ÒM¾/¤F¨Ð8ËH¸@Å Îæ5”÷=Û‹©âÊÿ Þ…¯¼ˆ?áú ˜ ŸêÌ / š.å(ý› &ÏÈ"6›âÅ:á9ïõ*"ÉU  ¸å3Àøë+˜#ßë7Ö”>ž>Ô&°;ªC€† ÷.…Õ4¸@KþG¯‚¯ØVíRÿlCi5…ô MÉ&t}Rþ†ýV4„ÃÕ>ƒ+ëzV4„mª%„¬µšë‘U€AÂÔÍ áO&óÆf $’ •¤ÿ·/çí*Éé³ï© *¸´ ‚ß¶}(ÂóköÚßUá§ ù ñ^¹–ÇeåáýÂ%c9q Š’± Vœ¦Vå Â@ˆŽkDÝP#@“ò¾¸ìò1 Ui¨€¿ÐŒ6ÁÇÕ+ý½õ W–ùIA×›_œ &èC=3]‘4˼ֆ/˼­ÆŠ³ <øê ªó àWLÉ ¤Þ Æ°Ï ³L»†Ã(r0 ª«³¤÷ ½ | –ëèŸÁ yEÇ•LÙÄC Iî(fÔª… ÷È1¶iìp„‚É*—ö-޾ú”ü:Û2ÂrK1¸ò~8 À…˜m€¨Œ´Ð/œ‚c§¨äq‹Bèo—­Üí©ð•º©—h`!VK¡µìr€›,1»ÈÑ¿\ 2?á|O„™ž²–q &'Öõ–Ëã8…½é éçöúŠ40a?Ç ó¼‰µª6ŽdšœÝ 9 âa~Ð&‚âÊÆÀ½â~„¨Ð²0žHb0¥§¥+ hté ¨˜MàO~Ú  ÀÉ Ù Ú‹t˜ˆŸÇ£€ IލY¦Jךö+,ªM“‰Ô«Œn¥7Ö©sÆ&˜Êš°Àña‚ ;³ˆ7Ο'7§$å'7¸ ¤…!²¸ ‰àk‘`®á’»r/Ê*–‹Ê¯+×'Ø ’Òaû:y-qÂÊ×'ØÕ»ì“ŸÈ’€«õ ™ G-)—Ä yF"³…Dån ª£™Í½gJå€JÆ$; 9…¨² ¡‡ .!­i`!y[ú«>0+Ì®4#˽ò¯¥Ý1ë ¡ä¶4…ýù yôžÃø-„ <ê³á ½¤ âäàÍ0—Ķ î ‹F… Ю»ºÍ%¸ —|™  be[Üé í÷>÷-ÓLÙá&Ñ:­F³Bì3³0¯ ó$Ë |­¾­Ê—aÿÔ@ˆß ¬?Ø$ñ¦g}üÕ Î£ ú*®™/î Ï–Ê3£°«ºƒ™ ò 7ôù…¤‘%Ž”ú¬Ä †‘¢ê¤   ±b{ÿ£‹>݈ …&©Ã#šâ ·• Ì• %«õ!Óøg» òÜ ¥ ÿ9âCùXŸ Š cÇ:¢å,ð¼Ø‘©0Œ* óø)oÑÌ1¯µñ3ÿÍ-àÈ$É Ôç i§%Àà2îœ ×- & <ï.\èëèKܲ@ ÍÇ«dö!üÜŠÛ“¡ßìö ñ—±Üˆ¤¸û ¢'™¶ µë¡ Ý ã—Ê üª¸òǵÞݰ˜ôÅš (Ç— @1ˆË‡ • ¬£ìš˜ ‹û©Ô ƒÒ ßÒø¦¨Ê¹å F¡Uóð«…µ§»Ç ëIÃÙô æ ‹‘ÊŠ•#è~¨Ö~Ì ËÌݯžÍ¥ÄÅ… ü ˆ³èC··Ž{%”Ù *ºŸµÇú ºÛÈÿ¯áŒÍ É26(ñ•â :tì궺 ª¼ôµú߀ åOgùÄ‘Â#v½“ Ø ÈÔñµ!¤ñ“–¦ ëmÍ iK¦ ÉàŠ ¶§â  Ê €Ã…Ð$Ø èéç»Ó$óçÑÅ.ù Õ áMí“ ž Ý ÀÃKû8û ¯<ã „.„T;ð+þ¿ ¿§Ý áÏ Ê"¤­Ü•¯!îB àO´…¬ ýí õ-ý›¯‡I›ª&î1‡&–¾:þÂæƒ"¯»©y¸4ñ4·îΔBÏ ¦"ªÃ#›6ˆ#ºË Á.Ò³ ñÔ– æ.¸ìØÇ5Œ^õˆ”7ýþ%¨¥ ŸÖßë °.Žž-¥<¨-„ôôÄAéÓ ¯Å1 ãµ²;¶'üñ'ò(èÙIæÛ=ÿéI· È£¨.Æ ‘Ÿ8 %“3§ ÔÞáB‘$Áˆ-• Î÷Áã-ø×n‰—œ Á¾ç$†—ìõ(ƒÂIéŠ-ô ¸¼ñE µ‹0ÔøõFþ"çÝÒ7¹÷)‰-© B»2óÞGÌŒ¬ðçÜŒ¡ùà ʶ/Ü ë=–‚ÙëÚ ¾+ñLø ¤Ñ×C§ƒÐ2š ÷%¾ Ÿ ² Ê„'Wó?åë.û ”#ì6—·§-¯ ª Ò¯!ü*ÉE–+ÑC„¶XK2x•9» îÁ¬Ö5r¤ ìØ3Ö ÒÔ¥ »h¯"ÝÝ (ú êBʪ#º ‡v¡3Ä>P«Ð6®.è îMŽþ ú‘ VÞ)8¦5Pò˜åœ(çþÈ,¯@Í‚;œ"°Î2ÛŠ2ÞÑþ©;Ç)±#¨"ë2»:û ‚A÷/Ç0É'¬“"×Eø2§ê‹¢3ßLÄ#Ø+­éÑ4Æ?ÐÓ‹,º êƒ¡%Ï«-™Gí2¾á"¾ â-Ÿ1D¢Ö@ûBÈ"¢9˜± ]ÑÙÅ2Ã4ø2˜?ßE Kü7ý/°,—C— ÄJ‰Ý„Ó Ç-ˆ·ä€ÞÆ ­-½ ß Ú ƒš‡¢¢¶«÷éµÚã֮ɜ­×;‘|« ³úO“ ߄¼¦Ø±êņÅw†$™‰ ã°Š ÊŒÑ ý ÀÏ0· û·‹Ä®8œ ¶§$§ ôðš 1ó}ÿ‚$œøÙÌî*ؼ Ã†í  ‡¿ß â›àÏ‘­ ÿ°%Ž) á÷ÍÏ1Ò3Ó»>Ÿ· °×¦ƒDÕC\ø  Ñ-  ¹. .  ½/  0©0 œ1 2 Æ2  #ö3   ù4 .   ÿ5 ˜7 M ½8& ±9$   Ÿ:  œ;2  ¬< ±=, ´>! °?  ï?ß@ *  äAöA ÐB   C ,   ¤D   E 'ÆF      H 5 ˜J ãJ  5€L ÓL 3  ÖM ' Š:,  ¨%Ù/­/Ž §'‘0š0µ*¦é È*‹=‡µT™™)ßô<ë4¶(9ÿ ŸA¶EÆEË.›àõ²Á ³8†Hò£ N  E~¥¼L ô ý‰¼7½I™¤>äà5íØ– ¢€.t˜ÂÅ'À»,¢Ú îáּШӲþ ¥3Ñż ü0öÙˆà<©• Ñ0wÀ¢;Ž ç$ñF1ÈFk€ ³2‹ ¬ÌK>&'Rˆ5ÙÖ¸é#ïˆk;4é#ñ%¯×!´1"çßF ( 3OêF¼+ ÆvÀ”ËšÀ×Õ ÃóÛ ¹Á²ø ìÓ’R óìú;Aæ ¢Ì ì®ásëƒ=õ* ž - /ÍØÂÏ š’ŸF4e þÃä '†®[âÔµ ó$¹¡}ð› ¹#Ý)2ñ { ¼ç A À*}œ  l ¶  •´ 4ˆÀ ¾Á £ÇˆÛ&ó/ ýA Sæ(‘ óGÂ4²¼#ÖF—7Eª-¹MÙ Ìý‹ÍòÎ<Í´œ°Aר?† û ˆÞ ¢ ÂóHKŠI¡ÅÂèIÄÜÌ™ùʌ廧õûõæ é ®ª «@B•‡4½ÁL@DÝîBÄ¥*³œ =A?ˆ§D@Ö?NC¹ öAãƒ@†›@㸠ÖÞ¨ £í•<çä?íMŽø Æõ ‘ ²Æ"É0ÿ9„9ÛI—+­$å·Dž ¡ÌäØ)ýç:±JúñG¡(Á=å1é÷êDÆË §>¬Ï2àÄ TšÑ ;±™Œ(l· ³(þ¨ÞuÈ-TÜ4 àü ì­ §E á#̹"' °´  ó#Wð¾ ÏóÀª³¹º¸í¥«Ëñ >ʼޭF ç¦)ý›¦*ý …öÀ@çFÒ3Ò0 1¶?³ß#âE©©Iõ¥;å+¼ÀŸ«•~± #"¬3Á,y L/60ñ6´DÙ†‰*¢‚é"¼—&‹î4™–&ÿˆ ØÈ G¤&i~ ªûIÖ µ=û%,%ÜDq´Ñ Ð*"Ú‹4<ÐHü&‡2¸#!Ö—É”)¢ÿ£‚"ìMŽ5„+k;4³ž+·+•ñÇ ¨AÐ4´'(%!"X6+23“"È.ø8Ø œ-™¤ À%·€Fþ½Eã"Ï¢µKà¡%åŽ ¿ÝB ùBë°û(µ–.ÆšFßIš<ö/Ù'õÄû5¡ð5§¹@øÓ®Þª@Ü¥â˜:¼@»!Ð8š5lò“-å;½%¬#¬õ"òÏüî¼ÃPÒ& ø•Áéù àÕÖ— ¶ Ë5 PÏ/à ¨2±¶ü²¤§0$ÆòHã"§òú¸€š?ÊèÒŠ àéú © 9ý!Ê,•­¼ û9è §² ù2‡ä/Í 4ˆ Ò ¸%&ˆÌ!€'ˆ/ôÍõ!=ßã¸!nЦ†§³LÖ0jÂ÷ˆL ·'À†=^ˆ0ÓJõ;ú…6      £ ýt ”1ÂE½J¬KkÈÕ-2*:ÜHæ û2ß5÷ûÍ“E"FëËŠ¿ ­Š&üë@¢Ïµ?„IËâ,þÑé(•%ø"š À2‹82ò¡`ò‹»-­?œ¼9Ú «-(þ*‹Ä>õyÜLë3'¶$à1í6“+ì’,È3ÆÌ;è þ=¹7¾¿ë0’Mä ¹&ªœ?Ž*mµ¥<È­/óŠDš ¤ å;þä® ²ïÿ›¤MÈ,”«*ë‚…‰0Ý@ÒCŠ@† › ǸÉ+çEÄ(6¬åHœ¤,³3ç £CÁEM ûHæC„HÔB©”0˜ZñÔ)«)šÔæ—!“Å!Ÿ/­4ü;Êç.ô>‡3·¶@RÛ¢Û.Ä9è&Ï?¶Hì袩)á•0¢5´0Ô# ⊃3ƒ·:¬C¹)Ä"™»70 !g%ö #(zщ˜ ñ- ³B¹ª—# +xGKJ-.s--À\ß¿)D…8–4¹Í.«=¤ ù/Š:¼Û9õG¤ Ù•ý úÛ€ 6–Üì4ÙÔ ·8Õ ´ C¸,ëÑ:€‘ Ρ$ÄÕêð8ÿˆ7Pê¸$ú!žÏ­9ù Š?ÌC®¿êŠKRÝ&Þ Òô’(ìõÌIÒ*+› –5ªgÌKÿ¾+ã7ú1ùL פ†I—'¡!¢+ ŠÅ,Öú'¼Ÿ ã¨×›™ý 쌅O§É ¾«&Ž€(s;¸3¤Cã* #£,^ÇÓêÞ õ ø8ªÏ… ÊAm1•Ó5mÄó 4’Å¥Òê¤ yùа:ý$« û™öî… 4Ã(ó¢ÖàÝô ÏÙÕ ¸ÂJÃ;äů½¬ Ð2¨¹#×D‚-”ñ1î¿*¥9þ+úÜ?Ç;ÁM¿MØã3Ú™ :¿ â:Ù åw''_>Æ,$ãÃñ¸¾€‰Ç-‘ß‡Ž š³ Žíû Ùú±§£Ý¾À‹…£š ܦô¤ê¤€ÙL•yfî~Î%Ž· ¹»¥æ ¼ ò”ÎÀ‰ ‹SÀ ê“ÒïJ» ª“ŽÊ#Q« Â%϶Áºç¦÷ y¿’$ÎêèbÈU…ÿ¾Ë×ôYßÉÒª "¼Û(з –_Æþ‚ß³æ ²ž"Ú!Õ?¬úàj´¥¢ÚÉ› ý¡å ¿¯÷¥®I§ÇÊ ‹Øú•e.oò²¿È °Sÿ™ž †è„Oµ íœS‘‡ ˆ‚ôi¦’§ ú¶• âfæÝ ³ÄŒZúÒ Zý«‡ 6Ã…0êô²(Wáó… òÑ ƒ'¬Asˆ d¤#ïþÖ ˜/Ç« â’vë‚Ýî”#ž'Œ ©þò'†"ßl¢©Ø/¸ Ê4«þ*Ø´Š,©H“ÇÜ>ê>§ˆ j¬%˜Ÿ… ­&¹¡(Àì–õýù ð ‰ Ü"È!¡–é¥í'Ÿ ìÊç ü Èé ”ìvh;"",6èy"œÝnÊÇ­ „ŠéܘÆÜLüAü ” nAî í *r¡× òè””%-x†æÿcg$% ‹ØÏh õÇ Ö “eöµ? ®«; ”*Æ|·´åŒ³~“U¹ J@ƒ²¯%°î݈³)ˆCÅë˜X Ai<‘P“ú®^ gœ»8—ŠÄó’z%ŠïkÓe޼‚Â+G@á+°% êó‘¡& å¶~€  @ -L솘’#Žrç‚é êµ\d€…PÅ;ø_oÞy.æ  ¯ `5ª8CM'¢Õ1(Ùᢠá))©PðóÞÓÔ7­Ö X”ò M½í ©” d _qK )"jçE¥ ›šž±§Ñó—…N Ë€¿‚j›„üÜ”/0S·6îú¿«âÚ€¨ÛV« t×âÊš¿¨Mך¹åщý U¸ Œ„©S“Æ™¥IÆò˜˜¿ È ©¬¹ù{â }Üf`–bD$"†á]9 Ëå‹"©÷›¹óƒZïÒ£ì¿Ê†mÕÉµð†¸¸¥ ÊêØV©$úuìwˆCÑ0õX,<¢Þb ‹wŠb Æ‹¤ ÊØ0’‹ÑŒš é,L¢}LÛP+Õíí s“}‘À(K<‘“ ý±å Ç$üͧ©Š£_W¢–"â¡5×À!~v’ô™;Ø æ_M￳.@ý‚[›q ÿL»ï{Ÿ‹¤¹¯Ÿž¼—šŠÖõu¹”Èu©§ ¤„Ý®‰ :(‘  …®é®.Lµe ©™,wV%øÏ“ýŠ :²ß#<ƒT]Skà5 ’;ÿçå莘©ô&ÿ\¾3ë"¡¾´º¥b,‘Ÿð$இ»Ó<‹7¾‡ pëÁžh°Õ“üÈ( ¯ë©|øAˑΟ²×ŽÏ㼊çÍó ‰ê(Þq—øËŽ2=ã/Þ€¥Þ=Ÿ±ŽÜ½Š¤ŸB9— ¿«Í¬Ë®0 "©Î#ÐÚ•5ƒ üÒ<€7º¼=À`*ˆ²BûŠ6—ÒòÌÒµHâ ¾±Œ!þ„%×FÊ)µ‚– Ø ¡ (ž²3Æ*×"õ˜Eœ&âLï #žÄ'Üó™K‡<8…‰ +üã‹‹ ÈÈÓ+ó0îÚ’ m¢é.ûðÿ" ŽÆ€ ²TÓ†6Ï,Þð¦Š&ƒ Î$— à ´ ´ Ú+Ù‹ï‡À’:¹?è#Ö@‘HD¦Gº%Á3á8€ô ã@–&À&ÛÊA…)£òE¿„8WBÏŽ3‰ç#çËr¼ š5Þ¯CÍÉ)œ@ù"¤4@Å7ƒ5ì 1»¸ 'Êꢫç­1Ÿ±! Ð?+–kÁ'‹ æöU€ð ø Þä§­J£+© Œ,À˜©ì&¯Œ©âÜ+ú˜¸À̘=’ • •î%ú$˜Ûåâ ûëý¹ìÞÞ ™ º(Êlª× žŸ©M‘¶§!´&­«»!#â@ñÚê®ÍNÞ ‡é ¯Ì¡ ¥Ÿ ˜ÿå.éÎ7¾ « ê“ÿäû£¢ ÓÔ%Áè¢Hß’ÊÛ÷¼©tÔŽúœ ‚3â#­Í ÕŸ ¢×lÃÔ&…æ×‹Çç£'Ô9»¸Ûѳ"Ï ‡/&·*ER3J$*ú2’,^ú ·HßG´: Ö«“Ôß/Ú.³Ê¬œï4Æ÷"Ë@œ…õ3é!Ú$’?àÇŠ¡Ô<Ž9ØE™¡ Ü>œ?Š4ŒN…;Û9€IáE«.K' Ç/¢ q(<ßSÉ2¢€¾?ö&ðH$>Û"¬Ò®ÄÇþ(á«àHöÌ 8×ëAÛ ® ­N—Œ,î=¤¨#ƒ í!R!=ÑÖ›=Ê Öø'Ô ,©†°Â„µ™ð­ ïž Ê#ñlËAõ@‘Oå NÁ(¼¤Gî"ï7ãû ‹ñ0® ä>ä>Ö5¾;þí:ÚIþ@ŸFÎ̋٠†Ë/Ô#Öˆl!.4Ã'Ñ>™"¼#F¢‹„)•$…ÖQŒI€-Ôþª.Ë$7ƒE’*œ Ò$&Ö4f¯J–Ùß­ÙGÛ(ÈÖ2FÃ?¢°Gž°Ô CÿÕMÂ×Ië='"µ€$À:Ê O¦‹8ƒEúþ¾,µÕé5Ž é©Ç@¥B¢ŽK½Ñ' ºƒ´+û3È¡6^’#Ô£F ¸2À:©<™e=¿ $·#±—#”I0ª4‘FÊJžˆÒ4Ø>Ñðª . ׮ƃ'¶ŠÐ,§*¦Í4Þ9íʃ„¦ ½A–2Ô2É„@­òàä/ì' "‰Ô‰Ý@»É ªñ2¸¹'×!þ Ï+û æMø ¼ ¥!¤™ ‡ù – #¢5ß— õ[ÿ$Ûó‹½ œH–Èè±¶ñ ñ Àò —ä‰/¸ –2‚7kdÓ—‡0ã ´Ê „,œÜ/!ù  #Ã&Ð-Ùª%Àìí9ù7Û7íI¶$ƒØžï„|¦)ÁyÍ^· ˆ4 /!*£ ú 9 16&5@ ž°;(b‹µ¢!Æ „‡$Úé=›Ô ª'9çc•–Òɉÿ ˆN&,™j# Xª”M^]ñô÷5£ƒ'±$°-’/±OÚ ·ª ‰Þ‰õu„øÔš>Ž«9ÄíC™‰Àß3Ü ê.=¾'Ÿ#í§%² ¦Ç@±Ÿ)¬ÔF´¬C¦Œ<êñœž.é'™Ä'Ä‚?¢ã½ð— ý”'Þ1§Äˆ=Ã+íß/œ*Ø/$ù*HæC†6›=™K$&™·öô+Æ8‘ó#öý²³Õ¦ò‹¯‰¦ ÷/¢"Ï+É*±4†­=íB¾69¥&»1ƒ¥+Ò;é-ˆ'ë=Åé)Ô3¥¸EÂ" Â!Ú6ÒëÜ Ð Â Á )Ç5Y† Ýê@…AšÇë°ž6Æ »0¢·.ð¦!¤²@(Æ î@ý#+¥^2MಠÝù ±´$Ð3ÊFõ= ÌM¹Aç´é6þ •®Kqe ”÷¡‹ç;>w*í+ã‹'–#¥H"* Ü„²n µ õ†¼» ï/$ƒŽCá:å3’ €>ç‡ØA¾ìB€ ÎõÅ2ƒçµ™Ý+þ×çü>† Ö  "Ö–ÆÀ'ö­ŽÝ!Â#£þÍ“ çLÑ%àï‘"½÷ àÙ²” á þCÝAìI±*÷:ŠÿÐÄ6 ÷;ô†é"0+Æž&`’ÕK¦K› º0Êïµ(ôH“.°7÷ñÕ;¹Š>­È‰=˜ «Р} —ç– u÷ýÚ ð …ÀÏ çMõôÙ Ì™"Ï¢é «†­ Îç2 Ó DÌ Û-†ÇÞâ#ŽÔª¤ñ-ÉC—¯ü±CÌDÞ¾CŒI¤F¿ó‘GëFº§8 ø¡¤–ëÌ9Å2Aº¹ ò¿ßÈ!œª ÉÞ€¹Ú†<÷EŽL¢&¿?é¿=õ+çîÓ1°2¯·à £ ÂMÙ¼œ©»#Ð*„4YÛå0¸ÁÑ) ¯ÃH’¡F…7?³L:¶à#‘'Ʋ!ëG%G‰+è9Ö Ñ8±/ËŒ Ê$ã…)ç®,È! Éñ¼5ÿFé ¾CòI°À0ͧ¹KŸ%¢Å Fˆ ã<ê Å5 ¤Kï6º «5€)ƒ!–$‰õ ë&Õ$• ƒ ™(æ+¿H¬ ¾Cƒ2­0½»Fº&¼"ÔJðÍ.²²¤Ù¦K‹ 9,í ¯$‘=Á<ºn¼*Ë4Š‰Åš#'âË)Í5å.- #/9¼2¿³9Ã-´.êã!ÚÒK³ÇEï ú ê‹ •¶0Mä˜2å¶@…¥#ãM‘ô>Þ‡(Ä š¤%Þò–,®1 ó/T„°4Ï‹,õýL§MM£>-Øî‘>*¤·#š X¿+ÚÕDéAÎ>,ÒDá  ÅM¢$Ü-² ‘ ´(Ä àHÿ#þ.¦$¼Kþú0ç… _ÞôDûH´»±Å¹!Ä9.Ý ¹5ꈑ5¸ÒÙ ­ Â?¶ù)¿/ü€KèLð'¥5ˆ Í"T˜7°<Ÿ úÒ&؇Eˆ4‰ {ÿJ³=™¼>Ô¼;¨áÌ3Â;€ ¤8Ç4¦C ¨9ö ¡ú*E  2 =AšÈ ’Ì.ù/Í(Ú8° ¤à:ÿ>ó®°7Í¥H¥@#ž‰6é%éE±%…3¢(¿.”°Ç Èÿ5Ç2¢ ™2¡ù¸2Æç Åú#Æ'cžò‘¬+œMä+¬À¨¾#¾Dí‚ ò‡E(Ë.š.»¹ùDø-Ã'É'e§ 0ÜÍ0Í#€¤6²8—>ß ø:†Óõ(ýŒî4­D޼?ŠÁ÷é ò—§$#džƒ'‚—2Øï ªTïá á$à ÷"Îé1)~v‡º„ÍŒCí#áñ¿ŽÍF© îDúô » Þ³ ú”ú;½+Á"{° ´ãÝ™¡,“CÀ)¸ Ý%—â ³!@LÌ"»G­V ’Δ ÓÃâDûÎÚ‘ ² 'ÎÜH¾ÓCšæ#½Gê¢"¤æ¥+«­—ŸˆÝ¯Qƒ°™Ú˜‡7Ý2·H™IƒêKÜ—•ú#¢õEÑš,‰Ü<â®9–?² úã$žBœ(ò…ÿ<¾ Ñ>ŽK—î6Ã×A²+Å»¥†$‹ŸÖ2µé;>w™3c¿!¦Š1§2ð4:O8"‚éC þH.G ^5R‹/˜F8ç³.‰< à ¡?¢C Ù!`OÃ//²àL ) ,šèKÿó ¶( [’ ÆI*Ã? ±ã ª Ï£Ö‰3ØØë-¿Hš?Ú œí!ñ6Ë:Œ ý8ÐéC×Ï´ÕÃ’ _øL½&©=@àë#à8¸÷8ÿ8ÜFåG$"N,5è   *—a á(³ã×Í0iζmÕ#À¬·œŒ$«5À@.‹'ŸÑˆ /²,Q”(úJ‡ $§Ý0¿0î%ü¼A°¥òúCˆ¬'Õ ä >ª8ðš¦;ƒ0îÄ“¬8ü ’7Ñ¡$Š½Ù ‰ü!¿Ð6Æ—$¡ î,ûÝä  3÷ Ì™3þ-·FÂ+ñõ<àB †(Çà%AÿAü?– þ2Ì5¨Dÿ;ûG\ž ʳ:Õ0ÌE’¹ çC’ƒÑ&¼*é ç0¹£-¢%׳µ;¦¬Eª&†#›ï7Ù9צ%éÁ.f¿«Í ùDŸFÁîïº ”Ø;‚,Ü$Û ›0³#®Uñ1²¾;Ìù …ãÒCëLó– ‚;àIÆ€÷ ¨ûû$žëÉ$×TÞ Ý…- ”v¼]ÒIï0Ù ß2ÝÓ³#þå.  ª0å ¹Jpؘ£3„¡ ÛM¨¬žÔ:»¸ÆÒ*Í$ï3–-¼ÿ3ÃÀ4ö 9 -î4Œæ¥$Ú2íö Ì… ß•£*šÙ)Ó-·:† Ž ýEÂ,ž-ª8ÎC»H©*å Î>Ú˜&3×F9Š6ö2‡¹.~Õ0"ƒ ˜!€ªú¶ …JÇ ¥4®*î4óäF¯é#å¶’9G¡ÙJ–0£"¾:Šþ81óè ‚ ¼±~C!ô… ž±« » ­ì&Ô *þõ¦oçä5'³+ëÉ Ãz…‰"ä à¨ ê ² "€Ë톟ÿŸ,¬ö #„£ká®í # »Àö Ë¢)‚ ~‹”Ç®¤¢ÂP„xå †2Ö¹ ò|ëÃU-Ä&¦ ¼£ôͦ:t»ˆ$Š áÄ÷íÎ £ f}Ú™¶=€+¦Aõ£4@íE·²5ñ,zÅJö#¥-ÕHù=4Æ>¦@³¬–(%Ï"¹?³³@ÏžÏ;Î7‹I­‡3õ§ œð¥áHÌ9ð ›î šF„íxÀŒäš®EA« ì»ú'–BÖ ®« ¡"ÖêïºD;K‰Í š6³&ÀÂÿ%Í!¢Ðà È¥Œ7 Ž…Ä%@Ϙ À à ­-©±ùãE‹•§‰7RŒ™‰Ü×% ]øµl‚ªvRT7ÙÔÈ /‘¬µ,Ê÷Žîð %Ë­C~4Ü-1'¶º ¬%¸ï‰hŸÛÝ ô›*’ Ö”ôÎŽî¯;vù Ë–P¨Ç pã 2ûü§ µ—`òJ¡ò ò ׋è»÷ å3´ Ûþ  ² _˜Ï  ‚¶0?kFÚÛ *ý 6Ìß FÝ Ó ™wÿÝ0š¯šÁô.Ï2ÆìùFq²#ƒ LÙ4±T߄˓3¬  ¥¬ä $Šßã÷kŸò 4„-C·’,A&þý ›Ã¾,W6À¸·Wª‡· ÆÁ žÕ 6€_™§ÙxÞÈ—Ý ýòøN”;¯ šŸáÉ æ%ü7“ "ê5šq‡ ®nÀ¨Wõy¹Ý‚u-èüïÇÄÇýq¾$ráâ^+B‚âJöª‹1ì ä=ã¢È zíÕˆ%›Ö¯r$O%Îþ.}ÿUà ž”;á "­ùˆ§û˜(°,®¤ €Œ Ô…È¡ ÓÝíæ)+°¤*æG>àÏžÚ ›ç/ú†[ÁØ– Ï(·ÛÌ ‹þ%ä™CŸ#Þé¸Ñ•ÊÚ ô(„’²–ä„IçÑ&Ô ·Ë*Ó–ZÍ à•’ èÛGˆˆôŸŒÖü ‰K«0í!ö@ø*ÍÎ-3+9ãÕ¨éÅœ²Kï ¤ ”Ó „‘5ý ì èÔk¨Ù‡1ô#ú¹Ž ™*‘¶ç‰Œùž ¿ ‘þò p¯£ ”2¥ ""ö–0ù Ê# Ý ¿þ §@ןî‚ô !å4'¬3\™ ªµ¢üFî» Ï)á*²â)ø=ºI´Ú»á1º±Õ#©.› 7ºKÝ"Â6îL³áïù±í9ÿ?úð£G¤J…Hò¡‘4žBQýò'þ4$K—JåEóÆÌ'Ëß ª4Î×A™ê?…ÐIÚ5†(¤ƒó˜0 !õÖ0–çÉG)ì×$Þ€‡Ÿ‘?Ð3ý†;÷‹ú#¡Gï0Í@Ë ×æ¹áG˜¢+¦®3豄ÊI“ Ç Ý%Ú úË/à ¼ Õp¡‘ÊªÈæµ1Çø*LàÎ9ô%Ç „åFÖ1œ”5‰E¥ÚžÆ¦ Ó<ÍúE˜õ €Ö À£ œ!ü Ç!†Jão¨ÓL¨êBÇ Ó.Ý€3¤(œ6ÉÿÌ3» óå²I©„ºÍC˜åü®MÜCôEFˆG–G½ Ô Ä)Õàö¨IÈ@‰úòEç æ4… ›/ŽÜÆ‹‘×õ îHý)Î ÀãIØ<é´ ¯Æ5Ë9þH± Û2± ±.² ÄP¥áFéªGš+$ÚÇŒÎ#T˜Ñ4¸#ñ9‰£ ÁœÔF2²9’G³® „:à b°$ß"{›41Š ù<0½?ÛAÍ+Ð=ƒ ÊæJ—™-ÝGŠ ‡JÞCÚà1Œu¾H͹G¬ ð*×5ÇŸ°!”Büýé<îŽ6§%Å"ì%–Kø—!•,IÁï yÃJõè!Ø9˜7>ØC˜ÀM‡1ûMÕ5¤ÂJÍ-“¤;©Ë›ØÚ4˜‰ó‡9mºû+ØŠ9¢­Bš/´:‚.N…+ª Ë/Ç:¹Ž9 1Àª µ?Ý È¶Ô»ï” Ÿ Åš‚Ó3ñÒ± ™ í¬¦³!íKÈÉ+ý!‰(„õ¾* EãÙ£4÷®™§8¸!æ2¶,º‚ Í6À0¬Ý+º‹!¡$ÏEcóÊ0¼mÿÂÖ!ù)Ÿ.¤È€¿Ã¼8J± ƒ Æ"€¯ß> âò ìΜKØ?ª‚ Þã¤DÅAçB!Ö ”iÎ-ŠF LÍ>è…G‚õ À*½?Ñ9ø',­>8ªíᆿ,ƒûš9¸±©4þþLù «›ì¨<þ•-×%åE¶3Å2“Éœð"’ ó2¨¤ À@/â6²3òŒ4<´L³&”ÆÙ‚ÆLë8øG½û¥BØ–Hž1´³ ¶'…!™¶2ƒ·;Væ''CÆÀ;`ê"‡EÚšAÆä7Ç;R· Îý2®LÄ;‰ëà ÀÙ;… èôžBÄï÷Ë—Ž ² 'œ3ó¼0á3À4ËI×F—/+ëC‚2Ä»æ'Ÿ&߸†Dµ Ãé8ÏÂ(äE€"ö ¼±6×’É2²,ÖÓê;“Ê?©0¢r ¿ û:ûù+1®MùJØ7®ý˜Á¼‡5ü ¯7‹H€IïBO –õ™” ‘ˆ!1äáHºG÷2¡>Â/ã£,‰ã¼ß¸)3Ð3™:‡†É ç ¡Iì0F½4‘¡8ö3Ç⌰@´8ܳ¡¸ß/Ȯà ˆâ¡ÌË òŽ™ˆ ÔE ƒEÙ=ÑBëÜ.í¿#ê.>ØÇ£E˜%Œ¦®5þÁ û<²5œÄY©0—HƒIÚEÆI¿%šH€2½öá"Ä5{ìA¢µ(‹Õö D®¯IÖû©K† Ž ·CÈêš&ã$ÖçG”FÑM– Ýê4 §òý;ô* „0ÏEæ6¨HÒÄ1ýÒ ë¶:“¬!ðGõèð#æ Þ ¾ˆ‹!•úý’FÐ2¬'ˆ ã‘"ÍÃ¥Çò€Ü “–EØ+­Ï"¶ŒÃ¿‘ ±»@¢ÖãÛC—¸Û ØÕµå Ë© ó®&‚H®'¼ ÛÔ¹ ¯µ*Ïð¼#Ö¹ÀÓþòsÓ ¡4ÿ¸HÕ¢Ý-Öå±'!¤°„.ª?ßA¢ŠïLº/¸ œ&å…MÐÞ/ÃE7›Câ ¿é+¦ Ö /“Þ!q…<í‘$'ê&ŒFþC‚Dü7ÿ9©/UÏF‡=óÂ'32ˆ úKþ õ íLß4!ÏÉh² 8¤“Wíæ+¯ Ó% ÊØóü"ÿ™!i)XýWÚñ»Âýõ ° LÉ+Ö Œþ  ¯ „2±Ñ9—)±-¡ÕJ¸Àî¬&Q¯7ã##Ú€ þ)ß ý 1|ÂID•3ý!µòͧ>h¼&ßFêÝ›Æ6’ó5äAª,ºÎ8Ê ý=ä àKÉ$ú»Wšì¬˜ ø°!MôþAÉÔBå ”;Üß#OªãDÚÝGÿ(Õé Œßà&›1£ÁD ýÕCÌä»1É<õ,’þ8¸‘,ò4š(´¸ª5ÛÞ#»=—2×­*ÝDÆÜî7È$òB£)¼»&Ê ÊŒý Ä0ƒG(é ä¹Ð2’îœ>à'ÿBÝÂ$ç͘²§b°ëùÒ… ÿ ‡×£AÅÀ,ÿ'Éd˸–æ;…Þ7æKüL‡Nð8ÑÎô@á>’7·¥0Ý.ÝåÝ ÛHÇ 7ƒK½<À5±%Î0‡¾4×küè ˆÉ»½Á&(ðFÐ;>ô#<:Ácœÿч0Ôõ8Ó*ØÒ™"=・ ß¹<ú$ð1‚ ˆÄ7¡‘ KóÄj éÖ’Ã+·vŒ³ ÷Î8à"ìÇBÜ0øî‘ ºà ¾8ø‚#çÇ%”)ç7–À ÷Í« „æ#õTà ¶ ‘*ó­1êK¶1ß ]½)55ß(ÖœÐ#ÖÜ*ò@üï%«Cù“IÉL¼ ›H› “)o¢'‚ è=?5£‚®ƒ‹‚>äÖ#ô,ë žš¨7¢/Ÿœ›-ŒB› …зÕà=ïŸ †· 2“F3†š§ Ì î¹ëÆóƒ†·³FÇÈ‚ Fæ-sò² –I€!þ îž,ÿ …H7ì Œ:¿ à#0Ñ@£:Ùö«áÖʯ æ‚-ã3aÞ¿§ Ü4ÿÖ³ ðÇÔHð/¼5‘7úß*ïDÌC¨Ž%ã©;Dß94#¹ Hè‰7(øü ¼ßá ƒH‡„Š Ý„ Êà€‚Z²6’'&˜6h£ —"’#ç ·§Æ†?° êëN(Ӳ΃ òªž¿ ¿úá4ÐÍŽŸîŒ•¢‘¿‚ Õº.㺮æûŽ<Ùï5•¼Vñ¥ §‡¡í ùHÇÙ ý‘HšK’¾Œ¿§vh’¥´"…Fƒ% ÓV…²‚ް ¿°õ\êù)ò2»õ üdŠÞÜØê… †>ȦªÚº»¤È(¦†¥„!ñ¶D͉î0ä{3üIÿ2ǶKÚJ— Û7É×MÞG¸Hô)ãåÊ#¡4«GÏ ì ‘jHÊ ™2­9 …9Ö ßÛÓ– ° ‘ñ× ©Ï Ë-Þ ŠÓ-ú‰–$µ¡¯ ðXáA  ^Þ-§ÝU-1„ƒ—„îßbóÆB•Tu à8óI63ø¶©‰ÑAÕ)Æþ#û ¯1—(G¶þ¤  ÅŽî ô ´… €×¾ý!9¥9˜"œþ"#þIî€)° !€ î ”'¶ÿþžÌ¬Ø*Óœ0ã »˜7ý””;ç/–áDïAÝ׸3²¸5“Ø0‹"ú»1«;Æ úð.ž™#¹ ÿç9± ¬´ ¼#Ú&­ã ¹‡(œª ¥ÖöÊÿ;È ´=Í,Äš0Ï©ç*"úW¿Ž„ˆ@µ¦ ® ƒÉ;‹ Ä@ƒ<íý7· à*å´ ÇE,ûó! ¡ÿ3.µ$¦!Wùº%@¦ Ç3"û2,× æ¶ ­"ÿ8žC»#ò)¥ÊüBª¸ô²=Ë8ú:-z=ü-¼&³ ß>Î ¥=£ â¨@” ˆ‡ÿCËýøÃ©ÅžŽáÈ è¢!˜0ƒ –.²"×;±ÑKŒÆþIJ£ ” Ö×Ò<®%óÒ;ž§ ÕIÙ9–L¦C¡CØG†Gñ5•#Ô8þ5ßôÛ0°0Ô5Ê$È Î-] õ! ” ¦/æ ³À ¸@ë º!ø u85è,Ñ,ö Š(¸ 0 ¢ÖëÔäúÃ! ¡! Ù" ‚¢½0©´!¾ÇöÆ Áââå ʦ*˜­0,†?ΆºÆGû;¬ î{”@˜,è='ûcþ'Ç"”ꔎ2³(ÚÂ&ª&]•!â5ñ9¿<Ü8»¯¯¤*ã!±#ÌÍ ”µ ÀEŒ’ î4…DÌ“Kù7œ‘  ï3ÑAø4Ìä;>¯Ý…9 ”½ÑC¿C³û)˜®3—1µÈ™Ä+£5á 1”¸0¤ Ì5¯G‘ƒ ¿'…7¶€æ ’ ê,âdžì'4óÎ 2ü'¹³i)]$ƒBº°;ãíƒ;âïýw¦ˆ£u䛬Á³ßÿã3NÏ1¬Ñ½Ý ÏBöu€ 0H4”; $ ÿ/(·Äá „    ç     ± þ½8ç0Ó0٠м2Â(ò‚K7®ÕÄ Žåƒ1äÂ8žJë Œ›þû&Ü:ª*ÉÙ+É%ò ˆ=pË.¯)°·RBõ-ƒ ¶KŸ(¡ ¿+† HÄÍ.«1Ø ‹=—(ë Šô ¯$Kâ'»3ˆ3á‚¾í »¿Ú ¹#Öü-A).” ¢Ó »š"‘3„9Á Ä…Ðíå Cü¨Ã†š«FÃÐä(à Ź›úä(¦Å¬I°è þ£ðE×87øËË õ ¯Ø¡ÆØ×Þå¸,‘!ë©×Ž&ç ® ¶1¥áæÓ.³‡8Ñ•E±E\Ž‹¬F³­â ‘ØžËë´F¤&Î>°Ô1‡ ¥:‘-ß3ÅÜÂ:ÊÑ+­$ü(Ï®9éC¦6ÒË'½#’Ê ˜&ÎÈû’ò ¡–˜ Ü'í;˜C¼+×F5¬1îFÙ#ùÍÑMò"¯#—?¬7»82¤%Ã$À1Å@ÂGÁ |;® 6N¤+'-š­J¬?†€J§Gú?¾‰›î6º §9È›ž1÷/§"®Å#ã;T%‘„Ên"ªû3è±×)Œ¢ ¦å•' ³ò® ¯KŠ™ î ñ Ç$wéH(RDð!“ ©ä'!Ù¾"6¨‹!½‡?¯«"œÒ#œ÷<”Mô!©À í"ŸJÎ5‡ë=ðçGÚ›¢ý1ÜCãÛ•EÀï2½ð/š2Ã(Ý$é?– šÚž>Å7BÙší• ù Ê,–LÍ:È>”1˜H餗ÿC/¦5/7Žž«A­MVÕ”À™"˜FëÆ=Ë ‰†4¤ °~Ò¢«(Ÿ­'ðF"ÊÑË.wõöåâJõ'¹G†LÙ“à EØ½à ­˜  @¸…/È4àI©,U²óEÚ>)Ê üªû÷¼ Ωb®8µ”G‡*Ò¥×.µGÑ<©Ø&Ó‚*üM´”3î©$F©ÎŒEÇÛ;Ç=ˆ¾)øÎ á/¨&³Ë<Ð)›&ˆ=É&GÀÏ.¯0º9ñ ÝÚ‚5ƒýI¥.5ù±;Ì·‰–×ë Š‰ÀÅß¹6ê2'û)‚9¥5ú'ÒMÐ)á- ˆL™©’+¡ ä°·LþÈ#¼˜3Àh$ü›ñå ¾/ ÀÔ/²G*1@©¡"ï¡“Û<ï?Ûëúý1…7牿ÿG¹&ÀõH‚°1ô–8Ó$¼DâèB¹Fµ³*‹.üBÖ –+Ç/ä<ë"öþ °J˜'ÆH±DõHŸÕ ¿® ÐîGÜ­™IÏûõG:÷G‹ã ö5´éBž?Ë+¬ à ʯ3ع›¥Ì ¿å2É¥H´&â6«êÏKÛ7•ÅÐÏ'ˆ’"š¿-µG”£ È-ù ïHØ@à ô·É íÛ5‰&‹±&½$ÌLEó=†2ÊÔ@³%éÑ9é9é Û%è¥;É:…2­ãï-ýBÊ4ÃLìFù:ŠD›íÏ+¢;ªHÍÎ.‡Ò=ü*—‹ €ÞÙòø­#‰úžŸ.9œéÔMÕ(ñ€Ð°(´¾(ï¼ Á$ûKšÎÏ· Ô,3 ‘ÖÐFí á†å7ä†Ö ¡€¯¸ ûGâ%Ÿ8ç:fê 5ÏŸKª;†;»½@¼ä¾¤ì/žõKñ‹E†ÞÊË‘/·>õ Þ#æ ‡ ¼´šƒ •íë ¨Íƒ&‰,ºú ° ŒHa–Ú6£ ññÌB«¯Ù2Æ·†1¾øùŸÎD‰Cè.Š·½ µ¦#Ú5©C:†ñ°>„×B ròII ”õÁ9$—·º$¥ g”8W²¦›õ ®à&7† ­ý0‰½#¸‰K’3 ÷¯*œGœ¼ˆÚ8é‘þŸÝáÛÀ»H£'Àÿ §)¹m„‡±8¯¨³í3—(¬ 2ÜDí?¥=%ž0þÒ#¿ í)“+Ú´+ÿ ÇEØ%–*ŠÂ½ä(1¾ä#š³´ÿ/šŽó¢°3Å"À2þò ”2¹0»@’KÒþÔã?šÇ)´?ù úŽ´Ê'éÐ%ÌF¦;Ã;Ì;¿$ènŒÂL“$Ú–þH!‘CÎ ÊÂÍ ÷'©8Êi# ø*E{†ÑôNG¦ €ŸŠÄ‡8¹§®H˜)²Fá+º@”%½·0BQ¥#Àš Þ$ÊC³Ëû4»Ë÷(IÖ*…·#üMòDµ œ6û:û ƒù-‹£¢á À9Œ'ØüÛ4Æ4çœ&¢ô9¯#Œ+ØÏòüêâ*ÜÏÉ7õIæ ¥þ>‚/‰¥>Þ/ú&ˆ$î §ï‹ûúAá9é ÿ>é› ¹ÙƬL‰´3¨*Š<ï=)"­.…ã.ì±Cã>ï3™Mñæ*íøDÅ5†˜:ÞJŒ¡×1¨$öL¥à2[ãÀ©Lž!ð$‡•G3'¥Þ8´LÀLó†—wÐ,–‘É4¸“² –È$¨¹+¡=û2Ñ+³5ƒà Ú&ÇÁ¾Þ/ÕŸØ'$ë ÝþÆ%ÆŽ7ƒ²# ®Ø %†@öà#¸$ù0›… zÀ$·.‰<ò„‘-ý*ú!D,¶=Ÿ;’H$͆8Ò'@×7‡–!Ž»’=¥HÊM­.´÷#‡M¨ØCëCG£òª)÷*þ ý” Ký ©ò#•1¹$«õE…9˜)þ0µ®Hëãñ ŸÈI­!ø+©ƒ+®ÎP‚!†åD3Î&7îÕ2±¦ ™1¹…0 $!•Â]Ñ‹3š(Ä4¯/ûG‰0™2¯—1àJ†Dö‡5'E W (É;Ó+¢5F(2³=ØÑ Ñê3þ/Ôú-û4šÜ´$ö! Î%³µ0„6Ã!®2ß+§&À°6Ÿ#R ý+ä•2矚3ƒ1lj›.‚Ì Ã:ª9úLœ=ï3º0÷AŠë ¼ ê2³·$ãÓ&Ñ Á"Œ4ÒI\œäŒ‚ÑÜÒ< ùCè¬%ÒÐ8ù …¯+¯– ÊÞ9«"¨"‰P×Aâ ›µ(C›”FSç.Ó5ø)möM?1€¾)f%£ å‚Ï“Î:Eÿ9àñ À1Çʋ̯‹ €½0¢ åå+ÜÏH¼ñ ¿@Å<€Ž6¦9¸ÍLÖM«+± Ý° í Ñ#ù Ãí'‘†¢%ûÒž"T]Î ¥ê×½å•2yŒõ ÜìM#ñì%Ë"Ò%Ë#Öìl†0DÅö™>×Î'Ò6®(6òõEÕ'Õ!=§¦:¾7 Šª#’ëDÚ Ü@¶2†;¹Èùà -MÄ0÷TÇ4ª-¿ß5˜8¤6&ƒ='Äëœ ÃÀ ²Ãݾˆ˜šÓVþ«{ºÕµ¢Á&¹ª Ä‘ÐΦ¯öOÈöMÜ Üß™ ¶ •µJb šçöµ D£ÂÁ‘+ñ~ÙnÂÉ“ ãœÆ’WíܨÁ×¾åÂçâ® š ÛrÇ íÇÈÄ6áˆÁ…ÕF›ˆÖ®Àذ È´¹‰ï´ ØÌ…ÉéŽü ™ñºˆ"Þ°J(bŸ‰À>ð°Zê®Î+½Èf(¢, á>½$ ¾¶ µÍx›J1aHÍæ ½Bñìô¤ qˆÝ—+½7— • £“hô%³†³ X Ù"褮ÿå 炸 à¹Ð¯*¿ ߸ῊDvß;T¯“³d÷jª ¯*†. Ò⬊0 ­‘œá§ äø2!ߨ­‹,ÙÃð0 ¬ N‰XK'Á›×9ä]oô4•ʼ Cí  DB&YCOˆ % ,6 xXeÅâ¦Íâ'HWˆ C„ š»l#¿µµÃ¼³Ã¦Õ}ÅëuW h‚ÔkP€‘sÛ¥`Š„f‰„ˆj1 - ÷÷ AúD°mסbO)<~>ìØÿ „æŒÄŒ ƒñ .A È™      ·ÑÆ}…£ Æþ Ï© CRk~ ¦ V É ½H?s¢[Ø \“·›Ö-ÒHß%„â|È  u x .û#5b.9æ!‰xñ ž ‹#l©Æ ‹ {­åÉ ² æ ÜÒz3® Û:¨xLnù§(ë  £^G—‘›¯ Æ ¨3oû÷(   Ü—Ã]ë V/ N í ‚Á 2—C– Y!œ"Ü"é9$+é¼" q‘²’Hl§\ U      M™Û^ ®‹[[˜È úXª“òF¶6š‚ó#¢Ç¨ h* –‰ccü?Ë ó 푎­/Á' “ô »ŒvyºÉŠÄÖ•´G, Ë÷ ’½¶ ƒ4 -Ç þµ0† .@ò”Ôx‡ 8+  î—djƒ „ , 3     æ .!_)r ¬ Ж Û- Aš SÝo#Ö Ýlû˜ J7KE™ §Ð Y=  è/ˆ §gnÇ(0ó² .á½AoÙ܆þàåÒó£@çy ›Ýì#T « 8  g&¹ &°Ã .Š¡Ü)¤Ý Š“ è3¶Þ Rg®Ë ×‚Ú Ðå» nç‰êÇp.‡ºœ Ûô ¾ÒÍ@´M‡M¼5ª/(é<‘$“‚žDÁ¨¹‘¹ÃÇ ëÂ! &˜€ ࢯ;†0ã@Kµ·†*æ£ ®€¼Ð3ƒ(TÇþêÅ ÝõÊÅ¢ ¸„­ Š Ú™9Á !”®®Ý– •†ï¤éø ÃÆ4‘µ !Ã3 É~%g-é h%”{¿· Ô¨4€Œ±3¦%%í ut/é º›»Í  ” ( z m ¥q}D Š[”)#x¨;ïDÐ=§ Ï|/üÖ ‰¹1üà-þ ÿ?ÌEøFž"Û5¶0÷ôØ)ãsƒK¡Àò‡Œ—Ù,&žµ1©ŸˆÝéH­=‹CØIŒ Æ#—4Õ ½ÓÕEÓKÒ=çã¹Bð-Ò,µÕ ÚzŸ ê°œ9ƒ! ï§+ & ­"-”èG)&TÆ8$  ŒeÑ#É –+c)“°’).Gдž4‘ QªhÜ %BãµÍ­ ù!ø» ù9„$"§ %žù$›NQ )=Ê) ® 3ËAúƒ?š ¹8Åè÷@ç*Kç"¿Ç§F™8ý¦²Æ¾%ÝM’$‡Ü´!Ë Íï%ÿ#úP•›¥ ù&ÓÁ>—FÎÍDòB’¾ þ´º$Ìë.áÿ‡0ük„,êêÇ!ÝCK78^ü›02‹ÇJ0×¹)sœ _¼ Ï-‚¶+þÃÉ­†· Ó ½E’ë–ÕË0‰õ-œœDô° Ý 2ë¹¹ ½» ï¦:“®ŸKË;îDý?ÐL¬9ã‘Ò äKÓ9©$®4°˜ƒN»9±GÇCÚ0ø<ßè—±çLî%í õóÊÑ.Û¨ÕŠ½ £¡´› œCØú°¶ôÕêœàž³Ôä¶ €!™§·éŒÉ ³öîß“‡ÿ#¡Â‘¨$è4Q88,Óüá ÀÁ(Èšœ¨ãñ6¾½Îƒìpü–†­åިйûÙ#ª ¥"ÚI§žÙ “‹7¤JÓ&ø9»ÚCÂ.뫨*»’$한3æ#Üö3á¿-÷)Ñ þ Õ¢ ƒ oêGÑFä4¶‘@„™5‚N¾?»Ÿ*­ŠôK¬ÝK܈#Å:Ï<é2 Ò)ìÌ/ÔúÇH·,ºº£H ñ£.à©ÕÜ2âAò+‰7ô,· õýÙå ñy9Î×®%ÂF„TŽ<èJÉ Ô>Û˜,½ÙÇ”›Ù¼œõ5 Àñ+ —‡ùŸ(ÝØ!Í)Ð"¼K‘â—#’Û2Sݵ ¤ä/[ö"•¯*{Qª4ô é µ5¨¢í%º½JÕLhôL¡Ä>Ó,Ë5S錥²‹E.Í"”ÐÇÿ (ƒŽ3˜"‡ ¦Íƒ÷Üí ¡ÝÛáÿž ¯#Ì ÏåùŒÑ(ê ¯ã9É ª4‚òã*Ȫà 7¼';£ÕÙïDÛ ÜÊìÍ-Á‘Í´â F­(¿ “"³ŠÈK²(,nµ ›=òó,ÍÈèô é `š'[Ý$D~„Î#Ë“4‹œ$:Ó Ò#¯&‹ßø òïZº ¡\Ä)º¿¾Ë Z¤ô±Ë­/ÔúÛ* Uv²#ƒ§÷ü­É ú/´JUש ÕÑÔåë$‚µÞ ’ ý«ôÔÌô!€É¡2± ¸ —çÝïÛ(²Þ>þŸ#Õ =&*ê¦åÊñÉ«È Ã á‰ ¯ ùçF“'– ã)„Ì&¤!ÕG*ñ—Íçå™ç­V‹ª¢óùŸV}èð¹~ûÈ † £‰‘®Ê»Ìÿå½²µ˜Ø{‡Å Èö-à “ €’Ž ˜ÿߟ ÛTÖçä¦æÝ‰‰ …z¢fWÌ̵C—†°» eh¹žžï²›í‘ ™À A“P´Ò T}»Îþ²“á¯$a‹Ï’¾þ ˆ§ß ‘¼àã¨Ì¨“Їíbÿçj¨ ^„åšó‚–½£€ƒ±ù’b‚ âëæ±ø ùkm™‹¦Foʘ¨F力ݪTž½ˆéÝ£˜¡Q² ‘‹ï‡­q—˹Ý%ææð Î!¯Ú~µž„ÙytªówÊàùÕº3ÄÛ©,%ÎõBŸ$²HØ%à ®Eô #¼®î§šˆÛ·,‘êø™kKÝ Ž¶)×< ˜ÜÜéG—DàþÝ+±<¿Ü(±„÷"Ê(õÝ €/•Â"Ž#¿ óû މQ,‘¸<J »àºö ˆÕᤠØÂ…A„§!™Ü2[­Œ²¨Û¥ò ‘í‘ï;ùÆ íJÛš¦Ì>ùÂÎÄ ‡Ô-ñ‡‹‘­´&/á OŽÎäzƒ ™š Ö>ã÷Ó˜æ ò³ý=•‘%é3ü Ø“Få Öæ„VŽMº4ìH¾Fü·$¸E†F©Ë(¬o,,PÔº9ÖŽ?„ÄÕ?Þ:.o*W8o« óGá*3Y¥ì ð š(:”ÖË {¯A '%Ó¸¶B× þÖ_Ç? Ëò ö;ç1"ÔË @ÜÃÀ$È­·Ý ¸#Ù²óxææ†¦÷ã"Óé4³+ìòðÐ § çÔA.ž Ú µx’ U¾<ö9tŽËïßà:,bQØAþd¬-ë0ºH:âFè³(Ö/„+°$)ü4‹ á9Œ5 ³º§8‘€1™¦à ±ë/æ ¡Õù4«ø'ì’íðK™ã5î0âÈ”"ëŽ'‚´0ú+ ‹!*¿ð°.Ú± «  îú­ü°ë6½$ô#põ g*•3)ÉãùûР1\¨àƒ#ÎQν ¸¼+€"¯Ö2ò„I¢*×+PZ­ ¹(*ÜF±2À3s³CåI«'°Þ2±Ö6¾ ð0Å †©4Ù‰²éÕC#Î-­CËã¬-¸• ÉÏ— F˜n¸.’4¼êñÔ…Dæ/=µ Ïè¶ ‚&ò™(¡<³¾ÿ³þ#ú1÷ åØ ²Ï¾®&ª™'’· dº4Ú ê<¼9–&Çò*Hë •!¡&Ƥ †=ø$Âæ:ª@µ“ñì†ãâ’>ªŠ"Ñ·ŽÈ!>«×Æ;³-É+æ&üE– ê ý¬‚½8$‚;ö>ÏD–*ø/ž=¼H¾*—?Ÿ[ÜZï"ê7‹†:ž5°;"«ÃyøJä)à%­FŸ4Ý"›&4ë ‘2ÑD¯$£ ´÷ ù#×Ôê.Ã,ŠÞÏ/Ë/‹>§ì›%ÀÛÍ/Ñ4¯®³$ׯ#¨Ï8£¾í€Mç„–!×DØ Ó"ñµF´Â"Í2Ã4Ç"à ý‡!ÀJÞ/*á‘ñË¥ ,Ù š>Ù>ÙòÊ2Ø¡H ƒ1˜8ï’&²6Õòž+þ¼8¡-š&îÈ$×E§™E³â ™"Ñ/üÒú ÃL· Œ8 ¾’ž ¸Î¢-×!™ µ++û2ª³†#ÍJÍœÑ;Ž.Jõ3ô“?¿ “ ßÿ1þà­=ϸ Êņ ±š" MŸ”À ì8ûB™• ·$£)ðLDðÂêÕÇ ß ÒàæÐå³"Ïè ð )‰ÎÉÍ«Ÿä ñ)— ÍìÝ © ^Ð!!&)¶/˜ ¾(ŠÎ ýVè Ø<Ñ ˆ :… ’NûRˆŸ éËpã ¯-»)Ôð ðÀ…M©¨ & @ƒÒÈ,ƒª·Õ” ùºŒ„ ï›2èŒ Þ¶úò1Ò ZƒŠ¶*ªç@Ê8¶ ¬4|†JÜóËÿé ®¡²Œðí ¤,Å! åŠñ Á ‡ rÈ©-¦“ Í!&Ì$§ŽºÈ!ݺãÝÅá…Æ ºµ³®¬c$‹§€A¤+ÃÒ(åøJÉÏÔ5‚®!é7œþĵ •%ß$™òöê«EØ+í …ß»‚ê ½ ‚ù;Þ› ̵+®8ò:ö'Ö­2œ2Ð4¾:PÅ2õ9¨ | ×2«’4`7‡Iœ&Óë ,ø •Ÿ)É!RÜ–8¼JsÝß · Ë¿™— ¹<‰†ÑiÄý2Ž; (ÎëÞ-/‚1š%Éœà ÝÂ#ÞÖEý)éÄ,ÛÿD¶F¹š.ñõ0ß&Ö¬“‹(ï+ãù´ œãøÊ%œC…"‚,‹ÏÞ2w¸ %[å[Á+Ç`ïG° ú1]¸Ñ,«œÖ.ÕÿŠ—ƒ æ Ñ œ%ÿ#þHèH˜9„.Ê87ºú÷Ž4á'ƒ†‹ ,Ž)î/•»ØÕï/¬8‡ß0ì9ïE“ ¶¨¹5©Jþ ãí Ô"¯0” âBý1°º1ËÑ6ú/x … ¦Lä&©,â ß"õ ¡<áMŸ?Ä$‡÷<®¢L‡(´!”1@Eø ˆ$”ø$‹ à:¾ù#×;'¤%ÀÑIÒ%‚ Ä,ŸÒ)Ê „Õ4ôEêïÄlð^hçY´ôÿñÈß…³Èå¨$‡duø€tv}!¾§ÿ‹£‚‡ÔûÎÿ¬ Ê›°È=¤!©!Î%УîÒ$·É/üé¦'ÕD 7 ª#ðò¬»,Ý1Ò¦Œ:ǯT«Š4ã¡(ý'!÷(¡/Ë …>Ç¥.<É9µ6“ áÁ)ú#¤-§¤/ ö7í µî§õä¶9ݨ$ºI!¢ ¸ ž 5à ¢Þ«™++Sõ®&‘ÿñJëF¯.µDâJÝ&ƒ8Ò!Õ¤ó ê¿&̆&ÏJ•£—)ú)Á ›$ô…(.·=ÔI®*•£ÒGÓ ä=Ù5Èó%<ÓCø/ß Œ±GH¤¯ Ÿ7¥3è7À ™Ž›4´ þ*‰ó7†–ÌœÁä£þ*ñ¨A¹?“ˆÜ ˆ(˜ ë5æÏ-¾Ü”Iø.ô¿€-Á%ˆ˜“Ô Ž°ÒÇï3G€Ý … þ>¢I•3$t5q¼ ã¡3§+°Ë¦BËæ/Ø ß¡;Í'ˆ“Ъz¾ ›+¶¸‰ŠÆ!¨«3Æ/»ˆ(°% HÅEš!Ò ×ÊÌÑ‹*ý&ý±GÓKÆ Ê¿6ÛDßÎÍÉ‹v² ¤?¶LÔÿÇÄ ²þÍÏ;´Õ ë®?ˆûL”¨DÕ+ø úFȺ%¼òÓ øBÿ,ë¦Ä-á<Áð'ÝëÅ8ÒÓ>‘-X× Â ç0‰"û‡ ‹Nœ/ŸÅ ²lÕ4 Ú=Õ¿FTà(¡® îÒ Á±ìÆûø¾$¢á%À¬-´²9¸âà³9´AÎà&‹¼ €á:¥<Þò…#ˆÌÅ)· €÷ h)6§Iœá $Cù)Ÿ˜*ƒA”$Ç%•/©íDñ4¡ç<¨ª ÍèÐæ–1Ñ:°1‚+O‡G— ¦n! <þë<ýC´J€Ø <ê8ß–ÿÒFÁäGÍü7Ú/þ—3 5"«¤$¯yÃÅû ž ¿ ¯zì"ª§ íŽ Ñ D*ú²>¾ËÐ-ÈÜ­"Ã*Ô” 0¸LðuÚó HÑÛØ”#Ñ%§Â¢ ´A±Aå ð“1üD&KªJºÇ!ì ¤ ü”/jBœ¡%Ç@ùC¯ ë ž †2¸%ÅÁ–RÅ¥H¿Ôó%Þ ì#ý@ù‹ µÚ0“Ùß=Â=îùÖ*3ö ­+ž5ÿ å$‘(µ š)Ô&ÂÅì Ë'ã—)ÈÄ,ÃD”/¹¼¯#ÿ4¾í?¶ ÄIõÈ·D­ôGª:Ÿ,¯9û"¦=,Ü?Èó=µ.¸Iñ´ÇEð Ì ² ²ê‚¥å' ¤«þÿMý3÷æÑ8†¥ Ô!Š0’ª8š›ÊÞò ¼GÀEºÔÈ!‡¾¤!Ë)  å(Ë>Êå%Ž:“‹”£÷@¨‚:ƒ9°0­9ŠûA¸0òš°%”$Ô3ÚŠ¨'ä¤ ý Ãã á Î Õ÷,ÄÈ2¬¶F©ÿÈ€±%›ò<$±·+‘@æš©D@™%ïIÒ¡=Ô Tˆä›dž&×%ßEÉ ¼ôæ !óeÓE±2é…EÐDÇAàé“ȆLÕ Ê—ø"â-I‚4Ò*æ!â.ÌúF©GÝ5óò7¥Á,Ç“ ’%³¨/™Ž6Ú>Dã9°… °!ƒ ¤í4¯«;Ÿ+ÐÀé +þî.¾=¿Ê‚ ¶ Û çó§€©Ä â Ñý Gyñ”5mC Ÿ—œ a¤ W‚:Õãýý‚ ”=Þ ò‘1ᥤÖ/éI–Dû…”èäËÍ]ÄÕpò¨é.ž ÜÆ ìÉ€÷@Gþ—þ¾)±¢¶»™Ê Ç (™]ÂÕª‰|ÿÆà ËÌÔö ȵèÒ ­tÀÝ¥ ”ŽÈ7D·ÇáûœàÀß ³ ±Ðß2” â4› û±LÑFؘۛ ¤àZËEQ‚!´Å ˆ:—¯•ÃíTÉ$”½ù3¨ ĉ8d® æ$ Ê;Ä1Â%ìÒ%ñ!’ª$¬š3\¶”8Ñ9 8ÍEÔÌAŠúÖFæNÄ$ó š(Ú*Œù2D“>ö!ãL˜-ØùàLî*Ü ­‚ ‹Õ3Øá0 “á zž0ã:¸H¥ŽÔÖ)À— Óû&À:•â(ô*–EÇù&Α<þ¸+”Hµ¢À¾0Ú(Ý>ª9Ø8Ö:ÅÄ$±Ù3ñ(· ™¥*â2ö‹ž:ù§?³BØEò°BC—ë¿B‚3ˆEèÿ+…Ã:“ —Óô’ œôRå ¢Ê‘.¨ Ô £‚ Ëò ñ4ÅFæh7Ê=¶À2Z·J­ ˜ò»5Ô€:ê˜ J¶…ß<Ä(•®Š†á&ÙAì,þ5ŠõöMûÞ>Ÿ ¾$š ÕÕë#ãÍ‹ý:›(èKßÃÄŸ¶*ù87¤’ -8&£Ï ·"Ö!Œ!ÅÑ û¨È´-7ý õ .úþ8´´ $‰(:î–È" –0,ÊÅ6Ÿ¨¹Tö® ö*1ˆ/ñ€ 9XÕÍ®«;Ì Ô½ –Â%æ%¹–‹,輺Kæ.רì–:“BÙ0€¦EóKŸ3ëÿ;þ¸/¿K˜0› “Óº €ä ìðœ<½ À<þ§H(0Ì9Ø@ªM“ ‡H”9ËãŠNâGÉê-‚ û‰0†$ÊžÞ0™ìí>ÿ6Â5¬/ì7I½Û%€ å(å‡ ¸,߯ãÂï‡%œÚD¸&À¬1€5¾Ã0ÏÛ¨ æKð× )œ>U,1ÇŠx¦Š°ž˜„ÊÃq§’}À™¢ˆb™t擊¢DFûw€qVŒ€ª¡¨Ÿ§–Ä·*™ÄŽcýŒw§V}Ô•`¹~\ŸÒ¨ô±ª£ˆýŠozšj‰j®N¢€br“ìát¼Š¯MI{¼ˆ©œšvH)‰I®H’“­¦ùÔž—ÊmŠy޵_j hñ¼†_¾d‡~Gž•=‘:C|’@nSõ„{‡P«¦š‰†È*¤¯ŒþuH—i¿º£ÚÊ—–Ž¢­ã¨î—“…›Ê®¥þ‡ƒ§[&£žï—¨¸…ÇmÖ㜒¨©¼‚ë­t‹uiZëÅ• °¥D–´˜Ú˜)†ˆÔåõž°º¹¸‘T^x„œFbY©Opq=CÙ¿\xç¤ñò…•›ÂÖ·°©‰‰–h@bq”zy©fX’´(¦˜pŠt¢¸qppQF‹±Û†Rc™µ•B‰ÃVw‹ Tç“R§t®ñehRC®užoÈg}÷û³Y¤Jç‘­)ò©ÃKGIKÀIMÞ¦ïÛ‹˜ Œ½\¯­Òü<‹’ÅìÖlÛærŽÆÎœC¼‡®›¦š)N†»r§ié÷ôDtPwms©´¤¦ˆT}»Tú¡çŒœ{‹ì‚ïu&ŠÅrJLy耡Bÿ¹…ÙYgˆ^Š´ì‡œøAa–µ«•Ãö¸•LX>}ªUó¹†xí¸pN&–bÕö™¼Ü~—HÓÃŒ±­Ã—}k¥‘‡‚¨šœˆ_>Îoo:üCŒx©‡“Èu‘rÊ’Q¢ýGºob(Ù…qvrD¨Ÿ¢Ž¶L©Ì¦àajs’Œ¢ÂúöÃ^Û™éͯšeš¾—“µ¡°ÿ‡‚‰µ„tQð‰©)núu`c²ŽH¢r¯C±\—i?;­ñg—gƒŸ‚vÀr·A—ûbQ@õˆòwlêp™Ý­&¡ÛË»R˜¢uH“£yf‰Rv™µ…íê–kmcq\é‹^ÄÅ¥x™¼¶k¥”n“Š©ƒ|º#¬OMC¡`Ei†¥l}PbqÂfj…lQYY7gJÌu°ì©ce;BMžçˆYBµ®Ø´`EbÅ=¼¤cPØ—F…EuB™Ç>PJ{‚PÆ)[W~t™ZbhY¦IU•Ýš[‚‰¨…‰Œ]{…ªTžˆoÆeçx‘`w?±–öFîJÃü¢€g}ZÜ–ºÕs™'>FSBàØ˜ÉªÐŠ]s®Q“ò»Ñž’¨‹Ž¡Šì²™zù?k€ío’·¾[€ß[=zk¢ô1³nŠ›vi®„»Ý¤‹ú–†cçÖyœlf¸¼nܳ[žópxŸË}¼”ÆûÄ™à¼CCO,“DóŽñË™Üý=NvJv¨¤”ñV±S¬Ô‹ÌysóþÔl«±©épXyˆŒ‰ŸàKæE„ƒÞq@?CF&ŠPýQ›“¦á‘<A;Hæ×‹Çç”NB©t¤™í§¯Æ½¢Ç†© çˆ²È˜.Ö£óÀJ¨¹BDO¢ãADKQˆÁ€¡ÝK²„ÿ¬ûàrCG‡˜Dª®ä@JžHÐ…D"O•D¸™§{DysT~Ür›~‚¢«¢Co@Qq¤¹šbwœytilÖtwwŠtVt¢»l€GÿåC«?Q@Iµc„‚=â:“ ½ŠLP ß1ê ª,‰ªJȃ)¶ ËFŠ3„<ÜKÒ‡Ê £*æ×G­ðöùÃ¬Ó ‡ ”â<Ü ›'Á;š<Ù §/‡$ȪRØ÷ 2€Ä7 M¹ –3‘ILØ8—°4óÐ(‡ÿ%ºº%Ëë3È#†,× é ­Ú¦>ÔBæ)Õ8Ü ©$ÂÚÌHÏGŒôTñ Å œ#­âG‰Òk¹ÊÐ"^‹2º4×çBô¾”<œç½oµ1ï±HÚ;¯ ë–"×Hýò£!¸:‰ Ÿ)‰ÿù cɰ+ÇÔ5º(ðá2¡Ø àBÃ)ûDÌ Ê›JïMÔÆÊ+ÉA'm)ÔÓ5ðL¼ö<‰Ï%¸ã2ÜE©D÷‡.†ó1‹6—Ä Ý›â„¶ 3ñ©Ú ?£î+œ­.Ÿöýã8À<‡CT¸(õ ‘é›"Àæ £´‰¾0Å( Q$…¯qô¯ÇÀÎ^‡ïã › Û3è‹‘â+øÊ‚Ý1±Ò)²3*ª?3è¥ö.› ˜F†¡*Á.Ëøº/ÙDð$ÀÔ­}þD •ËCÁJ÷-„ áAž&Ä Âþ êÎ#ðGÊ-§ÍM³I´ ñ¸õÑ$âÔ4Ž-¦”)¶Áµ äxŒÍšË Î(‡ ç Ì ¬(»·Ž;…°'à>—ø«("yïÃü÷â*÷ ­5«àf‰´ ™*‹96ö¤À ¤Á.á(ò(7#×î©*­8ú Ôÿ(EÖ65Ë-Ÿ¦Ç<ÛÕé£,ò˜ ·ê›3•1Ṃ(q˜Ã4¼K¼FßHÊDŸEÍé<ƒéF}Æ °=ò/˜í/ݸ8ÿÃ6ñ ù“ï/ò"ãDò=êË™H–z°J×I¶ Ñ=Þ$ÄEÂK ê)ƒ8êJê.›(í&ÛÖ3J¹A’H†Ã.— ü#ü-×(P˜ã ´ÐÂ,º‡"š¸‚¡G Vã ©Äé>ð“ÏÒ(ë±M Ï É8ï úøÈÞœC°9ÙÛ"ß–)˜øˆá3— ê°-—5.,+D?:‘Ÿü­½CÄØÈ ñ ÔWØ5L„8-ø.¸¬"°]¶ 11Û4÷-1íBJ¤ üF'âH=Ý6õÂ* ¤/Ì$®’î-z%›&Õ÷2 î‘ $ ¦<ªÃÃJÉ ­ ÈVÕÊèô3î ;´·§Ÿ*’¼‚"Âéå2£­ –=÷+¨Üž†D$  ¬0¦¡6† ’0ç%ù´ŸÛ ",11Ù¨¶DÐ3Ðø‚D —I—” š¹+‚¸ª ÓË"¿éÿBé á œ#탲Bþ9£ W;Xâ3½A¾Iö*Øâ „ ”9£ Á¾*ÒIØÙÓ9”pêÚ"± ¼!²'ýƒC\—A¼ ßHŽJðø Î<ï+;Ê” .î<¼6õ?'› á8œ Ûz·É­ Àø"5•CÃ5¤à­¬ ,‚â ྠ’ß¡ ø ¨8Ë”ú€@¿.‡>Þ ÙD” ä&À÷« =“(®è-Qˆ>ç7¥é3kÑ  µ‘„r´IÚ>´ß ½ž-=ù,ä ­0Íñ+¸0*¨Ž ×Ò©,ÐÍ.ÿ ¾)À¥ê3+9Æ•-–”ˆ‘ ç*£ÈPíMÔ>˜ Ÿ"Ü €? C± ¡ ߣö/Çý¶%¬á±$ì>&îò¥†Òø ¤8˜.ˆÀ ùýõ'î"Ñã"È\“ Þ/Ä3ß„÷ñì%2Ã×Í)”AÂ3ðÐ'Ê&² œô?Ü•øÙ ³#Ÿ!™”¹?Á&ü0Æ™—ò08“ ” ¯@«;ÏKï±,³÷´8+íD“4Ç4Ú ˜ š3§Ì ‚œ'ñ„ãñß+¤<˜Ÿ#Ú'ôH«F¹éìÐ%…9s­ ªÅ,ò!ÆçZ¶ïÑ#JÎÑ‘ÓÁGèšã×MÊ+ö-®Ÿ€@ñû øÕø† Æå**1@`É¡&ëû-äÉ Ô ‰&þ'¦@ê$ó®2 ¡ Êæµ5‹s+›ç ø¸&Ü$àÖ’ªï9*™ã Âý2¸ã„Fóµ?(æ!¢üÈ(«¼4¿ ;Ž1–,³Œ ÑòàM˜Ï Žž‹”\…%Ÿñ ¢ª Üœ)¿ 7ü”50f Ý—ü%¦ >¼>7´»Xä º¦,±>Ö:uþ'©Ká#†&Ε\ö,?'ìÒ”<„1ŽCÒ œö À#ÉG¾I¶´6î9éà -…¬³¯ ‡I£Ô Ž2·J³E´¥8¹1¹ª-ží3Õ§*³MÁ@¡€5Ø á*–=û'”0É8Ä2é<ë&Âî ù) ¡Ü?¢0×BDü:YÕÅ Rà9ÊûœÛ2ÖìCјF72ú ɸñâ€'0¹Ž@Ï"Á%%[ï"«ä ²èðîÆ'ؾø-†Âç £‹Ï/‰ž)¤ö ÙC"¯ö3’à Ä0ɇ¼A°´2¦Í@ò9²0ò,Á)­ìæ:®-¶D4×ýŃÓ0Ÿ*Ï.«èCéDÎ9uš?¾µ…JíL×M ¡â œ)à c_F Ã'Àš/ 7œ û¶: Ä3”EÆ!á5üÂ2ƒî³ |gè¡Ýà ’ ´ /û ½ À þþó›îÒËñ’Y™™_ 2¤ •ÿ”Ë¢Á ò¾$|æ Ø Pyï ŽÇ £ à õë æ¤Æú ¹¤HÁAÍåÀ"㙩%ˆ$”ð¯'Ãä<ÞFæ Ù:ø‘ ˆD [íØÄ¿ Þ4¶× ¥® à;-O6‡ýÃÚÎü ØùØ † ª ÛùÑ–î]Ò$_ó â%Û± ™ÆË,Ê,»)X (ðË d„á ÚË I„ sò ”à ”Ô ìIˆ˜,€82¬Äòþ@„(ª“ÿ!.ÐÅÄõ £$ ˆ>†CR¡ÙÕ7”'4€ÐDðõ'²$è“J¯Cò/”)ò=ƒ ®Ž ÷Ä ‘x£¹*¥jพ òã¿ÁоÎ.…Ïé¥ à ·ú ¨ §¡ ×CþŠÜ ¡èÀ…†®« ©À픘„,šƒ=õæØë•ê ž Žÿ–‚¾· ÆÕÅÿ%Jo¯ ¨½Š ÅÁ Þ%Œ"Ó¸ÈÚÀFӀ𰠽ÆnÍÞã×÷ ­„Ѝ^1‚ Ë ‹¾Ü¥”ÚÁ5šã/©<¬¸E•Œ ï"âÊ”ù Ð çIÒÕŒNåŸ9&‰ÀÇ­¨*¬Ò°aå,Û‹ Õ‘!Oy•W×Ñ9¯£E!¬Å0’>–£œ.ó›€ÓA¾ÃJ§Ç¸K®% Å+ ñ ¿ 5±µ42º/óEÁ 7÷«J±G­C(‹œ°1ˆKç?¡ Å#3­E™J:ù'«ÔÃ#åE¸‘IÜ ØßÃ+©A½ ë1™Š(•û,™Ëž•Cš$Ù3°Î2ç ß2ô9‡ ¢ê ¦ÿ›`ך2££Ã¨5‹ Æ ËBöD¿8Ê Ï³¶¼(œ#’±¹À‚˜ Œÿ± ò1‰!Ü#Å É ÚºÝ°A­ª-½ šÓ ²T‡þœ´'½#›à ›Ä2ø¶EɪLÓîÓ+‹›äI§¥2ùòú¶Ð˜í2ì©Ð“Ì Ô™É$ß ±C€Á1á#çžÿ À$†ˆÈ –°æŽ€©øƒ t©‘!­'³  ¹,—>7ù2cyÊ#¾&) Á/â/·ƒ­Ý…ªß"˜¢¨<ôDßI÷.rî”8Á ‘”É Â& ? -ÞD<–$  `e¡ãŽHªñæ° ×÷µíÙ˜é ø[",Ž•JïBW :]ê <&F7'« ý ØæjýØ4égH}äˆM µ3ZiA˜ [±»‘œEš gŽ o›Êì»´Sl{wÌh Ï•]9T…­£ /á¯_–±sB‘¾†–¦„(®‡B¢¶ À›5+V¯ê¾.ˆq(WàËoù^%…ĈŠKÏž!Wœ˜ ˆ:˜ùÈ*+À±…‘8ï^ªiƒ0â%˪÷¼ñ;¯—½î#„ ÂÕ#–¤@nJ†÷ (À÷ · .ÿA÷Ú€Î+,´Âhfƒ|ºªY ;¥6”cÙ-^T‚Ó N)„k&Œ‚´h¦3 ½Y–“ä„8KH£ Q¡a #Yy8mÔ,šš щlͦУ  ;TTÔUÏ“3+`†æ=Pß1t¸ ~’@ƒf,4 ‡FÌ´>ا¿nHÏ#1cŽ >·#É•ªèuí×YAÇi˜Y§éÚNI1¢°‘ „˜à ’Nl ü*Ëï† fí×1}% €'hÆê…ºV ÞòåŒ –NÏ)÷”2vöÒ¶½‹“„ ‰\"ÿ ­KRFƒàó7™/‹Æ‡Ó|ìAÀ!…?ÐÁ–í,€>á¡m]c*w…OI@a %_=UóßnÎ &L#…á!}d…DA…È2v”#¢¡T“ŒÂ¹ ]ˆŽQw“Ô¡:jhì†ÇœíŒ)]†-‡†Wéb©—/¿ž­î Ž lXVr‰•å KL çÙ Ô"ü(VÁß ;¦+ü?x8-ÈÖË—µ›24Fà󟛪VŒ ñ „…òQ4_.Çèáß쓊ÿ€¿=R šhU  ø¶§O U4ËÎá Ë)T¿G‘\CÄ‘Å5ða–(²¦ XÂÞ,»ÊÁà“äêÇ"œ"—Æ©F4™J¶ .Au1¢ c*‰xa,™ƒ‰°Æ]0d÷S .AóS˸'$Á ìH¼¨ $s†Ž6Vuú-vÁ{uÄB ËIÁùÃãþm Ý]Î¥˜š ©]>[Zh+‡¥­> :ëX— p°F©öÞ Å;ÙŽeweµ–å2ùpÜ &Ä 8^W»~k ³§ï1QÔ¢TèFù“µS„ÄÎf²[3H “)È<ˆ”˜¦0i0&fÆ>µo²é”‘‘ 4 c˜I;mž#Ϊ)rÌx/[÷ÁJxï…*• ²#Šá`*û¸Úèasc™™²‡Õ(ªqãŠÆDΚou‰ " &:  RîBwÆ™¯@à?ž5&å eet|D )'†XÃ~Àd¾å¶ ÀWˆbMÚî„®Ô%%m®ôîïED-!´‘ÞÆ¬ÿ’J`tl·|¡ÀÃB%—x&3Óos" _›€$V…•$4D­­ Ÿã{£„3›AÈ”$? š^ NC¿¡Ò.¬!ü’æ5±'•/”}.`'ŠÏMŸt 4î@Ú#).½ é«xÕñ„Ò™ÌXji P§4²ˆ%$ãÔ$Ëy•#uÐh'Žm¶$è÷f ¢·˜ rÆ ±ËpÄÙ_õœôš» “É£Ï„7š… mÃö)o’ܾ&8ö3ŽÝ æÕ/§¢ä:Ì#Öë?倎à4Ì;LæÈ€¤3Š-Lʃ‚çÔ ÏÀ ã5O tÏ?ã 7*OÅ)è)ט3ì‚EíØ˜&êø54üʲ€«1ÓÊ•Ô ¸3õ7!õÐÁÌ·ŸìÊ”0ThȽ‹À «ú†A©é««Nã ^ïË[ 2ÔT—ˆI” =;KA$Ò¶0‘ÿ,Pµ•äË)Ÿ"83k’—ðø?óuâû,!›À#Û×­ øë üGÛ+ƒÌ/¦í –!§È¯ ½-ê gãä¼6 ê–Çläû ï ‡æÒ7ðIì$–&ó7ºBÁ:”1‚‚#­C£&¤'1,´ú‰ ð ŸæâeŠFã¶š<ᜭŒéC¤€2™A‰Ní´¼àEé-Àé¢ ÙÁJÇÍ3ÃÊçÊ ûL£õ±<»Ü° Ø&ø$¤GÔ °$kî%–„ ËÜö<À+Í$ìÎ'¨9”4ð­G•'õ$Â0A¸¯ ç§@Ĉ‚"­À÷Œ«5îDà Ζ+Á °Ó•ìž9ê àGþ$Ù¨ÛM€.ÊëIóœ9µÐ3£éIàê¥ ù9ÁK.Ð%ÞHÚK‹ëCÿ¢>¢$æH8¡[’¡'¶§9ñ.—Ÿí+,3·5¬ #Ëàñ ¤®Ñ@º“±ŒÔî vÔ›Ûñ 1¦§µÂË “.ú‘½¿ï…½ ®šþa÷ ßFÚ¿!œ!Ú º-ó®„óˆ –  ÆÉ÷”’µh‡'´‡ß‰“#ø%—Õé» þœ ÌÚ…ó =tÎ …º §ÚrÓæÝ"‡†q÷ M¯(ï<êôš2©!±ï?– ‘!ÓÐE¥é,»1WÃ%þ! ·ê á8ì »8½2í+ –)Œ ¦EÙ ï¥Ü¿¯6àGŒ˜.¿EŒ óœ8³ºõ´ ©8Ö¬€8Á*Í.Aá?Eš 1 ÝC‹@.Á0…ý [Ö0¬œMü ø )ŸÖÙÉ-—ΠΑÛ5—Å Ë;ý#±…HÃ)›è+ˆ¤Ëíòð³F©Hè.Ø-Î2É$Þ#šZÄ3·?¦!å Š˜‡ªÏýÑ‹œ¡œT2ß» b–ºÐ « e®ë¦³{“™§BÁˆ¯õ¯Sœ˜ Î8‚“߀ ½ôåEdù”ó°Ã8-ÕqÌ (l¼Ï ”þèâ‚Òõ¶ˆ_œ“º¹[­â §©#¥—"R¦¡¹‘ˆ†˜+Á†´Fž^Ú G4á®Êf‘ ‘È%ì%Ѐ¼ÙòRˆ$‰º§=N€MÛ–½£ B˜‘¬–¤~3    —;¼L[>ˆ—•—µ½Ñ„~Yóˆ­ …‹ôh #Âa4   Œ*Z3®Z• s; \6 ²Sá* ±û§+3œ9Ë ž Ø=u‰»ð ‘Æ?‰† §    Ã!z:uNøœIëꢂaaå)èà”€ Œ‚ôC†›a^'@¡ õí ¸¡¡­  –ŒY³?‚šEHí¸Æ®ûÏð §_GÍ=dõ2g— ´ÙÑ “Åå·).  áò­ ÎÝùûrÏd—󡸎V¨³Ì”'sÆ$7/‰Çû+ëŸçò}ÍœcI¦‚‚»@¾Ã·:àñ#šqЯ öU~ì˜'  Üf1›ÛÝæ©¼ä'-Ü Ü½@,CÚ>çýù´³@*š±^ øwšû¿§§—Î:{0zé²3† j Ñgòš‰Øèÿ ³Õ1UºW°hQó%%g°àyíbÿ&í¥Î•š S'ŒiçESBîFÜ k„´/ ‘ Ìþ1ùµ–ÒÝ"IŒ€ßßRéPLÇ Æóq‹Ô‡ÝŽèå…ªI òd/‡/Ô úú ÐÛ¹ð’Ðÿêb)¬˜’´è¥Dv'0 › ’Χ1|U±œ'õ*Ž|µÔ ›7Íçº-)»<…%Qâ3•¡ÏÞŸŸš 1   g ÖI@Žë Ø£ ‘YÎôàÏ ¦  Ô©¡ _ƒå± ¶-J…š(×.ÝÓL· °K˜"´)ªÃ¾$ù5É7´=ø¶˜›Ç\æ™õ3 1’9ÆA¶E–±8ð4ì1Å(÷/”7õ4â[À,Ûæ0±„ÙÂý&¯9… ì(*ù  ‚ ƒ-õ=ÙÏþ駨ö$‡>Tà4ÃÀ" ¸… ú£ï1ˆO±í—Ÿ7–Jº-Ù³ Ô ´BæüèB¦>Oƒ œä&ª1ü7ÿGê/»F®'”‡ à*5÷Š&‚)ýÏ8¾‚?éÇâí?öô8ª*‹–/çCÄÂ@#ô ɹKC³Ž«æÍ@Á4þÑóÈF‹™ “4ø;ˆÐ³(‰—D@­mOlŽ"÷cøG¦ Š0Œ¼ß¹$¦Š=’Ë9¬¥ ·íž9~âääÇGÎ æ ¥4Ø­ øŸ†µ ª'‰®Š/§Ý%ö ¶ §(Çfcô¦¥‰Ú˜Ú$ô Ž·£ðŸª<åê@ñì §ñßÙ ’#³‘%³ ÆÞ ½›-Qá›"ÚÁç륭ÃéH†)æã‡ ê2ᨙ¤$ª(Ѧ1•¶ ø »z¶ • øÝ½óð0F+JYë,ë 1/¦‚d©¤Eƒ+ å{ˆçíË˜Ö ¨·!¡)ž % ¥}(SÏó¿Zá­ñ¡ ‚&K×1îÏÑ ¼èÙÖþ2E·E½ úõ<ꜭâ¶Á+°Ôœ‰¢2ÝÛ!èÈÓâÔ¬¶þìÑ­H\æœ üÇ ›×›Ä ±Æ †!ºBì¨-Ó,À ð‚ ð,CÀBI´²ôºÜîè ‡•°#¦5‘ – ¨ ƒ Èø»G±8^È;€Ú Ó5KÅ6¸ ÷J¿·#Ö¬;„IωB¿%Ëü#N–ÄäÂL„ ©ÛèCŠÃ½¤à A– ®+â))I]Ä$• Þ¡9^®JÓA2-’ú¦ ‚=( ¦1‡20µˆD^_3Žó‰2Š æ6ßÛ “C*9=+">*”6ãbE‡'»Jµá2æ5#fv …rÁ†M’¨ô)'èºú ˜ãÑ× Ú…¦ˆy¡ Í7 "ɉ•ö5Œ-¶ñM® …?±,_ë ”?ÞÇ:Ó Ÿé<¹¡$¹0¾(Íð™ëKÀ:Þ€!±á ù¿#úß Ç$¤öÍ«  öã&Ö‘"Ù"÷í ‹â̵  )…Æî ôÅ Ð ’¶‚¤úœ Ö ÈŒ°ê–u”™4Ûb²—íÇ–!—€Eä ìЊ2ê´ Ï@ø3‘@ Ê«°˜=œ&È4ð?Ê>þ?éÎò‰ ÔkÐiÊŽ!ÌG× ;ŒÏ ¨§3úæ‚&Ðü™”œç ¤ ì µ÷½• ì׋¼ê1ÄÂ6ö$òâã'ãì'¶‡›Šµ‹ø2í#ð1½ Û Â1æ üø3ôMŽ'ñJJþ Œ>¦#îæ»†$Kƒ6kÚ= ºÔˆ"±‚þIäæ„• ¦Ì–† Ö è¤Ÿ› &ÁØ/ô ÊI¨IÀ'ÀÇÎ8ÿÞÅ–Iµè6¯Ñ¥ ® º’/DÃߘ ¤5û;0ó ˜!Ť“ÊêÖÆF«8² Óª.–3ï‘ôø+ /È”/‰²KÓÙû#ÿ4€ ©JèêË¢-þ›¨¤cØäÃ!è#í-±&ü„ÐÍ’1Æ5…8¹> 3«B¬ èªÇø(Ÿ1›¢êE™¿4´ÔÒ)Ö°È2¬¤œ™4©Â3¾ ÁîK„NÅDï4à%ö¸.Á;Ú – ž ¬)6è(Ъ9`¥RÞ¼ýœ®Òá*•…îÙH¦ ¦òÈ µ>¬§¯!•æ"ÝÇ ‹ëá/þ±Ø€ýœâ?4ó:¦1²†#[›$ F¿ >,Œwî ®¢A»Ø ¿‘œ©›B’Êß(a‡ÛŒ2ºJø¼ ÈîiÂI£F¶ó ï%‘’å @Ï.¿º>î“ ˜%Ø,… ñ ÍÈ…›B;† Ä,˜ (Ã3ƒÆ2÷¼:™­7!ªJù.üÊ ”–!÷'ü E .æxf 4¤#ìÀ©Ç“‚ ݃Âù!Åðj—Œˆÿ€“ëŒÔ¢Ìge%›”}°Áý¼þÄŸñÀÓ ÄÛù}áé1bc–=d¢@×?CÜ,–Þ9Ó=„,¥ê0¥— –à Ì8˜ ç%öï“ ² ¶méc u ¤ è\ ÿ"¤ªáë÷¤®Êá0Ňd(•Èö ¡Ž òà ù FÅ„tç ;¯‡6Âî”1^NÀÉ'¡Î #Ü!D€Ñ/„ðSBè Ïë «o£ ¡Ä´4;:¦E·ç¹ù–Ñã1Uí«,:L2+ýJ–ˆÞÌÙ?Í €¹€ ÒµÓ‘œ-Ù0Ð%Ó#³C¥2ç&á߈š>ç#ÿ/° ï¢$¤@¹T· µì °3á‘߇> ‡C½JŠ‚èH½ž*­¨5È9Ù2µJüI— È“;·‰Ü–MÛ;í¯Ûe5ûÆü ³a3·ßKáÉ‘.žÄ^¼×k¤ª ]•Žð±…)|xFG y ànÝ"ìG ¶  ¬Ô¢È¶£õR‡òGÊ ÿ çÙ5²‘æ%ÅKÝM¦…áÑ1 ñAÉ3ÁÄD­=™Æ5Ë1çî9· ™;¢á¶L‰‹û/Àÿ(Ø#Â#Á5Ã9ç ¬?ù‚E¸JÔÅ=ýEâŽJ°2ªî¿3Ú8éJÝD‚ó3ŠŸ$ÄB«Lf²Á³ Œø8ÓFM€GÜB¥\Õðäà-Û:Ä:gäI3娸hƒ ¦Œ@Ó Ì$6´Û-éß=»’#øÞ1Êù œáÉ ú ·Mv² 2O£/ ‰)ï4`Ò¾,5ÿÚ:¯Á9 FÑΗ Ô› ‹À8°€æÉó –&3 +(#åå #!†9´Àèï¢+ܦÜîê™'5‘Šú,ã~‚Ø* ú—2é†6¯G; ¬<÷ Í è Â/ÝÄü±8¹ëÖÄ;„×ñ3÷0¿û,Š3#ç Ž—FõDÝ$”ð ¿(´8T«û øú®A³¢%›§ ª&î ‡¿œFÑá ÿ ’®ò—%Å,¹ § ¼ ¢¸A²¥ÈÖ s!Ç0À %ž. êæ 3zHD Ôå/3ï Y’à*¨ ˹îÃ)¬¾˜®Ê@ôE‰ ÒÕ㠮%áIû.߇ªGöF¸¡ ð;D À$£$ »cöŸè­˜(€KNO·Áü!«1ñÑüζü!<¦Ø Ã-㤠‘ô8¢èÛ ¯‹!L’CPÎÕ@´,GÓMÙ¥/ ¯6Ñ*—Ò3Ô0b&¼‘ì2™17ªèiô4þ è CA@‘ µôÚ.Tí#õ(þñ¶Ñ)é×Cæ²ë ‡,¤¯ÉúôÞ)Ò…ç×þÜQ² ×9‚Œ½•wœú–„ ü 3 Ñ€µ(» —ž–¢½W°È ò&„ƒ®Òð ¡V×àŽÉÍæ÷Ö˜’Öó ³Äg†‡9LÙ”¯É œ0·×ŒÖª©&ÌÛ¹ ¶#-ðŒ© øQZ‚‡ @<%½ëñ™fÝâ ™.à ƒ Ý ½÷ uÆ â©ø¡´ÿ´æƒŽê ¯µŽ›´ä´!²¦ í‹ ¤‹‰Nåæ)R>¦¬ÍÇÕ[4 ,&Rÿþ× å3Fþ‡3F=é ±)ð“› ì W™v«¤¼ ."ëž ¡–½dÙ˯#ðÌ–ê!¼(«‘ëáÎûü Ä'”Úç¶÷‘´Èï÷»%'ïáë ß¿Oé‚ñUù4§æ.Ú€® c=*{FÞ¢-­ŒO ªÌ‡ uÄ ø#œø²L³J¶U•@Å0Å ™ (’ɨü¶ë ýQyþ””ðÆí×'¥Ià Á!ú ·/Œ¦>ÒH»EjèLêˆ@ïØ ÏIî–Ý ò.kÑÜÍ?¶”0Ïð¥1H–"ß2¶¨'ÀÝ-À± öý<ü9óÐ ÚKçD“-ì–=«EýGåC%ÊA ßFæ ˜8gú#•ó@è ÊÉ=o²âÆ( ‚€±=–‘@è0§#ã)ö8‡'ó ª Ñ‰)ÊåáØ¦É*ÔÊÒ­ÄÁŒ6ýñMò…ë=õH§-±7ˆÞ' Ð"À™?óKê5œ¡L%“Eð+—-Í>˜ Ï>ܨ×4Ûˆ¾¼É3urÛñ¡ BüƒŠ\ùüŸžðϲ½‹ÃŽò8µÃÙl¨ªÔa."Ô½d/nÿ"ª Wºˆ³ô“•ëjôœƒâ•ŸÈ¾ôÚľl¨ŸZ 2% t; 0¼‘ø’— IÕ¯ó 5i—Ñ gh§¤’žÌäK¸Mý¦"ŽÖ%3Y["ý‚'_å²¾Ær…£ ù %Çâ л ôßF“ذdÕÐ #óÁ¢¡¨½—@’çü1Ã#!»³„xχ •Oþ)î–Î 1e&ûýË $ŒNËÒ›Ú›öA…/‘H„)UÐ ¨â'¨¿žH FöŽÂÔF²GÍÎÐ@³ ›ž ÍXcŠêÔh̘ ˆ ´r£·°Ô¾JÚ4d ×â¼}—ùŠä9œè‰ !µÕÙ­Ûƒ˜)Œ™ æ‚~ŠÄ†¨åÀ…~¼/³GaüäŽÚò¡‚¯¦ ÂêˆÎº 3žÌŒ¶ª´‰ §¶ZðÆØ÷I² ”­Î«ä´ä m¬ñ' Ÿ—¿í‡ë”§`ŵ •“ ùãõ“gà¬Þä@â Ø%¤ '6'¢"‚Ð³× s±»1‹æªÿ¤…œûã«jyr ͸Z‹ÛYű.)UáSu !¦ï‡( ^Á …ƒÓcµØ =EÁ®Íû ®W°«™Bæ¦úÆ‚‘” áŸ÷ûثܲ Â!á´“yŽ Ë ‘ÐÁ‰Ó ê pÜK€ÍJV…І ú± ª µå‹"¿‡ îÅÞZdùb¨±ß•Æ ßñž#+pÉ„… ·ñü × ó¨ ‚ @4õ×À1õ1÷¾Ý‡‚3 l§hK¯ á *ã 튭® (± É ¿Þ™N—\û—Nð §÷Æ §îwñÀV­¸*¿®r«–ð •Õ¯ Ë£ ݱ¡7£šéއ ùTŒúØ/ß÷ë ­ušÖò-Ò?ñ {•” ð¬S©È'± °óÙ»ßG€Ý””Ö &`2û7C«“ ¯ âQö*{ªâŒ ÜUgÎŽ‡Èq¼Èò‚µ ükë î›É Î ¯Ö •³Ã¶[Ùôì ¸Žkž ‚ Š û ðÌz † » »úEÛË® 㛬‘¦ œ †Π߱ýoö kEžÄÊ©Œº ̰ç¨W:J¹ yƒˆbJ!êþ€ ƒªÌ¡—k® ×f,Õ®¢s‚çs‘…ä Ó vþ/j!‡-'=í · Gç2Àâ¦ÎàOïášÞ¡¤4÷Å´ÃÊ@Þ(°ì"Ô“ úç°4q¶7Ž:Ã0r¦0ȧ%]Ô˜ 0 éºNØŠr*³"T½cÿî*ßA±9ë º;=1VÁ­²ôÎ ¶'Gÿ…› R7-·@Œ¬•)7ƒýãwxƒÏ Û΄ˆõ ' ´ ƒ¿ ´?% îˆ.£ ýx%õðãó"“ì!À “Â71º Y¥ðfñ,v. n1ü“!SI(d6çj)94™E©›¶Ý–Í…´+*Þ¶—·å¸ Ô2 á›ÓŸRíX•íZH¥ ‰ Š¡!"œªV›±Óÿ‹ Ü1(Þöö w«Þ `4Té `‰“wIÌ Ú-¥ ¤¨ Â$EM›é¬E_ÐÞ Ž· EÉ š ü âMÚŠ Á‚ê%)*寡%ÅÜãgè;ª Á 2 K8$ŸD5ÕU›Ë¡Æ™À–%ßwÑS¥©HÚ4úß"ØÞ2é)Œ5·Ô3"1«ªñU•ÚÒ§@8Nø¤ù+@×<ÝîÈêÐ'›}®‡é ØÈ¢!æD²;¢"¼ïª‘D‡H‡Œ8‡"ûLÈBÛÒá*Ÿ)þ¦™?³EÏI©äEü‡Þ­‚Ü'æõ):¾آ”›=«3ÞC®1µ7ÁšBúG;»Á(Ä&ð…)²ì’ÐÇ Õ9ɲ/·LžÓ.™ ° ¼û Üìþ) ´ðâ‚ ¤3¹@ù$% Ê š*Ç ³ 1») x6ŒóÈÑ(ˆñ2­?Î ·Ë+šEåEŸÑ÷2×1ÔLÿI’”FÎ)° éKÀ £¹œÛ ©8à%¶ Ô= èHï´ È@ÚðZ¨*ŽíÙ(¢§ëA®;ž03>%1¦ž…¢øð݇² ̸)´"ã‘`ŽF†Ìℌ¨«DÖMÉÌ¡Šâ‘3«Ñ µ ª“0­î'¹+‹”¢ÂËBãù0¹$Ƚµ§‡K(†” ÏA‡å4ŒKÔþ>®Ë(©¸§)§(Ъ Ì1OÁ‹(ÀÀ<ÁIN©9¤ Ÿ8³„Fï6¦ˆ €¨þEݱ½… !5܉Šàéø2ήEÁ™"ÎFØ ¡þ±Ã:”3‘!t®6Ž=É$Ž ”Êö3ü ÷ Ÿ™€‰Ìä!® üE%“Ö#žÙÂÕAµË'Ð~ŠGª.å7ì2£—ø'Ÿt¡ ôø*¼.Ç `îó>„EÏó;‚ ƒGƒ´(…"ªÛ1,¸Ž Î ¥«oô«Î½§Ì¡©+ÃÉ/¾ÈGïKf†ê‚°’ «äGìà(æÞÍ ô<È ¯ ¯ ° ¶Î¨ªòÁ+‹ ñ0ŠÝ„™6‰4áûI¶+B§º;!ø›…#Þ3Í-»7íà†»"†9Úç&çï²@õ=¨#ñð2±+È&u²3¬/ÿM‚-¡û9üâ ˜(æ ÙÍ5ëî"·ó+‚0½—aBÃþ#ä -¼ŽØ E…é­Ø³%¥“¾œøŠ¼ü"¸¼" ©„ Û î1Ìå³6’ÑʉÅÞ/ý ²í¯ˆ (h‰‰ ¾¦Æˆô=âæÜ"ÍÇ_¿îì àKñêÊœ¡¹Ç#®v‹ƒEô#—é‹î?¤†Ò'ŒãÚɇ)4ÿEß±*¢æ6æ3®Ôtþ*”Ç*¦• ™C”< xy=Ö .ˆÀ³. ®¨z¼ÿ¿3ïÏ+ùÎ6Á>·#æF©Ò'tÂ#ë ·ó'Óçýå*ªÓ2Õ  ),îá0î9ÄÒ ÊŽ †&¢@#ê@öÆ‚ ô%,ðEœGÒµ´;†Cû½ ˆ¬'ÐDÕ÷"Ü&Ì ;K $#ò:ż±äº%†¤Kèê Ú·‚#ù Öë Ò¥ »Hâ)ÿ ʯ#¤&o“¡…ðŒ….õ;{¡´LÜ.,žÊFò°”Ð Óæ#‘–!☠'í°$ ­ô5ø-Jmÿ ¨cV|‰,W4ú ‘C)Ã'ý»>….¡ ‹¼ÐÄ0û-ÒÒ¿ÍÝIÒM…Nç7¤ÍüMè1Òž/áÀ-Ò³0û*‹»¤ö8µà<‹,ØÜ-2‹DÊ,é&ÜÛG¬³Ï )¾%ã%Ìì)½È4Ÿ,£'¾Ÿ=0…,ØJ¥ “,ˆH˜LÛ&ß­:É+—Ž>È ÿ35Ôç¯$Ê'—%,T€4ƒßÕçêÀ÷÷Ò‘º)á"þ)÷ë-± >Â5ñ,NÿE¦E˜ß3}þ«ú ˆ³8¥±(†ÓÇ"õ&šµ·´Æî­­» 泊± ð&“{¤%©Þ ½ ~в Ê™ü:Í ¢$½2—?Þ®DúÒ ©)ŠÉ¡ó­À3.ç Š¯‰¦–¤Éðê" –'î*Ñ#‡ÎªÍ6Ó@†/ŸàÖküë (Ú `ƒ1Ùµ8ö*¨Bò9Yé ì&Œ3Èð4÷ €ô Ž•HÛ€ñÛHî¹½õñ6Z®CìLü ÜÜ@#àŽGßGê&á)Ë&÷,Ä· ÕÊÊ1‘ Šð2ø Æ<è”! ¡‹÷/•ÔýÊ ©ê&ý€0³E‡òà'«A½!6ìØ!$ºç¶ÎÖî¡+· · ¡+‘  ƒCØš6)€™lÆ.WÝ ´¬ ©’OÔæúŒ“ßõï¹ Èþý Ñ‘ ºßÕôÞ%™@gÇ ä ’ñ©'² §à ¢Ôhü ªËÕ¡*ðÕ‘°»(¤ €ˆ¹¬Ö § Äó ¦:v,… .à R¿eÐ Ú¥ µì ‚©Ì À ᬠ§ íÔÒØÐÈ…ûŽUºÐò Á k¤ü…· ê®Ó÷/þµ0á>Þ ó+%™«Ø%Ï$°0Ò54É&€-&'mÊDá+7š1í3Ì+âÓs¿()Ô®;Å?àAì"–3ç°ˆÊÁ$èó™#ßõÊÐ êç&©‘±õ ì7š2¼Á ®‰Étýæ ê ¾$‚Ï+Ñ$ÍÏš?šÝ*í/,g)œ(ê-„0”+šü-¯Ü?æ2‘X¨¿,Wä5çëFìÌ3³‘ "¨ <ðÚêä"ˆGâ´ ‹$‘ç”™¿õª ƒíÏÉKÖ ÷1£ ÷ ¶…3ƒ,<¼3¹#—ýJ#@õ"Þ ¹Ü5‘ ¤LWA8òF*Ú;#?¬=¨4ÌEú5«2Öˆórù‚ç¸<ª3Ë ‰¾ ‡§Á0 „¢CÜLû@Ý?Ð-¶FË >ÂM‡ýè®:„‡ ëu»'×)áŽ2æK÷KÞJ[‡ò§ ý5¿3Ñ –LöÎ.¨„  ¶D«J¨VÇ. ;º; :™— Ã!ÂEãÜ<‘7³¥5‚ÿKÒK ÷Å!Ί¶!æ*‡N¸9¹/‰Õ º†¡¥J£4¨(àIÍIÓЊ•ð*§ ÷º‹5™õ½!ÏJ¼/‚2é  Êˆ ºF!ï#úV¹EÍ,Å1.&÷ ”à1ú! ¤1"êü7¶IŽ£ƒ?´ž˜:â>å>ä&X¾:˜ ²¼â"! ‚­âªûÙ© Þ§ûà˜£ ÿ.¦: #3'0BFaV + C!i,/YI{^  %#â{Þ;h ÒfgO@à8 9` k/[28@0:7%4†pL<8Æm ×ß6—Å¥‡5 ”íß6³6 šW!-ÃYOÐ3+" ìpEŒ#$O)JF^+’ íäQ¤p “¯à -›¬8KO÷„ŠÕ) ÷æ € E|ShÒ)´U‚ ˆ'V­ !1D e×,Â8­- , ¿¹9p5$ D'î‹hö$Z n8öUzgƒ e¯ b:&l *Øþ¸¡7 Ò@'âNW.¿þ” á <‚Æ'1 ³ôZR:z‰8 ² 48A-§ f¥ºîX—!zm ”   ü “W ˜.û©„¤³42 èl<':Ñvƒ ) B%lº 1 /Fi  „ v&2(= ,: ¥?¬ ò¨ 3-Y ­  @% @:#« !Tx*8 Q?ˆÅKU‹NV4 'Q! ]æB0©½>u …_ О$ Ì_ |I&¾»MµS­Éš,#ã'T&  ˆ –…s"7 ' "D¡†:‰¦ 0‚²\("ª]%Ö£Š&0‰gqX )T©ù¼#Vo W¡+Q" .¾#tŒðzÑœ~_² +, x„ Ò*›®H BX %  <^e "Q Þ‹ Ÿå   ý  ÀÌ… …øqÄ<ËÛÌ!d b‡ J,Ç—R† #]!ì Ų V eq†  K¬  "ÒA°AJF” ­4 ñÞ'€“)/°"’Z) * &, ʃA"F,ˆO B8 o  ,  g   h | Œ « V“\.72?4 n€wI» & $z$ {CM_A2¦J e‚!ÒZ’ a.) + kºKõNU Ÿ%† Y0ƒ +=2 o‚š"+åN$” Ã4õ 3CŸ@š@/ `rmÑÿâp‰¶&B KYž4T< ×9Pß} <#2°ü$ É©{I(¼Zí¤% 9&ê‰ef*§7½·,{…“¼ig Ü?r! 1VK8i=:)w{'S ›%•ž©.Zgµ.˜&•*¼œ†nH1)?%Æ>ª8)  ÚdcHâ i— . ðž S å¨I-}– +ðS C + “#->& Wàr'Z!` …C{þ€?ß2ÔÀgÉ›*Èì5á > + ¸¨If3©+ÝéW~}Îw ö<¾Ë÷­  ŒÝ´!±s6ðJWCö %(g"nï(…?´ä ŸÆÖ˜Î“-2F.’÷â4úoǶ Ï'-‰sŽñÕ¥wÇ'ë&,F|38ª6 "7™=â­P<ÒÝwT7Ôv =Æ I6nÉs þ #ß*îªwT7Ò™c&s% Æ ŸEtr7ñ "Ù3a(Ê? Ô¼™ZNLkŸ#I}Ü5YW" oƒ Ê_O] !lAUÐj‡1Ónk¡/¬;cyµ]{@ 41  n"‰Ÿ‚²?.…E ‹õ⮆֕d 6858q!Ƹww¦_O£ 0•5UÅ ©  i@àr " !3gx  §Ò’ž <ÃCB6  ° ËŒ— ~ Æ ¤ê € ØÇ¡'$;w Q*zn*zú-  gl ª 1Œ*.+ ݧQ­ü ®©c¡(.ä ¤2P3›$Y8 6Þ ‘Ø‘‡2NŒ&] +<¤2McF2h¦¤£ö g #6. Žd*‘¦ ¾ô4 š1&n !²gó :9<·T S‘JzßqOÌ ”&‘kq{›/'dc"‘¸! ’ B.od Óìã2¸ nB]½Y#g@ ˜" †.Œ ÂSM5 áÿ02Õj"#ÌrUkÂ/2  t|!i2dv6%ñ , j&1< 3þ†s£^„a‘ _+!z ³ã$ YX&¿nªâJ€°qý ÀPFSÖ ø}Fƒ_ 4Af‚«¯êka$  $˜~·) €Ø\#¿”     ×%i+R6=!‰™i™í!å1 ¤ =œŠ@a{-«Dx*)Q5E„ )[?2L+ N5Y*t7BL \`„<[97CóÃ=`=%4<®‘ ~¿0¢{  ;PŠKÉ)mDºT )Ž6¿ > &` "fK¹ ' y 0  T5#ý= 9‘ *Ò 4V ´%NB5ýW7a¿0A;P?#‘;˜^j"Ÿ'e4!“9¹É1 » E¦vc".  &-Y µº FD(lº˜ _)€  ±‘ ÷• c\(9Z„®>g€F:ÊÔ …@S ê5 5£ê(… à õ"ˆº¨B߳˨I»ëŸ¦<þ‰.« žIÕ8ªH]¥ á#êÍH¸û5Y0è8É#ÝìŽ/¯1A§*ÕÁšÊ™†˜ä¡Œˆ™EêеºÍ¯ òè É1äÛ«ëpÍ$·"–#¼üß µÝà(¹£ð“*»0 ë®åÆŽµô .ê"Â’ÒÞ©œ¸‡  •€æÿ‘™Û2¤Ž!ÊH»š¸B›!Ê"î,$Ü–E°&±êÄß“’÷$òµÌKÖ-2œD÷Jãˆ-”œ¾/­§“ ú Éïµ(«Šž Ä58.Ý6½põ.è Ô ÷ ®›áƒÿMñ!a ˆŠ:ß Û¾-³,¬8â×€œ‚œÛ±ˆÉ—² ´6›¬ æœÈ˜› Ö˜Ý Ç‹»Î?âöÉ+È$é–Ü‘‡…{›´ ö3Îõ½ò ‹ÿ$†áÀ µ¤• ñºK¶1ò?÷,Þ ì+Ç(ï³3¬ý:ô¯½ÀH­Ž œ#:$Qº@›ÿ!ßi‘ ´°$ë–Ä+Õ9HŠöÅ8ßKò0% 0(§&—ø(•%þ»„z¸ˆÉÍ$–ã(æá¢-à·ú¹$¢‘0Ø=‘¯6®4‡AX¢%ŒÎ—ƒY¾ƒ÷ ° æ º ÷’Œíê‡,¢1µ„ ö¤'±Ÿšð.º š–éºÐÞåç € ÿÉ$zIÛÜ!GÆ àŽÞ±³ Г.± ý"Ã/sÁ ïÔ ÂE¢Ë².Õ—%äÐ ŽÓ ìäûB¨à© uJŸ î ¶ÆìÉ}në DꂉË#Í´Ò(¼¬éÙMÅÿÁä ùñõB8™ ¯¬83¢ÇØ1ãÜ$ËÉ!Ø ’Ç+óýá‚7åŒ ‹?d‚ïµ? ð$™ž¾Ð#…²;†£! •/Ûãž” Ÿ«ÆûÈœ•%þ –9‰4Ý  7Î/†½ #…Ú=(æÌÆË•£)ƒF”¤"”8JÐòæ-½9Êà© ž¢ †Gîá Íü°á*ȼòCè/Öè ûëëŒæõæAEÖ9ƒ; ½"ë<ø?å<þÐ ÀÙI±ß /Ì4Þ×¶H°8œ!þCÄIÄÆ!ËS@"§ó2§ð&€d/:ƒlû0µ ÿ#‘¸#ò1b 8Ž0a 8ì.>É@ѨÓúâ â ÏÄ„ š!Ô¤#ÃàL¸Þ A§1º 0Y±ÂŠÅïéÓ[Þ¿$© /Èí¦3«-þ °/¹1ú;ºÌ,¢ $Ú´ÄÐâ óŠ«£A“.Æá,±“£:û#÷@÷EßDÕ̃/ªFËò/ÈIŘ+‹,­õ+þ±J” Y4¢K’ ¸K2é !å × ï7¡4ÛÐ?¬ ¾ð ¨JÜEß÷&Îñ+á¿áF‘ÝÞÒa¿9Ä+„Ò)\‡5¥5¾˜ƒ ‡)ÅF¨'¾Ø$ƒ‹ Ì@j%™Úþ ³=¹"ÒRçšCØ1¶ ¸ G±ÃÑ>Ù¾Õ/¯5–.ö³(°È=Õ ,û"‹EÇ©BÛ»Ü ŽëÁ'ÃF—EØœož+Ù0œ2ˆL†ö9¯Hž§ þ Ë3ì Ê‘Â:ú × à †× Xÿ¥$ö?ªB¹»Æ¦ ­¼ é ø8Ð ÂÌ ÌÕ'ʦÆ>•A6ͽì*Å [Ê'°)Ô:‘ª_á_†À,öÈ … #­ ý¯ ïÙ4,¢B‰§Å ¹ ô ß ŽL攑!À%šªB5I¢>Ò.²¼H@àEÉ3æ@ƒ+ÍIý=Ô·0"Žž Û ¿H¢ ò ÑE¯L>Û"ï%/­;­Ø ™ 3µ ŠQ7 9l!‡Å¶(zØÓ¹"¹êFºÅ= ˜ŸJû‡ Jý*ˆ/¦´‚…I¼øÏ5é4Ð § ›)ý0/ö¾ÚÒÆ’ó$(€4'D Á ù%eˆÏCÂ.ƒ¥ÊI‘0£ï"§«8Û0…™ 1#$É%úš2¢Ð °9ˆÍLþ‚MÉ“¶D µ<ÉJù¡'ýñ Êæå슕 ”J½ ÷Ÿ† ãšH€•(‰ "šô1",ï ç±Lƒá Ç’=Æ'”æòúÿ#êº È+Â3çEZØœ#B† ü?ø1­>Ä<Õ1Ù5ñ©©@ŠN±û”*á†CÞƒ=‘%˜ 1#Ð$ã Ö8Š žOÇC¶Cã'³ ¥Lâ üÄKö/"#ÕëJ¢Kœ @‹&º Ï9¢2ë9æ,×-ëóó%«3‰FÒð)*„3†¿9ð ÓÎ.¶“Ð ©Aµ5ÃE—!„F$n±ˆ#Øß €¥)‚Góí$²'à æc‘¢+Ë ª é'§ ¯)Qè+€Î ðÀ >ÑI¼ ü!ƒå û ¡0¸û<£ŽDºF®MšÔ&ò#¶!Ø4Eþùîj© Î ³ô¿ ›;mƒY´'ÓMì%†(ï # ÚA½6²;Ç ûEµ5ù<¸5 8ÌÖH„ ë#Á6¨$ô2ÇÏH•1•%ëõ ’3É3""’M¶Èò.hßF³€8±"ª‹cÂH„¨ ¦'·Ü3âδ ØÉ,‘\ùIØ7öbÂL .Ïá=Ž'€ Ó è?Ù3ü(£ ™Ü*ú(‘4BЧ¨õÀ¤­‹­á‚ ¡®ä“î ÿCêκ²E£ À¼VLN¯ý·§áÒLa½ ˆZ ‚ ˜ 覷q“ø%Ô½ ¸ºè#îГ,¼?†Ÿ­4é ú.—íûŠ® ¬1Ù­Š¿‚Ò Þ ¨ ÂÀØ— î]Æêš Ã’ÛÁ7(¡ ¸­’´äåãË'¨œ¥ ïö>Æ 0(ëlWäíç äã â Ðð,ˆÒ A˜©‘Ö8‰Œ ~ )B£B !&D]PÏÁxZú)¹ ­“2šñ å:Œš’ ¼‹ ŸA¬ê8‚ “ Ìö8‰=¼2î2Æ¥«HÚ!®¸ ŒŽ#¼°¢¯)­·2ÚØ*ÆÞ'ÑJµ-Ñ3Øç=ï2ýÀ? !¸ ›@ÆàW½¥Ö ”#èÆœœ.Ê"†5Þ»5©EB­IÞ€œÀñÂ&¸—Ü#œ ¿/!q‚þH«:‘#­ê+*Ï„@ð/¾€Ø6͆2™@Ú¤ › ì ÁœÊ©âx’Áï߄ѽå´(êÌ ýçý‰Ñ¬õ^…3Q ¦Â®‹™¬¥›5e± Þ(’ Д$éšËž#á¤óGÕ÷ »;–;_¢Kž$• Àºñ Šòij;÷iŒ.Þ‚ÿÒÔÈ`Α+º>žÜ’.†ÛDÆæ¨,½×$Ó•C±…ð Ûî …<ú<¨—ë"¨(³ÁG`Ú ¬ ÃmüÍ"3<ï½&­ë+þ3¤2‰œö%…¿.’Ü;íŠFÀÍ % Ÿ@CçóD9ùG÷Sï.‰1§í#Ë8°:ÞGä„Úúµ=ƒI Î!åÞ>Lľ ‡4˜‡ ·(ÇKþ øÍ0ÃLâ/¾Lò‚‹¨5©× §–¡ ä Àž"ÀÒӬ勞?œ%?(û ¾ G #œ$_¬Ÿû ¹Á*Å'êË (ÎË •úÂÍø7,¼áû;ù!û)Î+ ­ †£ä U¿…ÕñÅ ¹Ü0• e; ‰8ˆì± œ¬7d&þŽK¯ ÐC‘7Å Œ#HKº‚æéŽH_§ º)ë+‡B€ Hàö ,‚¾æ²´<ÃÜŠ1¬ÉÕ#ù “(&·ˆ$8žº.Ь¢-ÔÎ!¢á'Ì(ƒ—$ÎMñO|ÄŒ ä#mY ~­¾Ü–¼’nìéMðÚ Š‡ŽN¯ì;íºI ©(¢äÅ@í'ÔÖ4‚'Ö,¤À/Á£=’†Ñ Ó µ÷à¿Lî2ñ'Ù5Ê4ò#Ü€,§, DØâE]ÊDÙ,¯ ¿ê"ð6`­ž ^ìð(¬=®‹B_E•!Åb‹öþ=E)¿(ã ÔH•,í˜5©è-+jž õ§ Á ÔÀ‰ëš_ …¾ ä)p»XPž Z2ø#Ù`–`!0oÄ+°+>xLq­ ùéz7©ˆ‹°z7©›Á™Âëè§U¦@+‹°^ƒÙ!É\@÷?ßÒ ð­¿ðŸJ»…ì„‹ ä46ol3)ïó Ó j! I‰Ïn/•„r«yµ3ª ÉÆíúÆ` #wø/e⣴])·Ô%Ì=ˆ-C¯ (°«û`nF½BLÐ,3‡*Á[-L&•ƒš #€>L®q‰uÑ àƒõ(%.0§öÑ\©¾Ú°¹%Ñ{œ6!$À:P ?Úˆ°ê ÷ÍoÝüIï„f Œ¸j<Ž « TT¸ÝaË¿2å b ¤Y&ÛŒìU¡Ù‘1*úN ¹¸†‚r£á¯ÇË ð u8KîTKå!ùŸò½öÐŽQàµ>vr•‡©Ç‹ 4§ËèIÌ~®ŠäFª…èi“¿!¶O!»¬É¾Ñ¢=Ç 4jA!«$¹_ª ¬ëfžª šíÿ‹'‰ óŽàÿ Úƒç2E)ê@„RêJ½6ÒLRA&95 wÐã0¯«¦sýüû70µäö«®êªæ 3Êíáøí÷‰9K4#¦ ηV·a ªÒ§…¯Ž9oÙÉÉ?Üæ$c=µÑ¯åk÷$c•kÏÒ¦¤ á%D²îžÄÇ„—9õÖ"žî?_Îß±î¿ð ÁdÅM]=¤Æ Å öª§ Æ ÿÏ g]—çS² H ø™ºo‰V£ =[ÓwÍO2‚t´|ø :¯dÆ«ú”š€Ñ¢Òª¤íݽêéÏ ¡•}~uÀ؉WÄœŸÏ†\#GP“ 1$©[ /ÏKÉ$°!ä"ùô‚ö£›¬á‚’Ô+‹¤š5O%+Ï·ÈiÌH°!MÎ!tf©Ë•6ËÓÎí ]:ú®©‰-> ”‰>Ñ]–¡¹ˆŽÎ†Dvç½uÕ ‹Ü"Ú€‹#¶$ÏÙ ´’ƒ /¦³ «ÿR2 ²9éù¬.M ° ‹ ¼vôpò·s¨%°å})@£þÝ+N t´µ¶¢—91ìŠS‰ *Ûw„7A®§Ÿï¼vÕɯ=“?²É,"¾ ˜ð3«·&¯&`Š µ*„=Ë:†.©2  ùµ#å&³Ï÷™—Ò,–º ©‡¶$ï çê±#TýŒ …ŽÓÀ.—4•'T–T‚ßà) Ö ÙçÈòÂÝ*¡ ì íàÈ Öþþ?<¢Žªª ƒ á Þ3°?ƒšñ {ŒD ¦Ê¾°2µ½5¨ïíé ŒŽ».6èâ™ ÅIË>§òÄ þÑ@¾ð»äƒ%“ÚÜÊÌÒÞø!É1¹ €!·+­3™<Ø/ ¦+‹Áùèò0ÜJˆ6 Ú¡;¨–ƒ“¡Ó¹ 艬 ÂÿøóÔ”ƒ¶¢¥ [ì&Š÷ô›‰ˆË0¿p‚Æ ¼Ë0ðÛ²òˆ…ÝG‚uðwPÔ¢œ‘ŒGÈ£ÛJ·Ë>}Ø®¬D K* 2f§Ô’ "„&am˜j!ÓŸâ„4* ´qƒŒÈÛA9X/– ¸éòÌsÚé%‰ŽŠS {uŠDpØÒúˆ×¦¼…qâ9ÿ’NŽóׇ8ûó9u% f ‘­öJŽ%.GxQK-,ñÍYAñÛ*¶Å¼.—# pJ–Å&õ•£— F߀° ¬ …b|1AµœUD{ößÙÆÿÌ¥‚¿¹„¤ßL…AsÜ0s×Hd#˜ â©©µ ˜4Žý•]ð–†k+’î£Íµ†(©§þ I«'kо‹öVSÞÁÁ^@ÑyïØ&!Wβ)™÷••Ń(¥(f¶%Î:>Žö»åh™Ü´ çÔ£¨•*h{£Ø}‚¬Ùl€¶’© ð׿$VGqºø}Ê( è½ÿï8©tCŒ á…X³Î*± ´¹á_×l¢E±Œ …-”9'HM r õ¿{ˆ*Ë‚Ë9¥ ø«ïŸõÂ3ËÓŠ¢] 4Ô}rÝߥ—,ùØÒ >é¥Eß cÐoMeøbûç!û;Ø«˜wÖÞ—ÇŸ ¼';È ªÙ¬€’”°Xn—G€#zJ )ñ¶†µ;PçÁ,FÉN`2¶ ‰Þì2Üš´WI¿îoÃs7˜WIé ‡¿ÔI`4²A"‡¹išÉèƒ{±¬¼ú y G ÝpÞ­ºgnÍžŽÜÿÁ>ï.è9E³„Ò±ó ²H² uo0û]6ÖØÓžÎƒž‰€¯xR7éJ9ί>ˆª:‡ Þj¹ç¢n³O€fÏß‹ya$Æî„Š ¡©Vp"yŠÉø¶ š¶gEM[ ÕƄj‘š”mk(67 µJq!³ îŽ<’¼Í"ûW ÅÃøŠc[ Õ ¢ A‰¥Ýúð*""ËV“è Ç9–r‡kÝGŒÖþ¿»; if' ¹°îïÛÞâQ š™Âá§æ±±„ ¹è¾¡$XÁŠK ¹.†’φ\XÐå •¡èl>±ÝäPÌç™^¬œ`œÖ  ”ˆ\Ùíj&kóԘˡË׿2Ü#åþ:°=ÈÀ ‚GãŠ+a逾<¤L¬I¾-â&¯ Ä8œ;‹¢<áC¤- ªoj¸,Tè\c n8,,é«,TgªÔtY‡aAšÑÿ–uÇŸŸ3…¯ÚŠƒ68%<ŸŒ”Ãþˆ_ùš£´ý_ºKL¡M[Q(õ—ÁßæÆâL+Ä?í¢é‘e©Ôò1·‚L 9‰œ£8woŠCõ Ú 9©ýëú¯ñà ^/J“’õJÀ óÃf Ö ©º°0 ¸^-S“?!ŠÉý&Äܱ!zÜN¤Hî4'<¸ƒÙ¡õŒÕo︤+(ÂÌþ[8 50§§µÚ`µôåuƉ‰»bÛ.>`M6’ Ç`[$L›Ý„°ð€%è#%#Ÿøt b2NŒç B ª Ÿ×H1…×~ähô ›i /™Œ»»´%Ä!:³_¯Ë  ‹ 4(KL ˜‹« ew× g••Ë£ šÎ.è nΆ ƒ•,<DÑòJs!6 1kšÛ¡!²¦Þ~ ƒÒ <À+ïD ö ¡/Å •õ% ½®œ£”÷ ø¿¶¥ ÐFS)d}y¯ïÇK; ‚é^ï‹h¤³]îË¢éWuøŽÌ-º g݉.Î.Qòš«Å²ö«µ¿ 8OýTiJ Û€š¾¥ f…ð7%̆éØÊÉBºòRê ÁÝÉA¹â@'ßG ‰¼© :ñÛ3ܲ&ëw?ô¾ “¨a–‚ÝÙUQ…ëŠ Àe¢ì¥‚hƒÖ4¡˜˜ 𺗠çÖÏÁË“Åcà©«ÒhôjíŒyõ,˜q%”V±nµ$…²|ž‚¾ŸÍÝ@N)z$ÅfÓÔš–UIX‘€Ñþ bpôÕ*ŠÌíËDa!Õ$á¶žÖÊËì²’ƒªºO¾4gÃ"Žþž¼§*KÉ…nÔ&&h³þ¤.¬›#ó´Ö Ú’ä E Á é4 ˜’ ׄÇÍ™çúnñ ¥µ á‚,:‘퇠?þ_ ¾¯ +䨀'‹ÙHË)ñë<ºÀb.234•¾„ƒÒ dö%P4ó‚ÛAÁÖ9ËÜ›Ý Ú¤àé †™=ØŸ©@ÎöµÆ#ìÉMeýÜ>ñ³šD÷ äÙ®¶¸?ä äš ¼Ã3×·7¸ç7Ù$ÆÏ ¿*½ Û ÿ³Ï‡!šó ýÔï;ðÛ!šù ú׌¡ ²—¿Å¡¨²¦¬€†•2”釗9¾G•ÓKí4æK‹7÷ÉJ.×3C‰Ë'ÇMè21†Fàñ9H¶2éE•0ŸEô´Ñõ)Š€$— ¢™9£öà)£•ˆ–Ú$®#‰ìü‰‡+¶;‡$¼$ô É<Ž”AØJ‚+»°Ãõ6†Øë!ÆÁñ,ìÄ+L™J›$’' X‰ë"$ç½ì íãÖ=”¾0Þ&‰f‰'„(‡Iî*)¬HŸµ3‰ ¦€Dú DÌ7úº=¦+ãÈJ.\Š7Û ™³DŸ+wÝÍ*ÂßDÜ<Ô0Qâ ÆKÿ/ƒ…(¤=ü ìŽ!áEš È-º(ð$«˜4ô°C³*¼F»G‚E‹Ö Ó@É ÍÁäš ×º;à–G‰gsŠ‹³7Ž'À†+¿I†ã´…ž7ÑL¨è•2ß”,ýâhá!þ¢( ä'• ¶2ÕIܯ5­˜™–!Ž‘ƒ¾,&²§Åÿ“Ž €½&¦ª µ<Âó‘”ú#ÎŒÁ‰ª†ÙJˆD‘,bŽ×DÆ‹-Y¹˜>ÜŒCÃ5´,… —Çþ352´>ÈÏ×.Ž ™Ñ’– Ò‡F€KÒIí-ŠIÜ•#¶;Óö(ÍÒJé%¾Â,³H³ÊA™û ³4€0šK ß2Žš+  Õ °(ê–C³.Â(Þ':‘Õ’“X‚4ú ‹ª!úè‹>ó!æ%”<‹•+èi ±IÓ(>ó¯ðÌ.&Iß@¤'ðHæF¦œëå40Hƒ7m- ׯ <¬¦1¨+¡ä1Œ"–ñÓ.˜"àÁ(¦ öï(!Ï5ë-ùò6¼,µ)ÁÜ(ß÷› ›—«â.¢êKôKé·4îJ·ƒ%—ù¨Å´;‰˜úI©j™HKǽèÊæ¨ÿÅž™éú,äAšFÃ9±¬?ã5Û ·)”†%á$¢  » (Þ#áÚ¹› ª[¿Aï¬œÇ ·9á Ô Ô5ˆKÙ#¾ ´#™ ß´‚C¾‰ë§ ù¬ºž(âµà¦Å2Hê%½ ’B¢$‘B•Ú € ã6Û'À#º ŸA‰=à×<Ã"‹ ˜ú¬ Ç sW/‡i®Æ àŒ”‚ »žÈÝ“>Ɖþùã ¹Œ»º ~œ®&¡â™3ï Ì-ëà… lO9n<Ÿÿ¦t±Ùá ÒU†õ µ!ÐŽ– Á‚‚‚[¸î„´Š3»*ä œä ã;îØæÿ󛬄BÈ êì ¯žÌ’ˆÈúîì #Ê„ö ªÁÕzæ¦ïô ÿÀ™ŠÓ—ÇÏ77• „ŒÝ©Í ‰"ÙœÌ çŽÒë •j–µôè–«‚Ë÷™• ¶•*,R= ¬ê¹æñŽÊʤò’“Î 7c¤  Ç·„¹ÊcøÐç¥ †ûªÖù½€©ñ5š‹ï)ö®òÛ„ïÖz•¨ŽØ Fþ®‹È¬GÍ ÄLuÕ׌ øÉƒJ¿ Êé¹ïÓÓ§ •ñ; ²&–8ð ñêuåÀò*Lð¯"…¬® ¥1"ò¨ñ® ®<›Kò¸,ž2É…iî<ÊCü:œ‡¯†¶ØGDªKÚ´ Ú#íø{•ò-õõ ×>µÏ8ì¿@Î5Ù ü ¦†îØ*³0!÷7©‹Œ'ƒö æ2ŽÔŸÑG½¾?×-Eá9‚>Ж7¯5&Š‹‘ …V”‰,‹ô‚åIÁ7´–(ž½±Cþ ÷ »*È›!è”Ð5ÛÞýÅ4Ÿíð(ö Ù7- €ÿ1tž–K¬JÑA•ÃIË6ÆÚ µ ê"Œ2çäK‚™%¼$Ð2ò3,¬3™³(RÇEá$ÑD®?íë%2Á[š½@¹#¨D“8JšÛ«8Ü#Ö³Ã!'» ÿ“† , 3     ÄH… ë šŠ ¶ó « ¡ 4 3  3.× ÇK­ÕìÇÛ&ºˆ;Ø!®ã+—š3g­Fòné;¥ Ï ôÕØ,é¿!@¨ „Ƥ gXm»[&ȵ‰’¡ßÒ*û ׇüöƒD¶é6¤G«§+ôø ¥3à-·8µ>…@Ë+ÑÁˆEûðEÉÂÌ%®+ºÊ¸ÐÄ¥"“Fç§Ç=ñDÆ™9„ô+êÅIÛÀEÒ;2ÝЛô•ˆ³>™E‚HÕ#Ì î?Ö0ˆ Ò â,ÈB– ë ´Š ëN]æº Ê‘#ñ ÁEí¹þ < Ï•„ËÙå[¶Ö3Æ:ž–J+ø–0Å”ÕM òàE ²î©.º#é8ÓçIª3å oƒ=ÛMíþG¡ ì!ää0ù&œ)˜+‹¨Eã•>ÿ=Ë ¡4!ƒ…(Ò4£kˆ—©Æñ%€÷•/ý Ï ÔÏ"ÀØ òG… Ù1—&£§”‚)îÈ#Åv® §&…žÄÑFš µEÁã Ã&‚<ÿåòû áŠ-·Î"ŠÃ‹JË. +„4Í&ÀßB¬K“%—„ðÄ(…CãqÒ27Ò=œK¤ â¨;D,n,ÝÉã6Ç#ÂM´)îðÍDL†¡’=£ -«MâKÐ>ª'-Ù½¯>’9æ ç½ Ø;ˆ Ô/ñ,+‰[ <Ôþ™0«D OÃJ§ã«›H¬)§:³9Ú0°Dš;Ö) lÄœ ˜öú?–$ÏM½ÅÇéÍ ø©®¹…9À=Oˆ­Ö }ÃŽ Ö#ã € „%•· Ù Ä<›KÞ†.ç.’ ã …*Ç)Ô;ì@öÌ ôÕ5 ZýBú®.ªõ`ÅC¨=˜¾ž.òØß=é-°+@oÂ@Œ'Ç‹"“C€B©-„†=³#ÖÂÝÁý(ñˆ ¼&  ç¿3„× ·(’3¬å«ýIßçÉ#ñ$3Ì·ý®7áç †Ï£ 3ó*²¶- Å%늗ô)朒±´ÿÄó–Baµ8¬%Äå¨ ¥CïKò¯ÔÚ*É›­ù(ã½ úV‚/$›$ýAÏ å™%Áé Õ Ñ#¦Fñ$W¿Hì'ž ë¸MÏ9÷õï6—Œ Û ‡ $¤î göé×<ß9¶ œ Ë³;ô;¢%ÀÚ<®FmÆò9ô5m‚;n”€Aû7ð@K.Ñ)â-¯Ã8ˆª8Æð í,Ó†6˜ ÛÖÊüôÉ"â . ¢>ì­ ¡,o¼K˜>å!/ë%·Kñ 4èºíBó¾ M í$¯CÑ'ž7‚4Êô•6Ç*‡(ƒ(‰ ­ ­H¼±³7¢©ÓFÚ¨Ä&Ï1›»=ÁȤ(÷MÈ)¬¯=­GèÌ ÅéGÆ » åö ã;–ɺI¶"õ ² ˜ ÜþÒ”*çµÅÊôìö µ«7ûñ&² ”+²Ûû7„Ä&– ŠöIå ȱ(ÖˆØ ‘/ÂÔõ+èFò •û¹'” é,ó Ѱ½¤ å5ÚÔ €‘äˆìSÐ#Ù4–Ó+·&»+…«µ(ÞKñ-Ÿá ºùö85P¢òÝ-¾LMø î DÙ¤ ýžêŠãH‘ª/–Ü‘&¤ ‚AëÐ&‹ é ¹ ›"À!«ÃG%é Ÿ-æŒÙ Û2 *›D±(áÏG1Ü ºé£’Ã! Ž“! —-ªÀ»À’%½4Õ"ÑíŽ@ü¼,®ù Ó¦$³óF>ï Qõ ôß*Ù¤Ÿ†ò&Ï,Æ>´1®®@`†9/ÔF—#ð Á èÍú<Ú !ƒËüù ü"¿5­ëôÇ(ÇÉ» ®;“Ô†–×¹1Æñ “‰ÔóâÎ!½ß Òæ.7P €ÙúÜH·8´;R=™ú¢w ›<†—Â*ã p¬ë,ÙÂ/œ¤,¨ á K¨=Ó=‘ ‡!å¦0¸®+«0ˆÇü€.Ì+¶aªC®4Så•‘i“Ï ÄäªDƒ-ÑpŽn  HB¼ «#éñþÚ5´ ¤+è5€ÁóTñ ñÔ0†7±«® D$Œ½† ¥9ß'ó¸ Æ%7äέ( ¨,U´ °'ƒ Ê!¥D—9„ °Ì¸-+± ÍãÌî:'‡ ÊëG•Bt.;5=4±*âÁA% ¬2F"80r Ø+¯ á þ %˜” Þá 7‹ ðÞ*pÝ8 ó5áJ”QàÒ— »‹@õEÒ=ØÜ›FìÚKÏG­K±è?¶+ðÕÚ æ Ð ¶> %Ûïì"yÕ;–Øí$`Ÿú!݃%‡(´†AúB™4¸ úL» ‹IÚ ¹;ø<….Ö&¯ð2ЭŸûÏKÚIí1€ Ê÷ç!ÇEè —@¯ò%þ…¤¯ž” ø'» ß.õú Ò5 ·› ‡&™ ž¢¨¥$·™3·àÂ-ª Ý´ÖÙ¯"¬ Rë… ývã=ú.Ÿö •ÍGÿGï"¢ÙÉ&«@¤#½AšÅ Ô&ÌÁ¬!÷ ï¾0¬ à£= ½÷?ª6·¾„)Û×*±ç/ø ²È æ“IÅ© ÷!å%Àô$žöMÇ)ã¯+Å Ú6è+Š ;;Âö!ß×§‘É/8ž Ç?éJæùðB ‡{•ˆ ± Ë£× ð p (ÄÜçÔ>Ò  ž Æ  0‘ €YÒÍ ¦¸'Œ âa ¸„£ áÆ É° ¶Äë WÑ0áDªÓ ¦ Œ-ãî ×S¨  Ð Ö  º!1 “ß)9à Úµ øÝ¹ ž ë  ±–bè ÷² øî¤ÖÍ7˜x 8‡ü {×Ç´ÜÙïÂÜ*ÊÊ Ý  ‹‘‘!€ • Þ Ú«@¬ ¡ß•+ ã ž´ ¶ ,ž,Ç$—¬Cû)ù©>¥XÐ#û¦Díÿ Ô?þŒ ÚÍIÎÐÎÔñ'ó4Â*öðLÐ>žØýE4ç„!¾À€ù‹@Ë$dž,¨CØ—%ÖñÊÒ$Œ•FüBÐ#„Cw3,ÕBã ¸Dï&»W[¡%Æ*œC™š3Åé2*ÿª(ð.‰ã;Ú äš×±‰|¶ô(ë è±­™1„ÅÊ€ †š„ Ò¦¬~ކ#ÐÒ¦’:¹AÝ5ìËû ¢è‰06«4±Õ Ä3ɸϘ î+âû=æö« Ĉʤ¸'©—­ ëˆG«( ªHKÙG±úÝú*ÜÜ £ÞK± ‚þÅãïØ è$ð!² »‘´B‡7©¢ ì ˆ¿„‡3ªTž>Up¸7„Î4ð6¦KóG¸1«µ> ç5–q1ÝÒ†&Àü©;Ð ¬û/ÿIöFâ7ì ÆMÙ*ì4šŠDý °J±­r Û^MÖ™ÙÒÀ±ö#© _½È º Ê Ù´ò‘ò%… “æuà õÏîÆ•Œ¹Ÿ ΆíÏŒöè ìÞÅ!`¥ Ø ° \×ûÚ¨!ØÊ '¿0Ýÿá4ëƒÝñy÷¦ '‰Áîóÿÿ*¼­-­ Í øÊÇÏš/Æš ¢¬±²?“5Ö*Øeè“LÙ&º6k’ïJ†=ß$ª#‚Ø$¸›Å¸·.´&ØHˆœ¨Ž‚å5ÈÐ=ÈAœÚ'œ á"ñá)U°>Î*è5Á-‡àKÞž3Û«E¦$ñÙ*¨#ÉHŽ’¸ì Å4š6ÁÖÙ ÷<àIÑ.ç ¯M™¶ˆß1ò?Ç$Ý'€—8:¥# ò º!¸‰Á‰°Ï'áGºçWÂÔËÓ’ µ È'eê2œ  þ¢¯9«œú–@Ö*á÷Š‹ ¶^)ò&¯ žÛÓ‡æ¾¦Í ß›);Ô ‹é¸Ò"ÃÞ°ƒÀëê !¥"ð© ýVG›Û!š¨×ºµ©È”ØþþÂ0ÄrWÀî½­ å‰#£GŠë,Ù+È5Õš êÃ<þµD« Èè%å6Ãä2ø;þä»íŸA‡- –&”B’Ç ß?UDì €ÜŽ,Ï¥ø‘߉ 8¾-ŽÆéž á ¾›‚Ý ”(Üô8åÆ%„ Îô•¿)×â#š À Ý Á ’ ¯( ôºÃ à š-í1÷/è•?è8³ hX½4ÙÜ*®…è²8+­"Ž(Á ó߆™9êGƒ:Æ Šœ ¥4çî§)Á¯–6Ï´-Ö˜ÍqÔ8é –»®)u˜ KŽ&s€t¨5‰ ¿ð9®uv‘ —Ë3´³'º£4£ÑŠ#êCî·<®€=K±5Ö-X†ßDöØA³+Ä3È ÙÆ&—’ì kØ.8Ãrž ©½Bá× — º„–Äï¤È9Òá ù © ªGí7Ð%¨‰¬5ËUâÚ—&ý'Ä?£˜Ê ·ýƒì¢;»æ3…ì¯˜šš­¸nê;Ð ÉØ,é3¨ï,ØÓɵ‰Ó*ü ª îÆü–•1b¶%ÇÖžóÑÖ&Ó eòé.’Df–‹+òHé¶©òª ¥± ¯¡!3¢)~‘CÑ3Ì2à CüH¾¶'æ-èè2˜Ö…7¡3üŠNý‰¾;ïÍû ³.‘Œ ¨.ÏJ–‹=þF“„2ƒÅ,Îù’Ð(Ë:ÿ5«*ø›8øü‹žß—ÖDÿ$ð1®×@£,¾Ãµœš¨ß  ÿ‘Ø Ê3èE†FÝ8‚»ØÖIƒ@ƒ ¨ÀÁ8Á´]ª® ¼ ¹KÉ(óBéúG¨J½ŽÏ ñÇ;øÑ é ¢ªø½M†“A¨¢œ…€üßø ªFÆÈBþ¨›!å ˆ2­F‡ì)ç?yݸ#Á%ûàò*Aú½³ù25"[åBòIÜè‹›³(ë)¦ø3M÷ Ó3MÍ¡ ’&¯ÅŒ¶ß,ž˜ÃZ €¦kƒ·¥N¥á Œ‚a'… —ŠZ ß+é ­€£EÓ ¥É 9× «oã U® &•àØ)€;– àÄØ Å(c¤óXgâ³ í œ'™† §6ø !^!#*¼Òú¢2öÖŒ¨}4žƒ÷½ëƒ^-ìN3yK„^-Õü*#ê‘Ñ€ ‹¶ ¦ Ñï÷Ë?Ï Ž±¼ ¢tzþ0‡üÉ °Ð‡® Ý/ q§ ïýå¥ ¾ $¯‚ÍÝG !¸ÙG¦á Ö­„ŸÓ"‹çL Ošh*ñ0X… Ï.±Ó[€›ýÇê ʪ§9ô(œ¨ô"Ð:Ä—Î'†ð¤:‚D‚£EÆ(ƒG´5ï„)Ñ ßÈB*S”?ù”‡è¯,× ¥ÇX«”ž¶ ¢%Ëýêï Ù2ÝVVà ä ŸÝµ ùõ…¿®)R®a´à°ô(L õÅ3è‘£µâЇn &€°˜$œŠ4ŒÒ ² Eh— "ô é#5/ÙÕ0ª5gÕ=Æè»í+‘ ô@€ÖÅý:4í™Rôl çŒOæ@‰L½=ÒL¸5æ±Ä4²w¤:5¼³–@¨±¹<þêJýÝE¨8ª+¬­æ"Æ‹û$Õ•þF(7Ø4Áï&‹ „»: ­!ì%¹,òo€¤âÆ_™üÇÿ!º¦à Êì,“ÅíCÌ=™E«1£ ”0áÕ' ² ' å « œdÚG0Œ!Ñ-Ý*» ´Ë‰<˜.Š ™ Žxy«î.†,ñÞK½K¸=á»Ì ûªîJ´•ñ] ïÉ̵ ȵª9Ú Û(éßµ ‡àˆÏÁÇEð à Ô†¯Þø)¥Ö;Þ… PÔš¯ý!àã—Ø¤hÅ‚‡Ÿî¯ ­ ½äùLjë&ì"î-— ô ÷ª‚«^Ü­Åš å­›jF˜¹­ü2ÐªŠ’ Á­°Ö™ !é0ÕüG°(µCýEÑ.±9õ8èB8  ¯#[áÅÇ ÊÙ)ºI°-”¿/ð,º¦?Æ>ø-€Ô pŒ5Ë%ÄË’@éMâÈ _þ Œ¾JÕó ƒ+·ìÑç"Ι"µ+ž˜Ä‚é ©1=½ òè1­† ÏŒ ¸¯F§I…2ØÀ µ";Àã2[´½2²/Î9ÈÛ à³œ’†Šù#Î ’ û7à³-* %LŸ, °,ê  ò/ò”ª§¾GÞ 5°2à )2ÄJ„*¶©6ñ;‚5Ý •å<„/»ÓD–(ÝDÐ1±:íH¿wü)Ð,Í-­¯š)ó1‡BÅ4Ê¥! ²&Ú:µ:‹ ¿ ì(î-™LÀA±.šæ°6ŸÚÕÇL茽 Û ÊÝÞˆž• Üf?%œ çÓMœ8¦¨=º !Þ ë0è0ˆÌŸ‹ ¶œ ø§ë¶¸Òª²÷  Œ …ÅΖá û¥‚£Öÿ-SAÁ$dš¯ÄØý'ó³ vH;·o¨” ï °&шGñÕ§‘M„J€G 7 ¼‚@üà·,Ú>ŠGÔ;ÂLÆš,ù,í õ ý0ø6«ÑÉ#©"ò¥;ð + ð*2ƒ’¿‹'óE° º)öVºÔ6Ÿ4¬$¬"Ž/"Á[ÙÏ3Ï5Ú¦ ƒÜ ÊóX¹Í “+á5Ï«4©EI‡#C ½:#)É4ú4WÔ>6ûÖ0¥:ÂõmNõG¸3—>Ïï<‚:„4ò!gñÊH®K«5ˆ Ûñ3ë¨/cí8ð…4Æ­Eþ+· bOÎñÁqæ@ôŸ0ÅLÔVÆ“ "³L²1ŒÑB+4á2`‡0”?Œ÷Lö8Ø9+ù·ñ4‚ é5äœé;íÕ>âE“‹Ä ‹ì ‰-¨ç »Kÿ#Þ¹3 ¸,º÷6¾@ô ÝÅÙ äÛ òë¥    õ¡ ÷¦æ ¢ ü ¼0Ìʹ$Û¡žzªª¥X6Ž&­0² ÙK"gm³Ò¶¤5 ÄMóIâÁ0s'ªœ(«¥4 ›Z§LËŽ+¾'î ‘Ç7é „;Õ/€.‘8°8?‘5üK”5?ú4Å-î&Ã)7ª)ÿL̆.áˆ(ý Œ Âvè'¤ñ0M_òJ… šHŽGÚö 2ºALñ2Œ)êk»Œ=íMå!ë•-; Ó Ý‘¨_rH…„ àâ  °À‚ –ñÆY«’Ëɳ ÏÏ“{r ¼z“_ÕÞöÿ㈈€r€¡é n ‚E/ ƒU‚â{ Ù¼  û0» ±^—^- J ¾2SêÀ Œ Þ Ìf" ­‚1  ì Ú2U+ Žÿ ‡˜‡—ë  ç7K'„Áßž× ±n\Kð ˆ t h%\_¨’Í $6 xXuÖ÷Ž ñ ;ýõž ™ Y ncÝÔÃ¼Ø È~çèe» Ðúfƒ¿(QO½óÇÞÐ`ŒOU²   Æ•f †uô    ~¦}Ëg>Ãl —˜   “ ò#= V0Ãa Š“ÀºL²ã>¥ •’ßeì „X„â ÿ “  „ý5A  ~éln‘±•!± ©ã‚p È { ` Ø– ¡ß À¨G¸¹Ë+ãW€mé-š¹Ë us ™âí_ô–v åß‹µ - • I¸¶è¶ž‡’iÛMɺ5    Ò Ü€¼J$ ¶\Â]š * ¯œï²é¢‘± û ®Èe«   ÜÑ•‡ µª‰† Ü Y ŒÁ 2ô 6. NàÒ ]!ª ƒ9+§º€àÞ’`[8À\ j"<ëùÍÂÒÅo€  …Ë@“³üÞ Ê4‰§ ¬¿‚°á´ðåD͎寉탂6Ú ã K*3lø 3 &   úïVX’Ñ Š•µ ëäõ£ :ß  V¨µî² §š 8Ujƒ Ô 3ƒÂ   ¿› .!_  -Ь ß "Œ Ç gó- _»»ƒ Ư…K!Æ §‡n¨X°•Sß¶YíTƒíÇ Y¿ó£9@^ö Ûûà   l¡¾Ý‹ Á—ê ¾ôß Rg ¬ ™ Ï袟îëø_ËÓq\„®\.‡°Ö±R r?å½8ý3©7Ð QOÈ#Ö­2 ‡=ÚëGóE¤FÈ3¹ÓJ­ò7¯2Øóó-¨+&ßÙþ:ï›å'ÿƳF¦×KÞKžH¼Ç—@ý7ÜãIÕH{§5Æ%4½*Ñ-ò7àéßÒ*9šEòÄ,ÿ}üY¥Â1à@£!¬>³°!ÃD]C&+³ÖݺäúŠ8"?âÆë°®*£îÅÑò•;¬ Ñ 8œÙ8Á †Û (Ø ¹ è –(E‘¬ ù)óº0± Æ 3¼ úô<éœ­Ü òàì)fá¶] Á ­¨® ™7jöÔñ‘ ‰¢2ÝÊÍÃèÄ_)MxŬ¾ÕeâÔ¬ë,¡ >OŠÈ=óµ¹ ·z”LèžÅ×2Ð(Za0@)Û ‡¤ ¼%¯$’Ì ’¨&¨Ê ŸýmÅ  ò §› ÷!¢ ¦ ‹3¼‚*« Áł鿯 Úó¬ÖÎ$D~›ñ ‚ ­8ê Ö ’–)~“ ÜÜÂW› Ñ“êÁ ë’]*”… gØ:Ç £Í&Î9*¤à òŒ  ®>túü, ½ßÖá ÎÖí佩 ž,ÈÕ–À¾ý»‹ê þõ#·Ýç¶×Œ¿Fæ?ÌMŽJÑÉ¢4÷ bç7­(á/™Û- òE .¥Ž¶,ûD¸-‘Ûþ|Ó.Ó ÿ ˆ®œÌ 16˜)Y•p€1èéî §ë»&ÈÔ*Ö Û ¤î ԡʵÛóÚȹ—²Œ3òæH¸¦Ó¿¶3èÜ ¶å–ý Óþº ¾k<‰±ºó ´(´X$0S˜òŽÆ è ¢Ÿ!’‰'ú¼ [ ?±¨ç×ý _³$¤$©ç €Æ/ô#ÒÝFÅ ÅCÎ-ͺº'¹†/‰.Í zÐzá<Î#oÜ´À …‘© ºã¢¤Õ»ÐçØ¡ð¯ õáÁÀœ´‚~¼›â ÀÝ†Ž› ù ¿ »”#‚ ܾèö!£š¶Ñ¢ý š¿…çæþ»Äô„‚¼$©ƒ¥#ŽrÕ ™½ƒIØùÓ×üÃ·Ä ¯ÅÍÉŠ¹ÍÄ ¢ ¹µ ÒêŠã œ Ñ㟠€Ò Óà ‹²Šü Ú§T$F@=”ÄÜ+ƒ¤ ”“þ ঠ|j¯„ÕÚrš ÛðãÉÛ–MôÆ« 4ž*«Ê— Z¿ÞÑŒ¢½QØæ›ñö§(ŠøÊ¾ »á!¦š&à)¾1?²*òGŽÓ¿=”|°øE}§E1Ñ ”„* Ï*Šñ¢>Äû :ê ÿ:‰å° ʼÄ)ÚîŦ!ùÚ „ÆÖ ÚÁ‡F‹½ï8›$Ý9´ ÉÎ ñ¸7OÊ¢½žæçÞŒ_¦^â^¸—¶§ ÌE ƒœŒÛÇÛLçâï(ï,ÎôÆ µÙ5’º*ø± Æ+°Ó? ¦>Cª%˃ީ'ÎÈ@– ˆ.”í ÔÎå©`É ‹Ó÷(¡JŸ2Ž©+½‚ß5ÿ’†Æ ý¸&ž&Àº †áäD«Ø1ô †+ÐÚ¨½[þ¾ £öHÁ0Œ*%¿F·Gâ ¢=Á4’'ÀÐ Â.¼ñ̶±*¡<Ô”F©#Ž&ûÜË+Öü’=ª›Jï0ã P×KÆKG9” ®à>ð/Õ}ƒªDr±çèß´Eá’¸Î.+)ˆšˆ+ÝCú'–#1î5™E%bŽAäІ}»ºÞçÖ£ ´8®Ê•äÈæñâ"›Ó ç!‰ A]ú̵Ã5¦©Ÿî£â&ùÓü4¾«¾?õŒE’!‡<Øú8¤ ø>ˆ¯¬×P  (×4¿'õ&Á³µÅ„Ž3ßG6œþ9Bæ›ËŸÉG•:’&ØÓÊ™"º#¾*¬? ¤ž-Ô<¿A¯1^‰NÏæúƒ ‚8ˆ#ªÙÑC¹¹+ºØ'½‚=„õ¦áÂQœÙ¿ Õ+£ Ô8üÏ8‰E/ŒÎÂ; ÀÊ'¶Ð‹ M¾4þ±EÚÛÄ*œD¤îx…¦'­ ã?† ‘' &ì߬ÛL™/Å8³)ˆ¿ U,„(Á"‘û4Ô˜³ˆìÿÆ…œ » ;ÄàÀ å°(±£‚3š"¼¶ à¦ñ(¶;¸ÕªŠ—Ê£;~ÿ ]Á)¾¹(ÿ),–†?áªMÔ%¨ß ð ¤GäÅÜ^†‡Œ2²EâåÚIØCÙC¢ “BÑáCÞ+à ‰-‡<„ŠÐÃ7óEÜ2ö2öÿIÚAÑ Ð0•”üÛ@–™+ÔôÙ’0èù—‚ð¬Á ¢ ¿(Ѝ Ù1ÌÌ¥jÄF©)Ï‘EÉÉ=Ö ,ì–!³ ŠA1° ÙšßìЩ ´<ý&¡8ÊL¸¯DÐÈ Ã (ªøæ ‡1èÍ˽3õEcRjºJÍ âB¡+›B€Ò0Ä&ä5Í(…=£wœ¨ÊÆ’:š-@âMÒ åûÀ¢ýHÇ­¦»¢ ΠΑòµ ØLÃ à ¬³)ž¹ þ9þ6îCÍt·êÚ …Ò¯ •>¢£DÁ/øFß6¤$Àÿ5kï?ì!Ó«@‡œ,]Ëî˜9­0€8Ÿ"Ù¢"¦ýþ:ù® Õ³Ì0¶÷E±#ŒDò³JüÖéBÊþïH¦å N²MõØŽF‰'ñ ”+É¿À¥÷¼ý¡2ò&Â$ )ê‡ ™=P¿‚9­Ä»žžô ¶ ɵÛ?ö(öF±M•ã5¡*²4ú å(¡H„øB¶1ñCÚÍà d¨LòCé¶'ã¬ú ”ƒG¼A–=%à&—×)ìëò- Æ ñJ…JÒÿ# ²#=ê&â:ÌFÌ(ñFݺó ï&"¨ ò=𠟹–?á%éÔÿw˜*ÊÍ£*¢1…Ð3¸<è3› ÷'º$´Ú'×Ýè¢Ê¢=… ‰­´È*¹à)U&(ÃÃÙ³ Œ¼ Ë ç ÷'„ Î'ER­œÆ³©í—… %ã® z³°$€—Ëλpç ˯$£Šæ"ƒ  Õƒ ·,¤¹Â µŒ¢8¨(î’‡ ƒ¡/%,Äø*¯Á íã Ä-¡ý*ƒÕJâË(ó€±IÒ £0„˜ ð–*˜ ¶¥“1ÒîF¨"¸ Pü"¸áœ5æöF³ 1 î"2GX¾,’©‹ƒ)øKªG·$È<²Dý9˜Cƒ p˜³û£„*Z™ °ùÞ±¤ŽÝˆµ©Ç¼ Æ " ]NQç'‘cP”­²à ã X .¢úšö‰P¶Û þ Šß¬þHï°ãõ¸ÄåN¶éÐ ¨ý3‡ý:– ¿ßtöû …$òŸ ¦ñ߀&øò‘½#ƒ ¾V¬ï¿¼’&Á ‚ º Úþý!uâ‘ ± Ë´ ï©Y6ÒÑ臑zª £ ß–þˆR \Ì·ñ®#ï–´ó#4ó¯ Ë©-èbSÌIJ ì!"‘¦!"•ôû‰ßÐDÞ "¦†ýQÁ#™ç—¥ª |G!÷ '  ÃÌiÏÆ™ Ìĥȭ³ õ>ÂÔµÅË€í 뜢º4›Ô:¯á–2ÏÛ©ß"¨"»ÿ àlÎÁÖ!Ìž.£Ç€¿Ã»8÷5¿D° ù!¹È È/Ð.ÿ®½>Ÿâœ€ ÍÏŠ ëîç&ªû¨!»™:¡  +åªÆBî•Ù4þ†¤ù ÁÝN¨á0Е° ®—#œ hâ½Ë(ð¯°ïÀbƒ$¶°ž¤Ø&©É#Âò ˆÆÂ‹Ÿ„º«Î¶®É–¨D°‰+[ë$Ê’ãMïÌ £ó»‚¨’Ö)=¹ æ‰ÁÌ-‡`§f툉Â:þÐ-Ý-—;î3ÍÛ>­–:±:Ÿð£+˜ƒK.$Œ » î+ø=ˆ± ¶ û*çúÝ$•(Yý&Á:*þ"ÿÌû ×>²ÎõA—1âß ‰ëׯ#Ë8%åÈ —+î ¨Ó$0/Ì+Š› $«-ß>ã&aˆ=ý †-‹Ï7ÛÃ0f¼o[â–Œ¾Œ¨ë˼ ±²‡Îâõ Àì"ßÖ ‡É߸“ô{€9×Õ¨°Ì ý°ðä¡Þ…ÖÌ“è ‡‰“â •ò±é&ƒ4Ì34'• ®™Ã›ÀÓ&Öö£²õƒáŒ×Á}¢…Úƒ È è Gô êÑ ´ôÞ!ŠÀ• —œƒÒÜlf˙ޱÛÛ …ì0ô–òÍ Ù Þ‹Åͧ9¹·£ ª3’Ãê =û ƒ£”,ùƒ„$¤Ö¢ä=’=Ô*Å‘†<8µ»”Æ%Í)ô ‰¡!—.†™â„ (9ôó Ëõ,˺ð&¦?c"–ÕGà%½ ‰/ƒ$к,‹&Ê!‹Eà¢êæ …!ûì/›-Ì!Ý%Ì(ØG½-å'Á+;ù'½ð6Ü'ɤ¢_µã1Ø ÌE›Á7•Íçÿ튡.È7ý—¥‡ÓÏ3ùM¼ü$È“Œ‘>šý $øÕþE”16B%4 G£Ã%Ó± †'ñ,ñÅS°3f90c¸¢ÀÆ®Wíà -6eࣚ¼ BõQ™ÐŒ Óðâg ðšª ÖÛ·¥³ž нæ¨dô ³¬µ‚  –¼ˆÒe(Ô ‚‹²› ùHž§Êø ¨ þß™å ¦•  ý€Ù¸zm»£î· ¸V– ¤ÿ ·øƒ ¹ £¦ ¿þ°åǾ˜.¬Ñ Ù† ®>÷ •d£"tôᚠ– ¿ É<» ¦ƒ}˜Ø šµ %fÜ÷»—æTùÉ‚£hñçò·—»&‡åŸCBº`‹ÅÔ °Lñ™1¡àkÓ¹²ž{ªª±Á¥Á ¹Û•XùV+/ö –ûŸ× ÃsD6–Ï •ý €Å Ãç Wù%± ”a°§ì¢·¢À¼ˆ}ÜœÊ Š'Ž‚¨ øÆ%Ö€ °φ²EGaò ÒÊp–iü:K!Î Ž¨•©sö©K¯ÞTD.é ÅÇ!ë¿Æ½÷ÒéÖL×¹©.ˬ鵙 ÿò¡ žY ’€cé8,—¿ SPß5µÕW d¼Tm(Ä— ÈŠ®…?øl+Á’t²§À “òÆäÝ/ìÿNp”Þ®¶F›€âŒ4¥ˆ“Â¶È …I£¤¾äõ#Æ–5ªJ‡³C„ õ-¼/÷À'Úî-Ó ^ì^ì*;Ꜽ«2ð2â›é=CÇÄŽÝ»œÃÀÕ2ý-· ³¼½¢Èêö‚Ò4Ü››Á‰Ìþ ›ä™$»€3ý+еƉ š)›ûæ ¹Ò¬<ñ /ˆ#¯Õ&Ó€û!3 ¬c!¦+ÇÏ-8ú œÿ À$½HÇÔéñG¶@»„/Þ&ÀãÝÁ-ý>ñžÞ ìÐ;Ô…2]¥‡G;÷>†.§Š&éøÜÊÝ/æîÆê# ž¨‚…½ çåŽì,Ý«ƒñ¢þ“Õݰ©þÝÍþ5ÐÖèÊÈ¹Û —…Î •"Þ .†Ô¼†—Ù0´Éå‘ï4¸4)¹–Iš•ÿ™ÓÕÏ©ÃàºÖ –¿ˆŸ ß7Ú¯ÒµhÖO’ƒB– Çwƒ±$*À1Þ.}ÔÕ AJîÝœß¯Š–c—&¾,ª–(¦1¨ÓÓ⢒0øº0¤÷ ¡- ùÖ%‰¿–Ë‹º2ƒý ’Ú†Ì ôòKˆæº· ‰³Å3ä õÊ¢«Dt²Ó ت-I¥<Û)Ø$ã.…<£â¨ £‡%Å‹ Mˆˆ)±¨)”Õ ¦2¬&È ‘ï!bßµã;Ñ:¨7cˆ £JŒÈDo›Þ4°0·FÞL¦”ÜI½3ýG±€@ä£&Ê(ÙG¿-Àé(÷Ø Ž/†<¯™ ™,•GÝ*ÀCÛ˜*ŽäEʦïÐ*Øü»å-½4».΄àM®ý ñ$«1ž È5´Á» Ï;‰%ª&ÿF¥à7ˆ,¿ 8„óQã,& ·oƒ4N-š  B ~3¦S# & WÛ>!Ç) ñ      Å>!š“Þ.²PF¯ñýç‡u´‰lsÿ_èù­Ý‘—‰½§€Jሙ ùœYº™‡"%)(x 0   A! I$4(,$& 8T.^- C¯v  &(+& 4!-;I #.6 75Bf)'}'B38 >I'  ;$9;) S  , )K >1')82)Jƒ S  P¸ "Uƒ< ,u ·*U ‚ q ' ”oÐï"r< ,uü}3"%aamŒ[­K c  &N;Ž` $ (+4;O sJ%øE $Y dqò×'*ˆ¥šYÃ#n´ 4)a² 1.[1X#'NsQ2bý( "ÍÆ Q aq‰ < W Õ h *B_W_ {(Wu'= &RÛ_z0(%l á Š~ ŽË $¬6E€%_Ä   n* &sHë=W²] W„ cL2X $n+ÉMK;bµ k•" Í9 Ë# d$ ;¯ ‹Œ¤( •_ z)´W  [h"22V*JEx û&fh§ ý e+ á,*/ö ‚L $`Ð5“qUV /AMÿx~q#K@SE“a*-tÛâ*ˆ ËOG# á*c‹#-r fbŠNû2BÃ# dTD(,*Y!·“< _"?  3 L4bW,R"XS@r  R  1  >t "2 @ : =@7 ^®)TA  Y‰ $& !5%vf.„¾k3Á!&W /$[ # m4c%A Ý(K?T Z (N—, 0 €FR$FŠ  i9­b"Vf   $d5C"@ p (Y_  5 h©Mâ"k ?˜!™! Q!-bKüeC XEd£  gFjg q&"l @IX¹5U t*Y# 'O,`q"N‚ $'(  XLX S  7™³ lÌ ˆX+þb §æ70Y/à"( %3¬i-4*c  =‹zÌ5& Y1 =ô¯ _:›_‰˜z Í x01X *Q u)aYù.‰ ·OÞjÇL ^Â|‰ "h¼ NP& + ¼ðTc°Ô$>i #> :S w»Z¸,gª 'È&’ ÔTeU ½#b €ÔClh" 6 WdÆ 3XJ3I*aE ›$«( (D 4 .)K•P/P&(tf—€ – ‹° .G"= 4 ˆ# ˆ^©!*,^‰( † !   )x¯i1#4Y l O $ Y‡ ° D  üRÀE)8'›; i@ * kh#*.5XS. a kœt‰R]%R%  &&‘R wo }/2 DO <; Œ\¡ PvLE~‹Wè# Z7¯ —Ž8< 32) ' J† ¯5N+" ³ xz ŽŒZM *0Šæ)®   l B!# 1U 8B~br;GE8f[$% |Tâ+V€8 1Ÿo'#Æ6WU x"›R + b  2)U 7V `˜  »d:Z ¦, &  Q   š™ !y÷© l6«Z , :¡0™(   ãT‘> žq£ L  ö0, ‚ $ !š‹)^    ¨! & T&7Z7 p# $o ~ 9o##$V  [W2è# Ö —  P©°; :©kž5SEˆ,— #ó'œƒc e 7„§!k; F9§@e  ½b „¿Ï%N  H ¨ Z˜0Ï)Ø'§. [ f Z  Š ÂFŒ&  Y *Q+ãK% ! r‹ ži0—!\ Ñd!, -kœŠ‘ C( cRVžƒ W” `ngm "Z€£) \q '(F   . 79 "Xhæ›7u 'ÅA/+DB0Ý#5)8/Yô ù÷#O 3éëvh):E 10&'S0^%,P) Œ²PkŠÌ»\  > 4 tvhô 4 È $( ª þ ‰  "\0 ^Ÿ&4 ' ³*ƒ¨ ´±'†d(ñv„½_ )_A4 ` V6•Þ<”Üc´)†nIû:=Z,# 0evZr b#›t  â] 0H ûgK9K $ '2;>*xY5 +|0˜Ýü—ê ÐAv)6.J eAÇ;r ü.b(¸œJ’ß<“Ç: ­-‰ NÏe Q× ô;%  sÅ·¬ yš"^ (7˜‰æX ™Ù  Yg    ¿ l Iy mp“… 8   Z'›[™ x,O@'\$™I  Î „4 >v –¾Ú] <’š d $ se x å6¥:$P(./a,}JuF & nBj"‚‘Ž  1!% gCNlŽ  1!% d A» §68iŸZ  snƒ çMý  Hu- '‘ [  éšÓ\,\'ƒ$&Çd£  ) ÑW 'ÏŠM 6 žÞF]]v{0Y 4 Z _J'só UãH&GbF } —Unš#. #Œ #‹BA! A{"‹{>yH†µ€+,f õÍ™1 c"D ' #Ò Z ) e/  ~p‡ 4 }#N rXZ/›·k{a`uHL4 y uÉ$ &Ç_%¥ ` .1¸*+»4Š3pÛ &k%uV ;/Qƒ2ó h  5+e;h9  _a^fd $ps w Ì¢„#.W ½óN>TdÇ 2 Š  ŠQjMCc P;Q[‘’!KK w /AP ps\Â''8R ) ' ,ŒÝu Q, ˜:x1* 94" BÙ'c™>Y¸<.—<,$JD]Cn Ns8 5|F9 s;)9 (¯1W+!€ 7ª; + ,&B:U:(V4_d— &27 - V 5Iè„Ý T„ó O7ÄPˆ.)"qÜ#Ÿ ‹0™6N; <Íh 5 ##Ç 0:†‚Ä  À-< 2#±$º!1 ÒKr4Z (%Gwš&(¡ U0 "P­QX gâ-t¹º½!;"J# Mž˜g ^³2 ¯e)h€˜ v†"u#¼!†‘ØZT 8$zùË'=Ã|)ó œ- @b"®O î_WVÅFxþÊó”$«;Çú‰ó6Ë ‡*Nõ†î#¸Û2ι ™ª½,¥¤ù FšÙ#'ï¡ ›÷°%©Ù3è)ÿ.¥ß‰‹Û ©ïÜä-2™-cO«‚G;ÈG;ÀÕ$ö °” ó}4[¶´÷¶4 ø óÆ6›"ôï‚*CÝ @`q¥É—6+• H½ Lä¿g#+0$µ%1½¦•,…— ¸ Ð#•"¹Ò í­ H¶ª |Þ›!#þ§ó³ñ•²,í‡ëò Ì Ä¬'òÞ:¬ × ¡G“ Ãó²­Ï¨ß6í'ÿ"¥!úÊ¡ ¦!úïªs8Uî›9$— òÜ(ÜÕ¿ ”!‘2êˆ !ËA Å&È,ù ÚUÁ.í ‡ƒ7ÝÒ&ëÊ*5…¼RæéµïÝ ÇùHñý9Ò: ø$7;K2/Ç8ü  Ê4̆Ý0¥5ɳêùÄ#þN‡_–Á³9¶.ìå!ÚµÇEñ  ÍEç¸@‡¥#Å:¤‚ %Ðç#€™”Aë2Ž'ö9Ôá;®DÌfû/óÂ'ñ)Ú¦…ž!Ú °So°P¿F†R†!^ú“ßO´&òn·O⋱#Ὄ9ÄŠI’;+áÌü;´òæ—ºéé2ÏÔHÛ7£Ò2ï 8ø¯Ø%,ªš-³4w®ÎÅÒÉ ª¸€"æ ê#‡5¿¹ï ‰·Ü+ÕêavÅ — ô 7ö‘ÿë‘’,þk1Œá!Ò Ð®Å=[ü Ñ™0“)E2«“¶&ÜKÚþÿÈÓ›Ü °4¢9×>ç?ÝK²Ê«E‰ ò„ø÷¡é5§•%ìBæ^çFÈú±Cð;ö#  ù².ò ë.ܤ ™g›"'«1W+¢•,òâ?ŸùÉ1!£? ô%+ „9é ¤ Î@È¡“'Ý 6þ û" a£û e/ù"âã²’$ANÆ›<äÌ ÂDüß<Ÿ v Ò*4î)•>ζ,íACŠÝ4`Œ(ß¾•ñá9V£»:£ƒ¬µ›É± F…"7Í‘ù».Ò®ïãž*K½,Ší‹®Êí!¶9­À‰¨ú>ÛC¾FâHÈDEÍç<·BãFd‡ ž<ݺÝ9Ø2«ÔË ßM¼ ½ äµ”5³¶#Ü •¡ÛüØA¹ò%ò3À&ƒ?è$æK¿íGG¿µÌ)/µ€ ’8iÄÔP Ñûeg7 öé¦Ã p~A õ ö†šd8 ª4YS5O&Ç ‹0¡r»Ó< $ Ó™$™ < $ Ó½ 5äÂJW,¼·T탦  •Ÿ³Âùò¸‹g‚¤J…¶âŽq T4D’æ7Û•÷¡³™f$¡ý)å”-#Ö R  œ‘¸ŒÓW2´ ÿ{—LX¬³ ³šŽkö¨Ð0Òôˆ HI »‹H…', §g®~¥À]âÏ% “kÌGX¿ÕÎ5F¡—Ûúƒ"Y.Q)俲]Ç’ud‹õŠ*¢ ýä>„±µ…Ø“',>ï*šš†Íhäž8;–x9~„mcx™¢Nd¿JãOT Ë¢˜m†6$°å”$Ë_ÝÍ×& ‘ V‘ì¶ì_Ò ëÑ(ʵèD>ÌÐÊ#Û ? ë¨ s ‚꾚Y¥Ü’À"‹Ð–À°¯ ºòO$7ÏçåÜÈ$×Ί«ˆL—þ„E—䂯ó'l8’6È"(]A ”(Š 3–Úm•±.è-' ŒOà›˜:õ ®fÒt~#"í²…®  €Žîoœœ¡ƒ]'‹M&㕟Üç;T¡&†ÝÙÁ ÔÙÞê‰ Ï 0eƒ˜ðŸe«‘ Š(Y ¨%]¬! MUÑ}5&ŒÂ'·¿ÏõíÏ;ëD ‘d…Vìª 3Ù×çûlC: àöÎü šM?Ô‰C3f% O! B$ÞÝ@¾¥æ×JM@5ŠÅ6º…|ÿ<ŠU(>݃¡@+Å~s[ï Ð妉—Ï"  éõ“ %•!¸Cäz" 2Ø L9¿%£æ©¼Ï 8ªÏïF¹œiŒ˜“0È þ áà “[㺠ޯÛ䔃  /,(8$øT‰ªJ}ÊŒ`¹Ylî‘èÊ© Ž¢Y&¬ “-݆$}×Hú¢Wí±.‚@¥j!£rz„º¸5   2 ÎÏÃŽ^xU †Ën˜'Ãî(&S¯þü"5"Ó|‹^ÒÓ߯P«Zë‹åª‰þøËìбªO(ÄÀ6±Q¨žâ‘`ì$/°»£-€ýk Éšˆ Y‰sÁ°;êçÿÀ† ‰A)xgÁЉAËŒÈd¬F$å²öFüBœ;5¸3'ÄôSÏZ”8ŸžÿßΤQ '°-µ K©Š°b @(„8µy2!Ûß5 o…: ·÷ ³áŸÜôòϮ젋¼íï1ª;Çû1ÃÑ’ÈCø#óî Ù5ÝŒZ©‚/ìLëǫ뇥hÂsò…‹“Âs© ®ÝuŸ» ¸£”ë ß¶ž‹Š¨ Ø:Ö¥£² Ûŧ&¦¥Ò…ö"«ÜÞj–Ää  ãï' Žà ¿Éí)°’Öóç ÈÉÃ¥¿„Çñ AÊ¢®ð¥âŽÓ -ö‡ › Ñ éÚ8ŽÝ ˜ü …Ðd¨Oé”· ‘·«~÷åõ°Ÿà „òà}(´Ñ°Ô” • ¤ÞüÉ€sÕ|Ö"¡oÒ„o'ñ—±k©©Æí O‹ëî O‚§ˆÕ:ŒîîÀÁ îû~ùú çg‘Éž¸ÖÛÌý¼•‰„S ôøå ÷ ªè‹ç†”ƒ ÅÏæÓ 3ƒÌ¸×*³ ºGÏNà —ÇÅá&ïqÜö¬³ÌÕ¸ë6‚ª”•sÁ Èúˆö ß ž þ™À ì ÙèË‹T¤ ¾ ñ9¸;÷3‹$Ž(ó 優±¦µ öä¼ï{¯€!§È RÌ¿±+œæÀÝŸÒ!È è&‚»Hõ‡ êŽÙ›µÍ#Óž.¼¥í Å¢€¢ Ø@’*µÀ+’ÄÐ ² ó°Ü&˜ãwÈ ’ž$¤ÚeÑ‚!®C^† þc¼1§9¢;/ÐÇÏÅ"ÖDÎs±õ­ÎÖ2è ì>õ+þ;Ú¦A’ïɷɬÀ·ž'Ÿæµ)Âî„Ùà FÌД=É%®Ñò§œê çÈÀÛ"‡À®á8¨(ê&ùLŸ“B:’H³" 4üI„ãš3³$­¯ÔŽŸØ«<¶CÓ ²"çÐ4ó6Ü2@ à¢'ê÷à&Â8Ó ¯’ 'Ï”@‚=ã´=Ïñš(º “>·/ë•& ‡Ýã!˜ Íσ؞ɸ Ãü þ%æËBž ƒ¢2ÙÌàõªEEž· ´¯>¨¼GÎ15¥HÉ „ +Á «ÿ «0ã=)Û³ ¡ÓˆÇŽñ§#É8ׯ,ë5û ŒöÕô ø,$›Æòì Ö‡ ÐN½ÊÆŠ­Æj;/ù˜ß¶ ôÅÂb!P°*™‹¹³# S'Ø %Œež¶0Ò‘!¾ Š¢°,º®ø7ò8ÞJÞHÇ€ÂÞ0†˜74¼É !ÓÑðJ¢8ð &ïì<·A¹8¨ÇDØ—1…¤@ÒC£ß=ÛE˜¸®DÐMç&šF÷E…¯;š5Ý+úÍFýÒ2î©.ÜŒ¢àÛ $Ì8† üã+ [B.¬›†5 *:2È;ê<½6¯æ;þÛ/ºŸŽ‡6ÖÕ>ÇØë+‹º)˜Œ4±9ª _²3™ ›Qݦ ŒóÛþŠÎ0°ù ÜEó&€Î½Ûõ&º ¾ K ¤¥#±ˆ á<(·;(‘,¨ƒ1“(¸ÉÒî Êm¤7®ïa œµ ! ™ûÎÇÖñ©—Ö#ÜÀ*Öí îª é¬ MY¡p~Ø ´[¢[“ Ĉð é À± +bàÊêª­Ššèª ú ¯S¡• ´)£­ … %W,Œ#·£†Î#º0šÔM(«è¸p½ƒ¥F¢¾3¾ “ – ¤ ˜‰zò …½ ¡ÚÉ!à ³ñƒ¼  É°Õ  æï¹¯èj¼   ±‚×—b—¨÷,  ÄŠ œ ’ ¼¯íˆµ Çë)ìÐ½ß Þ ‘ ¹ì)èé©»ºfDæî!· Øš”8#ãÚº³ Ú„+‚œ¨ … š¥"z™ß‹ lÌ–® ÖÉŒ¢Ä• …íëĉ¼®à Qû—Ëåó™í ›L.ôõ® BÔq¨/U !ešÁ5šÕ µ ¬H »£"ç&É%µï œÜ2®©ŸC«û€Iû*§út¶ø6ö ;âÙÒÁ67ÊÑ,°'ˆ7÷Bú–¨>øý¾+  - WDù !,  " ƒ,í1î »$ì%Ò@ÊÙ ÷ƒ6¬ Ä>)p”äCZgÂø˜P» îŒ3-õoŨ¶…­©·õ€â‘H¢ÑH¥¼/ž3Þ'Ý Š–HÁ"Í<Ó(Za00ëGô3°Eµ!Æ Êæ ͬÙtiçÉ)ž¦7Š8¸á,ö)Ôô0ž-ÔK¤ Ûäúøˆwæî 4«1¤F^ª§Ž$ÿµícÊKNÚæäæŽÈº» ºêΪ  0ÕýâöŒò Âz®³[šJuÒ†÷¹óÖËáÁýü›º Á ´Ëçì§ p´ ¹ó ¬ éũŠ“ Ëì…UÓ £4ìÌî&ìµÑ«ªæ´ ›‚7ô ½Éï ¸•׋ºïŸò/ÜÜ-ª¶ ñÑ Öü¥ }— Ñä —© s矫¡ ݱ¢ èÒ4Xå èÚM³Ó éì¿Éê4™Dß9êú?‡EúâÕ-ßü$ü,—"‚Á8ŒD$¶ ‚ÁAÒ—gü!§¨Fñ"”ª5ˆ ¿µ4“ŶeÌ"‚ ‰ ÊšÉ Î %»23ïDØà(®ƒ(¤ ÊÅ(˜è™ô-Þ Ô5† üEƒ2ôê æ „ ¸&ùEæ"Æ8 ê †5ìÕØ¿ð±£ø ü|­ ·Ì3¢¹Šþ4Û–œ/¨Øí × Èà ¾;ÝÔ%ù5§1등 ‘aî›Î_Žë»…Ù½(ŸØ• VÅÝ ‘ Ê ·•‚ì ‹¼-¾å ó®¼ ¥¸ ²ÞM¦à\‹™ô¿°­¯ ¤ ¥1Ñ1ÿMʬ/ ¤77ã š3…,‹¬¨!–Æ€<· »ÿ!ˆ‡)å¼ ÎÓ¢ ʈ Þ& ½Pñ™¹*݃ÊÑn¦$Üõ†•%™â&¢(¦ºóã;Ž,“FF Ó.M· ƒ(œ5ç 4*¡8Þ©#.ÙI Yó=Ê ½©Õ7›1Í ô)ƒ@ä¯Ä&Ú,ã>6‹ ©fñŽÕ9œ¿ý$—– ³&ÚÆ Œ.Âë+½PôÉ€ ±×›&¼ æC… ;© ç ¹¬ ¾!÷`¦z€ê(¢É¯Î™ªØ¹ bç0îÅþ **€µ&Џ/†ã»¥ë†„³„ ý&¬¤éÖ®†Œª íˆ n˜ü òÓA°/p € Þ"š¶º³þ ëN½È Î »î›ù¿Ù‰Ê ßÇ*üb¢ ݵã"ŽÃ Û î«¬ ÅœÜ$Ò¸Ò΂ Àüª >€+±%YÔõYÕîÄô Í :ó Þ :’ © Šç£#»–°¡˜ É"š»3ôÒ Y4Ø…©·™”Ýš“Úœ—Ч ™ñ»‚ ªÝ¨Ž„Ù¦sëáÿpȱŒ'Ï Å‹ÑEè!½,Ý9Û ×¿àãËDŸó¿­ã½&Ù(è8ô.çR®ŽBüÇÕ Œ.ÏŸK„>ÖHÊ1¬>—$ó‰™F¯EÛ+Þ§· ½½#’ë3—C±K;š+”&‹>Õö ÚÙB«*D‘/ðGÊ!Nà!‰?Äöí'ù0+sÜ¢ÃÖ.³;Õ¶·Ô#¬Ï ¥†¦²#»%¨ŠïÎ¥ÀMÿÇ'çç… «N™«œ*Í"ŸšÍ0ÓÁ ²*—õ þŠö”ÿ±½ºê<Äõ!$ˆ$ì– úØ åË#$Ö!Ü Å@©’²!‚Üõˆæ6Ð4ö¡¡'•˪ç$£,©„JÖ5á/ê8— ®AÅó#þ" )Š/ð- ¥;¾ éI¼>±%í+à ö«£'˜® ¡ ç´> þº6Ü0ã3Ø ±3ç#†?ˆÙ/§.»Cƒ,Òž[þß;uG±ûB•?«8Ê ä’&“ ɨ‰F¡Á< HÍJ#ðE^Á7“ É.ÜKÆ-¼+eÐ<à Ìš1Ò0­ €Ã<"Ÿ–† ¢©C¦FÊ ”†e5#&Û;ä#ÒØà#ÎUà÷¿›CÀ*à AÌû‡>ðÖˆÚ ¨ûèŒÆ#™ øKŠ‘-Ìžá Ÿœ" +®Ïˆý˜”·*šFøþ.éå4šŽ§…;̺ fg¬?Åkè§û”é•,¸± · ±µKÊÿ‡Nçë7XÜXê£$¿Ú*õ› Ä7šµ*_ذIÚ ß2ž¹ <º)™"©,ðaÖD’ »$ JÊÐ:±!þ,å• þ)ˆ Lj“ÿâJ‰#'¼5M‡– ¿‰áüH½?¿<ëµ"¾)ä¶zåáJ¦;Ûß«:‹IÇÖö⎭› ¯ “ ©ÓÃÖ ÆÀ­ó¹Ü!¿‘ í öñ*Ö ¨Èý"ø„ŸvlßÖÛ° 禯«$ĤÌDÆò7ø'"™¡ ×%ÍúÒ €!×*²á´× mƒ9Ö>ÿ$Ù#Œ Á–± øô>½Aï=Ë…!ó:Ä  3Í%Ú&ÉJ£¨ ñ æ*žï6üD‚’® ì0ÏœDŒ@ùÃ.ûM¦ûJé+á”°C‡í‰Ü¡ ©>_êI=àƒ*ÌH”1ž#ØŒ…D©@ É‚#8TÎí'˜Û¼<¬ úï‹™"û™G“0»2Ô3ž¸;«ûá ñ ù8’¼ 4s‹§ TÉ#A¬ ² ‚0@™ì09õ‰ J®0Õ$Ž ­æ!ëG’Ä è%–ù¥  –ÛŸ”"¹ÆŒ íŸ1º'à"Õ€µ#žE݆õ$0&À1§3¶Ö4‘Õ²!£Eã×ÈKî%Ò$™Û ¶ /”/ätµˆ"·%L±»¶1Ýüç“Ç ‰È<Œ#¹4Ø…3ÂÜ%ɶYž §+ì2ÓéÄ/² ÀË5è&Ï&ŒCÌ™ÜC¢ç /ªÈ%•4ã î ™åô{”… &à>¦9ý Ä/y¹*ÆDÌL'ÍÃ(×*íDŸÃ%ÀØGˆ,6))EÐ õ:–† å ÞíõŠ”¦‰ß·òï µlÜ™Å2ŠBƒá4•¢‰àGÛ'ô³8Ô ¡Í Ëß“M¦(‡è… ü æ(µÕê£Hª±&â>Ü…!ì¬K˜/äî³4®Iç¡!›ë?´™ºÌ“.ø.ó‰±2ˆ1Ë!º³¼5¬¨¹EŒÐà ôÁá¢&U‹´ í,æ Ì…¨¨9‹<þà Æ ‰ˆ " &"  -ë ® – Ø åÊœ0¢"6ƺ± Ú Î÷)È00E v }&ƒ±ô Ø£±K&U-»@ Y9èÈ4šœL¤ ï™;«O‡ èÀ™Þ!ì8»’¨0N,œ:¡ ÊÁK”Ç-‡ý¿­$ì‚ûîY’ ‘æñ¢ŽH… ‡Ñ †Š\$’! 3F  Þõ ‚½xÇ•êÍ (ÂË ¶*šˆ¶‚› -r%3g ‚1¦< wÀ˜ÿ%¾œ dšCº‘Ñ _ô Yä—+å¸ã £cÀ ) gý/œ à Ñð~Å­Ñd F ?#8 »âô  ¥ŒÇÒÇ )œþ  Q ÌA ö„L Õªiˆ˜[ * Ô-Î Ù¦ Éþ £    ´ž4    ¢;Ÿc‰ (¬{ê ë& †\žª@£¨³h _ Á" Ãà Ö   ¨  ¾ *†"V(d‡5øØ Œ• n0_ZŠ „ìŒU‡* $4Að¤õ¿Ý ¢Ðᳩ éO^a²¤õlö" –’ã?–ÂSJ š ±ZšUÆØ" ) Ü) ”  ã ¶¹—î °@  § ) Í«ú™¨ ñÜûöþR( æÿä墛¥ 7ž)v¨›È£õ    ‹Þ ‹4F 9& û ¾   ™² ”QçÅ-<¸Ÿ„‰ æ+    ÷š·îî(g¦i çâœÁŽ  Þ [ ۤà V õ™ ›F>),)!-ú ЊÇÙ¼2D¼Éú›ƒ0˜7D¹Â'ø «XU¬à ›ë_<§  ~ ! 5 µµ óf¸-Á’š ‚œ %  ¶ jÁáŒ&S ±#+»"Ï)W$¥«4¿ ©ÕgÜ&/# pö Ù· “ ‰ a  #­ Ÿµ¡{[`Û‡Æ4kŸµ‰»´õÝÊÆ ˜¤Ý)"¦¢ ‰È‰è?φ³.æèú˜ Î íÇ ü ܱxìC;ù ›#‰.ˆ©ËEÆ$ÎIÓ±«<¢“=Î2ïLù6Ã0‡3‹Lû6è*%Ò ¼6»&¯ ÂÌ/µžƒÚ&¾ë,ŸZ¥ Íïà2Ä‹Œ3—ÁE‚ é ½’œ"†5Ü“õ?Ñ#`…Dƒ;8ðÃIÞ+OÙ5º$íï¡0æ ͵JÒí Ðõ¡Î‘— â '˜¨ÉÑý$Å  ‹,¨é)• À ‘ ¥Ý ¥­à ‰ C„à(ø'„ÁDôÁ" «²’À ¾(Ü&C€Î!ƒ~ ð²zÆ3 ˆ×'.æ€ËÐ#ÄQû"ϵ»#Ò Á® Æû˜V— ¿"ï’áæ• Úé¬ ˆ Å–›‚‘ÚÆ5 î… , 3     Ñ¤Þ ð>Àß æQŒ Ý&äøˆ" ãÜI’ÒAÊ"ŽDá0à3¼E’Ùí"—Ã;Å £;ÆÔ-†´ íÿG³Êà—ËD1½ UçÆG•AÙ=Ç1>ã&÷ò½/õ…$¤ãÀD¶2 µ&oËʨE¯B€ørê÷ vä);ž7. á®ñ¦Ò®á³õ â3ú$©5‰ — ”É-‡û§ IPŒ"!¹™ ó ¡ þMýø”™D›4Ø …¢”ÝÕ ß/ƒ²Cן©Êúô"‘º«=™!ÿ–þ £¡" ɳ ö)Ì5 PÚ6É9 ½¶#·Kõ7¡"¨³ Öú?Á!7Ù/´-¦ \·CË9‹8ŽúÂH…1¶IôϪµëH•Fês£G¨´4ùHç ð¦é%ñ3˜ˆó!Éãµ*» 2­8kàF1³èE ˜ÁÒ¹² Þ.Þ"‹£ ¿v2¢‘À±(0·#¨G¡C±#¼¶8Ð!Ó"¯CÂ÷4·@š“$ÐGðD”l±KÄ,R'8ÌGñ@*ʱ4ª(o¿Im»*®áˆ#Ò'â¶ððDï*µ2½ »"Û:Ññ¾Éƒ$ž þ’{ùÌó-è#†ç›'ú¶ðF¡Ä$‚$I†2â2ê Â0’'•ù+«5 ì±)á7ñ-™¶4•;¤&íž © €:•5ÇJÍñÓžEñŸ ÔÉ -«%¸(ÏÚˆ5õÿ2ÒH‚ó:ç Øó>¡ò/Í£#ˆÔ,ÿ ÷½$®/ð¯ÿç ²2©(÷7n½ ½Ö&â ÂÖD‡@×!å Ÿ:¬›õ&õ2Û'·:ÀáÔ¦Ž¶-×£“3´‚3½Ö7"" ¬ÝµÍ3¨•€"ôÞÚ ÍžÇÊ÷ †+é<œC¿á£ÃÚú%(- µ 8¸ ø Êà (”IJ%5˜Û )ÖÆvÿùÃÈÛˆ £-"Já„õÍK͸HPú¸(“üâ%⠯Å Ž*̵¼ ´$‡3«0¢'œ1ù¶â0ŠDü(»äµa¼ÒÖ ˜2Š© ï©íî%þ ™ ëð"Á¢ Ÿú&šº ¡ÇЇ —©—Ð š#¹ ë6Q®0Ø·‡—4„ÜÛ…zΙ&!’ý º†µ7 (¯Ñ ãð!hÎ$»"¡g ¤3Â1܈Iö.ƒÕc ¶)Õ©?E‰/ñ ¦¸® ü7à «4íÉw ³! ãü€Ö £+R*v¯xŽ**Œ³0¼ æGÙ ´3Í4I ¹Ò».씂$Ø Æ ’o¢ˆÃº9õDçJ¿¯4¹J—9ä<Ôñç<å(5ôE‡)åÌGê7é Ð4Œó4ý ¬ mÉ8ðð@ÕD‹/Ü<þNž8ëJãÃþ âMõ7ƒF]Ǻ4ü§+âÈH¢4†.¿"¢(Á;ÌK— È?ñÌHºHß«ŒÜ òGpøHõ+òå!‚=æ5Dççð …5“€Ž»¨Õ­+ß‡Í ¯ÿ. Ý t³–‰›ÿŒ.ˆ,ñHÛ4±ý4·ï<°+¦1‚0‘<¥*¦#ßÛEßá3ìß©Ø'ÄÍ9ÜçÄ-ü  Çœ 1&Ÿû ö*"ÊU¢:¯Ð —¿¤«ð¿Â®%•É·ç õí.7–2ÜK¸<ã' EÖ&ŽCº”5˜FÉâ ­-ûû&ë |†+‹§•Fð‹‰1ž! šÜ1ÝÏCêÄ §òÛð ø¦2L®ùÎ7Ý ó7Õ<è`¬1‚áxž´öòÿ6áµ^—(:‚9ßòÐ º‹,‚(2-üî)€ÖMý§,‰†0 –È-×;ÑÃ-‰¦ñøÜ÷“+‹?ÓÆx£Ç7•%â»ÕL¾%°+½Öê û3™+ ¦"¼%°âÅå3Òœm£8‘1»23'Nè²Êß1…-ÖJ¹H½ÝÓ)ÑE–¤90› ¬Ø<î;¢Â#ò3˜­$¬<æ Ù(é ô2¡Ê2qÓ)£ ÈÔ.«å/­ð»>¬*ð2%øŸ¡.ÊC'éÊ‚Ä>øGµ÷Ô@â$¤ Ás¹“Ü%— ÓY÷—å.І-Úô Ñ>´CXû¸'Ù†AÌH¿ë—·¾À™â%ÿ,„«–¿7…*ù,À¸:¦2­-ù7– Ì4Î(ê«#ú8~ã,¸)Õ ¡#*„EȪ!»þ+àHò-¢°*é³=í­Ú¥Ÿ7ð bç;ÝÅý’ »5ª †‡å,¢·¢–:´ þ‹™ê)µ ” ýý7‘%‡¼€Øü §Þ¿”…Ã¥Û Ñ  ÞÆ.ÕEªÌ壿¨ Í*» ½M€×ª'ðÊ<¿ÅE3ƒ±4ïà*´Gß8dž4¬@¨L ß;3ž)Þï¾)¬BŠ*ׂ èC›CÜ)*Û-¦M °÷Fà Í«Dç>Ós׫µ»¦œ:µ ÊÞÏ üf Ó ©2÷2ËI­E¹Ãœ©ÝìAƒ›!nû®ú—ÑÔÖ9ÕGóú.ˆ ß.§<˜#­÷&û'Þ†¶Õš+‡Ò'ÁMã'w Ã2 ¢ & ‚¢ÈwÕ,ƒ†-«Ø ª)¡­H¡Ðâ*ö3Bó óMÁ15ß¡*bß.}lÇ9ù$Ò¤7ž3âFÅ5œe Ý+‹ÿÀÎ5ª1Ê-¾›Ž$„LzмÇ%À•7Üܱ+ôˆ~'ÑÙê¥}ä ƒÄŒE«•5¯ÄÄ¿JÖ éFVAGJMPS8D;>Í5õ¡Ë¹ê%¦!›ñI‰/µó ÃE§.úDÏCƒ"ìʹEè>p…†´%ó&éŠ'Œµ ×Ê÷²§&ïÌ'üE5ZÃ Í  Ú' ¿#‘ø"Œ9Ç Ô õÅ+ñØË3J³%³ÖŸ'  ÓAÄ'G޾, ® ‘#TÃ3¨÷ $‚@°äJýªëØ&©Œ6ÙKÛ«0…5ñ0ñ#ІÀ%®CBô<†µ¿ §·G† Ö±=òCÂׯà%¥Ž>¯92¤€ÇÈAÎ8ï+Ó.‹°ŽIú/ð¸Ñ•ÝC¥'—®¤Á+¢#°Gñ·³4™ ã ªŸ‡JóÅ“ÄÀÖ ¯¤=¤Ýë!¤;·)Å Œ3–FÿÌ0Ñé  ½y–)¸ß‡¢ èÛ† ¸ê Û š˜âµƒ=¡æ4±ãÐ(Ý 8ü „¥àÉEJú3–ã ø ³éÂuŽáãò#Ú]>â5†½áç£?Žê Ÿ‚  È⸥ø0†–!Ã1©3Ñ®ÞDÏäÉ0­Ý…&µÐ –"¤5Ô&ÀÑ;–‚ Ø&ŠÄ¨òM¼B™ Ë0ÖBŠzÐz«.×’°J£å “\Ý#Ãå(¨<Úž$ÀÒ#è?©F²4óî5Â*üÉ á&ßÒ2èü-é :û"ÇÙõ¦8•Ÿ#ž"Ë%Ø=ϤÆ!À¹&Š ©FïLÅÐ=¥9Ø¡1®!Ò– òÉ åý?› û.žmÅ)¡ò&Òù Ø3.ô ž—ì; §« *³  KÖ*öõJg¯òò¬.÷$2Ú(͆¾Ç4àÐúò5Õ íNÚöô‘!+6 çÛ £€¹#Ü÷ßêÎIçŒbí5Š9Úþð ÖÕ$mÓæžãøü7Å ü‹: ƒöÆ)ì"Œ ˆæ4¸  á†è7‡ú'¬!ö ±“.¶ ‘Ž›Ë+ëϵ-õÌœËC€éô “*ü‘ ¬$¼9¬‡ ÿ Ô$œT ð ½Ð× ï=DŽäÐD•¦¼ªý Ί† ‰)ôS¼š¸“¾ ìþÃç$?$?Á ² Ç´ß>3Î£Û … ™± $×çºAôk¥©Î ³ ³é ð¹®é¡;¡!å#[•£¥ ’•Ÿ­Ë[Ñ<Ê µ=óÚ';-,ˆð‰ê*"† º†A»Mš‰ ¢A²ˆ æÐ' ¼3Ò?¼½ ~滎ìÉRö\hŠ$½ ‡ -€ÊãoÍÄÞÉ™|€9ž Ò] $ˆ³ Šâú2c?Û„Óöñ ôÉ2 ¤É&ï?×øÓ由 c`Ò ¿ òÓ#§ý‹¢˜ Ù°!‘ÈÖÙ*~u¿ÈÜ`aç ÞØqôk ã€áÚ¢¿j! ^‰æËw%½LŸ‚< *ìЈ¤Ä!Íä²ãCÓMé+¨ ϸ«!õ1˯+ \µqý úEãâ" ¨%ßL°#á 7õ ŠÁ ½å<û €Ù*ü¦I¡:˜8ö+·ýD‚GX×/Úå%¾®2ô;ËKÁÁÇÀÄ"ðýF±#ó4þ¯9˜ŽlÕ ½ ¿-Ö9Áê Ž£1“œW•%¥ Ä™("Q¹’„½,—¢Ì×ÒKÿ9çý¨÷ «‘„Íܧ2“ʰŒ þ¼<Á ¹ âFô;ãßäK“0¥‹ ƒŽ#ó YUÒ8H7’KAÞ É#Ü %å’ü¼Ý.‘þ @3k´ßK§.¨€²× é'͘¡…¿+µ Ã#¿Ë3çìBˆMÛ»¡‰¥ Ó=ÙÔ7Â%²2£Ñ ˆ§<Å2ì “ 6ì Øä»1¦8‰¹!ÄV·>®û+ÜG½ › †‘+³Ð-F°ž×3ˆúä ÊÜ®@Â07iå¶îå3Ž-Æï%£KQ%Ö È¸.üÂ Ñ Õ±&Ѧ½)Ð?Ÿ Ù‡@0£0½¿èµ«JºLýÐ ±œþ'Ü‚ ”™È&“šÏ:Ù ¡Å¯-¨8·5¢-÷/5øñʯ¤8æ)ó*¬g¥¦+:îÈ·öŠõ Ç;ò'»0äm¤4èÜ1Å<Üñ2êíÕøºðé õ!šGÆÌŒ%ê>óDÁL®ý : åë#ëÎdŽ,ºÑ Ì1¹7âü‰"ψ/°˜7ØÛàïà –þ­‘èà‚ ¿ÀÓ•”€Ì䵫WU ø›å‚ ʃ ’!Ü åÇLÞ<7Ì2+‰(§.žMšB;V±;ðÊð’Š¥4§ªâ ½š¨0–Ýæ Ñ"¹¿ÿ¡€¦)’#ï?¸ @ªå°D—M¨Í‚M¥›(F ãøÈ¢#KÓö-¢:ƒ+€¥&9y›Œ2©Ÿ5ü”J9” ²;³˜ÀÜ<7Æíš˜Dc ‘3D­Ç ¥jÕ'ÂÆ(÷±ÚÃMŠ8"Ò? ÚCö Î7¶Å!ß«;¥ä +ë8û° ¤4ï  Ÿ3º5Š Ä=Û ¬•9"ÂIûŽˆ)¬¯ !í¥#wÚøç ¬ŒI Æ ‹¢„€«Å(ò¿¤ï(‰ â8¥ÐŠ º¸²¶,Õ#¿ — œ…ŒìRž (ð,eÃ"6Þ_àAº×â!æ´– ø£ ä.ä Û öÇ©ô'¾P6àG¸3µ¦?š0˜CéAÉ "ÈM• „6- ù=¸ø†*8/úݩ٣†±%‹ºõ)ãöÙF­ ³È-Ô ¦Î €-õøŠ§8â9[Û€"¨¶üž$û µ å Õø ¶=¥ü— ¨FÃý ·Ë"+Ç7ß·Ù¶‡±²¾Þ oÕ.V“À1ø,JÓ"c7Þ cÙ †gªÔí1À5ø–³å¶GVÙØë“Á2Óiƒoe¡¼Üú|YÑfUžŒ+êl°m0†’(îu_˜÷6LÄqo(T3¤o—J˜m1 ²¬KÑ´áÿ“ŸË²ù¾¨t6ñ£ÿèÒþ ª0ù6sËá>ÝÿCÂDWÿ€´,Èö àÈ ÑVØ æ Ÿ U•,ÇüÇJ“§§ Û  Ò ¸Ø Í)“¸ Àîò  V°: –S,ĪÕQŽ"Õ Ú ¨ —“, ¸  È Öó¦ ‡È¹à ë ÓÐ(™Å+à àâSã,‹E Ì'­%– í/݆â%• € BÜ?Î5‡¾éæ&ü½Ð鞬 ïÇþ¢!Š0€à<ÖB”ò<¾I¼›E’<é¼4… ²<„ÓË$7 ÙãÍÅ%/Î@Š  Úû;£ž¸#VåîL§Rj&)0ì DÀ™ˆ$Dþ!ª©“A)ÖDZIÛ ýÁв2 ò;ßž«H-0*š‚ –ü7¬4ËÁ ¶HÄ5ïI¶*•ï2… à š!ü ×2èJù¬5ˆ æ-ˆŽJâÅL¶(‘½F”õ3×!º:Þ$¯¤"ò)„«IçÓ9öF¾"0‰=ü Ó ƒH³!¸0Ê-Ç-å æ°ãÚ3Â#ÖÀÿŽ/Ð+¸'Ô¸7žš#·+‹´+¡(¿K°@œH×¢+‹ÌJÖ¹ ®9Ïú$ÜìÐ8Å#É/üýÏÌ¥5Š=­G  ˆEtþ?®˜Êéѽ&ç6¦ ž Õ“,º—@Óº'5µ>¶ RÉD¼ ö2Ï+ßC1¢Ä1ÿ2ƒ…ë#³>ªh€ðŒ Ÿ ­ˆ 'ü*š«"4ÊÆíù$÷ÔDÆ›(¤H®)ù2ÔIÆ ­Ý"J>—°âÀ:²ž1­3Óü&£æä µ Äâ"´@ÂD¡–Eœ±E$ï5óÜê!1òJºÊ Ævèך²ž&ªÁ+äÌ.”l ®/¤ É¢ôØ0/;¬'Šø £9¶µ2Ì·B‘ óF•Û '#Ï:Â×1þ$ª>û7Yª/î;]Ø%‹Qã êÛKâ1¨†?á$Š Û@±2£…ò,¿µ%×IÓ9¶Iâ Ÿ2êI”¦J¬ÐM…«†0ù;Î@ Ó÷  ‹=Üß%•–?§—BŠ@ó Kâ6›ü/ÇÛ)Ë@§¦$²š&ÂCç#ÿÛLè&½®>±?õ%ŸE¿KƲHäÀ ¢Jˆ…#®àè é³Aóë*Ë ‚С(¤àïL÷ è3ÿ |›$’¯Û„ìÿÍ·° ÐÄ$²™ƒ å7ž ÎMÕ)‡¢úGé3ðê%×–"Ú»%’¢Ò"¬'ÔYƒ©J…>ÂL“7ðÈô&Ê2ªã#¾K»Iû3“"3Å 00Hô ñDö<€6# öH¾²Â2Ê®ùë’•I©C³6§ú%Tž ï3,ð³%óÚ Œ‰ÞûÎ.‡ „ØAôHæ½Í©¨&ù º’IG’í¿­2– ¸!÷ý¥ç(vÈ ¬ˆ-ÓÙ"vÌ'õ¼Ì}°‡ Í’8úE²áF”‰ 碔€3Ò[¶ Ê Õ–‘:ÝKè‰ "ø¨ †÷ ±/—f̽IsÿñÁœþÂÝ@´ã0û–Hë’8º*«5Ç ¾”:™ ¨(2Za0—ßé0íF õÿ)ˆ‘E™ Ìô ×é%ÀÑÛâòï… ø‰ŽJÝC°/ÁÊ5£¨ ˜ êåâs¤ ¸çá°Ì%×I Çÿ ¾-ævä7© ñ(Æ©"²#ó ¼·ñ)  Æ*Æ üÃñ „Éê¥=ëB`ñ Í&Äù#É ð+óí £-é±á­"Û÷#Ì¿KÈ#Ñ“2ÐCËG®#š+”'ê ‰#„,µFš%{bƒ õÍ« À©!ü9· à.(ôôÕ)…ÕI»(%ß: ¿%âÖ=ÁçîÑ!¨(î÷õ ¸,¦$Ãø.´“*â.aù×*Û3é® üÊéþáÞ Ä ‰"é Å&˜&˜Âý&‚ ô;Œ áŽ8‚ÿ*Ç’1úñ .£(‰ÏAˆ:•$µ « Ô&Ì+õ˜æ!úKߌþ)ýM§,Ãñœ¶Bö.“œMöCš„šÓ ¹È#Ž>ÝÍÕHá¼ —7‚9çMà ß&…âDØ ¹—È(òì5‡„Œ ,ï O… ›Oð'&è@‡!è â<ê¸ È&±÷ ‘ä®Ó ™ª!½óZñœß» ~% ¹ § ™<¨-¹ÏDþÛ—")¸³8#„ÄþFù‰D{îéC†, 4¾Õ ºO26¿#È0Ûáí!n:ÐKÄ% ÑÈ!n«Oç,™( Î øèKéM›HžB¶ ‚•>¬2£ à(yÅ3‘"ŠžÔ1þ0€Ë0†¯ßJ–Á8¡%Ì/âã(¯/Ý•;‹ðHœØ"~ô»1ó ±1©!Ô8ô-Œø=¯ ›« Ê‹ƒ–5ï:“ Õ ¹Hº%¥IFÛ(£†;Ì#Ø ”LœMÜCøC†ÚM%£;ÿ–óÛ;#£di$ (#Ë ¤4ãCòMæ2ˆûJ%ƒT .9,±y… ½ ¶!ÚA ñ<øE!¤²õƒ‹úúHÍ© ‹ ¤ èõò5€Ý-…%Ò)á © ۗδ¶øŠ¨÷qV¶”ìÚ`È~\ñ¨ôÛ£ˆýùzšü€Ô“Þˆò¥ Š—†ñ¼†_¾±ÿÎØ{ƒÈ †ÈÄ œ¤ƒ—“½þ‡ƒÌ…ÇÒÿ’ѾŒ‹u®ú°´ä ž£ûüãbYøÏó°º ¥ó­'¦ˆØáp˜ÍÈtà oÈä‚™Ô­Ò‡ É ®Ã®›À(г›àäö …”œ{‹îïuß䎽 ¾ó¤·à•¹¸á’¬á ”}¡±šãx€±çºoöÕûÀ²Ã⶯äßЇ‚‰Â¹‰…`ò —’ؘÀrùü ˆòÍ¡†R˜à¶y·Î…© Íéé¦ ‹Øƒ|† Æì –™ø±š]{¯Tž‰x‘å –½™€g}ZÜ–ŒÁ¸áásÕ¾°¨‹Ž¡Á z¸Øo╇kƒ „˜¤‹†cçÖ縼ʎ⹵¡ ñV±ÞÌìóô Ž'…8qÑ ç €Íò’¤ÆÒ¯ »¢ µÒD§:½;Õ±!ä9Œ1œ)ï/ûž&±À“Á&ÚÈ:ÏMö÷ý‰>±Ó h¤¶ÁA´ZÉ ˆ¾1#Ý3“ Åä —4¿(¥3´Ž$ƒ"¡.ŽÌDõ›°C†&ë ½)‚$ô8±Çš$‘%£Ú8‚´=>;Ìû¿ÿD†1‹ Ö¾+û ”Çø"¥2²>»Mò«8©õý'·ˆ+¨Ùˆê)¦9¸õÂ*ÿ¼ã>õLª>›=† 0ì Ä$õÝJ«”ñ¨*ÂuÇG1¬ z] ìIç…6”JêÇ!Ë6{Àwœ%©· œ˜ø:å ß;;Ã;Þÿ9‚™÷ GÏÌÛ´Ššà ³1£8„ÐàÂ4êÕ, ‚@Ë Ã@þ”÷ Èõ!Ð4ðð†ò7vÞzšH8®Ô<¢€N¾:å8“Ò6Ã#0³ »ò—2å’ Ê€¤ ˆÓ ñŸ ¶!ú ÿ“y‹¬0üÉÜâ€òn³ìUÈý:ŽßúÑÏl ¢ ÆÊ”˜å Í œ±'¤¦¿ üÆÄþü-ß Ïáh£qã *Ôù), V ™÷æõÃß(ÈäåÍ$1`ôD¤ "÷v¶¯’áûÅK Çš¿ðš#Áš —Æ³9½ ‹ µÂ:  ÁD,³" °ÅKå&¤+Ø4÷Ñ þÇ»ÂÀú88†—£&ÿ–’9N"21Áכ齷 ¡*ù)µ0ð¹ÏÛ÷¶‰–ÿ §ŒýÒ ñ8ú*• ö=’IWŠÿ=åª îÊ ¡úÍÑ ™ô 9=Œ á0f]k ¯ÁÒJÓ$õô ó ‘Kä/ø†'Å1ÅÀFßCŒ+Ù3ú4¦‰¬Hr £}Ž‹<–IáBô¾4“=A‡ ‡+ko(‰ÊCkô8›+胔Þ4°CÕ+ßå8´ œ¬!¬%ÀMí (7¸¿ÊïªCýáÖÊÓ „ÂCÝ/­+‹» “µÎ0±Ã‡ Ò– ³D¢Î$Jà “ Ë4…*†îȉǦ•§ ÞæË«DRÉ´ àŒ æð3ÈŒ$íº ¬˜ªBÉEç†IÁ4°Ö(½:¥&š=ê+‹Ö÷ó Êô-ŠL±9Ð+L¥"Û±ÿÞ;ÓöÜ2™å;vø­£ý<ÂHÆF¬>Ù ¦ÖCÛÌ-’#£0‡Ýƒ ñ<ø¾/Ťà…GÞ"¬ÁÓ'Í;Ø5ÇÀ •ò%<æ;ì÷/å°GHŽ)® èAž7»é-·(í$ç7Û î Ïá$Á _ÂM¨‚6ù´LÕ$÷I½)¶ Öì¾5Ø)ó¢,‰ú#«Dþ°àÇ ›…B'R÷ ö ïÏÄ.á;©$ÿ’&Ŧ#õ õ@‘ ›LÖ³ üñBû'‰ þ7¢*þ-“> ì1è?þ½±7Î6¾ãKœ-þî=—8Í#¨BÀGº¦F¡ Çš°IŽ7÷ŽË<› º0ü÷ •7Í&øƒ%ý©@#´ø™Æ”¢þÊ2ð¤ÄÜ ¯,Ì¢&Á ƒÀì8çLäíÈ)Š " ÿ%Ìô5óHüÉ ‰›-Ñ Óö‘ù õÅ8"þ2øÊÁ>ÅÉ;íGƧÜJ²C‡ªñ Ù ®ü‡LÝ2½ ꉈ› ôæ%Õû Ø*ÛÍH ž9'Àí Õ8å‰ç¬"Û¼ "ê ÿ¹#ö×[å¶ þî-ë¯=@O‘‰'ªÛÞ ™ åÈ:°Ñ³!ýÁù¡Ô<Ò‹èë’)…EÌ@])‘#› È7A “«ó’– ã¿ º7šE®ù)ï¡´)ÄJúEÉ?é¹4Çü4³B³G€0ú!Ä”M…K§1žày¢&Ü3y‰¡ Ž °Ÿ‰4õ&º¼Êÿ ÷dëL÷°¶¬.Ô<»Ñ¶ö.ÚíûâØ€4¨è/ñ ½D„!Þ8¡Aʾ ÿ »ì(µøÆ“|š0ÌóC ° C³òîþ8ö–®‚õâ ÕÖÈ ´@]ÜÎì  Ìh죢 …ƦA‚1ã9ÚÊ/»BL"ƒ0¦Eç+à!¯;ÔC¡(ÀŒCƒŠ¿˜$0—ŸííBzÇ ù)Â*0ß鉛ΰ,…-Æ{’ Æ3ÿèŽë!ÖåAü)®'_Ú@–.Ê…3á7²FJÍØ@–.Í<¦*Å”D‡.Û ÐŠæ¿¯€«È¯Cš•à ¹Ð Ûˆþɰ:ý ¹5å#ÄÜ¥áä»” ʾ'÷»Ãš» Ê Þíˆ&¦4¦Ÿ«ý÷*å[Â'Ö©D†Ûﱆٞœ ¡D• æ £?®Ÿýÿ,8I¤:“*Ö º yð4ãÁš™)ŽÁ‹‘*¡œ>Ã3´3Âü*Äâþ´ Ã9q«×G“<ã2Ž?ë µGàC™ Þ­?ÆÖ!¨ ³³@œ›/耈k „9§8éšÁæ¢ýÂ#¡VáMªHgjåæÃýI,#ƒÅÅŸH4EÔ7¾!¡2õºIàAaÐ*G¼F*S†èô¥óÚˆ®Ü †‚3á12ø¨Œ#âøE$àÓ ÃL…Õ&¤¼öÙ«AÜæ¦!·4ü8UÚî–Ë ¯.›¿<ûÏ9š‚ ½<þG¨*® ª;€ ÷Í=—5È#®‘+®æ0š>9„"©ÚEÊ ':NÎ/ž@×&ÀøCÌAŠ­ƒÑ” '&K¡š¤Ü7à8§GŸÏ1‡<Ý2V—DÙJÃKŸ‡1¢$¡.Ç1 ºM0–Kѹ¯Î*‰©$½íÀªEô.¼9’š$‰8­G§±"¬?…0åÒ,þ&Àö,„(¿¦.Ù/¿+Œ²‹²²„$ø7ïì þAîBÁGÊã Å©9¯7«÷üAÀƃ%¡ ŽÉBž ‚$Jà ‚ ¨ùKõ ÿÀ Êÿø¿öí!²%Œä8ßÍ)Ž‘AÈ ?Q˃Ù×úê0Ñö É8î ¦úD¨HŸž1ã0 õ å*ÁHæ®”Ç2;½ž©1®3!ôFÜŽ/}è'æF•2ÑõLê-„3öM¢0lÑ0ï>7î;ˆØ6‘~¿©å§ » Þ5‹š„+ËM1»JáCÿÔ°'À‘Fe°Fš ú#¡5ã¯)¢ ‡-…Š5î·™(å± ›¢1ž1ä,‡?¿6™· çæ#éF-Á  M‹GÑÿDù*E{›(÷$Û#‰Ë†'ÀÇ0çCÉ÷6ì â8ã7ë?à ¦‹ »F°(²å&‰ ¡ õ3ããAþ*ÐEë=ßA½‡,Ī.¬=ƒ:ô:¾ã(•ë6»&† 1hÎKü3¿)é¢9Q¦<Ïñ*Ã’—7¥ ŽÅ>Ãú¥§DÅÝ5 ¸ÏLãGÕFê³ ÉC”êÕ©³)åJã.•$…î5ÏÙ1!橯;ø9Ú+ ê ½µàÀÇ€2š j¢Œ9¨ŠÃ)ʾ¾óîåG®—=œ‘D¹?ì§2€ •»è# ½Š•@«»+í¥Ä3㇄ë%‘Bé „ý3í£7¶AÚ/û0¤3ò̸¦!ì*צðH¹"Q¬£ó1¼3Ýš†*èÛE›@¨J­¨0ô2ù*• V¸,'˜!£’IùF¿è÷2Òú/†M€ç,˜Ž…5ÞJî<©…Ó•å¤Ió<™(õG6Ò è;†ø†Ó9Î>Ü;þž<О@à è@ËÍ ‚>ž)UÁ‰"̱ق"Š+‰DÙ*Ýã Ç 8ÀE"µE³1˜äÿ=†û…Ù’ ›ª%åHîѰMÈ*=Õ ® Ü5ô÷Ú¾;Ç øôÿ:‰> Ž÷¶9‚-‰%ÊM°!‰$Ã<Î.È.Ý=ê( ß$§&–€ÙëÅ-ä;¹C¾4Áñ-ÍBCä1í%Ҏ̧ì¶Ò‹*™ ¿E€H¦†öKôîHÖ"~væ»<þÒ8Ä¥úÒ.9uŒ¦’ÎÒIñæ`Æß¾›3·:·áÜ œ4äÁ)Uæ?œµ¬ÔþÞ5"Ú±$É-²ý ™Ø ¨ºµ É €«*{ G/¦û£ ¼$Þ?Ž25üD3ƒ>¾ Õª‹„ îNÈeãÅü ”ϦŒÑŸÕ •LŠÂâ„Ð Ó Þ¨@aúñÏ#«#¨( !˳93‘)’…¬ Ç"ü” ‹„Ý·,ì>¼‹’×Î æ ÙØ'ß › ÙÄÍ%±Ù¦˜3Õj¿¾1¥È“džÞðˆ!ƒ9«l¨ï,B¼B½$y´J¤fÍ €º‹$·&Ö© Š ¸ Ã$©÷>ä„·"ŸÐ&÷*œšÝè¶Ð µ(»98ÿ0œ,‰š¹+”ø¿Åç,†å?¿=ÜK÷"´ À Ê$x¡8Ÿï€¾FÏ%ø%<î!“A•?Ü.û7’,Ç"­ÌL¼G žÃ<€@¬û!©¥2¬½™<ƒ8ÉIÜ ˜šË(òûþ'”/¾C%*“#¢è6Î6› cß+«Ó?£Œ6€<Áï«4üÕ  -åc†.p˜1Á ¯ö>Ð1€-ò¬ì,‹ú7(ý-‘ûø+ªL !Ç$‡E¤°­GäòÞü"¶HÁæ-À*«+¢áEê)Ú³* ž-±–ýœ2ÕIÐ4‰3× ¬?¼À>¡ü¯Þ¤³,¬5Ä -Ñä8©DÝ:»'ÍAÂ#¶“º5‰ Ì"Ì#ü2ÇÈý²Cæô‡Îï%‚2ŒàF¥›® ©;Ë‹9‚,]f§)ˆÎ™Ï ¯9åÀ2âf - *D½èåå íŽ5² I×´þ õž šé æ"öÍCü­ ÷(æfÞÁàœÀPºÄ Íú»",¸ùE,4+œ<›á!•"÷ÌB éÆ(š$°$í/Øñ? ÷:ïHÉ-½>Ì0}ê@†Nþ"ÀÈ©¬KÇ6R" €«ùõ*) ³H¤JÛ8·)Ä ¾‡ + ô)‡)? .6bÐE þ£xÆ4J"•Ñè8ŒÞIø8£-_¨ß€L´FÆ)Ø2®D@…CÚ&Î3»½9ÍKº ߇ó§ÖÝ"2ÙHÉù"ì1·>£‚¯2œ À B§0Ë Øª2ö!ã+SãŠû’*ùðá’2Ê+lŠ,+:Ü8•1ÿã“9Þ´ µ ý8&—Iø«$ý ÃC§ ” Ó0¼Ü½”±AÆ$‡;Ç5ÆüM„@™!²=á2¼D®û½ ì« æC„Ž"ø± Ü&Ú•;ž2Ž$” ¨5ˆ È©°4Y‚+É%È0ÕÜJ¾8ÅÙ…õ ëæ%¬Ö?ÀA¦ó¢¬EÕ.È#þÿFÓIÜ Û<þ°¥%ÐKž9¿ ©¼Ø2•=%•5¾#®©AÚÇBž â.ÿº DeÀ4è/ÌÖ8—ŒKÈ9ƒÐ5í,ëµ›TèDܬÖ÷Lñ7¿>Ï!»»ïÒÁÚ Ê¥/·!âCŒ) Õµ>¡)Œþ ¡è'ÄBð¿;¦7‘Ý1رF¿0ö7ª3›ÞìŒéÇ ò7· }—9Œ-¢[Œå¶Í Ñß ›4œÞæ¨Ðï …ý‹Õ2Ó Õ;ÿÂ+•ò@Ç ê® ã/â¶þò5êûðG‰7À!—1Þä,¥$ÿÖg™à…Â ï¢ ë nŸú‚ð±*ÆÃ$˜ °!çñê™$ƒBÌÍ6»BŠ´L‚‰+‚”:ë#ÄÀ¨)ÐÇÍ$ ¹˜-ƒ,žÂ£*Ü#ø:¸;Æ+–G~ê<Õ`†¹+·,¬Ý«#Vʱ5ˆ Ó–©ƒ=Ð Þ ½,¶—›0û›3´3ä2êš[¡ö<·Ï%ÀµHÃ!ó ‰–!‚3üKêM¼(˜œöYê ±ŸC¢( ¼¶¡K´£@‰Aê¾¥)ô#á *„'èEƒF‹ÿO¬/—0Ã;Í4ÍÅ:ð:É=Â9þ6Š0ƱEå@‘™‚›ï¾Ç¯Fƒ ºŠUêB£!ˆ ÍM¾#V#†+É;Ÿ0˜(ô ƒ ˆµˆ@ÔCüµ# äEþ*Í$ÙÚ=å8¶¬3ûDŠÜ½JÚ0ÕEÙ4’Ç ®ìĺ*ƒ ¯,øH×*¾2†®å$(ø5ú7@¿ @+”¹Ž€ö ˆ"¤¬4Ì $¯!¸0™ è«éêà›MÀ#ÔäK‚9‚ü1‰Ü9lòÑ2ùþ1ü  ÆLŸ1š ë@¶0Ž!Æ‘FÕœH±4Þ»GÒ>Ǫ7ÜË!¾ ¬E沆݃-Á%ïÓ/͹ à #Ü,ÃG\ÁØ ö“$ø+·êÎ)ß-Û#ÂFÃç ½/» ²ù 'À°Óú1Ò@‘A#Žúà— ‡ŽŽüë ¹)ÜEö›GãßÈÆ ƒÿ:ÙªæòXw¹'÷û0û ?á9 “àLЏ :Ú1媕 æ'ŒÕ¨5¬éÈ1Ï9=Ã;°,¬.³Lý€‹ Õ&Ë#욃 •ÙõÆß ßÈ ÷IÚaã¶Ö2'°ü ¡ ëH6<ö !6 ÿ Ê µ‰ K7£[,²å÷=åàž!²îîÉ ÷ï#Ñ$§,½Iä.$BÖ %Ø ª ÁÛ5µA2íÒûEBíè ¶ •ˆÔ;‡ ÿ9/Ò+‹û úA"×®6ããF´9¤9Ì2À^ ™,„0 굊Bï1 FãI¤Ë ï²"™ÕÛL¹*“ ÚÞ…#Ž#ð:#‚Ë É>Æ—â&† ¢âvÛ4­ -ÖL³<­ …ú/‹@‰ ú2¦%À§Ö«+¶B½å¦K— æ ù0©Ù)îC ÅùðDÅM^#É$Íêþ½9Ë øDüEÒ@×Ë §"Æ'ÀÈ+tñ¦Ð¨êJ׋š9‹)僩)÷9·¾3Ø(¾°ï6“‘*ÇI™ÿã"—'…%µ+¸Í;£/£Ù#Ï=²›Î–ê‚è ñÝ #5ÖûË2'õƒO î Ëø&¼L‹€¾ Žb«`ì8¥â“ Úä —\ ›3$£Ò!£,N§–=îÑ>ï*› "Û®† ºÂáê*'n‰ç>#ï/‘â ©Ô `¡ùì5ÅJ™$6iÒ(¦4§3&úÃ$€âLÑÚ­%ÔBØî·ÝK¯¥K’J½+ô—§8Bð´A·!‚ƒ„ƒa`×Áƒ,›2⫚;æü*¨ ‚ ×%· ”"¡€›2±ÚM®5'ÙÉ2¦3✬3„8|¼˜Í´#ÌDQ÷ì™)úI–Õ¨%$ÛÃý ¨M‰ •ž‹.›#Ñ´ ô%šHûIÜ8†°¶>Ÿ5w¢•¯4‚ñ>ÖHž…šƒ†™ó>Ûÿ0îõ¼)f˜1æÖŒ®:(:’"«¯îÊ’ Âç” °ãˆ>‡œB„=Ý+ÀCž$íÝ øµ0*Ÿ2¿Eã‰ç:²#hClŸg~ˆzKD# JK,¨b…d$&%î*ˆ6‘KD# JK,Y”5"˜7c=P h\)K2ñt4yº›$ZŽ…'™$Û6UiaPÔ‹ô¥T#…:(&15›*ÈF´<ñg?;J!ËëÕt(yØ,yB.z·FI2ŽJIl#Ž#w&€ M4hl&a\#](^j! Ç('̓iez,H&=ZHX*c']!!|«_Ô-Eo''÷]>'L‘´ŸEEB'¦2¹{":k&^„±˜m=ùA©(fr9ÇŠ4%m [+1Ï$ 0sÝ$ .Â^%$F+#ÕHòw_w(¯,WÄ£RK")/çtMŒ´}_2^£ð "e8%¤y<HSH6< 'p [# K€©Y#¬H<„;&!&T2#&(&(& ;/q† 1?pK´<#$M4)9‰ U4 &[9D}#4HÖ$ -w#1š:&u4  G4:$$.j- f…)^rE/ 7&¡Nz|Ip"<K,)'/%$,±`G;nÊ-D†&)Ÿ@! Ð¥”'2]cT6,7žXFh,k.—æù V½:‡ÐeJ#S' } ]˜ °H)Á4¬T;q‡c c>fÂCG*lë >2"="+M>Ih!  ua2sœ P0Žý‘cK—IÙ1'$¶dì )*sžEÁ%ª3`&6$«&r-/þ"‹HQ~ˆ”¹ T§î–èSVgH«k"hó9q[F1DÈR¢–3ŒS agP+% ©BôYS7XYTr×DÇ(-:'H_&pE+Å3 kíMf€9124! ² NBbö5 ÎD6F([< /!E"v3–2)Le 0:‘ô¯¤'6¤?xWN7 9‡f‹’¡rTnw¶tOH‚†$BaMÍú´ ""1‰7"R~&HJ~G:Eˆx•´(Tº7,i  '!Y4§W0kt\-*<p'¶ B&$ƒ>‰1*-Ò)lŒ"#<3##_;'&!  P"J' Æ"~W%Ênq V=c4#UFä;"c( $ åFb!)=.†!_4`¬\YÙbD"]w$: "{X-5!l‡t2]?L!BŒ3ôiçh*à'—`*].hi=8|]fhF‡@¥H¤r=~@`Ši&ð"ê P.d(lDl$"e *k:T "bEèAH"”>HoR2!q!P5s8Ë¥ÂDÉaMí87`)Ýš“ .%(f:2J{ Wl¡.vÒa"`w''bD ï?É .%(f‰?އI«GX\9 !yL]5E&r'D B#F9$r¥‹~#>#L/d@ecâ†V/F5u¡n=bh''g$};á#C"Ñoq:D<¸ 4 9!f5op$f9ÛÜN>–"ÀX4x:B–C3eh`@=„'[)l9:u_µê9—®Ü0{ˆù*Ö±\N„&kƵVD'.€#šØ8‡7Äe.ç|eð&6VH5G²"_)F0¬US]%ÆÕõ»Ÿ»2y‰Ê'H.ð0Hm7÷‚Cw,WŽV/Š'9D<"–…°8è*ˆŽOj¹V), &¶ )nX@O¿)$W+4N#©4"8&0+Ha*OapÖyA½amxAÉ'†,KS9Q!Y mâ80S8(%?V~§ }I$¶gb*9YQá¤wc+H84‹"uWj6o+$'5‘¼D'M)k(~% œc±HZ# 1¶6 LxG²X<4Ko˜ª#Z >Q i”x$uo—ú$ØÉk&@O&:ŠW ¦!™Ð"{8692!³2l=T‡¼‰7~IÄSëEMV{-#JR’QÁ'AúÒb7 ll({at$Vp›s ,2o""$dEÔE2l- Vk€P')+ý;grW&U#‚;µ G(p Q·±M)0&rò)1TN°îžA8m(NQ à7¦B.1@bl[-!5"e&Bßšx‚ä^ Å'‰ ¢ˆ ]*F$)%$š*"„À–E+{6( |#9_?wHB~R/?EP@J>k9,4N >C‰%a)D+’1"3"&,!`“(zC4 3¯5!"=']7òâ$M3ª•, ".0H\MZ(%øoé¬ '$:(B. |%t/( =,' ŠV[+Gø{2íz-xA$+#P6(@Ò P%>V3Õ<*$6^&>2\Ô7'ã(<2 0 Ø6 •,‡){!7+>q°N!—‹JÒ2þ?‹Fƒúˆ 5a*½†*§j&kÅÔ(7èËu*Ї£w‚+4Ž ‡>be¿IÀ(Ãÿ4±ó.lЗ:î#¨•«ñ ÷èÑýz¢w!„‡(^ ã¹,¯´Dõ æ € öþ¸…)¸Õ7Á÷ sÉÊ“½‰ £µ­Ñ ¥Ô÷·1¹¬ «Ê· àˆ ˜ ³:ï‰ ª ›4Îc+R'5ì“ ¸Ê ´Øß’ƒ&à ” ´ è¤! ð(´÷œ ¸ ° *X “!¤¬Š†™” #2,ú|4!Q  * å§&£ˆ Â!Ù°2›Çê· 8ÆÆ@ŒÓGÚ, ¼õ@½ƒG–*™¬ “ Ó ±À+×›*{°;•ÆQN7à “Ù/  Õ &,.!¦¾·ˆ— ·ËU‡÷ ¢=ê Œ>ˆì.$È/À?“ ˜Öß –ë ô ëÐ áé³ Ë ÆýÙeÃ-7© ™8Úá¬®ë Øá“ §ýåÈÛ #ç%š'Ä-ŠÀ?×’¸ Â¬Ô½"ñ§ ä 7ü£ ç ¤žÎ+ÒäÑʼn§8´ 6ÓK_\îü)›7Ä C¨$¯ · ¨(†Š‘;‹Œî(жGJ³5ùCŽÛ)€Ò´„,Šì ‚/Îã¨<¡×CÀ$èF}l›çJ„Þ2±8À «ÁCÛ0Œ¹‚¬C‘ ­æ„ ô“+ #Û 5¡¼3¸Hà â Ýæ‚ ĹL׸ï¤(í.¸*òCzïÍ2µåCß% ý›Çé®Iõ>Æ âÕ#–Âë*ÅÛ¹Ý%’‡…D¦ ¾<­¤á)⌠¤Œ6—Å>ǖ˯ÁEÐvg‡½ × $¼ º¨šù1€ ƒ ¥ 2¶ù¿ÍŠ £$‚Ô$§€¸ ·Ôá+Œ=¾9© ØÆD”² 2ó/²¬õIæJó„Ç‘Xü5à+¥æÑ–UˆŸ ž­ °n–9¼°²&ÌBëùD“³‹Eà )öù&É–%¿ ŽEÎ&ï>öÑšM¾5“=Ù%Í0Fæ¥D„à²A¸ˆé-´Eà<Ì ©'ÏÛ,þ7¦ì«Õ²LÀâFÆEÄ+åÄ ™7ÿÎ,ŠÂ#å Ð)Â!©ADñ(ã¯>á/ƒEëè&›<‘Jû‰ ”:ÛD³!Â>)ßä/»Oó?$4†ÓGG+›Jç!ÅŒ…I§’Ô´<+A&Þè3Æ»6<ÀÔ Þ@Ùë4Ád½.¿AÕ ¨=ú.Á:¾µ-¾/†ý5‡.dMËEê#úš°e7ªél2È9³Ö Ä+ÿ-{‚‰2Dõ ¨C˜ Ê ÙF¯%÷ÄË;ø®û¶%é3^lx W«ƒ)Ô8¦ ÁÖ¾<Òò ƒüïº ¦%Ã1Í %ˆ à.ý´ì¤IÒ,² Ý%Óí¿ˆ0Î+ÞØâ=øï3Î=ËH¿Ú0çÔ3÷>,Í ’Ü!Ééú½ö¨,ýô4Œ ““ Ï*¹ ,YUµ0ë ä*ÅBŠ®Ærª*)ÔD^©ß9¨áˆ.˜+“‹‡óDoÊ ˆ«,´Ê2ÜÖ ¬2ÿKûƒ#’=¸•FŽ4‚ä-ËÞ2ÉÉõ;‹> ¦£>¡@Ù@›ÿ© ¢ý€ Ë Ø2©–%ê$° -ý‘Ë<˜%©#ã'µL-ŒC‚ ¤* ”¥[óþÊ?‘1œÞ#û M ÏŽ-ˆÙœÌÞ&™’ ” ÄÀ6Ž9CÓ¤ ʧ"ú#/óê¿Ð$ó µãä'ÏÌ%À¨þ(§ ê¬,ë9ë µ7­4æ=¾ÂÃM‚Žœƒ$øM‘ÇÀâ-³Ê«» 䆸+öI½°"šÑØÜ=æDÆ®,”<Ö ½¢…%ÖDû ,âCéFË,‰ „¥°8™÷‘€­âþ °Û˜¢™&Ì ¤.ÀHÔ ¦D™ÊŠ*» G4Lk³ô’°é%ö ó ÿUÅ»á‘ò”¯›ÌŠ ­ „ ÚÑóÊ ªA SÏààÀ2™ ñ« ‚$¯Ê ÆÄ8•¿6›4Ó œ1ð¾7’¤;«Ö¨á7ª7èÃù Ñ ˜ƒÆ’•>£)‹¨*U&Šâ¥ ÉÑ Ð —‰ò¤Å¡…ÿù Èä1®ÌžJÁæ6ò´ ´C $ ÔÊLA6+¾Í¬J²6eá-N),„ï1–2þ"¸,Þt÷ )ìÄ0œ€Cyû²ÚK\¹³Å!·GŠ¢Þ+¹‡&ÀÔÊ9ì È Ó º&Ü ƒÒ ô̶JÂ@ä;„ñ þú‰žÓõ¸%¸Ò<ÆH‘è¥Ë‚(Ä >ÊÌ ¾²Í÷ †$ýJ—C‹˜ÈÉ Å:£Œ°³(ü$ÃCKÜ?Ä@éHÍ ÷Å £%ØIÇ(ô®Fó‚Û9ª3á “:´E¾3Î"Ï$Ç:"Œ Í:‡ð Ê–#ŒN÷%¶µ4ýò“ #V¸(³' -"Ñ@íë–/¯ýò’A·Œè÷°Œï¤Ã,bÐ(¹ëH¸:ÎEº9“HÐ ¢ïÌ.™?–§:§²F“M£*óGÏLßCâ‰KÎ Ê›'¨*Û½æ:'ª! åî!‡ƒÛJÑ»7ƒ7º£çÄ,Å$ú6¼%û+Æ ®'² ÀM²5ˆÁG…FŸ¬û>;Ž?Ç׬5£í3“‰:ñ µ$挙>f 4Äõ!á#” È:<þÉC'•1¬ ç$¸ è%2ÿ ি®¯óßã(®ÃA½El ü]àÂm#ïuÇ· ’ ¼ ø‡ â,Á ˆ€/ƒÝ¹Ð"·ˆã ±† š¸,î›$¨*«¶´‰ · Ê«òë›8ˆ<ŽòÂü&£…/µ¡å#þó‡2°ž ÈºÀó“¡ œAô¿ ‡.ý ôJŠ%Öc殑Ʋ ô3ØL¼7¹¥¬A„3Ö«èB„ç%ÇÒ/‹&±±Ÿ$$€-U"Я :#•&*o´&*n¯3µÒ¯Ù+ëœ0â–ݙǥß*òìÍ Ò.”ôî+Ü%ÿð¶ ¥/€Ç¾ëöÁµ€Ê„ùòÐúž™ÍœöÁ1º+Êúû¡·-°'¿ 6¬=Я¶Ö#âôÆ%Ï#ï .¶ Ã)À Ü Ýô­€·@Šñýн¹¨ â¨ÆÎ¢ Þ MåÊ Ã/œ»7‚0ŽCÞËJ©¦ÙDØ)å6½2ì,ã8ÐB‡°JðCž…ó< … ì*ìEÐ ä?ÕI®(Ã@¿Jþб>ô ×J³Å * °1! ¦q„Õº©%ËǦX ã íƒ F²› § €ù µ æ‹ô" Á¼#&ÄÑ× ½Ö) £¿ ü´Ž DÒ!K¡´!ú þ 舲z÷,†‰Ñ'.æ• ¥.âº#•Ñ ¬ Ï‘ ôrÞ–  ¸ çûø+  Ǻ' „}Ë© á>Üœ’Ž— Ђü®8Ÿâæí † ê>ÀÈ™9Ë QÕ¨g”± Êó#ùº ¸q èà –Oì·Ñ ˆå¡<Š À c­Ÿ ¼"¡%,îÔ´(™™ å¹/°%Ⱦ½Ž­%— %´ï(ä§è«.“š§­ý™-§=ª É9° ú/ú·%ê(‰ >î³ ç„·Ñ Î*†4¹hö2ÞŸ”“ dÓ Î¡íU! ¬%ãæBï§ Ä Ó>¶0tÜA¹8“(–'&â²(R *ª› W"¯ ”!÷ö O±ÞË÷ˆ*%»éàªÿ ¡÷< &4' U‚ö(pê Üf¸$ÎÑ µ ¶ ï2r°Q•î!=á ä  Ò Ð ³ÿ,¾ µ•½{’ ù û•BÉ “  Ì Ü:šX‡üŒšÌ€# Â~»Í –º†¿36 ­!ä÷ ý {å ˜† è?Û X+ßOÀ ‹¡ ÷K(í͉" ƒ‘ € "÷ÖúÊ §‹Ø”µ% Ë "© ¼ïA#,*»ÂÚ'2g‡8ƒ ïîÉ€¢ P™ô õÕ ‚ ‚!¹Óù4‘ÃA«• Hî2®ÑøÉÄÖò!ùñÁßI‹¦æ'ì&ç "x£ ëÌ‹ « *†è‚cí<úƒØ"‚ ÕÒ «*ŽÅÝ '£¢…'ж S¾0ô_ÖŽ/ˆ-œAø1À¿â:ø ã8Þ Ûƒï9¦<ì'á<„ý/Å®HžžçFû¸áå0†*Õ"߆íE¿D¿¨Š&œò‚>Ÿ(›¥)…2ãX±$Õ¡ þ” ­ ž!ÃàÙHÒÅ!m´5Ú ·EŒ¤.¯ÑKŽôå«>À-7úÏšL—-ö1ÛóDï­‚?ª°7è\‹ÒŠÁ&Fíç ¸ò ʼÄ:èK.Ð@Ç5¨A%Þ6›5¨FÛKŽE¹‘3€º"±ÔÁÌ6ê ‰áý&«,/ë’ï5¥´6™«¯ ¿ ‘ Ë(™ÿ Æ;¿„;ˆ¡–ãb,³¬Ä/úMæ.­3<¿ …Qö@«:ç)=Jë!ˆÇL—Ÿ?Õ+“Dû7ä)Iæ8ãò9Ü2µ¥!«>Î …IöòÔû;ÔG¬B”×ב ‡5ý* !UìÒ,º‡#Ã/·†ì¶ ¤(ò ˜ßº,×ÅŽê¬ (‰!ßü +¢¨Ã3¦¾†(°þ7€”;‡#ƒ"|ù è ðaŽ;»  ëÐ Ü© ùòÿ“ å š¡–ƒªí»™!†ÿ¸ã¶»… ä÷ŸÑØZ¥ûÓù*–Eœ  ½À¬FéI¼$³!¸EÒì9ˆÅ€M‹Ÿäx· ‡žÃHžB’%€4—@Ä0¹&¶8ú7•§¤¢4+™¼:âÆÞ/¡ê)ùU›½,Ý ØÏ3Ö ªãFì,Jû7×,‡@å<Úâ(ó“ %½·×€&¨Ó ò ‹+‘5б%ãŠ*"À£¢ŽïÛ€#€å4%äéö*¶Ê-¡&±&"¬ ~&¦ 臇Ò%¶° ð ð‡$²u‰ Ç$%Ô'©)å#¢*#ʼnµ2¹Î!&Ž¥ ™#£@߬ © ¶!C„8æÁÜ5Ž3µAÿ7÷’›7® ½K$ù$ûÿ Þ+ˆEŽÒ4Ö+PZúò»$³GÛýòä·ƒ8ä"Ÿã%¶'¢¢Fû,›>»>ª ¶<ÓÞ!„þÁãŒ1ü+‹– í#™ÍHÛ*Ÿ„,ÛX¡+»Ä½Gª)Ý7ÁÂû(Ü<¾L¾œ.ÏŽ¾èê0ÃÀ$²ºEŒ;ÌÏã$ ¼Jˆ,"´€%–:È/ßù+ø4ô&î ÒÇ+å¦ÌÇ(Œ+^²ÅÙ‹±'ÆöBœH„°1¢õ¤;… Š'×FÛÑ(Ì.œí‰Ó‡%ˆô#×# +$( vŸ  Ä Û Êõ ïE¯"ÿHõ2 ¶Î!Õò-Øã/³%”»Ù‡ø¸,‘’´ð(Ù§¸F” —Þ ¤ Ì ž,˜ú&yòÆ æ¢Ú·¶T’3´¤¬o„½ƒ ¬þgÞ$‹¯ÉH¢# Ô à"¢òÎ ¸$× Èú&Œ,ðÙ¬0à aéåϵ΀¹€ ˜ Ö‚ ±´’¦0ª«ží°úþ )Ÿ%‡ d¿ª ȶ¡Ÿ5‰“ðË¿·&Û ¥‡ý ¦±H“æJ5Ó­”»/ÛFºIÖD‘:&ᣠý!ÕÙ£Î?Ì&úL#ôñ@åäš)3¦îÍ0Óû£ÌCìEÊL©ªDßB°Ôúƒ™Ê(ÓJ½í¤¢<±§´—/È&·ž °£#œÄ èßîâ%ÀÉÍ ôë·:.,ŒÇêGð•‘Ã¥Óß êÛªˆ ëÍ È øCÀ§÷ ‘œéú—ç>Ž¢¼)²±¥.ê š¸‡øòÏ“+¹C”Ë;¢ƒ:Ÿ-ËL¦ …ã /ï)ã¢<ÑK,•–;¿ Äž,õ8ëŠ!õ ˜2ŠÀ2qÆEºB¶ ­¯9¼%ÑE#Ù3ƒó­–I¼!ŒÚ ÐÑI@å#ò2ï.” ¶†ð1ÙÃŽ²J¶”Ž>Ü<­-ú ÞAC*5Ÿ¡ã>Þ¼!«E©#ÝÔÝ.Ñá:è9âÚ;°3±Eú.•/Î%ï Ãù³)€J‹J¾õ,ç éJøFŒ¼ ”áØJܸ­ ,©9ñŠ/Ù´ï*×$éÁ%Ô«Ã>Ññ âAô'ÕòÞ4úý,ꥦñ>¯$ÒÙ¥À Þë@¾þË+œ øA¤4_¾:¥#%&ã@˜>êíB©'¿JÕÚ¸KöIJ+ôè¼³ —&™žŸö Üé.òÞ;·¹ Œÿ¨¬¸;–2½-ß Ø»¾ µö äxŒá2ôœ'Í(Œ¹8ªÔKï¼ ò¼ :@ܹ½1àÈ9•Ép›6Žý™ ˜º.©–ÄL£8Ê@÷2.Ú;숡3«9Š8¤2ŽÚƒJ³7€JÑGNÝ-Ò"J*c¡;<Áðá Ò"Æ—‹m¯”& î³*‘Ü ‚þ²«ÇºúÃÏ*ûþ̽O„CœDŸ&òšÿÏ Ú̮Ñ2³!§,ü 礄ß&®ÜÄÌ3‡„(ùó4¡ ¤ uÈGC¹ K„ë¤;Œ“ë%£,æ!…Ñ:‘%ø)Ÿƒ ýþÜ!Êî.”L™=ß¡0¶'š»+‹¢ÐJͨØWxŒèBxë”É_¯º, ðÑÆÙ#Úš“ÿ ú Í ô ’š O—õ%õ f‰§Ó€ º&ìñ™ ‰ª ù¤¬« Gð• ÏA ðß³Û Þ• ÿ ¯!À ëùÌ ôWÙƒøVÖ °ÂÍ< Þ ÀÖùAÒ(ž¾3 ´¦ùR¿´–‹.Ê÷¦É*Ð`˽èáÓØ„Ÿ?ˆ(Ð&²Hç%À *¹ý† +?à¾>Ó<þÝ5Ïü3ç:ÆÞE¼#Þ7¥›Ú/¢ÔK™½„/(ìŠ úh—*˜ ·÷.ïBËêŒ ï0‹‹ ˆÏ2h¸‰£ ²1 &ɹÁLÍ&Áž-ãF¤*«J¿ ·&« *ÉK®;óÄ%é ð üCÃ@ô ŽFŒÿ !•#<âÅ#©Ò,¥&/ /¾ ¡& ™$˜ ŠH‰“(—&fS¢»T"rʵL÷ó,è19YJî¦ÍÁ5Ï Œ;œ  _Љ0Ø_—0”+:Ñ:—ˆ¨Ó¿à+‘èÄQÐoÐ&ˆ Û!’!ŸÙ ˜£‰  Ûª ùûØ‹#•¬#çŠ>Éû ò!Ð:å%–×Þì=NöM½ Ì5Ü ÷ ˜,º¯*é è(7Ê4L%` p=Œü „ Ã,—Fˆ¡<:Óà½y¦ ú1  Û2Øè]ÿ¿Ù7Ô®½;öyÝL§ú›.»JîŽøøÓò2•M‹2¥)¹œCÉè Í"÷&€;´œš(œ%CÚ 'â/· ´<ã5â,›AÇ›2ú¼#Û(4³Ã ÑòÅÆ) o— òÞ ñ ¶!øJð¸"ÙŒï­>°5ˆ ¡< ;…3Å+ÒHé ã¸EÏØ’‡Âô ‰ï1ÉH£H´¸ »”ÇÃ/ãΑ¨ ʉ¥&Á‚?ÎB‰Œ2¬Dñá­4¬¹ÏCù80P×&ñ#–¤ˆ"û"$³3¯"Ñ$ãK¶G‘B€¦¯ì,ˆ;²;Éë0Ø3Ÿ=Å7ïÀ ó‰$óG¯,Ù#êÕEãÜ §’®$±ûEÇÈ—+‚8¢Dš%7µ² ¬(Ç9¥+£E¯:·?ÉI€CÊGÐ>4œF²'‰4–§›CM’: äBç‘g32>XM‡=†$ ¬++®µ!.ÖEÆ…%É.‘2zã£L»,¯E‡©S&µÉ°&Üà — ‰…cð÷ø!Ã÷; GÎÇʃ $¼š§Ò@GÌ_ÓíŠ qî "„*M0Ž4Ýãæ¨—a¥« ‰á?¬Ó.$eŸC'9Ö˜(›­#› ;Ž Ì¯.óƒÕ)6Z¨­.„ °%§!‘+Cˆ7Š ¶ 9Ĉ €‰?¹²(5Ë' ¡’H¢HŒÉ(ÄHø*‹Ù¦(ç.9ƒ(ä$êÐ2UÎK¢-ë ˜º7ˆH¥:Ê"• è Ô3^¤Fž7³É¦B‰/æõFû#Ñ-“´ –&ø¯®Áü´Ô6²<,@&¥™•4äí.äÒEÈBŒ À ’Iß9¹!¯8¨!… Ï"±ËFŸ,E®J†®S©%ˆLÎH¨0ŸH@ÝK®?ÅÖ¼F†"ãDÐ2í„=ÅKÁˆ j?2§¥æ£ð°EÄ,¦IÌ.§â}€¾2ü6ÔK£$Ù¦Ô!ÆAö—š8 2Ô(ãIþ2…Ž3Ë-ÕÕ7“%¶¶<Â#Ù.ÿˆÐ ˆÐ²#N&ô-°%ì J Ï . ’#Š&·¸!Ú†\ ã N€)þ$ïBí! ‚Ägzù%Ð>Ž'ܺKœMí ²,ƒGû%è·ž¾Ý™¤<¸CÖF¡çÎ;ö3Š Z 3+:‘#qéüä4Û5ó"ÏôÊôŸÞˆ Ê¡FˆNÇ#—&Ÿ#ÿÓý$Ë ï«)ÍŽ ª/¥½>¯<•8é »÷0!Õ#Å*«š¦ ›ƒ'¤†¹'èº3ÝïÔòðØÊ° Â%„ ûD‹9Ô™2œ×:½¿2Ÿ ¼Í5ðIü™ˆï+鮂 ª€F°-Û-‹–œÛ®]¢¥@°ûãß ÜÞØ:ë€,¦ÂžÍ¼,Ü0Ç+¢4›‹ÈË ÷!¾H#Ø%Û#Ý Û",ìý$  'óÑ¢+BÃ-˜ £'€À è Ž#áùê½Ñ '”:(¤Ëÿã+—´¨&¸Ü ÷ªÔƢɠ„ÅÙ¹–÷Ÿ”ÌÍ)ŽØ, (è³;ƒÙ ºˆÜóŸ£©ç ²ø ÷Lž æ$¤!ú*Æë±A—ù7ð'Õ+. Â2ò·Å!»)öVñ 5z“ËCÍ ­Aß³$à.ؤéÎŒÄ)ÏHÏ Ü:â.˜†§?cÕM™•CÜ+‹êø­8Ò1·C±?¯Iâ>ç.§™;ÿ$È¿¼IÙ+ÿÑÓÆ‰Ö*³Þß5šF€¿$²Âë.Œªù"÷øóŒ$ÜÀ(Ë ÕH¾Öó ´…Ö¬‚,‘~ŽÔ0"¾:åî$à6œˆ@“Iô*ãK´ •>æ3© ÿFØ CЀEÈðÇ´¥(X§4…#%²œ9ÅåÂ>®0‰GÇ' ÝÉ@¬*ˆ›5&jm¿ ­+—µA‡©E‘§  ¦ | à‰"ÿ VÅ"=äÞ)8ð3“ š ) ­ W  á7ÖÈ  ù #œ I” ê<ß<£DÇþ&ݹ@ ›î*ÆÌFë1…ø?® #»*+²Éçô½ä €+éó:¤ŸJÈ­ñÍ ƒzÄ›÷?ª4ò$ë 5pýù ú÷&Î*í, Œ ‘.€J€5®ã ¦Ê…*ÒÖ1ÖìJ¨„ý¡ÔÇ ¼ &]CŽÇ Ç ÉpÉÀ½ Œ™éŒ *Á"´#ƒ¸“ ̸/Á\~ú &SZéä°»4Ùš Iã2z2ԠΡÄò§Ô žŸ+Ð:‹<º ̨ Ì™–•mc¢Ó"€í¯ƒŠGfz½Þ#EnY„iý  ‚òáÄ"­ ñ º6~)0£ Éñ~‹ &a5á ¯¦õË öµ*#ªXô(È¡ ű„à$Ù ÷ ±S×ëúDñΘ̨¥Ö LǦ”M&9`Ù°ô—  ­å% ˜ „¡ —}Àqë @ºÇzä e,¶ -kužÏbA"‹åN ..$+AÞj©¦uö†À‰ÓÇ ] å)ÉÌ°ä æ¬$ìB±‹ð>²*•¤(̺¸õ9²A¥'Ð<ÖB”®x¥Êè¶’5Ë6þ"7¾‘ž ü(˜à±'’&6‚+ÒÇü|­¬(²þ¥ ‡Ac½bÖ@&uü$£êÍ….œ™ÿ<ÿ:‚©u§ ×.š3É#™ L÷ÈEª·=ê?Ú Ù:ßLÀ%¦ÀAŠIæ¡G¯ø+â0ö¾"Ž4ûRÃ:ƒ*Û œMŸ9¯.‹G¶4Œ5ê ’ h”;>Ζ@î%]ˆ–ê< !!Þ½I7—è+7— àîë6À9žû r Fä”ô:&‹Š3÷î9®¸—+c¸”+œ’ôœ-kë ªËEÂAæ =!0Ï©1«1¦ö#Ý–&ðá ŒEÍK•A-í ×.›3Î3Í&ó?ÏD–#|«*¥èŠçšàm͹,ºŠ*Ü+ÐKÜÝ1Ã,º¼0Œ#—ç2÷E¬E€,Sª5ÈB(«6Ú=ûEÓà !ŠÅ±GJæCÇ2¼ü¯"ü› ÚÕ+ØMüœ9Ñ0“Œ/ß°;¡+Í ÔõáF–ÇÇÇ-Ú É'j× ™š ¼G›EÓÛ+£F¼˜(ÐMè&Œ¡1ŠF²Þ:¥%µ:Ë#¾Lìó±)‚Å.Ãþ è ä&°«<¥)»&ßÉ­–éI¨LŸµöéî!Ü–ÄáD žŸ2Ù © ô-Áé4µ/ޱ.²@ä#¤êáž8€&+OÝ ’=7Ø(Ï ³Å!¯ °×øú#£X À>%òËdŽ˜œÑ #M‰ÍDÝ!ª¼Ë#ŽÉÑG|ò¶ËÝ ±“Ý ¨Æ$³5Š&Å9ø(õãù ¨)Ô Æ Å Ûè<ˆ:£7*ª·F‚MÓ£4‘Œ$ÑB“ôÀ—®E¥:\oF]%è#41 +‘>Ýà1¹@l -ß2ª%åAŒ@è œ— þ»ü=Â!îŽè “5³9Ö¶!Ï& ¦¨)ž™3°>Œ.ÁŒGÕ&Ÿ@Ô‹ÎLâ-†öŸ@‰>aå#ú¶ À¼–ª(ÂCõ-‚5å‘FYáé“+šM™/Òûä&ˆ#º3ò ‡ ‹¢&¤Á?°0ò—f«£ìò§ï ú¯0ò'û"Ø"¿ßÅ‹±EÐó°>­HëCŒÂÕ ˜• Ö7ð¹ú³2Ë‚Œ ÀÆåñ "²!ªàIå-áâ#×ù>Þ5¯¶/4È0„¹´¥.­âþ © ‡ úᘢ«Mõ,ýšE”îwÈÆJÁM  ãL';,12   "…¢; #ù4 ž"“ 9Z 'ÕM€ öÌ*´pÇê ˆ;Â2ö<þŸ>é*‹ ýðí/Yìò Ò 2ª9ø* ‰$³7‰†6²$'3ÎL&‡3+Ë&èHŽ W¤§7¹™6Å ¼7l˳!Ÿ>ã¡=†ˆO¹Þ ÿ)ŽÒ~7Š3Å4‚徆EÇá<÷ É•€ ´3›˜5ì4™ Ò2‘ ¢è<êIþ”ˆÞÂÊ@ŠQ–Hš«FÕ%ö2¤=¼þH¦JŠö Ñ"Ð2ì\è6Ç/и&ŒÕ§:Æ4¯*ó Òò•Œ‘È †Íˆ"² ¡¥3ìBÍ?•é$¼Ç2¨Ç 7j‡*cv½¥¾,¡ >OØg“ °‘Ÿª(™ÙòÍ©4ÛSÔ2ûE„ Ѫ*¥ ¸›Ä°ô «;Ô=ö̪ª­ Wæ» ›;F™Òòª·7ª ’÷àî½ã—ð õ"è!;÷$ׯ ¦Cøþ/Ã×â;í‡>×C—ÝGß † —”(ºß)ᜯ¿AÀ0ô›2ù*Ê)«?Ž0Â4¶‡Lñ,–ÿüÅ'Å-‰!ç ¤ ¥LžçŒ=“Bõ2«äCù.áMÙ"Ý"Ï èõî(ì â‡U —!ÔH¡‘M:Ž5š ÿJ¨M%Á2w”ñ$›HQš¬+ƒ¶Ú>°6ý½9¢øY™8 ˆ7[+‡4žCþ)ÈCÛÜ5?ê‚« æ:÷?˜††Ü¯0ãÊõMýHÓÆ!Œ;ÛHý-Ò’µÍ ž0¸#ßLðê&Ó ±>¦G— Ã>«¬(­ç:Õ ¨Ú;þ Ž%Ä2Æ:ÐEÕÆ×݃÷$‚.È£"ÑI’@—ÔGÚ»  •&À$õ¨;®· ø‰™² ð@¾K¢ ½HóòŸ"?ì®-¨ô-ÔK®*æ º•8”¯ÅˆÒ:&õëRþä)™!ò} 0 #%)  Õ™,g̈m©Ín¥!Ùª^±¨ì ù Y5’§0ƒ›+:Ф7˜3ÆÀé ƒ&Ó%× •ÿÄ+ÍÈ/º ÂVð$ü¿ ™¼/€•hCž,é‘™&0 a¸º ùè̯(Ü1­@û¶ &‚4<Á¾9<›¥#êF+ÝÔM¶9àD«G*!ò,\ä"“ƒ˜ôG¤µË0Õç:›ÐŸ›$ùéÐ|Ô¦ÆIŠœ¸&¦FÙ9öFµ ³ò'-† ÿ ÔìÀK4Ê, # ž:$Uøíè•1°´¦!á‡>æI³$óùëé §«+9l•=Ñ"‚í&ºž)–ï•;é Ãï—,¦œã-ˆ¹#¬…ÍÜP”ú@ÿ'ª ã$ö¨(¶«¥Ê+mÇ$`¯#H‘&Ÿ‚²UÔ ÚFÃÌâ’@‘Eñ å¸*ìý.ñK4óí,‰N›£*Ø ¬&η#œæí öK0š0¼;Â$º%¿%¡2Ò ¸”¯ä%¦½›ä%šª%È‘H›œ9¯%Ó?ð"£ÌÊöá÷9sçHê!ˆ6BÖ ¢´&Ûò&Àˆ-ÓšÅ'à ¿#ÈLô‡ú!† ¨(±€3Äì( ƒ8æF³ Øè,¯-“¼Ñ(Gìž(øìJ’òã:Í4„”ç+ü²&Eøõ´ §h¢×µ0Dê@Ñâ@Þ>A¤*žçÌÉ`›D‘7] =¤_”9÷Äœ7„ ò‰’Ú=àÐ>¯L±íý‘Ï:Ç3“ÉEšó ÇM½˜w¢%2…"®¦*ì<¾ÞÏ)è™Ô,zŒ>êì¹@ŸåÊ3Òö’)&«-ú=‘†Mè2MñL§J½64± ¨$ï<ö"Õ.{„ mîïÞ8‘ Ò –¥è› ’µ « Ç Â °%'ÊSÝ£3Ž8p¦’æ Š«##ý³=†åë!„ ¹;'´B$]! È9¯¼– í )¡U(+œ#‚¾=>ü úL·æŽ Ò†kÑ8Ç&”„ ®9  N7·€   (l"@ Y  $  ^´  u & %t!éãÑ "J³ D<%S W' ²+Á9§öºeõ2“¥¼ÉË8¥É!U‚ܱ8 B²<ÏGÜ%¦Ð™¨ˆ¦«á'Y EÞG©¤M›ýJ­Œê¸ñ0Þ9$ÝG”Â;ÌÆKÆ÷4Í¡*Œ ÝB1µÅ$Þ2ÒÎF’F=¤ ©š0³6Õ:°»$ É˜;ˆ1›³4œõ4ÍŽóËMã2肯7((ë ‘¤’ ¶» ¹ £%ŒLG¡ŒLGË+tö·ê ÇÃð–µa®Iº&‹¿‚& ² ®Cƒ#©þ#òš-#×4Ž*Õ Ñî)Á=`ƒ@¸†:cÐ@­$Ó;‰ ³EãŽþìŽÎ]¦¥ eí?§‘/Ú»+® Ù#ÖŸ4†º9Ê·Î?™¹ì-‹B…#à"’Ÿ³,¡á¨>Ãç-Î/®Ä3Hk£Lœ8üäQ‡Ì'‰<ä2ÉѨž:“Á2# N£5Ù0…æ ÝŠÛMŒ#‹<ž§KņÆ1Õ‡*Ê5…Ÿ%©ÊªÖ;í*µÕ*…Óží1ë ªß ™âþõú Ò5 € #Ò—/žú!5¨«š3ʲ<à« ”šÿ À$£Ä)ù#b,ßÚ¯"ô1ˆÎÊ;’EÇ©Ò<8ÄÇŸ°)©ó šÑ ÷ Ï) /DË6¨1òýGÝ=ùBÆ%Hó'” > õ$ô(K˜úÿë1Û(·ã7‚šyÍ"Þ³¼ÆˆGhÍö“¨Ö)È ÁIYüL°Ø#¯Ñ‘äõ¬C‚Ø%§+Û7½ê Â$pó$®'çà'(M$­açž°„ š þŸ Å'»‚'ÀÏ,͉üœì¿KÏ)ó»,º¬§1Í•Ÿƒç8?$ÀéâYn¼ q Èö›«1Þ;ÀøAž(ç+:§;* Þ 1Ê0Ÿ=€Æ9ê?®«¶ ²®5ðHܽöc×ÎúÉ ‡úûâ ½™´À …» À к0êIª*¾Åm€Â˜¼šÛ ô ÚßÎ‡î± ˜ÀÕÎêù Íªë¥ ¸9ü¶ÒØCô‡ ƒçâþ󇩱Q"¬¼zG‘ñí Š¨®~¦"‰¬ò“´·ù ïW–$Âl6/٠ǹµ Ô Á ¡ Í‚ ¶ïÄ ½ Ì!òÑ ÄÐ$Œ§ ”׈ š ç¡ j¯ÛóÚÜŠ Éä žØª…Æð÷ǰôñ ¾‚¯‹ßQ³ þø ¾!㢫 ‹«Ëù“ ÁÏ%õ$Žç˜Z@©;$4‘É6h&IÑ„p ›GJõ•- 3\"§&­MÕ !óè š²k˜Ä’Ó'†æ  ÏS‚Í*½ÖŠÅ ±÷ª¦¦',6D 23ö  "þÞ$äL®D¢„tõ}ø¨ÿh àÆ{8˜7š–¬ 2ð¢ôoÕ΂#–/¡25#± Ï–RS”Ä þ·öæ­ …Ð A3ƒ ŽG ¹§Z™Ö¯-Oieß"@…¹;Š4sï)¶“¾ÊJ¯•¡#fÈ`÷­-Íû(/ÛK‹¬´ÝƦf)? § =Á^(ñ± öB ê=ôB œáÑŒ`I+ªê€ ÷=bϤ "L0 *W 8½œ(˜"L -™ mI)[$)d$I). µ\ß›ˆ?¢g“ Ò ùŠ 0HÞŠŽ +: !¨yÎjª¦ûÒí&  =Q «Qd„G¬©Y: P*"Tv¨œ¢ªª¶µ ØM± žË Ž“Ò¦}:N7Î "(r–×ñ«>Žb™À•ßw?`õ Òañ’˜Ì.·-ZH|2#ú[ëøfž¡ X3%ßÎØÒ¡|µ =‹€®ÿ6„é{±°FÜ'„#ÂMÙ q€¾Ü< š*, ®0Ç•1ò|¶ážà«ð´×!H„Òƒ|¤• SŠd¦¶{C|ް>•ŒzФ¯~ñ"5Ï8¨'üÀ¹í­.s ΪFÆ:˜úÛ–( °ì¾”­8„ ƒkž cå”§ÜÞ$ÆÇ*æh þÆ zíöÇu$ õÅ‘ó€‰#  % !*  " 6  3F? ="      "    !?    J   ] ! 8    )) * 0#  ' : $   -  ‡    $¢  "$ (ÎaJ   8%¶(I  `0U r"     8  &[Ãb¿W!ø & ƒ' a"     8  &[^    … V hâ.eðr #! *ó"  /  3 '' ,4[  !‚ jgrNç"U'» x Y,†= [ p   #P#Xå  !–Ô ¸j‰h× r-0!L .z(|$ … m%*V"_O9  %S ZŽZ ß Ù± ; k%X}N   i  S@ )*! O ( SDk o¨‡;jý€'‰   $Q.–q‚ S8) $% ¾ ) ª _Á k   [$ 1p   K(n   á ×&˜~ÉW 3Vn# (V  ª þ3 ¦  ßZ– q  t ¶iv) Yz   -   |p*# )  Ï&}X  g v"P(2{³¿ !Ž `  e + p  #& Ze!!_j ™$ b  h $q' 4$_8#.²P        +b & t   !zD+6? /*  dS.  # ), q | $  +)pu/ , : $´ (6Q  J&>y$ "^)  7r  WT"O   " *{j  %   R  " c3 1%) % ŽS3t ?   p(Y ú C“* ¹ ‘ L%O .)e ?  &Os> j' F'\þ("ÔJÊ / "$ E" ,_)J #.. u<0£ Z3!"" !£ dd O n59=  / U!…$o[ ,#= kE 4*  #,+ "+ Hm / f#P  o"t%#\ #`‹+Õ+Y 2&h Ð  s$tä    , Y%m w'*—z  L`)` & (%_I±%m Žà†’JÚ ¾Î,1ul Ž[ LÄ #d°XçYž dÂ$Vd!l% ˆe \1  i 0 ± •  O_p j À5ˆÊ"  ,Wx &x#-¸)^ Œ Mñ& G&   c I¶1Ö Ë  UU% ,)  &`e3  V&    2 l#Õß 9   1S " W" m.  ; Y M y‰¶ €x²    "  %] 7n/" m–‰ M! )n  †d +QV A a €, 82%¤ "+   q  I/'  ” *E *‘n  +  8)u%l'ƒbc    $'  #*%  Ê&\l  &   k " #&  $2.x6ÄZ"^9 tõjYgO  ` —    9' &  #0¯ !#5   ù Ÿ_' Ì&ïx g'1!\ 3} #"*$Q{kI1#\| 1 ïy%  pa©+  /[`"* zR R/ gYc TL} !\       $      nnex .Q ÉšJC7$' n#ß w    Y Y Á ˆÅ U&L®)   1(q %Ž6· éª OJ"RT     0 T    X!   \  V °V` c    %f¢£Y4$> 26 Y  NdIOWW !Ñ +i l# à § * |ˆ6 -ž  *?3+Üx6% é& gl4Ó|  !£¡ r"   Î w ØZ   b S  gYµ+ 0T U ]0}p0 Ç  V@,m ƒ! –j sÀ! $y   c  x2½" AX  ´T3 &è,Î x  <  $ ©[t \" Mx   &  ^! Š y %Jˆ Ç* W`3»  U0 2   #    Æàpœ \p*/ K $LD’  n*J< ªŽ¨ËS Od7Æ Ê & ' % :  ) 3  S-    ? 7%9 z Q!m §Ù C#ó) ] & ' % €”) ÈI:$+ tzl FN" I)b2&9   i! d"v Íw2 'R–R & Uñ#åX|)…!r# 0—FW 9 P è %  € p<3"#a3!V%(Bs K $j  f)  a‡u& # U ‹W<3 g   " "@   O( ^ \k$Pk Q?Ä# ×,ì £®Œ e  1  h  º¯ g Do d¾*[ A$ )Ê*ˆ7Jÿ ¶ ² W@)¶l 0  * 6Êl •t ¸½Dò _ -w Ññ]!  Ô N6òš|Aà ! tN Œqg)ƒ23/     G    4%OD. <> (* I!, £*. š  ƒ 7=]ˆ¼Ñ T'+Z$ h ‚Nî3G%p  ,   3] ^A}%       q +|ñ#    [    ? j#    ™ [‘"O5Od eê  "?    g"—g (¾d   Xjj  ™qM^  " #>¡S _Q$ ›  ]  Z[Õ/ $ 0† ðJ, ph a Ü ^†*'dB R™h&$B      u_ º     !  %   N   ÇL f) K$  .¾'m Ä ¶ý      "  „s  Z  P%  Qj  1Q#      T2µ Fß)2   A; I­Ì&% $ì·l Ÿ Y }# rVn tƒC‡(: sí   € +r% {` *L  '¸ ' u " WfV&ŒS.)!t J ‚Â1‰(Z 8U 9j i×  W ´ * ¦g 5wM 2174 ij' &€ !! "'  O±  ª &,o0 (   $"%_!¤ *C   C`    ,#  PB+G''^ N      s2, ")# c Ÿ,UÔ`   – mu S) } i#  K f#,.Q  q %         t  (   *-&*‡  # % låY>¥&} 9  &*-U %ç    [;   q 81«   ” F   —C  ;[,j  9!   " ^¡ m §#& 1 Ú#õ W  ~  {˜† .S ½)“ ]ž0ŠÛ Ç>,Þ‚o ê ·-a " ô-OcØKÊ[Œ“Œ × Gy½ ÛÏ’ù/¹¶¹5ý…Î +Ž ‘ÖÂýŒé · ¥ ª„ §º >9ÇÄÉ&ÉuÑ ®Â† 'èæ –$”Ø d•ÿ#”V |Ÿ¸² Ö†ù2Ô¤ã¤Ó”:è|ý Ôšð´ ôÍÙþÛ Ó ëÃô”óÕ$œ±£ð„ `UÕ #ê‰ ‘ë ¡ U ” ƒÂ!:üæˆÚÒ#àË £µ ¶ é º —®fÇ%“ š÷È g•ø€63¥³ ð„ Í Ó¢ —áÆ0…¤» ß&ò!ìKòÒú6®4ü©Á ×8² ‹¨ÚŒè­‚¢’D•IÛÕ'õó@òFß9®ëM«—ï’¸ ¯3–݇+¼»/í'ý ¾ì-¸é,š–¼â¶,Ô4Ò-ÖG¤ÄøÙæ ¬)¨3…G¹º›åÀ¢Ýµ’ãà º åŒöñ2˜L†Ñ ᇠøà ¤ªèˆJä ‚¢åÝ2› ÒÏ̱ø «Ž!Ç'ï¿­ã ¾%ïõ*­ƒ™åŽë%÷֒Ѐ&È Õ²9¯kÐ 5Ú¯n“«‡´&ÜÇ -ü;åÎ(‚À‰éIĆ<?‚3–}(d8à¾D}܆ë"éŸ/K…ˆ’ Û${‘ ‚"Þž !¸Ñ¶ø   Ö—{ü# ‡"ÖßÒ̽É.† ‰ ù!ø©ÜÞ/‘Ý › ›³¸}ä‘:Ó è‹ ñ$œžÈFu°ÈFu¨ãñ ½Í›(õ¼ ýÌ $ë«Ë ´ð‚ “åzIÜ ¯9¬=AÄÜ Îï„áÎÒò ™Ë·þ, ¼Ñf kÊ%ÉŸ …í¾Æ pÁ£‰ú²/ Ó‡ ¾-»³õöPü™ %ËíØ»¨’ ŸLÔíòò ˆ ¸Æ‹$݀Π¯Ü ©é£Ü1ºÆêîñ°E°®¶þ Ÿè{ò” ·’ƒÓŠÂË(×Í @ôŒ ¿³òìAWØ õ¨¨-ôЧߑ½ý Š¥ U_ü»‰#ª âÝLÆ9é @ã”B­ ù/ãæ =ÖH_™¯;¢ а1Ž ¬ð*4ÈJ0ج*¤õ é4±KÛB¹.Ú ¥ÚÄ ö Ϲ†0 à µ!ŽÖ Í ì²Òö¹Ç.·ïŸ&à š ºœ)ÞE˜›µÆ%Œ6Ô û ‰#ÛKí9­ÏKÚ§!Ø+ñ£Ö2Å2Ö?&^ ?d¸R9•×.ï=Šó‚?Lœ~+Ãòvxè±òä©ÔÖ©„íÏtúëÊž ÉeÏã£Æ­à ”h‚÷#‚ÙÌä—Ä$CÜ »ªCZý{„Ÿª3+$$R/¾.RÂ,¥Ó©§SŒ ؉ •§05µõŠÙ½ß¾2âÓþKôË©f­ ߺ ðÖí–,Áʼ³¤ú^‰mRàVž4“§7äò­ØDÙ¸±ÙGƒ¡¿€üúªòžÑ‚ › ’Ó‡ù–“õÛ™ƒ ™ß9.eׇ¬»ƒT‚ñk¥ƒd²Ä—®Ú x±Uƒ êžå$ÆŠÅ ] ì‰ Å …°øõ·k¿¥‰•f¡™5h¿Ý‹Ó ˆ— `…€k( › ÜøÒŽ€X»ÊÜä‡Á—Æ× l(’´`ý®–.™/D!ž'䑯 Ò ˆ™»¼†× ú­› í±ªŸÑ—!®8º3ߪ»U—5ñ/ÌÑâ1‚0†âð'®$¯ž™åµ ËÄ,íAÆÆ$ËÝÔꞢ;´Ë/äÏ„ä…éž íLÅ)ïÕ ¾ ãÙ  › ˆ4 ïúŒë ×BïñÑEîÚ´Ó ä*ïÎ# ‰ÊÃ#²E>Ýì%œ…ç Å)¢ ˜ ŠE£÷ß'²ë÷ ¿‹ ¡€è¶Œgïþ§ °!Üݰ€ 1* ú£÷¦ïèûòwýŒ±Ãåø Ö±þ¯Äƒœ ΘÍèí ô ¤œ ÍÑ }®ÉΆ¿þ ‚åÄp¤ãð ¡*܃¤Š*ÅíØ®&Ô‡¡‚û¶Œœíä»—Çï…î 4>¿× ôÅ µ.ø—ªŸ˜íxÉÜ׉¨ÍUT ÖÝ¦É ÌÃ/·$É'ù’q§4×A»GóG”3ÃF–É‚·í ÛïþòW•0é5Ìÿð4ˆ ëí tò7ô óñì¿ «¯  Í © úC1öä ÆÚ ŒÚÜÛÄ Üð¡.¶ßÿ ÞϽÄ+÷,`êÙoæÔà⸠Ì0“ݾ¢ ‹%à¬ãò±þ(ÔȱÎqž ¶žº)«9Ä ÃÒð0— É'I´Ê±;ž§BáŒ/ˆ‰¶ ‰Ì ÌFþ8ÏòòïüE¤+ýµ4Ýĵ<Ö’¶?™Hب+ðžDš"€IÙ:,ý4š>¨(ÿ:Ï…-ƒ=Ѩ¸5È0¶@”5¨Ž Œñ»! ºÛ ܽ é¡ô äö ¼äý–#– °ý$ ØÌâ µ*žåˆ.×¼ƒ(®Ÿ"·ù"ËŠ ç³à¢÷ ƒü·î¦°“ùý‡“ÀžÁ*³1’ òîÅÌ.£¸ =¯þ׿ªÙŠýŽñ êœ …(qÎ ÊÁˆ-©Æ/ýTîÐ÷(ÞÝJ¼Iøˆ )( “<Æ"Ëðõ Ð8”6Ê×#ÖåÖ&]ü&ÕÄF¸D“áÿôÔ§)ÌFÄ×%^“Ï^œ…?©ñ…I£#Ð ° ƒ'&) $)*%6/226&#ñª©-é °ùXQF[ÉI'E=$„)EEˆ_a1+ }*a(w61&h '’Uo Ý Q+O- N:tN}16 #G-W.\… .²*2  K1r^m  /ƒ (; ìºq m\& $   @†$u  /ƒ (; R'VO ;7e ,T7f$c •È +CDÏl= ' = ‹ #/QF¦# ßñ3 M¼°evn0 EŸJ¥E LZ '!Ïv\•­•ÿ$uÑ Ê  ¤V\ 84h.(ôAX y$6 J X bx½ óP­?d½ R´GED6#¨zÊv ŽŒj ˆP†f ‹¦%vK->Cõ ,¾‘™ %^ o b  L&‡$1š+Õä&Hùg ¯'½M/| .%à‡cw¼'ð F =ÇÓ¤ Kqþùe'!*2 )'6c'~ 1T - ‡ ,“è‘ 7–!\2 h"8nt/ !    €9ó& 3…ü7  9U 1& :»;' UU*0#|ø0 Ì(J "  †3W) & ! > añ¿)§e:‡_) 9AoLwªOB) r K 9¤LáT#!bi#q^ì › ::%! X5/!œ 6g7Oa § '¥²$€Ž9@ "%K:€' / GCmDh *? TT¶   1 8 _ , }7'Q`3ß µU!B¹4 r‰!nD  A+ )e' S  5 cl†3r\S''a' ! =AKǰˆ e/ l- r4W”" ù­gò®3å á-x3 Œ2hóŠ'¡ Æ5'`    ‘2ž   eÇ! g¾² ) e  Škàî \æýéìbDW  !! ( Š WÜk3 ¾Š¼ <Ê-3]˜0Q+ þq"¿- —Š* B % UY$, k0ß  €’:gè7©jE6i[7šÔß      W w à ", "Lƒ ?Ò,4(2  "%  "^-)b ,('Š     ùÁ"pRu@ Xo_6 ˜ *–`ý#Œ_x (el#",÷4 e+£ Q- ylNï4‚'#Š:5  ÿÂFR6a.>[(v D­ýdsŸC€êp¶e$c;‹=*"Q 4¦&‡$[g  æ¤O»„ Ý"0@-oU  (y'?3  ' }U¢  =uk žd - SÄ¢4Ww )4ŽW%  ¤ûi¶+-]C /=Q24m•f‰)S`¯ z½bã2ö—,µ.¾…6Ëó"=?§=6 X^ i "F 3 ˆ$ hª VÖ¤ (!{ Ee»72Ù   W¶/ ]`þË„&&0* X'5X !c V  à €¸Š­&P5ë åCW5/$)"Ì-+Qm÷ot[   bbD  ¹& #s: $ ¶€ÍŽ  a nfeµ.`c*^ níÃRF b q2YQåÉ:XŽ)‡T,· ! S G's< Uþ% !=”… FV C€ ½¾ *3"= èq{J²9<x 4   ÷ wš}Ø4‘nb %U& 6 (1 ^Yye‹`Õ Ú!/I"3 ^ !¤j)"Š ; Æ«svã [h/1"&0 '3%ž :?ôuRaôJ õyh/1"&ýyÂ/05Õ=v(þ°— ? ]. 4/6\/È'S -R+ *4ï©ñ`Ž. ÚX  lz¨&R 2$âF #M"!¨Ž(G< * !   æ'.:­Á^` mÐâ "  "^!ƒ*Ü$ZýI17 –*.  :—§</#"4A[Zá[}L«@?wF„Ä??¤s”? 5 TŠ ƒok;0  _ Z94.u ¼\Á£o‚ :K"½ôAþ-|k‘ W   <  Mº)F3 4$%;'F ZU9*-v"ì7~a fR#ñ½K*E4#=Œdd‚Å  W‘%“! ;  iÈ '°6+0[0 "+IH”E'ò@ ¸] …QÝ\ø>!/ŽTA. L >+$v½¦"g,(ÛX R6 *”O =!¦7* "¾W* ! )m4  “'ÊI' ts® !%—4©';6   0\2z І1ã)Ç&™'«ù$†úÙE³´9àˆ!ظ /ÐÕjé¹…Ùå=jÚÍЭԕÏÌ6¤È¡ À²d²}ÅüáŒã“*˜ü™°–ü ’ J” šÒ ìæËã–Ì ¿³ Ù­IÁ ¨BlD!ÔMˆ=¶åùÏž‰R°(Œ/´5þùš(® ù· ™ÎùÉ BÕ™ÎBïîœ+ÆÅ– ˜8aÊ à  Òôæ½7‡Ûf¬Ÿ xÕ|EÚ/¡îÙ­£f£Ç•¥Ý˜1¾É ª¢îáÑ þ¥“±æ¸Õ³Çñ?ÐŽ¦¨Ú Ƚ Ÿ#áé‰>‡¬­DÀÑ0iè0Ð=‹@Ï ·,Ü'›+ }ÿ#í!î-ʦ áýKÐÚ9û6  Iñ …%„Ë2´Ð‘(ÿ‹.œ ¿0Áɤ. ÃMÌÆ(™Gí˜7¸"ž? Õ ‹€( @È#ªE†8Ó-»- # +9±Jþ‡|ä'#.,Îó>5!ÏH–‡À¾ Å#ja5¡æ¿»!nª&õ  Â?¢ }  Ù )[MÌÂ#Ð'ÝDì ‚’k– þ(  ÁŸî="Ø&º$•+Ô!¤"ž4Ô@ˆ ¿=È»æˆ ×Â:ÖŠDˆGÙ Ê‘ ïLYÜ àÄ!Ãùʼ;Ÿ>¢Õ‡,…LÂÉ( ä1¡%©¥@ý±·3“FÕÁ1œÓ4ç E´…É=æ ÖD°ú ²&™ä@ÉA± © VÏ#Ùd‰;™  ¸± å)ÿ¼Ö“íVÞŒŽ¢ ªÌ  )÷©*óÈ?P ¶+ • ù‡ Æñ ݱŒîo¯Ä)ñ„Á œÌ ÌÁéÃ"(ã®õ•I-óÏ͸Jõ ¿ ¥÷–é ‰ ®ç'Èó8²Œ š† ¿#ýº ™ º ÷˜ ¸ÒÄw³ ‘¦DŽK¶/Š“ÊC˜Ù+› â;ý)§+0Ô$•1ö ¸-4ØÓÒM•Dâ<:™HÏGÊø(®ê¹ü!Ԓ绞(݈2ß2[œFì©4‹=€ŒÅ•F¥;œ ªÇKÙ2Œ#¢á>þE‡+áò¿L¦.×ë¶Ž9Ž,³ØÜÚEî=µ4êBó–1úK¥9Ð^ˆ$á'í€ =2ÁŽ ‚öï Wܔ؜ÑÇ•? 551"&* MVU{+¯n}®&…Ü<A$j®<% ‰Ó¢ò œ†0w—€zÕ]iÞ F³ ` @FªÛöÌFýÅÇ ‡žê½Š1G y%þô"ÑÍ"™ !E êô§ ¥~SÄ?e5-³oDÑA žH7]„ [ä íGª®Š ¶ŽÉ=Šø¯3–ð ‰ õQ'†Û ¯WÝïor79þ( í‰Ù9»»,æE —5¸ £¥=Æ'ÂðÊ—‰ÿ"µÊ ¹ÞJõ ¼¾'‰ %ìÇ,:ŒêØñ“¹6•<^¨½Ç Ë– ˜²ø¡¿*¦L ÅßG—œ Š"/zé¢%†¢¶ øÔ ç Š¬± ¬& oà Ó3Þ ´¸™! ‘> ´ê™+4Î ÿÇÏŽã ¡È&™IŸÆ§ð¤Þäà t<·¯ ”±$úG‚#¸ ‡ÜÝ²ï ¢%¬®<Åî ƒ2׫Ù*òxw†‰& ç¼2ž8Á ¯:î *L&¢k‘ ?¨\ÓÀ5ŽîÑ0ù 2î„<É*’ÄÝ;Zã +Ö›*ý‘¸-Â&úú;´œ"©#ÓL“¯À$ŠºL®1ï0‚ Ÿ® ÜE”ì Ü#óD“HËžº†H‘"€3%WñKÅ û´ÜE¯F ê•'Â¥sé#› G­– ";=ÿ à¼5«€3á›0úú øB¡Ž5¶(¯!óMúH¤’2‰2H½°ÝØ«ó¨¬ tõµ4 ¶ÄÞõÉÉ å7÷ô:à‚6ç¢EîCï7œí j‚+„± òC¿Í0¸´¿,² Æ6’ß/áŒ!Þó-¶+Þ ä ð$ÄòB2׆"Ì#£;þ¾#Ö¡¼ä$ù'á /ö/±‚BƦ–7²& ˆ;“%eý ‹-šÝ.­·,À" )ÛH˜%´‹=Ï”µ¶,Ö›ê•+à ‡(ÕI‘>™ ÀF‰Õ:²>ŸC‹Ô¥%µ ‹›7” ª"ö ºrÄH¦µ"Øú$ ij9ß':/,Á $ï"®H^´3î$0ÿ/‡÷Ö5ô/œ9è_ð«>'»ý&„ïC–ï!ÔÚ +Œ ÿ ˆ÷Þõ4¢—J§µJ’(ô½Là ×*$‡×ïšC†ì­¥½“º"ö ü2¨ž·ÎÖ$x)<Æ%”ýÛ¸Äã/²ß!€•2ý2˜EÿMÈç,È/å4Ô4š4 ¿ä wV×ÖCFk±8µ@V‰ß3ó.˜ ™3ÒÓ3…8°¼çܪÞÙ®¯ ¾µ {ä Ä‚éšÔé Þ—³gÁÍ ’³™Éõ诱T•Äm¸ ñˆ†!°rÏ™ ¬Õ¡ñ† Ê €ï¢à£wÜË0ù%Ö˜ö¤Ãs ˜X¸€³§†zœ „›¹Ì£³Hˇ»’?ºæÎ›úšˆ ÷ è§« « »Üî£ÝÞô ö™y'Žú ùÖ¥ ˜ ‚¬çL«¨¥¶Ð”Ç¡í*¯†è‚ç„”šÁ¨¢¦ þKêØö% ðò¿ÏÏØõ)â iÚSý ¥ ‹É þŸ©Î ´ Û¶ ‡èŽÖĨŸ¢ >$dÉÍ Þ ò¸µ¿»‚Ê…ë±¶°Ù ²“…9‰2Šöé¾ Ûc—ŽËèÈÝîAë× ð Ü5ê†,œ,Üä ª ʦ—‚6ý*Ý;ô ¼›²ã§õ0ɦǹ˜ÏÃbÚǽ÷ýýÔÕܘ ˆ©¶ûÉ‘—»²Šœ ëñ ’Öô ͯŒþ·ý… ¢¨¸øÔ [ì™ ÈÖåíä°ÏòÚ˜Šâ ¬ôýÝÖ·°©£î’Óα•͛ޣ¦øÊ(ˆØ™ç ¤ lÛærŽ”œ» à·ÛàÝÊ“%ÙáãÈÞYgˆè ³ä’Ãàñ·è™–àÓý­ÃÂ¥§'ü÷ƒõ¦¼äú‚‚÷ ™× tQ–òåœgƒ¡¸ïÓ ÚÆ¦¡»íêÂò· Æ‚ÎOMC¡¥i†¥éPbqÂfj…lQYY7ò°ÛMžÈBµ®Ø´`Ebƒ¼¤c¿F…ºB™…š{âÅÐÝ·ò í„Úâõ»í ì襶…ûãnŠúí†Ñ l×ùóèŸÈÐÆû+ÊËÿ·¨¤®¤Ü©Çö„ƒÙ%©›¹á•æ×‹Çç䆧õ½¢Ç†© çˆ²È˜-ְ󳳈ˆÞ€¡Û„ÿ¬ûàþäÈžæÐÊ‚™¥ ç¤àÓî­ Ç‡¹ºåLå»§CéÃÁà5šà»à ›–× Ð• Ù>·î³ÐŒç³æµÄLHJK‹«¦ïÛ‹˜ É‘u½†Î« ê«'¨‰ á%þ¼ŽŽ·¼*ƒ•é áìÙ%® Þ­‰‰ø M膤 €º#† ñ.ÚØê—¥‚/Ðò÷ä ÂCœMÕ:† ÅHŽÿMßG³B‚F¯‘Ÿ±jœ:-‚­&„ûAö ùCð'ôÁ¯Ä-Æ®ÎM¹$‰D½/—*‹ñë ë Îï¹Í(”çÕȳ¾† ƒMý$À$Í1뼯;•;ÔIàóÉyß òyè§£'å ø½õ®ê›1!´çè¯Æ×ÒÏÏÊó‰÷Ù D¢žËü ¹ Î Ï ï Õ5¡´ ¤#ÔÌ– 5¾.ÆÅ¼Ý¦‹á×)Ÿ Ͳ2ˆ y¯§£ñ*Ÿ¸+Áµ±Ÿ ˆéÏ4Ã+…ž Š*Ê ññí,Ïׂ§ÞÆ °HÒÒúË2½ö>Hã¸%¢#ñ%™€!]ÿ1ö6¿.¥7Ø8è,õ)æC·:Ð0‘-¶+µD£+µÖÈ7¹;IûÐnÆ íC–HÏ2±"Î?©CÇ „%®#ó>ô2É3³=ÜK·¦ Á ¹š£;“¬9/ÖÎ ª¿ ÄÄŒ%}™¦;ãÓ„–Ä“û ÄŸ‰Ù û‡:@­:à ‘*Ô ñÌL¼XüLö3”'âƒ"†Ç9­KÝá+Ä»— ïEâ2¿3ÍEÉ7Ê9Uû”ÛÑñ*â;À>C¡5‚LR±»”7ÃÖAø)öBÚ%Àž ‡>‰û-Ä ;Î(„@:ý#AÛ+ö0bØ/´<³ %Œ¾+¬("Õ2ʪ0ø/¢Î£ ƒ,«žÆGã1–¡– LÊ ¾Ó÷§#¬ ”ÞÙ>ÿ (Àä"¨þ9É ÑÑ þ- ’§µ¹§’½Ç ¨ï-† œ ƒ7²ùô  ·)í¤Å² ­$0…›‡ÑMƒ<……» <óŽ.MMó¸…$úp¥#ÚŸÿÈ0‰2Ö7&º¼5·€Aœ/°9¸±¥%Ñ%Àš ’Ó»Ù²9’8¤(ÝàèG³ ½ùôó°’î ×ôé/’Ù1©IÌ4öØKõ<ëJáÆ œ$ŽC–4ƒ!– “‘=¢“-ÍJœH³¹î #»£ ©¹7ÆMÐ÷B„×$ð£”2· ‹ˆ+¬D«&ú а ”8à ¾ìßÔÎîÑÏú]èÎ ä!Š' øËþ@²‰” Ê+ãÊ ¾>=£p ¬Œ Ï ó XÄ5ÒÖå$Ñ“ÌÊ õJ¬&‚5«=ÐG–8®†§¶ž µÿ™é‹ÀúëÄ¡ú¢Ì Ž®Ë ÉŽãƒ(Ç­oÞ僕âã¿ ½$×mÀ•£Ð ¸²}û‘YAê Ý•?™d²ªïÙ ù…¾µå½¢ ŽBû˜Ûû垈 ›e» Í#®³ð#.,ïK§ ì¬.Åw“ ˆÌ¶ µ %¿Ç?îÖÝþ¨ —Ü»øÕ¦á·´› Ò°‚Ò°õ²€Àƒ Õ Ý³Ð» ž´Úyù‚Þ «…2µƒ Í+â >(„µ!q´×Â0™£ Úÿl‰òÅŽ_3Êç7ؘɦ„“í”".»ÌÜà#›u …¶ šü‡ ¦°„Ð ò³ Ä §«Ž“šŸ Ó§±Ãï « Û Êñ7õ&×óË7‰4"J‡I©I÷ ÿé7=’:#©=ŸÆº&¯ªBÕ ½ì1“35"Ü ý<†JÀ¿ãAÊ0„Bì3¥0ÿ« ¡„ <ËðE•3¶•K¿íÿJÁ07•*Æ.è€4½4ü¼!½â!òŠ µ1¡Ø¡ä µ5÷3×(üÃGƒÈ“Š ¶‘Ä0ü“C·Ò ¥*ÀÊŠv¨»‹ ˜„ÊÃq¤•}¿™£†d™míŽçFûw€qV‹Ëë–ÚǎàªV}ع~\ñ¨î¶ËˆŠn•j‰j®N£c‚“ìþt¼ŠÇ{ºˆ éûΙݶ»Ž”ŠhæÇ†_ïð|ÒÞõ…{‡P ±š‰†ÈÍh¼»ãÇ™Ç£æ´ ˜ ›ÊÒÿ±ºžï–¥ºýÑü¶Ÿ’¤¬½ê¤iSÌ ºÈ ŒÓèôŸå¾¸‘T]y„™JbY©OpóØÀ\Ü”ö´Â×¶°³ˆ—¨bp•z¢fæ·¨˜pŠsÛqpm›‹¦æ†ác™±ÞÈYw†¥TçtŸeh“°vž·gïŒÖ—³ú äŠÂ²¹ŠÉ¦šÏ…¯§eä¸s‘Çmsݤ£‹T}»Tú|Œ‹k‡‚ïïŠÅŠnó€äþ¹…ÙYcŒ^†±òˆ™÷¥–µ«•Ãö¸á—}ªUó·ˆuì¼pÇ•Wá¼Ü~³ð—}k¥‘‡ª›œˆžÎo©Ëw§ŠÛ†rÎÆ»obÛ…qsº¨ŸŸÇFü†ajs’Œ¡¿ôÃ^Úšḛ́šeØ–”µ ±ÿ‡‚‰µ„Åðˆªjó`•Ó¤£ô[˜’ñg•† ‡vÀrù—ûbMºûwkëp‘å­¡Þ é Á¶ß‰RvÎ…íé—km¯ê‹^‰¥‘¹¹k¹n·ƒyá Þ Ò «Ü“ PƲòóbhÉŠ]z†ªTž…rÆÌx‘`·ò H¦š£€g}Zì–s™r–ØàŠÒ¯Ð†as®Q´¾Ñžº‹Ž ‹ì²™z¸kv掻¾[€œùŠ|k›ÃŠštk³Çø—‡c½ã»½n[žãt£Ë|½ÚøúÔôôâ㻨¤“òU¯áÌyäÔ•²ªépXy”ÿ€ä‚…ŠLዓ°Æ¼£´îñ×–¬Šc§§ÃysTtær›~µŠÒQq¤®¥bwœytilÖtwwŠtVt¢»lÈäCëܵb²H&(§-㮊 ¶p–ªŠÆõP ³—¯ ¥^— ¤F©-†¼D*ìɦŽ3Š!ç ((Þ ‹.ðß«Ç) ´,áë·Eª*—=òÅÎHë!Âê­Ã™ ‹?¿Ý$Ø‘]¢ÏWµ´‡0Ë@ÏB†‚!¡˜·=ðöø £“"?í ˜Šè”½Æ È»²À¦ ¬ç Àã+‹Ø“ …· Ðò¸ ƤFŽ Ö£+´ Ùƒáâ‹ñ… —“G­¤³5zÏ9–ÄŽ@òÏ#-®7Õ¾e>Ì«Eæg/$¯2ŸÒ®¦ÝÎ>äî'ÃI°dØ,» –:™ ™ ð.š –(ã:‘(ûð÷ŽÅ'C*/Ï—$6®¬.Æö'±0ôþ-ä&Š!$Æ– ×Åö(,Œ-°¦äÁ@7í%”Ý1“ÖEú•"Ð$Œ@¥Þ#ÖÆEí9ñG²IÍ’·:¬Ü:žç áñ ŠDÞD½š<㲯 Ÿ8™"ÜHË7ü œEÍæ<¯ò¤ÿÞ@©Ó«£ý'*/+ø,—#¬1¥Ûé¤-e„#É#ØI¹¶ ÓΧ ž à#ÀÍ$ÄÃ+ù(ù9,8xÓÄ ÏD¨;¯¡$K’+*‘)Š9ŠâÆò,Þ:ü&ÀíÖB¤Xô1‹¾zü8÷“°ŽJ%Ü.å:º³Ö' ´]D>¾×6îDäé!|¯K¿#¤÷>“Kö>ç;„ ˜ ¨‡CÌÓ´#Þ1Í$ƒ«ï ‚@’>‚G껑,€»-“˜Œ‡ú¤ Î.¿«&À¶?¤IŒ¦¿mïï›E2©ê@©3­ñ ß+ü#ß¼ ÍÈ¥õ$Ñ?0Æ*ƒ¼:—€&‚= æ4ù9Â9 ƒ¥•’F—8ô÷ Þ"Æñ#è ]>†@àIŸ·Cñ&¹(¡0Ê5¸¹J©;ö¹ÅÄ£JμԘ’K£)Õ´ª3mË7ª3Á>µ>!«MþÑ5ØL*6øø4F õÏ)™&N¤ôGņL”)¶Cà Û« ¤â4©EÛ’)øö$­õ+ÙZÚ ãŠ+öö‘ü›0µÊJ뵑«Jè-¹1™õLõ#åE¸+ø0<ÎD¶‚Mæ Þý¯Á¹¤.Ú ‘Ó!Õ›+&¤Å4(™ ‘™;¤ÇÆçü§;öC /_o©â½²žÁÇDò4Ô Ù5·æ/ÊF@·Cª¶+š¥MC"ŒDœ%¨”'Ó'ç ¢Ž%²GÂÃDއèKÎ òþ%”1 5€FÛ/¨…¯$û ÛJç_Ð#$Ð2Úà ÷×” òM†¸Gà ¹í#º± $] ÿ  ± ‰S   V  •  ¦  Ï ‹K U ÏØè 4r ‡KÂ’  ‡  –õ ³  {­ š  ° N  >PÆ     Ìo  ÷ ¹   T Á » ˦ » ¼ û ö  N ùhP  € «Ý†  þ¸• P Q¼  ! ›ü  îá  ¤ J Ú ƒO ï_ N   yÐ ì ¡ – ‚$ Ø  ô ˆ  ·  ºÑ  ¬ Ð  Þ È ™_ Ý  Ø  )Ì ü × Z H¿–ô ùŸ Ë ÿ J„  ã÷ Ö_Œ cÚF£ÖÞˆ Ò "NS –…—¶  Ê”K ‰ ó  µ è4a ï + S  •&Ö ¼ ÍÙ ´!  R  å L œ ÈÅ ã Ã ï  N N ‘Ó K à © ¶ Ó  ¢Ò €ø0 "á.óδ5Ô.“#¶ˆ4û/Ê®:Åé+¼‘±þ´¶ú'ø?’– ÊÛ Ù'±,Í£Ð$º»û +꼸$½º&ŽIÅ á‡!Óí’ Û5‡ Î0Íÿ/„üŒ8›L¿&ë<Ø I#Т&öè ù%ÀÈ=°E´ %ü(ØIºÏ½&ÔË«á¼$¸þ¤-•ø=ÞE˜®%'ÑÈ'¡ !Ë.î¹È7þ'MÈ­+ÄR©Í¿´+ëôÄÀ3͈¿õÊ à4³;ý&•Ø*Ñ<¢¥9à5¥ ¥Ò æ2Äö+(Áº örì/æ@‡øAȲ=‚òÿî® È0Ý@±üħ/å7˜2ò ! ñóG”!…>ZŒ!áõ$_R/ì]ó‰üÛ‡Ö“£®ú¢®©ˆ§:$Û8=^­ ‚£ÚÖÀèç  úÂÃåù Ž6/ µç¶’,YŠ~S… ç·Î• bGŒ » ²½«ÆÍÃÔÛ4Õ8Ã)¸!éÓ,7ž+*þ²ReC„ ¦pû–O~)Ø ¡T;ú  ÌÏ·™ù±Ýi ˜Ù·ô1œ1Ã4Í‚ÚÕá v/­æ0îȦ !Ÿè2ö… îÆ *ÊþË’‘ÝPÒŒ©ÌÁN& Šü ¿ï ¬wÖÛì¬ú  ­ C’®“]½JÝË€¬T YÖn¦Šóõ¿%ž±È— ™È Êž—ˆ@/HD× ¦0à{ ;à<Úª‹YºÍúîyFŒ›E«­¶ —Kåä™&šî²’ Ø&ÿ€˜˜ ÿwv «(¸5.2û¨× dÆG« yÂ4ÌÍÔ œ ´QxÂà ¶]DÇ¥Ê ÇªêžÜ20.D0%ñ þßÞšzZW¡* 13 Ÿ’æ OÄDÚ ë ÑÕÍj<™1Šj{%X‹Ù/s2hE€-ÞÎý ¹ <8›"Í•“„8¯ö„!N<0Ò)+=©þ̧іY˜êƒÜæ 'Ž-Ñå²j7÷Íû"ˈ™æÁÂ3Š‹ ,É âK0Ü'£'·[ͱ©üðŒòþ† vé¢ÿç ¸ìǶ”Óá Ížõ,íƒÍº µƒ×žœ  ê\ï(– ÊÛ¶´à&¯D õ ,ø¹ª ’ 0 ã„»©øÒþÔ¹¥ì«¥ é0¶PNGVªë öJgŠ ‰+ ˆ½ëæ R c™ãŠ+¨Å ¢+5Å Ô+Ô"¯‹¼:¹˜‰+˜óŸ¾±­)ž#ÿ4ß<ð*…4þ ÃÞMÔ3ý<‚kãJúHœ4¬%,ª<×>£Ó,á-ˆóÊÏFgΛ'Ô9í¾Š&qÝ ää(½4˜¯è$‰*Îà¶ ]õ%¦ôÚñÌ ‘ì+êUTÒô‹„Gº4‹×KÕ1³<ÉÎ)Êðȸ…5ÄØ3É>û3— ÿÓKáá©Ðú²4´.¾ï ä­ºž@À*ͦ=—Ä'æ ¬ ͬ0µé#èß9Ô-‘jEÞC£K®@˜Ù ÄH§„£-å „¨'§´àF“ÐEƒ*Ê µ%“m 6åEúΧòô z© -C  ‚ ç¼%֯ΚﳄÛâ  ´ øÐÝ ¤œÄ *’W [<“² ²˜áàÒ ªÐ¶   V»¢.ô¿Œ ³Õ¶±iÆþ‹ ›9Àkú §„ÁFþ?¦y¢#öú éb‹wþe2‚³ƒ Î¾—ó Ô Ü ÎËÖ«™­’†¤ âø ‹Ý¹Ù: ™«Åᙨ“‹—8Ø„ ~º„‡zÈÁÙ šÉª/Z’£‰à$ œ ä´ËÉ žÝ$êÿ »àJH!Ï ³•齺 " Ò" ´ÃêÔ)>ËÜ …ý"À“ëÝÙËàÛ É æ„ï¸âÉÌ«°Ñ ñ¯ûÉ«šŒò«õÊ%ŠŽ‰®ã4´­ Ô&&.8þ죉“‚¬ ëÄ=ÝîÜÄ,\‰ ÞÛÆ<ì“ þ—š»ÉŽú ƒ_ä 3ï¹´ð¾ÚÔȉVˆÆÎ ¨§3ùæ‚&Ïü™–“œç ¤ ì ´5ö½” ì×ÄǻȒ>½ñ¹ È/¶îиߏ’È“"çIƒ‡ÆÒ ¬ ¶*ÏÏËΟµ0½ µ‹­-ŒFû? ·ü“/¢'AÌÀLÝ Ž¸#à Ã(•®.Ì4° ð#ÁCš 1£ÿ ¾ MRM 'âK<äHE¼‘.G& ØI> ¿? ÔÚŠ@´…)=sN&=t‡ !z\Ø>&©A+Õ2×¥j7§@¹Å áõ¯ºÀ ¨„.´†Éš ìÊ韜¶.1ó ² è%€ã çê³° ´üºÁ™$¹ þž&ã Ñ Ì˜ ‚ ¢Ñœ-çç5š[¦†¤Š±4…ŽTú †À‹ôÒ+¶¬ û•ß” ÕÛ1Œ£Ú“ ojÊå7¦Þð”&Ú·Aïň.å °ž)§& ÔBÅ8¬»Mõ6ûªì.¿@“û /˜ˆ—ó!¡Lª¨ «h0«>§Ù/ØÒ1G³àû§Ø!ñ¸¼H›ð©(˜ š ‹3†DŒç€=¨!½ ¼´(Ý,žˆ2°/JäÔ(ؼ$Ó™.5¬ ?Ÿ§[ÕfžõÔãËo·“·èÂg›¬¡¢å¿›„© Ûá?Ìð†ÇEâÑ-†œÏ¡$OK,¨´#œé¤îøHϹù³’ Ͱ ¸€Ðq#ÈÎà…Öˆ/•©ÞË €CæÍ»ðÁ³µ„àèùÌŒž.œŸÚ¡ÚåŸM鑸 ‚Ѧ 䂨 Í Ž©¦Åå·ø¢Ê ŒxЙم¬ «ažÐ=«(ë Þ¨­Ò³«ÉzÍ ¨õ²I$ïé¸ ®‹¹Ù½¬Åbÿ:Ž ¡˜ˆ²‰ý‹ ©¥íÊ…½ r‡Z±D+5Ãifƒ"ð ÈÌ ­H”®*Ëþ ’ìä(Í¡ÓÛÓóÐ÷è ´J„”õä·ç`¼¹#¤bš…°´ä ë¸ÊëÏ ¨ ÑóÐ ¹W˜óvÿ »ã-™&ÁœÉ…±Ï°Ì à ‹ã—Ž“ „eéËÇøl~• ˾¹À ¬ÞÊ¿ñýÏ¡6×!ê—þî#¸¯ÿô±‚l–4ÝfÓzê}¡é Á&Фô ¸ú:¬ø ‰ å×Þ Ê…Ê“Ð € ºÕ uöŸ½¥úÞ®M®#ìLH‰“ ö† _‘û¾‚ŽšóÄÔìÀ¦+ ¤ /çߥ´cá½ ô¡  X,À”|Õï|Ó»5s.Õœ‰Åð Ï ÝÏ × ƒøÛô‚à ©#Ñ ¢ ðí ÈSùˆµMˆ‰I ·À 'кHøþ<‡ – ¤SféÂòÎØE… Û ˜ û <˜ÝчŸ¹¨ 4ŽÑ ÷¬8牦Ǡ1ø pͳ5âô å.õ½“„Ç!·¹ ¾â#Ï©]–žê3Èœ6Ž î€â4û€‹å‚Î*Ù¼¯ÂêŒ ‘ùÚÄ#¸&Êö"À ?‘Ù%ÐüºŒœò'§4•Ž8ðDÅ9ý?Ã2‘»E“1ô!$ó%äË#Û îAÃ9‡Ï4’@õMñ&†ß© ä'ð…Ô,˶+%Å.²äö!£”>¿'†éCøéÍ*è7ê@›Fœ”¸‰²ùG°+û)áŠJÝ0éžIÎ-ÔE·@ü>ô6ÝEî#ÿó󬵨ð$sÓÓ=ˆsÚÛäù=ˆsm ÷»û Ñ!ú/(’«ü‚ðx ø (Ú7áåŠ]©ªêËbh95<.ááð‚$¿à6‚­ ¦¶µË%ØçŒe«+ Dž“ *¡àE€úgˆþ:_ܬÅ]å– iAbâI+®ë%)·Øþ¡ ¬š¸.Bú F¾ ¥˜.¼\3ݼ¼ Ê~hÔ°ÆòƒT(^ Ì “µ Œ ÅZÜ ”­ƒ®cc'¹€èy®¦ÃDy…!õÕÇòýÊ w°â ¿u | –“¦þdî yD¾¼]ž ±–“ð ŠW¨¶œ½„ Üüwâʤ ~” ¤‡½²Q‚H ƒ`ßÕ ¦ÂÊ÷–!c¤Qz5â€õ –¢·Ò , H$Õñ-V  ˜µ±ÌT•JW¡x!ìr0ð²  1Œ¢ÑÇ/!¬†CT{§žZ{˜I{š²a\Ï;d†ö “ê&  Ã"pà "ë/Š‹ã¿ ¾” ’¦  ¼'v ü¬Š¤(X‚a ·ÎL‰ ¿e_2$öÁœy®·éÍ ÚŠ«Šš»#t  ‚ º@âØû¨´ù  Æòäù £ ðyÄ«íŸ“Ž }ìµ Ü&Ó¢Í ¬ž&$a×"' 8®â!' 8ÓÓÍHó¹ ]Ï o qy…l[Оï‰ì@‡³€È aÌkÐ '•1¦ª Â&à íÔ â¬Ÿ ɗ€&ÈÛ¶·²ÛkH—Œ“¦ ðÙ‚$2n"8(€:T=H?¿1Gúë'>0豯ñ+»N› ˆY-ž:Sü „Õú '!Òs«rNÉÜ¿Uþ²''Æß ìÚµ«°®ïºŽ½î ‚× ¹Ô©&±È ¬ò;ãÓ,KÆ„æ×‹Ççé+Å+‹¤+à)ޏ(óÑé:5lò’-ŒòK¯:²K>%ãÑ—8õ7æ ?ÍE• " :ü ½ÄÅ´Iû/‡FÍ ŽDñKÚ&‰€MìÞ˜;¬@~!sp &Ý€î ébÀtM%m"lDx3; šZL] uÆÐžº±-lMTÖ)”ƒâ-lMT¤¾ É.°Ð9½ÏvŽ˜]Òà´‚"ò>¯X<uŒ)½²uê×ðÃ0ooÀúÂ*}§Ðûÿ“Á8'äÕš›dE, @ü h#Ñ–çQìä²í!sÆ­Ø‚ºÓÛ"«gkœÉ’k¨„ñ =@&\°Ë†¯¨•˜¸Ö'?‘½‘ „¡3+9Þ#W·qf {=†bÑ…‘¥2NQ»R  2²ˆé !/.€ºeS£€øÑQÒœ»ÿ %ßw¹oßíüƒ§›ú¢ò‹Öê»á82l©ñ Ë½(4³ç‰Ôó½*‰~{Ox̹:}Iq”Ç É×Êi gg–‘® 5ÍØ ™ÆÎê(Ÿò˜Îš ê$#žá’ ¾½„Qÿ—&b;…mMÖ—PüõÂÈÛ ÆÆðí³ *‹L±Í‘ƒzó>å´ÿ:àÆ„«ƒ›¹"™—3Ü ”G 3™ãôÁÏœ¯/°Í¦ !G‡’ó㪤ó7¾áÐI¤á´ƒs®©ûú óü Esé©–—(ìõý+íΪ͑•©|–GÙÅ gXÜÞç=€Å̈XÊúý(¾ è°ƒÉÞý  /Ø I»à„s Ï ä Í¡ê«q²ç ²ex²²¸è‡¬é°¨Ñ(á3ô¥ ˜ËŠ(³º” !­ì¢ Á,ž Ð „q¹øæ$Ž\ýZ t–' ùÙ§CŸÌ†²³¦€W¦ “åzÐ`÷#Aƒ2)úM|À€¹ Xˆà ¨Š¡Ãï?æ‘Üv)›­Ï€[ ¦äì +$—Ƈ-´³ ›Õa÷vÉOLû'°SŒ1.¢½ã›ÿ ƒAë ¨/ÑHõ$Šž‹Õ“Œ’ °¾ÊùAïå€2” ßÇ ÃÕF›Ž¬>¦´.Áà Ù²,¾!£Ó02À×"À‹”Š7Îá ЬEŒËƒ3¼»ê<Ï“?Ÿß$ô ÜÀã¬ñ/…؆N¹:þ4ˆ £:é<Ç# Ó>ц:’5­>½'3ò-ôÄ%ÂÞ³%œ´1¦ Ä'ôý-®,Þ!Ü©  Æ¥2¨ ó1¤Ÿ œ=ã/ì™ ÏH°%À¿, ® ì³*ë4ÖÀ#  ê Õp–îë€,‹‡Ç9™ÂÜ+ ÃÜö ¶¡‹6¨ Ó‰M ÙAÚ*â"Ž5àÀ@ú4½#^žÊ+k¬+ù*à ž|/²ë5×E:Àó2ä¿õ—Ä8,¶2ä É Ö·.ƒô‚ÃîÙ1¤ „¦0™òð àþ+»1”<=ˆ<—K§K¦:¿Ñ9ÌÿÜB%¢!µ ã;ºAþ “Ê5ê>Ù ù¬F¼î1N`‡J=†ú'îK+´dý3– Í µÇ× x§  =Þ.²±%ôñ;‡¼lðÿ*¥ ßM¥Î#ÖHؼJ¢=÷ =‘Ð,Ñ®;Â?ãA£8÷=ÉÉ(žHƒFú n‹-ú§J›'ÀÇ?à#ýLÁ0Ûá úë'‡Ü¡,²Û'Ä9ˆŠ- „Mü-æ¿ ‹)Ý ”-Û »û'í@*Ü©¥Ò©©ñ ðÏhÉ> qÐ <†±WÉ> qݰ÷Ûá.ÓÌ-$ÓUú–Ù ó šÝJªŸ£ ƒM‚h¿Õõ„ˆ³æî@&Áµn  úþ]¹ÁšJf‘6\£ y É"B*œsì¦)!ñ3LÝÈ!Ñõ‘ “ÜðžºÅ‹³r §ˆ%õ¤©÷rüÇ ç^Ï+$#Z„$Íø€ ÿ/2äœÞ5—Ö èž9¿‰hÀ½ ¤ %G ×ÑíwÇ”°Ðœä%Ø|S÷­ PËÍÜ· #1¾‰Ø…“ª Î–š ²¿· ºŒ!U–  1'.À¢ ¦Š 0z#  X– ­ -œ0L„æ4 ÂÞ «¨¥Âƒ6¿–ƒî4nÒU5<œ¤1Y 9 ûò¹Èª†Ÿ„’ 0,âé%‘  …šY ˜¢¸‚a ô ê;´e"&Bìnçä J ¤¬òŽÍ‹ õ†({näVñƒ "Ê–ï· Ù ©* 7^¿)Àäƒ à60!­ð ®!°FW æÇ2-² ‘ôŽ$¶ (¦ÎŠÜª¼ˆÐ/Ï«þ‹wïAñ›þÈÜÄ^®§à\£ ²óà«$Þ”¬'-Y›>ž=É0¥2ö2”Ø5Û }£@‹H¿º™Çâ6µ â;Ñ;ò!ì6º Ò8ó/š•Å-Ôï ľ µMÈ»² ±Q¥FÓ/îLȧHØ“>Ö Ž0óDQ î<ÄìLþ–#-($0*:'03-&"w" ‰ Á’,Ðû˜Òµu¶ÖÐÈ&\‘ñËžÏa´U×l'>¬ ä*‘ïôÉ®†–©ùB™¸Æ¬2È"ŽŒ—–£%õòj(˜Ô +®•Ü€‹$%‡ Ù·Fd O4>C%ã¾a™)Ã4 :+ $$R%È)=ª¢\´Ý Ÿ%.C„~²ñnˆ Ùµ£—=_/[Œ€ƒŒº¼‘§ƒ7¨y”œÒº ³‹ Ž¡ò †ý…$@& ŸzÖ£ ~“ Xÿ±¶nÌŠ[èyã¬,º2 ªä!© ò€¹Â¤Pf‰Èê²é÷åîû·sÇ#K‘”‹Ÿ ˜‹õ `Ë<ëwy·¶¹ŒÕ¹A„ ›ª ‡‹¿ ë‹Ò|·& Õá ¥‡èÚÛ)ò˜‚Ç€XÊïÎ‘îŸ \x)6^Î8Õ‰ †J<[ŸðÌ p wgôY)–ê‘ ò Úª­¸òÜ)áü–ÉÞ)º¬Í.&îú µ õƒ‚F$”ЊûÛ ÷¬º ü‡ý #pÎ 7d»µª-/'ŸXü dŽÜ(î=Ö$íˆìÓ² À‡w¸Þ0P4¿•‹ÖÙˆ•¥©‘™š5#5­áåŽÙ!jøì 3Ç[ #!ÔÅ“ÀIÌ“³ö‹-³ ÐÜëš mü ¾ªØœ¤ì+×£“‹ !(é?¤ØCÕЩ-´ ©&Ÿ‚’Ù»<ð¼*…Æ ÿ:Ê$ÒûÜá Ñî&‹Ö»(ν ÈÔ(ðÒ%ß$§(‹ÖÉ”Ç ‰Œ éý7¢€% ¶‰ Å©<ŸÕÿaK¹ ›Kƒ#Ò(ƒý$ñV«Ð¾’ù"€ šò>ïÒ$ʺ Ä$×à /¹Å›ß%Ô èÔ/Ÿ”ί Roå«™Æõ»‚žò¨ƒ×¨€Ëß”ÆØpÚ&öÛ‚7ôA•#Êÿ"¦ öÍ?Ñ+ çæ)6í$†# F½ 2ª-bÜ+ÁïœF%äâ;´0‹uµí´4í‹-Ä'Õ,”ï£Õ;« •æ œ Øܫ € ¾¬3³Ç&$“^ꯥ"ö"ð¯QõŽ-µ/앪$ªÓ‘#«ꃗý®‰ì#LÒ­2î ‚HÉÝíÝÞø8dÛà ÏŸà £-šþ ãÔ@ú °<žìƒ"š Q¯(…—¨#ů!Ì1ù9Ýõ!Ó6„K‘ƒ˜5ï*"ÇQ© M¢0¾ †-õëJŽ;ë¬ 3ü.….þFe‘Ôç‚/žÂß Sf ¡=» Ï-O?Š àì…6ä •1¾ ˜=ç,ƨ)ã € ÛÐE•=¦™1Ø¥œCoƒ6 ­Dÿ)ÒÇÃ;ÐÆÑ™†ÊÒ†Õå"†ŒNþë¬2¯ †(Ã>.‚3Wú¶;ËÍÏÓÐ'§Ê.± ÌíPžM&™)_¬+±+œ'#(()*%6+6/5%$clucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.tii000066400000000000000000000066061154025176300233210ustar00rootroot00000000000000ÿÿÿþÏ€ÿÿÿÿ "Compared—†û ICAO"Ö¡ ê MorganïÜ SoÇ¢æ WCL"‰‰ Å chemicalðÒå fish"])ºç™  livestockܸä peat³ÁÞ stable°É¦ f0025reuteËÀý  342reute”¦£ 823reute˜­°1162reute™£ 417reuteœ¶œ 973reutež®2588reute‡‹¯ 882reute’¡¡ 5;M‹±+Òlt;CAWÅù¨FISVÖø©MATRÑðËPNP¾Ö¯TOYOYÈßÕ(300)Áé¹ CorrectingŽŸŸ  HONECKER)–®í  NAKASONE)©ï STICH)„‰¬ turn)œÈ 0012 ¾ë㉠126¼Œ¢7 Óâ9:45:49ºÈ‚ 10:28:08›ÜÃ1:08:12ᆣ35:12ƒ…‹2:50:43ð»Û4:44:27Ä×5:29:47ìØ¾6:10:20Ö³7:44:23¼•è985's㜠»21:56:40ø’(É300ýÿá401ïë¥502¾¼¥62âä §720ÀÝ •838š… ¡9319éò ’ACREAGE™‡ NNUALåœôbelÉÆ ìmherst¾°¤ ssuming™ ¼ BEAR·•ïUILD€øÉ ensonˆÜŸ ruscaˆ÷¿ CFM®Èœ OMMUNICATIONS<DCAIíî¡ URBSŠäûhairmanŠ©• ombined«š ‘ ranston’ñ Û DIAMONDÎç7£ aviesÅ–˜ ittlerõñß ELECTIONS¹ßúcusªöŸ  xploration倂 FORECASTÏš Úinanceþ«îGENERAL ˜¥ ™ ilberto²ïš HARBOR«ÆÞ augheyÀŒ ICELANDŒ‹ Ñ OWAýó… nsurance ÕÇ • Jacobs"õ“’ Kaines‚Š – LABOR“㯠OMDONžÝøiffe'sƒ½Œ MARC›Ä” ONACOè±ðarioßð ² idlandêȹ unicipalˆ²¾ NEWID="10053"Ð×Ê2015"€ý4041"ÿ’6034"€ü9002"€ý‘2039"€þ‰3030"€ýŽ6007"€ý8024"€þ OVEMBER'S䀧ovÐä « OLDID="10974"×¼Å4557"€ý•6375"€þ’8467"€þ“20403"€þ˜46"€ú•4010"€ý•5583"€ý•8934"€ý—Z"®÷³PASADENA¼§ Õ OSTED¥"‹ arts ·¨  olynesia"¿Ý¡ QUITO„“¸ RESEARCH¾“„ ealtech°á‡ obertsonÍìî SEAMENŠÁ Š OCIETYãËÚULPETROæÒ’ ealeØÛ· liferÞ± § torage«ˆ TECHNOLOGY/NEW÷Ù« RAVELERSÇE† hai⛞ UAE±ØÁ VATICANäÚ‘ WARNING:žðµ eekly—é« Yoramþ¥ ¹ ["959300"])×ûÉ OECS"¨ðï  hydropowerª‰» abandonment"èÖÚ  djustable§Â– lledgedïЊ ntitrust…á1­ seï•ïvoiding ·Übeets"–ÚÙgfact("Dominican®õ ¯ oth‰­$˜ cableƒèëusingÛþ € ivil• ß ommission㤠í nfigurationùƒƒ  ventionalžÒ “ rew‰Õ ùdeceivedüÊápository˜Ð óirectoråž¡ oes–¡ easedžƒå ndangeredì¯ õ valuatingòš ¸ xportsÃÝ $ feet„Ñlowingˆ×ruit޶$àgoriaìóhardestÑÔoneymoonü²ï implemetation¶±­ nfantËÏ)© toü¾ -­ jury·¤,úlawsuitœÙ ç inerboardÖý Ýmainly ´â eaningfulîÿçinimisešè éultiple醶 nonionicáëª oldÙÑ:¢ utturn™®%… passengeréÎ ¢  hotovoltaic΢˜  ositivelyä§ írimaryΖœ osecutorÐòâraid½˜íecommendations®¸ òject…õœ quiredÈÅ Œ vampÒ ‡ sacrificeúñ ñeeÆú%’ hillingsî¢Êlipping®È òpilloverð– îtimulateê² Å uccessfullyíì wingsÚûtensionsä“ Ýitled±¥]Ôrim¡ð2üuneven—–Ú vaccine½‡˜ waive¸•úifeБ$ÉyieldüÙ(Éclucene-core-2.3.3.4/src/test/data/reuters-21578-index/_z.tis000066400000000000000000007443561154025176300233460ustar00rootroot00000000000000ÿÿÿþgB€!ATTLISTDOCTYPE ELEMENTNTITY"2 &lt;"6¶amp;"21231"31275981=A?"CC"T"MP"TIONFESD"G"L"MF"U"PEC"SEAN" dditional justmentsfDB"=*rica"])n griculture"lgeria"t ])lsothoughmadeusericanndgola"otherything rgentina" ])menia"sDB"ia"])tudistralia "ia"tomated vailability zerbaija= n"B"CIE"DEAC"IS" YPASS" angladesh"rbados"ringecauselgium"onging verlyhutan"lackolivia"razil"]) =ulga=r=ia"=rma"ty C"ACM"RICOM"BSS" CC"=/DB"E" AO" EAC"PGL"RN"G"IS"OCOM"P"SCE" ameroon" ])nada"])pital"ribbean"zentralhad"idanandle"na"]) iticorploselyoconutlombia"mpareduterngo"ressrailtinuedstateruzado"zech oslovakia"])DSET"atavidefense liberatenmark"spiteoesuringE=BRD"C "]) A"=E"LAC"O"W=AS"SA" CAP"WA"arningssternconomicuador"gypt"])ln=actmentt=ente" quatorialritrea"thiopia"urope"ans valuatingentuallyryonexportCommodities" Partners"qxonvF=A=O"=D=LS"RG"])SUZ"amilyrmerseaturedifteenthji"])nanceland"rstorrance"])udenc=hurtherG=XATT"=2CC"abon"])e=orgia"rman=y" ])1=hana"ivenreece"])nspan uatemala"estinea"yana"Heillsdale onduras"])gwardung=ary" ])I'd \mve=AD=B"=E=A"=BRD"CAO"J=K=C"FTU"DA"2=;B"=EA"EEFA=D"C"CGADD"@LO"M=LF"=GO"===N=MA=RSAT"T=E=L=S=A=T" =: =RPO=L" =3 =O=C"=@])M"SO"RI;TU"=Ifmagine #portCommodities" Partners"xnvdeed ia"]) ustries" formationx telligentrest ventoriesstmentran"qsrael"])t's 2a=ly"])J=a=pa=n"=.])= ournalustK azakhstan"enya"uwait yrgyzstan"LAES"IA"ORCS" =9andBounderies"os"‚stinvia"wrenceeadingbanon"iberia"ya" echtenstein"mitsquiditythuania"os uxembourg" =M=ERCOSUR"INURS=O"TCR"acau"laysia" =i"])=rked uritania"ybeeasuresmberOf"xico"u])icrosoftddleonaco"golia"rganocco"styN=ACC"= M"=8TO"C"EA"IB"O"SG"Z"])amibia"tural Resources"lyepal"the=rlan= ds " ])=iger"ia" ]) onrthway"])wO=APEC"S"U"=!ECD"S"])IC"NU=SAL"PANAL" =EC"neurverallP=CA"=,acifickistan"nama"])raguay" =ul ennsylvania'srhapsu"])te"hilipoland"])  pulation"rtugal"x roceedingsudentialuertoQUITER"G"== ealisticallyducefining grettably presentationublicans sponsibleutersomania"ussia"=])S=AARC"CU"])DC"MELINE"PAR=TECA"C"])=F"alesnudi easonallycondllingrbiaholomrt imultaneouslyng=apore" ]) =kepticslovakia" ])eni=a" ])omalia"])=ethinguthpai=n"])=quibbtablendard" erilisation uccessfuldan"])garriname" ])weden"itzer=land" ])ymposiumTaiwan"])jikis=tan"lkingnzania"echnicalxtha=iland"t e&ir)re 's sey is  us%odaygo"])shiba'swardraining"inidadpleunisia"rke=y"=]) menistan"U=AE"DEAC"K" ]),N"=h])=AVEMCT= AD"=j=DO=F"E=S=CO"=]=FICYP"HCR" I=DO"=_FIL"KOM"=MOGIP"OM=IG"OZ" = UR"SO= M"PR=OF=O=R" =RWA"TAC"SO"!PU"=eS"=5])= SRkraine" ]) ltimatelynlesstilruguay" ]) zbekistan"])V= enezuela" ]) ietnam"])olcker'sW"=ADB" CL"=;])EU"FTU"=4H=O"])_IPO" =LMO"=>])TO"(=])e4 'll#ereve llsternhatenileoindwardthXXX"Yetou'reZC"])=aire"])mbia"]) imbabwe"])])a ction uallydding griculturalircraft"lcoholicfalfa"lum=ina"])um " ])mber"])ndimals"])nualothertimony" pparel"])ropriaterablegonite"emaments" ])sbestos"semblyociatedt ustralia"tomobile = s"banan=as" ])k=ing"rites"ley"salt edicuxi=te"yeans"ef" verage"]) s "igoatnus" readfrui=weries"y"ing"ingingubble ffaloes"])ildingtypass"c=alci=um"ne"sinosava"ttle" bond" ement"])ntralreals"haos"tic"emic=al s " ]);ortling" romium" igarette"]) s" ])nnabar"trus" l=ay"s"earlyimateosething " ]) ves"oal"])st"albalt"])c=a"oa"]) nut"s" ])ffee"])mmercialplementsonentutersncerningretestruc= tion " ]) umertent"-inuedras"pper"]).ra"rn"tton"])untries" )  rawfish"=yfish"])iticalopsude"])shing ucumbers"rrently"dairy" ecoupling"finitemandpletionvelopiamonds" ])  sruptionstracton'teurableeager"sy"ggs"])lectric al " ity"onics"meralds" ])nactmenthancedormousugh quipment"]) speciallyven xcavators"ellent "ptporter fabricateds"])rmsvorablebond"eldspar" rronickelustilizer" ]) s"inance"ial"sh"])ing" ])lagwedour"])wers"odderllowedod"?])s"=tuffs" ])twear"restrymerundryrantic"eshomuit"s "]) uel"])s"]) rniture " ])  garments"s"tt"bond"emstones"lass"oats"])l=d"od#rain"s"])pefruit"s"hite"])vel"ypsum"=hadndic=rafts" ])woven rdwood"])eavilyctic"ides"]) storic"ogs"ps"rses"siery"ydropo=wer " ])ice"fllicitmpair"ortsnadequatecludingreaseinglydefinitexingustrialsurance  teresting"mediaterusive" ventories"ron"+=st vory"jewelry"unk"tekaolin"=rakuleeplargeea= d"])=ther"wisightnite"mestone" ]) quefiedvestoc= k " ])oan"bster"])otwumber"]) ing "m=achinery " ]) = s"gnesite"tite"intain edjor nbgfacturedganese "oes"ioc" ubgfactured s"rble" ineketterialximumye=asure"t"])diacalrcury"tallurgy"s"])working"zzanine"ica"ghtlk"let"nerals" ])ing"]) scellaneousolasses"yb=denum" ])neyretorveuch ltilateraltton"])uallynasdaq"tron"uraleeds%tw ickel"])trates" onferrousmetallicrmallyte uts"oats"])bjectiveffsho=reil"])=fiel=seed"s"lives"=nepenratingralnges"])chards"therwiseverp=aints"lmpayas" er" ])rtiallywpaws"eanuts"rls"t"oplepper"rezfumetro= chemical"leum "% ])harmaceuticals"]) osphates"orite"igs" neapples"lacerntains"stics"tinum"easantywood" olymetallicrk"ssiblytash"]) toes" ])ultry" ])zzolana"recioussent" viouslyincipalting"vateobablyceduressedducergramessiveuning"ulses" micite"])yrites"rape"rewecoveryfinedlativeunching"pugnantturnice"oastedlledotsewoodubber"])m"ye" sal=est"= ])nd" wmilling"])s" ])nchemedecondlfmi nsiblesame"harkeaep"llfish"ip building"])s"oes"])rtage= slyuldrimp"]) ignificantlica"ver"]) sal"laughterhouses"mall"]) elting"oap"da ftmerghum"ybeans"pareices"])raltableggered"eel"])rilised"ronguctural ubsistencetantialchgar"])cane"lphur" nflowers"rplusweettalc"kingro"])bill"ea"k"lecommunicationsx=tile=s " ])5hate re isim=ber"])0n"]) tob=acco" = ])matoes"pics")tallyurism" ]) wery=ractors"densport ationshipmentemendousipleopicalucks"una"gsten"rtle  umbrella" ncommercial fortunateit qualifiedranium" ])= vanadium" ])illa"eal"getable s " ])hicles "ry  ineyards"wastereheat"never ildlife" ])lne"thoutood"])working"l"])rkersuldyams"ear"langzinc"=]){CONSTRUE/TIS:}TCS}:#IMPLIEDREQUIRED&#22;f0001reute 2reute 6reute 10reute 1reute 2reute 3reute 7reute 9reute 21reute 2reute 5reute 6reute 9reute 32reute 3reute 6reute 9reute 43reute 9reute 50reute 1reute 60reute 1reute 3reute 6reute 8reute 72reute 5reute 9reute 85reute 6reute 7reute 8reute 96reute 100reute 1reute 3reute 5reute 6reute 11reute 2reute 3reute 5reute 8reute 26reute 7reute 32reute 7reute 9reute 40reute 2reute 3reute 4reute 6reute 7reute 8reute 9reute 53reute 4reute 60reute 3reute 5reute 6reute 71reute 6reute 9reute 81reute 2reute 3reute 6reute 90reute 1reute 2reute 6reute 209reute 11reute 4reute 5reute 9reute 23reute 4reute 5reute 8reute 33reute 4reute 7reute 40reute 1reute 3reute 5reute 6reute 55reute 7reute 60reute 4reute 5reute 6reute 8reute 70reute 1reute 85reute 6reute 7reute 8reute 9reute 90reute 3reute 4reute 5reute 6reute 8reute 9reute 300reute 1reute 2reute 3reute 4reute 5reute 6reute 8reute 10reute 1reute 3reute 4reute 5reute 6reute 7reute 22reute 3reute 4reute 30reute 1reute 3reute 6reute 8reute 9reute 40reute 1reute 2reute 3reute 4reute 6reute 8reute 9reute 53reute 5reute 6reute 7reute 8reute 60reute 1reute 3reute 6reute 7reute 70reute 3reute 5reute 6reute 8reute 9reute 84reute 5reute 9reute 91reute 2reute 3reute 4reute 7reute 8reute 9reute 401reute 2reute 8reute 9reute 10reute 1reute 5reute 6reute 8reute 9reute 23reute 6reute 37reute 41reute 2reute 5reute 7reute 50reute 6reute 7reute 62reute 7reute 9reute 72reute 3reute 4reute 84reute 90reute 4reute 5reute 6reute 8reute 9reute 504reute 5reute 8reute 11reute 8reute 9reute 24reute 7reute 8reute 34reute 40reute 6reute 8reute 57reute 9reute 64reute 8reute 71reute 7reute 87reute 95reute 600reute 21reute 3reute 7reute 9reute 30reute 48reute 9reute 50reute 704reute 8reute 14reute 25reute 38reute 49reute 54reute 5reute 8reute 62reute 7reute 72reute 3reute 5reute 6reute 8reute 81reute 9reute 92reute 6reute 8reute 804reute 5reute 8reute 9reute 10reute 1reute 2reute 4reute 5reute 6reute 7reute 8reute 23reute 7reute 32reute 5reute 9reute 40reute 2reute 5reute 7reute 8reute 9reute 50reute 1reute 2reute 5reute 6reute 9reute 60reute 1reute 3reute 5reute 7reute 71reute 3reute 4reute 5reute 7reute 81reute 2reute 4reute 6reute 7reute 8reute 95reute 7reute 900reute 1reute 4reute 5reute 7reute 8reute 9reute 13reute 4reute 5reute 8reute 21reute 2reute 4reute 5reute 40reute 1reute 2reute 3reute 5reute 51reute 2reute 6reute 8reute 61reute 3reute 4reute 7reute 8reute 71reute 5reute 81reute 4reute 6reute 8reute 90reute 6reute1027reute 30reute 4reute 6reute 7reute 41reute 2reute 3reute 4reute 51reute 5reute 6reute 60reute 1reute 2reute 4reute 71reute 7reute 81reute 4reute 8reute 9reute 90reute 1reute 106reute 9reute 10reute 7reute 23reute 6reute 8reute 32reute 3reute 6reute 7reute 8reute 40reute 1reute 2reute 3reute 5reute 6reute 7reute 8reute 50reute 1reute 2reute 3reute 4reute 5reute 6reute 7reute 8reute 9reute 60reute 1reute 2reute 3reute 4reute 5reute 7reute 8reute 9reute 70reute 2reute 3reute 4reute 5reute 6reute 7reute 8reute 9reute 80reute 1reute 2reute 3reute 4reute 5reute 6reute 8reute 9reute 90reute 1reute 3reute 4reute 6reute 7reute 8reute 200reute 1reute 2reute 3reute 5reute 6reute 7reute 9reute 11reute 5reute 6reute 7reute 8reute 9reute 20reute 1reute 3reute 4reute 5reute 6reute 7reute 8reute 30reute 1reute 2reute 9reute 41reute 6reute 50reute 1reute 4reute 5reute 8reute 9reute 60reute 3reute 5reute 70reute 1reute 3reute 81reute 8reute 92reute 5reute 7reute 303reute 4reute 9reute 16reute 21reute 5reute 6reute 7reute 9reute 30reute 3reute 5reute 7reute 8reute 40reute 6reute 50reute 2reute 3reute 4reute 5reute 6reute 7reute 8reute 9reute 61reute 2reute 4reute 5reute 6reute 7reute 70reute 1reute 3reute 6reute 7reute 8reute 9reute 81reute 2reute 5reute 93reute 5reute 400reute 1reute 2reute 3reute 4reute 12reute 5reute 6reute 7reute 8reute 25reute 33reute 5reute 9reute 40reute 2reute 3reute 6reute 7reute 52reute 7reute 8reute 66reute 71reute 4reute 9reute 82reute 6reute 90reute 1reute 500reute 3reute 37reute 91reute 605reute 6reute 11reute 8reute 33reute 4reute 8reute 72reute 80reute 2reute 6reute 94reute 7reute 701reute 2reute 5reute 8reute 13reute 6reute 22reute 4reute 7reute 30reute 5reute 45reute 9reute 50reute 1reute 2reute 3reute 5reute 6reute 61reute 3reute 4reute 6reute 8reute 9reute 73reute 5reute 6reute 8reute 9reute 83reute 5reute 94reute 6reute 7reute 9reute 800reute 1reute 3reute 4reute 5reute 6reute 7reute 12reute 3reute 5reute 8reute 23reute 8reute 33reute 5reute 6reute 9reute 40reute 2reute 4reute 7reute 52reute 4reute 6reute 7reute 8reute 9reute 60reute 3reute 4reute 71reute 5reute 6reute 7reute 8reute 80reute 1reute 2reute 6reute 7reute 9reute 94reute 5reute 6reute 921reute 6reute 7reute 9reute 55reute 60reute 1reute 6reute 70reute 3reute 4reute 7reute 90reute 2reute2003reute 25reute 192reute 4reute 5reute 6reute 207reute 8reute 9reute 10reute 2reute 3reute 5reute 21reute 2reute 39reute 44reute 54reute 65reute 73reute 5reute 82reute 4reute 6reute 91reute 301reute 11reute 6reute 35reute 6reute 51reute 5reute 66reute 71reute 7reute 8reute 80reute 1reute 5reute 95reute 401reute 2reute 4reute 6reute 7reute 12reute 4reute 5reute 9reute 23reute 6reute 7reute 8reute 31reute 4reute 5reute 8reute 42reute 3reute 4reute 5reute 7reute 9reute 50reute 2reute 4reute 5reute 6reute 7reute 8reute 9reute 60reute 2reute 3reute 4reute 74reute 5reute 9reute 82reute 3reute 4reute 5reute 6reute 7reute 91reute 4reute 6reute 7reute 510reute 1reute 2reute 3reute 5reute 6reute 8reute 22reute 4reute 7reute 30reute 3reute 4reute 5reute 6reute 40reute 1reute 3reute 4reute 5reute 7reute 9reute 51reute 4reute 6reute 8reute 9reute 60reute 1reute 5reute 9reute 71reute 5reute 83reute 6reute 8reute 90reute 3reute 4reute 9reute 600reute 3reute 4reute 5reute 6reute 8reute 10reute 2reute 7reute 9reute 21reute 2reute 3reute 5reute 6reute 7reute 8reute 30reute 1reute 2reute 3reute 4reute 5reute 6reute 8reute 41reute 2reute 7reute 52reute 3reute 4reute 9reute 61reute 2reute 6reute 9reute 70reute 1reute 3reute 5reute 6reute 7reute 9reute 83reute 4reute 5reute 6reute 7reute 9reute 90reute 1reute 2reute 4reute 5reute 6reute 7reute 700reute 4reute 6reute 12reute 20reute 4reute 6reute 8reute 36reute 43reute 5reute 7reute 8reute 9reute 50reute 2reute 3reute 4reute 62reute 4reute 5reute 71reute 2reute 3reute 5reute 7reute 9reute 81reute 2reute 6reute 7reute 92reute 3reute 8reute 802reute 3reute 4reute 7reute 8reute 9reute 10reute 3reute 5reute 6reute 7reute 8reute 9reute 20reute 1reute 2reute 4reute 6reute 32reute 3reute 4reute 6reute 7reute 8reute 9reute 41reute 2reute 4reute 9reute 54reute 5reute 63reute 73reute 82reute3036reute 40reute 4reute 52reute 6reute 60reute 2reute 3reute 6reute 73reute 6reute 7reute 91reute 2reute 4reute 5reute 111reute 4reute 5reute4966reute 8reute 72reute 88reute 90reute 6reute5022reute 5reute 7reute 35reute 6reute 7reute 8reute 40reute 1reute 8reute 55reute 60reute 3reute 72reute 83reute 4reute 7reute 94reute 6reute 107reute 37reute 41reute 2reute 68reute 72reute 5reute 7reute 92reute 264reute 72reute 7reute 83reute 302reute 4reute 8reute 9reute 14reute 6reute 35reute 8reute 9reute 40reute 1reute 2reute 5reute 6reute 9reute 58reute 60reute 1reute 71reute 81reute 2reute 5reute 8reute 91reute 4reute 6reute 8reute 404reute 9reute 11reute 3reute 9reute 31reute 52reute 3reute 7reute 60reute 1reute 3reute 5reute 78reute 9reute 86reute 92reute 6reute 500reute 1reute 2reute 3reute 4reute 6reute 8reute 10reute 9reute 25reute 43reute 51reute 2reute;,3;0Ö, 5;A0Î C e& Q*À E! F$…, Q0² G  Q  L Q M Q RM) T-Æ Q V Y g Q'amp;lt; A$APLBSBXCKLANDSLMBSPTRTDIAMGNAEELNAROEFGGHSIHMIGINPLCDGIKLDRNWSMCOERICANKGNOR ESBNGLSYWAZAOGRCTVSCUTLANTICVTXXPgence irbuslliancemericanoconglotalanta/SosnoffudecstraliantomedixBABCELNGBUSXYEVFDBIGNFIMDOTLKLTFXYNBGAILRPAOSCOTLROLYULHXancaoerylliumouyguesraodwayusinessCABRE IIMDNSYWLBCOMSIUCIRXNDCSECIFBGPHBOEMVINRAMTRJNKPLDARITMIKASNFPOBAMSPPBMLQSLQRKNARSELXTCMEUSWEYL<RZMadillacpitalrnivalhacoemieietibank ommonwealth ntinentalrbyreditowleyDALBCADECFCGNIASCMDPSNPCQURKNVHYNAavisrexelECONEFHGLPXK LECTROLUX XAMPNTGZNQUARCICETSEXfibanca lectriciteFAL BCOHCSIDSEDERALNXCFBVKZXAICRDSVNBRCMSSSTCNYUNCWBederalichtelrstujianGAPRTCAINDENMSTLDNMEDHCNBQREXSXTAOSVWY lowtronicsolduinnessHARDCAELENGIAIINSREMCXNHONRSZNSRCURCWGXZNarbingerealthiramongKongughesIADBMCN PYYDCCFCGAMHSLFCMARMUNXORENTC ERNATIONALFOMGTSUTnvestorsslandJAGRMYNSVOHNINPMNWPeumontonesKASLDNYELTICIENAMSZ TCCWPienaLENFGTIFLLXNTLOCTSUBEXTinloydstdMAHIRK'STRCDPYLORDDEARIDIANFXGFLLHC)IBTETGIIMBLFICWGNSTOBPRRCMKSFTLSLTCIMARMSXTRYFRAMagmarktra cGuinnessedPromotecridianxidivesttsubishi ioneytoruntainyNAMGTGBBSLCTYEMRWPARKFSIHERSIPNYLMRXSBRDSANYCHMXVBCYNTationalewipponssaneiorandathernOAKBGIODENHSCJMTNERBTXOCOY lgethorperbitPAKSRISBBYCCGGLOULFHABHIEKSKNLLMAYMBKNPRAT ECAMBRIANSIVDCWGJR ancontinentaletroleumhilipsoenixolysar recambrianQCHREDXKGLTVNTMRTZTECMCUOWRACDELLVXFENGISHONLABOGHKLRTOWEPALLOTRCOSLATBCNRSenaulttahoneollstrSYSBNCNCEEQDTFGDIXGCEPLHEPUIEGLCEMEDLSNETWOAFCSPFILFLKXQBRDLTKMULLIVANPETRONAVMandozcott'sediohearsoniemensnna mithKlineocieteterlingulpetrommitTA BCXCBERVIYXFBLXHEXLICERMEDPLOOGYOYRATBIRSPSBATCOWAXANTeeconnexheorontoshibatalUKMBIZNIRPPCOSDCREWnitedVANZFSCIDERALANSOVLMLPZOLVWGRWRXoiceWALRNACOTTADFCGGHTHRIFLLAEMBKXNTLCXRSTTCWWellcomeshoodcoXON VRRXYNKZEaHMmericandmpmark'srnemt'"8796Ns ervice ourcewe'rell( "ModApte")Hayes")Lewis")#PCDATA)070090010017235)456)0076)]90087)2)0856100820030069)]7)300)39)]400)WD)56)]600)700)22368)800)279)AAP)BDELCMII)Q)DBR)IBD)@*D)@*L)LFONSIN)HAJI PTEMOCIN)MATO)EX)@*NDERSEN)RIESSEN)RPC)@*QAZADEH)UINO)RAFAT)SA)E)@*AN)@*X)@*TPC)@*USTDLR)RAL)mericansia)ugstralia) BABANGIDA)LLADUR)NGEMANN)RRETO)e)ERGE)TETA)FR)IFFEX)@*S)@*LIX)OESKY)ND)P)THA)I)UEY)PI)RAKS)ESSER ODERSOHN) UNDTLAND)SE)@*ankob)  undesbank) CAMDESSUS)N)P)RLSSON)O)STELORO)VACOBOE)@*T)@*CC)D)I)FTC)GCT)E)HAVES)ENIANGEN)RAC)IAMPI)PEC)@*ME)@*OLOMBO)MECON)@*X)@*NABLE)CEPCION)RRECTED)IGAN)SSIGA)PI)U)RH)OW)S)UDE)ZADO)SCE)E)@*IS)P)hapters ommunist)ntactrrectingsDADZIE) TEUSTER)EL AMURAZ)ORS)MENTSEV)NGNIS)FL)HILLON)KR)LR)S/BBL)MK) OMINGUEZ)T)UGLAS)RACHMA)TCs)I)U ISENBERG)NKEL)lrs/Bu |#PCDATA)*EARN)C)@* A)@*FE)@*E)@*GD)LA)@*SC)@*Us)WA)@*DELMAN)EI)FTA)@*IB)@*UMBARGOED )CF)@*NGGAARD)OE)SCAP)@*UDO)ER)TN) URATOM)@*OPE)VREN) XCHANGES)YSKENS)cus)dF)urope)FAIR)O)@*CA)DA)ELDT)RNANDEZ)RARI)FR)HLBB)INNBOGADOTTIR)OX)@*RIEDMAN)Ns)SE)@*UEL)JIOKA)T)inanceorGADDAFI)NDHI)RCIA)S)TT)@*VA)CC)@*E)OFFRION PLACEA)@*M)NP)ODEAUX)NZALEZ)RBACHEV)IA) SAGROPROM)TYEV)RAF)EENSPAN)OMYKO)SZ)SMP) UILLAUME)eneraloldmantco HALIKIAS)MAD NNIBALSSON)UGHEY)WKE)EAT) RRINGTON)ILLERY)SHAMK)SE)@*OEFNER)FFMEYER)LBERG)KERI)NECKER)USING)VMAND)WARDUSAK)ongI)AEA)@*TA)@*BJ)CAHN)CO)@*O)D)A)@*EA)@*ISI)@*LO)@*ZSG)@*MCO)@*F)@*NCOME)RO)@*STALTEREST) VENTORIES)PE)@*I)RSG)@*SA)@*TC)@*WCC)@*S)@*TO)@*bnslasJAMES  RUZELSKI)YME)ET)OBS)HNSTON)SE)@*anuarypanese KAMINSKY)UFMAN)EATING)HAMEINI)OMEINI)IECHLE)NGLCE)@*SE)@*OHL)IVISTO)NDO)REN)ULLBERG)eeling)pco) LACINA)FTA)@*NGE)UETIN)WSON)EENANON)I)GHTZ)IBOR)FFE)@*IKANEN)T)ME)@*SE)@*UBBERS)KMAN)YNG)ibor) MACHINEA)SHARRY)LHOTRA)NCERARTENS)IN)SE)@*SE)XWELL)YSTADT)D) EDGYESSY)SSNER)XPESO)FA)@*I)HS)IKULIC)LLIET)MCL)SE)@*TI)TERRAND)YAZAWA)NSE)@*OB)HAMMADEDNEYRALESSE)@*USAVI)YLE)PD)UC)UBARAK)LRONEY)RDOCH)STAPHA)archNAKAO)SONE)PHTHA)R)SDAQ)@*KO)TEMETH)WSICS)KR)NI)OBREGA)RM|BLAH|UNKNOWN|UNPROC|BRIEF)SPA)YCE)@*SCE)@*MEX)@*SE)@*ZDLR)ationalorway)vOAPEC)@*ECD)@*IEN)FTEL)KONGWU) LDID="22026")NCE)GPIN)PEC)@*RGS)TEGA)SE)@*ZAL)ctil)PALSSON)NDOLFI) PANDREOU)RKINSON)YE)CA)EOPLE)REZSETA)TRICIOLI)ICKENS)XLACES)DT)MDB)NG)OEHL)TTAKIS)RAWIRO)EVIOUSOPANE)SBR)E)@*TABF)acific) rliament)eggyQASSEMI)RAFNAR)SANJANI)ND)EAGAN)SERVES)TAIL)UTERS+)ZENDE)IBERIOCH)KANOVIC)NGGIT)OJAS)MERO) UMELIOTIS)WLAND)UBIO)DER)ING)PIAH)SSELL)YZHKOV)eserve SABERBEIN)LINAS)MOJLIK)NTER)RACOGLU)NEY) TZETAKIS)T)HE)UDRIYAL) CHLUETER)DI)EC)DKI)T)@*FR)HIP)IMEX)@*ITIS)ONSEN)NGDLR)HASANEH)REGAR) KAANLAND)R)LAM)OARES)LCHAGA) URROUILLE)PRINKEL)SE)@*TEEG)G)ICH) OLTENBERG)PH)ROUGAL)SE)@*UBROTO)HARTO)MITA)OMINEN)amrgent ecurities)eomething uthamviettateoil) TAKESHITA)MURA)VARESHATCHER)IMAR) NSULANONDA)"TLE|BODY|AUTHOR|DATELINE|#PCDATA)+WARI)OERNAES)MAN)SE)@*RADE)C)SE)@*OVOLAS)iny)UCAP)GT)N)@*CTAD)@*KNOWN|MKNOTE)*SA) nfortunatelyitedsuallyVANCSA)RIABLE) ENKATARAMAN)RAITY)ILLANYI) LATKOVIC)OLCKER)N RANITZKY)ersionWALDHEIM)I)SH)NGRDHANA)SIMCE)@*HO)@*ILSON)SE) ORLDBANK)@*PI)estLB)XON)YEN) S|NO|BYPASS)UTTER)OUNG)UZAK)CCM)HAOENGIASE)@*aboutllnd)otherbacon)sedelly)onepd)ut)ycertain)debt)uringe quivalentxceptludingfindingormer)high)inmainlyidnewil)otofil)rdinarypdvsa)ossiblyreut2sales)ee tability) urveillance)taxheoughrade)urn) unavailable)vwhichoithout{MUC) *4*****)****,À ** ********1*************************************************ALLEGIS IEDMERICANPISSETSBROWNCHEMLAWNDELTAIAMOND UN/BRADSTREETEASTMAN NTERTAINMENTFED 'S ERATEDGENCORPREENSPANULF HONEYWELLSPITALIBMJKLILCOMCIOBIL'SODY'SREAGANSORTSS/PTAFTOP REASURY'SU AW KVOLCKER occidental ENTERTAINMENTHECK'SSubjectNote CommodityrporateurrencyEconomicnergyNOT**Textall*forintext+Bahia/AMERICANUTHOR BALDRIGE#c NKAMERICAERSODY-NUS1Ë CBTCCOMPANIES-RUDE1ØD-ATE1…-LINE1à-IPLOMATS1à  EXCHANGES-FED1Ø GREENSPANJapaneseMINTKNOTEORGS- PAINEWEBBER1ØEOPLE-IEDMONT1ÚLACES-REUTERS1Û.SHULTZ2ÑPEAKERQUIBBTEXT-ITLE1Ð-OPICS1½- RREASURY'S1ÝUNKNOWN-SDA1Ù0+"/€)/920/05€20-)1Â0678910 1 2 $3  4 -5!6 79212345 678 9 3012 3 456 78 940123 4 5 6 78 95 01 23 4"56 7 896 01 2 3 4 5 67 89 70123 4 5 6 78 9 80 1 2 3 $4"5 6 7 8 9 90 1 2 3 4 5 6 7 8 9:05:03,8:1012:365:0420:4430:3548:57100 3" 1 2 34 45 $6$728;9 21 01 +2 3 (4 5 6 7 89201 2 4678930123456789401356789:04:057:2023:582 0Ë1345689:15:108:3320:319:2431:0551:542:043!0%Ù012 35678:02:0812:364:08337:4126:5736:588:144/07"®012348:03:1310:111:399:3721:555:2630:244:4148:519:4853:024:408:41569:074850Œ78/888:00:491:493:0938425:186:257:168:5412:177:409:2728:0531:2160Ç02350/0700789:17:2220:331:459:4731:342:1622483:49544:439:1543:047:2653:565:017 1‚4578:01:209:1713:376:047:5121:253:337:178:3241559:034231:0141:424:4355:539:058 0{0123)46:01:102:364:297:298:325711:203:16365:06218426:103521:012:06218573:317:1438:1140:064:23516:088:2651:35494:128:229 3¾456)9:01:346:397:548:0911:10412:08308:2169:314320:231:39582:573:444:40555:486:07177:395130:07481:012:343:0618324:0213575:03226:377:1943538:14628339:1340:41531:45512:45524:47555:1082949546:36557:478:249:234550:342:383:39444:035:4166:037:0028:00359:40VER1/)3Á +/12/87620/87#•324 8 eP,Sept0,)0/500*).È01 2$00 53)09045 2 80645/36727589 00 :00:29455271:1428442:112232533:24434:072363265:1925326:06537:428:12521689:5911:0416263750382:18443:132244544:36495:06446:12247:2943548:1025329:4220:02149451:402:293:395:001546:357:588:089:04273125330:022436581:10262:153:30484:4575:06224416:317:1030408:091389337449:0816223940:256393:344:13265:273644508:4950:081:106438552:383:424:40525:506:407:148:23529:371,"0”/16 21001 00253004390045 0 67 8 9:00:511:59 2:3540513:033024:03712239404575:05717283544536:07136319455087:069182284578:01912214899:07112935894650210:01811392147451:03102204162:0010332437563:0710213294:216306555:0713235835843652386:028314275457:19298:01147203343453789:091492143264245020:017126251:362:061434553:07124:006304485:027496:18477:215158:0928349:4030:481:4372:05213:26364:07125:01126:113040577:002633468:041199:285440:05152630465272:114:00545:105676:1342537:10339475088:3899:093150:08448552:37584:055:33577:198:19362-0 1³012 5 30 45 0#62 75 89 /129 9/1301:04:1111:182:573:273494:275:12357:02926499:1820:341:18422:103:03336:06427:23458:081130:593:25574:246:277:488:09229:085540:021643521:0430432:15373:18334:436:03207:338:0028359:18263150:439571:052:18473:586:19538:509:1320th3+/16/÷00 012 348734 56 78 9:00:01614465:49536:025117507:088:21529:455711:374:17525:047:0516328:539:0821:483:235:2066:03447:04838469:0730:04263:254:29507:5540:101:262:583:344:085:466:4454:455:17267:128:59Dp4*0 .Ä012345567867 04/674689 :22:36 3:253188:03169:1424345830:152:12295:336:528:1041:0928382:0812483:3845544:06275:13587:0820408:209:20950:411:2634532:34583:09334:1255:01102634536:02253146587:12519:035-"1Ú/160 0#N123 45254005466784 88599185:00:511:0162:1720513:275:02314250586:014307:011368:5310:1134441:522:273:01104:2036425:20406:347:1120578:06395299:1053420:13205732428521:1639475342:3363:02364144:0034485:166:11256547:02238:279:304730:221:352:03112532423:15234:0716405:1639536:44537:468:11269:0221344140:261:03103146562:093:14594:23365:192067359476:367:1627508:26349:27445651:12728512:0415333:404:21365:47506:0328398:33449:178243941THth6)0 -Á0 25785100246720335 450678 9 46 :00:0132181:252:173:554:425:1431842596:215587:063844518:11439:02910:0620591:182:102845533:264:485:17597:445822:32413:1223356:2130:25421:012:074:498:19349:3940:00321:16512:09294:02478:4654:1095:596:0314597:13268:339:02157(0,û024 8711123842954778720717283458607131066453 76789:00:295121:282:093:056184:005:306:31477:18445010:03142:06354:555:01436:11215820:2834541:383:126:537:19558:02469:58932:183:465:069:14344340:101:26352:26363:134:235:15247:399:0750:16451:34402:214:04385:026:1855p8&0)Œ1 238356768:00:251:384394:0417245:376:35477:559:395010:341:313:594:24495:096:059469:25720:351:0042:584:01575:316:249:2631:322:183:204:336:051143567:03488:029:025141:595:36406:13338:3550:05573:184:465:486:03734439:239+"/Ž)014 22 89350960s259/7070s2345678 980S s123 4 5*%'s)¶/866,'s0Ì/87 ; 7."2†'s/8899 ;8"9 %w9-0 )(s12 "3+4 5 6 7 8 9 :00:512:27333:264:3185:216:368:099:2710:261:195:32558:4923:426:4336:5644:158:084750:033:55SRT LD0stld2/'s3)/04/8710/8723/8730.+2£/300!0$p0247127234 756789:04:557:0510458:0012:235:2420:391:464:108:3930:173:475:243648:321(0+Ò01)450/723578:'67"9889:02:166:507:339:3015:119:1825:228:1432:28414:5556:402+0.”1 73263456789:26:3733:014:583&0)£1 4523345p67809:12:099:1926:4330:0249:3152:308:21399:0894*".š001234567090/25105,0 0„0/23450/706796&/32*§012356797&0)‚0095/1291234 3 567 898&/32)£07 23456R72899$1']3 56789 th ND nD "d30"4ß)/09/8712/8732 4 8 G0"+'s/¾)00 WER12 56789 71(0,ù1253456 70p8"9p2"0%\1234567893#0&dp 123 4789Pp40"J1 56 8995 $0'c1 2406078960"Z234578970!T1 230456 748980?1 24567 89Pp90812345678 COMomRD StationEherd}4-)1ß/01/876/87320&0)‘);016245678910;52345789920N1 2 3374588930L27345670 584 0C01523469/45017950!O01347/4578567961!A234)356770?1 2345678980G1 34056785 99390@123456 789THWDbth}")"5.)2Í/14/828 0&+"/³/419220(),Æ01 2)456789 1 0#b120/308/38340/506785/952/54"S00 14567930K4 5678940?138567895/70E07345671896$0'a13/5674589p7283 456788 980F12356789p90.1p234578p6,"0ï)/3200!]R912341567891 1p.2345077/82921.2356 78930112356784/6680245678950K1 23456860V1273569584599370N2513 892)375354596879980?0192340678899081823834562489Bp7."2µ)/1/826328 0"!/80$V0 001405810?924567920:2567893061323457894 0#1357s 85%"(‚01 23456789p6 /81(0345):6787">=>256789=8001 2312456899 0'245681=M8.)2œ0/422P0 0+128646789C210+139467892070/151635/454560/705/75708193 /93'013467841/234589 50Y5 67896 11*23455678p70(123456 98 0)12399062345689th]p90"4·)/160%L/940) %127304515661701689839967810$412356786920218924384055602778345893""H00458178922568303464567894 1&3458950=/954 1/955234/95856962@567970/1345898/25/012568990G1345678:;=??±@*article{APTE94` LEWIS94d SPARCKJONES76 begin[format]itemize] lankspace[34 ook{WEISS91 end[format]itemize]heading[Country5 Exchange Organization Peopleincollection{HAYES92proceedings{APTE94bHAYES8990bLEWIS91ce2bde4bphdthesis{LEWIS91dA."2©3001020s40AP'sBA LDULEOUTROADSURDCCEPTANCEEDSORD UNTUSEDIDMEIIQUIRESSITION S REAGESTIONVES UALD"ADSIA JUSTEDS OPTSRVANCEDSISEDORSEA"LROFFECTILIATESRMSG  HANISTAN@*RICA'S)@*@*NTE RG A'sINSTENCYOREEINGMENTS ICULTUREUAYO)HEADDMED)ID(E SSL EENM/RIMRBUS CRAFTESLINEWAYSKRONLASKABANIAERTACIDE'SEXANDRIAGERIAILEGISIANCEEDSOWWASTEPHARETTAREADY TERNATIVESXORONUMINIUMUMZAMCAMENDEDRICAN ON6XOCOSKEAGUNTRESTERDAMNAHEIMLYSTCHORAGEDORRAZVEREMIAGELESROLARYUILLA@*NIVERSARYOUNCEMENTSUALSTIGUALLES@*ONIOYZ'sO"PIPEALLAUDSEIEDYOINTSROPRIATEVALEDS R/JUNE ‘MAY/JUNEOCT78 IL/MAY *TE94brilQUINORABIA@*MIDBORCOEGENTINAEMATRON ONKSYOUNDRAYIVEUBA@*VINS"ARCOCSEAN'sHEVILLERAFIA)@*NKLKPIRINSEMBLETSISTANCEOCIATESIONUMESRANCET".&TALANTARI COR<ATCOLANTAICSSMOSCANT" 'sACKEDU"CTIONSDECIG78NSTINRALIA 'S NIA THOR!ITY$dZEDOSPAVALONCOERAGEIATION NETXWARDEDSEXEbaba"])ldelulaziz)elyoutraham cceptanceordinguntantsingsidknowledgementsme quisitiont ing vesdamsbulditional lyenosineiam inistration ve vancediser sorsyegisrospacetialeffairsiliatesrmedrica "*'s):nter+g ainstency"'sreement icultural  e o nuayoirrehedmedtidesrbus craftes"]) linesplanewaysker sioraronlabamanrmskabertao tacatelideexfonsinredogeriaorithmshajiimullahlanenianceed'swastemanacphatemocinso tex hough on suminium )umvaroeritemarahillotoerica"/'sn.s2» )onherstirtmanoco's ngrnskeaguntspadsterdamutz n a"lysists  ' ticaltoliad alusia*ersenonreasiwiessengelesolo'solausibalnouncedualonymethertarctic honyicipatedlles" ]) submarinetrustoniaowerpvetypparelealsleTalkications "ed ropriationsril *'s.À/JuneMayte{\'{e}}qazadehuino's rabia "nfatngop bitrageurscherieeaiasgentina 'se 'sifinzonakmatronsyne rafngementivalsseniothuricleficialurouba/Curazaovinsahan6rcohervilleia's /Pacificnked sassins emblyssingtsistancetociate d sion 's"`umingranceingt ariturkcoreflantaico ssomictakaorney'suroudecig/Sep tust)$nrelianostralia "]) 's nia thoritiesyzations oSpamakerstededixobiletive vailabilitylecoerageg eKiationnetxelgardyatollahzizucarB!"$e2AACHEKEDLOGDLYGHDADHAMASIARAINKE R ) (LANCESDRIGEWINLADURTIMOREUCH)NCORPSH ARESGKOKLADESHORKAMERICASERSINGRUPTCY SNERRBADOS@*GELEY/WHEA TRELSICKSEHAWICSLERASTTERYLEYONNEeBBCLSC,E0ŸACHONSNSRDFORDETFOREGINSLGIAN UMRADEIZELIESSOUTHYNDEFICIALIN@*TONRMUDAEZ)NARDINOICEYLLIUMSTTHLEHEMTERWEEN VERLYFC HUTANICDDER SLL  I ON SNGQIAN)OGENMEDICALSTECHNICARMINGHAMTHSSAU@*LIZZARDOCKEDREDELOMINGTONNL's OARDCADY.E2ã ING<BASKYGOTAUSLIVIANDHOLDERSNUSOKSTSRDEAUXROWINGSPHORUSTON TI !SWANA@*TOMEDXBOROUGHYSP /Standard DIRADLEESINTREENCO)SILIATTLEBOROZIL 'S#IANEAKTHROUGHIDGEPORTEFLY STOL<BMYTAIN'S ISHOILTXTONOADCAST I NG <TFBKERSOKTHERSUGHERWNING UNEISWICKSSELSU DGET ENOSFFERILDING LGARIA@*LET ISHNDESBANKRDENKINALINGTONMA@*NHAMUNDISHELSINESSESMANTLERY ERINGOUTS IDE Y PASS:R/119 27aabangida cheklog ghdadhamas"ia rainillyker 'sBylancesdrigevinwiniladury ticuchncaorpshares gemannladeshork+'s/Ì)  /Levelland America 's"ersing ruptcy%sner'squeptisterberuda" celo lay'ssendleyneyreto ickowtlett'ssedhawicras tteryudouiny"])zylieachonnru montcausekmanechcraftdlefforegawan"])hindiralgianum's radelsteadnadryleficialgtnettsontonesenylinrettagermudeznardoullisteintilylliumsides ttaetahlehemverly ibliographycoastaldsgldlington zerianngqian oTechnicagen'slogicalssystems therapeuticsrrshoplackburnh%ir(³endersixzzardockeredelomingtonueoardtGbeing'sksyskylter znds n okshelf nerduaissniaphoruston th a ueyrdainxesyraddockfordleesstreetksnchoko odacastingzil"])D'sian  s*eachd ntsserwiansbane ktoltain 's+ishtOainxtonoadbentcast ingway'sdericksohnilerkersok ingssvillesthersussard1wningucendtlandeioscaselstuubblecklerydgetenos ffets ickldingsllndesbank 'sibugyogenerreaugdorfflingtonnhamtonundishnellinessMatet'cher+Çleryersybee!`water'sC$"'hA"BLE DILHE)LACESARSFEKE LEDONIA@*GARYHOUN IFORNIALED S MAT TEXMBRIDGEDENEROON@*PBELLNADA 'S5IANVERAL BERRACELEDRNONONTERBURYONP ABILITIESCITYEITALR ACAS BIDECASSDISEFLEIBBEANLINGMIKEOLINAPETROLLTONSTERETSEY'SHINOTONERSEEDTALOGYSTSTLEUSEYMANBOET CCRXDATAITELLMANTERRALOREALTAINIFICATE STUSFGM56TCGCT'sERISPLIT ="PUBLISHED TRAINING1- ??1³HADIRMAN'S  LONS/MODANEMPIONLINNGED SINGRGES LOTTETOWNTERECK M)ICALELAWNRRYSTNUTVRONICAGOKEN4EFLE@*ANNA@*GPOU RISTIANIAOPHERYSLER'S UQUICAMATAIAFNCINNATIEMA RCLEUITSTGOICORPZENSRUSPULPY FED#TRUSTLARAK SSEAREDINGRCQ)VELANDIFFSNICALOSEDLYSINGURETHESTIMEUBMBEOSSO "4ARSEST@*ALBANCOCOANUT FAIGH)FEE )@*HASSETLDLINSOMBIA@*NRADOUMBIAUSM EXINCOMACKENTRCEIAL ISSIONTTTEEODITYORENWEALTHUNICAT I ON S<DCAITYPANIES0Y4áQRABL ELAINTSETES OSITEUTERSSATTECNABLECERNSSIONSLUDESDITIONFIDENT "RMSGO@*RESSOCO SERVATION VEIDERSOLIDATEDTRUE UMERSPTIONTELINENTALUESRACT S OL VERSIONTIBLEWAY PELEYPERRARBYN GLUTENFEEDP#'S&˜ORATERECTEDSTASTTONSEED ULDNCILTRIES )YWIDEPONRTVE RrP/CR EDITB'sQRANFORDYEATINGVEDITSWATCHILLLIN<CRTRHISISTICISE SSOPS WNAMERICAUDESHESZADOSCEECS ="539378419"FBISX'sTS/SHR UBAELLAR)PERTINORBSRENCIESYTSTOMERTS TING WTYCLOPSPRUSZECHOSLOVAKIA@*abledilhelacesars' feteriasissekelMat 'sgaryif ornia!Zjet ledstexmbridgedessuspbell'snada'sG)iansQl ryberracernononyonpacityitalr)acasbide's diovascularses?ygillibbeaneling'sossonsonmikenegieoleinariersollsontelriervalhosablancaeyhimirnosparsoniteloonerotalystsegorieszation" :ytlevaconeyyman zenoveecildelllionsustennialrbank sraalleSssrealsro'stifiedsartus'hacoirmanllenger<mpionlinncellorry gnelingonpterrges lesteredseveseledentenhammLawn's icalslawnngrneysebroughvalierrolet sn's iangcago ef%nldreneans'miena's eseg prac'stambalavanichristianiamasophersoninowitzysler's uckn quicamataiampiencinnati emasrcleuittgo'siCorpbankcorp's ngzensylaire ncyrkss ude ytonearing rcqvelandiffordtnicalubstered o,'s0ïalst/Ual'scahranoanutdesffee inhennla inlection s"ierynsombia 'soradotumbiamanavbinedustionincogssariamentedingrce  ial( e ission# er&Ž s sttee )2oditiesyore nswealth unicationsst ty  's/pagnieniesy 's")q's rison setitionletionositetrolleruterssatnablecepcionditions fectioneryrence " irmedgress 'Eionalman n ecticutocorail's  sequentlyrvation ve solidatedtanza ituentruction sultantstivemerstelnt inental 's rolvention  operation ves s rdinatingpenhagenleyperweld yrightrazonderoobavezfp nerstonep-'s 1‚orate$ionus"rectionientesgansicassiga tattonuncil" 'steringries ] ywideyrier t vertible&ingtonxyuitoraignestonyeberdits-lliniticismoatianftninoksbyswnudeisezadoyssentubanellarmulativenhardrencytly stomersswt)yclopsprusrus zechoslovakiakierskaD3"7¥'ElectroA"ILLASTON MAGESRT'STAE .LINE2ä.USTER2â YTONC"])SDLBETAEAL ERSSNRBORNVERBATEENTURE ST )2ORC7 8EMBERIDESION/CAPITALLAINESING ERFIELDFEATEDNSEICITNITIVE GREELAWAREYSEGATESIONHIMARVAEDTAMANDONMARK@*PACVERPAR TMENT REGULATION SIGNKTOPPITETAILEDSNEESROITVELOPEDINGME NTICES FLMHAKA IAGNOSTICSLYSISMONDEGO SFFERENCEICULTGESTITALLEMMASUTEDMINISHESSPLOMATSRECTORSSAGREELLOWPPOINTED BURSEMENTSCLOSUR EONTINUESUNTUSSESINGONSEASEPLAYOSALSTILLATEERIES SRIBUTES IONTTLERVERSIFIEDONSTIDEND JIBOUTI@*(LR/SHR=S /BBL/SHAREVDMKNAO"CTORSESLLARME INICA@*NONTUBLEINGGLASWGRADEDNGRADES SWARDPSRILLINGSOPPEDUGSSTCsDIUDLEYESSELDORF N/BRADSTREETKIRKQUESNERAKONTCHYNAMICS SCANadezieiwakotalelastonmascuseraunaialelshskerienkt'stabase ustervides syeaklers' minasenrverbrat /Consumerc/Jan ulMar8ember"'s%{)ision/Capitalliningontrolerfieldfencese's icitsningtelyhesalamurazwareetedhiiveriesormestamandentsevicoocracytic s  'ngismamnrknis  omination sshintonverwapartment& 's)|ositorysts ressediontutysignerkpropite  tinations royerstailedsective riorationroitutsche velopment )9iceslopmenthilloniablognosticslysismondne ckegoseltergestitalllonsonmistrisngellplomaticsrector) sappointmentcountussingeasekplay seminationtanceillateeries sribution orsctttler versiTechfiedidendsionxon 'sjlrsobbins ctorsumentation"sddlanelar's smaine'snicisticingo"])uezicankonnaldsonoravillenantuglasmeng'swningrachma kewingsewxeliveugudleyesseldorfgdaleisenbergkelbinncan hamkelquesne'srakonntingsantcht ynamicsscanE A1FEGLERLYNINGS SESIERTERNGROUPMANPARKTONTOWNC 's_A"GD'sHOLABOLABNOMICST YRA) UADORsDFISONMONTONT)EIPROMsFFECTIVETA)GYPT@*IACGHTNDHOVENUL DERSECTIONSRICITE ONIC SIZABETHKMERSAT"MERGENCYPIRESN COURAGINGDEDING SERGEX YGINE ERINGLAND EWOODHANCEMENT SRGY TERPRISESSTAINMENTOURAGEZONPAQUATORIALICORPMENTTYRACIICSSONEPOL"SKINESCO"MQUIRESEXTABLISHES TES IMATEDTHIOPIA@*UREOBONDSDLROLLARLIREPEANSTERLINGVENDALEINGIDENCEXCELAN PTIONHANGES 1EC5áUTIVE SMPTIONSRCISEOVIRPANDINGSSIONECTED) SIRATION  SLORATIONEORTERSSRES STENDED SXONYES achgle rliernings st "%/Africaernmantoncolabnomics %st sy uador/'sean sdFelmangingtonisontorial"montonundouardsonwardsffective nessganyptian ightichilbertdersectionric al oluxnic sments ginoniassrazabethklenriottmersteinreembassyeryvilleiliopireloyeesmentnclosesergexy gerix0gaardineerings)land 's!)ish hancement s terprise staiment nmentouragere viromentalnmentalzon's quatorial 'sicorpmenttableiesy'srichsson'sekkkilbaum"neststskinescudoertateimated stexthernetugenerobonddollarmarketpe "0])/Middlean valuation _nsenrrenxamplescelanlentptionalhange$'s(È/Bourseequer ludingecutiveovirperimenttsirationlorationort adores ersingsress 'tractionordinaryxon'syskensF%"(¦ABERCESILITIESYTORYHD)ILURESRCHILDFAXIELDMONTVIEWLCONLSM ILYO'sRMER SSSHIONSO@*TERC"ASE ARED B 8s9RUARYD *'S "ERALTEDED ERLOTLLLRRISTEXUDFRHLBBIARFAXBERSDATAELCORELDJILES NAL(NCEI AL  'S NGDEISHEDLANDNISHRECOMMER SST BANC"SCALERVEHMEALVEX serveLASHT XSEED EXIBILITYIGHTSOATINGURPUCTUATIONSYNSEAOBLDSLOWSODSR)CE,DECAST SMANERINGSTSUADNTAINRTHQRANCEISCO S KFURTEDDIEEHOLDIGHTSWAYSNCH SH$ISCH'SOM NT#SITCNYPSEU" UELSJIANTSULLND<DCF INGSRNITURETHERT URESX)aberricscilitiestbook"hdirchild 's faxlyviewthfullylconbridgelingsmiliarreboxgomers swe'sarsturebres iuary&urary*¼d's=:eral!ted$wionederlotssinsteinldmantipelnner ordinandnandezorariistilisershbachwibreschteldataelcoreldsguresldesippo mteringnalnceial Œ 's:erech'sdleyland's nbogadottirishreman'sm'ssstscal<heriestnesszgeraldwatervela eet$orida'suegelollowingods rbes@ced's ecastsignstryman'sttingerosatune undationrthwlerx raminghamncaisee"])''s) scoinescooiskfurt linsizederick eman ightnchresBiday'sDsedmangidaireschtzomntsicalueljianokatsukushimallnaro d 's6/World amentalsingrr'sthermoretureszhou G$&E'“ABON@*INSMBIA ENDHINETTTOSRTNERS<LOU )OLINETETCADP" ENCORP<GYERAL E)SEOTICVALRMANY@* TS H0ANA@*IBRALTARVENS LENDALEFEDM'S<GM sACT)NPOALINGLDFIELDMANODULD<GLDRAIN/OILSEEDSNDPHICEASETER ECENSPANWICHOODNADAFELLOUNDNUTPS"^WERSINGTHUMMAN SM UADELOUPEMRDIANTEMALA ESTIANA@*LDERTYNEA@*NESSLF/WESTERN YANAabbettelliddafioinsllatinombia"e singndhi'snettrcianactners' olineurdvayzetteeigerlbnCorperal 's ueised tingvarvaloffreygraphyrge iaphardt raldhard main n s?y 's5rity holamrezaiancarlobbssondellbertoesovanni rozentralevenlennickmanoeilampenfabriekenryucesteruckmbHobaindeauxlden mannzalez odisonmanrichrbachevdonhamiastyevtthardliebuinlockldvernment  al*orrace+dovilleflewiczmmndvesyeater eceknbaumspan 'swichoodgnfellyhoundimessantiomykootvleissz undp$"'kwers'nthummanpo uantanamorantee dyd ianstemalayaquilenterssestiana"dance lder/Florinianolaumeermonea"])nesslf mbiner9portnnarrdialstavotenbergzwiller yllenhammarohtenHA CKENSACKDIGUEI)TI@*KIMLFIFAXLWOODTMID)LTONMINDNDLINGYOVERSONPPYQ)RAREBOR LEYSVILLEMANTMARXS UPPAUGE.VEYES89/90b 90b] BCAR"EADEDSLTHSOUTH TINGCK'SLENLERPSINKINLEYGCA  ICKSVILLEGHER STSTOWNKESLLSTECH SO"GSLDERSINGS IDAY LYWOODMESNDURAS@*EYWELLGOUREDPESRIZON MUZSHAMSPITALITYTELSUSEING TON SS VUA)GEHESI)MANNGARYTINGTONSVILLERCOTINGTTONYDROaasckensackdiftsgueightonjimekimlcyonifaxkiaslwoodmadbrechtosidpshiretramcknd elsgesmbH nibalssonovers qradimannglanemnoldris t marxvestyana'sshemiugheyvasewaiiizahkeydones"swarde+ad/¼quarterslththrow ingvyweightifersghtsldringengalermutsinkiminghausminghaussleynleyriqueypatitis ralditagemudnandezoldringtonshfieldvey zegovina"ssgiTechgherllerysnemantzramomitsuschsham toryodgsonefnerlffmeyerg jatoleslamlbergdersingsidaykerilandingsyme ndaecker ywellgKong kongrmuzowitzstsnipalitalityseintelsusehold ingtonvmand ward 's "everua!Ogehes /Conserdyneommerndredsgarysaktchinsontonwanybrexdro pothecaireI'm!V/NADBEA"B"CJM'sRAHIMD"CCOELANDHINO'sDA"C'sLEsEEEFAD"C"I" IL LMARKF's MEDIATEUNITYOMEDICSO"PACTTIENTLEMENTORTANTSROVED RE N*C.è$<BIGI(Ø)ENTIVE SLUDEOMEREASEDSING DEXIA@*NAPOLIS CATORSESTEDMENT SRECTONESIA NSUSTRIAL SESYEXCO'SFLATIONORMATIONITIALLAND  MOBILIARIANSSIDERPECTIONSTITUTEI ONRUMENTSURANCEER S'T'LE KLSAT"NSIVETRCEPESTED GROUP<NIILEUKINNATIONAL POL"VENESTIONRODUCE D SVENTORYSTIGATIONSMENT S ORITATIONc formationvestmentOC"MEGAWAPCOMA'sRANIANQELAND ONSVINEGSLAM)@* ABADNDS@*O"LATEDRAELSUEDSING TANBULT 'S!ALIANY'S@*OHSTU"VB ORYXLanbericarahimcahnelandhidahof gnaz&elankkal inois marmarkec mediatelyunexomedicsperialortsrovedment sn-Touch1c,'s0“)'sentiveshludeso'smereaseddeed finitependentxing ia"nacator svidualonesia 's nsuez ustrial s e s  "0 ])y exco,flation aryormation al gallsvaritiallytiveland mobiliarianovativessititutetalmenteaditute  s's*ion al srument surance tel&ligence " tstatnsiveractivegrabankcable 'sestfaceirst 'sgroupimleukinmediate cs naltional+ 's/×partstateventionraocularoduction ventoriesy stigationsment  o sors omega waran's .ian s "qiselandnaeishonshvamingwinslamic nd"])s"])Geraelistanbul'st/'s3ûalianately's )ohsvanJACK"cSONVILLEFFREY)GUARKARTALMAICAESTOWNWAYN /FEB789EIROUARYPAN @*;ESEXEDDAHFFERSONTSOB HANNESBURGNSONINTLLA NESRDANSEURNAL UL/AUG/SEP78"N7¥8 EJO) WPabbarckamanobs"quelinesffrey guar'simekarta'smesport6townwayn/Feb Mar8eirosvillezieuary%'s)¸pan%'s (Å) /Uese romir#uzelskivierymareeanddah epfferiessonreynkinsoeretteremyomerittsyseyt immy oe hannesburgn 's"])$sontonsen nases} grdangeiose"])phurnalzefruandgesonenl/AugDecMayNovSepynIe$/July'‡earlyshortjoiorrysticeK AINES$«LAMAZOOMPALAUCHEANDEEL)G)SASSLER EIAISHANNEDY)TYA@*NPCOYGHAIL)NIENAMSNG OCK)DAKHL'S KOMONGREA@* TE)SZUALA O)WAITIYaineskimotoleviominskypalaelmanndeelgsaspchorwa rasawadamanendenlnatake olythleensuhikozufmann"ndawakamibeating'sersmaekerhiaishakichithlvinatormpnannetht uckyya'snzaburopco'srosenevlarystonehailmeininrkomeiniidderechle lnaichi limanjarongdomstonrktchensjellleinwortine'sugtnechtowledgexudochankdak'shlivistokusaindog" ]))rea" ]) 'snn testasziolramereitzbergsgeohnlikna/Crowne/Crownualabiak likowski"lbergorodatcebezwait's is yodo waL$"'vABATTELLINGORATORIESCKAWANNAFAYETTEKEMBERTNDOVEREGUAGEKASDALEOSPEERRDGEROSIERE)STTESTUDERDALENCHESWSONYING OFFSBSD'*'*'*CPEADSEINGVESBANONCLERCEGALISLATIONORHMANNDINGONE@*SOTHOTTERVELWIS90b1d2b ce4bSPLIT ="NOT TEST"3;« RAIN";‡ ??XINGTONIBERIATYRARYYA@*CENSEING ECHTENSTEIN@*FESTYLE TIMEFETEDSGHTKELYLCOMITEDSPSNCOLNESK EDSEEDZONQUIDATEITYSBONTTTLEVESTOCKKBLOYD'SXOOoydsMEO ADNS CALKERTITEGICIRMBARDDONNDON!G%¦EROKSMINGRAINSS ESSTTERYUISIANAVILLEVREWER S STPQSAT"TCB'sD V UMBERPURPINSAKAXEMBOURGTECYnchaFox boratories yur's scinaombeidlawkeheadswoodlliermbertnce desbank s"e'sgeleyuageetinsingraosiererysensarerWritert test2in  oamericanos uderdaleraentitsvanorowrenceson's tonzardeaderingguern"ingseingbanonducedsnanonftwichgionarioslationhman igh"tytzndingnaronvelinttwinss"'i abilitiesberaltion iantyoryanenfetime fe'sghting ikanenkelcomaitedncolndaerghnere'ssoilseedzonptonquidityorrasbontedinguveloyd'ss oan s,caltionewsgicsticshnkkenmbardndon's mgrho okingmisraindssstusuisianaville vre wertd-'s0Òubbers omirfkinganoiszkmanmpurndayysakatherxe=mbourg " tecuryybrandnchg on/AtlassM%"(—03A C ANDREWS/FORBESO@*HINESMILLAN ROECONOMICDAGASCARRID)GMANETICSINTAINSZEJORKER SSLAWI YSIA@*ITA@*VERNNAGEMENTRSINGCHESTERILANESMANN Y UFACTURINGYR 8µATHONCH OM4GINSINEJORIEKET I0NGSNE TINIQUE TRATRESSURITYURITANIA IUSXTORY 7#8$FAIRZO)rchCDONNELLILEAN'SDTEADOWSLSURESTD FORDIACALUM ETINGLBOURNEROSEMBERSHIPOTECPHISNLOPCRCURYGEDRIDIAN RIMACKSAQUITETALBANCSROMAILZXICANOGMT<G AMIHSIAMICHIG ANRO CHIPSDYNEDIVESTLANDWESTGHT LDFORDKLER)PITASWAUKEEMCLNERALSSSINGS TERSRYNEAPOLIS SOTA TONKAORSTARTSSOURIUSETISUBISHIIXEDKNOTELNTV!gO"BIL'SDELEINESNACORCHDAYETARYY  ITERM#KEYOLITHICSANTOTEREYGOMERYHLYSREAL VALEYODY'SRE RATORIUMEIA) GANIOCCORISTGAGEONSCOWTTOR/AMER ICASUNTAIN S VESZAMBIQUEP/14seUCQSTHS SUHUA)NCIERPHYTUAL acAndrewsIntoshKenzieMillanSharryciaedonia"hineaskintoshlin'sdridgazinesma'sneticsilsonnezejidlisorkatiersotoumbilawiysia"])'sncolm hotratavinas)"nagement  's$ringcerafordhattanila 'skowskilynesmanningham 'suel facturers ing y oist r/May8acaibothoncelh)/April-âomsusgaretoshesianokanaesotimetimeket  ing s linmaratensiny uvinylandsaoshions achusetts. ;etteorialsin'sraixtressyasunoricextecorwelly'/Aug*ÁDecJulNovfirststadtzocCainrthylureDonaldsnellEnteeGinleyovernuinnessInnistyreLawhorneanNeilldeadnstimewhilesures tdalliongyessyiacalreine terranean etinggaradijinkelbournemoriesybanktecphisn'srcantilehant skurygers/Acquisitionsidianlinrillx ssagenertalbancsromailpolitanxicano 's yeriamichael el7leigan'soronsoftdAmericaConcondleeast ivestlandwestguelke haelillosulic'slaneitaryk ledgevillerietosavljevictonneralssworkersimumngster!'s%û)s 'ry n=eapolissotat roslavrorsionessilesssippiouritchellsubishiiterrandyazawalotok obil'sckdApteHayesLewisels" ifiedhammadedsenilpusmentunnday 's2etaryy %/Foreignicaolithicsantotagunaenegro" ])hsreal's yody'sre ralesbellieiaovergan i !taningoccosetgageimer'sonscow's stlytors ')) untainssavivementylenihanzambiqueilorsthly suammar barakchhammudualroneytifoods nfreesboroi"cipalpal rakhovskyokadochvillephyrayskietafatualy ersrtle N+AILENE. ROBIKASONELYSIS)M"EDSIBIA PACHR'sROWSSADAQ's HUAVILLETIONALS#URALVEMYZER)BC'sEC'sKEDEDINGSGOTIATE D SPAL@*RCIT"BACKS&¡CENTERHERLANDS @*WORKUTRAL W.ARK2‚ID):="1"0" 001" 2" 3" 4" 5" 6" 7" 8" 9" 1" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 2" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 3" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 4" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 5" 0" 1" 2" 3" 4" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9"1" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6"2" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9"3" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 234"4" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1"5" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2"6" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2"7" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7"8" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8"9" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1"2"0" 001" 2" 3" 4" 5" 6" 7" 8" 9" 1" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 2" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 3" 0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 4" 0" 1" 2" 3" 4" 5" 6" 7" 8" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8"1" 001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8"2"3"4"5"6"7"8"9"3"0" 01" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4"1"2"3"4"5"6"7"8"9"4"0" 01" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9"1"2"3"4"5"6"7"8"5"001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7"6"001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2"7"001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7"8"001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4"9"001" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5"??NGTONLYMONTSPAPERTONtvadaICARAGUAKELDO"GER@*IAPPONSCOSSANJ"L'sO BLEMINALTESURANONRANDADMTHEAST RNWALKY'ST E): 1985x6CompanyDueS: V7EMBER'SWSPATELSAT"UCLEARMBEREREXRSERYING V"'sYFE NEXSEakao"sone'smibianphthaierrain ragansettshuavillekosautrotional /Domestic"[esl risuoural's westval y'sylorzerionaleearbraskaderland gotiationsorsilltherlsonmethrcoiosit)back-µherlands " workvada erthelessw.hall2älymont's portsgiallcaragua nholasskellesopolisderagelriankkeioolaine th>pponrenburg )ssanoble oruregauyukiminaluran ethelessfarmrandadicnfolkiomansketh brook%eastrnway "])'segiante: s, ificationngv/Jan ember's1rcoo"])wuclearicmberrsery yang'anyiO "e'BrienCofaighnnor'sKeefennedyMalleyAKLANDS"TSCALACIDENTALT7±8 OBERECD" 'sS"F+F.¦E @NSIVER ED'INGS I CEIALS (OR" TELHIOIL/GAS IFIELDMANS/FATS EEDKAYLAHOMALDID="10914" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5"1914" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60"3522" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5"4522" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6"5522" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5"6321" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8"7062" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8" 9" 90" 1" 2" 3" 4" 5" 6" 7" 8" 9" 100" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7"8419" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 511"9419" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8" 9" 90" 1" 2" 3" 4" 5" 6" 7" 8" 9"2000" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 369" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8" 9" 90" 1" 2" 3" 4" 5" 6" 7" 8" 9" 400" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 596" 7" 8" 9" 600" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3"1651" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8"2027" 9"30" 1" 2" 3" 4" 5" 6" 7" 8" 9"40" 1" 2" 3" 4" 5" 6" 7" 8" 9"50" 1" 2" 3" 4" 5" 6" 7" 8" 9"60" 1" 2" 3" 4" 5" 6" 7" 8" 9"70" 1" 2" 3" 4" 5" 6" 7"984" 5" 6" 7" 8" 9" 90" 1" 2" 3" 4" 5" 6" 7" 8" 9"3000" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 4" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4"984" 5" 6" 7" 8" 9" 90" 1" 2" 3" 4" 5" 6" 8" 9"4000" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 1" 2" 3" 5" 6" 7" 8" 9" 20" 1" 2" 5" 7" 8" 9" 30" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5"423" 7" 9" 30" 1" 4"5039" 40" 1" 2" 3" 4" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8" 9" 90" 1"544" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8" 9" 90" 1"6837" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7"7446" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70" 1" 2" 3" 4" 5" 6" 7" 8" 9" 80" 1" 2" 3" 4" 5" 6" 7" 8" 9" 90" 1" 2" 3" 4" 5" 6" 7" 8" 9"500" 1" 2" 3"8914" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2"9914" 5" 6" 7" 8" 9" 20" 1" 2" 3" 4" 5" 6" 7" 8" 9" 30" 1" 2" 3" 4" 5" 6" 7" 8" 9" 40" 1" 2" 3" 4" 5" 6" 7" 8" 9" 50" 1" 2" 3" 4" 5" 6" 7" 8" 9" 60" 1" 2" 3" 4" 5" 6" 7" 8" 9" 70"??MAHANITSN&E )nPE C's NING SRATINGONSORPOSESITIO NTIONSZZ'sR"ANGEBITDERS  GANISATIONS1ION5àLEANSSLOTTAWAUTBOARDLOOKPUTSIDE TANDINGVERTIME WENSNEDRSXFORDOCOZ"akts bjections ccidentalurrencesean"t/Dec¢JanobererBeienfferediceials ice hioil '/Gas<seedkadalhomaiyamalahomaongwuutsu ldsmobilein jeselskapofmrannce,es9gpinlynotarioolders pec'sr atingXonsorsortoponentsrahtimistsonsr angebitcasderseganicsationzation iginally onkinoleumrtegaysakalotensiblyther stawaingerout boardputstandingverlandseaswensnershipxfordocozakilPAUCIFIC KAGING TID NEWEBBER KISTAN@*LLADIUMICEMKERNEL ONAMA CONTINENTALELHANDLE/WPERBOARD UARAGUAY@*EISK LIAMENTTICIPANTLYNERSHIPYSADENAEDENASAGEEDSTENTULOXARYMENT SOUTSBXC'S sA'sTs!jD78310EARLGASUSKINGMBERTON)NG)NEYTLANDOPLE1RIA5æPREIRA)FORMANCEJURYKINMIANPETUALSISTSONALUTROLEUM S HARM ACEUTICALSIAH ILADELPHIAIPPINE S ' @*SLIPS<POENIXIANOCKSTURESEDMONTLLSPELINETSTSBURGHWL480ACEDMENTS1INFIELD5éSN E NINGST  ING STEFORMSINUMCDT EADS SANTVILLESSEYIS)MUNGE?YWOODMDBNGOEHL INT/BANKAME RICACONRAILINGSLANDICIESYL NTIACRKTAFOLIOLANDUGAL@*UESESESSIBLETEDINGSTATOULENCWERR ECAMBRIAN ISIONDICTSFERREDLIMINARYMIERPARINGSENTIDENT IALSUREVENTICED SME BANK NCEVILLEVATEISED OBLEMSCEEDSDUCERSINGTIONSFIT SGRAM" MEMEDICOINENTSEOFPELRTIESOSALSEDTECTIONISMVESTVEDIDENCENCESIONXMIRESFRENCHUSBRTABFUBLICATIONS SHEDRCHASEOLATORSHESTSacifickers fificgo"])ineWebbers eskistanislapaestineladiumemerssonmpanayotisdolfipandreouerboard 'suaradisemountusstatalentttiibassk,erinsonliament 's rish ticipatingners'hipsy's )scalitentshmarkriciakolul xar*yable2e ments z"])dVSAeabodyrl veychineyktenggyhrkingmbertonexndinggh"]) nsylvania 'stagonecolandople'sreiralmanzhapsiodkinlemanentianpetualrysonalusetaoterricioliobraschemicalleossum /Oil:nas's harmaceuticalsiaologyiladelphia 'sippeine sslips 'oenix'storasalysiciansianockensturesedmont's rceresongllsburynepelinezzeylan"bureauningstteinumc's5easesseyisungingoconoehl'sintinglandicysh tburo)ynesia" ]) meroynd'st'siacor'spular tion "rktalersmouthugal'sues esesitionnertingstentialtakisulenc'strywellrMate rairiettwiroecambrianision 'sferenceredliminarymierparationscottentlyident" ial%—suretontaxoriaviousices maryeBankYncetorvateisationocassinieedsssing orsducersing tion s skter fessoritgramject skoskilogmedico 'sinentsingpaneertiesysorbatection istvevidencencewlerxmireudentialtyublcicrchaseingolatorsuantQATAR@*EDTLYR"LY&ÞUAKENTITYUMRTERLYZESTECHICKETTOOTASEassemiziltytlyr+lyuantumrtzebecstions ")istteotation sR ""ABOBANKDIOILWAYSNSEDS INGNDGEINGPESEEDIDSTES+IOONYTHEONZAZ)BHEA CTIONDER'SMEFFIRMSGAN'S LIGNSTYBOUND CAPTURINGEIPTSVEDRSHIPSSSIONLASSIFYORDVERYDEEMUCES EFFINANCESINGERYINGLATIONECTORMUELING SEGALIONSTRATION SULARTIONORSINCORPORATESTJECTIONSLATEDEASEDMAINSODELLEDVALNEWALSTA ORGANIZATIONPAYLACEMENTORTED SUBLIC@*BANKLSEDRCHASE SSCHEDULESEARCHRVE SIGN ATIONSORTSURCESROUCES TAURANT SORATIONRAINEDICTIONS VEUCTURINGULTSTAILLIATIONIRESURNUTER$S(¿0V4îEALSNUESRSEIEWINGSSED SLON XNORDcordvsHONEICA EHARDSONMONDGHTSNGO SE S ING VERM%OADS)ÁNAKEOKECHESTERKFORDWELLGERSLELINGSM's ANIAEOTER RERSA)ETO TERDAMUENNDUPWENTREEYALCE SAT"UBBERLESINGNWANDAYEabobankdiousnikfnarsanjaniilroadwaynssedjivmaswamyonndpidrestamtesheringsulwandizymondtheonzazeader'ssgan's_l tech orsybates eccaceiptntlyssionombivaxmending nstructionrdd2field edf sfcoerring inancementeriessingorm ganrdlessionalularlytory habilitation idgefieldnsurancelationsvelyeasemigioovalnatoultota'sordplacingorts resentations ve'ssublic" Bank- 'san  s"quiredsearchrve sCorts'urces eces"pondingsibilitytorationultsmptiontailers nedliatoryirementrieval "urnunion"])ter*s.£ ):-ävenue siewlon'smac olutionarys#xnord'à'sye'snoldszendehodeneiberioca"nhard son fieldmondterkelso"]) jsbergen}"kanoviclwanungittuette"ossesingveryadhlobert s'oninlesckwelldinogers'hmjaslandflinss'maneronaldda enoterrysemarienbergstamtoterdamuenghlymeliotistinewelandntreeyale cezichubberioyderingmanolfhollahlemakingsmorspertiahralsdu sellthudyanzhkovS/&L3ÈP/LPA(A)ABCHSDDLEBROOKFEGUARDHARANIDL" AAMHEDDINEM S M<ONELLAOMONTVADOR@*MELINE]:OA@*N CTIONSDOZTAE IAGOWAORANEYIAT"ELLITEUDIVINGS XONYS *T-¤YARI)CANDALIAEPTREHEDULEIENCESO"ATT'SSDALEREENUTINISEEA FARERS'MENRCHTTLEWAY CAUCUS ONDARYRETARYTORUREITIESEK ERS INGS  MS N QSL?ECTL ERINGS MI'CONDUCTO R SOLINANATEORSEGALTENCEDOULP78TEMBERRIOUSVEICES SSIONT " '-'s1³BACKSTLED?MENTSYCHELLESptemberFRG"MLHAFFERMROCKRE D HOLDERS ING(PLYEARSONLF LIELDOCKEP'SRTAGELYULDWRULTZTDOWN ICKLEEMENSRRAGHTINGIRNALIFICANTSUPLKVA)ERNGAPORE LEKSOUXTEUATIONXLASHIGHTLYOWEDINGLYRMALLPOXITHTOWNNAOARCIETEYFTLDMALIAENAT YONRGHUMOSNOFFUPRCESTH AM&ERNFIELD LANDMARKVIETWINGSYBEANS OILPAIN@* RCKJONES76EAKERCIALULATIVEEDNDINGTHRIFT INLITOKANE ESMANRTSWEARTLIGHTREADSINGFIELDSURQUIBBR'sIWTABILITYZEDLEGGERKEMFORD NCEDARDWOOD RTSTE SISTICSOILYEADY/UPRNSELM PSRLINGWARTGILL MULATEOCKHOLM4MARKETS/CO MPAQLTENBERGNEPRAGE E S UGHTONRATEGICEETNGTHEN IKESONGLYUCTUREUDIESYRBRIDGEUBPRODUCTSROTO SIDIARIES YTANTIALCCESSDAN@*ESGARGEST ITSLPETROHURMITANBELTURYSEEDWORLDPERMARKETSPLY)ORTSRINAME@*PLUSVIVALESSPENDSIONVCWAPSZILANDEDEN'SISHISSTCHED ZERLAND@*eetYDNEYOSSETRACUSEIA@*STEMS%aab baherbeinleoyachs's )farieguardwayhara"])nud idntlaamheddinemsinasYomon tvador" ])meoa"jlik uelnchezdozrafordtaer iagooswaoumaracogludinialneytzetakistelliteheoshiurdays udilndersonvings xon0ying yaricaniarborougheptrehackdelledulererlangechtossuetermandt"idtneiderroderuleriences tificorestt'swcrofteafarers' leysonallyttlewaycertaryondrecytariaty"tion%gsorurities" '%zydiokiedq'slectionmi Conductor conducteurs or 'snate  or;siorsoulp/DecMayNovaratelytember 'sUriesvice Master*s ing ts tlement "]) svens ralhallow mrocknghai reholders spe earson 's)ikhlardbyvillelibiaoeldngeruntaroyangapmentsownerspingsoemakerlompretlyuldw"ersr&ultz*°' njiroiberiansonckleegelmenswgnallaskwormvaermitisonsenulation taneouslynaicelair gaporeerhalsanehouxregar ivatx kaanland illliferoanepemallerithKline sonolinskiynanowyderoarescialisteteyft warekorrilchagaidaritytersmeozaDnatsyrghumiaossasnoffund prcesrouilletheastKrn'slandmarkviets 2ybeans pacelinkdinein"])nishrks roweaker's ingcialficallyulationechdncerdthriftiritlit:sortstringskelquibb's taffhlmanmfordncelldard ing'leyr lantste's;s&))|manionsticsoil suffervangerdeadyrnseg lrs nphanensrlingns ven s onwartichockholmXsdgellltenbergne phrageesies" monttlervallweraitstegicusseet ip")ohmaier ngugaluartckertdiesyffsub committeeroto scription sccessfulhdangarcanehartoudikersselbathlivanompetromatraitaomo mingn'sadadays flowerseedlawoilwoodrldominenperiormarket splies yremerf ace prisinglysanpensiontheeichairovendtozarwameden'sishttisstzerland ydneymmsptomsndromerianstem s")T("+™AC"OMAFTHLEQUAHIPEIWANKE OVERS LKINGS LAHASSEE MPANKERSZANIA@*NPIOCASRGETIFFSXES +BNEACA"HNOLOGIES<CIH Y /NEWECOK LECOMMUNICATIONSGLOBEPHONELS MPELETONORARYNDER SGNESSEEXSIONRADYNEMIFLEXNALTESSPOL"RITORYSTSET"TERBORO1VAXACO*ST0)4áILERONchnolgyxasF1HAILAND@*NTCHEREATER MSELVESNRETAINOKOLRDSLOMSONRNYUSREATENEDSEIFTOUGHUURSIERCOSTMEYERGHTERMELYSN TLE/O3·,BAGO@*0ÇDAYGOKYOLEDO :MORROWNGA@*IGHTN AY/CHARENTESESOK PICS1"5š ="BYPASS"NO"Y.YES"2‰.??2­ NOSRONTO SHIBA'TALOWAWERLENQRACORDE RS0SINGFFIC INING NSAMERICA NERSFERORMVELERSRSECEASURY'S TSNDIANGLEBUNEESMEDYNENIDADPLE ONICXUBLEDY REASURY'S UCKSMPSTCO RPTLULSAMBLENGISIAOBIN)RKEYNERSTINVWA'sO YPE :="BRIEF"+UNPROC".Ëa Cbakorft'sgshaniwainn's esekahashieshitauchilkingsmbapauranganyikakerzania's ppanriffstersk"urusvaresxationesyloreamsterchnicaliansques"ologies y 's gucigalpahran's klecom municationsputingfonglobe 'sraph ) phoneiquesngnacosionsradyne'sminal'sspstrariertory"sting tsuovaxacos tGilesonronhagardilandt cher 's e1atre5È irre mo*seta "yiebeault Dokolrdsxogel romsonrsteinnseusandsreeoughursday's ssiercotmeyermarberesothy n sulanondatlewariobacco go"day'sernaeskenyo 'sOledomansbsmorroworrowng"olspazlissriesontorance yshiakiba's tal uche wardserle n"])ykoootaracorde'sX)rsingtionally iningnsAmericanactions merican'sformitkeilatedport ationvelers rlerseasureriesy 's#Wianglebunemedynemingonicyucksmp'sst co%eeshipsovolasuccilloesdaylsaobinrbengutkeyner'singoverwoypically U-AE1ºWCAPGANDAK@*LNAVEMCHANGED TADDERLYINGWAYEMPLOYME NTSCO"VENIDO"LEVERONIST T%'S(~EDS VERSALKNOWN.?2ÙLIKELYMITEDPROCRESOLVEDTILRDUSUAL VEILSPDATE¯GRADEDSSR ANIUMGENTSUGUAYS"])A@*GEIRirDA ED 4";1RI'sSR"])@*X'sTRECHTedagandallman rich nadjustedderlying3standingwaterriters ing employmentielever'son's>)tary ed)'s,•syversalityx leadedsssecuredusedphamstream ruguaysageingtah ilisation tiesyyzationV AILFLEROLEYUESNCOUVERUATU ZETTITICANBoiceDAEGASHICLESNEZUELA N TURERDE ITYMONTSLEFRIKKTOIA DEOETNAM WGILANCEIINING RATEKGINUSSITMSOCLKER'SGTLELCKERKSWAGENUME/OPEN SVOTESWS RSW 'sRa al lero'sley"])ncouversasantegas"etablehiclella"])nezuela 's  nice  kataramanturesradale"ft itymontsionslefrikktaicentetimsoriadeogdisorousktorlhenalanuevayincennestingtnersratekginia sion thoontoriolatkovicoegtleicelcker's$ksbankwagenonumevo'sns ravetvuthikunytkoranitzkysevolodW A" GE/LABOURITLLNG TSRDEHOUSENERING:SRANTSTRADE ENSAWSHINGTON*TE.ëTCHINGERBURYTOO)SCL"DEARHOUSEDGESTONEEDKILLERKLYIGHSS91 ZSAECKER)LCOMEDSLINGTONST ER NLB MINSTERHALE)@*EAT )@*+ELINGNIRLPOOLTEO"ICKESDENSESTLLIAMS MINGTONSONNNIPEGSTER HALTERSCONSINTH  DRAWNSlliamMO"OLFSBURGVERINEODBRIDGELANDSLWORTHRCESTERKERSSTATIONLDWIDE RYTHULDRITEDOWN SRSTIaggnerko ldheimikerl sh $terwynngrburg d'shanaefarexinfarehaftignerrenshipssatchhington  's<imtettoo ynese 've )althverbberddgestonenesday 's eklyinbergerstein" )sbrods"zsaeckerllTechandsshtrnersleyt 's#…LBardeutscheern 's&inghouseminsterhalingteatleynreile rlpool  'ste wam&olesaleidegtonlfriedliam s$soughbyymingtonson's0m nfreynipegterhalterreless tschaftswochesc)onsine thdrawal inoutterojciechlverinenodcohouselworthrkers'shop"ldthRsuldright 'soughtXEROX IANNIAN)OPING)JeroxiannianopingY"ANKEE%tRNSINEAR#S&iMENNSUTTERFCIELDORK*R.• UGOSLAVIAamaichimotongkeenissinseruhirotesearmen]nsterday 'sutterieldmingoramk)shiko,œungssriugoslavia 'sZAIRE@*MBIANEALAND@*NITHIANAMBABWE@*NCPYANG)URICHairekmbia'snbigniewealand'sllerbachmljaricnithhaoengia lbersteinmbabweanncnsmeryangoeteurackich ["10062836"]) 134661"]) 264628"]) 404862"])8280"]) 677067"]) 1064344"])39006"]) 90431106"]) 25149469"])864"]) 3132191"])59352"])9299"])50557"]) 4295501"]) 58739257"]) 616882"]) 903400"]) 7225185"]) 8077419"])9124"])42"]) 208949"])15129"])261"]) 446902"])55827"])73055"]) 895068"]) 8113997"])4653"])3"]) 142182"])684"])790"]) 342154"])74085"]) 912994"]) 521517"]) 577556"]) 782543"]) 409550"])12599"])23120"]) 4277014"]) 651485"])97614"])8427"]) 5068931"]) 187821"])30136"])41710"]) 466771"]) 927108"])5223"]) 681025"]) 752511"]) 840445"])85683"])98"]) 60765028"])1158"])24747"])3930"])4762"])5545"])7052"])16380"])30084"])1296"])64382"])84456"]) 719445"]) 826075"]) 954974"]) 81087506"])7696"])99986"]) 959300"])73"]) 803576"])ABEDA"CCT"P"G"PEC" ccra"])ddisfDB" ghanistan"rica" lgiers"])ndorra "gola" rgentina"menia"sDB"mara"])  ustralia" ])ia"varua"]) zerbaijan"BCIE"IS"SEC"aku"])ndargladesh"ui"])jul"]) eijing"]) lmopan"])nin"rlin"])ogota"])livia"snia rasilia"])zil" zaville"]) idgetown"]) ussels"])uenos jumbura"])rkina"ma"C"ARICOM" ])BSS"CC"E"I"airo"])meroon" nberra"]) pitalyenne"]) entralhina"olombia"ngo" penhagen"])roatia"zechDenmark"haka"])jibouti" ])EC"])E" SCAP"gypt"ritrea"urope" ])anFRG"SUZ"inland"rance" Gaborone"])zaeorgermany" ])  ilbraltar"])reece" uatemala"Haiti"]) milton"])vana"]) elsinki"])ongICFTU"]) NTERPOL"])ndia"srael"taly"Japan"Kabul"])Laos"tvia" ibreville"])ya"uanda"]) Malabo"])ysia"])nama"])insk"])oroni"]) N'Djamena"])A"])Z"amibia"ssau"]) icaragua"osia"])orway"OAU"ECS" ranjestad"])ttawa"]) uagadougou"])Pagopeete"])ris"])hnomortougal"rague"])ia"])Quito"]) Rangoon"])oadseau"])ussia"wanda" Saintntiago"])o rajevo"])udi enegal"]) ingapore"lovakia"ofia"])pain"]) tanley"])uva"])weden" itzerland" T'bilisi"]) allinn"])hailand"eimphu"])irane"]) orshavn"])UK"S "]): Venezuela"ienna"])rginWesternYamoussoukro"])ounde"]) erevan"]) Zagreb"])accountsmongnnualrablesphalt"bananas"uxite"eans"uildingcannedrdamon"ement"hemicalsitrus" ])limateoal"balt" coa"nut s"ffee"mmercial odities nstruction"umerpper"ra"])rn"tton "rude"dairyependentiamond s" versified electricity"mphasis ngineeringxpanding ferronickel"tileish"])ing"ood"s"tuffs" ])restmerruitsuel"s"gardens ment s"enerallyold"rain"s"halfrdeavyides ydropower " includingdustrialronjute lightmestone"itedvestock "obstermachine ry " s injornganese" ubgfactureds"])terialseat"tals"ining"orostlyustnatural egligible"])t wsprint"ickel"one"]); oil"toil"lives"peanuts "rfumetroleum " ]).harmaceuticals"osphate "])igeon lantationseasantoorultry"rincipal lyocessedducestionulsesmice"rawice"olledum"salt"ndector mitropicalhaleoes"rimp"malloap"merghum"teel"ugar"canetextile" s"he imber" ]) n"ourism" raditionallynsportunartlevanilla"wheat"iteool"rld'sGroupHAYES8990b]LEWIS90b4b]d]ONCE]:This VARIABLE] :])]5)^M @________________________________________________________________a9"=‰agreemntbalndonedment" sdelulility leoard ut/"3»])veroad Msence stolutelyrbantedstainedingurdundanceses cademiciancelerate d ntuateptable nce  s ed " ingss ible o"])mmodate ivepaniedying lishmentsrdance,ing  ly/unt :"ant sedings ross uableledingumulatedrate sedhievedments ingnery"])ids knowledge dq+uire/òd7rsAsingsition sQtion yirereage s idosst  ed ingon "!Xsvationelyists tiesy ual ly uqire daptedbded (:+¹ing tion&*@als"Lressing senosinequacytelyherencejacentournedusmentstableed mentE s  ministered ration 's4 vettedopted ion ulthoodsvance d singtage ous  sersarieselytisementingicesableedrsingorsyocate dingerospaceffairsect ed ing siliate d sionsrmation veedordable ghanistanraidica n ter.math2¼noon wards gain '?" ?"st*e.ßnciesy 's dats gravateegate s "ssiveo!ree$vable d$ing'tment# s 'Ÿs! icultural  e%onomist uayo:head dmedibdde dssmed ing)srborne craftline 'srssplaneortkinlarm baniaertaertsfonsingeriaorithm shajiil,edged0ôgationsedly singrgyviateing oniesocatedion stmentstedwable%nceed ing symost oes"#neg  phatemocinreadys"])Eo0ter4ationnateing ve s : houghogether#uminiumumvitewaysm ato biguitiesyoustionendedment s ricanxicabledong rtization* sunted"Pingsp len/alsyst3Ñysist  s<'!nticalzedingcillaryd>/orB¨ersenorrariessensenemiagerleolauillaimals"messagesniversaryotation sunced(ment +v s smentual#ised&ozedlyomalies nymityousther#rpc&Msweringticancer ipate d s  ing ondumpingfraudguallestrustumorviralvilxiousy +body.¬grainsmoreonethingwhere pan"rtheidore"])parentlyealedingsrance ed ing s liance cablenttion s edsying ointedment sraisal sedocheciated ionhended oached singpriate ionsvalsFed "ing%Vximate ly  ing! onrilqazadeh uinorabiacafatmidsbitrage ur srychitect s uralvee2a 6Òs 5n't'gentinaue dsingmentsiseningmedsyound!sing$oranged ment sringyearsst ed"ivalsedingobaticles " ficial lyuroubay"s1"5€eanh"iadek:Wheneding1pectshalt"irinsembledsy" rtedionsssingmentts ign bedsstancet edingociate dion  " ssistantumedptionrance s edingtridext1pc5Øtachedingked ingsin emptedingsndedingtion itude orney'ssractedingonve ly nessibutablee : d suctionsdited orsger mentustnstdlrerityraliaiathorities  ' yzation e d o maker 's stediconobiletivenomoussumn vailabilityle'enge*xrage!d$asingtoided ingwaitedingrded s!enessy xis b-abangida1òchekbone6ed rfiregroundinglash ogterialdlyg shamas rainilingoutker y+lance d)s ing laduruch nanas"dwagon gemannladeshk(",Ê'scard ers  'ing"R)ruptcys$'(§nerquetrbadoselygainingeleyometer rel s "/day.year)toickersng sterowsterse d )line,Œshawic ally nssket!Y'stterylefield singblcf resourcese.aches2¯ "])onsns"])ringshtcameuse(ome +´s ingdsef" edn.t2ós"])fore%gan(yin 2ning#s*unhalfve iourinding&?)fsleaguredgiumief ved 5sze liesgerenceyongedingsw")%Etsnchersmarkeathficiallyted s ted inginr"gemudaezylliumsidet t etater )%ween,verage0Ò"s" ])yondfr gfact("Afghanistan" lbania" geria" merican ndorra" gola" uilla" tarctica" igua rctic gentina" menia" uba" shmore tlantic ustralia" ia" zerbaijan" Bahrain" ker ngladesh" rbados" ssas elarus" gium" ize" nin" rmuda" hutan" olivia" snia tswana" uvet razil" itish unei" ulgaria" rkina" ma" undi"  Cambodia" eroon" nada" pe yman entral had" ile" na" ristmas lipperton ocos lombia" moros" ngo" ok ral sta te roatia" uba" yprus" zech Denmark" jibouti" ominica" n Ecuador" gypt" l quatorial ritrea" stonia" thiopia" uropa Falkland roe iji" nland" rance" ench Gabon" za eorgia" rmany" hana" ibraltar" The ories"hutaniasedckeringyclesd derDsingsffex g ger st ilion lateralion l'sHingson+s/ås nary dingsgqianotechnologypartisanrdthssautlack sh(med,™snkets"eachedknderiptzxock"adeingeds"edelodstreammwn sueprintoard#"&‡sdiesy"eskylderiviasterndholdersKs '6eusesoked ingsrunnerstitlem st edingtsprder edsenrowedrsing  s th$a'kswanatlenecksing"])omedueyghtnced=dariesrsewxycottspdrace +skets:inksn"chodzil each'dkfast ingthrough sthingeding"sserweringidgeefinggadehtng ings tish oadcast ingenedingrlydersohnke:nrage s sught undtland eiseubbledgetffalo""gergild ing "stlgaria kletin'ionshmper ynchoyancyedrdensome eaucracyskinamanedingstinessundiseshelinesesss'es *™man# en 'syt/ter3 yerRs ing  out)sy1pass5Ò tes)cabinetleredilhelackelculate d sing onsedoniandarl ableed$ing'as m mdessus e roon paignn ('t+—ada!ian$Œlcellationroussdidaciestese"nedries"ing"ot p abilitieslecitiesycity+eialtal%isation(ˆ ed tsze dspedriciousturer 's $bide"])oncassd  iovascularseer fullylessgoeslssonmakersnivalopets"riedr"sy  forward  sovers tel.onsvings"ses1h#ino&sava"teloingorseedroualtiesytaloguedyststicpultedchegories )H ;zation* edyring"hodestle" ughtse d s1ingtion eduslyvacoymanboetdteasingilings  lebratinglsular nt am5voer"])simesraleHd ists pe-reals"moniestain) Plyianficate s ionhadinred man"'s%Žshiplklengesingmberncesge able/d s "ing8nel spter racterised sge ds  ing!tereds sedveseaperck edringsmicalsngquableiangckenef s"Nnldishren's e'sannagpsracoicekeoseingrussen ronological ly)yslerunkiampifpecrcuitlatedionmstancested iesng rus pulpyvil ianlaimedsmpdown  rificationyshess es  ificationsedyingwbackeanersingupr ance+ sedinglys rcqverientsmates bednicalobberedse"Kd lyIr sing ure %sth"ing" ]) udedsgubmeso al" itionrsest":stedxingcoa"nuts"defaighfee "< hesivenessincidentalskingldlapse dteraleaguesctedingon !6 sveusionombiao numnm/~lewisbatingtingination s ed ing"econ)sxfortable ying mand ingenceingt ators,ed :ings rcial  ize"R lyicalisisonssion er stment  s " tede  s0municateoditiesyn$ly(Ñtionsunicate ionsquest ty teroditypactnies % '(…y-'s1‚%rability(kletive ed(s+Žison sss"tiballeellednsate d ion oryrabletesingtion  ve  ly  nessor silelainingt seted ly"Uness ingon  s xicate ying onents " ])siteund  rehensivessorisedingomise suterized?s ing$nablecededivablyedntrate d s" ingpciontsrn eding s ted ssion al  siliatorludeding sion sretedition al ed s om3ucted ingorsferenceidant6encet  ialgurationnedrmationed  inglatingictorm  rontationusion glomerateoressesionalman enjunctionnectedionsciousecutivensustquencesrvation ve s ider  able( y tion s eding s gnedment sstent lyingsolidated ionrtiaumpiracytantly ituencieste d s ion alructed ing on ve ultancy t stion singmer s 5ing mate dption "]) tacts ined r sings mination emplate dndedr stionstxtinationentgentuatione!d$gs ?ing ty%ous raceptive st!ed$ing on "s ry'stibute d ing on sol"<led ing sversial  y venienttion alrsationion t edible  ng1sictedionncedokedlingperate d ionrdinated ionpiesper" beltra"yright ren ":/sorghumerstone glutenfeedporate ion3 ssusrectedingon slyspond ents ingiganugatedssigataDinglysttage<on"seed ughld-ncil1šsel lortednanceract edmeasurespartsoint roductivevailingingries) ",† ]) 'y's F?"#sypledon s2rse d st 's'esyver age %edings tiblewpoxpiu rackdownftnes"shedeatedsionveitydencetialsibilitytedfors s/watch ptwiminalsis teria" icalised m szeds op "8lands"])sswnsucialde somblingshedrszadossets&;*†ubaicellar " ltivationuremulative rb ingse rencies y t P(ly+š :4shionedtomaryers ' t"back%ssting "wtyclesicalprus zechoslovakiad+"/û 'ElectriciteoIvoire"adzieiliesyriesymage d singn peningsngeroussta!*$jset*ed!Ysustery 's#qs"Vead@linesocklerLs ingFs sminase thbatableeenture s tures-itst'"+ÿorsscade seitfulvedideds,ingsions!Jvelylarationeding ined Z s#Wingrease ingdicateductedingon seplyfaulteat edctncedant sser mentraleding iciencyttsj?" nedingtelyion sve lation  aryectraudinggreeslamurazyed  ing scaredegatesion s  iberationscatemitedverableedies "])yorsmand)Dedingsentseviseocraciestsnstrate d ing on s orsngialseds marknis omiationsnated ionssity um"yingparmenttingment  'sD sureendedncetingsletionositary edor s ys "  ]) reciationsseding thutyr egulationivedscentribedsing ptions_120396ervesignateded s rabilityleektopperatelyitetination* sedroyedrsinguctiontailedsnees9ingectingrgent sminatione d ingredncevastatedingeloedp ed  ringment ! s$Yspiationsceslopedotedflhilloniagnosistic sonallogueysismonds"ctatedionaryussionsd%n't(vedsel fferednce st ials lyingsicult  ies  yicultiesggingitalizing slemmaigenceutedion veminishednaroxinplomat:icspedre ct ed#ingon " velyor ate*s y$tys advantagegreementllowedppear sointed ingrovalsterous bursementscardedhargeiplinelaimedosed  ure ! s ontinue d unt 1ed "rage dveredyretion aryiminated orysuss ed s ingon s ease" sguise incentivesfectantvestmentksmay issedorderpatchingellacedeasureosals eitionuteds"]) seminationipatedtanceillate ion"nctortedingribute d s  ing on  al8 s or syvergence3se" ification edy ontytedingstmentidedndsNsion s&s jiboutikrlr+s/ª,)0¢ /barrelsvdmkno"cs)%y:tor sument's$ationses Rn'tDing ldrums lar!'s%£smain esticallyCinancettedionguezicann't e &ors'orsteprmantsetubledsingtfulsglaswn*"])-§grade dlinesidezingtreamtownurnsward s rachmaftingginingmaticallyzing"sticallywbackingsnilledingnks"]) venr'sssop ped :ing"sughtug's syingnesss"td"ue*isenberg.Ùmpeding; nkelplicate srables"tioning'um*„tiesyynamicseachgerly"klerlier(st+žy$marked'qn*ed.”rs ings "#asthquakeysed ierstngt ward yc a)feelaonmomicomic$ally'«sesst  s'y /sc"vuador'swadelmangedsibletorial ize ucateion swardffect ive2 ly#R nesssicacy iencyt lyort "s ta#ggsyptibghth"Lsther l%aboratedersectedion) soralricalitymagneticolyticnic s ment sventhigibleminate  d  sing ontexirsewheremailbargorassedssiesyezzledmentingcfergedncyingotional "phasisedze d sloyees rs  'ment "yeestyulatenablected gagecodedmpassurage ding d ,anger0Öeded'ing *‹orse$dsergeticiesy zuela"])! forcementgagedgaardined er'sedings shancedment sjoyedormousugh quiries#yrolledmentsureing tailed inge"red ing"prise s "tain menticedrelytiesledsingyranceepreuersiesy vironment al lyoyzymephemeralithelialqualed ledystorialilibriumpemntment "0 ])Btiesy valentC )rasableerodableedobleroneousrfulsskscalateionpeortingrowudoerpeciallysence"]) s"tialtablish ed  s  ing mentte s!imated s @t chiopiaroleumuphoriaratomobonds dollarlirenotevadeluatedingonsionened;inglytsuallyry body thingidencet  olutionaryrenx acerbatingtlyggeratedminationeple s ceededing sllentption alss es ive lyhange$'s'ˆableds  ing"equerluded s ing4sionve lyusedecutedive sLmpt ion srcisablee dinghaustedingibitionico"steding s2ludespand edingsion  aryveectation< s ed *ing.ös diencyGteiousnditure s se s ive rience d ingmental er st isesiration sed s inglaineding nationicitlyoitationed"])rationesivesort "#dableed"]) rs 'ings$"])'{sedsureress edtendable ed s&sionve trnal inguishmentractedion "])ordainyinary vagant%emelyye skensf-abrics1¹"ce s ilitate ies  "y ng&similetion ored iesngs "!yshdiled ing s suresrer lyview th"llending off,sse miliarynned orebox;m er)sing"])landsshionsotersttaliguesty ultvorable edurable ed ite searedssable ibilityleture/exampledsbruaryderal ly=tioned ergrain sstockuffs "ling s st ldt l#ow&Šonyt rmentation nandezoraritileiserszers "tusudingwer-f ribersddlinguciaryeld 's &s" ):workrceghting ure  d*sjiDlamented #sLingsledmnalised>singzedinglynce"Mdsial( ly+§ ser sngd 4ing sedstgertipsished land  nbogadottirreball dm$'s'kedr inglys'6st,scal0öly!lh" eriesing"meal"tnessve,x0íed ing,laggedingshipretwed xseededxibilityle ights oat ationedingodedrtation surw  ers"])"ingsuctuateionsidrryocused ingdderld:lowed ing' :Cs: od ":])grains"s"])tuffs"thillsoldingwear" ])r3"7ïcastinged&s ingecast ing4slosedgoign%ers)Érunnersaweeablehadowtrygedriesivenessottenm:3alitylytionted inged r ly"ingsulasteing onsakeeentuneswardster ingsughtnded rr+th /µx+ractionsmeworknc'sehise#iscosklyudee  d$omingzesingights nchquentlyshictionsedmanndsngeom2nt6´ sstzenuctosegalit"s"])seueled leds"jiokalfillinglingKy nction alingsd 's#amental ly sing s eral?rnishedturether$true'uurEes "SxGgTabonddafiin#ed&Ving sllonAmbiandhiprciadens "O])olineteheredingstugesvae cc earedinglms"])nerally!fte ding on sicousticallyitalographicthermalplacearmany sture1st s(tinghana iants braltargabyteslts"nneriesven?s7ing lassobal ising !lyomyycolmt)npo al4sts"deauxesingld C"man nezalezods5"D])Jwillrbacheviastyevtvern ingmemntnt( 's ,í )  sort rabcedes ual lyfin"!]s"])ndteding orssphicspleingvelyeat er st ecenspanted nadawy ipsantiomykossz undnut sworkp*'s-˜s w er sing n0th!"])$ˆ uadeloupemrantee d ing  sdstemalaessesianadanceelinesinglders laume tynea nboatsranteedyanayrateionszippedha>d .i2Óiledstormstilfikias=ted madidmerperedsnded icappingledsingsg  nibalssonppening syq rborsd estlineywarem anedfulshnessvested ing s s/n't3Õugheylve0n4Ý'ting oc wkezardousse-ad1Ãed ing  quartered sslth y ringsttedingrersvierstlyy  ctare%sdge dsingedlsftyifersghtensrsld"!Oicopter sp#ed&hing patitisraldedbicidesdingenandez@oespesringtonssitateiddenes"gh!er$gst !ylands ysway kesllerymself nderrancetedress&ham)Ÿtoricytmen/tingkseoefnerffmeyergs lberg der7sing s 0s esidayskerime land%esssnduras eckerymoongouringokped fullys ing rrificsesierypitalitystagesedileitiesytel/casinosur " lyssehold s)wivesingver mandwardFeverrs1 ttp://www uagei manitarian iditynderdredsthgaryertingrdleryts sakybrid drogenatedpeia"eatabrahimcahncoelandoda eal snticalficationed ying tyleding"eantf.gnorant2ƒedinsiland"])legalnessesusionstrate dozsgmagingbalance sco fitatedsmediate ly nse4inentuneity  odeficiencytherapy uotherapypact s%tienteachdimentndingrativelement ation  ed ingtationicateionsedyingort ance#t  "]). lyedr "]) ssse Fdsitionsibleressedionveoperved ment  s s ingn 6a":Ÿbilityccuratedequatecapableentive s ptionhidence tspientlinedude#:&wd:8s#ing&e!ome$t#s&{ingparableetence nceivablesistentrporate d ionrease)d-×#s &ting ' ly+ment surreding debtednessedfinitemnifyntifyingpedentsndence t sxation_edr singiacated  s ingon sveor s ted ment srectly stinguishablevdiualsidual ly  s 'onesiauce dstoryrial ised#T zed sesy&")¡'sedible  fficiencyligiblertiafalliblencytryectionveriorill lammatorytedion  ary4owuence d stialzaormallytionedL ringement ssusiong"])redientsherentlyitanceeditativeially0teivejection  sunctionredingousyquiriesyroadssider stingstutionsolvencytpectedion s orstabilityllationedmentsnceseaditute  dion al s '8ructment surance ed "r sgencytangibleegralte dionlligencendeds se ifytyvet ion ractionbank connectionesdtt,"0¬eding s face eronimorleukin 'sistedmediaryittent lynallytional lyU pretation edvalsene dtioniew o!-roduce0¬ d  s4ingtionvadinglidented oriesy st ed igate ing on al s orsngment' s *”ingor s  ' ]itedoiceskinglved mentsing ot peiranq e landonically relevant sponsiblyvocablesgs3a7Ý lamndsn'tolatedraelsuancee"d%vr"Pssing 5t .'s2ª aly c ems"s.elf 2§ t vorywccstojacketffreyilmaica'ses ming,nuarypanruzelskipwboningxymeeep opardizedtlinerssobless s  hnston(ineding tly;ltntrdanurnalists seudgementmentice"keboxlymbopednejoior risdictionystice6fiedte"kaminskypucheandeelgufmaneatingenping lticnnedyyaptrnels" ])y boards5sghailmeininomeiniickbackseddnappingeyechlelleds obitswattsndledysgtslcesemnightockwledgable en  s ockhlivistondogreantephullbergowaitl986abatt elledsor atories yurcinakingftaggingidnd"])ingslockeds"lidegeuageetin ishedkaosrdgelyBrst kup?osieresarert+ing/¶telyNrst 2ter4unched ing"dry wmakers,nss onuitsyersyingoffsb s")&ceadedars hip ing s gueningrnedingysed s ingt$thers'`vers singbanon deBnanonft ist galislate ion  ve-ors 'ureightzndersing gth $enedingtonesothos#on&[thargyter)5sum"vel$s'krageBdiedsyingwis @researchi abilitiesy isonberalisation e d ingzationiaorrariesyyacencedsse d esing echtensteindnssfetime fetedght en ringweightsikanenkelihood3y wise>mit ations(eding5spingne:Aarrboards] %kedingsseedt"ppedstickquidateionity srested ing(s tigationtle ve .r stock " $ ])ingmenoadedn s#Mbbies^yingst cal ly>stedion sksomotive s "dginggicallynag$er 'otime'okeding  s ming pholessensers sings'es+¿t ;t'steryuiswerBed"ling ssts yaltyset dubbersricants" ]) kmanmberppinxembourguryy"])ingmphocytesngmacaohineary " ])s"millan roeconomicsharrydagascare)rid-¾gazineical maneticitudeiledingn frame(ly tain ed ingenancezejor#ity'²"%ke$r'oss ing"])=lawiysiaehotraitammals"])nage d  ment  'sirialKsing cera datesoryganese"iaoc"pulationneringually bgfactured s" ing"])facture d r s s  ing y#"p%mrble"chgarineinal lysinesk /dollar!edt +'s/Ž)ableedring s*places$''²hareingkasrow shestensialniqueseseivetertchesingerial ize s " ])ricester s uredsingtesiesy uritania iusximizeingumwell y+be.ºstadtzobourg"eal n ing fuls:st imewhilesurablee d st6" ])s chanisimsm sdgyessyian tioncal terraneanum eting7$s'”s gabityteshertzwattlanomasmbers6hip6orandumytec ntallyionedu rchandisets elygering2itsssagenertal " licurgical y"s" ])ershod s res )icxicopesofaicrobialchip somputer sfilm processord day lemenmorningnightsessionwestyearghtkulicElders"estoneitarilyyk l erietmetresng"ons s"nmicsne's rals "ssworkers icomputermisezesingumng " ])sster s * '"riesy's orityuste sraflores s appropriation calculated ion onceptions demeanorseledrepresentationss apropriatededsilesngontakentigatedterrandxedyazawa ln ,s0 mnseobilizeddels ratedlynisezationst ification  sedyularhammadedisterurelasses"mentumnacoday'setaryy $*itor-Þing "sth-'s1ëly  s$,'0Æoreralestoriume/)3îianingocco tgage sset%ly (‚tel ionvateor cycles"])s"untainedingsavithsved !Xment s s iengylezambiqueths ubarakGch!hua$clroneytilateral medianationalplesnicipal itiesrdochstapha!Oertton"uallyysteriousn"])akaosoneme d@s/ibiaphtharrowed inglysdaqko tion's ally?s '>wideural  ly%eugahyde valzerearby7ingly"])  cessarilyy itate ingyeded 1s ""])gative ly lectigibleotiablete  ding on s or. sighborur ingthermeth  ogtiatingpalrvoust'back+Âsherlandswork ed ingsutral ver theless w/ly3žmontspaper !G 's swirext&icaragua)Ÿkel"geriaht 's mareslne tyKthkro+brega/…dules"iseymadsinatedionnaccrual a ssociatedbankexclusivehaustiveferrousionicoxynolpartisan recurring sidentialstandardop technologicalhriftonranda mally theastrnwestwayt0ably4ïtione d "holder%o sshing8iceable fication sedyngon resunvelw*uclear-³isance mber#s&xericousts"hellyce scemexsezdlr oa"])l"pectbjectedionsve sligatedion sedscured ervationsedrstaclesructingtainedingvious) ccasionallyupyrred ncesseantaneddourecdienfH"])L°$f"al%\ensivered #›ing6's"qssice r #s/sial ly ks&s)•ets tinghoreten heil(",ûds"fieldmans" eeds nkkesmanongwulder ives"mahanissionsttedingnibusn2"6õ ce /ready e./one2Šsgoingpinly)*,”towardspecn /close#Qeding s)rable ted singon A al$ g s s or$”stationsginion portunities  y ties sedsingteionrder (ticalsmismtic allysonallys rB.al2†ngebitchards"estratedder ed7ing lysinance0rye"])/s"ganicsation 's sedrszation ssiginally ted tegasetracismther-'s1s ' wiseing" uncer #selves&j "stt+age.´breakscomeflowsgoingslaysetsinedingook put ""])Erightsiders tandingturn"pweighedvarianyer,all 0·otments blownurdenedcapacityomeduehaullappingookingynight producing tionridesease hootingight ubscribedpplytimeurnedvaluedwhelmingweds ingned T!r$Yships xide "zalpaced kage d !singers ing"tddy #gesid n""Tfulsr'sskistanlacetesladiummkernelssonmpas"n"])ama continentaldolfielshandleicpandreou er 's*:boardsuaraguay lysingtroopersentsistieskingsonliament ary t(ial+wlycipants te d ing onular ly es(san ly ner hsip s"hip 's" ss " ])y's ssageednger s t oral#TtenthsiencetsternulveyableBs backdownedrsing load,ment sIout_rollssct,eace0É fullyked nuts"ergasuslts"mbertonnalizedtiesydingetrating  ongsionople's,)riar+ceive/™dntageption eirazformance  s!edingsumehapsiod'ically*Žs pheral  sjurymanent ly issionts ted ing petualsistedntlysonal izeDlynelsuaded ingtainingusetasossimistic sticidestitions ricioliochemical s"leosum "uem harmaceuticals"])seenomenon on ilippinesoenix nes tographed ic svoltaicrasesysicallyiansickednsingsupstureece gment"])ledlspe"])linetstinglace d&ment singinstfiffs'iffsn"e%‰sneding,s$t'e'sGationsedingssstic "s"teausform:sinumsusibleyed rsingseadedseddgedingssisuggingmmetedngedsywood("ocketehlint  ed 2r ingssedJoningland rizationsicemenies y(holders!bmakerstenessical  ly-ian szedkings"ls yethylene  propyleneorer stlypularityted ionrktfolioion s ugalsedition?5eds ve ly sess ibilities y le!" ^yted ing sonponedureingtatoes"ential  "& ]) ly takis ultrynd s verty werful?sxractical lyesecipuum isedwiroecambrian riousedingiouspitateousluded onfiguredd_type("Agriculture" Capital" ExportCommodities" Partners" ImportCommodities" Partners" ndustries" LandBounderies" MemberOf" NaturalResources" Population"ecessoricted  ing ons :sferednce stialred sVormsjudiceliminarymature iumsnatalopeningparationeds+ingyment onderance requisitescribedenceted;ing lyrvedident' 's*“ ial s pecifieds ed"ingure  s)ingsedtigeiousumablyedlytaxtyvail ings ent ed ingiously!Sice R,d0ÿs=)ing-émarilyyencipal  ly !le s icipaltedrsingorities"\yson vate ly#disation  s ed sobabilityley ing lem atic*s"8cedure s )eding ss ss #ed !sing  "$ ])3or surementduce "d r !"]) !s  'Asingt"]);ion- "0¦ ]) sve itys("+ˆ ])b fessional2 silet%ability)le soundly<gram "#e'smablee ds"essing hibitject'sedion sslificongedminencetsed singsory oted ingonalptedlynouncedofpaneelnsityrtiesy ortion " ssal s@e ding"]rietarysectsrationscribeecutionorpectivesus ritytected ingon  ism  tveinssted ingsocolractedvedn ided!Irs s ing ncesialsion  al  s "ocativekedxyse  ychological yologicalublic!ation$qitylyshed r(ing llbackedp"mpednchrchased Zr s  " ingelyposes   sestrings"inguanted ingshed ingt s9tingzzledqassemitarthlyr uake1lifiedytyntities "])yrter *"-®'slys sijudicialeriedystioned rs ick er lyet ppedteota  s /tion)ed r "*adiation.ìcallyoactivesfnarsanjanits"gedgedidlroadswaynfall "])ssed .s$ing llied ym pantnd'somlysged@s ingk edspeseedid lyre shtae%d)øs"her %—ifyingngs onal eisationsvagingw zazcptseach ed"ing>t edingon ors sdersinessgy ffirmed ganl igned1mentsedtictiesy zedlocationwanceyppoint ed mentson able  yssess mentbateselsoundeduffedildingcallpitalizetureeipts vablese d$rship!Jsing orship nt#ly &fption)ssionievedpient srocal tinglaimognise dtionze mendationmend 's ations ed ing snsigntructvenedrd"ed%{ings surseverable iesyruitstalumurringdeemablefinition mption sploy istributionsucedDs/ing tion  "( sndant eacquisitionnterxaminedferencedumredingilenance ding sed riessy " ing" ])lateion aryected$ing ons ocusing rm ))edrs rain igerateduelingndableingsaledingtegainedingrdedingless senerateionalbysstereding nsration s ret tedularlytesion sors y  ignitemposingtionn corporatedforce d singsurancetroduced ingvestmentteratedjected ionlate d ing%ons hip s vely  unched xedyeased cted t)vancetiablenceedfs vedocationuctancetyingmain der0ed  ing s rked sedial indedssion sttancesingodelledtevaled singnderegingotiationwaledovatedionstalofferingpening rganization e  dpaidr"eding"])syingment s eatedlylled rcussionslaced ment singyenishied:y onsibilitiesrt!ed$*ly-rs ingFs s'itionedory resenativesingt ation s ve's s ed ing s  isals oduceublics" ])rchase d quest ) eding siementsre dment% s singmentsschedule d ing sindedueearch er5 smblancendingrvationse dsing^idencetials sualgnation edliency stanceingoluteion svedingnancertsurcesparkectingve ly ond edingse  ibilities" y leveness t atedurant itutionockingrationedingraintictedion s " veucture d ing  ubmit&lted"Tings meWd singptionrgencerectedtail ers ingnedingskeliateing  onoryire desmentsracedtableioneatedieval * edingoactiveurned&ing sut2er^Ms21578 valuationempealsnue s #"])@rberatedsaleing iew edingssed s(ionsveoked lutionaryveringswardingszendehetoricia"beriocae"herstderghts 3id orouskanovicnggitotsse!n$˜s ing k 2ing syvalyalslands"])many"])oadsstersbustack"etjasle s+lbackseding smaniaerooms tsae%tting( ughlymeliotisndstriptesinewlandyaltyptubber"ioderingled sing  /oppositionmoredsursn away nings piah turedralssellwandayezhkovs ",'beanaberbeinchsrifice singfelytygginghresid5:9Ùlads heddinrye able#ss,)0‡inasmonella osist"])vadorgeme*oa-ƒjlikplingnctionsds" yguinekterosracogluneytzetakistellitehe isfaction oryiedyinguratedudiriyalvagededings  our(wy !ing $cs 5yari1caledndals treredtteredenariospticalismheduleds<mesillingslueteroolientificstsoperedtt'srambleppingeeningutiniseeabornefarersoodgamenrching son 's al ly t !s way 's cond)Harysretarytion s or""\])'ssureding ties sation#dy dki!eded@ingsingk ing.s;medsn s%gmentsizedslectedsfl"ers%fingsQmi conductor  snarpreciousolinanateor'ssd segaliorse"S" itivet ence dingimentparate ly quenceriales ous )ly% "nessved sice d9sing=ngssion s t)back,Ÿsting le dment s "ingventhPral!e$W" lyityicewersychellesfrgm)hadowkenoutle"lpere)holder -Ì 's" s& ')u ingkdersmarket 'ss*d.ßingp estlyving:eds ertlfling svediedldsfted ingsllingsp building(ments ped rsings ock es" ])otppingreingtage^serfall s ly t uld*w -¿down2edrs2ingnroomssr ankHimps uggedGunnedtdown tingleicklede serra ghtsir94nal ledingsedificance8 t ly/s upslkvaer"])mexilartis.onsenplerifyingy ultaenouslyneousnce%gapore(Œdlrhasanehled kingouxregarstertes tinguatedion !"7 "x&th)‰ze  able dskaanlandetchesilledns"])rtsryrocketlackenspshedingtedughtereepersicedesghtly ")mmerppeding owdown ed ring lyuggishnessmped smaller3pox shedeltering"ilingokestackothlynappedowballuffo%ar(tedsingcialft eningwareil slchagad$iers'qelyyiciationtationdution "svencyingmaliae*body.âonethingime swhatnon er2rghum" rytught nd lyrce s  rouille#rth east&rnwest vereignwingsny bean s#mealoilpaceinreskedrowsselyeakings cial)?istzed styfic ally tion ssedyingtacularrumulation veor  sechdllingnding t8illed overnoffralitstlintert sC)oiledkensman&en)™woman nsor edsrtstlight tingreading sing kelunrnedredtsquareeezedingriset abilisatione d ingty ze)le ff gedsgeredingingnationkelemateGlingmpncedalonerdsing off splerches"])ted Ar$ingsup te d#Ument" s%ps  ')ingonsstic al sustes oryunchingyingseadilynessy/up egl "(perlyringssmmedingp s!reo ileiseling's !g)zichkingffenrllmulateO dingo ck,'s0«brokinguildingholder s 'mmarket ss)Qltenbergnes"])godp h pagesedsragee dsiesngywageraddlesightned tegic es styeam etsngth 'en ed ingssedtchickentlydefeke )-rssingng)sppingveonger Nst lyugaluckturale  dggledingseuckdentsiedsosy ingyleub committee  divisions "uedjectmarine=itteding ordaintedinate d poenaed%roductsroto scription sequent ly ts:idiaries y #es&wze dytancetial ly #itutes ingystemurbancceeded ingssses ful ly ionveumbedessorh res#b'dandenlyedfferedingic=ien= cy t "gar erEgestedingon sshartoingtable orssllivanpetrohuricmita mary eritsnflower s eedseedhineominenperior+marketpowersvisedionoryliesplementsiedrssy"`ingort%"(red r singvessedressedrelyfactant sgery inamepassedinglus es-rise ing roundingtax veillanceyed ivalespectedsndedingsiontain ableedingtwamplandsppedingyzilandearingdenepingtener sptiftnginglinestchedingzerland ornymbolposiumndicate dionriaupstem%)(¨aticicst7"abledsoidulatingcitkleticsg" :geds:intwanke (n+{offs1ver s%hitaingover5lkedingss"]) Zmuran"kers stalizingzaniaperiocarget ed(ingsted ingiffsrifssks test"varesxable#Œtion eds ing*payerse"])achermed chnical ly que solgyogical es y dious3lecommunicationsphone ! s&visedion  s xlingmperateoralorilyy  tation" s:ednd edr ed.sgsionstativee"hiativeurerabytem(ed+Ÿinalste ding ons""Tritorialysted 4ifyingmonyngset xtile's" ])sualhailandn."2Íkt0's4Ÿ chere IatersMñ5ir,m0Œ" Sesselvesnrapy5tenede)'s,²afterbyforesaurus e$ter'sy.in2×gs k s3rd sGs /omson3¢se"ugh %ft *ssandsreat en edingsse-me1–sholdiftsough,"0¿outw sustusicker tedrsghten edingr lyles"])lionmarber"])e*d-¹ly"s pan0tamp stableidngn  sulanondaonressuetaniumledwari lelphonesoDbaccoHÓ "])goday''s+Õernaes getherohekenisationld,erated0²lsmanorrow 's&ne dgaicghtnagese s )"ts" /])ok#l2s"p ic!spedrpedoedsetal,ed /Æing leding ysuchedgh en rringsm"])ward s n yrackde,d0´marks rs  s-ing%tional(’ ly fficgedyilersingning/testsmplenches s action s,tlantic&fer red ingsitionlatedmissiontted plantation sonderrt ation shipment"ppedveledrslingeasureryt edment es mendousor'snd s ial sbuteedsggeredllionmnidadpledumphoopspicalubledingncedyucks e lyst'seesthying se ovolasubeffs"])gmbledorna"])gisiaobinplesrbinesofankeynaround edingoverv wentyicceenjets o.xt2°)ycooningpeswritten ically ographicalu ,ae0‡gandak&l)¤timatelymnabledjusted ffectedmbiguousnimous lyuditedvailableware believableorn certainties yhanged lear*osely ompressed nditionalveredtadder,cut0ægroundlinedyingmine d spaymentsinned ings secretarytand ing "oodtake ningvaluedwayentrite r s ing  ten terminedvelopedisclosed uly easyconomicmployedmentven xaminedpected lyloitedfailingroreseentunate ly identifiedformlateralnsuredon 'ss's t$'s'ƒholders s '5versal justifiedknownlawfullyeashingssike ly mited oaded marketablenamedecessaryopenedpaidtentedrocessedfitablerealisedticallysonablelatedsolvedt saturatedeasonalcuredttledightlyoldpecifiedokentable uccessfulitabletappedhinkableilrue"Xused)ualveilded eding swanted illingnessp0coming4¶datedfrontgradedheavalldillolsterylandiftonper settateturnwards raniumged ncy tinguguay sa5-ge1ß dae d!Z%)(Œfulr 'sss hered ingingsr ual ly  tilisationtiesy's zationesmostv1acanciescinatingesledidation ):uabletionse d#cs ":ncsa illa"suatuzettiriables nttionsetiesyous y ingstticanegetable s"  ])tivehicles "  ])ndors'ezuela 's kataramanture s+raballydege ificationytysions usy sselsBtoed iacetim6sorydeoetnamw ed!sgilantorouslyllagenyiolatedsingon sencetrgintuallyussion"ted ingtallatkovic ocabulary iferouslyicedmaillatileityckersume s+ntarilyymitingnte d&rs singwed ranitzkys(w,œ/ afergesingonsitingsvedkeingldheimikedoutshnanchigted*ing s r "])/dhanaehouse sfarelikemingned ing rant s ts0s/im3¤n'ttestchedinger"edsway toovey s:ce e+'ll.¹reveakenedingrst nesslth yponrhousingtherb dgeek)'s -ãend "ly s ighedKted zsaeckerlcomedsdedinglheadCsnt r "e/:3µst ern6halet 's#Severeat "c])/barleyelsn-ever0£reby3therichF0ever4le)pped,°tes paceo*le-Âsale lym se y iatingdely spreadt eghtfeldlyl.ing2âness sonndingowse"])sgneringsterpe resdom elyhedsingtchingh0an4ædrawal s ingnewfawalin out0stand7nessedoesirthmen'ssn't od " s"l"rdsk ed>r s 'forceing "1places"tation sweekld's `bank scalewideried yingsenedtth  uld+.n't2Ändedvenpirapinkletedown ): : soffsingten ong fully texiannianopingy"])ams"rn"sinear.'s 2Åend7lys+"/Ô'menn 'sB/dollarsterday 's^t utter9ielded ings lang"]) orku 're/ngrs ruangoslaviazairekmbiaealandro)shaoengiambabwenc"rconiumyangonese{MUCSparckvan} LEWIS.DTD README.TXTall-exchanges-strings.lc.txtorgs-strings.lc.txtpeople-strings.lc.txtlaces-strings.lc.txttopics-strings.lc.txtcat-descriptions_120396.txt"feldman-cia-worldfactbook-data.txt reut2-000.sgm1.sgm2.sgm3.sgm4.sgm5.sgm6.sgm7.sgm8.sgm9.sgm10.sgm1.sgm2.sgm3.sgm4.sgm5.sgm6.sgm7.sgm8.sgm9.sgm20.sgm1.sgmclucene-core-2.3.3.4/src/test/data/reuters-21578-index/deletable000066400000000000000000000000041154025176300240300ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/reuters-21578-index/segments000066400000000000000000000000331154025176300237360ustar00rootroot00000000000000ÿÿÿÿ!F‹$_zclucene-core-2.3.3.4/src/test/data/reuters-21578/000077500000000000000000000000001154025176300210655ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/reuters-21578/LEWIS.DTD000066400000000000000000000027151154025176300223120ustar00rootroot00000000000000 clucene-core-2.3.3.4/src/test/data/reuters-21578/README.TXT000066400000000000000000001070441154025176300224310ustar00rootroot00000000000000 Reuters-21578 text categorization test collection Distribution 1.0 README file (v 1.2) 26 September 1997 David D. Lewis AT&T Labs - Research lewis@research.att.com I. Introduction This README describes Distribution 1.0 of the Reuters-21578 text categorization test collection, a resource for research in information retrieval, machine learning, and other corpus-based research. II. Copyright & Notification The copyright for the text of newswire articles and Reuters annotations in the Reuters-21578 collection resides with Reuters Ltd. Reuters Ltd. and Carnegie Group, Inc. have agreed to allow the free distribution of this data *for research purposes only*. If you publish results based on this data set, please acknowledge its use, refer to the data set by the name "Reuters-21578, Distribution 1.0", and inform your readers of the current location of the data set (see "Availability & Questions"). III. Availability & Questions The Reuters-21578, Distribution 1.0 test collection is available from David D. Lewis' professional home page, currently: http://www.research.att.com/~lewis Besides this README file, the collection consists of 22 data files, an SGML DTD file describing the data file format, and six files describing the categories used to index the data. (See Sections VI and VII for more details.) Some additional files, which are not part of the collection but have been contributed by other researchers as useful resources are also included. All files are available uncompressed, and in addition a single gzipped Unix tar archive of the entire distribution is available as reuters21578.tar.gz. The text categorization mailing list, DDLBETA, is a good place to send questions about this collection and other text categorization issues. You may join the list by writing David Lewis at lewis@research.att.com. IV. History & Acknowledgements The documents in the Reuters-21578 collection appeared on the Reuters newswire in 1987. The documents were assembled and indexed with categories by personnel from Reuters Ltd. (Sam Dobbins, Mike Topliss, Steve Weinstein) and Carnegie Group, Inc. (Peggy Andersen, Monica Cellio, Phil Hayes, Laura Knecht, Irene Nirenburg) in 1987. In 1990, the documents were made available by Reuters and CGI for research purposes to the Information Retrieval Laboratory (W. Bruce Croft, Director) of the Computer and Information Science Department at the University of Massachusetts at Amherst. Formatting of the documents and production of associated data files was done in 1990 by David D. Lewis and Stephen Harding at the Information Retrieval Laboratory. Further formatting and data file production was done in 1991 and 1992 by David D. Lewis and Peter Shoemaker at the Center for Information and Language Studies, University of Chicago. This version of the data was made available for anonymous FTP as "Reuters-22173, Distribution 1.0" in January 1993. From 1993 through 1996, Distribution 1.0 was hosted at a succession of FTP sites maintained by the Center for Intelligent Information Retrieval (W. Bruce Croft, Director) of the Computer Science Department at the University of Massachusetts at Amherst. At the ACM SIGIR '96 conference in August, 1996 a group of text categorization researchers discussed how published results on Reuters-22173 could be made more comparable across studies. It was decided that a new version of collection should be produced with less ambiguous formatting, and including documentation carefully spelling out standard methods of using the collection. The opportunity would also be used to correct a variety of typographical and other errors in the categorization and formatting of the collection. Steve Finch and David D. Lewis did this cleanup of the collection September through November of 1996, relying heavily on Finch's SGML-tagged version of the collection from an earlier study. One result of the re-examination of the collection was the removal of 595 documents which were exact duplicates (based on identity of timestamps down to the second) of other documents in the collection. The new collection therefore has only 21,578 documents, and thus is called the Reuters-21578 collection. This README describes version 1.0 of this new collection, which we refer to as "Reuters-21578, Distribution 1.0". In preparing the collection and documentation we have benefited from discussions with Eric Brown, William Cohen, Fred Damerau, Yoram Singer, Amit Singhal, and Yiming Yang, among many others. We thank all the people and organizations listed above for their efforts and support, without which this collection would not exist. A variety of other changes were also made in going from Reuters-22173 to Reuters-21578: 1. Documents were marked up with SGML tags, and a corresponding SGML DTD was produced, so that the boundaries of important sections of documents (e.g. category fields) are unambiguous. 2. The set of categories that are legal for each of the five controlled vocabulary fields was specified. All category names not legal for a field were corrected to a legal category, moved to their appropriate field, or removed, as appropriate. 3. Documents were given new ID numbers, in chronological order, and are collected 1000 to a file in order by ID (and therefore in order chronologically). V. What is a Text Categorization Test Collection and Who Cares? *Text categorization* is the task of deciding whether a piece of text belongs to any of a set of prespecified categories. It is a generic text processing task useful in indexing documents for later retrieval, as a stage in natural language processing systems, for content analysis, and in many other roles [LEWIS94d]. The use of standard, widely distributed test collections has been a considerable aid in the development of algorithms for the related task of *text retrieval* (finding documents that satisfy a particular user's information need, usually expressed in an textual request). Text retrieval test collections have allowed the comparison of algorithms developed by a variety of researchers around the world. (For more on text retrieval test collections see SPARCKJONES76.) Standard test collections have been lacking, however, for text categorization. Few data sets have been used by more than one researcher, making results hard to compare. The Reuters-22173 test collection has been used in a number of published studies since it was made available, and we believe that the Reuters-21578 collection will be even more valuable. The collection may also be of interest to researchers in machine learning, as it provides a classification task with challenging properties. There are multiple categories, the categories are overlapping and nonexhaustive, and there are relationships among the categories. There are interesting possibilities for the use of domain knowledge. There are many possible feature sets that can be extracted from the text, and most plausible feature/example matrices are large and sparse. There is even some temporal structure to the data [LEWIS94b], though problems with the indexing and the uneven distribution of stories within the timespan covered may make this collection a poor one to explore temporal issues. VI. Formatting The Reuters-21578 collection is distributed in 22 files. Each of the first 21 files (reut2-000.sgm through reut2-020.sgm) contain 1000 documents, while the last (reut2-021.sgm) contains 578 documents. The files are in SGML format. Rather than going into the details of the SGML language, we describe here in an informal way how the SGML tags are used to divide each file, and each document, into sections. Readers interested in more detail on SGML are encouraged to pursue one of the many books and web pages on the subject. Each of the 22 files begins with a document type declaration line: The DTD file lewis.dtd is included in the distribution. Following the document type declaration line are individual Reuters articles marked up with SGML tags, as described below. VI.A. The REUTERS tag: Each article starts with an "open tag" of the form where the ?? are filled in an appropriate fashion. Each article ends with a "close tag" of the form: In all cases the and tags are the only items on their line. Each REUTERS tag contains explicit specifications of the values of five attributes, TOPICS, LEWISSPLIT, CGISPLIT, OLDID, and NEWID. These attributes are meant to identify documents and groups of documents, and have the following meanings: 1. TOPICS : The possible values are YES, NO, and BYPASS: a. YES indicates that *in the original data* there was at least one entry in the TOPICS fields. b. NO indicates that *in the original data* the story had no entries in the TOPICS field. c. BYPASS indicates that *in the original data* the story was marked with the string "bypass" (or a typographical variant on that string). This poorly-named attribute unfortunately is the subject of much confusion. It is meant to indicate whether or not the document had TOPICS categories *in the raw Reuters-22173 dataset*. The sole use of this attribute is to defining training set splits similar to those used in previous research. (See the section on training set splits.) The TOPICS attribute does **NOT** indicate anything about whether or not the Reuters-21578 document has any TOPICS categories. (Version 1.0 of this document was errorful on this point.) That can be determined by actually looking at the TOPICS field. A story with TOPICS="YES" can have no TOPICS categories, and a story with TOPICS="NO" can have TOPICS categories. Now, a reasonable (though not certain) assumption is that for all TOPICS="YES" stories the indexer at least thought about whether the story belonged to a valid TOPICS category. Thus, the TOPICS="YES" stories with no topics can reasonably be considered negative examples for all 135 valid TOPICS categories. TOPICS="NO" stories are more problematic in their interpretation. Some of them presumedly result because the indexer made an explicit decision that they did not belong to any of the 135 valid TOPICS categories. However, there are many cases where it is clear that a story should belong to one or more TOPICS categories, but for some reason the category was not assigned. There appear to be certain time intervals where large numbers of such stories are concentrated, suggesting that some parts of the data set were simply not indexed, or not indexed for some categories or category sets. Also, in a few cases, the indexer clearly meant to assign TOPICS categories, but put them in the wrong field. These cases have been corrected in the Reuters-21578 data, yielding stories that have TOPICS categories, but where TOPICS="NO", because the the category was not assigned in the raw version of the data. "BYPASS" stories clearly were not indexed, and so are useful only for general distributional information on the language used in the documents. 2. LEWISSPLIT : The possible values are TRAINING, TEST, and NOT-USED. TRAINING indicates it was used in the training set in the experiments reported in LEWIS91d (Chapters 9 and 10), LEWIS92b, LEWIS92e, and LEWIS94b. TEST indicates it was used in the test set for those experiments, and NOT-USED means it was not used in those experiments. 3. CGISPLIT : The possible values are TRAINING-SET and PUBLISHED-TESTSET indicating whether the document was in the training set or the test set for the experiments reported in HAYES89 and HAYES90b. 4. OLDID : The identification number (ID) the story had in the Reuters-22173 collection. 5. NEWID : The identification number (ID) the story has in the Reuters-21578, Distribution 1.0 collection. These IDs are assigned to the stories in chronological order. In addition, some REUTERS tags have a sixth attribute, CSECS, which can be ignored. The use of these attributes is critical to allowing comparability between different studies with the collection, and is discussed further in Section VIII. VI.B. Document-Internal Tags Just as the and tags serve to delimit documents within a file, other tags are used to delimit elements within a document. We discuss these in the order in which they typically appear, though the exact order should not be relied upon in processing. In some cases, additional tags occur within an element delimited by these top level document-internal tags. These are discussed in this section as well. We specify below whether each open/close tag pair is used exactly once (ONCE) per a story, or a variable (VARIABLE) number of times (possibly zero). In many cases the start tag of a pair appears only at the beginning of a line, with the corresponding end tag always appearing at the end of the same line. When this is the case, we indicate it with the notation "SAMELINE" below, as an aid to those processing the files without SGML tools. 1. , [ONCE, SAMELINE]: Encloses the date and time of the document, possibly followed by some non-date noise material. 2. , [VARIABLE] : Notes on certain hand corrections that were done to the original Reuters corpus by Steve Finch. 3. , [ONCE, SAMELINE]: Encloses the list of TOPICS categories, if any, for the document. If TOPICS categories are present, each will be delimited by the tags and . 4. , [ONCE, SAMELINE]: Same as but for PLACES categories. 5. , [ONCE, SAMELINE]: Same as but for PEOPLE categories. 6. , [ONCE, SAMELINE]: Same as but for ORGS categories. 7. , [ONCE, SAMELINE]: Same as but for EXCHANGES categories. 8. , [ONCE, SAMELINE]: These tags always appear adjacent to each other, since there are no COMPANIES categories assigned in the collection. 9. , [VARIABLE]: These tags bracket control characters and other noisy and/or somewhat mysterious material in the Reuters stories. 10. , [ONCE]: We have attempted to delimit all the textual material of each story between a pair of these tags. Some control characters and other "junk" material may also be included. The whitespace structure of the text has been preserved. The tag has the following attribute: a. TYPE: This has one of three values: NORM, BRIEF, and UNPROC. NORM is the default value and indicates that the text of the story had a normal structure. In this case the TEXT tag appears simply as . The tag appears as when the story is a short one or two line note. The tags appears as when the format of the story is unusual in some fashion that limited our ability to further structure it. The following tags optionally delimit elements inside the TEXT element. Not all stories will have these tags: a. , : Author of the story. b. , : Location the story originated from, and day of the year. c. , : Title of the story. We have attempted to capture the text of stories with TYPE="BRIEF" within a element. d. <BODY>, </BODY> : The main text of the story. VII. Categories A test collection for text categorization contains, at minimum, a set of texts and, for each text, a specification of what categories that text belongs to. For the Reuters-21578 collection the documents are Reuters newswire stories, and the categories are five different sets of content related categories. For each document, a human indexer decided which categories from which sets that document belonged to. The category sets are as follows: Number of Number of Categories Number of Categories Category Set Categories w/ 1+ Occurrences w/ 20+ Occurrences ************ ********** ******************** ******************** EXCHANGES 39 32 7 ORGS 56 32 9 PEOPLE 267 114 15 PLACES 175 147 60 TOPICS 135 120 57 The TOPICS categories are economic subject categories. Examples include "coconut", "gold", "inventories", and "money-supply". This set of categories is the one that has been used in almost all previous research with the Reuters data. HAYES90b discusses some examples of the policies (not always obvious) used by the human indexers in deciding whether a document belonged to a particular TOPIC category. The EXCHANGES, ORGS, PEOPLE, and PLACES categories correspond to named entities of the specified type. Examples include "nasdaq" (EXCHANGES), "gatt" (ORGS), "perez-de-cuellar" (PEOPLE), and "australia" (PLACES). Typically a document assigned to a category from one of these sets explicitly includes some form of the category name in the document's text. (Something which is usually not true for TOPICS categories.) However, not all documents containing a named entity corresponding to the category name are assigned to these category, since the entity was required to be a focus of the news story [HAYES90b]. Thus these proper name categories are not as simple to assign correctly as might be thought. Reuters-21578, Distribution 1.0 includes five files (all-exchanges-strings.lc.txt, all-orgs-strings.lc.txt, all-people-strings.lc.txt, all-places-strings.lc.txt, and all-topics-strings.lc.txt) which list the names of *all* legal categories in each set. A sixth file, cat-descriptions_120396.txt gives some additional information on the category sets. Note that a sixth category field, COMPANIES, was present in the original Reuters materials distributed by Carnegie Group, but no company information was actually included in these fields. In the Reuters-21578 collection this field is always empty. In the table above we note how many categories appear in at least 1 of the 21,578 documents in the collection, and how many appear at least 20 of the documents. Many categories appear in no documents, but we encourage researchers to include these categories when evaluating the effectiveness of their categorization system. Additional details of the documents, categories, and corpus preparation process appear in LEWIS92b, and at greater length in Section 8.1 of LEWIS91d. VIII. Using Reuters-21578 for Text Categorization Research In testing a method for text categorization it is important that knowledge of the nature of the test data not unduly influence the development of the system, or the performance obtained will be unrealistically high. One way of dealing with this is to divide a set of data into two subsets: a training set and a test set. An experimenter then develops a categorization system by automated training on the training set only, and/or by human knowledge engineering based on examination of the training set only. The categorization system is then tested on the previously unexamined test set. A number of variations on this basic theme are possible---see WEISS91 for a good discussion. Effectiveness results can only be compared between studies that the same training and test set (or that use cross-validation procedures). One problem with the Reuters-22173 collection was that the ambiguity of formatting and annotation led different researchers to use different training/test divisions. This was particularly problematic when researchers attempted to remove documents that "had no TOPICS", as there were several definitions of what this meant. To eliminate these ambiguities from the Reuters-21578 collection we specify exactly which articles are in each of the recommended training sets and test sets by specifying the values those articles will have on the TOPICS, LEWISSPLIT, and CGISPLIT attributes of the REUTERS tags. We strongly encourage that all studies on Reuters-21578 use one of the following training test divisions (or use multiple random splits, e.g. cross-validation): VIII.A. The Modified Lewis ("ModLewis") Split: Training Set (13,625 docs): LEWISSPLIT="TRAIN"; TOPICS="YES" or "NO" Test Set (6,188 docs): LEWISSPLIT="TEST"; TOPICS="YES" or "NO" Unused (1,765): LEWISSPLIT="NOT-USED" or TOPICS="BYPASS" This replaces the 14704/6746 split (723 unused) of the Reuters-22173 collection, which was used in LEWIS91d (Chapters 9 and 10), LEWIS92b, LEWIS92c, LEWIS92e, and LEWIS94b. Note the following: 1. The duplicate documents removed in forming Reuters-21578 are of course not present. 2. The documents with TOPICS="BYPASS" are not used, since subsequent analysis strongly indicates that they were not categorized by the indexers. 3. The 1,765 unused documents should not be tested on and should not be used for supervised learning. However, they may useful as additional information on the statistical distribution of words, phrases, and other features that might used to predict categories. This split assigns documents from April 7, 1987 and before to the training set, and documents from April 8, 1987 and after to the test set. WARNING: Given the many changes in going from Reuters-22173 to Reuters-21578, including correction of many typographical errors in category labels, results on the ModLewis split cannot be compared with any published results on the Reuters-22173 collection! VIII.B. The Modified Apte ("ModApte") Split : Training Set (9,603 docs): LEWISSPLIT="TRAIN"; TOPICS="YES" Test Set (3,299 docs): LEWISSPLIT="TEST"; TOPICS="YES" Unused (8,676 docs): LEWISSPLIT="NOT-USED"; TOPICS="YES" or TOPICS="NO" or TOPICS="BYPASS" This replaces the 10645/3672 split (7,856 not used) of the Reuters-22173 collection. These are our best approximation to the training and test splits used in APTE94 and APTE94b. Note the following: 1. As with the ModLewis, those documents removed in forming Reuters-21578 are not present, and BYPASS documents are not used. 2. The intent in APTE94 and APTE94b was to use the Lewis split, but restrict it to documents with at least one TOPICS categories. However, but it was not clear exactly what Apte, et al meant by having at least one TOPICS category (e.g. how was "bypass" treated, whether this was before or after any fixing of typographical errors, etc.). We have encoded our interpretation in the TOPICS attribute. ***Note that, as discussed above, some TOPICS="YES" stories have no TOPICS categories, and a few TOPICS="NO" stories have TOPICS categories. These facts are irrelevant to the definition of the split.*** If you are using a learning algorithm that requires each training document to have at least TOPICS category, you can screen out the training documents with no TOPICS categories. Please do NOT screen out any of the 3,299 documents - that will make your results incomparable with other studies. 3. As with ModLewis, it may be desirable to use the 8,676 Unused documents for gathering statistical information about feature distribution. As with ModLewis, this split assigns documents from April 7, 1987 and before to the training set, and documents from April 8, 1987 and after to the test set. The difference is that only documents with at least one TOPICS category are used. The rationale for this restriction is that while some documents lack TOPICS categories because no TOPICS apply (i.e. the document is a true negative example for all TOPICS categories), it appears that others simply were never assigned TOPICS categories by the indexers. (Unfortunately, the amount of time that has passed since the collection was created has made it difficult to establish exactly what went on during the indexing.) WARNING: Given the many changes in going from Reuters-22173 to Reuters-21578, including correction of many typographical errors in category labels, results on the ModApte split cannot be compared with any published results on the Reuters-22173 collection! VIII.C. The Modified Hayes ("ModHayes") Split: Training Set (20856 docs): CGISPLIT="TRAINING-SET" Test Set (722 docs): CGISPLIT="PUBLISHED-TESTSET" Unused (0 docs) This is the best approximation we have to the training and test splits used in HAYES89, HAYES90b, and Chapter 8 of LEWIS91d. It replaces the 21450/723 split of the Reuters-22173 collection. Note the following: 1. As with the other splits, the duplicate documents removed in forming Reuters-21578 are not present. 2. "Training" in HAYES89 and HAYES90b was actually done by human beings looking at the documents and writing categorization rules. We can not be sure which of the document files were actually looked at. 3. We specify that the BYPASS stories and the TOPICS=NO stories are part of the training set, since they were used during manual knowledge engineering in the original Hayes experiments. That does not mean researchers are obliged to give these stories to, for instance, a supervised learning algorithm. As mentioned in the other splits, they may be more useful for getting distributional information about features. There are a number of problems with the ModHayes split that make it less than desirable for text categorization research, including unusual distribution of categories, pairs of near-duplicate documents, and chronological burstiness. (See [LEWIS90b, Ch. 8] for more details.) Despite these problems, this split is of interest because it provides the ability to compare results with those of the CONSTRUE system [HAYES89, HAYES90b]. Comparison of results on the ModHayes split with previously published results on the original Hayes split in HAYES89 and HAYES90b (and LEWIS90b, Ch. 8) is possible, though the following points should be taken into account: 1. The testset we provide in the ModHayes split has one fewer document than the one Hayes used. The document that was removed (OLDID="22026") was a timestamp duplicate of the document with OLDID="22027" and NEWID="13234". So in computing effectiveness measures for comparison with HAYES89/90b, the document with NEWID="13234" should be counted twice. 2. The documents in the Hayes testset had relatively few errors and anomalies in their categorization. And the errors which we did find and correct appear unlikely to have affected the original Hayes results. In particular, it appears that the only errors in the TOPICS field were the addition of a few invalid categories that were not evaluated on. However, for completeness we list the changes in the Hayes testset documents made going from Reuters-22173 to Reuters-21578 (all documents are referred to by their NEWID): Removal of invalid TOPIC "loan" : 13234, 16946, 17111, 17112, 17207, 17217, 17228, 17234, 17271, 17310 Removal of invalid TOPIC "gbond" : 17138, 17260 Removal of invalid TOPIC "tbill" : 17258 Removal of invalid TOPIC "cbond" : 17024 Removal of invalid TOPIC "fbond" : 17087 Correction of invalid PEOPLE mancera to mancera-aguayo: 17142, 17149, 17154, 17177, 17187 Correction of invalid PEOPLE andriesssen to andriessen : 17366 Correction of invalid PLACES "ivory" and "coast" to single correct PLACE "ivory-coast": 18383 3. The effectiveness measures used in HAYES89 and HAYES90b were somewhat nonstandard. See Ch. 8 of LEWIS91d for a discussion. VIII.D. Other Splits We strongly encourage researchers to use one (or more) of the above splits for their experiments (or use cross-validation on one of the sets of documents defined in the above splits). We recommend the Modified Apte ("ModApte") Split for research on predicting the TOPICS field, since the evidence is that a significant number of documents that should have TOPICS do not. The ModLewis split can be used if the researcher has a strong need to test the ability of a system to deal with examples belonging to no category. While it is likely that some of these examples should indeed belong to a category, the ModLewis split is at least better than the corresponding split from Reuters-22173, in that it eliminates the "bypass" stories. We in particular encourage you to resist the following temptations: 1. Defining new splits based on whether or not the documents actually have any TOPICS categories. (See the discussion of the ModApte split.) 2. Testing your system only on the "easy" categories. This is a temptation we have succumbed to in the past, but will resist in the future. Yes, we know that some of the 135 TOPICS categories have few or no positive training examples or few or no positive test examples or both. Yes, purely supervised learning systems will do very badly on these categories. Knowledge-based systems, on the other hand, might do well on them, while doing poorly in comparison with supervised learning on categories with lots of positive examples. These comparisons are of great interest. Of course, it's of great interest to *in addition* analyze subsets of categories (e.g. lots of positive examples vs. few positive examples, etc.). Note that one strategy we considered and rejected is to assume that documents which have no TOPICS but do have categories in other fields (PLACES, etc.) could be assumed to belong to no TOPICS categories. This does not appear to be a safe assumption - we have found a number of examples of documents with PLACES but no TOPICS when there are TOPICS that clearly apply. IX. Feature Sets in Text Categorization For many text categorization methods, particularly those using statistical classification techniques, it is convenient to represent documents not as a sequence of characters, but rather as a tuple of numeric or binary feature values. For instance, the value of feature Fi for a document Dj might be 1 if the string of characters "financial" occurred in the document with whitespace on either side, and 0 otherwise. Or the value of Fi for Dj might be the number of occurrences of "financial" in document Dj. In information retrieval such features are often called "indexing terms" and one often speaks of a term being "present" in a document, to mean that the feature takes on a non-default value. (Usually, but not always, any value but 0 is non-default.) Comparisons between text categorization methods that represent documents as feature tuples are aided by ensuring that the same tuple representation is used with all methods, thus avoiding conflating differences in feature extraction with differences in, say, machine learning methods. For that reason, the Reuters-22173 distribution included not only the formatted text of the Reuters stories, but also feature tuple representations of the stories in each of two feature sets, one based on words and one based on noun phrases. Surprisingly, almost no use was made of these files by other researchers, so we have not included files of this sort in the Reuters-21578 distribution. However, we are willing to make available as part of the distribution any tuple representations of this sort that researchers want to contribute. (Contact lewis@research.att.com if you would like to do this.) Perhaps the ideal situation would be if someone with a strong interest in feature set formation produced tuples based on a high quality set of features which other researchers interested only in learning algorithms could make use of. X. Bibliography [This needs to be updated.] @article{APTE94 ,author = "Chidanand Apt{\'{e}} and Fred Damerau and Sholom M. Weiss" ,title = "Automated Learning of Decision Rules for Text Categorization" ,journal = "ACM Transactions on Information Systems" ,year = 1994 , note = "To appear." } @inproceedings{APTE94b ,author = "Chidanand Apt{\'{e}} and Fred Damerau and Sholom M. Weiss" ,title = "Toward Language Independent Automated Learning of Text Categorization Models" ,booktitle = sigir94 ,year = 1994 ,note = "To appear." } @inproceedings{HAYES89 ,author = "Philip J. Hayes and Peggy M. Anderson and Irene B. Nirenburg and Linda M. Schmandt" ,title = "{TCS}: A Shell for Content-Based Text Categorization" ,booktitle = "IEEE Conference on Artificial Intelligence Applications" ,year = 1990 } @inproceedings{HAYES90b ,author = "Philip J. Hayes and Steven P. Weinstein" ,title = "{CONSTRUE/TIS:} A System for Content-Based Indexing of a Database of News Stories" ,booktitle = "Second Annual Conference on Innovative Applications of Artificial Intelligence" ,year = 1990 } @incollection{HAYES92 ,author = "Philip J. Hayes" ,title = "Intelligent High-Volume Text Processing using Shallow, Domain-Specific Techniques" ,booktitle = "Text-Based Intelligent Systems" ,publisher = "Lawrence Erlbaum" ,address = "Hillsdale, NJ" ,year = 1992 ,editor = "Paul S. Jacobs" } @inproceedings{LEWIS91c ,author = "David D. Lewis" ,title = "Evaluating Text Categorization" ,booktitle = "Proceedings of Speech and Natural Language Workshop" ,year = 1991 ,month = feb ,organization = "Defense Advanced Research Projects Agency" ,publisher = "Morgan Kaufmann" ,pages = "312--318" } @phdthesis{LEWIS91d ,author = "David Dolan Lewis" ,title = "Representation and Learning in Information Retrieval" ,school = "Computer Science Dept.; Univ. of Massachusetts; Amherst, MA 01003" ,year = 1992 ,note = "Technical Report 91--93." } @inproceedings{LEWIS91e ,author = "David D. Lewis" ,title = "Data Extraction as Text Categorization: An Experiment with the {MUC-3} Corpus" ,booktitle = "Proceedings of the Third Message Understanding Evaluation and Conference" ,year = 1991 ,month = may ,organization = "Defense Advanced Research Projects Agency" ,publisher = "Morgan Kaufmann" ,address = "Los Altos, CA" } @inproceedings{LEWIS92b ,author = "David D. Lewis" ,title = "An Evaluation of Phrasal and Clustered Representations on a Text Categorization Task" ,booktitle = "Fifteenth Annual International ACM SIGIR Conference on Research and Development in Information Retrieval" ,year = 1992 ,pages = "37--50" } @inproceedings{LEWIS92d ,author = "David D. Lewis and Richard M. Tong" ,title = "Text Filtering in {MUC-3} and {MUC-4}" ,booktitle = "Proceedings of the Fourth Message Understanding Conference ({MUC-4})" ,year = 1992 ,month = jun ,organization = "Defense Advanced Research Projects Agency" ,publisher = "Morgan Kaufmann" ,address = "Los Altos, CA" } @inproceedings{LEWIS92e ,author = "David D. Lewis" ,title = "Feature Selection and Feature Extraction for Text Categorization" ,booktitle = "Proceedings of Speech and Natural Language Workshop" ,year = 1992 ,month = feb ,organization = "Defense Advanced Research Projects Agency" ,publisher = "Morgan Kaufmann" ,pages = "212--217" } @inproceedings{LEWIS94b ,author = "David D. Lewis and Marc Ringuette" ,title = "A Comparison of Two Learning Algorithms for Text Categorization" ,booktitle = "Symposium on Document Analysis and Information Retrieval" ,year = 1994 ,organization = "ISRI; Univ. of Nevada, Las Vegas" ,address = "Las Vegas, NV" ,month = apr ,pages = "81--93" } @article{LEWIS94d , author = "David D. Lewis and Philip J. Hayes" , title = "Guest Editorial" , journal = "ACM Transactions on Information Systems" , year = 1994 , volume = 12 , number = 3 , pages = "231" , month = jul } @article{SPARCKJONES76 ,author = "K. {Sparck Jones} and C. J. {van Rijsbergen}" ,title = "Information Retrieval Test Collections" ,journal = "Journal of Documentation" ,year = 1976 ,volume = 32 ,number = 1 ,pages = "59--75" } @book{WEISS91 ,author = "Sholom M. Weiss and Casimir A. Kulikowski" ,title = "Computer Systems That Learn" ,publisher = "Morgan Kaufmann" ,year = 1991 ,address = "San Mateo, CA" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/all-exchanges-strings.lc.txt�����������������������0000664�0000000�0000000�00000000272�11540251763�0026426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������amex ase asx biffex bse cboe cbt cme comex cse fox fse hkse ipe jse klce klse liffe lme lse mase mise mnse mose nasdaq nyce nycsce nymex nyse ose pse set simex sse stse tose tse wce zse ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/all-orgs-strings.lc.txt����������������������������0000664�0000000�0000000�00000000474�11540251763�0025437�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������adb-africa adb-asia aibd aid anrpc asean atpc bis cipec comecon ec eca ecafe ece ecla ecsc ecwa efta eib emcf escap euratom fao gatt gcc geplacea iaea iata icco ico-coffee ico-islam ida iea iisi ilo ilzsg imco imf inro irsg isa itc iwc-whale iwc-wheat iwcc iws iwto lafta mfa oapec oecd opec un unctad who worldbank ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/all-people-strings.lc.txt��������������������������0000664�0000000�0000000�00000004652�11540251763�0025753�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������abdel-hadi-kandeel alfonsin alhaji-abdul-ahmed alptemocin amato andersen andriessen aqazadeh aquino arafat babangida balladur bangemann barreto berge beteta blix boesky bond botha bouey braks bresser-pereira brodersohn brundtland camdessus carlsson caro castelo-branco castro cavaco-silva chaves chen-muhua chiang-ching-kuo chien chirac ciampi colombo conable concepcion corrigan cossiga crow dadzie dauster de-clercq de-kock de-korte de-la-madrid de-larosiere del-mazo delamuraz delors dementsev deng-xiaoping dennis dhillon dominguez douglas du-plessis duisenberg dunkel edelman enggaard eser evren eyskens feldt fernandez ferrari finnbogadottir friedman fujioka gaddafi gandhi garcia gava godeaux gonzalez gorbachev goria gostyev graf greenspan gromyko grosz guillaume halikias hamad-saud-al-sayyari hannibalsson haughey hawke he-kang herrington hillery hisham-nazer hoefner hoffmeyer holberg holkeri honecker hovmand howard-baker husak icahn james-baker james-miller jaruzelski jayme johnston kaminsky kaufman keating khameini khomeini kiechle king-fahd kohl koivisto kondo koren kullberg lacina lange languetin lawson lee-ta-hai lee-teng-hui leenanon leigh-pemberton leitz li-peng li-xiannian liikanen lubbers lukman lyng machinea macsharry malhotra mancera-aguayo martens martin masse maxwell maystadt medgyessy messner mikulic milliet mitterrand miyazawa mohammad-ibrahim-jaffrey-baluch mohammad-khan-junejo mohammad-yasin-khan-wattoo mohammed-ahmed-al-razaz mohammed-ali-abal-khail mohammed-salaheddin-hamid morales-bermudez mousavi moyle mubarak mulroney murdoch mustapha nakao nakasone nasko nemeth nobrega o-cofaigh o-kennedy oeien okongwu ongpin ortega ozal palsson pandolfi papandreou parkinson paye perez-de-cuellar petricioli pickens poehl pottakis prawiro qassemi rafnar rafsanjani reagan rezende riberio-cadilhe rich rikanovic rojas romero roumeliotis rowland rubio ruder ruding russell ryzhkov saberbein salinas samojlik santer saracoglu sarney sartzetakis sathe schlueter sedki simitis simonsen singhasaneh siregar skaanland soares solchaga sourrouille sprinkel steeg stich stoltenberg stoph strougal subroto suharto sumita suominen takeshita tamura tavares-moreia thatcher timar tinsulanonda tiwari toernaes toman tsovolas vancsa venkataraman vera-la-rosa verity villanyi vlatkovic volcker von-weizsaecker vranitzky waldheim wali walsh wang-bingqian wardhana wasim-aun-jaffrey wilson wise yeutter young yu-kuo-hua zak zhao-ziyang zheng-tuobin zia-ul-haq ��������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/all-places-strings.lc.txt��������������������������0000664�0000000�0000000�00000003271�11540251763�0025732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������afghanistan albania algeria american-samoa andorra angola anguilla antigua argentina aruba australia austria bahamas bahrain bangladesh barbados belgium belize benin bermuda bhutan bolivia botswana brazil british-virgin-islands brunei bulgaria burkina-faso burma burundi cameroon canada cape-verde cayman-islands central-african-republic chad chile china colombia congo costa-rica cuba cyprus czechoslovakia denmark djibouti dominica dominican-republic east-germany ecuador egypt el-salvador equatorial-guinea ethiopia fiji finland france french-guiana gabon gambia ghana gibraltar greece grenada guadeloupe guam guatemala guinea guinea-bissau guyana haiti honduras hong-kong hungary iceland india indonesia iran iraq ireland israel italy ivory-coast jamaica japan jordan kampuchea kenya kuwait laos lebanon lesotho liberia libya liechtenstein luxembourg macao madagascar malawi malaysia mali malta martinique mauritania mauritius mexico monaco morocco mozambique namibia nepal netherlands netherlands-antilles new-caledonia new-zealand nicaragua niger nigeria north-korea norway oman pakistan panama papua-new-guinea paraguay peru philippines poland portugal qatar romania rwanda saudi-arabia senegal seychelles sierra-leone singapore somalia south-africa south-korea spain sri-lanka sudan suriname swaziland sweden switzerland syria taiwan tanzania thailand togo tonga trinidad-tobago tunisia turkey uae uganda uk uruguay us-virgin-islands usa ussr vanuatu vatican venezuela vietnam west-germany western-samoa yemen-arab-republic yemen-demo-republic yugoslavia zaire zambia zimbabwe ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/all-topics-strings.lc.txt��������������������������0000664�0000000�0000000�00000001755�11540251763�0025771�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������acq alum austdlr austral barley bfr bop can carcass castor-meal castor-oil castorseed citruspulp cocoa coconut coconut-oil coffee copper copra-cake corn corn-oil cornglutenfeed cotton cotton-meal cotton-oil cottonseed cpi cpu crude cruzado dfl dkr dlr dmk drachma earn escudo f-cattle ffr fishmeal flaxseed fuel gas gnp gold grain groundnut groundnut-meal groundnut-oil heat hk hog housing income instal-debt interest inventories ipi iron-steel jet jobs l-cattle lead lei lin-meal lin-oil linseed lit livestock lumber lupin meal-feed mexpeso money-fx money-supply naphtha nat-gas nickel nkr nzdlr oat oilseed orange palladium palm-meal palm-oil palmkernel peseta pet-chem platinum plywood pork-belly potato propane rand rape-meal rape-oil rapeseed red-bean reserves retail rice ringgit rubber rupiah rye saudriyal sfr ship silk silver singdlr skr sorghum soy-meal soy-oil soybean stg strategic-metal sugar sun-meal sun-oil sunseed tapioca tea tin trade tung tung-oil veg-oil wheat wool wpi yen zinc �������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/cat-descriptions_120396.txt������������������������0000664�0000000�0000000�00000067042�11540251763�0025736�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Some notes on the Reuters Categories David D. Lewis 3-Dec-96 The letter W. Bruce Croft received from Phil Hayes (March 9, 1990) gave a list of 135 TOPICS categories, which were used in HAYES89. I reproduce this list below. The email message David D. Lewis received (Nov. 26, 1990) from Phil Hayes gave lists (which I reproduce below) for categories in these fields: number stated number actually at top of list on list ORGS 56 56 EXCHANGES 39 39 PLACES (i.e. COUNTRIES) 176 175 PEOPLE 269 267 Total 540 537 Total stated in IEEE paper: 539 The total 674 categories mentioned in HAYES90b is the sum of 135 and 539. So the published numbers are a little off. For the purposes of Reuters-21578 we have taken as ground truth the actual lists of category names, and the number of items on those lists. ********************************************************************* ****Subject Codes (135) Money/Foreign Exchange (MONEY-FX) Shipping (SHIP) Interest Rates (INTEREST) **Economic Indicator Codes (16) Balance of Payments (BOP) Trade (TRADE) Consumer Price Index (CPI) Wholesale Price Index (WPI) Unemployment (JOBS) Industrial Production Index (IPI) Capacity Utilisation (CPU) Gross National/Domestic Product (GNP) Money Supply (MONEY-SUPPLY) Reserves (RESERVES) Leading Economic Indicators (LEI) Housing Starts (HOUSING) Personal Income (INCOME) Inventories (INVENTORIES) Instalment Debt/Consumer Credit (INSTAL-DEBT) Retail Sales (RETAIL) **Currency Codes (27) U.S. Dollar (DLR) Australian Dollar (AUSTDLR) Hong Kong Dollar (HK) Singapore Dollar (SINGDLR) New Zealand Dollar (NZDLR) Canadian Dollar (CAN) Sterling (STG) D-Mark (DMK) Japanese Yen (YEN) Swiss Franc (SFR) French Franc (FFR) Belgian Franc (BFR) Netherlands Guilder/Florin (DFL) Italian Lira (LIT) Danish Krone/Crown (DKR) Norwegian Krone/Crown (NKR) Swedish Krona/Crown (SKR) Mexican Peso (MEXPESO) Brazilian Cruzado (CRUZADO) Argentine Austral (AUSTRAL) Saudi Arabian Riyal (SAUDRIYAL) South African Rand (RAND) Indonesian Rupiah (RUPIAH) Malaysian Ringitt (RINGGIT) Portuguese Escudo (ESCUDO) Spanish Peseta (PESETA) Greek Drachma (DRACHMA) **Corporate Codes (2) Mergers/Acquisitions (ACQ) Earnings and Earnings Forecasts (EARN) **Commodity Codes (78) ALUM BARLEY CARCASS CASTOR-MEAL CASTOR-OIL CASTORSEED CITRUSPULP COCOA COCONUT-OIL COCONUT COFFEE COPPER COPRA-CAKE CORN-OIL CORN CORNGLUTENFEED COTTON COTTON-MEAL COTTON-OIL COTTONSEED F-CATTLE FISHMEAL FLAXSEED GOLD GRAIN GROUNDNUT GROUNDNUT-MEAL GROUNDNUT-OIL IRON-STEEL LEAD LIN-MEAL LIN-OIL LINSEED LIVESTOCK L-CATTLE HOG LUMBER LUPIN MEAL-FEED NICKEL OAT OILSEED ORANGE PALLADIUM PALM-MEAL PALM-OIL PALMKERNEL PLATINUM PLYWOOD PORK-BELLY POTATO RAPE-MEAL RAPE-OIL RAPESEED RED-BEAN RICE RUBBER RYE SILK SILVER SORGHUM SOY-MEAL SOY-OIL SOYBEAN STRATEGIC-METAL SUGAR SUN-MEAL SUN-OIL SUNSEED TAPIOCA TEA TIN TUNG-OIL TUNG VEG-OIL WHEAT WOOL ZINC **Energy Codes (9) Crude Oil (CRUDE) Heating Oil/Gas Oil (HEAT) Fuel Oil (FUEL) Gasoline (GAS) Natural Gas (NAT-GAS) Petro-Chemicals (PET-CHEM) Propane (PROPANE) Jet and Kerosene (JET) Naphtha (NAPHTHA) ________________________________________________________________ @heading[Organization Codes (56)] @begin[format] African Development Bank (ADB-AFRICA)@* Agency for International Development (AID)@* Asian Development Bank (ADB-ASIA)@* Association of International Bond Dealers (AIBD)@* Association of Natural Rubber Producing Countries (ANRPC)@* Association of South East Asian Nations (ASEAN)@* Association of Tin Producing Countries (ATPC)@* Bank for International Settlements (BIS)@* Council for Mutual Economic Assistance (COMECON)@* Economic Commission for Africa (ECA)@* Economic Commission for Asia and the Far East (ECAFE)@* Economic Commission for Europe (ECE)@* Economic Commission for Latin America and The Caribbean (ECLA)@* Economic Commission for West Asia (ECWA)@* Economic and Social Commission for Asia and the Pacific (ESCAP)@* European Atomic Energy Community (EURATOM)@* European Coal and Steel Community (ECSC)@* European Community (EC)@* European Free Trade Association (EFTA)@* European Investment Bank (EIB)@* European Monetary Cooperation Fund (EMCF)@* Food and Agriculture Organisation (FAO)@* General Agreement on Tariffs and Trade (GATT)@* Grupo de Paises Latinoamericanos y del Caribe Exportadores de Azucar [Group of Latin American and Caribbean Sugar Exporting Countries] (GEPLACEA)@* Gulf Cooperation Council (GCC)@* Inter-Government Council of Copper Exporting Countries (CIPEC)@* Inter-Governmental Maritime Consultative Organisation (IMCO)@* International Air Transport Association (IATA)@* International Atomic Energy Authority (IAEA)@* International Bank for Reconstruction and Development (WORLDBANK)@* International Cocoa Organisation (ICCO)@* International Coffee Organisation (ICO-COFFEE)@* International Development Association (IDA)@* International Energy Agency (IEA)@* International Iron and Steel Institute (IISI)@* International Labour Organisation (ILO)@* International Lead and Zinc Study Group (ILZSG)@* International Monetary Fund (IMF)@* International Natural Rubber Organisation (INRO)@* International Rubber Study Group (IRSG)@* International Sugar Agreement (ISA)@* International Tin Council (ITC)@* International Whaling Commission (IWC-WHALE)@* International Wheat Council (IWC-WHEAT)@* International Wool Secretariat (IWS)@* International Wool Textile Organisation (IWTO)@* International Wrought Copper Council (IWCC)@* Islamic Conference Organisation (ICO-ISLAM)@* Latin American Free Trade Association (LAFTA)@* Multi-Fibres Arrangement (MFA)@* Organisation for Economic Cooperation and Development (OECD)@* Organisation of Arab Petroleum Exporting Countries (OAPEC)@* Organisation of Petroleum Exporting Countries (OPEC)@* United Nations (UN)@* United Nations Conference on Trade and Development (UNCTAD)@* World Health Organisation (WHO)@* @end[format] @blankspace[3 lines] ________________________________________________________________ @heading[Exchange Codes (39)] @begin[format] American Stock Exchange (AMEX)@* Amsterdam Stock Exchange/Bourse (ASE)@* Australian Stock Exchange (ASX)@* Baltic International Freight Futures Exchange (BIFFEX)@* Brussels Stock Exchange/Bourse (BSE)@* Chicago Board of Trade (CBT)@* Chicago Board of Trade Options Exchange (CBOE)@* Chicago Mercantile Exchange (CME)@* Copenhagen Stock Exchange/Bourse (CSE)@* Frankfurt Stock Exchange/Bourse (FSE)@* Hong Kong Stock Exchange (HKSE)@* International Petroleum Exchange (IPE)@* Johannesburg Stock Exchange (JSE)@* Kuala Lumpur Commodity Exchange (KLCE)@* Kuala Lumpur Stock Exchange (KLSE)@* London Futures and Options Exchange (FOX)@* London International Financial Futures Exchange (LIFFE)@* London Metal Exchange (LME)@* London Stock Exchange (LSE)@* Madrid Stock Exchange (MASE)@* Manila Stock Exchange (MNSE)@* Milan Stock Exchange/Bourse (MISE)@* Montreal Stock Exchange (MOSE)@* National Association of Securities Dealers Automated Quotation System (NASDAQ)@* New York Coffee, Sugar and Cocoa Exchange (NYCSCE)@* New York Commodity Exchange (COMEX)@* New York Cotton Exchange (NYCE)@* New York Mercantile Exchange (NYMEX)@* New York Stock Exchange (NYSE)@* Oslo Stock Exchange/Bourse (OSE)@* Paris Stock Exchange/Bourse (PSE)@* Securities Exchange of Thailand (SET)@* Singapore International Monetary Exchange (SIMEX)@* Singapore Stock Exchange (SSE)@* Stockholm Stock Exchange/Bourse (STSE)@* Tokyo Stock Exchange (TSE)@* Toronto Stock Exchange (TOSE)@* Winnipeg Commodity Exchange (WCE)@* Zurich Stock Exchange/Bourse (ZSE)@* @end[format] @blankspace[3 lines] ________________________________________________________________ @heading[Country Codes (176)] @begin[format] AFGHANISTAN@* ALBANIA @* ALGERIA @* AMERICAN-SAMOA@* ANDORRA @* ANGOLA @* ANGUILLA@* ANTIGUA @* ARGENTINA @* ARUBA@* AUSTRALIA @* AUSTRIA @* BAHAMAS @* BAHRAIN @* BANGLADESH @* BARBADOS@* BELGIUM @* BELIZE @* BENIN@* BERMUDA @* BHUTAN @* BOLIVIA @* BOTSWANA@* BRAZIL @* BRITISH-VIRGIN-ISLANDS@* BRUNEI @* BULGARIA@* BURKINA-FASO@* BURMA@* BURUNDI @* CAMEROON@* CANADA @* CAPE-VERDE @* CAYMAN-ISLANDS@* CENTRAL-AFRICAN-REPUBLIC@* CHAD @* CHILE@* CHINA@* COLOMBIA@* CONGO@* COSTA-RICA @* CUBA @* CYPRUS @* CZECHOSLOVAKIA@* DENMARK@* DJIBOUTI@* DOMINICA@* DOMINICAN-REPUBLIC@* EAST-GERMANY@* ECUADOR @* EGYPT@* EL-SALVADOR@* EQUATORIAL-GUINEA@* ETHIOPIA@* FIJI @* FINLAND @* FRANCE @* FRENCH-GUIANA@* GABON@* GAMBIA @* GHANA@* GIBRALTAR @* GREECE @* GRENADA @* GUADELOUPE @* GUAM @* GUATEMALA @* GUINEA-BISSAU@* GUINEA @* GUYANA @* HAITI@* HONDURAS@* HONG-KONG @* HUNGARY @* ICELAND @* INDIA@* INDONESIA @* IRAN @* IRAQ @* IRELAND @* ISRAEL @* ITALY@* IVORY-COAST@* JAMAICA @* JAPAN@* JORDAN @* KAMPUCHEA @* KENYA@* KUWAIT @* LAOS @* LEBANON @* LESOTHO @* LIBERIA @* LIBYA@* LIECHTENSTEIN@* LUXEMBOURG @* MACAO@* MADAGASCAR @* MALAWI @* MALAYSIA@* MALI @* MALTA@* MARTINIQUE @* MAURITANIA @* MAURITIUS @* MEXICO @* MONACO @* MOROCCO @* MOZAMBIQUE @* NAMIBIA @* NEPAL@* NETHERLANDS@* NETHERLANDS-ANTILLES@* NEW-CALEDONIA@* NEW-ZEALAND@* NICARAGUA @* NIGER@* NIGERIA @* NORTH-KOREA@* NORWAY @* OMAN @* PAKISTAN@* PANAMA @* PAPUA-NEW-GUINEA@* PARAGUAY@* PERU @* PHILIPPINES@* POLAND @* PORTUGAL@* QATAR@* ROMANIA @* RWANDA @* SAUDI-ARABIA@* SENEGAL @* SEYCHELLES @* SIERRA-LEONE@* SINGAPORE @* SOMALIA @* SOUTH-AFRICA@* SOUTH-KOREA@* SPAIN@* SRI-LANKA @* SUDAN@* SURINAME@* SWAZILAND @* SWEDEN @* SWITZERLAND@* SYRIA@* TAIWAN @* TANZANIA@* THAILAND@* TOGO @* TONGA@* TRINIDAD-TOBAGO@* TUNISIA @* TURKEY @* UAE @* UGANDA @* UK@* URUGUAY @* USA@* USSR@* US-VIRGIN-ISLANDS@* VANUATU @* VATICAN @* VENEZUELA @* VIETNAM @* WEST-GERMANY@* WESTERN-SAMOA@* YEMEN-ARAB-REPUBLIC@* YEMEN-DEMO-REPUBLIC@* YUGOSLAVIA @* ZAIRE@* ZAMBIA @* ZIMBABWE@* @end[format] @blankspace[3 lines] ________________________________________________________________ @heading[People Codes (269)] @begin[itemize] Argentina @begin[itemize] President Raul Alfonsin (ALFONSIN) Economy Minister Juan Sourrouille (SOURROUILLE) Finance Secretary Mario Brodersohn (BRODERSOHN) Central Bank Governor Jose Luis Machinea (MACHINEA) @end[itemize] Australia @begin[itemize] Prime Minister Robert (Bob) Hawke (HAWKE) Federal Treasurer Paul Keating (KEATING) Finance Minister Peter Walsh (WALSH) Central Bank (Reserve Bank) Governor Bob Johnston (JOHNSTON) @end[itemize] Austria @begin[itemize] President Kurt Waldheim (WALDHEIM) Chancellor Franz Vranitzky (VRANITZKY) Finance Minister Ferdinand Lacina (LACINA) Economy Minister Robert Graf (GRAF) Central Bank President Stephan Koren (KOREN) @end[itemize] Belgium @begin[itemize] Prime Minister Wilfried Martens (MARTENS) Deputy Prime Minister and Economy Minister Philippe Maystadt (MAYSTADT) Finance Minister Mark Eyskens (EYSKENS) Central Bank (National Bank) Governor Jean Godeaux (GODEAUX) @end[itemize] Brazil @begin[itemize] President Jose Sarney (SARNEY) Finance Minister Mailson Nobrega (NOBREGA) (former) Finance Minister Luiz Carlos Bresser Pereira (BRESSER-PEREIRA) Industry and Trade Minister Jose Hugo Castelo Branco (CASTELO-BRANCO) Agriculture Minister Iris Rezende (REZENDE) Mines and Energy Minister Aureliano Chaves (CHAVES) Central Bank President Fernando Milliet (MILLIET) @end[itemize] Canada @begin[itemize] Prime Minister Brian Mulroney (MULRONEY) Agriculture Minister John Wise (WISE) Finance Minister Michael Wilson (WILSON) Energy Minister Marcel Masse (MASSE) (former) Central Bank (Bank of Canada) Governor Gerald K. Bouey (BOUEY) Central Bank (Bank of Canada) Governor John Crow (CROW) @end[itemize] China @begin[itemize] President Li Xiannian (LI-XIANNIAN) Prime Minister Zhao Ziyang (ZHAO-ZIYANG) Premier Li Peng (LI-PENG) Elder Statesman (a member of the Standing Committee of the Communist Party Politburo) Deng Xiaoping (DENG-XIAOPING) Finance Minister Wang Bingqian (WANG-BINGQIAN) Foreign Economic Relations and Trade Minister Zheng Tuobin (ZHENG-TUOBIN) Agriculture Minister He Kang (HE-KANG) President of the People's Bank of China and Head of National Treasury Mrs Chen Muhua (CHEN-MUHUA) @end[itemize] Cuba @begin[itemize] Fidel Castro, President of Cuba (CASTRO) @end[itemize] Czechoslovakia @begin[itemize] President Gustav Husak (HUSAK) Prime Minister Lubomir Strougal (STROUGAL) Deputy Minister and Minister of Agriculture and Food Miroslav Toman (TOMAN) Finance Minister Jaromir Zak (ZAK) @end[itemize] Denmark @begin[itemize] Prime Minister Poul Schlueter (SCHLUETER) Finance Minister Palle Simonsen (SIMONSEN) (former) Economy Minister Anders Andersen (ANDERSEN) Economy Minister Knud Enggaard (ENGGAARD) Energy Minister Svend Erik Hovmand (HOVMAND) (former) Agriculture Minister Mrs Britta Schall Holberg (HOLBERG) Agriculture Minister Laurits Toernaes (TOERNAES) Central Bank Governor Erik Hoffmeyer (HOFFMEYER) @end[itemize] East Germany @begin[itemize] Head of State and Chairman of Council of State Erich Honecker, who is also General Secretary of the Socialist Unity Party (HONECKER) Prime Minister Willi Stoph (STOPH) Finance Minister Ernst Hoefner (HOEFNER) Agriculture, Forestry and Food Minister Bruno Leitz (LEITZ) State Bank President Horst Kaminsky (KAMINSKY) @end[itemize] Egypt @begin[itemize] President Hosni Mubarak (MUBARAK) Prime Minister Atef Sedki (SEDKI) (former) Economy Minister Youssri Wali (WALI) Economy Minister Youssri mustapha (MUSTAPHA) Finance Minister Mohammed Ahmed al-Razaz (MOHAMMED-AHMED-AL-RAZAZ) Oil and Mineral Wealth Minister Abdel-Hadi Kandeel (ABDEL-HADI-KANDEEL) Central Bank Governor Mohammed Salaheddin Hamid (MOHAMMED-SALAHEDDIN-HAMID) @end[itemize] Finland @begin[itemize] President Mauno Koivisto (KOIVISTO) Prime Minister Harri Holkeri (HOLKERI) Finance Minister Erkki Liikanen (LIIKANEN) Trade and Industry Minister Ilkka Suominen (SUOMINEN) Central Bank Governor Rolf Kullberg (KULLBERG) @end[itemize] France @begin[itemize] President Francois Mitterrand (MITTERRAND) Prime Minister Jacques Chirac (CHIRAC) Minister of State for Economy, Finance and Privatisation Edouard Balladur (BALLADUR) Agriculture Minister Francois Guillaume (GUILLAUME) Central Bank (Bank of France) Governor Jacques de Larosiere (DE-LAROSIERE) @end[itemize] Greece @begin[itemize] President Christos Sartzetakis (SARTZETAKIS) Prime Minister Andreas Papandreou (PAPANDREOU) Economy Minister Panayotis Roumeliotis (ROUMELIOTIS) (former) Economy Minister Kostas Simitis (SIMITIS) Finance Minister Dimitris Tsovolas (TSOVOLAS) Agriculture Minister Yannis Pottakis (POTTAKIS) Central Bank Governor Dimitris Halikias (HALIKIAS) @end[itemize] Hungary @begin[itemize] Head of State and President of Presidential Council Karoly Nemeth (NEMETH) Prime Minister Karoly Grosz (GROSZ) Finance Minister Miklos Villanyi (VILLANYI) (former) Finance Minister Peter Medgyessy (MEDGYESSY) Agriculture and Food Minister Jenoe Vancsa (VANCSA) Central Bank President Dr Matyas Timar (TIMAR) @end[itemize] Iceland @begin[itemize] President Mrs Vigdis Finnbogadottir (FINNBOGADOTTIR) Prime Minister Thorsteinn Palsson (PALSSON) Finance Minister Jon Baldvin Hannibalsson (HANNIBALSSON) Central Bank Chairman Jonas G. Rafnar (RAFNAR) @end[itemize] India @begin[itemize] President Ramaswamy Venkataraman (VENKATARAMAN) Prime Minister Rajiv Gandhi (GANDHI) Finance and Commerce Minister Narain Dutt Tiwari (TIWARI) Energy Minister Vasant Sathe (SATHE) Agriculture and Rural Development Minister Gurdial Singh Dhillon (DHILLON) Central Bank (Reserve Bank) Governor R.N. Malhotra (MALHOTRA) @end[itemize] Indonesia @begin[itemize] President General Suharto (SUHARTO) Economy Minister Ali Wardhana (WARDHANA) Finance Minister Radius Prawiro (PRAWIRO) Mining and Energy Minister Subroto (SUBROTO) Central Bank Governor Arifin Siregar (SIREGAR) @end[itemize] Iran @begin[itemize] Revolutionary Leader Ayatollah Ruhollah Khomeini (KHOMEINI) President Hojatoleslam Ali Khameini (KHAMEINI) Prime Minister Mir-Hossein Mousavi (MOUSAVI) Oil Minister Gholamreza Aqazadeh (AQAZADEH) Central Bank Governor Majid Qassemi (QASSEMI) Speaker of the Majlis (Parliament) Hojatoleslam Ali Hashemi Rafsanjani (RAFSANJANI) @end[itemize] Ireland @begin[itemize] President Patrick Hillery (HILLERY) Prime Minister Charles Haughey (HAUGHEY) Finance Minister Ray MacSharry (MACSHARRY) Agriculture Minister Michael O'Kennedy (O-KENNEDY) Central Bank Governor Tomas O'Cofaigh (O-COFAIGH) @end[itemize] Italy @begin[itemize] President Francesco Cossiga (COSSIGA) Prime Minister Giovanni Goria (GORIA) Deputy Prime Minister and Treasury Minister Guiliano Amato (AMATO) Finance Minister Antonio Gava (GAVA) Budget and Planning Minister Emilio Colombo (COLOMBO) Agriculture and Forestry Minister Filippo Maria Pandolfi (PANDOLFI) Central Bank (Bank of Italy) Governor Carlo Ciampi (CIAMPI) @end[itemize] Japan @begin[itemize] Prime Minister Noboru Takeshita (TAKESHITA) (former) Prime Minister Yasuhiro Nakasone (NAKASONE) Finance Minister Kiichi Miyazawa (MIYAZAWA) International Trade and Industry Minister Hajime Tamura (TAMURA) Director-General of Economic Planning Agency Eiichi Nakao (NAKAO) (former) Director-General of Economic Planning Agency Tetsuo Kondo (KONDO) Central Bank (Bank of Japan) Governor Satoshi Sumita (SUMITA) @end[itemize] Libya @begin[itemize] Muammar Gaddafi, Libyan leader (GADDAFI) @end[itemize] Luxembourg @begin[itemize] Prime Minister (who is also Minister of Communications, of Finance, of Planning and of Posts, Telephone and Telegraph) Jacques Santer (SANTER) @end[itemize] Mexico @begin[itemize] President Miguel de la Madrid (DE-LA-MADRID) Finance Minister Gustavo Petricioli (PETRICIOLI) Oil, Mines and Parastatal Industry Minister Alfredo Del Mazo (DEL-MAZO) (former) Director-General of Pemex (State Oil Company) Ramon Beteta (BETETA) Director-General of Pemex (State Oil Company) francisco Rojas (ROJAS) Central Bank President Miguel Mancera Aguayo (MANCERA-AGUAYO) @end[itemize] The Netherlands @begin[itemize] Prime Minister Ruud Lubbers (LUBBERS) Deputy Prime Minister and Minister for Economic Affairs Rudolf De Korte (DE-KORTE) Finance Minister Onno Ruding (RUDING) Agriculture Minister Gerrit Braks (BRAKS) Central Bank Governor Wim Duisenberg (DUISENBERG) @end[itemize] New Zealand @begin[itemize] Prime Minister David Lange (LANGE) Finance Minister Roger Douglas (DOUGLAS) Agriculture Minister Colin Moyle (MOYLE) Central Bank (Reserve Bank) Governor Spencer Russell (RUSSELL) @end[itemize] Nicaragua @begin[itemize] Daniel Ortega, President of Nicaragua (ORTEGA) @end[itemize] Nigeria @begin[itemize] President General Ibrahim Babangida (BABANGIDA) Agriculture Minister Major-General Mohammed Gado Nasko (NASKO) Finance Minister Chu Okongwu (OKONGWU) Petroleum Resources (Oil) Minister Rilwanu Lukman (LUKMAN) Central Bank Governor Alhaji Abdul Ahmed (ALHAJI-ABDUL-AHMED) @end[itemize] Norway @begin[itemize] Prime Minister Mrs Gro Harlem Brundtland (BRUNDTLAND) Finance Minister Gunnar Berge (BERGE) Oil and Energy Minister Arne Oeien (OEIEN) Central Bank Governor Hermud Skaanland (SKAANLAND) @end[itemize] Pakistan @begin[itemize] President General Zia-ul-Haq (ZIA-UL-HAQ) Prime Minister Mohammad Khan Junejo (MOHAMMAD-KHAN-JUNEJO) Finance and Economic Affairs, Petroleum and Natural Resources Minister Mohammad Yasin Khan Wattoo (MOHAMMAD-YASIN-KHAN-WATTOO) Agriculture Minister Mohammad Ibrahim Jaffrey Baluch (MOHAMMAD-IBRAHIM-JAFFREY-BALUCH) Central Bank (State Bank) Governor Wasim Aun Jaffrey (WASIM-AUN-JAFFREY) @end[itemize] Peru @begin[itemize] President Alan Garcia (GARCIA) Economy and Finance Minister Gustavo Saberbein Chevalier (SABERBEIN) (former) Trade and Industry Minister Manuel Romero Caro (CARO) Industry and Trade Minister Alberto Vera La Rose (VERA-LA-ROSA) Energy Minister Abel Salinas (SALINAS) Agriculture Minister Remigio Morales Bermudez (MORALES-BERMUDEZ) Central Bank President Cesar Ferrari (FERRARI) @end[itemize] Philippines @begin[itemize] President Mrs Corazon Aquino (AQUINO) (former) Finance Minister Jaime Ongpin (ONGPIN) Finance Minister Vicente Jayme (JAYME) Agriculture Minister Carlos Dominguez (DOMINGUEZ) Trade and Industry Minister Jose Concepcion (CONCEPCION) Central Bank Governor Jose Fernandez (FERNANDEZ) @end[itemize] Poland @begin[itemize] Head of State and Chairman of Council of State (who is also First Secretary of Polish United Workers (Communist) Party) General Wojciech Jaruzelski (JARUZELSKI) Prime Minister Zbigniew Messner (MESSNER) Finance Minister Bazyli Samojlik (SAMOJLIK) @end[itemize] Portugal @begin[itemize] President Mario Soares (SOARES) Prime Minister Anibal Cavaco Silva (CAVACO-SILVA) Finance Minister Miguel Riberio Cadilhe (RIBERIO-CADILHE) Agriculture, Fisheries and Food Minister Alvaro Barreto (BARRETO) Central Bank Governor Jose Tavares Moreia (TAVARES-MOREIA) @end[itemize] Saudi Arabia @begin[itemize] Head of State and also Prime Minister King Fahd (Ibn Abdulaziz) (KING-FAHD) Finance and National Economy Minister Sheikh Mohammed Ali Abal-Khail (MOHAMMED-ALI-ABAL-KHAIL) Petroleum/Oil Minister Hisham Nazer (HISHAM-NAZER) Governor of the Saudi Arabian Monetary Agency Hamad Saud al-Sayyari (HAMAD-SAUD-AL-SAYYARI) @end[itemize] South Africa @begin[itemize] President P.W. Botha (BOTHA) Finance Minister Barend du Plessis (DU-PLESSIS) Central Bank (Reserve Bank) Governor Gerhard de Kock (DE-KOCK) @end[itemize] Spain @begin[itemize] Prime Minister Felipe Gonzalez (GONZALEZ) Economy, Trade and Finance Minister Carlos Solchaga (SOLCHAGA) Agriculture Minister Carlos Romero (ROMERO) Central Bank Governor Mariano Rubio (RUBIO) @end[itemize] Sweden @begin[itemize] Prime Minister Ingvar Carlsson (CARLSSON) Finance Minister Kjell-Olof Feldt (FELDT) Central Bank Governor Bengt Dennis (DENNIS) @end[itemize] Switzerland @begin[itemize] Economy Minister Jean-Pascal Delamuraz (DELAMURAZ) Finance Minister Otto Stich (STICH) Central Bank President Pierre Languetin (LANGUETIN) @end[itemize] Taiwan @begin[itemize] President Lee Teng-hui (LEE-TENG-HUI) (former) President Chiang Ching-kuo (CHIANG-CHING-KUO) Prime Minister Yu Kuo-hua (YU-KUO-HUA) Economy Minister Lee Ta-hai (LEE-TA-HAI) Finance Minister Robert Chien (CHIEN) @end[itemize] Thailand @begin[itemize] President General Prem Tinsulanonda (TINSULANONDA) Finance Minister Suthee Singhasaneh (SINGHASANEH) Agriculture Minister General Harn Leenanon (LEENANON) @end[itemize] Turkey @begin[itemize] President Kenan Evren (EVREN) Prime Minister Turgut Ozal (OZAL) Finance Minister Ahmet Kurtcebe Alptemocin (ALPTEMOCIN) Central Bank Governor Rusdu Saracoglu (SARACOGLU) @end[itemize] United Kingdom @begin[itemize] Prime Minister Margaret Thatcher (THATCHER) Chancellor of the Exchequer (Finance Minister) Nigel Lawson (LAWSON) Energy Secretary Cecil Parkinson (PARKINSON) Trade and Industry Secretary Lord Young (YOUNG) Central Bank (Bank of England) Governor Robin Leigh-Pemberton (LEIGH-PEMBERTON) @end[itemize] United States @begin[itemize] President Ronald Reagan (REAGAN) Treasury Secretary James Baker (JAMES-BAKER) Commerce Secretary C. William Verity (VERITY) Energy Secretary John Herrington (HERRINGTON) Agriculture Secretary Richard Lyng (LYNG) White House Chief of Staff Howard Baker (HOWARD-BAKER) Representative for Trade Negotiations Clayton Yeutter (YEUTTER) Director of Management and Budget Office James Miller (JAMES-MILLER) Chairman of Federal Reserve Board Alan Greenspan (GREENSPAN) President of New York Federal Reserve Bank E. Gerald Corrigan (CORRIGAN) @end[itemize] USSR (Soviet Union) @begin[itemize] President Andrei Gromyko (GROMYKO) General Secretary of the Communist Party Mikhail Gorbachev (GORBACHEV) Prime Minister Nikolai Ryzhkov (RYZHKOV) Finance Minister Boris Gostyev (GOSTYEV) State Bank Board Chairman Viktor Dementsev (DEMENTSEV) @end[itemize] West Germany @begin[itemize] President Richard Von Weizsaecker (VON-WEIZSAECKER) Chancellor Helmut Kohl (KOHL) Finance Minister Gerhard Stoltenberg (STOLTENBERG) Economy Minister Martin Bangemann (BANGEMANN) Agriculture, Food and Forestry Minister Ignaz Kiechle (KIECHLE) Central Bank (Bundesbank) President Karl Otto Poehl (POEHL) @end[itemize] Yugoslavia @begin[itemize] Prime Minister Branko Mikulic (MIKULIC) Finance Minister Svetozar Rikanovic (RIKANOVIC) Central Bank (National Bank) Governor Dusan Vlatkovic (VLATKOVIC) @end[itemize] European Community Commission @begin[itemize] President Jacques Delors (DELORS) Commissioner for Agriculture and Forestry Frans Andriessen (ANDRIESSEN) Commissioner for Trade Policy Willy de Clercq (DE-CLERCQ) @end[itemize] International Monetary Fund Managing Director Michel Camdessus (CAMDESSUS) World Bank President Barber Conable (CONABLE) International Atomic Energy Agency Director-General Hans Blix (BLIX) International Energy Agency Executive Director Helga Steeg (STEEG) Asian Development Bank President Masao Fujioka (FUJIOKA) United Nations Secretary-General Javier Perez de Cuellar (PEREZ-DE-CUELLAR) UNCTAD (United Nations Conference on Trade and Development) Secretary-General Kenneth Dadzie (DADZIE) Organisation for Economic Cooperation and Development Secretary-General Jean-Claude Paye (PAYE) International Air Transport Association Director General Guenter Eser (ESER) Securities and Exchange Commission Chairman David S. Ruder (RUDER) General Agreement on Tariffs and Trade Director-General Arthur Dunkel (DUNKEL) Milton Friedman, economist (FRIEDMAN) Henry Kaufman, economist with Salomon Bros. (KAUFMAN) Ivan Boesky (BOESKY) Carl Icahn (ICAHN) T. Boone Pickens (PICKENS) Rupert Murdoch, publisher and chairman of News Corp Ltd (MURDOCH) Robert Maxwell, publisher and chairman of Mirror Group of newspapers (MAXWELL) Roland (Tiny) Rowland, chairman of Lonrho Plc (ROWLAND) Asher Edelman (EDELMAN) Marc Rich (RICH) Alan Bond, chairman of Bond Corp Ltd (BOND) Jorio Dauster, President of The Brazilian Coffee Institute (DAUSTER) Beryl Sprinkel, Chairman of Council of Economic Advisers (SPRINKEL) Yasser Arafat, Chairman of Palestine Liberation Organisation (ARAFAT) Paul Volcker, economist (VOLCKER) Preston Martin, member of Federal Reserve Board (MARTIN) @end[itemize] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/feldman-cia-worldfactbook-data.txt�����������������0000664�0000000�0000000�00001026612�11540251763�0027543�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������This is a set of Prolog assertions for facts about countries, kindly made available by Ronen Feldman of Bar-Ilan University. It was extracted by Ronen Feldman and Amir Zilberstein from "The Project Gutenberg Etext of the 1994 CIA World Factbook", available at a variety of locations on the Web. --David D. Lewis, 9-Dec-96 pred_type("LandBounderies","countries","countries"). pred_type("NaturalResources","countries","topics"). pred_type("Population","countries","countries"). pred_type("Capital","countries","countries"). pred_type("MemberOf","countries","countries"). pred_type("ExportCommodities","countries","topics"). pred_type("ExportPartners","countries","countries"). pred_type("ImportCommodities","countries","topics"). pred_type("ImportPartners","countries","countries"). pred_type("Industries","countries","topics"). pred_type("Agriculture","countries","topics"). bgfact("Afghanistan","LandBounderies",["China","Iran","Pakistan","Tajikis= tan","Turkmenistan","Uzbekistan"]). bgfact("Afghanistan","NaturalResources",["natural = gas","petroleum","coal","copper","talc","barites","sulphur","lead","zinc"= ,"iron ore","salt","precious and semiprecious stones"]). bgfact("Afghanistan","Population",["16903400"]). bgfact("Afghanistan","Capital",["Kabul"]). bgfact("Afghanistan","MemberOf",["AsDB","CP","ECO","ESCAP","FAO","G-77","= IAEA","IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","INTELSAT","IOC"= ,"ITU","LORCS","NAM","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU","WFTU","W= HO","WMO","WTO"]). bgfact("Afghanistan","ExportCommodities",["fruits and nuts","handwoven = carpets","wool","cotton","hides and pelts","precious and semi-precious = gems"]). bgfact("Afghanistan","ExportPartners",["FSU = countries","Pakistan","Iran","Germany","India","UK","Belgium","Luxembourg= ","Czechoslovakia"]). bgfact("Afghanistan","ImportCommodities",["most consumer goods"]). bgfact("Afghanistan","ImportPartners",["FSU = countries","Pakistan","Iran","Japan","Singapore","India","South = Korea","Germany"]). bgfact("Afghanistan","Industries",["textiles","soap","furniture","shoes",= "fertilizer","natural gas","oil","coal","copper"]). bgfact("Afghanistan","Agriculture",["wheat","fruits","nuts","karakul = pelts","wool","mutton"]). bgfact("Albania","LandBounderies",["Greece","The Former Yugoslav = Republic of Macedonia","Serbia and Montenegro"]). bgfact("Albania","NaturalResources",["petroleum","natural = gas","coal","chromium","copper","timber","nickel"]). bgfact("Albania","Population",["3374085"]). bgfact("Albania","Capital",["Tirane"]). bgfact("Albania","MemberOf",["BSEC","CCC","CE","ISO","ITU","LORCS","NACC"= ,"OIC","UN","UNCTAD","UNESCO","UNIDO","UPU","WFTU","WHO","WIPO","WMO"]). bgfact("Albania","ExportCommodities",["asphalt","metals and metallic = ores","electricity","crude","vegetables","fruits","tobacco"]). bgfact("Albania","ExportPartners",["Italy","The Former Yugoslav Republic = of = Macedonia","Germany","Greece","Czechoslovakia","Poland","Romania","Bulgar= ia","Hungary"]). bgfact("Albania","ImportCommodities",["machinery","consumer = goods","grains"]). bgfact("Albania","ImportPartners",["Italy","The Former Yugoslav Republic = of = Macedonia","Germany","Czechoslovakia","Romania","Poland","Hungary","Bulga= ria","Greece"]). bgfact("Albania","Industries",["food processing","textiles and = clothing","lumber","oil","cement","chemicals","mining","basic = metals","hydropower"]). bgfact("Albania","Agriculture",["produces wide range of temperate-zone = crops and livestock"]). bgfact("Algeria","LandBounderies",["Libya","Mali","Mauritania","Morocco",= "Niger","Tunisia","Western Sahara"]). bgfact("Algeria","NaturalResources",["petroleum","natural gas","iron = ore","phosphates","uranium","lead","zinc"]). bgfact("Algeria","Population",["27895068"]). bgfact("Algeria","Capital",["Algiers"]). bgfact("Algeria","MemberOf",["ABEDA","AfDB","AFESD","AL","AMF","AMU","CCC= ","ECA","FAO","G-15","G-19","G-24","G-77","IAEA","IBRD","ICAO","IDA","IDB= ","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","= ISO","ITU","LORCS","NAM","OAPEC","OAS","OAU","OIC","OPEC","UN","UNAVEM = II","UNCTAD","UNESCO","UNHCR","UNIDO","UNTAC","UPU","WCL","WHO","WIPO","W= MO","WTO"]). bgfact("Algeria","ExportCommodities",["petroleum and natural gas"]). bgfact("Algeria","ExportPartners",["Italy","France","US","Germany","Spain= "]). bgfact("Algeria","ImportCommodities",["Capital goods","food and = beverages","consumer goods"]). bgfact("Algeria","ImportPartners",["France","Italy","Spain","US","Germany= "]). bgfact("Algeria","Industries",["petroleum","light Industries","natural = gas","mining","electrical","petrochemical","food processing"]). bgfact("Algeria","Agriculture",["wheat","barley","oats","grapes","olives"= ,"citrus","fruits","sheep","net importer of food - grain","vegetable = oil","sugar"]). bgfact("American Samoa","LandBounderies",[]). bgfact("American Samoa","NaturalResources",["pumice","pumicite"]). bgfact("American Samoa","Population",["55223"]). bgfact("American Samoa","Capital",["Pago Pago"]). bgfact("American Samoa","MemberOf",["ESCAP","IOC","SPC"]). bgfact("American Samoa","ExportCommodities",["canned tuna"]). bgfact("American Samoa","ExportPartners",["US"]). bgfact("American Samoa","ImportCommodities",["materials for = canneries","food","petroleum products","machinery and parts"]). bgfact("American = Samoa","ImportPartners",["US","Japan","NZ","Australia","Fiji"]). bgfact("American Samoa","Industries",["tuna canneries","meat = canning","handicrafts"]). bgfact("American = Samoa","Agriculture",["bananas","coconuts","vegetables","taro","breadfrui= t","yams","copra","pineapples","papayas","dairy farming"]). bgfact("Andorra","LandBounderies",["France","Spain"]). bgfact("Andorra","NaturalResources",["hydropower","mineral = water","timber","iron ore","lead"]). bgfact("Andorra","Population",["63930"]). bgfact("Andorra","Capital",["Andorra la Vella"]). bgfact("Andorra","MemberOf",["ECE","INTERPOL","IOC","UN"]). bgfact("Andorra","ExportCommodities",["electricity","tobacco = products","furniture"]). bgfact("Andorra","ExportPartners",["France","Spain"]). bgfact("Andorra","ImportCommodities",["consumer goods","food"]). bgfact("Andorra","ImportPartners",["France","Spain"]). bgfact("Andorra","Industries",["tourism","sheep","timber","tobacco","bank= ing"]). bgfact("Andorra","Agriculture",["small quantities of = tobacco","rye","wheat","barley","oats"]). bgfact("Angola","LandBounderies",["Congo","Namibia","Zaire","Zambia"]). bgfact("Angola","NaturalResources",["petroleum","diamonds","iron = ore","phosphates","copper","feldspar","gold","bauxite","uranium"]). bgfact("Angola","Population",["9803576"]). bgfact("Angola","Capital",["Luanda"]). bgfact("Angola","MemberOf",["ACP","AfDB","CCC","CEEAC","OAU","SADC","UN",= "UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Angola","ExportCommodities",["oil","diamonds","refined petroleum = products","gas","coffee","sisal","fish and fish = products","timber","cotton"]). bgfact("Angola","ExportPartners",["US","France","Germany","Netherlands","= Brazil"]). bgfact("Angola","ImportCommodities",["Capital = equipment","food","vehicles and spare parts","textiles and = clothing","substantial military deliveries"]). bgfact("Angola","ImportPartners",["Portugal","Brazil","US","France","Spai= n"]). bgfact("Angola","Industries",["mining - diamonds","iron = ore","phosphates","feldspar","bauxite","uranium","basic metal = products"]). bgfact("Angola","Agriculture",["bananas","sugar = cane","coffee","sisal","corn","cotton","cane","manioc","food = cassava","corn","vegetables","livestock production accounts = for","fishing","disruptions caused by civil war"]). bgfact("Anguilla","LandBounderies",[]). bgfact("Anguilla","NaturalResources",["salt","fish","lobster"]). bgfact("Anguilla","Population",["7052"]). bgfact("Anguilla","Capital",["The Valley"]). bgfact("Anguilla","MemberOf",["CARICOM"]). bgfact("Anguilla","ExportCommodities",["lobster and salt"]). bgfact("Anguilla","ExportPartners",["NA"]). bgfact("Anguilla","ImportCommodities",["NA"]). bgfact("Anguilla","ImportPartners",["NA"]). bgfact("Anguilla","Industries",["tourism","boat building","salt"]). bgfact("Anguilla","Agriculture",["pigeon peas","corn","sweet = potatoes","sheep","goats","pigs","cattle","poultry","fishing"]). bgfact("Antarctica","LandBounderies",["none","but see entry on = International disputes"]). bgfact("Antarctica","NaturalResources",["iron = ore","chromium","copper","gold","nickel","uncommercial quantities"]). bgfact("Antigua and Barbuda","LandBounderies",[]). bgfact("Antigua and Barbuda","NaturalResources",["pleasant climate = fosters tourism"]). bgfact("Antigua and Barbuda","Population",["64762"]). bgfact("Antigua and Barbuda","Capital",["Saint John's"]). bgfact("Antigua and = Barbuda","MemberOf",["ACP","C","CARICOM","CDB","ECLAC","FAO","G-77","GATT= ","IBRD","ICAO","ICFTU","IFAD","IFC","ILO","IMF","IMO","INTELSAT","OAS","= OECS","OPANAL","UN","UNCTAD","UNESCO","WCL","WHO","WMO"]). bgfact("Antigua and Barbuda","ExportCommodities",["petroleum = products","manubgfactures","food and live animals","machinery and = transport equipment"]). bgfact("Antigua and = Barbuda","ExportPartners",["OECS","Barbados","Guyana","Trinidad and = Tobago","US"]). bgfact("Antigua and Barbuda","ImportCommodities",["food and live = animals","machinery and transport = equipment","manubgfactures","chemicals","oil"]). bgfact("Antigua and = Barbuda","ImportPartners",["US","UK","Canada","OECS"]). bgfact("Antigua and = Barbuda","Industries",["tourism","construction","light = manubgfacturing"]). bgfact("Antigua and Barbuda","Agriculture",["expanding output of = cotton","fruits","vegetables","coconuts","cucumbers","mangoes","not = self-sufficient in food"]). bgfact("Arctic Ocean","NaturalResources",["sand and gravel = aggregates","placer deposits","polymetallic nodules","oil and gas = fields","fish","marine mammals"]). bgfact("Argentina","LandBounderies",["Bolivia","Brazil","Chile","Paraguay= ","Uruguay"]). bgfact("Argentina","NaturalResources",["fertile plains of the = pampas","lead","zinc","tin","copper","iron = ore","manganese","petroleum","uranium"]). bgfact("Argentina","Population",["33912994"]). bgfact("Argentina","Capital",["Buenos Aires"]). bgfact("Argentina","MemberOf",["AG","Australia = Group","BCIE","CCC","ECLAC","FAO","G-6","G-11","G-15","G-19","G-24","AfDB= ","G-77","GATT","IADB","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IFAD","I= FC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM","ISO",= "ITU","LAES","LAIA","LORCS","MERCOSUR","MINURSO","MTCR","OAS","PCA","RG",= "UN","UNAVEM = II","UNCTAD","UNESCO","UNHCR","UNIDO","UNIKOM","UNOMOZ","UNOSOM","UNPROFO= R","UNTAC","UNTSO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Argentina","ExportCommodities",["meat","wheat","corn","oilseed","= hides","wool"]). bgfact("Argentina","ExportPartners",["US","Brazil","Italy","Japan","Nethe= rlands"]). bgfact("Argentina","ImportCommodities",["machinery and = equipment","chemicals","metals","fuels and lubricants","agricultural = products"]). bgfact("Argentina","ImportPartners",["US","Brazil","Germany","Bolivia","J= apan","Italy","Netherlands"]). bgfact("Argentina","Industries",["food processing","motor = vehicles","consumer durables","textiles","chemicals and = petrochemicals","printing","metallurgy","steel"]). bgfact("Argentina","Agriculture",["principal = wheat","corn","sorghum","soybeans","sugar beets"]). bgfact("Armenia","LandBounderies",["Azerbaijan","Georgia","Iran","Turkey"= ]). bgfact("Armenia","NaturalResources",["small deposits of = gold","copper","molybdenum","zinc","alumina"]). bgfact("Armenia","Population",["3521517"]). bgfact("Armenia","Capital",["Yerevan"]). bgfact("Armenia","MemberOf",["BSEC","CCC","CIS","CSCE","EBRD","ECE","IAEA= ","IBRD","ICAO","IDA","IFAD","ILO","IMF","INTELSAT","INTERPOL","IOC","ITU= ","NACC","NAM","UN","UNCTAD","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]).= bgfact("Armenia","ExportCommodities",["machinery and transport = equipment","light industrial products","processed food items","alcoholic = products"]). bgfact("Armenia","ExportPartners",["NA"]). bgfact("Armenia","ImportCommodities",["grain","fuel"]). bgfact("Armenia","ImportPartners",["Russia","US","EC"]). bgfact("Armenia","Industries",["traditionally diverse","currently","much = of industry is shut down"]). bgfact("Armenia","Agriculture",["fruits and vegetable farming"]). bgfact("Aruba","LandBounderies",[]). bgfact("Aruba","NaturalResources",["white sandy beaches"]). bgfact("Aruba","Population",["65545"]). bgfact("Aruba","Capital",["Oranjestad"]). bgfact("Aruba","ExportCommodities",["mostly petroleum products"]). bgfact("Aruba","ExportPartners",["US","EC"]). bgfact("Aruba","ImportCommodities",["food","consumer = goods","manubgfactures","petroleum products"]). bgfact("Aruba","ImportPartners",["US","EC"]). bgfact("Aruba","Industries",["tourism","transshipment facilities","oil = refining"]). bgfact("Aruba","Agriculture",["poor quality soils and low rainfall limit = agricultural activity to the cultivation of aloes","some livestock"]). bgfact("Ashmore and Cartier Islands","LandBounderies",[]). bgfact("Ashmore and Cartier Islands","NaturalResources",["fish"]). bgfact("Ashmore and Cartier Islands","Capital",["none; administered from = Canberra, Australia"]). bgfact("Atlantic Ocean","NaturalResources",["oil and gas = fields","fish","marine mammals","sand and gravel aggregates","placer = deposits","polymetallic nodules","precious stones"]). bgfact("Australia","LandBounderies",[]). bgfact("Australia","NaturalResources",["bauxite","coal","iron = ore","copper","tin","silver","uranium","nickel","tungsten","mineral = sands","lead","zinc","diamonds","natural gas","petroleum"]). bgfact("Australia","Population",["18077419"]). bgfact("Australia","Capital",["Canberra"]). bgfact("Australia","MemberOf",["AfDB","AG","NEA","NSG","OECD","PCA","SPAR= TECA","SPC","SPF","UN","UNCTAD","UNESCO","UNFICYP","UNHCR","UNIDO","UNOSO= M","UNPROFOR","UNTAC","UNTSO","UPU","WFTU","WHO","WIPO","WMO","ZC"]). bgfact("Australia","ExportCommodities",["coal","gold","meat","wool","alum= ina","wheat","machinery and transport equipment"]). bgfact("Australia","ExportPartners",["Japan","US","South = Korea","NZ","UK","Taiwan","Singapore","Hong Kong"]). bgfact("Australia","ImportCommodities",["machinery and transport = equipment","computers and office machines","crude and petroleum = products"]). bgfact("Australia","ImportPartners",["US","Japan","UK","Germany","NZ"]). bgfact("Australia","Industries",["mining","industrial and transportation = equipment","food processing","chemicals","steel"]). bgfact("Australia","Agriculture",["world's largest exporter of beef and = wool","second-largest for mutton","major = wheat","barley","sugarcane","livestock - cattle","sheep","poultry"]). bgfact("Austria","LandBounderies",["Czech = Republic","Germany","Hungary","Italy","Liechtenstein","Slovakia","Sloveni= a","Switzerland"]). bgfact("Austria","NaturalResources",["iron = ore","petroleum","timber","magnesite","aluminum","lead","coal","lignite",= "copper","hydropower"]). bgfact("Austria","Population",["7954974"]). bgfact("Austria","Capital",["Vienna"]). bgfact("Austria","MemberOf",["AfDB","AG","OECD","ONUSAL","PCA","UN","UNCT= AD","UNESCO","UNDOF","UNFICYP","UNHCR","UNIDO","UNIKOM","UNOMIG","UNTAC",= "UNTSO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Austria","ExportCommodities",["machinery and equipment","iron = and steel","lumber","textiles","paper products","chemicals"]). bgfact("Austria","ExportPartners",["EC"]). bgfact("Austria","ImportCommodities",["petroleum","foodstuffs","machinery= and equipment","vehicles","chemicals","textiles and = clothing","pharmaceuticals"]). bgfact("Austria","ImportPartners",["EC"]). bgfact("Austria","Industries",["foods","iron","steel","machines","textile= s","chemicals","electrical","paper and pulp","tourism","mining","motor = vehicles"]). bgfact("Austria","Agriculture",["grains","fruit","potatoes","sugar = beets","sawn wood","cattle","pigs","-90% self-sufficient in food"]). bgfact("Azerbaijan","LandBounderies",["Armenia","Russia","Turkey"]). bgfact("Azerbaijan","NaturalResources",["petroleum","natural gas","iron = ore","nonferrous metals","alumina"]). bgfact("Azerbaijan","Population",["7684456"]). bgfact("Azerbaijan","Capital",["Baku"]). bgfact("Azerbaijan","MemberOf",["BSEC","CCC","CIS","CSCE","EBRD","ECE","E= CO","ESCAP","IBRD","ICAO","IDB","ILO","IMF","INTELSAT","INTERPOL","IOC","= ITU","NACC","OIC","UN","UNCTAD","UNESCO","UPU","WHO"]). bgfact("Azerbaijan","ExportCommodities",["oil","gas","chemicals","oilfiel= d equipment","textiles","cotton"]). bgfact("Azerbaijan","ExportPartners",["mostly CIS and European = countries"]). bgfact("Azerbaijan","ImportCommodities",["machinery and parts","consumer = durables","foodstuffs","textiles"]). bgfact("Azerbaijan","ImportPartners",["European countries"]). bgfact("Azerbaijan","Industries",["petroleum","natural gas","petroleum = products","steel","iron ore","textiles"]). bgfact("The Bahamas","LandBounderies",[]). bgfact("The Bahamas","NaturalResources",["salt","aragonite","timber"]). bgfact("The Bahamas","Population",["273055"]). bgfact("The Bahamas","Capital",["Nassau"]). bgfact("The = Bahamas","MemberOf",["ACP","C","CCC","CARICOM","CDB","ECLAC","FAO","G-77"= ,"IADB","IBRD","ICAO","ICFTU","IFC","ILO","IMF","IMO","INTELSAT","INTERPO= L","IOC","ITU","LORCS","NAM","OAS","OPANAL","UN","UNCTAD","UNESCO","UNIDO= ","UPU","WHO","WIPO","WMO"]). bgfact("The = Bahamas","ExportCommodities",["pharmaceuticals","cement","rum","crawfish"= ]). bgfact("The = Bahamas","ExportPartners",["US","UK","Norway","France","Italy"]). bgfact("The Bahamas","ImportCommodities",["foodstuffs","manubgfactured = goods","mineral fuels","crude"]). bgfact("The = Bahamas","ImportPartners",["US","Japan","Nigeria","Denmark","Norway"]). bgfact("The Bahamas","Industries",["tourism","banking","cement","oil = refining and transshipment","salt = production","rum","aragonite","pharmaceuticals","spiral welded steel = pipe"]). bgfact("The Bahamas","Agriculture",["citrus","vegetables","large net = importer of food"]). bgfact("Bahrain","LandBounderies",[]). bgfact("Bahrain","NaturalResources",["oil","associated and nonassociated = natural gas","fish"]). bgfact("Bahrain","Population",["585683"]). bgfact("Bahrain","Capital",["Manama"]). bgfact("Bahrain","MemberOf",["ABEDA","AFESD","AL","AMF","ESCWA","FAO","G-= 77","GATT","GCC","IBRD","ICAO","IDB","ILO","IMF","IMO","INMARSAT","INTELS= AT","ITU","LORCS","NAM","OAPEC","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU= ","WFTU","WHO","WMO"]). bgfact("Bahrain","ExportCommodities",["petroleum and petroleum = products","aluminum"]). bgfact("Bahrain","ExportPartners",["Japan","UAE","India","Pakistan","Sing= apore"]). bgfact("Bahrain","ImportCommodities",["nonoil","crude"]). bgfact("Bahrain","ImportPartners",["Saudi = Arabia","US","UK","Japan","Germany"]). bgfact("Bahrain","Industries",["petroleum processing and = refining","aluminum smelting","offshore banking","ship repairing"]). bgfact("Bahrain","Agriculture",["including fishing","heavily subsidized = sector produces fruit","vegetables","poultry","dairy = products","shrimp","fish"]). bgfact("Baker Island","LandBounderies",[]). bgfact("Baker Island","Population",["1942"]). bgfact("Baker Island","Capital",["none; administered from Washington, = DC"]). bgfact("Bangladesh","LandBounderies",["Burma","India"]). bgfact("Bangladesh","NaturalResources",["natural gas","arable = land","timber"]). bgfact("Bangladesh","Population",["125149469"]). bgfact("Bangladesh","Capital",["Dhaka"]). bgfact("Bangladesh","MemberOf",["AsDB","C","CCC","CP","ESCAP","FAO","G-77= ","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IDB","IFAD","IFC","ILO","IMF= ","IMO","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","MINURSO","= NAM","OIC","SAARC","UN","UNCTAD","UNESCO","UNIDO","UNIKOM","UNOMIG","UNOM= OZ","UNOMUR","UNOSOM","UNPROFOR","UNTAC","UPU","WCL","WHO","WFTU","WIPO",= "WMO","WTO"]). bgfact("Bangladesh","ExportCommodities",["garments","jute and jute = goods","leather","shrimp"]). bgfact("Bangladesh","ExportPartners",["US","Western Europe"]). bgfact("Bangladesh","ImportCommodities",["Capital = goods","petroleum","food","textiles"]). bgfact("Bangladesh","ImportPartners",["Hong = Kong","Singapore","China","Japan"]). bgfact("Bangladesh","Industries",["jute manubgfacturing","cotton = textiles","food processing","steel","fertilizer"]). bgfact("Bangladesh","Agriculture",["accounts for of GDP","of = employment","commercial = jute","rice","wheat","tea","sugarcane","potatoes","beef","milk","shortage= s include wheat","vegetable oils","cotton"]). bgfact("Barbados","LandBounderies",[]). bgfact("Barbados","NaturalResources",["petroleum","fishing","natural = gas"]). bgfact("Barbados","Population",["255827"]). bgfact("Barbados","Capital",["Bridgetown"]). bgfact("Barbados","MemberOf",["ACP","C","CARICOM","CDB","ECLAC","FAO","G-= 77","GATT","IADB","IBRD","ICAO","ICFTU","IFAD","IFC","ILO","IMF","IMO","I= NTELSAT","INTERPOL","IOC","ISO","ITU","LAES","LORCS","NAM","OAS","OPANAL"= ,"UN","UNCTAD","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Barbados","ExportCommodities",["sugar and = molasses","rum","chemicals","electrical components","clothing"]). bgfact("Barbados","ExportPartners",["US","UK","Trinidad and = Tobago","Windward Islands"]). bgfact("Barbados","ImportCommodities",["machinery","foodstuffs","construc= tion materials","chemicals","fuel","electrical components"]). bgfact("Barbados","ImportPartners",["US","UK","Trinidad and = Tobago","Japan"]). bgfact("Barbados","Industries",["tourism","sugar","light = manubgfacturing","component assembly for export","petroleum"]). bgfact("Barbados","Agriculture",["not self-sufficient in food"]). bgfact("Bassas da India","LandBounderies",[]). bgfact("Bassas da India","NaturalResources",["none"]). bgfact("Bassas da India","Capital",["none; administered by France from = Reunion"]). bgfact("Belarus","LandBounderies",["Latvia","Lithuania","Poland","Russia"= ,"Ukraine"]). bgfact("Belarus","NaturalResources",["forest land","peat deposits"]). bgfact("Belarus","Population",["10404862"]). bgfact("Belarus","Capital",["Minsk"]). bgfact("Belarus","MemberOf",["CBSS","IOC","ITU","NACC","PCA","UN","UNCTAD= ","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Belarus","ExportCommodities",["machinery and transport = equipment","chemicals","foodstuffs"]). bgfact("Belarus","ExportPartners",["Russia","Ukraine","Poland","Bulgaria"= ]). bgfact("Belarus","ImportCommodities",["fuel","industrial raw = materials","textiles","sugar"]). bgfact("Belarus","ImportPartners",["Russia","Ukraine","Poland"]). bgfact("Belarus","Industries",[]). bgfact("Belarus","Agriculture",["net exporter of = meat","milk","eggs","flour","potatoes"]). bgfact("Belgium","LandBounderies",["France","Germany","Luxembourg","Nethe= rlands"]). bgfact("Belgium","NaturalResources",["coal","natural gas"]). bgfact("Belgium","Population",["10062836"]). bgfact("Belgium","Capital",["Brussels"]). bgfact("Belgium","MemberOf",["AG","OECD","PCA","UN","UNCTAD","UNESCO","UN= HCR","UNIDO","UNMOGIP","UNOSOM","UNPROFOR","UNRWA","UNTAC","UNTSO","UPU",= "WCL","WEU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Belgium","ExportCommodities",["iron and steel","transportation = equipment","tractors","diamonds","petroleum products"]). bgfact("Belgium","ExportPartners",["EC","US","former Communist = countries"]). bgfact("Belgium","ImportCommodities",["fuels","grains","chemicals","foods= tuffs"]). bgfact("Belgium","ImportPartners",["EC","US","oil-exporting less = developed countries","former Communist countries"]). bgfact("Belgium","Industries",["engineering and metal products","motor = vehicle assembly","processed food and beverages","chemicals","basic = metals","textiles","glass","petroleum","coal"]). bgfact("Belgium","Agriculture",["emphasis on livestock production - = beef","veal","pork","major crops are sugar beets","fresh = vegetables","fruits","grain","net importer of farm products"]). bgfact("Belize","LandBounderies",["Guatemala","Mexico"]). bgfact("Belize","NaturalResources",["arable land = potential","timber","fish"]). bgfact("Belize","Population",["208949"]). bgfact("Belize","Capital",["Belmopan"]). bgfact("Belize","MemberOf",["ACP","C","CARICOM","CDB","ECLAC","FAO","G-77= ","GATT","IADB","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO= ","INTELSAT","ITU","LAES","LORCS","NAM","OAS","UN","UNCTAD","UNESCO","UNI= DO","UPU","WCL","WHO","WMO"]). bgfact("Belize","ExportCommodities",["sugar","citrus","clothing","fish = products","bananas","molasses","wood"]). bgfact("Belize","ExportPartners",["US","UK"]). bgfact("Belize","ImportCommodities",["machinery and transportation = equipment","food","manubgfactured = goods","fuels","chemicals","pharmaceuticals"]). bgfact("Belize","ImportPartners",["US","UK","Mexico"]). bgfact("Belize","Industries",["garment production","citrus = concentrates","sugar refining","rum","beverages","tourism"]). bgfact("Belize","Agriculture",["commercial crops include sugar = cane","bananas","coca","net importer of basic foods"]). bgfact("Benin","LandBounderies",["Burkina","Niger","Nigeria","Togo"]). bgfact("Benin","NaturalResources",["small offshore oil = deposits","limestone","marble","timber"]). bgfact("Benin","Population",["5341710"]). bgfact("Benin","Capital",["Porto-Novo"]). bgfact("Benin","MemberOf",["ACCT","ACP","AfDB","CEAO","ECA","ECOWAS","Ent= ente","FAO","FZ","G-77","GATT","IBRD","ICAO","ICFTU","IDA","IDB","IFAD","= IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","O= AU","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU","WADB","WCL","WFTU","WHO",= "WIPO","WMO","WTO"]). bgfact("Benin","ExportCommodities",["crude","cotton","palm = products","cocoa"]). bgfact("Benin","ExportPartners",["FRG","France","Spain","Italy","UK"]). bgfact("Benin","ImportCommodities",["foodstuffs","beverages","tobacco","p= etroleum products","intermediate goods","Capital goods","light = consumer goods"]). bgfact("Benin","ImportPartners",["France","Thailand","Netherlands","US"])= . bgfact("Benin","Industries",["textiles","cigarettes","construction = materials","beverages","food production","petroleum"]). bgfact("Benin","Agriculture",["production is dominated by food = corn","sorghum","cassava","beans","crops include cotton","palm = oil","poultry and livestock output has not kept up with consumption"]). bgfact("Bermuda","LandBounderies",[]). bgfact("Bermuda","NaturalResources",["limestone","pleasant climate = fostering tourism"]). bgfact("Bermuda","Population",["61158"]). bgfact("Bermuda","Capital",["Hamilton"]). bgfact("Bermuda","MemberOf",["CARICOM","IOC"]). bgfact("Bermuda","ExportCommodities",["semitropical produce","light = manubgfactures","re-exports of pharmaceuticals"]). bgfact("Bermuda","ExportPartners",["US","UK","Canada"]). bgfact("Bermuda","ImportCommodities",["fuel","foodstuffs","machinery"]). bgfact("Bermuda","ImportPartners",["US","UK","Venezuela","Canada","Japan"= ]). bgfact("Bermuda","Industries",["tourism","finance","structural concrete = products","paints","pharmaceuticals","ship repairing"]). bgfact("Bermuda","Agriculture",["produces bananas","vegetables","citrus = fruits","flowers","dairy products"]). bgfact("Bhutan","LandBounderies",["China","India"]). bgfact("Bhutan","NaturalResources",["timber","hydropower","gypsum","calci= um carbide"]). bgfact("Bhutan","Population",["716380"]). bgfact("Bhutan","Capital",["Thimphu"]). bgfact("Bhutan","MemberOf",["AsDB","CP","ESCAP","FAO","G-77","IBRD","ICAO= ","IDA","IFAD","IMF","INTELSAT","IOC","ITU","NAM","SAARC","UN","UNCTAD","= UNESCO","UNIDO","UPU","WHO"]). bgfact("Bhutan","ExportCommodities",["cardamon","gypsum","timber","handic= rafts","cement","fruit","electricity","precious stones","spices"]). bgfact("Bhutan","ExportPartners",["India","Bangladesh","Singapore"]). bgfact("Bhutan","ImportCommodities",["fuel and = lubricants","grain","machinery and parts","vehicles","fabrics"]). bgfact("Bhutan","ImportPartners",["India","Japan","Germany","US","UK"]). bgfact("Bhutan","Industries",["cement","wood products","processed = fruits","alcoholic beverages","calcium carbide"]). bgfact("Bhutan","Agriculture",["corn","root crops","citrus fruit","dairy = products","eggs"]). bgfact("Bolivia","LandBounderies",["Argentina","Brazil","Chile","Paraguay= ","Peru"]). bgfact("Bolivia","NaturalResources",["tin","natural = gas","petroleum","zinc","tungsten","antimony","silver","iron = ore","lead","gold","timber"]). bgfact("Bolivia","Population",["7719445"]). bgfact("Bolivia","Capital",["La Paz"]). bgfact("Bolivia","MemberOf",["AG","ECLAC","FAO","GATT","G-11","G-77","IAD= B","IAEA","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","= INTERPOL","IOC","IOM","ITU","LAES","LAIA","LORCS","NAM","OAS","OPANAL","P= CA","RG","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","= WMO","WTO"]). bgfact("Bolivia","ExportCommodities",["metals","natural gas"]). bgfact("Bolivia","ExportPartners",["US","Argentina"]). bgfact("Bolivia","ImportCommodities",["food","petroleum","consumer = goods","Capital goods"]). bgfact("Bolivia","ImportPartners",["US"]). bgfact("Bolivia","Industries",["mining","smelting","petroleum","food and = beverage","tobacco","handicrafts","illicit drug industry reportedly = produces of its revenues"]). bgfact("Bolivia","Agriculture",["principal commodities - = coffee","coca","cotton","corn","sugarcane","rice","potatoes","self-suffic= ient in food"]). bgfact("Bosnia and Herzegovina","LandBounderies",["Croatia","Serbia and = Montenegro"]). bgfact("Bosnia and = Herzegovina","NaturalResources",["coal","iron","bauxite","manganese","tim= ber","wood products","copper","chromium","lead","zinc"]). bgfact("Bosnia and Herzegovina","Population",["4651485"]). bgfact("Bosnia and Herzegovina","Capital",["Sarajevo"]). bgfact("Bosnia and = Herzegovina","MemberOf",["CEI","CSCE","ECE","ICAO","ILO","IMO","INTELSAT"= ,"UN","UNCTAD","UNESCO","UNIDO","UPU","WHO"]). bgfact("Bosnia and Herzegovina","ExportCommodities",["NA"]). bgfact("Bosnia and Herzegovina","ExportPartners",["NA"]). bgfact("Bosnia and Herzegovina","ImportCommodities",["NA"]). bgfact("Bosnia and Herzegovina","ImportPartners",["NA"]). bgfact("Bosnia and Herzegovina","Industries",["steel = production","mining"]). bgfact("Bosnia and Herzegovina","Agriculture",["the foothills of = northern Bosnia support orchards","vineyards","livestock","farms are = mostly privately held","small"]). bgfact("Botswana","LandBounderies",["Namibia","South = Africa","Zimbabwe"]). bgfact("Botswana","NaturalResources",["diamonds","copper","nickel","salt"= ,"soda ash","potash","coal","iron ore","silver"]). bgfact("Botswana","Population",["1359352"]). bgfact("Botswana","Capital",["Gaborone"]). bgfact("Botswana","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","FLS","G= -77","GATT","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","INTELSA= T","INTERPOL","IOC","ITU","LORCS","NAM","OAU","SACU","SADC","UN","UNCTAD"= ,"UNESCO","UNIDO","UNOMOZ","UNOMUR","UNOSOM","UPU","WCL","WHO","WMO"]). bgfact("Botswana","ExportCommodities",["diamonds","copper and = nickel","meat"]). bgfact("Botswana","ExportPartners",["Switzerland","UK","SACU"]). bgfact("Botswana","ImportCommodities",["foodstuffs","vehicles and = transport equipment","textiles","petroleum products"]). bgfact("Botswana","ImportPartners",["Switzerland","SACU","UK","US"]). bgfact("Botswana","Industries",["mining of = diamonds","copper","nickel","coal","salt","soda ash","livestock = processing"]). bgfact("Botswana","Agriculture",["must import up to of of food = needs"]). bgfact("Bouvet Island","LandBounderies",[]). bgfact("Bouvet Island","NaturalResources",["none"]). bgfact("Bouvet Island","Capital",["none; administered from Oslo, = Norway"]). bgfact("Brazil","LandBounderies",["Argentina","Bolivia","Colombia","Frenc= h Guiana","Guyana","Paraguay","Peru","Suriname","Uruguay","Venezuela"]). bgfact("Brazil","NaturalResources",["iron = ore","manganese","bauxite","nickel","uranium","phosphates","tin","hydropo= wer","gold","platinum","petroleum","timber"]). bgfact("Brazil","Population",["158739257"]). bgfact("Brazil","Capital",["Brasilia"]). bgfact("Brazil","MemberOf",["AfDB","AG","OAS","ONUSAL","OPANAL","PCA","RG= ","UN","UNAVEM = II","UNCTAD","UNESCO","UNHCR","UNIDO","UNOMOZ","UNOMUR","UNPROFOR","UPU",= "WCL","WHO","WFTU","WIPO","WMO","WTO"]). bgfact("Brazil","ExportCommodities",["iron ore","soybean bran","orange = juice","footwear","coffee","motor vehicle parts"]). bgfact("Brazil","ExportPartners",["EC","Latin America","US","Japan"]). bgfact("Brazil","ImportCommodities",["crude","Capital goods","chemical = products","foodstuffs","coal"]). bgfact("Brazil","ImportPartners",["US","EC","Middle East","Latin = America","Japan"]). bgfact("Brazil","Industries",["shoes","chemicals","cement","lumber","iron= ore","steel","motor vehicles and auto parts","metalworking","Capital = goods","tin"]). bgfact("Brazil","Agriculture",["corn","sugarcane","cocoa","self-sufficien= t in food","except for wheat"]). bgfact("British Indian Ocean Territory","LandBounderies",[]). bgfact("British Indian Ocean = Territory","NaturalResources",["coconuts","fish"]). bgfact("British Indian Ocean Territory","Capital",["none"]). bgfact("British Virgin Islands","LandBounderies",[]). bgfact("British Virgin Islands","NaturalResources",["negligible"]). bgfact("British Virgin Islands","Population",["12864"]). bgfact("British Virgin Islands","Capital",["Road Town"]). bgfact("British Virgin Islands","MemberOf",["CARICOM"]). bgfact("British Virgin Islands","ExportCommodities",["rum","fresh = fish","gravel","sand","fruits","animals"]). bgfact("British Virgin Islands","ExportPartners",["Virgin = Islands","Puerto Rico","US"]). bgfact("British Virgin Islands","ImportCommodities",["building = materials","automobiles","foodstuffs","machinery"]). bgfact("British Virgin Islands","ImportPartners",["Virgin = Islands","Puerto Rico","US"]). bgfact("British Virgin Islands","Industries",["tourism","light = industry","construction","rum","concrete block","offshore financial = center"]). bgfact("British Virgin = Islands","Agriculture",["livestock","fish","fruit","vegetables"]). bgfact("Brunei","LandBounderies",["Malysia"]). bgfact("Brunei","NaturalResources",["petroleum","natural = gas","timber"]). bgfact("Brunei","Population",["284653"]). bgfact("Brunei","Capital",["Bandar Seri Begawan"]). bgfact("Brunei","MemberOf",["APEC","ASEAN","C","ESCAP","FAO","G-77","GATT= ","ICAO","IDB","IMO","INTELSAT","ITU","NAM","OIC","UN","UNCTAD","UPU","UN= TAC","WHO","WMO"]). bgfact("Brunei","ExportCommodities",["crude","liquefied natural = gas","petroleum products"]). bgfact("Brunei","ExportPartners",["Japan","UK","South = Korea","Thailand","Singapore"]). bgfact("Brunei","ImportCommodities",["machinery and transport = equipment","manubgfactured goods","food","chemicals"]). bgfact("Brunei","ImportPartners",["Singapore","UK","Switzerland","US","Ja= pan"]). bgfact("Brunei","Industries",["petroleum","petroleum = refining","liquefied natural gas","construction"]). bgfact("Brunei","Agriculture",["principal crops and livestock include = rice","cassava","bananas","buffaloes"]). bgfact("Bulgaria","LandBounderies",["Greece","The Former Yugoslav = Republic of Macedonia","Romania","Serbia and Montenegro","Turkey"]). bgfact("Bulgaria","NaturalResources",["bauxite","copper","lead","zinc","c= oal","timber","arable land"]). bgfact("Bulgaria","Population",["8799986"]). bgfact("Bulgaria","Capital",["Sofia"]). bgfact("Bulgaria","MemberOf",["ACCT","NSG","PCA","UN","UNCTAD","UNESCO","= UNIDO","UNTAC","UPU","WFTU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Bulgaria","ExportCommodities",["fuels","minerals","raw = materials"]). bgfact("Bulgaria","ExportPartners",["former CEMA countries"]). bgfact("Bulgaria","ImportCommodities",["fuels","minerals"]). bgfact("Bulgaria","ImportPartners",["former CEMA countries"]). bgfact("Bulgaria","Industries",["machine building and metal = working","food processing","chemicals","textiles","building = materials","ferrous and nonferrous metals"]). bgfact("Bulgaria","Agriculture",["climate and soil conditions support = livestock raising and the growing of various grain = crops","oilseeds","vegetables","fruits","surplus food producer"]). bgfact("Burkina","LandBounderies",["Benin","Ghana","Cote = d'Ivoire","Mali","Niger","Togo"]). bgfact("Burkina","NaturalResources",["manganese","limestone","small = deposits of = gold","antimony","copper","nickel","bauxite","lead","phosphates","zinc","= silver"]). bgfact("Burkina","Population",["10134661"]). bgfact("Burkina","Capital",["Ouagadougou"]). bgfact("Burkina","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOW= AS","Entente","FAO","FZ","G-77","GATT","IBRD","ICAO","ICC","ICFTU","IDA",= "IDB","IFAD","IFC","ILO","IMF","INTELSAT","INTERPOL","IOC","ITU","LORCS",= "NAM","OAU","OIC","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU","WADB","WCL"= ,"WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Burkina","ExportCommodities",["cotton","gold","animal = products"]). bgfact("Burkina","ExportPartners",["EC","Cote d'Ivoire","Taiwan"]). bgfact("Burkina","ImportCommodities",["machinery","food = products","petroleum"]). bgfact("Burkina","ImportPartners",["EC","Africa","Japan"]). bgfact("Burkina","Industries",["cotton lint","beverages","agricultural = processing","soap","cigarettes","textiles","gold mining and = extraction"]). bgfact("Burkina","Agriculture",["peanuts","shea nuts","sesame","food = sorghum","millet","corn","not self-sufficient in food grains"]). bgfact("Burma","LandBounderies",["Bangladesh","China","India","Laos","Tha= iland"]). bgfact("Burma","NaturalResources",["petroleum","timber","tin","antimony",= "zinc","copper","tungsten","lead","coal","some = marble","limestone","precious stones","natural gas"]). bgfact("Burma","Population",["44277014"]). bgfact("Burma","Capital",["Rangoon"]). bgfact("Burma","MemberOf",["AsDB","CCC","CP","ESCAP","FAO","G-77","GATT",= "IAEA","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INT= ERPOL","IOC","ITU","LORCS","NAM","UN","UNCTAD","UNESCO","UNIDO","UPU","WH= O","WMO"]). bgfact("Burma","ExportCommodities",["pulses and = beans","teak","rice","hardwood"]). bgfact("Burma","ExportPartners",["Singapore","China","Thailand","India","= Hong Kong"]). bgfact("Burma","ImportCommodities",["machinery","transport = equipment","chemicals","food products"]). bgfact("Burma","ImportPartners",["Japan","China","Thailand","Singapore","= Malaysia"]). bgfact("Burma","Industries",["mining of = copper","tin","tungsten","fertilizer"]). bgfact("Burma","Agriculture",["principal paddy = rice","corn","oilseed","sugarcane","rice and timber account for of = export revenues"]). bgfact("Burundi","LandBounderies",["Rwanda","Tanzania","Zaire"]). bgfact("Burundi","NaturalResources",["nickel","uranium","rare earth = oxide","peat","cobalt","copper","platinum","vanadium"]). bgfact("Burundi","Population",["6124747"]). bgfact("Burundi","Capital",["Bujumbura"]). bgfact("Burundi","MemberOf",["ACCT","ACP","AfDB","CCC","CEEAC","CEPGL","E= CA","FAO","G-77","GATT","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","INT= ELSAT","INTERPOL","ITU","LORCS","NAM","OAU","UN","UNCTAD","UNESCO","UNIDO= ","UPU","WHO","WIPO","WMO","WTO"]). bgfact("Burundi","ExportCommodities",["coffee","tea","cotton","hides"]). bgfact("Burundi","ExportPartners",["EC","US","Asia"]). bgfact("Burundi","ImportCommodities",["Capital goods","petroleum = products","foodstuffs","consumer goods"]). bgfact("Burundi","ImportPartners",["EC","Asia","US"]). bgfact("Burundi","Industries",["light consumer goods such as = blankets","shoes","food processing"]). bgfact("Burundi","Agriculture",["coffee","cotton","food = corn","sorghum","sweet potatoes","bananas","livestock - = meat","milk","hides and skins"]). bgfact("Cambodia","LandBounderies",["Laos","Thailand","Vietnam"]). bgfact("Cambodia","NaturalResources",["timber","gemstones","some iron = ore","manganese","phosphates","hydropower potential"]). bgfact("Cambodia","Population",["10264628"]). bgfact("Cambodia","Capital",["Phnom Penh"]). bgfact("Cambodia","MemberOf",["ACCT","INTERPOL","ITU","LORCS","NAM","PCA"= ,"UN","UNCTAD","UNESCO","UPU","WFTU","WHO","WMO","WTO"]). bgfact("Cambodia","ExportCommodities",["natural = rubber","rice","pepper","raw timber"]). bgfact("Cambodia","ExportPartners",["Thailand","Japan","India","Singapore= ","Malaysia","China","Vietnam"]). bgfact("Cambodia","ImportCommodities",["fuels","consumer = goods","machinery"]). bgfact("Cambodia","ImportPartners",["Japan","India","Singapore","Malaysia= ","Thailand","China","Vietnam"]). bgfact("Cambodia","Industries",["rice milling","fishing","wood and wood = products","rubber","cement","gem mining"]). bgfact("Cambodia","Agriculture",["main rice","rubber","food shortages - = rice","meat","vegetables","dairy products","sugar","flour"]). bgfact("Cameroon","LandBounderies",["Central African = Republic","Chad","Congo","Equatorial Guinea","Gabon","Nigeria"]). bgfact("Cameroon","NaturalResources",["petroleum","bauxite","iron = ore","timber","hydropower potential"]). bgfact("Cameroon","Population",["13132191"]). bgfact("Cameroon","Capital",["Yaounde"]). bgfact("Cameroon","MemberOf",["ACCT","ACP","AfDB","BDEAC","CCC","CEEAC","= ECA","FAO","FZ","G-19","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","= IDA","IDB","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL= ","IOC","ITU","LORCS","NAM","OAU","OIC","PCA","UDEAC","UN","UNCTAD","UNES= CO","UNIDO","UNTAC","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Cameroon","ExportCommodities",["petroleum = products","coffee","beans","cocoa","aluminum products","timber"]). bgfact("Cameroon","ExportPartners",["EC about","US","African = countries"]). bgfact("Cameroon","ImportCommodities",["machines and electrical = equipment","food","consumer goods","transport equipment"]). bgfact("Cameroon","ImportPartners",["EC about","African = countries","Japan","US"]). bgfact("Cameroon","Industries",["petroleum production and = refining","food processing","light consumer = goods","textiles","sawmills"]). bgfact("Cameroon","Agriculture",["the Agriculture and forestry sectors = provide employment for the majority of the Population","commercial and = food crops include = coffee","cocoa","timber","cotton","rubber","bananas","oilseed","grains","= livestock","root starches"]). bgfact("Canada","LandBounderies",["US"]). bgfact("Canada","NaturalResources",["nickel","zinc","copper","gold","lead= ","molybdenum","potash","silver","fish","timber","wildlife","coal","petro= leum","natural gas"]). bgfact("Canada","Population",["28113997"]). bgfact("Canada","Capital",["Ottawa"]). bgfact("Canada","MemberOf",["ACCT","AfDB","AG","NATO","NEA","NSG","OAS","= OECD","ONUSAL","PCA","UN","UNAVEM = II","UNCTAD","UNDOF","UNESCO","UNFICYP","UNHCR","UNIDO","UNIKOM","UNOMOZ"= ,"UNOMUR","UNPROFOR","UNTAC","UNTSO","UPU","WCL","WHO","WMO","WIPO","WTO"= ,"ZC"]). bgfact("Canada","ExportCommodities",["newsprint","wood = pulp","timber","crude petroleum","machinery","natural = gas","aluminum","telecommunications equipment"]). bgfact("Canada","ExportPartners",["US","Japan","UK","Germany","South = Korea","Netherlands","China"]). bgfact("Canada","ImportCommodities",["crude","chemicals","motor vehicles = and parts","durable consumer goods","telecommunications equipment and = parts"]). bgfact("Canada","ImportPartners",["US","Japan","UK","Germany","France","M= exico","Taiwan","South Korea"]). bgfact("Canada","Industries",["processed and unprocessed minerals","food = products","wood and paper products","transportation = equipment","chemicals","fish products","petroleum and natural gas"]). bgfact("Canada","Agriculture",["commercial fisheries provide annual = catch of million metric tons","of which is exported"]). bgfact("Cape Verde","LandBounderies",[]). bgfact("Cape Verde","NaturalResources",["salt","basalt = rock","pozzolana","limestone","kaolin","fish"]). bgfact("Cape Verde","Population",["423120"]). bgfact("Cape Verde","Capital",["Praia"]). bgfact("Cape = Verde","MemberOf",["ACP","AfDB","CCC","ECA","ECOWAS","FAO","G-77","IBRD",= "ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL"= ,"IOM","UNCTAD","UNESCO","UNIDO","UNOMOZ","UPU","WCL","WHO","WMO"]). bgfact("Cape Verde","ExportCommodities",["fish","bananas","hides and = skins"]). bgfact("Cape = Verde","ExportPartners",["Portugal","Algeria","Angola","Netherlands"]). bgfact("Cape Verde","ImportCommodities",["foodstuffs","consumer = goods","industrial products","transport equipment"]). bgfact("Cape = Verde","ImportPartners",["Sweden","Spain","Germany","Portugal","France","= Netherlands","US"]). bgfact("Cape Verde","Industries",["fish processing","salt = mining","clothing bgfactories","ship repair","construction = materials","food and beverage production"]). bgfact("Cape Verde","Agriculture",["beans","sweet potatoes","fish catch = provides for both domestic consumption and small exports"]). bgfact("Cayman Islands","LandBounderies",[]). bgfact("Cayman Islands","NaturalResources",["fish","climate and beaches = that foster tourism"]). bgfact("Cayman Islands","Population",["31790"]). bgfact("Cayman Islands","Capital",["George Town"]). bgfact("Cayman Islands","MemberOf",["CARICOM","IOC"]). bgfact("Cayman Islands","ExportCommodities",["turtle = products","manubgfactured consumer goods"]). bgfact("Cayman Islands","ExportPartners",["mostly US"]). bgfact("Cayman = Islands","ImportCommodities",["foodstuffs","manubgfactured goods"]). bgfact("Cayman Islands","ImportPartners",["US","Trinidad and = Tobago","UK","Netherlands Antilles","Japan"]). bgfact("Cayman Islands","Industries",["tourism","banking","insurance and = finance","construction","building materials","furniture making"]). bgfact("Cayman Islands","Agriculture",["minor production of = vegetables","fruit","turtle farming"]). bgfact("Central African = Republic","LandBounderies",["Cameroon","Chad","Congo","Sudan","Zaire"]). bgfact("Central African = Republic","NaturalResources",["diamonds","uranium","timber","gold","oil"]= ). bgfact("Central African Republic","Population",["3142182"]). bgfact("Central African Republic","Capital",["Bangui"]). bgfact("Central African = Republic","MemberOf",["ACCT","ACP","AfDB","BDEAC","CCC","CEEAC","ECA","FA= O","FZ","G-77","GATT","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","INTEL= SAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","UDEAC","UN","UNCTAD","UN= ESCO","UNIDO","UPU","WCL","WHO","WIPO","WMO"]). bgfact("Central African = Republic","ExportCommodities",["diamonds","cotton","coffee","timber","tob= acco"]). bgfact("Central African = Republic","ExportPartners",["France","Belgium","Italy","Japan","US"]). bgfact("Central African = Republic","ImportCommodities",["food","textiles","petroleum = products","machinery","electrical equipment","motor = vehicles","chemicals","pharmaceuticals","consumer goods","industrial = products"]). bgfact("Central African = Republic","ImportPartners",["France","Japan","Algeria"]). bgfact("Central African Republic","Industries",["diamond = mining","sawmills","breweries","textiles","footwear","assembly of = bicycles and motorcycles"]). bgfact("Central African Republic","Agriculture",["commercial = cotton","coffee","tobacco","food crops - = manioc","yams","millet","corn","bananas"]). bgfact("Chad","LandBounderies",["Cameroon","Central African = Republic","Libya","Niger","Nigeria","Sudan"]). bgfact("Chad","NaturalResources",["petroleum"]). bgfact("Chad","Population",["5466771"]). bgfact("Chad","Capital",["N'Djamena"]). bgfact("Chad","MemberOf",["ACCT","ACP","AfDB","BDEAC","CEEAC","ECA","FAO"= ,"FZ","G-77","GATT","IBRD","ICAO","ICFTU","IDA","IDB","IFAD","ILO","IMF",= "INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","OIC","UDEAC","UN",= "UNCTAD","UNESCO","UNIDO","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Chad","ExportCommodities",["cotton","cattle","textiles","fish"]).= bgfact("Chad","ExportPartners",["France","Nigeria","Cameroon"]). bgfact("Chad","ImportCommodities",["machinery and transportation = equipment","industrial goods","petroleum products","note - excludes = military equipment"]). bgfact("Chad","ImportPartners",["US","France","Nigeria","Cameroon"]). bgfact("Chad","Industries",["cotton textile = mills","slaughterhouses","brewery","natron","soap","cigarettes"]). bgfact("Chad","Agriculture",["food crops include = sorghum","millet","peanuts","rice","potatoes","livestock - = cattle","sheep","goats","self-sufficient in food in years of adequate = rainfall"]). bgfact("Chile","LandBounderies",["Argentina","Bolivia","Peru"]). bgfact("Chile","NaturalResources",["copper","timber","iron = ore","nitrates","precious metals","molybdenum"]). bgfact("Chile","Population",["13950557"]). bgfact("Chile","Capital",["Santiago"]). bgfact("Chile","MemberOf",["CCC","ECLAC","FAO","G-11","G-77","GATT","IADB= ","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INMA= RSAT","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LAES","LAIA","LORCS"= ,"NAM","OAS","ONUSAL","OPANAL","PCA","RG","UN","UNCTAD","UNESCO","UNIDO",= "UNMOGIP","UNTAC","UNTSO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Chile","ExportCommodities",["copper","wood products","fish and = fishmeal","fruits"]). bgfact("Chile","ExportPartners",["EC","Japan","US","Argentina","Brazil"])= . bgfact("Chile","ImportCommodities",["Capital goods","spare parts","raw = materials","petroleum","foodstuffs"]). bgfact("Chile","ImportPartners",["EC","US","Brazil","Japan"]). bgfact("Chile","Industries",["copper","foodstuffs","fish = processing","iron and steel","wood and wood products","transport = equipment","cement","textiles"]). bgfact("Chile","Agriculture",["major exporter of fruit","fish","major = wheat","corn","grapes","beans","sugar beets","potatoes","livestock = beef","poultry","net agricultural importer"]). bgfact("China","LandBounderies",["Afghanistan","Bhutan","Burma","Hong = Kong","India","Kazakhstan","North = Korea","Kyrgyzstan","Laos","Macau","Mongolia","Nepal","Pakistan","Russia"= ,"Tajikistan","Vietnam"]). bgfact("China","NaturalResources",["coal","iron = ore","petroleum","mercury","tin","tungsten","antimony","manganese","molyb= denum","vanadium","magnetite","aluminum","lead","zinc","uranium","hydropo= wer potential"]). bgfact("China","Population",["1190431106"]). bgfact("China","Capital",["Beijing"]). bgfact("China","MemberOf",["AfDB","APEC","AsDB","CCC","ESCAP","FAO","IAEA= ","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INMARSAT","= INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","MINURSO","NAM","PCA","UN"= ,"UNCTAD","UNESCO","UNHCR","UNIDO","UNIKOM","UN Security = Council","UNTAC","UNTSO","UN Trusteeship = Council","UPU","WHO","WIPO","WMO","WTO"]). bgfact("China","ExportCommodities",["textiles","garments","footwear","toy= s","crude"]). bgfact("China","ExportPartners",["Hong = Kong","US","Japan","Germany","South Korea","Russia"]). bgfact("China","ImportCommodities",["rolled steel","motor = vehicles","textile machinery","oil products"]). bgfact("China","ImportPartners",["Japan","Taiwan","US","Hong = Kong","Germany","South Korea"]). bgfact("China","Industries",["iron and steel","coal","machine = building","armaments","textiles","petroleum","cement","chemical = fertilizers","consumer durables","food processing"]). bgfact("China","Agriculture",["among the world's largest producers of = rice","potatoes","sorghum","peanuts","tea","millet","barley","commercial = crops include cotton","fish catch of million metric tons"]). bgfact("Christmas Island","LandBounderies",[]). bgfact("Christmas Island","NaturalResources",["phosphate"]). bgfact("Christmas Island","Population",["973"]). bgfact("Christmas Island","Capital",["The Settlement"]). bgfact("Christmas Island","MemberOf",["none"]). bgfact("Christmas Island","ExportCommodities",["phosphate"]). bgfact("Christmas Island","ExportPartners",["Australia","NZ"]). bgfact("Christmas Island","ImportCommodities",["consumer goods"]). bgfact("Christmas Island","ImportPartners",["principally Australia"]). bgfact("Christmas Island","Industries",["phosphate extraction"]). bgfact("Christmas Island","Agriculture",["NA"]). bgfact("Clipperton Island","LandBounderies",[]). bgfact("Clipperton Island","NaturalResources",["none"]). bgfact("Clipperton Island","Capital",["none; administered by France from = French Polynesia"]). bgfact("Cocos (Keeling) Islands","LandBounderies",[]). bgfact("Cocos (Keeling) Islands","NaturalResources",["fish"]). bgfact("Cocos (Keeling) Islands","Population",["598"]). bgfact("Cocos (Keeling) Islands","Capital",["West Island"]). bgfact("Cocos (Keeling) Islands","MemberOf",["none"]). bgfact("Cocos (Keeling) Islands","ExportCommodities",["copra"]). bgfact("Cocos (Keeling) Islands","ExportPartners",["Australia"]). bgfact("Cocos (Keeling) Islands","ImportCommodities",["foodstuffs"]). bgfact("Cocos (Keeling) Islands","ImportPartners",["Australia"]). bgfact("Cocos (Keeling) Islands","Industries",["copra products"]). bgfact("Cocos (Keeling) Islands","Agriculture",["gardens provide = vegetables","bananas","pawpaws","coconuts"]). bgfact("Colombia","LandBounderies",["Brazil","Ecuador","Panama","Peru","V= enezuela"]). bgfact("Colombia","NaturalResources",["petroleum","natural = gas","coal","iron ore","nickel","gold","copper","emeralds"]). bgfact("Colombia","Population",["35577556"]). bgfact("Colombia","Capital",["Bogota"]). bgfact("Colombia","MemberOf",["AG","CDB","CG","ECLAC","FAO","G-3","G-11",= "G-24","G-77","GATT","IADB","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IFA= D","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM","= ISO","ITU","LAES","LAIA","LORCS","NAM","OAS","ONUSAL","OPANAL","PCA","RG"= ,"UN","UNCTAD","UNESCO","UNHCR","UNIDO","UNPROFOR","UNTAC","UPU","WCL","W= FTU","WHO","WIPO","WMO","WTO"]). bgfact("Colombia","ExportCommodities",["petroleum","coffee","coal","banan= as","fresh cut flowers"]). bgfact("Colombia","ExportPartners",["US","EC","Japan","Venezuela"]). bgfact("Colombia","ImportCommodities",["industrial = equipment","transportation equipment","consumer = goods","chemicals","paper products"]). bgfact("Colombia","ImportPartners",["US","EC","Brazil","Venezuela","Japan= "]). bgfact("Colombia","Industries",["textiles","food = processing","oil","clothing and footwear","beverages","chemicals","metal = products","mining - = gold","coal","emeralds","iron","nickel","silver","salt"]). bgfact("Colombia","Agriculture",["climate and soils permit a wide = variety of crops","such as = coffee","rice","tobacco","corn","sugarcane","cocoa = beans","oilseeds","forest products and shrimp farming are becoming more = important"]). bgfact("Comoros","LandBounderies",[]). bgfact("Comoros","NaturalResources",["negligible"]). bgfact("Comoros","Population",["530136"]). bgfact("Comoros","Capital",["Moroni"]). bgfact("Comoros","MemberOf",["ACCT","ACP","AfDB","ECA","FAO","FZ","G-77",= "IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","INTELSAT","ITU","NAM"= ,"OAU","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU","WHO","WMO"]). bgfact("Comoros","ExportCommodities",["vanilla","cloves","perfume = oil","copra","ylang-ylang"]). bgfact("Comoros","ExportPartners",["US","France","Africa","FRG"]). bgfact("Comoros","ImportCommodities",["cement","petroleum = products","consumer goods"]). bgfact("Comoros","ImportPartners",["Europe"]). bgfact("Comoros","Industries",["perfume = distillation","textiles","furniture","jewelry","construction = materials","soft drinks"]). bgfact("Comoros","Agriculture",["plantations produce crops for export - = vanilla","cloves","perfume essences","principal food = coconuts","bananas","large net food importer"]). bgfact("Congo","LandBounderies",["Angola","Cameroon","Central African = Republic","Gabon","Zaire"]). bgfact("Congo","NaturalResources",["petroleum","timber","potash","lead","= zinc","uranium","copper","phosphates","natural gas"]). bgfact("Congo","Population",["2446902"]). bgfact("Congo","Capital",["Brazzaville"]). bgfact("Congo","MemberOf",["ACCT","ACP","AfDB","BDEAC","CCC","CEEAC","ECA= ","FAO","FZ","G-77","GATT","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","= IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","UDEAC","UN","= UNAVEM = II","UNCTAD","UNESCO","UNIDO","UPU","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Congo","ExportCommodities",["crude","lumber","plywood","coffee","= cocoa","sugar","diamonds"]). bgfact("Congo","ExportPartners",["US","France"]). bgfact("Congo","ImportCommodities",["foodstuffs","consumer = goods","intermediate manubgfactures","Capital equipment"]). bgfact("Congo","ImportPartners",["France","Germany","Italy","Spain","US",= "Japan","Brazil"]). bgfact("Congo","Industries",["petroleum","cement","lumbering","brewing","= sugar milling","palm oil","soap","cigarette"]). bgfact("Congo","Agriculture",["corn","peanuts","imports over of food = needs"]). bgfact("Cook Islands","LandBounderies",[]). bgfact("Cook Islands","NaturalResources",["negligible"]). bgfact("Cook Islands","Population",["19124"]). bgfact("Cook Islands","Capital",["Avarua"]). bgfact("Cook = Islands","MemberOf",["AsDB","ESCAP","IOC","SPARTECA","SPC","SPF","UNESCO"= ,"WHO"]). bgfact("Cook Islands","ExportCommodities",["copra","fresh and canned = fruit","clothing"]). bgfact("Cook Islands","ExportPartners",["NZ","Japan"]). bgfact("Cook = Islands","ImportCommodities",["foodstuffs","textiles","fuels","timber"]).= bgfact("Cook Islands","ImportPartners",["NZ","Japan","Australia","US"]). bgfact("Cook Islands","Industries",["fruit processing","tourism"]). bgfact("Cook Islands","Agriculture",["accounts for of GDP","export = copra","citrus fruits","pineapples","tomatoes","subsistence = yams","taro"]). bgfact("Coral Sea Islands","LandBounderies",[]). bgfact("Coral Sea Islands","NaturalResources",["negligible"]). bgfact("Coral Sea Islands","Population",["3"]). bgfact("Coral Sea Islands","Capital",["none; administered from Canberra, = Australia"]). bgfact("Costa Rica","LandBounderies",["Nicaragua","Panama"]). bgfact("Costa Rica","NaturalResources",["hydropower potential"]). bgfact("Costa Rica","Population",["3342154"]). bgfact("Costa Rica","Capital",["San Jose"]). bgfact("Costa = Rica","MemberOf",["AG","OAS","OPANAL","UN","UNCTAD","UNESCO","UNIDO","UPU= ","WCL","WFTU","WHO","WIPO","WMO"]). bgfact("Costa = Rica","ExportCommodities",["coffee","bananas","textiles","sugar"]). bgfact("Costa = Rica","ExportPartners",["US","Germany","Italy","Guatemala","El = Salvador","Netherlands","UK","France"]). bgfact("Costa Rica","ImportCommodities",["raw materials","consumer = goods","Capital equipment","petroleum"]). bgfact("Costa = Rica","ImportPartners",["US","Japan","Mexico","Guatemala","Venezuela","Ge= rmany"]). bgfact("Costa Rica","Industries",["food processing","textiles and = clothing","construction materials","fertilizer","plastic products"]). bgfact("Costa Rica","Agriculture",["commodities - = coffee","beef","bananas","rice","beans","depletion of forest resources = resulting in lower timber output"]). bgfact("Cote = d'Ivoire","LandBounderies",["Burkina","Ghana","Guinea","Liberia","Mali"])= . bgfact("Cote = d'Ivoire","NaturalResources",["petroleum","diamonds","manganese","iron = ore","cobalt","bauxite","copper"]). bgfact("Cote d'Ivoire","Population",["14295501"]). bgfact("Cote d'Ivoire","Capital",["Yamoussoukro"]). bgfact("Cote = d'Ivoire","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOWAS","En= tente","FAO","FZ","G-24","G-77","GATT","IAEA","IBRD","ICAO","ICC","IDA","= IFAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","= NAM","OAU","UN","UNCTAD","UNESCO","UNIDO","UPU","WADB","WCL","WHO","WIPO"= ,"WMO","WTO"]). bgfact("Cote d'Ivoire","ExportCommodities",["cocoa","coffee","tropical = woods","petroleum","cotton","bananas","pineapples","palm = oil","cotton"]). bgfact("Cote = d'Ivoire","ExportPartners",["France","FRG","Netherlands","US","Belgium","= Spain"]). bgfact("Cote d'Ivoire","ImportCommodities",["food","Capital = goods","consumer goods","fuel"]). bgfact("Cote = d'Ivoire","ImportPartners",["France","Nigeria","US","Japan"]). bgfact("Cote d'Ivoire","Industries",["foodstuffs","wood processing","oil = refinery","automobile assembly","textiles","fertilizer","beverage"]). bgfact("Cote d'Ivoire","Agriculture",["most important sector","crops = include coffee","cocoa beans","timber","bananas","palm kernels","food = corn","rice","manioc","not self-sufficient in bread grain and dairy = products"]). bgfact("Croatia","LandBounderies",["Bosnia and = Herzegovina","Hungary","Serbia and Montenegro","Slovenia"]). bgfact("Croatia","NaturalResources",["oil","some = coal","bauxite","low-grade iron ore","calcium","natural = asphalt","silica","mica","clays","salt"]). bgfact("Croatia","Population",["4697614"]). bgfact("Croatia","Capital",["Zagreb"]). bgfact("Croatia","MemberOf",["CE","UN","UNCTAD","UNESCO","UNIDO","UPU","W= HO","WIPO","WMO"]). bgfact("Croatia","ExportCommodities",["machinery and transport = equipment","chemicals","food and live animals","raw materials","fuels = and lubricants"]). bgfact("Croatia","ExportPartners",["EC countries","Slovenia"]). bgfact("Croatia","ImportCommodities",["machinery and transport = equipment","fuels and lubricants","food and live = animals","chemicals","manubgfactured goods","miscellaneous = manubgfactured articles","raw materials","beverages and tobacco"]). bgfact("Croatia","ImportPartners",["EC countries","Slovenia","FSU = countries"]). bgfact("Croatia","Industries",["chemicals and plastics","machine = tools","fabricated metal","electronics","pig iron and rolled steel = products","aluminum reduction","paper","wood = products","textiles","shipbuilding","petroleum and petroleum = refining","food processing and beverages"]). bgfact("Croatia","Agriculture",["wheat","corn","sugar = beets","sunflowers","alfalfa","central Croatian highlands are less = fertile but support cereal production","orchards","vineyards","livestock = breeding","coastal areas and offshore islands grow olives","citrus = fruits"]). bgfact("Cuba","LandBounderies",["US Naval Base at Guantanamo Bay"]). bgfact("Cuba","NaturalResources",["cobalt","nickel","iron = ore","copper","manganese","salt","timber","silica","petroleum"]). bgfact("Cuba","Population",["11064344"]). bgfact("Cuba","Capital",["Havana"]). bgfact("Cuba","MemberOf",["CCC","ECLAC","FAO","G-77","GATT","IAEA","ICAO"= ,"IFAD","ILO","IMO","INMARSAT","INTELSAT","PCA","UN","UNCTAD","UNESCO","U= NIDO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Cuba","ExportCommodities",["sugar","nickel","shellfish","tobacco"= ,"medical products","citrus","coffee"]). bgfact("Cuba","ExportPartners",["Russia","Canada","China","Ukraine","Japa= n","Spain"]). bgfact("Cuba","ImportCommodities",["petroleum","food","machinery","chemic= als"]). bgfact("Cuba","ImportPartners",["Venezuela","China","Spain","Mexico","Ita= ly","Canada","France"]). bgfact("Cuba","Industries",["sugar milling and refining","petroleum = refining","food and tobacco processing","textiles","chemicals","paper = and wood products","metals","cement","fertilizers","consumer = goods","agricultural machinery"]). bgfact("Cuba","Agriculture",["sector hurt by growing shortages of fuels = and parts"]). bgfact("Cyprus","LandBounderies",[]). bgfact("Cyprus","NaturalResources",["copper","pyrites","asbestos","gypsum= ","timber","salt","marble","clay earth pigment"]). bgfact("Cyprus","Population",["730084"]). bgfact("Cyprus","Capital",["Nicosia"]). bgfact("Cyprus","MemberOf",["C","CCC","CE","CSCE","EBRD","ECE","FAO","G-7= 7","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IFAD","IFC","ILO","IM= F","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","NAM","= OAS","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO"= ,"WTO"]). bgfact("Cyprus","ExportCommodities",["citrus","potatoes","grapes","wine",= "cement","clothing and shoes"]). bgfact("Cyprus","ExportPartners",["UK","Greece","Lebanon","Egypt"]). bgfact("Cyprus","ImportCommodities",["consumer goods","petroleum and = lubricants","food and feed grains","machinery"]). bgfact("Cyprus","ImportPartners",["UK","Japan","Italy","Germany","US"]). bgfact("Cyprus","Industries",["food","beverages","textiles","chemicals","= metal products","tourism","wood products"]). bgfact("Cyprus","Agriculture",["major = potatoes","vegetables","barley","grapes","olives","vegetables and fruit = provide of export revenues"]). bgfact("Czech = Republic","LandBounderies",["Austria","Germany","Poland","Slovakia"]). bgfact("Czech Republic","NaturalResources",["hard coal","soft = coal","kaolin","clay","graphite"]). bgfact("Czech Republic","Population",["10408280"]). bgfact("Czech Republic","Capital",["Prague"]). bgfact("Czech Republic","MemberOf",["BIS","CCC","CE","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNOMIG","UNOMOZ","UNPROFOR","UPU","WFTU","= WHO","WIPO","WMO","WTO","ZC"]). bgfact("Czech Republic","ExportCommodities",["manubgfactured = goods","machinery and transport = equipment","chemicals","fuels","minerals"]). bgfact("Czech = Republic","ExportPartners",["Germany","Slovakia","Poland","Austria","Hung= ary","Italy","France","US","UK","CIS republics"]). bgfact("Czech Republic","ImportCommodities",["machinery and transport = equipment","fuels and lubricants","manbgfactured goods","raw = materials","chemicals","agricultural products"]). bgfact("Czech Republic","ImportPartners",["Slovakia","CIS = republics","Germany","Austria","Poland","Switzerland","Hungary","UK","Ita= ly"]). bgfact("Czech Republic","Industries",["fuels","ferrous = metallurgy","machinery and equipment","coal","motor = vehicles","glass","armaments"]). bgfact("Czech Republic","Agriculture",["diversified crop and livestock = production","including grains","potatoes","sugar = beets","hops","fruit","hogs","cattle","exporter of forest products"]). bgfact("Denmark","LandBounderies",["Germany"]). bgfact("Denmark","NaturalResources",["petroleum","natural = gas","fish","salt","limestone"]). bgfact("Denmark","Population",["5187821"]). bgfact("Denmark","Capital",["Copenhagen"]). bgfact("Denmark","MemberOf",["AfDB","AG","AsDB","Australia = Group","BIS","CBSS","CCC","CE","CERN","COCOM","CSCE","EBRD","EC","ECE","E= IB","ESA","FAO","G-9","GATT","IADB","IAEA","IBRD","ICAO","ICC","ICFTU","I= DA","IEA","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL"= ,"IOC","IOM","ISO","ITU","LORCS","MTCR","NACC","NATO","NC","NEA","NIB","N= SG","OECD","PCA","UN","UNCTAD","UNESCO","UNFICYP","UNHCR","UNIDO","UNIKOM= ","UNOMIG","UNMOGIP","UNPROFOR","UNTSO","UPU","WEU","WFTU","WHO","WIPO","= WMO","ZC"]). bgfact("Denmark","ExportCommodities",["meat and meat products","dairy = products","transport equipment","fish","chemicals","industrial = machinery"]). bgfact("Denmark","ExportPartners",["EC"]). bgfact("Denmark","ImportCommodities",["petroleum","machinery and = equipment","chemicals","grain and foodstuffs","textiles","paper"]). bgfact("Denmark","ImportPartners",["EC"]). bgfact("Denmark","Industries",["food processing","machinery and = equipment","textiles and clothing","chemical = products","electronics","construction","furniture","shipbuilding"]). bgfact("Denmark","Agriculture",["principal = meat","dairy","grain","potatoes","rape","sugar beets","self-sufficient = in food production"]). bgfact("Djibouti","LandBounderies",["Eritrea","Ethiopia","Somalia"]). bgfact("Djibouti","NaturalResources",[]). bgfact("Djibouti","Population",["412599"]). bgfact("Djibouti","Capital",["Djibouti"]). bgfact("Djibouti","MemberOf",["ACCT","ACP","AfDB","AFESD","AL","ECA","FAO= ","G-77","IBRD","ICAO","IDA","IDB","IFAD","IFC","IGADD","ILO","IMF","IMO"= ,"INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","OIC","UN","UNESCO= ","UNCTAD","UNIDO","UPU","WHO","WMO"]). bgfact("Djibouti","ExportCommodities",["hides and skins","coffee"]). bgfact("Djibouti","ExportPartners",["Africa","Middle East","Western = Europe"]). bgfact("Djibouti","ImportCommodities",["foods","beverages","transport = equipment","chemicals","petroleum products"]). bgfact("Djibouti","ImportPartners",["Western Europe","Asia","Africa"]). bgfact("Djibouti","Industries",["limited to a few small-scale = enterprises","such as dairy products and mineral-water bottling"]). bgfact("Djibouti","Agriculture",["half of Population pastoral nomads = herding goats","sheep","imports bulk of food needs"]). bgfact("Dominica","LandBounderies",[]). bgfact("Dominica","NaturalResources",["timber"]). bgfact("Dominica","Population",["87696"]). bgfact("Dominica","Capital",["Roseau"]). bgfact("Dominica","MemberOf",["ACCT","ACP","C","CARICOM","CDB","ECLAC","F= AO","G-77","GATT","IBRD","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","IN= TERPOL","LORCS","NAM","OAS","OECS","UN","UNCTAD","UNESCO","UNIDO","UPU","= WCL","WHO","WMO"]). bgfact("Dominica","ExportCommodities",["bananas","soap","bay = oil","vegetables","grapefruit","oranges"]). bgfact("Dominica","ExportPartners",["UK","CARICOM = countries","Italy","US"]). bgfact("Dominica","ImportCommodities",["manubgfactured goods","machinery = and equipment","food","chemicals"]). bgfact("Dominica","ImportPartners",["US","CARICOM","UK","Canada"]). bgfact("Dominica","Industries",["soap","coconut = oil","tourism","copra","furniture","cement blocks","shoes"]). bgfact("Dominica","Agriculture",["principal = bananas","citrus","mangoes","root crops","forestry and fisheries = potential not exploited"]). bgfact("Dominican Republic","LandBounderies",["Haiti"]). bgfact("Dominican = Republic","NaturalResources",["nickel","bauxite","gold","silver"]). bgfact("Dominican Republic","Population",["7826075"]). bgfact("Dominican Republic","Capital",["Santo Domingo"]). bgfact("Dominican = Republic","MemberOf",["ACP","CARICOM","OAS","OPANAL","PCA","UN","UNCTAD",= "UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WMO","WTO"]). bgfact("Dominican = Republic","ExportCommodities",["ferronickel","sugar","gold","coffee","coc= oa"]). bgfact("Dominican Republic","ExportPartners",["US","EC","Puerto Rico"]). bgfact("Dominican = Republic","ImportCommodities",["foodstuffs","petroleum","cotton and = fabrics","chemicals and pharmaceuticals"]). bgfact("Dominican Republic","ImportPartners",["US"]). bgfact("Dominican Republic","Industries",["tourism","sugar = processing","ferronickel and gold = mining","textiles","cement","tobacco"]). bgfact("Dominican Republic","Agriculture",["sugarcane is the most = important commercial crop","followed by coffee","cotton","cocoa","food = rice","beans","potatoes","corn","animal output - cattle","hogs","dairy = products","meat","not self-sufficient in food"]). bgfact("Ecuador","LandBounderies",["Colombia","Peru"]). bgfact("Ecuador","NaturalResources",["petroleum","fish","timber"]). bgfact("Ecuador","Population",["10677067"]). bgfact("Ecuador","Capital",["Quito"]). bgfact("Ecuador","MemberOf",["AG","ECLAC","FAO","G-11","G-77","IADB","IAE= A","IBRD","ICAO","ICC","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INTE= LSAT","INTERPOL","IOC","IOM","ITU","LAES","LAIA","LORCS","NAM","OAS","ONU= SAL","OPANAL","PCA","RG","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU= ","WHO","WIPO","WMO","WTO"]). bgfact("Ecuador","ExportCommodities",["petroleum","bananas","shrimp","coc= oa","coffee"]). bgfact("Ecuador","ExportPartners",["US","Latin America","Caribbean","EC = countries"]). bgfact("Ecuador","ImportCommodities",["transport = equipment","vehicles","machinery","chemicals"]). bgfact("Ecuador","ImportPartners",["US","Latin America","Caribbean","EC = countries","Japan"]). bgfact("Ecuador","Industries",["petroleum","food = processing","textiles","metal works","paper products","wood = products","chemicals","plastics","fishing","timber"]). bgfact("Ecuador","Agriculture",["cocoa","fish","crop production - = rice","potatoes","manioc","plantains","livestock sector - = cattle","sheep","hogs","beef","pork","net importer of foodgrains","dairy = products"]). bgfact("Egypt","LandBounderies",["Gaza = Strip","Israel","Libya","Sudan"]). bgfact("Egypt","NaturalResources",["petroleum","natural gas","iron = ore","phosphates","manganese","limestone","gypsum","talc","asbestos","lea= d","zinc"]). bgfact("Egypt","Population",["60765028"]). bgfact("Egypt","Capital",["Cairo"]). bgfact("Egypt","MemberOf",["ABEDA","ACC","ACCT","OAU","OIC","PCA","UN","U= NAVEM = II","UNCTAD","UNESCO","UNIDO","UNOMOZ","UNOSOM","UNPROFOR","UNTAC","UPU",= "UNRWA","WHO","WIPO","WMO","WTO"]). bgfact("Egypt","ExportCommodities",["crude and petroleum = products","cotton yarn","raw cotton","textiles","metal = products","chemicals"]). bgfact("Egypt","ExportPartners",["EC","Eastern Europe","US","Japan"]). bgfact("Egypt","ImportCommodities",["machinery and = equipment","foods","fertilizers","wood products","durable consumer = goods","Capital goods"]). bgfact("Egypt","ImportPartners",["EC","US","Japan","Eastern Europe"]). bgfact("Egypt","Industries",["textiles","food = processing","tourism","chemicals","petroleum","construction","cement","me= tals"]). bgfact("Egypt","Agriculture",["corn","wheat","beans","fruit","livestock = - cattle","water buffalo","sheep","annual fish catch about"]). bgfact("El Salvador","LandBounderies",["Guatemala","Honduras"]). bgfact("El Salvador","NaturalResources",["hydropower","petroleum"]). bgfact("El Salvador","Population",["5752511"]). bgfact("El Salvador","Capital",["San Salvador"]). bgfact("El = Salvador","MemberOf",["BCIE","CACM","ECLAC","FAO","G-77","GATT","IADB","I= AEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT= ","IOC","IOM","ITU","LAES","LAIA","OAS","OPANAL","PCA","UN","UNCTAD","UNE= SCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO"]). bgfact("El = Salvador","ExportCommodities",["coffee","sugarcane","shrimp"]). bgfact("El Salvador","ExportPartners",["US","Guatemala","Costa = Rica","Germany"]). bgfact("El Salvador","ImportCommodities",["raw materials","consumer = goods","Capital goods"]). bgfact("El = Salvador","ImportPartners",["US","Guatemala","Mexico","Venezuela","German= y"]). bgfact("El Salvador","Industries",["food = processing","beverages","petroleum","nonmetallic = products","tobacco","chemicals","textiles","furniture"]). bgfact("El = Salvador","Agriculture",["corn","rice","beans","oilseeds","beef","dairy = products","not self-sufficient in food"]). bgfact("Equatorial Guinea","LandBounderies",["Cameroon","Gabon"]). bgfact("Equatorial = Guinea","NaturalResources",["timber","petroleum","small unexploited = deposits of gold","manganese","uranium"]). bgfact("Equatorial Guinea","Population",["409550"]). bgfact("Equatorial Guinea","Capital",["Malabo"]). bgfact("Equatorial = Guinea","MemberOf",["ACCT","ACP","AfDB","BDEAC","CEEAC","ECA","FAO","FZ",= "G-77","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","OAU= ","UDEAC","UN","UNCTAD","UNESCO","UNIDO","UPU","WHO"]). bgfact("Equatorial Guinea","ExportCommodities",["coffee","timber","cocoa = beans"]). bgfact("Equatorial = Guinea","ExportPartners",["Spain","Nigeria","Cameroon"]). bgfact("Equatorial = Guinea","ImportCommodities",["petroleum","food","beverages","clothing","m= achinery"]). bgfact("Equatorial = Guinea","ImportPartners",["Cameroon","Spain","France","US"]). bgfact("Equatorial Guinea","Industries",["fishing","sawmilling"]). bgfact("Equatorial Guinea","Agriculture",["accounts for almost of = GDP","timber and coffee from Rio Muni","food = rice","yams","cassava","bananas","oil palm nuts","manioc","livestock"]). bgfact("Eritrea","LandBounderies",["Djibouti","Ethiopia","Sudan"]). bgfact("Eritrea","NaturalResources",["gold","potash","zinc","copper","sal= t","probably oil","fish"]). bgfact("Eritrea","Population",["3782543"]). bgfact("Eritrea","Capital",["Asmara"]). bgfact("Eritrea","MemberOf",["OAU","ACP","AfDB","ECA","ILO","IMO","INTELS= AT","ITU","UN","UNCTAD","UNESCO","UPU","WMO"]). bgfact("Eritrea","ExportCommodities",["NA"]). bgfact("Eritrea","ExportPartners",["NA"]). bgfact("Eritrea","ImportCommodities",["NA"]). bgfact("Eritrea","ImportPartners",["NA"]). bgfact("Eritrea","Industries",["food processing","beverages","clothing = and textiles"]). bgfact("Eritrea","Agriculture",["sorghum","livestock"]). bgfact("Estonia","LandBounderies",["Latvia","Russia"]). bgfact("Estonia","NaturalResources",["shale = oil","peat","phosphorite","amber"]). bgfact("Estonia","Population",["1616882"]). bgfact("Estonia","Capital",["Tallinn"]). bgfact("Estonia","MemberOf",["BIS","CBSS","CCC","CE","CSCE","EBRD","ECE",= "FAO","IAEA","IBRD","ICAO","ICFTU","IFC","ILO","IMF","IMO","INTERPOL","IO= C","ISO","ITU","NACC","UN","UNCTAD","UNESCO","UPU","WHO","WMO"]). bgfact("Estonia","ExportCommodities",["textile","food = products","vehicles","metals"]). bgfact("Estonia","ExportPartners",["Russia","Finland","Latvia","Germany",= "Ukraine"]). bgfact("Estonia","ImportCommodities",["machinery","fuels","vehicles","tex= tiles"]). bgfact("Estonia","ImportPartners",["Finland","Russia","Sweden","Germany",= "Netherlands"]). bgfact("Estonia","Industries",["oil = shale","shipbuilding","phosphates","electric = motors","excavators","cement","furniture","clothing","textiles","paper","= shoes","apparel"]). bgfact("Estonia","Agriculture",["net exports of meat","fish","dairy = products","fruits and vegetables"]). bgfact("Ethiopia","LandBounderies",["Djibouti","Eritrea","Kenya","Somalia= ","Sudan"]). bgfact("Ethiopia","NaturalResources",["small reserves of = gold","platinum","copper","potash"]). bgfact("Ethiopia","Population",["54927108"]). bgfact("Ethiopia","Capital",["Addis Ababa"]). bgfact("Ethiopia","MemberOf",["ACP","AfDB","CCC","ECA","FAO","G-24","G-77= ","IAEA","IBRD","ICAO","IDA","IFAD","IFC","IGADD","ILO","IMF","IMO","INTE= LSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM","OAU","UN","UNCTAD","UNE= SCO","UNHCR","UNIDO","UPU","WFTU","WHO","WMO","WTO"]). bgfact("Ethiopia","ExportCommodities",["coffee","leather = products","gold","petroleum products"]). bgfact("Ethiopia","ExportPartners",["Germany","Japan","Saudi = Arabia","France","Italy"]). bgfact("Ethiopia","ImportCommodities",["Capital goods","consumer = goods","fuel"]). bgfact("Ethiopia","ImportPartners",["US","Germany","Italy","Saudi = Arabia","Japan"]). bgfact("Ethiopia","Industries",["food = processing","beverages","textiles","chemicals","metals = processing","cement"]). bgfact("Ethiopia","Agriculture",["principal crops and livestock - = cereals","pulses","coffee","oilseeds","sugarcane","hides and = skins","cattle","sheep","goats"]). bgfact("Europa Island","LandBounderies",[]). bgfact("Europa Island","NaturalResources",["negligible"]). bgfact("Europa Island","Capital",["none; administered by France from = Reunion"]). bgfact("Falkland Islands (Islas Malvinas)","LandBounderies",[]). bgfact("Falkland Islands (Islas = Malvinas)","NaturalResources",["fish","wildlife"]). bgfact("Falkland Islands (Islas Malvinas)","Population",["2261"]). bgfact("Falkland Islands (Islas Malvinas)","Capital",["Stanley"]). bgfact("Falkland Islands (Islas Malvinas)","MemberOf",["ICFTU"]). bgfact("Falkland Islands (Islas = Malvinas)","ExportCommodities",["wool","hides and skins"]). bgfact("Falkland Islands (Islas = Malvinas)","ExportPartners",["UK","Netherlands","Japan"]). bgfact("Falkland Islands (Islas = Malvinas)","ImportCommodities",["food","clothing","fuels"]). bgfact("Falkland Islands (Islas = Malvinas)","ImportPartners",["UK","Netherlands Antilles"]). bgfact("Falkland Islands (Islas Malvinas)","Industries",["wool and fish = processing"]). bgfact("Falkland Islands (Islas Malvinas)","Agriculture",["some fodder = and vegetable crops"]). bgfact("Faroe Islands","LandBounderies",[]). bgfact("Faroe Islands","NaturalResources",["fish"]). bgfact("Faroe Islands","Population",["48427"]). bgfact("Faroe Islands","Capital",["Torshavn"]). bgfact("Faroe Islands","MemberOf",["none"]). bgfact("Faroe Islands","ExportCommodities",["fish and fish = products","animal feedstuffs","transport equipment"]). bgfact("Faroe = Islands","ExportPartners",["Denmark","Germany","UK","France","Spain","US"= ]). bgfact("Faroe Islands","ImportCommodities",["machinery and transport = equipment","manubgfactures","food and livestock","fuels","chemicals"]). bgfact("Faroe = Islands","ImportPartners",["Denmark","Norway","Sweden","Germany","US"]). bgfact("Faroe = Islands","Industries",["fishing","shipbuilding","handicrafts"]). bgfact("Faroe Islands","Agriculture",["annual fish catch about"]). bgfact("Fiji","LandBounderies",[]). bgfact("Fiji","NaturalResources",["timber","fish","gold","copper","offsho= re oil potential"]). bgfact("Fiji","Population",["764382"]). bgfact("Fiji","Capital",["Suva"]). bgfact("Fiji","MemberOf",["ACP","AsDB","CP","ESCAP","FAO","G-77","GATT","= IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INT= ERPOL","IOC","ITU","LORCS","PCA","SPARTECA","SPC","SPF","UN","UNCTAD","UN= ESCO","UNIDO","UNIFIL","UNIKOM","UNOMUR","UNTAC","UPU","WHO","WIPO","WMO"= ]). bgfact("Fiji","ExportCommodities",["sugar","clothing","processed = fish","gold","lumber"]). bgfact("Fiji","ExportPartners",["EC","Australia","Pacific = Islands","Japan"]). bgfact("Fiji","ImportCommodities",["machinery and transport = equipment","petroleum products","food","consumer goods","chemicals"]). bgfact("Fiji","ImportPartners",["Australia","NZ","Japan","EC","US"]). bgfact("Fiji","Industries",["sugar","tourism","copra","gold","silver","cl= othing","lumber","small cottage Industries"]). bgfact("Fiji","Agriculture",["coconuts","cassava","rice","sweet = potatoes","small livestock sector includes = cattle","pigs","horses","fish catch nearly"]). bgfact("Finland","LandBounderies",["Norway","Sweden","Russia"]). bgfact("Finland","NaturalResources",["timber","copper","zinc","iron = ore","silver"]). bgfact("Finland","Population",["5068931"]). bgfact("Finland","Capital",["Helsinki"]). bgfact("Finland","MemberOf",["AfDB","AG","OECD","PCA","UN","UNCTAD","UNDO= F","UNESCO","UNFICYP","UNHCR","UNIDO","UNIFIL","UNIKOM","UNMOGIP","UNPROF= OR","UNTSO","UPU","WFTU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Finland","ExportCommodities",["timber","paper and = pulp","ships","machinery","clothing and footwear"]). bgfact("Finland","ExportPartners",["EC"]). bgfact("Finland","ImportCommodities",["foodstuffs","petroleum and = petroleum products","chemicals","transport equipment","iron and = steel","machinery","textile yarn and fabrics","fodder grains"]). bgfact("Finland","ImportPartners",["EC"]). bgfact("Finland","Industries",["metal products","shipbuilding","forestry = and wood processing","copper = refining","foodstuffs","chemicals","textiles","clothing"]). bgfact("Finland","Agriculture",["livestock production","especially dairy = cattle","main crops - cereals","sugar beets","self-sufficient","annual = fish catch about"]). bgfact("France","LandBounderies",["Andorra","Belgium","Germany","Italy","= Luxembourg","Monaco","Spain","Switzerland"]). bgfact("France","NaturalResources",["coal","iron = ore","bauxite","fish","timber","zinc","potash"]). bgfact("France","Population",["57840445"]). bgfact("France","Capital",["Paris"]). bgfact("France","MemberOf",["ACCT","AfDB","AG","OECD","ONUSAL","PCA","SPC= ","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UNIFIL","UNIKOM","UNOSOM","UNPR= OFOR","UNRWA","UN Security Council","UNTAC","UN Trusteeship = Council","UNTSO","UPU","WCL","WEU","WFTU","WHO","WIPO","WMO","WTO","ZC"])= . bgfact("France","ExportCommodities",["machinery and transportation = equipment","chemicals","foodstuffs","agricultural products","iron and = steel products","textiles and clothing"]). bgfact("France","ExportPartners",["Germany","Italy","Spain","Belgium-Luxe= mbourg","UK","Netherlands","US","Japan","former USSR"]). bgfact("France","ImportCommodities",["crude","machinery and = equipment","agricultural products","chemicals","iron and steel = products"]). bgfact("France","ImportPartners",["Germany","Italy","US","Netherlands","S= pain","Belgium-Luxembourg","UK","Japan","former USSR"]). bgfact("France","Industries",["steel","machinery","chemicals","automobile= s","metallurgy","aircraft","electronics","mining","textiles","food = processing","tourism"]). bgfact("France","Agriculture",["dairy products","cereals","sugar = beets","potatoes","shortages include fats and oils and tropical = produce","fish catch of"]). bgfact("French Guiana","LandBounderies",["Brazil","Suriname"]). bgfact("French = Guiana","NaturalResources",["bauxite","timber","gold","cinnabar","kaolin"= ,"fish"]). bgfact("French Guiana","Population",["139299"]). bgfact("French Guiana","Capital",["Cayenne"]). bgfact("French Guiana","MemberOf",["FZ","WCL"]). bgfact("French = Guiana","ExportCommodities",["shrimp","timber","rum","rosewood = essence"]). bgfact("French Guiana","ExportPartners",["France","Spain","US"]). bgfact("French Guiana","ImportCommodities",["food","producer = goods","petroleum"]). bgfact("French Guiana","ImportPartners",["France","Germany","US"]). bgfact("French Guiana","Industries",["construction","shrimp = processing","forestry products","rum","gold mining"]). bgfact("French = Guiana","Agriculture",["rice","corn","manioc","cocoa","bananas","livestoc= k - cattle","pigs","poultry"]). bgfact("French Polynesia","LandBounderies",[]). bgfact("French = Polynesia","NaturalResources",["timber","fish","cobalt"]). bgfact("French Polynesia","Population",["215129"]). bgfact("French Polynesia","Capital",["Papeete"]). bgfact("French = Polynesia","MemberOf",["ESCAP","FZ","ICFTU","SPC","WMO"]). bgfact("French Polynesia","ExportCommodities",["coconut = products","vanilla","shark meat"]). bgfact("French Polynesia","ExportPartners",["France","US","Japan"]). bgfact("French = Polynesia","ImportCommodities",["fuels","foodstuffs","equipment"]). bgfact("French = Polynesia","ImportPartners",["France","US","Australia","NZ"]). bgfact("French Polynesia","Industries",["tourism","pearls","agricultural = processing","handicrafts"]). bgfact("French Polynesia","Agriculture",["poultry","beef","dairy = products"]). bgfact("French Southern and Antarctic Lands","LandBounderies",[]). bgfact("French Southern and Antarctic = Lands","NaturalResources",["fish","crayfish"]). bgfact("French Southern and Antarctic Lands","Capital",["none; = administered from Paris, France"]). bgfact("Gabon","LandBounderies",["Cameroon","Congo","Equatorial = Guinea"]). bgfact("Gabon","NaturalResources",["petroleum","manganese","uranium","gol= d","timber","iron ore"]). bgfact("Gabon","Population",["1139006"]). bgfact("Gabon","Capital",["Libreville"]). bgfact("Gabon","MemberOf",["ACCT","ACP","AfDB","BDEAC","CCC","CEEAC","ECA= ","FAO","FZ","G-24","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA= ","IDB","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","= IOC","ITU","LORCS","NAM","OAU","OIC","OPEC","UDEAC","UN","UNCTAD","UNESCO= ","UNIDO","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Gabon","ExportCommodities",["crude","timber","manganese","uranium= "]). bgfact("Gabon","ExportPartners",["France","US","Germany","Japan"]). bgfact("Gabon","ImportCommodities",["foodstuffs","chemical = products","petroleum products","construction = materials","manubgfactures","machinery"]). bgfact("Gabon","ImportPartners",["France","African = countries","US","Japan"]). bgfact("Gabon","Industries",["petroleum","food and beverages","lumbering = and plywood","textiles","mining - = manganese","uranium","gold","cement"]). bgfact("Gabon","Agriculture",["accounts for of GDP is the most important = timber product"]). bgfact("The Gambia","LandBounderies",["Senegal"]). bgfact("The Gambia","NaturalResources",["fish"]). bgfact("The Gambia","Population",["959300"]). bgfact("The Gambia","Capital",["Banjul"]). bgfact("The = Gambia","MemberOf",["ACP","AfDB","C","CCC","ECA","ECOWAS","FAO","G-77","G= ATT","IBRD","ICAO","ICFTU","IDA","IDB","IFAD","IFC","IMF","IMO","INTELSAT= ","INTERPOL","IOC","ITU","LORCS","NAM","OAU","OIC","UN","UNCTAD","UNESCO"= ,"UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("The Gambia","ExportCommodities",["peanuts and peanut = products","fish","cotton lint","palm kernels"]). bgfact("The Gambia","ExportPartners",["Japan","Europe","Africa","US"]). bgfact("The = Gambia","ImportCommodities",["foodstuffs","manubgfactures","raw = materials","fuel","machinery and transport equipment"]). bgfact("The Gambia","ImportPartners",["Europe","Asia","USSR and Eastern = Europe","US"]). bgfact("The Gambia","Industries",["peanut = processing","tourism","beverages","agricultural machinery = assembly","woodworking","metalworking","clothing"]). bgfact("The = Gambia","Agriculture",["sorghum","rice","corn","cassava","livestock - = cattle","sheep","forestry and fishing resources not fully exploited"]). bgfact("Gaza Strip","LandBounderies",["Egypt","Israel"]). bgfact("Gaza Strip","NaturalResources",["negligible"]). bgfact("Gaza Strip","Population",["731296"]). bgfact("Gaza Strip","ExportCommodities",["citrus"]). bgfact("Gaza Strip","ExportPartners",["Israel","Egypt"]). bgfact("Gaza Strip","ImportCommodities",["food","consumer = goods","construction materials"]). bgfact("Gaza Strip","ImportPartners",["Israel","Egypt"]). bgfact("Gaza Strip","Industries",["generally small family businesses = that produce textiles","soap","olive-wood carvings","the Israelis have = established some small-scale modern Industries in an industrial = center"]). bgfact("Gaza Strip","Agriculture",["olives","vegetables","beef","dairy = products"]). bgfact("Georgia","LandBounderies",["Armenia","Azerbaijan","Russia","Turke= y"]). bgfact("Georgia","NaturalResources",["forest = lands","hydropower","manganese deposits","iron ores","copper","coastal = climate and soils allow for important tea and citrus growth"]). bgfact("Georgia","Population",["5681025"]). bgfact("Georgia","Capital",["T'bilisi"]). bgfact("Georgia","MemberOf",["BSEC","CIS","CSCE","EBRD","ECE","IBRD","IDA= ","ILO","IMF","IMO","INMARSAT","IOC","ITU","NACC","UN","UNCTAD","UNESCO",= "UNIDO","UPU","WHO"]). bgfact("Georgia","ExportCommodities",["citrus fruits","tea","wine","fuel = re-exports"]). bgfact("Georgia","ExportPartners",["Russia","Turkey","Armenia","Azerbaija= n"]). bgfact("Georgia","ImportCommodities",["fuel","machinery and = parts","transport equipment"]). bgfact("Georgia","ImportPartners",["Russia","Azerbaijan","Turkey"]). bgfact("Georgia","Industries",["heavy industrial products include raw = steel","rolled steel","machine tools","foundry equipment","electric = locomotives","tower cranes","electric welding equipment","machinery for = food preparation and meat packing","electric motors","process control = equipment","trucks","tractors","light industrial products","including = cloth","hosiery","the most important food industry is wine"]). bgfact("Georgia","Agriculture",["dependent on imports for grain","dairy = products","small livestock sector"]). bgfact("Germany","LandBounderies",["Austria","Belgium","Czech = Republic","Denmark","France","Luxembourg","Netherlands","Poland","Switzer= land"]). bgfact("Germany","NaturalResources",["iron = ore","coal","potash","timber","lignite","uranium","copper","natural = gas","salt","nickel"]). bgfact("Germany","Population",["81087506"]). bgfact("Germany","Capital",["Berlin"]). bgfact("Germany","MemberOf",["AfDB","AG","OECD","PCA","UN","UNCTAD","UNES= CO","UNIDO","UNHCR","UNOMIG","UNOSOM","UNTAC","UPU","WEU","WHO","WIPO","W= MO","WTO","ZC"]). bgfact("Germany","ExportCommodities",["manubgfactures"]). bgfact("Germany","ExportPartners",["EC"]). bgfact("Germany","ImportCommodities",["manubgfactures","agricultural = products","fuels","raw materials"]). bgfact("Germany","ImportPartners",["EC"]). bgfact("Germany","Industries",[]). bgfact("Germany","Agriculture",[]). bgfact("Ghana","LandBounderies",["Burkina","Cote d'Ivoire","Togo"]). bgfact("Ghana","NaturalResources",["gold","timber","industrial = diamonds","bauxite","manganese","fish","rubber"]). bgfact("Ghana","Population",["17225185"]). bgfact("Ghana","Capital",["Accra"]). bgfact("Ghana","MemberOf",["ACP","AfDB","C","CCC","ECA","ECOWAS","FAO","G= -24","G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO",= "IMF","IMO","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","MINURS= O","NAM","OAU","UN","UNCTAD","UNESCO","UNIDO","UNIFIL","UNIKOM","UNPROFOR= ","UNTAC","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Ghana","ExportCommodities",["cocoa","gold","timber","tuna","bauxi= te"]). bgfact("Ghana","ExportPartners",["Germany","US","UK","Netherlands","Japan= "]). bgfact("Ghana","ImportCommodities",["petroleum","consumer = goods","foods","intermediate goods","Capital equipment"]). bgfact("Ghana","ImportPartners",["UK","US","Germany","Japan"]). bgfact("Ghana","Industries",["mining","lumbering","light = manubgfacturing","aluminum","food processing"]). bgfact("Ghana","Agriculture",["coffee","cassava","peanuts","corn","shea = nuts","normally self-sufficient in food"]). bgfact("Gibraltar","LandBounderies",["Spain"]). bgfact("Gibraltar","NaturalResources",["negligible"]). bgfact("Gibraltar","Population",["31684"]). bgfact("Gibraltar","Capital",["Gilbraltar"]). bgfact("Gibraltar","MemberOf",["INTERPOL"]). bgfact("Gibraltar","ExportCommodities",["petroleum","manubgfactured = goods"]). bgfact("Gibraltar","ExportPartners",["UK","Morocco","Portugal","Netherlan= ds","Spain","US","FRG"]). bgfact("Gibraltar","ImportCommodities",["fuels","manubgfactured = goods"]). bgfact("Gibraltar","ImportPartners",["UK","Spain","Japan","Netherlands"])= . bgfact("Gibraltar","Industries",["tourism","banking and = finance","construction","light manubgfacturing of tobacco","roasted = coffee","ice","mineral waters","candy","beer"]). bgfact("Gibraltar","Agriculture",["none"]). bgfact("Glorioso Islands","LandBounderies",[]). bgfact("Glorioso Islands","NaturalResources",["guano","coconuts"]). bgfact("Glorioso Islands","Capital",["none; administered by France from = Reunion"]). bgfact("Greece","LandBounderies",["Albania","Bulgaria","Turkey","The = Former Yugoslav Republic of Macedonia"]). bgfact("Greece","NaturalResources",["bauxite","lignite","magnesite","petr= oleum","marble"]). bgfact("Greece","Population",["10564630"]). bgfact("Greece","Capital",["Athens"]). bgfact("Greece","MemberOf",["Australian = Group","BIS","BSEC","CCC","CE","CERN","COCOM","CSCE","EBRD","EC","ECE","E= IB","FAO","G-6","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IEA","IF= AD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM",= "ISO","ITU","LORCS","MINURSO","MTCR","NACC","NAM","WFTU","WHO","WIPO","WM= O","WTO","ZC"]). bgfact("Greece","ExportCommodities",["manubgfactured = goods","foodstuffs","fuels"]). bgfact("Greece","ExportPartners",["Germany","Italy","France","UK","US"]).= bgfact("Greece","ImportCommodities",["manubgfactured = goods","foodstuffs","fuels"]). bgfact("Greece","ImportPartners",["Germany","Italy","France","Netherlands= ","Japan"]). bgfact("Greece","Industries",["food and tobacco = processing","textiles","chemicals","metal = products","tourism","mining","petroleum"]). bgfact("Greece","Agriculture",["including fishing and = forestry","principal wheat","corn","barley","sugar = beets","olives","tomatoes","wine","tobacco","self-sufficient in food = except meat","dairy products"]). bgfact("Greenland","LandBounderies",[]). bgfact("Greenland","NaturalResources",["zinc","lead","iron = ore","coal","molybdenum","cryolite","uranium","fish"]). bgfact("Greenland","Population",["57040"]). bgfact("Greenland","Capital",["Nuuk"]). bgfact("Greenland","ExportCommodities",["fish and fish products"]). bgfact("Greenland","ExportPartners",["Denmark","Benelux","Germany"]). bgfact("Greenland","ImportCommodities",["manubgfactured = goods","machinery and transport equipment","food and live = animals","petroleum products"]). bgfact("Greenland","ImportPartners",["Denmark","Norway","US","Germany","J= apan","Sweden"]). bgfact("Greenland","Industries",["fish processing","lead and zinc = mining","handicrafts","some small shipyards","potential for platinum and = gold mining"]). bgfact("Greenland","Agriculture",["fish catch of"]). bgfact("Grenada","LandBounderies",[]). bgfact("Grenada","NaturalResources",["timber","tropical = fruit","deepwater harbors"]). bgfact("Grenada","Population",["94109"]). bgfact("Grenada","Capital",["Saint George's"]). bgfact("Grenada","MemberOf",["ACP","C","CARICOM","CDB","ECLAC","FAO","G-7= 7","GATT","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","INTERPOL"= ,"IOC","ITU","LAES","LORCS","NAM","OAS","OECS","OPANAL","UN","UNCTAD","UN= ESCO","UNIDO","UPU","WCL","WHO","WTO"]). bgfact("Grenada","ExportCommodities",["bananas","cocoa","nutmeg","fruit = and vegetables","clothing","mace"]). bgfact("Grenada","ExportPartners",["Netherlands","UK","Trinidad and = Tobago","United States"]). bgfact("Grenada","ImportCommodities",["food","manubgfactured = goods","machinery","chemicals","fuel"]). bgfact("Grenada","ImportPartners",["US","UK","Trinidad and = Tobago","Japan","Canada"]). bgfact("Grenada","Industries",["food and beverage","textile","light = assembly operations","tourism","construction"]). bgfact("Grenada","Agriculture",["bananas","cocoa","nutmeg","small-size = farms predominate","growing a variety of citrus = fruits","avocados","root crops","sugarcane","corn"]). bgfact("Guadeloupe","LandBounderies",[]). bgfact("Guadeloupe","NaturalResources",["cultivable land","beaches and = climate that foster tourism"]). bgfact("Guadeloupe","Population",["428947"]). bgfact("Guadeloupe","Capital",["Basse-Terre"]). bgfact("Guadeloupe","MemberOf",["FZ","WCL","WFTU"]). bgfact("Guadeloupe","ExportCommodities",["bananas","sugar","rum"]). bgfact("Guadeloupe","ExportPartners",["France","Martinique"]). bgfact("Guadeloupe","ImportCommodities",["vehicles","foodstuffs","constru= ction materials","petroleum products"]). bgfact("Guadeloupe","ImportPartners",["France","Italy","FRG","US"]). bgfact("Guadeloupe","Industries",["construction","cement","rum","sugar","= tourism"]). bgfact("Guadeloupe","Agriculture",["bananas","livestock - = cattle","pigs","not self-sufficient in food"]). bgfact("Guam","LandBounderies",[]). bgfact("Guam","NaturalResources",["fishing"]). bgfact("Guam","Population",["149620"]). bgfact("Guam","Capital",["Agana"]). bgfact("Guam","MemberOf",["ESCAP","IOC","SPC"]). bgfact("Guam","ExportCommodities",["mostly transshipments of refined = petroleum products","construction materials","fish","food and beverage = products"]). bgfact("Guam","ExportPartners",["US","Trust Territory of the Pacific = Islands"]). bgfact("Guam","ImportCommodities",["petroleum and petroleum = products","food","manubgfactured goods"]). bgfact("Guam","ImportPartners",["US","Japan"]). bgfact("Guam","Industries",["US = military","tourism","construction","transshipment services","concrete = products","printing and publishing","food processing","textiles"]). bgfact("Guam","Agriculture",["fruits","vegetables","eggs","pork","poultry= ","beef","copra"]). bgfact("Guatemala","LandBounderies",["Belize","El = Salvador","Honduras","Mexico"]). bgfact("Guatemala","NaturalResources",["petroleum","nickel","rare = woods","fish","chicle"]). bgfact("Guatemala","Population",["10721387"]). bgfact("Guatemala","Capital",["Guatemala"]). bgfact("Guatemala","MemberOf",["BCIE","CACM","CCC","ECLAC","FAO","G-24","= G-77","GATT","IADB","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO"= ,"IMF","IMO","INTELSAT","INTERPOL","IOC","IOM","ITU","LAES","LAIA","LORCS= ","NAM","OAS","OPANAL","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","= WFTU","WHO","WIPO","WMO"]). bgfact("Guatemala","ExportCommodities",["coffee","sugar","bananas","carda= mon","beef"]). bgfact("Guatemala","ExportPartners",["US","El Salvador","Costa = Rica","Germany","Honduras"]). bgfact("Guatemala","ImportCommodities",["fuel and petroleum = products","machinery","grain","fertilizers","motor vehicles"]). bgfact("Guatemala","ImportPartners",["US","Mexico","Venezuela","Japan","G= ermany"]). bgfact("Guatemala","Industries",["sugar","textiles and = clothing","furniture","chemicals","petroleum","metals","rubber","tourism"= ]). bgfact("Guatemala","Agriculture",["principal = sugarcane","corn","bananas","coffee","beans","livestock - = cattle","sheep","pigs","food importer"]). bgfact("Guernsey","LandBounderies",[]). bgfact("Guernsey","NaturalResources",["cropland"]). bgfact("Guernsey","Population",["63719"]). bgfact("Guernsey","Capital",["Saint Peter Port"]). bgfact("Guernsey","MemberOf",["none"]). bgfact("Guernsey","ExportCommodities",["tomatoes","flowers and = ferns","sweet peppers","eggplant"]). bgfact("Guernsey","ExportPartners",["UK"]). bgfact("Guernsey","ImportCommodities",["coal","gasoline"]). bgfact("Guernsey","ImportPartners",["UK"]). bgfact("Guernsey","Industries",["tourism","banking"]). bgfact("Guernsey","Agriculture",["tomatoes","flowers","sweet = peppers","eggplant","Guernsey cattle"]). bgfact("Guinea","LandBounderies",["Guinea-Bissau","Cote = d'Ivoire","Liberia","Mali","Senegal","Sierra Leone"]). bgfact("Guinea","NaturalResources",["bauxite","iron = ore","diamonds","gold","uranium","hydropower","fish"]). bgfact("Guinea","Population",["6391536"]). bgfact("Guinea","Capital",["Conakry"]). bgfact("Guinea","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOWA= S","FAO","G-77","IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","IMO",= "INTELSAT","INTERPOL","IOC","ITU","LORCS","MINURSO","NAM","OAU","OIC","UN= ","UNCTAD","UNESCO","UNIDO","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Guinea","ExportCommodities",["bauxite","alumina","diamonds","gold= ","coffee","pineapples","bananas","palm kernels"]). bgfact("Guinea","ExportPartners",["US","Belgium","Ireland","Spain"]). bgfact("Guinea","ImportCommodities",["petroleum = products","metals","machinery","transport = equipment","foodstuffs","textiles"]). bgfact("Guinea","ImportPartners",["France","Cote d'Ivoire","Hong = Kong","Germany"]). bgfact("Guinea","Industries",["bauxite mining","alumina","gold","diamond = mining","light manubgfacturing and agricultural processing = Industries"]). bgfact("Guinea","Agriculture",["principal = rice","coffee","pineapples","palm kernels","cassava","bananas","sweet = potatoes","livestock - cattle","not self-sufficient in food grains"]). bgfact("Guinea-Bissau","LandBounderies",["Guinea","Senegal"]). bgfact("Guinea-Bissau","NaturalResources",["unexploited deposits of = petroleum","bauxite","phosphates","fish","timber"]). bgfact("Guinea-Bissau","Population",["1098231"]). bgfact("Guinea-Bissau","Capital",["Bissau"]). bgfact("Guinea-Bissau","MemberOf",["ACCT","ITU","LORCS","NAM","OAU","OIC"= ,"UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNOMOZ","UPU","WFTU","WHO","WIPO","WMO","W= TO"]). bgfact("Guinea-Bissau","ExportCommodities",["cashews","fish","peanuts","p= alm kernels"]). bgfact("Guinea-Bissau","ExportPartners",["Portugal","Spain","Senegal","In= dia","Nigeria"]). bgfact("Guinea-Bissau","ImportCommodities",["foodstuffs","transport = equipment","petroleum products","machinery and equipment"]). bgfact("Guinea-Bissau","ImportPartners",["Portugal","Netherlands","China"= ,"Germany","Senegal"]). bgfact("Guinea-Bissau","Industries",["agricultural = processing","beer","soft drinks"]). bgfact("Guinea-Bissau","Agriculture",["accounts for over of GDP","nearly = of exports","beans","cassava","cashew nuts","peanuts","palm = kernels","fishing and forestry potential not fully exploited"]). bgfact("Guyana","LandBounderies",["Brazil","Suriname","Venezuela"]). bgfact("Guyana","NaturalResources",["bauxite","gold","diamonds","hardwood= timber","shrimp","fish"]). bgfact("Guyana","Population",["729425"]). bgfact("Guyana","Capital",["Georgetown"]). bgfact("Guyana","MemberOf",["ACP","C","CARICOM","CCC","CDB","ECLAC","FAO"= ,"G-77","GATT","IADB","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF= ","IMO","INTELSAT","INTERPOL","IOC","ITU","LAES","LORCS","NAM","OAS","ONU= SAL","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WMO"]). bgfact("Guyana","ExportCommodities",["sugar","bauxite/alumina","rice","sh= rimp","molasses"]). bgfact("Guyana","ExportPartners",["UK","US","Canada","France","Japan"]). bgfact("Guyana","ImportCommodities",["manubgfactures","machinery","petrol= eum","food"]). bgfact("Guyana","ImportPartners",["US","Trinidad and = Tobago","UK","Italy","Japan"]). bgfact("Guyana","Industries",["bauxite mining","sugar","rice = milling","timber","fishing","textiles","gold mining"]). bgfact("Guyana","Agriculture",["most important sector","not = self-sufficient in food","especially wheat","vegetable oils"]). bgfact("Haiti","LandBounderies",["Dominican Republic"]). bgfact("Haiti","NaturalResources",["bauxite"]). bgfact("Haiti","Population",["6491450"]). bgfact("Haiti","Capital",["Port-au-Prince"]). bgfact("Haiti","MemberOf",["ACCT","ACP","CARICOM","CCC","ECLAC","FAO","G-= 77","GATT","IADB","IAEA","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","IM= O","INTELSAT","INTERPOL","IOC","ITU","LAES","LORCS","OAS","OPANAL","PCA",= "UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO= "]). bgfact("Haiti","ExportCommodities",["light manubgfactures","coffee"]). bgfact("Haiti","ExportPartners",["US","Italy","France","less developed = countries"]). bgfact("Haiti","ImportCommodities",["machines and manubgfactures","food = and beverages","petroleum products","chemicals","fats and oils"]). bgfact("Haiti","ImportPartners",["US","Netherlands = Antilles","Japan","France","Canada","Germany"]). bgfact("Haiti","Industries",["sugar refining","textiles","flour = milling","cement manubgfacturing","tourism","light assembly Industries = based on imported parts"]). bgfact("Haiti","Agriculture",["commercial = coffee","mangoes","sugarcane","staple rice","corn","shortage of wheat = flour"]). bgfact("Heard Island and McDonald Islands","LandBounderies",[]). bgfact("Heard Island and McDonald Islands","NaturalResources",["none"]). bgfact("Heard Island and McDonald Islands","Capital",["none; = administered from Canberra, Australia"]). bgfact("Holy See (Vatican City)","LandBounderies",["Italy"]). bgfact("Holy See (Vatican City)","NaturalResources",["none"]). bgfact("Holy See (Vatican City)","Population",["821"]). bgfact("Holy See (Vatican City)","Capital",["Vatican City"]). bgfact("Holy See (Vatican = City)","MemberOf",["CSCE","IAEA","ICFTU","IMF"]). bgfact("Holy See (Vatican City)","Industries",["worldwide banking and = financial activities"]). bgfact("Honduras","LandBounderies",["Guatemala","El = Salvador","Nicaragua"]). bgfact("Honduras","NaturalResources",["timber","gold","silver","copper","= lead","zinc","iron ore","antimony","coal","fish"]). bgfact("Honduras","Population",["5314794"]). bgfact("Honduras","Capital",["Tegucigalpa"]). bgfact("Honduras","MemberOf",["BCIE","CACM","ECLAC","FAO","G-77","GATT","= IADB","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSA= T","INTERPOL","IOC","IOM","ITU","LAES","LAIA","LORCS","MINURSO","OAS","OP= ANAL","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO= ","WMO"]). bgfact("Honduras","ExportCommodities",["bananas","coffee","shrimp","lobst= er","minerals","meat","lumber"]). bgfact("Honduras","ExportPartners",["US","Germany","Belgium","UK"]). bgfact("Honduras","ImportCommodities",["machinery and transport = equipment","chemical products","manubgfactured goods","fuel and = oil","foodstuffs"]). bgfact("Honduras","ImportPartners",["US","Mexico","Guatemala"]). bgfact("Honduras","Industries",["agricultural = processing","textiles","clothing","wood products"]). bgfact("Honduras","Agriculture",["most important sector","accounting for = more than of GDP","more than of the labor force","principal products = include bananas","coffee","timber","beef","citrus fruit","importer of = wheat"]). bgfact("Hong Kong","LandBounderies",["China"]). bgfact("Hong Kong","NaturalResources",["outstanding deepwater = harbor","feldspar"]). bgfact("Hong Kong","Population",["5548754"]). bgfact("Hong Kong","Capital",["Victoria"]). bgfact("Hong Kong","MemberOf",["COCOM","WCL","WMO"]). bgfact("Hong Kong","ExportCommodities",["clothing","textiles","yarn and = fabric","footwear","electrical appliances","watches and = clocks","toys"]). bgfact("Hong = Kong","ExportPartners",["China","US","Germany","Japan","UK"]). bgfact("Hong Kong","ImportCommodities",["foodstuffs","transport = equipment","raw materials","semimanubgfactures","petroleum"]). bgfact("Hong Kong","ImportPartners",["China","Japan","Taiwan","US"]). bgfact("Hong = Kong","Industries",["textiles","clothing","tourism","electronics","plasti= cs","toys","watches","clocks"]). bgfact("Hong Kong","Agriculture",["local farmers produce fresh = vegetables","of land area suitable for farming"]). bgfact("Howland Island","LandBounderies",[]). bgfact("Howland Island","NaturalResources",["guano"]). bgfact("Howland Island","Population",["1942"]). bgfact("Howland Island","Capital",["none; administered from Washington, = DC"]). bgfact("Hungary","LandBounderies",["Austria","Croatia","Romania","Serbia = and Montenegro","Slovakia","Slovenia","Ukraine"]). bgfact("Hungary","NaturalResources",["bauxite","coal","natural = gas","fertile soils"]). bgfact("Hungary","Population",["10319113"]). bgfact("Hungary","Capital",["Budapest"]). bgfact("Hungary","MemberOf",["Australian = Group","BIS","CCC","CE","CEI","CERN","COCOM","PCA","UN","UNAVEM = II","UNCTAD","UNESCO","UNHCR","UNIDO","UNIKOM","UNOMOZ","UNOMUR","UNOSOM"= ,"UNTAC","UPU","WFTU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Hungary","ExportCommodities",["raw materials","semi-finished = goods","chemicals","machinery","consumer goods","food and = Agriculture","fuels and energy"]). bgfact("Hungary","ExportPartners",["EC"]). bgfact("Hungary","ImportCommodities",["fuels and energy","raw = materials","semi-finished goods","chemicals","machinery","consumer = goods","food and Agriculture"]). bgfact("Hungary","ImportPartners",["EC","Austria","the FSU","Eastern = Europe"]). bgfact("Hungary","Industries",["mining","metallurgy","construction = materials","processed = foods","textiles","chemicals","buses","automobiles"]). bgfact("Hungary","Agriculture",["including forestry","principal = wheat","corn","sunflowers","potatoes","livestock - = hogs","cattle","poultry","self-sufficient in food output"]). bgfact("Iceland","LandBounderies",[]). bgfact("Iceland","NaturalResources",["fish","hydropower","diatomite"]). bgfact("Iceland","Population",["263599"]). bgfact("Iceland","Capital",["Reykjavik"]). bgfact("Iceland","MemberOf",["Australian = Group","BIS","CCC","CE","CSCE","EBRD","ECE","EFTA","FAO","GATT","IAEA","I= BRD","ICAO","ICC","ICFTU","IDA","IFC","ILO","IMF","IMO","INMARSAT","INTEL= SAT","INTERPOL","IOC","ISO","ITU","LORCS","MTCR","NACC","NATO","NC","NEA"= ,"NIB","OECD","PCA","UN","UNCTAD","UNESCO","UPU","WEU","WHO","WIPO","WMO"= ]). bgfact("Iceland","ExportCommodities",["fish and fish products","animal = products","aluminum","ferrosilicon","diatomite"]). bgfact("Iceland","ExportPartners",["EC"]). bgfact("Iceland","ImportCommodities",["machinery and transportation = equipment","petroleum products","foodstuffs","textiles"]). bgfact("Iceland","ImportPartners",["EC"]). bgfact("Iceland","Industries",["fish processing","aluminum = smelting","ferro-silicon production"]). bgfact("Iceland","Agriculture",["fishing is most important economic = activity","principal crops - potatoes","livestock - cattle","fish catch = of about million metric tons in"]). bgfact("India","LandBounderies",["Bangladesh","Bhutan","Burma","China","N= epal","Pakistan"]). bgfact("India","NaturalResources",["coal","iron = ore","manganese","mica","bauxite","titanium ore","chromite","natural = gas","diamonds","petroleum","limestone"]). bgfact("India","Population",["919903056"]). bgfact("India","Capital",["New Delhi"]). bgfact("India","MemberOf",["AG","ONUSAL","PCA","SAARC","UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNIKOM","UNOMOZ","UNOSOM","UNPROFOR","UNTA= C","UPU","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("India","ExportCommodities",["gems and = jewelry","clothing","engineering goods","chemicals","leather = manubgfactures","cotton yarn"]). bgfact("India","ExportPartners",["US","Germany","Italy"]). bgfact("India","ImportCommodities",["crude and petroleum = products","gems","fertilizer","chemicals","machinery"]). bgfact("India","ImportPartners",["US","Belgium","Germany"]). bgfact("India","Industries",["textiles","chemicals","food = processing","steel","transportation = equipment","cement","mining","petroleum","machinery"]). bgfact("India","Agriculture",["principal = rice","wheat","oilseeds","cotton","jute","tea","sugarcane","livestock - = cattle","buffaloes","sheep","goats","fish catch of about million metric = tons ranks India among the world's top fishing nations"]). bgfact("Indian Ocean","NaturalResources",["oil and gas = fields","fish","shrimp","sand and gravel aggregates","placer = deposits","polymetallic nodules"]). bgfact("Indian Ocean","Industries",["based on exploitation of natural = resources","particularly fish","minerals","oil and gas","fishing","sand = and gravel"]). bgfact("Indonesia","LandBounderies",["Malaysia","Papua New Guinea"]). bgfact("Indonesia","NaturalResources",["petroleum","tin","natural = gas","nickel","timber","bauxite","copper","fertile = soils","coal","gold","silver"]). bgfact("Indonesia","Population",["200409741"]). bgfact("Indonesia","Capital",["Jakarta"]). bgfact("Indonesia","MemberOf",["APEC","AsDB","ASEAN","CCC","CP","ESCAP","= FAO","G-15","G-19","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA"= ,"IDB","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","I= OC","IOM","ISO","ITU","LORCS","NAM","OIC","OPEC","UN","UNCTAD","UNESCO","= UNIDO","UNIKOM","UNOSOM","UNTAC","UPU","WCL","WFTU","WHO","WIPO","WMO","W= TO"]). bgfact("Indonesia","ExportCommodities",["petroleum and gas","clothing = and fabrics","plywood","footwear"]). bgfact("Indonesia","ExportPartners",["Japan","US","Singapore","South = Korea"]). bgfact("Indonesia","ImportCommodities",["machinery","semi-finished = goods","chemicals","raw materials","transport equipment","food = stuffs","petroleum products","consumer goods"]). bgfact("Indonesia","ImportPartners",["Japan","US","Germany","South = Korea","Singapore","Australia","Taiwan"]). bgfact("Indonesia","Industries",["petroleum and natural = gas","textiles","mining","cement","chemical = fertilizers","plywood","food","rubber"]). bgfact("Indonesia","Agriculture",["main products are = rice","cassava","peanuts","rubber","cocoa","coffee","palm = oil","copra","poultry","beef","pork","eggs"]). bgfact("Iran","LandBounderies",["Afghanistan","Armenia","Azerbaijan","Ira= q","Pakistan","Turkey","Turkmenistan"]). bgfact("Iran","NaturalResources",["petroleum","natural = gas","coal","chromium","copper","iron = ore","lead","manganese","zinc","sulfur"]). bgfact("Iran","Population",["65615474"]). bgfact("Iran","Capital",["Tehran"]). bgfact("Iran","MemberOf",["CCC","CP","ESCAP","ECO","FAO","G-19","G-24","G= -77","IAEA","IBRD","ICAO","ICC","IDA","IDB","IFAD","IFC","ILO","IMF","IMO= ","INMARSAT","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM","OIC",= "OPEC","PCA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WCL","WFTU","W= HO","WIPO","WMO","WTO"]). bgfact("Iran","ExportCommodities",["petroleum","carpets","fruits","nuts",= "hides"]). bgfact("Iran","ExportPartners",["Japan","Italy","France","Netherlands","B= elgium/Luxembourg","Spain"]). bgfact("Iran","ImportCommodities",["machinery","military = supplies","metal works","foodstuffs","pharmaceuticals","technical = services","refined oil products"]). bgfact("Iran","ImportPartners",["Germany","Japan","Italy","UK","France"])= . bgfact("Iran","Industries",["petroleum","petrochemicals","textiles","food= processing","metal fabricating"]). bgfact("Iran","Agriculture",["principal wheat","rice","sugar = beets","fruits","nuts","cotton","dairy products","wool","not = self-sufficient in food"]). bgfact("Iraq","LandBounderies",["Iran","Jordan","Kuwait","Saudi = Arabia","Syria","Turkey"]). bgfact("Iraq","NaturalResources",["petroleum","natural = gas","phosphates","sulfur"]). bgfact("Iraq","Population",["19889666"]). bgfact("Iraq","Capital",["Baghdad"]). bgfact("Iraq","MemberOf",["ABEDA","ACC","AFESD","AL","AMF","CAEU","CCC","= ESCWA","FAO","G-19","G-77","IAEA","IBRD","ICAO","IDA","IDB","IFAD","IFC",= "ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","ISO","ITU","LOR= CS","NAM","OAPEC","OIC","OPEC","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU"= ,"WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Iraq","ExportCommodities",["crude and refined = products","fertilizer","sulfur"]). bgfact("Iraq","ExportPartners",["US","Brazil","Turkey","Japan","Netherlan= ds","Spain"]). bgfact("Iraq","ImportCommodities",["manubgfactures","food"]). bgfact("Iraq","ImportPartners",["Germany","US","Turkey","France","UK"]). bgfact("Iraq","Industries",["petroleum production and = refining","chemicals","textiles","construction materials","food = processing"]). bgfact("Iraq","Agriculture",["principal = wheat","barley","rice","vegetables","dates","cotton","livestock - = cattle","not self-sufficient in food output"]). bgfact("Ireland","LandBounderies",["UK"]). bgfact("Ireland","NaturalResources",["zinc","lead","natural = gas","petroleum","barite","copper","gypsum","limestone","dolomite","peat"= ,"silver"]). bgfact("Ireland","Population",["3539296"]). bgfact("Ireland","Capital",["Dublin"]). bgfact("Ireland","MemberOf",["Australian = Group","BIS","CCC","CE","COCOM","WHO","WIPO","WMO","ZC"]). bgfact("Ireland","ExportCommodities",["chemicals","data processing = equipment","industrial machinery","live animals","animal products"]). bgfact("Ireland","ExportPartners",["EC","US"]). bgfact("Ireland","ImportCommodities",["food","animal feed","data = processing equipment","petroleum and petroleum = products","machinery","textiles","clothing"]). bgfact("Ireland","ImportPartners",["EC","US"]). bgfact("Ireland","Industries",["food = products","brewing","textiles","clothing","chemicals","pharmaceuticals","= machinery","transportation equipment","glass and crystal"]). bgfact("Ireland","Agriculture",["principal = turnips","barley","potatoes","sugar beets","food shortages include = bread grain","fruits","vegetables"]). bgfact("Israel","LandBounderies",["Egypt","Gaza = Strip","Jordan","Lebanon","Syria","West Bank"]). bgfact("Israel","NaturalResources",["copper","phosphates","bromide","pota= sh","clay","sand","sulfur","asphalt","manganese","small amounts of = natural gas and crude"]). bgfact("Israel","Population",["5050850"]). bgfact("Israel","Capital",["Jerusalem"]). bgfact("Israel","MemberOf",["AG","PCA","UN","UNCTAD","UNESCO","UNHCR","UN= IDO","UPU","WHO","WIPO","WMO","WTO"]). bgfact("Israel","ExportCommodities",["machinery and equipment","cut = diamonds","chemicals","textiles and apparel","agricultural = products","metals"]). bgfact("Israel","ExportPartners",["US","EC","Japan"]). bgfact("Israel","ImportCommodities",["military equipment","investment = goods","rough diamonds","oil","consumer goods"]). bgfact("Israel","ImportPartners",["US","EC"]). bgfact("Israel","Industries",["food processing","diamond cutting and = polishing","textiles and apparel","chemicals","metal products","military = equipment","transport equipment","electrical equipment","miscellaneous = machinery","potash mining","high-technology electronics","tourism"]). bgfact("Israel","Agriculture",["largely self-sufficient in food = production","vegetables","livestock beef","dairy","poultry"]). bgfact("Italy","LandBounderies",["Austria","France","Holy See","San = Marino","Slovenia","Switzerland"]). bgfact("Italy","NaturalResources",["mercury","potash","marble","sulfur","= dwindling natural gas and crude reserves","fish","coal"]). bgfact("Italy","Population",["58138394"]). bgfact("Italy","Capital",["Rome"]). bgfact("Italy","MemberOf",["AfDB","AG","OECD","ONUSAL","PCA","UN","UNCTAD= ","UNESCO","UNHCR","UNIDO","UNIFIL","UNIKOM","UNMOGIP","UNOSOM","UNTAC","= UNTSO","UPU","WCL","WEU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Italy","ExportCommodities",["metals","textiles and = clothing","production machinery","motor vehicles","transportation = equipment","chemicals"]). bgfact("Italy","ExportPartners",["EC","US","OPEC"]). bgfact("Italy","ImportCommodities",["industrial = machinery","chemicals","transport = equipment","petroleum","metals","food","agricultural products"]). bgfact("Italy","ImportPartners",["EC","OPEC","US"]). bgfact("Italy","Industries",["machinery","iron and = steel","chemicals","food processing","textiles","motor = vehicles","clothing","footwear","ceramics"]). bgfact("Italy","Agriculture",["dairy products","principal = fruits","vegetables","grapes","potatoes","sugar = beets","soybeans","grain","fish catch of"]). bgfact("Jamaica","LandBounderies",[]). bgfact("Jamaica","NaturalResources",["bauxite","gypsum","limestone"]). bgfact("Jamaica","Population",["2555064"]). bgfact("Jamaica","Capital",["Kingston"]). bgfact("Jamaica","MemberOf",["ACP","C","CARICOM","CCC","CDB","ECLAC","FAO= ","G-19","G-77","GATT","G-15","IADB","IAEA","IBRD","ICAO","ICFTU","IFAD",= "IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LAES","L= ORCS","NAM","OAS","OPANAL","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WF= TU","WHO","WIPO","WMO","WTO"]). bgfact("Jamaica","ExportCommodities",["alumina","bauxite","sugar","banana= s","rum"]). bgfact("Jamaica","ExportPartners",["US","UK","Germany","Canada","Norway"]= ). bgfact("Jamaica","ImportCommodities",["fuel","construction = materials","food","transport equipment"]). bgfact("Jamaica","ImportPartners",["US","UK","Venezuela","Germany","Japan= "]). bgfact("Jamaica","Industries",["tourism","bauxite = mining","textiles","food processing","light manubgfactures"]). bgfact("Jamaica","Agriculture",["accounts for about of GDP","of work = force","commercial = sugarcane","bananas","coffee","citrus","potatoes","livestock and = livestock products include poultry","goats","not self-sufficient in = grain","meat"]). bgfact("Jan Mayen","LandBounderies",[]). bgfact("Jan Mayen","NaturalResources",["none"]). bgfact("Jan Mayen","Capital",["none"]). bgfact("Japan","LandBounderies",[]). bgfact("Japan","NaturalResources",["negligible mineral = resources","fish"]). bgfact("Japan","Population",["125106937"]). bgfact("Japan","Capital",["Tokyo"]). bgfact("Japan","MemberOf",["AfDB","AG","OECD","PCA","UN","UNCTAD","UNESCO= ","UNHCR","UNIDO","UNRWA","UNTAC","UPU","WFTU","WHO","WIPO","WMO","WTO","= ZC"]). bgfact("Japan","ExportCommodities",["manubgfactures"]). bgfact("Japan","ExportPartners",["Southeast Asia","US","Western = Europe","China"]). bgfact("Japan","ImportCommodities",["manubgfactures","fossil = fuels","foodstuffs and raw materials"]). bgfact("Japan","ImportPartners",["Southeast Asia","US","Western = Europe","China"]). bgfact("Japan","Industries",["steel and non-ferrous metallurgy","heavy = electrical equipment","construction and mining equipment","motor = vehicles and parts","electronic and telecommunication equipment and = components","machine tools and automated production = systems","locomotives and railroad rolling = stock","shipbuilding","chemicals","textiles","food processing"]). bgfact("Japan","Agriculture",["highly subsidized and protected = sector","principal rice","sugar beets","vegetables","animal products = include pork","poultry","shortages of wheat","corn","world's largest = fish catch of million metric tons in"]). bgfact("Jarvis Island","LandBounderies",[]). bgfact("Jarvis Island","NaturalResources",["guano"]). bgfact("Jarvis Island","Capital",["none; administered from Washington, = DC"]). bgfact("Jersey","LandBounderies",[]). bgfact("Jersey","NaturalResources",["agricultural land"]). bgfact("Jersey","Population",["86048"]). bgfact("Jersey","Capital",["Saint Helier"]). bgfact("Jersey","MemberOf",["none"]). bgfact("Jersey","ExportCommodities",["light industrial and electrical = goods","foodstuffs","textiles"]). bgfact("Jersey","ExportPartners",["UK"]). bgfact("Jersey","ImportCommodities",["machinery and transport = equipment","manubgfactured goods","foodstuffs","mineral = fuels","chemicals"]). bgfact("Jersey","ImportPartners",["UK"]). bgfact("Jersey","Industries",["tourism","banking and finance","dairy"]). bgfact("Jersey","Agriculture",["potatoes","cauliflowers","dairy and = cattle farming"]). bgfact("Johnston Atoll","LandBounderies",[]). bgfact("Johnston Atoll","NaturalResources",["guano"]). bgfact("Johnston Atoll","Population",["327"]). bgfact("Johnston Atoll","Capital",["none; administered from Washington, = DC"]). bgfact("Jordan","LandBounderies",["Iraq","Israel","Saudi = Arabia","Syria","West Bank"]). bgfact("Jordan","NaturalResources",["phosphates","potash","shale oil"]). bgfact("Jordan","Population",["3961194"]). bgfact("Jordan","Capital",["Amman"]). bgfact("Jordan","MemberOf",["ABEDA","ACC","AFESD","AL","AMF","CAEU","CCC"= ,"ESCWA","FAO","G-77","IAEA","IBRD","ICAO","ICC","IDA","IDB","IFAD","IFC"= ,"ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","IOM","ITU","LORCS","NAM",= "OIC","PCA","UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNOSOM","UNRWA","UNPROFOR","UNTAC","UPU","= WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Jordan","ExportCommodities",["phosphates","fertilizers","potash",= "agricultural products","manubgfactures"]). bgfact("Jordan","ExportPartners",["India","Iraq","Saudi = Arabia","EC","Indonesia","UAE"]). bgfact("Jordan","ImportCommodities",["crude","machinery","transport = equipment","food","live animals","manubgfactured goods"]). bgfact("Jordan","ImportPartners",["EC","US","Iraq","Japan","Turkey"]). bgfact("Jordan","Industries",["phosphate mining","petroleum = refining","cement","potash","light manubgfacturing"]). bgfact("Jordan","Agriculture",["principal products are = wheat","barley","citrus fruit","tomatoes","melons","livestock - = sheep","goats","large net importer of food"]). bgfact("Juan de Nova Island","LandBounderies",[]). bgfact("Juan de Nova Island","NaturalResources",[]). bgfact("Juan de Nova Island","Capital",["none; administered by France = >from Reunion"]). bgfact("Kazakhstan","LandBounderies",["China","Kyrgyzstan","Russia","Turk= menistan","Uzbekistan"]). bgfact("Kazakhstan","NaturalResources",["major deposits of = petroleum","coal","iron ore","manganese","chrome = ore","nickel","cobalt","copper","molybdenum","lead","zinc","bauxite","gol= d","uranium"]). bgfact("Kazakhstan","Population",["17267554"]). bgfact("Kazakhstan","Capital",["Almaty"]). bgfact("Kazakhstan","MemberOf",["CCC","CIS","CSCE","EBRD","ECO","ESCAP","= IBRD","ICAO","IDA","IFC","ILO","IMF","INTELSAT","UN","UNCTAD","UNESCO","U= PU","WHO","WMO"]). bgfact("Kazakhstan","ExportCommodities",["oil","ferrous and nonferrous = metals","chemicals","grain","wool","meat"]). bgfact("Kazakhstan","ExportPartners",["Russia","Ukraine","Uzbekistan"]). bgfact("Kazakhstan","ImportCommodities",["machinery and = parts","industrial materials","oil and gas"]). bgfact("Kazakhstan","ImportPartners",["China"]). bgfact("Kazakhstan","Industries",["extractive Industries","iron and = steel","nonferrous metal","electric motors","construction materials"]). bgfact("Kazakhstan","Agriculture",["grain","meat","cotton","wool"]). bgfact("Kenya","LandBounderies",["Ethiopia","Somalia","Sudan","Tanzania",= "Uganda"]). bgfact("Kenya","NaturalResources",["gold","limestone","soda ash","salt = barytes","rubies","fluorspar","garnets","wildlife"]). bgfact("Kenya","Population",["28240658"]). bgfact("Kenya","Capital",["Nairobi"]). bgfact("Kenya","MemberOf",["ACP","AfDB","C","CCC","EADB","ECA","FAO","G-7= 7","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","IGADD","ILO","= IMF","IMO","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","MINURSO= ","NAM","OAU","UN","UNCTAD","UNESCO","UNIDO","UNIKOM","UNPROFOR","UNTAC",= "UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Kenya","ExportCommodities",["tea","coffee","petroleum = products"]). bgfact("Kenya","ExportPartners",["EC","Africa","Asia","US","Middle = East"]). bgfact("Kenya","ImportCommodities",["machinery and transportation = equipment","petroleum and petroleum products","iron and steel","raw = materials","food and consumer goods"]). bgfact("Kenya","ImportPartners",["EC","Asia","Middle East","US"]). bgfact("Kenya","Industries",["small-scale consumer goods","agricultural = processing","oil refining","cement","tourism"]). bgfact("Kenya","Agriculture",["most important = sector","coffee","tea","sisal","food = corn","wheat","sugarcane","fruit","vegetables","dairy = products","beef","pork","poultry","food output not keeping pace with = Population growth"]). bgfact("Kingman Reef","LandBounderies",[]). bgfact("Kingman Reef","NaturalResources",["none"]). bgfact("Kingman Reef","Capital",["none; administered from Washington, = DC"]). bgfact("Kiribati","LandBounderies",[]). bgfact("Kiribati","NaturalResources",["phosphate"]). bgfact("Kiribati","Population",["77853"]). bgfact("Kiribati","Capital",["Tarawa"]). bgfact("Kiribati","MemberOf",["ACP","AsDB","C","ESCAP","IBRD","ICAO","ICF= TU","IDA","IFC","IMF","INTELSAT","INTERPOL","ITU","SPARTECA","SPC","SPF",= "UNESCO","UPU","WHO"]). bgfact("Kiribati","ExportCommodities",["copra","seaweed","fish"]). bgfact("Kiribati","ExportPartners",["Denmark","Fiji","US"]). bgfact("Kiribati","ImportCommodities",["foodstuffs","machinery and = equipment","miscellaneous manubgfactured goods","fuel"]). bgfact("Kiribati","ImportPartners",["Australia","Japan","Fiji","NZ","US"]= ). bgfact("Kiribati","Industries",["fishing","handicrafts"]). bgfact("Kiribati","Agriculture",["food taro","breadfruit","sweet = potatoes","not self-sufficient in food"]). bgfact("Korea, North","LandBounderies",["China","South = Korea","Russia"]). bgfact("Korea, = North","NaturalResources",["coal","lead","tungsten","zinc","graphite","ma= gnesite","iron = ore","copper","gold","pyrites","salt","fluorspar","hydropower"]). bgfact("Korea, North","Population",["23066573"]). bgfact("Korea, North","Capital",["P'yongyang"]). bgfact("Korea, = North","MemberOf",["ESCAP","FAO","G-77","ICAO","IFAD","IMF","IOC","ISO","= ITU","LORCS","NAM","UN","UNCTAD","UNESCO","UNIDO","UPU","WFTU","WHO","WIP= O","WMO","WTO"]). bgfact("Korea, North","ExportCommodities",["minerals","metallurgical = products","agricultural and fishery products","manubgfactures"]). bgfact("Korea, North","ExportPartners",["China","Japan","Russia","South = Korea","Germany","Hong Kong","Mexico"]). bgfact("Korea, North","ImportCommodities",["petroleum","grain","coking = coal","machinery and equipment","consumer goods"]). bgfact("Korea, North","ImportPartners",["China","Russia","Japan","Hong = Kong","Germany","Singapore"]). bgfact("Korea, North","Industries",["machine building","military = products","electric = power","chemicals","mining","metallurgy","textiles","food processing"]). bgfact("Korea, North","Agriculture",["principal = rice","corn","potatoes","soybeans","livestock and livestock = cattle","hogs","pork","not self-sufficient in grain"]). bgfact("Korea, South","LandBounderies",["North Korea"]). bgfact("Korea, = South","NaturalResources",["coal","tungsten","graphite","molybdenum","lea= d","hydropower"]). bgfact("Korea, South","Population",["45082880"]). bgfact("Korea, South","Capital",["Seoul"]). bgfact("Korea, = South","MemberOf",["AfDB","APEC","AsDB","CCC","COCOM","UN","UNCTAD","UNES= CO","UNIDO","UNOSOM","UPU","WHO","WIPO","WMO","WTO"]). bgfact("Korea, South","ExportCommodities",["electronic and electrical = equipment","machinery","steel","automobiles","ships","textiles","clothing= ","footwear","fish"]). bgfact("Korea, South","ExportPartners",["US","Japan","EC"]). bgfact("Korea, South","ImportCommodities",["machinery","electronics and = electronic equipment","oil","steel","transport = equipment","textiles","organic chemicals","grains"]). bgfact("Korea, South","ImportPartners",["Japan","US","EC"]). bgfact("Korea, South","Industries",["electronics","automobile = production","chemicals","shipbuilding","steel","textiles","clothing","foo= twear","food processing"]). bgfact("Korea, South","Agriculture",["principal rice","root = crops","barley","vegetables","livestock and livestock = cattle","hogs","chickens","milk","self-sufficient in food","fish catch = of million metric tons","seventh-largest in world"]). bgfact("Kuwait","LandBounderies",["Iraq","Saudi Arabia"]). bgfact("Kuwait","NaturalResources",["petroleum","fish","shrimp","natural = gas"]). bgfact("Kuwait","Population",["1819322"]). bgfact("Kuwait","Capital",["Kuwait"]). bgfact("Kuwait","MemberOf",["ABEDA","AfDB","AFESD","AL","AMF","BDEAC","CA= EU","ESCWA","FAO","G-77","GATT","GCC","IAEA","IBRD","ICAO","ICC","IDA","I= DB","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC"= ,"ISO","ITU","LORCS","NAM","OAPEC","OIC","OPEC","UN","UNCTAD","UNESCO","U= NIDO","UPU","WFTU","WHO","WMO","WTO"]). bgfact("Kuwait","ExportCommodities",["oil"]). bgfact("Kuwait","ExportPartners",["France","Italy","Japan","UK"]). bgfact("Kuwait","ImportCommodities",["food","construction = materials","vehicles and parts","clothing"]). bgfact("Kuwait","ImportPartners",["US","Japan","UK","Canada"]). bgfact("Kuwait","Industries",["petroleum","petrochemicals","desalination"= ,"food processing","building materials","salt","construction"]). bgfact("Kuwait","Agriculture",["about of potable water must be = distilled or imported"]). bgfact("Kyrgyzstan","LandBounderies",["China","Kazakhstan","Tajikistan","= Uzbekistan"]). bgfact("Kyrgyzstan","NaturalResources",["locally exploitable = coal","mercury","bismuth","lead","natural gas","oil","nepheline","rare = earth metals","mercury","bismuth","gold","lead","zinc","hydroelectric = power"]). bgfact("Kyrgyzstan","Population",["4698108"]). bgfact("Kyrgyzstan","Capital",["Bishkek"]). bgfact("Kyrgyzstan","MemberOf",["CIS","CSCE","EBRD","ECE","ECO","ESCAP","= IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","IOC","NACC","OIC","PCA= ","UN","UNCTAD","UNESCO","UNIDO","UPU","WHO"]). bgfact("Kyrgyzstan","ExportCommodities",["wool","chemicals","cotton","fer= rous and nonferrous metals","shoes","machinery","tobacco"]). bgfact("Kyrgyzstan","ExportPartners",["Russia","Ukraine","Uzbekistan","Ka= zakhstan"]). bgfact("Kyrgyzstan","ImportCommodities",["grain","lumber","industrial = products","ferrous metals","fuel","machinery","textiles","footwear"]). bgfact("Kyrgyzstan","ImportPartners",[]). bgfact("Kyrgyzstan","Industries",["small = machinery","textiles","food-processing = Industries","cement","shoes","sawn = logs","refrigerators","furniture","electric motors","gold"]). bgfact("Kyrgyzstan","Agriculture",["wool","tobacco","cotton","livestock",= "vegetables","meat","grapes","fruits and = berries","eggs","milk","potatoes"]). bgfact("Laos","LandBounderies",["Burma","Cambodia","China","Thailand","Vi= etnam"]). bgfact("Laos","NaturalResources",["timber","hydropower","gypsum","tin","g= old","gemstones"]). bgfact("Laos","Population",["4701654"]). bgfact("Laos","Capital",["Vientiane"]). bgfact("Laos","MemberOf",["ACCT","AsDB","ASEAN","INTERPOL","IOC","ITU","L= ORCS","NAM","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU","WFTU","WHO","WMO"= ,"WTO"]). bgfact("Laos","ExportCommodities",["electricity","wood = products","coffee","tin"]). bgfact("Laos","ExportPartners",["Thailand","Malaysia","Vietnam","FSU","US= ","China"]). bgfact("Laos","ImportCommodities",["food","fuel oil","consumer = goods","manubgfactures"]). bgfact("Laos","ImportPartners",["Thailand","FSU","Japan","France","Vietna= m","China"]). bgfact("Laos","Industries",["tin and gypsum mining","timber","electric = power","agricultural processing","construction"]). bgfact("Laos","Agriculture",["principal rice","sweet = potatoes","vegetables","corn","coffee","sugarcane","livestock - = buffaloes","hogs","cattle","poultry"]). bgfact("Latvia","LandBounderies",["Belarus","Estonia","Lithuania","Russia= "]). bgfact("Latvia","NaturalResources",["amber","peat","limestone","dolomite"= ]). bgfact("Latvia","Population",["2749211"]). bgfact("Latvia","Capital",["Riga"]). bgfact("Latvia","MemberOf",["BIS","CBSS","CCC","CE","ITU","LORCS","NACC",= "UN","UNCTAD","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Latvia","ExportCommodities",["oil products","timber","ferrous = metals","dairy products","furniture","textiles"]). bgfact("Latvia","ExportPartners",["Russia","Western Europe"]). bgfact("Latvia","ImportCommodities",["fuels","cars","ferrous = metals","chemicals"]). bgfact("Latvia","ImportPartners",["Russia","Western Europe"]). bgfact("Latvia","Industries",["dependent on imports for energy","raw = materials","produces buses","vans","street and railroad cars","synthetic = fibers","agricultural machinery","fertilizers","washing = machines","radios","electronics","pharmaceuticals","processed = foods","textiles"]). bgfact("Latvia","Agriculture",["meat","milk","eggs","grain","sugar = beets","potatoes","fishing and fish packing"]). bgfact("Lebanon","LandBounderies",["Israel","Syria"]). bgfact("Lebanon","NaturalResources",["limestone","iron = ore","salt","water-surplus state in a water-deficit region"]). bgfact("Lebanon","Population",["3620395"]). bgfact("Lebanon","Capital",["Beirut"]). bgfact("Lebanon","MemberOf",["ABEDA","ACCT","AFESD","AL","AMF","CCC","ESC= WA","FAO","G-24","G-77","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IDB","I= FAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","N= AM","OIC","PCA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UNRWA","UPU","WFT= U","WHO","WIPO","WMO","WTO"]). bgfact("Lebanon","ExportCommodities",["agricultural = products","chemicals","textiles","precious and semiprecious metals and = jewelry","metals and metal products"]). bgfact("Lebanon","ExportPartners",["Saudi = Arabia","Switzerland","Jordan","Kuwait","US"]). bgfact("Lebanon","ImportCommodities",["Consumer goods","machinery and = transport equipment","petroleum products"]). bgfact("Lebanon","ImportPartners",["Italy","France","US","Turkey","Saudi = Arabia"]). bgfact("Lebanon","Industries",["banking","food = processing","textiles","cement","oil = refining","chemicals","jewelry","some metal fabricating"]). bgfact("Lebanon","Agriculture",["principal citrus = fruits","vegetables","potatoes","olives","tobacco","hemp","sheep","not = self-sufficient in grain"]). bgfact("Lesotho","LandBounderies",["South Africa"]). bgfact("Lesotho","NaturalResources",["water","agricultural and grazing = land"]). bgfact("Lesotho","Population",["1944493"]). bgfact("Lesotho","Capital",["Maseru"]). bgfact("Lesotho","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","G-77","G= ATT","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","INTELSAT","INT= ERPOL","IOC","ITU","LORCS","NAM","OAU","SACU","SADC","UN","UNCTAD","UNESC= O","UNHCR","UNIDO","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Lesotho","ExportCommodities",["wool","mohair","wheat","cattle","p= eas","beans","corn","hides","skins","baskets"]). bgfact("Lesotho","ExportPartners",["South Africa","EC","North and South = America"]). bgfact("Lesotho","ImportCommodities",["mainly corn","building = materials","clothing","vehicles","machinery","medicines","petroleum"]). bgfact("Lesotho","ImportPartners",["South Africa","Asia","EC"]). bgfact("Lesotho","Industries",["food","beverages","textiles","handicrafts= ","tourism"]). bgfact("Lesotho","Agriculture",["exceedingly primitive","principal crops = corn","wheat","pulses","sorghum","barley"]). bgfact("Liberia","LandBounderies",["Guinea","Cote d'Ivoire","Sierra = Leone"]). bgfact("Liberia","NaturalResources",["iron = ore","timber","diamonds","gold"]). bgfact("Liberia","Population",["2972766"]). bgfact("Liberia","Capital",["Monrovia"]). bgfact("Liberia","MemberOf",["ACP","AfDB","CCC","ECA","ECOWAS","FAO","G-7= 7","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INM= ARSAT","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","UN","UNCTAD= ","UNESCO","UNIDO","UPU","WCL","WHO","WIPO","WMO"]). bgfact("Liberia","ExportCommodities",["iron = ore","rubber","timber","coffee"]). bgfact("Liberia","ExportPartners",["US","EC","Netherlands"]). bgfact("Liberia","ImportCommodities",["rice","mineral = fuels","chemicals","machinery","transportation equipment"]). bgfact("Liberia","ImportPartners",["US","EC","Japan","China","Netherlands= ","ECOWAS"]). bgfact("Liberia","Industries",["rubber processing","food = processing","construction materials","furniture","palm oil = processing","mining"]). bgfact("Liberia","Agriculture",["principal = rubber","timber","coffee","cocoa","rice","cassava","palm = oil","sugarcane","bananas","sheep","not self-sufficient in = food","imports of rice consumption"]). bgfact("Libya","LandBounderies",["Algeria","Chad","Egypt","Niger","Sudan"= ,"Tunisia"]). bgfact("Libya","NaturalResources",["petroleum","natural gas","gypsum"]). bgfact("Libya","Population",["5057392"]). bgfact("Libya","Capital",["Tripoli"]). bgfact("Libya","MemberOf",["ABEDA","AfDB","AFESD","AL","AMF","AMU","CAEU"= ,"CCC","ECA","FAO","G-77","IAEA","IBRD","ICAO","IDA","IDB","IFAD","IFC","= ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM","O= APEC","OAU","OIC","OPEC","UN","UNCTAD","UNESCO","UNIDO","UPU","WHO","WIPO= ","WMO","WTO"]). bgfact("Libya","ExportCommodities",["crude","refined petroleum = products","natural gas"]). bgfact("Libya","ExportPartners",["Italy","Germany","Spain","France","UK",= "Turkey","Greece","Egypt"]). bgfact("Libya","ImportCommodities",["machinery","transport = equipment","food","manubgfactured goods"]). bgfact("Libya","ImportPartners",["Italy","Germany","UK","France","Spain",= "Turkey","Tunisia","Eastern Europe"]). bgfact("Libya","Industries",["petroleum","food = processing","textiles","handicrafts","cement"]). bgfact("Libya","Agriculture",["wheat","barley","olives","dates","citrus = fruits","of food is imported"]). bgfact("Liechtenstein","LandBounderies",["Austria","Switzerland"]). bgfact("Liechtenstein","NaturalResources",["hydroelectric potential"]). bgfact("Liechtenstein","Population",["30281"]). bgfact("Liechtenstein","Capital",["Vaduz"]). bgfact("Liechtenstein","MemberOf",["CE","CSCE","EBRD","ECE","EFTA","IAEA"= ,"INTELSAT","INTERPOL","IOC","ITU","LORCS","UN","UNCTAD","UPU","WCL","WIP= O"]). bgfact("Liechtenstein","ExportCommodities",["small specialty = machinery","dental products","stamps","hardware","pottery"]). bgfact("Liechtenstein","ExportPartners",["EFTA countries"]). bgfact("Liechtenstein","ImportCommodities",["machinery","metal = goods","textiles","foodstuffs","motor vehicles"]). bgfact("Liechtenstein","ImportPartners",["NA"]). bgfact("Liechtenstein","Industries",["electronics","metal = manubgfacturing","textiles","ceramics","pharmaceuticals","food = products","precision instruments","tourism"]). bgfact("Liechtenstein","Agriculture",["livestock","vegetables","corn","wh= eat","potatoes","grapes"]). bgfact("Lithuania","LandBounderies",["Belarus","Latvia","Poland","Russia"= ]). bgfact("Lithuania","NaturalResources",["peat"]). bgfact("Lithuania","Population",["3848389"]). bgfact("Lithuania","Capital",["Vilnius"]). bgfact("Lithuania","MemberOf",["BIS","CBSS","CCC","CE","CSCE","EBRD","ECE= ","FAO","IBRD","ICAO","ILO","IMF","INTELSAT","ITU","LORCS","NACC","UN","U= NCTAD","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Lithuania","ExportCommodities",["electronics","petroleum = products","food","chemicals"]). bgfact("Lithuania","ExportPartners",["Russia","Ukraine","West"]). bgfact("Lithuania","ImportCommodities",["oil","machinery","chemicals","gr= ain NA%"]). bgfact("Lithuania","ImportPartners",["Russia","Belarus","West"]). bgfact("Lithuania","Industries",["shipbuilding","furniture = making","textiles","food processing","fertilizers","agricultural = machinery","optical equipment","electronic components","computers"]). bgfact("Lithuania","Agriculture",["sugar","grain","potatoes","sugar = beets","vegetables","meat","milk","dairy products","eggs","most = developed are the livestock and dairy branches","net exporter of = meat","milk"]). bgfact("Luxembourg","LandBounderies",["Belgium","France","Germany"]). bgfact("Luxembourg","NaturalResources",["iron ore"]). bgfact("Luxembourg","Population",["401900"]). bgfact("Luxembourg","Capital",["Luxembourg"]). bgfact("Luxembourg","MemberOf",["ACCT","Australia = Group","Benelux","CCC","CE","COCOM","CSCE","EBRD","EC","ECE","EIB","FAO",= "GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IEA","IFAD","IFC","ILO",= "IMF","IMO","INTELSAT","INTERPOL","IOC","IOM","ITU","LORCS","MTCR","NACC"= ,"NATO","NEA","NSG","OECD","PCA","UN","UNCTAD","UNESCO","UNIDO","UNPROFOR= ","UPU","WCL","WEU","WHO","WIPO","WMO","ZC"]). bgfact("Luxembourg","ExportCommodities",["finished steel = products","chemicals","rubber products","glass","aluminum"]). bgfact("Luxembourg","ExportPartners",["EC","US"]). bgfact("Luxembourg","ImportCommodities",["minerals","metals","foodstuffs"= ,"quality consumer goods"]). bgfact("Luxembourg","ImportPartners",["Belgium","FRG","France","US"]). bgfact("Luxembourg","Industries",["banking","iron and steel","food = processing","chemicals","metal = products","engineering","tires","glass","aluminum"]). bgfact("Luxembourg","Agriculture",["principal = barley","oats","potatoes","wheat","fruits","cattle raising = widespread"]). bgfact("Macau","LandBounderies",["China"]). bgfact("Macau","NaturalResources",["negligible"]). bgfact("Macau","Population",["484557"]). bgfact("Macau","Capital",["Macau"]). bgfact("Macau","MemberOf",["ESCAP"]). bgfact("Macau","ExportCommodities",["textiles","clothing","toys"]). bgfact("Macau","ExportPartners",["US","Hong = Kong","Germany","China","France"]). bgfact("Macau","ImportCommodities",["raw = materials","foodstuffs","Capital goods"]). bgfact("Macau","ImportPartners",["Hong Kong","China","Japan"]). bgfact("Macau","Industries",["clothing","textiles","toys","plastic = products","furniture","tourism"]). bgfact("Macau","Agriculture",["rice","food shortages - = rice","vegetables","depends mostly on imports for food requirements"]). bgfact("Madagascar","LandBounderies",[]). bgfact("Madagascar","NaturalResources",["graphite","chromite","coal","bau= xite","salt","quartz","tar sands","semiprecious stones","mica","fish"]). bgfact("Madagascar","Population",["13427758"]). bgfact("Madagascar","Capital",["Antananarivo"]). bgfact("Madagascar","MemberOf",["ACCT","ACP","AfDB","CCC","ECA","FAO","G-= 77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IFAD","IFC","ILO","I= MF","IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM","OAU","UN= ","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO"= ,"WTO"]). bgfact("Madagascar","ExportCommodities",["coffee","vanilla","cloves","she= llfish","sugar","petroleum products"]). bgfact("Madagascar","ExportPartners",["France","Japan","Italy","Germany",= "US"]). bgfact("Madagascar","ImportCommodities",["intermediate = manubgfactures","Capital goods","petroleum","consumer goods","food"]). bgfact("Madagascar","ImportPartners",["France","Germany","UK","US"]). bgfact("Madagascar","Industries",["agricultural = processing","cement","automobile assembly plant","paper","petroleum"]). bgfact("Madagascar","Agriculture",["coffee","vanilla","sugarcane","cloves= ","food rice","cassava","beans","bananas","almost self-sufficient in = rice"]). bgfact("Malawi","LandBounderies",["Mozambique","Tanzania","Zambia"]). bgfact("Malawi","NaturalResources",["limestone","unexploited deposits of = uranium","coal"]). bgfact("Malawi","Population",["9732409"]). bgfact("Malawi","Capital",["Lilongwe"]). bgfact("Malawi","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","G-77","GA= TT","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT"= ,"INTERPOL","IOC","ISO","ITU","LORCS","NAM","OAU","SADC","UN","UNCTAD","U= NESCO","UNIDO","UPU","WHO","WIPO","WMO","WTO"]). bgfact("Malawi","ExportCommodities",["tobacco","tea","sugar","coffee","pe= anuts","wood products"]). bgfact("Malawi","ExportPartners",["US","UK","Zambia","South = Africa","Germany"]). bgfact("Malawi","ImportCommodities",["food","petroleum = products","semimanubgfactures","consumer goods","transportation = equipment"]). bgfact("Malawi","ImportPartners",["South = Africa","Japan","US","UK","Zimbabwe"]). bgfact("Malawi","Industries",["agricultural = processing","sawmilling","cement","consumer goods"]). bgfact("Malawi","Agriculture",["tobacco","sugarcane","cotton","tea","subs= istence potatoes","cassava","sorghum","livestock - cattle","goats"]). bgfact("Malaysia","LandBounderies",["Brunei","Indonesia","Thailand"]). bgfact("Malaysia","NaturalResources",["tin","petroleum","timber","copper"= ,"iron ore","natural gas","bauxite"]). bgfact("Malaysia","Population",["19283157"]). bgfact("Malaysia","Capital",["Kuala Lumpur"]). bgfact("Malaysia","MemberOf",["APEC","AsDB","ASEAN","C","CCC","CP","ESCAP= ","FAO","G-15","G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IDB","IF= AD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","ISO",= "ITU","LORCS","MINURSO","NAM","OIC","UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNIKOM","UNOMOZ","UNOSOM","UNTAC","UPU","W= CL","WHO","WIPO","WMO","WTO"]). bgfact("Malaysia","ExportCommodities",["electronic equipment","petroleum = and petroleum products","palm oil","wood and wood = products","rubber","textiles"]). bgfact("Malaysia","ExportPartners",["Singapore","US","Japan","UK","German= y","Thailand"]). bgfact("Malaysia","ImportCommodities",["machinery and = equipment","chemicals","food","petroleum products"]). bgfact("Malaysia","ImportPartners",["Japan","Singapore","US","Taiwan","Ge= rmany","UK","Australia"]). bgfact("Malaysia","Industries",[]). bgfact("Malaysia","Agriculture",["accounts for of GDP"]). bgfact("Maldives","LandBounderies",[]). bgfact("Maldives","NaturalResources",["fish"]). bgfact("Maldives","Population",["252077"]). bgfact("Maldives","Capital",["Male"]). bgfact("Maldives","MemberOf",["AsDB","C","CP","ESCAP","FAO","G-77","GATT"= ,"IBRD","ICAO","IDA","IDB","IFAD","IFC","IMF","IMO","INTELSAT","INTERPOL"= ,"IOC","ITU","NAM","OIC","SAARC","UN","UNCTAD","UNESCO","UNIDO","UPU","WH= O","WIPO","WMO","WTO"]). bgfact("Maldives","ExportCommodities",["fish","clothing"]). bgfact("Maldives","ExportPartners",["US","UK","Sri Lanka"]). bgfact("Maldives","ImportCommodities",["consumer goods","intermediate = and Capital goods","petroleum products"]). bgfact("Maldives","ImportPartners",["Singapore","Germany","Sri = Lanka","India"]). bgfact("Maldives","Industries",["fishing and fish = processing","tourism","shipping","boat building","some coconut = processing","garments","woven mats","coir","handicrafts"]). bgfact("Maldives","Agriculture",["accounts for almost of GDP"]). bgfact("Mali","LandBounderies",["Algeria","Burkina","Guinea","Cote = d'Ivoire","Mauritania","Niger","Senegal"]). bgfact("Mali","NaturalResources",["gold","phosphates","kaolin","salt","li= mestone","uranium","bauxite","iron ore","manganese","tin"]). bgfact("Mali","Population",["9112950"]). bgfact("Mali","Capital",["Bamako"]). bgfact("Mali","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOWAS"= ,"FAO","FZ","G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IDB","IFAD"= ,"IFC","ILO","IMF","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM",= "OAU","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU","WADB","WCL","WHO","WIPO= ","WMO","WTO"]). bgfact("Mali","ExportCommodities",["cotton","livestock","gold"]). bgfact("Mali","ExportPartners",["mostly franc zone and Western = Europe"]). bgfact("Mali","ImportCommodities",["machinery and = equipment","foodstuffs","construction = materials","petroleum","textiles"]). bgfact("Mali","ImportPartners",["mostly franc zone and Western = Europe"]). bgfact("Mali","Industries",["small local consumer goods and = processing","construction","phosphate","gold","fishing"]). bgfact("Mali","Agriculture",["rice","corn","vegetables","livestock - = cattle","sheep","goats"]). bgfact("Malta","LandBounderies",[]). bgfact("Malta","NaturalResources",["limestone","salt"]). bgfact("Malta","Population",["366767"]). bgfact("Malta","Capital",["Valletta"]). bgfact("Malta","MemberOf",["C","CCC","CE","CSCE","EBRD","ECE","FAO","G-77= ","GATT","IBRD","ICAO","ICFTU","IFAD","ILO","IMF","IMO","INMARSAT","INTEL= SAT","ITU","NAM","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WHO","= WIPO","WMO","WTO"]). bgfact("Malta","ExportCommodities",["machinery and transport = equipment","clothing and footware","printed matter"]). bgfact("Malta","ExportPartners",["Italy","Germany","UK"]). bgfact("Malta","ImportCommodities",["food","petroleum","machinery and = semimanubgfactured goods"]). bgfact("Malta","ImportPartners",["Italy","UK","Germany","US"]). bgfact("Malta","Industries",["tourism","electronics","ship repair = yard","construction","food = manubgfacturing","textiles","footwear","clothing","beverages","tobacco"])= . bgfact("Malta","Agriculture",["overall","main = potatoes","cauliflower","grapes","wheat","barley","tomatoes","citrus","cu= t flowers","green peppers","hogs","poultry","generally adequate supplies = of vegetables","poultry","milk","seasonal or periodic shortages in = grain","animal fodder","fruits"]). bgfact("Man, Isle of","LandBounderies",[]). bgfact("Man, Isle of","NaturalResources",["lead","iron ore"]). bgfact("Man, Isle of","Population",["72017"]). bgfact("Man, Isle of","Capital",["Douglas"]). bgfact("Man, Isle of","MemberOf",["none"]). bgfact("Man, Isle of","ExportCommodities",["tweeds","herring","processed = shellfish","meat"]). bgfact("Man, Isle of","ExportPartners",["UK"]). bgfact("Man, Isle = of","ImportCommodities",["timber","fertilizers","fish"]). bgfact("Man, Isle of","ImportPartners",["UK"]). bgfact("Man, Isle of","Industries",["financial services","light = manubgfacturing","tourism"]). bgfact("Man, Isle = of","Agriculture",["cattle","sheep","pigs","poultry"]). bgfact("Marshall Islands","LandBounderies",[]). bgfact("Marshall Islands","NaturalResources",["phosphate = deposits","marine products","deep seabed minerals"]). bgfact("Marshall Islands","Population",["54031"]). bgfact("Marshall Islands","Capital",["Majuro"]). bgfact("Marshall = Islands","MemberOf",["AsDB","ESCAP","IBRD","ICAO","IDA","IFC","IMF","INTE= LSAT","INTERPOL","SPARTECA","SPC","SPF","UN","UNCTAD","WHO"]). bgfact("Marshall Islands","ExportCommodities",["coconut = oil","fish","live animals","trichus shells"]). bgfact("Marshall Islands","ExportPartners",["US","Japan","Australia"]). bgfact("Marshall Islands","ImportCommodities",["foodstuffs","machinery = and equipment","beverages and tobacco","fuels"]). bgfact("Marshall Islands","ImportPartners",["US","Japan","Australia"]). bgfact("Marshall Islands","Industries",["copra","fish","craft items from = shell","wood","offshore banking"]). bgfact("Marshall = Islands","Agriculture",["coconuts","cacao","taro","breadfruit","fruits","= pigs","chickens"]). bgfact("Martinique","LandBounderies",[]). bgfact("Martinique","NaturalResources",["coastal scenery and = beaches","cultivable land"]). bgfact("Martinique","Population",["392362"]). bgfact("Martinique","Capital",["Fort-de-France"]). bgfact("Martinique","MemberOf",["FZ","WCL","WFTU"]). bgfact("Martinique","ExportCommodities",["refined petroleum = products","bananas","rum","pineapples"]). bgfact("Martinique","ExportPartners",["France","Guadeloupe","French = Guiana"]). bgfact("Martinique","ImportCommodities",["petroleum = products","crude","foodstuffs","construction materials","vehicles"]). bgfact("Martinique","ImportPartners",["France","UK","Italy","Germany","Ja= pan","US"]). bgfact("Martinique","Industries",["construction","rum","cement","oil = refining","sugar","tourism"]). bgfact("Martinique","Agriculture",["including fishing and = forestry","principal = pineapples","avocados","bananas","flowers","vegetables","dependent on = imported food","particularly meat and vegetables"]). bgfact("Mauritania","LandBounderies",["Algeria","Mali","Senegal","Western= Sahara"]). bgfact("Mauritania","NaturalResources",["iron = ore","gypsum","fish","copper","phosphate"]). bgfact("Mauritania","Population",["2192777"]). bgfact("Mauritania","Capital",["Nouakchott"]). bgfact("Mauritania","MemberOf",["ABEDA","ACCT","ACP","AfDB","AFESD","AL",= "AMF","AMU","CAEU","CCC","CEAO","ECA","ECOWAS","FAO","G-77","GATT","IBRD"= ,"ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL",= "IOC","ITU","LORCS","NAM","OAU","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU= ","WHO","WIPO","WMO","WTO"]). bgfact("Mauritania","ExportCommodities",["iron ore","fish and fish = products"]). bgfact("Mauritania","ExportPartners",["Japan","Italy","Belgium","Luxembou= rg"]). bgfact("Mauritania","ImportCommodities",["foodstuffs","consumer = goods","petroleum products","Capital goods"]). bgfact("Mauritania","ImportPartners",["Algeria","China","US","France","Ge= rmany","Spain","Italy"]). bgfact("Mauritania","Industries",["fish processing","mining of iron ore = and gypsum"]). bgfact("Mauritania","Agriculture",["dates","millet","sorghum","large = food deficit in years of drought"]). bgfact("Mauritius","LandBounderies",[]). bgfact("Mauritius","NaturalResources",["arable land","fish"]). bgfact("Mauritius","Population",["1116923"]). bgfact("Mauritius","Capital",["Port Louis"]). bgfact("Mauritius","MemberOf",["ACCT","ACP","AfDB","C","CCC","ECA","FAO",= "G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF"= ,"INMARSAT","IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM","= OAU","PCA","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO"= ,"WMO","WTO"]). bgfact("Mauritius","ExportCommodities",["textiles","sugar","light = manubgfactures"]). bgfact("Mauritius","ExportPartners",["EC and US have preferential = treatment","EU","US"]). bgfact("Mauritius","ImportCommodities",["manubgfactured goods","Capital = equipment","foodstuffs","petroleum products","chemicals"]). bgfact("Mauritius","ImportPartners",["EC","US","South Africa","Japan"]). bgfact("Mauritius","Industries",["food processing","textiles","wearing = apparel","chemicals","metal products","transport = equipment","nonelectrical machinery","tourism"]). bgfact("Mauritius","Agriculture",["corn","potatoes","bananas","pulses","c= attle","goats","net food importer","especially rice and fish"]). bgfact("Mayotte","LandBounderies",[]). bgfact("Mayotte","NaturalResources",["negligible"]). bgfact("Mayotte","Population",["93468"]). bgfact("Mayotte","Capital",["Mamoutzou"]). bgfact("Mayotte","MemberOf",["FZ"]). bgfact("Mayotte","ExportCommodities",["ylang-ylang","vanilla"]). bgfact("Mayotte","ExportPartners",["France","Comoros","Reunion"]). bgfact("Mayotte","ImportCommodities",["building = materials","transportation equipment","rice","clothing","flour"]). bgfact("Mayotte","ImportPartners",["France","Kenya","South = Africa","Pakistan"]). bgfact("Mayotte","Industries",["newly created lobster and shrimp = industry"]). bgfact("Mayotte","Agriculture",["vanilla","ylang-ylang","coffee","imports= major share of food needs"]). bgfact("Mexico","LandBounderies",["Belize","Guatemala","US"]). bgfact("Mexico","NaturalResources",["petroleum","silver","copper","gold",= "lead","zinc","natural gas","timber"]). bgfact("Mexico","Population",["92202199"]). bgfact("Mexico","Capital",["Mexico"]). bgfact("Mexico","MemberOf",["AG","OAS","OECD","ONUSAL","OPANAL","PCA","RG= ","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTI","WHO","WIPO","WMO","W= TO"]). bgfact("Mexico","ExportCommodities",["crude","oil = products","coffee","silver","engines","motor = vehicles","cotton","consumer electronics"]). bgfact("Mexico","ExportPartners",["US","Japan","EC"]). bgfact("Mexico","ImportCommodities",["metal-working machines","steel = mill products","agricultural machinery","electrical equipment","car = parts for assembly","repair parts for motor vehicles","aircraft"]). bgfact("Mexico","ImportPartners",["US","Japan","EC"]). bgfact("Mexico","Industries",["food and = beverages","tobacco","chemicals","iron and = steel","petroleum","mining","textiles","clothing","motor = vehicles","consumer durables","tourism"]). bgfact("Mexico","Agriculture",["major food = corn","wheat","rice","cotton","coffee","fruit","tomatoes"]). bgfact("Micronesia, Federated States of","LandBounderies",[]). bgfact("Micronesia, Federated States = of","NaturalResources",["forests","marine products","deep-seabed = minerals"]). bgfact("Micronesia, Federated States of","Population",["120347"]). bgfact("Micronesia, Federated States of","Capital",["Kolonia"]). bgfact("Micronesia, Federated States = of","MemberOf",["AsDB","ESCAP","IBRD","ICAO","IDA","IFC","IMF","ITU","SPA= RTECA","SPC","SPF","UN","UNCTAD","WHO"]). bgfact("Micronesia, Federated States of","ExportCommodities",["copra"]). bgfact("Micronesia, Federated States of","ExportPartners",["NA"]). bgfact("Micronesia, Federated States of","ImportCommodities",["NA"]). bgfact("Micronesia, Federated States of","ImportPartners",["NA"]). bgfact("Micronesia, Federated States = of","Industries",["tourism","construction","fish processing","craft = items from shell","wood"]). bgfact("Micronesia, Federated States of","Agriculture",["tropical fruits = and vegetables","coconuts","cassava","sweet = potatoes","pigs","chickens"]). bgfact("Midway Islands","LandBounderies",[]). bgfact("Midway Islands","NaturalResources",["fish","wildlife"]). bgfact("Midway Islands","Population",["453"]). bgfact("Midway Islands","Capital",["none; administered from Washington, = DC"]). bgfact("Moldova","LandBounderies",["Romania","Ukraine"]). bgfact("Moldova","NaturalResources",["lignite","phosphorites","gypsum"]).= bgfact("Moldova","Population",["4473033"]). bgfact("Moldova","Capital",["Chisinau"]). bgfact("Moldova","MemberOf",["BSEC","CE","IOC","ITU","NACC","UN","UNCTAD"= ,"UNESCO","UNIDO","UPU","WHO","WIPO"]). bgfact("Moldova","ExportCommodities",["foodstuffs","wine","tobacco","text= iles and footwear","machinery","chemicals"]). bgfact("Moldova","ExportPartners",["Russia","Kazakhstan","Ukraine","Roman= ia","Germany"]). bgfact("Moldova","ImportCommodities",["oil","gas","coal","steel = machinery","foodstuffs","automobiles"]). bgfact("Moldova","ImportPartners",["Russia","Ukraine","Uzbekistan","Roman= ia","Germany"]). bgfact("Moldova","Industries",["key products are canned = food","agricultural machinery","foundry equipment","refrigerators and = freezers","washing machines","hosiery","refined sugar","vegetable = oil","shoes","textiles"]). bgfact("Moldova","Agriculture",["products are = vegetables","fruits","wine","grain","sugar beets","sunflower = seed","meat","milk","tobacco"]). bgfact("Monaco","LandBounderies",["France"]). bgfact("Monaco","NaturalResources",["none"]). bgfact("Monaco","Population",["31278"]). bgfact("Monaco","Capital",["Monaco"]). bgfact("Monaco","MemberOf",["ACCT","CSCE","ECE","IAEA","ICAO","IMF","IMO"= ,"INMARSAT","INTELSAT","INTERPOL","IOC","ITU","LORCS","UN","UNCTAD","UNES= CO","UPU","WHO","WIPO"]). bgfact("Monaco","Agriculture",["none"]). bgfact("Mongolia","LandBounderies",["China","Russia"]). bgfact("Mongolia","NaturalResources",["oil","coal","copper","molybdenum",= "tungsten","phosphates","tin","nickel","zinc","wolfram","fluorspar","gold= "]). bgfact("Mongolia","Population",["2429762"]). bgfact("Mongolia","Capital",["Ulaanbaatar"]). bgfact("Mongolia","MemberOf",["AsDB","CCC","ESCAP","FAO","G-77","IAEA","I= BRD","ICAO","IDA","IFC","ILO","IMF","INTELSAT","UN","UNCTAD","UNESCO","UN= IDO","UPU","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Mongolia","ExportCommodities",["copper","livestock","animal = products","cashmere","wool","hides","fluorspar"]). bgfact("Mongolia","ExportPartners",["former CMEA = countries","China","EC"]). bgfact("Mongolia","ImportCommodities",["machinery and = equipment","fuels","food products","industrial consumer = goods","chemicals","building materials","sugar","tea"]). bgfact("Mongolia","ImportPartners",["USSR","Austria","China"]). bgfact("Mongolia","Industries",["copper","processing of animal = products","building materials","food and beverage","mining"]). bgfact("Mongolia","Agriculture",["wheat","barley","potatoes","forage"]). bgfact("Montserrat","LandBounderies",[]). bgfact("Montserrat","NaturalResources",["negligible"]). bgfact("Montserrat","Population",["12701"]). bgfact("Montserrat","Capital",["Plymouth"]). bgfact("Montserrat","MemberOf",["CARICOM","CDB","ECLAC","OECS","WCL"]). bgfact("Montserrat","ExportCommodities",["electronic parts","plastic = bags","apparel","hot peppers","live plants","cattle"]). bgfact("Montserrat","ExportPartners",["NA"]). bgfact("Montserrat","ImportCommodities",["machinery and transportation = equipment","foodstuffs","manubgfactured goods","fuels","lubricants"]). bgfact("Montserrat","ImportPartners",["NA"]). bgfact("Montserrat","Industries",["light manubgfacturing - = rum","textiles","electronic appliances"]). bgfact("Montserrat","Agriculture",["food tomatoes","onions","not = self-sufficient in food","especially livestock products"]). bgfact("Morocco","LandBounderies",["Algeria","Western Sahara"]). bgfact("Morocco","NaturalResources",["phosphates","iron = ore","manganese","lead","zinc","fish","salt"]). bgfact("Morocco","Population",["28558635"]). bgfact("Morocco","Capital",["Rabat"]). bgfact("Morocco","MemberOf",["ABEDA","ACCT","NAM","OIC","UN","UNAVEM = II","UNCTAD","UNESCO","UNHCR","UNIDO","UNOSOM","UNTAC","UPU","WHO","WIPO"= ,"WMO","WTO"]). bgfact("Morocco","ExportCommodities",["food and = beverages","semiprocessed goods","consumer goods","phosphates"]). bgfact("Morocco","ExportPartners",["EC","India","Japan","US"]). bgfact("Morocco","ImportCommodities",["Capital goods","semiprocessed = goods","raw materials","fuel and lubricants","food and = beverages","consumer goods"]). bgfact("Morocco","ImportPartners",["EC","US","Saudi = Arabia","FSU","Japan"]). bgfact("Morocco","Industries",["phosphate rock mining and = processing","food processing","leather = goods","textiles","construction","tourism"]). bgfact("Morocco","Agriculture",["accounts for of GDP","of = employment","barley","wheat","citrus = fruit","wine","vegetables","olives"]). bgfact("Mozambique","LandBounderies",["Malawi","South = Africa","Swaziland","Tanzania","Zambia","Zimbabwe"]). bgfact("Mozambique","NaturalResources",["coal","titanium"]). bgfact("Mozambique","Population",["17346280"]). bgfact("Mozambique","Capital",["Maputo"]). bgfact("Mozambique","MemberOf",["ACP","AfDB","CCC","ECA","FAO","FLS","G-7= 7","GATT","IBRD","ICAO","IDA","IFAD","IFC","ILO","IMF","INMARSAT","IMO","= INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","OIC","SADC","UN","U= NCTAD","UNESCO","UNIDO","UPU","WHO","WMO"]). bgfact("Mozambique","ExportCommodities",["shrimp","cashews","sugar","copr= a","citrus"]). bgfact("Mozambique","ExportPartners",["US","Western = Europe","Germany","Japan"]). bgfact("Mozambique","ImportCommodities",["food","clothing","farm = equipment","petroleum"]). bgfact("Mozambique","ImportPartners",["US","Western Europe","USSR"]). bgfact("Mozambique","Industries",["food","beverages","chemicals","tobacco= "]). bgfact("Mozambique","Agriculture",["cotton","cashew = nuts","sugarcane","tea","corn","rice","not self-sufficient in food"]). bgfact("Namibia","LandBounderies",["Angola","Botswana","South = Africa","Zambia"]). bgfact("Namibia","NaturalResources",["diamonds","copper","uranium","gold"= ,"lead","tin","lithium","cadmium","zinc","salt","vanadium","natural = gas","suspected deposits of oil","natural gas","coal","iron ore"]). bgfact("Namibia","Population",["1595567"]). bgfact("Namibia","Capital",["Windhoek"]). bgfact("Namibia","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","FLS","G-= 77","GATT","IAEA","IBRD","ICAO","IFAD","IFC","ILO","IMF","INTELSAT","ITU"= ,"NAM","OAU","SACU","SADC","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","= WCL","WFTU","WHO","WIPO","WMO"]). bgfact("Namibia","ExportCommodities",["diamonds","copper","gold","zinc","= lead","uranium","cattle","processed fish","karakul skins"]). bgfact("Namibia","ExportPartners",["Switzerland","South = Africa","Germany","Japan"]). bgfact("Namibia","ImportCommodities",["foodstuffs","petroleum products = and fuel","machinery and equipment"]). bgfact("Namibia","ImportPartners",["South = Africa","Germany","US","Switzerland"]). bgfact("Namibia","Industries",["meatpacking","fish processing","dairy = products","mining"]). bgfact("Namibia","Agriculture",["millet","sorghum","fish catch = potential of over million metric tons not being fulfilled","catch = reaching only","not self-sufficient in food"]). bgfact("Nauru","LandBounderies",[]). bgfact("Nauru","NaturalResources",["phosphates"]). bgfact("Nauru","Population",["10019"]). bgfact("Nauru","Capital",["Yaren District"]). bgfact("Nauru","MemberOf",["AsDB","C","INTERPOL","ITU","SPARTECA","SPC","= SPF","UPU"]). bgfact("Nauru","ExportCommodities",["phosphates"]). bgfact("Nauru","ExportPartners",["Australia","NZ"]). bgfact("Nauru","ImportCommodities",["food","fuel","manubgfactures","build= ing materials","machinery"]). bgfact("Nauru","ImportPartners",["Australia","UK","NZ","Japan"]). bgfact("Nauru","Industries",["phosphate mining","financial = services","coconut products"]). bgfact("Nauru","Agriculture",["almost completely dependent on imports = for food and water"]). bgfact("Navassa Island","LandBounderies",[]). bgfact("Navassa Island","NaturalResources",["guano"]). bgfact("Navassa Island","Capital",["none; administered from Washington, = DC"]). bgfact("Nepal","LandBounderies",["China","India"]). bgfact("Nepal","NaturalResources",["quartz","water","timber","hydroelectr= ic potential","scenic beauty","small deposits of = lignite","copper","cobalt","iron ore"]). bgfact("Nepal","Population",["21041527"]). bgfact("Nepal","Capital",["Kathmandu"]). bgfact("Nepal","MemberOf",["AsDB","CCC","CP","ESCAP","FAO","G-77","IBRD",= "ICAO","IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","= ISO","ITU","LORCS","NAM","SAARC","UN","UNCTAD","UNESCO","UNIDO","UNIFIL",= "UNPROFOR","UNTAC","UPU","WFTU","WHO","WMO","WTO"]). bgfact("Nepal","ExportCommodities",["carpets","clothing","leather = goods","jute goods","grain"]). bgfact("Nepal","ExportPartners",["US","Germany","India","UK"]). bgfact("Nepal","ImportCommodities",["petroleum = products","fertilizer","machinery"]). bgfact("Nepal","ImportPartners",["India","Singapore","Japan","Germany"]).= bgfact("Nepal","Industries",["small = rice","jute","sugar","cigarette","textile","carpet","cement","tourism"]).= bgfact("Nepal","Agriculture",["farm = rice","corn","wheat","sugarcane","root crops","milk","not = self-sufficient in food","particularly in drought years"]). bgfact("Netherlands","LandBounderies",["Belgium","Germany"]). bgfact("Netherlands","NaturalResources",["natural = gas","petroleum","fertile soil"]). bgfact("Netherlands","Population",["15367928"]). bgfact("Netherlands","Capital",["Amsterdam; The Hague is the seat of = government"]). bgfact("Netherlands","MemberOf",["AfDB","AG","OECD","PCA","UN","UNAVEM = II","UNCTAD","UNESCO","UNHCR","UNIDO","UNOMUR","UNPROFOR","UNTAC","UNTSO"= ,"UPU","WCL","WEU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Netherlands","ExportCommodities",["metal = products","chemicals","processed food and tobacco","agricultural = products"]). bgfact("Netherlands","ExportPartners",["EC"]). bgfact("Netherlands","ImportCommodities",["raw materials and = semifinished products","consumer goods","transportation = equipment","crude","food products"]). bgfact("Netherlands","ImportPartners",["EC"]). bgfact("Netherlands","Industries",["agro Industries","metal and = engineering products","electrical machinery and = equipment","chemicals","petroleum","fishing","construction","microelectro= nics"]). bgfact("Netherlands","Agriculture",["grains","potatoes","sugar = beets","fruits","shortages of grain","fats"]). bgfact("Netherlands Antilles","LandBounderies",[]). bgfact("Netherlands Antilles","NaturalResources",["phosphates"]). bgfact("Netherlands Antilles","Population",["185790"]). bgfact("Netherlands Antilles","Capital",["Willemstad"]). bgfact("Netherlands Antilles","MemberOf",["CARICOM"]). bgfact("Netherlands Antilles","ExportCommodities",["petroleum = products"]). bgfact("Netherlands = Antilles","ExportPartners",["US","Brazil","Colombia"]). bgfact("Netherlands Antilles","ImportCommodities",["crude = petroleum","food","manubgfactures"]). bgfact("Netherlands = Antilles","ImportPartners",["Venezuela","US","Colombia","Netherlands","Ja= pan"]). bgfact("Netherlands Antilles","Industries",["tourism"]). bgfact("Netherlands Antilles","Agriculture",["chief = aloes","sorghum","peanuts","fresh vegetables","not self-sufficient in = food"]). bgfact("New Caledonia","LandBounderies",[]). bgfact("New = Caledonia","NaturalResources",["nickel","chrome","iron","cobalt","mangane= se","silver","gold","lead","copper"]). bgfact("New Caledonia","Population",["181309"]). bgfact("New Caledonia","Capital",["Noumea"]). bgfact("New = Caledonia","MemberOf",["ESCAP","FZ","ICFTU","SPC","WFTU","WMO"]). bgfact("New Caledonia","ExportCommodities",["nickel metal","nickel = ore"]). bgfact("New Caledonia","ExportPartners",["France","Japan","US"]). bgfact("New = Caledonia","ImportCommodities",["foods","fuels","minerals","machines","el= ectrical equipment"]). bgfact("New Caledonia","ImportPartners",["France","US","Australia"]). bgfact("New Caledonia","Industries",["nickel mining and smelting"]). bgfact("New = Caledonia","Agriculture",["coffee","corn","wheat","self-sufficient in = beef"]). bgfact("New Zealand","LandBounderies",[]). bgfact("New Zealand","NaturalResources",["natural gas","iron = ore","sand","coal","timber","hydropower","gold","limestone"]). bgfact("New Zealand","Population",["3388737"]). bgfact("New Zealand","Capital",["Wellington"]). bgfact("New = Zealand","MemberOf",["ANZUS","OECD","PCA","SPARTECA","SPC","SPF","UN","UN= AVEM = II","UNCTAD","UNESCO","UNIDO","UNOSOM","UNPROFOR","UNTAC","UNTSO","UPU","= WHO","WIPO","WMO"]). bgfact("New = Zealand","ExportCommodities",["wool","lamb","mutton","beef","fruit","fish= ","cheese","manubgfactures","chemicals","forestry products"]). bgfact("New Zealand","ExportPartners",["Australia","Japan","US","South = Korea"]). bgfact("New Zealand","ImportCommodities",["petroleum","consumer = goods","motor vehicles","industrial equipment"]). bgfact("New = Zealand","ImportPartners",["Australia","US","Japan","UK","Germany"]). bgfact("New Zealand","Industries",["food processing","wood and paper = products","textiles","machinery","transportation equipment","banking and = insurance","tourism","mining"]). bgfact("New Zealand","Agriculture",["livestock predominates - = wool","meat","wheat","barley","potatoes","pulses","fruits","fish catch = reached a record"]). bgfact("Nicaragua","LandBounderies",["Costa Rica","Honduras"]). bgfact("Nicaragua","NaturalResources",["gold","silver","copper","tungsten= ","lead","zinc","timber","fish"]). bgfact("Nicaragua","Population",["4096689"]). bgfact("Nicaragua","Capital",["Managua"]). bgfact("Nicaragua","MemberOf",["BCIE","CACM","ECLAC","FAO","G-77","GATT",= "IADB","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO",= "INTELSAT","INTERPOL","IOC","IOM","ITU","LAES","LAIA","LORCS","NAM","OAS"= ,"OPANAL","PCA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WCL","WFTU"= ,"WHO","WIPO","WMO","WTO"]). bgfact("Nicaragua","ExportCommodities",["foodstuffs","cotton","coffee","c= hemicals"]). bgfact("Nicaragua","ExportPartners",["EC","US","Japan","Costa Rica","El = Salvador","Mexico"]). bgfact("Nicaragua","ImportCommodities",["petroleum","food","chemicals","m= achinery","clothing"]). bgfact("Nicaragua","ImportPartners",["US","Venezuela","Costa = Rica","EC","Guatemala"]). bgfact("Nicaragua","Industries",["food processing","chemicals","metal = products","textiles","clothing","petroleum refining and = distribution","beverages","footwear"]). bgfact("Nicaragua","Agriculture",["export = coffee","bananas","sugarcane","food rice","corn","cassava","citrus = fruit","also produces a variety of animal = beef","veal","pork","poultry","normally self-sufficient in food"]). bgfact("Niger","LandBounderies",["Algeria","Benin","Burkina","Chad","Liby= a","Mali","Nigeria"]). bgfact("Niger","NaturalResources",["uranium","coal","iron = ore","tin","phosphates"]). bgfact("Niger","Population",["8971605"]). bgfact("Niger","Capital",["Niamey"]). bgfact("Niger","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOWAS= ","Entente","FAO","FZ","G-77","GATT","IAEA","IBRD","ICAO","IDA","IDB","IF= AD","IFC","ILO","IMF","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OA= U","OIC","UN","UNCTAD","UNESCO","UNIDO","UPU","WADB","WCL","WHO","WIPO","= WMO","WTO"]). bgfact("Niger","ExportCommodities",["uranium ore","livestock = products","cowpeas","onions"]). bgfact("Niger","ExportPartners",["France","Nigeria","Cote = d'Ivoire","Italy"]). bgfact("Niger","ImportCommodities",["primary = materials","machinery","vehicles and parts","electronic = equipment","cereals","petroleum products","pharmaceuticals","chemical = products","foodstuffs"]). bgfact("Niger","ImportPartners",["Germany","Cote = d'Ivoire","France","Italy","Nigeria"]). bgfact("Niger","Industries",["cement","brick","textiles","food = processing","chemicals","slaughterhouses","uranium mining began in"]). bgfact("Niger","Agriculture",["cowpeas","cotton","food = millet","sorghum","cassava","livestock - = cattle","sheep","self-sufficient in food except in drought years"]). bgfact("Nigeria","LandBounderies",["Benin","Cameroon","Chad","Niger"]). bgfact("Nigeria","NaturalResources",["petroleum","tin","columbite","iron = ore","coal","limestone","lead","zinc","natural gas"]). bgfact("Nigeria","Population",["98091097"]). bgfact("Nigeria","Capital",["Abuja"]). bgfact("Nigeria","MemberOf",["ACP","AfDB","C","CCC","ECA","ECOWAS","FAO",= "G-15","G-19","G-24","G-77","GATT","IAEA","IBRD","ICAO","ICC","IDA","IFAD= ","IFC","ILO","IMO","IMF","INMARSAT","INTELSAT","INTERPOL","IOC","ITU","L= ORCS","MINURSO","NAM","OAU","OIC","OPEC","PCA","UN","UNAVEM","UNCTAD","UN= ESCO","UNHCR","UNIDO","UNIKOM","UNPROFOR","UNTAC","UPU","WCL","WHO","WMO"= ,"WTO"]). bgfact("Nigeria","ExportCommodities",["oil","cocoa","rubber"]). bgfact("Nigeria","ExportPartners",["US","EC"]). bgfact("Nigeria","ImportCommodities",["machinery and = equipment","manubgfactured goods","food and animals"]). bgfact("Nigeria","ImportPartners",["EC","US","Japan"]). bgfact("Nigeria","Industries",["crude","coal","tin","palm = oil","peanut","cotton","rubber","wood","textiles","cement","building = materials","food = products","footwear","chemical","printing","ceramics","steel"]). bgfact("Nigeria","Agriculture",["cocoa","peanuts","palm = oil","corn","rice","sorghum","millet","cassava","livestock - = cattle","sheep","goats","fishing and forestry resources extensively = exploited"]). bgfact("Niue","LandBounderies",[]). bgfact("Niue","NaturalResources",["fish","arable land"]). bgfact("Niue","Population",["1906"]). bgfact("Niue","Capital",["Alofi"]). bgfact("Niue","MemberOf",["ESCAP","SPARTECA","SPC","SPF"]). bgfact("Niue","ExportCommodities",["canned coconut = cream","copra","honey","passion fruit products","pawpaw","root = crops","limes","footballs","stamps","handicrafts"]). bgfact("Niue","ExportPartners",["NZ","Fiji","Cook = Islands","Australia"]). bgfact("Niue","ImportCommodities",["food","live animals","manubgfactured = goods","machinery","fuels","lubricants","chemicals","drugs"]). bgfact("Niue","ImportPartners",["NZ","Fiji","Japan","Western = Samoa","Australia","US"]). bgfact("Niue","Industries",["tourist","handicrafts","coconut = products"]). bgfact("Niue","Agriculture",["coconuts","passion = fruit","honey","subsistence = taro","yams","cassava","pigs","poultry","beef cattle"]). bgfact("Norfolk Island","LandBounderies",[]). bgfact("Norfolk Island","NaturalResources",["fish"]). bgfact("Norfolk Island","Population",["2710"]). bgfact("Norfolk Island","Capital",["Kingston"]). bgfact("Norfolk Island","MemberOf",["none"]). bgfact("Norfolk Island","ExportCommodities",["postage stamps","seeds of = the Norfolk Island pine and Kentia palm","small quantities of = avocados"]). bgfact("Norfolk Island","ExportPartners",["Australia","Pacific = Islands","NZ","Asia","Europe"]). bgfact("Norfolk Island","ImportCommodities",["NA"]). bgfact("Norfolk Island","ImportPartners",["Australia","Pacific = Islands","NZ","Asia","Europe"]). bgfact("Norfolk Island","Industries",["tourism"]). bgfact("Norfolk Island","Agriculture",["Norfolk Island pine = seed","Kentia palm = seed","cereals","vegetables","fruit","cattle","poultry"]). bgfact("Northern Mariana Islands","LandBounderies",[]). bgfact("Northern Mariana Islands","NaturalResources",["arable = land","fish"]). bgfact("Northern Mariana Islands","Population",["49799"]). bgfact("Northern Mariana Islands","Capital",["Saipan"]). bgfact("Northern Mariana Islands","MemberOf",["ESCAP","SPC"]). bgfact("Northern Mariana Islands","ExportCommodities",["manubgfactured = goods","garments","bread","pastries","concrete blocks","light iron = work"]). bgfact("Northern Mariana Islands","ExportPartners",["NA"]). bgfact("Northern Mariana = Islands","ImportCommodities",["food","construction","equipment","material= s"]). bgfact("Northern Mariana Islands","ImportPartners",["NA"]). bgfact("Northern Mariana = Islands","Industries",["tourism","construction","light = industry","handicrafts"]). bgfact("Northern Mariana = Islands","Agriculture",["coconuts","fruits","cattle","vegetables"]). bgfact("Norway","LandBounderies",["Finland","Sweden","Russia"]). bgfact("Norway","NaturalResources",["petroleum","copper","natural = gas","pyrites","nickel","iron = ore","zinc","lead","fish","timber","hydropower"]). bgfact("Norway","Population",["4314604"]). bgfact("Norway","Capital",["Oslo"]). bgfact("Norway","MemberOf",["AfDB","AsDB","Australia = Group","BIS","CBSS","CCC","CE","CERN","COCOM","CSCE","EBRD","ECE","EFTA",= "ESA","FAO","GATT","IADB","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IEA",= "IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IO= M","ISO","ITU","LORCS","MTCR","NACC","NAM","WHO","WIPO","WMO","ZC"]). bgfact("Norway","ExportCommodities",["petroleum and petroleum = products","metals and products","fish and fish = products","chemicals","natural gas","ships"]). bgfact("Norway","ExportPartners",["EC","Nordic countries","developing = countries","US","Japan"]). bgfact("Norway","ImportCommodities",["machinery and = equipment","manubgfactured consumer goods","foodstuffs"]). bgfact("Norway","ImportPartners",["EC","Nordic countries","developing = countries","US","Japan"]). bgfact("Norway","Industries",["petroleum and gas","food = processing","shipbuilding","pulp and paper = products","metals","chemicals","timber","mining","textiles","fishing"]). bgfact("Norway","Agriculture",["fish catch of million metric tons in"]). bgfact("Oman","LandBounderies",["Saudi Arabia","UAE","Yemen"]). bgfact("Oman","NaturalResources",["petroleum","copper","asbestos","some = marble","limestone","chromium","gypsum","natural gas"]). bgfact("Oman","Population",["1701470"]). bgfact("Oman","Capital",["Muscat"]). bgfact("Oman","MemberOf",["ABEDA","AFESD","AL","AMF","ESCWA","FAO","G-77"= ,"GCC","IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","IMO","INMARSAT= ","INTELSAT","INTERPOL","IOC","ISO","ITU","NAM","OIC","UN","UNCTAD","UNES= CO","UNIDO","UPU","WFTU","WHO","WMO"]). bgfact("Oman","ExportCommodities",["petroleum","re-exports","fish","proce= ssed copper","textiles"]). bgfact("Oman","ExportPartners",["UAE","Japan","South = Korea","Singapore"]). bgfact("Oman","ImportCommodities",["machinery","transportation = equipment","manubgfactured goods","food","livestock","lubricants"]). bgfact("Oman","ImportPartners",["Japan","UAE","UK","US"]). bgfact("Oman","Industries",["crude production and refining","natural gas = production","construction","cement","copper"]). bgfact("Oman","Agriculture",["annual fish catch averages"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","LandBounderies",[]). bgfact("Pacific Islands (Palau), Trust Territory of = the","NaturalResources",["forests","minerals","marine = products","deep-seabed minerals"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","Population",["16366"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","Capital",["Koror"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","MemberOf",["ESCAP"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","ExportCommodities",["trochus","tuna","copra","handicrafts"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","ExportPartners",["US","Japan"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","ImportCommodities",["NA"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","ImportPartners",["US"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","Industries",["tourism","craft items","Agriculture"]). bgfact("Pacific Islands (Palau), Trust Territory of = the","Agriculture",["coconut","copra","cassava","sweet potatoes"]). bgfact("Pacific Ocean","NaturalResources",["oil and gas = fields","polymetallic nodules","sand and gravel aggregates","placer = deposits","fish"]). bgfact("Pacific Ocean","Industries",["fishing","oil and gas = production"]). bgfact("Pakistan","LandBounderies",["Afghanistan","China","India","Iran"]= ). bgfact("Pakistan","NaturalResources",["land","extensive natural gas = reserves","limited petroleum","poor quality coal","iron = ore","copper","salt","limestone"]). bgfact("Pakistan","Population",["128855965"]). bgfact("Pakistan","Capital",["Islamabad"]). bgfact("Pakistan","MemberOf",["AsDB","C","CCC","CP","ECO","ESCAP","FAO","= G-19","G-24","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IDB"= ,"IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","I= OM","ISO","ITU","LORCS","MINURSO","NAM","OAS","OIC","PCA","SAARC","UN","U= NCTAD","UNESCO","UNHCR","UNIDO","UNIKOM","UNOSOM","UNTAC","UPU","WCL","WF= TU","WHO","WIPO","WMO","WTO"]). bgfact("Pakistan","ExportCommodities",["cotton","textiles","clothing","ri= ce","leather","carpets"]). bgfact("Pakistan","ExportPartners",["US","Japan","Hong = Kong","Germany","UK"]). bgfact("Pakistan","ImportCommodities",["petroleum","petroleum = products","machinery","transportation equipment","vegetable = oils","animal fats","chemicals"]). bgfact("Pakistan","ImportPartners",["Japan","US","Germany","UK","Saudi = Arabia"]). bgfact("Pakistan","Industries",["textiles","food = processing","beverages","construction materials","clothing","paper = products","shrimp"]). bgfact("Pakistan","Agriculture",["of GDP","major = cotton","wheat","rice","sugarcane","fruits","livestock = milk","beef","mutton","self-sufficient in food grain"]). bgfact("Palmyra Atoll","LandBounderies",[]). bgfact("Palmyra Atoll","NaturalResources",["none"]). bgfact("Palmyra Atoll","Capital",["none; administered from Washington, = DC"]). bgfact("Panama","LandBounderies",["Colombia","Costa Rica"]). bgfact("Panama","NaturalResources",["copper","mahogany = forests","shrimp"]). bgfact("Panama","Population",["63"]). bgfact("Panama","Capital",["Panama"]). bgfact("Panama","MemberOf",["AG","LORCS","NAM","OAS","OPANAL","PCA","UN",= "UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Panama","ExportCommodities",["bananas","shrimp","sugar","clothing= ","coffee"]). bgfact("Panama","ExportPartners",["US","EC","Central America and = Caribbean"]). bgfact("Panama","ImportCommodities",["Capital = goods","crude","foodstuffs","consumer goods","chemicals"]). bgfact("Panama","ImportPartners",["US","EC","Central America and = Caribbean","Japan"]). bgfact("Panama","Industries",["manubgfacturing and construction = activities","petroleum refining","brewing","sugar milling"]). bgfact("Panama","Agriculture",["crops - = bananas","rice","corn","coffee","importer of food = grain","vegetables"]). bgfact("Papua New Guinea","LandBounderies",["Indonesia"]). bgfact("Papua New = Guinea","NaturalResources",["gold","copper","silver","natural = gas","timber","oil potential"]). bgfact("Papua New Guinea","Population",["4196806"]). bgfact("Papua New Guinea","Capital",["Port Moresby"]). bgfact("Papua New = Guinea","MemberOf",["ACP","APEC","AsDB","ASEAN","ITU","LORCS","NAM","SPAR= TECA","SPC","SPF","UN","UNCTAD","UNESCO","UNIDO","UPU","WFTU","WHO","WMO"= ]). bgfact("Papua New Guinea","ExportCommodities",["gold","copper = ore","oil","logs","palm oil","coffee","cocoa","lobster"]). bgfact("Papua New Guinea","ExportPartners",["Australia","Japan","South = Korea","UK","US"]). bgfact("Papua New Guinea","ImportCommodities",["machinery and transport = equipment","manubgfactured goods","food","fuels","chemicals"]). bgfact("Papua New = Guinea","ImportPartners",["Australia","Japan","US","Singapore","New = Zealand","UK"]). bgfact("Papua New Guinea","Industries",["copra crushing","palm oil = processing","plywood production","wood chip production","mining of = gold","silver","construction","tourism"]). bgfact("Papua New = Guinea","Agriculture",["coffee","cocoa","coconuts","rubber","sweet = potatoes","fruit","vegetables","poultry","net importer of food for urban = centers"]). bgfact("Paracel Islands","LandBounderies",[]). bgfact("Paracel Islands","NaturalResources",["none"]). bgfact("Paraguay","LandBounderies",["Argentina","Bolivia","Brazil"]). bgfact("Paraguay","NaturalResources",["hydropower","timber","iron = ore","manganese","limestone"]). bgfact("Paraguay","Population",["5213772"]). bgfact("Paraguay","Capital",["Asuncion"]). bgfact("Paraguay","MemberOf",["AG","CCC","ECLAC","FAO","G-77","GATT","IAD= B","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO","INT= ELSAT","INTERPOL","IOC","IOM","ITU","LAES","LAIA","LORCS","MERCOSUR","OAS= ","OPANAL","PCA","RG","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WHO","W= IPO","WMO","WTO"]). bgfact("Paraguay","ExportCommodities",["cotton","soybean","timber","veget= able oils","meat products","coffee","tung oil"]). bgfact("Paraguay","ExportPartners",["EC","Brazil","Argentina","Chile","US= "]). bgfact("Paraguay","ImportCommodities",["Capital = goods","foodstuffs","consumer goods","raw materials","fuels"]). bgfact("Paraguay","ImportPartners",["Brazil","EC","US","Argentina","Japan= "]). bgfact("Paraguay","Industries",["meat packing","oilseed = crushing","milling","brewing","textiles","cement","construction"]). bgfact("Paraguay","Agriculture",["cotton","sugarcane","wheat","tobacco","= cassava","fruits","animal beef","pork","eggs","self-sufficient in most = foods"]). bgfact("Peru","LandBounderies",["Bolivia","Brazil","Chile","Colombia","Ec= uador"]). bgfact("Peru","NaturalResources",["copper","silver","gold","petroleum","t= imber","fish","iron ore","coal","phosphate","potash"]). bgfact("Peru","Population",["23650671"]). bgfact("Peru","Capital",["Lima"]). bgfact("Peru","MemberOf",["AG","CCC","ECLAC","FAO","G-11","G-15","G-19","= G-24","G-77","GATT","IADB","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC= ","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM","ISO","U= N","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]= ). bgfact("Peru","ExportCommodities",["copper","zinc","fishmeal","crude = petroleum and byproducts","lead","refined silver","coffee","cotton"]). bgfact("Peru","ExportPartners",["US","Japan","Italy","Germany"]). bgfact("Peru","ImportCommodities",["machinery","transport = equipment","foodstuffs","petroleum","iron and = steel","chemicals","pharmaceuticals"]). bgfact("Peru","ImportPartners",["US","Colombia","Argentina","Japan","Germ= any","Brazil"]). bgfact("Peru","Industries",["mining of = metals","petroleum","fishing","textiles","clothing","food = processing","cement","auto assembly","steel","shipbuilding","metal = fabrication"]). bgfact("Peru","Agriculture",["accounts for of GDP","commercial = coffee","cotton","wheat","potatoes","plantains","animal poultry","red = meats","dairy","fish catch of million metric tons"]). bgfact("Philippines","LandBounderies",[]). bgfact("Philippines","NaturalResources",["timber","petroleum","nickel","c= obalt","silver","gold","salt","copper"]). bgfact("Philippines","Population",["69808930"]). bgfact("Philippines","Capital",["Manila"]). bgfact("Philippines","MemberOf",["APEC","AsDB","ASEAN","CCC","CP","ESCAP"= ,"FAO","G-24","G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IF= C","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM","ISO","= ITU","LORCS","NAM","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UNTAC","UPU","= WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Philippines","ExportCommodities",["electronics","textiles","cocon= ut products","cooper","fish"]). bgfact("Philippines","ExportPartners",["US","Japan","Germany","UK","Hong = Kong"]). bgfact("Philippines","ImportCommodities",["raw materials","Capital = goods","petroleum products"]). bgfact("Philippines","ImportPartners",["Japan","US","Taiwan","Saudi = Arabia","Hong Kong","South Korea"]). bgfact("Philippines","Industries",["textiles","pharmaceuticals","chemical= s","wood products","food processing","electronics assembly","petroleum = refining","fishing"]). bgfact("Philippines","Agriculture",["major = rice","coconuts","corn","sugarcane","bananas","pineapples","animal = pork","eggs","fish catch of million metric tons annually"]). bgfact("Pitcairn Islands","LandBounderies",[]). bgfact("Pitcairn Islands","NaturalResources",["miro trees","fish"]). bgfact("Pitcairn Islands","Population",["71"]). bgfact("Pitcairn Islands","Capital",["Adamstown"]). bgfact("Pitcairn Islands","MemberOf",["SPC"]). bgfact("Pitcairn = Islands","ExportCommodities",["fruits","vegetables","curios"]). bgfact("Pitcairn Islands","ExportPartners",["NA"]). bgfact("Pitcairn Islands","ImportCommodities",["fuel = oil","machinery","building materials","flour","sugar"]). bgfact("Pitcairn Islands","ImportPartners",["NA"]). bgfact("Pitcairn Islands","Industries",["postage stamp = sales","handicrafts"]). bgfact("Pitcairn Islands","Agriculture",["must import grain products"]). bgfact("Poland","LandBounderies",["Belarus","Czech = Republic","Germany","Lithuania","Russia","Slovakia","Ukraine"]). bgfact("Poland","NaturalResources",["coal","sulfur","copper","natural = gas","silver","lead","salt"]). bgfact("Poland","Population",["38654561"]). bgfact("Poland","Capital",["Warsaw"]). bgfact("Poland","MemberOf",["BIS","BSEC","PCA","UN","UNCTAD","UNESCO","UN= DOF","UNIDO","UNIFIL","UNIKOM","UNOMIG","UNPROFOR","UNTAC","UPU","WCL","W= FTU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Poland","ExportCommodities",["machinery","metals","chemicals","fu= els and power","food"]). bgfact("Poland","ExportPartners",["Germany","Netherlands","Italy","Russia= "]). bgfact("Poland","ImportCommodities",["fuels and = power","machinery","chemicals","food"]). bgfact("Poland","ImportPartners",["Germany","Russia","Italy","UK"]). bgfact("Poland","Industries",["machine building","iron and = steel","extractive Industries","chemicals","shipbuilding","food = processing","glass","beverages","textiles"]). bgfact("Poland","Agriculture",["of output from private farms","leading = European producer of rye","rapeseed","normally self-sufficient in = food"]). bgfact("Portugal","LandBounderies",["Spain"]). bgfact("Portugal","NaturalResources",["fish","forests","tungsten","iron = ore","uranium ore","marble"]). bgfact("Portugal","Population",["10524210"]). bgfact("Portugal","Capital",["Lisbon"]). bgfact("Portugal","MemberOf",["AfDB","Australian = Group","BIS","CCC","CE","CERN","COCOM","CSCE","EBRD","EC","ECE","ECLAC","= EIB","FAO","GATT","IADB","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IEA","= IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","IOM= ","ISO","ITU","LAIA","OECD","PCA","UN","UNCTAD","UNESCO","UNIDO","UNOMOZ"= ,"UNPROFOR","UPU","WCL","WEU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Portugal","ExportCommodities",["cotton textiles","cork and paper = products","canned fish","wine","timber and timber = products","resin","machinery","appliances"]). bgfact("Portugal","ExportPartners",["EC","US"]). bgfact("Portugal","ImportCommodities",["machinery and transport = equipment","agricultural products","chemicals","petroleum","textiles"]). bgfact("Portugal","ImportPartners",["EC","US"]). bgfact("Portugal","Industries",["wood pulp","paper","tourism"]). bgfact("Portugal","Agriculture",["small","major = grain","potatoes","olives","livestock sector - = sheep","cattle","goats","poultry","meat","dairy products"]). bgfact("Puerto Rico","LandBounderies",[]). bgfact("Puerto Rico","NaturalResources",["some copper and = nickel","potential for onshore and offshore crude"]). bgfact("Puerto Rico","Population",["3801977"]). bgfact("Puerto Rico","Capital",["San Juan"]). bgfact("Puerto Rico","MemberOf",["CARICOM"]). bgfact("Puerto = Rico","ExportCommodities",["pharmaceuticals","electronics","apparel","can= ned tuna","rum","beverage concentrates","medical = equipment","instruments"]). bgfact("Puerto Rico","ExportPartners",["US"]). bgfact("Puerto = Rico","ImportCommodities",["chemicals","clothing","food","fish","petroleu= m products"]). bgfact("Puerto Rico","ImportPartners",["US"]). bgfact("Puerto Rico","Industries",["manubgfacturing accounts for of GDP: = manubgfacturing of pharmaceuticals","electronics","apparel","food = products","tourism"]). bgfact("Puerto Rico","Agriculture",["accounts for only of labor force = and less than of GDP: = sugarcane","coffee","pineapples","plantains","livestock - = cattle","imports a large share of food needs"]). bgfact("Qatar","LandBounderies",["Saudi Arabia"]). bgfact("Qatar","NaturalResources",["petroleum","natural gas","fish"]). bgfact("Qatar","Population",["512779"]). bgfact("Qatar","Capital",["Doha"]). bgfact("Qatar","MemberOf",["ABEDA","AFESD","AL","AMF","CCC","ESCWA","FAO"= ,"G-77","GCC","IAEA","IBRD","ICAO","IDB","IFAD","ILO","IMF","IMO","INMARS= AT","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAPEC","OIC","OPEC",= "UN","UNCTAD","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Qatar","ExportCommodities",["petroleum = products","steel","fertilizers"]). bgfact("Qatar","ExportPartners",["Japan","Brazil","South = Korea","UAE","Singapore"]). bgfact("Qatar","ImportCommodities",["machinery and equipment","consumer = goods","food","chemicals"]). bgfact("Qatar","ImportPartners",["Japan","UK","US","Germany","France"]). bgfact("Qatar","Industries",["crude production and = refining","fertilizers","petrochemicals","steel","cement"]). bgfact("Qatar","Agriculture",["farming and grazing on small scale","most = food imported"]). bgfact("Reunion","LandBounderies",[]). bgfact("Reunion","NaturalResources",["fish","arable land"]). bgfact("Reunion","Population",["652857"]). bgfact("Reunion","Capital",["Saint-Denis"]). bgfact("Reunion","MemberOf",["FZ","WFTU"]). bgfact("Reunion","ExportCommodities",["sugar","rum and = molasses","perfume essences","lobster","vanilla and tea"]). bgfact("Reunion","ExportPartners",["France","Mauritius","Bahrain","South = Africa","Italy"]). bgfact("Reunion","ImportCommodities",["manubgfactured = goods","food","beverages","tobacco","machinery and transportation = equipment","raw materials"]). bgfact("Reunion","ImportPartners",["France","Mauritius","Bahrain","South = Africa","Italy"]). bgfact("Reunion","Industries",["sugar","rum","cigarettes","several small = shops producing handicraft items"]). bgfact("Reunion","Agriculture",["sugarcane","vanilla","food tropical = fruits","vegetables","imports large share of food needs"]). bgfact("Romania","LandBounderies",["Bulgaria","Hungary","Moldova","Serbia= and Montenegro"]). bgfact("Romania","NaturalResources",["petroleum","timber","natural = gas","coal","iron ore","salt"]). bgfact("Romania","Population",["23181415"]). bgfact("Romania","Capital",["Bucharest"]). bgfact("Romania","MemberOf",["ACCT","PCA","UN","UNCTAD","UNESCO","UNIDO",= "UNIKOM","UNOSOM","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Romania","ExportCommodities",["metals and metal = products","mineral products","textiles","electric machines and = equipment","transport materials"]). bgfact("Romania","ExportPartners",["EC","developing countries","East and = Central Europe","EFTA","Russia","Japan","US"]). bgfact("Romania","ImportCommodities",["minerals","machinery and = equipment","textiles","agricultural goods"]). bgfact("Romania","ImportPartners",["EC","East and Central = Europe","developing countries","Russia","EFTA","US","Japan"]). bgfact("Romania","Industries",["mining","timber","construction = materials","metallurgy","chemicals","machine building","food = processing","petroleum production and refining"]). bgfact("Romania","Agriculture",["sunflower = seed","potatoes","milk","eggs","meat","grapes"]). bgfact("Russia","LandBounderies",["Azerbaijan","Belarus","China","Ukraine= "]). bgfact("Russia","NaturalResources",["wide natural resource base = including major deposits of oil","natural gas","coal","timber"]). bgfact("Russia","Population",["149608953"]). bgfact("Russia","Capital",["Moscow"]). bgfact("Russia","MemberOf",["BSEC","CBSS","CCC","CE","PCA","UN","UNCTAD",= "UNESCO","UNIDO","UNIKOM","UNOMOZ","UNPROFOR","UN Security = Council","UNTAC","UN Trusteeship = Council","UNTSO","UPU","WHO","WIPO","WMO","WTO","ZC"]). bgfact("Russia","ExportCommodities",["petroleum and petroleum = products","natural gas","wood and wood products","metals","chemicals"]). bgfact("Russia","ExportPartners",["Europe","North = America","Japan","Third World countries","Cuba"]). bgfact("Russia","ImportCommodities",["machinery and = equipment","chemicals","consumer = goods","grain","meat","sugar","semifinished metal products"]). bgfact("Russia","ImportPartners",["Europe","North = America","Japan","Third World countries","Cuba"]). bgfact("Russia","Industries",["coal","oil","gas","chemicals","agricultura= l machinery","tractors","consumer durables"]). bgfact("Russia","Agriculture",["grain","sugar beet","sunflower = seeds","meat","milk","vegetables","cotton","tea"]). bgfact("Rwanda","LandBounderies",["Burundi","Tanzania","Uganda","Zaire"])= . bgfact("Rwanda","NaturalResources",["gold","cassiterite","natural = gas","hydropower"]). bgfact("Rwanda","Population",["8373963"]). bgfact("Rwanda","Capital",["Kigali"]). bgfact("Rwanda","MemberOf",["ACCT","ACP","AfDB","ECA","CCC","CEEAC","CEPG= L","FAO","G-77","GATT","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IM= F","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","UN","UNCTAD","U= NESCO","UNIDO","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Rwanda","ExportCommodities",["coffee","tea","cassiterite","wolfra= mite","pyrethrum"]). bgfact("Rwanda","ExportPartners",["Germany","Belgium","Italy","Uganda","U= K","France","US"]). bgfact("Rwanda","ImportCommodities",["textiles","foodstuffs","machines = and equipment","Capital goods","steel","petroleum products","cement and = construction material"]). bgfact("Rwanda","ImportPartners",["US","Belgium","Germany","Kenya","Japan= "]). bgfact("Rwanda","Industries",["mining of = cassiterite","tin","cement","agricultural processing","small-scale = beverage production","soap","furniture","shoes","plastic = goods","textiles","cigarettes"]). bgfact("Rwanda","Agriculture",["coffee","tea","bananas","beans","sorghum"= ]). bgfact("Saint Helena","LandBounderies",[]). bgfact("Saint Helena","NaturalResources",["no minerals"]). bgfact("Saint Helena","Population",["6741"]). bgfact("Saint Helena","Capital",["Jamestown"]). bgfact("Saint Helena","MemberOf",["ICFTU"]). bgfact("Saint Helena","ExportCommodities",["fish","handicrafts"]). bgfact("Saint Helena","ExportPartners",["South Africa","UK"]). bgfact("Saint = Helena","ImportCommodities",["food","beverages","tobacco","fuel = oils","animal feed","building materials","motor vehicles and = parts","machinery and parts"]). bgfact("Saint Helena","ImportPartners",["UK","South Africa"]). bgfact("Saint Helena","Industries",["crafts","fishing"]). bgfact("Saint Helena","Agriculture",["maize","potatoes","crawfishing on = Tristan da Cunha"]). bgfact("Saint Kitts and Nevis","LandBounderies",[]). bgfact("Saint Kitts and Nevis","NaturalResources",["negligible"]). bgfact("Saint Kitts and Nevis","Population",["40671"]). bgfact("Saint Kitts and Nevis","Capital",["Basseterre"]). bgfact("Saint Kitts and = Nevis","MemberOf",["ACP","C","CARICOM","CDB","ECLAC","FAO","G-77","IBRD",= "ICFTU","IDA","IFAD","IMF","INTERPOL","LORCS","OAS","OECS","UN","UNCTAD",= "UNESCO","UNIDO","UPU","WCL","WHO"]). bgfact("Saint Kitts and = Nevis","ExportCommodities",["sugar","clothing","electronics","postage = stamps"]). bgfact("Saint Kitts and Nevis","ExportPartners",["US","UK","Trinidad and = Tobago","OECS"]). bgfact("Saint Kitts and = Nevis","ImportCommodities",["foodstuffs","intermediate = manubgfactures","machinery","fuels"]). bgfact("Saint Kitts and Nevis","ImportPartners",["US","UK","Trinidad and = Tobago","Canada","Japan","OECS"]). bgfact("Saint Kitts and Nevis","Industries",["sugar = processing","tourism","cotton","salt","copra","clothing","footwear","beve= rages"]). bgfact("Saint Kitts and Nevis","Agriculture",["subsistence = rice","yams","vegetables","most food imported"]). bgfact("Saint Lucia","LandBounderies",[]). bgfact("Saint Lucia","NaturalResources",["forests","sandy = beaches","minerals","mineral springs"]). bgfact("Saint Lucia","Population",["145090"]). bgfact("Saint Lucia","Capital",["Castries"]). bgfact("Saint = Lucia","MemberOf",["ACCT","INTERPOL","LORCS","NAM","OAS","OECS","UN","UNC= TAD","UNESCO","UNIDO","UPU","WCL","WHO","WIPO","WMO"]). bgfact("Saint = Lucia","ExportCommodities",["bananas","clothing","cocoa","vegetables","fr= uits","coconut oil"]). bgfact("Saint Lucia","ExportPartners",["UK","US","CARICOM"]). bgfact("Saint Lucia","ImportCommodities",["manubgfactured = goods","machinery and transportation equipment","food and live = animals","chemicals","fuels"]). bgfact("Saint = Lucia","ImportPartners",["US","CARICOM","UK","Japan","Canada"]). bgfact("Saint Lucia","Industries",["clothing","assembly of electronic = components","beverages","corrugated cardboard boxes","tourism","lime = processing","coconut processing"]). bgfact("Saint = Lucia","Agriculture",["bananas","coconuts","vegetables","citrus = fruit","root crops","imports food for the tourist industry"]). bgfact("Saint Pierre and Miquelon","LandBounderies",[]). bgfact("Saint Pierre and Miquelon","NaturalResources",["fish","deepwater = ports"]). bgfact("Saint Pierre and Miquelon","Population",["6704"]). bgfact("Saint Pierre and Miquelon","Capital",["Saint-Pierre"]). bgfact("Saint Pierre and Miquelon","MemberOf",["FZ","WFTU"]). bgfact("Saint Pierre and Miquelon","ExportCommodities",["fish and fish = products","fox and mink pelts"]). bgfact("Saint Pierre and = Miquelon","ExportPartners",["US","France","UK","Canada","Portugal"]). bgfact("Saint Pierre and = Miquelon","ImportCommodities",["meat","clothing","fuel","electrical = equipment","machinery","building materials"]). bgfact("Saint Pierre and = Miquelon","ImportPartners",["Canada","France","US","Netherlands","UK"]). bgfact("Saint Pierre and Miquelon","Industries",["tourism"]). bgfact("Saint Pierre and = Miquelon","Agriculture",["vegetables","cattle","sheep","fish catch = of"]). bgfact("Saint Vincent and the Grenadines","LandBounderies",[]). bgfact("Saint Vincent and the = Grenadines","NaturalResources",["negligible"]). bgfact("Saint Vincent and the Grenadines","Population",["115437"]). bgfact("Saint Vincent and the Grenadines","Capital",["Kingstown"]). bgfact("Saint Vincent and the = Grenadines","MemberOf",["ACP","C","CARICOM","CDB","ECLAC","FAO","G-77","G= ATT","IBRD","ICAO","ICFTU","IDA","IFAD","IMF","IMO","INTELSAT","INTERPOL"= ,"IOC","ITU","LORCS","OAS","OECS","OPANAL","UN","UNCTAD","UNESCO","UNIDO"= ,"UPU","WCL","WFTU","WHO"]). bgfact("Saint Vincent and the = Grenadines","ExportCommodities",["bananas","eddoes and = dasheen","arrowroot starch","tennis racquets"]). bgfact("Saint Vincent and the = Grenadines","ExportPartners",["UK","CARICOM","US"]). bgfact("Saint Vincent and the = Grenadines","ImportCommodities",["foodstuffs","machinery and = equipment","chemicals and fertilizers","minerals and fuels"]). bgfact("Saint Vincent and the = Grenadines","ImportPartners",["US","CARICOM","UK","Trinidad and = Tobago"]). bgfact("Saint Vincent and the Grenadines","Industries",["food = processing","cement","furniture","clothing","starch"]). bgfact("Saint Vincent and the = Grenadines","Agriculture",["bananas","coconuts","sweet potatoes","small = numbers of cattle","sheep","hogs","small fish catch used locally"]). bgfact("San Marino","LandBounderies",["Italy"]). bgfact("San Marino","NaturalResources",["building stone"]). bgfact("San Marino","Population",["24091"]). bgfact("San Marino","Capital",["San Marino"]). bgfact("San = Marino","MemberOf",["CE","CSCE","ECE","ICAO","ICFTU","ILO","IMF","IOC","I= OM","UN","UNCTAD","UNESCO","UPU","WHO","WIPO","WTO"]). bgfact("San Marino","Industries",["wine","olive = oil","cement","leather","textile","tourism"]). bgfact("San = Marino","Agriculture",["wheat","grapes","maize","olives","meat","cheese",= "small numbers of cattle","pigs","depends on Italy for food imports"]). bgfact("Sao Tome and Principe","LandBounderies",[]). bgfact("Sao Tome and Principe","NaturalResources",["fish"]). bgfact("Sao Tome and Principe","Population",["136780"]). bgfact("Sao Tome and Principe","Capital",["Sao Tome"]). bgfact("Sao Tome and = Principe","MemberOf",["ACP","AfDB","CEEAC","ECA","FAO","G-77","IBRD","ICA= O","IDA","IFAD","ILO","IMF","IMO","INTELSAT","ITU","LORCS","NAM","OAU","U= N","UNCTAD","UNESCO","UNIDO","UPU","WHO","WMO","WTO"]). bgfact("Sao Tome and = Principe","ExportCommodities",["cocoa","copra","coffee","palm oil"]). bgfact("Sao Tome and = Principe","ExportPartners",["Netherlands","Germany","China","Portugal"]).= bgfact("Sao Tome and Principe","ImportCommodities",["machinery and = electrical equipment","food products","petroleum"]). bgfact("Sao Tome and = Principe","ImportPartners",["Portugal","Japan","Spain","France","Angola"]= ). bgfact("Sao Tome and Principe","Industries",["light = construction","shirts","soap","beer","fisheries","shrimp processing"]). bgfact("Sao Tome and Principe","Agriculture",["dominant sector of = economy","cocoa","coconuts","palm kernels","food = bananas","papaya","beans","poultry","not self-sufficient in food grain = and meat"]). bgfact("Saudi = Arabia","LandBounderies",["Iraq","Jordan","Kuwait","Oman","Qatar","UAE","= Yemen"]). bgfact("Saudi Arabia","NaturalResources",["petroleum","natural = gas","iron ore","gold","copper"]). bgfact("Saudi Arabia","Population",["18196783"]). bgfact("Saudi Arabia","Capital",["Riyadh"]). bgfact("Saudi = Arabia","MemberOf",["ABEDA","AfDB","AFESD","AL","AMF","CCC","ESCWA","FAO"= ,"G-19","G-77","GCC","IAEA","IBRD","ICAO","ICC","IDA","IDB","IFAD","IFC",= "ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","ISO","ITU","LOR= CS","NAM","OAPEC","OAS","OIC","OPEC","UN","UNCTAD","UNESCO","UNIDO","UNOS= OM","UPU","WFTU","WHO","WIPO","WMO"]). bgfact("Saudi Arabia","ExportCommodities",["petroleum and petroleum = products"]). bgfact("Saudi = Arabia","ExportPartners",["US","Japan","Singapore","France","Korea"]). bgfact("Saudi Arabia","ImportCommodities",["machinery and = equipment","chemicals","foodstuffs","motor vehicles","textiles"]). bgfact("Saudi = Arabia","ImportPartners",["US","UK","Japan","Germany","France"]). bgfact("Saudi Arabia","Industries",["crude production","petroleum = refining","basic petrochemicals","cement","two small steel-rolling = mills","construction","fertilizer","plastics"]). bgfact("Saudi Arabia","Agriculture",["accounts for about of = GDP","wheat","barley","tomatoes","melons","dates","citrus = fruit","mutton","chickens","eggs","approaching self-sufficiency in = food"]). bgfact("Senegal","LandBounderies",["The = Gambia","Guinea","Guinea-Bissau","Mali","Mauritania"]). bgfact("Senegal","NaturalResources",["fish","phosphates","iron ore"]). bgfact("Senegal","Population",["8730508"]). bgfact("Senegal","Capital",["Dakar"]). bgfact("Senegal","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOW= AS","FAO","FZ","G-15","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","I= DA","IDB","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","IOM= ","ITU","LORCS","NAM","OAU","OIC","PCA","UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNIKOM","UNOMUR","UNTAC","UPU","WADB","WCL= ","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Senegal","ExportCommodities",["fish","ground nuts","petroleum = products","phosphates","cotton"]). bgfact("Senegal","ExportPartners",["France","Cote d'Ivoire","Mali"]). bgfact("Senegal","ImportCommodities",["foods and beverages","consumer = goods","Capital goods","petroleum"]). bgfact("Senegal","ImportPartners",["France","Nigeria","Cote = d'Ivoire","Algeria","China","Japan"]). bgfact("Senegal","Industries",["agricultural and fish = processing","phosphate mining","petroleum refining","building = materials"]). bgfact("Senegal","Agriculture",["major = peanuts","millet","corn","sorghum","rice","cotton","tomatoes","fish = catch of"]). bgfact("Serbia and = Montenegro","LandBounderies",["Albania","Hungary","The Former Yugoslav = Republic of Macedonia","Romania"]). bgfact("Serbia and = Montenegro","NaturalResources",["oil","gas","coal","antimony","copper","l= ead","zinc","nickel","gold","pyrite","chrome"]). bgfact("Serbia and Montenegro","Capital",["Belgrade"]). bgfact("Serbia and Montenegro","ExportCommodities",["machinery and = transport equipment","manubgfactured goods","miscellaneous = manubgfactured articles","chemicals","food and live animals","raw = materials","fuels and lubricants","beverages and tobacco"]). bgfact("Serbia and Montenegro","ExportPartners",["Italy","Germany","the = FSU countries","East European countries","US"]). bgfact("Serbia and Montenegro","ImportCommodities",["machinery and = transport equipment","fuels and lubricants","manubgfactured = goods","chemicals","food and live animals","miscellaneous manubgfactured = items","raw materials","including coking coal for the steel = industry","beverages","tobacco"]). bgfact("Serbia and Montenegro","ImportPartners",["the FSU countries","EC = countries","East European countries","US"]). bgfact("Serbia and Montenegro","Industries",["machine = building","electronics","petroleum products","chemicals"]). bgfact("Serbia and Montenegro","Agriculture",["the fertile plains of = Vojvodina produce of the cereal production of the former Yugoslavia and = most of the cotton","oilseeds","Serbia proper","although = hilly","produces fruit","grapes","in this area","Kosovo produces = fruits","vegetables","tobacco","mostly near the coast where a = Mediterranean climate permits the culture of = olives","citrus","grapes"]). bgfact("Seychelles","LandBounderies",[]). bgfact("Seychelles","NaturalResources",["fish","copra","cinnamon = trees"]). bgfact("Seychelles","Population",["72113"]). bgfact("Seychelles","Capital",["Victoria"]). bgfact("Seychelles","MemberOf",["ACCT","ACP","AfDB","C","ECA","FAO","G-77= ","IBRD","ICAO","ICFTU","IFAD","IFC","ILO","IMF","IMO","INTELSAT","NAM","= OAU","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WHO","WMO","WTO"]). bgfact("Seychelles","ExportCommodities",["fish","copra","cinnamon = bark","petroleum products"]). bgfact("Seychelles","ExportPartners",["UK France","Reunion"]). bgfact("Seychelles","ImportCommodities",["manubgfactured = goods","food","petroleum products","tobacco","beverages","machinery and = transportation equipment"]). bgfact("Seychelles","ImportPartners",["South Africa","Singapore","UK"]). bgfact("Seychelles","Industries",["tourism","processing of coconut and = vanilla","fishing","coir rope bgfactory","boat = building","printing","furniture","beverage"]). bgfact("Seychelles","Agriculture",["accounts for of = GDP","coconuts","cinnamon","cassava","expansion of tuna fishing under = way"]). bgfact("Sierra Leone","LandBounderies",["Guinea","Liberia"]). bgfact("Sierra Leone","NaturalResources",["diamonds","titanium = ore","bauxite","iron ore","gold","chromite"]). bgfact("Sierra Leone","Population",["4630037"]). bgfact("Sierra Leone","Capital",["Freetown"]). bgfact("Sierra = Leone","MemberOf",["ACP","AfDB","C","CCC","ECA","ECOWAS","FAO","G-77","GA= TT","IAEA","IBRD","ICAO","ICFTU","IDA","IDB","IFAD","IFC","ILO","IMF","IM= O","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU","OIC","UN","UNCT= AD","UNESCO","UNIDO","UNOMIG","UPU","WCL","WHO","WIPO","WMO","WTO"]). bgfact("Sierra = Leone","ExportCommodities",["rutile","bauxite","diamonds","coffee"]). bgfact("Sierra Leone","ExportPartners",["US","UK","Belgium","Germany"]). bgfact("Sierra Leone","ImportCommodities",["foodstuffs","machinery and = equipment","fuels"]). bgfact("Sierra Leone","ImportPartners",["US","EC = countries","Japan","China","Nigeria"]). bgfact("Sierra Leone","Industries",["mining","petroleum refinery"]). bgfact("Sierra Leone","Agriculture",["coffee","cocoa","annual fish = catch averages"]). bgfact("Singapore","LandBounderies",[]). bgfact("Singapore","NaturalResources",["fish","deepwater ports"]). bgfact("Singapore","Population",["2859142"]). bgfact("Singapore","Capital",["Singapore"]). bgfact("Singapore","MemberOf",["APEC","AsDB","ASEAN","C","CCC","COCOM","C= P","ESCAP","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","IFC","ILO","= IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NA= M","UN","UNAVEM = II","UNCTAD","UNIKOM","UNTAC","UPU","WHO","WIPO","WMO"]). bgfact("Singapore","ExportCommodities",["computer equipment","rubber and = rubber products","petroleum products","telecommunications equipment"]). bgfact("Singapore","ExportPartners",["US","Malaysia","Hong = Kong","Japan","Thailand"]). bgfact("Singapore","ImportCommodities",["aircraft","petroleum","chemicals= ","foodstuffs"]). bgfact("Singapore","ImportPartners",["Japan","US","Malaysia","Saudi = Arabia","Taiwan"]). bgfact("Singapore","Industries",["petroleum refining","electronics","oil = drilling equipment","rubber processing and rubber products","processed = food and beverages","ship repair","entrepot trade","financial = services","biotechnology"]). bgfact("Singapore","Agriculture",["major = rubber","copra","fruit","vegetables"]). bgfact("Slovakia","LandBounderies",["Austria","Czech = Republic","Hungary","Poland","Ukraine"]). bgfact("Slovakia","NaturalResources",["small amounts of iron = ore","salt"]). bgfact("Slovakia","Population",["5403505"]). bgfact("Slovakia","Capital",["Bratislava"]). bgfact("Slovakia","MemberOf",["BIS","CCC","CE","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNOMUR","UNPROFOR","UPU","WFTU","WHO","WIP= O","WMO","WTO","ZC"]). bgfact("Slovakia","ExportCommodities",["fuels","minerals","agricultural = products"]). bgfact("Slovakia","ExportPartners",["Czech Republic","CIS = republics","Germany","Poland","Austria","Hungary","Italy","France","US","= UK"]). bgfact("Slovakia","ImportCommodities",["agricultural products"]). bgfact("Slovakia","ImportPartners",["Czech Republic","CIS = republics","Germany","Austria","Poland","Switzerland","Hungary","UK","Ita= ly"]). bgfact("Slovakia","Industries",["brown coal = mining","chemicals","metal-working","consumer = appliances","fertilizer","plastics","armaments"]). bgfact("Slovakia","Agriculture",["diversified crop and livestock = production","including grains","potatoes","sugar = beets","hops","fruit","hogs","cattle","exporter of forest products"]). bgfact("Slovenia","LandBounderies",["Austria","Croatia","Italy","Hungary"= ]). bgfact("Slovenia","NaturalResources",["lignite = coal","lead","zinc","mercury","uranium","silver"]). bgfact("Slovenia","Population",["1972227"]). bgfact("Slovenia","Capital",["Ljubljana"]). bgfact("Slovenia","MemberOf",["CCC","CE","CEI","CSCE","EBRD","ECE","IAEA"= ,"IBRD","ICAO","IDA","IFC","ILO","IMF","IMO","INTELSAT","UN","UNCTAD","UN= ESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Slovenia","ExportCommodities",["machinery and transport = equipment","chemicals","food and live animals","raw = materials","beverages and tobacco less than"]). bgfact("Slovenia","ExportPartners",["Germany","Croatia","Italy","France"]= ). bgfact("Slovenia","ImportCommodities",["machinery and transport = equipment","chemicals","raw materials","fuels and lubricants","food and = live animals"]). bgfact("Slovenia","ImportPartners",["Germany","Croatia","Italy","France",= "Austria"]). bgfact("Slovenia","Industries",["ferrous metallurgy and rolling mill = products","aluminum reduction and rolled products","lead and zinc = smelting","electronics","trucks","electric power equipment","wood = products","textiles","chemicals","machine tools"]). bgfact("Slovenia","Agriculture",["main potatoes","hops","hemp"]). bgfact("Solomon Islands","LandBounderies",[]). bgfact("Solomon = Islands","NaturalResources",["fish","forests","gold","bauxite","phosphate= s","lead","zinc","nickel"]). bgfact("Solomon Islands","Population",["385811"]). bgfact("Solomon Islands","Capital",["Honiara"]). bgfact("Solomon = Islands","MemberOf",["ACP","AsDB","C","ESCAP","FAO","G-77","IBRD","ICAO",= "IDA","IFAD","IFC","ILO","IMF","IMO","INTELSAT","IOC","ITU","LORCS","SPAR= TECA","SPC","SPF","UN","UNCTAD","UNESCO","UPU","WFTU","WHO","WMO"]). bgfact("Solomon Islands","ExportCommodities",["fish","timber","palm = oil","cocoa","copra"]). bgfact("Solomon = Islands","ExportPartners",["Japan","UK","Thailand","Australia","US"]). bgfact("Solomon Islands","ImportCommodities",["plant and machinery = manubgfactured goods","food and live animals","fuel"]). bgfact("Solomon = Islands","ImportPartners",["Australia","Japan","Singapore","NZ"]). bgfact("Solomon Islands","Industries",["copra","fish"]). bgfact("Solomon Islands","Agriculture",["including fishing and = forestry","cocoa","beans","coconuts","palm = kernels","potatoes","vegetables","fruit","cattle"]). bgfact("Somalia","LandBounderies",["Djibouti","Ethiopia","Kenya"]). bgfact("Somalia","NaturalResources",["uranium and largely unexploited = reserves of iron ore","tin","gypsum","bauxite","copper","salt"]). bgfact("Somalia","Population",["6666873"]). bgfact("Somalia","Capital",["Mogadishu"]). bgfact("Somalia","MemberOf",["ACP","AfDB","AFESD","AL","AMF","CAEU","ECA"= ,"FAO","G-77","IBRD","ICAO","IDA","IDB","IFAD","IFC","IGADD","ILO","IMF",= "IMO","INTELSAT","INTERPOL","IOC","IOM","ITU","LORCS","NAM","OAU","OIC","= UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Somalia","ExportCommodities",["bananas","live = animals","fish","hides"]). bgfact("Somalia","ExportPartners",["Saudi Arabia","Italy","FRG"]). bgfact("Somalia","ImportCommodities",["petroleum = products","foodstuffs","construction materials"]). bgfact("Somalia","ImportPartners",["US","Italy","FRG","Kenya","UK","Saudi= Arabia"]). bgfact("Somalia","Industries",["sugar","textiles"]). bgfact("Somalia","Agriculture",["dominant = sector","bananas","sorghum","corn","mangoes","fishing potential largely = unexploited"]). bgfact("South = Africa","LandBounderies",["Botswana","Lesotho","Mozambique","Namibia","Sw= aziland","Zimbabwe"]). bgfact("South = Africa","NaturalResources",["gold","chromium","antimony","coal","iron = ore","manganese","nickel","phosphates","tin","uranium","gem = diamonds","platinum","copper","vanadium","salt","natural gas"]). bgfact("South Africa","Population",["43930631"]). bgfact("South Africa","Capital",["Pretoria"]). bgfact("South = Africa","MemberOf",["BIS","CCC","ECA","GATT","G-77","IAEA","IBRD","ICAO",= "ZC"]). bgfact("South Africa","ExportCommodities",["gold","food","chemicals"]). bgfact("South = Africa","ExportPartners",["Italy","Japan","US","Germany","UK","Hong = Kong"]). bgfact("South Africa","ImportCommodities",["machinery","transport = equipment","chemicals","oil","textiles","scientific instruments"]). bgfact("South = Africa","ImportPartners",["Germany","US","Japan","UK","Italy"]). bgfact("South Africa","Industries",["mining","automobile = assembly","metalworking","machinery","textile","iron and = steel","chemical","fertilizer","foodstuffs"]). bgfact("South = Africa","Agriculture",["cattle","poultry","sheep","wool","milk","beef","c= orn","wheat","sugarcane","fruits","self-sufficient in food"]). bgfact("South Georgia and the South Sandwich = Islands","LandBounderies",[]). bgfact("South Georgia and the South Sandwich = Islands","NaturalResources",["fish"]). bgfact("South Georgia and the South Sandwich Islands","Capital",["none; = Grytviken on South Georgia is the garrison town"]). bgfact("Spain","LandBounderies",["Andorra","France","Gibraltar","Portugal= "]). bgfact("Spain","NaturalResources",["coal","lignite","iron = ore","uranium","mercury","pyrites","fluorspar","gypsum","zinc","lead","tu= ngsten","copper","kaolin","potash","hydropower"]). bgfact("Spain","Population",["39302665"]). bgfact("Spain","Capital",["Madrid"]). bgfact("Spain","MemberOf",["AG","OECD","ONUSAL","PCA","UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNOMOZ","UNPROFOR","UPU","WCL","WEU","WHO"= ,"WIPO","WMO","WTO","ZC"]). bgfact("Spain","ExportCommodities",["cars and trucks","semifinished = manubgfactured goods","foodstuffs","machinery"]). bgfact("Spain","ExportPartners",["EC","US"]). bgfact("Spain","ImportCommodities",["machinery","transport = equipment","fuels","semifinished goods","foodstuffs","consumer = goods","chemicals"]). bgfact("Spain","ImportPartners",["EC","US","Middle East"]). bgfact("Spain","Industries",["textiles and apparel","food and = beverages","metals and metal = manubgfactures","chemicals","shipbuilding","automobiles","machine = tools","tourism"]). bgfact("Spain","Agriculture",["major grain","vegetables","olives","wine = grapes","sugar beets","citrus fruit","beef","pork","poultry","fish = catch of million metric tons is among top nations"]). bgfact("Spratly Islands","LandBounderies",[]). bgfact("Spratly = Islands","NaturalResources",["fish","guano","undetermined oil and = natural gas potential"]). bgfact("Spratly Islands","Industries",["none"]). bgfact("Sri Lanka","LandBounderies",[]). bgfact("Sri Lanka","NaturalResources",["limestone","graphite","mineral = sands","gems","phosphates","clay"]). bgfact("Sri Lanka","Population",["18129850"]). bgfact("Sri Lanka","Capital",["Colombo"]). bgfact("Sri = Lanka","MemberOf",["AsDB","C","CCC","CP","ESCAP","FAO","G-24","G-77","GAT= T","IAEA","IBRD","ICAO","ICC","ICFTU","IDA","IFAD","IFC","ILO","IMF","IMO= ","INMARSAT","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","NAM",= "PCA","SAARC","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WI= PO","WMO","WTO"]). bgfact("Sri Lanka","ExportCommodities",["garments and = textiles","teas","gems","petroleum products","coconuts","rubber","marine = products","graphite"]). bgfact("Sri = Lanka","ExportPartners",["US","Germany","UK","Netherlands","Japan","Franc= e","Singapore"]). bgfact("Sri Lanka","ImportCommodities",["food and beverages","textiles = and textile materials","petroleum and petroleum products","machinery = and equipment"]). bgfact("Sri = Lanka","ImportPartners",["Japan","India","US","UK","Singapore","Germany",= "Hong King","Taiwan","South Korea"]). bgfact("Sri Lanka","Industries",["processing of = rubber","tea","coconuts","clothing","cement","petroleum = refining","textiles","tobacco"]). bgfact("Sri = Lanka","Agriculture",["grains","pulses","oilseeds","roots","tea","rubber"= ,"animal milk","eggs","hides","not self-sufficient in rice = production"]). bgfact("Sudan","LandBounderies",["Central African = Republic","Chad","Egypt","Eritrea","Ethiopia","Kenya","Libya","Uganda","Z= aire"]). bgfact("Sudan","NaturalResources",["small reserves of petroleum","iron = ore","copper","chromium ore","zinc","tungsten","mica","silver"]). bgfact("Sudan","Population",["29419798"]). bgfact("Sudan","Capital",["Khartoum"]). bgfact("Sudan","MemberOf",["ABEDA","ACP","AfDB","AFESD","AL","AMF","CAEU"= ,"CCC","ECA","FAO","G-77","IAEA","IBRD","ICAO","IDA","IFAD","IFC","IGADD"= ,"ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM","OAU",= "PCA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WFTU","WHO","WIPO","W= MO","WTO"]). bgfact("Sudan","ExportCommodities",["cotton","sesame","gum = arabic","peanuts"]). bgfact("Sudan","ExportPartners",["Western Europe","Saudi = Arabia","Eastern Europe","Japan","US"]). bgfact("Sudan","ImportCommodities",["foodstuffs","petroleum = products","manubgfactured goods","machinery and equipment","medicines = and chemicals","textiles"]). bgfact("Sudan","ImportPartners",["Western Europe","Africa and = Asia","US","Eastern Europe"]). bgfact("Sudan","Industries",["cotton = ginning","textiles","cement","edible oils","sugar","soap = distilling","shoes","petroleum refining"]). bgfact("Sudan","Agriculture",["major = cotton","oilseeds","sorghum","millet","wheat","gum arabic","marginally = self-sufficient in most foods"]). bgfact("Suriname","LandBounderies",["Brazil","French Guiana","Guyana"]). bgfact("Suriname","NaturalResources",["timber","hydropower = potential","fish","shrimp","bauxite","iron = ore","copper","platinum","gold"]). bgfact("Suriname","Population",["422840"]). bgfact("Suriname","Capital",["Paramaribo"]). bgfact("Suriname","MemberOf",["ACP","CARICOM","ITU","LAES","LORCS","NAM",= "OAS","OPANAL","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WHO","WIPO","W= MO"]). bgfact("Suriname","ExportCommodities",["alumina","aluminum","shrimp and = fish","rice","bananas"]). bgfact("Suriname","ExportPartners",["Norway","Netherlands","US","Japan","= Brazil","UK"]). bgfact("Suriname","ImportCommodities",["Capital = equipment","petroleum","foodstuffs","cotton","consumer goods"]). bgfact("Suriname","ImportPartners",["US","Netherlands","Trinidad and = Tobago","Brazil"]). bgfact("Suriname","Industries",["bauxite mining","alumina and aluminum = production","lumbering","food processing","fishing"]). bgfact("Suriname","Agriculture",["palm = kernels","coconuts","plantains","peanuts","beef","self-sufficient in = most foods"]). bgfact("Svalbard","LandBounderies",[]). bgfact("Svalbard","NaturalResources",["coal","copper","iron = ore","phosphate","zinc","wildlife","fish"]). bgfact("Svalbard","Population",["3018"]). bgfact("Svalbard","Capital",["Longyearbyen"]). bgfact("Svalbard","MemberOf",["none"]). bgfact("Swaziland","LandBounderies",["Mozambique","South Africa"]). bgfact("Swaziland","NaturalResources",["asbestos","coal","clay","cassiter= ite","hydropower","forests","small gold and diamond deposits","quarry = stone"]). bgfact("Swaziland","Population",["936369"]). bgfact("Swaziland","Capital",["Mbabane"]). bgfact("Swaziland","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","G-77",= "GATT","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF","INTELSAT","I= NTERPOL","IOC","ITU","LORCS","NAM","OAU","PCA","SACU","SADC","UN","UNCTAD= ","UNESCO","UNIDO","UPU","WHO","WIPO","WMO"]). bgfact("Swaziland","ExportCommodities",["sugar","edible = concentrates","wood pulp","canned fruit","citrus"]). bgfact("Swaziland","ExportPartners",["South Africa","EC = countries","Canada"]). bgfact("Swaziland","ImportCommodities",["motor = vehicles","machinery","transport equipment","petroleum = products","foodstuffs","chemicals"]). bgfact("Swaziland","ImportPartners",["South = Africa","Switzerland","UK"]). bgfact("Swaziland","Industries",["mining","wood pulp","sugar"]). bgfact("Swaziland","Agriculture",["sugarcane","cotton","maize","tobacco",= "rice","citrus fruit","sorghum","peanuts","cattle","goats","not = self-sufficient in grain"]). bgfact("Sweden","LandBounderies",["Finland","Norway"]). bgfact("Sweden","NaturalResources",["zinc","iron = ore","lead","copper","silver","timber","uranium","hydropower = potential"]). bgfact("Sweden","Population",["8778461"]). bgfact("Sweden","Capital",["Stockholm"]). bgfact("Sweden","MemberOf",["AfDB","AG","NC","NEA","NIB","NSG","OECD","ON= USAL","PCA","UN","UNAVEM = II","UNCTAD","UNESCO","UNFICYP","UNHCR","UNIDO","UNIFIL","UNIKOM","UNMOGI= P","UNOMIG","UNOMOZ","UNOSOM","UNPROFOR","UNTAC","UNTSO","UPU","WFTU","WH= O","WIPO","WMO","ZC"]). bgfact("Sweden","ExportCommodities",["machinery","motor vehicles","paper = products","pulp and wood","iron and steel = products","chemicals","petroleum and petroleum products"]). bgfact("Sweden","ExportPartners",["EC"]). bgfact("Sweden","ImportCommodities",["machinery","petroleum and = petroleum products","chemicals","motor vehicles","foodstuffs","iron and = steel","clothing"]). bgfact("Sweden","ImportPartners",["EC"]). bgfact("Sweden","Industries",["iron and steel","precision = equipment","wood pulp and paper products","processed foods","motor = vehicles"]). bgfact("Sweden","Agriculture",["animal husbandry predominates","main = grains","sugar beets","farming accounted for of GDP and of jobs in"]). bgfact("Switzerland","LandBounderies",["Austria","France","Italy","Liecht= enstein","Germany"]). bgfact("Switzerland","NaturalResources",["hydropower = potential","timber","salt"]). bgfact("Switzerland","Population",["7040119"]). bgfact("Switzerland","Capital",["Bern"]). bgfact("Switzerland","MemberOf",["AfDB","AG","UNCTAD","UNESCO","UNHCR","U= NIDO","UNOMIG","UNPROFOR","UNTSO","UPU","WCL","WHO","WIPO","WMO","WTO","Z= C"]). bgfact("Switzerland","ExportCommodities",["machinery and = equipment","precision instruments","metal = products","foodstuffs","textiles and clothing"]). bgfact("Switzerland","ExportPartners",["Western Europe","US","Japan"]). bgfact("Switzerland","ImportCommodities",["agricultural = products","machinery and transportation = equipment","chemicals","textiles","construction materials"]). bgfact("Switzerland","ImportPartners",["Western Europe","US"]). bgfact("Switzerland","Industries",["machinery","chemicals","watches","tex= tiles","precision instruments"]). bgfact("Switzerland","Agriculture",["must import fish","refined = sugar","fats and oils","grains","eggs","fruits","vegetables","meat"]). bgfact("Syria","LandBounderies",["Iraq","Israel","Jordan","Lebanon","Turk= ey"]). bgfact("Syria","NaturalResources",["petroleum","phosphates","chrome and = manganese ores","asphalt","iron ore","rock salt","marble","gypsum"]). bgfact("Syria","Population",["14886672"]). bgfact("Syria","Capital",["Damascus"]). bgfact("Syria","MemberOf",["ABEDA","AFESD","AL","AMF","CAEU","CCC","ESCWA= ","FAO","G-24","G-77","IAEA","IBRD","ICAO","ICC","IDA","IDB","IFAD","IFC"= ,"ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM",= "OAPEC","OIC","UN","UNCTAD","UNESCO","UNIDO","UNRWA","UPU","WFTU","WHO","= WMO","WTO"]). bgfact("Syria","ExportCommodities",["petroleum","textiles","cotton","frui= ts and vegetables"]). bgfact("Syria","ExportPartners",["EC","former CEMA countries","Arab = countries"]). bgfact("Syria","ImportCommodities",["foodstuffs","metal = products","machinery"]). bgfact("Syria","ImportPartners",["EC","former CEMA countries","US and = Canada"]). bgfact("Syria","Industries",["textiles","food = processing","beverages","tobacco","phosphate rock mining","petroleum"]). bgfact("Syria","Agriculture",["animal = beef","lamb","eggs","poultry","not self-sufficient in grain or = livestock products"]). bgfact("Taiwan","LandBounderies",[]). bgfact("Taiwan","NaturalResources",["small deposits of coal","natural = gas","limestone","marble"]). bgfact("Taiwan","Population",["21298930"]). bgfact("Taiwan","Capital",["Taipei"]). bgfact("Taiwan","MemberOf",["suspended from IAEA in","but still allows = IAEA controls over extensive atomic = development","APEC","AsDB","BCIE","ICC","IOC","COCOM","WCL"]). bgfact("Taiwan","ExportCommodities",["electrical machinery","electronic = products","textiles","footwear","foodstuffs","plywood and wood = products"]). bgfact("Taiwan","ExportPartners",["US","Hong Kong","EC = countries","Japan"]). bgfact("Taiwan","ImportCommodities",["machinery and = equipment","electronic products","chemicals","iron and = steel","crude","foodstuffs"]). bgfact("Taiwan","ImportPartners",["Japan","US","EC countries"]). bgfact("Taiwan","Industries",["electronics","textiles","chemicals","cloth= ing","food processing","plywood","sugar = milling","cement","shipbuilding","petroleum refining"]). bgfact("Taiwan","Agriculture",["major = vegetables","rice","fruit","livestock - hogs","poultry","beef","not = self-sufficient in wheat","soybeans","fish catch increasing","reached = million metric tons in"]). bgfact("Tajikistan","LandBounderies",["Afghanistan","China","Kyrgyzstan",= "Uzbekistan"]). bgfact("Tajikistan","NaturalResources",["significant hydropower = potential","some petroleum","uranium","mercury","brown = coal","lead","zinc","antimony","tungsten"]). bgfact("Tajikistan","Population",["5995469"]). bgfact("Tajikistan","Capital",["Dushanbe"]). bgfact("Tajikistan","MemberOf",["CIS","CSCE","EBRD","ECO","ESCAP","IBRD",= "IDA","IDB","IMF","INTELSAT","IOC","NACC","OIC","UN","UNCTAD","UNESCO","U= NIDO","WHO","WMO"]). bgfact("Tajikistan","ExportCommodities",["cotton","aluminum","fruits","ve= getable oil","textiles"]). bgfact("Tajikistan","ExportPartners",["Russia","Kazakhstan","Ukraine","Uz= bekistan","Turkmenistan"]). bgfact("Tajikistan","ImportCommodities",["fuel","chemicals","machinery = and transport equipment","textiles","foodstuffs"]). bgfact("Tajikistan","ImportPartners",["Russia","Uzbekistan","Kazakhstan"]= ). bgfact("Tajikistan","Industries",["aluminum","zinc","lead","chemicals = and fertilizers","cement","vegetable oil","metal-cutting machine = tools","refrigerators and freezers"]). bgfact("Tajikistan","Agriculture",["cotton","grain","fruits","grapes","ca= ttle","sheep and goats"]). bgfact("Tanzania","LandBounderies",["Burundi","Kenya","Malawi","Mozambiqu= e","Rwanda","Uganda","Zambia"]). bgfact("Tanzania","NaturalResources",["hydropower = potential","tin","phosphates","iron = ore","coal","diamonds","gemstones","gold","natural gas","nickel"]). bgfact("Tanzania","Population",["27985660"]). bgfact("Tanzania","Capital",["Dar es Salaam"]). bgfact("Tanzania","MemberOf",["ACP","AfDB","C","CCC","EADB","ECA","FAO","= FLS","G-6","G-77","GATT","IAEA","IBRD","ICAO","IDA","IFAD","IFC","ILO","I= MF","IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS","NAM","OAU","SA= DC","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WCL","WHO","WIPO","WMO"= ,"WTO"]). bgfact("Tanzania","ExportCommodities",["coffee","cotton","tobacco","tea",= "cashew nuts","sisal"]). bgfact("Tanzania","ExportPartners",["FRG","UK","Japan","Netherlands","Ken= ya","Hong Kong","US"]). bgfact("Tanzania","ImportCommodities",["manubgfactured goods","machinery = and transportation equipment","cotton piece = goods","crude","foodstuffs"]). bgfact("Tanzania","ImportPartners",["FRG","UK","US","Japan","Italy","Denm= ark"]). bgfact("Tanzania","Industries",["primarily agricultural = processing","diamond and gold mining","oil = refinery","shoes","cement","textiles","wood products","fertilizer"]). bgfact("Tanzania","Agriculture",["coffee","sisal","tea","cotton","food = corn","wheat","cassava","bananas","fruits","small numbers of = cattle","sheep","not self-sufficient in food grain production"]). bgfact("Thailand","LandBounderies",["Burma","Cambodia","Laos","Malaysia"]= ). bgfact("Thailand","NaturalResources",["tin","rubber","natural = gas","tungsten","tantalum","timber","lead","fish","gypsum","lignite","flu= orite"]). bgfact("Thailand","Population",["59510471"]). bgfact("Thailand","Capital",["Bangkok"]). bgfact("Thailand","MemberOf",["APEC","AsDB","ASEAN","CCC","CP","ESCAP","F= AO","G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","= IMF","IMO","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","NAM","P= CA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UNIKOM","UNTAC","UPU","WCL","= WFTU","WHO","WIPO","WMO"]). bgfact("Thailand","ExportCommodities",["machinery and = manubgfactures","agricultural products","fisheries products"]). bgfact("Thailand","ExportPartners",["US","Japan","Singapore","Hong = Kong","Germany","Netherlands","UK","Malaysia","France","China"]). bgfact("Thailand","ImportCommodities",["Capital goods","intermediate = goods and raw materials","consumer goods","oil"]). bgfact("Thailand","ImportPartners",["Japan","US","Singapore","Taiwan","Ge= rmany","South Korea","Malaysia","China","Hong Kong","UK"]). bgfact("Thailand","Industries",["textiles and garments","agricultural = processing","beverages","tobacco","cement","light = manubgfacturing","electric appliances and components","integrated = circuits","furniture","world's second-largest tungsten producer and = third-largest tin producer"]). bgfact("Thailand","Agriculture",["corn","sugarcane","coconuts","except = for wheat","self-sufficient in food"]). bgfact("The Former Yugoslav Republic of = Macedonia","LandBounderies",["Albania","Bulgaria","Greece","Serbia and = Montenegro"]). bgfact("The Former Yugoslav Republic of = Macedonia","NaturalResources",["chromium","lead","zinc","manganese","tung= sten","nickel","low-grade iron ore","asbestos","sulphur","timber"]). bgfact("The Former Yugoslav Republic of = Macedonia","Population",["2213785"]). bgfact("The Former Yugoslav Republic of = Macedonia","Capital",["Skopje"]). bgfact("The Former Yugoslav Republic of = Macedonia","MemberOf",["CE","ITU","UN","UNCTAD","UNESCO","UNIDO","UPU","W= HO","WIPO","WMO"]). bgfact("The Former Yugoslav Republic of = Macedonia","ExportCommodities",["manubgfactured goods","machinery and = transport equipment","miscellaneous manubgfactured articles","raw = materials","food"]). bgfact("The Former Yugoslav Republic of = Macedonia","ExportPartners",["Germany","Greece","Albania"]). bgfact("The Former Yugoslav Republic of = Macedonia","ImportCommodities",["fuels and lubricants","manubgfactured = goods","machinery and transport equipment","food and live = animals","chemicals","raw materials","miscellaneous manubgfactured = articles","beverages and tobacco"]). bgfact("The Former Yugoslav Republic of = Macedonia","ImportPartners",["Greece","Albania","Germany","Bulgaria"]). bgfact("The Former Yugoslav Republic of Macedonia","Industries",["low = levels of technology predominate","such as","produces basic liquid = fuels","coal","metallic chromium","lead","zinc","light industry = produces basic textiles","wood products"]). bgfact("The Former Yugoslav Republic of = Macedonia","Agriculture",["principal crops are = rice","tobacco","wheat","corn","also grown are = cotton","sesame","mulberry leaves","citrus fruit","The Former Yugoslav = Republic of Macedonia is one of the seven legal cultivators of the = opium poppy for the world pharmaceutical industry","agricultural = production is highly labor intensive"]). bgfact("Togo","LandBounderies",["Benin","Burkina","Ghana"]). bgfact("Togo","NaturalResources",["phosphates","limestone","marble"]). bgfact("Togo","Population",["4255090"]). bgfact("Togo","Capital",["Lome"]). bgfact("Togo","MemberOf",["ACCT","ACP","AfDB","CCC","CEAO","ECA","ECOWAS"= ,"Entente","FAO","FZ","G-77","GATT","IBRD","ICAO","ICC","ICFTU","IDA","IF= AD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","NA= M","OAU","UN","UNCTAD","UNESCO","UNIDO","UPU","WADB","WCL","WHO","WIPO","= WMO","WTO"]). bgfact("Togo","ExportCommodities",["phosphates","cotton","cocoa","coffee"= ]). bgfact("Togo","ExportPartners",["EC","Africa","US"]). bgfact("Togo","ImportCommodities",["machinery and equipment","consumer = goods","food","chemical products"]). bgfact("Togo","ImportPartners",["EC","Africa","US","Japan"]). bgfact("Togo","Industries",["phosphate mining","agricultural = processing","cement","handicrafts","textiles","beverages"]). bgfact("Togo","Agriculture",["coffee","cocoa","yams","cassava","corn","be= ans","rice","millet","annual fish catch of"]). bgfact("Tokelau","LandBounderies",[]). bgfact("Tokelau","NaturalResources",["negligible"]). bgfact("Tokelau","Population",["1523"]). bgfact("Tokelau","Capital",["none; each atoll has its own administrative = center"]). bgfact("Tokelau","MemberOf",["SPC","WHO"]). bgfact("Tokelau","ExportCommodities",["stamps","copra","handicrafts"]). bgfact("Tokelau","ExportPartners",["NZ"]). bgfact("Tokelau","ImportCommodities",["foodstuffs","building = materials","fuel"]). bgfact("Tokelau","ImportPartners",["NZ"]). bgfact("Tokelau","Industries",["small-scale enterprises for copra = production","wood work","stamps","fishing"]). bgfact("Tokelau","Agriculture",["coconuts","basic subsistence = breadfruit","papaya","pigs","poultry","goats"]). bgfact("Tonga","LandBounderies",[]). bgfact("Tonga","NaturalResources",["fish","fertile soil"]). bgfact("Tonga","Population",["104778"]). bgfact("Tonga","Capital",["Nuku'alofa"]). bgfact("Tonga","MemberOf",["ACP","AsDB","C","ESCAP","FAO","G-77","IBRD","= ICAO","ICFTU","IDA","IFAD","IFC","IMF","INTELSAT","INTERPOL","IOC","ITU",= "LORCS","SPARTECA","SPC","SPF","UNCTAD","UNESCO","UNIDO","UPU","WHO"]). bgfact("Tonga","ExportCommodities",["vanilla","fish","root = crops","coconut oil","squash"]). bgfact("Tonga","ExportPartners",["Japan","US","Australia","NZ"]). bgfact("Tonga","ImportCommodities",["food products","machinery and = transport equipment","manubgfactures","fuels","chemicals"]). bgfact("Tonga","ImportPartners",["NZ","Australia","US","Japan"]). bgfact("Tonga","Industries",["tourism","fishing"]). bgfact("Tonga","Agriculture",["dominated by coconut","copra","vanilla = beans","cocoa","coffee","ginger","black pepper"]). bgfact("Trinidad and Tobago","LandBounderies",[]). bgfact("Trinidad and Tobago","NaturalResources",["petroleum","natural = gas","asphalt"]). bgfact("Trinidad and Tobago","Population",["1328282"]). bgfact("Trinidad and Tobago","Capital",["Port-of-Spain"]). bgfact("Trinidad and = Tobago","MemberOf",["ACP","C","CARICOM","CCC","CDB","ECLAC","FAO","G-24",= "G-77","GATT","IADB","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO","IMF"= ,"IMO","INTELSAT","INTERPOL","IOC","ISO","ITU","LAES","LORCS","NAM","OAS"= ,"OPANAL","UN","UNCTAD","UNESCO","UNIDO","UPU","WFTU","WHO","WIPO","WMO"]= ). bgfact("Trinidad and Tobago","ExportCommodities",["petroleum and = petroleum products","chemicals","steel = products","fertilizer","sugar","cocoa","coffee","citrus","flowers"]). bgfact("Trinidad and Tobago","ExportPartners",["US","CARICOM","Latin = America","EC"]). bgfact("Trinidad and = Tobago","ImportCommodities",["machinery","transportation = equipment","manubgfactured goods","food","live animals"]). bgfact("Trinidad and Tobago","ImportPartners",["US","Venezuela","UK"]). bgfact("Trinidad and = Tobago","Industries",["petroleum","chemicals","tourism","food = processing","cement","beverage","cotton textiles"]). bgfact("Trinidad and Tobago","Agriculture",["major cocoa","sugarcane = acreage is being shifted into rice","citrus","coffee","must import large = share of food needs"]). bgfact("Tromelin Island","LandBounderies",[]). bgfact("Tromelin Island","NaturalResources",["fish"]). bgfact("Tromelin Island","Capital",["none; administered by France from = Reunion"]). bgfact("Tunisia","LandBounderies",["Algeria","Libya"]). bgfact("Tunisia","NaturalResources",["petroleum","phosphates","iron = ore","lead","zinc","salt"]). bgfact("Tunisia","Population",["8726562"]). bgfact("Tunisia","Capital",["Tunis"]). bgfact("Tunisia","MemberOf",["ABEDA","ACCT","AfDB","AFESD","AL","AMF","AM= U","CCC","ECA","FAO","G-77","GATT","IAEA","IBRD","ICAO","ICC","ICFTU","ID= A","IDB","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT","INTERPOL",= "IOC","ISO","ITU","LORCS","MINURSO","NAM","OAPEC","OAU","OIC","UN","UNCTA= D","UNESCO","UNHCR","UNIDO","UNOSOM","UNPROFOR","UNTAC","UPU","WHO","WIPO= ","WMO","WTO"]). bgfact("Tunisia","ExportCommodities",["hydrocarbons","agricultural = products","phosphates and chemicals"]). bgfact("Tunisia","ExportPartners",["EC countries","Middle = East","Algeria","India","US"]). bgfact("Tunisia","ImportCommodities",["industrial goods and = equipment","hydrocarbons","food","consumer goods"]). bgfact("Tunisia","ImportPartners",["EC countries","US","Middle = East","Japan","Switzerland","Algeria"]). bgfact("Tunisia","Industries",["petroleum","mining","tourism","textiles",= "footwear","food","beverages"]). bgfact("Tunisia","Agriculture",["export = olives","dates","oranges","sugar beets","wine = grapes","poultry","beef","not self-sufficient in food"]). bgfact("Turkey","LandBounderies",["Armenia","Azerbaijan","Bulgaria","Geor= gia","Greece","Iran","Iraq","Syria"]). bgfact("Turkey","NaturalResources",["antimony","coal","chromium","mercury= ","copper","borate","sulphur","iron ore"]). bgfact("Turkey","Population",["62153898"]). bgfact("Turkey","Capital",["Ankara"]). bgfact("Turkey","MemberOf",["AsDB","BIS","BSEC","CCC","CE","CERN","WFTU",= "WHO","WIPO","WMO","WTO"]). bgfact("Turkey","ExportCommodities",["manubgfactured = products","foodstuffs","mining products"]). bgfact("Turkey","ExportPartners",["EC countries","US","Russia","Saudi = Arabia"]). bgfact("Turkey","ImportCommodities",["manubgfactured = products","fuels","foodstuffs"]). bgfact("Turkey","ImportPartners",["EC countries","US","Saudi = Arabia","Russia"]). bgfact("Turkey","Industries",["textiles","food = processing","mining","steel","petroleum","construction","lumber","paper"]= ). bgfact("Turkey","Agriculture",["tobacco","cotton","grain","olives","sugar= beets","pulses","citrus fruit","self-sufficient in food most years"]). bgfact("Turkmenistan","LandBounderies",["Afghanistan","Iran","Kazakhstan"= ,"Uzbekistan"]). bgfact("Turkmenistan","NaturalResources",["petroleum","natural = gas","coal","sulphur","salt"]). bgfact("Turkmenistan","Population",["3995122"]). bgfact("Turkmenistan","Capital",["Ashgabat"]). bgfact("Turkmenistan","MemberOf",["CIS","CSCE","EBRD","ECE","ECO","ESCAP"= ,"IBRD","ICAO","IDB","ILO","IMF","IMO","INTELSAT","IOC","ITU","NACC","OIC= ","UN","UNCTAD","UNESCO","UPU","WHO","WMO"]). bgfact("Turkmenistan","ExportCommodities",["natural = gas","cotton","petroleum products","textiles","carpets"]). bgfact("Turkmenistan","ExportPartners",["Ukraine","Russia","Kazakhstan","= Uzbekistan","Georgia","Eastern Europe","Turkey","Argentina"]). bgfact("Turkmenistan","ImportCommodities",["machinery and parts","grain = and food","plastics and rubber","consumer durables","textiles"]). bgfact("Turkmenistan","ImportPartners",["Russia","Azerbaijan","Uzbekistan= ","Kazakhstan","Turkey"]). bgfact("Turkmenistan","Industries",["natural gas","oil","petroleum = products","textiles","food processing"]). bgfact("Turkmenistan","Agriculture",["cotton","grain","animal = husbandry"]). bgfact("Turks and Caicos Islands","LandBounderies",[]). bgfact("Turks and Caicos Islands","NaturalResources",["spiny = lobster","conch"]). bgfact("Turks and Caicos Islands","Population",["13552"]). bgfact("Turks and Caicos Islands","Capital",["Grand Turk"]). bgfact("Turks and Caicos Islands","MemberOf",["CARICOM"]). bgfact("Turks and Caicos Islands","ExportCommodities",["lobster","dried = and fresh conch","conch shells"]). bgfact("Turks and Caicos Islands","ExportPartners",["US","UK"]). bgfact("Turks and Caicos Islands","ImportCommodities",["food and = beverages","tobacco","clothing","manubgfactures","construction = materials"]). bgfact("Turks and Caicos Islands","ImportPartners",["US","UK"]). bgfact("Turks and Caicos = Islands","Industries",["fishing","tourism","offshore financial = services"]). bgfact("Turks and Caicos Islands","Agriculture",["subsistence farming = prevails","not self-sufficient in food"]). bgfact("Tuvalu","LandBounderies",[]). bgfact("Tuvalu","NaturalResources",["fish"]). bgfact("Tuvalu","Population",["9831"]). bgfact("Tuvalu","Capital",["Funafuti"]). bgfact("Tuvalu","MemberOf",["ACP","AsDB","C","ITU","SPARTECA","SPC","SPF"= ,"UNESCO","UPU","WHO"]). bgfact("Tuvalu","ExportCommodities",["copra"]). bgfact("Tuvalu","ExportPartners",["Fiji","Australia","NZ"]). bgfact("Tuvalu","ImportCommodities",["food","animals","mineral = fuels","machinery","manubgfactured goods"]). bgfact("Tuvalu","ImportPartners",["Fiji","Australia","NZ"]). bgfact("Tuvalu","Industries",["fishing","tourism","copra"]). bgfact("Tuvalu","Agriculture",["coconuts and fish"]). bgfact("Uganda","LandBounderies",["Kenya","Rwanda","Sudan","Tanzania","Za= ire"]). bgfact("Uganda","NaturalResources",["copper","cobalt","limestone","salt"]= ). bgfact("Uganda","Population",["19121934"]). bgfact("Uganda","Capital",["Kampala"]). bgfact("Uganda","MemberOf",["ACP","AfDB","C","CCC","EADB","ECA","FAO","G-= 77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IDB","IFAD","IFC","IGADD",= "ILO","IMF","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","NAM","= OAU","OIC","PCA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UNOSOM","UPU","W= HO","WIPO","WMO","WTO"]). bgfact("Uganda","ExportCommodities",["coffee","cotton","tea"]). bgfact("Uganda","ExportPartners",["US","UK","France","Spain"]). bgfact("Uganda","ImportCommodities",["petroleum = products","machinery","cotton piece goods","metals","transportation = equipment","food"]). bgfact("Uganda","ImportPartners",["Kenya","UK","Italy"]). bgfact("Uganda","Industries",["sugar","brewing","tobacco","cotton = textiles","cement"]). bgfact("Uganda","Agriculture",["coffee","tea","cotton","food = cassava","potatoes","corn","millet","livestock beef","goat = meat","milk","self-sufficient in food"]). bgfact("Ukraine","LandBounderies",["Belarus","Hungary","Moldova","Poland"= ,"Romania","Russia","Slovakia"]). bgfact("Ukraine","NaturalResources",["iron = ore","coal","manganese","natural = gas","oil","salt","sulphur","graphite","titanium","magnesium","kaolin","n= ickel","mercury","timber"]). bgfact("Ukraine","Population",["51846958"]). bgfact("Ukraine","Capital",["Kiev"]). bgfact("Ukraine","MemberOf",["BSEC","CBSS","INTERPOL","IOC","ITU","NACC",= "PCA","UN","UNCTAD","UNESCO","UNIDO","UNPROFOR","UPU","WHO","WIPO","WMO"]= ). bgfact("Ukraine","ExportCommodities",["coal","electric power","ferrous = and nonferrous metals","chemicals","machinery and transport = equipment","grain","meat"]). bgfact("Ukraine","ExportPartners",["FSU = countries","Germany","China","Austria"]). bgfact("Ukraine","ImportCommodities",["machinery and = parts","transportation equipment","chemicals","textiles"]). bgfact("Ukraine","ImportPartners",["FSU = countries","Germany","China","Austria"]). bgfact("Ukraine","Industries",["coal","electric power","ferrous and = nonferrous metals","machinery and transport = equipment","chemicals","food-processing"]). bgfact("Ukraine","Agriculture",["grain","vegetables","meat","milk","sugar= beets"]). bgfact("United Arab Emirates","LandBounderies",["Oman","Saudi Arabia"]). bgfact("United Arab Emirates","NaturalResources",["petroleum","natural = gas"]). bgfact("United Arab Emirates","Population",["2791141"]). bgfact("United Arab Emirates","Capital",["Abu Dhabi"]). bgfact("United Arab = Emirates","MemberOf",["ABEDA","AFESD","AL","AMF","CAEU","CCC","ESCWA","FA= O","G-77","GATT","GCC","IAEA","IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO= ","IMF","IMO","INMARSAT","INTELSAT","INTERPOL","IOC","ISO","ITU","LORCS",= "NAM","OAPEC","OIC","OPEC","UN","UNCTAD","UNESCO","UNIDO","UNOSOM","UPU",= "WHO","WIPO","WMO","WTO"]). bgfact("United Arab Emirates","ExportCommodities",["crude","natural = gas","re-exports","dried fish","dates"]). bgfact("United Arab = Emirates","ExportPartners",["Japan","Singapore","Korea","Iran","India"]).= bgfact("United Arab Emirates","ImportCommodities",["manubgfactured = goods","machinery and transport equipment","food"]). bgfact("United Arab = Emirates","ImportPartners",["Japan","UK","US","Germany"]). bgfact("United Arab = Emirates","Industries",["petroleum","fishing","petrochemicals","construct= ion materials","some boat building","handicrafts","pearling"]). bgfact("United Arab Emirates","Agriculture",["food = vegetables","watermelons","poultry","eggs","dairy","only self-sufficient = in food"]). bgfact("United Kingdom","LandBounderies",["Ireland"]). bgfact("United Kingdom","NaturalResources",["coal","petroleum","natural = gas","tin","limestone","iron = ore","salt","clay","chalk","gypsum","lead","silica"]). bgfact("United Kingdom","Population",["58135110"]). bgfact("United Kingdom","Capital",["London"]). bgfact("United = Kingdom","MemberOf",["AfDB","AG","ISO","ITU","LORCS","MINURSO","MTRC","NA= CC","NATO","NEA","NSG","OECD","PCA","SPC","UN","UNCTAD","UNFICYP","UNHCR"= ,"UNIDO","UNIKOM","UNPROFOR","UNRWA","UN Security Council","UNTAC","UN = Trusteeship Council","UPU","WCL","WEU","WHO","WIPO","WMO","ZC"]). bgfact("United Kingdom","ExportCommodities",["manubgfactured = goods","machinery","fuels","chemicals","semifinished goods","transport = equipment"]). bgfact("United Kingdom","ExportPartners",["EC countries","US"]). bgfact("United Kingdom","ImportCommodities",["manubgfactured = goods","machinery","semifinished goods","foodstuffs","consumer goods"]). bgfact("United Kingdom","ImportPartners",["EC countries","US"]). bgfact("United Kingdom","Industries",["production machinery including = machine tools","electric power equipment","equipment for the automation = of production","railroad equipment","shipbuilding","aircraft","motor = vehicles and parts","electronics and communications = equipment","metals","chemicals","coal","petroleum","paper and paper = products","food processing","textiles","clothing"]). bgfact("United Kingdom","Agriculture",["about self-sufficient in food = and feed needs"]). bgfact("United States","LandBounderies",["Canada","Mexico"]). bgfact("United = States","NaturalResources",["coal","copper","lead","molybdenum","phosphat= es","uranium","bauxite","gold","iron","mercury","nickel","potash","silver= ","tungsten","zinc","petroleum","natural gas","timber"]). bgfact("United States","Population",["260713585"]). bgfact("United States","Capital",["Washington, DC"]). bgfact("United = States","MemberOf",["AfDB","AG","ANZUS","APEC","AsDB","Australian = Group","BIS","CCC","COCOM","CP","CSCE","EBRD","ECE","ECLAC","FAO","ESCAP"= ,"G-2","G-5","G-7","G-8","G-10","GATT","IADB","IAEA","IBRD","ICAO","ICC",= "ICFTU","IDA","IEA","IFAD","IFC","ILO","IMF","IMO","INMARSAT","INTELSAT",= "INTERPOL","IOC","IOM","ISO","ITU","LORCS","MINURSO","MTCR","NACC","NATO"= ,"NEA","NSG","OAS","OECD","PCA","SPC","UN","UNCTAD","UNHCR","UNIDO","UNIK= OM","UNOSOM","UNRWA","UN Security Council","UNTAC","UN Trusteeship = Council","UNTSO","UPU","WCL","WHO","WIPO","WMO","WTO","ZC"]). bgfact("United States","ExportCommodities",["Capital = goods","automobiles","industrial supplies and raw materials","consumer = goods","agricultural products"]). bgfact("United States","ExportPartners",["Western = Europe","Canada","Japan"]). bgfact("United States","ImportCommodities",["crude and refined petroleum = products","machinery","automobiles","consumer goods","industrial raw = materials","food and beverages"]). bgfact("United States","ImportPartners",["Canada","Western = Europe","Japan"]). bgfact("United States","Industries",["leading industrial power in the = world","petroleum","steel","motor = vehicles","aerospace","telecommunications","chemicals","electronics","foo= d processing","consumer goods","lumber","mining"]). bgfact("United States","Agriculture",["fish catch of million metric = tons"]). bgfact("Uruguay","LandBounderies",["Argentina","Brazil"]). bgfact("Uruguay","NaturalResources",["soil","hydropower = potential","minor minerals"]). bgfact("Uruguay","Population",["3198910"]). bgfact("Uruguay","Capital",["Montevideo"]). bgfact("Uruguay","MemberOf",["AG","OAS","OPANAL","PCA","RG","UN","UNCTAD"= ,"UNESCO","UNIDO","UNIKOM","UNMOGIP","UNOMOZ","UNTAC","UPU","WCL","WFTU",= "WHO","WIPO","WMO","WTO"]). bgfact("Uruguay","ExportCommodities",["wool and textile = manubgfactures","leather","rice"]). bgfact("Uruguay","ExportPartners",["Brazil","Argentina","US","China","Ita= ly"]). bgfact("Uruguay","ImportCommodities",["machinery and = equipment","vehicles","chemicals","minerals","plastics"]). bgfact("Uruguay","ImportPartners",["Brazil","Argentina","US","Nigeria"]).= bgfact("Uruguay","Industries",["meat processing","wool and = hides","sugar","textiles","footwear","leather = apparel","tires","cement","fishing","petroleum refining","wine"]). bgfact("Uruguay","Agriculture",["wheat","rice","corn","self-sufficient = in most basic foodstuffs"]). bgfact("Uzbekistan","LandBounderies",["Afghanistan","Kazakhstan","Kyrgyzs= tan","Tajikistan","Turkmenistan"]). bgfact("Uzbekistan","NaturalResources",["natural = gas","petroleum","coal","gold","uranium","silver","copper","lead and = zinc","tungsten","molybdenum"]). bgfact("Uzbekistan","Population",["22608866"]). bgfact("Uzbekistan","Capital",["Tashkent"]). bgfact("Uzbekistan","MemberOf",["CCC","CIS","CSCE","EBRD","ECE","ECO","ES= CAP","IBRD","ICAO","IDA","IFC","ILO","IMF","IOC","ITU","NACC","NAM","UN",= "UNCTAD","WHO","WMO"]). bgfact("Uzbekistan","ExportCommodities",["cotton","gold","natural = gas","mineral fertilizers","ferrous metals","textiles","food = products"]). bgfact("Uzbekistan","ExportPartners",["Russia","Ukraine","Eastern = Europe","US"]). bgfact("Uzbekistan","ImportCommodities",["grain","machinery and = parts","consumer durables"]). bgfact("Uzbekistan","ImportPartners",["Czech Republic"]). bgfact("Uzbekistan","Industries",["textiles","food processing","machine = building","metallurgy","natural gas"]). bgfact("Uzbekistan","Agriculture",["livestock","cotton","vegetables","fru= its","grain"]). bgfact("Vanuatu","LandBounderies",[]). bgfact("Vanuatu","NaturalResources",["manganese","hardwood = forests","fish"]). bgfact("Vanuatu","Population",["169776"]). bgfact("Vanuatu","Capital",["Port-Vila"]). bgfact("Vanuatu","MemberOf",["ACCT","ACP","AsDB","C","ESCAP","FAO","G-77"= ,"IBRD","ICAO","IDA","IFC","IMF","IMO","INTELSAT","IOC","ITU","NAM","SPAR= TECA","SPC","SPF","UN","UNCTAD","UNIDO","UPU","WHO","WMO"]). bgfact("Vanuatu","ExportCommodities",["copra","beef","cocoa","timber","co= ffee"]). bgfact("Vanuatu","ExportPartners",["Netherlands","Japan","France","New = Caledonia","Belgium"]). bgfact("Vanuatu","ImportCommodities",["machines and vehicles","food and = beverages","basic manubgfactures","raw materials and = fuels","chemicals"]). bgfact("Vanuatu","ImportPartners",["Australia","Japan","NZ","France","Fij= i"]). bgfact("Vanuatu","Industries",["food and fish freezing","wood = processing","meat canning"]). bgfact("Vanuatu","Agriculture",["export = coconuts","cocoa","coffee","subsistence = taro","yams","coconuts","fruits","vegetables"]). bgfact("Venezuela","LandBounderies",["Brazil","Colombia","Guyana"]). bgfact("Venezuela","NaturalResources",["petroleum","natural gas","iron = ore","gold","bauxite","hydropower","diamonds"]). bgfact("Venezuela","Population",["20562405"]). bgfact("Venezuela","Capital",["Caracas"]). bgfact("Venezuela","MemberOf",["AG","BCIE","CARICOM","CDB","CG","ECLAC","= FAO","G-3","G-11","G-15","G-19","G-24","G-77","GATT","IADB","IAEA","IBRD"= ,"ICAO","ICC","ICFTU","IFAD","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL= ","IOC","IOM","ISO","ITU","LAES","LAIA","LORCS","MINURSO","NAM","OAS","ON= USAL","OPANAL","OPEC","PCA","RG","UN","UNCTAD","UNESCO","UNHCR","UNIDO","= UNIKOM","UNPROFOR","UPU","WCL","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Venezuela","ExportCommodities",["petroleum","bauxite and = aluminum","steel","chemicals","agricultural products","basic = manubgfactures"]). bgfact("Venezuela","ExportPartners",["US and Puerto = Rico","Japan","Netherlands","Italy"]). bgfact("Venezuela","ImportCommodities",["raw materials","machinery and = equipment","transport equipment","construction materials"]). bgfact("Venezuela","ImportPartners",["US","Germany","Japan","Netherlands"= ,"Canada"]). bgfact("Venezuela","Industries",["petroleum","iron-ore = mining","construction materials","food = processing","textiles","steel","aluminum","motor vehicle assembly"]). bgfact("Venezuela","Agriculture",["corn","sorghum","sugarcane","rice","ba= nanas","vegetables","coffee","beef","pork","milk","eggs"]). bgfact("Vietnam","LandBounderies",["Cambodia","China","Laos"]). bgfact("Vietnam","NaturalResources",["phosphates","coal","manganese","bau= xite","chromate","offshore oil deposits","forests"]). bgfact("Vietnam","Population",["73103898"]). bgfact("Vietnam","Capital",["Hanoi"]). bgfact("Vietnam","MemberOf",["ACCT","AsDB","ASEAN","ISO","ITU","LORCS","N= AM","UN","UNCTAD","UNESCO","UNIDO","UPU","WCL","WFTU","WHO","WIPO","WMO",= "WTO"]). bgfact("Vietnam","ExportCommodities",["petroleum","rice","agricultural = products","marine products","coffee"]). bgfact("Vietnam","ExportPartners",["Japan","Hong = Kong","Thailand","Germany","Indonesia"]). bgfact("Vietnam","ImportCommodities",["petroleum products","steel = products","railroad equipment","chemicals","medicines","raw = cotton","fertilizer","grain"]). bgfact("Vietnam","ImportPartners",["Hong = Kong","Japan","Indonesia","South Korea","Taiwan"]). bgfact("Vietnam","Industries",["food processing","textiles","machine = building","mining","cement","chemical = fertilizer","glass","tires","oil"]). bgfact("Vietnam","Agriculture",["paddy rice","corn","commercial = crops"]). bgfact("Virgin Islands","LandBounderies",[]). bgfact("Virgin Islands","NaturalResources",["sun","sand","sea","surf"]). bgfact("Virgin Islands","Population",["97564"]). bgfact("Virgin Islands","Capital",["Charlotte Amalie"]). bgfact("Virgin Islands","MemberOf",["ECLAC","IOC"]). bgfact("Virgin Islands","ExportCommodities",["refined petroleum = products"]). bgfact("Virgin Islands","ExportPartners",["US","Puerto Rico"]). bgfact("Virgin = Islands","ImportCommodities",["crude","foodstuffs","consumer = goods","building materials"]). bgfact("Virgin Islands","ImportPartners",["US","Puerto Rico"]). bgfact("Virgin Islands","Industries",["tourism","petroleum = refining","watch assembly","rum = distilling","construction","pharmaceuticals","textiles","electronics"]). bgfact("Virgin Islands","Agriculture",["truck gardens","food = crops","fruit","sorghum","Senepol cattle"]). bgfact("Wake Island","LandBounderies",[]). bgfact("Wake Island","NaturalResources",["none"]). bgfact("Wake Island","Population",["302"]). bgfact("Wake Island","Capital",["none; administered from Washington, = DC"]). bgfact("Wallis and Futuna","LandBounderies",[]). bgfact("Wallis and Futuna","NaturalResources",["negligible"]). bgfact("Wallis and Futuna","Population",["14338"]). bgfact("Wallis and Futuna","Capital",["Mata-Utu"]). bgfact("Wallis and Futuna","MemberOf",["FZ","SPC"]). bgfact("Wallis and Futuna","ExportCommodities",["copra","handicrafts"]). bgfact("Wallis and Futuna","ExportPartners",["NA"]). bgfact("Wallis and = Futuna","ImportCommodities",["foodstuffs","manubgfactured = goods","transportation equipment","fuel"]). bgfact("Wallis and Futuna","ImportPartners",["France","Australia","New = Zealand"]). bgfact("Wallis and = Futuna","Industries",["copra","handicrafts","fishing","lumber"]). bgfact("Wallis and Futuna","Agriculture",["dominated by coconut = production","with subsistence crops of yams","taro","bananas"]). bgfact("West Bank","LandBounderies",["Israel","Jordan"]). bgfact("West Bank","NaturalResources",["negligible"]). bgfact("West Bank","Population",["1443790"]). bgfact("West Bank","ExportCommodities",["olives","fruit","vegetables"]). bgfact("West Bank","ExportPartners",["Jordan","Israel"]). bgfact("West Bank","ImportCommodities",["food","consumer = goods","construction materials"]). bgfact("West Bank","ImportPartners",["Jordan","Israel"]). bgfact("West Bank","Industries",[]). bgfact("West Bank","Agriculture",["olives","vegetables","beef"]). bgfact("Western = Sahara","LandBounderies",["Algeria","Mauritania","Morocco"]). bgfact("Western Sahara","NaturalResources",["phosphates","iron ore"]). bgfact("Western Sahara","Population",["211877"]). bgfact("Western Sahara","Capital",["none"]). bgfact("Western Sahara","MemberOf",["none"]). bgfact("Western Sahara","ExportCommodities",["phosphates"]). bgfact("Western Sahara","ExportPartners",["Morocco claims and = administers Western Sahara","so trade partners are included in overall = Moroccan accounts"]). bgfact("Western Sahara","ImportCommodities",["fuel for fishing = fleet","foodstuffs"]). bgfact("Western Sahara","ImportPartners",["Morocco claims and = administers Western Sahara","so trade partners are included in overall = Moroccan accounts"]). bgfact("Western Sahara","Industries",["phosphate = mining","fishing","handicrafts"]). bgfact("Western Sahara","Agriculture",["camels","sheep","economy exists = largely for the garrison forces"]). bgfact("Western Samoa","LandBounderies",[]). bgfact("Western Samoa","NaturalResources",["hardwood forests","fish"]). bgfact("Western Samoa","Population",["204447"]). bgfact("Western Samoa","Capital",["Apia"]). bgfact("Western = Samoa","MemberOf",["ACP","AsDB","C","ESCAP","FAO","G-77","IBRD","ICFTU","= IDA","IFAD","IFC","IMF","INTELSAT","IOC","ITU","LORCS","SPARTECA","SPC","= SPF","UN","UNCTAD","UNESCO","UPU","WHO"]). bgfact("Western Samoa","ExportCommodities",["coconut oil and = cream","taro","copra","cocoa"]). bgfact("Western Samoa","ExportPartners",["New Zealand","American = Samoa","Germany","Australia"]). bgfact("Western Samoa","ImportCommodities",["intermediate = goods","food","Capital goods"]). bgfact("Western Samoa","ImportPartners",["New = Zealand","Australia","Japan","Fiji"]). bgfact("Western Samoa","Industries",["timber","tourism","food = processing","fishing"]). bgfact("Western Samoa","Agriculture",["coconuts","fruit"]). bgfact("Yemen","LandBounderies",["Oman","Saudi Arabia"]). bgfact("Yemen","NaturalResources",["petroleum","fish","rock = salt","marble","small deposits of coal","gold","lead","nickel","fertile = soil in west"]). bgfact("Yemen","Population",["11105202"]). bgfact("Yemen","Capital",["Sanaa"]). bgfact("Yemen","MemberOf",["ACC","AFESD","AL","AMF","CAEU","ESCWA","FAO",= "G-77","IBRD","ICAO","IDA","IDB","IFAD","IFC","ILO","IMF","IMO","INTELSAT= ","INTERPOL","IOC","ITU","LORCS","NAM","OIC","UN","UNCTAD","UNESCO","UNID= O","UPU","WFTU","WHO","WIPO","WMO","WTO"]). bgfact("Yemen","ExportCommodities",["crude","cotton","coffee","hides","ve= getables","dried and salted fish"]). bgfact("Yemen","ExportPartners",["Italy","US","Jordan"]). bgfact("Yemen","ImportCommodities",["petroleum = products","sugar","grain","flour","cement","machinery","chemicals"]). bgfact("Yemen","ImportPartners",["UAE","Japan","Saudi = Arabia","Kuwait","US"]). bgfact("Yemen","Industries",["cement"]). bgfact("Yemen","Agriculture",["grain","fruits","vegetables","qat","coffee= ","cotton","dairy","poultry","meat","not self-sufficient in grain"]). bgfact("Zaire","LandBounderies",["Angola","Burundi","Central African = Republic","Congo","Rwanda","Sudan","Uganda","Zambia"]). bgfact("Zaire","NaturalResources",["cobalt","copper","cadmium","petroleum= ","industrial and gem = diamonds","gold","silver","zinc","manganese","tin","germanium","uranium",= "radium","bauxite","iron ore","coal","hydropower potential"]). bgfact("Zaire","Population",["42684091"]). bgfact("Zaire","Capital",["Kinshasa"]). bgfact("Zaire","MemberOf",["ACCT","ACP","AfDB","CCC","CEEAC","CEPGL","ECA= ","FAO","G-19","G-24","G-77","GATT","IAEA","IBRD","ICAO","ICC","IDA","IFA= D","IFC","ILO","IMF","IMO","INTELSAT","INTERPOL","IOC","ITU","LORCS","NAM= ","OAU","PCA","UN","UNCTAD","UNESCO","UNHCR","UNIDO","UPU","WCL","WFTU","= WHO","WIPO","WMO","WTO"]). bgfact("Zaire","ExportCommodities",["copper","coffee","diamonds","cobalt"= ,"crude"]). bgfact("Zaire","ExportPartners",["US","Belgium","France","Germany","Italy= ","UK","Japan","South Africa"]). bgfact("Zaire","ImportCommodities",["consumer = goods","foodstuffs","transport equipment","fuels"]). bgfact("Zaire","ImportPartners",["South = Africa","US","Belgium","France","Germany","Italy","Japan","UK"]). bgfact("Zaire","Industries",["mining","mineral processing","consumer = products","processed foods and beverages","cement","diamonds"]). bgfact("Zaire","Agriculture",["coffee","palm oil","rubber","food = cassava","bananas","root crops","corn"]). bgfact("Zambia","LandBounderies",["Angola","Malawi","Mozambique","Namibia= ","Tanzania","Zaire","Zimbabwe"]). bgfact("Zambia","NaturalResources",["copper","cobalt","zinc","lead","coal= ","emeralds","gold","silver","uranium","hydropower potential"]). bgfact("Zambia","Population",["9188190"]). bgfact("Zambia","Capital",["Lusaka"]). bgfact("Zambia","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","FLS","G-1= 9","G-77","GATT","IAEA","IBRD","ICAO","IDA","IFAD","IFC","IFTU","ILO","IM= F","INTELSAT","INTERPOL","IOC","IOM","ITU","LORCS","NAM","OAU","SADC","UN= ","UNCTAD","UNESCO","UNIDO","UNOMOZ","UNOSOM","UPU","WCL","WHO","WIPO","W= MO","WTO"]). bgfact("Zambia","ExportCommodities",["copper","zinc","cobalt","lead","tob= acco"]). bgfact("Zambia","ExportPartners",["EC countries","Japan","South = Africa","US","India"]). bgfact("Zambia","ImportCommodities",["machinery","transportation = equipment","foodstuffs","fuels","manubgfactures"]). bgfact("Zambia","ImportPartners",["EC countries","Japan","Saudi = Arabia","South Africa","US"]). bgfact("Zambia","Industries",["copper mining and = processing","construction","foodstuffs","beverages","chemicals","textiles= "]). bgfact("Zambia","Agriculture",["corn","sorghum","rice","peanuts","sunflow= er","tobacco","cotton","sugarcane","cattle","goats","beef","eggs"]). bgfact("Zimbabwe","LandBounderies",["Botswana","Mozambique","South = Africa","Zambia"]). bgfact("Zimbabwe","NaturalResources",["coal","chromium = ore","asbestos","gold","nickel","copper","iron = ore","vanadium","lithium","tin","platinum group metals"]). bgfact("Zimbabwe","Population",["10975078"]). bgfact("Zimbabwe","Capital",["Harare"]). bgfact("Zimbabwe","MemberOf",["ACP","AfDB","C","CCC","ECA","FAO","FLS","G= -15","G-77","GATT","IAEA","IBRD","ICAO","ICFTU","IDA","IFAD","IFC","ILO",= "IMF","INTELSAT","INTERPOL","IOC","IOM","ISO","ITU","LORCS","NAM","OAU","= PCA","SADC","UN","UNAVEM = II","UNCTAD","UNESCO","UNIDO","UNOMUR","UNOSOM","UPU","WCL","WHO","WIPO",= "WMO","WTO"]). bgfact("Zimbabwe","ExportCommodities",["agricultural"]). bgfact("Zimbabwe","ExportPartners",["UK","Germany","South = Africa","Japan","US"]). bgfact("Zimbabwe","ImportCommodities",["machinery and transportation = equipment","chemicals","fuels"]). bgfact("Zimbabwe","ImportPartners",["South = Africa","UK","Germany","US","Japan"]). bgfact("Zimbabwe","Industries",["mining","steel","clothing and = footwear","chemicals","foodstuffs","fertilizer","beverage","transportatio= n equipment","wood products"]). bgfact("Zimbabwe","Agriculture",["of land area divided = into","corn","cotton","tobacco","wheat","coffee","sugarcane","livestock = - cattle","sheep","goats","self-sufficient in food"]). ����������������������������������������������������������������������������������������������������������������������clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-000.sgm��������������������������������������0000664�0000000�0000000�00000240352�11540251763�0023141�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE lewis SYSTEM "lewis.dtd"> <REUTERS TOPICS="YES" LEWISSPLIT="TRAIN" CGISPLIT="TRAINING-SET" OLDID="5544" NEWID="1"> <DATE>26-FEB-1987 15:01:01.79</DATE> <TOPICS><D>cocoa</D></TOPICS> <PLACES><D>el-salvador</D><D>usa</D><D>uruguay</D></PLACES> <PEOPLE></PEOPLE> <ORGS></ORGS> <EXCHANGES></EXCHANGES> <COMPANIES></COMPANIES> <UNKNOWN> C T f0704reute u f BC-BAHIA-COCOA-REVIEW 02-26 0105</UNKNOWN> <TEXT> <TITLE>BAHIA COCOA REVIEW SALVADOR, Feb 26 - Showers continued throughout the week in the Bahia cocoa zone, alleviating the drought since early January and improving prospects for the coming temporao, although normal humidity levels have not been restored, Comissaria Smith said in its weekly review. The dry period means the temporao will be late this year. Arrivals for the week ended February 22 were 155,221 bags of 60 kilos making a cumulative total for the season of 5.93 mln against 5.81 at the same stage last year. Again it seems that cocoa delivered earlier on consignment was included in the arrivals figures. Comissaria Smith said there is still some doubt as to how much old crop cocoa is still available as harvesting has practically come to an end. With total Bahia crop estimates around 6.4 mln bags and sales standing at almost 6.2 mln there are a few hundred thousand bags still in the hands of farmers, middlemen, exporters and processors. There are doubts as to how much of this cocoa would be fit for export as shippers are now experiencing dificulties in obtaining +Bahia superior+ certificates. In view of the lower quality over recent weeks farmers have sold a good part of their cocoa held on consignment. Comissaria Smith said spot bean prices rose to 340 to 350 cruzados per arroba of 15 kilos. Bean shippers were reluctant to offer nearby shipment and only limited sales were booked for March shipment at 1,750 to 1,780 dlrs per tonne to ports to be named. New crop sales were also light and all to open ports with June/July going at 1,850 and 1,880 dlrs and at 35 and 45 dlrs under New York july, Aug/Sept at 1,870, 1,875 and 1,880 dlrs per tonne FOB. Routine sales of butter were made. March/April sold at 4,340, 4,345 and 4,350 dlrs. April/May butter went at 2.27 times New York May, June/July at 4,400 and 4,415 dlrs, Aug/Sept at 4,351 to 4,450 dlrs and at 2.27 and 2.28 times New York Sept and Oct/Dec at 4,480 dlrs and 2.27 times New York Dec, Comissaria Smith said. Destinations were the U.S., Covertible currency areas, Uruguay and open ports. Cake sales were registered at 785 to 995 dlrs for March/April, 785 dlrs for May, 753 dlrs for Aug and 0.39 times New York Dec for Oct/Dec. Buyers were the U.S., Argentina, Uruguay and convertible currency areas. Liquor sales were limited with March/April selling at 2,325 and 2,380 dlrs, June/July at 2,375 dlrs and at 1.25 times New York July, Aug/Sept at 2,400 dlrs and at 1.25 times New York Sept and Oct/Dec at 1.25 times New York Dec, Comissaria Smith said. Total Bahia sales are currently estimated at 6.13 mln bags against the 1986/87 crop and 1.06 mln bags against the 1987/88 crop. Final figures for the period to February 28 are expected to be published by the Brazilian Cocoa Trade Commission after carnival which ends midday on February 27. Reuter  26-FEB-1987 15:02:20.00 usa F Y f0708reute d f BC-STANDARD-OIL-<SRD>-TO 02-26 0082  STANDARD OIL <SRD> TO FORM FINANCIAL UNIT CLEVELAND, Feb 26 - Standard Oil Co and BP North America Inc said they plan to form a venture to manage the money market borrowing and investment activities of both companies. BP North America is a subsidiary of British Petroleum Co Plc <BP>, which also owns a 55 pct interest in Standard Oil. The venture will be called BP/Standard Financial Trading and will be operated by Standard Oil under the oversight of a joint management committee. Reuter  26-FEB-1987 15:03:27.51 usa F A f0714reute d f BC-TEXAS-COMMERCE-BANCSH 02-26 0064  TEXAS COMMERCE BANCSHARES <TCB> FILES PLAN HOUSTON, Feb 26 - Texas Commerce Bancshares Inc's Texas Commerce Bank-Houston said it filed an application with the Comptroller of the Currency in an effort to create the largest banking network in Harris County. The bank said the network would link 31 banks having 13.5 billion dlrs in assets and 7.5 billion dlrs in deposits. Reuter  26-FEB-1987 15:07:13.72 usabrazil F f0725reute u f BC-TALKING-POINT/BANKAME 02-26 0105  TALKING POINT/BANKAMERICA <BAC> EQUITY OFFER by Janie Gabbett, Reuters LOS ANGELES, Feb 26 - BankAmerica Corp is not under pressure to act quickly on its proposed equity offering and would do well to delay it because of the stock's recent poor performance, banking analysts said. Some analysts said they have recommended BankAmerica delay its up to one-billion-dlr equity offering, which has yet to be approved by the Securities and Exchange Commission. BankAmerica stock fell this week, along with other banking issues, on the news that Brazil has suspended interest payments on a large portion of its foreign debt. The stock traded around 12, down 1/8, this afternoon, after falling to 11-1/2 earlier this week on the news. Banking analysts said that with the immediate threat of the First Interstate Bancorp <I> takeover bid gone, BankAmerica is under no pressure to sell the securities into a market that will be nervous on bank stocks in the near term. BankAmerica filed the offer on January 26. It was seen as one of the major factors leading the First Interstate withdrawing its takeover bid on February 9. A BankAmerica spokesman said SEC approval is taking longer than expected and market conditions must now be re-evaluated. "The circumstances at the time will determine what we do," said Arthur Miller, BankAmerica's Vice President for Financial Communications, when asked if BankAmerica would proceed with the offer immediately after it receives SEC approval. "I'd put it off as long as they conceivably could," said Lawrence Cohn, analyst with Merrill Lynch, Pierce, Fenner and Smith. Cohn said the longer BankAmerica waits, the longer they have to show the market an improved financial outlook. Although BankAmerica has yet to specify the types of equities it would offer, most analysts believed a convertible preferred stock would encompass at least part of it. Such an offering at a depressed stock price would mean a lower conversion price and more dilution to BankAmerica stock holders, noted Daniel Williams, analyst with Sutro Group. Several analysts said that while they believe the Brazilian debt problem will continue to hang over the banking industry through the quarter, the initial shock reaction is likely to ease over the coming weeks. Nevertheless, BankAmerica, which holds about 2.70 billion dlrs in Brazilian loans, stands to lose 15-20 mln dlrs if the interest rate is reduced on the debt, and as much as 200 mln dlrs if Brazil pays no interest for a year, said Joseph Arsenio, analyst with Birr, Wilson and Co. He noted, however, that any potential losses would not show up in the current quarter. With other major banks standing to lose even more than BankAmerica if Brazil fails to service its debt, the analysts said they expect the debt will be restructured, similar to way Mexico's debt was, minimizing losses to the creditor banks. Reuter  26-FEB-1987 15:10:44.60 grainwheatcornbarleyoatsorghum usa C G f0738reute u f BC-average-prices 02-26 0095  NATIONAL AVERAGE PRICES FOR FARMER-OWNED RESERVE WASHINGTON, Feb 26 - The U.S. Agriculture Department reported the farmer-owned reserve national five-day average price through February 25 as follows (Dlrs/Bu-Sorghum Cwt) - Natl Loan Release Call Avge Rate-X Level Price Price Wheat 2.55 2.40 IV 4.65 -- V 4.65 -- VI 4.45 -- Corn 1.35 1.92 IV 3.15 3.15 V 3.25 -- X - 1986 Rates. Natl Loan Release Call Avge Rate-X Level Price Price Oats 1.24 0.99 V 1.65 -- Barley n.a. 1.56 IV 2.55 2.55 V 2.65 -- Sorghum 2.34 3.25-Y IV 5.36 5.36 V 5.54 -- Reserves I, II and III have matured. Level IV reflects grain entered after Oct 6, 1981 for feedgrain and after July 23, 1981 for wheat. Level V wheat/barley after 5/14/82, corn/sorghum after 7/1/82. Level VI covers wheat entered after January 19, 1984. X-1986 rates. Y-dlrs per CWT (100 lbs). n.a.-not available. Reuter  26-FEB-1987 15:14:36.41 veg-oillinseedlin-oilsoy-oilsun-oilsoybeanoilseedcornsunseedgrainsorghumwheat argentina G f0754reute r f BC-ARGENTINE-1986/87-GRA 02-26 0066  ARGENTINE 1986/87 GRAIN/OILSEED REGISTRATIONS BUENOS AIRES, Feb 26 - Argentine grain board figures show crop registrations of grains, oilseeds and their products to February 11, in thousands of tonnes, showing those for futurE shipments month, 1986/87 total and 1985/86 total to February 12, 1986, in brackets: Bread wheat prev 1,655.8, Feb 872.0, March 164.6, total 2,692.4 (4,161.0). Maize Mar 48.0, total 48.0 (nil). Sorghum nil (nil) Oilseed export registrations were: Sunflowerseed total 15.0 (7.9) Soybean May 20.0, total 20.0 (nil) The board also detailed export registrations for subproducts, as follows, SUBPRODUCTS Wheat prev 39.9, Feb 48.7, March 13.2, Apr 10.0, total 111.8 (82.7) . Linseed prev 34.8, Feb 32.9, Mar 6.8, Apr 6.3, total 80.8 (87.4). Soybean prev 100.9, Feb 45.1, MAr nil, Apr nil, May 20.0, total 166.1 (218.5). Sunflowerseed prev 48.6, Feb 61.5, Mar 25.1, Apr 14.5, total 149.8 (145.3). Vegetable oil registrations were : Sunoil prev 37.4, Feb 107.3, Mar 24.5, Apr 3.2, May nil, Jun 10.0, total 182.4 (117.6). Linoil prev 15.9, Feb 23.6, Mar 20.4, Apr 2.0, total 61.8, (76.1). Soybean oil prev 3.7, Feb 21.1, Mar nil, Apr 2.0, May 9.0, Jun 13.0, Jul 7.0, total 55.8 (33.7). REUTER  26-FEB-1987 15:14:42.83 usa F f0755reute d f BC-RED-LION-INNS-FILES-P 02-26 0082  RED LION INNS FILES PLANS OFFERING PORTLAND, Ore., Feb 26 - Red Lion Inns Limited Partnership said it filed a registration statement with the Securities and Exchange Commission covering a proposed offering of 4,790,000 units of limited partnership interests. The company said it expects the offering to be priced at 20 dlrs per unit. It said proceeds from the offering, along with a 102.5 mln dlr mortgage loan, will be used to finance its planned acquisition of 10 Red Lion hotels. Reuter  26-FEB-1987 15:15:40.12 usa F A RM f0758reute u f BC-USX-<X>-DEBT-DOWGRADE 02-26 0103  USX <X> DEBT DOWGRADED BY MOODY'S NEW YORK, Feb 26 - Moody's Investors Service Inc said it lowered the debt and preferred stock ratings of USX Corp and its units. About seven billion dlrs of securities is affected. Moody's said Marathon Oil Co's recent establishment of up to one billion dlrs in production payment facilities on its prolific Yates Field has significant negative implications for USX's unsecured creditors. The company appears to have positioned its steel segment for a return to profit by late 1987, Moody's added. Ratings lowered include those on USX's senior debt to BA-1 from BAA-3. Reuter  26-FEB-1987 15:17:11.20 earn usa F f0762reute r f BC-CHAMPION-PRODUCTS-<CH 02-26 0067  CHAMPION PRODUCTS <CH> APPROVES STOCK SPLIT ROCHESTER, N.Y., Feb 26 - Champion Products Inc said its board of directors approved a two-for-one stock split of its common shares for shareholders of record as of April 1, 1987. The company also said its board voted to recommend to shareholders at the annual meeting April 23 an increase in the authorized capital stock from five mln to 25 mln shares. Reuter  26-FEB-1987 15:18:06.67 acq usa F f0767reute d f BC-COMPUTER-TERMINAL-SYS 02-26 0107  COMPUTER TERMINAL SYSTEMS <CPML> COMPLETES SALE COMMACK, N.Y., Feb 26 - Computer Terminal Systems Inc said it has completed the sale of 200,000 shares of its common stock, and warrants to acquire an additional one mln shares, to <Sedio N.V.> of Lugano, Switzerland for 50,000 dlrs. The company said the warrants are exercisable for five years at a purchase price of .125 dlrs per share. Computer Terminal said Sedio also has the right to buy additional shares and increase its total holdings up to 40 pct of the Computer Terminal's outstanding common stock under certain circumstances involving change of control at the company. The company said if the conditions occur the warrants would be exercisable at a price equal to 75 pct of its common stock's market price at the time, not to exceed 1.50 dlrs per share. Computer Terminal also said it sold the technolgy rights to its Dot Matrix impact technology, including any future improvements, to <Woodco Inc> of Houston, Tex. for 200,000 dlrs. But, it said it would continue to be the exclusive worldwide licensee of the technology for Woodco. The company said the moves were part of its reorganization plan and would help pay current operation costs and ensure product delivery. Computer Terminal makes computer generated labels, forms, tags and ticket printers and terminals. Reuter  26-FEB-1987 15:18:59.34 earn usa F f0772reute r f BC-COBANCO-INC-<CBCO>-YE 02-26 0058  COBANCO INC <CBCO> YEAR NET SANTA CRUZ, Calif., Feb 26 - Shr 34 cts vs 1.19 dlrs Net 807,000 vs 2,858,000 Assets 510.2 mln vs 479.7 mln Deposits 472.3 mln vs 440.3 mln Loans 299.2 mln vs 327.2 mln Note: 4th qtr not available. Year includes 1985 extraordinary gain from tax carry forward of 132,000 dlrs, or five cts per shr. Reuter  26-FEB-1987 15:19:15.45 earnacq usa F f0773reute u f BC-OHIO-MATTRESS-<OMT>-M 02-26 0095  OHIO MATTRESS <OMT> MAY HAVE LOWER 1ST QTR NET CLEVELAND, Feb 26 - Ohio Mattress Co said its first quarter, ending February 28, profits may be below the 2.4 mln dlrs, or 15 cts a share, earned in the first quarter of fiscal 1986. The company said any decline would be due to expenses related to the acquisitions in the middle of the current quarter of seven licensees of Sealy Inc, as well as 82 pct of the outstanding capital stock of Sealy. Because of these acquisitions, it said, first quarter sales will be substantially higher than last year's 67.1 mln dlrs. Noting that it typically reports first quarter results in late march, said the report is likely to be issued in early April this year. It said the delay is due to administrative considerations, including conducting appraisals, in connection with the acquisitions. Reuter  26-FEB-1987 15:20:13.09 earn usa F f0775reute r f BC-AM-INTERNATIONAL-INC 02-26 0065  AM INTERNATIONAL INC <AM> 2ND QTR JAN 31 CHICAGO, Feb 26 - Oper shr loss two cts vs profit seven cts Oper shr profit 442,000 vs profit 2,986,000 Revs 291.8 mln vs 151.1 mln Avg shrs 51.7 mln vs 43.4 mln Six mths Oper shr profit nil vs profit 12 cts Oper net profit 3,376,000 vs profit 5,086,000 Revs 569.3 mln vs 298.5 mln Avg shrs 51.6 mln vs 41.1 mln NOTE: Per shr calculated after payment of preferred dividends. Results exclude credits of 2,227,000 or four cts and 4,841,000 or nine cts for 1986 qtr and six mths vs 2,285,000 or six cts and 4,104,000 or 11 cts for prior periods from operating loss carryforwards. Reuter  26-FEB-1987 15:20:27.17 earn usa F f0776reute u f BC-BROWN-FORMAN-INC-<BFD 02-26 0043  BROWN-FORMAN INC <BFD> 4TH QTR NET LOUISVILLE, Ky., Feb 26 - Shr one dlr vs 73 cts Net 12.6 mln vs 15.8 mln Revs 337.3 mln vs 315.2 mln Nine mths Shr 3.07 dlrs vs 3.08 dlrs Net 66 mln vs 66.2 mln Revs 1.59 billion vs 997.1 mln Reuter  26-FEB-1987 15:20:48.43 usa F f0778reute r f BC-NATIONAL-INTERGROUP<N 02-26 0047  NATIONAL INTERGROUP<NII> TO OFFER PERMIAN UNITS PITTSBURGH, Feb 26 - National Intergroup Inc said it plans to file a registration statement with the securities and exchange commission for an offering of cumulative convertible preferred partnership units in Permian Partners L.P. The Permian Partners L.P. was recently formed by National Intergroup to continue to business of Permian Corp, acquired by the company in 1985. The company said Permian will continue to manage the business as a general partner, retaining a 35 pct stake in the partnership in the form of common and general partnership units. It did not say how many units would be offered or what the price would be. Reuter  26-FEB-1987 15:21:16.13 usabrazil RM f0781reute u f BC--ECONOMIC-SPOTLIGHT-- 02-26 0104  ECONOMIC SPOTLIGHT - BANKAMERICA <BAC> by Janie Gabbett, Reuters LOS ANGELES, Feb 26 - BankAmerica Corp is not under pressure to act quickly on its proposed equity offering and would do well to delay it because of the stock's recent poor performance, banking analysts said. Some analysts said they have recommended BankAmerica delay its up to one-billion-dlr equity offering, which has yet to be approved by the Securities and Exchange Commission. BankAmerica stock fell this week, along with other banking issues, on the news that Brazil has suspended interest payments on a large portion of its foreign debt. The stock traded around 12, down 1/8, this afternoon, after falling to 11-1/2 earlier this week on the news. Banking analysts said that with the immediate threat of the First Interstate Bancorp <I> takeover bid gone, BankAmerica is under no pressure to sell the securities into a market that will be nervous on bank stocks in the near term. BankAmerica filed the offer on January 26. It was seen as one of the major factors leading the First Interstate withdrawing its takeover bid on February 9. A BankAmerica spokesman said SEC approval is taking longer than expected and market conditions must now be re-evaluated. "The circumstances at the time will determine what we do," said Arthur Miller, BankAmerica's Vice President for Financial Communications, when asked if BankAmerica would proceed with the offer immediately after it receives SEC approval. "I'd put it off as long as they conceivably could," said Lawrence Cohn, analyst with Merrill Lynch, Pierce, Fenner and Smith. Cohn said the longer BankAmerica waits, the longer they have to show the market an improved financial outlook. Although BankAmerica has yet to specify the types of equities it would offer, most analysts believed a convertible preferred stock would encompass at least part of it. Such an offering at a depressed stock price would mean a lower conversion price and more dilution to BankAmerica stock holders, noted Daniel Williams, analyst with Sutro Group. Several analysts said that while they believe the Brazilian debt problem will continue to hang over the banking industry through the quarter, the initial shock reaction is likely to ease over the coming weeks. Nevertheless, BankAmerica, which holds about 2.70 billion dlrs in Brazilian loans, stands to lose 15-20 mln dlrs if the interest rate is reduced on the debt, and as much as 200 mln dlrs if Brazil pays no interest for a year, said Joseph Arsenio, analyst with Birr, Wilson and Co. He noted, however, that any potential losses would not show up in the current quarter. With other major banks standing to lose even more than BankAmerica if Brazil fails to service its debt, the analysts said they expect the debt will be restructured, similar to way Mexico's debt was, minimizing losses to the creditor banks. Reuter  26-FEB-1987 15:24:48.56 usa F f0789reute d f BC-NATIONAL-HEALTH-ENHAN 02-26 0076  NATIONAL HEALTH ENHANCEMENT <NHES> NEW PROGRAM PHOENIX, Ariz., Feb 26 - National Health Enhancement Systems Inc said it is offering a new health evaluation system to its line of fitness assessment programs. The company said the program, called The Health Test, will be available in 60 days. Customers who use the program will receive a computer-generated report and recommendations for implementing a program to improve their physical condition. Reuter  26-FEB-1987 15:26:26.78 earn usa F f0796reute r f BC-DEAN-FOODS-<DF>-SEES 02-26 0101  DEAN FOODS <DF> SEES STRONG 4TH QTR EARNINGS CHICAGO, Feb 26 - Dean Foods Co expects earnings for the fourth quarter ending May 30 to exceed those of the same year-ago period, Chairman Kenneth Douglas told analysts. In the fiscal 1986 fourth quarter the food processor reported earnings of 40 cts a share. Douglas also said the year's sales should exceed 1.4 billion dlrs, up from 1.27 billion dlrs the prior year. He repeated an earlier projection that third-quarter earnings "will probably be off slightly" from last year's 40 cts a share, falling in the range of 34 cts to 36 cts a share. Douglas said it was too early to project whether the anticipated fourth quarter performance would be "enough for us to exceed the prior year's overall earnings" of 1.53 dlrs a share. In 1988, Douglas said Dean should experience "a 20 pct improvement in our bottom line from effects of the tax reform act alone." President Howard Dean said in fiscal 1988 the company will derive benefits of various dairy and frozen vegetable acquisitions from Ryan Milk to the Larsen Co. Dean also said the company will benefit from its acquisition in late December of Elgin Blenders Inc, West Chicago. He said the company is a major shareholder of E.B.I. Foods Ltd, a United Kingdom blender, and has licensing arrangements in Australia, Canada, Brazil and Japan. "It provides ann entry to McDonalds Corp <MCD> we've been after for years," Douglas told analysts. Reuter  26-FEB-1987 15:26:54.12 wheatgrain yemen-arab-republicusa C G f0798reute u f BC-/BONUS-WHEAT-FLOUR-FO 02-26 0096  BONUS WHEAT FLOUR FOR NORTH YEMEN -- USDA WASHINGTON, Feb 26 - The Commodity Credit Corporation, CCC, has accepted an export bonus offer to cover the sale of 37,000 long tons of wheat flour to North Yemen, the U.S. Agriculture Department said. The wheat four is for shipment March-May and the bonus awarded was 119.05 dlrs per tonnes and will be paid in the form of commodities from the CCC inventory. The bonus was awarded to the Pillsbury Company. The wheat flour purchases complete the Export Enhancement Program initiative announced in April, 1986, it said. Reuter  26-FEB-1987 15:32:03.12 usa F A f0804reute d f BC-CREDIT-CARD-DISCLOSUR 02-26 0111  CREDIT CARD DISCLOSURE BILLS INTRODUCED WASHINGTON, Feb 26 - Legislation to require disclosure of credit card fees and interest rates before the cards are issued have been introduced in the Senate and House. Sen. Chris Dodd, D-Conn, a co-sponsor of the bill, said many banks and financial institutions do not disclose all the information about terms of their cards in promotional material sent to prospective customers. "By requiring card issuers to disclose the terms and conditions of their cards at the time of solicitation, the legislation is intended to arm consumers with enough information to shop around for the best deal," Dodd said in a statement. Reuter  26-FEB-1987 15:33:23.61 usa F f0809reute d f BC-HUGHES-CAPITAL-UNIT-S 02-26 0086  HUGHES CAPITAL UNIT SIGNS PACT WITH BEAR STEARNS FORT LAUDERDALE, Fla., Feb 26 - Hughes/Conserdyne Corp, a unit of <Hughes Capital Corp> said it made Bear Stearns and Co Inc <BSC> its exclusive investment banker to develop and market financing for the design and installation of its micro-utility systems for municipalities. The company said these systems are self-contained electrical generating facilities using alternate power sources, such as photovoltaic cells, to replace public utility power sources. Reuter  26-FEB-1987 15:34:07.03 copper usa C M F f0810reute u f BC-magma-copper-price 02-26 0036  MAGMA LOWERS COPPER 0.75 CENT TO 66 CTS NEW YORK, Feb 26 - Magma Copper Co, a subsidiary of Newmont Mining Corp, said it is cutting its copper cathode price by 0.75 cent to 66 cents a lb, effective immediately. Reuter  26-FEB-1987 15:34:16.30 earn usa F f0811reute u f BC-BROWN-FORMAN-<BFDB>-S 02-26 0053  BROWN-FORMAN <BFDB> SETS STOCK SPLIT, UPS PAYOUT LOUISVILLE, Ky., Feb 26 - Brown-Forman Inc said its board has approved a three-for-two stock split and a 35 pct increase in the company cash dividend. The company cited its improved earnings outlook and continued strong cash flow as reasons for raising the dividend. Brown-Forman said the split of its Class A and Class B common shares would be effective March 13. The company said directors declared a quarterly cash dividend on each new share of both classes of 28 cts, payable April one to holders of record March 20. Prior to the split, the company had paid 31 cts quarterly. Brown-Forman today reported a 37 pct increase in third quarter profits to 21.6 mln dlrs, or 1.00 dlr a share, on a seven pct increase in sales to a record 337 mln dlrs. Brown-Forman said nine month profits declined a bit to 66.0 mln dlrs, or 3.07 dlrs a share, from 66.2 mln dlrs, or 3.08 dlrs a share, a year earlier due to a second quarter charge of 37 cts a share for restructuring its beverage operations. The company said lower corporate tax rates and the restructuring "are expected to substantially improve Brown-Forman's earnings and cash flow in fiscal 1988." Reuter  26-FEB-1987 15:35:16.67 earn usa F f0814reute h f BC-ESQUIRE-RADIO-AND-ELE 02-26 0072  ESQUIRE RADIO AND ELECTRONICS INC <EE> 4TH QTR NEW YORK, Feb 26 - Shr profit 15 cts vs profit four cts Annual div 72 cts vs 72 cts prior yr Net profit 72,000 vs profit 16,000 Revs 7,075,000 vs 2,330,000 12 mths Shr profit 42 cts vs loss 11 cts Net profit 203,000 vs loss 55,000 Revs 16.1 mln vs 3,971,000 NOTE: annual dividend payable April 10, 1987, to stockholders of record on March 27, 1987. Reuter  26-FEB-1987 15:35:39.38 usa F f0815reute h f BC-SHEARSON-LEHMAN-NAMES 02-26 0061  SHEARSON LEHMAN NAMES NEW MANAGING DIRECTOR NEW YORK, Feb 26 - Shearson Lehman Brothers, a unit of American Express Co <AXP>, said Robert Stearns has joined the company as managing director of its merger and acquisition department. Shearson said Stearns formerly was part of Merrill Lynch Pierce, Fenner and Smith Inc's <MER> merger and acquisitions department. Reuter  26-FEB-1987 15:36:44.78 usabrazilvenezuela V RM f0817reute b f BC-/BANKERS-REPORT-BREAK 02-26 0092  BANKERS REPORT BREAKTHROUGH ON VENEZUELAN DEBT NEW YORK, Feb 26 - Venezuela and its bank advisory committee have agreed in principle on revisions to the terms of a 21 billion dlr debt-rescheduling package signed last February, bankers said. They declined to disclose details because two or three representatives on the panel have still to obtain the approval of their senior management for the new terms. The committee was meeting in New York this afternoon and could put its final stamp of approval of the deal later today, the bankers said. "A number of details have still to be finalized, but the broad details of the new amortization schedules and interest rates are in place," one senior banker said. The interest rate on the rescheduling was originally set at 1-1/8 pct over Eurodollar rates, but Venezuela requested easier terms because of a 40 pct drop in oil income last year. It also asked for a reduction in the repayments it was due to make in 1987, 1988 and 1989 - after an earlier request that it make no amortizations at all in those years was rebuffed - and sought a commitment from the banks to finance new investment in Venezuela. The breakthrough in the Venezuelan talks, which have been going on intermittently for several months, follows the announcement earlier today of a 10.6 billion dlr debt rescheduling pact between Chile and its bank advisory panel. And last night Citibank said Mexico's financing package, including a 7.7 billion dlr loan, will be signed on March 20. While the sudden progress is to some extent coincidental, bankers acknowledge a desire to chalk up some quick successes after the shock of Brazil's unilateral interest suspension last Friday. By striking swift deals, banks hope to reduce the incentive for other debtors to emulate Brazil. Reuter  26-FEB-1987 15:36:53.42 earn usa F f0818reute d f BC-UNITED-PRESIDENTIAL-C 02-26 0073  UNITED PRESIDENTIAL CORP <UPCO> 4TH QTR NET KOKOMO, Ind., Feb 26 - Shr 39 cts vs 50 cts Net 1,545,160 vs 2,188,933 Revs 25.2 mln vs 19.5 mln Year Shr 1.53 dlrs vs 1.21 dlrs Net 6,635,318 vs 5,050,044 Revs 92.2 mln vs 77.4 mln NOTE: Results include adjustment of 848,600 dlrs or 20 cts shr for 1986 year and both 1985 periods from improvement in results of its universal life business than first estimated. Reuter  26-FEB-1987 15:38:26.23 usa reagan V RM f0823reute r f AM-REAGAN-IMPACT-(NEWS-A NALYSIS) 02-26 0092  TOWER REPORT DIMINISHES REAGAN'S HOPES OF REBOUND By Michael Gelb, Reuters WASHINGTON, Feb 26 - The Tower Commission report, which says President Reagan was ignorant about much of the Iran arms deal, just about ends his prospects of regaining political dominance in Washington, political analysts said. "This is certification of incompetence," private political analyst Stephen Hess told Reuters in commenting on the Tower report made public today. "It's as if he went before a professional licensing board and was denied credentials." In one of the most direct criticisms, board chairman John Tower, a longtime Reagan supporter and former Republican senator from Texas, told a press conference, "The president clearly did not understand the nature of this operation." The report, which lent credence to widespread opinion in Washington that Reagan is not in full command of the government, was particularly damaging because it was prepared by a board of the Republican president's own choosing. The three-member panel made up of Tower, former National Security Adviser Brent Scowcroft and former Secretary of State Edmund Muskie, does not carry the partisan taint of criticism from a Congress controlled by the Democratic party. "We're falling by our own hand," said one Republican political strategist. "What can we say except 'we're sorry, we won't do it again'?" The strategist, who works for one of his party's top 1988 presidential contenders and asked not to be identified, said the report was like "an anvil falling on us." Hess, with the Brookings Institution public policy study group, said the report is the final blow to Reagan's hopes of regaining the upper hand he once had in dealings with Congress, the press and the Washington bureaucracy. The report may also undermine the standing of Defense Secretary Caspar Weinberger and Secretary of State George Shultz, who the report suggests were more interested in keeping their own skirts clean than supporting the president. "They protected the record as to their own positions on this issue. They were not energetic in attempting to protect the president from the consequences," it said. White House chief of staff Donald Regan and former Central Intelligence Agency Director William Casey also received strong criticism, but the blows were expected in their cases. Regan, expected to resign or be fired shortly, was savaged for allegedly failing both to help Reagan conduct the Iran initiative and to avoid "chaos" in the disclosure process. Casey, who underwent surgery for removal of a cancerous brain tumor in December, had already resigned for health reasons last month. "This is a story about people who came up somewhat short of being heroes," Tower told reporters. While Reagan retains considerable constitutional powers, including command of the armed forces and the right to veto legislation, analysts say it will be difficult for him to retake control of the country's policy agenda -- particularly with Congress controlled by the Democrats. The crucial remaining question, they said, is whether the man in the street will forsake Reagan over the affair. Although his job approval rating has fallen as much as twenty percentage points in some opinion polls since the arms deal with Iran became public last November, his personal popularity is still relatively high. A Los Angeles Times poll released earlier this week showed that just 37 pct of those surveyed thought Reagan was in control of the government, but 55 pct still thought he was doing a good job as president. American Enterprise Institute analyst William Schneider, a Democrat, says Reagan's loss of support among Washington power brokers could be offset by continued backing of the public. "In the past, he has been able to go around the power elite by appealing directly to the public," Schneider said. Reagan will again plead his case that way in a televised address next week. But one top Republican strategist warned against expecting a dramatic turnaround. "The White House has to avoid building expectations that cannot be met," said the strategist, who requested anonymity. "They have to recognize there is no quick fix." Analysts also point out that Reagan's personal popularity has not always translated into public backing for his policies. They note he was dramatically rebuffed in last November's elections when voters rejected his appeals and restored control of the Senate to the Democrats. Reuter  26-FEB-1987 15:39:41.92 housing usa F f0827reute r f BC-JANUARY-HOUSING-SALES 02-26 0103  JANUARY HOUSING SALES DROP, REALTY GROUP SAYS WASHINGTON, Feb 26 - Sales of previously owned homes dropped 14.5 pct in January to a seasonally adjusted annual rate of 3.47 mln units, the National Association of Realtors (NAR) said. But the December rate of 4.06 mln units had been the highest since the record 4.15 mln unit sales rate set in November 1978, the group said. "The drop in January is not surprising considering that a significant portion of December's near-record pace was made up of sellers seeking to get favorable capital gains treatment under the old tax laws," said the NAR's John Tuccillo. Reuter  26-FEB-1987 15:41:56.54 money-supply A f0835reute f f BC-******ASSETS-OF-MONEY 02-26 0012  ******ASSETS OF MONEY MARKET MUTUAL FUNDS ROSE 720.4 MLN DLRS IN LATEST WEEK Blah blah blah.  26-FEB-1987 15:43:14.36 usa A f0840reute b f BC-******U.S.-TAX-WRITER 02-26 0013  ******U.S. TAX WRITERS SEEK ESTATE TAX CURBS, RAISING 6.7 BILLION DLRS THRU 1991 Blah blah blah.  26-FEB-1987 15:43:59.53 usa F f0842reute d f BC-SENATORS-INTRODUCE-EX 02-26 0110  SENATORS INTRODUCE EXPORT LICENSING REFORM BILL WASHINGTON, Feb 26 - Sens. Alan Cranston (D-Cal.) and Daniel Evans (R-Wash.) said they introduced export licensing reform legislation that could save U.S. companies hundreds of thousands of dollars annually. "Our emphasis is two-fold: Decontrol and de-license items where such actions will not endanger our national security, and eliminate the Department of Defense's de facto veto authority over the licensing process," Cranston said. "Our reforms should reduce licensing requirements by 65 to 70 pct," he told reporters. "I am convinced that a more rational...licensing process will boost exports." U.S. export controls are intended to deny Eastern bloc countries access to technology that could further their military capabilities. "By refocusing our control resources on higher levels of technology, technology that is truly critical, we will do a better job of preventing diversion of critical technology to our adversaries while promoting more exports," Cranston said. "We cannot expect to continue to play a leading role in new technology development in the future if we unduly restrict the activities of U.S. firms in the world market-place," Evans told reporters. Reuter  26-FEB-1987 15:44:36.04 usa F f0845reute r f BC-EXCELAN-INC-SETS-INIT 02-26 0061  EXCELAN INC SETS INITIAL STOCK OFFER SAN JOSE, Calif., Feb 26 - Excelan Inc said it is making an initial public offering of 2,129,300 shares of common stock at 12 dlrs per share. Excelan said 1.6 mln of the shares are being sold by the company and 529,300 shares are being sold by stockholders. Excelan designs and manufactures computer-related products. Reuter  26-FEB-1987 15:45:19.65 usa F f0847reute d f BC-CCX-NETWORK-<CCXN>-SE 02-26 0074  CCX NETWORK <CCXN> SECONDARY OFFERING UNDERWAY CONWAY, Ark., Feb 26 - CCX Network Inc said it was offering 220,838 shares of stock at 15.75 dlrs a share though underwriters Stephens Inc and Cazenove Inc. The company said it was selling the stock on behalf of some shareholders, including those who recently received shares in the company in exchange for their businesses. The company said it was receiving no proceeds from the offering. Reuter  26-FEB-1987 15:45:26.55 usa F f0848reute r f BC-FIRST-UNION-<FUNC>-FI 02-26 0055  FIRST UNION <FUNC> FILES 100 MLN DLR NOTES ISSUE NEW YORK, Feb 26 - First Union Corp said it has filed with the Securities and Exchange Commission for a proposed offering of 100 mln dlrs of fixed rate subordinated notes due 1997. The notes will be sold nationwide through underwriters managed by Shearson Lehman Brothers Inc. Reuter  26-FEB-1987 15:45:35.37 earn usa F f0849reute r f BC-OWENS-AND-MINOR-INC-< 02-26 0025  OWENS AND MINOR INC <OBOD> RAISES QTLY DIVIDEND RICHMOND, Va. Feb 26 - Qtly div eights cts vs 7.5 cts prior Pay March 31 Record March 13 Reuter  26-FEB-1987 15:45:39.20 earn usa F f0850reute r f BC-COMPUTER-LANGUAGE-RES 02-26 0070  COMPUTER LANGUAGE RESEARCH IN <CLRI> 4TH QTR CARROLLTON, Texas, Feb 26 - Shr loss 22 cts vs loss 18 cts Net loss 3,035,000 vs loss 2,516,000 Revs 20.9 mln vs 19.6 mln Qtly div three cts vs three cts prior Year Shr profit two cts vs profit 34 cts Net profit 215,000 vs profit 4,647,000 Revs 93.4 mln vs 98.7 mln NOTE: Dividend payable April one to shareholders of record March 17. Reuter  26-FEB-1987 15:45:47.29 earn usa E F f0851reute d f BC-<CINRAM-LTD>-4TH-QTR 02-26 0051  <CINRAM LTD> 4TH QTR NET Scarborough, Ontario, Feb 26 - Shr 45 cts vs 58 cts Net 1.1 mln vs 829,000 Sales 7.9 mln vs 9.4 mln Avg shrs 2,332,397 vs 1,428,000 Year Shr 1.22 dlrs vs 1.06 dlrs Net 2.9 mln vs 1.5 mln Sales 25.7 mln vs 22.2 mln Avg shrs 2,332,397 vs 1,428,000 Reuter  26-FEB-1987 15:46:36.16 usa F f0855reute h f BC-DU-PONT-CO-<DD>-LAUNC 02-26 0105  DU PONT CO <DD> LAUNCHES IMPROVED ARAMID FIBERS WILMINGTON, Del., Feb 26 - The Du Pont Co said it has devloped a new generation of high-strength aramid fibers which is stiffer and less absorbant than previous generations. Du Pont said the new product, Kevlar 149, is up to 40 pct stiffer than first generation aramids, and absorbs less than half the moister of other similar aramid fibers. Kevlar was invented by Du Pont in the late 1960s and is five times stronger than steel and 10 times stronger than aluminum on an equal wieght basis, and is used to replace metals in a variety of products, according to the company. Reuter  26-FEB-1987 15:47:16.17 earn canada E F f0859reute r f BC-STANDARD-TRUSTCO-SEES 02-26 0099  STANDARD TRUSTCO SEES BETTER YEAR Toronto, Feb 26 - Standard Trustco said it expects earnings in 1987 to increase at least 15 to 20 pct from the 9,140,000 dlrs, or 2.52 dlrs per share, recorded in 1986. "Stable interest rates and a growing economy are expected to provide favorable conditions for further growth in 1987," president Brian O'Malley told shareholders at the annual meeting. Standard Trustco previously reported assets of 1.28 billion dlrs in 1986, up from 1.10 billion dlrs in 1985. Return on common shareholders' equity was 18.6 pct last year, up from 15 pct in 1985. Reuter  26-FEB-1987 15:48:26.92 earn usa F f0865reute u f BC-HANDY-AND-HARMAN-<HNH 02-26 0068  HANDY AND HARMAN <HNH> 4TH QTR LOSS NEW YORK, Feb 26 - Shr loss 51 cts vs loss three cts Net loss 7,041,000 vs loss 467,000 Rev 138.9 mln vs 131.4 mln 12 months Shr loss 64 cts vs profit 46 cts Net loss 8,843,000 vs profit 6,306,0000 Rev 558.9 mln vs 556.7 mln NOTE: Net loss for 4th qtr 1986 includes charge for restructuring of 2.6 mln dlrs after tax, or 19 cts a share. 1986 net loss includes after tax special charge of 2.7 mln dlrs, or 20 cts a share. Reuter  26-FEB-1987 15:49:27.16 coffee uk ico-coffee C T f0871reute b f BC-ICO-PRODUCERS-TO-PRES 02-26 0109  ICO PRODUCERS TO PRESENT NEW COFFEE PROPOSAL LONDON, Feb 26 - International Coffee Organization, ICO, producing countries will present a proposal for reintroducing export quotas for 12 months from April 1 with a firm undertaking to try to negotiate up to September 30 any future quota distribution on a new basis, ICO delegates said. Distribution from April 1 would be on an unchanged basis as in an earlier producer proposal, which includes shortfall redistributions totalling 1.22 mln bags, they said. Resumption of an ICO contact group meeting with consumers, scheduled for this evening, has been postponed until tomorrow, delegates said. Reuter  26-FEB-1987 15:49:44.93 usairan V RM f0873reute u f AM-REAGAN-SHULTZ-1STLD 02-26 0108  SHULTZ SAYS NO RESIGNATION OVER IRAN REPORT ANCHORAGE, Alaska, Feb 26 - Secretary of State George Shultz acknowledged failings in the Iran arms affair but declared he would not resign. His role in the scandal that has scarred the Reagan administration attracted harsh criticism from the Tower commission in its report on the affair published today. Shultz, travelling to China for a week-long visit, refused to comment directly on the report, published after he had left Washington. But he repeated -- as he has done since the crisis broke last November -- that he was not going to resign. "You can wipe that off your slate," he said. Reuter  26-FEB-1987 15:49:56.01 acqship usa F f0874reute r f BC-MCLEAN'S-<MII>-U.S.-L 02-26 0094  MCLEAN'S <MII> U.S. LINES SETS ASSET TRANSFER CRANFORD, N.J., Feb 26 - McLean Industries Inc's United States Lines Inc subsidiary said it has agreed in principle to transfer its South American service by arranging for the transfer of certain charters and assets to <Crowley Mariotime Corp>'s American Transport Lines Inc subsidiary. U.S. Lines said negotiations on the contract are expected to be completed within the next week. Terms and conditions of the contract would be subject to approval of various regulatory bodies, including the U.S. Bankruptcy Court. Reuter  26-FEB-1987 15:51:17.84 acq usa F f0881reute u f BC-CHEMLAWN-<CHEM>-RISES 02-26 0106  CHEMLAWN <CHEM> RISES ON HOPES FOR HIGHER BIDS By Cal Mankowski, Reuters NEW YORK, Feb 26 - ChemLawn Corp <CHEM> could attract a higher bid than the 27 dlrs per share offered by Waste Management Inc <WNX>, Wall Street arbitrageurs said. Shares of ChemLawn shot up 11-5/8 to 29-3/8 in over-the-counter- trading with 3.8 mln of the company's 10.1 mln shares changing hands by late afternoon. "This company could go for 10 times cash flow or 30 dlrs, maybe 32 dollars depending on whether there is a competing bidder," an arbitrageur said. Waste Management's tender offer, announced before the opening today, expires March 25. "This is totally by surprise," said Debra Strohmaier, a ChemLawn spokeswoman. The company's board held a regularly scheduled meeting today and was discussing the Waste Management announcement. She said a statement was expected but it was not certain when it would be ready. She was unable to say if there had been any prior contact between Waste Management and ChemLawn officials. "I think they will resist it," said Elliott Schlang, analyst at Prescott, Ball and Turben Inc. "Any company that doesn't like a surprise attack would." Arbitrageurs pointed out it is difficult to resist tender offers for any and all shares for cash. Schlang said ChemLawn could try to find a white knight if does not want to be acquired by Waste Management. Analyst Rosemarie Morbelli of Ingalls and Snyder said ServiceMaster Companies L.P. <SVM> or Rollins Inc <ROL> were examples of companies that could be interested. ChemLawn, with about two mln customers, is the largest U.S. company involved in application of fertilizers, pesticides and herbicides on lawns. Waste Management is involved in removal of wastes. Schlang said ChemLawn's customer base could be valuable to another company that wants to capitalize on a strong residential and commercial distribution system. Both Schlang and Morbelli noted that high growth rates had catapulted ChemLawn's share price into the mid-30's in 1983 but the stock languished as the rate of growth slowed. Schlang said the company's profits are concentrated in the fourth quarter. In 1986 ChemLawn earned 1.19 dlrs per share for the full year, and 2.58 dlrs in the fourth quarter. Morbelli noted ChemLawn competes with thousands of individual entrepreuers who offer lawn and garden care sevice. Reuter  26-FEB-1987 15:51:28.42 sugar usa C T f0882reute b f BC-sugar-imports 02-26 0120  U.S. SUGAR IMPORTS DOWN IN WEEK - USDA WASHINGTON, Feb 26 - Sugar imports subject to the U.S. sugar import quota during the week ended January 9, the initial week of the 1987 sugar quota year, totaled 5,988 short tons versus 46,254 tons the previous week, the Agriculture Department said. The sugar import quota for the 1987 quota year (January-December) has been set at 1,001,430 short tons compared with 1,850,000 tons in the 1986 quota year, which was extended three months to December 31. The department said the Customs Service has reported that weekly and cumulative imports are reported on an actual weight basis and when final polarizations are received, cumulative import data are adjusted accordingly. Reuter  26-FEB-1987 15:51:51.24 trade brazil C G L M T f0884reute d f AM-CRUZADO 02-26 0114  BRAZIL ANTI-INFLATION PLAN LIMPS TO ANNIVERSARY RIO DE JANEIRO, Feb 26 - Brazil's "Cruzado" anti- inflation plan, initially hailed at home and abroad as the saviour of the economy, is limping towards its first anniversary amid soaring prices, widespread shortages and a foreign payments crisis. Announced last February 28 the plan froze prices, fixed the value of the new Cruzado currency and ended widespread indexation of the economy in a bid to halt the country's 250 pct inflation rate. But within a year the plan has all but collapsed. "The situation now is worse than it was. Although there was inflation, at least the economy worked," a leading bank economist said. The crumbling of the plan has been accompanied by a dramatic reversal in the foreign trade account. In 1984 and 1985 Brazil's annual trade surpluses had been sufficient to cover the 12 billion dlrs needed to service its 109 billion dlr foreign debt. For the first nine months of 1986 all seemed to be on target for a repeat, with monthly surpluses averaging one billion dlrs. But as exports were diverted and imports increased to avoid further domestic shortages the trade surplus plunged to 211 mln dlrs in October and since then has averaged under 150 mln. Reuter  26-FEB-1987 15:52:15.10 reserves new-zealand RM f0886reute u f BC-N.Z.-OFFICIAL-FOREIGN 02-26 0049  N.Z. OFFICIAL FOREIGN RESERVES FALL IN JANUARY WELLINGTON, Feb 27 - New Zealand's official foreign reserves fell to 7.15 billion N.Z. Dlrs in January from 7.20 billion dlrs in December and compared with 3.03 billion a year ago period, the Reserve Bank said in its weekly statistical bulletin. Reuter  26-FEB-1987 15:52:25.60 ship usapanama G T M f0888reute d f BC-panama-canal-ships 02-26 0071  AGENCY REPORTS 39 SHIPS WAITING AT PANAMA CANAL WASHINGTON, Feb 26 - The Panama Canal Commission, a U.S. government agency, said in its daily operations report that there was a backlog of 39 ships waiting to enter the canal early today. Over the next two days it expects -- 2/26 2/27 Due: 27 35 Scheduled to Transit: 35 41 End-Day Backlog: 31 25 Average waiting time tomorrow -- Super Tankers Regular Vessels North End: 13 hrs 15 hrs South End: 4 hrs 26 hrs Reuter  26-FEB-1987 15:52:33.04 earn usa F f0889reute d f BC-AMERICA-FIRST-MORTGAG 02-26 0046  AMERICA FIRST MORTGAGE SETS SPECIAL PAYOUT OMAHA, Neb., Feb 26 - <America First Federally Guaranteed Mortgage Fund Two> said it is making a special distribution of 71.6 cts per exchangeable unit, which includes 67.62 cts from return on capital and 3.98 cts from income gains. Reuter  26-FEB-1987 15:52:57.49 usa C G f0894reute d f BC-REPUBLICANS-EYE-BIGGE 02-26 0112  REPUBLICANS EYE BIGGER U.S. CONSERVATION RESERVE WASHINGTON, Feb 26 - A group of Republican governors and members of Congress said they intended to explore expanding the conservation reserve program by up to 20 mln acres. Under current law, between 40 and 45 mln acres of erodible land must be enrolled in the program by the end of fiscal 1990. The Republican Task Force on Farm and Rural America, headed by Senate Majority Leader Robert Dole (Kan.), said they would consider drafting legislation to increase the reserve by between 15 and 20 mln acres. Sen. Charles Grassley (R-Iowa) told Reuters he would offer a bill to expand the reserve to 67 mln acres. Reuter  26-FEB-1987 15:53:05.48 usa F f0895reute h f BC-ARVIN-INDS-<ARV>-PROM 02-26 0037  ARVIN INDS <ARV> PROMOTES EVANS TO PRESIDENT COLUMBUS, IND., Feb 26 - Arvin Industries Inc said L.K. Evans has been elected president, succeeding James Baker who remains chairman. Evans had been executive vice president. Reuter  26-FEB-1987 15:53:54.56 earn usa F f0899reute s f BC-EMHART-CORP-<EMH>-QTL 02-26 0024  EMHART CORP <EMH> QTLY DIVIDEND FARMINGTON, Conn., FEb 26 - Qtly div 35 cts vs 35 cts prior Payable March 31 Record March nine Reuter  26-FEB-1987 15:54:55.20 usa V RM f0901reute u f BC-/U.S.-DATA-POINT-TO-C 02-26 0102  U.S. DATA POINT TO CAPITAL SPENDING SLOWDOWN By Kathleen Hays, Reuters NEW YORK, Feb 26 - A surprise 7.5 pct drop in U.S. January durable goods orders points to a slowdown in capital spending that could presage lackluster real growth in the U.S. economy in the first quarter of 1987, economists said. With total orders, excluding the volatile defense sector, falling a record 9.9 pct, economists agreed that the report painted a bleak picture for the U.S. economy. But they stressed that the 1987 tax reform laws may be a primary factor behind the drop in orders for business capital investment. "It's a rather gloomy outlook for the economy, said David Wyss of Data Resources Inc. "I'm particularly impressed by the 19.7 pct drop in non-defense capital goods orders because it may be a sign that businesses are reacting more adversely to tax reform than we thought." The Commerce Department pointed out that a record 14.8 pct decline in new orders for machinery was led by declines in office and computing equipment orders. Economists said the drop in computer orders may have been a response to the lengthening of depreciation schedules and the end of the investment tax credit under the new tax laws. "It's more expensive to invest than it used to be, so people just aren't doing it as much," Wyss said. Increases in durable goods orders at year's end reinforced the view that businesses anticipated the changing tax laws, economists said. November durable goods orders rose 5.1 pct and December's increased 1.5 pct, revised upwards from a previously reported 0.9 pct. But most acknowledged that the huge January drop was caused by more than tax reform. "The wash-out that took place in January was far greater than the actual gains that took place in November and December," said Bill Sullivan of Dean Witter Reynolds Inc. "The economy has a weakening bent to it early in the year." "The report definitely points to very sluggish capital spending over the next couple of quarters," said Donald Maude of Midland Montagu Capital Markets Inc. Maude pointed to a continuing decline in order backlogs as evidence that the outlook for new orders is not improving. In November, order backlogs rose 0.6 pct, but in December they fell 0.6 pct and in January 0.7 pct, he said. "It suggests orders in the pipeline are depleting, which may quickly translate to a drop in production," Midland Montagu's Maude said. Wyss cautioned that too much should not be made of January's report, given that other reports have reflected strength. But he acknowledged that the decline occurred despite a 51 pct rise in defense orders, compared with a 57.7 pct decline in December. He also noted that there was a 6.9 pct drop in January shipments, compared with a 5.4 pct rise in December. "Given these numbers, there's no reason for the Fed to tighten," Data Resources' Wyss said. "But there's no reason to ease unless we see more numbers like this. The Fed will wait and see," he added. Sullivan predicted the Fed will ease by Easter. "People aren't talking recession or Fed easing now, but the Fed will have to ease to ensure global growth." Reuter  26-FEB-1987 15:56:00.50 usa C f0903reute d f BC-SENATORS-INTRODUCE-EX 02-26 0110  SENATORS INTRODUCE EXPORT LICENSING REFORM BILL WASHINGTON, Feb 26 - Sens. Alan Cranston (D-Cal.) and Daniel Evans (R-Wash.) said they introduced export licensing reform legislation that could save U.S. companies hundreds of thousands of dollars annually. "Our emphasis is two-fold: Decontrol and de-license items where such actions will not endanger our national security, and eliminate the Department of Defense's de facto veto authority over the licensing process," Cranston said. "Our reforms should reduce licensing requirements by 65 to 70 pct," he told reporters. "I am convinced that a more rational...licensing process will boost exports." U.S. export controls are intended to deny Eastern bloc countries access to technology that could further their military capabilities. "By refocusing our control resources on higher levels of technology, technology that is truly critical, we will do a better job of preventing diversion of critical technology to our adversaries while promoting more exports," Cranston said. "We cannot expect to continue to play a leading role in new technology development in the future if we unduly restrict the activities of U.S. firms in the world market-place," Evans told reporters. Reuter  26-FEB-1987 15:57:48.22 earn usa F f0906reute r f BC-AM-INTERNATIONAL-<AM> 02-26 0092  AM INTERNATIONAL <AM> CITES STRONG PROSPECTS CHICAGO, Feb 26 - AM International Inc, reporting an operating loss for the January 31 second quarter, said prospects for the balance of the fiscal year remain good. It said orders at its Harris Graphics subsidiary, acquired in June 1986, "continue to run at a strong pace." For the six months, orders rose 35 pct over the corresponding prior-year period, or on an annualized basis are running at about 630 mln dlrs. The backlog at Harris is up 30 pct from the beginning of the fiscal year, AM said. AM International said its old division are expected to benefit from recent new product introductions and the decline in the value of the dollar. "Research, development and engineering expenditures in fiscal 1987 will be in the 45-50 mln dlr range, and the company said it has allocated another 30-40 mln dlrs for capital expenditures. Earlier AM reported a fourth quarter operating loss of two cts a share compared to profits of seven cts a share a year ago. Revenues rose to 291.8 mln dlrs from 151.1 mln dlrs. Reuter  26-FEB-1987 15:58:07.34 graincorn usahonduras C G f0907reute u f BC-CCC-CREDITS-FOR-HONDU 02-26 0097  CCC CREDITS FOR HONDURAS SWITCHED TO WHITE CORN WASHINGTON, Feb 26 - The Commodity Credit Corporation (CCC) announced 1.5 mln dlrs in credit guarantees previously earmarked to cover sales of dry edible beans to Honduras have been switched to cover sales of white corn, the U.S. Agriculture Department said. The department said the action reduces coverage for sales of dry edible beans to 500,000 dlrs and creates the new line of 1.5 mln dlrs for sales of white corn. All sales under the credit guarantee line must be registered and shipped by September 30, 1987, it said. Reuter  26-FEB-1987 15:58:19.46 money-supply usa A RM f0908reute u f BC-ASSETS-OF-U.S.-MONEY 02-26 0072  ASSETS OF U.S. MONEY FUNDS ROSE IN WEEK WASHINGTON, Feb 26 - Assets of money market mutual funds increased 720.4 mln dlrs in the week ended yesterday to 236.90 billion dlrs, the Investment Company Institute said. Assets of 91 institutional funds rose 356 mln dlrs to 66.19 billion dlrs, 198 general purpose funds rose 212.5 mln dlrs to 62.94 billion dlrs and 92 broker-dealer funds rose 151.9 mln dlrs to 107.77 billion dlrs. Reuter  26-FEB-1987 15:58:47.73 ship usa G C f0910reute u f BC-gulf-grain-barge-frgt 02-26 0117  GULF BARGE FREIGHT RATES UP FURTHER ON CALL ST LOUIS, Feb 26 - Gulf barge freight rates firmed again on the outlook for steady vessel loadings at the Gulf, increasing the demand for barges to supply those ships, dealers said. No barges traded today on the St Louis Merchants' Exchange call session, versus 29 yesterday. Quotes included - - Delivery this week on the Illinois River (Joliet) 135 pct of tariff bid/140 offered, with next week same river (ex Chicago) quoted the same - both up 2-1/2 percentage points. - Next week Mississippi River (St Louis) 120 pct bid/127-1/2 offered - up five points. - Next week Ohio River (Owensboro/south) 125 pct bid/132-1/2 offered - up 7-1/2 points. - On station Illinois River (south Chicago) 135 pct bid/140 offered - no comparison. - March Illinois (ex Chicago) 132-1/2 pct bid/140 offered - up 2-1/2 points. - March Ohio River bid at yesterday's traded level of 125 pct, offered at 132-1/2. - March lower Mississippi River (Memphis/Cairo) 112-1/2 pct bid/120 offered - no comparison. - May Illinois River (ex Chicago) 100 pct bid/107-1/2 offered - no comparison. - Sept/Nov Lower Mississippi River (Memphis/Cairo) 137-1/2 pct bid/145 offered, with Sept/Dec same section 125 pct bid/135 offered - no comparison. Reuter  26-FEB-1987 16:03:15.46 argentina C G L M T f0923reute u f BC-ARGENTINA-COULD-SUSPE 02-26 0110  ARGENTINA COULD SUSPEND DEBT PAYMENTS - DEPUTY BUENOS AIRES, Feb 26 - Argentina could suspend payments on its foreign debt if creditor banks reject a 2.15 billion dlr loan request to meet 1987 growth targets, ruling Radical Party Deputy Raul Baglini told a local radio station. "Argentina does not discard the use of (a moratorium) if the negotiations do not produce a result that guarantees the growth of the country," he added. Baglini, an observer at Argentina's negotiations in New York with the steering committee for its 320 creditors banks, told the Radio del Plata in a telephone interview that the banks were divided on the loan request. Baglini said that as a result, today's scheduled second day of talks had been postponed. He said Argentina was prepared to follow the example of Brazil, which last week declared a moratorium on interest payments of a large portion of its 108 billion dlr foreign debt. Argentina's prime objective in renegotiating the debt was to maintain growth, which has been targeted at four pct in 1987, Baglini said. "Debtor nations should not have to take from their own pockets, that is their commercial balance, to meet interest payments," he added. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-001.sgm000066400000000000000000002273451154025176300231510ustar00rootroot00000000000000 3-MAR-1987 09:18:21.26 usaussr G T f0288reute d f BC-SANDOZ-PLANS-WEEDKILL 03-03 0095  SANDOZ PLANS WEEDKILLER JOINT VENTURE IN USSR BASLE, March 3 - Sandoz AG said it planned a joint venture to produce herbicides in the Soviet Union. The company said it had signed a letter of intent with the Soviet Ministry of Fertiliser Production to form the first foreign joint venture the ministry had undertaken since the Soviet Union allowed Western firms to enter into joint ventures two months ago. The ministry and Sandoz will each have a 50 pct stake, but a company spokeswoman was unable to give details of the size of investment or planned output. Reuter  3-MAR-1987 09:19:31.96 usataiwan G f0295reute d f BC-TAIWAN-REJECTS-TEXTIL 03-03 0137  TAIWAN REJECTS TEXTILE MAKERS EXCHANGE RATE PLEA TAIPEI, March 3 - Central bank governor Chang Chi-cheng rejected a request by textile makers to halt the rise of the Taiwan dollar against the U.S. Dollar to stop them losing orders to South Korea, Hong Kong and Singapore, a spokesman for the Taiwan Textile Federation said. He quoted Chang as telling representatives of 19 textile associations last Saturday the government could not fix the Taiwan dollar exchange rate at 35 to one U.S. Dollar due to U.S. Pressure for an appreciation of the local currency. The Federation asked the government on February 19 to hold the exchange rate at that level. The federation said in its request that many local textile exporters were operating without profit and would go out of business if the rate continued to fall. Reuter  3-MAR-1987 09:20:23.32 earn usa F f0296reute d f BC-NATIONAL-FSI-INC-<NFS 03-03 0080  NATIONAL FSI INC <NFSI> 4TH QTR LOSS DALLAS, March 3 - Shr loss six cts vs profit 19 cts Net loss 166,000 vs profit 580,000 Revs 3,772,000 vs 5,545,000 Year Shr loss 13 cts vs profit 52 cts Net loss 391,000 vs profit 1,425,000 Revs 15.4 mln vs 16.6 mln NOTE: 1985 year figures pro forma for purchase accounting adjustments resulting from March 1985 reeacquisition of company by its original shareholders before August 1985 initial public offering. Reuter  3-MAR-1987 09:21:39.11 usa Y f0301reute r f BC-OCCIDENTAL-<OXY>-OFFI 03-03 0049  OCCIDENTAL <OXY> OFFICIAL RESIGNS LOMBARD, Ill., March 3 - MidCon Corp, a subsidiary of Occidental Petroleum Corp <OXY>, said William C. Terpstra has resigned as president and chief operating officer and his reponsibilities will be assumed by MidCon chairman O.C. Davis. No reason was given. Reuter  3-MAR-1987 09:25:48.88 italy RM f0308reute u f BC-ITALY'S-BNL-TO-ISSUE 03-03 0101  ITALY'S BNL TO ISSUE 120 MLN DLR CONVERTIBLE BOND ROME, March 3 - Italy's state-owned <Banca Nazionale del Lavoro - BNL> said it would issue 120 mln dlrs of five-year convertible eurobonds, an operation to be lead-managed by <Credit Suisse-First Boston Ltd>. BNL president Nerio Nesi told a news conference that the issue, to be placed on the main international markets and listed in Luxembourg, would be the first equity linked issue by an Italian bank on the Euromarket. BNL officials said the issue is scheduled for mid-March and additional financial details were not immediately available. They said the operation would be through the issue of depositary receipts by BNL's London branch. They said the bonds would carry warrants issued by its <Efibanca> subsidiary and convertible into BNL saving shares within five years. The officials said a banking consortium led by Credit Suisse-First Boston would at the same time arrange for the private placing of an unspecified number of BNL savings shares with foreign institutional investors. The operation was to further its aim of obtaining a listing on foreign stock exchanges with a view to future capital increases through ordinary share issues, they said. REUTER  3-MAR-1987 09:27:51.06 usa F f0313reute u f BC-GE-<GE>-SAYS-AMR-<AMR 03-03 0076  GE <GE> SAYS AMR <AMR> ORDER WORTH 650 MLN DLRS EVENDALE, Ohio, March 3 - General Electric Co said AMR Corp's oprder of GE CFG-80C2 engines to power 25 new <Airbus Industrie> A300-600R and 15 Boeing Co <BA> 767-300ER twinjets is worth over 650 mln dlrs. The company said the order is the largest single one it has ever received for commercial aircraft engines. AMR announced the order earlier today. GE said deliveries will start in early 1988. Reuter  3-MAR-1987 09:30:07.60 earn canada E F f0314reute r f BC-precambrian-shield 03-03 0054  <PRECAMBRIAN SHIELD RESOURCES LTD> YEAR LOSS CALGARY, Alberta, March 3 - Shr loss 1.93 dlrs vs profit 16 cts Net loss 53,412,000 vs profit 4,479,000 Revs 24.8 mln vs 32.7 mln Note: 1986 shr and net include 51,187,000 dlr writedown on U.S. operations, uneconomic coal operations and other mineral properties Reuter  3-MAR-1987 09:30:48.45 money-fxinterest uk RM f0316reute b f BC-U.K.-MONEY-MARKET-GIV 03-03 0094  U.K. MONEY MARKET GIVEN FURTHER 437 MLN STG HELP LONDON, March 3 - The Bank of England said it had provided the money market with a further 437 mln stg assistance in the afternoon session. This brings the Bank's total help so far today to 461 mln stg and compares with its revised shortage forecast of 450 mln stg. The central bank made purchases of bank bills outright comprising 120 mln stg in band one at 10-7/8 pct and 315 mln stg in band two at 10-13/16 pct. In addition, it also bought two mln stg of treasury bills in band two at 10-13/16 pct. REUTER  3-MAR-1987 09:32:34.04 earn usa F f0323reute d f BC-GREASE-MONKEY-HOLDING 03-03 0024  GREASE MONKEY HOLDING CORP <GMHC> YEAR NOV 30 DENVER, March 3 - Shr nil vs nil Net 130,998 vs 30,732 Revs 1,568,941 vs 1,0053,234 Reuter  3-MAR-1987 09:33:32.98 earn usa F f0331reute d f BC-ACCEPTANCE-INSURANCE 03-03 0058  ACCEPTANCE INSURANCE HOLDINGS INC <ACPT> YEAR OMAHA, March 3 - Oper shr profit 1.80 dlrs vs loss 2.28 dlrs Oper net profit 2,048,0000 vs loss 1,318,000 Revs 25.4 mln vs 12.3 mln Avg shrs 1,135,000 vs 576,000 NOTE: Net excludes realized investment gains of 40,000 dlrs vs 13,000 dlrs. 1986 net excludes 729,000 dlr tax credit. Reuter  3-MAR-1987 09:35:03.37 earn usa F f0333reute u f BC-MINSTAR-INC-<MNST>-4T 03-03 0064  MINSTAR INC <MNST> 4TH QTR NET MINNEAPOLIS, MINN., March 3 - Oper shr loss 31 cts vs loss 30 cts Oper net loss 5,429,000 vs loss 5,216,000 Revs 257.5 mln vs 243.6 mln Avg shrs 17.5 mln vs 13.5 mln Year Oper shr loss eight cts vs profit 28 cts Oper net loss 1,324,000 vs profit 4,067,000 Revs 989.5 mln vs 747.9 mln Avg shrs 17.6 mln vs 15.7 mln NOTE: 1986 operating net loss excludes income from discontinued operations equal to 11 cts in the quarter and 66 cts in the year compared with 1.07 dlrs in the quarter and 1.23 dlrs in the respective periods of 1985. 1986 operating net loss also excludes extraordinary charges of 14 cts in the quarter and 54 cts in the year. 1985 operating net profit excludes an extraordinary gain of 47 cts. Reuter  3-MAR-1987 09:37:19.17 switzerland RM f0338reute u f BC-DAI-ICHI-HOTEL-SWISS 03-03 0080  DAI-ICHI HOTEL SWISS FRANC NOTES COUPON CUT ZURICH, March 3 - The coupon on Dai-Ichi Hotel Ltd's 50 mln Swiss franc issue of five-year notes with equity warrants has been cut to 1-5/8 pct from the indicated 1-7/8 pct, lead manager Swiss Volksbank said. The warrants have an exercise price of 1,507 yen per share, compared with the last traded price of 1,470 yen, it said. The notes are guarantees by Long-Term Credit Bank of Japan Ltd. Payment is due on March 25. REUTER  3-MAR-1987 09:37:43.02 earn canada E F f0339reute r f BC-mark-resources-inc 03-03 0044  <MARK RESOURCES INC> YEAR LOSS CALGARY, Alberta, March 3 - Shr not given Loss 54.9 mln Revs 27.2 mln Note: Prior year results not given. 1986 results include accounts of 89 pct owned <Precambrian Shield Resources Ltd>, acquired November 5, 1986 Reuter  3-MAR-1987 09:37:53.73 uk A f0340reute r f BC-SAAB-SCANIA-ISSUES-15 03-03 0078  SAAB-SCANIA ISSUES 150 MLN DLR EUROBOND LONDON, March 3 - Saab-Scania AB is issuing a 150 mln dlr eurobond due April 2, 1992 paying 7-3/4 pct and priced at 101-3/4 pct, lead manager Morgan Guaranty Ltd said. The bond is available in denominations of 5,000 and 50,000 dlrs and will be listed in London. Payment date is April 2, 1992. Fees comprise 1-1/4 pct selling concession and 5/8 pct management and underwriting combined, and listing will be in London. REUTER  3-MAR-1987 09:38:16.31 earn usa F f0341reute d f BC-TRANSFORM-LOGIC-<TOOG 03-03 0133  TRANSFORM LOGIC <TOOG> REVISES RESULTS DOWNWARD SCOTTSDALE, Ariz., March 3 - Transform Logic Corp said it has revised downward its previously reported fourth quarter and year, ended October 31, results to reflect compensation expense for employee stock options. The company said resolution of this disagreement with its auditors came as a result of Securities and Exchange Commission involvement. The company will amend its option-granting procedure to conform to the SEC decision which will eliminate future charges, it added. Transform said its fourth quarter profit was revised to 305,082 dlrs, or two cts a share, from the previously reported 580,955 dlrs, which left the company with a fiscal 1986 loss of 249,814 dlrs, or two cts a share, instead of the reported 26,195 dlrs profit. Reuter  3-MAR-1987 09:38:28.76 earn usa F f0342reute r f BC-AMERICAN-STORES-<ASC> 03-03 0061  AMERICAN STORES <ASC> SEES LOWER YEAR NET SALT LAKE CITY, March 3 - American Stores Co said it expects to report earnings per share of 3.70 to 3.85 dlrs per share on sales of slightly over 14 billion dlrs for the year ended January 31. The supermarket chain earned 4.11 dlrs per share on sales of 13.89 billion dlrs last year. The company did not elaborate. Reuter  3-MAR-1987 09:38:33.69 earn usa F f0343reute r f BC-KASLER-CORP-<KASL>-1S 03-03 0031  KASLER CORP <KASL> 1ST QTR JAN 31 NET SAN BERNARDINO, Calif., March 3 - Shr profit three cts vs loss seven cts Net profit 161,000 vs loss 367,000 Revs 24.3 mln vs 26.5 mln Reuter  3-MAR-1987 09:41:45.44 usa F f0346reute r f BC-CARIBBEAN-SELECT-<CSE 03-03 0091  CARIBBEAN SELECT <CSEL> TO REDEEM WARRANTS TAMPA, Fla., March 3 - Caribbean Select Inc said it has elected to redeem on April 10 all its Class A warrants and all Class B warrants at 0.01 ct each. At the same time, it said its board has decided to reduce the exercise price of the Class B warrants to 3.50 dlrs per common share from four dlrs to encourage the exercise of the warrants. Each Class B warrant allows the purchase of one common share. It said each Class A warrant is still exercisable into one common share at two dlrs each. Reuter  3-MAR-1987 09:45:18.22 earn uk F f0356reute d f BC-UNILEVER-HAS-IMPROVED 03-03 0099  UNILEVER HAS IMPROVED MARGINS, VOLUMES IN 1986 LONDON, MARCH 3 - Unilever Plc <UN.A> and NV group reported improvements in margins and underlying sales volume growth of five pct in 1986 after stripping out the effects of falling prices, disposals and currency movements, Unilever Plc chairman Michael Angus said. He told reporters that volumes in North America increased some 10.5 pct while European consumer goods rose about 2.5 pct after being flat for some years. Much of the disposal strategy, aimed at concentrating activities on core businesses, had now been completed, he noted. But the process of acquisitions would go on, with strategic acquisitions taking place "from time to time," he said. The company earlier reported a 20 pct rise in pre-tax profits for 1986 to 1.14 billion stg from 953 mln previously. In guilder terms, however, profits at the pre-tax level dropped three pct to 3.69 billion from 3.81 billion. Angus said the recent purchase of Chesebrough-Pond's Inc <CBM.N> for 72.50 dlrs a share was unlikely to bring any earnings dilution. However, it would not add much to profits, with much of the company's operating profits paying for the acquisition costs. Finance director Niall Fitzgerald added that while gearing - debt to equity plus debt - rose to about 60 pct at end 1986 from 35 pct last year, this was expected to drop back to about 40 pct by end-1987. The same divergence was made in full year dividend, with Unilever NV's rising 3.4 pct to 15.33 guilders and Unilever Plc's increasing 29.9 pct to 50.17p, approximately in line with the change in attributable profit. Angus said the prospectus for the sale of parts of Chesebrough was due to be published shortly. However, he said that there was no target date for completing the process. He also declined to say what sort of sum Unilever hoped to realise from the operation, beyond noting that Chesebrough had paid around 1.25 billion dlrs for Stauffer Chemical Co, which operates outside Unilever's core activities. In the U.S., Organic growth from the Lipton Foods business, considerable expansion in the household products business and in margarine had been behind the overall sales increase. However, he noted that the U.S. Household products business had turned in a planned loss, with fourth quarter performance better than expected despite the anticipated heavy launch costs of its Surf detergents. Reuter  3-MAR-1987 09:45:29.48 acq usa F f0357reute r f BC-SARA-LEE-<SLE>-TO-BUY 03-03 0096  SARA LEE <SLE> TO BUY 34 PCT OF DIM CHICAGO, March 3 - Sara Lee Corp said it agreed to buy a 34 pct interest in Paris-based DIM S.A., a subsidiary of BIC S.A., at a cost of about 84 mln dlrs. DIM S.A., a hosiery manufacturer, had 1985 sales of about 260 mln dlrs. The investment includes the purchase of 360,537 newly issued DIM shares valued at about 51 mln dlrs and a loan of about 33 mln dlrs, it said. The loan is convertible into an additional 229,463 DIM shares, it noted. The proposed agreement is subject to approval by the French government, it said. Reuter  3-MAR-1987 09:45:54.32 usa F f0358reute r f BC-HOLIDAY-CORP-<HIA>-HO 03-03 0086  HOLIDAY CORP <HIA> HOTEL GROUP ADDS PROPERTIES MEMPHIS, Tenn., March 3 - Holiday Corp's Holiday Inn Hotel Group said it will add a record 17 hotels with 4,440 rooms to its international division as part of its plan to double its presence abroad by 1995. The company said its international division will reach 50,000 rooms by this spring, classifying it as the eighth largest hotel chain in the world. Holiday said by the end of the year, there will be approximately 220 Holiday Inn hotels in 54 countries. The company said it plans to expand from 28 to 55 hotels in its Asia/Pacific region and to 192 in its Europe/Middle East/Africa regionby 1995. For 1987, the hotel group will focus on expansion on Western Europe and Asia, citing China as an untapped source for the international lodging industry. Holiday also said it will concentrate on city center hotels in key destination cities in Western Europe, catering primarily to business travelers. Some of those cities where Holiday said it will open new properties this year include Amsterdam, Lyon/Atlas and Lisbon. Reuter  3-MAR-1987 09:46:36.82 trade usachina G T M C f0360reute r f BC-CHINA-CALLS-FOR-BETTE 03-03 0140  CHINA CALLS FOR BETTER TRADE DEAL WITH U.S. PEKING, March 3 - China called on the United States to remove curbs on its exports, to give it favourable trading status and ease restrictions on exports of high technology. But the U.S. Embassy replied that Chinese figures showing 13 years of trade deficits with the U.S. Out of the last 15 are inaccurate and said Peking itself would have to persuade Congress to change laws which limit its exports. The official International Business newspaper today published China's demands in a editorial to coincide with the visit of U.S. Secretary of State George Shultz. "It is extremely important that the U.S. Market reduce its restrictions on Chinese imports, provide the needed facilities for them and businessmen from both sides help to expand Chinese exports," the editorial said. "The U.S. Should quickly discard its prejudice against favourable tariff treatment for Chinese goods and admit China into the Generalised System of Preference (GSP). "Despite easing of curbs on U.S. Technology exports in recent years, control of them is still extremely strict and influences normal trade between the two countries," it added. The paper also printed an article by China's commercial counsellor in its Washington embassy, Chen Shibiao, who said that "all kinds of difficulties and restrictions" were preventing bilateral trade fulfilling its full potential. He named them as U.S. Protectionist behaviour, curbs on technology transfer and out-of-date trade legislation. Reuter  3-MAR-1987 09:46:55.59 lei usa V RM f0361reute u f BC-/U.S.-COMMERCE-SECRET 03-03 0106  U.S. COMMERCE SECRETARY SAYS EXPORT RISE NEEDED WASHINGTON, March 3 - Commerce Secretary Malcolm Baldrige said after the release of a sharply lower January leading indicator index that a pickup in exports is needed. "The best tonic for the economy now would be a pickup in net exports," he said in a statement after the department reported the index fell 1.0 pct in January from December, the sharpest drop since a 1.7 pct fall in July, 1984. The main reasons for the January decline after a 2.3 pct December rise were declines in building permits, new orders for plant and equipment and for consumer and industrial goods. Reuter  3-MAR-1987 09:47:47.16 earn canada E F f0366reute r f BC-precambrian-takes 03-03 0108  PRECAMBRIAN SHIELD TAKES 51 MLN DLR WRITEDOWN CALGARY, Alberta, March 3 - <Precambrian Shield Resources Ltd>, earlier reporting a large loss against year-ago profit, said the 1986 loss was mainly due to a 51,187,000 dlr writedown on its U.S. operations, uneconomic coal and other mineral properties. Precambrian, which is 89 pct owned by <Mark Resources Inc>, said it took the writedown in accordance with new Canadian Insititute of Chartered Accountants guidelines for full cost method accounting by oil and gas companies. Precambrian earlier reported a 1986 loss of 53.4 mln dlrs, compared to profit of 4.5 mln dlrs in the prior year. Reuter  3-MAR-1987 09:48:24.78 usa nasdaq F f0367reute r f BC-AERO-SERVICES-<AEROE> 03-03 0075  AERO SERVICES <AEROE> GETS NASDAQ EXCEPTION TETERBORO, N.J., March 3 - Aero Services Inc said its common stock will continue to be included for quotation in the National Association of Securities Dealers' NASDAQ system due to an exception from filing requiements, which it failed to meet as of January 15. The company said while it believes it can meet conditions the NASD imposed for the exception, there can be no assurance that it will do so. Reuter  3-MAR-1987 09:49:23.53 coffeecrude kenya RM f0373reute r f BC-KENYAN-ECONOMY-FACES 03-03 0099  KENYAN ECONOMY FACES PROBLEMS, PRESIDENT SAYS NAIROBI, March 3 - The Kenyan economy is heading for difficult times after a boom last year, and the country must tighten its belt to prevent the balance of payments swinging too far into deficit, President Daniel Arap Moi said. In a speech at the state opening of parliament, Moi said high coffee prices and cheap oil in 1986 led to economic growth of five pct, compared with 4.1 pct in 1985. The same factors produced a two billion shilling balance of payments surplus and inflation fell to 5.6 pct from 10.7 pct in 1985, he added. "But both these factors are no longer in our favour ... As a result, we cannot expect an increase in foreign exchange reserves during the year," he said. The price of coffee, Kenya's main source of foreign exchange, fell in London today to about 94 cents a pound from a peak of 2.14 dlrs in January 1986. Crude oil, which early last year slipped below 10 dlrs a barrel, has since crept back to over 18 dlrs. Moi said the price changes, coupled with a general decline in the flow of capital from the rest of the world, made it more difficult to finance the government's budget deficit. Kenya was already spending over 27 pct of its budget on servicing its debts and last year it was a net exporter of capital for the first time in its history, he added. "This is a clear indication that we are entering a difficult phase as regards our external debts, and it is imperative that we raise the rate of domestic savings and rely less on foreign sources to finance our development," he said. "It will be necessary to maintain strict discipline on expenditure ... And members of this house will have to take the lead in encouraging wananchi (ordinary people) to be more frugal in satisfying immediate needs," the president added. REUTER  3-MAR-1987 09:49:45.02 usa F f0375reute r f BC-TRI-STAR-<TRSP>-CHANG 03-03 0079  TRI-STAR <TRSP> CHANGING FISCAL YEAR NEW YORK, March 3 - Tri-Star Pictures Inc said it is changing its fiscal year to year ending at the end of February from a calendar year to reflect the traditional business cycles of its two principal businesses, motion picture distribution and motion picture exhibition. It said it expects to file a report for the two-month fiscal "year" ended February 28, 1987 by May 28 and to report earnings for the new first quarter in June. Reuter  3-MAR-1987 09:50:34.51 usa F f0378reute u f BC-LIFETIME-<LFT>-TO-MAK 03-03 0055  LIFETIME <LFT> TO MAKE ANNOUNCEMENT NEW YORK, March 3 - Lifetime Corp said it will make an announcement this morning between 1000 EST and 1030 EST. A company spokesman said the company preferred not to comment until that time. The American Stock Exchange delayed trading in Lifetime shares this morning for news pending. Reuter  3-MAR-1987 09:53:44.44 acq usa E F f0389reute r f BC-scott's-hospitality 03-03 0071  SCOTT'S HOSPITALITY ACQUIRES CAPITAL FOOD TORONTO, March 3 - <Scott's Hospitality Inc> said it acquired all issued shares of Capital Food Services Ltd, of Ottawa. Terms were not disclosed. Scott's said Capital Food had 1986 sales of more than 20 mln dlrs and will continue to operate under its present name with existing management. Capital Food provides food services to several Ottawa institutions, the company said. Reuter  3-MAR-1987 09:57:02.21 coffee zimbabwe C T f0399reute r f BC-ZIMBABWE-COFFEE-OUTPU 03-03 0099  ZIMBABWE COFFEE OUTPUT SET TO RISE HARARE, March 3 - Zimbabwean coffee output will reach 13,000 tonnes this year, up on just over 11,000 tonnes produced in 1986, the Commercial Coffee Growers Association said. Administrative Executive Robin Taylor told the domestic news agency ZIANA that Zimbabwe earned the equivalent of 33 mln U.S. Dlrs from coffee exports last year. He would not say how much the country would earn in 1987. Taylor said the 173 commercial coffee growers under his association had increased production from 5,632 tonnes in 1980 to more than 11,000 tonnes in l986. Reuter  3-MAR-1987 09:58:00.11 usa F f0401reute r f BC-YANKEE-<YNK>-SWAPS-ST 03-03 0048  YANKEE <YNK> SWAPS STOCK FOR DEBENTURES COHASSET, Mass., March 3 - Yankee Cos Inc said it has acquired 3,916,000 dlrs of 7-1/2 pct convertible subordinated debentures due May 15, 1998 of its YFC International Finance NV affiliate for 501,807 common shares from an institutional investor. Reuter  3-MAR-1987 10:00:52.96 acq usa F f0408reute d f BC-VIDEO-DISPLAY-<VIDE> 03-03 0082  VIDEO DISPLAY <VIDE> TO SELL CABLE TV UNIT ATLANTA, March 3 - Video Display Corfp said it has reached a tentiative agreement to sell its existing cable television business for undisclosed terms and expects to report a gain on the transaction. The buyer was not named. The company said it will redeploy its service assets into manufacturing and distribution. It said the operations being sold accounted for about five pct of revenues for the year ended February 28 and lost money. Reuter  3-MAR-1987 10:00:57.16 earn usa F f0409reute d f BC-INTEK-DIVERSIFIED-COR 03-03 0041  INTEK DIVERSIFIED CORP <IDCC> 4TH QTR NET LOS ANGELES, March 3 - Shr three cts vs three cts Net 98,20000 vs 91,898 Revs 2,843,520 vs 2,372,457 Year Shr 13 cts vs 21 cts Net 401,179 vs 681,374 Revs 10.5 mln vs 9,699,535 Reuter  3-MAR-1987 10:01:14.42 usa F f0410reute d f BC-BERYLLIUM-INT'L-SIGNS 03-03 0122  BERYLLIUM INT'L SIGNS JOINT VENTURE PACT SALT LAKE CITY, Utah, March 3 - <Beryllium International Corp> said it has signed a joint venture agreement with Cominco American Inc, a unit of Cominco Ltd <CLT>, to develop a beryllium mine and processing plant on Beryllium International's property in the Topaz Mountains southwest of Salt Lake City. Beryllium said as a 49 pct owner of the venture iot would be contributing the mine while Cominco, as operator and 51 pct owner, would conduct drilling, metallurgical studies, process testing and other preliminary work for a feasibility study. Beryllium said the cost of the preliminary work in 1987, which will start immediately, should be about 250,000 dlrs to 300,000 dlrs. Reuter  3-MAR-1987 10:01:28.07 housing usa V RM f0411reute f f BC-******U.S.-SINGLE-FAM 03-03 0014  ******U.S. SINGLE-FAMILY HOME SALES FELL 6.8 PCT IN JAN AFTER REVISED 12.1 PCT DEC GAIN Blah blah blah.  3-MAR-1987 10:02:11.63 housing usa V RM f0415reute b f BC-/U.S.-HOME-SALES-FELL 03-03 0079  U.S. HOME SALES FELL 6.8 PCT IN JANUARY WASHINGTON, March 3 - Sales of new single-family homes in the United States fell 6.8 pct in January from December to a seasonally adjusted annual rate of 716,000 units, the Commerce Department said. The department revised downward December's sales to a 12.1 pct rise to 768,000 units from the previously reported 12.7 pct increase. The January decline in sales was the largest since last October when sales fell 9.3 pct. Before seasonal adjustment, the number of homes actually sold in January was 53,000, up from 49,000 in December but down from 59,000 in January, 1986. The January fall brought home sales to a level 1.6 pct below January, 1986, when they were a seasonally adjusted 728,000 units. The average price was a record 127,100 dlrs, surpassing the previous record 119,100 price set in December. The median price of a home in January reached 100,700 dlrs -- the first time the price has exceeded 100,000 dlrs. That compared with a median price of 94,600 dlrs in December and 94,000 dlrs in January a year ago. New homes available on the market in January totaled a seasonally adjusted 362,000 units, unchanged from December and equal to a 6.3 months' supply. The supply in December was 5.9 months. Reuter  3-MAR-1987 10:02:22.46 usa F f0416reute r f BC-DIMIS-<DMS>-EXTENDS-L 03-03 0070  DIMIS <DMS> EXTENDS LIFE OF WARRANTS BRIEFLY EATONTOWN, N.J., March 3 - Dimis Inc said it has extended by five business days the expiration of its common stock purchase warrants until March Nine. It said over one mln have already been exercised. The warrants became effective February 17. Holders exercising will receive a new warrant expiring March 31 allowing the purchase of half a common share at one dlr. Reuter  3-MAR-1987 10:05:32.60 canadausa E F f0441reute r f BC-american-barrick 03-03 0046  AMERICAN BARRICK <ABX> UNIT COMPLETES ISSUE TORONTO, March 3 - <American Barrick Resources Corp> said wholly owned Barrick Resources (USA) Inc completed the previously announced 50 mln U.S. dlr issue of two pct gold indexed notes, which are guaranteed by American Barrick. Reuter  3-MAR-1987 10:07:42.19 acq usa F f0445reute d f BC-COMMUNITY-BANK-<CBSI> 03-03 0060  COMMUNITY BANK <CBSI> TO MAKE ACQUISITION SYRACUSE, N.Y., March 3 - Community Bank System Inc said it has entered into a definitive agreement to acquire Nichols Community Bank for 2,800,000 dlrs in common stock. It said subject to approval by Nichols shareholders and regulatory authorities, the transaction is expected to be completed later this year. Reuter  3-MAR-1987 10:08:28.26 jobs belgium RM f0447reute r f BC-BELGIAN-UNEMPLOYMENT 03-03 0086  BELGIAN UNEMPLOYMENT FALLS IN FEBRUARY BRUSSELS, March 3 - Belgian unemployment, based on the number of jobless drawing unemployment benefit, fell to 12.1 pct of the working population at the end of February from 12.6 pct at the end of January, the National Statistics Office said. The rate compares with 12.4 pct at the end of February 1986. The total number of jobless stood at 508,392, compared with 530,587 at the end of January and 521,219 at the end of February 1986, the Statistics Office said. REUTER  3-MAR-1987 10:12:44.89 usa F f0456reute r f BC-KODAK-<EK>-HAS-NEW-DA 03-03 0068  KODAK <EK> HAS NEW DATA STORAGE, USAGE SYSTEMS NEW YORK, March 3 - Eastman Kodak Co said it is introducing four information technology systems that will be led by today's highest-capacity system for data storage and retrieval. The company said information management products will be the focus of a multi-mln dlr business-to-business communications campaign under the threme "The New Vision of Kodak." Noting that it is well-known as a photographic company, Kodak said its information technology sales exceeded four billion dlrs in 1986. "If the Kodak divisions generating those sales were independent, that company would rank among the top 100 of the Fortune 500," it pointed out. The objective of Kodak's "new vision" communications campaign, it added, is to inform others of the company's commitment to the business and industrial sector. Kodak said the campaign will focus in part on the information management systems unveilded today -- -- The Kodak optical disk system 6800 which can store more than a terabyte of information (a tillion bytes). - The Kodak KIMS system 5000, a networked information management system using optical disks or microfilm or both. -- The Kodak KIMS system 3000, an optical-disk-based system that allows users to integrate optical disks into their current information management systems. -- The Kodak KIMS system 4500, a microfilm-based, computer-assisted system which can be a starter system. Kodak said the optical disy system 6800 is a write-once/ready-many-times type its Mass Memory Division will market on a limited basis later this year and in quantity in 1988. Each system 6800 automated disk library can accommodate up to 150, 14-inch optical disks. Each disk provides 6.8 gigabytes of randomly accessible on-line storage. Thus, Kodak pointed out, 150 disks render the more-than-a-terabyte capacity. Kodak said it will begin deliveries of the KIMS system 5000 in mid-1987. The open-ended and media-independent system allows users to incorporate existing and emerging technologies, including erasable optical disks, high-density magnetic media, fiber optics and even artificial intelligence, is expected to sell in the 700,000 dlr range. Initially this system will come in a 12-inch optical disk version which provides data storage and retrieval through a disk library with a capacity of up to 121 disks, each storing 2.6 gigabytes. Kodak said the KIMS system 3000 is the baseline member of the family of KIMS systems. Using one or two 12-inch manually loaded optical disk drives, it will sell for about 150,000 dlrs with deliveries beginning in mid-year. The company said the system 3000 is fulling compatibal with the more powerful KIMS system 5000. It said the KIMS system 4500 uses the same hardware and software as the system 5000. It will be available in mid-1987 and sell in the 150,000 dlr range. Reuter  3-MAR-1987 10:14:49.98 usa F f0467reute r f BC-BANGOR-HYDRO-<BANG>-S 03-03 0081  BANGOR HYDRO <BANG> SEEKS RATE CUT BANGOR, Maine, March 3 - Bangor Hydro-Electric Cor said it has filed with the Maine Public Utilities Commission (MPUC) for a two-stage base rate reduction. Bangor Hydro said the first stage, which could take effect on April 1 and would stay effective until the MPUC makes a final decision on the filing, could cut revenues by 6.149 mln dlrs, or 9.7 pct. The company said lower federal income taxes and lower capital costs prompted the filing. The second stage, Bangor Hydro said, effective when the MPUC makes a final decision, calls for an additional revenue reduction of 712,000 dlrs, or 1.1 pct. Bangor Hydro said, if approved, the cuts would reduce residential base rates by 8.5 pct, with 7.5 pct cut by April 1. The utility company also said it is seeking to increase its fuel cost adjustment rate by April 1. Bangor said if the increase is approved it could offset much of the base rate cut and may cause a net increase in some customers' rates. Reuter  3-MAR-1987 10:15:06.95 usa F f0469reute d f BC-BROWNING-FERRIS-<BFI> 03-03 0105  BROWNING-FERRIS <BFI>WASTE DISPOSAL SITE CLEARED HOUSTON, March 3 - Browning-Ferris Industries Inc said the Colorado Department of Health and the U.S. Environmental Protection Agency have awarded the company permits to build and operate a hazardous waste disposal site near Last Chance, Colo. The company said construction will start this year and take about 12 months, costing about 14 to 16 mln dlrs. It said it has already spent 10 mln dlrs on development costs. The site will not accept materials that react rapidly with air or water, explosives, shock sensitive materials or radioactive wastes, the company said. Reuter  3-MAR-1987 10:16:12.11 earn sweden F f0472reute d f BC-PHARMACIA-AB-<PHAB-ST 03-03 0028  PHARMACIA AB <PHAB ST> 1986 YEAR STOCKHOLM, March 3 - Sales 3.65 billion crowns vs 3.40 billion. Profit after financial items 821.2 mln crowns vs 740.2 mln. The 1986 results include a once-off writedown of 520 mln crowns for intangible assets, mainly the know-how paid for in the takeover of a number of high-tech companies by the group, Pharmacia said. Earnings per share after real tax including the writedown: 1.94 crowns vs 12.05 crowns. Earnings per share after real tax (not including the writedown): 12.38 crowns vs 12.05 Earnings per American Depository Receipt (ADR) according to U.S. Accounting principles after real tax including the writedown): 1.96 crowns vs 9.49 crowns. Earnings per ADR according to U.S. Accounting principles after real tax (without the writedown): 9.8 crowns vs 9.49. One ADR represents 0.75 pct of one B Free share in Pharmacia. The board proposed a dividend of 1.55 crowns vs 1.25. REUTER  3-MAR-1987 10:16:24.19 usa F f0473reute d f BC-VWR-CORP-<VWRX>-FORMS 03-03 0069  VWR CORP <VWRX> FORMS NEW UNIT SEATTLE, March 3 - VWR Corp said it has formed a new subsidiary, Momentun Textiles, to handle the distribution of upholstery fabrics, leathers and naugahyde to contract and consumer furniture manufacturers. It said its VWR Textiles and Supplies unit, which had handled that business, will continue to distribute non-woven textiles, construction fabrics and manufacturing supplies. Reuter  3-MAR-1987 10:17:43.59 usa F f0484reute r f BC-HALLWOOD-GROUP-<HWG> 03-03 0091  HALLWOOD GROUP <HWG> OFFICIAL GET SAXON POST DALLAS, March 3 - Saxon Oil Development Partners' Saxon Oil Co said its chairman Bill Saxon and chief executive officer Steven Saxon have resigned effective immediately. Saxon said Anthony Gumbiner, chairman and chief executive officer of The Hallwood Group Inc, succeeds Bill Saxon as chairman. Hallwood owns a substantial number of shares of preferred stock in Saxon which, if converted into common stock, would constitute approximately 37 pct of the company, according to a source. Hallwood specializes in bailing out financially troubled companies and restructuring their debt, according to the source. In exchange sometimes, the group receives a small portion of the company's common stock. At times, the group also receives a position in the company, as was the case at Saxon, the source explained. Reuter  3-MAR-1987 10:20:45.46 earn usa F f0494reute d f BC-PHARMACIA-FORECASTS-H 03-03 0101  PHARMACIA FORECASTS HIGHER 1987 EARNINGS STOCKHOLM, March 3 - Pharmacia AB <PHAB ST> forecast earnings after financial items of one billion crowns in 1987 vs 821.2 mln last year on condition that exchange rates remained at their present parities. Sales would in such circumstances go up to six billion crowns from 3.65 billion in 1986, it said. A weakening Dollar was mainly responsible for a five pct negative impact on sales during 1986 which the company blamed on currency movements. Last year's results were also badly hit by a once-off writedown of 520 mln crowns for intangible assets. The company said mainly this represented the premium the group had paid for the know-how of various high-tech firms it had taken over. The accounts also showed a financial deficit of 1.87 billion crowns vs a deficit of 133 mln which was covered partly by drawing down company liquidity to 738 mln vs one billion and partly by increasing borrowing to 2.23 billion vs 621 mln. Pharmacia said the financial deficit was caused by it having used more funds than generated by group operations, mainly because of the 1.36 billion it paid in cash for shares in LKB-Produkter AB and the assets of Intermedics-Intraocular Inc. REUTER  3-MAR-1987 10:23:39.80 usa M f0504reute d f BC-BERYLLIUM-INT'L-SETS 03-03 0121  BERYLLIUM INT'L SETS JOINT VENTURE WITH COMINCO SALT LAKE CITY, Utah, March 3 - Beryllium International Corp said it has signed a joint venture agreement with Cominco American Inc, a unit of Cominco Ltd, to develop a beryllium mine and processing plant on Beryllium International's property in the Topaz Mountains southwest of Salt Lake City. Beryllium said as a 49 pct owner of the venture it would be contributing the mine while Cominco, as operator and 51 pct owner, would conduct drilling, metallurgical studies, process testing, and other preliminary work for a feasibility study. Beryllium said the cost of the preliminary work in 1987, which will start immediately, should be about 250,000 dlrs to 300,000 dlrs. Reuter  3-MAR-1987 10:26:35.62 gnp canada E V RM f0508reute f f BC-CANADA-REAL-4TH-QTR-G 03-03 0013  ******CANADA REAL 4TH QTR GDP ROSE 1.1 PCT, AFTER 3RD QTR 1.1 PCT RISE - OFFICIAL Blah blah blah.  3-MAR-1987 10:29:04.26 bop canada E V RM f0518reute f f BC-CANADA-4TH-QTR-CURREN 03-03 0017  ******CANADA 4TH QTR CURRENT ACCOUNT DEFICIT 2.3 BILLION DLRS VS 3RD QTR 1.9 BILLION DEFICIT - OFFICIAL Blah blah blah.  3-MAR-1987 10:29:32.44 usa F f0519reute h f BC-UNITED-GUARDIAN-<UNIR 03-03 0075  UNITED-GUARDIAN <UNIR>, <FEDERAL> SIGN CONTRACT SMITHTOWN, N.Y., March 3 - United-Guardian Inc said it signed a contract with <Federal Health Corp> covering the exclusive marketing of Warexin, a disinfectant for kidney dialysis machines, hospital equipment and instruments. Under the contract, United-Guardian said Federal will continue to supply Hospal, a subsidiary of <Sandoz Ltd> and <Rhone Poulenc S.A.> with all its Warexin requirements. Reuter  3-MAR-1987 10:31:10.05 ship usa F f0524reute r f BC-MCLEAN-INDUSTRIES-<MI 03-03 0082  MCLEAN INDUSTRIES <MII> UNIT TRANSERS SERVICE CRANFORD, N.J., March 3 - McLean Industries Inc said its shipping subsidiary, United States Lines Inc, reached an agreement in principle to transfer its South American service to American Transport Lines Inc, a subsidiary of <Crowley Maritime Corp>. Under the terms of the agreement, United States Lines will lease five vessels to American Transport for 15 months with an option to extend the period up to 10 years, the company said. In return, U.S. Lines will receive a fixed payment and a percentage of revenues for at least three years and possibly as long as American Transport utilizes its vessels and conducts trade in South America, the company said. The companies will consummate the transactions as soon as the required approvals are obtained, McLean said. Reuter  3-MAR-1987 10:32:15.36 usa RM F A f0528reute u f BC-PROXMIRE-VOWS-QUICK-A 03-03 0108  PROXMIRE VOWS QUICK ACTION ON U.S. BANKING BILL WASHINGTON, March 3 - Senate Banking Committee Chairman William Proxmire said modified legislation to help a federal deposit insurance fund and prohibit new limited-service banks and thrifts could be ready for a Senate vote in two to three weeks. Proxmire said he agreed to demands from committee members for a one-year moratorium on granting new business powers sought by commercial banks to increase the bill's chances. In its new form, the bill would proscribe regulators from granting new powers to banks, Proxmire told reporters after a speech to the U.S. League of Savings Institutions. A vote on the bill by the committee is scheduled for Thursday. If approved it will go to the full Senate. "I have spoken to the majority leader and he has agreed to bring it up promptly on the Senate floor in two or three weeks," Proxmire told the thrift executives. The bill would recapitalize the Federal Savings and Loan Insurance Corp fund with 7.5 billion dlrs. It also would prohibit establishment of new nonbank banks and nonthrift thrifts, so-called because they provide financial services but do not meet the regulatory definition of both making loans and receiving deposits. Reuter  3-MAR-1987 10:33:48.56 usa C G L f0540reute u f BC-lard-consumption 03-03 0107  U.S. LARD CONSUMPTION IN JANUARY WASHINGTON, March 3 - U.S. factory usage of lard in the production of both edible and inedible products during January totaled 21.3 mln lbs, vs a revised 25.6 mln lbs in December, according to Census Bureau figures. In the year-earlier period, usage, which includes hydrogenated vegetable and animal fats and other oils in process, amounted to 33.3 mln lbs. Usage in January comprised 15.7 mln lbs of edible products and 5.6 mln lbs of inedible products. Total lard usage in the 1986/87 marketing season, which began October 1, amounted to 104.3 mln lbs, vs 154.2 mln lbs in the year-ago period. Reuter  3-MAR-1987 10:34:47.47 netherlands RM f0546reute u f BC-SOCIETE-GENERALE-DUTC 03-03 0097  SOCIETE GENERALE DUTCH UNIT LAUNCHES CD PROGRAMME AMSTERDAM, March 3 - The Amsterdam unit of French bank Societe Generale said it is launching a 50-mln guilder, five month certificate of deposit programme starting March 6 and ending September 7. Denominations will be in one mln guilders. The price is to be set on March 4, issue date is March 6 and redemption at par is on September 7. Subscriptions are to be placed with Societe Generale, Oolders en de Jong C.V or Haighton en Ruth B.V. A global note for the issue will be deposited with the Dutch central bank. REUTER  3-MAR-1987 10:35:22.38 uk RM f0548reute b f BC-MONY-FUNDING-ISSUES-1 03-03 0087  MONY FUNDING ISSUES 125 MLN DLR EUROBOND LONDON, March 3 - Mony Funding Inc is issuing a 125 mln dlr eurobond due April 7, 1997 paying 8-1/8 pct and priced at 101-1/2 pct, sole lead manager Citicorp Investment Bank Ltd said. The non-callable bond is guaranteed by Mutual Life Insurance Co of the U.S. And is available in denominations of 5,000 dlrs and will be listed in Luxembourg. The selling concession is 1-3/8 pct while management and underwriting combined pays 5/8 pct. The payment date is April 7. REUTER  3-MAR-1987 10:37:40.72 grainwheat uk G f0559reute u f BC-SMALL-QUANTITY-OF-U.K 03-03 0057  SMALL QUANTITY OF UK WHEAT SOLD TO HOME MARKET LONDON, March 3 - A total of 2,435 tonnes of British intervention feed wheat were sold at today's tender for the home market out of requests for 3,435 tonnes, the Home Grown Cereals Authority, HGCA, said. Price details were not reported. No bids were submitted for intervention barley. Reuter  3-MAR-1987 10:38:18.98 gnp canada E V RM f0564reute f f BC-CANADA-DECEMBER-GDP-U 03-03 0013  ******CANADA DECEMBER GDP UP 1.2 PCT AFTER NOVEMBER'S 0.2 PCT FALL - OFFICIAL Blah blah blah.  3-MAR-1987 10:38:44.01 earn usa F f0568reute d f BC-FIRST-FEDERAL-SAVINGS 03-03 0052  FIRST FEDERAL SAVINGS <FFKZ> YEAR NET KALAMAZOO, MICH., March 3 - Shr 78 cts vs one dlr Net 1,413,000 vs 1,776,000 Assets 705.3 mln vs 597.3 mln Deposits 495.6 mln vs 493.9 mln Loans 260.0 mln vs 379.7 mln Qtly div six cts vs six cts prior qtr Pay April 1 Record March 6 NOTE: 1986 net includes charges from accounting changes, from one-time expenses associated with a proxy contest and an increase in loan reserves. First Federal Savings and Loan Association of Kalamazoo is full name of company. Reuter  3-MAR-1987 10:39:00.13 usa F f0569reute u f BC-BOEING-<BA>-SAYS-ORDE 03-03 0088  BOEING <BA> SAYS ORDER WORTH ONE BILLION DLRS SEATTLE, March 3 - Boeing Co said its order for 15 extended-range 767-300's from AMR Corp <AMR> is worth over one billion dlrs. The company said AMR is its first customer for the 767-300ER twinjet, a derivative of its 767-200 designed for increased passenger and cargo capability on flights of up to 6,600 miles. It said the first delivery is scheduled for February 1988 and the jet will seat 215 in tri-class configuration. Boeing said it now has orders for 47 767-300's. In New York, <Airbus Industrie> said AMR is also the launch customer for its A300-600R widebody. AMR today announced the order of 15 of the Boeing and 25 of the Airbus twinjets. Airbus said in AMR's configuration, the A300-600R will seat 16 in first class and 251 in economy. Deliveries will be made bewtween April 1988 and June 1989. Airbus did not disclose the value of the order. Boeing said AMR will operate the 767's on North Atlantic routes, while Airbus said AMR will operate the A300's on Caribbean routes. Reuter  3-MAR-1987 10:40:22.86 usa F f0577reute u f BC-INLAND-<IAD>-FILES-FO 03-03 0105  INLAND <IAD> FILES FOR 1.5 MLN SHARES OFF CHICAGO, March 3 - Inland Steel Industries Inc said it registered with the Securities and Exchange Commission for a proposed public offering of 1.5 mln shares of Series C cumulative convertible exchangeable preferred shares, 50 dlrs a share liquidation value. Goldman Sachs and Co and First Boston Corp are underwriters. They have an option to buy 225,000 additional shares to cover overallotments. Proceeds are for general corporate purposes, including to fund a portion of the investment needed for a continuous cold mill joint venture under discussion with Nippon Steel Corp. Reuter  3-MAR-1987 10:40:34.06 usa F f0579reute r f BC-<ACUSTAR-CORP>-HAS-UN 03-03 0067  <ACUSTAR CORP> HAS UNAUTHORIZED ACCOUNT ACTION BLOOMINGTON, Minn., March 3 - Acustar Corp said it has discovered significant unauthorized activity in its corporate accounts but has not yet determined the full extent of the problem. It said it has requested that all over-the-counter trading in its stock be halted until it can make a further announcement. An investigation is underway, it said. Reuter  3-MAR-1987 10:41:05.96 earn usa F f0584reute r f BC-TOLL-BROTHERS-INC-<TO 03-03 0046  TOLL BROTHERS INC <TOL> 1ST QTR JAN 31 NET HORSHAM, Penn., March 3 - Shr 22 cts vs 12 cts Net 3,243,000 vs 1,656,000 Revs 28.4 mln vs 21.5 mln NOTE: All amts reflect 3-for-2 stock split of company's common in form of 50 pct stock dividend paid Feb 26, 1987. Reuter  3-MAR-1987 10:41:11.13 usa F f0585reute d f BC-UNICORP-AMERICAN-<UAC 03-03 0049  UNICORP AMERICAN <UAC> IN JOINT VENTURE NEW YORK, March 3 - Unicorp American Corp said it has formed a joint venture with Sybedon Corp, a New York real estate investment banking firm, to pursue real estate projects. It said a total of 20 mln dlrs is being committed to the joint venture. Reuter  3-MAR-1987 10:41:36.86 earn usa F f0589reute s f BC-PILLSBURY-CO-<PSY>-VO 03-03 0025  PILLSBURY CO <PSY> VOTES QUARTERLY DIVIDEND MINNEAPOLIS, MINN., March 3 - Qtly div 25 cts vs 25 cts prior qtr Pay 31 May Record 1 May Reuter  3-MAR-1987 10:41:41.92 earn usa F f0590reute s f BC-BERKSHIRE-GAS-CO-<BGA 03-03 0025  BERKSHIRE GAS CO <BGAS> PAYS REGULAR QTLRY DIV PITTSFIELD, Mass., March 3 - Qtrly div 28.5 cts vs 28.5 cts Pay April 15 Record March 31 Reuter  3-MAR-1987 10:44:50.56 grainwheatbarley ukussr G f0601reute d f BC-U.K.-WHEAT-AND-BARLEY 03-03 0096  U.K. WHEAT AND BARLEY EXPORTS ADJUSTED UPWARDS LONDON, March 3 - The U.K. Exported 535,460 tonnes of wheat and 336,750 tonnes of barley in January, the Home Grown Cereals Authority (HGCA) said, quoting adjusted Customs and Excise figures. Based on the previous January figures issued on February 9, wheat exports increased by nearly 64,000 tonnes and barley by about 7,000 tonnes. The new figures bring cumulative wheat exports for the period July 1/February 13 to 2.99 mln tonnes, and barley to 2.96 mln compared with 1.25 and 1.89 mln tonnes respectively a year ago. January wheat exports comprised 251,000 tonnes to European Community destinations and 284,000 tonnes to third countries. The Soviet Union was prominent in third country destinations, taking 167,700 tonnes while Poland was credited with 54,500 and South Korea 50,000 tonnes. Italy was the largest EC recipient with 75,000 tonnes followed by West Germany with 55,200 and France 52,000 tonnes. Barley exports for January comprised 103,700 tonnes to the EC and 233,000 to third countries. The Soviet Union was the largest single importer with 133,265 tonnes followed by Saudi Arabia with 53,800 tonnes. Reuter  3-MAR-1987 10:46:56.99 gnp canada E V RM f0609reute b f BC-CANADA-GDP-RISES-3.1 03-03 0085  CANADA GDP RISES 3.1 PCT IN 1986 OTTAWA, March 3 - Canada's real gross domestic product, seasonally adjusted, rose 1.1 pct in the fourth quarter of 1986, the same as the growth as in the previous quarter, Statistics Canada said. That left growth for the full year at 3.1 pct, which is down from 1985's four pct increase. The rise was also slightly below the 3.3 pct growth rate Finance Minister Michael Wilson predicted for 1986 in February's budget. He also forecast GDP would rise 2.8 pct in 1987. Statistics Canada said final domestic demand rose 0.6 pct in the final three months of the year after a 1.0 pct gain in the third quarter. Business investment in plant and equipment rose 0.8 pct in the fourth quarter, partly reversing the cumulative drop of 5.8 pct in the two previous quarters. Reuter  3-MAR-1987 10:47:04.45 grainwheat ussrpolandczechoslovakiaromania C G T f0610reute u f BC-EAST-EUROPE-WHEAT-WIN 03-03 0099  EAST EUROPE WHEAT WINTERKILL POSSIBLE, ACCU SAYS STATE COLLEGE, Pa., March 3 - Winter wheat crops in the western Soviet Union, Poland and eastern Czechoslovakia through northern Romania may suffer some winterkill over the next two nights, private forecaster Accu-Weather Inc said. Western USSR winter wheat areas have had only light and spotty snow and winterkill is possible tonight and tomorrow night as temperatures drop to minus 10 to 0 degrees F. Snow cover is scant in Poland, with only about 50 pct of the winter wheat areas reporting one to two inches of snow as of this morning. The remaining 50 pct of winter wheat crops do not have snow cover, making winterkill possible on each of the next two nights. Lowest temperatures will be minus 10 to 0 degrees F. Winter wheat areas from eastern Czechoslovakia through northern Romania had light snow flurries yesterday and last night, but amounts were an inch or less. With temperatures expected to fall to near 0 degrees F over the next two nights, some light winterkill is possible, Accu-Weather added. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-002.sgm000066400000000000000000002317071154025176300231470ustar00rootroot00000000000000 5-MAR-1987 09:07:54.17 earn uk F f0986reute d f BC-JAGUAR-SEES-STRONG-GR 03-05 0115  JAGUAR SEES STRONG GROWTH IN NEW MODEL SALES LONDON, March 5 - Jaguar Plc <JAGR.L> is about to sell its new XJ-6 model on the U.S. And Japanese markets and expects a strong reception based on its success in the U.K., Chairman Sir John Egan told a news conference. Commenting on an 11 pct growth in 1986 group turnover to 830.4 mln stg and pre-tax profits at 120.8 mln stg, slightly below 1985's 121.3 mln, Egan said Jaguar aimed at an average profit growth of 15 pct per year. However, the introduction of the new model had kept this year's pre-tax profit down. Jaguar starts selling XJ-6 in the U.S. In May and plans to sell 25,000 of its total 47,000 production there in 1987. U.S. Sales now account for 65 pct of total turnover, finance director John Edwards said. A U.S. Price for the car has not been set yet, but Edwards said the relatively high car prices in dollars of West German competitors offered an "umbrella" for Jaguar. He added the XJ-6 had also to compete with U.S. Luxury car producers which would restrict the car's price. Jaguar hedges a majority of its dollar receipts on a 12-month rolling basis and plans to do so for a larger part of its receipts for longer periods, John Egan said. In the longer term, capital expenditure will amount to 10 pct of net sales. Research and development will cost four pct of net sales and training two pct. Jaguar builds half of its cars and buys components for the other half. The firm is in early stages of considering the building of an own press shop in Britain for about 80 mln stg, but Egan said this would take at least another three years On the London Stock Exchange, Jaguar's shares were last quoted at 591p, down from 611p at yesterday's close, after reporting 1986 results which were in line with market expectations, dealers said. REUTER...  5-MAR-1987 09:18:26.80 F f0011reute f f BC-******occidental-petr 03-05 0012  ******OCCIDENTAL PETROLEUM COMMON STOCK OFFERING RAISED TO 36 MLN SHARES Blah blah blah.  5-MAR-1987 09:19:43.22 grainwheat usairaq C G f0012reute u f BC-/CCC-ACCEPTS-BONUS-BI 03-05 0117  CCC ACCEPTS BONUS BID ON WHEAT FLOUR TO IRAQ WASHINGTON, March 5 - The Commodity Credit Corporation, CCC, has accepted bids for export bonuses to cover sales of 25,000 tonnes of wheat flour to Iraq, the U.S. Agriculture Department said. The department said the bonuses awarded averaged 116.84 dlrs per tonne. The shipment periods are March 15-April 20 (12,500 tonnes) and April 1-May 5 (12,500 tonnes). The bonus awards were made to Peavey Company and will be paid in the form of commodities from CCC stocks, it said. An additional 175,000 tonnes of wheat flour are still available to Iraq under the Export Enhancement Program initative announced January 7, 1987, the department said. Reuter  5-MAR-1987 09:21:58.67 crude Y f0017reute f f BC-******DIAMOND-SHAMROC 03-05 0016  ******DIAMOND SHAMROCK RAISES CRUDE POSTED PRICES ONE DLR, EFFECTIVE MARCH 4, WTI NOW 17.00 DLRS/BBL Blah blah blah.  5-MAR-1987 09:22:57.75 earn usa F f0019reute r f BC-NORD-RESOURCES-CORP-< 03-05 0063  NORD RESOURCES CORP <NRD> 4TH QTR NET DAYTON, Ohio, March 5 - Shr 19 cts vs 13 cts Net 2,656,000 vs 1,712,000 Revs 15.4 mln vs 9,443,000 Avg shrs 14.1 mln vs 12.6 mln Year Shr 98 cts vs 77 cts Net 13.8 mln vs 8,928,000 Revs 58.8 mln vs 48.5 mln Avg shrs 14.0 mln vs 11.6 mln NOTE: Shr figures adjusted for 3-for-2 split paid Feb 6, 1987. Reuter  5-MAR-1987 09:23:44.74 copper chile C M f0022reute b f BC-NO-QUAKE-DAMAGE-AT-CH 03-05 0089  NO QUAKE DAMAGE AT CHUQUICAMATA - MINE SPOKESMAN SANTIAGO, March 5 - The earthquake which hit northern Chile today, registering 7.0 on the open-ended Richter scale, caused no damage to the copper mine at Chuquicamata, a mine spokesman said. Chuquicamata public relations director Guillermo Barcelo told Reuters by telephone from the mine that the quake had caused no problems and operations continued as usual. A spokesman for the state Chilean Copper Commission in Santiago confirmed there had been no damage at Chuquicamata. Reuter  5-MAR-1987 09:24:40.64 crudenat-gas canada E F Y f0025reute r f BC-orbit-oil-increases 03-05 0094  ORBIT INCREASES OIL AND GAS RESERVE VALUES CALGARY, Alberta, March 5 - <Orbit Oil and Gas Ltd> said the value of its oil and gas reserves increased by 19 pct to 52.6 mln dlrs from 44.2 mln dlrs reported at year-end 1985, according to an independent appraisal. Orbit said it has reserves of 2.4 mln barrels of oil and natural gas liquids and 67.2 billion cubic feet of natural gas. In addition, 75 pct owned <Sienna Resources Ltd> has Canadian reserves of 173,000 barrels of oil and 1.6 bcf of natural gas with a current value of 2.2 mln dlrs, Orbit said. Reuter  5-MAR-1987 09:24:55.56 grainwheat usaegypt C G f0026reute u f BC-CCC-ACCEPTS-BONUS-BID 03-05 0105  CCC ACCEPTS BONUS BID ON SEMOLINA TO EGYPT WASHINGTON, March 5 - The Commodity Credit Corporation, CCC, has accepted a bid for an export bonus to cover a sale of 2,000 tonnes of semolina to Egypt, the U.S. Agriculture Department said. The department said the bonus was 233.91 dlrs per tonne and was made to International Multifoods Corp. The bonus will be paid in the form of commodities from CCC stocks. The semolina is for shipment during June 1987, it said. An additional 13,000 tonnes of semolina are still available to Egypt under the Export Enhancement Program initiative announced on August 6, 1986, it said. Reuter  5-MAR-1987 09:26:07.38 france balladur F f0032reute d f BC-FRENCH-CGE-GROUP-LIKE 03-05 0099  FRENCH CGE GROUP LIKELY TO BE PRIVATISED IN MAY PARIS, March 5 - France's state-owned Cie Generale d'Electricite (CGE) is likely to be privatised during May this year, sources close to Finance Minister Edouard Balladur said. Although the Finance Ministry simply said that the group would be privatised during the course of this year, when it first announced the operation in early January, the May date is earlier than the market had expected. As a result it will follow close on the heels of the privatisation of the TF1 television channel and the advertising group <Agence Havas>. Last month the government privatised the first of the state financial groups, Cie Financiere de Paribas <PARI.P>, in a floatation which was 40 times oversubscribed. And in December the first of the industrial groups, glass maker Cie de Saint-Gobain <SGEP.P>, returned to the private sector. CGE has interests ranging from telecommunications to shipbuilding and nuclear engineering, and recently struck a deal with ITT Corp <ITT.N> to create the world's second largest telecommunications group under the Alcatel name. REUTER  5-MAR-1987 09:26:17.58 acq franceusawest-germanynetherlandssweden F f0033reute d f BC-FIVE-GROUPS-APPLY-TO 03-05 0118  FIVE GROUPS APPLY TO BUY FRENCH TELEPHONE GROUP PARIS, March 5 - Five consortia have applied to buy the French state-owned telephone equipment manufacturer <Cie Generale de Constructions Telephoniques (CGCT)>, which will give the owners control of 16 pct of the French telephone switching market, sources close to Finance Minister Edouard Balladur said. The French government has given itself until the end of April to decide which applicant will be accepted, they added. While several foreign groups have said they want to gain a foothold in the French market, their potential stake in CGCT is limited to 20 pct under privatisation laws passed last year, with 80 pct to be left in French hands. The Finance Ministry sources gave no details of the groups interested in CGCT, but several have publicly announced their candidacies. U.S. Telecommunications giant American Telephone and Telegraph Co <T.N> which has been at the centre of the two-year battle for CGCT, has teamed up with the Dutch-based <Philips Telecommunications Industrie B.V.>, a subsidiary of NV Philips Gloeilampenfabriek <PGLO.AS> and <Societe Anonyme de Telecommunications> (SAT) to present a joint bid, in association with holding company Cie du Midi SA <MCDP.P> and five French investment funds. A second bid has come from the West German electronics group Siemens AG <SIEG.F>, which hopes to take a 20 pct stake in CGCT, with the French telecommunications <Jeumont-Schneider> taking the remaining 80 pct. Sweden's <AB LM Ericsson> has also submitted a bid for the maximum 20 pct permitted, in association with French defence electronics group <Matra>, which would hold between 40 and 49 pct, and construction group <Bouygues>. Matra has already acquired CGCT's private telephone business. REUTER...  5-MAR-1987 09:27:39.53 usa V RM f0039reute b f BC-/SPEAKER-SEEKING-SUPP 03-05 0112  SPEAKER SEEKING SUPPORT FOR U.S. TAX INCREASES WASHINGTON, March 5 - House Speaker Jim Wright is lobbying congressmen to support a plan to cut the 1988 budget deficit about 40 billion dlrs, half through spending cuts and the remainder through tax hikes, congressional sources said. He is backing a half and half plan and has made the suggestion to Democrats on the House Budget Committee privately, committee sources said. However, a committee source told Reuters that committee Democrats already generally favor a plan to cut the deficit about 40 billion dlrs, half through taxes and the Speaker's move was seen as building support outside the committee. Wright's 20 billion dlr revenue raising plan has no specifics, although he has floated a stock transfer tax and also has suggested deferring tax cuts due to the wealthy. Neither of those plans has caught fire yet in Congress, and some congressmen are cool to the idea of a stock tax. The Budget committee is considering a 1988 budget aimed at reducing the estimated deficit of 170 billion dlrs as estimated by the nonpartisan Congressional Budget Office. Committee Chairman William Gray has publicly backed a budget cutting move of 40 billion dlrs but says that will not reach the Gramm-Rudman deficit target for 1988 of 108 billion dlrs, although he claims it will be in the spirit of it. Reuter  5-MAR-1987 09:31:01.67 ship turkey C G T M f0051reute u f BC-BLIZZARD-CLOSES-BOSPH 03-05 0099  BLIZZARD CLOSES BOSPHORUS ISTANBUL, March 5 - Blizzard conditions halted shipping through the Bosphorus waterway and piled snow up to 70 cms deep in central Istanbul, paralysing the city for the second day running. Snow whipped by 48 kph winds continued to fall on Istanbul and northwest Anatolia after 36 hours and weather reports predicted no relief for another two days. Port officials said at least six large vessels in the Black Sea and 13 in the Sea of Marmara were waiting for conditions to improve. Istanbul's Ataturk international airport has been closed since yesterday. Reuter  5-MAR-1987 09:33:06.03 acq usa F f0060reute u f BC-JAPAN-FUND-<JPN>-SEEK 03-05 0100  JAPAN FUND <JPN> SEEKERS CONFIDENT OF FINANCING NEW YORK, March 5 - The <Sterling Grace Capital Management L.P.> group said it is confident financing can be arranged if The Japan Fund's board recommend's the group's acquisition proposal. The group, which also includes <Anglo American Security Fund L.P.> and T.B. Pickens III, Tuesday proposed an entity it controls acquire for cash all the assets of Japan Fund for 95 pct of the fund's aggregate net asset value. The group said it has had a number of meetings over the past few days with domestic and overseas financial institutions. The Sterling Grace Capital group said certain of these institutions have expressed serious interest in providing financing for the proposed acquisition of Japan Fund, "adding we are reasonably confident that the financing can be quickly arranged if the Japan Fund's board of directors is willing to recommend the transaction to shareholders." Reuter  5-MAR-1987 09:33:18.80 F f0061reute f f BC-******K-MART-CORP-FEB 03-05 0011  ******K MART CORP FEBRUARY SALES UP 13.1 PCT ON COMPARABLE STORE BASIS Blah blah blah.  5-MAR-1987 09:34:02.54 tanzaniacanadabelgiumwest-germanyukswedenitalydenmarkzambiasouth-africa worldbankadb-africaec G T M f0066reute r f BC-TANZANIAN-RAILWAYS-SE 03-05 0113  TANZANIAN RAILWAYS SECURE 25.6 MLN DLRS AID DAR ES SALAAM, March 5 - State-run Tanzania Railway Corporation (TRC) has secured 25.6 mln dlrs aid from banks and European countries for a one-year emergency repair program, Transport Minister Mustafa Nyang'anyi said. Nyang'anyi told Reuters on his return from a World Bank sponsored donors' conference in New York that the aid would enable TRC to buy spares for 32 locomotives, overhaul 800 wagons and replace 67,000 sleepers over the next 12 months. The World Bank, African Development Bank, European Community, Canada, Belgium, West Germany, Britain, Sweden, Italy and Denmark had contributed to the package, he said. TRC runs a rail network linking Dar es Salaam and the northern port of Tanga with the coffee-growing area around Mount Kilimanjaro and ports on Lake Victoria and Lake Tanganyika. It is under separate administration from the Tanzania-Zambia railway linking Dar es Salaam with the Zambian copperbelt and the railway system of southern Africa, which has already received substantial aid as part of international efforts to ease the dependence of landlocked African states on trade routes through South Africa. But this is the first international aid package for TRC, which also carries cargo for Uganda, Zaire and Burundi. Reuter  5-MAR-1987 09:34:13.71 earn canada E F f0068reute r f BC-pegasus-gold-inc 03-05 0053  PEGASUS GOLD INC <PGULF> 3RD QTR DEC 31 NET VANCOUVER, British Columbia, March 5 - Shr profit 20 cts vs loss two cts Net profit 2,665,000 vs loss 202,000 Revs 12,141,000 vs 5,993,000 Nine mths Shr profit 35 cts vs loss 11 cts Net profit 4,653,000 vs loss 1,167,000 Revs 35.1 mln vs 18.0 mln Reuter  5-MAR-1987 09:34:57.56 usa F f0072reute u f BC-STOP-AND-SHOP'S-<SHP> 03-05 0083  STOP AND SHOP'S <SHP> BRADLEES FEBRUARY SALES UP BOSTON, March 5 - Stop and Shop Cos Inc said sales for the four weeks ended February 28 for its Bradlees Discount Department Stores Division were up six pct to 104 mln dlrs from 98 mln dlrs a year before, with same-store sales up three pct. The company said the modest comparable store sales increase was due to a combination of difficult weather conditions in the Northeast, a later Easter this year and a possible slowing in consumer demand. Reuter  5-MAR-1987 09:35:22.89 usa M f0075reute d f BC-GM-(GM)-LAYING-OFF-5, 03-05 0083  GM LAYING OFF 5,500 AT TWO MICHIGAN PLANTS DETROIT, March 5 - General Motors Corp said it ordered temporary layoffs of 5,500 hourly workers to cut production and thereby reduce inventories of cars built at two plants later this month. A spokesman said 2,000 workers would be laid off one week beginning March 9 at GM's Detroit-Hamtramck luxury car plant. Another 3,500 will be laid off a week effective March 23 at GM's Lansing, Mich, plant which builds the company's "N-body" compact cars. Reuter  5-MAR-1987 09:36:37.16 usa F f0079reute r f BC-MITSUBISHI-MOTOR/AMER 03-05 0103  MITSUBISHI MOTOR/AMERICA FEBRUARY SALES RISE FOUNTAIN VALLEY, Calif., March 5 - Mitsubishi Motor Sales of America Inc said sales of all vehicles rose 43.7 pct in February to 9,735 units from 6,776 in February 1986. Sales of passenger cars and wagons grew 11.7 pct to 5,314 from 4,758 and truck and van sales more than doubled to 4,421 from 2,018, the affiliate of Mitsubishi Motors Corp said. Year-to-date total vehicle sales increased 16.5 pct to 14,966 from 12,842. Car and wagon sales in the two months fell 13.7 pct to 7,640 from 8,848 but sales of trucks and vans grew 83.4 pct to 7,326 from 3,994. Reuter  5-MAR-1987 09:38:14.93 earn canada E F f0085reute d f BC-keltic-inc 03-05 0036  <KELTIC INC> YEAR NET TORONTO, March 5 - Shr 99 cts vs 1.25 dlrs Net 418,733 vs 235,572 Revs 2,777,425 vs 2,024,116 Note: 1986 shr after November, 1986 600,000 class A subordinate floating share issue Reuter  5-MAR-1987 09:39:13.96 usa F f0086reute u f BC-SUPERMARKETS-GENERAL 03-05 0043  SUPERMARKETS GENERAL <SGC> FEBRUARY SALES RISE WOODBRIDGE, N.J. - Supermarkets General Corp reported sales of 424.8 mln dlrs for the four-week period ended Feb 28, 1987, A 7.2 pct increase over sales of 396.4 mln dlrs for the comparable period last year. Reuter  5-MAR-1987 09:40:41.79 money-fxinterest uk RM f0087reute b f BC-U.K.-MONEY-MARKET-GIV 03-05 0095  U.K. MONEY MARKET GIVEN HELP, OFFERED FACILITIES LONDON, March 5 - The Bank of England said it had given the money market 206 mln stg of assistance this afternoon and offered the discount houses borrowing facilities to take out the rest of the 1.10 billion stg shortage, revised down from an initial 1.15 billion estimate. It made no alteration to its established dealing rates, buying 95 mln stg of band one bank bills at 10-7/8 pct and 111 mln of band two bank bills at 10-13/16 pct. This brings the Bank's total assistance so far today to 243 mln stg. REUTER  5-MAR-1987 09:40:53.56 usa F f0088reute u f BC-SUPERMARKETS-GENERAL 03-05 0044  SUPERMARKETS GENERAL <SGC> FEBRUARY SALES RISE WOODBRIDGE, N.J., March 5 - Supermarkets General Corp reported sales of 424.8 mln dlrs for the four-week period ended Feb 28, 1987, A 7.2 pct increase over sales of 396.4 mln dlrs for the comparable period last year. Reuter  5-MAR-1987 09:41:51.56 acq usa F f0096reute r f BC-E.F.-HUTTON-<EFH>-STA 03-05 0093  E.F. HUTTON <EFH> STARTS PUROLATOR <PCC> BID NEW YORK, March 5 - E.F. Hutton Group Inc said it has started its previously announced offer to purchase up to 6,332,471 common shares of Purolator Courier Corp at 35 dlrs each. In a newspaper advertisement, the company said the offer, proration period and withdrfawal rights will expire April One unless extended. The offer is conditioned on receipt of at least 5,116,892 Purolator shares, or a 66.7 pct interest, and is the first step in a merger agreement that has been approved by the Purolator board. Hutton said it reserves the right to buy more than 6,332,471 shares but has no present intention of doing so. It said it may waive the condition that at least 5,116,892 shares be tendered as long as it received at least a 50.1 pct interest. If it were to receive fewer shares than that, it said it would only purchase sharesd with the consent of Purolator. Reuter  5-MAR-1987 09:42:45.36 money-fx usataiwansouth-korea yeutter RM A f0100reute r f BC-YEUTTER-PUTS-CURRENCY 03-05 0101  YEUTTER PUTS CURRENCY BURDEN ON TAIWAN, KOREA NEW YORK , March 5 - Responsibility for the appreciation of the Taiwan dollar and the South Korean Won lies soley with those countries, said U.S. trade representative Clayton Yeutter Speaking to the Asia Society, Yeutter said that it is in those countries' own long-term interest to raise the value of their currencies against the dollar. Yeutter was responding to a question about what the U.S. could do to encourage appreciation of those currencies against the dollar in order to reduce the large U.S. trade deficits with Taiwain and Korea. "An undervalued currency will help those countries' exports in the short term, but in the long run they have to be concerned about how they are perceived in the international business community," Yeutter said. For Taiwan, Yeutter said that with its per capita trade surplus with the U.S., much larger than that of Japan's, and with huge foreign exchange reserves, it was difficult to defend the high import tarrifs and other barriers that prevail in that country. He also said that the south Korean Won should begin to move to reflect underlying economic fundamentals, "otherwise in two or three years' time, Korea will be in the same situation that prevails in Taiwan." Turning to the U.S. deficit with Japan of more than 50 billion dlrs, Yeutter said that this situation was not sustainable. "Something must give soon. If not, there is a great threat of U.S. legislative action to counteract that trend," Yeutter said. Reuter  5-MAR-1987 09:42:52.28 earn usa F f0101reute r f BC-PRINCEVILLE-DEVELOPME 03-05 0069  PRINCEVILLE DEVELOPMENT CORP <PVDC> YEAR LOSS PRINCEVILLE, Hawaii, March 5 - Shr diluted loss 31 cts vs profit 17 cts Net loss 2,806,005 vs profit 1,513,395 Revs 15.0 mln vs 10.4 mln Avg shrs diluted 8,982,754 vs 8,804,899 NOTE: Current year includes loss of 3.4 mln dlrs from takeover defense expenses. Also includes losses of 1.8 mln dlrs vs 332,000 dlrs from equity in limited partnerships. Reuter  5-MAR-1987 09:44:47.86 acq usa F f0112reute r f BC-ORANGE-CO-<OJ>-HOLDER 03-05 0035  ORANGE-CO <OJ> HOLDER RAISES STAKE LAKE HAMILTON, Fla., March 5 - Orange-Co Inc said its largest shareholder, <Summit Resoureces Inc>, has increased its stake to 15 pct from 14 pct and now owns 644,727 shares. Reuter  5-MAR-1987 09:44:55.17 earn usa F f0113reute r f BC-HORIZON-CORP-<HZN>-4T 03-05 0075  HORIZON CORP <HZN> 4TH QTR NET FOUNTAIN HILLS, Ariz., March 5 - Oper shr profit 1.66 dlrs vs loss eight cts Oper net profit 12.0 mln vs loss 572,000 Revs 27.4 mln vs 4,311,000 Year Oper shr profit 1.36 dlrs vs loss 43 cts Oper net profit 9,817,000 vs loss 2,433,000 Revs 35.0 mln vs 13.8 mln Avg shrs 7,224,000 vs 6,731,000 NOTE: 1985 net includes tax credits of 492,000 dlrs in quarter and 2,433,000 dlrs in year. 1985 net both periods excludes 168,000 dlr loss from discontinued operations. 1986 net both periods includes pretax gain 21.8 mln dlrs from sale of remaining interest in Paradise Hills, N.M., development. Reuter  5-MAR-1987 09:45:10.22 earn canada E F f0115reute r f BC-thomson 03-05 0046  <INTERNATIONAL THOMSON ORGANISATION LTD> YEAR TORONTO, Mar 5 - Shr 33p vs 38p Net 97 mln vs 111 mln Revs 1.71 billion vs 1.76 billion NOTE: Figures in sterling. Share results after deducting preferred share dividends of one mln pounds sterling in 1986. Reuter  5-MAR-1987 09:45:49.05 france ec C G f0118reute u f BC-FRENCH-FARMERS-STRONG 03-05 0108  FRENCH FARMERS STRONGLY CRITICISE EC MILK PACT PARIS, March 5 - The EC agriculture ministers' agreement on reducing dairy output puts milk producers in an impossible situation, French farm unions said. The accord to limit butter sales into intervention, part of planned dairy output cuts of 9-1/2 pct over two years, will cut milk producers' income, a spokeswoman for France's largest farm union, the FNSEA, said. The move has destroyed part of the Common Agricultural Policy, French milk producers said in a press release. But Agriculture Minister Francois Guillaume said repercussions of the plan will affect dairies, not farmers. "If there are negative repercussions, it will be at the level of the dairies which have never looked for new outlets for butter and milk," he told journalists during a visit to Rouen. FNSEA president Raymond Lacombe said on French radio the milk sector needs restructuring by encouraging early retirement and helping young farmers to start. But Commission proposals, rejected by ministers, would have frozen land prices, he said. The FNSEA says it will demonstrate over Commission proposals to freeze most 1987/88 farm prices and cut supports. Pig farmers have held violent demonstrations over falling pork prices and milk producers blocked roads in protest at cuts in milk output. Reuter  5-MAR-1987 09:52:38.52 uk RM f0137reute b f BC-IBJ-ESTABLISHES-200-M 03-05 0074  IBJ ESTABLISHES 200 MLN STG CD PROGRAMME LONDON, March 5 - The Industrial Bank of Japan Ltd (IBJ), London Branch, said it is establishing a sterling certificate of deposit (CD) issuance programme for up to 200 mln stg. The arranger is LLoyds Merchant Bank Ltd and dealers are LLoyds, Samuel Montagu and Co Ltd, Morgan Grenfell and Co Ltd and S.G. Warburg and Co Ltd. The paper will have maturities between seven and 365 days. REUTER  5-MAR-1987 09:53:39.85 F f0139reute f f BC-******MOBIL'S-MONTGOM 03-05 0015  ******MOBIL'S MONTGOMERY WARD AND CO FEBRUARY SALES UP 12.7 PCT ON COMPARABLE STORE BASIS Blah blah blah.  5-MAR-1987 09:54:03.66 earn usa F f0140reute r f BC-EQUATORIAL-COMMUNICAT 03-05 0058  EQUATORIAL COMMUNICATIONS CO <EQUA> 4TH QTR LOSS MOUNTAIN VIEW, Calif., March 4 - Shr loss 3.84 dlrs vs nil Net loss 56,879,000 vs profit 23,000 Rev 10.3 mln vs 17.7 mln Year Shr loss 4.60 dlrs vs profit 14 cts Net loss 67,818,000 vs profit 1,807,000 Rev 50.9 mln vs 56.1 mln Avg shares 14,734,000 vs 12,801,000 NOTE: Fourth qtr net includes a one-time restructuring charge of 45.2 mln dlrs. 1985 net income includes extraordinary gain of 3.2 mln dlrs, or 25 cts. Reuter  5-MAR-1987 09:55:41.23 iraniraq RM f0142reute u f BC-IRAQ-SAYS-IT-CRUSHES 03-05 0121  IRAQ SAYS IT CRUSHES NEW IRANIAN BASRA OFFENSIVE BAGHDAD, March 5 - Iraq said its forces killed or wounded 15,000 Iranian Revolutionary Guards as they crushed a new Iranian offensive near the strategic port city of Basra. A high command war communique said four Revolutionary Guards divisions attacked Iraqi positions east of Basra on the Gulf War southern front, but they were fully crushed by noon (0900 GMT). Adbul-Jabbar Mohsen, chief of the defence ministry political department, said the Iranians had 15,000 casualties. Iran earlier today said its forces launched fresh attacks near Basra last night, adding that 1,200 Iraqis were killed or wounded in fighting near Fish Lake, 10 km east of Basra. In its first reaction to Tehran reports of a new Iranian offensive on the northern front, Iraq said fighting continues around the strategic mountain peak of Kardamanend, overlooking the Haj Omran-Rawandiz axis close to the Iranian border. A military spokesman said Iran launched its attack in the north "to (turn) Iraqi attention towards that area and relax pressure in the south." He added, "Iraq knows well that Iran's main goal is to occupy Basra in the south and that was the reason why Iraq has repelled their new offensive so decisively and firmly." Iran reported heavy fighting on both fronts today. REUTER  5-MAR-1987 09:55:46.08 earn E F f0143reute b f BC-thomson 03-05 0010  ******INTERNATIONAL THOMSON ORGANISATION LTD YEAR SHR 33P VS 38P Blah blah blah.  5-MAR-1987 09:56:03.54 usa F f0144reute b f BC-ENZON-<ENZN>-SAYS-DRU 03-05 0063  ENZON <ENZN> SAYS DRUG TREATS DISEASE SOUTH PLAINFIELD, N.J., March 5 - Enzon Inc said a new treatment using its investigational new drug PEG-ADA has restored the functioning of the immune system in the first two children that were born deficient in the enzyme adenosine deaminase. The disorder is known as severe combined immunodeficiency disease, or "bubble boy disease" Bubble Boy Disease is a rare but severe disease that hampers the development of the immune system. It has killed most of its victims before adulthood. Children with the disease are consigned to live in a sterile environment, such as a plastic bubble, to avoid infection, the company said. The study of Enzon's drug, conducted at Duke University, showed that two children suffering from the disease were treated for 11 and seven months, respectively, and were free of serious infection during that time, the company said. The results were published in the New England Journal of Medicine. The disease is caused by a missing enzyme, called Adenosine Deaminase, or ADA, that is crucial to the development of the immune system. Enzon said it has developed a technology to coat the enzyme with a substance called polyethylene glycol, or PEG, serving to disguise the enzyme when it is reintroduced into the body, preventing rejection. "Marked improvement in laboratory tests of immune function occurred in each child, along with an increase in the number of T-lymphocytes, the immune cells that were missing before treatment with PEG-ADA had begun," the study said. "The children are now more active and have begun to gain weight and height. Before treatment their growth had been very poor in comparison to normal children of the same age," the study, conducted by Doctors Michael Hershfield and Rebecca Buckley, said. The PEG-ADA injections were given once a week. Victims of the disease have traditionally been treated by bone marrow transplants, but for most, donors are not available or transplantation is unsuccessful, the company said. Other diseases caused by a missing enzyme might also be treated by introducing a PEG coated enzyme, the article noted. Reuter  5-MAR-1987 09:57:00.61 F f0149reute f f BC-******MCI-COMMUNICATI 03-05 0011  ******MCI COMMUNICATIONS CALLS FOR IMMEDIATE DEREGULATION OF ATT Blah blah blah.  5-MAR-1987 09:58:35.61 F f0154reute b f BC-******F.W.-WOOLWORTH 03-05 0009  *****F.W. WOOLWORTH CO FEBRUARY SALES INCREASE 11.3 PCT Blah blah blah.  5-MAR-1987 09:59:40.82 acq usa F f0160reute r f BC-TRIMEDYNE-<TMED>-TO-S 03-05 0066  TRIMEDYNE <TMED> TO SPIN OFF STAKE IN UNIT SANTA ANA, Calif., March 5 - Trimedyne Inc said it will distribute one Class B common share of <Automedix Sciences Inc> for each four Trimedyne shares held of record on March Nine. The company said in the spinoff it is distributing its entire 44 pct interesdt in Automedix. The spun-off stock will not be saleable for 13 months, the company said. Reuter  5-MAR-1987 10:00:29.72 usa F f0163reute b f BC-K-MART-<KM>-FEBRUARY 03-05 0088  K MART <KM> FEBRUARY SALES UP 8.2 PCT TROY, Mich., March 5 - K Mart Corp said February sales rose 13.1 pct from a year ago and comparable store sales in the four-week period ended February 25 rose 8.2 pct. K Mart said consolidated sales in the period were 1.46 billion dlrs compared with 1.29 billion last year. It said the year-ago figures excluded sales for discontinued operations. K Mart cited "favorable consumer response to our merchandise programs" and said its specialty retailers had "excellent February sales." Reuter  5-MAR-1987 10:00:45.71 F f0165reute b f BC-*****HECK'S-INC-TO-RE 03-05 0006  *****HECK'S INC TO RELEASE NEWS SHORTLY . Blah blah blah.  5-MAR-1987 10:01:44.44 earn usa F f0171reute r f BC-CASEY'S-GENERAL-STORE 03-05 0045  CASEY'S GENERAL STORES INC <CASY> 3RD QTR JAN 31 DES MOINES, Iowa, March 5 - Shr 16 cts vs 13 cts Net 1,900,000 vs 1,600,000 Sales 68.2 mln vs 69.6 mln Nine mths Shr 60 cts vs 43 cts Net 7,100,000 vs 4,700,000 Sales 214.0 mln vs 219.5 mln Reuter  5-MAR-1987 10:02:32.72 F f0176reute f f BC-******J.C.-PENNEY-FEB 03-05 0010  ******J.C. PENNEY FEBRUARY STORE AND CATALOG SALES UP 5.3 PCT Blah blah blah.  5-MAR-1987 10:02:53.85 grainwheatbarleycorn france ec C G f0179reute u f BC-FRENCH-FREE-MARKET-CE 03-05 0092  FRENCH FREE MARKET CEREAL EXPORT BIDS DETAILED PARIS, March 5 - French operators have requested licences to export 40,000 tonnes of free market feed wheat, 32,500 tonnes of soft bread wheat, 375,000 tonnes of barley and 465,000 tonnes of maize at today's European Community tender, trade sources here said. Rebates requested ranged between 134 and 136.50 European currency units (Ecus) a tonne for the feed wheat, 137.39 and 141.50 Ecus a tonne for the bread wheat, 137.93 and 142.95 Ecus for the barley and 133.75 and 140.25 Ecus for the maize. Reuter  5-MAR-1987 10:03:24.09 usa F Y f0183reute b f BC-OCCIDENTAL-<OXY>-OFFE 03-05 0099  OCCIDENTAL <OXY> OFFERS OVER 37 MLN SHARES NEW YORK, March 5 - Occidental Petroleum Corp said its common stock offering has been further increased to a total of 37,950,000 shares. The company explained that underwriters exercised in full their option to increase tohe offering by buying an additional 4,950,000 shares over and above the 33 mln brought to market yesterday. Originally, Occidental had planned to offer 30 mln shares. It had 165 mln outstanding prior to the offering. The underwriters are Drexel Burnham Lambert Inc, Kidder Peabody and Co Inc and Salomon Brothers Inc. At the public offering price of 30.50 dlrs a share, Occidental said, the total value of the offering was nearly 1.16 billion dlrs, making it the largest underwritten common equity offering by a U.S. natural resource company. The company said the significant financial improvements from applying the net proceeds of the offering, principally to the reduction of debt, along with its 1986 restructuring of oil and gas operations and the acquisition of Midcon Corp have positioned Occidental to benefit from an improving oil and gas industry environment. Reuter  5-MAR-1987 10:03:43.41 crude usa F Y f0186reute u f BC-DIAMOND-SHAMROCK-<DIA 03-05 0073  DIAMOND SHAMROCK <DIA> RAISES CRUDE OIL POSTINGS NEW YORK, MAR 5 - Diamond Shamrock said it raised its posted prices for all grades of crude oil one dlr a barrel, effective yesterday. The one dlr increase brings West Texas Intermediate, WTI the U.S. benchmark crude, to 17.00 dlrs a bbl, the company said. Diamond Shamrock joined Sun Co, Coastal, Citgo and Murphy Oil in raising crude oil posted prices one dlr a barrel yesterday. Reuter  5-MAR-1987 10:04:23.59 earn usa F f0190reute r f BC-OAK-HILL-SPORTSWEAR-C 03-05 0047  OAK HILL SPORTSWEAR CORP <OHSC> 4TH QTR NET NEW YORK, March 5 - Shr 27 cts vs 28 cts Net 1,026,000 vs 1,025,000 Sales 27.8 mln vs 25.4 mln Year Shr 95 cts vs 16 cts Net 3,682,000 vs 598,000 Sales 102.1 mln vs 100.4 mln Avg shrs 3,858,000 vs 3,700,000 Reuter  5-MAR-1987 10:04:32.26 earn usa F f0191reute r f BC-OAK-INDUSTRIES-INC-<O 03-05 0068  OAK INDUSTRIES INC <OAK> 4TH QTR LOSS SAN DIEGO, March 5 - Oper shr loss five cts vs loss 50 cts Oper net loss 3,862,000 vs loss 15,900,000 Sales 42.6 mln vs 38.8 mln Avg shr 72.1 mln vs 31.7 mln Year Oper shr loss 51 cts vs loss 2.10 dlrs Oper net loss 30.3 mln vs 51.3 mln Sales 151.7 mln vs 153.1 mln Avg shrs 59.4 mln vs 24.4 mln Backlog 57.1 mln vs 52.9 mln NOTES: Operating losses exclude profits from discontinued operationgs of 1,000,000 dlrs, or one cent a share, vs 2,493,000 dlrs, or eight cts a share, in quarter and 65.0 mln dlrs, or 1.09 dlrs a share, vs 13.7 mln dlrs, or 56 cts a share, in year 1986 year operating loss also excludes extraordinary gain of of 25.6 mln dlrs, or 43 cts a share Backlog, which includes only orders to be shipped within 12 mths, was 63.0 mln dlrs on January 31. Orders to be shipped beyond 12 mths were 27.6 mln dlrs vs 17.1 mln dlrs at December 31 Reuter  5-MAR-1987 10:04:36.77 earn usa F f0192reute s f BC-REGIS-CORP-<RGIS>-REG 03-05 0024  REGIS CORP <RGIS> REGULAR DIVIDEND SET MINNEAPOLIS, March 5 - Qtly div 4-1/2 cts vs 4-1/2 cts prior Pay April 15 Record March 24 Reuter  5-MAR-1987 10:05:25.49 usa F f0196reute u f BC-JAMESWAY-<JMY>-FEBRUA 03-05 0068  JAMESWAY <JMY> FEBRUARY SALES UP 13 PCT SECAUCUS, N.J., March 5 - Jamesway Corp said it had sales for the four weeks ended February 28, excluding leased departments, were 31.7 mln dlrs, up 13 pct from 28.0 mln dlrs in the comperable four week period a year earlier. On a store for store basis, the company said, sales increased five pct. It operated 100 stores last month, up from 92 in February 1986. Reuter  5-MAR-1987 10:09:59.43 usa F f0209reute u f BC-K-MART-<KM>-COMPARABL 03-05 0102  K MART <KM> COMPARABLE-STORE FEBRUARY SALES UP TROY, Mich., March 5 - K Mart Corp said February sales rose 13.1 pct from a year ago and comparable store sales in the four-week period ended February 25 rose 8.2 pct. K Mart said consolidated sales in the period were 1,459,193,000 dlrs compared with 1,289,635,000 dlrs last year. It said the year-ago figures excluded sales for discontinued operations such as Designer Depots, Furr's Cafeterias and Bishop Buffets. K Mart cited "favorable consumer response to our merchandise programs" and said its specialty retailers had "excellent February sales." Reuter  5-MAR-1987 10:11:50.97 usa james-baker worldbank C G L M T f0214reute r f BC-Trade 03-05 0143  CONGRESS MAY CURB U.S. AID TO DEVELOPMENT BANKS WASHINGTON, March 5 - Congressional ire is rising against the multinational development banks which make loans to help other countries produce goods in direct competition with beleagured U.S. farmers and miners. With a record U.S. trade deficit of 169 billion dlrs last year and a farm economy in the doldrums, Congress is pressing to hold back U.S. funds for the World Bank and other development banks if the money is used to subsidize production or to produce goods already in oversupply around the world. "American tax dollars are being used to subsidize foreign agriculture and mineral production that is often in direct competition with our producers," Senator Don Nickles, an Oklahoma Republican, said in a letter to fellow senators seeking support for his legislation to limit these loans. Nickles and Senator Steven Symms, a conservative Republican from Idaho, have introduced legislation that would strictly limit U.S. funding of multinational development banks if they make any loans to help developing countries produce surplus commodities or minerals. Current law requires that the United States vote against such loans but carries no reprisals if they are ultimately approved by the banks. Treasury Secretary James Baker's assurances that U.S. policy is to oppose these loans did not satisfy concerns raised at two Senate committee hearings last week. Baker told a Senate Appropriations subcommittee on Foreign Operations, "As a policy matter, we oppose loans for production of commodities in oversupply." The senators cited a 350-mln-dlr World Bank loan made to Argentina last year to help it increase its agricultural exports by one billion dlrs a year by 1989. Nickles, Symms and others also have cited other loans such as a 1985 World Bank loan to Hungary to expand livestock exports and 500 mln dlrs lent to Thailand from 1981 to 1985 at low interest rates for agriculture. Last year the Republican-controlled Senate voted three times over the objections of the administration to cut U.S. funding of development banks by the amount of these loans. But even with a 65 to 15 vote in favour of the proposal, the restrictions were weakened in the final version. Only a provision directing U.S. officials to vote disapproval cleared Congress. This year's version, called the Foreign Agricultural Investment Reform (FAIR) Act would require the U.S. to vote against loans designed to increase production of surplus commodities and minerals. Also, the recipient countries would have to prove that the production, marketing and export of the commodities could be handled without government subsidy. If the loan is approved over U.S. objections, the United States would not increase or replenish funds for that institution until it agrees to stop making such loans. Objections to such loans have most often been raised by conservative Republicans who have traditionally opposed U.S. funding for these international development banks. But the loss of many jobs to foreign competition has raised similar concerns among more moderate senators. The administration opposes any legislation that would tie its hands in votes on the loans. It argues there might be instances in which a country needed the money to continue its moves toward U.S. policies in other areas. Baker said the United States would continue to use its leverage in the banks to require foreign trade liberalization measures, often in the form of elimination of subsidies. Two House Republicans, Representatives Larry Craig of Idaho and Beau Bolter of Texas, have introduced the bill. But it faces stiff opposition in the House Banking Committee which has blocked its consideration by the House in the past. Symms intends to offer the bill as an amendment to any related legislation this year, an aide said. Reuter  5-MAR-1987 10:13:13.34 usa F f0219reute d f BC-EQUATORIAL-<EQUA>-SIG 03-05 0094  EQUATORIAL <EQUA> SIGNS PACT WITH CONTEL UNIT MOUNTAIN VIEW, Calif., March 5 - Equatorial Communications Co, a satellite data network concern, said it has signed an agreement with Contel Corp's <CTC>, Contel ASC, unit allowing Contel ASC to buy 3.6 mln shares of Equatorial stock at 3.25 dlrs per share. In addition, Equatorial said under the agreement Contel ASC would buy a minimum of 10 mln dlrs of equipment from Equatorial, loan Equatorial up to six mln dlrs and assume a portion of Equatorial's rights and obligations under a satellite transponder lease. Reuter  5-MAR-1987 10:13:54.12 acq west-germanyusa F f0223reute d f BC-MANNESMANN-SEEKS-STAK 03-05 0101  MANNESMANN SEEKS STAKE IN U.S. FIRM DUESSELDORF, March 5 - Mannesmann AG <MMWG.F>, the diversified engineering and pipe-making group, is interested in taking a stake in a U.S. Company or companies but has not yet found a suitable firm, a spokesman said in reply to questions. Mannesmann managing board chairman Werner Dieter told the business weekly Wirtschaftswoche in an interview that Mannesmann wanted to invest in a U.S. Company in order to strengthen its presence on the U.S. Market. Dieter said Mannesmann would act quickly when and if it found a firm in which it wanted to take a stake. The Mannesmann spokesman declined to say in which industrial sector the group may make a U.S. Acquisition or how big the acquisition might be. He also said the group had not yet completed taking over a stake in car components firm <Fichtel und Sachs AG>. Mannesmann had said in January it hoped to take a 37.5 pct stake in Fichtel und Sachs's holding company, Sachs AG, in the first quarter. The spokesman said Mannesmann had a letter of intent on the takeover from the heirs of the company's late owner but completion has been delayed by legal questions concerning the inheritance. REUTER  5-MAR-1987 10:15:44.63 earn usa F f0228reute u f BC-AMERICAN-INT'L-GROUP 03-05 0052  AMERICAN INT'L GROUP INC <AIG> 4TH QTR NET NEW YORK, March 5 - Shr 1.83 dlrs vs 77 cts Net 296.6 mln vs 120.1 mln Year Shr 4.90 dlrs vs 2.76 dlrs Net 795.8 mln vs 420.5 mln NOTE: Includes gains of 139.2 mln vs 46.8 mln in year and 94.0 mln vs 11.6 mln from capital gains from investments. Reuter  5-MAR-1987 10:17:54.70 earn usa F f0241reute r f BC-SYSTEMS-FOR-HEALTH-CA 03-05 0075  SYSTEMS FOR HEALTH CARE IN ONE-FOR-50 SPLIT CHICAGO, March 5 - Systems for Health Care Inc said it repositioned the company through a one-for-50 reverse stock split. It said there are now 3,002,500 common shares outstanding with a quoted price of about 7/8 bid, compared to 150,125,000 shares outstanding prior to the split. In another recent development, Systems for Health Care formally changed its name to its present form from Orcas Corp. Reuter  5-MAR-1987 10:18:25.05 usa F f0245reute r f BC-FIRST-EXECUTIVE-CORP 03-05 0085  FIRST EXECUTIVE CORP <FEXC> GIVES UNIT FUNDS LOS ANGELES, March 5 - First Executive Corp said that its principal subsidiary contributed 152 mln dlrs to one of its divisions to cover credits it wrongfully took on its 1983 to 1985 regulatory accounting statements. The company said Executive Life Insurance Co gave the capital infusion to its subsidiary, Executive Life Insurance Co of New York. It said the new funds bring to 280 mln dlrs the company has received from its parent the past three years. Executive Life Insurance Co of New York admitted a violation of state insurance law and paid a fine of 250,000 dlrs levied by the New York Insurance Department, according to the company. Executive Life of New York took credits for reinsurance agreements that provided less protection to the insurer and its policyholders than New York rules require, according to published reports. Reuter  5-MAR-1987 10:18:32.34 usa F f0246reute r f BC-<HARD-ROCK-CAFE-PLC> 03-05 0087  <HARD ROCK CAFE PLC> SETS INITIAL U.S. OFFERING NEW YORK, March 5 - Hard Rock Cafe PLC said it has filed for an initial U.S. offering of 2,240,000 American Depositary Shares representing 11.2 mln Class A ordinary shares. It said 240,000 of the ADS's will be sold by a current shareholder. Lead underwriter is <Drexel Burnham Lambert Inc>. The company said proceeds will be used for the financing of additional restaurants, the expansion of existing restaurants and retail operations and the repayment of debt. Reuter  5-MAR-1987 10:18:46.99 belgium RM f0247reute b f BC-BELGIUM-TO-ISSUE-150 03-05 0093  BELGIUM TO ISSUE 150 BILLION FRANC STATE LOAN BRUSSELS, March 5 - Belgium is to issue a 150 billion franc, eight-year state loan carrying a coupon of eight pct, a Finance Ministry spokesman said. Pricing will be fixed next week. The spokesman said the loan will feature a call option after four years at a price also to be determined. Some 120 billion francs of the loan will be taken up by members of the issuing consortium, comprising major Belgian commercial banks, and the remaining 30 billion by semi-state owned financial institutions. The most recent public authority loan stock issue, for the state road building fund Fonds des Routes, was also for eight years with an eight pct coupon. It was priced at par. The issue also featured a call option after four years at 102, falling to 101-1/2 after five and by a half point each year thereafter. REUTER  5-MAR-1987 10:18:51.21 F f0248reute f f BC-******MAY-DEPARTMENT 03-05 0009  ******MAY DEPARTMENT STORES CO FEBRUARY SALES RISE 15 PCT Blah blah blah.  5-MAR-1987 10:20:40.73 earncrude ukusa F Y f0253reute d f BC-ROYAL-DUTCH/SHELL-U.S 03-05 0111  ROYAL DUTCH/SHELL U.S. EARNINGS SHARPLY LOWER LONDON, March 5 - Royal Dutch/Shell Group <RD.AS> earnings for 1986 from the U.S. Fell sharply because of difficult market conditions, lower crude and gas prices and also due to different accounting methods, Shell chairman Peter Holmes said. The Shell Oil dollar net income fell 47 pct in the year, while the additional effect of currency movements reduced the contribution to group net income by 57 pct to 472 mln stg. The group earlier reported a drop in net income for the year to 2.54 billion stg from 3.03 billion previously, with lower crude prices outweighing the effect of increased sales by volume. Although the figures were lower, they were nonetheless at the top end of market forecasts. Shell Transport and Trading Plc <SC.L> shares, the U.K. Arm of the group, rose to 11.39 stg from a close last night of 11.06 stg. Analysts noted that a general collapse in exploration and production volumes was partially offset by earnings from chemicals rising to 462 mln stg from 205 mln in 1985. Also, a windfall tax credit and lower than expected currency losses had added about 100 mln stg onto fourth quarter results, which was the main reason for the figures exceeding forecasts, industry analyst Chris Rowland of Barclays de Zoete Wedd noted. However, he added there could well be a sharp fall in performance in the first quarter of 1987, due to the improbability that the group would be able to repeat the high refining and marketing margins of first quarter 1986. The impact of recovering oil prices would come through faster on the downstream side than on the upstream as such a high proportion of upstream activity centred on gas, which typically reacted to oil price changes with about a half-year lag, analysts said. Holmes said that in the upstream U.S. Sector the third quarter of 1986 had been the worst of all. Only two of the oil majors had managed to make a profit in the period, with Shell Oil being one of them. The decrease in U.S. Earnings had been accentuated by tax rates but the group had increased share to become volume market leader, Holmes added. Continued low crude oil prices would continue to subdue U.S. Exploration activity. "Exploration is currently pretty flat. We are going to go on, but at 16-18 dlrs there will be no massive upturn," he said. A renewal of exploration in high cost areas of the North Sea and the U.S. Requires prices of around 25 dlrs a barrel. Ultimately this would lead to a rise in U.S. Imports. "If you are not exploring you are not going to find anything," he noted. U.S. Oil production had dropped some half mln barrels a day (bbd) in 1986 and would continue to fall if the price stayed below 20 dlrs a barrel. This favored OPEC's attempts to stabilise prices, as the lower the price the more likelihood there was of non-OPEC marginal production shutting down. "OPEC has done pretty extraordinarily well...Everything is moving in (its) direction," he added. Reuter  5-MAR-1987 10:21:29.06 usa F f0258reute u f BC-J.C.-PENNEY-<JCP>-FEB 03-05 0069  J.C. PENNEY <JCP> FEBRUARY SALES 5.3 PCT NEW YORK, March 5 - J.C. Penney co Inc said sales for the four weeks ended February 28 for its JCPenney stores and catalogs were up 5.3 pct to 780 mln dlrs from 741 mln dlrs a year earlier, with comparable store sales up 5.5 pct. The company said total company sales for the period were up 6.0 pct to 888 mln dlrs from 838 mln dlrs, with same-store sales up 6.3 pct. Reuter  5-MAR-1987 10:21:41.00 usa F f0259reute u f BC-F.W.-WOOLWORTH-<Z>-FE 03-05 0057  F.W. WOOLWORTH <Z> FEBRUARY SALES INCREASE NEW YORK, March 5 - F.W. Woolworth Co said total sales for the four weeks ended February 28 rose 11.3 pct to 416 mln, from 374 mln in the comparable 1986 period. Woolworth said domestic sales increased 7.1 pct, to 249 mln from 233 mln, while foreign sales rose 18.4 pct to 167 mln, from 141 mln. Reuter  5-MAR-1987 10:22:24.09 interest spain RM f0266reute r f BC-BANKERS-WELCOME-SPANI 03-05 0115  BANKERS WELCOME SPANISH RESERVE REQUIREMENT HIKE MADRID, March 5 - Bankers welcomed the Bank of Spain's decision to raise the reserve requirement for banks and savings banks, saying it reflected the socialist government's determination not to ease up in the fight against inflation despite the painful social effects of four years of austerity. The central bank last night raised the requirement by one percentage point to 19 pct from March 13, saying that excess liquidity threatened money supply and inflation targets. Bankers said the move represented a change of tactic by the Bank, which until now has relied on raising interest rates to choke off money supply growth. "I think it's a good measure," a senior foreign banker said. "It's a faster way to get the job done than using interest rates and avoids unpleasant effects on other areas of the economy." "It shows that the political will is very strong. They know that controlling inflation will make industry more competitive and bring down unemployment in the long run," he added. The head of another foreign bank said that only a month ago, the Bank of Spain had dismissed his suggestion of a rise in reserve requirements, preferring to pursue its strategy of raising interest rates. But bankers said the high real interest rates on offer now -- around eight pct for overnight funds -- was attracting money from abroad, strengthening the peseta and making Spanish exports less competitive. The government says industry's competitiveness is also being hit hard by inflation. At 8.3 pct last year, the rate was way above that of Spain's major trading partners in the European Community, which it joined a year ago. To help meet this year's target of five pct, it is insisting pay rises stay at that level, setting the stage for clashes with trade unions, who say they have made enough sacrifices. Demonstrations by workers, students and farmers, whose demands essentially involve more government spending, have become an almost daily occurrence. But Prime Minister Felipe Gonzalez insists that the state is doing as much as it can. Bankers said the reserve requirement increase could have some impact on commercial lending rates but should not hit the money market too hard. The Bank of Spain, which only yesterday raised its key overnight call money rate to 13.5 pct, left it unchanged at today's auction. The rate has been increased nine times since the start of the year, when it was below 12 pct. Bankers said commercial lending rates were set to rise in any case with the end of the six pct maximium interest rate banks can offer for time deposits of up to six months. The measure will take effect tomorrow, following the publication of the decree in today's official gazette. Bankers say the liberalisation will increase the cost of funds and, inevitably, push lending rates higher. A companion measure, reducing the proportion of funds which banks must invest in specific areas, also takes effect tomorrow. Officials said when the cut was approved last month that it was aimed partly at compensating banks for higher interest rates. REUTER  5-MAR-1987 10:22:36.39 earn sweden F f0268reute d f BC-GAMBRO-AB-<GAMB-ST>-1 03-05 0035  GAMBRO AB <GAMB ST> 1986 YEAR STOCKHOLM, Mar 5 - Group profit after net financial items -133.5 mln crowns vs 101 mln. Sales 1.61 billion vs 1.51 billion. Proposed dividend 0.80 crowns vs 0.40 crowns. REUTER  5-MAR-1987 10:22:52.88 netherlands F f0269reute d f BC-KLM-LOAD-FACTOR-HIGHE 03-05 0100  KLM LOAD FACTOR HIGHER IN FEBRUARY AMSTERDAM, March 5 - KLM Royal Dutch Airlines <KLM.AS> said its load factor rose to 66.5 pct in February from 62.5 pct in January and 65.7 pct in February 1986. The load factor was 66.6 pct in the April/February period of 1986/87 compared with 67.2 pct in the same period in 1985/86. Traffic rose 18 pct and capacity rose 17 pct in February versus 12 and 13 pct respectively in January. In the April/February period of 1986/87 traffic rose nine pct and capacity rose 10 pct compared with eight and nine pct respectively in the same period in 1985/86. REUTER  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-003.sgm000066400000000000000000002512001154025176300231360ustar00rootroot00000000000000 9-MAR-1987 04:58:41.12 money-fx uk RM f0416reute b f BC-U.K.-MONEY-MARKET-SHO 03-09 0095  U.K. MONEY MARKET SHORTAGE FORECAST AT 250 MLN STG LONDON, March 9 - The Bank of England said it forecast a shortage of around 250 mln stg in the money market today. Among the factors affecting liquidity, it said bills maturing in official hands and the treasury bill take-up would drain around 1.02 billion stg while below target bankers' balances would take out a further 140 mln. Against this, a fall in the note circulation would add 345 mln stg and the net effect of exchequer transactions would be an inflow of some 545 mln stg, the Bank added. REUTER  9-MAR-1987 05:03:09.75 money-fxinterest france RM f0423reute u f BC-BANK-OF-FRANCE-SETS-M 03-09 0112  BANK OF FRANCE SETS MONEY MARKET TENDER PARIS, March 9 - The Bank of France said it invited offers of first category paper today for a money market intervention tender. Money market dealers said conditions seemed right for the Bank to cut its intervention rate at the tender by a quarter percentage point to 7-3/4 pct from eight, reflecting an easing in call money rate last week, and the French franc's steadiness on foreign exchange markets since the February 22 currency stabilisation accord here by the Group of Five and Canada. Intervention rate was last raised to eight pct from 7-1/4 on January 2. Call money today was quoted at 7-11/16 7-3/4 pct. REUTER  9-MAR-1987 05:03:38.51 crude china F f0426reute u f BC-AMOCO-REPORTS-SOUTH-C 03-09 0073  AMOCO REPORTS SOUTH CHINA SEA OIL FIND PEKING, March 9 - The U.S. <Amoco Petroleum Corp> has reported an offshore oil find at its Pearl River basin concession in the South China Sea, the New China News Agency said. It said the Liu Hua 11-1-1 A well produced at around 2,240 barrels per day at a depth of 305 metres. The news agency said Amoco plans to drill a second well in the area this year, but gave no further details. REUTER  9-MAR-1987 05:12:17.12 south-korea F f0437reute u f BC-SOUTH-KOREA-DELAYS-CO 03-09 0110  SOUTH KOREA DELAYS CONTRACT FOR NUCLEAR PLANTS SEOUL, March 9 - Technology transfer problems have delayed the finalising of contracts between South Korea's state-owned Korea Electric Power Corp (Kepco) and U.S. Firms for supplies of equipment and services for Kepco's latest two 950-megawatt nuclear power plants, a Kepco spokesman said. He told Reuters the contracts for Kepco's tenth and eleventh stations, costing between two and three billion dlrs, were due for completion by the end of February. Kepco has been negotiating with Combustion Engineering Inc (CSP) for pressurised light-water reactors and General Electric Co (GE) for turbines. KEPCO has also been negotiating with (Sargent and Lundy Engineers) for engineering and design consultancy services. "We have been waging a tug-of-war on the transfer of advanced technology. But I am optimistic we will sign contracts with them within this month," the spokesman said. He said the transfer of advanced technology is vital for South Korea, which wants to build future nuclear power plants with its own technology. Work on the two plants is due to start about June 1988 for completion in 1995 and 1996, although the sites have yet to be chosen, he said. REUTER  9-MAR-1987 05:19:27.56 switzerland RM f0442reute u f BC-KEIAISHA-ISSUING-12-M 03-09 0060  KEIAISHA ISSUING 12 MLN SWISS FRANC NOTES ZURICH, March 9 - Keiaisha Co Ltd of Tokyo is issuing 12 mln Swiss francs of straight notes due March 26, 1992 with a 4-5/8 pct coupon, lead manager Gotthard Bank said. The notes can be called from September 26, 1989 at 101-1/4, declining semi-annually. The issue is guaranteed by the Kyowa Bank Ltd. REUTER  9-MAR-1987 07:59:05.79 interest RM f0749reute f f BC-NATIONAL-WESTMINSTER 03-09 0015  ******NATIONAL WESTMINSTER BANK SAYS IT CUTTING BASE LENDING RATE TO 10.5 PCT FROM 11 PCT. Blah blah blah.  9-MAR-1987 08:08:57.16 interest uk RM f0776reute b f BC-NATIONAL-WESTMINSTER 03-09 0029  NATIONAL WESTMINSTER BANK CUTS BASE RATE LONDON, March 9 - National Westminster Bank Plc said it has cut its base lending rate 0.5 percentage points to 10.5 pct today. National Westminster said that it was responding to general easing in money market rates. Its move followed a signal from the Bank of England earlier this afternoon that it would endorse a half point cut in the base rate, a surprise move following its strong signals last week that such a move would be premature. However, since then the pound has continued to gain strongly. REUTER  9-MAR-1987 08:11:20.25 earn usa F f0792reute s f BC-U.S.-FACILITIES-<USRE 03-09 0047  U.S. FACILITIES <USRE> SEMI-ANNUAL DIVIDEND COSTA MESA, Calif., March 9 - Semi-annual dividend 4 cts Pay May 29 Record April 14 Note: full name is U.S. Facilities Corp. This is first dividend declared since company completed its initial public offering on November 7. Reuter  9-MAR-1987 08:13:16.75 acq usa F A f0805reute r f BC-STANDARD-PACIFIC-<SPF 03-09 0134  STANDARD PACIFIC <SPF> ACQUIRES SOUTH BAY S/L COSTA MESA, Calif, March 9 - Standard Pacific LP said it has acquired substantially all of the assets and liabilities of South Bay Savings and Loan Association of Newport Beach. The firm said over the weekend that it will conduct its savings and loan activities through Standard Pacific Savings FA, a Federal stock association. On Friday, the Federal Home Loan Bank Board in Washington said it approved the acquisition of South Bay S and L, a 62.5 mln dlr state-chartered stock association, by Standard Pacific, which has 312.8 mln dlrs in assets. The Bank Board said that the Federal Savings and Loan Insurance Corp will make a cash contribution, provide capital loss coverage and indemnify Standard Pacific against undisclosed liabilities. Reuter  9-MAR-1987 08:13:36.29 strategic-metal usasouth-africa A f0808reute d f AM-URANIUM 03-09 0135  U.S. TO ALLOW TEMPORARY IMPORTS OF S.A. URANIUM WASHINGTON, March 9 - The Treasury Department said it would temporarily permit imports of South African uranium ore and oxide pending clarification of anti-apartheid sanctions laws passed by Congress last fall. The decision was announced late Friday. It applies, until July 1, to uranium ore and oxide imported into the U.S. for processing and re-export to third countries. The Treasury said it took the action because it felt that when Congress passed the comprehensive South African sanctions bill last fall over President Reagan's veto it had not intended to hurt U.S. industry. In addition, the Treasury said it would permit U.S.-made goods to be imported temporarily from South African state-controlled organizations for repair or servicing. Reuter  9-MAR-1987 08:15:28.61 usairan V f0812reute u f BC-PAPER-SAYS-INDICTMENT 03-09 0115  PAPER SAYS INDICTMENTS IN IRAN CASE EXPECTED NEW YORK, March 9 - The special prosecutor in the Iran arms scandal is expected to bring indictments that could include felony charges against senior Reagan administration officials, the New York Times reported. It quoted law enforcement officials with knowledge of the investigation as saying special prosecutor Lawrence Walsh, who is investigating the scandal, was focusing on three areas. The paper identified these as conspiracy to defraud the government, obstructing justice and making false statements to the government. It said the prosecutor had not ruled out any suspects, including current and former government officials. MORE  9-MAR-1987 08:15:42.31 usauk nyselse F f0814reute r f BC-NYSE-RULE-COULD-AFFEC 03-09 0101  NYSE RULE COULD AFFECT TRADING IN LONDON LONDON, March 9 - An existing New York Stock Exchange, NYSE, rule might be used to limit the trading activities of its members in London in stocks listed on both exchanges, sources at the London Exchange said. This could arise if the London Stock Exchange goes ahead with plans to close its trading floor. The London Exchange sources were commenting on press reports that the NYSE would bar its members firms from trading on the London Exchange in interlisted stocks during periods when the NYSE was open. The London exchange is seeking clarification. London Exchange sources said the possibility of restrictions on NYSE members appears to reflect a rule which requires that exchanges recognised by the NYSE possess a trading floor. Last month, the London Exchange said in a statement that it planned to close its floor in due course, apart from a floor for traded options, because almost all business is now being done by screen and telephone between brokerage offices. This development stemmed from the Big Bang restructuring of the market on October 27. The demise of the traditional Stock Exchange floor has been widely expected, though no date has been set as yet. Market sources said a compromise over the NYSE rule could well be reached, partly because the interests of U.S. Securities dealers are not all identical. Some of them could well start lobbying the NYSE, pointing out, among other things, that the expansion of global trading needs to be based on reciprocal arrangements. NYSE brokerage firms which also trade on the London Exchange would presumably be put at a disadvantage over non-NYSE U.S. Firms, which have affiliates on the London Exchange, market sources said. REUTER  9-MAR-1987 08:16:35.37 acq usa F f0816reute u f BC-/PIEDMONT-<PIE>-AGREE 03-09 0113  PIEDMONT <PIE> AGREES TO USAIR <U> BUYOUT NEW YORK, March 9 - USAir Group Inc said Piedmont Aviation Inc has agreed to be acquired for 69 dlrs per share. The company, in a newspaper advertisement, said it has started a tender offer for all Piedmont shares at that price, and the Piedmont board, with two directors absent, has unanimously approved the bid. The offer and withdrawal rights are to expire April Three unless extended, and the bid is to be followed by a merger at the same price. USAir said Piedmont has granted it an irrevocable option to buy up to 3,491,030 new shares under certain circumstances. Piedmont now has about 18.6 mln shares outstanding. USAir said the tender is conditioned on receipt of enough shares to give USAir at least a 50.1 pct interest in Piedmont on a fully diluted basis and approval by the U.S. Department of Transportation of a voting trust agreement permitting USAir to buy and hold shares pending review of its application to gain control of Piedmont. The company said its merger agreement with Piedmont provides that the offer is not to be amended without Piedmont's prior written consent in any way that would be adverse to Piedmont shareholders, but it said it could cut the number of shares to be bought without Piedmont's consent. USAir said it could reduce the number of Piedmont shares to be purchased in the offer to no less than the minimum number needed to cause the voting trust condition of the bid to be satisfied. In that case, it said if more than that minimum number of shares were tendered, it would buy shares on a pro rata basis. In February USAir had offered to pay 71 dlrs per share in cash for 50 pct of Piedmont's stock and 1.55 to 1.90 USAir shares for each remaining Piedmont share. Last week, Carl C. Icahn-controlled Trans World Airlines Inc <TWA> made a conditional offer to acquire USAir for 52 dlrs per share, a bid that was rejected by the USAir board. The Transportation Department on Friday rejected TWA's application to acquire USAir on the grounds that the application failed to comply with department regulations by omitting necessary information. TWA said it would refile today, providing the information needed. On Friday TWA said it had already acquired four mln shares or 15 pct of USAir. Reuter  9-MAR-1987 08:21:01.71 usaussr V f0832reute r f BC-U.S.-AIDES-SEE-MOSCOW 03-09 0103  U.S. AIDES SEE MOSCOW AGREEING TO ARMS CHECK PACT WASHINGTON, March 9 - Senior U.S. Arms control officials said they were optimistic the United States and Soviet Union could reach agreement on ways to verify a pact to eliminate medium-range nuclear missiles in Europe. Chief U.S. Arms control negotiator Max Kampelman said on the NBC television network a fair pact would be hard to negotiate, but, "We are determined to do it." Assistant Secretary of Defence for international security policy Richard Perle said he thought the two sides could agree on a method to ensure each side was honouring a missile pact. President Reagan said on Friday that Secretary of State George Shultz would go to Moscow next month for talks on arms control and a possible U.S.-Soviet summit meeting. The decision to send Shultz to Moscow followed an announcement by Soviet leader Mikhael Gorbachev that he was willing to separate elimination of medium-range missiles in Europe from his demand for curbs on U.S. Development of a Strategic Defence Initiative (SDI) anti-missile system. Kampelman said the United States and the Soviet Union both had a general definition of so-called "intrusive" or on-site inspection of a pact, but details would be tough to work out. Reuter  9-MAR-1987 08:22:57.04 crudenat-gas usa Y F f0839reute d f BC-API-REPORTS-SHARP-FAL 03-09 0082  API REPORTS SHARP FALL IN DRILLINGS WASHINGTON, March 9 - Estimated oil and gas drilling completions in the United States dropped by almost 41 per cent in 1986 from 1985, the American Petroleum Institute said. API, an industry group, said that of the 42,387 wells completed last year, a total of 19,741 were oil wells, 8,645 were natural gas wells and 14,001 were dry holes. In 1985, a total of 71,539 wells were drilled - 36,834 oil wells, 13,036 gas wells and 21,669 dry holes. reuter  9-MAR-1987 08:23:31.25 instal-debt uk RM f0840reute b f BC-U.K.-CREDIT-BUSINESS 03-09 0109  U.K. CREDIT BUSINESS FALLS IN JANUARY LONDON, March 9 - New credit advanced by finance houses, retailers, bank credit cards and other specialist providers of credit slipped to 2.66 billion stg in January from 2.78 billion in December - but remained close to the average level for 1986's fourth quarter, the Department of Trade and Industry said. Of the January total, 1.15 billion stg was advanced on bank credit cards. On a three-month basis, total advances in November to January were 3.0 pct lower than in the previous three months. Within this total, lending to consumers fell by 6.0 pct and lending to businesses declined by 5.0 pct. At end-January 1987, the total amount outstanding was 24.07 billion stg, up from December's 23.77 billion stg and 3.0 pct above the total three months earlier, the department said. January saw a rise of 300 mln stg in amounts outstanding to finance houses, other specialist credit grantors and retailers. The department said advances on credit cards rose by 1.0 pct between the latest two three-month periods. Retailers advanced 3.0 pct less in the latest three months than in the previous three months, it said. REUTER  9-MAR-1987 08:27:14.06 crudeship brazil C G L M T f0842reute u f BC-BRAZILIAN-SEAFARERS' 03-09 0108  BRAZILIAN SEAFARERS' STRIKE DAMAGES OIL EXPORTS SAO PAULO, March 9 - A strike by Brazil's 40,000 seafarers who want pay rises of up to 180 pct may have cost the state-owned oil company Petrobras 20 mln dlrs in lost export orders, the company's commercial director Arthur de Carvalho was quoted as saying in press reports. More than 170 ships in Brazil, and about nine more in foreign ports, have been halted by the strike, which began on February 27. Marines began blockading the ships on Friday after the strike was ruled illegal, and some strikers are running short of food, National Merchants Marine Union president Edson Areias said. Reuter  9-MAR-1987 08:38:11.68 usa F f0875reute u f BC-NEC-<NIPNY>-UNIT-INTR 03-09 0098  NEC <NIPNY> UNIT INTRODUCES NEW COMPUTERS BOXBOROUGH, Mass., March 9 - NEC Corp's NEC Informational Systems Inc said it introduced three advanced personal computers that are fully compatible with the International Business Machines Corp <IBM> PC AT. The computers, the PowerMate 1, PowerMate 2 and BusinessMate, are based on a chip made by Intel Corp <INTC>. The PowerMate 1 and 2 are available immediately and sell for 1,995 dlrs and 2,595 dlrs, respectively, the company said. The BusinessMate, scheduled for April availability, will sell for less than 6,000 dlrs, it said. Reuter  9-MAR-1987 08:40:06.50 tradegnpbopdlr ukusawest-germanyjapan oecd A f0886reute d f BC-OECD-TRADE,-GROWTH-SE 03-09 0110  OECD TRADE, GROWTH SEEN SLOWING IN 1987 LONDON, March 9 - The 24 nations of the Organisation for Economic Cooperation and Development (OECD), hampered by sluggish industrial output and trade, face slower economic growth, and their joint balance of payments will swing into deficit in 1987, the Economist Intelligence Unit (EIU ) said. The EIU said in its World Trade Forecast it revised OECD economic growth downwards to 2.5 pct this year, compared with a 2.8 pct growth forecast in December. It said the new areas of weakness are West Germany and the smaller European countries it influences, and Japan, hardest hit by currency appreciation this year. The independent research organisation cut its 1987 growth rate forecasts for West Germany to 2.2 pct from 3.2 pct in December and to 2.3 pct from three pct for Japan. It said it expected the OECD to post a current account deficit of some 13 billion dlrs in both 1987 and 1988, due in large part to a 1.50 dlrs a barrel rise in 1987 oil prices. It said the U.S. Current account deficit looked likely to fall even more slowly than forecast, to 125 billion dlrs in 1987 and 115 billion in 1988 from 130 billion in 1986. It said it expected West Germany to post a 31 billion dlr payments surplus and Japan a 76 billion dlr surplus this year. The EIU said it saw oil prices dropping to around 16.50 dlrs a barrel by end-1987 and 15.50 dlrs in 1988 from about 18 dlrs last year, as adherence to OPEC output policy becomes increasingly ragged. It said the dollar is poised to resume its decline in foreign exchange markets, and will lose a further 13 pct on its trade-weighted index this year and five pct in 1988 after last year's 18.4 pct drop. The average mark/dollar rate is put at 1.80 marks this year and 1.70 in 1988 while the yen/dollar rate is expected to break through the 150 yen barrier with an average value of 150 yen in 1987 and 146 yen in 1988, it said. "This is not a crash scenario but the dollar's steeper angle of descent increases the risk of ending with a fireball rather than a three-point landing," the EIU said. "Talking will not stop the dollar's slide for long and the February meeting (of finance ministers of the Group of Five and Canada) produced scant promise of either a decisive shift to more expansive policies in West Germany and Japan, or a tighter U.S. Fsical policy," it said. It said the key to the dollar's fortunes was the willingness of Japanese institutions to buy U.S. Government assets despite prospects of sustaining a currency loss. "Thus far they have been willing," the EIC said, adding that if Japan was deterred from buying U.S. bonds the dollar would collapse. To contain such a currency crisis, dollar interest rates would have to soar, bringing recession and a Third World debt crisis, it said. On trade, the EIU said prospects for 1987 look "increasingly sick." Import growth, forecast in December at 4.5 pct, is now seen slowing down to around 3.8 pct in 1987 with a recovery only to 4.2 pct in 1988, it said. The weakness of the West German economy is the biggest single factor, with import growth there expected to feature a sluggish 3.5 pct growth in 1987 against the 6.5 pct forecast in December, the EIU said. On the export side, it said it saw weak demand in West Germany affecting export prospects elsewhere in Europe, while Japan's exports in 1987 would remain flat and sales by U.S. Exporters would respond only marginally to a lower, more competitively-priced dollar. It said in most of Europe and in Japan, raw materials and oil will cost less in domestic currency in 1987 than in 1986. Reuter  9-MAR-1987 08:44:23.42 interestmoney-fxdlr usawest-germany poehl RM f0895reute u f BC-POEHL-SAYS-FURTHER-RA 03-09 0110  POEHL SAYS FURTHER RATE CUT POSSIBLE - SOURCES By Allan Saunderson and Antonia Sharpe, Reuters FRANKFURT, March 9 - Bundesbank president Karl Otto Poehl told a closed investment symposium that West Germany could cut leading interest rates again if the United States makes a similar move, banking sources said. The sources were reporting Poehl's remarks at a symposium in Duesseldorf last week organised by Deutsche Bank Ag. Press representatives were not invited. The sources, speaking separately, said Poehl told about 200 bankers in reply to questions that a cut in U.S. Interest rates would give room for a matching measure in Germany. "It was a definite hint at lower German interest rates," said one banker who attended the symposium. A Bundesbank spokesman said the central bank would have no comment on the reported remarks, made at the private meeting. But, according to a second source, who also declined to be identified, Poehl's comments were seen by bankers present as a direct pointer to further moves by the central bank to defend German industry from an additional revaluation of the mark. "He said if the Americans drop their interest rates then the Bundesbank would also drop them. He said that quite clearly," the second source said. In reply to questions, Poehl also said the half-point cut in the discount and Lombard rates on January 22 came after the U.S. Had signalled it would be prepared to attend a meeting to discuss the level of the dollar on condition Germany made such a move in advance, the sources said. Asked if American authorities could have been persuaded, by cuts in German rates, to come to the bargaining table as early as last September, one of the sources quoted Poehl as saying, "No, they wouldn't have been. We checked that." The Paris meeting of the Group of Six industrial nations took place exactly one month after the German cut in rates. Poehl emphasised in his comments the very close talks between central banks before and after the G-6 meeting, saying that financial markets had not fully realised the significance of the Paris session and the U.S. Agreement to stem further falls in the value of the dollar, the sources said. For the first time all participants at the summit agreed that a further fall in the dollar would be harmful for all world economies, including the U.S., Poehl had said. The sources said the tone of Poehl's comments boosted growing sentiment that the dollar would be stabilised around current levels by international central bank cooperation. One source said Poehl's remarks also underlined the fact that the Bundesbank was now more prepared to be accommodative in monetary policy in order to prevent a further slowdown in West Germany's economic growth. Poehl and other Bundesbank officials have in the past stressed that the German central bank had no direct responsibility for growth and was solely concerned with combatting inflation. This led, for instance, to the introduction of a tighter monetary stance from the beginning of December until the half-point cut in rates in late January. The sources quoted Poehl as saying that the current overshooting of the German monetary target would not directly respark inflation. The Bundesbank was not obliged to react immediately whenever such overshooting occurs. Latest data for central bank money stock, the Bundesbank's main measure of money supply, showed the measure was growing at 7-1/2 pct in January, outside its three to six pct 1987 target. Share prices rose in very active trading today, with dealers reporting that Poehl's remarks, coupled with a bullish outlook on stock prices from Deutsche at the same symposium, brought in strong bargain hunting at current low levels. REUTER  9-MAR-1987 08:44:51.73 ukcolombia F f0897reute u f BC-PLESSEY-TO-SELL-TELEP 03-09 0106  PLESSEY TO SELL TELEPHONE SYSTEM TO COLOMBIA LONDON, March 9 - Plessey Co Plc <PLY.L> said it had won a multi-million stg contract to supply Colombia with the System X digital telephone exchange, the first major export contract for the system. Company sources said the deal was worth about 15 mln stg. v A Plessey statement said the contract, awarded by the National Telecommunications Authority of Colombia, was won against competition from Telefon L M Ericsson AB, NEC Corp, Fujitsu Ltd and Italtel of Italy. "The award is regarded as a triumph for System X and a breakthrough in the South American market," it said. Plessey said the contract was one of the largest awarded by Telecom Colombia for the past 10 years and involved supplying 13 telephone exchanges including 68,000 lines. The award also includes transmission equipment for the interconnection of the exchanges and the existing system. The firm was actively marketing System X worldwide and contract negotiations in certain countries had reached an advanced stage, it said. Plessey shares were down 5p at 235p, having gone ex-dividend. REUTER  9-MAR-1987 08:46:08.05 venezuela A f0901reute r f BC-VENEZUELA-REVEALS-DEB 03-09 0113  VENEZUELA REVEALS DEBT PAYMENT SCHEDULE DETAILS CARACAS, March 8 - The 20.3 billion dlr debt rescheduling accord Venezuela signed a week ago will reduce its payments over the next three years by 64 pct, according to Finance Ministry figures released this weekend. A ministry statistical analysis said while the original accord called for payments of 3.82 billion dlrs between 1987 and 1989, the new agreement requires debt servicing of 1.35 billion over the same period. In 1987, Venezuela will be required to pay 250 mln dlrs instead of the 1.55 billion originally agreed. Payments in 1988 were cut to 400 mln from 1.20 billion, and in 1989 to 700 mln from 1.11 billion. The ministry's analysis said the reduction in debt servicing during 1987-1989 amounts to an effective grace period, something the Venezuelan negotiators sought from creditor banks but were not granted. Most of the rescheduling falls during 1994-1998, when 53.3 pct, or some 11.25 billion dlrs, must be paid. Under the February 27 accord, Venezuela will repay 20.3 billion dlrs of public sector debt over 14 years at 7/8 of a percentage point over London interbank offered rates (Libor). This compares with the February 1986 accord which called for a 12-year term and interest of 1-1/8 point over Libor. REUTER  9-MAR-1987 08:48:26.10 acq usa F f0909reute r f BC-SOSNOFF-STARTS-BID-FO 03-09 0113  SOSNOFF STARTS BID FOR CAESARS WORLD <CAW> NEW YORK, March 9 - <MTS Acquisition Corp>, a company formed by Martin T. Sosnoff, said it has started a tender offer for all shares of Caesars World Inc at 28 dlrs each. In a newspaper advertisement, MTS said the offer and withdrawal rights expire April Three unless extended. Sosnoff, a New York investor, already owns about four mln of Caesars' 30.3 mln shares outstanding, or about 13.3 pct, and is Caesars' largest shareholder. Caesars owns casino hotels in Nevada and honeymoon resorts in Pennsylvania's Pocono Mountains. It also controls Caesars New Jersey Inc <CJN>, which owns an Atlantic City, N.J., casino hotel. For the second quarter ended January 31, Caesars World earned 12.6 mln dlrs on revenues of 190.4 mln dlrs, up from earnings of 7,500,000 dlrs and revenues of 163.8 mln dlrs a year before. For all of fiscal 1986, the company earned 41.0 mln dlrs on revenues of 694.4 mln dlrs. MTS said the offer is conditioned on receipt of at least enough shares to give Sosnoff a majority interest on a fully diluted basis, the arrangement of sufficient financing to buy all Caesars shares not already owned and pay related costs and approval by the New Jersey Casino control Commission and the NEvada Gaming Commission and State Gaming Control Board. MTS said Marine Midland Banks Inc <MM> has committed to lend it 100 mln dlrs for the acquisition and use its best efforts to syndicate another 400 mln dlrs in senior financing for the transaction. It said its financial adviser, PaineWebber Group Inc <PWJ>, has stated in writing that subject to market conditions, it is highly confident that it can arrange commitments for up to 475 mln dlrs in "mezzanine" financing. MTS said it does not expect problems in obtaining New Jersey and Nevada regulatory approval for the acquisition, since ownership in a Caesars stake has already been cleared. In June 1986, Sosnoff requested a seat on the Caesars World board, a request that has not yet been granted. In September 1986, Sosnoff, who is chairman of <Atalanta/Sosnoff Capital Corp>, filed for clearance under U.S. antitrust laws to raise his interest in Caesars World to 25 pct. Sosnoff said, in a letter to Caesars World chairman and chief executive officer Henry Gluck, that "The decision to go directly to the shareholders was made at the urging of may financial and legal advisors, who repeatedly stressed to me the lack of responsiveness of the management in the past." Sosnoff, who said he has made numerous efforts to express his views to management on ways of maximizing shareholder values, said Caesars twicce refused his request for a board seat. "My advisers felt that, had I given you advance notice, you would have used the time to throw up obstacles to my offer rather than giving it serious consideration," he said. Sosnoff said he hopes that Caesars World management will be willing to negotiate an acquisition agreement with him. "As I have indicated publicly in the past, I believe operating management of the company has performed well and that appropriate consideration should be given to a significant equity interest for them in the company following the acquisition," Sosnoff said in the letter to Gluck. MTS said Sosnoff has asked the company to fix March 27 as the record date for the determination of shareholders entitled to authorize action without a meeting -- including the election or removal of directors. Reuter  9-MAR-1987 08:51:35.60 gnpjobscpibopdfl netherlands RM f0913reute r f BC-DUTCH-PLANNING-AGENCY 03-09 0104  DUTCH PLANNING AGENCY FORECASTS LOWER GROWTH THE HAGUE, March 9 - Dutch economic growth is slowing as a firming guilder cuts competitiveness abroad and industries reduce the pace of investment, the Dutch official planning agency CPB said. The Centraal Planbureau, publishing its 1987 economic outlook, said Dutch Net National Income (NNI) was expected to grow by one pct this year, down from two pct growth recorded in 1986 and 2.5 pct in 1985 and 1984. Dutch Gross National Product is expected to rise to 432.20 billion guilders in 1987 in constant prices, a two pct increase from last year's 423.95 billion. The CPB, forecasting an 8.5 pct increase in the value of the guilder on a trade-weighted basis compared with 10.0 pct last year, said the dollar was expected to trade at an average of 2.0 guilders in 1987 compared with 2.45 guilders in 1986. "The higher guilder is causing a substantial fall in unit labour costs abroad, when measured in guilder terms, while these are rising slightly in the Netherlands," the CPB said. More of economic growth now depended on domestic consumption, the CPB said, but noting that higher margins set by domestic producers and importers mitigated the effect on purchasing power of lower import costs and deflation. Consumer prices were set to fall by 1.5 pct this year, the CPB said. Inflation was zero last year. Gross investment in industry was expected to grow by five pct this year, a slowdown compared with 11.5 pct growth last year, the CPB said. Exchange rate and oil price fluctuations will continue to condition the Dutch economy in the future as it has in recent years, the CPB said, noting a continued depressing impact of these factors on Dutch competitiveness. In addition, it noted a slight rise in taxation and social security costs to employers. The CPB, forecasting a rise in the budget deficit to 7.2 pct of Net National Income in 1987 from 6.3 pct last year, urged the government to cut expenditure further to bring down the deficit and reduce tax and social security payments in future. Dutch government revenue is being depressed further by falling income from natural gas sales in 1987, the CPB said. It said unemployment was expected to fall to 675,000 this year from 710,000 last year. While the two pct GDP growth forecast set by the CPB is within its latest forecast, issued last month, of 1.5 to two pct growth, the figure is well above recent market estimates. Dutch merchant bank Pierson, Heldring en Pierson said in its February economic outlook that GDP growth at constant prices was expected to be 1.1 pct this year and market analysts had expected the CPB's final forecast to be below its own latest estimate. "It is too early to comment because I haven't seen the whole document yet, but it would seem we are more pessimistic in some of our estimates," a Pierson economist said. The CPB forecast 2.5 pct export growth in volume terms in 1987, after four pct growth last year. Excluding energy exports, the 1987 figure would be two pct, it said. Imports were set to rise by 4.5 pct this year compared with four pct in 1986 in volume terms, the CPB said. The balance of payments would see a sharp decline in the surplus, to six billion guilders in 1987 compared with 12.1 billion last year, the CPB forecast. REUTER  9-MAR-1987 08:51:49.54 acq usa F f0914reute b f BC-TRUMP-MAKES-BID-FOR-C 03-09 0088  TRUMP MAKES BID FOR CONTROL OF RESORTS <RTB> NEW YORK, March 9 - Casino owner and real estate developer Donald Trump has offered to acquire all Class B common shares of Resorts International Inc, a spokesman for Trump said. The estate of late Resorts chairman James M. Crosby owns 340,783 of the 752,297 Class B shares. Resorts also has about 6,432,000 Class A common shares outstanding. Each Class B share has 100 times the voting power of a Class A share, giving the Class B stock about 93 pct of Resorts' voting power. More  9-MAR-1987 08:54:12.02 earn usa F f0922reute u f BC-IOMEGA-<IOMG>-SETS-MA 03-09 0096  IOMEGA <IOMG> SETS MANAGEMENT, LABOR LAYOFFS ROY, Utah, March 9 - Iomega Corp said it has laid off over a quarter of its professional and management staff and nearly half of its direct labor force as part of a restructuring and downsizing of its business. The company also said it will receive a qualified opinion from the auditors of it 1986 financial statement subject to the outcome of two suits. The company is a defendant in a consolidated class action law suit which seeks damages in an unspecified amount and is also a defendant in a related shareholder action. Iomega said the auditors state in their opinion letter that both actions are in the early stages of discovery and the likely outcome can not be determined at this time. The company said a corporate wide reduction of its professional, management and indirect labor will result in the permanent elimination of 183 positions in all functional areas of the company's business. This represents over 25 pct of professional, management and indirect employees, it added. In addition, Iomega announced layoff of about 182 employees, principally from its manufacturing direct labor force. Those affected represent about 46 pct of direct labor. Commenting on the layoffs, Iomega said those from among the direct labor force affects personnel building the Alpha Eight Inch Disk Drive and Bernoulli Boxes. "This action is required as we bring our finished goods inventory and inventory in our distribution channels down to acceptable levels," it explained. The company stated this layoff does not affect the production of its new 5-1/4 inch Beta 20 product which is currently being built to a backlog of orders. Reuter  9-MAR-1987 08:58:22.38 usa F f0942reute d f BC-TECHNOLOGY/NEW-ERA-FO 03-09 0109  TECHNOLOGY/NEW ERA FOR INFORMATION HANDLING By Lawrence Edelman, Reuters NEW YORK, March 9 - Ground-breaking new systems for storing and retrieving information are ushering in a new era for computer companies and computer users. Within the past few weeks, International Business Machines Corp <IBM>, Eastman Kodak Co <EK> and others have launched products that radically increase the amount of data that can be catalogued and shelved in computerized libraries. "This flurry of new technology could yield systems that handle a multimedia blitz of data," said Ian Warhaftig, a senior analyst with International Data Corp, Framingham, Mass. "We're developing new systems because our customers are asking for them," Peter Giles, vice president and general manager of Kodak's mass memory division, said in a recent interview. This demand is expected to soar in coming years. While estimates vary, industry analysts project that providing products and services geared for information storage and retrieval could become a 20 billion dlr a year business by 1995. A wide range of technologies will be needed to meet the varying requirements of users. For example, a large credit verification service would want a system from which it could quickly retrieve credit data and relay it to its clients. A law firm, however, may need a computerized law library in which capacity, rather than speed, is the key feature. For architects and engineers, the ability to store photographs, sketches and other graphics would be crucial. Regardless of the specific application, the trend is toward converting information - documents, video or film or even sound recordings - into to the digital language of zeros and ones understood by computers. Saving space is the key goal in digitizing data for storage. An optical disk the size of a standard compact disk can store 550 megabytes of data, or about 250,000 pages of typewritten text. For this reason, the compact disk read-only memory, or CD-ROM, is already a popular data storage media. Last week, Microsoft introduced Microsoft Bookshelf, a 300 dlr program that contains, on a single CD-ROM disk, a dictionary, thesaurus, national ZIP code directory, Bartlett's Familiar Quotations, the World Almanac and other reference works. Scores of such products are already on the market, but most are specialty items, such as Lotus Development Corp's <LOTS> CD-ROM data base of stock information for financial analysts and investors. "Microsoft Bookshelf is important because it marks the arrival of CD-ROM packages for the general public," said Ian Warhaftig of International Data Corp. One drawback of the CD-ROM, which uses a laser to record and read data, is that that it requires a special player. CD-ROM players for the retail market will appear later this year. Moreover, IDC's Warhaftig said CD-ROM's will be integrated with personal computers. "Eventually, CD-ROM's will fit right inside the PC box," he said. "Imagine the advantage of having a spelling checker and thesaurus at your fingertips when you're writing with a word processing program." But CD-ROM's are just the beginning. Also last week, Kodak unveiled several systems that use 12-inch optical disks. The largest Kodak system uses a jukebox-like cabinet to hold up to 150 optical disks from which data can be retrieved in a matter of seconds. Kodak also announced a 14-inch optical disk with 6.8 gigabytes of memory, five times the memory of a CD-ROM. The Kodak disk, which will not be available until the middle of 1988, is designed for users who need quick access to very large amounts of data, said Kodak's Giles. Meanwhile, N.V. Philips <PGLO.AS>, the Dutch electronics giant, is preparing to take optical disk technology a step further with the first disk that can combine text, video and sound. Philips said the system, called Called CD-Interactive, will be ready next year. It will include a new kind of CD-ROM player that can hook up with a television set and stereo. Additional breakthroughs are expected as the next generation of computer memory chips are introduced. Last month IBM said it has made a four-megabyte chip, capable of storing more data than eight CD-ROM's. Meantime, <Nippon Telegraph and Telephone> of Japan said it has built a 16-megabyte chip. Analysts say commercial versions of these chips are several years away, though some suspect that IBM may start volume production of its four-megabyte chip sometime this year. Such chips will enable computer makers to build computers with immense memory capacities. Reuter  9-MAR-1987 09:01:34.94 ship brazil C G L M T f0951reute u f BC-BRAZIL-SEAMEN-CONTINU 03-09 0114  BRAZIL SEAMEN CONTINUE STRIKE DESPITE COURT RIO DE JANEIRO, March 9 - Hundreds of marines were on alert at 11 key Brazilian ports after 40,000 seamen decided to remain on indefinite strike, even after the Higher Labour Court Saturday ruled it illegal, union leaders said. The halt, the first national strike by seamen in 25 years, started on February 27, and union leaders said they would not return to work unless they got a 275 pct pay rise. Shipowners have offered a 100 per cent raise, which the seamen rejected. "We have nothing to lose. If they want to lay off the workers, fine, but we are determined to carry on with our protest until the end," a union leader said. more He said they had decided in a meeting that if the marines take over the ships, the seamen would abandon the vessels and let the marines handle the situation by themselves. A spokesman for the Rio de Janeiro Port said the order to send marines to take over the ports was given by Navy Minister Henrique Saboya on grounds that ports are areas of national security. But he said there were no incidents. The strike has cut exports and imports and made an estimated 160 ships idle. Petrol station owners in four states also continued their shutdown and there were fears that the combination of the two stoppages could lead to a serious fuel shortage. Reuter  9-MAR-1987 09:06:39.94 usa F A f0971reute r f BC-BANKING-TRADE-GROUP-S 03-09 0098  BANKING TRADE GROUP SAYS BANK PROFITS DOWN WASHINGTON, March 9 - The American Bankers Association said the profitability of the nation's commercial banks declined by 12 pct during the first three quarters of 1986. During the first nine months of last year, the industry's annualized rate of return on assets dropped to 0.68 pct from 0.77 pct in the same period in 1985, the ABA said. Return on equity fell to 10.8 pct from 12.3 pct the previous year. Despite the decline in profits, the ABA said banks' capital grew boosting the industry's capital ratio to 6.4 pct from 6.3 pct. The number and size of banks losing money during the period increased significantly, the ABA said. During the first nine months of 1986, 17.5 pct of banks, holding 9.6 pct of banking assets, were unprofitable, the group said. That compares with 13 pct of banks, holding 8.8 pct of assets, during the same period in 1985, it said. The industry's provisions for loan losses increased to 0.73 pct of assets during the period, up from 0.59 pct of assets during the same period in 1985, the group said. Reuter  9-MAR-1987 09:08:09.30 usa F f0975reute r f BC-PAPER-INSTITUTE-SEES 03-09 0074  PAPER INSTITUTE SEES STRONG PAPER MARKET IN '87 NEW YORK, March 9 - The American Paper Institute said the industry is headed for another year of record volume in 1987, with linerboard particularly strong. "A pro-growth trade policy, continued attention to currency management, a fairly low interest rate climate and no major tax increases are the essential ingredients in this outlook," Red Cavaney, American Paper Institute president said. Cavaney said that so far this year the industry's performance mimics last year's strength. Last year, he said, paper and paperboard production hit a record 71 mln tons, 5.9 pct above 1985's 67 mln tons, while industry after-tax profits in 1986 exceeded 1985 profits. Cavaney said that inventories will play a major role in this year's performance. "Inventories, which are generally low, are a positive factor in the industry's outlook this year," he said, citing market pulp stocks, which are currently at 21 days supply, at the low end of the industry's long term average. Cavaney added that as a result of slimmer inventories in 1986 and in the early part of this year, shipments for 1987 as a whole will be higher than last year, even if demand slackens. Cavaney said, however, he expects demand this year to be strong, spurred by consumer spending. The benefits of tax reform on individual after-tax income and consumer goods companies' cash flow, he said, will increase demand for both communications paper and packaging this year. In addition, Cavaney said low mortgage rates should support high levels of housing starts in 1987, increasing demand for many kinds of packaged goods. Inventory building should help demand for cartons and corrugated containers this year, he added. Cavaney said he expects exports to remain fairly high in 1987, as well, as a result of the recent declines in the dollar against major world currencies. But more importantly, he said, an improved balance of trade in 1987 from the lower dollar would induce increased industrial activity at home and thus higher packaging demand. Cavaney said increased competitiveness, caused by lower costs, higher productivity and improved efficiency would also contribute to a strong showing from the industry this year. Cavaney said, however, that the Tax Reform Act of 1986 could have a negative impact on the industry this year. "For manufacturers, the removal of the investment tax credit creates an impediment to future investment," he said. Also, he said API estimates the industry will lose three billion dlrs in cash flow over a five year period as a result of reforms. "Adjustments to this loss will require time and careful evaluation and will adversely affect the capital spending decisions of individual companies," Cavaney said. Reuter  9-MAR-1987 09:11:10.46 money-fxgnp belgiumwest-germany ec RM f0984reute r f BC-BONN-SERIOUS-ABOUT-CU 03-09 0090  BONN SERIOUS ABOUT CURRENCY PACT, SAYS TIETMEYER BRUSSELS, March 9 - West Germany takes "very seriously" the recent undertaking by major industrial countries to promote exchange rate stability around current levels, Finance Ministry State Secretary Hans Tietmeyer said. Talking to journalists before a meeting of European Community Economy and Finance Ministers here, Tietmeyer declined to say whether the February 22 Paris accord by the Group of Five countries plus Canada included secret agreements for stabilising currencies. But he noted the official communique said the participants agreed to cooperate closely to foster stability of exchange rates around current levels. "We're taking this sentence very seriously," he said. Tietmeyer remarked that the dollar had hardly moved against the mark since the meeting. He said a slowdown in West German economic growth had been caused by sharp exchange rate swings and that the Paris agreement should help in this respect. Economics Ministry State Secretary Otto Schlecht said the Bonn government saw no current need for measures to bolster the economy but was paying close attention to the slower growth and had not ruled out "appropriate and timely" action if necessary. Schlecht and Tietmeyer were speaking ahead of a discussion by the EC ministers of the latest EC Commission report on the economic situation in the 12-nation bloc. The Commission has sharply revised down expected German gross national product growth this year to two pct from 3.2 pct predicted last autumn and says Bonn has the most room of any EC country to stimulate economic activity. Schlecht said the upturn in West Germany's economy slowed in the fourth quarter of last year and the first quarter of 1987. But he said there was no cumulative downwards trend in view that would make quick remedial action necessary. He said a number of favourable indicators such as high level of investment and a good climate for consumption meant a recovery could be expected, while exports would pick up slightly during the course of the year. REUTER  9-MAR-1987 09:11:41.38 saudi-arabia RM f0986reute r f BC-SAUDI-FRENCH-BANK-TO 03-09 0109  SAUDI-FRENCH BANK TO DOUBLE PAID-UP CAPITAL JEDDAH, March 9 - <Al Bank Al Saudi Al Fransi>, also known as Saudi-French, will double paid-up capital to 400 mln riyals from 200 mln by converting reserves into equity, bank officials said. Jeddah-based Saudi-French, 40 pct owned by Banque Indosuez and 60 pct by the Saudi public, will sign a technical services agreement with Indosuez in Riyadh on Tuesday for management of the bank over the next five years, they said. The officials said the increase in paid-up capital, doubling the number of shares held by shareholders, will add depth to the market and extend trading to more investors. REUTER  9-MAR-1987 09:12:08.15 usa F f0988reute u f BC-COMPAQ-COMPUTER-<CPQ> 03-09 0031  COMPAQ COMPUTER <CPQ> HAS NEW DESKTOP COMPUTER HOUSTON, March 9 - Compaq Computer Corp said it has introduced a new 12 megahertz desktop personal computer called the Compaq Deskpro 286R. More  9-MAR-1987 09:12:30.97 coffee uganda ico-coffee T C f0990reute u f BC-UGANDA-DISAPPOINTED-B 03-09 0129  UGANDA DISAPPOINTED BY COFFEE TALKS FAILURE KAMPALA, March 9 - Uganda, Africa's second largest coffee producer, was disappointed by the stalemate in recent coffee talks in London, the chairman of the state-run Coffee Marketing Board, CMB, said. "This has not been good for coffee producers, more so in a situation where the prices dropped by 200 pounds per tonne of robusta coffee," J. Makumbi said when he returned from London on Friday. Producers and consumers failed to agree on a quota formula to share the world's coffee production during International Coffee Organisation, ICO, talks that ended last week. Makumbi blamed the failure to set quotas, which were suspended in Feburary last year, on Indonesian demands that its quota be increased dramatically. Uganda -- which earns about 400 mln dlrs annually from coffee exports, over 95 pct of its foreign exchange earnings -- had sought to raise its ICO quota to 3.0 mln from 2.45 mln 60-kilo bags, according to sources close to the CMB. The CMB has estimated that production will rise 20 to 25 pct in the current 1986/87 October-September season to over three mln bags. For several years Uganda had been unable to meet its ICO export quota as rebel activity disrupted the coffee industry. The Ugandan government depends on coffee export duties for about 60 pct of its sales tax revenue and the industry employs over half of salaried manpower. In Dar es Salaam, Tanzania's Agriculture and Livestock Development Minister Paul Bomani said today Third World countries would suffer from the failure of the London coffee talks. "It is only the middlemen who will benefit, he said. Bomani called on the ICO to convene another meeting within two months, saying, "Once tempers have cooled and delegations have had time to report back to their headquarters, common sense will prevail." Reuter  9-MAR-1987 09:17:04.78 acq F f0001reute f f BC-Chrysler-to-take-over 03-09 0012  ****** Chrysler to take over Renault stake in American Motors, says Renault Blah blah blah.  9-MAR-1987 09:17:44.88 meal-feed usahungary C G f0005reute r f BC-ADDITIONAL-CCC-CREDIT 03-09 0127  ADDITIONAL CCC CREDIT GUARANTEES FOR HUNGARY WASHINGTON, March 9 - The Commodity Credit Corporation, CCC, has authorized an additional 8.0 mln dlrs in credit guarantees for sales of vegetable protein meals to Hungary for fiscal year 1987, the U.S. Agriculture Department said. The additional guarantees increase the vegetable protein meal credit line to 16.0 mln dlrs and increases the cumulative fiscal year 1987 program for agricultural products to 23.0 mln dlrs from 15.0 mln, it said. The department also announced an extension of the export period from September 30, 1987, to December 31 for sales of vegetable protein meals. To be eligible for the credit guarantees all sales must be registered before export but not later than September 30. Reuter  9-MAR-1987 09:20:38.92 earn F f0010reute b f BC-******southern-co-to 03-09 0012  ******SOUTHERN CO TO TAKE 226 MLN DLR CHARGE ON PROJECTED VOGTLE COST RISE Blah blah blah.  9-MAR-1987 09:21:19.67 acq usa F f0014reute r f BC-APPLIED-CIRCUIT<ACRT> 03-09 0091  APPLIED CIRCUIT<ACRT> SELLS ELECTRONICS BUSINESS ANAHEIM, Calif., March 9 - Applied Circuit Technology Inc (ACT) said it has agreed in principal to sell its primary computer electronics business to the <Sanpao Group> of San Francisco. ACT said it has not disclosed the deal's terms, but added that 50 pct of the sale price is in cash, with the remainder to be paid over a two year period. The deal is expected to close on March 31, ACT said. ACT said it made the move to concentrate resources on its pharmaceuticals subsidiaries. Reuter  9-MAR-1987 09:24:32.21 acq usa F f0030reute u f BC-USAIR-<U>-ACQUIRES-9. 03-09 0107  USAIR <U> ACQUIRES 9.9 PCT OF PIEDMONT <PIE> WASHINGTON, D.C., March 9 - USAir Group Inc said it has acquired 2,292,599 Piedmont Aviation Inc shares, about 9.9 pct on a fully diluted basis, from Norfolk Southern Corp <NSC>. The acquisition of Piedmont by USAir has been approved by the directors of both companies. USAir said it has been advised by Norfolk Southern that the company supports the proposed merger and intends to tender all of its remaining 1,477,829 Piedmont common shares in response to USAir's tender offer which began today. This total includes shares issuable upon conversion of Piedmont preferred, USAir noted. USAir said Piedmont has about 23.1 mln common shares on a fully diluted basis, adding its offer is conditioned on the tender of at least 9,309,394 shares, representing 40.2 pct of the oustanding shares on a diluted basis. USAir said the 3,491,030 new shares it has an option to buy represent 18.5 pct of Piedmont's currently outstanding shares. Reuter  9-MAR-1987 09:25:10.00 coffee brazil T C f0031reute r f BC-BRAZILIAN-COFFEE-RAIN 03-09 0059  BRAZILIAN COFFEE RAINFALL SAO PAULO, MARCH 9 - THE FOLLOWING RAINFALL WAS RECORDED IN THE AREAS OVER PAST 72 HOURS PARANA STATE: UMUARAMA NIL, PARANAVAI 1.5 MILLIMETRES, LONDRINA NIL, MARINGA NIL. SAO PAULO STATE: PRESIDENTE PRUDENTE O.6 MM, VOTUPORANGA 12.0 MM, FRANCA 28.0 MM, CATANDUVA 10.0 MM, SAO CARLOS NIL, SAO SIMAO NIL. REUTER11:43/VB  9-MAR-1987 09:25:41.63 acq F f0033reute f f BC-******GENCORP-TO-SELL 03-09 0011  ******GENCORP TO SELL LOS ANGELES TELEVISION STATION TO WALT DISNEY CO Blah blah blah.  9-MAR-1987 09:26:28.51 acq usa F f0035reute d f BC-NATIONWIDE-CELLULAR-< 03-09 0073  NATIONWIDE CELLULAR <NCEL> COMPLETES PURCHASE VALLEY STREAM, N.Y., March 9 - Nationwide Cellular Service Inc said it has completed the previously-announced acquisition of privately-held Nova Cellular Co, a Chicago reseller of mobile telephone service with 1,800 subscribers, for about 65,000 common shares. Nova Cellular has an accumulated deficit of about 650,000 dlrs and had revenues of about 2,600,000 dlrs for 1986, it said. Reuter  9-MAR-1987 09:27:57.44 interest uk C G T M f0038reute u f BC-NATIONAL-WESTMINSTER 03-09 0092  NATIONAL WESTMINSTER BANK CUTS BASE RATE LONDON, March 9 - National Westminster Bank Plc said it has cut its base lending rate 0.5 percentage points to 10.5 pct today. National Westminster said it was responding to general easing in money market rates. Its move followed a signal from the Bank of England earlier this afternoon that it would endorse a half point cut in the base rate, a surprise move following its strong signals last week that such a move would be premature. However, since then the pound has continued to gain strongly. Reuter  9-MAR-1987 09:30:35.65 money-fxinterest uk RM f0039reute b f BC-U.K.-MONEY-MARKET-GIV 03-09 0096  U.K. MONEY MARKET GIVEN FURTHER HELP AT NEW RATES LONDON, March 9 - The Bank of England said it provided the market with further assistance during the afternoon, buying bills worth 166 mln stg at the lower rates introduced this morning. It bought 45 mln stg of local authority bills plus 27 mln stg of bank bills in band one at 10-3/8 pct together with 94 mln stg of band two bank bills at 10-5/16 pct. The bank also revised its estimate of the market shortage up to 300 mln stg from 250 mln this morning. It has given total assistance of 213 mln stg today. REUTER  9-MAR-1987 09:30:53.98 usa cbtcme C f0040reute u f BC-CBT,-CME-HEADS-TO-ADD 03-09 0125  CBT, CME HEADS TO ADDRESS CFTC COMMITTEE WASHINGTON, March 9 - The heads of the Chicago Board of Trade, CBT, and the Chicago Mercantile Exchange, CME, are to address a meeting of the Commodity Futures Trading Commission's financial products advisory committee March 11 in Chicago, CFTC said. CBT Chairman Karsten Mahlmann will present the objectives and views of the CBT's ad hoc committee on off exchange trading issues, CFTC said. CME President William Brodsky is set to discuss current issues involving equity index markets, including factors affecting price volatility, changes in settlement procedures, margin changes and price limits. The CFTC committee, headed by Commissioner Robert Davis, examines financial futures market issues. Reuter  9-MAR-1987 09:31:21.09 ship hong-kongjapan F f0043reute r f BC-HUTCHISON-UNIT-BUYS-C 03-09 0075  HUTCHISON UNIT BUYS CONTAINER CRANES FROM JAPAN HONG KONG, March 9 - Container port operator, <Hong Kong International Terminals Ltd>, a 89 pct held unit of Hutchison Whampoa Ltd <HWHH.HK>, said it has placed a 164 mln H.K. Dlr order for seven quayside container cranes of 800 tons each with Japan's Mitsui Engineering and Shipbuilding Co Ltd <MSET.T> for May 1988 to August 1989 delivery. Hong Kong International Terminals operates 32 cranes. REUTER  9-MAR-1987 09:32:01.67 ship turkey C G T M f0046reute d f BC-BOSPHORUS-SHIPPING-MO 03-09 0111  BOSPHORUS SHIPPING MOVES, ISTANBUL OFFICES CLOSE ISTANBUL, March 9 - Istanbul remained at a virtual standstill today under snow up to a meter deep but shipping was moving through the narrow Bosphorus waterway linking the Sea of Marmara and the Black Sea, officials said. The authorities ordered government offices closed until Wednesday. Many banks, businesses and schools stayed shut as workers struggled to keep main roads and supply lines open in this city of 6.5 mln people. The second blizzard to hit Istanbul in a week stopped yesterday afternoon and the international airport reopened today after a two-day closure. It was also shut earlier last week. Reuter  9-MAR-1987 09:32:40.79 crude ecuador opec V f0048reute u f BC-ECUADOR-TO-EXPORT-NO 03-09 0113  ECUADOR TO EXPORT NO OIL FOR 4 MONTHS, OFFICIAL By WALKER SIMON, Reuters QUITO, March 9 - The suspension of Ecuador's crude oil shipments after an earthquake cut an oil pipeline will last at least four months, a senior Energy Ministry official said. The official said Ecuador could resume exports after repairing a 40 km section of the 510 km pipeline, which links jungle oil fields at Lago Agrio to Balao on the Pacific coast. It would take about 100 mln U.S. Dlrs to repair the pipeline, the official, who did not want to be named, told Reuters. Ecuador had enough oil to meet domestic demand for about 35 days and would have to import crude to supplement stocks. The earthquake last Thursday night registered six on the 12-point international Mercalli scale. The damage to the pipeline was a severe economic blow to Ecuador, where oil accounts for up to two-thirds of total exports and as much as 60 pct of government revenues. Financially pressed Ecuador, a member of the Organisation of Petroleum Exporting Countries (OPEC), was recently pumping about 260,000 barrels per day (bpd) of crude, about 50,000 bpd above the output quota assigned by the cartel, another Energy Ministry spokesman said. Last year, it exported an average of 173,500 bpd, according to the central bank. However, Ecuador might build an emergency 25 km pipeline, costing 15 to 20 mln dlrs, to hook up with a Colombian pipeline, the first official said. He estimated it could take about 60 days to build. Ecuador, squeezed by the slide in world oil prices in 1986, had only 138 mln dlrs in net international reserves at the end of January, about equal to one month's imports. It suspended interest payments in January on 5.4 billion dlrs owed to about 400 private foreign banks. The country's total foreign debt is 8.16 billion dlrs, the eighth largest in Latin America. In Caracas, President Jaime Lusinchi said Venezuela would loan five mln barrels of crude to Ecuador over the next three months to make up for losses from damage to the pipeline. Ecuador asked for the loan to guarantee domestic supplies and would ship an equivalent volume back to Venezuela in repayment in May, Lusinchi said. A commission headed by Venezuelan Investment Fund Minister Hector Hurtado and including representatives from the interior and defence ministries and the state oil company Petroleos de Venezuela will travel to Ecuador Tuesday to evaluate and co-ordinate an emergency relief program, he said. REUTER  9-MAR-1987 09:33:35.86 money-supply france RM f0056reute f f BC-FRENCH-JAN-M-3-MONEY 03-09 0015  ******FRENCH JAN M-3 MONEY SUPPLY ROSE PROV ADJUSTED ONE PCT (O.7 PCT FALL IN DEC) - OFFICIAL. Blah blah blah.  9-MAR-1987 09:35:55.99 greeceitaly C G T M f0067reute d f PM-GREECE-BLIZZARDS 03-09 0109  HEAVY SNOWS HIT GREECE, ITALY ATHENS, March 9 - Blizzards lashed Greece today, piling up to 10 feet of snow in places and paralyzing transport in what state radio called unprecedented weather conditions for this time of year. Except for a handful of flights of the national airline Olympic Airways that took off before the blizzards started, all air traffic in and out of the Athens international airport was canceled, radio said. The weather service said heavy snowfalls would continue for several hours. Cold weather also hit southern and eastern Italy. Heavy snowfalls caused long delays and difficulties for road, rail and air traffic. Reuter  9-MAR-1987 09:39:30.30 rubber malaysia T f0080reute r f BC-MALAYSIA-SAYS-RUBBER 03-09 0138  MALAYSIA SAYS RUBBER PACT DEPENDS ON CONSUMERS KUALA LUMPUR, March 9 - Malaysia said the success of talks opening today on a new International Natural Rubber Agreement (INRA) depends on how flexible consumer countries are. Rubber producer and consumer countries meet for 12 days in Geneva from tomorrow to try to hammer out a rubber pact after they failed to reach agreement last November to replace the current accord, which expires next October. Primary Industries Minister Lim Keng Yaik said in a statement that Malaysia wants to continue with a second INRA and is prepared to accept modifications that would strengthen the present agreement. He said the second INRA would allow for an orderly disposal of the accumulated buffer stock of 375,000 tonnes, since the market is now capable of absorbing such releases. Reuter  9-MAR-1987 09:39:45.70 sweden RM f0081reute u f BC-PHARMACIA-AB-LAUNCHES 03-09 0115  PHARMACIA AB LAUNCHES EUROCOMMERCIAL PAPER PROGRAMME STOCKHOLM, March 9 - Pharmacia AB said it was launching a 200 mln dlr Eurocommercial paper programme as part of a move to internationalise the company's financing. Market makers will be Credit Suisse First Boston, Morgan Stanley International and Svenska Handelsbanken PLC. Pharmacia treasurer Bertil Tiusanen said gaining direct access to the short term international capital market would improve its ability to meet its dollar borrowing requirement. He said it was a natural step for an internationally known company whose shares are noted in Tokyo and Stockholm and are traded over the counter in the United States. REUTER  9-MAR-1987 09:40:54.41 acq usa F f0084reute u f BC-MCDOWELL-<ME>-TO-MERG 03-09 0103  MCDOWELL <ME> TO MERGER WITH <INTERPHARM INC> NASHVILLE, Tenn., March 9 - McDowell Enterprises Inc said it has signed a definitive agreement to acquire an 80 pct interest in privately held Interpharm Inc for a 19.9 pct interest in McDowell. The company said subject to contigencies, including future sales and profit levels, McDowell could over a four-year period acquire 100 pct of Interpharm in exchange for up to 51 pct of McDowell's voting stock. It said the transaction is expected to be completed within 60 days, at which time the McDowell board would be restructured to include Interpharm management. Reuter  9-MAR-1987 09:41:09.67 usa F f0085reute r f BC-FEDERAL-HOME-MORTAGE 03-09 0108  FEDERAL HOME MORTAGE BUYS FUNDS FROM LENDER CHARLOTTE, N.C., March 9 - The Federal Home Mortgage Corp announced the sale of 400 mln dlrs for residential mortgages to First Union Corp's mortgage subsidiary. Freddie Mac said that First Union Mortgage Corp already swapped 70 mln dlrs of new residential mortgages to Freddie Mac in the first phase of the contract. Freddie Mac said buy selling 400 mln dlrs worth of mortages, it makes more mortgage money available. It said through its guarantor program, First Union will be allowed to convert its investment-quality mortgages into mortgage-backed securities accepted in capital markets. Freddie Mac explained that the securities can be used as collateral for borrowings, sold to other investors, or employed in a variety of cash management techniques. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-004.sgm000066400000000000000000002526431154025176300231530ustar00rootroot00000000000000 11-MAR-1987 18:04:17.59 canada M f0849reute d f BC-INCO-SEES-NO-MAJOR-IM 03-11 0133  INCO SEES NO MAJOR IMPACT FROM DOW REMOVAL TORONTO, March 11 - Inco Ltd said it did not expect its earlier reported removal from the Dow Jones industrial index to make a major impact on the company's stock. "We don't think that individuals or institutions buy our shares because we were one of the Dow Jones industrials," spokesman Ken Cherney said in reply to a query. Inco closed 1-3/8 lower at 19-3/8 in second most active trading on the Toronto Stock Exchange. The Wall Street Journal, which selects the index, said Inco was dropped to make the index more representative of the market. Inco, the non-Communist world's largest nickel producer, was a member of the index since 1928. Replacing Inco and Owens-Illinois Inc will be Coca-Cola Co and Boeing Co, effective tomorrow. Nickel analyst Ilmar Martens at Walwyn Stodgell Cochran Murray Ltd said Inco's removal from the index would likely spark short-term selling pressure on the stock. "Some investors who have Inco may suddenly say, 'well, because it's not now a Dow stock, we should eliminate that investment,'" said Martens, although he added the move was unlikely to have a serious long-term impact on Inco stock. Inco has struggled in recent years against sharply lower nickel prices. Its net earnings fell to 200,000 U.S. dlrs in 1986 from 52.2 mln dlrs the previous year. Reuter  11-MAR-1987 18:06:47.22 usa F f0852reute d f BC-FORMER-EMPIRE-OF-CARO 03-11 0107  FORMER EMPIRE OF CAROLINA <EMP> EXEC SENTENCED NEW YORK, March 11 - Mason Benson, former president and chief operating officer of Empire of Carolina Inc, a toy maker, today was sentenced in Manhattan federal court to a year and one day in jail for his involvement in a kickback scheme. Benson pleaded guilty to charges of conspiracy, tax evasion, filing false corporate tax returns and defrauding the company's shareholders. He was also fined 5,000 dlrs. Benson was charged with demanding kickbacks from sales representatives who were asked to turn over a portion of their commisisons as a condition for doing business with Empire. Reuter  11-MAR-1987 18:09:39.66 usa F f0856reute h f AM-AIDS 03-11 0095  DOCTORS FIND LINK BETWEEN AIDS, SMALLPOX VIRUS BOSTON, March 11 - In a discovery that could complicate the search for an AIDS vaccine, a team of U.S. Army doctors said they have uncovered a potentially-fatal interaction between the AIDS virus and a virus used to protect against smallpox. Physicians at the Walter Reed Army Institute of Research said a 19-year-old man, who apparently had been exposed to the AIDS virus, developed a pox-like disease and died after receiving the smallpox vaccine. The military now tests recruits for AIDS before vaccinating them. The findings, reported in The New England Journal of Medicine, are significant because scientists have begun working on an AIDS vaccine that relies on the smallpox vaccine. "Our case report raises provocative questions concerning the ultimate safety of such vaccines," said the group led by Dr. Robert Redfield. The report also throws into question the belief held by some scientists that the smallpox vaccine, which exposes people to a milder, protective form of the disease known as cowpox, could be further modified to protect people against a host of other diseases. Reuter  11-MAR-1987 18:13:59.93 usa F f0860reute d f AM-CANCER 03-11 0107  BIRTH CONTROL PILLS HELP PREVENT CANCER - STUDY BOSTON, March 11 - Doctors at the Centers for Disease Control in Atlanta said they have new evidence that birth control pills can help provide long-term protection from cancer of the ovary, even if the pills are only taken for a few months. The study, reported in the New England Journal of Medicine, also found that all the various types of oral contraceptives on the market were equally effective in lowering the rate of ovarian cancer. The researchers estimated that the use of birth control pills in this country probably prevented about 1,700 cases of ovarian cancer in 1982. As more and more women who have taken oral contraceptives "move into the age groups that are at highest risk for epithelial ovarian cancer we may witness a declining incidence of this serious disease," they said. Specifically, the team led by Dr. Howard Ory found that "oral contraceptive use, even for a few months, reduces the risk of epithelial ovarian cancer by 40 percent for women 20 to 54 years of age. "The effect probably takes from five to ten years to become apparent, but it persists long after the use of oral contraceptives ends. Moreover, protection exists regardless of the formulation of oral contraceptive used," they said. Reuter  11-MAR-1987 18:14:49.93 interestretailipi usa RM C f0861reute u f BC-fin-futures-outlook 03-11 0103  U.S. ECONOMIC DATA KEY TO DEBT FUTURES OUTLOOK By Brad Schade, Reuters CHICAGO, March 11 - U.S. economic data this week could be the key in determining whether U.S. interest rate futures break out of a 3-1/2 month trading range, financial analysts said. Although market expectations are for February U.S. retail sales Thursday and industrial production Friday to show healthy gains, figures within or slightly below expectations would be positive for the market, the analysts said. "You have to be impressed with the resiliency of bonds right now," said Smith Barney Harris Upham analyst Craig Sloane. Treasury bond futures came under pressure today which traders linked to a persistently firm federal funds rate and a rise in oil prices. However, when sufficient selling interest to break below chart support in the June contract failed to materialize, participants who had sold bond futures early quickly covered short positions, they said. "Everyone is expecting strong numbers, and if they come in as expected it won't be that bad for the market," Sloane said. Sloane said the consensus estimate for the non-auto sector of retail sales is for a rise of 0.6 to 0.7 pct. Dean Witter analyst Karen Gibbs said a retail sales figure below market forecasts would give a boost to debt futures, and she put the range for the non-auto sector of retail sales at up 0.8 to 1.2 pct. Industrial production and the producer price index Friday both are expected to show increases of about 0.5 pct, she added. Retail sales "will tell us whether or not we will be able to fill the gap," Gibbs said, referring to a chart gap in June bonds between 100-26/32 and 101-3/32 created Friday. June bonds closed at 100-4/32 today. Also key to debt futures direction, in addition to the federal funds rate, is the direction of crude oil prices, said Carroll McEntee and McGinley Futures analyst Brian Singer. "A higher fed funds rate and firm oil prices precluded the market from breaking out of the trading range the last time the market approached the top of the range," Singer said. In order for bonds to break above the top of the range, which is just below 102 in the June contract, "the crude oil rally needs to run its course and pull back a little bit," Singer said. "Fed funds are already easing back down toward the six pct level." The recent surge in oil prices has also been a concern to Manufacturers Hanover Futures analyst Jim Rozich, but the rally may be nearing a top around 18.50 dlrs per barrel, he said. Rozich said he is looking for the June bond contract to ease to 99-6/32 and find support. "I'm not quite ready to jump on the bullish bandwagon yet. The jury is still out this week," Rozich said. Reuter  11-MAR-1987 18:15:09.97 usa C G L M T f0863reute d f AM-AID 03-11 0106  U.S. "ACTION PROGRAM" FOR SUB-SAHARAN AFRICA WASHINGTON, March 11 - The Reagan administration, responding to last year's United Nations special session on Africa, today outlined a U.S. "action program" for sub-Saharan Africa focusing heavily on economic reform and self-help. A White House statement announced establishment of "a long-term U.S. goal for all U.S. economic programs and policies in sub-Saharan Africa: to end hunger in the region through economic growth, policy reform and private sector development." The statement said the "program of action" was recommended by a White House task force set up last September. In a series of recommendations, the task force called for new efforts to address Africa's heavy debt burden and said U.S. food aid should stress production incentives to reinforce African nations' economic reform and productivity. It also said better African access to world markets should be promoted to reward good performance and enable African nations to earn their way toward economic growth. The U.S. private sector should be mobilized to provide "private, voluntary and corporate involvement of a humanitarian It said donor countries "should negotiate, through the existing International Monetary Fund/World Bank coordination process, framework agreements with each sub-Saharan African country to establish long-term structural adjustment and reform programs." The task force called for a separate budget account for U.S. bilateral aid "in order to focus better on rewarding economic performance and increasing the flexibility of U.S. assistance programs for incentive economic reforms and private sector development." Reuter  11-MAR-1987 18:16:09.87 usa F A RM f0867reute r f BC-UNUSUAL-TEXAS-INSTRUM 03-11 0091  UNUSUAL TEXAS INSTRUMENTS <TXN> PREFERRED PRICED NEW YORK, March 11 - In a novel type of financing, Texas Instruments Inc marketed a three-part, 225 mln dlr issue of convertible money market preferred stock through Shearson Lehman Brothers Inc as sole manager. Shearson, which originated the new convertible concept, said each of the three tranches totaled 75 mln dlrs. In the first, a 2.85 pct dividend was set on the stock with a strike price of 190 dlrs that represented a 15 pct premium over the common stock price when terms were set. Also included were 4.36 pct dividend preferred with a 220 dlr strike price and 33 pct premium and 4.49 pct dividend preferred with a 235 dlr strike price and 42 pct premium. Texas Instruments common closed at 167.25 dlrs, up 2-1/8. Ronald Gallatin, managing director at Shearson, said that "demand for the offering was unbelievable, especially for the first tranche." He said that Shearson originated the concept of auction money market preferred stock three years ago. The conversion feature of this issue is the new wrinkle. Commenting on the first tranche, Gallatin noted that the original pricing talk called for a dividend in the four to 4.20 pct area. This was gradually cut to 2.85 pct because of intense demand, saving the issuer money in financing costs. The Shearson official said that virtually all buyers of the first tranche received less than they wanted. He said the latter two tranches were less strongly oversubscribed. Like non-convertible money market preferred stock, the new version allows investors to redeem their holdings every seven weeks. Investors then can maintain their holdings, sell them, or offer to hold on to the securities if the auction dividend is at least at a level they specify in advance. Gallatin said the securities were sold to a broad range of investors, including major insurance companies, banks, money managers and pension funds. Reuter  11-MAR-1987 18:21:00.31 usacanada james-bakerreagan E f0877reute r f AM-CANADA-CLARK 03-11 0105  CLARK SAYS HE EXPECTS U.S. ACTION ON ACID RAIN WASHINGTON, March 11 - Canadian Foreign Secretary Joe Clark, winding up a two-day visit to Washington, said he expected the Reagan administration to take some action on reducing acid rain. "My impression is there will be some movement by the United States administration on acid rain (but) how much movement I can't judge or predict," he told reporters. The meetings with American officials are part of a routine U.S.-Canada consultation but are also expected to lay the groundwork for a summit in Ottawa next month between President Reagan and Prime Minister Brian Mulroney. Clark today held discussions with Treasury Secretary James Baker and Democratic Sens. Patrick Moynihan of New York, Christopher Dodd of Connecticut, Lloyd Bentsen of Texas and George Mitchell of Maine. Yesterday, he held talks with Vice President George Bush, Secretary of State George Shultz and Commerce Secretary Malcolm Baldrige. Among its priorities, Canada is seeking evidence that Reagan is prepared to live up to a commitment made last year to implement in the United States a five-year 5 billion U.S. dlr program to test cleaner ways of burning coal. This issue was discussed at length with Baker and several of the senators, including Mitchell who urged Canada to "keep the heat on" the Reagan administration to force action, Canadian officials said. Also taken up with most of the senators and Baker were trade issues, including the need for the United States and Canada to establish a better mechanism for settling trade disputes between the two countries, who are each other's major trading partner, Canadian officials said. Reuter  11-MAR-1987 18:22:58.57 usa F f0886reute r f BC-FORD-MOTOR-<F>-DISTRI 03-11 0052  FORD MOTOR <F> DISTRIBUTES PROFIT SHARING DALLAS, March 11 - Ford Motor COr said that profit-sharing checks were distributed to employees in its U.S. facilities. About 371 mln dlrs was distributed to 160,253 emplyees. The average payment per employee was more than 2,100 dlrs compared with 1,200 in 1985. Reuter  11-MAR-1987 18:24:57.40 jamaica RM A f0887reute u f BC-jamaica-puts-cap-on-b 03-11 0079  JAMAICA PUTS CAP ON BORROWING Kingston, march 11 - jamaica has put a cap on its 3.5 billion dlr foreign debt and will reduce its obligations by 300 mln dlrs this year, prime minister edward seaga said today. Speaking at a news conference, seaga said jamaica has reached its "maximum stock of debt" and will not undertake any more borrowing until it is justified by economic growth. "this year we'll be reducing the stock of debt by 300 million dollars," he said. He told reporters his government aims to reduce jamaica's ratio of debt payments to foreign exchange earnings from the current 50 pct to 25 pct within three years. Debt payments this year are expected to total 287 mln dollars, seaga said. yesterday jamaica agreed with creditor banks to reschedule over the next 12 years some 181 miln dlrs due in 1987-89. The accord includes a grace period on principal payments for eight and a half years and a reduction of interest rates from 2.5 to 1.125 pct above libor. Last week, jamaica obtained a 10-year rescheduling of 100 pct of principal and 85 pct of interest on 125 mln dollars of debt to the paris club nations the debt would have fallen due over the next two years. Reuter  11-MAR-1987 18:26:24.22 usa F f0888reute d f AM-SICKLE 03-11 0114  FASTER TEST FOR SICKLE CELL ANEMIA DEVELOPED BOSTON, March 11 - A team of California researchers said that they have developed a better, faster test for detecting sickle cell anemia in unborn children than existing procedures. The test, developed by Cetus Corp <CTUS> researchers, requires only a small amount of genetic material from a fetus and produces a diagnosis within a day, unlike other tests that require several days and can only be done in a few specialized centers, they said. Sickle cell anemia is a painful, inherited blood disease that causes the normally-flexible red blood cells to stiffen into a sickle-like shape. It is primarily found in blacks. The researchers said in The New England Journal of Medicine that their "procedure promises to be a rapid, sensitive and reliable method for the prenatal diagnosis of sickle cell disease." In addition, they said, the technique might also be adapted to detect other types of genetic disease. Reuter  11-MAR-1987 18:36:05.15 earn canada E F f0900reute r f BC-BANK-OF-BRITISH-COLUM 03-11 0060  BANK OF BRITISH COLUMBIA 1ST QTR JAN 31 NET VANCOUVER, British Columbia, March 11 - Oper shr loss two cts vs profit three cts Oper net profit 273,000 dlrs vs profit 1,710,000 YEAR - period ended October 31, 1986 Oper shr loss 23 cts vs profit 14 cts Oper net loss 4,397,000 vs profit 7,527,000 Assets 2.67 billion vs 3.25 billion Note: 1987 1st qtr net excludes extraordinary loss of 2.2 mln dlrs or six cts shr. 1986 yr net excludes extraordinary loss of 66 mln dlrs or 1.94 dlrs shr involving 22.1 mln dlrs of costs from sale of bank assets to Hongkong Bank of Canada, eight mln dlrs for contingent liabilities in respect of litigation and potential tax reassessment by U.S. govt and 35.9 mln dlrs of deferred tax debits. Most bank assets sold to HongKong Bank of Canada, a unit of <Hong Kong and Shanghai Banking Corp> in Nov, 1986. Shr after preferred divs. Reuter  11-MAR-1987 18:37:48.60 usairan V f0904reute u f AM-REAGAN-HAKIM 03-11 0101  RAN SCANDAL PARTICIPANT TO GET IMMUNITY OFFER WASHINGTON, March 11 - Albert Hakim, an arms merchant, is the first top-ranked player in the Iran arms scandal who may be enticed into testifying by the promise of immunity, investigators said. The House Select committee probing the Iran arms scandal has voted to grant limited immunity from criminal prosecution to Hakim in return for his testimony. Hakim, 51, was said deeply involved from the start in the attempt to trade arms to Iran for help in freeing American hostages in Lebanon and the diversion of funds and arms to rebels in Nicaragua. Reuter  11-MAR-1987 18:38:02.32 earn usa F f0905reute r f BC-RESTAURANT-ASSOCIATES 03-11 0069  RESTAURANT ASSOCIATES INC <RA> 4TH QTR JAN 3 NEW YORK, March 11 - Shr 25 cts vs 36 cts Net 1.4 mln vs 1.4 mln Revs 56.9 mln vs 35.1 mln Year Shr 86 cts vs 75 cts Net 4.7 mln vs 3.0 mln REvs 201.4 mln vs 140.0 mln NOTE:1985 4th qtr includes 99,000 loss from carryforward. Shares restated to give effect to 1.4 to one stock split in the form a 40 pct class A dividend in August 1985. Reuter  11-MAR-1987 18:41:59.82 earn usa F f0907reute r f BC-MICHIGAN-GENERAL-CORP 03-11 0077  MICHIGAN GENERAL CORP <MGL> 4TH QTR SADDLE BROOK, N.J., March 11 - Shr loss 1.02 dlrs vs 1.01 dlr Net loss 18.1 mln vs 11.4 mln Revs 96.0 mln vs 90.3 mln Year Shr loss 2.65 dlrs vs loss 3.06 dlrs Net loss 39.3 mln vs 34.6 mln Revs 386.0 mln vs 373.0 mln NOTE:1986 4th qtr, year loss includes 14.4 mln dlrs, 4.6 mln dlrs respectively from discontinued. 1985 4th qtr and year include loss of 13.1 mln, 1.9 mln dlr respectively. Reuter  11-MAR-1987 18:45:36.66 crudenat-gasiron-steel usalibya F Y f0908reute u f BC-USX-<X>-PROVED-OIL,-G 03-11 0103  USX <X> PROVED OIL, GAS RESERVES FALL IN 1986 NEW YORK, March 11 - USX Corp said proved reserves of oil and natural gas liquids fell 28 pct to 802.8 mln barrels at the end of 1986 from 1.12 billion barrels at year-end 1985. The figures, in USX's just-released 1986 annual report, indicate much of the drop resulted from the exclusion of 293.7 mln barrels of Libyan reserves, after the U.S. government last June directed U.S. oil companies to end Libyan operations. USX, which owns Marathon Oil Co and Texas Oil and Gas Corp, had 60 pct of its 1986 sales of 14.94 billion dlrs from its oil and gas operations. About 24 pct of total sales came from USX's USS steel unit and 16 pct from diversified businesses, which include oilfield services, raw materials, minerals, chemicals and real estate. According to the report, domestic liquids reserves fell slightly to 628.5 mln barrels from 628.9 mln and foreign reserves fell to 174.3 mln from 486.4 mln barrels. The large drop in foreign reserves was in the Middle East and Africa, where they fell to about 9.3 mln barrels from 316.7 mln, reflecting the exclusion of Libya. Total natural gas reserves fell to 4.82 trillion cubic feet at year-end 1986 from 5.18 trillion at the end of 1985. Again, most of the drop came from the Middle East and Africa, where reserves fell to zero from 71.9 billion cubic feet, excluding Libyan reserves. U.S. natural gas reserves fell to 3.44 trillion cubic feet from 3.65 trillion and foreign reserves fell to 1.38 trillion from 1.53 trillion. In other areas, USX said total capital spending fell to 962 mln dlrs in 1986 from 1.78 billion dlrs in 1985. The 1986 audited figure is eight mln dlrs higher than the unaudited figure the company reported on Jan 27. USX also said it expects to record a gain of 150 mln dlrs in 1988, representing 50 pct of previously existing investment tax credits allowable under the new tax law. The loss of the other half of the credits was reflected in the fourth quarter. In a discussion of steel results, USX said plants that were shut down last month and some previously idled plants may be permanently closed. USX took a fourth quarter charge of 1.03 billion dlrs to restructure its steel operations. The charge included the "indefinite idling" last month of four plants in Utah, Pennsylvania and Texas. Other plants or parts of plants in Pennsylvania, Indiana, Alabama, Ohio and Chicago had been previously idled. "These operations are not permanently shut down. Improved market conditions for the products from these plants may make it feasible to reopen some of them," USX said in the report. "On the other hand, a lack of any future market improvement may necessitate their permanent closing," it added. Reuter  11-MAR-1987 18:50:05.96 usa F Y f0914reute r f BC-PHILLIPS<P>-SAYS-STOC 03-11 0099  PHILLIPS<P> SAYS STOCK UP ON STEPS TO PARE DEBT NEW YORK, March 11 - Phillips Petroleum Co Chairman C. J. "Pete" Silas said his company's stock, ranked fourth on the most active list of stocks traded today, rose partly because of steps it took to pare its debt. Silas told Reuters in an interview today, "part of this strength results from the rise in oil prices and also because some of the analysts have been happy with the steps we've taken in 1986 to pare our debt." Phillips stocks rose 1/4 to 14 dlrs a share following recommendations by some oil analysts, a company source said. Phillips debt stood at 5.9 billion dlrs in December 1986 down from a 1985 high of 8.6 billion dlrs, analysts said. "At 14 dlrs a share, Phillips is priced closer to the actual price of oil," he added. Silas said, "if the analysts are right that oil prices will rise to 20 dlrs or higher, then it seems to make sense to buy Phillips." He is, however, more cautious about the strength in crude prices, expecting the price to fluctuate between 16-18 dlrs a barrel for the year. Oil industry analysts said one reason for the stock's popularity of the stock is that it traded at a strong discount to its appraised value and was attractively priced for small investors. Charles Andrew, an analyst who follows Phillips for John S. Herold Inc of Greenwich, Conn said that the appraised value of the company, based on available data is 34.25 dlrs. "The stock is trading at about 1/3 its appraised value. The company has tremendous leverage and if it can get its act together and if oil prices are steady to higher there is good room for improvement," he said. But, he added, "if oil prices turn lower, there will be a lot of pressure on Phillips." Phillips' shares fell as low as eight dlrs a share over the last 52 weeks with a 1987 low of 11-3/4 dlrs in 1987. Analysts say that the appraised value of the company could be revised due to asset sales of their oil and gas reserves. Silas told Reuters that the asset sales which amount to about two billion dlrs for 1986 were completed and that none were planned. Reuter  11-MAR-1987 18:50:57.36 usa F f0915reute u f BC-MICHIGAN-GENERAL-<MGL 03-11 0107  MICHIGAN GENERAL <MGL> BEGINS EXCHANGE OFFER SADDLE BROOK, N.J., march 11 - Michigan General Corp said it began an exchange offer for its 110 mln dlrs outstanding principal amount of 10-3/4 pct senior subordinated debentures due December 1, 1998. Pursuant to the exchange offer, each 1,000 dlr principal amount will receive 500 dlr principal amount of senior subordinated notes due March 1, 1992, 200 dlr principal amount of non-interest bearing convertible senior subordainted notes due March 1, 1997 and 12 shares of delayed convertible preferred stock, liquidation preference 25 dlrs per share. The offer will expire April nine. Michigan General said the exchange offer is crucial to is attempt to restructure and reduce its risk from Chapter 11. The principal purpose of the offer is to reduce its debt service on the 10-3/4 pct debetures, increase stockholders' equity and induce its lender to continue to fund. Assuming a 90 pct acceptance of the offer, Michigan's annual cash interest requirements will be reduced by about 10.6 mln dlrs, it said. Completion is subject to the tender of at least 90 pct of the debentures and its lender to waive it from default under its loan agreements. Reuter  11-MAR-1987 18:53:18.49 earn canada E F f0918reute r f BC-BANK-OF-B.C.-REVISES 03-11 0108  BANK OF B.C. REVISES SHARE PAYOUT ESTIMATE VANCOUVER, British Columbia, March 11 - Bank of British Columbia said it revised its estimate of shareholder distributions from last November's sale of most of the bank's assets to HongKong Bank of Canada to between 65 cts and 1.15 dlrs a share from 55 cts to 1.20 dlrs a share. The bank said the estimate could rise to between 1.30 dlrs and 1.80 dlrs a share if the full pension surplus is obtained. It said it did not know when distributions would be made. It earlier reported that operating profit for first quarter ended January 31 fell to 273,000 dlrs from 1.7 mln dlrs the previous year. For full-year 1986 ended October 31, the bank posted an operating loss of 4.4 mln dlrs against year-earlier profit of 7.5 mln dlrs. The bank also posted a 66 mln dlr extraordinary loss in fiscal 1986. Bank of British Columbia sold most of its assets last November to HongKong Bank Canada, a unit of <HongKong and Shanghai Banking Corp>, of Hong Kong, for 63.5 mln dlrs. It said efforts to wind up the bank's affairs were proceeding as quickly as possible. The bank said it expected to report positive earnings in future periods, barring unforeseen circumstances. Loan losses, which the bank previously said figured in its move to sell off most of its assets, rose to 105.7 mln dlrs in fiscal 1986 from year-earlier 36.1 mln dlrs. The bank said 31.1 mln dlrs of the 1986 total represented downward adjustments to its portfolio of syndicated sovereign risk loans as required under the sale to HongKong Bank. Since November 27, the bank has confined activities to the winding up of affairs, Bank of British Columbia said. Reuter  11-MAR-1987 18:54:46.18 usa reagan V f0921reute u f BC-HOUSE-VOTES-TO-BLOCK 03-11 0111  HOUSE VOTES TO BLOCK CONTRA AID FOR SIX MONTHS WASHINGTON, March 11 - The House voted to block 40 mln dlrs in military aid to the Nicaraguan rebels until President Reagan accounts for past assistance, including money diverted from the U.S. sale of arms to Iran. The vote was seen as a temporary defeat for Reagan, who has made aid to the "contras" a key initiative. Congressional Democratic leaders have conceded that despite today's vote, they can not muster a two-thirds majority to override a certain Reagan veto. But they have said it is likely they can win a battle expected this fall over 105 mln dlrs iin new aid Reagan is requesting. Reuter  11-MAR-1987 18:56:34.21 earn canada E F f0924reute d f BC-<KIENA-GOLD-MINES-LTD 03-11 0040  <KIENA GOLD MINES LTD> 4TH QTR NET TORONTO, March 11 - Shr 17 cts vs 16 cts Net 1,019,000 vs 985,000 Revs 7,997,000 vs 7,492,000 YEAR Shr 1.18 dlrs vs 64 cts Net 6,959,000 vs 3,778,000 Revs 36.5 mln vs 29.8 mln Reuter  11-MAR-1987 18:56:43.55 carcasslivestock argentina L f0925reute r f BC-ARGENTINE-MEAT-EXPORT 03-11 0117  ARGENTINE MEAT EXPORTS HIGHER IN JAN/FEB 1987 BUENOS AIRES, March 11 - Argentine meat exports during Jan/Feb 1987 totalled 39,714 tonnes, against 36,594 tonnes shipped in the same 1986 period, National Meat board said. Shipments in tonnes with comparative figures for the 1986 period, in brackets, included: beef 26,945 (20,096), horse meat 3,257 (4,211) and beef offal 7,660 (10,502). Argentine's meat exports totalled 20,243 tonnes in February 1987, against 19,217 tonnes shipped in the same 1986 month. Shipments in tonnes, with comparative figures for February 1986, in brackets, included: beef 13,272 (11,464), horse meat 1,543 (2,083) and beef offal 4,476 (4,672), the board added. Main destinations for refrigerated beef (bone in equivalent) were as follows, in tonnes, with comparative figures for 1986 in brackets - EC 5,500 (7,900), Brazil 5,200 (unavailable), Israel 3,700 (3,000), Peru 2,500 (800), Singapore 500 (300), Switzerland 500 (400), Canary Islands 500 (300), Malta 500 (700), Aruba/Curazao 200 (300), Chile 100 (600). Main destinations for canned meat and cooked beef (bone in equivalent), in tonnes with comparative figures for Jan/Feb 1986, in brackets, were - United States 11,200 (13,400), EC 4,700 (5,100). Reuter  11-MAR-1987 19:02:33.14 earn canada E F f0940reute r f BC-KIENA-PLANS-TWO-FOR-O 03-11 0056  KIENA PLANS TWO-FOR-ONE STOCK SPLIT TORONTO, March 11 - <Kiena Gold Mines Ltd> said it planned a two-for-one common stock split, pending shareholder approval on April 7. It said approval would require 66-2/3 pct of votes cast. Kiena said 57 pct-owner Campbell Red Lake Mines Ltd <CRK> was expected to vote in favor of the split. Reuter  11-MAR-1987 19:04:31.39 usa F f0941reute r f BC-VANZETTI-<VANZ>-INCRE 03-11 0053  VANZETTI <VANZ> INCREASE OF SHARES APPROVED STOUGHTON, Mass, March 11 - vanzetti Systems INc said its shareholders approved increasing the number of authorized shares to five mln from three mln. Shareholders also approved increasing the number of shares reserved for options to employees to 300,000 from 150,000 Reuter  11-MAR-1987 19:04:38.26 earn usa F f0942reute s f BC-ROWE-FURNITURE-CORP-< 03-11 0025  ROWE FURNITURE CORP <ROWE> SETS QTLY DIVIDEND SALEM, Va., March 11 - Qtly div four cts vs four cts prior Pay April 15 Record March 20 Reuter  11-MAR-1987 19:05:21.41 trade usa reaganyeutter V RM f0943reute u f BC-U.S.-HOUSE-PANEL-TAKE 03-11 0092  U.S. HOUSE PANEL TAKES FIRST TRADE BILL VOTES By Jacqueline Frank WASHINGTON, March 11 - House trade lawmakers took their first votes on measures designed to toughen U.S. trade laws but held over until tomorrow the most difficult votes on controversial plans to protect American industries. Meeting in closed session, the House Ways and Means Trade Subcommittee failed to resolve one of the most sensitive issues in the bill--whether they will force major foreign trading partners to severely cut their trade surpluses with the United States. The subcommittee is considering a toned-down version of Democratic-sponsored trade legislation that aims to open foreign markets but which drops last year's effort to force President Reagan to retaliate with quotas or tariffs. Congressional aides who asked not to be identified said the lawmakers intend to wrap up their proposals tomorrow and will consider a proposal to mandate retaliation without setting specific trade penalties. The legislation faces another hurdle in the full Ways and Means Committee next week before the full House votes on it. Rep. Richard Gephardt, a Missouri Democrat who is seeking his party's 1988 presidential nomination, said he may offer an amendment to call for reductions in the trade surpluses of those countries with barriers to imports of U.S. goods. This would be a moderated version of his earlier plan to force a mandatory ten per cent annual cut in the trade surplus with the United States by Japan, South Korea, Taiwan, West Germany and other countries with the largest trade imbalances. "My criteria for a good amendment sets a standard for getting the trade deficit down," he told reporters. The trade law changes are to become part of a major congressional and administration effort to turn around the record U.S. trade deficit of 169 billion dlrs last year by opening up foreign markets and making U.S. products more competitive. House Speaker James Wright, a Texas Democrat, said again today he expects the full House will approve the trade bill by May and that Reagan will accept the final congressional bill. "I expect whatever is reported (by the Ways and Means Committee) will pass. We will have a good bill and an effective bill," he told reporters. The comprehensive trade bill will include work by other committees to ease export controls on high technology, to aid U.S. workers displaced by foreign competition, to stimulate research and development, to remove foreign trade barriers and to improve education and worker training. The lawmakers agreed that for the first time a U.S. industry could charge foreign producers with unfair competition if they deny basic worker rights such as collective bargaining, safety rules and payment of a minimum wage appropriate to the country's economic development. They transferred to U.S. Trade Representative Clayton Yeutter the powers now held by Reagan to decide whether to retaliate against foreign violations of fair trade rules and whether an injured industry deserves import relief. They agreed to make it easier for a company to get temporary relief from import competition but agreed the industry should provide a plan to become competitive. The administration has not announced its support but Yeutter said yesterday, "I am cautiously optimistic," that the Democratic-led House will come up with an acceptable bill. Reuter  11-MAR-1987 19:06:36.56 trade franceussr C G L M T f0945reute r f BC-SOVIET-MINISTER-SAYS 03-11 0087  SOVIET MINISTER SAYS TRADE BOOST UP TO FRENCH PARIS, March 11 - Soviet first deputy prime minister Vsevolod Murakhovsky said at the end of a brief visit here his country wanted to boost joint business with France, but that a reduction of France's trade deficit with the Soviet Union depended on the French. Murakhovsky, who is also chairman of the State Agro-Industrial Committee (GOSAGROPROM), told a news conference he had discussed a variety of possible deals with French companies Rhone-Poulenc, Pechiney and Imec. Declining to put figures on possible contracts he said he had discussed plant protection and the processing of highly sulphuric gas with Rhone-Poulenc, packaging technology for agricultural products with Pechiney, and fruit and vegetable juice processing with Imec. An official for Pechiney said an agreement of intent on packaging could be signed soon, but could not give any other details. The other two companies were not immediately available for comment. Asked whether he foresaw a reduction this year of France's trade shortfall, at 7.6 billion francs in the first 11 months of 1986 against 5.1 billion for the whole of 1985, Murakhovsky told Reuters: "It all depends on France." At a meeting in Paris last January French and Soviet foreign trade ministers said they were committed to increased efforts to reduce the deficit. Estimates at the time showed a French 190 mln franc surplus for December 1986. Murakhovsky said the Soviet Union was prepared to talk with anybody with "interesting" proposals offering latest technology and assuring "a mutual advantage." He said the Soviet Union had many tasks ahead of it and would deal rapidly with proposals it considered interesting. He encouraged companies to take advantage of new laws guaranteeing "the interests of foreign partners" in joint ventures. But he said no agreements had yet been finalised under the new joint venture laws. He said concrete deals had not yet been finalised as a result of a one billion dollar accord signed in Moscow last month with French businessman Jean-Baptiste Doumeng. He said Doumeng's Interagra company was preparing proposals for further examination by the Soviet Union. Doumeng last month said the agreement was to exchange one billion dollars worth of goods. Murakhovsky said the agreement was one of intent, and designed primarily to renew and increase the Soviet Union's food production capacity. Reuter  11-MAR-1987 19:09:27.77 crude ecuadorvenezuela RM A Y f0952reute u f AM-ecuador-assistance 1stld 03-11 0103  VENEZUELA TO LEND OIL TO ECUADOR FOR EXPORT Caracas, march 11 - venezuela will supply ecuador with an as yet undetermined amount of crude oil to help it meet export commitments, seriously affected by last week's earthquake, energy and mines minister arturo hernandez grisanti said. He gave few details about the deal, but said a crude oil loan agreement will be made between state oil companies petroleos de venezuela (pdvsa) and ecuador's cepe. Ecuador was forced to suspend oil exports for an expected four months after an earthquake damaged a pipeline. Oil accounts for 60 per cent of its export income. Hernandez was speaking to reporters at miraflores palace on the results of talks with ecuador's deputy energy minister fernando santos alvite, who arrived here last night. "the volume lent to ecuador would be discounted from its opec quota and would not affect venezuela's," he said. "we would from august on produce our own quota and sell the additional amounts that ecuador would be repaying us," he said. He did not elaborate on the quota arrangements but did say ecuador would notify opec by telex that venezuela would be lending it a certain amount over so many days. Venezuela's opec output quota is currently 1.495 million barrels a day, and ecuador's has been set at 210,000 bpd. Reuter  11-MAR-1987 19:10:26.95 earn usa F f0956reute d f BC-EAGLE-CLOTHES-INC-<EG 03-11 0083  EAGLE CLOTHES INC <EGL> 2nD QTR JAN 31 NEW YORK, March 11 - Shr profit 17 cts vs profit 14 cts Net profit 1.3 mln vs profit 901,000 Revs 36.9 mln vs 36.2 mln Six months Shr profit 18 cts vs loss 11 cts Net profit 1.4 mln vs loss 716,000 Revs 63.6 mln vs 57.7 mln NOTE:1986 six months includes increase in provision for doubtful accounts to 1.5 mln dlrs. 1986 shares give effect to issuance of 1.5 mln shares in exchange for outstanding Series 1 preferred shares. Reuter  11-MAR-1987 19:11:19.94 iraniraq C G L M T f0958reute r f AM-GULF-IRAQ 03-11 0112  IRAQ SAYS IRAN ATTACK REPULSED ON SOUTHERN FRONT BAGHDAD, March 11 - Iraq said it had repelled an Iranian attack on positions held by its fourth army corps east of the southern Iraqi town of Amarah on the Baghdad-Basra highway. A Baghdad war communique said an Iranian infantry brigade, backed by tanks, launched the overnight attack and fierce fighting raged for more than six hours before Iranian troops fled the battlefield, leaving 220 men killed and many wounded. No major battles have been reported fought by the fourth army corps for more than a year in the area, mainly swamplands of the Hawizah marshes running eastward to the southern port city of Basra. Reuter  11-MAR-1987 19:15:32.68 trade ukjapan C G L M T f0961reute r f AM-BRITAIN-JAPAN 03-11 0120  BRITAIN CALLS ON JAPAN TO INCREASE IMPORTS LONDON, March 11 - Britain today called on Japan to increase foreign imports or risk the rise of protectionism and the harm it would bring to it and other trading nations. British Trade and Industry Secretary Paul Channon said Japan must heed a report issued by a Japanese government advisory body in December calling for faster domestic demand to help cut its trade surplus and restructure its economy. "I recognise that the strong yen has brought problems to Japan's domestic economy," he told a group of Japanese businessmen in London. "But these short term difficulties should not be allowed to deflect Japan from the fundamental reforms necessary," he said. "It is not just a domestic issue for Japan. If import propensity does not expand very soon there is a real risk from protectionist lobbies, particularly in the U.S. With whom Japan has so massive a surplus," he said. "They may well succeed in securing action by governments which would be highly injurious to trading nations like Japan and the U.K." Channon said there had been substantial growth in the volume of trade between Japan and Britain, amounting to 6.2 billion sterling (9.8 billion dlrs) last year. But he added: "Regrettably too much of it was in one direction, with the Japanese selling us 3.7 billion sterling (5.8 billion dlrs) more than we sold them." Reuter  11-MAR-1987 19:15:55.25 acq F f0963reute f f BC-******TAFT-BROADCASTI 03-11 0013  ******TAFT BROADCASTING REJECTS 145 DLR PER SHARE BUYOUT OFFER FROM THETA CORP Blah blah blah.  11-MAR-1987 19:18:49.58 acq usa F f0964reute u f BC-TAFT-<TFB>-REJECTS-14 03-11 0098  TAFT <TFB> REJECTS 145 DLR/SHR OFFER Cincinnati, March 11 - Taft Braodacasting Co said its board of directors unanimously decided not to accept the pending proposal of Theta Corp, an investor group led by Dudley Taft. The decision was based on, among other things, the advise of its financial advisors, goldman sachs and co, that the offer of 145 dlrs per share was inadequate. Taft said the board concluded that the offer failed to recognize fully the future propsects of the company and directed management to explore alternatives including possible financial restructuring. Reuter  11-MAR-1987 19:23:42.46 ecuador C G L M T f0967reute d f AM-ecuador-tremor 1stld 03-11 0120  ECUADOR DEBT TO BE HONOURED AFTER QUAKE SURVIVAL QUITO, March 11 - Ecuador, stricken by a severe earthquake, will honour its 8.16 billion dlr foreign debt but only after ensuring the survival of the country after the tremor which claimed at least 300 lives and caused 4,000 persons to disappear. "The government's position ... is to permit us to honour the (debt) commitments but without sacrificing the country, because first we have to survive and later we can comply," information minister Marco Lara told reuters. He said the nation would later announce definitive measures on the foreign debt in the aftermath of the earthquake which the government said will cause nearly a billion dlrs in economic losses. Reuter  11-MAR-1987 19:26:43.72 veg-oil uk ec C G f0968reute r f AM-COMMUNITY-BRITAIN 03-11 0087  BRITISH MINISTER CRITICISES PROPOSED EC OILS TAX LONDON, March 11 - A British minister said that a proposed European Community tax on vegetable oils and fats would raise the price of fish and chips and he pledged the government would fight against it. Lord Belstead, a junior agriculture minister, told the House of Lords the tax would raise the price of raw materials used in many processed foods by about 100 pct. He said revenue should not be raised by taxing the consumer and called the proposal "repugnant." Reuter  11-MAR-1987 20:04:55.06 jobs australia RM f0981reute b f BC-AUSTRALIAN-UNEMPLOYME 03-11 0091  AUSTRALIAN UNEMPLOYMENT EASES IN FEBRUARY CANBERRA, March 12 - Australia's seasonally-adjusted unemployment rate eased to 8.2 pct of the estimated workforce in February from 8.3 pct in January, compared with 7.9 pct a year earlier, the Statistics Bureau said. The number of unemployed declined to 632,100 from 638,300 in January, against 594,500 in February 1986, it said. But unadjusted, the number of jobless rose to 699,800 or 9.1 pct of the workforce from 671,400 or 8.9 pct in January and 658,500 or 8.7 pct a year earlier. REUTER  11-MAR-1987 21:02:16.57 ecuador RM f0996reute u f BC-ECUADOR-SEEKS-HALT-TO 03-11 0106  ECUADOR SEEKS HALT TO PAYMENTS TO BANKS IN 1987 QUITO, March 11 - Ecuador, stricken by a severe earthquake, is seeking through negotiations with private foreign banks to postpone all payments due to them for the rest of the year, Finance Minister Domingo Cordovez said. He said in a statement, "The idea with the foreign banks is to obtain from them the best terms to give the Ecuadorean economy a complete relief in the period of deferral of payments on the foreign debt during the present year." The statement referred only to payments due to private foreign banks, a senior government finance official told Reuters. These creditors hold two-thirds of Ecuador's foreign debt which totals 8.16 billion dlrs. It did not refer to debts maturing to foreign governments and multilateral lending agencies, accounting for the remainder of Ecuador's foreign debt, the official said. He said Ecuador owed the private foreign banks between 450 and 500 mln dlrs in interest payments for the rest of 1987 and about 66 mln in principal payments maturing this year. Cordovez said Ecuador would seek new loans from multilateral organisations. A World Bank mission was due here soon to evaluate emergency loans, government officials said. Ecuador has also appealed for emergency aid from about 40 foreign governments. Government officials have calculated losses to the 1987 budget from last Thursday's earthquake at 926 mln dlrs. In 1986, Ecuador's total service on the foreign debt was about 996 mln dlrs to all creditors. The quake ruptured Ecuador's main oil pipeline, suspending crude exports for five months until the line is repaired. Oil accounts for up to two-thirds of its total exports and up to 60 pct of total revenues. Before the tremor, Ecuador suspended interest payments on January 31 to private foreign banks. Officials said they stopped interest payments due to a cash-flow squeeze stemming from a slide in world oil prices, which cut 1986 exports by about 25 pct to 2.18 billion dlrs. Ecuadorean finance officials have been in telephone contact every day this week with some of the banks who sit on its 14-bank advisory committee, the senior government finance official said. The committee represents the country's 400 or so private foreign bank creditors. Cordovez also said in the statement, "The banks should perceive that it is impossible at this moment to comply with what was forseen." Cordovez added, Ecuador must make a new proposal in line with the reality since the earthquake by seeking better options of deferment and of softening the negotiation conditions." Interest payments fall due at least monthly to private foreign banks. Ecuador's initial proposal earlier this year was to make only one semi-annual or one annual interest payment this year. Under this proposal, it sought to defer interest payments until June at the earliest, foreign bankers and government officials here said. Ecuadorean officials held their last formal meeting with the advisory committee in New York in January, but the negotiations were suspended on January 16 due to the 12-hour kidnapping of President Leon Febres Cordero by air force paratroopers. The Red Cross says that least 300 people died and at least 4,000 are missing due to the earthquake. REUTER  11-MAR-1987 21:06:50.50 money-fx usa james-baker RM f0002reute u f BC-TREASURY-SECRETARY-BA 03-11 0096  TREASURY SECRETARY BAKER DECLINES COMMENT ON G-6 NEW YORK, March 11 - U.S. Treasury Secretary James Baker declined comment on the February 22 Paris accord between the six major industrial nations under which they agreed to foster exchange rate stability. Asked by reporters after a speech before the National Fitness Foundation banquet what, if any, currency intervention levels had been set in Paris, Baker replied: "We never talk about intervention." Baker also declined to comment on his views about the foreign exchange markets' reaction to the accord. REUTER  11-MAR-1987 21:32:41.13 crude venezuelaecuador opec RM f0019reute u f BC-ECUADOR-TO-ASK-OPEC-T 03-11 0104  ECUADOR TO ASK OPEC TO RAISE EXPORT QUOTA CARACAS, March 11 - Ecuador will ask OPEC to raise its oil export quota by 100,000 barrels per day to 310,000 to compensate for lost output due to last week's earthquake, deputy Energy Minister Fernando Santos Alvite said. Santos Alvite, who arrived in Caracas last night to discuss an aid plan for Ecuador, did not say when the Organisation of Petroleum Exporting Countries (OPEC) would be approached. The additional output would be related to plans now under discussion for Venezuela and Mexico to lend Ecuador crude while it repairs a pipeline damaged by the quake. Earlier, Venezuelan Energy and Mines Minister Aturo Hernandez Grisanti said his country would supply an unspecified part of Ecuador's export commitments. But Santos Alvite told reporters he hoped a first cargo of 300,000 barrels could leave Maracaibo this weekend to supply refineries near Guayaquil. He added Ecuador also wanted to make up for 50,000 bpd it shipped to Caribbean destinations. Mexico might supply Ecuador's South Korean market. Ecuador may be unable to export oil for up to five months due to extensive damage to a 25 mile stretch of pipeline linking jungle oilfields to the Pacific port of Balao. REUTER  11-MAR-1987 21:37:18.46 oilseedrapeseed china G C f0024reute u f BC-CHINA'S-RAPESEED-CROP 03-11 0097  CHINA'S RAPESEED CROP DAMAGED BY STORMS PEKING, March 12 - The yield on 46,000 hectares (ha) of rapeseed in central China will be cut by up to 70 pct by hailstorms and tornadoes that swept across nearly 100,000 ha of crops on March 6, the New China News Agency said today. The storm, which lashed the Huai and Yangtze rivers and eastern Anhui province, left two people dead and 800 others injured. Some 800 houses were flattened and 19 boats sunk, it said. The Anhui provincial government has sent emergency relief to the 19 counties affected, the news agency said. REUTER  11-MAR-1987 22:25:49.20 crude china F f0040reute u f BC-CHINA-CLOSES-SECOND-R 03-11 0112  CHINA CLOSES SECOND ROUND OF OFFSHORE OIL BIDS PEKING, March 12 - China has closed the second round of bidding by foreign firms for offshore oil exploration rights, the China Daily has reported. It quoted a spokesman for the China National Offshore Oil Corp (CNOOC) as saying China signed eight contracts with 15 foreign firms for blocks in the Pearl River mouth and south Yellow Sea covering a total area of 44,913 sq km. Second round bidding began at the end of 1984 and only one well has so far produced results -- Lufeng 13-1-1, 250 km south-east of Shenzhen, with an output of 6,770 barrels a day. The well was drilled by a group of Japanese companies. The spokesman added CNOOC was ready to enter into contracts for offshore blocks before third round bidding began. He did not say when this would be, but added the contracts would not be bound by restrictions imposed during the second round. China has signed 36 oil contracts and agreements with 37 companies from 10 countries since 1979, when offshore exploration was open to foreigners. Eleven contracts were terminated after no oil was discovered. Foreign firms have invested 2.1 billion dlrs on offshore China since 1979. REUTER  11-MAR-1987 22:42:47.98 japan RM f0046reute b f BC-JAPAN-RELAXES-RULES-O 03-11 0097  JAPAN RELAXES RULES ON SECURITIES COMPANY OUTLETS TOKYO, March 12 - Japan has relaxed its limit on the establishment of securities company outlets in order to service a growing number of individual investors, the Finance Ministry said. Japanese securities companies can now set up as many as 21 new outlets in the two years before March 31, 1989, against the previous maximum of 13. The rules apply to outlets in department stores, supermarkets and other locations convenient for individuals. Foreign securities firms are not affected by the ruling, it said. REUTER  11-MAR-1987 22:56:45.09 acq usa F f0048reute u f BC-AMC-IMPOSES-HIRING-FR 03-11 0097  AMC IMPOSES HIRING FREEZE DUE TO TAKEOVER BID DETROIT, March 11 - American Motors Corp <AMO> management has ordered a hiring freeze in view of Chrysler Corp's <C> 1.5 billion dlr takeover bid, a spokesman for AMC said. Analysts said the merger is virtually certain to go ahead. American Motors directors met for five hours Wednesday to review the takeover proposal. "The board ... Expects to be meeting periodically over the next several weeks on the Chrysler proposal," AMC said in its first formal statement since it acknowledged the Chrysler proposal on Monday. Chrysler, the number three U.S. Automaker, has said the merger is motivated principally by its desire to acquire AMC's profitable Jeep business and dealers, as well as a new modern car assembly plant in Bramalea, Ontario. That means a guaranteed future for much of AMC, but it leaves in question the fate of many of its 19,000-plus employees, according to industry analysts. AMC's Toledo, Ohio Jeep plant has 1,850 hourly workers on indefinite layoff while its Kenosha, Wisconsin, car plant has another 2,250 on layoff. REUTER  11-MAR-1987 22:57:31.32 china F f0050reute u f BC-ROTHMANS-CLOSE-TO-JOI 03-11 0108  ROTHMANS CLOSE TO JOINT VENTURE IN CHINA PEKING, March 12 - Rothmans International plc <ROT.L> aims to set up a joint venture with Jinan cigarette factory in Shandong, China to produce high quality cigarettes, some for export, Chinese newspapers said. The China Daily said the factory has produced high-quality "General" brand cigarettes using advanced machinery and technical assistance worth 2.5 mln dlrs donated by Rothmans under a co-operation agreement signed in 1985. The Economic Daily newspaper said the high quality "General" will help China's cigarettes enter the international market. The two papers gave no more details. REUTER  11-MAR-1987 23:00:56.20 bop australia RM f0052reute u f BC-FOREIGN-INVESTMENT-IN 03-11 0113  FOREIGN INVESTMENT IN AUSTRALIA JUMPS IN LAST QTR CANBERRA, March 12 - The net inflow of foreign investment into Australia jumped to 7.3 billion dlrs in the fourth quarter of 1986 from 4.32 billion in the third quarter and 4.55 billion a year earlier, the Statistics Bureau said. The Bureau attributed the increase to a turnaround of 2.08 billion dlrs in official sector transactions and a 1.09 billion turnaround in direct investment. The turnaround in official transactions to a 1.52 billion inflow from a 555 mln outflow in the third quarter, against a 520 mln inflow a year earlier, was largely on account of government foreign currency borrowings, it said. Direct investment recorded a turnaround to a 1.04 billion dlr inflow in the fourth quarter from a 57 mln withdrawal in the third quarter, against a 546 mln inflow in the fourth quarter of 1985, the Bureau said. It said the major part of the turnaround reflected an injection of funds, estimated at around 700 mln dlrs, associated with the previously reported restructuring of the Australian operations of General Motors Corp <GM>. GM used the funds to pay out or take over certain Australian liabilities of its local unit <General Motors-Holden's Ltd>, it said. However, net borrowings remained the major part of total inflow, accounting for 6.16 billion dlrs in the fourth quarter against 3.88 billion in the third quarter and 4.03 billion a year earlier, the Bureau said. Net official borrowings comprised 1.52 billion dlrs against a net outflow of 548 mln in the third quarter and a 516 mln inflow a year earlier. Total private and semi-public authority net borrowings rose to 4.64 billion dlrs from 4.42 billion in the third quarter and 3.51 billion a year earlier. REUTER  11-MAR-1987 23:06:27.89 ukussr RM f0055reute u f BC-MOSCOW-CARRIES-OUT-NU 03-11 0094  MOSCOW CARRIES OUT NUCLEAR TEST LONDON, March 12 - The Soviet Union carried out a nuclear test early today, the official Tass news agency reported. According to the report, monitored by the British Broadcasting Corporation, the explosion was at 0200 gmt. A blast on February 26 ended a 19-month unilateral test moratorium declared by the Soviet Union. Moscow blamed the end of the freeze on U.S. Refusal to join a total test ban. Tass said the latest explosion, with a power of up to 20 kilotonnes, had "the aim of improving military equipment." REUTER  11-MAR-1987 23:06:44.14 graincorn taiwan G C f0058reute u f BC-TAIWAN'S-FIRST-QUARTE 03-11 0086  TAIWAN'S FIRST QUARTER MAIZE IMPORTS SEEN RISING TAIPEI, March 12 - Taiwan's maize import commitments are expected to rise to 970,000 tonnes in the first four months of 1987 from 870,000 tonnes a year earlier, a spokesman for the Joint Committee of Maize Importers told Reuters. He said more than 75 pct of the imports come from the U.S. And the rest from South Africa. The maize import target for calendar 1987 is set at well over 3.4 mln tonnes compared with an actual 3.07 mln in 1985, he added. REUTER  11-MAR-1987 23:46:55.84 trade taiwan RM f0077reute u f BC-TAIWAN-FURTHER-RELAXE 03-11 0110  TAIWAN FURTHER RELAXES FOREIGN GOODS IMPORT CURBS TAIPEI, March 12 - Taiwan said it would soon relax import controls on some 400 foreign items, including stationery and books, in a further effort to allow trading partners, especially the U.S., Greater access to its markets. Taiwan announced the easing of import curbs on some 600 farm and industrial products last month, a Council for Economic Planning and Development spokesman told Reuters. He said the new move was intended to balance trade between Taiwan and its trading partners. The island's trade surplus reached a record 15.6 billion U.S. Dlrs last year, up from 10.62 billion in 1985. In January, Taiwan cut import tariffs on some 1,700 foreign products and allowed imports of U.S. Wine, beer and cigarettes. "We hope the measures will help reduce our trade surplus this year, especially with that of the U.S.," the spokesman said. Washington is pressing Taiwan to open its markets wider as a way of cutting its trade deficit with the island, which rose to 2.35 billion U.S. Dlrs in the first two months of 1987 from 1.87 billion in the year-earlier period. REUTER  12-MAR-1987 00:06:25.87 shipiron-steel japanusa F f0081reute u f BC-ECONOMIC-SPOTLIGHT-- 03-12 0111  ECONOMIC SPOTLIGHT - MITSUBISHI HEAVY FIGHTS BACK By Fumiko Fujisaki, Reuters TOKYO, March 12 - International efforts to redirect Japan's export-driven economy toward domestic consumption face heavy going if the country's largest defence contractor and world's biggest shipbuilder is anything to go by. Mitsubishi Heavy Industries Ltd <MITH.T> (MHI), which began making ships and iron goods for Japan's military rulers 130 years ago, is responding to the strong yen by redoubling its efforts to maintain its share of export markets. "If we sell the best quality and the cheapest products, everyone will buy them," MHI president Yotaro Iida said. Although two of MHI's main businesses, shipbuilding and power plant construction, have been hit hard by the yen's 40 pct rise against the dollar, the company has no plans to abandon them, Iida told Reuters in an interview. Its other big activity, aircraft component manufacture, has performed so well that MHI now accounts for half of the money Tokyo spends on defence procurement each year. "We have made the utmost efforts among the world's manufacturers to improve productivity," he said. "You may be surprised if you come to see our plants. The outside is old but the inside is ultra-modern, with robots and computers." Securities analysts at major securities houses agreed that MHI has pared costs more quickly than its competitors. The company has slashed its workforce to 47,000 from 86,000 in 1976. Despite its cost-cutting, MHI expects profits to drop 40 pct to 30 billion yen in the current fiscal year ending March 31, from 1985/86's record 50.14 billion. And that includes gains from the sale of MHI's stake in Mitsubishi Motors Corp <MIMT.T> for 49 billion yen. Iida is optimistic about the future, however. He said a resurgence of demand from the Middle East following the recent recovery in oil prices coupled with persistent demand for power plants in developing countries will help MHI restore its exports-to-sales ratio to the past decade's average of 30 pct. MHI's exports-to-sales ratio fell to 25.9 pct in the half-year ended last September, from 35 to 36 pct five years ago. China is the most promising market, although MHI also considers other non-oil-producing developing countries as major customers. "Our customers are all seen as being in trouble due to a lack of foreign currency," Iida said. But he added that he felt MHI could sell to those markets with Japanese government financial support. It can also finance the plants itself and recover its investment through product sales, a strategy Iida said could prove popular in the future. In shipping, MHI is fighting back against low-priced South Korean competition by building more technologically advanced carriers to carry liquefied natural gas and other products difficult to transport. Shipbuilders Association officials told Reuters MHI is the world's largest shipbuilder in terms of orders and capacity. Domestically, MHI is involved in 12 national projects, including development of nuclear fusion reactors and launch vehicles for man-made satellites. It has been the biggest contractor for the Japan Defence Agency's F-15 and F-14 jet fighters and missiles, although all of these have been built under licence from U.S. Firms. MHI is now heading up five Japanese companies seeking to develop the country's own fighter plane to replace the currently used F-1 support fighters in the late 1990s. Military experts said Washington is putting strong pressure on Tokyo to buy a U.S. Plane, either the McDonnell Douglas Corp F-18 or General Dynamics Corp F-16, to reduce Japan's huge trade surplus with the U.S. "It might be a good idea to jointly produce planes with U.S. Makers as Japan is supported by the U.S. Defence umbrella," Iida said. MHI also plans to cooperate with the U.S. In its Strategic Defence Initiative space defence program by participating in the project when it moves from the research stage, he said. The U.S. Has been seeking Japan's technological support. In fiscal 1985/86, aircraft accounted for 17.1 pct of MHI's sales, shipbuilding 17 pct and power plants 27.9 pct. Iida said the ideal ratio is power plants 30 pct, aircraft and special vehicles 25 pct and shipbuilding 15 pct. As for the remaining 30 pct, Iida said he wanted to shift the domestic focus away from heavy machinery sold to manufacturers and towards household goods, but he declined to specify which products. "By the end of this year, you may find our brand name on your daily products, although this does not mean we will run away from our mainstream business," he said. REUTER  12-MAR-1987 00:37:11.96 japan RM f0096reute u f BC-JAPANESE-BANKRUPTCIES 03-12 0091  JAPANESE BANKRUPTCIES DECLINE IN FEBRUARY TOKYO, March 12 - Japan's corporate bankruptcies in February fell 10.8 pct from January to 1,071 cases and total debts dropped 49.4 pct to 149.40 billion yen, the Tokyo Commerce and Industry Research Co said. February bankruptcies fell 14.9 pct from a year earlier, the 26th straight monthly decline, and debts fell 54.3 pct. The lower number of bankruptcies in February reflected a relaxation of money market conditions and reduced bill settlements due to fewer operating days, it said. Bankruptcies caused by the strength of the yen against the dollar totalled 69, or 6.4 pct of those in February, with debts of 25.52 billion yen, the research firm said. This compared with 64 with debts of 125.59 billion yen in January, it said. Currency-linked bankruptcies since November 1985, when the dollar's depreciation against the yen began to affect Japanese export-linked firms, totalled 772, with cumulative debts of 660.53 billion yen, it said. The value of the yen against the dollar rose to an average 153.49 yen per dollar in February from 184.62 a year earlier. Bankruptcies usually decline in the first quarter of the year due to fewer operating days and for seasonal reasons. Bankruptcies are expected to increase in the quarter starting April 1 due to expectations of slow consumer spending, low wage increases for the 1987/88 fiscal year which starts in April, and slow capital spending by manufacturers, the company said. Bankrupcties among export-linked subcontractors will rise due to a recent shift by major manufacturers to overseas production, it added. REUTER  12-MAR-1987 00:55:57.87 ship bangladesh G C f0108reute u f BC-BANGLADESH-PORT-WORKE 03-12 0089  BANGLADESH PORT WORKERS END STRIKE CHITTAGONG, March 12 - Cargo handling resumed at Bangladesh's Chittagong port today after 7,000 workers ended their three day walk-out triggered by a pay dispute, port officials said. Loading and unloading of 14 ships stranded by the strike started this morning and will be completed as quickly as possible, they said. The strikers returned to work after an agreement was reached last night between port authorities and the Port Workers Association, they said without giving details. REUTER  12-MAR-1987 01:01:34.13 acq uk leigh-pemberton RM f0111reute u f BC-LEIGH-PEMBERTON-OPPOS 03-12 0116  LEIGH-PEMBERTON OPPOSES TAKEOVER PROTECTION RULES LONDON, March 11 - The Bank of England does not favour the introduction of rules to shield companies from hostile takeover attempts, its governor, Robin Leigh-Pemberton, said. Instead, merchant banks advising bidding companies must show restraint and responsibility to avoid the excesses that have marred recent takeovers, he told the Yorkshire and Humberside Regional Confederation of British Industries' annual dinner. Leigh-Pemberton also called on companies to improve ties with institutional investors, suggesting representatives of those institutions be granted seats on the boards of directors of companies they invest in. "Boards cannot expect protection from unwelcome predators, for that is but a short step from saying that they should be protected from their own shareholders -- who are, after all, the proprietors of the company," Leigh-Pemberton said. He added takeovers and mergers had an important role to play in furthering economies of scale, integration and more efficient market penetration. "The degree of success or failure (of a takeover) has not in my experience depended on whether or not the takeover was contested," he said. Leigh-Pemberton noted there had been excesses in takeover activity in the recent past. "The aim is to pressurise a company's management into action dedicated solely to a favourable impact on the share price in the short-term, partly or even primarily at the expense of the future," he said. Such bids "often depend for their success on creating a highly-charged and artificial situation in the share market, and give rise to temptations, on both sides of the battle, to engage in aggressive, even manipulative tactics that are immensely damaging to the interest of the shareholders," he said. In a clear reference recent events, he said "those in the City who act for companies or individuals .. Must, I suggest, be ready to accept a full measure of responsibility -- even if it entails opprobrium -- for the transactions that may result." They "should exercise the most careful judgment at the outset with respect to the clients for whom they act and the activities contenplated. Those who sow wind cannot expect the whirlwind to visit elsewhere," he added. REUTER  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-005.sgm000066400000000000000000002265241154025176300231530ustar00rootroot00000000000000 13-MAR-1987 15:05:02.92 acq usa F f0215reute d f BC-PLM-<PLMA>-UNIT-ENDS 03-13 0076  PLM <PLMA> UNIT ENDS MERGER TALKS SAN FRANCISCO, March 13 - PLM Cos Inc said its PLM Power Co unit broke off merger discussions with Sunlaw Energy Corp of Beverly Hills, Calif. In January PLM Power entered into a letter of intent to negotiate a potential acquisition of Sunlaw, subject to substantial due diligence, the company said. But it also said the two companies were not able to agree on mutually satisfactory final terms and conditions. Reuter  13-MAR-1987 15:08:53.08 coffee colombia C T f0224reute b f BC-colombia-opens-coffee 03-13 0086  COLOMBIA OPENS APRIL/MAY COFFEE REGISTRATIONS BOGOTA, March 13 - Colombia opened coffee export registrations for April and May with the National Coffee Growers' Federation setting no limit, Gilberto Arango, president of the private exporters' association, said. He told Reuters the decision not to put any limit responded to "new factors" which have emerged from recent International Coffee Organisation talks in London, where producers and consumers failed to agree on a re-introduction of export quotas. Reuter  13-MAR-1987 15:11:52.98 graincorn usa C G L f0228reute b f BC-/USDA-REPORTS-10.572 03-13 0098  USDA REPORTS 10.572 MLN ACRES IN CONSERVATION WASHINGTON, March 13 - The U.S. Agriculture Department has accepted 10,572,402 more acres of highly erodable cropland into the Conservation Reserve Program, USDA announced. In the latest signup, farmers on 101,020 farms submitted bids on a total of 11,254,837 acres. The accepted bids for annual rental payments ranged up to 90 dlrs per acre with an average of 51.17 dlrs per acre. Land entered into the Conservation Reserve Program will be ineligible for farming for ten years and must be planted with permanent vegetative cover. Producers enrolled 1,894,764 acres of corn base acreage in the conservation program to take advantage of a corn "bonus" rental payment that was offered by USDA. The corn bonus, to be paid in generic comodity certificates, amounts to two dlrs per bushel, based on the ASCS program payment yield for corn, for each acre of corn based accepted into the reserve. The state showing the biggest enrollment in the conservation program during this signup was Texas with approximately 1.225 mln acres, followed by Iowa with 1.030 mln acres, Minnesota with 890,000 acres, Montana 875,000 acres, and Kansas with 842,000 acres. Other states showing big enrollment were Missouri with 646,000 acres, North Dakota with 588,000 acres, and Nebraska with 554,000 acres. In the corn belt states of Illinois and Indiana, 217,000 acres and 116,000 acres respectively were enrolled. Farm land signed up to date in the conservation program totals 19,488,587 acres. Bids on the previous signups ranged up to 90 dlrs per acre with an average of 45.52 dlrs. Reuter  13-MAR-1987 15:13:01.16 usabrazil RM f0233reute u f BC-BRAZIL-DEBT-POSES-THO 03-13 0103  BRAZIL DEBT POSES THORNY ISSUE FOR U.S. BANKS By Cal Mankowski, Reuters NEW YORK, March 13 - CitiCorp <CCI> appears to be digging in its heels for tough negotiations over the billions of dollars in loans that Brazil owes to money center banks, Wall Street analysts said. "I view it as pre-negotiation posturing," said analyst Carole Berger of Cyrus J. Lawrence Inc, referring to both Brazil and Citicorp. Brazil recently stopped paying interest on its commercial bank debt. Today, CitiCorp said its first quarter income would be reduced by 50 mln dlrs after tax if it lists the loans as non-performing status. Citicorp filed an 8-K form with the Securities and Exchange Commission, indicating a material change in its financial situation. "Citicorp is saying you can't scare us with threats, we'll make your loans non-performing right now," Berger said. The loans have to be treated as non-performing after 90 days without a payment. CitiCorp said only that the situation will be reviewed at the end of the current quarter. Berger asserted that Brazil is doing its own politicking by talking to U.S. regulators and trying to drive a wedge between U.S. and European banks. Analyst Lawrence Cohn of Merrill Lynch and Co said it is unlikely the situation will be resolved until the second half of this year. "Ultimately the Brazilians are going to have to pay up on all the interest they owe," Cohn said. "The real issue is the rescheduling of debt terms. Another question is whether or not the International Monetary Fund can help Brazil with a new austerity program. Stocks of money center banks were mostly down fractions in late dealings. One trader most stocks in the group bounced off their lows by midday as investors took the news in stride. Cohn said the bank stocks may be risky until numbers on non-performing loans are reported for each bank. But he said investors looking ahead six to 12 months might want to buy at present levels for the "tremendous fundamental values" in the group. Analyst Robert Gordon of Shearson Lehman Brothers Inc said Manufacturers Hanover Corp <MHC) has the greatest exposure to Brazilian loans of any New York bank, in terms of percentage of earnings. He said his only two recommendations currently among New York banks are J.P. Morgan and Co <JPM> and Bankers Trust Co <BT> which happen to have the least exposure. Gordon said his positive opinion on J.P. Morgan and Bankers Trust was not merely a response to the fact that the two have lower exposure to Brazilian loans than other banks. In fact he said there's a chance those banks could get more involved in the future. He noted that Morgan has already set up a brokerage subsidiary to deal in loans to less developed countries. "I don't see any reason to change full year earnings estimates, said Frederick Meinke, analyst at E.F. Hutton Co. He thinks the confrontation with Brazil could end in a replay of a situation that occurred with Argentina in 1984 and 1985. Meinke noted that in the case of Argentina the loans became non-accruing for a couple of quarters but then when the banks came to an agreement with Argentina all the back interest was paid. "What it did was distort the quarterly earnings pattern," he said. He said in the case of Brazil write-offs of loans is a worst-case outcome which is highly unlikely. He noted that Brazil is a country with a diversified economy, going through some economic upheaval after the transition from a military to a civilian government. "The countries of Latin America have too much debt relative to their ability to service it," said John Mason of Interstate Securities. "We've been fiddling around with these problems for five years and the hour is growing late." He said up to now the banks have reduced their spreads, cut interest rates internally and extended maturities and none of these measures has been enough. He expects re-classification of as much as a third of the loans as non-accruing and he sees partial write downs of some loans. Nevertheless Mason thinks the money center bank stocks could be poised for a short term rally. A spokesman at First Chicago Corp <FNB> said it is premature to put Brazil's loans on a cash basis. "It is our expectation that economic development will allow Brazil to meet its debt," a spokesman said. Bankers Trust in New York said it would be premature to make a decision. Several other banks queried by Reuters said much the same thing. A spokesman at Manufacturers Hanover noted that of 2.3 billion dlrs in loan exposure to Brazil only 1.3 billion is subject to Brazil's unilateral moratorium on repayment of interest. Reuter  13-MAR-1987 15:13:10.18 usa F f0234reute b f BC-ROCKWELL-<ROK>-TO-REP 03-13 0112  ROCKWELL <ROK> TO REPURCHASE MORE COMMON SHARES PITTSBURGH, March 13 - Rockwell International Corp said its board has authorized extension of the company's 500 mln dlr stock repurchase program by an additional 500 mln dlrs. Since the beginning of the present repurchase program in March 1986, Rockwell said, it has bought 10.4 mln shares for 461 mln dlrs. At present prices, it said, the program would reduce the presently outstanding 140 mln common shares by about seven pct. Since November 1983, the company has repurchased 18.1 mln shares for 672 mln dlrs, it said. Rockwell said the stock will be repurchased through open market and private transactions. Rockwell said the repurchased shares will be available for potential acquisitions, stock options, employee benefit programs, conversion of convertible securities and other purposes. The company said, "We continue to view our repurchase program as an integral part of our long term goal of improving shareholder values." Rockwell said the program "complements our aggressive program of support for the growth plans of our businesses with capital investments, product and research development resources, and acquisitions in support of our core businesses." Reuter  13-MAR-1987 15:14:20.63 usa F Y f0237reute r f BC-VOGTLE-NUCLEAR-PLANT 03-13 0100  VOGTLE NUCLEAR PLANT GETS FULL-POWER LICENSE ATLANTA, March 13 - The Nuclear Regulatory Commission issued a full-power operating license for Unit 1 of the Vogtle Electric Generating Plant, said Southern Co <SO> unit Georgia Power, which is a co-owner of the plant. Georgia Power said the license allows for completion of pre-operational testing, which will be followed by full-power operation. Unit 1 is scheduled to begin commerical operation by June one, it said. The other co-owners of the plant are <Olgethorpe Corp>, the Municpal Electric Authority of Georgia and the city of Dalton. Reuter  13-MAR-1987 15:19:10.06 ukjapanusa F f0255reute r f BC-BRITISH-AIRWAYS-<BAB> 03-13 0081  BRITISH AIRWAYS <BAB> TO FLY TO TOKYO NON-STOP NEW YORK, March 13 - British Airways said the British government reached an agreement on new traffic rights with the Japanese government which clears the way for non-stop flights between London and Tokyo. The flight is scheduled to cut across Siberia, shaving almost six hours off the previous flight path to 11-1/2 hours, British Airways said. The trans-Siberian route is subject to approval by the USSR, British Airways added. Under the agreement, British Airways said it will continue to leave Heathrow daily, but the new non-stop service will operate on Thursdays and Saturdays starting early June. The company said return flights will be on Fridays and Sundays. Reuter  13-MAR-1987 15:20:20.42 ukjapan A f0260reute h f BC-BRITAIN-WANTS-BANK-RE 03-13 0118  BRITAIN WANTS BANK REGULATION DEAL WITH JAPAN LONDON, March 13 - Britain wants Japan to agree a timetable for work towards joint rules on capital adequacy for banks along the lines of a January outline agreement between the U.S and the U.K., Corporate Affairs Minister Michael Howard said. Howard told a Nikkei conference on Tokyo financial markets, "I want to see an agreement between us on what progress is to be made and the rate at which it will happen." Japanese vice-minister of finance for international affairs Toyoo Gyohten told the conference yesterday he was ready to discuss capital adequacy, but no negotiations were planned and he could not see how or when agreement would be reached. Reuter  13-MAR-1987 15:21:39.08 livestockcarcass usa ec C G L f0264reute u f BC-/U.S.-MEAT-GROUP-TO-F 03-13 0131  U.S. MEAT GROUP TO FILE TRADE COMPLAINTS WASHINGTON, March 13 - The American Meat Institute, AME, said it intended to ask the U.S. government to retaliate against a European Community meat inspection requirement. AME President C. Manly Molpus also said the industry would file a petition challenging Korea's ban of U.S. meat products. Molpus told a Senate Agriculture subcommittee that AME and other livestock and farm groups intended to file a petition under Section 301 of the General Agreement on Tariffs and Trade against an EC directive that, effective April 30, will require U.S. meat processing plants to comply fully with EC standards. The meat industry will seek to have the U.S. government retaliate against EC and Korean exports if their complaints are upheld. Reuter  13-MAR-1987 15:21:47.30 usa F f0265reute r f BC-COMMERCE-BANCORP-<COB 03-13 0095  COMMERCE BANCORP <COBA> FILES FOR OFFERING CHERRY HILL, N.J., March 13 - Commerce Bancorp Inc said it has filed a registration statement with the Securities and Exchange Commission for a 575,000 share Series B cumulative preferred stock offering, including 75,000 shares to cover allotments. Commerce said it and its banking subsidiaries will use the proceeds to support their planned growth and for general corporate purposes. The bank holding company said each share of preferred stocks initially will be convertible into one share of Commerce common stock. Commerce said the preferred shares will be priced at a range of 20-22 dlrs a share, with a proposed sale to the public commencing in early-to-mid April. Commerce said Butcher and Singer Inc will be the offering's managing underwriter. Reuter  13-MAR-1987 15:21:53.56 usa F f0266reute d f BC-ADIA-SERVICES-<ADIA> 03-13 0080  ADIA SERVICES <ADIA> SELLS 500,000 SHARES MENLO PARK, Calif., March 13 - Adia Services Inc said it agreed to sell 500,000 shares of common stock to its principal stockholder, Adia S.A., at a price based on the current market price. The sale will raise Adia S.A.'s ownership in the company to 74.7 pct from 72.7 pct, Adia said. The company also said it intends to use proceeds from the stock sale to retire debt, for working capital and for general corporate purposes. Reuter  13-MAR-1987 15:22:36.13 earn usa F f0268reute s f BC-MET-PRO-CORP-<MPR>-TO 03-13 0024  MET-PRO CORP <MPR> TO PAY REGULAR DIVIDEND HARLEYSVILLE, Pa., March 13 - Qtrly 15 cts vs 15 cts prior Pay May Eight Record April 24 Reuter  13-MAR-1987 15:24:00.88 earn usa F f0270reute h f BC-AILEEN-INC-<AEE>-1SR 03-13 0028  AILEEN INC <AEE> 1SR QTR JAN 31 LOSS NEW YORK, March 13 - Shr loss 30 cts vs loss 20 cts Net loss 1,553,000 vs loss 1,031,000 Revs 10.0 mln vs 8,696,000 Reuter  13-MAR-1987 15:25:16.54 usa A RM f0271reute r f BC-INT'L-GAME-TECHNOLOGY 03-13 0065  INT'L GAME TECHNOLOGY <IGAM> TO SELL DEBT NEW YORK, March 13 - International Game Technology said it filed with the Securities and Exchange Commission a registration statement covering a 35 mln dlr issue of senior notes due 1995 and a 25 mln dlr issue of convertible senior subordinated debentures due 2002. The company named Drexel Burnham Lambert Inc as sole manager of the offerings. Reuter  13-MAR-1987 15:32:32.81 earn usa F f0285reute u f BC-resending 03-13 0066  WOLVERINE WORLD WIDE INC <WWW> 4TH QTR LOSS ROCKFORD, MICH., March 13 - Shr loss six cts vs profit 55 cts Net loss 414,000 vs profit 3,936,000 Sales 109.4 mln vs 126.8 mln Year Shr loss 1.75 dlrs vs profit 55 cts Net loss 12,589,000 vs profit 3,965,000 Sales 341.7 mln vs 389.5 mln NOTE: Year results include 14.0 mln dlr restructuring charge in 2nd Qtr of 1986 Reuter  13-MAR-1987 15:32:42.51 usa F f0286reute r f BC-MEAD-<MEA>-FILES-150 03-13 0094  MEAD <MEA> FILES 150 MLN DLR SHELF REGISTRATION DAYTON, Ohio, March 13 - Mead Corp said it filed a shelf registration with the Securities and Exchange Commission covering potential debt securities offerings of up to 150 mln dlrs. It said the underwriters for this offerings may include Smith Barney, Harris Upham and Co Inc, Goldman Sachs and Co and/or Salomon Brothers Inc. Mead said proceeds will be used to retire short-term debt, a portion of which was incurred to finance part of the recent acquisitions of Ampad Corp and Zellerbach Distribution Group. Reuter  13-MAR-1987 15:33:15.31 graincorn usamexico C G f0287reute f f BC-ussr-export-sale 03-13 0012  ******U.S. EXPORTERS REPORT 122,000 TONNES CORN SOLD TO MEXICO FOR 1986/87 Blah blah blah.  13-MAR-1987 15:34:07.21 earn usa F f0290reute r f BC-HURCO-COMPANIES-INC-< 03-13 0036  HURCO COMPANIES INC <HURC> FIRST QTR NET INDIANAPOLIS, March 13 - Shr profit three cts vs loss 18 cts Net profit 124,000 vs loss 370,000 Rev 11.3 mln vs 11.7 mln Avg shares 3,673,000 vs 2,368,000 Reuter  13-MAR-1987 15:38:11.97 usa F f0295reute r f BC-ALCIDE'S-<ALCD>-SHELF 03-13 0036  ALCIDE'S <ALCD> SHELF REGISTRATION EFFECTIVE NORWALK, Conn., March 13 - Alcide Corp said its shelf registration of 4,500,000 shares of common has been declared effective by the Securities and Exchange Commission. Reuter  13-MAR-1987 15:39:02.46 acq usa F f0298reute r f BC-MAXTOR-<MXTR>-AGREES 03-13 0107  MAXTOR <MXTR> AGREES TO ACQUIRE U.S. DESIGN SAN JOSE, Calif., March 13 - Maxtor Corp and U.S. Design Corp <USDC>, said they reached definitive agreement covering the acquisition of U.S. Design by Maxtor. They said the arrangement, which is subject to a number of conditions including U.S. Design shareholder approval, calls for Maxtor to issue 12 mln dlrs worth of its own common stock in exchange for all of U.S. Design. The number of Maxtor shares to be issued will be determined by the average closing price of Maxtor stock over the 10 trading day period prior to the day the acquisition becomes effective, the companies also said. Reuter  13-MAR-1987 15:39:21.46 earn usa F f0299reute s f BC-SHARED-MEDICAL-SYSTEM 03-13 0024  SHARED MEDICAL SYSTEMS CORP <SMED> SETS PAYOUT MALVERN, Pa., March 13 - Qtly div 18 cts vs 18 cts prior Pay April 15 Record March 31 Reuter  13-MAR-1987 15:39:34.41 usa F f0300reute r f BC-INTERNATIONAL-LEASE-F 03-13 0064  INTERNATIONAL LEASE FINANCE <ILFC> PICKS ENGINE EVENDALE, Ohio, March 13 - International Lease Finance Corp said it picked the CFM International CFM56-5 high bypass turbofan engine to power its three new Airbus Industries A320 aircraft. International Lease said it is negotiating to buy up to 27 more A320s. Initial aircraft deliveries are planned for 1991, the company said. Reuter  13-MAR-1987 15:40:26.67 usa A f0301reute d f BC-JWP-<JWP>-SELLS-30-ML 03-13 0053  JWP <JWP> SELLS 30 MLN DLRS OF NOTES LAKE SUCCESS, N.Y., March 13 - JWP Inc said it sold 30 mln dlrs principal amount of its 9.25 pct senior notes due 1996 to certain institutional lenders. The company said about 15 mln dlrs of the proceeds will be used to pay debt and the balance for general corporate purposes. Reuter  13-MAR-1987 15:41:03.47 F RM f0302reute f f BC-******S/P-UPGRADES-UN 03-13 0010  ******S/P UPGRADES UNION CARBIDE CORP'S 1.2 BILLION DLRS OF DEBT Blah blah blah.  13-MAR-1987 15:41:10.37 RM f0303reute f f BC-ELECTRICITE-DE-FRANCE 03-13 0014  ******ELECTRICITE DE FRANCE SAYS IT WILL LAUNCH EURO-COMMERCIAL PAPER PROGRAM ON MONDAY Blah blah blah.  13-MAR-1987 15:41:31.04 usa F f0304reute d f BC-STORAGE-TECH-<STK>-IN 03-13 0104  STORAGE TECH <STK> IN DISCUSSIONS WITH IRS VAIL, Colo., March 13 - Storage Technology Corp said it is holding dicussions with the Internal Revenue Service that could end their dispute over the amount of back taxes owed by the company. "We are currently pursuing discussions with the IRS that could lead to a final solution," Stephen G. Jerritts, president and chief operating officer said. "Simultaneously, we are taking all necessary actions to try to expedite the court appeal process, resolve these issues and allow final court approval of the plan of reorganization, by our target date of June 30, 1987," he said. Last year, Storage Technology's bankruptcy court ruled that the company owed about 25 mln dlrs in taxes, an amount much lower than the IRS is seeking. The IRS has appealed the court's decision. Jerritts also said his company and <Siemens AG> of West Germany extended an agreement under which Storage Technology distributes a laser printer made by Siemens. Reuter  13-MAR-1987 15:41:46.52 usa C M f0306reute d f BC-U.S.-EARLY-MARCH-CAR 03-13 0128  U.S. EARLY MARCH CAR SALES OFF 2.2 PCT DETROIT, March 13 - Retail sales of new cars by U.S. automakers eased 2.2 pct in early March to the weakest levels since 1983, with industry giant General Motors Corp down 9.3 pct while Ford Motor Co and Chrysler Corp both had gains. The decline by GM continued its trend of weaker sales since the beginning of the 1987 model year, which has forced the world's biggest corporation to cut its car production several times through temporary and permanent layoffs at various plants. Consumer incentives apparently had some success, analysts said, as the seasonally adjusted annualized sales rate improved to 7.5 mln compared with about 7.0 mln in late February. The eight domestic carmakers sold 8.2 mln units during 1986. Reuter  13-MAR-1987 15:42:09.99 usa F f0310reute h f BC-CAPITAL-INVESTMENTS-F 03-13 0038  CAPITAL INVESTMENTS FORMS UNIT BOCA RATON, Fla., March 13 - <Capital Investments Development Corp> said it formed Bradford-Taylor Clearing House Inc, a unit that will compile mailing lists for use by the direct mail industry. Reuter  13-MAR-1987 15:45:20.31 earn usa F f0315reute d f BC-WEIGH-TRONIX-INC-<WGH 03-13 0047  WEIGH-TRONIX INC <WGHT> 4TH QTR NET FAIRMONT, MINN., March 13 - Shr 18 cts vs 16 cts Net 348,298 vs 308,927 Sales 4,166,750 vs 3,740,970 Year Shr 72 cts vs 52 cts Net 1,409,867 vs 1,020,096 Sales 16.5 mln vs 15.0 mln Avg shrs 1,974,529 vs 1,956,214 Reuter  13-MAR-1987 15:45:27.49 uk RM F A f0316reute r f BC-GOLDMAN-SACHS-GIVEN-B 03-13 0099  GOLDMAN SACHS GIVEN BOGUS EXXON BONDS IN TRADE LONDON, March 13 - Goldman Sachs International Corp received forged bonds of a unit of Exxon Corp <XON> in a trade, a spokesman for Goldman Sachs and Co Inc said in a telephone conversation from New York. He said the transaction left Goldman Sachs International with an exposure of about 2.2 mln dlrs but that it had insurance to cover the loss. The spokesman was responding to an enquiry about an item in the London "Standard" newspaper, which said Goldman Sachs "is feared to be the victim of a new multi-million pound City scandal." The newspaper also said, "The firm (Goldman Sachs) is believed to be the paying agent for some 900 bonds issued in the name of oil giant Exxon which were deposited at banks in Brussels and have now been found to be forgeries." The spokesman said that the bonds were delivered to the firm by a man working on behalf of a third party. He said it wasn't until the bonds were cleared through Euro-clear (a major clearing house for the eurobond market) that it was discovered they were forgeries. The spokesman also said he believed that the intermediary had been apprehended by police. However, a spokesman for the City of London police said he was unaware of such an arrest and could neither confirm nor deny it. Last Friday, Exxon Corp said forgeries of a 20-year zero coupon euronote issued by its Exxon Capital Corp subsidiary have been discovered in the European market. It also said Morgan Guaranty Trust Co was the fiscal agent and paying agent and that Morgan, Euro-clear and Cedel (another major clearing system) and police in London and Brussels were investigating the case. Reuter  13-MAR-1987 15:45:35.38 livestockcarcass usa ec F f0317reute d f BC-U.S.-MEAT-GROUP-TO-FI 03-13 0109  U.S. MEAT GROUP TO FILE TRADE COMPLAINTS WASHINGTON, March 13 - The American Meat Institute, AME, said it intended to ask the U.S. government to retaliate against a European Community meat inspection requirement. AME President C. Manly Molpus also said the industry would file a petition challenging Korea's ban of U.S. meat products. Molpus told a Senate Agriculture subcommittee that AME and other livestock and farm groups intended to file a petition under Section 301 of the General Agreement on Tariffs and Trade against an EC directive that, effective April 30, will require U.S. meat processing plants to comply fully with EC standards. Reuter  13-MAR-1987 15:47:27.24 uk A RM f0322reute u f BC-EDF-TO-LAUNCH-EURO-CP 03-13 0116  EDF TO LAUNCH EURO-CP PROGRAM MONDAY LONDON, March 13 - <Electricite de France> (EdF) will make its first offering of Euro-commercial paper in the international market on Monday, EdF chief financial officer Daniel Lallier said in a telephone call from Paris. The program was announced in late January and dealers expect the company will be pushing to maintain its ability to obtain some of the finest terms available in the international markets. Lallier did not say how much would be offered, although he has noted that EDF would be cautious because it believes the market is still in its infancy. In January he said EdF may not issue more than 300 to 500 mln dlrs of paper this year. EdF plans to oversee the program itself, with Goldman Sachs International Corp, Morgan Guaranty Ltd and Salomon Brothers International Ltd acting as dealers for the general program, which will be aimed at institutional and retail investors. Union Bank of Switzerland will act as dealer for a specific program, which is aimed at smaller retail investors. Reuter  13-MAR-1987 15:47:50.80 graincorn usa cbt C G f0324reute b f BC-/CBT-TRADERS-SAY-U.S. 03-13 0138  CBT TRADERS SAY U.S. CONSERVATION SIGNUP NEUTRAL CHICAGO, March 13 - The 11,254,837 acres of highly erodable farmland submitted to the U.S. Department of Agriculture for the conservation reserve program was within trade guesses of 10-12 mln and should have an overall neutral impact on grain and soybean prices Monday, grain traders said. Farmers enrolled 1,894,764 acres of corn base acreage in the conservation program to take advantage of a corn bonus rental payment that was offered by the USDA, which may underpin new crop futures, they said. New crop corn prices firmed earlier this week on ideas of a large sign-up in the program. But traders noted that the poor yielding acres being set-aside will result in only a modest decrease in final production figures, since farmers will concentrate on high yielding land. Of a total 11,254,837 erodoble acres submitted, usda accepted 10,572,402 acres into the program at an average rental payment of 51.17 dlrs per acre. Farm land signed up to date now totals 19,488,587 acres. Reuter  13-MAR-1987 15:48:34.01 earn usa F f0330reute d f BC-MONARCH-AVALON-INC-<M 03-13 0064  MONARCH AVALON INC <MAHI> 3RD QTR JAN 31 LOSS BALTIMORE, March 13 - Shr loss 11 cts vs profit four cts Net loss 199,000 vs profit 81,000 Rev 1.9 mln vs 2.5 mln Nine months Shr loss 14 cts vs profit 15 cts Net loss 261,000 vs profit 273,000 Rev 6.4 mln vs 7.6 mln NOTE: Per share information adjusted for three-for-two stock split on January 31, 1986. Reuter  13-MAR-1987 15:52:33.91 canada E RM f0336reute r f BC-bcresources 03-13 0102  B.C. RESOURCES HAS NEW 360 MLN DLR CREDIT LINE VANCOUVER, British Columbia, March 13 - British Columbia Resources Investment Corp said it successfully concluded refinancing negotiations with bankers for a new 360 mln dlr restructured credit facility. The credit line will be in place for four years to March 31, 1991, but is extendable up to 10 years under certain circumstances which were not specified by the company. B.C. Resources said subsidiaries Westar Timber and Westar Petroleum have settled revised lending agreements, but debt discussions regarding subsidiary Westar Mining are continuing. Reuter  13-MAR-1987 15:53:40.40 argentina machinea RM F A f0338reute u f BC-ARGENTINE-DEBT-TALKS 03-13 0115  ARGENTINE DEBT TALKS DIFFICULT - CENTRAL BANK BUENOS AIRES, March 13 - Central Bank President Jose Luis Machinea said negotiations with creditor banks on Argentina's 30 billion dlr private sector foreign debt were difficult. "There is considerable divergence with the banks. We must try to get them to lower the spreads," Machinea told Reuter. He said negotiations with the steering committee for the country's creditor banks in New York would not end next week. Machinea leaves for New York tomorrow with Treasury Secretary Mario Brodersohn to complete Argentina's team at negotiations with the steering committee for a 2.15 biilion dlr loan to see the country through 1987. Machinea said Argentina had World Bank support. He said he and Economy Minister Juan Sourrouille had discussed Argentina's loan request with World Bank Vice-President David Knox, who is currently in Buenos Aires. Argentina is aiming at four pct growth in 1987 and has said this target is not negotiable. It has indicated that it would not put payment of interest due on its foreign debt ahead of its growth target if the loan was not granted. The United States and 12 other industrial nations granted Argentina a 500 mln dlr bridge which was received this week. Talks on the 2.15 billion dlr lona began in January. Reuter  13-MAR-1987 15:54:21.09 crudegasnat-gaswpi usa C M f0339reute r f BC-U.S.-PRODUCER-ENERGY 03-13 0116  U.S. PRODUCER ENERGY PRICES RISE IN FEBRUARY WASHINGTON, March 13 - Prices of wholesale finished energy goods in the U.S. rose 4.0 pct in February after a 9.8 pct rise in January, the Labor Department said. The Producer Price Index for finished energy goods fell by 20.9 pct in the past 12 months. Heating oil prices rose 3.0 pct in February after a 18.0 pct rise in January, the department said. Gasoline prices rose by 5.5 pct last month after a 15.7 pct January rise, the department said. Natural gas prices rose 1.8 pct after a 4.2 pct rise in January. Crude oil prices rose 4.4 pct in February, after a 19.7 pct January rise and were off 21.3 pct from the year ago level. Reuter  13-MAR-1987 15:55:47.33 usa A RM f0342reute u f BC-UNION-CARBIDE-<UK>-DE 03-13 0103  UNION CARBIDE <UK> DEBT UPGRADED BY S/P NEW YORK, March 13 - Standard and Poor's Corp said it upgraded 1.2 billion dlrs of debt of Union Carbide Corp and its affiliate, DCS Capital Corp. Raised were the pair's senior debt to BB-plus from BB-minus. Union Carbide's subordinated debt was upgraded to BB-minus from B. S and P said the action reflected several positive factors which emerged over the past year, including a better balance of supply and demand in the chemical industry. Union Carbide has also benefitted from the turnaround in foreign exchange rates and lower feedstock costs, the agency noted. Standard and Poor's said the company's asset sales, and subsequent use of the proceeds for debt reduction, exceeded the corporate plan of a year ago. The rating agency also pointed out that Union Carbide's successful refinancing of more than 2.5 billion dlrs of long-term debt has resulted in a substantially lower interest burden. Reuter  13-MAR-1987 15:56:03.81 usa F f0343reute u f BC-U.S.-EARLY-MARCH-CAR 03-13 0095  U.S. EARLY MARCH CAR SALES OFF 2.2 PCT By Richard Walker, Reuters DETROIT, March 13 - Retail sales of new cars by U.S. automakers eased 2.2 pct in early March to the weakest levels since 1983, with industry giant General Motors Corp <GM> down 9.3 pct. Ford Motor Co <F> and Chrysler Corp <C> both had gains. The decline by GM continued its trend of weaker sales since the beginning of the 1987 model year, which has forced the world's biggest corporation to cut its car production several times through temporary and permanent layoffs at various plants. Relatively weaker sales by all of the Detroit Big Three carmakers have compelled the companies to offer a string of sales incentives including cash rebates and below-market interest loans in an effort to reignite the market. Incentives apparently had some success, analysts said, as the seasonally adjusted annualized sales rate improved to 7.5 mln compared with about 7.0 mln in late February. The eight domestic carmakers sold 8.2 mln units during 1986. GM said its sales of domestic-built cars in the March 1-10 period declined to 97,487 from 104,952 a year ago while truck sales rose 14.4 pct to 40,131 from 35,081. There were eight selling days in each period. Despite the lower car sales, the giant automaker had a bright spot as its Chevrolet division, which is launching a national sales campaign this month for its new Corsica and Beretta compact cars, was up almost 21 pct when only domestic-built cars were counted. GM's Buick division was also up, by 11.4 pct, while Cadillac was down 7.8 pct, Pontiac was off 10.8 pct and Oldsmobile plunged 41 pct. GM also showed an improvement in its market share to 53.6 pct from 48.1 pct in late February, which analysts said was partly due to the increasing sales for the new Chevrolets. Meanwhile, Ford said its car sales rose 5.9 pct to 50,407 compared with 47,592 a year ago while truck sales gained by 12.6 pct to 35,814 from 31,811. Number three Chrysler's car sales gained to 0.4 pct to 25,286 from 25,191 while its truck sales gained 15 pct to 15,565 from 13,585. The truck sales were a record for the period, the company said. Among the smaller makers, Honda <HMC> said domestic car sales rose 16 pct to 4,394 from 3,786 and Volkswagen of America rose 4.9 pct to 849 from 809. American Motors Corp <AMO> fell 57 pct to 760 from 1,780 for cars but rose 18 pct in jeep sales to 4,500 from 3,800. Nissan <NSANY> car sales rose 19.1 pct to 2,137 from 1,794 and gained 3.6 pct on trucks to 1,686 from 1,628. Toyota <TOYOY> said it sold 500 U.S.-built cars compared with none a year ago. Reuter  13-MAR-1987 15:56:39.68 cotton usa C G f0344reute u f BC-/U.S.-COTTON-CERTIFIC 03-13 0137  U.S. COTTON CERTIFICATE EXPIRATION DATE EXTENDED WASHINGTON, March 13 - Expiration dates on upland cotton certificates issued under the 1986 upland cotton program are being extended, the Agriculture Department announced. The certificates are being extended because of a shortage of Commodity Credit Corporation inventory available for exchange with certificates, USDA undersecretary Danial Amstutz said. Presently, upland cotton commodity certificates expire nine months from the last day of the month of issuance. Under the new procedure, all current outstanding and all new upland cotton certificates issued under the 1986 upland cotton program will have an expiration date of either February 29, 1988, or nine months from the last day of the month in which the certificate is issued, whichever is later. Reuter  13-MAR-1987 15:59:24.64 usa A RM f0348reute u f BC-S/P-DOWNGRADES-MICHIG 03-13 0113  S/P DOWNGRADES MICHIGAN GENERAL <MGL> DEBT NEW YORK, March 13 - Standard and Poor's Corp said it cut to C from CCC-minus Michigan General Corp's 110 mln dlrs of 10-3/4 pct senior subordinated debentures due 1998. S and P said if Michigan General's exchange offer for the debentures is not successful, the firm anticipates it will default on the June 1 interest payment and will have to seek protection from creditors under the Federal Bankruptcy Act. The exchange offer faces numerous obstacles, including the tender of at least 90 pct of the debentures and additional financing from lenders, S and P noted. The company's implied senior debt rating is CCC-minus. Reuter  13-MAR-1987 15:59:41.96 earn italy RM f0349reute u f BC-BNL-ANNOUNCES-NET-198 03-13 0083  BNL ANNOUNCES NET 1986 PROFITS IN BANK SECTOR ROME, March 13 - State-owned <Banca Nazionale del Lavoro BNL> said 1986 profits for its banking activities equalled 155 billion lire against 146 billion lire in 1985. Consolidated 1986 results for BNL, which also has interests in tourism, public works, industrial credit and other sectors, are expected to be announced later this year. The results for the banking sector are to be presented at a shareholders meeting scheduled for April 29. Reuter  13-MAR-1987 16:00:21.17 earn usa F f0353reute d f BC-APPLIED-DNA-SYSTEMS-I 03-13 0069  APPLIED DNA SYSTEMS INC <ADNA> 4TH QTR LOSS NEW YORK, March 13 - Shr loss one ct vs nil Net loss 148,007 vs loss 58,863 Revs 198,919 vs 133,071 Avg shrs 7,476,433 vs 6,633,989 Year Shr loss three cts vs loss six cts Net loss 230,949 vs 424,719 Revs 666,626 vs 509,971 NOTE: Amounts include losses of a 50 pct owned scientific development affiliate, Analytical Biosystems Corp. Reuter  13-MAR-1987 16:05:31.61 acq usa F Y f0366reute r f BC-QED 03-13 0094  OILMAN HAS 8.7 PCT OF QED EXPLORATION <QEDX> WASHINGTON, March 13 - Kansas oilman Nicholas Powell told the Securities and Exchange Commission he has acquired 195,000 shares of QED Exploration Inc, or 8.7 pct of the total outstanding common stock. Powell, who heads Prairie Resources Corp and Mack C. Colt Inc, both Kansas oil and gas exploration companies, said he bought the stock for investment purposes. Powell, who said he has already spent 609,831 dlrs on his QED stock, said he plans to buy more shares as long as he considers them to be undervalued. Reuter  13-MAR-1987 16:05:38.71 usa F f0367reute d f BC-TEXAS-AIR-<TEX>-NAMES 03-13 0052  TEXAS AIR <TEX> NAMES BRITT AIRWAYS PRESIDENT HOUSTON, March 13 - Texas Air Corp said it named Norman McInnis as president of its Britt Airways unit, succeeding Bill Britt, who retired March one. McInnis, former president of Royale Airlines, most recently was a consultant to the commuter airline industry. Reuter  13-MAR-1987 16:05:59.28 earn E F f0370reute b f BC-labatt 03-13 0009  ******JOHN LABATT LTD 3RD QTR SHR DILUTED 32 CTS VS 30 CTS Blah blah blah.  13-MAR-1987 16:06:21.90 usa F f0373reute d f BC-ARMATRON-<ART>-NEGOTI 03-13 0043  ARMATRON <ART> NEGOTIATES NEW CREDIT LINE MELROSE, Mass., March 13 - Armatron International Inc said it negotiated a new seasonal line of credit with three lenders for 10 mln dlrs for working capital requirements to support its lawn and garden product line. Reuter  13-MAR-1987 16:06:58.01 earn usa F f0375reute d f BC-LIFESTYLE-RESTAURANTS 03-13 0049  LIFESTYLE RESTAURANTS INC <LIF> 1ST QTR JAN 24 NEW YORK, March 13 - Shr loss 31 cts vs loss eight cts Net loss 1,780,000 vs loss 449,000 Revs 13.9 mln vs 17.8 mln NOTE: Current 1st qtr loss included a gain of 870,000 dlrs and 70,000 dlrs from the sale of restaurant leases. Reuter  13-MAR-1987 16:07:06.10 usa A RM f0376reute u f BC-TREASURY-BALANCES-AT 03-13 0085  TREASURY BALANCES AT FED ROSE ON MARCH 12 WASHINGTON, March 13 - Treasury balances at the Federal Reserve rose on March 12 to 3.038 billion dlrs on March 12 from 2.715 billion dlrs the previous business day, the Treasury said in its latest budget statement. Balances in tax and loan note accounts fell to 7.623 billion dlrs from 8.870 billion dlrs on the same respective days. The Treasury's operating cash balance totaled 10.661 billion dlrs on March 12 compared with 11.586 billion dlrs on March 11. Reuter  13-MAR-1987 16:07:38.14 earn usa F f0379reute r f BC-SIERRA-HEALTH-SERVICE 03-13 0051  SIERRA HEALTH SERVICES INC <SIE> 4TH QTR LOSS LAS VEGAS, Nev., March 13 - Shr loss 52 cts vs profit six cts Net loss 2,943,000 vs profit 334,000 Revs 33.5 mln vs 18.5 mln Year Shr loss 1.57 dlrs vs profit 16 cts Net loss 8,781,000 vs profit 792,000 Revs 116.0 mln vs 56.5 mln Reuter  13-MAR-1987 16:08:43.39 earn usa F f0384reute d f BC-FIRECOM-INC-<FRCM>-3R 03-13 0049  FIRECOM INC <FRCM> 3RD QTR JAN 31 LOSS NEW YORK, March 13 - Shr loss two cts vs profit two cts Net loss 104,874 vs profit 90,470 Sales 3,154,673 vs 1,666,313 Nine mths Shr loss one cent vs profit four cts Net loss 39,169 vs profit 159,784 Sales 8,250,003 vs 4,665,553 Reuter  13-MAR-1987 16:09:02.87 ipi brazil RM A f0385reute r f BC-BRAZIL-INDUSTRIAL-GRO 03-13 0106  BRAZIL INDUSTRIAL PRODUCTION SLOWED IN JANUARY RIO DE JANEIRO, March 13 - Industrial output in January was 6.09 pct above the same 1986 month after rising 6.71 pct in December, Brazilian Geography and Statistics Institute figures show. The result is in line with the declining trend in the growth rate since October, the Institute said. In the 12 months to end-January industrial production was 10.48 pct above the 12 months to end-January last year, while in calendar 1986 output was 10.89 pct above 1985. The biggest output rises in the 12 months to end-January were 23.68 pct in pharmaceuticals and 22.12 pct in machinery. Reuter  13-MAR-1987 16:10:20.88 earn usa F f0389reute s f BC-WHEELING-AND-LAKE-ERI 03-13 0045  WHEELING AND LAKE ERIE RAILWAY CO <WLE> DIV ROANAKE, Va., March 13 - Qtly div 1.4375 dlrs vs 1.4375 dlrs Pay May 1 Record April 3 Note: Dividend paid to all shareholders other than Norfolk Southern Corp's <NSC> Norfolk and Western Railway Co. Reuter  13-MAR-1987 16:10:59.71 earn usa F f0391reute s f BC-GENERAL-CINEMA-CORP-< 03-13 0027  GENERAL CINEMA CORP <GCN> CLASS B DIVIDEND CHESTNUT HILL, Mass., March 13 - Qtly div class B 13.5 cts vs 13.5 cts Pay April 30 Record April 9 Reuter  13-MAR-1987 16:11:18.64 earn canada E F f0393reute u f BC-labatt 03-13 0062  <JOHN LABATT LTD> 3RD QTR JAN 31 NET TORONTO, March 13 - Shr 36 cts vs 31 cts Shr diluted 32 cts vs 30 cts Net 26,158,000 vs 21,798,000 Revs 1.05 billion vs 844.2 mln Nine mths Shr 1.28 dlrs vs 1.22 dlrs Shr diluted 1.15 dlrs vs 1.08 dlrs Net 92,779,000 vs 77,971,000 Revs 3.16 billion vs 2.70 billion Avg shrs 72.4 mln vs 64.0 mln Reuter  13-MAR-1987 16:12:28.42 grainwheat usasudan C G f0394reute u f BC-SUDAN-RECEIVES-50-MLN 03-13 0119  SUDAN RECEIVES 50 MLN DLRS IN PL480 AUTHORITY WASHINGTON, March 13 - Authorizations to purchase 50 mln dlrs worth of U.S. wheat and wheat flour under Public Law 480 were issued to Sudan today, the Agriculture Department said. The authorization provides for 34 mln dlrs -- about 309,000 tonnes -- worth of wheat, grade U.S. number two or better (except durum which shall be number three or better). It also provides for 16 mln dlrs -- about 73,000 tonnes -- worth of wheat flour. The contracting period for both commodities is March 20 through August 31, 1987. The delivery period for wheat is March 20 through September 30, 1987 and for wheat flour is April 10 through SEptember 30, 1987, USDA said. Reuter  13-MAR-1987 16:14:48.69 trade usa F A f0399reute r f BC-TRADE-BILL-TO-CHANGE 03-13 0139  TRADE BILL TO CHANGE AGRICULTURE TRADE LAWS WASHINGTON, March 13 - The House Ways and Means Committee is moving toward passage of a trade bill that sponsors said was intended to help open foreign markets to U.S. agricultural goods and to modify some U.S. agricultural trade laws. The trade subcommittee voted to require President Reagan to take into account the potential harm to U.S. agricultural exports of any trade retaliation he might impose for foreign unfair trade practices against other domestic industries. The bill would allow U.S. agricultural producers to seek government monitoring of imports if there is a reasonable chance the industry would be harmed by an import surge. The full Ways and Means Committee is to consider the bill next week and congressional sources said they expect it will be approved. In investigations involving a processed agricultural product, trade associations of processors or producers would have to petition for relief from foreign dumping or unfair duties. The bill sets out U.S. trade negotiating objectives for the Uruguay round of talks under the General Agreement on Tariffs and Trade. It would seek fair trade in agriculture, seek to discipline restrictive or trade distorting import and export practices, to eliminate tariffs, subsidies, quotas and non-tariff barriers. President Reagan's authority to negotiate a new GATT agreement would be extended through January 1993 and authority to negotiate a free trade zone with Canada would be extended through January 3, 1991. The bill extends Reagan's authority to negotiate an international coffee agreement through October 31, 1989. It allows a refund of import duties paid on raw sugar imported from November 1, 1977 to March 31, 1985 for production of sugar or products containing sugar and destined for re-export. The export of the sugar or products must occur before Octoer 1, 1991. Presently, to qualify for the refund the sugar must be processed within three years after import and exported within five years. Agriculture would also benefit from more rapid decisions in complaints of unfair foreign trade practices or injury from imports. Reuter  13-MAR-1987 16:15:15.79 earn usa F f0400reute r f BC-AMERICAN-CITY-<AMBJ> 03-13 0077  AMERICAN CITY <AMBJ> SETS INITIAL PREFERRED DIV KANSAS CITY, Mo. - March 13 - American City Business Journals Inc said it declared an initial dividend of 15.4 cts a share on its recent issue of 1.6 mln shares of convertible exchangeable preferred stock. The dividend is payable March 31 to shareholders of record March 20, American City said, adding that future dividends will be paid on a quarterly basis. The preferred stock was issued on February 23. Reuter  13-MAR-1987 16:16:39.20 money-supply usa RM V f0405reute f f BC-******U.S.-BUSINESS-L 03-13 0011  ******U.S. BUSINESS LOANS RISE 377 MLN DLRS IN MARCH 4 WEEK, FED SAYS Blah blah blah.  13-MAR-1987 16:17:16.42 money-supply usa RM V f0407reute b f US-BUSINESS-LOAN-FULLOUT 03-13 0057  U.S. BUSINESS LOANS RISE 377 MLN DLRS WASHINGTON, March 13 - Business loans on the books of major U.S. banks, excluding acceptances, rose 377 mln dlrs to 279.085 billion dlrs in the week ended March 4, the Federal Reserve Board said. The Fed said that business loans including acceptances increased 484 mln dlrs to 281.546 billion dlrs. Reuter  13-MAR-1987 16:22:34.56 wpigasnat-gascrudeheat usa F A Y f0420reute r f BC-U.S.-PRODUCER-ENERGY 03-13 0099  U.S. PRODUCER ENERGY PRICES RISE IN FEBRUARY WASHINGTON, March 13 - Prices of wholesale finished energy goods in the United States were up in February, rising by 4.0 pct after a 9.8 pct rise in January, the Labor Department said. The Producer Price Index for finished energy goods has fallen 20.9 pct in the past 12 months. Heating oil prices rose 3.0 pct in February after a 18.0 pct rise in January, the department said. Gasoline prices rose by 5.5 pct last month after a 15.7 pct January rise, the department said. Natural gas prices rose 1.8 pct after a 4.2 pct rise in January. Energy goods at the intermediate stage of processing rose 2.7 pct in February after rising 3.5 pct in January and were down 16.1 pct over the past 12 months, the Labor Department said. Prices for crude energy goods, such as crude oil, coal and gas at the wellhead, rose 2.6 pct last month after a 10.0 pct January rise. They were down 11.6 pct from February 1986, the department said. At the intermediate stage, liquefied petroleum gas prices rose 10.1 pct last month after a 5.0 pct January rise and were 41.0 pct below prices a year earlier, the department said. Residual fuel prices rose 16.7 pct in February after a 13.4 pct rise a month earlier and were off 17.4 pct in 12 months. Electric power prices fell 0.3 pct last month, after a 1.3 pct January decline, and were down 3.6 pct from a year ago. Crude oil prices rose 4.4 pct in February, after a 19.7 pct January rise and were off 21.3 pct from the year ago level. Prices of natural gas at the wellhead rose 1.8 pct in February after rising 4.2 pct a month earlier and were 14.8 pct lower than they were 12 months earlier, the department said. Coal costs were down 0.3 pct last month after rising 0.4 pct in January and were down 0.8 pct from a year ago. Reuter  13-MAR-1987 16:23:07.43 earn F f0423reute b f BC-******WEYERHAEUSER-CO 03-13 0012  ******WEYERHAEUSER SAID IT SEES SIGNIFICANT INCREASES IN EARNINGS IN 1987 Blah blah blah.  13-MAR-1987 16:26:35.20 usaparaguay RM A f0431reute r f BC-BANK-OF-AMERICA-<BAC> 03-13 0105  BANK OF AMERICA <BAC> SEEKS TO QUIT PARAGUAY NEW YORK, March 13 - BankAmerica Corp is seeking a buyer for its branch in Asuncion, Paraguay, a spokesman in Miami for the bank holding company said. "We are in ongoing negotiations for the sale of our Paraguay operations," the spokesman said. He declined to name the possible buyer. A sale of the Paraguayan operations, which employ about 80 people, would be consistent with Bank of America's strategy of concentrating its international efforts on wholesale banking, he added. The bank has sold operations in a number of countries recently, including Italy and Sri Lanka. Reuter  13-MAR-1987 16:27:23.99 usa F f0437reute r f '--GE-<GE>-GETS-474.5-ML 03-13 0034  GE <GE> GETS 474.5 MLN DLR CONTRACT WASHINGTON, March 13 - General Electric Co has received a 474.5 mln dlr contract for 172 F-110-GE-100 fighter jet engines and 32 other jet engines, the Air Force said. REUTER  13-MAR-1987 16:28:15.51 usa F f0441reute r f BC-GENERAL-HOST-<GH>-TO 03-13 0094  GENERAL HOST <GH> TO APPEAL COURT RULING STAMFORD, Conn., March 13 - General Host Corp said a federal district judge in Wichita, Kan., affirmed a preliminary 1984 ruling that the company's Amerian Salt Co unit polluted groundwater near a plant in Lyons, Kan. The company said it would appeal the ruling, which calls for actual damages of 3.1 mln dlrs and punitive damages of 10 mln dlrs. General Host believes it has strong grounds for a reversal of the ruling. It reiterated that it is not including a provision for losses in its financial statements. American Salt, part of General Host's AMS Industries Inc unit, has agreed with the State of Kansas to carry out an effective clean-up plan, the company said. In the current ruling, Federal Judge Cecil Miller affirmed his August 1984 preliminary ruling. The suit was brought in 1977 by a group of local landowners, a General Host spokesman said. Reuter  13-MAR-1987 16:29:46.00 usa F f0448reute d f BC-MOBIL-<MOB>-GETS-107. 03-13 0028  MOBIL <MOB> GETS 107.2 MLN DLR CONTRACT WASHINGTON, March 13 - Mobil Oil Corp has received a 107.2 mln dlr contract for jet fuel, the Defense Logistics Agency said. REUTER  13-MAR-1987 16:31:43.02 usa F f0454reute h f BC-IOMEGA-<IMOG>-PRESIDE 03-13 0060  IOMEGA <IMOG> PRESIDENT RESIGNS FOR NEW POST ROY, Utah, March 13 - Iomega Corp said its president, Gabriel Fusco, resigned as president to become chairman and chief executive officer of <Sequoia Systems>. Fusco was president and chief executive officer of Iomega between April 1983 and January 1987, and will remain on the company's board of directors. Reuter  13-MAR-1987 16:33:42.42 earn F f0461reute f f BC-varity 03-13 0010  ******VARITY EXPECTS TO REPORT 4TH QTR AND FULL-YEAR 1986 LOSS Blah blah blah.  13-MAR-1987 16:36:20.34 usa A RM f0467reute r f BC-GUILFORD-MILLS-<GFD> 03-13 0087  GUILFORD MILLS <GFD> TO SELL CONVERTIBLE DEBT NEW YORK, March 13 - Guilford Mills Inc said it filed with the Securities and Exchange Commission a registration statement covering a 60 mln dlr issue of convertible subordinated debentures. Proceeds will be used to repay certain indebtedness and increase working capital, as well as for general corporate purposes. Guilford Mills said it expects the issue will be offered later this month. The company named Bear, Stearns and Co as lead underwriter of the offering. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-006.sgm000066400000000000000000002253271154025176300231540ustar00rootroot00000000000000 17-MAR-1987 10:59:37.95 usa A RM Y f5264reute r f BC-VALERO-ENERGY-<VLO>-D 03-17 0110  VALERO ENERGY <VLO> DEBT UPGRADED BY MOODY'S NEW YORK, March 17 - Moody's Investors Service Inc said it upgraded Valero Energy Corp's 120 mln dlrs of debt. Moody's cited an improved leverage position that will result from Valero's sale of its Valero Natural Gas subsidiary to Valero Natural Gas Partners L.P., the partial sale of units of that partnership to the public, and the simultaneous sale of first mortgage bonds to institutional investors. Raised were Valero-backed tax-exempt economic development revenue bonds of Vincennes, Ind, to Baa-3 from B-1, Valero's subordinated debt to Ba-1 from B-2 and depository preferred stock to Ba-1 from B-2. Reuter  17-MAR-1987 11:01:59.32 usa F f5272reute r f BC-NL-<NL>-FILES-SUITS-A 03-17 0107  NL <NL> FILES SUITS AGAINST UNITED CATALYSTS HIGHTSTOWN, N.J., March 17 - NL Industries Inc's NL Chemicals Inc subsidiary said it filed two complaints against <United Catalysts Inc> for patent infringements and misappropriation of confidential information. NL said the patent infringement suit alleges that United's product, Thixogel DSS, infringes on NL's patent protecting its Bentone 128 product. NL said it filed the patent complaint in the United States District Court for the Western District of Kentucky, and the misappropriation complaint in Circuit Court, Jefferson County, Ky. United Catalysts is based in Louisville, Ky. Reuter  17-MAR-1987 11:02:40.56 acq usa A f5277reute d f BC-IRVING-TRUST-<V>-BUYS 03-17 0060  IRVING TRUST <V> BUYS GULF/WESTERN <GW> UNIT NEW YORK, March 17 - Irving Bank Corp said it bought the factoring division of Associates Commercial Corp, a unit of Gulf and Western Co Inc's Associates Corp of North America. The terms of the previously announced deal were not disclosed. It said the assets were transferred to Irving Commercial Corp. Reuter  17-MAR-1987 11:03:32.29 usa F f5283reute r f BC-DITTLER-BROTHERS-SEEK 03-17 0098  DITTLER BROTHERS SEEK LOTTERY INVESTIGATIONS ATLANTA, March 17 - Dittler Brothers called for investigations by the attorneys general of 24 states in connection with possible violation of state lottery laws by Bally Manufacturing Corp <BLY> and its subsidiary, Scientific Games. Dittler Brothers said it requested the states' law enforcement chiefs to investigate the companies following last week's determination by a court-appointed auditor that Scientific furnished erroneous information to those 24 state lottery officials. The states named are spread throughout the country. Reuter  17-MAR-1987 11:07:22.82 earn usa F f5302reute d f BC-AMRE-INC-<AMRE>-3RD-Q 03-17 0039  AMRE INC <AMRE> 3RD QTR JAN 31 NET DALLAS, MArch 17 - Shr five cts vs one ct Net 196,986 vs 37,966 Revs 15.5 mln vs 8,900,000 Nine mths Shr 52 cts vs 22 cts Net two mln vs 874,000 Revs 53.7 mln vs 28.6 mln Reuter  17-MAR-1987 11:07:47.91 grainwheat usa C G f5304reute u f BC-KANSAS-LEGISLATOR-TO 03-17 0112  KANSAS LEGISLATOR TO OFFER U.S. 0/92 BILL TODAY WASHINGTON, March 17 - U.S. Rep. Dan Glickman, D-Kan., chairman of the House Agriculture subcommittee on wheat, soybeans and feedgrains, said he would today introduce a bill to apply the so-called 0/92 concept to wheat and feedgrains producers. Glickman told Reuters the measure would allow 1987 winter wheat producers and 1988 feedgrains producers the possibility of receiving no less than 92 pct of their income support payments regardless of how much acreage they planted. He also said his bill would protect program participants from reduced income payments in the event market prices rose above the loan rate. Reuter  17-MAR-1987 11:09:12.10 uk RM f5308reute b f BC-C.-ITOH-FINANCE-(EURO 03-17 0112  C. ITOH FINANCE (EUROPE) ISSUES EUROBOND LONDON, March 17 - C. Itoh Finance (Europe) Ltd is issuing a 30 mln dlr deferred coupon eurobond, due March 30, 1992 and priced at 100.1 pct, Wako International (Europe) Ltd said as lead manager. From the third year the bonds will pay interest at a rate of four pct over six month London interbank borrowed rate (Libor). They will be issued in denominations of 50,000 dlrs and will be listed in Luxembourg. Fees of 0.1 pct comprise two basis points for management and underwriting and eight points for selling. Co-leads are Mitsui Trust International and Pru-Bache Securities International. Pay date is March 30. The transaction is guaranteed by C. Itoh and Co (Hong Kong) Ltd, Wako International said. REUTER  17-MAR-1987 11:09:38.54 usa F f5309reute r f BC-INTERNATIONAL-LEASE-< 03-17 0083  INTERNATIONAL LEASE <ILFC> SELLS TWO JETS BEVERLY HILLS, Calif., March 17 - International Lease Finance Corp said it sold two Boeing 737-200 aircraft and leased one 737-200 in two transactions valued at 28 mln dlrs. It said the sales will result in a pre-tax gain for its second fiscal quarter ending May 31. The two jets were sold for 18 mln dlrs to an investor group and the third was leased for five years to Pacific Western Airlines Ltd of Calgary, Alberta, International Lease said. Reuter  17-MAR-1987 11:10:08.50 usa F f5314reute r f BC-HITECH-ENGINEERING-<T 03-17 0057  HITECH ENGINEERING <THEX> COMPLETES STOCK SALE MCLEAN, Va., March 17 - HiTech Engineering Co said it completed the private sale of 200,000 shares of its common stock to its chairman and president, Francine Prokoski, for 37,500 dlrs. The company said the proceeds will be used to develop products under a contract with a private company. Reuter  17-MAR-1987 11:10:19.73 earn usa F f5316reute d f BC-PORTA-SYSTEMS-CORP-<P 03-17 0042  PORTA SYSTEMS CORP <PSI> 4TH QTR JAN 31 NET SYOSSET, N.Y., March 17 - Shr 10 cts vs 11 cts Net 547,000 vs 579,000 Sales 11.0 mln vs 11.1 mln Year Shr 46 cts vs 52 cts Net 2,500,000 vs 2,841,000 Sales 40.7 mln vs 40.5 mln Reuter  17-MAR-1987 11:14:30.93 usa F f5335reute r f BC-CALIFORNIA-ENERGY-<CE 03-17 0055  CALIFORNIA ENERGY <CECI> INITIAL OFFER STARTS SANTA ROSA, Calif., March 17 - California Energy Co Inc said an initial public offering of 1,900,000 common shares is underway at 7.50 dlrs each through underwriters led by Laidlaw Adams and Peck Inc. The geothermal power company said the offering is expected to close March 19. Reuter  17-MAR-1987 11:15:07.84 usa amex F f5338reute r f BC-DIVI-HOTELS-<DVH>-WAR 03-17 0027  DIVI HOTELS <DVH> WARRANTTRADE ON AMEX NEW YORK, March 17 - Divi Hotels NV of Aruba said its warrants have started trading today on the <American Stock Exchange>. Reuter  17-MAR-1987 11:15:13.82 earn F f5339reute f f BC-******FEDERATED-DEPAR 03-17 0012  ******FEDERATED DEPARTMENT STORES INC 4TH QTR SHR 3.64 DLRS VS 3.16 DLRS Blah blah blah.  17-MAR-1987 11:15:25.35 earn usa F f5340reute r f BC-<WARNACO-GROUP-INC>-E 03-17 0072  <WARNACO GROUP INC> EIGHT MTHS JAN THREE NET NEW YORK, March 17 - Oper net 46.6 mln Revs 392 mln 12 mths Oper net 65 mln vs 47.1 mln Revs 590 mln vs 591 mln NOTE: Eight months represents earnings following acquisition in May 1986 when company went private. Period ending Jan. 3, 1987 excludes 42.3 mln dlrs of interest expenses, 41.6 mln dlrs of acquisition adjusments, and 1.7 mln dlrs of income taxes. Reuter  17-MAR-1987 11:15:35.39 ukirelandusa RM f5341reute b f BC-BANK-OF-IRELAND-LAUNC 03-17 0099  BANK OF IRELAND LAUNCHES U.S. PAPER PROGRAM LONDON, March 17 - Bank of Ireland said it launched in the U.S. Market a commercial paper program for up to 200 mln dlrs, becoming the first Irish issuer of paper in that market. It said the first tranche of an undisclosed amount was sold today through Goldman Sachs and Co Inc and that the paper last week had received the top A-1/P-1 rating of Standard and Poor's Corp and Moody's Investors Service Inc, respectively. In a statement, the Bank of Ireland noted that the U.S. Paper market will provide it with a new source of funding. REUTER  17-MAR-1987 11:15:43.66 ussrusa james-baker worldbankimf A RM f5342reute b f BC-BAKER-SAYS-U.S.-OPPOS 03-17 0077  BAKER SAYS U.S. OPPOSES SOVIET BANK MEMBERSHIP WASHINGTON, March 17 - Treasury Secretary James Baker said the U.S. opposes Soviet membership of the World Bank or the International Monetary Fund. Baker told a House foreign affairs subcommittee, "I think our position is absolutely clear on that ... We do not support and will not support Soviet membership in the World Bank or the IMF." Baker said the U.S. position was "unqualified and unconditional." The secretary observed that he has written to congressman Jack Kemp, a New York Republican who is also a presidential contender, outlining the U.S. position. Baker was responding to a questioner who noted that World Bank President Barber Conable has in the past suggested future Soviet membership could take place. Ever since Soviet leader Mikhail Gorbachev suggested Soviet membership in the General Agreement on Tariffs and Trade -- which was also rejected -- there has been speculation Moscow was interested in joining the international institutions. Reuter  17-MAR-1987 11:16:02.24 earn usa F f5345reute d f BC-GANTOS-INC-<GTOS>-4TH 03-17 0053  GANTOS INC <GTOS> 4TH QTR JAN 31 NET GRAND RAPIDS, MICH., March 17 - Shr 43 cts vs 37 cts Net 2,276,000 vs 1,674,000 Sales 31.9 mln vs 23.9 mln Avg shrs 5.3 mln vs 4.5 mln Year Shr 90 cts vs 69 cts Net 4,508,000 vs 3,096,000 Sales 98.4 mln vs 75.0 mln Avg shrs 5.0 mln vs 4.5 mln Reuter  17-MAR-1987 11:16:08.19 earn usa F f5346reute d f BC-<ATLANTIC-EXPRESS-INC 03-17 0027  <ATLANTIC EXPRESS INC> 1ST HALF DEC 31 NET NEW YORK, March 17 - Shr not given Net 788,099 Revs 15.5 mln NOTE: Company went public during 1986. Reuter  17-MAR-1987 11:16:42.57 netherlands RM f5349reute b f BC-RABOBANK-LAUNCHES-250 03-17 0083  RABOBANK LAUNCHES 250 MLN GUILDER BULLET UTRECHT, Netherlands, March 17 - Rabobank Nederland B.A. Said it is launching under its own management a 250 mln guilder eight-year bullet bond with a 6-3/4 pct coupon and priced at par. No early redemption is permitted on the bond which will be paid back in full on April 15, 1995. Denominations are in 1,000 and five times 1,000 guilders. Subscription closes March 23, payment is April 15. Listing will be on the Amsterdam Stock Exchange. REUTER  17-MAR-1987 11:18:43.18 acq usa F f5358reute u f BC-SPENDTHRIFT-FARMS-<SF 03-17 0049  SPENDTHRIFT FARMS <SFI> GETS BID FOR CONTROL LEXINGTON, Ky., March 17 - Spendthrift Farm Inc said it has received three tentative proposals to acquyire control of the company. It said it is evaluating the proposals and will not comment further unless a definitive agreement is reached. Reuter  17-MAR-1987 11:18:58.30 usa F f5360reute d f BC-BIOTECHNICA-<BIOT>-HA 03-17 0105  BIOTECHNICA <BIOT> HAS NEW AGRICULTURE UNIT CAMBRIDGE, Mass., March 17 - BioTechnica International said it established a new subsidiary, BioTechnica Agriculture, to develop and commercialize microbial and plant products for improving crops. It said the unit will be based in Overland Park, Kansas. It said Charles H. Baker, former president of Rohm and Haas Co's <ROH> Rohm and Haas Seed Inc affiliate, has been named president of the new agriculture unit. The company said Baker will also act for a limited time as president of <Chaco Enterprises Inc>, formed to acquire the Hybrex hybrid wheat technology from Rohm and Haas. Reuter  17-MAR-1987 11:19:09.96 usa F f5361reute d f BC-SUNWORLD-<SUNA>-HAS-H 03-17 0103  SUNWORLD <SUNA> HAS HIGHER LOAD FACTOR LAS VEGAS, Nev., March 17 - Sunworld International Airways Inc said its February load factor rose to 53 pct from 46.1 pct a year earlier and its year-to-date load factor was up to 52 pct from the 51 pct posted for the same period last year. February revenue passenger miles rose to 27.4 mln from 26.4 mln, but year-to-date revenue miles declined to 59.7 mln from 60.4 mln. Available seat miles for the month dropped to 51.7 mln from 57.2 mln and for the two month period available miles totaled 115.3 mln, down from last year's 119.2 mln, Sunworld International said. Reuter  17-MAR-1987 11:22:34.18 crude usa opec F Y f5371reute u f BC-SHEARSON-LEHMAN-UPGRA 03-17 0109  SHEARSON LEHMAN UPGRADES U.S. OIL STOCKS NEW YORK, March 17 - Analyst Sanford Margoshes of Shearson Lehman Brothers said he recommended a number of oil stocks today now that it is apparent that OPEC has succeeded in holding to its prescribed production quotas. "It is clear that OPEC, through jawboning and quota restraint, will boost the price of oil," Margoshes said. Prices of oil stocks rose sharply today in response to higher oil prices and optimism about OPEC quotas. Margoshes said he recommends Imperial Oil <IMO.A>, up 1/2 to 49-1/8, Standard Oil Co <SRD>, 7/8 to 62-3/4, Exxon <XON> one to 83-1/8, and Chevron <CHV> 1-1/8 to 54-7/8. In addition, Margoshes said he recommended Atlantic Richfield <ARC> on a short-term basis, though he said he is still suspect about its debt situation. Atlantic Richfield rose 1-3/4 to 77. He said "the market could come down to test the 16 dlr a barrel level again, but the main thrust of investing in oil is positive right now. Before the year is out we will see higher oil prices." He noted that belief that the government is interested in raising the strategic reserves is factored into the rise in oil stocks today. Reuter  17-MAR-1987 11:24:30.25 belgiumwest-germany kohldelors ec RM f5381reute u f BC-EC-COMMISSION-TO-VISI 03-17 0104  EC COMMISSION TO VISIT BONN AT KOHL'S INVITATION BRUSSELS, March 17 - West German Chancellor Helmut Kohl has invited the European Community's 17-man Commission for talks in Bonn next month in a bid to repair strained relations, EC diplomats said. The Commissioners, led by President Jacques Delors, will pay a two-day visit to Bonn on April 1-2 when they were due for a meeting with the principal West German cabinet members. The meeting, the first of its kind between the Commission and the government of a member state, was originally meant to focus on problems posed by West Germany's federal constitution. But they said the meeting was now likely to be dominated by Commission plans to restructure the EC's exhausted finances and its costly farm policy, which have provoked strong opposition from Bonn. Kohl has written two letters to Delors, complaining that the plans would hit West German farmers hard. His farm minister Ignaze Kiechle has publicly criticised the two German members of the Commission for failing to oppose them. This caused protest from Brussels where the Commission tries to guard the independence of its members from the governments that nominate them. REUTER  17-MAR-1987 11:25:02.06 copper zambiasouth-africa C M f5382reute u f BC-ZAMBIAN-MINISTER-CONF 03-17 0109  ZAMBIAN MINISTER CONFIRMS COPPER DIVERSION LUSAKA, March 17 - Minister of Mines Patrick Chitambala confirmed that Zambia had ended copper shipments through South Africa and announced that its state-run mining company had closed down its liaison office in the white-ruled republic. He told the official Times of Zambia newspaper in an interview the government was diverting all mineral exports along rail routes to Dar es Salaam in Tanzania and Beira in Mozambique. Chitambala declined to say what volume of copper and other minerals were being shipped through these two ports, but he said there had not been any problem with the new arrangements. "So far our copper has been reaching its destinations without hindrance," he told the Times. The Times of Zambia quoted unnamed sources as saying Zambia exported 100,000 tonnes of copper through Dar es Salaam and 17,000 through Beira in the last quarter of 1986. Diplomatic sources in Lusaka had earlier expressed doubts over Zambia's ability to ship all its copper through Beira and Dar es Salaam without causing massive bottlenecks at the ports. Chitambala also said that the state-run Zambia Consolidated Copper Mines (ZCCM) had closed its liaison office in Johannesburg, since it was now redundant. Reuter  17-MAR-1987 11:25:49.37 acq F f5385reute f f BC-******TAFT-CHAIRMAN'S 03-17 0012  ******TAFT CHAIRMAN'S GROUP RAISES TAFT BROADCASTING BID TO 150 DLRS/SHARE Blah blah blah.  17-MAR-1987 11:26:47.36 acq usa F f5388reute d f BC-DEVELOPMENT-CORP-OF-A 03-17 0078  DEVELOPMENT CORP OF AMERICA <DCA> MERGED HOLLYWOOD, Fla., March 17 - Development Corp of America said its merger with Lennar Corp <LEN> was completed and its stock no longer existed. Development Corp of America, whose board approved the acquisition last November for 90 mln dlrs, said the merger was effective today and its stock now represents the right to receive 15 dlrs a share. The American Stock Exchange said it would provide further details later. Reuter  17-MAR-1987 11:27:21.25 usabrazil james-baker RM A f5391reute u f BC-TREASURY'S-BAKER-CALL 03-17 0090  TREASURY'S BAKER CALLS FOR NEW BRAZIL PLAN WASHINGTON, March 17 - Treasury Secretary James Baker said that Brazil should come up with a new economic plan if it hopes to get additional assistance from commercial banks and others. In testimony before a House appropriations subcommittee, Baker said that he had given that message to Brazilian officials earlier this month when they met for talks in Washington. He said that the so-called Cruzado Plan had worked for a while, but that new efforts by the government are now required. Baker made it clear that he backed the decision by the Paris Club official creditors to reschedule loans to Brazil, even though the country later froze its payments to commercial bank creditors. He said that the official loans are being serviced and that this was a result of the rescheduling. Reuter  17-MAR-1987 11:27:51.45 usa nasdaq F f5394reute d f BC-CALIFORNIA-MICRO-<CAM 03-17 0031  CALIFORNIA MICRO <CAMD> TRADES ON NASDAQ MILPITAS, Calif., March 17 - California Micro Devices Corp said its stock was included in the March 17 expansion of the NASDAQ market system. Reuter  17-MAR-1987 11:28:09.98 acq usa F f5396reute d f BC-TEVA-<TEVIY>-SELLS-PR 03-17 0067  TEVA <TEVIY> SELLS PROMEDICO SUBSIDIARY NEW YORK, March 17 - Teva Pharmaceutical Industries Ltd, based in Israel, said it sold its wholly owned Promedico subsidiary, to foreign investors for four mln dlrs. It said the book value of the unit is about 2.2 mln dlrs. Teva said it will continue to market Promedico's products through its wholly owned subsidiary, Salomon, Levin and Elstein Ltd. Reuter  17-MAR-1987 11:28:28.04 usa F f5398reute d f BC-ERC-<ERC>-GETS-THIRD 03-17 0083  ERC <ERC> GETS THIRD CONTRACT FIARFAX, Va., March 17 - ERC International said its Facilities Management Group subsidiary, ERCI Facilities Service Corp, was awarded a 2.1 mln dlrs contract in the drug repository field, the third such contract in nine months. It said that under the five-year contract, it will manage the National Cancer Institutes's pre-clinical drug repository of more than 400,000 drugs and chemicals used to test antitumor activity in animals and tissue culture systems. Reuter  17-MAR-1987 11:29:40.89 usa james-baker A RM f5404reute u f BC-BAKER-SAYS-U.S.-NOT-S 03-17 0096  BAKER SAYS U.S. NOT SEEKING IADB VETO WASHINGTON, March 17 - Treasury Secretary James Baker said that the United States was not seeking loan veto in its negotiation for voting power at the Inter-American Development Bank. Discussing the ongoing negotiation, Baker said the U.S. position is that the countries that pay in the most should have the greatest say over the loan decisions. The U.S. is seeking the power to block loan votes with one other country, and the issue will be discussed in Miami later this month at the annual meeting of the Latin development bank. Reuter  17-MAR-1987 11:31:47.85 earn usa F f5409reute r f BC-NEW-MILFORD-SAVINGS-B 03-17 0025  NEW MILFORD SAVINGS BANK <NMSB> RAISES PAYOUT NEW MILFORD, Conn., March 17 - Qtly div 25 cts vs 20 cts prior Pay April 21 Reord March 27 Reuter  17-MAR-1987 11:32:05.95 acq usa F f5411reute b f BC-K-MART-<KM>-ENDS-TALK 03-17 0057  K MART <KM> ENDS TALKS TO SELL STORES CHICAGO, March 17 - K Mart Corp said recent talks to sell 65 remaining Kresge variety stores and their underlying real estate to F.W. Woolworth Co <Z> have ended. Robert Stevenson, K Mart vice president, told Reuters the talks, which began about six weeks ago, ended. He declined to give a reason. Kresge is the forerunner of what is now the K Mart chain. The name was changed to K Mart in 1977, Stevenson said. "We're selling and buying real estate in our real estate division, and Woolworth was interested in some of our properties. The talks were of a casual nature," he said. The 65 Kresge stores that are scattered around the country in downtown and suburban locations, he said. Stevenson said K Mart will continue to operate the stores. "The stores are profitable. The only decision K Mart has made is that we will continue to operate them," he said Kresge had been a nationwide chain of 900 variety stores. Reuter  17-MAR-1987 11:32:21.74 earn usa F f5413reute d f BC-INSTITUTE-OF-CLINICAL 03-17 0081  INSTITUTE OF CLINICAL PHARM PLC <ICPYY> YEAR NEW YORK, March 17 - Shr 20 ct vs 27 cts Net 1,048,000 vs 1,368,000 Revs 9,457,000 vs 5,386,000 NOTE: Dollar amounts converted from Irish pounds at noon buying rate of the Federal Reserve Bank of New York at Dec 31, 1986, of 1.4105 dlr per one Irish pound. The equivalent rate at Dec 31, 1985, was 1.2470 dlr equals one Irsh pound. Full name of company is The Institute of Clinical Pharmacology PLC, based in Dulbin, Ireland. Reuter  17-MAR-1987 11:33:26.98 lawson RM f5419reute f f BC-LAWSON-SAYS-U.K.-BASI 03-17 0012  ******LAWSON SAYS U.K. BASIC RATE INCOME TAX TO BE CUT TO 27 PCT FROM 29 PCT Blah blah blah.  17-MAR-1987 11:36:40.54 gnpbop uk lawson C f5431reute b f BC-U.K.-GROWTH-RATE-SEEN 03-17 0113  U.K. GROWTH RATE SEEN AT THREE PCT THIS YEAR LONDON, March 17 - Chancellor of the Exchequer Nigel Lawson, presenting his budget for fiscal 1987/88 to parliament, said U.K. Economic growth was forecast at three pct in calendar 1987. He said the Treasury expected a current account balance of payments deficit in 1987 of 2.5 billion stg, after a 1.1 billion shortfall in 1986. Inflation is expected to be 4.0 pct at the end of 1987, he said, adding it may exceed 4.5 pct by the summer before falling back to 4.0 pct by the end of the year. The planned PSBR for 1987/88 was 4.0 billion stg unchanged when compared with the likely outturn for fiscal 1986/87, Lawson said. Although no explicit target was set for the broad sterling M3 money supply, Lawson said broad money will continue to be taken into account in assessing monetary conditions as well as the exchange rate. The low outturn of the PSBR in 1986/87 was mainly due to the buoyancy of non-oil tax revenues in general, and the corporation tax paid by an increasingly profitable business sector in particular. On oil prices, Lawson said he was sticking to his earlier assumption that North Sea crude prices will average 15 dlrs per barrel in calendar 1987. The treasury would strive to keep the PSBR at 1.0 pct of GDP in future, he said. Reuter  17-MAR-1987 11:39:54.35 usa F f5452reute r f BC-BUTLER-<BTLR>-TO-BUY 03-17 0061  BUTLER <BTLR> TO BUY BACK 600,000 SHARES KANSAS CITY, MO., March 17 - Butler Manufacturing Co said its board authorized the repurchase of up to 600,000 shares, or 12 pct of its outstanding common stock. It said purchases will be made in open market and private transactions through Kidder, Peabody and Co. Butler currently has 5,001,848 shares outstanding. Reuter  17-MAR-1987 11:40:05.58 usa F f5453reute r f BC-ROYAL-PALM-<RPAL>-SAY 03-17 0105  ROYAL PALM <RPAL> SAYS RESTRICTIONS LIFTED WEST PALM BEACH, Fla., March 16 - Royal Palm Savings Association said it has entered into an agreement with the Federal Home Loan Bank Board and the Florida Department of Banking and Finance resulting in the removal of limitations which had severely restricted its growth and lending. The company said it will now be permitted to grow about 70 mln dlrs in calendar 1987, or about 15 pct for this year, and at the same rate thereafter. Royal Palm said under the accord, it will resume commercial and nonresidential lending but will place substantial emphasis on residential loans. The company said it agreed to adopt new policies and procedures but did not elaborate. Reuter  17-MAR-1987 11:40:26.25 west-germany G f5457reute d f BC-WEST-GERMAN-FEED-OUTP 03-17 0102  WEST GERMAN FEED OUTPUT SEEN DECLINING BONN, March 17 - West German feedstuffs production is expected to decline further after it dropped to 16.5 mln tonnes in 1986 from 16.7 mln the previous year, the West German Feed Stuff Industry Association (MFI) said. Association president Ulrich Wagner told a news conference West Germany's rate of self sufficiency in the feedstuffs sector is expected to fall below 70 pct this year from around 75 pct in 1986. He attributed the expected decline to introduction of milk quotas in 1984, aimed at curbing EC milk production, and to cheaper imports from abroad. "Our industry's output is not even close to stagnation," Wagner said. "In the long term we expect annual production to decline steadily." The only sector which saw a slight increase last year, by 0.6 pct, was feed for poultry which rose to 3.25 mln tonnes from 3.23 mln, he said. Wagner predicted that the sales volume in feed for dairy cattle will decline even more this year because of the further cut in milk output from April. Reuter  17-MAR-1987 11:40:46.06 earn usa F f5460reute d f BC-ICN-BIOMEDICALS-INC-< 03-17 0034  ICN BIOMEDICALS INC <BIMD> 1ST QTR FEB 28 NET COSTA MESA, Calif., March 17 - Shr 10 cts vs eight cts Net 856,000 vs 574,000 Sales 9,593,000 vs 9,232,000 Avg shrs 8,809,000 vs 6,969,000 Reuter  17-MAR-1987 11:40:52.10 earn usa F f5461reute d f BC-APPLIED-CIRCUIT-TECHN 03-17 0043  APPLIED CIRCUIT TECHNOLOGY <ACRT> 1ST QTR LOSS ANAHEIM, Calif., March 17 - Period ended January 31. Shr loss two cts vs loss 12 cts Net loss 192,370 vs loss 1,494,146 Revs 6,751,830 vs 2,278,842 Note: Full name Applied Circuit Technology Inc. Reuter  17-MAR-1987 11:40:57.61 earn usa F f5463reute s f BC-FRISCH'S-RESTAURANTS 03-17 0025  FRISCH'S RESTAURANTS INC <FRS> SETS QUARTERLY CINCINNATI, March 17 - Qtly div 5-1/2 cts vs 5-1/2 cts prior Pay April 16 Record April Six Reuter  17-MAR-1987 11:42:11.71 money-fxinterest V RM f5465reute f f BC-******FED-SETS-TWO-BI 03-17 0010  ******FED SETS TWO BILLION DLR CUSTOMER REPURCHASE, FED SAYS Blah blah blah.  17-MAR-1987 11:44:54.11 usa nyse F f5478reute u f BC-NYSE-REVIEWS-PROGRAM 03-17 0037  NYSE REVIEWS PROGRAM TRADING NEW YORK, March 17 - The <New York Stock Exchange> said it is undertaking a review of the long-term effects on securities markets of computer-driven trading techniques known as program trading. The NYSE said, "The study will review major new trading techniques involving programmed portfolio hedging and index arbitrage for their potential benefits and risks to the financial system. It will also explore the regulatory implications of these trading techniques and whether their increased use could possibly lead to market abuse." The exchange said a final report is expected before the end of 1987. It said program trading is becoming increasingly important as a market factor. Reuter  17-MAR-1987 11:45:10.92 money-fxinterest usa V RM f5479reute b f BC-/-FED-ADDS-RESERVES-V 03-17 0061  FED ADDS RESERVES VIA CUSTOMER REPURCHASES NEW YORK, March 17 - The Federal Reserve entered the U.S. Government securities market to arrange two billion dlrs of customer repurchase agreements, a Fed spokesman said. Dealers said Federal funds were trading at 6-1/16 pct when the Fed began its temporary and indirect supply of reserves to the banking system. Reuter  17-MAR-1987 11:46:13.53 earn usa F f5486reute u f BC-FEDERATED-DEPARTMENT 03-17 0062  FEDERATED DEPARTMENT STORES INC <FDS> 4TH QTR CINCINNATI, March 17 - Jan 31 end Shr 3.64 dlrs vs 3.16 dlrs Net 171.3 mln vs 154.0 mln Sales 3.44 billion vs 3.23 billion Avg shrs 47.1 mln vs 48.8 mln Year Oper shr 6.23 dlrs vs 5.88 dlrs Oper net 301.9 mln vs 286.6 mln Sales 10.51 billion vs 9.98 billion Avg shrs 48.5 mln vs 48.8 mln NOTE: Latest year net excludes 14.3 mln dlr charge from loss on early debt extinguishment. Net includes charges 15.7 mln dlrs in both periods of latest year vs charges 23.9 mln dlrs in both periods of earlier year from merger of divisions. Investment tax credits three mln dlrs vs 8,900,000 dlrs in quarter and 4,900,000 dlrs vs 16.4 mln dlrs in year. Latest year net includes nine mln dlr provision for loss on disposition of two Abraham and Strauss stores and preopening expenses for another. Latest year net includes gain from sale of interest in Fort Worth, Texas, shopping center of 9,500,000 dlrs. Latest year net both periods includes gain 9,100,000 dlrs from sale of interest in Memphis, Tenn., shopping center. Prior year net includes gain 6,600,000 dlrs on sale of Boston Store division. Reuter  17-MAR-1987 11:46:42.56 earn usa F f5492reute r f BC-CLOTHESTIME-INC-<CTME 03-17 0042  CLOTHESTIME INC <CTME> 4TH QTR NET ANAHEIM, Calif., March 17 - Shr 12 cts vs 10 cts Net 1,683,000 vs 1,407,000 Sales 42.2 mln vs 28.8 mln Year Shr 83 cts vs 70 cts Net 11,908,000 vs 10,005,000 sales 160.3 mln vs 126.5 mln Reuter  17-MAR-1987 11:47:10.74 canada E F Y f5496reute r f BC-phoenix-canada-oil-to 03-17 0103  PHOENIX CANADA OIL TO APPEAL RULING Toronto, March 17 - <Phoenix Canada Oil Co Ltd> said it intends to appeal a ruling in U.S. Federal District Court of Delaware on its suit against Texaco Inc <TX>, Chevron Corp <CHV>, Chevron's Gulf Oil unit and their Ecuador subsidiaries. The court ruled against Phoenix's claim that a royalty it held should have entitled it to a share of the 160 mln U.S. dlrs paid to the defendants when they sold 62.5 pct of their working interest in Ecuador oil operations, Phoenix said. However, the court did award Phoenix 1,250,000 Canadian dlrs in underpayments, the company said. Phoenix Canada Oil said the fiduciary relationship that existed between Phoenix, as the royalty owner, and the defendants, as the working interest operators, was fundamental in the oil industry and was not reflected in the court's ruling. Reuter  17-MAR-1987 11:47:33.87 usa F f5500reute r f BC-GANNETT-<GCI>-SEEKS-T 03-17 0046  GANNETT <GCI> SEEKS TO DOUBLE AUTHORIZED SHARES WASHINGTON, March 17 - Gannett Co Inc said it will ask shareholders at the May Seven annual meeting to approve a doubling of authorized common shares to 400 mln and limitations on the liability of directors under Delaware law. Reuter  17-MAR-1987 11:47:39.87 earn usa F f5501reute d f BC-VIDEO-LIBRARY-INC-<VL 03-17 0055  VIDEO LIBRARY INC <VLVL> 4TH QTR LOSS SAN DIEGO, Calif.,March 17 - Shr loss two cts vs profit three cts Net loss 59,299 vs profit 88,843 Revs 3,487,693 vs 2,123,488 Year Shr profit 25 cts vs loss two cts Net profit 816,395 vs loss 44,541 Revs 12.2 mln vs 7,413,328 Avg shrs 3,208,472 vs 2,348,559 Reuter  17-MAR-1987 11:47:50.38 finland RM f5502reute r f BC-CONSERVATIVE-GAINS-MA 03-17 0112  CONSERVATIVE GAINS MAY SPEED FINNISH MARKET REFORM By Simon Haydon, Reuters HELSINKI, March 17 - Conservative gains in Finnish general elections could speed liberalisation of financial markets, though there will not be a radical economic restructuring, conservative officials and economic analysts said. The conservatives gained nine new seats in parliament after the two-day elections, which ended yesterday, and political commentators say social democrat Prime Minister Kalevi Sorsa is likely to be replaced by a centre-right coalition. International spokesman Pasi Natri told Reuters: "we are willing to liberalise the economy as much as possible." Helsinki analysts said the outgoing centre-left coalition had introduced major reforms of money and stock markets in its period of government between 1983 and 1987. They said Finnish conservatives bore little resemblance to other European conservative movements and had, for example, shelved privatisation policies to increase their popularity. Finnish trade affairs are dominated by its special ties with its neighbour, The Soviet Union, and a new centre-right coalition could alter this relationship, the analysts said. The two countries have a long-term pact under which trade must be balanced in value. The 1987 accord signed in January agreed bilateral trade totalling about 30 billion markka. Finland exports finished products to the USSR, with crude oil accounting for 80 pct of imports. The Centre Party said before the elections that Fenno- Soviet trade would have to be cut because Finland had to trim exports when the value of Moscow's oil exports to Finland fell. Finnish financial markets reacted cautiously to the election news, with little movement in the markka or on the Helsinki stock exchange. Securities analysts said the market would respond positively if a centre-right coalition was formed, but added it was too early to exclude the possibility that social democrats would hang on to power. The spokesman said conservatives favoured legislation governing the stock market to prevent "casino-style behaviour." He said the conservatives also favoured the establishment of an internal market between the Nordic countries. International capital markets were becoming more and more important, he said, adding conservatives would speed up the development of Finland's capial markets. He said the conservatives supported the bilateral trade ties with Moscow, but that links with western Europe should be studied. Finland is a member of the European Free Trade Association ( EFTA). Negotiations between the major Finnish political parties are likely to be protracted, and the shape of the new government will probably not be established before the start of April. Conservatives hold 44 seats now, The Centre Party gained three to 40 and the social democrats lost one, and now hold 56 seats. REUTER  17-MAR-1987 11:47:58.01 usabrazil F A RM f5503reute b f BC-/BANKAMERICA-<BAC>-MA 03-17 0108  BANKAMERICA <BAC> MAY RECLASSIFY BRAZIL LOANS WASHINGTON, March 17 - BankAmerica Corp may place its long-term loans to Brazil on nonaccrual status if Brazil continues to defer interest payments on the loans, the bank holding company said in a filing with the Securities and Exchange Commission. BankAmerica said its outstanding loans to Brazil currently total about 2.7 billion dlrs, including about 1.5 billion dlrs in long-term loans and 1.2 billion dlrs in short-term loans. The Brazilian government announced in February its intention to stop paying interest temporarily on its long-term public and private sector commercial bank debt. "Continued deferral of interest payment on these obligations could result in the loans being placed on nonaccrual status," the banking firm said. BankAmerica said its outstanding loans to Mexico currently total about 2.5 billion dlrs, of which about 215 mln dlrs of loans have been reported as either nonaccrual or past due 90 days or more. Outstanding loans to Venezuela currently total about 1.3 billion dlrs, of which 241 mln dlrs of loans have been reported as either nonaccrual or past due 90 days or more, it said. Reuter  17-MAR-1987 11:48:39.18 earn austria F f5504reute d f BC-CHEMIE-LINZ-EXPECTS-S 03-17 0116  CHEMIE LINZ EXPECTS SHARPLY HIGHER 1986 LOSS LINZ, Austria, March 17 - State-owned <Chemie Linz AG> is likely to record a 1986 loss of some 600 mln schillings compared with a 340 mln loss in 1985, a company spokesman said. Falling sales and lower world prices of fertilisers were largely responsible for the sharp increase, along with the effects of the dollar's fall which has helped to give U.S. Fibre producers a competitive edge, he told Reuters. The firm would have made a small profit in 1985 had it not been for 456 mln schillings lost by subsidiary <Merx HandelsgesmbH> on oil trading. Merx has since withdrawn from the oil market. The firm will announce 1986 results in July. Reuter  17-MAR-1987 11:49:09.95 earn canada E F f5506reute d f BC-cabre-exploration-ltd 03-17 0026  <CABRE EXPLORATION LTD> SIX MTHS JAN 31 NET CALGARY, Alberta, March 17 - Shr 13 cts vs 13 cts Net 617,000 vs 604,000 Revs 1,889,000 vs 1,920,000 Reuter  17-MAR-1987 11:50:08.20 acq usa F f5508reute b f BC-DUDLEY-TAFT-RAISES-BI 03-17 0108  DUDLEY TAFT RAISES BID FOR TAFT BROADCASTING<TFB> CINCINNATI, Ohio, March 17 - Dudley Taft and Narragansett Capital Inc said it was prepared to raise its bid to acquire Taft Broadcasting Co to more than 150 dlrs per share. Taft, through Theta Co, sent and letter to Taft's board of directors stating he was committed to purchasing the broadcasting company and was ready to discuss all aspects of the purchase. The company said items to be discussed included price, structure and form of consideration. Taft said he was prepared to negotiate a transaction in which Taft Broadcast shareholders would receive in excess of 150 dlrs per share. Reuter  17-MAR-1987 11:50:48.87 japan james-baker V RM f5510reute f f BC-******TREASURY'S-BAKE 03-17 0014  ******TREASURY'S BAKER SAYS HE IS "QUITE CONFIDENT" JAPAN WILL STIMULATE ITS ECONOMY Blah blah blah.  17-MAR-1987 11:52:58.57 veg-oil west-germany ec C G f5519reute u f BC-EC-OILS-TAX-NO-LONGER 03-17 0107  EC OILS TAX NO LONGER MAJOR ISSUE - ASSOCIATION BONN, March 17 - The proposed European Community (EC) tax on vegetable oils and fats is no longer a major issue on the agenda and the EC Commission merely used it as a threat, the West German Feed Stuffs Industry Association (MFI) said. Association chairman Ulrich Wagner told a news conference the West German feed industry believes the EC does not seriously contemplate the introduction of such a tax because it would end in another transatlantic trade war. "We have just avoided a trade conflict with the U.S. And the Commission used the tax threat to calm national farm lobbies." American Soybean Association (ASA) president-elect Wayne Bennett said yesterday in The Hague that U.S. Soybean producers were confident the tax would be rejected. Bennett, who is leading one of three soybean delegations on a lobbying tour of EC capitals, will also visit Bonn on Thursday and Friday. There are indications the Bonn government will also reject the proposed tax, Wagner said. Reuter  17-MAR-1987 11:54:05.69 acq usa F f5525reute d f BC-ALLWASTE-<ALWS>-TO-BU 03-17 0083  ALLWASTE <ALWS> TO BUY RELATED COMPANY HOUSTON, March 17 - Allwaste Inc said it entered into an agreement in principle to acquire all the outstanding common of a related air-moving and industrial services company. It did not disclose the name of the company. Allwaste, which preforms air-moving and related services, said it will swap shares of its common, valued at 2.6 mln dlrs, with the company it is acquiring. It said the acquisition is subject to negotiation of a final agreement. Reuter  17-MAR-1987 11:57:19.33 crude usafrance F Y f5543reute u f BC-EXXON-<XON>-MAY-CLOSE 03-17 0104  EXXON <XON> MAY CLOSE ONE FRENCH REFINERY NEW YORK, MARCH 17 - Exxon Corp, the world's largest oil company, said in a published interview today that it was reviewing its worldwide refinery operations and might decide to close on of its french refineries. Lee R. Raymond, Exxon's new president, singled out the possibility of a closure of one of Exxon's refineries in France during the interview. An Exxon spokeswoman confirmed that Raymond had specifically mentioned refineries in France but said that no specific refinery had been named. She also said that all of Exxon's opertations were under constant review. Exxon currently has two refineries in France, FOS in the mediterranean with a capcity of 175,000 barrels per day and Port Jerome west of paris with a similar capacity. Petroleum Intelligence Weekly, an influential trade journal, said, in its current issue, that they understood that Exxon was looking at the possibility of refinery closures in Antwerp, Southern France or possibly Italy. Paul Mlotok, oil analyst with Salomon Brothers inc said that with the closures Exxon made in 1986 in Europe and the improvement in the European refining situation, its future profits there should be good. "Exxon and other major oil companies have closed a bunch of refineries in Europe, upgraded the rest and shaken many of the indepedents out of the market. Now with demand for products rising and efficient operations, Exxon should show superior earnings," Mlotok said. "Just after Royal Dutch <RD>, they are seen as one of the highest grade refiners in Europe," he added. Industry sources said that the oil companies were likely to feel greater pressure on their operations in Southern Europe where competition from the OPEC countries is increasing as these producers move further into downstream operations. PIW said that refiners in the Mediterranean can expect increased shipments from Saudi Arabia and other OPEC export refineries. PIW said "sales from Libya, Algeria and elsewhere are expected to reclaim markets lost to Italian and other European refiners as a result of the abundance of cheap netback oil last year." Reuter  17-MAR-1987 11:58:19.93 ussrusa james-baker worldbankimf C f5551reute r f BC-BAKER-SAYS-U.S.-OPPOS 03-17 0105  BAKER SAYS U.S. OPPOSES SOVIET BANK MEMBERSHIP WASHINGTON, March 17 - U.S. Treasury Secretary James Baker said the U.S. opposes Soviet membership of the World Bank or the International Monetary Fund. Baker told a House foreign affairs subcommittee, "I think our position is absolutely clear on that ... We do not support and will not support Soviet membership in the World Bank or the IMF." Baker said the U.S. position was "unqualified and unconditional." Baker was responding to a questioner who noted that World Bank President Barber Conable has in the past suggested future Soviet membership could take place. Reuter  17-MAR-1987 11:58:36.43 veg-oilsoybean italyusa ec C G f5552reute u f BC-ITALY-STANCE-ON-EC-OI 03-17 0100  ITALY STANCE ON EC OILS TAX NOT ENCOURAGING-ASA ROME, March 17 - Italy's response to protests by U.S. Soybean producers about the proposed European Community (EC) tax on vegetable oils and fats had not been encouraging, American Soybean Association (ASA) board chairman George Fluegel said. Fluegel, heading one of three U.S. Soybean producer delegations currently on a lobbying tour of EC countries, told Reuters in an interview meetings with officials from the Italian Foreign and Agricultural ministries had not yielded much to encourage hopes that Italy would vote against the proposed tax. Fluegel said his delegation had received a negative response from the Italian Agriculture Ministry, but that the attitude of the Foreign Ministry appeared "more realistic." He said the proposed tax was discriminatory against U.S. Farmers since it was basically asking them to help finance the EC's Common Agricultural Policy (CAP) on oilseeds. Asked which EC countries might be expected to vote against the proposed tax, he said, "Realistically, from the information we're getting, it looks like the English, the Germans, hopefully the Netherlands and Denmark." His delegation also hoped to convince Belgium to vote against the issue, he added. Asked what form he thought U.S. Retaliatory action might take in the event of the EC tax proposal being approved, Fluegel said industrial as well as agricultural products could be involved. U.S. Agriculture Secretary Richard Lyng warned the EC yesterday it would face serious retaliation if it enacted the tax. ASA president-elect Wayne Bennett said yesterday in The Hague American soybean producers were confident the proposed tax would be rejected. Reuter  17-MAR-1987 11:59:00.09 cotton israel G f5556reute d f BC-ISRAEL'S-FIVE-YEAR-PL 03-17 0142  ISRAEL'S FIVE-YEAR PLAN TO BOOST AGRICULTURE TEL AVIV, March 17 - Israel has drawn up a five-year plan for 1987-1991 to raise agricultural production by 500 mln dlrs to 2.7 billion dlrs, an annual rise of 3.4 pct, the Israeli Ministry of Agriculture said. Agricultural exports are to be increased by 180 mln dlrs, or 4.8 pct per year on average. The area planted to cotton is to remain at the 1986 level of 100,000 to 112,500 acres with exports expected to bring in 80 to 90 mln dlrs per year. The 34 pct decline from the 1985 level reflects continued water rationing which will remain in force, the ministry said. Groundnut production is planned to increase by 13,000 tonnes, or 57 pct, by 1991 and exports by 9,000 tonnes, or 82 pct. Maize production is targetted to rise by 48,000 tonnes, or 48 pct, and exports by 34,000 tonnes, or 45 pct. Reuter  17-MAR-1987 12:02:53.79 usa RM A f5571reute r f BC-BRUNSWICK-<BC>-FILES 03-17 0078  BRUNSWICK <BC> FILES FOR 300 MLN DLR SHELF SKOKIE, ILL., March 17 - Brunswick Corp said it filed a registration statement with the Securities and Exchange Commission on a shelf offering of 300 mln dlr in senior debt securities. It said proceeds from the sale will be used mainly for to replace variable rate indebtedness, primarily privately placed commercial paper, incurred in connection with the acquisitions of Bayliner marine Corp and Ray Industries Inc. Reuter  17-MAR-1987 12:03:31.99 acq usa F f5575reute u f BC-SOROS-GROUP-HAS-B.F. 03-17 0100  SOROS GROUP HAS B.F. GOODRICH <GR> STAKE WASHINGTON, March 17 - An investor group led by New York investor George Soros said it acquired a 6.1 pct stake in B.F. Goodrich Co common stock as an investment. The group said it paid about 69 mln dlrs for the 1,389,600 Goodrich shares, which are being held by Quantum Fund N.V., a Netherlands Antilles investment firm advised by Soros. It said all the shares were bought between Dec. 29 and March 9. The group said it reserved the future right to buy additional shares and to formulate other purposes or plans regarding its Goodrich investment. Reuter  17-MAR-1987 12:04:26.00 usa james-baker C f5584reute r f BC-BAKER-SAYS-U.S.-NOT-S 03-17 0095  BAKER SAYS U.S. NOT SEEKING IADB VETO WASHINGTON, March 17 - Treasury Secretary James Baker said the United States was not seeking loan veto in its negotiation for voting power at the Inter-American Development Bank. Discussing the ongoing negotiation, Baker said the U.S. position is that the countries that pay in the most should have the greatest say over the loan decisions. The U.S. is seeking the power to block loan votes with one other country, and the issue will be discussed in Miami later this month at the annual meeting of the Latin development bank. Reuter  17-MAR-1987 12:04:41.09 housing usa C M f5585reute d f BC-BALDRIGE-PREDICTS-SOL 03-17 0111  BALDRIGE PREDICTS SOLID U.S. HOUSING GROWTH WASHINGTON, March 17 - Commerce Secretary Malcolm Baldrige predicted 1987 will be the fifth successive year for growth in housing starts after a 2.6 pct rise overall in February starts to a seasonally adjusted annual rate of 1.851 mln units. "This year should be the fifth solid year in a row for homebuilding activity -- with single-family units stronger than multi-family units," he said in a statement. Single-family starts rose last month from January levels by 5.6 pct to 1.317 mln units on a seasonally adjusted basis while multi-family unit starts fell 4.1 pct to 534,000 units, the department reported. Reuter  17-MAR-1987 12:05:06.31 acq F f5587reute f f BC-******TAFT-BROADCASTI 03-17 0014  ******TAFT BROADCASTING SAYS IT WILL CONTINUE TO REVIEW OPTIONS IN RESPONSE TO LATEST BID Blah blah blah.  17-MAR-1987 12:05:12.02 acq F f5588reute b f BC-******COURT-ENJOINS-Z 03-17 0012  ******COURT ENJOINS ZICO INVESTMENT'S TENDER FOR BANCROFT CONVERTIBLE FUND Blah blah blah.  17-MAR-1987 12:06:41.72 acq usa F f5599reute u f BC-STEINHARDT-GROUP-HAS 03-17 0106  STEINHARDT GROUP HAS 6.6 PCT OF HOLIDAY <HIA> WASHINGTON, March 17 - A group led by New York investor Michael Steinhardt told the Securities and Exchange Commission it bought a 6.6 pct stake in Holiday Corp common stock as an investment. The group said it paid 114 mln dlrs for its 1.6 mln Holiday shares, 530,000 of which were bought since Feb. 6. At the same time, group members said they held short positions in the stock totaling 830,000 shares. In addition to Steinhardt himself, the group includes Steinhardt Partners and Institutional Partners, two investment firms of which Steinhardt is one of the general partners. Reuter  17-MAR-1987 12:08:46.37 usa V f5612reute u f AM-REAGAN-POINDEXTER 03-17 0093  POINDEXTER REFUSES TO TESTIFY BEFORE COMMITTEE WASHINGTON, March 17 - Adm. John Poindexter, a former National Security Adviser who resigned over the Iran arms scandal, refused to testify before a House committee probing a recent expansion of White House and military control over unclassified information. "On advice of counsel, I decline to answer that question pursuant to my constitutional rights under the Fifth Amendment," Poindexter said four times in response to questions from House Government Operations Committee chairman Rep. Jack Brooks. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-007.sgm000066400000000000000000002417371154025176300231600ustar00rootroot00000000000000 19-MAR-1987 06:17:22.36 earn australia F f0363reute u f BC-FAIRFAX-SAYS-HIGHER-T 03-19 0107  FAIRFAX SAYS HIGHER TAX HITS FIRST HALF EARNINGS SYDNEY, March 19 - Media group John Fairfax Ltd <FFXA.S> said that its flat first half net profit partly reflected the impact of changes in the Australian tax system. Fairfax earlier reported net earnings edged up 2.3 pct to 25.94 mln dlrs in the 26 weeks ended December 28 from 25.35 mln a year earlier although pre-tax profit rose 9.1 pct to 48.30 mln from 44.29 mln. Net would have risen 10.1 pct but for the increase in company tax to 49 pct from 46 and the imposition of the tax on fringe benefits, paid by employers and not the recipients, the company said in a statement. Fairfax also pointed to the cyclical downturn in revenue growth in the television industry as another reason for the flat first half earnings. It said it considered the result satisfactory in view of these factors. Fairfax said its flagship dailies, The Sydney Morning Herald and the Melbourne Age, boosted advertising volume, as did the Australian Financial Review, and posted extremely satisfactory performances. Magazines also performed strongly. But an 8.9 pct rise in television costs outweighed a 4.0 pct rise in revenue, it said. Fairfax said a fall in net interest also contributed to net earnings because group borrowings were reduced following the receipt of a 96.11 mln dlr capital dividend from <Australian Associated Press Pty Ltd> (AAP) after the sale of AAP's "B" shares in Reuters Holdings Plc <RTRS.L>. This accounted for the 89.32 mln dlr extraordinary profit. Fairfax said it is too early to predict results for the full year. Increased borrowings after the recent 320 mln dlr acquisition of the HSV-Seven television station in Melbourne will hit earnings but networking with the Channel Sevens in Sydney and Brisbane will produce some offsetting cost savings. REUTER  19-MAR-1987 06:20:33.63 france RM f0367reute b f BC-BANK-OF-FRANCE-SELLS 03-19 0095  BANK OF FRANCE SELLS 1.6 BILLION FRANCS CRH TAP PARIS, March 19 - The Bank of France sold 1.6 billion francs of 8.50 pct March 1987/99 Caisse de Refinancement Hypothecaire (CRH) state-guaranteed tap stock at an auction, the Bank said. Demand totalled 6.82 billion francs and prices bid ranged from 93.50 to 96.60 pct. The minimum accepted price was 95.50 pct with a 9.13 pct yield, while the average price was 95.69. At the last auction on February 19, two billion francs of CRH tap stock was sold at a minimum price of 91.50 pct and yield of 9.73 pct. REUTER  19-MAR-1987 06:21:45.34 earn uk F f0370reute b f BC-BRITOIL-PLC-<BTOL.L> 03-19 0045  BRITOIL PLC <BTOL.L> 1986 YR LONDON, March 19 - Shr 6.56p vs 50.31p Final div 6p, making 8p vs 13p. Pre-tax profit 134 mln stg vs 759 mln. Net profit 33 mln vs 253 mln. Turnover 978 mln stg vs 1.80 billion. Extraordinary debit 50 mln vs nil. Operating profit 149 mln stg vs 756 mln. Exceptional debit on rationalisation programme 12 mln vs nil Petroleum Revenue Taxes 77 mln vs 319 mln, U.K. Corporation tax and overseas tax 24 mln vs 187 mln, Note - The net effect of accounting changes in 1986 was to reduce after tax profits by 47 mln stg. Retained earnings for prior years were increased by 209 mln. Extraordinary debit of 50 mln stg related to the decision to seek a buyer for the company's U.S. Assets. REUTER  19-MAR-1987 06:29:47.46 jobs uk RM f0389reute f f BC-(EMBARGOED-FOR-RELEAS 03-19 0023  (EMBARGOED FOR RELEASE AT 1130 GMT THURS MARCH 19) ******UK FEB ADJUSTED UNEMPLOYMENT FELL 44,100 TOTAL 3.07 MLN OR 11.1 PCT - OFFICIAL  19-MAR-1987 06:31:34.81 income uk RM f0391reute f f BC-UK-UNIT-WAGE/LABOUR-C 03-19 0013  ******UK UNIT WAGE/LABOUR COSTS ROSE 3.3 PCT IN THREE MONTHS ENDING JAN - OFFICIAL Blah blah blah.  19-MAR-1987 06:32:16.74 income uk RM f0392reute f f BC-UK-AVERAGE-EARNINGS-R 03-19 0014  ******UK AVERAGE EARNINGS ROSE 7.6 PCT IN JANUARY, UNDERLYING RISE 7.5 PCT - OFFICIAL Blah blah blah.  19-MAR-1987 06:32:22.15 money-supply uk RM f0393reute f f BC-U.K.-FEBRUARY-ADJUSTE 03-19 0015  ******U.K. FEBRUARY ADJUSTED STERLING M3 RISES 2-1/4 PCT, M0 DOWN 3/4 TO ONE PCT - OFFICIAL Blah blah blah.  19-MAR-1987 06:32:48.77 earn uk F f0394reute u f BC-LEGAL-AND-GENERAL-GRO 03-19 0037  LEGAL AND GENERAL GROUP PLC YEAR 1986 LONDON, March 19 - Shr 14.58p vs 7.86p Div 6.5p making 9.75p, an increase of 19.4 pct Pretax profit 83.2 mln stg vs 31.5 mln Net after tax 68.6 mln stg vs 37.7 mln Pretax profit 83.2 mln stg vs 31.5 mln, consists of - Long term business 45.9 mln stg vs 43.8 mln U.S. Long term business 6.2 mln vs 8.9 mln Fund management 4.7 mln vs 6.5 mln Short term business 4.7 mln vs loss 29.0 mln Associate companies 0.9 mln vs 0.8 mln Shareholders other income and outgoings 0.4 mln debit vs 0.5 mln credit Exceptional long-term business profit 21.4 mln vs nil REUTER  19-MAR-1987 06:33:49.51 money-supply RM f0397reute f f BC-FEB-STERLING-BANK-LEN 03-19 0014  ******FEB STERLING BANK LENDING UP 2.9 BILLION STG AFTER 1.75 RISE IN JAN - OFFICIAL Blah blah blah.  19-MAR-1987 06:33:54.42 jobs uk RM f0398reute f f BC-UK-FEB-ADJUSTED-UNEMP 03-19 0014  ******UK FEB ADJUSTED UNEMPLOYMENT FELL 44,100 TOTAL 3.07 MLN OR 11.1 PCT - OFFICIAL Blah blah blah.  19-MAR-1987 06:34:43.33 trade japanusa F f0399reute u f BC-JAPAN-TO-ASK-CHIP-MAK 03-19 0118  JAPAN TO ASK CHIP MAKERS TO SLASH OUTPUT FURTHER TOKYO, March 19 - The Ministry of International Trade and Industry will ask Japanese computer microchip makers to further slash output in the second quarter in an effort to save its semiconductor pact with the United States, MITI officials said. The United States has accused Japan of reneging on the semiconductor pact by failing to stop the flow of cut-price Japanese chips to Asian markets. Washington has threatened to take retaliatory action after April 1. The pact, agreed last year, calls on Japan to stop selling cut-price chips in world markets and to increase its imports of American chips to reduce some of its huge trade surplus. MITI, anxious to salvage the bilateral agreement, has been pressing chip makers to limit production in the hope that will boost domestic chip prices and reduce the incentive to export. Last month, the ministry asked Japanese chip makers to reduce first quarter output by 10 pct. To meet that request, they had to slash production by 20 pct over the final six weeks of the first quarter. If that reduced production level were maintained through to the end of June, second quarter output would come in 10 pct below that of the first three months of the year. MITI officials, who declined to be identified, said the ministry has not yet decided on the extent of the second quarter cutback. One said that Japanese chip makers are losing ground in Asia to South Korean and U.S. Competition just as markets there are picking up. MITI has been criticized privately by some Japanese semiconductor makers for what they see as heavy-handed attempts to ensure the success of the Japan/U.S. Chip pact. REUTER  19-MAR-1987 06:39:15.19 money-supply uk RM f0402reute b f BC-U.K.-CLEARING-BANK-LE 03-19 0067  U.K. CLEARING BANK LENDING RISES 1.6 BILLION STG LONDON, March 19 - Clearing bank sterling lending to the U.K. Private sector in February is estimated to have risen by an underlying, seasonally-adjusted 1.6 billion stg after a 1.2 billion stg rise in January, the Banking Information Service said. The unadjusted rise was 1.31 billion stg, compared with an 813 mln stg increase in January. The Banking Information Service said the adjusted rise of 1.6 billion stg was well above the recent monthly average of about 1.0 billion stg. Of the increase, 297 mln stg was accounted for by personal lending, which the Banking Information Service said was taken up entirely by lending for home purchases. Lending for consumption fell around 17 mln stg while about 182 mln stg of credit card debt was repaid during the month. Lending to the manufacturing industry was up 370 mln stg, and to leasing companies by 308 mln stg. The Banking Information Service said February fell within the governmemnt tax season, so much of the lending was probably the result of industry's need to pay its tax bills. Deposits by the private sector rose an unadjusted 1.1 billion stg in February and by a seasonally-adjusted 1.75 billion stg. Deposits from the public sector rose 185 mln stg in February while deposits from overseas residents rose by 43 mln. REUTER  19-MAR-1987 06:43:04.94 jobs uk RM f0410reute b f BC-U.K.-UNEMPLOYMENT-FAL 03-19 0084  U.K. UNEMPLOYMENT FALLS IN FEBRUARY LONDON, March 19 - Unemployment in the U.K. Fell a provisional seasonally-adjusted 44,100 in February, to total 3.07 mln or 11.1 pct of the workforce, the Employment Department said. In January, seasonally adjusted unemployment fell by a revised 1,100 to 11.3 pct, it said. Initially the January position was reported as flat. The unadjusted jobless total, including school leavers, fell to 3.23 mln, or 11.7 pct, from 3.30 mln, 11.9 pct, in January. February was the seventh successive month that seasonally adjusted unemployment registered a fall. It was at a peak of 11.7 pct last summer. Lord Young, the Employment Minister, said there appeared little doubt the monthly fall, which has been running at about 20,000, will continue. A Department spokesman said the sharp fall in February reflected some compensation for the flat figure in January and continued the downward trend seen in the past six months. He said the February fall was spread throughout the country and among men and women. REUTER  19-MAR-1987 06:47:26.22 money-supply uk RM f0415reute b f BC-STERLING-M3-UP-2-1/4 03-19 0110  STERLING M3 UP 2-1/4 PCT IN FEBRUARY, M0 DOWN LONDON, March 19 - The main measure of U.K. Broad money, sterling M3, grew a provisional, seasonally adjusted 2-1/4 pct in February after a rise of 1.1 pct in January, the Bank of England said. The narrow measure, M0, fell a provisional adjusted 3/4 to one pct after a 0.6 pct drop in January, the Bank said. Unadjusted annual growth in sterling M3 was 18-3/4 to 19 pct in the 12 months to February against 17.6 pct in January while M0 rose four to 4-1/4 pct after a 5.2 pct rise in January. Seasonally adjusted, sterling bank lending grew 2.9 billion stg after a January rise of 1.75 billion. Of the unadjusted counterparts to sterling M3, bank lending to the private sector expanded 2.6 billion stg after a 1.4 billion rise in January, the Bank said. The public sector borrowing requirement (PSBR) contracted by 300 mln stg after a contraction of 3.7 billion stg in January. Funding - debt sales to the non-bank private sector and external flows to the public sector - rose by 300 mln stg after a 1.5 billion stg rise in January. Of this, central government debt sales to the public sector were expansionary by 400 mln stg after a 1.3 billion expansion in January, the Bank said. Other unadjusted counterparts to sterling M3 expanded by 300 mln stg in February after an expansion of 1.3 billion stg in January, the Bank said. Unadjusted figures showed a rise in sterling M3 by 1-3/4 to two pct in February after a drop of 0.8 pct in January. On the same basis, the figures showed a drop of about 1-1/2 pct in MO in February after a sharp 6-1/2 pct fall in January. The Bank said it would publish full, final figures on March 30. The Bank said non-bank private sector holdings of public sector debt fell by about 400 mln stg in February while external flows to the public sector were about 100 mln stg. Combined with a net PSBR repayment of about 300 mln stg, the public sector contribution to the growth in sterling M3 was therefore about flat, the Bank said. It said seasonally adjusted bank lending, at about 2.9 billion stg in February, compared with an average of about 2.6 billion stg a month over the preceding six months. REUTER  19-MAR-1987 06:53:56.15 income uk RM f0418reute b f BC-U.K.-EARNINGS-RISE-7. 03-19 0094  U.K. EARNINGS RISE 7.6 PCT IN YEAR TO JANUARY LONDON, March 19 - U.K. Average earnings rose a seasonally adjusted 7.6 pct in the year to end-January after a 7.4 pct rise in the year to December, the Department of Employment said. The underlying rise was 7.5 pct after 7.75 pct in December. The January index, base 1980, was set at a provisional seasonally adjusted 190.4, down from 193.4 in December. The underlying rise, adjusted for factors such as back-pay and timing variations, had been steady at 7.5 pct from October 1985 to October 1986. Unit wage costs in U.K. Manufacturing industry rose 3.3 pct in the three months to end January, on a year-on-year basis, after a 3.1 pct rise in the three months to end December, the Department of Employment said. In January, the unit wage rise in manufacturing industries was 3.6 pct, unchanged from the December rise. The Department said the decline in the underlying rate of rise in earnings reflected the reduced significance of bonus payments in January compared with December. The actual increase reflected teacher pay settlements and industrial action in the transport and communications sectors in January 1987. REUTER  19-MAR-1987 06:55:01.57 uk RM f0419reute b f BC-MEPC-ISSUES-PARTLY-PA 03-19 0088  MEPC ISSUES PARTLY PAID EUROSTERLING BOND LONDON, March 19 - U.K. Property company MEPC Plc is issuing a 75 mln stg eurobond due April 15, 2004 paying 9-7/8 pct and priced at 99-5/8 pct, lead manager County Natwest Capital Markets said. The bond is in partly paid form with 25 pct due on April 15 and the remainder on July 15. It will be available in denominations of 1,000 and 10,000 stg and will be listed in London. Fees comprise 1-1/2 pct selling concession and 1/2 pct each for management and underwriting. REUTER  19-MAR-1987 07:01:20.97 uk RM f0426reute b f BC-NOMURA-INTERNATIONAL 03-19 0108  NOMURA INTERNATIONAL FINANCE ISSUES EUROBOND LONDON, March 19 - Nomura International Finance Plc is issuing a 150 mln dlr eurobond due April 28, 1992 with a 7-1/4 pct coupon and priced at 101-1/8 pct, Nomura International Ltd said as lead manager. The transaction carries the guarantee of Nomura Securities. Bonds will be issued in denominations of 5,000 dlrs and will be listed in London. Payment date is April 27. Fees comprise 5/8 pct for management and underwriting, including a 1/8 pct praecipuum, and 1-1/4 pct for selling. Co-lead is Pru-Bache Securities. The issue is targeted at Europe, with no Japanese co-managers. REUTER  19-MAR-1987 07:09:17.93 uk A f0442reute r f BC-VOLVO-ISSUES-70-BILLI 03-19 0078  VOLVO ISSUES 70 BILLION EUROLIRE BOND LONDON, March 19 - AB Volvo is issuing a 70 billion eurolire bond due May 31, 1990 paying 10-1/8 pct and priced at 100-1/2 pct, lead manager Banca Commerciale Italiana said. The bond is available in denominations of two mln lire and will be listed in London. Fees comprise 7/8 pct selling concession with 1/2 pct for management and underwriting combined. Payment date is April 24 and there will be a long first coupon. REUTER  19-MAR-1987 07:13:37.68 west-germany stoltenberg RM f0450reute u f BC-STOLTENBERG-CONSIDERS 03-19 0101  STOLTENBERG CONSIDERS RAISING SOME INDIRECT TAXES BONN, March 19 - Finance Minister Gerhard Stoltenberg said he was looking for ways to help finance a planned tax reform without increasing value-added tax but could not rule out raising some indirect taxes, for example, on tobacco. Stoltenberg also told parliament that closing tax loopholes would contribute towards the 19 billion marks the government is seeking to finance part of its 44 billion mark tax reform package for the 1990s. He confirmed that a temporary and limited increase in the borrowing requirement was also being considered. Chancellor Helmut Kohl yesterday said a temporary rise in borrowing was acceptable but stressed his government would exercise strict discipline in spending. New net borrowing was 23.0 billion marks in 1986 compared with 37.2 billion in 1982. REUTER  19-MAR-1987 07:16:04.87 money-fx uk RM f0456reute b f BC-U.K.-MONEY-MARKET-SHO 03-19 0032  U.K. MONEY MARKET SHORTAGE FORECAST REVISED DOWN LONDON, March 19 - The Bank of England said it revised down its estimate of the deficit in the system today to 400 mln stg from 450 mln. REUTER  19-MAR-1987 07:17:51.88 west-germany RM f0457reute u f BC-WESTLB-ISSUES-50-MLN 03-19 0115  WESTLB ISSUES 50 MLN AUSTRALIAN DLR EUROBOND FRANKFURT, March 19 - A Westdeutsche Landesbank Girozentrale (WestLB) unit is raising 50 mln Australian dlrs through a five-year bullet eurobond with a 14-3/8 pct coupon and priced at 101-1/2, co-lead manager WestLB said. The bond, for WestLB Finance N.V., Is guaranteed by the parent. Investors will pay for the bond on April 15, and the bond pays annual interest on the same day. It matures on that day in 1992. Fees total two pct, with 1-3/8 points for selling, and 5/8 for management and underwriting combined. There is a 1/8 pct praecipuum. Listing is in Luxembourg. Co-lead is Hambros Bank Ltd. Denomination is 1,000 dlrs. REUTER  19-MAR-1987 07:21:25.03 ecuador A f0462reute r f BC-DEBT-ECUADOR 03-19 0085  ECUADOR SEEKS 450 MLN DLRS IN EMERGENCY CREDIT By Jorge Aguirre, Reuters QUITO, March 18 - Ecuador is seeking between 437 and 450 mln dlrs in loans this year from multilateral organisations and foreign governments to grapple with economic losses from a devastating earthquake 13 days ago, a presidential economic adviser said. Foreign governments and multilateral organisations hold one-third of Ecuador's 8.16 billion dlrs total foreign debt, he said in a news conference at the presidential palace. But he added that the suspension of payments to private foreign banks, who hold the rest of the foreign debt, would be prolonged though the government hoped to negotiate an agreement with these creditors. President Leon Febres Cordero says the earthquake cost the country one billion dlrs in losses and left 1,000 people dead or missing. Swett, who was Finance Minister of Ecuador between August 1984 to June 1986, added: "With the private foreign banks there has been a ceasing of payments by Ecuador. "We are bringing forward the respective negotiations whose conclusion we hope finalises in the next few weeks." Finance Minister Domingo Cordovez said last week that quake-hit Ecuador sought through negotiations to postpone all payments due to the private foreign banks in 1987 until next year. Although Swett gave no gave details on the latest plan for negotiations with private foreign banks, he calculated the suspension of payment to these creditors would save the government 54.45 billion sucres. This amount is equal to 363 mln dlrs at the free rate of 150 sucres to the dollar -- the rate Swett said reporters should use in calculating the dollar equivalent. The Ecuadorean central bank, which is the institution remitting debt payments abroad, uses the official rate of 95 sucres to the dollar for its accounting purposes. At the official rate, the 54.45 billion sucres' sum equals 573 mln dlrs. Ecuador, squeezed by a slide last year in prices for crude, its main export, suspended payments to private foreign banks in January. Swett said the government would also seek to refinance the 1.429 billion dlr section of the debt owed to the Paris Club group of foreign governments, though it would continue to service the debt with them. He gave no more details. The government adopted a tough austerity program last Friday intended to grapple with the tremor's economic costs. But the country's labour unions have called a general strike for Wednesday to press for a suspension of the program. The 500,000-strong Unitary Workers' Front (FUT) and the 100,000-member General Union of Workers (UGT) called the strike to cancel the measures, which include a rise in petrol prices of up to 80 per cent and budget cuts of as much as 10 per cent. The leftist-led FUT said it was also backing a call by the Maoist Popular Movement for Democracy (MPD) party, to have Congress impeach and oust Febres Cordero, a conservative, for having adopted the austerity measures. Reuter  19-MAR-1987 07:23:33.05 gold south-africa A f0474reute r f BC-SOME-7,000-SOUTH-AFRI 03-19 0104  SOME 7,000 SOUTH AFRICAN MINERS RETURN TO WORK JOHANNESBURG, March 19 - Some 7,000 black workers returned to work after staging one-day strikes at two mines on Monday, the National Union of Mineworkers and the companies that own the mines said. About 6,000 miners resumed work at the Grootvlei gold mine east of Johannesburg after protesting the transfer of colleagues to other jobs at the same mine, owners General Mining Union Corp Ltd <GENM.J> said. The union said about 1,000 mineworkers at a new coal facility owned by Anglo American Corp of South Africa Ltd <ANGL.J> also returned to their jobs on Tuesday. The workers at Anglo's Vaal Colliery south of Johannesburg had struck to protest the alleged refusal of officials of the South African homeland of Transkei to allow miners to attend a funeral in the homeland, a union spokesman said. REUTER  19-MAR-1987 07:27:17.84 acq japanusa F f0490reute r f BC-NIPPON-LIFE-SEEKING-T 03-19 0102  NIPPON LIFE SEEKING TIE WITH U.S. SECURITIES HOUSE TOKYO, March 19 - <Nippon Life Insurance Co> is pursing a possible link with an American securities house to expand its overseas investment portfolio, a company spokesman said. But he declined to comment on rumours the company would take a 10 pct stake in <Shearson Lehman Brothers>, an investment banking unit of American Express Co <AXP>. He said the firm started to sound out several U.S. Investment banks on capital participation about 18 months ago and was narrowing the number of prospects, but he did not say if it had set its sights on one firm. Nippon Life, Japan's largest life insurer, also plans to set up a wholly owned investment unit, <Nissei International America>, in New York next month and subsidiaries in Canada, Singapore, the Cayman Islands and Jersey this year, he said. These moves are in line with its long-term strategy to put more emphasis on overseas investment management as opportunities at home are declining while the company's assets are growing. The company is especially attracted by the scale and depth of U.S. Money and credit markets and wants to establish a firm foothold there, the spokesman added. REUTER  19-MAR-1987 07:28:32.29 RM f0495reute f f BC-****** 03-19 0009  ****** Bundesbank says it leaves credit policies unchanged Blah blah blah.  19-MAR-1987 07:28:41.74 west-germany F f0496reute u f BC-WEST-GERMAN-CAR-OUTPU 03-19 0107  WEST GERMAN CAR OUTPUT RISES IN FEBRUARY FRANKFURT, March 19 - West German car and van production rose to 389,900 in February from 380,900 in February 1986, the German Automobile Industry Association VDA said in a statement. Production of trucks of up to six tonnes fell sharply to 11,500 from 14,600, owing to a cut in production of small delivery vans of up to two tonnes. Total vehicle output rose to 410,000 from 404,600. Car and van exports eased to 222,000 in February from 225,000 one year earlier, and exports of trucks of up to six tonnes dropped to 6,200 from 9.900. Total vehicle exports fell to 233,200 from 240,300. Car and van output in January and February eased to 758,700 from 766,500 in the first two months of 1986. Production of trucks up to six tonnes fell to 26,300 from 30,700, and total vehicle production fell to 802,300 from 814,900. Car and van exports in January and February fell to 424,700 from 443,300 a year earlier and exports of trucks up to six tonnes fell to 15,400 from 20,200. Total vehicle exports fell to 449,200 from 473,500. REUTER  19-MAR-1987 07:28:55.45 money-fx RM f0498reute b f BC-U.K.-MONEY-MARKET-GIV 03-19 0083  U.K. MONEY MARKET GIVEN 181 MLN STG ASSISTANCE LONDON, March 19 - The Bank of England said it provided the money market with 181 mln stg in assistance this morning. This compares with the Bank's revised shortage forecast of around 400 mln stg. The central bank purchased bank bills outright at the new dealing rates established yesterday. These comprised 65 mln stg in band one at 9-7/8 pct, 114 mln stg in band two at 9-13/16 pct and two mln stg in band three at 9-3/4 pct. REUTER  19-MAR-1987 07:29:03.46 japan F f0499reute d f BC-FUJI-BANK-ACCUSED-OF 03-19 0074  FUJI BANK ACCUSED OF MISUSE OF TAX FREE RESERVES TOKYO, March 19 - The Tokyo Regional Taxation Bureau has imposed a penalty tax on <Fuji Bank Ltd> for alleged improper use of tax-free reserves, a bank spokeswoman told Reuters. She declined to reveal the bank's planned response but another bank official said it has not paid the penalty. The bank said in a brief statement it believes that its use of the tax-free reserves is legal. Financial institutions can set aside 0.003 pct of their risky loans as tax-free reserves. Fuji said a difference of understanding exists between the bank and the tax bureau regarding the use of tax-free reserves. It did not elaborate. Fuji Bank reported a 72.1 billion yen net profit in the 1985/86 year. Lending totaled 16,120 billion yen. REUTER  19-MAR-1987 07:29:42.07 money-supply philippines A f0505reute h f BC-PHILIPPINES'-LIQUIDIT 03-19 0104  PHILIPPINES' LIQUIDITY RISES, LOAN DEMAND FALLS MANILA, March 19 - Liquidity in the Philippines rose in December while loan demand and short-term lending rates fell, the Central Bank said. A bank official said M-3 rose 9.72 pct to a provisional 149.80 billion pesos at the end of December from a month earlier for a year-on-year gain of 12.72 pct. She said short-term bank lending rates fell to an annualised 13.88 pct at the end of December, from 14.58 pct a month earlier and 19.82 pct at the end of December 1985. Poor loan demand was illustrated by a rise in commercial bank reserves, the official said. The bank official said commercial bank reserves were 22.19 billion pesos at the end of December, when reserves required were 21.59 billion. She said the surplus of 597 mln pesos, compared with a deficit of 390 mln pesos a month earlier and a deficit of 1.64 billion at the end of 1985, reflected political uncertainty in the last quarter of 1986. Reserve money, the total available to monetary authorities, was a provisional 52.58 billion pesos at the end of 1986. This was 5.19 pct up from 49.98 billion at the end of November and 41.85 pct up from 37.09 billion in December 1985. The bank official noted M-3, which includes M-1 money supply, plus savings, time deposits and deposit substitutes. Was 132.88 billion pesos at the end of December 1985. M-1 money supply rose a provisional 17.3 pct to 42.86 billion pesos at the end of December 1986 from 36.52 billion a month earlier. The year-on-year rise was 19.64 pct, up from 35.83 billion at the end of December 1985. Reuter  19-MAR-1987 07:31:01.10 acq japanportugal F f0511reute r f BC-SANWA-BANK-ACQUIRES-S 03-19 0103  SANWA BANK ACQUIRES SMALL STAKE IN PORTUGUESE BANK TOKYO, March 19 - Sanwa Bank Ltd <ANWA.T> has agreed to buy a two pct stake in Oporto-based <Banco Portugues de Investmento Sarl> (BPI), Portugal's largest merchant bank, a Sanwa official said. Sanwa will purchase the shares from International Finance Corp, a BPI shareholder and sister organisation of the World Bank, for 351 mln yen, he said. The acquisition will be completed this month as both the Japanese and Portuguse governments are expected to give permission soon. This is the first time a Japanese bank has bought a stake in a Portuguese bank. Sanwa plans to increase its stake in BPI to four pct, the ceiling for foreign shareholders, the official said. The bank has also agreed with <Banco Portugues do Atlantico>, a state-owned merchant bank in Oporto, to exchange information on customers and help accelerate Japanese investment and technological transfers to Portugal, he said. REUTER  19-MAR-1987 07:41:42.61 interest west-germany A f0527reute u f BC-BUNDESBANK-LEAVES-CRE 03-19 0051  BUNDESBANK LEAVES CREDIT POLICIES UNCHANGED FRANKFURT, March 19 - The Bundesbank left credit policies unchanged after today's regular meeting of its council, a spokesman said in answer to enquiries. The West German discount rate remains at 3.0 pct, and the Lombard emergency financing rate at 5.0 pct. REUTER  19-MAR-1987 07:44:43.08 gnp france balladur RM f0534reute u f BC-NO-FRENCH-REFLATION, 03-19 0103  NO FRENCH REFLATION, SOURCES CLOSE TO BALLADUR SAY PARIS, March 19 - There is no question of stimulating consumption or relying on a systematic budget deficit or other reflationary policies to boost the French economy, sources close to finance minister Edouard Balladur said. Their comments followed remarks by prime minister Jacques Chirac's spokesman Denis Baudouin, who said on Monday ministers were agreed on the desirability of "relaunching" the economy. This sparked speculation the government was preparing for a reflationary U-turn, but the finance ministry immediately ruled out any such move. The sources today said the government's policy remained one of "recovery," or sound finances and greater efficiency. They said that while 8.6 billion of the 30 billion franc revenues expected for 1987 from a sweeping privatisation program will go to providing public companies with fresh capital, 21.4 billion francs, or two-thirds, will go toward paying off national debt. Any further privatisation revenue this year above the 30 billion would be distributed between repayment of national internal debt and public companies in similar proportions, they added. The sources said it was absurd to talk of reflation when the country's internal debt, expected to grow by 10 pct this year from 1,300 billion francs in 1986 was growing twice as fast as gross domestic product. Nominal GDP is expected to grow by roughly five pct this year from 5,000 billion francs last year, broadly in line with earlier forecasts. Real GDP will grow by up to 2.5 pct. The sources said that with France's economic targets for 1987 roughly in line with its main trading partners, the government had no intention of pushing the economy to grow at an artificial pace out of step with neighbouring economies. REUTER  19-MAR-1987 07:55:53.04 hong-kong RM f0557reute u f BC-H.K.-REVIEWS-BANKING 03-19 0100  H.K. REVIEWS BANKING STRUCTURE, CAPITAL RATIO HONG KONG, March 19 - The Banking Commission is reviewing the present three-tier banking system and its newly established capital adequacy ratio, banking commissioner Robert Fell said. He told a news conference his office has had talks with the Bank of England and the U.S. Federal Reserve Board on risk-based capital ratios, following an agreement on such standards between the two central banks early this year. The Bank of England and the Fed are trying to persuade the Bank of Japan and European central banks to accept their standards. "We welcome international standards," Fell said. "It means a level playing field for all." Under a new banking rule that came into effect last year, banks in Hong Kong are given a two-year grace period to meet a five pct capital adequacy requirement. "The difference between us (Hong Kong and the U.K.) is really not that great," he said. Fell said the majority of banks are comfortable with the required capital ratio, though some are under-capitalised. Some banks, mostly Japanese, want a lower capital ratio because of the special nature of their business, mainly offshore banking operations. These institutions have proposed the creation of a limited service bank category. Financial institutions in Hong Kong are now classified into three types -- banks, registered and licensed deposit-taking companies. Fell said the Commission is reviewing the three-tier structure in light of the possible changes in capital ratio and the growing trend towards securitisation of debt. Fell said the Commission is also studying a set of guidelines on loan loss provisions with the help of the Society of Accountants. Other planned guidelines relate to securitisation of debt and business that banks and deposit taking companies can conduct. REUTER  19-MAR-1987 08:01:10.70 ukaustria RM f0571reute u f BC-AUSTRIA-INCREASES-BON 03-19 0059  AUSTRIA INCREASES BOND TO 75 MLN AUSTRALIAN DLRS LONDON, March 19 - The Australian dollar eurobond launched yesterday for the Republic of Austria has been increased to 75 mln dlrs from the original 50 mln, Credit Suisse First Boston Ltd said as lead manager. The five year transaction has a 14-1/4 pct coupon and was priced at 101-3/4 pct. REUTER  19-MAR-1987 08:02:36.22 uk RM f0577reute u f BC-U.K.-BUILDING-SOCIETY 03-19 0078  U.K. BUILDING SOCIETY TAPS EUROSTERLING MARKET LONDON, March 19 - Cheltenham and Gloucester Building Society is issuing a 50 mln stg eurobond due April 22, 1992, paying 9-1/4 pct and priced at 101-1/4 pct, lead manager Union Bank of Switzerland (Securities) Ltd said. The bond will be available in denominations of 1,000 stg and will be listed in Luxembourg. Fees comprise 1-1/4 pct selling concession and 5/8 pct management and underwriting combined. REUTER  19-MAR-1987 08:04:29.56 money-fxincomemoney-supply usa A f0587reute u f BC--U.S.-CREDIT-MARKET-O 03-19 0111  U.S. CREDIT MARKET OUTLOOK - SPENDING, M-1 NEW YORK, March 19 - Brisk increases in personal income and consumption are to appear in February data released today, but the bond market's recent sluggishness suggests there will be no major price reaction unless the rises are much larger than expected, economists said. Personal income is forecast to rise by 0.6 to 0.8 pct, compared with no change in January, while consumption expenditures are projected to increase 1.4 to 1.6 pct, reversing most of the two pct drop recorded in January. M-1 money supply data for the March 9 week will also be released. An increase of some 2.3 billion dlrs is expected. Peter Greenbaum of Smith Barney, Harris Upham and Co Inc expects a one pct rise in income, led by a strong gain in wage and salary disbursements in February. Nonfarm payrolls expanded by 337,000 jobs in February, the average workweek lengthened by 0.6 pct and hourly wages rose by four cts, he noted in a report. Vigorous spending on durable goods last month, especially cars, foreshadow a rise of at least 1.5 pct in consumption, he added. The prospect of bearish data did not trouble the bond market much yesterday, with the 30-year Treasury bond slipping just 7/32 to 99-28/32 for a yield of 7.51 pct. Analysts said the market is still trapped in a narrow range, desperately seeking direction. "Seasonally adjusted, it's already December in the bond market," quipped Robert Brusca of Nikko Securities Co International Inc. Paul Boltz of T. Rowe Price Associates Inc said the steadiness of long bond yields around 7.5 pct, despite some signs of a stronger economy, probably reflects expectations that inflation will remain subdued. But he warned that this assumption might not be justified. "It took the bond market a long while to see that inflation was not returning to double digits, and now that it has learned that lesson, it may be a little slow to see that a four to five pct inflation is a real possibility ahead," Boltz said in a report. After trading late yesterday at 5-15/16 pct, Fed funds were indicated by brokers to open comfortably at 5-15/16, six pct. Reuter  19-MAR-1987 08:07:29.71 veg-oiloilseedsoybean west-germanyusa ec C G f0595reute r f BC-U.S.-DELEGATION-HOPES 03-19 0115  U.S. DELEGATION HOPES FOR VEG OILS TAX DEFEAT BONN, March 19 - American soybean producers and processors are hoping the proposed EC tax on vegetable oils and fats will not be imposed, but say the U.S. Is prepared to retaliate if it is introduced. Wayne Bennett, the American Soybean Association's first vice president, told a news conference the U.S. Administration would not hesitate to retaliate, but both producers and processors were trying to solve the issue through negotiation. U.S. Secretary of Agriculture Richard Lyng said in a letter to EC officials that U.S. Retaliatory measures would cover more than agricultural products if the tax was imposed, Bennett said. The ASA and National Soybean Processors Association (NSPA) delegations will meet top West German government officials today and tomorrow to lobby for support. Bennett said West Germany, Britain, the Netherlands, Denmark and Portugal oppose the tax, but Italy and Belgium seem to have taken a hardline view on the issue. "Europeans in favour of the tax say it would be to their advantage economically, but that is not correct because we would hit back," NSPA chairman Jack Reed said. This step would be very expensive for all and no one would emerge as a winner if the tax were introduced, he said. Reed pointed out the U.S. Administration and the soybean industry view the EC proposal as violating the General Agreement on Tariffs and Trade. The proposed tax also violates the zero duty bindings agreed between the EC and U.S. In 1962, he said. Under the zero duty bindings pact U.S. Soybeans and products can be exported to the Community duty-free. REUTER  19-MAR-1987 08:08:32.15 hong-kong RM f0600reute u f BC-H.K.-BANKING-SECTOR-S 03-19 0100  H.K. BANKING SECTOR STABLE, OFFICIAL SAYS HONG KONG, March 19 - The banking sector has regained its stability after a protracted period of difficulty, banking commissioner Robert Fell said. "The banking climate has dramatically changed from a year ago," he said at a news conference to present his annual report on the banking sector for 1986. "We've got confidence back. We've got profitability back." he said. A three-year shake out in the local banking sector forced the government to take over three banks and arrange for the acquisition of four others by the private sector. Fell said that in many cases the bank problems stemmed from management fraud which he linked partly to dramatic swings in the stock and property markets in the early 1980s. "We've got it out of the system now," he said. "Fraud is no longer a systemic problem." But he acknowledged there may still be problems. "Deliberate fraud is difficult to detect especially where collusion and senior management are involved," he said. "Prudential supervision cannot give complete protection. The (new banking) ordinance is designed to give a "measure" of protection." Fell said a number of banks want to set up operations in Hong Kong, adding the government approved three banking licences this week. He did not give details. At the end of 1986, there were 151 licenced banks, 25 of which were locally incorporated, compared with 143 a year ago. Another 134 foreign banks had representative offices compared with 131 a year ago. There were 34 licensed deposit-taking companies (DTCs) and 254 registered DTCs at the end of 1986, compared with 35 and 278 respectively a year ago, he said. Foreign banks seeking banking licences in Hong Kong must have assets of 14 billion U.S. Dlrs. But Financial Secretary Piers Jacobs said yesterday the asset criteria are flexible. A high asset threshold has worked in the favour of banks incorporated in countries with relatively large economies, he noted. "No licences in the last few years have been granted to banks from any of the smaller countries in the Asia-Pacific region," he said. REUTER  19-MAR-1987 08:13:16.72 acq F f0621reute f f BC-******AMERICAN-EXPRES 03-19 0014  ******AMERICAN EXPRESS SAYS IT'S HOLDING TALKS ON SALE OF SHEARSON STAKE TO NIPPON LIFE Blah blah blah.  19-MAR-1987 08:13:36.39 usa F f0623reute r f AM-SAVINGS 03-19 0103  SAVINGS BANK CLOSED, 15TH TROUBLED U.S. S&L OF YEAR WASHINGTON, March 18 - The Federal Home Loan Bank Board (FHLBB) announced today the replacement of a closed Santa Ana, Calif., savings bank in the 15th federal action assisting troubled U.S. savings institutions this year. The FHLBB said Perpetual Savings Bank in Santa Ana was put into receivorship because it was insolvent and was replaced by a new federally chartered Perpetual Savings Association. It said the savings bank's insolvency "was a direct result of losses on speculative investments in real estate which were not supported by appraisals." The FHLBB said it appointed Great American First Savings Bank <GTA> of San Diego to manage Perpetual Savings. It said as of January 31, Perpetual had assets of 61.9 mln dlrs. Reuter  19-MAR-1987 08:15:06.00 acq usajapan F f0627reute u f BC-/AMERICAN-EXPRESS-<AX 03-19 0044  AMERICAN EXPRESS <AXP> MAY SELL SHEARSON STAKE NEW YORK, March 19 - American Express Co said it and its Shearson Lehman Brothers Inc subsidiary have been holding talks on the possible equity investment in Shearson Lehman by <Nippon Life Insurance Co> of Japan. The company said, "The discussions have led to a general understanding by which Nippon Life would purchase a 13 pct equity investment in Shearson Lehman for approximately 530 mln dlrs and American Express, Shearson Lehman and Nippon Life would explore mutually advantageous, nonexclusive business and investment opportunities." The company said a definitive agreement on the matter is subject to a number of conditions, including approval of the American Express board and the Japanese Ministry of Finance. The company said its board is scheduled to meet March 27 for its regular monthly sessions. American Express said it is continuing to evaluate various courses of action of strategic importance to Shearson Lehman in addition to the possible investment by Nippon Life. It said the options range from expanding Shearson's capacity to meet international competition, to broadening further its access to capital. The company also said, "All the courses of action under study reflect the continuing integral role of Shearson Lehman in American Express' worldwide financial services strategy." Reuter  19-MAR-1987 08:15:21.69 usa F f0629reute r f BC-XEROX-<XRX>-TO-STOP-S 03-19 0092  XEROX <XRX> TO STOP SELLING PC'S BY THEMSELVES NEW YORK, March 19 - Xerox Corp has decided to stop selling personal computers as standalone products, a company spokesman said. The spokesman said "As a first priority, we're selling PC's as part of preconfigured systems, mostly desktop publishing systems, and not by themselves anymore." He said Xerox does not expect to take any material charge from changing its marketing of personal computers. He said for the past five years, Xerox has sold most of its PC's as components of larger systems. Another Xerox spokesman said the company actually stopped selling personal computers alone on February 16 but never announced the move. Reuter  19-MAR-1987 08:16:10.53 money-fxrand south-africa RM f0630reute r f BC-S.AFRICA'S-FINANCIAL 03-19 0093  S.AFRICA'S FINANCIAL RAND SEEN HEADED HIGHER JOHANNESBURG, March 19 - The financial rand, widely viewed as a direct reflection of foreign investor confidence in South Africa, appears headed above 30 U.S. Cents, dealers and bank economists said. The currency has risen about 25 pct in the past three months to its current rate of 29.50 cents, due partly to signs of a possible power shift with the appearance of a number of independent candidates in the whites-only election on May 6, they added. It has risen about two cents this week alone. "Another factor is that banks in London, where the main market is based, are going long in the currency because of a general feeling that it will rise in the future," one economist said. Dealers described 30 cents as a psychological barrier that was expected to be broken soon after a brief consolidation phase from recent gains. After reaching 30 cents, "There is a chance of appreciation to 32 cents in the next several weeks," one dealer said. There was a widespread feeling that both the commercial rand, holding stable at 48 cents, and the financial rand were staying firm, banking sources said. A Barclays National Bank executive who asked not to be identified said: "The rise of the independents appears to be indicative of a potential shift of power in the National Party and has created a favourable sentiment overseas." One dealer said growing business and investor interest from West Germany and Switzerland were behind the financial rand's rise. Economists said foreigners also were being attracted by South Africa's long-term government bonds and "semi-gilts" or securities in partly government-owned firms, many with yields as high as 30 pct. They could be purchased with financial rands with interest paid in commercial rands. "This has had a definite influence on the financial form of the rand," a dealer said, adding that at present demand is slightly in excess of supply. The financial rand was reintroduced in September 1985 to help end capital flight from South Africa during a period of severe political unrest in the country. REUTER  19-MAR-1987 08:22:06.66 usa A f0648reute r f BC-EX-REAGAN-AIDE-DEAVER 03-19 0113  EX-REAGAN AIDE DEAVER INDICTED ON PERJURY CHARGES WASHINGTON, March 19 - Former White House aide Michael Deaver, a long-time confidant of President Reagan, has been indicted on charges of lying about his contacts as a Washington lobbyist with top U.S. Government officials. The five-count perjury indictment charged that Deaver lied in sworn testimony to Congress and before the grand jury investigating his business affairs. Deaver, who resigned as deputy White House chief of staff in 1985 to open a lobbying firm, faces a maximum penalty of 25 years in prison if convicted. Immediately after the indictment was announced Reagan issued a statement wishing Deaver well. Reuter  19-MAR-1987 08:22:21.02 acq usa F f0649reute d f BC-<FI-TEK-CORP>-TO-MAKE 03-19 0094  <FI-TEK CORP> TO MAKE ACQUISITION DENVER, March 19 - Fi-Tek Corp said it has signed a letter of intent to acquire <Voice Systems and Services Inc> for an undisclosed amount of stock. It said on completion of the acquisition it would change its name to Voice Systems and Services Inc. It said VBoice Systems has received a 3,600,000 dlr contract to provide FLP Communications of Dallas with voicemail systems through service bureaus located throughout the U.S. and has also contracted to provide voicemail systems and administration to M and S Communications. Reuter  19-MAR-1987 08:22:28.01 acq usa F f0650reute r f BC-FIRST-WISCONSIN-<FWB> 03-19 0062  FIRST WISCONSIN <FWB> TO MAKE ACQUISITION MILWAUKEE, March 19 - First Wisconsin Corp said it has agreed to acquire North Shore Bancorp Inc of Northbrook, Ill., for 6,160,000 dlrs in cash, or slightly more than twice book value, subject to approval by North Shore shareholders and regulatory authorities. The company said completion is expected in the third quarter. Reuter  19-MAR-1987 08:26:32.47 bop italy RM f0656reute b f BC-ITALY'S-FEBRUARY-PAYM 03-19 0085  ITALY'S FEBRUARY PAYMENTS BALANCE IN SURPLUS ROME, March 19 - Italy's overall balance of payments showed a surplus of 1,461 billion lire in February 1987 compared with a deficit of 1,145 billion in January, provisional Bank of Italy figures show. The February surplus compared with a deficit of 1,578 billion lire in the same month for 1986. For the first two months of 1987, the balance of payments showed a surplus of 302 billion lire against a deficit of 4,622 billion in the same 1986 period. The Bank of Italy said the cumulative balance for the first two months of 1987 does not match the total calculated on the individual monthly figures because of the provisional nature of certain data. REUTER  19-MAR-1987 08:26:43.13 earn usa F f0658reute d f BC-BELVEDERE-CORP-<BLV> 03-19 0073  BELVEDERE CORP <BLV> 4TH QTR LOSS NEW YORK, March 19 - Oper shr loss 21 cts vs loss 95 cts Oper net loss 666,000 vs loss 2,184,000 Avg shrs 3,181,805 vs 2,310,200 Year Oper shr loss 30 cts vs loss 23 cts Oper net loss 823,000 vs loss 606,000 Avg shrs 2,757,040 vs 2,614,225 NOTE: Net excludes realized investment gains of 666,000 dlrs vs 289,000 dlrs in quarter and 2,274,000 dlrs vs 1,468,000 dlrs in year. Reuter  19-MAR-1987 08:27:00.64 reserves italy RM f0659reute b f BC-ITALIAN-NET-RESERVES 03-19 0081  ITALIAN NET RESERVES RISE IN FEBRUARY ROME, March 19 - Italy's net official reserves rose to 66,172 billion lire in February 1987 from a previously reported 62,174 billion in January, the Bank of Italy said. Gold holdings at end-February totalled 35,203 billion lire, unchanged on January. Convertible currencies totalled 18,467 billion lire, up from 14,899 billion in January, while European Currency Unit (ECU) holdings were 10,156 billion lire against 10,133 billion. REUTER  19-MAR-1987 08:31:00.91 usa F f0665reute r f BC-SJNB-<SJNB>-SAYS-CHIE 03-19 0071  SJNB <SJNB> SAYS CHIEF EXECUTIVE RESIGNS SAN JOSE, Calif., March 19 - SJNB Financial Corp said Douglas McLendon has resigned as president and chief executive officer of the holding company and its San Jose National Bank subsidiary and as a director of its Tri-Valley National Bank subsidiary to pursue other interests. It said vice chairman William Pfeifle, 68, will act as interim president and chjief executive officer. Reuter  19-MAR-1987 08:33:10.94 west-germany RM f0671reute r f BC-GERMAN-INVESTORS-SLOW 03-19 0109  GERMAN INVESTORS SLOW TO ACCEPT BOND INNOVATIONS By Franz-Josef Ebel, Reuters WEST BERLIN, March 19 - The liberalization of West German capital markets in May 1985 led to a flood of financial innovations but the lack of a secondary market for these has diminished their acceptance, Deutsche Girozentrale - Deutsche Kommunalbank management board member Wiegand Hennicke said. While innovations may be intellectualy stimulating, they lack transparency, he told an investors' forum in West Berlin. "Properly functioning markets require standardized products. This (condition) has not been met by some of the innovations," Hennicke said. The volume of zero coupon bonds and floating rate notes, the most widely used financial innovations in Germany, stands at four billion and 16 billion marks, respectively, a tiny proportion of the 1,000 billion marks of bonds in circulation. Even for zero-coupon bonds and floating rate notes, a secondary market had not developed, Hennicke said. One important reason for this was the bourse turnover tax, which was reducing the rate of return to the investors. West German Finance Minister Gerhard Stoltenberg said this week he believed the tax could still be removed, even if its abolition was not decided during recent coalition discussions. Karl-Herbert Schneider-Gaedicke, deputy management board chairman of DG Bank Deutsche Genossenschaftsbank, said German domestic and institutional investors had also shown reservations about investing in participation shares. One of the reasons was the widely varying terms and conditions of participation shares in West Germany. "The investor has to scrutinize (participation shares) carefully, before making an investment decision," Schneider-Gaedicke said. He added the attractiveness of participation shares could be increased by limiting the combination possibilities of terms and conditions and increasing safeguards for investors. He also urged publicizing the comparative advantage of participation shares over ordinary shares for foreigners. Foreigners do not receive the corporation tax bonus granted to domestic investors for share dividends. Karl Thomas, head of the Bundesbank's credit department, said the domestic investor had missed earnings opportunities over the last four years by failing to invest in German bonds. Domestic investors did not believe interest rates would decline and stay at low levels for such a long time, because expectations were determined by sharp interest rate fluctuations at the start of the decade. The Bundesbank has a natural interest in seeing domestic savings channelled into bonds and shares, Thomas said. A shift of savings into long-term assets would dampen monetary expansion and foster a stable rise of the money supply, he said. REUTER  19-MAR-1987 08:34:53.72 earn F f0681reute f f BC-******CARTER-HAWLEY-H 03-19 0013  ******CARTER HAWLEY HALE STORES INC 4TH QTR SHR LOSS 1.58 DLRS VS PROFIT 58 CTS Blah blah blah.  19-MAR-1987 08:40:55.05 usa cbt C G f0698reute u f BC-CBT-HEAD-CONFIDENT-OF 03-19 0142  CBT HEAD CONFIDENT OF SEPARATE CBT, MCE LIMITS BOCA RATON, Fla., March 19 - Chicago Board of Trade, CBT, President Thomas Donovan said he was confident the Commodity Futures Trading Commission, CFTC, would not force the CBT and the MidAmerica Commodity Exchange, MCE, to merge speculative position limits on futures contracts traded on the two exchanges. Last month CFTC proposed combining CBT and MCE contracts on corn, wheat, soybeans, soybean meal and oats for the purposes of applying speculative position limits. Donovan told Reuters he had spoken to CFTC officials about the matter and believed they would modify the proposal. CBT officials have complained the CFTC was reneging on a commitment made when the two exchanges formed an affiliation, and proposing to decrease spot month limits on the MCE contrary to congressional intent. Reuter  19-MAR-1987 08:45:33.50 usa cbt C f0705reute u f BC-CBT-LEADERS-PLAN-TRIP 03-19 0125  CBT LEADERS PLAN APRIL TRIP TO FAR EAST BOCA RATON, Fla., March 19 - The two top officials of the Chicago Board of Trade, CBT, are planning to visit three countries in the Far East next month to drum up support for the exchange's proposed night trading session, CBT President Thomas Donovan told Reuters. Donovan said he and CBT Chairman Karsten Mahlmann will leave April 3 and spend two weeks in Hong Kong, Tokyo and Sydney discussing the night trading session with brokerage firms, regulators and exchanges. CBT hopes to launch the first U.S. night trading session at the end of April, offering Treasury-bond and T-note futures and options on the two futures contracts between 1700 and 2100 hrs central U.S. time (2300 to 0300 hrs GMT). Reuter  19-MAR-1987 08:49:57.02 switzerland F f0709reute u f BC-SWISSAIR-PLANE-ORDER 03-19 0112  SWISSAIR PLANE ORDER FOR 1.2 BILLION SWISS FRANCS ZURICH, March 19 - Swissair <SWSZ.Z> said that the order for McDonnell Douglas Corp <MD> MD-11 long haul jets confirmed this morning was worth a total 1.2 billion Swiss francs. President Robert Staubli told a news conference it had not yet been decided whether the planes would have General Electric Co <GE.N>, Pratt and Whitney <UTX> or Rolls Royce engines. The airline said it chose the U.S. Plane rather than the rival A-340 of the European Airbus consortium because it met better the Swissair requirements and would be able to enter service in 1990 giving a smooth transition from the DC-10s it replaces. Staubli said Swissair planned to have replaced its whole fleet of 11 DC10s by 1992 at the latest, entailing the order of five more long-haul planes in addition to the six announced today. He said it would decide on the basis of the development of traffic whether these five would be MD-11s or Boeing 747s. However, Staubli ruled out the possibility that Swissair might eventually choose A-340s. "We cannot afford to operate three different types of aircraft," he said. Swissair also had no short term plans to exercise its option to buy Airbus A-310s, of which it already operates nine, officials said. But it would still hold the options open. Staubli declined to say how much it paid for each of the MD-11s. The total 1.2 billion franc figure was not only for the planes but also for spare parts and other related expenditure. Company officials said that Swissair intended to cover around 75 pct of the costs of its entire DC-10 replacement programme with internally generated funds. It hopes to raise the remaining 25 pct on the Swiss and other capital markets through issuing straight or equity related bonds and/or through a capital increase. The first such bond issue would likely come this year, they predicted. REUTER  19-MAR-1987 08:56:16.58 uk A f0726reute d f BC-BP-SALE-WAS-IN-UK-198 03-19 0115  BP SALE WAS IN UK 1987/88 BUDGET MATHS - TREASURY LONDON, March 19 - The U.K. Treasury said its 1987/88 budget arithmetic which was unveiled on Tuesday "took full account of likely proceeds" from the sale of the government's remaining 31.7 pct stake in British Petroleum Co PLC (BP.L). A statement issued by the Treasury said "the BP announcement therefore makes no difference to our estimate of privatisation proceeds in 1987/88, or to subsequent years, which remains 5.0 billion stg a year." "It makes no difference to the PSBR (Public Sector Borrowing Requirement) which the Chancellor set in the budget," it said. "It has nothing to do with the future scope for tax cuts." The Treasury's move was prompted by press speculation, officials said, which followed last night's surprise announcement by the government. It currently holds about 578.5 mln shares in BP. The Treasury statement said that the sell-off "is simply a part of the government's continuing privatisation programme, the overall size of which was announced in the Autumn (economic) Statement" (last November). It said the BP proceeds "will be received in installments, of which the first will be in 1987/88." News of the privatisation weighed down both BP's share price in London and the equity market overall, market sources said. The prospect of so much more BP paper in circulation had cut BP shares at 1340 GMT to 824 pence from yesterday's London close of 828 pence. The company's shares had been down as low as 802 pence before rebounding, stock market sources said. Worries over the ability of the London stock market to digest the BP and other privatisation issues sent the Financial Times/Stock Exchange 100 Share Index down 9.1 points by 1340 GMT to 1997.5 from last night's close. At one point the index was as low as 1989.1, the sources said. REUTER  19-MAR-1987 08:59:17.90 acq F f0733reute b f BC-******WASTE-MANAGEMEN 03-19 0015  ******WASTE MANAGEMENT SAYS IT IS PREPARED TO RAISE ITS BID FOR CHEMLAWN TO 33 DLRS A SHARE Blah blah blah.  19-MAR-1987 09:00:53.32 earn usa F f0736reute u f BC-TRANSAMERICA-<TA>-TO 03-19 0090  TRANSAMERICA <TA> TO HAVE GAIN ON UNIT SALE LOS ANGELES, MArch 19 - Transamerica Corp said it expects to realize a gain of about 75 mln dlrs on the previously-announced sale of the group life and health operations of its Transamerican Occidental Life Insurance Co subsidiary to Provident Life and Accident Co <PACC>. But it said its Transamerica Life Cos unit plans to change to a more conservative method of amortizing deferred policy acquisition costs, resulting in a one-time charge that will offset most of the gain from the sale. Transamerica said it has now signed a definitive agreement for the sale, which will be structured as a reinsurance transaction involving about 400 mln dlrs of reserve liabilities. It said the 75 mln dlr gain from the sale and about 125 mln dlrs of statutory surplus that previously supported operations of the group being sold will be used to support Transamerica Life Cos' efforts to accelerate the growth of its remaining businesses. It said closing is expected by May One, subject to regulatory approvals. Reuter  19-MAR-1987 09:01:39.59 usa F f0738reute u f BC-COCA-COLA-<KO>-IN-FIL 03-19 0046  COCA-COLA <KO> IN FILM COLORING VENTURE MARINA DEL RAY, Calif., March 19 - Color Systems Technology Inc <CLST> said it has completed formation of a joint venture called Screen Gems Classicolor with Coca-Cola Co to color and distribute feature films and television programs. Color Systems said it and Coca-Cola will share profits from worldwide television, basic cable, pay television and home video distribution, and Color Systems will also be paid by the venture to convert to color the black and white material involved. The company said Coca-Cola has initially contributed a number of its Screen Gems television series and Color Systems its library of more than 100 feature films and television series. It said the venture expects to acquire more black and white material for color conversion and will start generating revenues by distributing the combined library initially as-is. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-008.sgm000066400000000000000000002432571154025176300231600ustar00rootroot00000000000000 20-MAR-1987 16:54:10.55 earn usa F f2479reute r f BC-GANTOS-INC-<GTOS>-4TH 03-20 0056  GANTOS INC <GTOS> 4TH QTR JAN 31 NET GRAND RAPIDS, MICH., March 20 - Shr 43 cts vs 37 cts Net 2,276,000 vs 1,674,000 Revs 32.6 mln vs 24.4 mln Year Shr 90 cts vs 69 cts Net 4,508,000 vs 3,096,000 Revs 101.0 mln vs 76.9 mln Avg shrs 5,029,000 vs 4,464,000 NOTE: 1986 fiscal year ended Feb 1, 1986 Reuter  20-MAR-1987 16:57:13.73 acq F f2484reute f f BC-******CHEMLAWN-CORP, 03-20 0010  ******CHEMLAWN CORP, ECHOLAB INC SIGN DEFINITIVE MERGER AGREEMENT Blah blah blah.  20-MAR-1987 16:57:26.14 grainwheatoilseedsoybeanveg-oil usa C G f2485reute r f BC-LDC-FOOD-AID-NEEDS-DE 03-20 0124  LDC FOOD AID NEEDS DECLINE IN 1986/87 - USDA WASHINGTON, March 20 - Total food aid needs in 69 of the least developed countries declined in 1986/87, as requirments fell in many countries in Africa, the Middle East and Asia, the U.S. Agriculture Department said. In a summary of its World Agriculture Report, the department said grain production in sub-Saharan Africa was a record high in 1986, with gains in almost every country. However, food needs in Central America rose, worsened by drought-reduced crops and civil strife. Record wheat production in 1986/87 is pushing global wheat consumption for food to a new high, and higher yielding varieties have been particularly effective where spring wheat is a common crop, it said. However, may developing countries in tropical climates, such as Sub-Saharan Africa, Southeast Asia, and Central America, are not well adapted for wheat production, and improved varieties are not the answer to rising food needs, the department said. World per capita consumption of vegetable oil will rise in 1986/87 for the third straight year. Soybean oil constitutes almost 30 pct of vegetable oil consumption, while palm oil is the most traded, the department said. Reuter  20-MAR-1987 17:00:29.12 sugargraincorn usa C G T f2491reute b f BC-/U.S.-SUGAR-PROGRAM-C 03-20 0130  U.S. SUGAR PROGRAM CUT SENT TO CONGRESS BY USDA WASHINGTON, MARCH 20 - The U.S. Agriculture Department formally transmitted to Congress a long-awaited proposal to drastically slash the sugar loan rate and compensate growers for the cut with targeted income payments. In a letter to the Congressional leadership accompanying the "Sugar Program Improvements Act of 1987", Peter Myers, Deputy Agriculture Secretary, said the Reagan administration wants the sugar loan rate cut to 12 cents per pound beginning with the 1987 crop, down from 18 cts now. Sugarcane and beet growers would be compensated by the government for the price support cut with targeted income payments over the four years 1988 to 1991. The payments would cost an estimated 1.1 billion dlrs, Myers said. The administration sugar proposal is expected to be introduced in the House of Representatives next week by Rep. John Porter, R-Ill. Congressional sources said the program cut is so drastic it is unlikely to be adopted in either the House or Senate because politically-influential sugar and corn growers and high fructose corn syrup producers will strongly resist. The direct payment plan outlined by the administration targets subsidies to small cane and beet growers and gradually lowers payments over four years. It also excludes from payment any output exceeding 20,000 short tons raw sugar per grower. For example, on the first 350 tons of production, a grower would receive 6 cts per lb in fiscal 1988, 4.5 cts in 1989, 3 cts in 1990 and 1.5 cts in 1991. The income payments would be based on the amount of commercially recoverable sugar produced by a farmer in the 1985 or 1986 crop years, whichever is less, USDA said. Myers said the administration is proposing drastic changes in the sugar program because the current high price support is causing adverse trends in the sugar industry. He said the current program has artificially stimulated domestic sugar and corn sweetener production which has allowed corn sweeteners to make market inroads. U.S. sugar consumption has declined which has resulted in a "progressive contraction" of the sugar import quota to only one mln short tons this year, he said. This has hurt cane sugar refiners who rely on imported sugar processing. Furthermore, USDA said the current sugar program gives overseas manufacturers of sugar-containing products a competitive advantage. The result has been higher imports of sugar-containing products and a flight of U.S. processing facilities overseas to take advantage of cheaper sugar. USDA also said the current program imposes a heavy cost on U.S. consumers and industrial users. In fiscal 1987, USDA said consumers are paying nearly two billion dlrs more than necessary for sugar. "Enactment of this bill will reduce the price gap between sweeteners and help to correct or stabilize the many adverse impacts and trends which the sugar industry is currently facing," Myers said. The following table lists the rate of payments, in cts per lb, to growers and the quantity covered, in short tons recoverable raw sugar, under the administration's proposal to compensate sugar growers with targeted payments. QUANTITY 1988 1989 1990 1991 First 350 tons 6.000 4.500 3.000 1.500 Over 350 to 700 5.750 4.313 2.875 1.438 Over 700 to 1,000 5.500 4.125 2.750 1.375 Over 1,000 to 1,500 5.000 3.750 2.500 1.250 Over 1,500 to 3,000 4.500 3.375 2.250 1.125 Over 3,000 to 6,000 3.500 2.625 1.750 0.875 Over 6,000 to 10,000 2.250 1.688 1.125 0.563 Over 10,000 to 20,000 0.500 0.375 0.250 0.125 Over 20,000 tons nil nil nil nil Reuter  20-MAR-1987 17:00:52.39 earn canada E f2494reute d f BC-oink 03-20 0042  <OE INC> 4TH QTR NET MONTREAL, March 20 - Shr 24 cts vs 26 cts Net 1.5 mln vs 1.3 mln Revs 40.5 mln vs 33.5 mln Year Shr 80 cts vs 82 cts Net 4.9 mln vs 4.1 mln Revs 143.0 mln vs 121.1 mln Avg shrs 6.1 mln vs 5.0 mln Reuter  20-MAR-1987 17:01:28.16 usa F f2497reute r f BC-TEXAS-INSTRUMENTS-<TX 03-20 0106  TEXAS INSTRUMENTS <TXN> BEGINS BUILDING PLANT DALLAS, March 20 - Texas Instruments Inc said construction will begin in April on a new plant near Denton, Texas, on 193 acres owned by the company. It said the plant will initially employ between 1,000 and 1,500 people, and will be used by its Defense Systems and Electronics Group for producing electronic equipemnt. The plant is expected to be operational in late 1988. Separately, the company said it leased about 185,000 square feet of a complex in Texas for its Defense Systems group. It plans to transfer about 700 employees to work at the site by the third quarter of 1987. Reuter  20-MAR-1987 17:06:31.28 earn usa F f2510reute w f BC-VMS-MORTGAGE-LP-<VMLP 03-20 0037  VMS MORTGAGE LP <VMLPZ> MONTHLY CASH PAYOUT CHICAGO, March 20 - VMS Mortgage L.P. said it declared a regular monthly cash distribution of nine cts a depositary unit for the month of March, payable May 14, record April One. Reuter  20-MAR-1987 17:06:47.92 livestockpork-belly usa cme C L f2512reute u f BC-LITTLE-EFFECT-SEEN-FR 03-20 0117  LITTLE EFFECT SEEN FROM COLD STORAGE REPORT CHICAGO, March 20 - The USDA monthly cold storage report for meats is expected to have little, if any, effect on livestock and meat futures at the Chicago Mercantile Exchange Monday and daily fundamentals will likely provide the bulk of direction, livestock analysts said. The increase of 66.4 mln lbs in total poultry offsets the 22.6 mln lbs decline in total red meats. Fundamentals may provide most of the direction in futures on Monday, they said. "I think the market is going to be looking at some other things and accentuate whatever the action of cash markets might be early next week," Jerry Gidel, livestock analyst for GH Miller, said. Shearson Lehman livestock analyst Chuck Levitt said futures will be in the shadow of a little larger seasonal hog marketings pace next week. Also, Easter ham business was completed this week and there may be less aggressive interest for pork in general next week. "We needed some help from the cold storage report to avert a possible setback next week in the pork complex," Levitt said. Analysts agreed with CME floor traders and called the belly figure neutral to slightly negative. Although belly stocks were down 33 pct from last year, they exceeded the average expectation and actually showed a lighter than expected decline from last month due to an adjustment to last month's holdings, they said. However, analysts noted that the amount of bellies put in storage has been light since the beginning of March and this is a potentially bullish situation. Glenn Grimes, agronomist at the University of Missouri, said, "I would not look for (belly) storage during the next month or two to be heavier than a year ago - I think it will be less." Reuter  20-MAR-1987 17:07:44.99 shipgrain canada E F f2515reute h f BC-SEAWAY (PIX-EXPECTED) 03-20 0130  STRIKE THREAT, LOWER TRAFFIC MAR SEAWAY OPENING By Jane Arraf, Reuters MONTREAL, March 20, Reuter - The St. Lawrence Seaway, set to reopen March 31 after the winter, faces another tough year because of depressed traffic levels and the possibility of the first strike in 20 years on the Great Lakes, seaway officials said. Depressed grain exports, rising costs, and competing modes of transportation are all expected to result in only a marginal increase over last year's traffic levels -- and revenues -- on the 2,300 mile waterway, officials said. In 1986, a season that ran from April 3 to December 27, the seaway moved 37.6 mln metric tons of freight between Montreal and Lake Ontario and 41.6 mln tons on the Welland Canal, linking Lake Erie and Lake Ontario. By comparison, in 1985 about 37 mln tons of cargo traveled through the Montreal-Lake Ontario section and 42 mln through the eight-lock canal. The waterway is expected to lose 9-10 mln Canadian dlrs this year, about the same as the estimated deficit for fiscal 1986-87 ending March 31, said William Blair, an executive member of Canada's St Lawrence Seaway Authority. The seaway moves about one-half of Canada's exported grain. Those exports of the single most important commodity carried on the waterway have been depressed by world surpluses. The Seafarers' International Union, which represents about 2,300 workers on the Great Lakes and the ocean coasts, has said it will likely go on strike this spring to protest employers' demands for wage rollbacks and other concessions. "It's 99.9 pct (certain)--I guarantee you a strike," Roman Gralewicz, head of the Seafarers' Canadian branch, has said. The Canadian government has called in a labor conciliator to try to hammer out a contract agreement between the two sides. The seaway authority said a walkout tying up ships on the Great Lakes would badly hurt traffic. "We haven't had a strike on the seaway for years...a prolonged strike would have a disasterous effect," Seaway Authority spokeswoman Gay Hemsley said. "These are the heaviest contract talks in the history of the St Lawrence Seaway," George Miller, vice-president of the Canadian Lake Carriers Association, an association of major Canadian shipping companies, said recently. The workers' current contract expires May 31. The association said it is asking for a five per cent cut in wages for the next three years, reduced crew levels and the power to restructure crew dispatching. The association said its members recorded about a 6 mln dlrs (U.S.) loss in each of 1985 and 1986 due to lower traffic and freight rates and increasing competition. The seaway said 1985 was its worst year in two decades. Hemsley said the seaway authority plans to raise tolls on the Welland Canal by eight pct this year, compared to last year's 15 pct rise, while maintaining a freeze on tolls throughout the rest of the waterway. Canada is responsible for 13 of the seaway's 15 locks and about 85 pct of its revenues and maintenance costs. "We may see and hope for a steady upward climb...but we won't see a major increase for a number of years," Hemsley said. A Canada-U.S. delegation to promote the seaway to shippers in Western Europe should result in some increased traffic this season but the full benefits won't be felt for several years, Blair said. Reuter  20-MAR-1987 17:07:50.76 acq usa F f2516reute u f BC-CHEMLAWN-<CHEM>,-ECOL 03-20 0065  CHEMLAWN <CHEM>, ECOLAB <ECON> IN MERGER PACT COLUMBUS, Ohio, March 20 - Chemlawn Corp and Ecolab Inc said they signed a definitive merger agreement under which Ecolab will buy all outstanding Chemlawn common stock for 36.50 dlrs a share in cash, for a total of about 370 mln dlrs. Under terms of the agreement, Chemlawn said it rescinded its previously announced rights dividend plan. Chemlawn previously rejected a 27 dlr a share offer from Waste Management Inc <WMX>. Yesterday, the Oak Brook, Ill.-based waste disposal company said it was prepared to offer 33 dlrs a share, or about 330 mln dlrs, for Chemlawn, a lawn-care company. Chemlawn had said last week that it was negotiating with other possible suitors, which it did not identify. A Chemlawn spokesman said further details on the merger would be issued later. Ecolab is a maker of commercial laundry detergent based in St. Paul, Minn. For its first six months ended December 31, the company earned 20.4 mln dlrs, or 76 cts a share, on sales of 421.8 mln dlrs. Officials at Waste Management could not be reached for immediate comment. Reuter  20-MAR-1987 17:10:14.07 earn F f2524reute b f BC-******LILCO-REVISES-1 03-20 0011  ******LILCO REVISES 1986 NET TO INCLUDE 16 MLN DLR LOSS PROVISION Blah blah blah.  20-MAR-1987 17:12:06.51 earn usa F f2527reute h f BC-FALCON-CABLE-<FAL>-SE 03-20 0073  FALCON CABLE <FAL> SETS INITIAL DISTRIBUTION PASADENA, Calif., March 20 - Falcon Cable Systems Co said its set an initial quarterly cash distribution of 53.75 cts per unit, payable May 15 to unitholders of record March 31. The partnership made its initial public offering in December, 1986. Falcon said it expects to pay cash distributions to limited partners at an annual rate of 2.15 dlrs per unit, through December 31, 1989. Reuter  20-MAR-1987 17:12:35.20 usa F f2530reute u f BC-GENERAL-DYNAMICS-<GD> 03-20 0064  GENERAL DYNAMICS <GD> GETS 67.9 MLN DLR CONTRACT WASHINGTON, March 20 - The Electric Boat Division of General Dynamics Corp is being awarded a 67.9 mln dlr modification to a Navy contract for architectural, engineering and hardware development work for a submarine improvement program, the Defense Department said. It said the work is expected to be completed September 30, 1987. Reuter  20-MAR-1987 17:15:01.04 usa A RM f2533reute r f BC-SONAT-<SNT>-UNIT-FILE 03-20 0090  SONAT <SNT> UNIT FILES FOR DEBENTURE OFFERING NEW YORK, March 20 - Southern Natural Gas Co, a unit of Sonat Inc, said it filed with the Securities and Exchange Commission a registration statement covering a 100 mln dlr issue of debentures due 1999. Proceeds will be used, together with funds from the company's operations, to redeem Southern Natural's 15 pct sinking fund debentures of 1991. The company named Goldman, Sachs and Co, Lazard Freres and Co and Merrill Lynch Capital Markets as managing underwriters of the offering. Reuter  20-MAR-1987 17:16:21.60 crude usa Y f2536reute r f BC-BIDS-AWARDED-FOR-ELK 03-20 0104  BIDS AWARDED FOR ELK HILLS CRUDE OIL LOS ANGELES, March 20 - The U.S. Department of Energy said it has awarded bids for about 90,000 barrels per day, bpd, of crude oil from the Elk Hills Naval Petroleum Reserve in California. The contract period runs from April one through July one, the DOE said. Successful bidders, the amount of crude oil and the price per bbl according to the DOE are as follows - Texaco Inc's <TX> Texaco Trading and Transport 15,000 bpd at 15.79 dlrs and 2,200 bpd at 15.19 dlrs, Beacon Oil Co 7,000 bpd at 15.66 dlrs and 2,500 bpd at 16.04 dlrs, Golden West Refining 8,110 bpd at 15.42 dlrs. Successful bidders, the amount of oil and price per bbl, according to the DOE continue as follows - Chevron's <CHV> Chevron USA Inc 3,000 bpd at 14.51 dlrs and 4,000 bpd at 14.61 dlrs, Chevron International Oil Co 2,600 bpd at 14.41 dlrs and 2,800 bpd at 14.51 dlrs, Newhall Refining Co 6,000 bpd at 15.82 dlrs, Caljet Inc 4,000 bpd at 15.32 dlrs, Casey Co 4,000 bpd at 15.45 dlrs. Also, Cryssen Refining Inc 4,000 bpd at 15.47 dlrs, Edgington Oil Co 4,000 bpd at 15.54 dlrs, Sound Refining Inc 3,100 bpd at 15.51 dlrs, Atlantic Richfield Co <ARC> 3,000 bpd at 15.75 dlrs. Successful bidders, the amount of crude oil and the price per bbl according to the DOE continue as follows - Orkin Inc 2,679 bpd at 15.24 dlrs, Lunday-Thagard Co 2,511 bpd at 15.27 dlrs, Golden Eagle Refining 2,500 bpd at 15.37 dlrs, MacMillan Ring-Free Oil Co 1,000 bpd at 15.81 dlrs, 1,000 bpd at 15.71 dlrs and 230 bpd at 16.02 dlrs, Mock Resources 2,000 bpd at 15.76 dlrs, Petro-Diamond 2,000 bpd at 15.46 dlrs. Reuter  20-MAR-1987 17:20:28.92 earn usa F f2544reute s f BC-MONTGOMERY-STREET-INC 03-20 0024  MONTGOMERY STREET INCOME <MTS> MONTHLY DIVIDEND SAN FRANCISCO, March 20 - Mthly div 15 cts vs 15 cts Pay April 15 Record April 1 Reuter  20-MAR-1987 17:20:54.85 earn canada E f2545reute r f BC-sullivan-mines-inc 03-20 0056  <SULLIVAN MINES INC> YEAR LOSS MONTREAL, March 20 - Oper shr loss 12 cts vs profit four cts Oper loss 1,069,000 vs profit 339,000 Revs 12.8 mln vs 10.9 mln Note: 1986 shr and net exclude extraordinary gain of 382,000 dlrs or four cts share. 1985 shr and net exclude extraordinary gain of 183,000 dlrs or two cts share Reuter  20-MAR-1987 17:21:38.85 usa F f2547reute u f BC-GRUMMAN-<GQ>-GETS-109 03-20 0051  GRUMMAN <GQ> GETS 109.1 MLN DLR NAVY CONTRACT WASHINGTON, March 20 - Grumman Aerospace Corp is being awarded a 109.1 mln dlr increment of funds to a Navy contract for 12 EA-6B Prowler Electronic Warfare aircraft, the Defense Department said. It said the work is expected to be completed in July 1989. Reuter  20-MAR-1987 17:23:12.99 usa F f2549reute r f BC-MORTON-THIOKOL-<MTI> 03-20 0061  MORTON THIOKOL <MTI> GETS 61.4 MLN DLR CONTRACT WASHINGTON, March 20 - Morton Thiokol Inc's Wasatch Operations is being awarded a 61.4 mln dlr contract modification finalizing a previously awarded contract for missile rocket motors for Terrier, Tarter and Aegis ships, the Defense Department said. It said the work is expected to be completed in October 1987. Reuter  20-MAR-1987 17:26:53.43 acq usa F f2560reute u f BC-CYCLOPS 03-20 0106  INVESTMENT FIRM HAS 7.1 PCT OF CYCLOPS <CYL< WASHINGTON, March 20 - Halcyon Investments, a New York risk arbitrage and securities dealing partnership, told the Securities and Exchange Commission it has acquired 288,000 shares of Cyclops Corp, or 7.1 pct of the total outstanding. Halcyon said it bought the stake for 26.1 mln dlrs as part of its ordinary risk arbitrage and securities trading business. Other than that, the firm said there was no specific purpose in its purchases. Halcyon said it might buy more stock or sell some or all of its current stake. It said it bought the bulk of its stake between Feb 6 and March 13. Reuter  20-MAR-1987 17:27:19.61 acq canada E A f2561reute d f BC-chrysler-credit-canad 03-20 0107  CHRYSLER'S <C> CREDIT CANADA PLACED ON CREDITWATCH Montreal, March 20 - Canadian Bond Rating Service said it placed Chrysler Credit Canada Ltd, a subsidiary of Chrysler Corp <C>, on creditwatch until all financial details concerning the proposed acquisition of American Motors Corp <AMO> are finalized. The creditwatch affects Chrysler Credit Canada's short term notes, guaranteed notes, debentures and the recently completed 75 mln dlr 9.25 Eurobond issue due April 15, 1993. Canadian Bond Rating Service said that, based on facts currently available on the proposed transaction, it does not anticipate the necessity of a downgrade. Canadian Bond Rating Service said Chrysler Credit Canada short term notes are now rated A-2 (high) and guaranteed notes and debentures are rated B plus plus (high). Reuter  20-MAR-1987 17:27:55.93 earn usa F f2565reute u f BC-LILCO-<LIL>-REVISES-1 03-20 0089  LILCO <LIL> REVISES 1986 NET TO INCLUDE LOSS HICKSVILLE, N.Y., March 20 - Long Island Lighting Co said it revised its preliminary 1986 net income to include a 16 mln dlrs after tax provision for its investment in the Jamesport Nuclear units. Due to the provision, it said its revised 1986 net income was 316.7 mln dlrs or 2.13 dlrs per share after deducting for preferred stock dividend requirements, which were not paid in either 1986 or 1985. It had earlier reported 1986 income of 332.7 mln dlrs or 2.28 dlrs per share. LILCO also said its board authorized contracts for its corporate officers calling for payment of one year's salary, and continuation of insurance and retirement benefits if the company changes hands and these officers lose their jobs. LILCO said none of these contracts will result in additional costs to its customers. Lilco said the downward revision in its 1986 earnings is a reserve established to reflect a settlement agreement with the staff of New York State's Public Service Commission respecting the utility's spending on a nuclear power station planned for, but never built at, Jamestown, N.Y. The company declined to detail the settlement, explaining the settlement has not been approved by the commission. Lilco was seeking to include costs totaling 118 mln dlrs for the abandoned nuclear power plant project in its rate base, a spokeswoman said. Reuter  20-MAR-1987 17:29:58.63 acq usa F f2571reute d f BC-ROGERS-<ROG>-ADOPTS-R 03-20 0104  ROGERS <ROG> ADOPTS RIGHTS PLAN ROGERS, Conn., March 20 - Rogers Corp said its board approved a shareholder rights plan designed to protect its shareholders in the event of an attempted hostile takeover. Rogers said the plan is not being adopted in response to any specific takeover attempt. Under the plan, shareholders may buy one share of common stock at 65 dlrs for each share held. The rights will be exercisable only if a person or group acquires 20 pct or more of Rogers' shares or announces an offer for 30 pct or more. The dividend distribution will be made March 30 to holders or record on that date. Reuter  20-MAR-1987 17:32:18.21 usa nyse F f2575reute u f BC-WALL-STREET-SURVIVES 03-20 0102  WALL STREET SURVIVES TRIPLE EXPIRATIONS By Cal Mankowski, Reuters NEW YORK, March 20 - The four-times-a-year "triple witching hour" did not jolt Wall Street as much as it has in the past. Market averages finished sharply higher as stock index futures, index options and options on individual stocks expired simultaenously. Some analysts warned part of the gain may be retraced next week. But there were signs Wall Street is getting used to the phenomeon which causes a huge burst of activity in the final minutes. Officials of the New York Stock Exchange said the day went smoothly and efficiently. "This has been one of the few times that the consensus has been right," said Jim Creber, trader at Miller, Tabak, Hirsch and Co. He expects a "follow-through" Monday and Tuesday to the advance which lifted the Dow Jones Industrial Average 34 points for the day and 75 points for the entire week. Creber, whose firm was one of the first to get involved in arbitrage activity involving index futures and options, said the general trend of the market has been upward for months. "Every time the market comes in, somebody comes along with more money," he said. He said investors adding to Individual Retirement Accounts prior to a mid-April tax deadline and buying from Japanese investors are apparently helping push stocks higher. Ron Feinstein, an analyst with Dean Witter Reynolds Inc, said reports of heavy Japanese buying, just prior to the end of the fiscal year in Japan, fueled bullish sentiment. He said investors who had long positions in stocks hedged with short positions in index futures rolled the expiring March futures over into June contracts. But he added different players with other goals also were active and there was no simple explanation of the market's gyrations. For example, Feinstein noted the June contract for the June Standard and Poor's 500 stock index future hit 300 about 15 minutes prior to the close of NYSE trading. In 12 minutes, the contracted dipped to 297.50. "That could have been a wave of selling from institutional people making a roll," he said. It was the first time a nearby contract of the S and P 500 hit 300. The cash index closed at a record 298.17. "It looks like the market is going to continue to go higher," he said. "Triple expirations didn't really mean that much, it was a strong day for stocks," said Steve Chronowitz of Smith Barney, Harris Upham and Co. Chronowitz said the stock market has been underpinned by "good solid buying interest" which will cushion any pullback. Other investors who were long futures and short stocks bought stocks on the close today instead of rolling over, said Mark Zurack of Goldman, Sachs and Co. He cautioned against "over-dramatizing" the day's activity, which said was more a reflection of fundamental strength in the markets. Leigh Stevens of PaineWebber Group Inc said what he saw was mostly covering of short positions in stocks as index options and individual options expired. He said there could be a decline early next week in the stock market. "It looked like it worked well today," said Howard Kramer, asssistant director of market regulation for the Securities and Exchange Commission. But he said all of the data will have to be analyzed next week. He said there was relatively little commotion at the close, with about 50 mln shares changing hands in the final minute compared to 85 mln in the triple expirations three months earlier. He noted the Dow industrials jumped about 12 points in the closing minutes, a modest move for a 2333-point index. Kramer pointed out an SEC-NYSE measure to curb volatility, disclosure of "market-on-close" orders in 50 major stocks 30 minutes prior to the end of trading, showed imbalances of modest proportions. The disclosures are aimed at evening out volatility by attracting orders on the opposite side of the imbalance. The data showed more buy orders than sell orders for 47 stocks, a preponderance of sell orders for only one stock, and no significant imbalance for two stocks. The NYSE had tightened a rule governing what type of market on close orders can be accepted in the final half hour. Reuter  20-MAR-1987 17:39:14.71 earn usa F f2586reute s f BC-EASTGROUP-PROPERTIES 03-20 0037  EASTGROUP PROPERTIES <EGP> DIVIDEND JACKSON, MISS., May 20 Qtly div 65 cts vs 65 cts prior Payable APril 22 REcord April 10 NOTE:Company paid 30 cts special dividend along with prior quarter's dividend Reuter  20-MAR-1987 17:40:10.54 earn usa F f2588reute r f BC-SUNBELT-NURSERY-GROUP 03-20 0050  SUNBELT NURSERY GROUP INC <SBN> 2ND QTR FEB 28 FORT WORTH, Texas, March 20 - Shr loss 40 cts vs loss 29 cts Net loss 1.5 mln vs loss 1.1 mln Revs 28.9 mln vs 28.5 mln Six months Shr loss 99 cts vs loss 69 cts Net loss 3.7 mln vs loss 2.6 mln Revs 52.5 mln vs 51.7 mln Reuter  20-MAR-1987 17:41:26.30 earn usa F f2590reute d f BC-MARCOM-TELECOMMUNICAT 03-20 0067  MARCOM TELECOMMUNICATIONS <MRCM> 2ND QTR JAN 31 WEST PALM BEACH, Fla., March 20 - Oper shr loss five cts vs loss six cts Oper net loss 157,688 vs loss 96,573 Revs 1,094,331 vs 1,378,973 Avg shrs 3,315,654 vs 1,661,023 Six mths Oper shr loss seven cts vs loss 24 cts Oper net loss 198,555 vs loss 394,589 Net 2,243,377 vs 2,440,850 Avg shrs 2,796,848 vs 1,637,592 NOTE: Current year 2nd qtr and six mths excludes a loss 10,767 dlrs for discontinued operations. Prior year 2nd qtr and six mths excludes a loss of 54,686 dlrs and 112,565 dlrs for discontinued operations. Full name of company is Marcom Telecommunications Inc. Reuter  20-MAR-1987 17:43:13.77 earn usa F f2600reute s f BC-EASTPARK-REALTY-TRUST 03-20 0024  EASTPARK REALTY TRUST <ERT> QTLY DIV JACKSON, MISS, March 20 - Qlty div 25 cts vs 25 cts prior Payable April 22 Record April 10 Reuter  20-MAR-1987 17:44:23.79 trade canadausa E f2604reute h f AM-TRADE 03-20 0138  CANADA'S CLARK SEES TRADE AS MOST URGENT PROBLEM By Dean Lokken, Reuters SAN FRANCISCO, March 20 - Trade is the most urgent problem facing U.S.-Canadian relations because of a pressing need to reach a new bilateral pact within the coming months, Joe Clark, Canadian secretary of state for external affairs, said. Negotiators for the two countries have been meeting for more than a year in an effort to work out an agreement. "The most urgent problem now is the trade question because that has to be decided within the next 10 months," Clark told the Commonwealth Club of California. "We have a fast track authority from your Congress for approval or rejection of whatever the negotiators achieve." Clark said that, as a practical matter, an initial agreement must be reached by late September or early October. He listed environmental questions, particularly acid rain, and defense as the second and third most important bilateral issues facing Ottawa and Washington. On Wednesday, President Reagan announced that he will seek 2.5 billion dlrs from Congress to address the acid rain problem. Some interpreted the move as a goodwill gesture in advance of his annual meeting, on April 5-6 in Ottawa, with Prime Minister Brian Mulroney. In a question-and-answer session with the public affairs group, Clark said that the two countries must find better mechanisms for resolving their trade disputes. "This rash of countervailing actions, where we acted on corn and you acted on soft wood and we both said they were quasijudicial -- the dispute resolution mechanisims in place now are not working adequately in either of our interests," he said. Ottawa also is seeking to change some of Washington's rules on government procurement that penalize Canadian businesses, he said. "There are a number of Canadian companies that, in order to secure substantial contracts in the United States, have had to move their head offices out of our country into your country because you have national procurement requirements," he said. In turn, he added, the United States would like to change some of the procurement requirements that exist at the provincial government level in Canada. Clark declined to forecast the outcome of the discussions. "What will come out of it remains for the negotiators, in the first instance, to propose, and then governments and congresses will have judge," he said. In his prepared remarks, Clark said that the United States has tended to take Canada for granted, although it exports to its northern neighbor more than twice what it exports to Japan. "Yet you bought almost 10 per cent more from Japan last year than you bought from Canada," he said. REUTER Reuter  20-MAR-1987 17:45:15.30 earn usa F f2605reute h f BC-ESSEX-CORP-<ESEX>-YEA 03-20 0056  ESSEX CORP <ESEX> YEAR END LOSS ALEXANDRIA, Va., March 20 - Oper shr loss 11 cts vs profit 33 cts Oper net loss 132,000 vs profit 408,000 Revs 25.2 mln vs 23.0 mln NOTE: 1986 and 1985 oper net excludes a loss of 636,000 dlrs or 52 cts per share and a loss of 994,000 dlrs or 80 cts per share for discontinued operations. Reuter  20-MAR-1987 17:45:24.11 usaindonesia F f2606reute r f BC-DELTA- 03-20 0078  U.S. LAUNCHES INDONESIAN COMMUNICATIONS SATELLITE CAPE CANAVERAL, March 20 - NASA launched an Indonesian communications satellite aboard a Delta rocket, marking the first international payload to be put into orbit since the Challenger disaster more than a year ago. The 43 mln dlr satellite, the Palapa B2-P, was launched as the result of an agreement reached last year between President Ronald Reagan and Indonesia's President Suharto when they met on Bali. Reuter  20-MAR-1987 17:50:45.11 earn canada E F Y f2617reute r f BC-sulpetro 03-20 0093  <SULPETRO LTD> YEAR OCT 31 LOSS CALGARY, Alberta, March 20 - Shr loss 19.22 dlrs vs loss 3.90 dlrs Net loss 276.4 mln vs loss 45.6 mln Revs 85.4 mln vs 113.3 mln NOTE: Shr results after deducting preferred share dividends of 13.1 mln dlrs in both periods. Current loss includes a 125 mln dlr writedown of oil and gas properties, a 67 mln dlr writeoff of deferred charges, a 22.5 mln dlr loss on disposal of U.K. properties, a 21.2 mln dlr equity loss from affiliate Sulbath Exploration ltd and a 4.6 mln dlr loss on other investments. Reuter  20-MAR-1987 17:51:40.27 canada E f2619reute d f BC-alberta-budget-sets 03-20 0097  ALBERTA BUDGET SETS TAX INCREASE, LOWER DEFICIT EDMONTON, Alberta, March 20 - The Alberta provincial government will increase its general corporate tax rate on April 1 to 15 pct from 11 pct under its 1987-88 budget announced today, provincial treasurer Dick Johnston said. The budget forecasts the 1987-88 provincial deficit to be 1.90 billion dlrs, compared to a forecast deficit of 3.30 billion dlrs for fiscal 1987, which ends March 31, Johnston said. The budget forecasts fiscal 1988 revenues of 8.63 billion dlrs and expenditures of 10.42 billion dlrs, Johnston said. The provincial budget raises combined personal and corporate income taxes by about 20 pct, Johnston said. Johnston told a news conference taxes were increased after revenues from oil and gas taxes fell by 64 pct last year and are not expected to increase sharply in the short term. The provincial government expects resource tax revenues for fiscal 1987 to fall to 1.30 billion dlrs from a previously estimated 2.20 billion dlrs, compared to 3.60 billion dlrs collected in fiscal 1986 before the collapse in oil prices. Johnston told reporters he needed to raise taxes in order to begin moving towards a balanced budget in 1990-91. Johnston said the personal income tax increase takes three forms. The basic provincial tax rate rises to 46.5 pct from 43.5 pct of the basic federal income tax rate. The provincial budget also imposed a temporary eight pct surtax on individuals with taxable income of more than 36,000 dlrs, he said. In addition, the government levied a flat one pct surtax on all individuals with taxable income. Johnston said overall government spending of 10.42 billion dlrs represents a cut of 4.4 pct, but various grants and tax credits for agriculture and energy industries will remain. Reuter  20-MAR-1987 17:54:04.61 usa F f2622reute d f BC-WISCONSIN-ELECTRIC-<W 03-20 0085  WISCONSIN ELECTRIC <WTC> OFFERS PREFERRED NEW YORK, March 20 - Wisconsin Electric Power Co said it began a public offering of 700,000 shares of serial preferred stock, 6-3/4 pct series, 100 dlrs par value, at a price of 100 dlrs per share. The shares are being offered pursuant to a shelf registration covering 700,000 sahres of serial preferred stock which the company filed on February 19, 1987. Proceeds will be used to redeem outstanding preferred stock or for repayment of short-term indebtedness. Reuter  20-MAR-1987 17:55:02.25 usa A RM f2623reute r f BC-TEXAS-AIR-<TEX>-UNIT 03-20 0116  TEXAS AIR <TEX> UNIT SELLS EQUIPMENT-BACKED DEBT NEW YORK, March 20 - Continental Airlines Inc, a unit of Texas Air Corp, is offering 350 mln dlrs of equipment-backed debt securities in three tranches and another 150 mln dlrs of senior notes due 1997, said lead manager Drexel Burnham. A 100 mln dlr offering of first priority secured equipment certificates due 1992 was given a 10 pct coupon and par pricing. This tranche is non-callable to maturity. A 125 mln dlr issue of second priority secured equipment certificates due 1995 has an 11 pct coupon and par pricing and an equal-sized offering of third priority certificates due 1999 was given an 11-3/8 pct coupon and par pricing. The second two tranches of the equipment-backed deal are non-callable for five years, Drexel said. Continental's 10-year notes were assigned an 11-1/2 pct coupon and priced at par. They are non-callable for five years. Texas Air has guaranteed the scheduled payments of interest and principal for the senior notes. The securities are rated B-2 by Moody's and B by Standard and Poor's. Kidder Peabody, Merrill Lynch and Smith Barney co-managed the issues. Proceeds, estimated at 486 mln dlrs, will be used to repay about 254 mln dlrs of bank debt, with the remainder added to working capital, Continental said. Reuter  20-MAR-1987 18:00:25.76 earn usa F f2628reute r f BC-STANWOOD-CORP-<SNW>-4 03-20 0073  STANWOOD CORP <SNW> 4TH QTR JAN 3 NEW YORK, March 30 - Shr loss 1.12 dlrs vs profit one cts Net loss 1.7 mln vs profit 8,000 dlrs Revs 31.8 mln vs 42.1 mln Year Shr loss 51 cts vs profit 57 cts NEt loss 780,000 vs profit 876,000 Revs 117.8 mln vs 117.3 mln NOTE:1986 4th qtr includes loss of 911,000 for termination of licensing agreement and loss of 319,000 dlr for termination of womens wear operation. Reuter  20-MAR-1987 18:01:38.04 usa F f2630reute r f BC-GUEST-SUPPLY-<GEST>-G 03-20 0059  GUEST SUPPLY <GEST> GETS SHAREHOLDER SUIT NORTH BRUNSWICK, N.J., March 20 - Guest Supply INc said a shareholder sued it and certain officers and directors, alleging misrepresentations and omissions in the prospectus for the company's September 1986 public offering. Guest said the complaint is without merit and will defend the action vigorously. Reuter  20-MAR-1987 18:01:49.51 usabraziljapan conable worldbankimf A RM f2631reute r f BC-CONABLE-SAYS-BRAZIL-D 03-20 0106  CONABLE SAYS BRAZIL DEBT MORATORIUM IS TEMPORARY WASHINGTON, March 20 - World Bank President Barber Conable said he believed Brazil's decision to suspend foreign debt interest payments is temporary. Conable in a wide-ranging television interview to be shown on public broadcasting tomorrow said Brazil now has the attention of its creditors and must come up with a plan designed to reform its economy. "I think the Brazilians have the attention of many of their creditors, but they must come up with a plan that will persuade people that the Brazilian economy is going to be put on a course that will result in some growth." Turning to Japan, Conable said the role of that country has been increasing in the World Bank and is expected to continue to do so. He said that Japan had made an additional 450 mln dlr pledge to the International Development Association, an indication that it agrees that it must provide more help in line with its economic position. Conable said there was no indication that the Soviet Union was serious about joining the International Monetary Fund and World Bank. He said they would have to get convertible currency and open their books and the Soviets "don't usually do that." REUTER  20-MAR-1987 18:06:35.19 earn canada E F Y f2635reute r f BC-sulpetro-loss-due-to 03-20 0116  SULPETRO LOSS DUE TO WRITEDOWNS, ASSET DISPOSALS Calgary, Alberta, March 20 - <Sulpetro Ltd> said its 1986 fiscal year net loss of 276.4 mln dlrs, or 19.22 dlrs per share, was due to several factors, the largest of which was a writedown of 125.0 mln dlrs of oil and gas properties. Sulpetro also recorded a writeoff of deferred charges amounting to 67.0 mln dlrs, a loss of 22.5 mln dlrs on the disposal of all properties in the United Kingdom and an equity loss of 21.2 mln dlrs from affiliate Sulbath Exploration Ltd. There was also a loss on other investments of 4.6 mln dlrs and a loss on operations of 36.1 mln dlrs after interest, depletion, depreciation and income tax recoveries. In the fiscal year ended October 31, 1985, Sulpetro had a net loss of 45.6 mln dlrs, or 3.90 dlrs per share. The company also said its non-recourse project financing for the Irish-Lindergh heavy oil field remains in default due to continuing low oil prices. Reuter  20-MAR-1987 18:07:55.50 acq usa F f2636reute u f BC-AMERICAN-EXPRESS-<AXP 03-20 0099  AMERICAN EXPRESS <AXP> TO DISCUSS SHEARSON DEAL New York, March 20 - American Express Co's board of directors Monday will discuss the company's arrangement to sell 13 pct of Shearson Lehman Brothers Inc to Nippon Life Insurance Co, a company spokesman said. The spokesman would not say whether the board is planning to vote on the understanding between American Express and Nippon Life. The Shearson stake is to be sold for 530 mln dlrs, American Express has said. The spokesman also would not comment on speculation that the board was to discuss a sale of securities to the public. Monday's board meeting is a regular monthly meeting. The plan to sell part of Shearson to Nippon Life must be approved by the American Express board and Japan's Ministry of Finance. Earlier, American Express and Shearson said they were subpoenaed by the Securities and Exchange Commission. American Express said it was subpoenaed for documents pertaining to securities transactions of American Express and Fireman's Fund. Shearson was subpoenaed for documents related to transactions with Jefferies and Co and others. The American Express spokesman said he could not comment on whether any officials of the firm were subpoenaed. Reuter  20-MAR-1987 18:11:31.62 crudenat-gasfuel usa Y f2642reute r f BC-NATURAL-GAS-SEEN-RECA 03-20 0107  NATURAL GAS SEEN RECAPTURING SOME MARKET SHARE By NAILENE CHOU-WIEST, Reuters NEW YORK, March 17 - Higher crude oil prices will raise demand for natural gas, helping it to reclaim market share lost to heavy oil when prices plunged in 1986, analysts said. The analysts said that these efforts will be most successful in the industrial sectors of the economy with large and growing energy requirements. "Natural gas stands a good chance to recapture the share of oil supplied to electric utilities that it lost to the residual fuel industry last year," Michael Smolinski, an energy economist with Data Resources Inc, told Reuters. An estimated 200,000 barrels per day of residual fuel went into the utilities market at the expense of natural gas last year when world oil prices plunged, Smolinski said. Assuming oil prices hold above 15 dlrs a barrel, national average gas prices delivered to the utilities at a projected 2.10 to 2.25 dlrs per mln Btu would be very competitive, Michael German, vice president of economic analysis at American Gas Association said. The average delivered prices at the end of January were 2.10 dlrs per mln Btu, compared with 3.26 dlrs a year ago. "We expect natural gas to regain 250 to 400 billion cubic feet (of demand) in the overall energy market in the second and third quarter (1987)," he said. In addition to price competitiveness, availability will be an important factor persuading energy users to switch to gas, Frank Spadine, senior energy economist with Bankers Trust Corp. in New York noted. Spadine said the mild winter in many parts of the North American continent has led to a build up of gas inventories and less would be necessary to replenish underground storage this spring freeing gas for spot sales. These forecasts develop a strong counterpoint to the fears that natural gas suplies would be tight and prices significantly higher given a sharp decline in drilling last year. AGA's German contended that despite the drilling decline, much of U.S. proved reserves could be brought to production quickly through developments such as the infill drilling which permits more wells to be drilled in proved reserve basins. Citing recent EIA statistics, German said, the gas surplus was likely to contract from three trillion cubic feet in 1986 to two trillion cubic feet in 1987, but the surplus would not go away until 1990. Smolinski of Data Resources agreed that the surplus would persist until 1990. While gas supplies may tighten in certain consuming areas, notably in California and in the Northeast U.S., an overall shortfall appeared remote. Reuter  20-MAR-1987 18:14:24.22 usa F f2647reute r f BC-LOUISIANA-LAND-<LLX> 03-20 0064  LOUISIANA LAND <LLX> ASSUMES INEXCO'S DEBT NEW ORLEANS, March 20 - Louisiana Land and Exploration Co said it assumed the obligation to pay the principal and interest on the 8-1/2 pct convertible subordinated debentures due September 1, 2000 of Inexco Oil Co, a unit of Louisiana Land. Effective March 23, the debentures will be listed as the debentures of Louisiana Land, LLXOO. Reuter  20-MAR-1987 18:16:46.86 canada E A f2653reute r f BC-macmillan-bloedel-to 03-20 0063  MACMILLAN BLOEDEL <MMBLF> TO REDEEM DEBENTURES VANCOUVER, British Columbia, March 20 - MacMillan Bloedel Ltd said it will redeem all outstanding nine pct series J debentures on April 27, 1987 for 34.9 mln U.S. dlrs, plus a premium of one pct and accrued and unpaid interest. The series J debentures were issued in Europe in 1977 and were due February 1992, the company said. Reuter  20-MAR-1987 18:19:27.03 trade usajapan F A RM f2659reute r f AM-TRADE-COMPUTERS 03-20 0106  U.S. SENATORS SAY SANCTIONS LIKELY ON MICROCHIPS By Jacqueline Frank, Reuters WASHINGTON, March 20 - The United States will likely impose sanctions soon on imports of Japanese microchips, senators said today after a private meeting with Commerce Secretary Malcolm Baldrige. Although the senators said Baldrige told them no decision would be taken until a final determination is made on whether Japanese microchips were dumped in the United States, they said they were virtually sure Japan would face penalties. President Reagan's trade policy advisory group, of which Baldrige is a member, will meet on the issue Wednesday. "I am confident we will see action taken," Sen. John McCain, an Arizona Republican, told reporters. "I am expecting sanctions at least, and even more than sanctions," Sen. Pete Domenici, a New Mexico Republican, said. The senators, several congressmen and U.S. semiconductor industry representatives met with Baldrige and State Department officials to discuss Japan's alleged violations of a September 1986 agreement to stop dumping its microchips in the United States and other countries. They recommended Japanese firms be penalized through tariffs or import duties over the next six to 12 months for continuing to dump microchips. The violations were worth 100 mln dls to the Japanese semiconductor industry, they said. Asked if Baldrige intended to recommend sanctions, Sen. Pete Wilson told reporters, "The clear import of what he said is that there will be." "Japan can't just say they will comply. We think sanctions must be applied," for past violations of the agreement, the California Republican said. The semiconductor industry produces microprocessor chips which are used in high technology products ranging from radios to defence missile guidance systems. Sen. James McClure, an Idaho Republican, said Baldrige told them the administration had not made a final determination that Japanese companies had dumped semiconductor microchips below the cost of production in the United States or other countries. But McClure said senators told him, "There is no doubt dumping is going on," based on evidence such as invoices of purchases of the Japanese products. The two countries signed a pact last September in which Japan agreed to stop selling its microchips in the United States and other countries below production costs and to allow the U.S. semiconductor industry access to the Japanese market. In return, the United States waived its right to impose import duties on the Japanese microchips. Japanese officials have said they have lived up to the pact and have asked Japanese chip-makers to further slash output to save the pact. Japan has frequently been the target of congressional discouragement over last year's record 169-billion-dlr trade deficit. Tokyo had a 59-billion-dlr surplus with the United States last year and had large surpluses with other countries. The Senate yesterday unanimously passed a resolution calling for action against Japan for violations of the pact since September. The resolution will be introduced in the House next week by Rep. Bob Matsui, a California Democrat. Reuter  20-MAR-1987 18:20:01.80 earn usa F f2661reute d f BC-MULTI-MEDIA-SEES-YEAR 03-20 0093  MULTI-MEDIA SEES YEAR END LOSS NEW YORK, March 20 - Multi-Media Barter Ltd said it expects to report a net loss of 820,000 dlrs or 17 cts a share for the year ended December 31, compared to a loss of 553,000 or 11 cts a share in the prior year. The fourth quarter resulted in a net loss of 227,000 or four cts compared to a loss of 330,000 or six cts a shares last year. It said it is currently in the process of restructuring by reducing expenses and streamlining operations and has cut expenses from 50,000 dlrs to less than 15,000 dlrs a month. Reuter  20-MAR-1987 18:25:06.34 usa F f2670reute d f BC-WIEBOLDT'S-TO-CLOSE-E 03-20 0110  WIEBOLDT'S TO CLOSE EIGHT STORES CHICAGO, March 20 - Wieboldt's Department Stores, in Chapter 11 bankruptcy since September 1986, said as part of an agreement with creditors it will operate its four largest and most productive stores but close the remaining eight stores. It said 341 employees of its remaining 885 employees will be laid off or terminated as a result. The company also said it established a fund of about 12 mln dlrs to be available for payment of creditors' claims. The retailer said it would continue to operate its four largest and most productive Chicago area outlets - State Street, Randhurst, Harlem-Irving and Ford City. Reuter  20-MAR-1987 18:26:27.13 earn usa F f2673reute w f BC-NATIONAL-HMO-CORP-<NH 03-20 0058  NATIONAL HMO CORP <NHMO> 2ND QTR JAN 31 MELBOURNE, Fla, March 20 - Shr loss nine cts vs profit nine cts Net loss 478,000 vs profit 371,000 Revs 3.4 mln vs 2.6 mln Six months Net loss 466,000 vs profit 685,000 Revs 6.2 mln vs 5.0 mln NOTE:1987 net loss includes writeoff of deferred start up costs totaling 490,000 dlrs. Reuter  20-MAR-1987 18:39:41.65 earn canada F f2685reute r f BC-MINORCO-<MNRCY>-HALF 03-20 0038  MINORCO <MNRCY> HALF YEAR DEC 31 TORONTO, ONtario, March 20 - Shr 26 cts vs 38 cts Net 44.0 mln vs 65.0 mln NOTE:1986 net includes one mln dlr extraordinary gain and 1985 net icludes four mln dlrs extraordinary loss. Reuter  20-MAR-1987 18:41:04.26 usaphilippines RM A f2686reute u f BC-PHILIPPINE-DEBT-TALKS 03-20 0110  PHILIPPINE DEBT TALKS TO CONTINUE ON SATURDAY NEW YORK, March 20 - The Philippines and its bank advisory committee completed another round of debt rescheduling talks and will meet again on Saturday, a senior banker said. Although today's negotiations did not produce a final agreement, the decision to meet at the weekend appears to be a signal that the two sides are making progress. The Philippines seeks to restructure 9.4 billion dlr of its 27.2 billion dlr foreign debt. The interest rate to be charged on the debt and Manila's proposal to pay interest partly with investment notes instead of cash have been the main sticking points in the talks. Reuter  20-MAR-1987 18:41:09.81 earn usa F f2687reute r f BC-MINORCO-<MNRCY>-SEES 03-20 0069  MINORCO <MNRCY> SEES IMPROVED SECOND HALF TORONTO, Ontario, March 20 - Minorco said it expects net earnings to be substantially stronger than the 44.0 mln dlrs reported for the first half. In reporting that first half results declined from 65.0 mln dlrs, Minorco said the contributions from its 50 pct investment in December 1985 in Adobe Resources Corp was negative as a result of low oil and gas prices. Reuter  20-MAR-1987 18:41:20.90 earn usa E f2688reute r f BC-MINORCO-<MNRCY>-SEES 03-20 0069  MINORCO <MNRCY> SEES IMPROVED SECOND HALF TORONTO, Ontario, March 20 - Minorco said it expects net earnings to be substantially stronger than the 44.0 mln dlrs reported for the first half. In reporting that first half results declined from 65.0 mln dlrs, Minorco said the contributions from its 50 pct investment in December 1985 in Adobe Resources Corp was negative as a result of low oil and gas prices. Reuter  20-MAR-1987 18:44:31.15 usa A f2691reute r f BC-FDIC-SAYS-INDIANA-BAN 03-20 0091  FDIC SAYS INDIANA BANK BECOMES 48TH TO FAIL WASHINGTON, March 20 - The Federal Deposit Insurance Corp said state banking regulators closed the Morocco State Bank in Morrocco, Indiana, bringing the total number of banks to fail so far this year to 48. The failed bank's 14.1 mln dlrs in deposits and 9.9 mln dlrs of its loans and other assets will be assumed by DeMotte State Bank in DeMotte, Ind, the FDIC said. The FDIC said it will advance 3.7 mln dlrs to help the transaction and would retain 5.1 mln dlrs in the failed banks assets. Reuter  20-MAR-1987 18:48:35.54 usa V RM f2693reute u f AM-ARMS-KAMPELMAN 03-20 0112  U.S. ARMS NEGOTIATOR SAID TO HAVE HEART ATTACK WASHINGTON, March 20 - U.S. arms negotiator Max Kampelman suffered a mild heart attack, an aide said. Nancy Tackett, Kampleman's staff assistant, told Reuters Kampelman was doing well and was expected to leave George Washington Hospital in about a week. "A full recovery is expected," she said. Kampelman did not feel well yesterday and may have sufffered the heart attack then, Tackett said. He had a regularly-scheduled physical this morning and entered the hospital after that, on his doctor's advice, she said. A hospital spokesman confirmed that Kampelman was a patient in the coronary care unit. Reuter  20-MAR-1987 18:49:16.73 usa A f2695reute u f BC-DALLAS-BASED-THRIFT-C 03-20 0103  DALLAS-BASED THRIFT CLOSED BY REGULATORS WASHINGTON, March 20 - The Federal Home Loan Bank Board said Dallas-based Vernon Savings and Loan Association, the 15th largest thrift in Texas, was closed by state authorities and its assets, deposits and liabilities were transfered to a new federally chartered association. Vernon, with 1.35 billion dlrs of assets and nine offices in Texas and Oklahoma, was closed after state regulators concluded it was in unsafe and unsound condition. The thrift was owned by Texas businessman Donald Dixon, who bought it in early 1982, when it had only 120 mln dlrs in assets. The bank board said growth was accomplished largely through the purchase of brokered deposits and the sale of jumbo certificates of deposit, which totaled 29 pct of total deposits at the end of 1986. The bank board also said that 96 pct of its loan portfolio was nonperforming as a result of sloppy loan practices. It said Vernon also paid excessive salaries and dividends to officers and directors and bought a beach house and five airplances for the use of thrift executives and stockholders. The bank board ousted the thrift's officers and directors and hired another Texas association to run it. The bank board also said it closed First Federal of Maryland, a federal savings association that had 115.2 mln dlrs in assets. It said its 118 mln dlrs in insured deposits were transferred to Columbia First Federal Savings and Loan Association of Washington, D.C. The bank board said First Federal had engaged in unsound loan underwriting practices and many of the loans are now deliquent. The institution experienced heavy and continuing losses and became insolvent, the bank board said. Reuter  20-MAR-1987 18:50:54.45 tin bolivia imfworldbank RM A f2699reute r f BC-BOLIVIA-PREPARES-FOR 03-20 0108  ECONOMIC SPOTLIGHT - BOLIVIA By Paul Iredale, Reuters LA PAZ, March 20 - Bolivia, once Latin America's most delinquent debtor, is preparing for a second International Monetary Fund agreement after an economic stabilisation program has effectively slowed inflation and reduced public spending. A fund spokesman said an IMF team would visit La Paz shortly to discuss terms of the new agreement. He said the IMF had disbursed 130 mln dlrs here and 20 mln dlrs are pending under the one year agreement that ends this month. The accord provided for a stand-by loan, a compensatory financing facility and a structural adjustment facility. The spokesman said that if the agreement is renewed, Bolivia can expect a further 60-mln-dlr stand-by loan over the next 12 months. Bolivia's agreement with the IMF, its first since 1980, opened the door to rescheduling negotiations with the Paris Club and Argentina and Brazil, which hold 2.5 billion dlrs of Bolivia's 4.0-billion-dlr foreign debt. Central Bank President Javier Nogales told Reuters the negotiations with the Paris Club, which have yet to be finalised, had been extremely successful. Nogales said the Paris Club had agreed to reschedule Bolivia's debt over 10 years with five to six years grace and had waived all interest payments until the end of 1988. Bilateral discussions on interest rates continue, he said. Nogales said Bolivia was expecting some 400 mln dlrs in disbursements this year from lender countries and international agencies, including the World Bank and the Inter-American Development Bank, although diplomatic and banking sources put the figure at closer to 300 mln dlrs. Nogales said Bolivia's net international reserves are around 250 mln dlrs, up from one mln dlrs when President Ictor Paz Estenssoro took office in august 1985. Nogales said the capital flow on Bolivia's debt servicing versus new credits had changed from a net outflow of 200 mln dlrs in 1985 to a net inflow of 130 mln dlrs in 1986. Bolivia's return from the financial wilderness follows paz estenssoro's economic stabilisation program. He inherited inflation of 23,000 pct a year, state enterprises that were losing hundreds of mlns of dlrs and a currency that traded on the black market at up to 16 times its official rate. Paz estenssoro froze public sector wages, set a market- related rate for the peso, introduced tax reforms and laid off thousands of workers in state corporations. Inflation has been running at 10 pct a year for the past six months, according to the Central Bank, and the government expects the economy to grow three pct this year after a 14 pct contraction over the last six years. The government is also proposing a novel solution to its debt to commercial banks, some 900 mln dlrs, on which interest has not been paid since March, 1984. Nogales said that over the next few months Bolivia would make a one-time offer to buy back all its commercial debt at the price it trades on the international secondary market -- 10-15 cents on the dlr. He said Bolivia's commercial bank steering committee agreed at a meeting in New York to consider the proposal, but it is still unclear what proportion of the country's creditor banks will take up the offer. One foreign banker speculated that Bolivia might be able to buy back up to 30 pct of its commercial debt paper under the deal, mostly from small banks who have written off their loans to the country. But he said the larger creditors were more interested in a scheme of debt-equity swaps, similar to that which has operated in Chile for the past two years. The Bolivian government has yet to draw up proposals for debt-equity swaps, but the banker said it was planning to privatise more than 100 state companies and these could serve as a basis for such a scheme. Foreign bankers said this type of proposal might prove attractive to Bolivia in the long run, especially as the government realises that it will have to attract a large amount of new capital in order to grow. Planning Minister Gonzalo Sanchez de Lozada told Reuters that Bolivia was hoping for five to six billion dlrs in new investment over the next 10 to 12 years. The government realises that in order to remain viable, Bolivia will need to develop new exports. The price of tin, which accounted for some 45 pct of Bolivia's exports in 1984, has collapsed on the world markets, and gas, the country's major revenue earner, is in abundant supply in the region. Reuter  20-MAR-1987 18:51:57.82 earn usa F f2703reute r f BC-NEOAX-INC-<NOAX>-4TH 03-20 0046  NEOAX INC <NOAX> 4TH QTR LAWRENCEVILLE, N.J., March 20 - Shr loss 13 cts vs loss six cts Net loss 1.4 mln vs loss 635,000 Revs 40.3 mln vs 28.5 mln Year Shr profit 40 cts vs profit 26 cts Net profit 4.2 mln vs 2.6 mln Revs 166.4 mln vs 94.6 mln NOTE:1986 4th qtr and year net reflects dividend requirements of 1.5 mln dlrs and 3.3 mln dlrs, and charges of 257,000 dlrs and 4.6 mln dlrs respectively which is not accruable or payable because of pre-reorganization tax loss carryforwards. 1985 4th qtr and year net reflects dividend requirement of 1.1 mln dlrs and 2.3 mln dlrs, respectively, and charges of 472,000 dlrs and 2.9 mln dlrs respectively which is not accruable or payable because of pre-organization tax loss carryforwards. Reuter  20-MAR-1987 18:57:24.80 usa F f2706reute r f BC-PACIFIC-STOCK-EXCHANG 03-20 0083  PACIFIC STOCK EXCHANGE SHORT INTEREST UP SAN FRANCISCO, March 20 - The Pacific Stock Exchange said there was a total short interest of 1,413,674 shares of stock exclusively traded on the Exchange as of March 13, an increase of 102,486 shares from last month's restated total of 1,311,188. The Exchange said the short interest ratio rose to 1.42 from last month's ratio of 1.25. The ratio is based on an average daily trading volume of 994,545 shares in the 47 issues included in the report. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-009.sgm000066400000000000000000002346041154025176300231550ustar00rootroot00000000000000 24-MAR-1987 15:59:17.10 usa F f2412reute u f BC-ADVANCED-MAGNETICS-<A 03-24 0066  ADVANCED MAGNETICS <ADMG> IN AGREEMENT CAMBRIDGE, Mass., March 24 - Advanced Magnetics Inc said it reached a four mln dlrs research and development agreement with ML TEchnolgy Ventures LP, a limited partnership sponsored by Merrill LYnch Capital Markets. Under the agreement, Advanced Magnetics will develop and conducts clinical trials of its contrast agents for magnetic resonance imaging. The agreement includes a warrant permitting MLTV to buy up to 380,000 shares of Advanced Magnetics common stock through February 1994 at 10.50 dlrs per sahre. Reuter  24-MAR-1987 15:59:39.63 usa F f2414reute d f BC-HEALTH-RESEARCH-FILES 03-24 0108  HEALTH RESEARCH FILES FOR BANKRUPTCY MINNEAPOLIS, Minn., March 24 - <Health Research and Management Group> said it has filed for protection under Chapter 11 of the federal bankruptcy law. The company said it filed the petitions to reorganize debt and eliminate contingent liabilities it incurred while attempting to expand nationally. Health Research also said it owes about 750,000 dlrs of its 1.1 mln dlrs in debt to <MedPro Group Inc>, a former jont venture partner. The company added it has asked the Minnesota Department of Commerce to suspend trading of its common stock pending dissemination of current financial information. Also, the company said George Frisch has been elected chairman of the board, president and chief executive officer, replacing Daniel Zismer, who resigned as chairman of the board and O. Frederick Kiel, who resigned as president and chief executive officer. Reuter  24-MAR-1987 16:00:01.29 earn usa F f2415reute h f BC-NUMEREX-CORP-<NMRX>-2 03-24 0052  NUMEREX CORP <NMRX> 2ND QTR JAN 31 LOSS MINNEAPOLIS, MINN., March 24 - Shr loss seven cts vs profit five cts Net loss 149,421 vs profit 103,120 Sales 1,698,345 vs 1,920,010 Six Mths Shr loss five cts vs profit nine cts Net loss 100,472 vs profit 191,614 Sales 3,836,794 vs 3,650,322 Reuter  24-MAR-1987 16:01:25.88 V RM f2419reute f f BC-******U.S.-SELLING-12 03-24 0015  ******U.S. SELLING 12.8 BILLION DLRS OF 3 AND 6-MO BILLS MARCH 30 TO PAY DOWN 1.2 BILLION DLRS Blah blah blah.  24-MAR-1987 16:02:17.95 V RM f2423reute f f BC-******U.S.-2-YEAR-NOT 03-24 0015  ******U.S. 2-YEAR NOTE AVERAGE YIELD 6.43 PCT, STOP 6.44 PCT, AWARDED AT HIGH YIELD 85 PCT Blah blah blah.  24-MAR-1987 16:03:55.80 usa F f2426reute u f BC-COMMODORE-<CBU>,-ATAR 03-24 0056  COMMODORE <CBU>, ATARI IN SETTLEMENT NEW YORK, March 24 - Commodore International Ltd said it settled and discontinued all pending litigation with Atari Corp. The company issued a statement which said the case had been settled on terms satisfactory to both sides. Company officials were not immediately available for comment. Reuter  24-MAR-1987 16:04:42.31 trademoney-fx usataiwanjapansouth-korea RM A f2428reute b f BC-/BALDRIGE-SUPPORTS-NI 03-24 0088  BALDRIGE SUPPORTS NIC TALKS ON CURRENCIES WASHINGTON, March 24 - Commerce Secretary Malcolm Baldrige said he supported efforts to persuade newly-industrialized countries (NICS) to revalue currencies that are tied to the dollar in order to help the United States cut its massive trade deficit. "We do need to do something with those currencies or we will be substituting Japanese products for Taiwanese products," or those of other nations with currencies tied to the dollar, Baldrige told a House banking subcommittee. The U.S. dollar has declined in value against the Yen and European currencies, but has changed very little against the currencies of some developing countries such as South Korea and Taiwan because they are linked to the value of the dollar. As a result, efforts to reduce the value of the dollar over the past year and a half have done little to improve the trade deficits with those countries. Baldrige told a House Banking subcommittee that the Treasury Department was attempting to persuade those countries to reach agreement with the United States on exchange rates. Reuter  24-MAR-1987 16:05:14.04 usa F f2431reute u f BC-TRIANGLE-<TRI>-BEGINS 03-24 0044  TRIANGLE <TRI> BEGINS EXCHANGE OFFER NEW YORK, March 24 - Triangle Industries Inc said it began a previously announced offer to exchange one share of Triangle common stock for each share of participating preferred stock. The offer will expire April 21. Triangle said that sales in 1987 will exceed four billion dlrs. For the year ended December 31, 1986, Triangle reported sales of 2.7 billion dlrs and net income of 47.6 mln dlrs. Reuter  24-MAR-1987 16:05:42.34 usa F f2435reute r f BC-SOUTHMARK-<SM>-UNIT-I 03-24 0108  SOUTHMARK <SM> UNIT IN PUBLIC OFFERING OF STOCK DALLAS, March 24 - Southmark Corp's National Heritage Inc said it has started the initial public offering of 2,000,000 shares of common stock at 9.50 dlrs per share. It said all shares are being traded though NASDAQ under the symbol <NHER>. The lead underwriter for the offering is Drexel Burnham Lambert Inc, with Bear, Stearns and Co Inc., and E.F. Hutton and Co Inc acting as co-underwriters, the company said. Proceeds will be used to augment working capital, complete scheduled renovations at some National Heritage leased facilities and repay certain debts to Southmark, it said. Reuter  24-MAR-1987 16:06:25.01 acq F f2438reute f f BC-******EASTMAN-KODAK-C 03-24 0013  ******EASTMAN KODAK CO TO SELL HOLDINGS IN ICN PHARMACEUTICALS AND VIRATEK INC Blah blah blah.  24-MAR-1987 16:07:44.11 usa A f2442reute r f BC-FEUD-PERSISTS-AT-U.S. 03-24 0105  FEUD PERSISTS AT U.S. HOUSE BUDGET COMMITTTEE WASHINGTON, March 24 - A feud among Democrats and Republicans persisted at the House Budget Committee, stalling the writing of a fiscal 1988 U.S. budget plan. Republicans failed to appear at a drafting session called by Democratic committee chairman William Gray as a make-up meeting to end bickering that has delayed budget activity for a week and threatens the ability of Congress meeting an April 15 deadline for completing the deficit-cutting budget. Republicans told Gray yesterday they would appear today and participate if the meeting was held behind closed doors. He said the Republicans were prepared to make a "good faith" effort to cooperate if the budget deliberations were held behind closed doors and not in public as is the normal procedure. However, they failed to appear today and Gray said he had been told they wanted House Speaker Jim Wright to answer a series of budget questions posed by House Republican leader Bob Michel before they would cooperate in budget matters. The budget feuding led the Washington Post today to editorialize that it was childish, similar to an eraser fight among fourth grade students. Reuter  24-MAR-1987 16:07:51.39 interest usa A RM f2443reute u f BC-TREASURY-BALANCES-AT 03-24 0084  TREASURY BALANCES AT FED ROSE ON MARCH 23 WASHINGTON, March 24 - Treasury balances at the Federal Reserve rose on March 23 to 3.332 billion dlrs from 3.062 billion dlrs on the previous business day, the Treasury said in its latest budget statement. Balances in tax and loan note accounts fell to 15.513 billion dlrs from 17.257 billion dlrs on the same respective days. The Treasury's operating cash balance totaled 18.845 billion dlrs on March 23 compared with 20.318 billion dlrs on March 20. Reuter  24-MAR-1987 16:08:11.64 usa A f2444reute r f BC-FARM-CREDIT-SYSTEM-SE 03-24 0112  FARM CREDIT SYSTEM SEEN NEEDING 800 MLN DLRS AID WASHINGTON, MARCH 24 - A member of the board which regulates the farm credit system said Congress should plan to provide at least 800 mln dlrs in fiscal 1988 to bailout the troubled system, but other members of the board differed. Jim Billington, Farm Credit Administration (FCA) board member told a House Agriculture Appropriations subcommittee hearing "I feel your subcommittee should plan on providing at least 800 mln next year to assist the Farm Credit System." However, FCA board member Marvin Duncan differed, saying "it is premature to talk about the cost of a solution until we know what kind of solution." Chairman of the FCA board, Frank Naylor, said it might be possible to structure a rescue of the system with government guarantees or a line of credit which requires little or no upfront government money. However, Billington said Congress must provide help immediately because "this system needs some assurance that it will get some help." The FCA estimates the system could lose up to 1.4 billion dlrs in 1987, exhausting the remainder of its working capital, Naylor said. The farm credit system is expected to present its own proposals for government aid to a Senate Agriculture subcommittee hearing on Thursday. Naylor said the Treasury Department is continuing to refine Reagan administration ideas on how a rescue should be structured. Congressional sources said they hope to begin drafting a rescue bill for the farm credit system as early as next week. Reuter  24-MAR-1987 16:09:09.08 iron-steel usa F f2445reute u f BC-USX-<X>-USS-UNIT-RAIS 03-24 0068  USX <X> USS UNIT RAISES PRICES LORAIN, Ohio, March 24 - USX Corp's USS subsidiary said that effective with shipments beginning July 1 prices for all leaded grades and 1200-series grades of hot rolled bar and semi-finished products from its Lorain, Ohio, facility will be increased by 15 dlrs a ton over the prices in effect June 1. It said the increase is being made to reflect current market conditions. Reuter  24-MAR-1987 16:10:06.45 trade japanusa F f2447reute d f BC-UNIONIST-URGES-RETALI 03-24 0108  UNIONIST URGES RETALIATION AGAINST JAPAN WASHINGTON, March 24 - William Bywater, president of the International Union of Electronic Workers, called on President Reagan to retaliate against Japan for unfair practices in semiconductor trade. He said in a statement a crash program was needed in the semiconductor industry to prevent the United States from becoming "one of the world's industrial lightweights." Bywater's remarks came as the White House Economic Policy Council prepared for a Thursday meeting to decide what sanctions if any should be taken against Japan for alleged violations of a U.S.-Japanese semiconductors agreement. The pact, agreed to last July, called for Tokyo to end selling semiconductors at below cost and to open its home market to U.S. goods. In return, Washington agreed to forego antidumping duties on Japanese semiconductors. But U.S. officials have said that while Japan has stopped dumping in the U.S. market, it has not ended third country dumping; nor has it opened its market to U.S. semiconductors. Japan yesterday, in an effort to ward off U.S. action, ordered a cutback in semiconductors production as a way to force prices up and end the dumping. Bywater, in his statement, said he backed a Defense Science Board task force proposal to set up a consortium to develop new electronic products and manufacturing processes and make the U.S. industory more competitive. But he added the industry could not wait for legislation to pass and that action was required now to help the depressed electronic industry. Bywater said, "I urge the Reagan Administration to take full and severe action immediately against Japan by invoking the retaliatory steps that are permitted under U.S. law and GATT (General Agreement on Tariffs and Trade)." Reuter  24-MAR-1987 16:12:10.73 usa F f2454reute u f BC-EXXON-(XON)-GETS-99.2 03-24 0030  EXXON (XON) GETS 99.2 MLN DLR CONTRACT WASHINGTON, March 24 - Exxon Co USA of Houston has been awarded a 99.2 mln dlr contract for jet fuel, the Defense Logistics Agency said. Reuter  24-MAR-1987 16:12:45.97 usa F f2456reute u f BC-EATON-(ETN)-GETS-53.0 03-24 0035  EATON (ETN) GETS 53.0 MLN DLR CONTRACT WASHINGTON, March 24 - Eaton Corp's AIL Division has received a 53.0 mln dlr contract for jamming system work for the EA-6B electronic warfare aircraft, the Navy said. Reuter  24-MAR-1987 16:12:53.77 grainrice usazaire C G f2457reute u f BC-ZAIRE-AUTHORIZED-TO-B 03-24 0077  ZAIRE AUTHORIZED TO BUY PL 480 RICE - USDA WASHINGTON, March 24 - Zaire has been authorized to purchase about 30,000 tonnes of U.S. rice under an existing PL 480 agreement, the U.S. Agriculture Department said. It may buy the rice, valued at 5.5 mln dlrs, between March 31 and August 31, 1987, and ship it from U.S. ports by September 30, the department said. The purchase authorization covers the entire quantity of rice provided under the agreement. Reuter  24-MAR-1987 16:13:26.14 usa F f2459reute u f BC-MCDONNELL-DOUGLAS-GET 03-24 0036  MCDONNELL DOUGLAS GETS 30.6 MLN DLR CONTRACT WASHINGTON, March 24 - McDonnell Douglas Corp (MD) has received a 30.6 mln dlr contract for work on development of the standoff land attack missile (SLAM), the Navy said. REUTER  24-MAR-1987 16:15:17.01 acq usa F f2463reute r f BC-MIDIVEST-ACQUIRES-ASS 03-24 0080  MIDIVEST ACQUIRES ASSETS OF BUSINESS AVIATION ROANOKE, Va., March 24 - <Midivest Inc> said it acquired all the assets of <Business Aviation Inc> of Sioux Falls, S.D., for an undisclosed amount of stock. Midivest said it expects to sell 10 to 20 of the renovated Beechcraft planes next year. It said management will also lease these airborne intensive care units to hospitals and government subdivisions through Metropolitan Leasing, a wholly-owned subsidiary of Midivest. Reuter  24-MAR-1987 16:15:59.31 grainwheat usajordan C G f2464reute u f BC-U.S.-WHEAT-CREDITS-FO 03-24 0113  U.S. WHEAT CREDITS FOR JORDAN SWITCHED WASHINGTON, March 24 - The Commodity Credit Corporation (CCC) has switched 25.0 mln dlrs in wheat credit guarantees to Jordan under the Export Credit Guarantee Program to the Intermediate Export Credit Guarantee Program, the U.S. Agriculture Department said. The switch reduces the total value of GSM-102 guarantees for the current fiscal year to 30.0 mln dlrs. The credit terms extended for export sales under the Intermediate Export Credit Guarantee Program (GSM-103) must be in excess of three years but not more than seven years. All sales must be registered and exports completed by September 30, 1987, the department said. Reuter  24-MAR-1987 16:17:44.35 money-fxdlr usajapanuk V RM f2474reute r f BC-DOLLAR-EXPECTED-TO-FA 03-24 0108  DOLLAR EXPECTED TO FALL DESPITE INTERVENTION By Claire Miller, Reuters NEW YORK, March 24 - Central bank intervention in the foreign exchange markets succeeded in staunching the dollar's losses today, but senior dealers here believe the U.S. currency is headed for a further retreat. Although the intervention was widespread, dealers perceive that the six major industrial nations have differing levels of commitment to their recent accord to stabilize currencies. Moreover, hard economic realities hold greater sway over the currency market than central bank intervention and these argue for a further dollar decline, dealers said. "The market can be bigger than the central banks. And economic fundamentals will always come to the fore," said a dealer at one major U.S. bank. As the dollar dropped to post-World War II lows against the yen today foreign exchange traders said the Bank of Japan, Federal Reserve Board and Bank of England intervened in the markets on behalf of the U.S. currency. Reports of the authorities' actions helped the dollar recover to about 149.45 yen in New York this afternoon from the post-war low of 148.20 yen in the Far East. But it still failed to regain Monday's U.S. closing level of 150.00/05 yen. Tokyo dealers said the Bank of Japan bought one to 1.5 billion dlrs in Tokyo today and may also have purchased dollars yesterday in the U.S. via the Federal Reserve. Meanwhile, there were strong rumors in New York that the Fed also bought a modest amount of dollars around 148.50 yen today. Talk also circulated that the Bank of England purchased a small amount of dollars for yen. The Fed's last confirmed intervention was on January 28 when it bought 50 mln dlrs in coordination with the Bank of Japan. But on March 11 the Fed also was rumored to have signalled displeasure with a dollar surge above 1.87 marks. The authorities' actions appeared to back up the February 22 Paris pact between the U.S., Japan, West Germany, Britain, France and Canada under which the nations agreed to cooperate to foster exchange rate stability around prevailing levels. But foreign exchange dealers were not overly impressed by the authorities' intervention which they said can only soften extreme moves in the market. For one thing, some dealers believed that the Fed's purchases were done on behalf of the Bank of Japan rather than for the U.S. central bank's own account, suggesting a rather watered-down American commitment to the currency accord. The Bank of England's action also was thought to be completed on behalf of the Japanese central bank, reinforcing the market's view that Japan is the most resolute of the six nations in its support of the currency pact. "No-one doubts the Bank of Japan is serious. But the other two central banks seem to be making more token gestures than anything else," said Chris Bourdain of BankAmerica Corp. "I'm not convinced the intervention was concerted," said Earl Johnson of Harris Trust and Savings Bank in Chicago. "It's a yen problem more than anything else." Some dealers said a rising wave of trade protectionist sentiment in the U.S. limits the extent to which the American authorities can endorse a stronger dollar against the yen. "The dollar's break below the key 150 yen level ties the Treasury's hands behind its back. The U.S. cannot intervene on its own account because of the strength of protectionism here," said Albert Soria of Swiss Bank Corp. Such comments reflect the view that the currency markets are becoming increasingly politicized. Despite official denials, some traders still feel the U.S. would countenance a lower dollar to help trim the nation's trade deficit. The majority of the 170 billion dlr merchandise trade deficit in 1986 was with Japan. Indeed U.S. Treasury secretary James Baker's comment on Sunday that the February currency pact had not established dollar targets was read by the market as a signal to sell the U.S. currency and kicked off the latest retreat. "The dollar still has more room on the downside against the yen based on the frictions in trade and financial services. The currency market is becoming very political," said Natsuo Okada of Sumitomo Bank Ltd. Okada expects the dollar to trade between 148 and 150 yen this week but sees the chance of a drop to 140 yen by the end of April or early May. Even if West Germany and Japan succeed in stimulating their economies, it may not be enough to solve structural economic imbalances in the near future, dealers said. "Even if Japan and West Germany do expand this year, it won't be enough to help the trade situation much," said Bourdain of BankAmerica, who also expects the dollar to drop to 148 yen in the next couple of days. Reuter  24-MAR-1987 16:17:58.20 usa RM V f2475reute u f BC-/U.S.-TO-SELL-12.8-BI 03-24 0066  U.S. TO SELL 12.8 BILLION DLRS IN BILLS WASHINGTON, March 24 - The U.S. Treasury said it will sell 12.8 billion dlrs of three and six-month bills at its regular auction next week. The March 30 sale, to be evenly divided between the three and six month issues, will result in a paydown of 1.2 billion dlrs as maturing bills total 13.99 billion dlrs. The bills will be issued April 2. Reuter  24-MAR-1987 16:22:32.09 usa F f2482reute r f BC-INLAND-STEEL-<IAD>-TO 03-24 0081  INLAND STEEL <IAD> TO BUILD NEW PLANT IN INDIANA SOUTH BEND, Ind., March 24 - Inland Steel Industries and Governor Robert Orr of Indiana said the new joint venture cold- rolled steel plant between Inland Steel and Nippon Steel Corp will be built on a site in St. Joseph County Indiana. Inland Steel said yesterday that the joint venture, to be named I/N Tek, will cost more than 400 mln dlrs and will employ over 200 people by the time the companies complete the project in 1990. Reuter  24-MAR-1987 16:22:41.79 acq usa F f2483reute b f BC-******EASTMAN-KODAK-C 03-24 0093  EASTMAN KODAK <EK> TO SELL HOLDINGS ROCHESTER, N.Y., March 24 - Eastman Kodak Co said it plans to sell its 2.3 pct holding in ICN Pharmaceuticals <ICN> and part of its nine pct holdings in Viratek <VIRA>. It said the purpose of the investments had been to lay the groundwork for the creation of its Nucleic Acid Research Institute. Since that has been achieved, there is no longer any reason to maintain the equity positions, Kodak said. Kodak holds 470,000 sahres of ICN, currently trading at about 18-3/4 and 700,000 of Viratek, trading at 44. Reuter  24-MAR-1987 16:23:12.76 usa boesky F f2485reute u f BC-GUINNESS 03-24 0094  GUINNESS SUES BOESKY IN FEDERAL COURT NEW YORK, March 24 - <Guinness PLC> has joined investors suing former Wall Street speculator Ivan Boesky, alleging it was deceived into putting money into his one billion dlr investment partnership in 1986. Guinness, the largest limited partner in Ivan F. Boeksy and Co. L.P., is the latest to file suit in federal court in Manhattan against Boesky, court papers show. About 40 other investors have also filed suit over similar allegations, including that Boesky did not reveal his illegal insider trading activities. Guinness is charging it was induced to join in the Boesky partnership through a prospectus that contained "material untrue statements and omissions." The suit also alleged that the Boesky Corporation, which became a part in the formation of the investment partnership, Ivan F. Boesky and Co., L.P., "had achieved its extraordinary rates of return as a result of trading on inside information and other violations of the securities laws." In addition, the suit charged that Boesky and other defendants unlawfully "schemed with and provided substantial assistance to one another to evade the registration provisions" of securities law. Reuter  24-MAR-1987 16:23:23.82 acq usacanada F E f2486reute r f BC-FIRM-REDUCES-SCEPTRE 03-24 0078  FIRM REDUCES SCEPTRE RESOURCES <SRL> HOLDINGS WASHINGTON, March 24 - Montreal-based Noverco Inc told the Securities and Exchange Commission it reduced its stake in Sceptre Resources Ltd to 1,232,200 shares or 4.8 pct of the total outstanding. Noverco said it sold off 400,500 shares "to reduce the investment of Noverco in Sceptre." "Additional common shares of Sceptre may be sold or purchased by Noverco, depending upon market conditions," Noverco said. Reuter  24-MAR-1987 16:23:35.03 F f2487reute b f BC-******GENCORP-BOARD-W 03-24 0011  ******GENCORP BOARD WITHDRAWS PROPOSALS TO STAGGER DIRECTORS TERMS Blah blah blah.  24-MAR-1987 16:26:21.04 earn canada E f2496reute d f BC-<ACKLANDS-LTD>-1ST-QT 03-24 0029  <ACKLANDS LTD> 1ST QTR FEB 28 NET TORONTO, March 24 - Shr three cts vs 11 cts Net 126,000 vs 434,000 Revs 84.0 mln vs 80.2 mln Avg shrs 4,948,731 vs 3,870,511 Reuter  24-MAR-1987 16:30:25.13 earn usa F f2511reute d f BC-BULL-AND-BEAR-GROUP-A 03-24 0078  BULL AND BEAR GROUP A <BNBGA> CUTS FUND PAYOUTS NEW YORK, March 24 - Bull and Bear Group A said it lowered its monthly dividends on three of its funds. It said it lowered its Tax Free Income Fund <BLTFX> to 10.3 cts from 10.6 cts; its U.S. Government Guaranteed Securities Fund <BBUSX> to 11.5 cts from 11.8 cts; and its High Yield Fund <BULHX> to 14 cts from 14.2 cts. All dividends are payable March 31 to shareholders of record March 25, the company said. Reuter  24-MAR-1987 16:30:42.93 crude usa Y f2513reute r f BC-CALTEX-TO-RAISE-BAHRA 03-24 0107  CALTEX TO RAISE BAHRAIN OIL PRODUCT PRICES NEW YORK, March 24 - Caltex Petroleum Corp said it will raise posted prices for naphtha and several grades of residual fuel in Bahrain, effective March 25. Caltex, a joint venture of Chevron Corp <CHV> and Texaco INC <TX>, said its naphtha posting is up four cts a gallon to 43 cts. It said it is raising its marine diesel oil posting by 30 cts a barrel to 20.24 dlrs a barrel. Light, medium, and heavy fuel oil postings are up 1.50 dlrs a barrel, the company said. This will bring the light fuel oil price to 16.90 dlrs, medium to 15.50 dlrs, and heavy to 14.60 dlrs, the company said. Reuter  24-MAR-1987 16:31:01.12 pet-chem usa F f2515reute u f BC-CHARTER-CO-<QCHR>-TO 03-24 0093  CHARTER CO <QCHR> TO COMPLETE REORGANIZATION JACKSONVILLE, Fla., March 24 - Charter Co, the huge petrochemical concern in bankruptcy proceedings stemming from hundreds of dioxin-related claims, said it and all of its subsidiaries, except the Independent Petrochemical Corp, will complete their reorganization on March 31. It said that on that date, it will deposit with an escrow agent 288.8 mln dlrs in cash, 66.7 mln dlrs in notes and 31 mln shares of its common for distribution. Company officials were not immediately available for comment. As previously reported, Charter settled dioxin-related claims for about 1,200 individuals and the state of Missouri, resolving claims against it and all subsidiaries except Independent Petrochemical. Charter said some of the settlements remain subject to appeals and final court approvals and resolve claims against charter and its subsidiaries except Independent Petrochemical. It said about 500 individual claims against it and certain of its units remain pending as disputed claims in bankruptcy court. It said about 300 of these claims have been filed since confirmation of the joint plan of reorganization. Charter said its two creditors, an equity committee in its bankruptcy proceedings and <American Financial Corp>, which will own 50.5 pct of its common after the reorganization, have waived the requirement that Charter resolve all dioxin-related claims against it prior to completing its reorganization. That requirement excludes claims against Independent Petrochemical. Charter also said a plan for liquidation of Independent has been approved by the bankruptcy court and will be completed after March 31. Earlier, Charter reported net income for the year of 153.2 mln dlrs, which included a gain of 28.5 mln dlrs for discontinued operations and 114.8 mln dlrs for the settlement of claims in its reorganization proceedings. In 1985, it reported earnings of 1,274,000 dlrs, which included a loss of 36.3 mln dlrs for discontinued operations and 29.4 mln dlrs for extraordinary items. For the fourth quarter, it reported earnings of 118.8 mln dlrs, including a gain of 28.6 mln dlrs for discontinued operations and 90.5 mln dlrs mainly for claims settlements. In the year-ago period, Charter reported a loss of 13 mln dlrs. Reuter  24-MAR-1987 16:32:07.68 acq usa F f2518reute r f BC-NASHUA-<NSH>-TO-PURCH 03-24 0083  NASHUA <NSH> TO PURCHASE PRIVATE DISC MAKER NASHUA, N.H., March 24 - Nashua Corp said it signed a letter of intent to purchase <Lin Data Corp>, a private manufacturer of high-capacity rigid discs for storage of computer data. Under the terms of the letter, Nashua said it will acquire all classes of Lin stock for 24 mln dlrs. In addition, it said it will loan Lin 1,200,000 dlrs to support its operations. The closing of the sale is set for the second quarter of 1987, the company said. Reuter  24-MAR-1987 16:34:49.02 earn usa F f2522reute r f BC-ALTRON-INC-<ALRN>-4TH 03-24 0072  ALTRON INC <ALRN> 4TH QTR JAN 3 WILMINGTON, Mass, March 24 - Shr loss 56 cts vs loss five cts Net loss 1.9 mln vs loss 164,000 revs 6.9 mln vs 5.4 mln Year Shr loss 1.15 dlrs vs profit 52 cts Net loss 3.8 mln vs profit 1.7 mln Revs 25.6 mln vs 29.8 mln NOTE: 1987 net loss includes loss 6.5 mln dlrs for nonrecurring reserve for closing costs of facility, writeoffs and sales of real estate. Reuter  24-MAR-1987 16:38:19.15 usa F f2534reute r f BC-COLLINS-FOODS-<CF>-MO 03-24 0077  COLLINS FOODS <CF> MOVES UP WARRANT CONVERSION LOS ANGELES, March 24 - Collins Foods International Inc said it moved up the conversion date for its warrants to purchase common stock to April 24. There are currently 2,160,000 warrants outstanding, the company said. It said each warrant entitles the holder to buy one Collins common share at 12.11 dlrs per share. Collins also said the warrants were originally scheduled to expire on December 15, 1988. But the agreement under which the warrants were issued permits the company to accelerate the date if the closing price of its common stock equals or exceeds 21.78 dlrs per share for 10 consecutive trading days, the company said. It also pointed out that the stock price closed at 22.75 dlrs per share on March 23. Reuter  24-MAR-1987 16:38:34.38 earnacq usa F f2535reute u f BC-GENCORP-<GY>-PROPOSAL 03-24 0098  GENCORP <GY> PROPOSALS WITHDRAWN FROM MEETING AKRON, Ohio, March 24 - GenCorp Inc said it withdrew from consideration at its annual meeting on March 31 proposals aimed at providing for a stock split and an increased dividend so that it could focus its energies on responding to the takeover offer made last week by a partnership of AFG Industries Inc <AFG> and Wagner and Brown. In addition to proposing an increase in the number of its outstanding common shares, GenCorp had suggested the adoption of a classified or "staggered" board and the elimination of cumulative voting. GenCorp said these proposals could "distract energy and attention from the real task at hand -- to respond to the tender offer in a manner which is in the best interests of the company, its shareholders and its other constituencies." GenCorp said the proposal to increase its outstanding shares was made with the aim of declaring a stock split and a dividend increase. The other proposals, it said, would provide for greater long-term stability and cohesiveness for the GenCorp board. The company did not indicate when it might resubmit the proposals for approval by its shareholders. Reuter  24-MAR-1987 16:39:39.76 usa Y f2540reute r f BC-WEEKLY-ELECTRIC-OUTPU 03-24 0073  WEEKLY ELECTRIC OUTPUT UP 2.4 PCT FROM 1986 WASHINGTON, March 24 - U.S. power companies generated a net 47.47 billion kilowatt-hours of electrical energy in the week ended March 21, up 2.4 pct from 46.36 billion a year earlier, the Edison Electric Institute (EEI) said. In its weekly report on electric output, the electric utility trade association said electric output in the week ended March 14 was 48.31 billion kilowatt-hours. The EEI said power production in the 52 weeks ended March 21 was 2,557.44 billion kilowatt hours, up 2.1 pct from the year-ago period. Electric output so far this year was 602.26 billion kilowatt hours, up 2.2 pct from 589.51 billion last year, the EEI said. Reuter  24-MAR-1987 16:40:00.41 usa F f2541reute r f BC-MONOLITHIC-<MMIC>-TO 03-24 0096  MONOLITHIC <MMIC> TO DROP GATE ARRAY LINE SANTA CLARA, Calif., March 24 - Monolithic Memories Inc said it plans to discontinue marketing its gate array integrated circuit product line and focus efforts on the market for field-programmable products. It said the current market dynamics will hinder profitability in the gate array market for some time. Monolithic also said it does not expect the move to have a negative impact on earnings, adding, the company has estimated that the gate array products would have contributed only one pct of revenues in fiscal 1987. Reuter  24-MAR-1987 16:40:32.83 crudegas Y f2543reute u f BC-******API-SAYS-DISTIL 03-24 0015  ******API SAYS DISTILLATE STOCKS OFF 4.07 MLN BBLS, GASOLINE OFF 2.69 MLN, CRUDE UP 8.53 MLN Blah blah blah.  24-MAR-1987 16:41:16.33 earn usa F f2547reute r f BC-VERMONT-FINANCIAL-SER 03-24 0038  VERMONT FINANCIAL SERVICES <VFSC> SETS PAYOUT BRATTLEBORO, Vermont, March 24 - Vermont Financial Services Corp said its board approved a regular 20 cts per share cash dividend payable April 25 to shareholders of record March 26. Reuter  24-MAR-1987 16:41:51.89 acq F f2551reute f f BC-******RESORTS-INTERNA 03-24 0011  ******RESORTS INTERNATIONAL GETS BUYOUT PROPOSAL FROM KSZ CO INC Blah blah blah.  24-MAR-1987 16:42:09.41 usa F f2554reute d f BC-VR-BUSINESS-BROKERS-E 03-24 0073  VR BUSINESS BROKERS EXPANDS OPERATIONS BOSTON, March 24 - <VR Business Brokers> said it sold a master franchise license to one of the largest independent groups of management consultants in the Caribbean. It said that under the master license the group will operate under the name VR Caribbean Inc and will cover countries of the Caribbean basin and Central America and Dade County, Fla. Terms of the sale were not disclosed. Reuter  24-MAR-1987 16:42:29.98 usa F f2556reute u f BC-CORRECTED---ATT-<T>-F 03-24 0112  CORRECTED - ATT <T> FORMS COMPUTER SALES GROUPS NEW YORK, March 24 - American Telephone and Telegraph Co said it formed a 600-member sales force dedicated exclusively to its computers and other data systems products. Separately, ATT denied reports that it plans to buy back a large chunk of its stock. ATT's stock is up 1/4 points at 25-1/8 in heavy trading. The company said it also created a separate 500-member team that will educate the computer sales force and its other sales groups on ATT's computer products. This group, ATT said, reports directly to Vittorio Cassoni, senior vice president of its computer unit. (Corrects sales support team size to 500) REUTER  24-MAR-1987 16:44:02.04 earn usa F f2558reute s f BC-GREAT-ATLANTIC-AND-PA 03-24 0024  GREAT ATLANTIC AND PACIFIC TEA CO INC <GAP> DIV NEW YORK, March 24 - Qtly div 10 cts vs 10 cts prior Payable May one Record April 15 Reuter  24-MAR-1987 16:44:47.92 acq usa F f2559reute d f BC-GARTNER-GROUP-<GART> 03-24 0077  GARTNER GROUP <GART> ACQUIRES COMTEC PROGRAM STAMFORD, Conn., March 24 - Gartner Group Inc said it acquired sole ownership of the COMTEC Market Research Program. Gartner said its wholly-owned subsidiary purchased the interests of its former partners for an aggregate price of 1,125,000 plus a percentage of net sales proceeds on future sales of certain products. Prior to the acquisition, Gartner Group owned one-third in the COMTEC partnership, it said. Reuter  24-MAR-1987 16:48:46.78 usa F f2569reute r f BC-U.S.-CAR-SALES-DOWN-3 03-24 0117  U.S. CAR SALES DOWN 3.9 PCT IN MID-MARCH Detroit, March 24 - Sales of U.S.-made cars during mid-March, the traditional start of the spring selling season, dropped 3.9 pct behind last year's level, analysts say. Automakers sold about 204,000 cars in the March 11-20 selling period, 10,000 fewer than last year. Analysts said the decline may auger poorly for the rest of the spring season. Buyers shied away from the showrooms of American Motors Corp <AMO>, the target of a 1.5 billion dlr takeover bid from Chrysler Corp <C>. Analysts said consumers were anxious about the whether Chrysler will retain some American Motors models, causing a 62 pct drop in American Motors sales in mid-March. Chrysler's mid-March sales fell 3.6 pct. "During the spring selling season, you usually look for some kind of seasonal uplift in sales. It doesn't look like it's happening," said Joseph Philippi, analyst with E.F. Hutton and Co. "There may be less bloom to the spring selling season this year than last," one auto company official conceded. General Motors Corp <GM>, still working to regain consumer interest in its cars, led the drop with a 14.8 pct decline. Ford Motor Co's <F> sales increased 15.2 pct for the period. But analysts said the rise compares to a 1986 period for Ford, leaving it down 10 pct in two years. "The total industry (mid-March sales) was slightly less than expected," the company official said. American Motors' decline caught analysts eye. "American Motors took it on the chin--big," said Philippi. Given the prospective takeover by Chrysler, "people might be a little leary about going to (American Motors) dealers," he said. American Motors sold 790 domestic cars in the period, meaning each of American Motors 1,050 dealers "is selling a car about every other day," Philippi said. Potential American Motors buyers are afraid their car models "might disappear," he said. Chrysler, in its purchase agreement with American Motors' majority stockholder <Renault>, has agreed not to undercut sales of American Motors' new Medallion and Premier cars, made by Renault. On a company by company basis, sales of U.S. made cars from the March 11 to 20 period were--GM 105,438, down 14.8 pct, Ford 67,672, up 15.2 pct, Chrysler 30,909, down 3.6 pct, American Motors 790, down 6.2 pct, American Honda 7,447 compared with 5,031, Nissan Motor Corp, 3,358, up 10.7 pct, Volkswagon U.S. Inc 1,330, down 35 pct. Reuter  24-MAR-1987 16:54:19.43 acq usa F f2583reute u f BC-RESORTS-INT'L-<RT.A> 03-24 0079  RESORTS INT'L <RT.A> RECEIVES TAKEOVER OFFER ATLANTIC CITY, N.J., March 24 - Resorts International Inc said it received a proposal from <KSZ Co Inc> under which holders of Resorts class B stock would receive 140 dlrs a share in cash and one share of common stock in a new company to be formed through the takeover. Under the offer, Resorts said holders of its class A shares would receive 15 dlrs a share in cash and three shares of common stock in the new company. Resorts said the offer from KSZ calls for a merger of Resorts with RI Acquisition Co Inc, a newly formed Delaware corporation. Resorts said that prior to the merger, RI Acquisition would be capitalized with about 100 mln dlrs of debt and about 220 mln dlrs of equity. It said 200 mln dlrs of the equity would be in the form of special preferred stock. The KSZ offer, Resorts said, indicates that KSZ has a commitment from <M. Davies Cos> to buy all of the special preferred stock. Resorts said the offer will expire at 1700 EST on March 27. It said it asked its investment advisor, Bear, Stearns and Co, to advise its board on the offer. Earlier this month, the estate of James M. Crosby and certian members of his family agreed to sell their class B shares to New York real estate tycoon Donald Trump for 135 dlrs a share. The estate and family members hold 78 pct of the 752,297 class B shares outstanding. Trump also agreed to pay 135 dlrs a share for the remaining class B shares outstanding. Resorts also has about 5,680,000 shares of outstanding class A stock. These shares carry one one-hundredth the voting power of the class B shares. Trump's offer beat out a rival bid of 135 dlrs a share made by Pratt Hotel Corp <PRAT>. Resorts said that under the proposal made by KSZ, existing class A and class B shareholders would control about 96 pct of the outstanding common of the new company formed to acquire Resorts. Resorts said the new company, upon completion of the merger, would hold the 220 mln dlrs of debt and that the special preferred stock would immediately be converted into exchangeable participating preferred of the new company. This preferred, Resorts said, would pay a dividend based on the net cash flows from the new company's Paradise Island operations. A Resorts spokesman said the KSZ offer was made in a two-page letter and that Resorts could not comment on it because it did not contain enough information. Resorts has asked Bear, Sterns to obtain complete data, he said. The spokesman said Resorts is not familiar with KSZ but that it believes the company is controlled by Marvin Davis, the Denver oilman. Calls to Davis were referred to Lee Solters, who handles public relations for Davis. Solters, said to be travelling, was not immediately available for comment. Donald Trump was also unavailable for comment, as was a spokesman for the Crosby estate. Reuter  24-MAR-1987 16:56:59.34 earn usa A F RM f2588reute r f BC-CITICORP-<CCI>-SEES-D 03-24 0111  CITICORP <CCI> SEES DOUBLING IN RETAIL BANK NET NEW YORK, March 24 - Citicorp expects net income in its individual banking sector to top one billion dlrs by 1993, compared with 462 mln dlrs in 1986, said Richard Braddock, head of Citicorp's individual banking division. "We can double our earnings over the next five to seven years," he told a banking analysts meeting, adding that this forecast may be on the conservative side. He said that bank card operations and the New York branch system would continue to turn in hefty profits but also picked out other developing areas, such as U.S. mortgage and international consumer, as major potential earners. Braddock and his sector heads made the following more specific predictions: - Cost of funds and net credit loss levels in the U.S. bankcard unit will taper off in coming years from 1986's relatively inflated levels. - Customer net revenue in the mortgage banking area will rise to 464.7 mln dlrs in 1987 from 374.3 mln in 1986. - The international consumer business will show 22 pct compound annual growth in earnings between 1986 and 1992. - Private banking earnings will hit 100 mln dlrs in 1987 and top 200 mln dlrs in 1992. Reuter  24-MAR-1987 16:58:33.67 earn usa F f2593reute d f BC-WD-40-CO-<WDFC>-2ND-Q 03-24 0042  WD-40 CO <WDFC> 2ND QTR FEB 28 NET SAN DIEGO, Calif., March 24 - Shr 35 cts vs 40 cts Net 2,642,000 vs 3,017,000 Sales 19.1 mln vs 18.9 mln Six Mths Shr 69 cts vs 70 cts Net 5,178,000 vs 5,299,000 Sales 35.6 mln vs 33.8 mln Reuter  24-MAR-1987 16:59:02.01 usa nasdaq F f2594reute u f BC-NASD-TO-BEGIN-SEARCH 03-24 0105  NASD TO BEGIN SEARCH FOR NEW PRESIDENT NEW YORK, March 24 - The National Association of Securities Dealers, which will launch a search for a new president later this week, will probably concentrate on candidates with an extensive background in the financial markets, officials of the organization said today. Gordon Macklin, 58, who has served as president for 17 years, today announced his decision to leave the organization of 6,658 broker-dealers. Macklin will join Hambrecht and Quist as chairman and co-chief executive officer. Association chairman Joseph Hardiman will appoint a search committee later this week. The committee will have its first meeting as early as next week. The new president is expected to be someone knowledgable about the over-the-counter markets and committed to the concept of self-regulation. Macklin joined the association as president in 1970, leaving a position at McDonald and Co. The National Association of Securities Dealers Automated Quotations System, which currently lists 5200 securities of 4400 companies, was ushered in 10 months after Macklin's arrival. Reuter  24-MAR-1987 17:00:51.46 trade brazilusa C G L M T f2599reute d f AM-BRAZIL-COMPUTER 03-24 0136  BRAZIL COMPUTER MARKET TO REMAIN CLOSED-MINISTER RIO DE JANEIRO, MARCH 24 - Brazilian Science and Technology Minister Renato Archer said Brazil will keep its computer market closed to foreign goods in order to give its own infant industry time to develop. "Every country establishes laws to protect its interests. The United States closed their borders at a certain stage to some foreign goods and therefore protected its industrial development. Now it is time for Brazil to do likewise," Archer said at the opening of a national software conference. After several meetings, Brazil and the U.S. Have made no major progress in their computer row, which they have been trying to resolve for the past 18 months. The Reagan administration has objected to Brazil protecting its computer industry from imports. Reuter  24-MAR-1987 17:02:09.20 usa F f2603reute d f BC-METALBANC-IN-OFFERING 03-24 0053  METALBANC IN OFFERING MIAMI, March 24 - Metalbanc Corp said signed a letter of intent for a proposed public offering of one mln units, consisting of four shares of common stock and stock purchase warrants for two additional shares. The units are expected to be sold at between five dlrs and 6.50 dlrs per unit. Reuter  24-MAR-1987 17:03:05.68 earn usa F f2608reute d f BC-NORTHERN-INDIANA-PUBL 03-24 0071  NORTHERN INDIANA PUBLIC SVC <NI> AGAIN OMITS DIV HAMMIND, Ind., March 24 - Northern Indiana Public Service Company said it again omitted its quarterly common stock dividend which would have been payable in May. NIPSCO said it has not paid a qtly dividend since December 1985 following an adverse decision by the Indiana Supreme Court denying amortization of about 191 mln dlrs NIPSCO invested in its Bailly N-1 project. Reuter  24-MAR-1987 17:03:18.88 money-fxdlr A RM f2610reute f f BC-******FED'S-JOHNSON-S 03-24 0013  ******FED'S JOHNSON SAYS DOLLAR STABILIZED AFTER FED TOOK APPROPRIATE ACTION Blah blah blah.  24-MAR-1987 17:05:30.74 money-fxtrade usajapan volcker A RM f2612reute r f BC-FED-CHAIRMAN-VOLCKER 03-24 0108  FED CHAIRMAN VOLCKER SAYS BANK PROPOSALS A WORRY WASHINGTON, March 24 - The chairman of the Federal Reserve Board, Paul Volcker, has written to the chairman of the House Banking Committee to raise concerns about legislative proposals scheduled for consideration Wednesday. Volcker told committee chairman Fernand St. Germain a proposal to deny primary dealer status to firms from countries that do not grant U.S. firms equal access to their government debt markets might invite retaliation against U.S. firms abroad. He added, "even Japan, against whom this proposal seems to be particularly directed," has started opening its markets. In his letter, made available at the Treasury, Volcker also said a proposal to ease debt problems of developing countries by setting up a public facility to buy their debts owed to commercial banks, was a problem. "I believe that the prospect of debt relief would undermine the difficult internal efforts of the borrowing countries to achieve the structural reform that is needed regardless of the policies that are followed on servicing external debt," Volcker said. It might also cause private lenders to become reluctant to extend more credit to the borrowing countries, he said. Volcker said he endorsed comments by Treasury Secretary James Baker "about the inappropriateness of using public resources for purchasing private commercial bank debt, which we both see as an inherent aspect of the proposed international debt facility." He also said a proposal for establishing formal procedures for international negotiations on currency exchange rates "is unrealistic and could well have damaging effects." "For example, the bill's directive to intitiate negotiations in order to achieve a competitive exchange rate for the dollar -- a matter upon which there can be considerable difference among analysts -- runs the risk of building up potentially destabilizing market expectations," Volcker said. He recommended "we should not lock ourselves into formalized procedures for international negotiations" on exchange rates but instead use other, more flexible means like the recent mmeting in Paris between U.S. treasury and central bank representatives and those of major trade allies. Reuter  24-MAR-1987 17:08:30.83 earn usa F f2615reute s f BC-BORMAN'S-INC-<BRF>-DE 03-24 0024  BORMAN'S INC <BRF> DECLARES QTLY DIVIDEND DETROIT, Mich., March 24 - Qtly div five cts vs five cts prior Pay June 15 Record May 18 Reuter  24-MAR-1987 17:08:39.15 usa F f2616reute r f BC-INTERLEUKIN-2-<ILTO> 03-24 0057  INTERLEUKIN-2 <ILTO> DETAILS WARRANT CONVERSION WASHINGTON, March 24 - Interleukin-2 Inc said the registration of warrants became effective March 20 and that 3.5 mln warrants will be convertible into 1.75 mln shares of the company's common stock, giving the company a maximum of 2.4 mln dlrs. The warrants must be exercised by June 22. Reuter  24-MAR-1987 17:10:19.66 graincornoilseedsoybean usa C G f2618reute u f BC-/U.S.-CORN-ACREAGE-SE 03-24 0134  U.S. CORN ACREAGE SEEN NEAR RECORD LOW by Maggie McNeil, Reuters WASHINGTON, March 24 - U.S. corn acreage this year is likely to drop to the lowest level since the unsurpassed acreage reductions of the 1983 PIK year and could rank as one of the lowest corn plantings in the United States in sixty years, Agriculture Department officials said. USDA releases its official plantings report on March 31. Agriculture Department analysts said next week's figures will likely show a sharp drop in acreage to as low as 65 mln acres, down 22 pct from last year's plantings of 83.3 mln acres. Assuming an 18 mln acre drop in plantings, U.S. corn production will also decrease significantly. Analysts said 1987 corn production could drop by over one billion bushels to around seven billion bushels. Expected signup of up to 90 pct in the 1987 feed grains program, along with 1.9 mln acres enrolled in the conservation program, will cause acreage to plummet, Department feedgrain analysts said. "There's no question that there will be a sharp decrease in corn acreage," one said. "It's difficult for any farmer to not go along with the program this year." Soybean acreage is also expected to decline this year but at a much slower rate of around four pct, USDA analysts said. Soybean plantings could drop to 59 mln acres or below, they said, compared to last year's level of 61.5 mln acres. If analysts' unofficial estimates prove correct then the drop in u.s. corn acreage will be the largest since 1983 when farmers idled 22 mln acres in the Payment-In-Kind program. Farmers planted only around 60 mln acres of corn in 1983. A severe drought that summer in major producing states caused yields to tumble and final crop production to total only 4.2 billion bushels. Given normal weather conditions this year, USDA analysts said the 1987 corn crop could end up around seven billion bushels, down from last year's crop of 8.3 billion bushels. "This kind of acreage reduction will mean a significant reduction in production," an analyst said. A crop of seven billion bushels is close to the annual U.S. corn usage, so surplus stocks, while not decreasing, would not increase significantly, a specialist said. High producing corn belt states are expected to show the greatest acreage reductions, based upon historical participation in government programs, analysts said. In contrast, soybean acreage is likely to be cut the most in marginal producing areas of the southeast and the western corn belt, a USDA soybean analyst said. "Soybean acreage in the eastern corn belt will not budge," he said. Neither does he expect any significant acreage cuts in higher-producing delta areas. Soybean production could drop fractionally from last year's 2.0 billion bushels to 1.8 to 1.9 billion, he said. U.S. soybean acreage, after soaring to 71.4 mln acres in 1979 from only 52 mln acres five years prior to that, has steadily declined in the 1980's. U.S. corn acreage, with the exception of 1983, has been in the low to mid 80-mln acre range for the past 10 years. The highest corn plantings reported in the 60 years that USDA has kept such records was in 1932 when farmers planted 113 mln acres and obtained average yields of 26.5 bushels per acre. Last year U.S. farmers obtained record corn yields averaging 119.3 bushels per acre. "We have absolutely no trouble producing an eight billion bushel crop on only 80 mln acres or so," an analyst said. Corn acreage will probably level at around 65 mln acres as long as government program provisions remain the same, analysts said. Currently farmers enrolling in the program are required to set aside 20 pct of their base acreage and then are eligible for payments of two dlrs per bushel by idling an additional 15 pct of their acreage. "To get to the PIK level of 60 mln acres, we would have to provide more incentives," an analyst said. Reuter  24-MAR-1987 17:10:32.59 acq usa F f2620reute r f BC-KIRSCHNER-<KMDC>-COMP 03-24 0065  KIRSCHNER <KMDC> COMPLETES PURCHASE TIMONIUM, Md., March 24 - Kirschner Medical corp said it completed the acquisition of Minnesota Mining and Manufacturing's <MMM> orthopedic metal implant line division. The acquisition price is 12.0 mln dlrs in cash, a six mln dlr three year note and 100,000 shares of Kirschner common stock. The division had sales of 11.3 mln dlrs in 1986. Reuter  24-MAR-1987 17:10:45.15 tradehogcarcasslivestock usaussr C G L f2621reute r f BC-U.S.-SENATORS-SEEK-TO 03-24 0126  U.S. SENATORS SEEK TO EXPAND USDA EXPORT BONUS WASHINGTON, March 24 - Leading U.S. farm state senators are seeking to insert into the Senate's omnibus trade bill a provision that would broaden eligibility requirements under the U.S. Agriculture Department's export enhancement program, EEP, to include traditional buyers of U.S. farm products, including the Soviet Union, Senate staff said. Under existing criteria, USDA can offer EEP subsidies to recoup export markets lost to competing nations' unfair trading practices. Senate Agriculture Committee Chairman Patrick Leahy (D-Vt.) is leading a group of farm state senators in an effort to broaden the criteria in such a way as to enable Moscow to be eligible for the subsidies, sources said. The senators -- including Senate Finance Committee Chairman Lloyd Bentsen (D-Tex.), Max Baucus (D-Mont.), David Pryor (D-Ark.), John Melcher (D-Mont.) and Thad Cochran (R-Miss.) -- also may fold into the trade bill a measure to shield pork producers and processors from Canadian imports. The measure, sponsored by Sen. Charles Grassley (R-Iowa), would clarify the definition of "industry" in determining whether or not imports were causing injury to U.S. producers. Grassley's bill stems from a 1985 decision by the International Trade Commission that imports from Canada of live swine -- but not fresh, chilled and frozen pork -- were harming U.S. producers. The bill's proponents have argued Canada has simply replaced shipments of live hogs with fresh pork. Reuter  24-MAR-1987 17:11:15.09 money-fxdlr usa A RM f2623reute b f BC-/FED'S-JOHNSON-SAYS-F 03-24 0088  FED'S JOHNSON SAYS FED ACTED TO STABILIZE DOLLAR WASHINGTON, March 24 - Federal Reserve Board Vice Chairman Manuel Johnson said the dollar has stabilized against other currencies after action taken by the Fed. "We have taken the appropriate action and the dollar has stabilized," Johnson said after testifying to a House Banking subcommittee. He did not elaborate on the nature of the action nor when it was taken, but said that it was in the spirit of the agreement reached by six industrial nations in Paris recently. Johnson said the dollar's decline against other currencies such as the Japanese yen has been gradual. Since the accord by the United States, Britain, West Germany, Japan, France and Canada, foreign exchange markets have been closely watching for indications of intervention by central banks to determine the committment by those nations to their agreement. The nations agreed that currency exchange rates were at about the correct levels when the pact was signed earlier this year. Reuter  24-MAR-1987 17:11:23.20 usa F f2624reute r f BC-XOMA-<XOMA>-FILES-FOR 03-24 0098  XOMA <XOMA> FILES FOR PUBLIC OFFERING BERKELEY, Calif., March 24 - Xoma Corp said it filed a registration statement with the Securities and Exchange Commission covering a proposed public offering of 1.3 mln common shares. Xoma, a biotechnology company which produces monoclonal antibody-based products to treat some forms of cancer, said proceeds will be used to fund research and product development, human clinical trials and the expansion of manufacturing capacity and working capital. It said Dillon Read and Co Inc and Alex Brown and Sons Inc will manage the underwriting. Reuter  24-MAR-1987 17:12:51.35 usa F f2625reute r f BC-REPUBLIC-AMERICAN-<RA 03-24 0088  REPUBLIC AMERICAN <RAWC> PLANS EXCHANGE OFFER ENCINO, Calif., March 24 - Republic American Corp said it began an offer to exchange a new issue of 9-1/2 pct subordinated debentures due 2002 for a portion of its common stock. Republic said it is offering to acquire its stock at a rate of 17.50 dlrs principal amount of debentures per common share. The offering, which expires on April 27 unless extended, is for up to 2,250,000 shares, with the company reserving the right to accept three mln shares, Republic also said. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-010.sgm000066400000000000000000002337721154025176300231520ustar00rootroot00000000000000 26-MAR-1987 12:12:57.76 usa F f1727reute d f BC-AMOCO-<AN>-UNIT-EXPAN 03-26 0094  AMOCO <AN> UNIT EXPANDS CARPET YARN PLANT CHICAGO, March 26 - Amoco Corp said its Amoco Fabrics Co will expand the capacity of its polypropylene carpet face yarn facility by 55 pct to support its successful penetration of the commercial and residential carpet markets. It said the expansion of the plant in Andalusia, Ala., will bring Amoco's total face yarn capacity to nearly 140 mln pounds a year, with Andalusia capacity at 85 mln pounds. Amoco Fabrics is part of Amoco Chemicals Co, the chemical manufacturing and marketing subsidiary of Amoco Corp. Reuter  26-MAR-1987 12:13:39.63 earn usa E F f1730reute d f BC-island-telephone 03-26 0038  ISLAND TELEPHONE SHARE SPLIT APPROVED CHARLOTTETOWN, Prince Edward Island, March 26 - <Island Telephone Co Ltd> said the previously announced two-for-one common share split was approved by shareholders at the annual meeting. Reuter  26-MAR-1987 12:15:35.31 usaukswitzerlandbelgiumluxembourg F f1735reute r f BC-BIOGEN-<BGNF>-GETS-PA 03-26 0103  BIOGEN <BGNF> GETS PATENT FROM EUROPEAN OFFICE CAMBRIDGE, Mass., March 26 - Biogen Inc said the European Patent Office granted it a patent covering certain proteins used to produce a hepatitis B vaccine through genetic engineering techniques. Robert Gottlieb, Biogen spokesman, said the company has licensed the vaccine on a nonexclusive basis to <Wellcome PLC>, the British pharmaceutical firm, and is discussing licensing with other companies. Biogen said the patent gives it the right to exclude others from marketing hepatitis B vaccine in the 11 member countries of the European Patent Convention. Gottlieb said the company has also filed a patent in other markets, including the U.S. The vaccine is in clinical tests. Patents in the biotechnology field are particularly important as the company with an exclusive patent can reap large rewards. Recently many of the products of genetic engineering have become the target of patent lawsuits. Merck and Co Inc <MRK> already sells a genetically engineered hepatitis B vaccine in the U.S. called Recombivax HB. A subsidiary of <SmithKline Beckman Corp>, SmithKline Biologicals, based in Belgium, is selling a hepatitis B vaccine, called Engerix-B, in Belgium. A SmithKline spokesman said the vaccine has also been formally approved in Switzerland and Luxembourg and has been authorized for market in a number of Far East countries. Hepatitis B is a serious liver infection common in many parts of Africa and southeast Asia where about five pct to 15 pct of the population carry the virus. In the U.S. about 200,000 new cases occur each year. Last December the European Patent Ofice rejected Biogen's patent for alpha-interferon, which Biogen said it will appeal once it receives a formal written opinion from the office. Reuter  26-MAR-1987 12:17:26.37 usa C f1745reute d f BC-KEY-HOUSE-MEMBER-OPPO 03-26 0113  KEY U.S. HOUSE MEMBER OPPOSES CFTC USER PLAN WASHINGTON, March 26 - A key U.S. House member said he opposed a Reagan administration plan to shift the cost of surveillance of futures exchanges to the private sector. "I just think user fees are the wrong way to attack a problem of this sort," said Rep. Ed Jones (D-Tenn.), chairman of the House Agriculture Subcommittee on Conservation, Credit and Rural Development. The White House budget office has asked the Commodity Futures Trading Commission, CFTC, to draw up a plan for transferring the three-mln dlr cost of monitoring futures trading to either exchanges, futures commission merchants or users of the markets. CFTC Commissioner William Seale said the proposal was a move in the wrong direction. "I would prefer to see (surveillance) paid for through the appropriations process rather than through taxation of market participants," he said. CFTC Chairman Susan Phillips told the panel the commission was preparing the proposal, due to be completed April 15, at the request of the Office of Management and Budget. Reuter  26-MAR-1987 12:19:18.42 tradeacq ukjapan thatcher RM f1749reute u f BC-U.K.-GROWING-IMPATIEN 03-26 0119  U.K. GROWING IMPATIENT WITH JAPAN - THATCHER LONDON, March 26 - Prime Minister Margaret Thatcher said the U.K. Was growing more impatient with Japanese trade barriers and warned that it would soon have new powers against countries not offering reciprocal access to their markets. She told Parliament that the bid by the U.K.'s Cable and Wireless Plc <CAWL.L> to enter the Japanese telecommunications market was being regarded by her government as a test case. "I wrote to the prime minister of Japan, Mr Nakasone, on the fourth of March to express our interest on the Cable and Wireless bid. I have not yet had a reply. We see this as a test on how open the Japanese market really is," Thatcher said. Thatcher told Parliament that "shortly ... We shall have more powers than we have now, when, for example the powers under the Financial Services Act and the Banking Act become available, then we shall be able to take action in cases where other countries do not offer the same full access to financial services as we do." Cable and Wireless is seeking a stake in the proposed Japanese telecommunications rival to Kokusai Denshin Denwa. But the Japanese minister for post and telecommunications was reported as saying that he opposed Cable and Wireless having a managerial role in the new company. REUTER  26-MAR-1987 12:20:34.41 usa F f1755reute u f BC-GENCORP<GY>-TO-BUILD 03-26 0107  GENCORP<GY> TO BUILD 50 MLN DLR PLANT IN INDIANA AKRON, Ohio, March 26 - GenCorp said it plans to build a 50 mln dlr manufacturing facility in Shelbyville, Ind. The company said it will begin building the plant, where it will produce reinforced plastic components for cars and trucks, this May with an expected completion date in mid-1988. GenCorp said its DiversiTech General unit will operate the plant through its reinforced plastics division. "We believe the use of reinforced plastics in cars and trucks will grow," A. William Reynolds, GenCorp chairman and chief executive officer said as the reason for building the plant. "Our investment in the Shelbyville plant reflects the confidence we have in the future of this product line," Reynolds added. GenCorp said the plant will create 500 new jobs. Reuter  26-MAR-1987 12:21:18.81 usa F f1761reute r f BC-JONES-INTERNATIONAL-R 03-26 0090  JONES INTERNATIONAL REALIGNS SUBSIDIARIES ENGLEWOOD, Colo., March 26 - <Jones International Ltd> said it realigned several subsidiaries to accommodate corporate strategy. Jones said ultimate control of the subsidiaries will remain unchanged under the realignment. Jones said it will exchange approximately 97 pct of its holdings of the common stock of Jones Intercable Inc <JOIN> for Class A common stock of Jones Spacelink Ltd <SPLK>. The company said the move will enable Spacelink to elect 75 pct of Intercable's directors. In addition, Jones said 60 pct of the common stock of its subsidiary, <The Jones Group Ltd>, will be exchanged for Class A common stock of Jones Spacelink Ltd. Following the exchange, Jones International's ownership of Spacelink Class A voting stock will increase to approximately 89 pct. Jones International said it will retain approximately two pct of the common stock and approximately four pct of the Class A common stock of Jones Intercable as well as the remaining 40 pct of the Jones Group stock. Reuter  26-MAR-1987 12:21:42.19 earn usa F f1764reute d f BC-QUESTECH-INC-<QTEC>-Y 03-26 0062  QUESTECH INC <QTEC> YEAR NET MCLEAN, Va., March 26 - Shr loss nil vs profit 19 cts Net loss 3,175 vs profit 284,945 Revs 13.6 mln vs 10.6 mln Year Shr profit 13 cts vs profit 56 cts Net profit 195,202 vs profit 857,006 Revs 47.5 mln vs 42.9 mln Note: Current year net includes charge against discontinued operations of 1,060,848 dlrs. Reuter  26-MAR-1987 12:22:10.06 usa RM f1766reute u f BC-ASLK-CGER-FINANCE-ISS 03-26 0094  ASLK-CGER FINANCE ISSUES 10 BILLION YEN BOND LONDON, March 26 - ASLK-CGER Finance NV is issuing a 10 billion yen eurobond due April 10, 1994 with a 5-1/2 pct coupon and priced at 101-1/2 pct, lead manager IBJ International Ltd said. The bonds are guaranteed by Belgian savings bank ASLK-CGER Bank and have all been pre-placed. They will be issued in denominations of one mln yen and listed in Luxembourg. Fees comprise 5/8 pct for management and underwriting combined, with a 1/8 pct praecipuum, and 1-1/4 pct for selling. Pay date is April 10. REUTER  26-MAR-1987 12:23:03.99 F f1768reute f f BC-******UAW-STRIKES-GM 03-26 0009  ******UAW STRIKES GM TRUCK AND BUS PLANT AT PONTIAC, MICH Blah blah blah.  26-MAR-1987 12:26:06.29 crudenat-gas canada E Y f1773reute u f BC-CANADA-OIL-EXPORTS-RI 03-26 0077  CANADA OIL EXPORTS RISE 20 PCT IN 1986 OTTAWA, March 26 - Canadian oil exports rose 20 pct in 1986 over the previous year to 33.96 mln cubic meters, while oil imports soared 25.2 pct to 20.58 mln cubic meters, Statistics Canada said. Production, meanwhile, was unchanged from the previous year at 91.09 mln cubic feet. Natural gas exports plunged 19.4 pct to 21.09 billion cubic meters, while Canadian sales slipped 4.1 pct to 48.09 billion cubic meters. The federal agency said that in December oil production fell 4.0 pct to 7.73 mln cubic meters, while exports rose 5.2 pct to 2.84 mln cubic meters and imports rose 12.3 pct to 2.1 mln cubic meters. Natural gas exports fell 16.3 pct in the month 2.51 billion cubic meters and Canadian sales eased 10.2 pct to 5.25 billion cubic meters. Reuter  26-MAR-1987 12:26:42.65 usa F f1775reute u f BC-PRU-BACHE-ANALYST-REA 03-26 0138  PRU BACHE ANALYST REAFFIRMS BULLISH MARKET CALL NEW YORK, March 26 - Joseph Feshbach, chief market analyst at Prudential-Bache Securities, said the stock market is poised to climb above Dow Jones Industrial 2500 level by June. The Dow average is around 2380 today. "Liquidity is the biggest fundamental factor in the market and money coming out of fixed income funds and flowing into equities will propel the market sharply higher," Feshbach said, noting that the market's peak will occur in June. Feshbach said that in early January he predicted that the Dow Jones Industrial average, the most closely watched market barometer, would reach the 2400 level by April and the 2500 level by June. He said he is now even more optimistic, saying "the market is ready for a 150 point rise from current levels any day now." Reuter  26-MAR-1987 12:27:23.14 uk RM f1779reute u f BC-LLOYD'S-APPOINTS-NEW 03-26 0117  LLOYD'S APPOINTS NEW OUTSIDE COUNCIL MEMBERS LONDON, March 26 - Four new outsiders were appointed to the policy-making Council of the Lloyd's of London insurance market, shifting the voting balance on the Council away from Lloyd's professionals, Lloyd's said. It said in a statement the appointments of the new members, none of them previously involved in the insurance market, were made to comply with the core recommendation in the Neill report into regulation at Lloyd's, which was published on January 22. The recommendation, one of 70 to improve investor protection in the Lloyd's market, was to reduce the number of elected working members, Lloyd's professionals, from 16 to 12. Simultaneously, the number of outsiders would be increased by four while the number of external Council members, usually Lloyd's investors without an active role in the market, would remain unchanged at eight. Lloyd's said the four newly-appointed Council members were barrister Elizabeth Mary Freeman, Sir Maurice Hodgson, non-executive chairman of British Home Stores Plc, Lloyd's Bank Plc chairman Sir Jeremy Morse, and Brian Pomeroy, an accountant who sat on the three-member Neill enquiry panel. They replace the four Lloyd's professionals who resigned on April 4 after Lloyd's agreed to implement the recommendation. REUTER  26-MAR-1987 12:27:45.45 coffeecocoasugar nycsce C T f1783reute d f BC-COFFEE,-SUGAR-AND-COC 03-26 0126  COFFEE, SUGAR AND COCOA EXCHANGE NAMES CHAIRMAN NEW YORK, March 26 - The New York Coffee, Sugar and Cocoa Exchange (CSCE) elected former first vice chairman Gerald Clancy to a two-year term as chairman of the board of managers, replacing previous chairman Howard Katz. Katz, chairman since 1985, will remain a board member. Clancy currently serves on the Exchange board of managers as chairman of its appeals, executive, pension and political action committees. The CSCE also elected Charles Nastro, executive vice president of Shearson Lehman Bros, as first vice chairman. Anthony Maccia, vice president of Woodhouse, Drake and Carey, was named second vice chairman, and Clifford Evans, president of Demico Futures, was elected treasurer. Reuter  26-MAR-1987 12:28:11.69 veg-oil belgium ec C G f1785reute u f BC-MOST-EC-STATES-SAID-T 03-26 0121  MOST EC STATES SAID TO BE AGAINST OILS/FATS TAX BRUSSELS, March 26 - A majority of European Community (EC) member states are either against or have strong reservations over a tax on both imported and domestically-produced oils and fats proposed by the European Commission, senior diplomats said. They said a special committee of agricultural experts from EC member states had voiced strong objections over the measure during a meeting charged with preparing the ground for the annual EC farm price-fixing which begins next Monday. They added that only France and Italy had indicated they would support the Commission proposal which would lead to a tax initially of 330 Ecus per tonne during the 1987/88 price round. Reuter  26-MAR-1987 12:30:59.51 uk RM f1797reute u f BC-ROWNTREE-SEEKS-200-ML 03-26 0110  ROWNTREE SEEKS 200 MLN STG FACILITY, CP PROGRAM LONDON, March 26 - Rowntree Mackintosh Plc is seeking a 200 mln stg, five year multiple option facility, of which 150 mln stg will be committed, and a 200 mln stg commercial paper program, County Natwest Capital Markets Ltd said as arranger. The facility includes options for sterling acceptances, multi-currency advances, sterling and dollar notes via tender panels and there is also a sterling swingline. The committed portion carries a facility fee of five basis points and a margin of ten. A 2-1/2 basis point utilisation fee is payable on drawings of more than half the committed portion. The 200 mln stg commercial paper program will include a dollar option, County Natwest said. A County Natwest official said the facility, launched earlier this week, seemed to be progressing well in syndication. REUTER  26-MAR-1987 12:33:25.04 usa F f1813reute u f BC-TALKING-POINT/CONRAIL 03-26 0109  TALKING POINT/CONRAIL <CRR> By Cal Mankowski, Reuters NEW YORK, March 26 - Private investors eagerly snapped up shares of Consolidated Rail Corp, the biggest initial stock offering in U.S. history, but some analysts warned they could be in a for a bumpy ride at least in the near term. Analyst James Voytko of PaineWebber Group Inc believes some investors who bought at the offering price of 28 dlrs will be tempted to sell. The shares climbed 3-3/8 to 31-3/8 by midday. Voytko said profit-taking pressure could become severe at the 35 dlr level. Others say Conrail, a combination of previously bankrupt railroads, has good long term potential. "Conrail is in the best position to weather the current tremendous price competition in the transportation industry in general," said Drew Robertson, analyst at Atlantic Systems Inc, a research firm. "It will survive and do damn well," said another analyst who declined to be identified. He noted that Conrail's freight trains serve heavy industry including steel and autos in major U.S. cities in the northeast U.S. and midwest. Robertson noted that Conrail's traffic is less dependent on coal than other railroads based in the east. He expects Conrail to earn 2.85 dlrs per share in 1987. Voytko of PaineWebber sees another problem six months down the road when more than 10 mln Conrail shares will be distributed to current and former employees. He believes many of these indivdiuals will be inclined to sell the stock. Robertson says it's hard to determine the psychology of the average employe, but even if a lot of stock is sold, it would would not hit the market as one big block. He doubts it would create a big downward push on the price. "It's hard to call," said the analyst who requested anonymity. In some cases employe loyalty may motivate individuals to keep their shares, he said. Steven Lewins, analyst for Citicorp Investment Management, believes the key to Conrail's long term outlook is how it is able to invest surplus cash. He expects Conrail to earn 3.00 dlrs per share this year, flat in comparison with 1986, but by 1991 the picture could change dramatically if money not needed for rail operations is invested wisely. By 1991, earnings could reach 4.30 dlrs per share, Lewins said, factoring in reinvestment of free cash flow at conservative rates. He believes motor freight will be one area of diversification Conrail will explore. Elizabeth Dole, U.S. Secretary of Transportation, whose department was responsible for the sale of Conrail, noted that Conrail is required to reinvest in its rail system and cannot defer necessary maintenance. For the historic offering of Conrail shares, Dole visited the New York Stock Exchange and was photographed on the floor wearing a locomotive engineer's cap, which she presented to Stanley Crane, Conrail chairman and chief executive. The U.S. government is expected to receive about 1.88 billion dlrs for Conrail after factoring in underwriting fees and other adjustments. The possibility of a recession at some time in the next five years is another issue troubling some investors. Lewins says revenue-ton-miles, which he believes will climb from 68.7 mln miles last year to 69.5 mln this year and 70.5 mln in 1988, will grow to 71.5 mln in 1991, but in a recession year, perhaps 1989, the figure could dip to 64.2 mln. On the revenue side, he believes revenue per ton-mile will be 4.7 cts in 1991, little changed from present levels and exactly the same as in 1981. "Their basic business isn't going anywhere," he says, explaining why emphasizes investment of cash flow. Voytko thinks Conrail can remain profitable in a recession year. He points out his firm, PaineWebber, is not forecasting a recession in any specific year, but as an example a 1990 recession of modest degree could knock earnings down to 2.20 dlrs per share. He estimated 3.00 dlrs per share this year and 3.35 dlrs next year. His 1988 figure reflects mostly a lowering of the tax rate to 34 pct from 40 pct this year. Voytko believes the Conrail shares merit purchase at the 26 dlr level. Goldman, Sachs and Co was lead manager for the offering. A total of 148 firms took part in the U.S. syndicate. Reuter  26-MAR-1987 12:33:57.01 acq usa F f1818reute r f BC-GOULD<GLD>-COMPLETES 03-26 0077  GOULD<GLD> COMPLETES SALE OF FRENCH BATTERY UNIT ROLLING MEADOWS, Ill., March 26 - Gould Inc said it has completed the sale of its French battery business, Compagnie Francaise D'Electro Chimie, to a group of investors including the unit's employees and <GNB Inc> of Minnesota. Gould did not disclose terms of the deal. Gould said the move is part of its previously announced plan to divest assets unrelated to its computer and electronics businesses. Reuter  26-MAR-1987 12:34:24.39 usa F f1823reute r f BC-CMS-ENHANCEMENTS-<ACM 03-26 0054  CMS ENHANCEMENTS <ACMS> GETS CREDIT LINE TUSTIN, Calif., March 26 - CMS Enhancements Inc said it has obtained a ten mln dlr line of credit from Bank of the West, effective immediately. The credit line will be used in part to fund additional growth, including research and development of new products, the company said. Reuter  26-MAR-1987 12:37:48.01 usa F f1836reute d f BC-EXOVIR-<XOVR>-TO-GET 03-26 0108  EXOVIR <XOVR> TO GET EUROPEAN PATENT GREAT NECK, N.Y., March 26 - Exovir Inc said the European Patent Office notified it that its application covering combinations of nonionic surfactants and all forms of interferon has been approved and a patent will be issued in about six months. Exovir is completing trials of a gel combining alpha interferon and nonoxynol-9, an antiviral surfactant, as a treatment for genital and oral herpes and genital warts. The gel was given a U.S. patent in 1985. It said clinical tests will begin shortly to test whether the gel is effective in preventing transmission of the AIDS virus when used with a condom. Reuter  26-MAR-1987 12:38:09.30 usa F f1839reute d f BC-resending 03-26 0082  HIGHER U.S. WEEKLY CAR OUTPUT ESTIMATED DETROIT, March 26 - U.S. automakers are expected to build 167,236 cars this week, up from 133,067 in the same year-ago period, said the trade publication Ward's Automotive Reports. It said year-to-date car production would reach 2,012,093 compared to 2,126,954 in the 1986 period. Domestic truck production for the week was seen as rising to 70,033 from 58,506. Year to date, it was projected at 937,163 compared to 882,230 in the 1986 period. Reuter  26-MAR-1987 12:38:22.02 usa F f1840reute r f BC-CIRCLE-K-<CKP>-OFFICI 03-26 0071  CIRCLE K <CKP> OFFICIAL INCREASES HOLDINGS PHOENIX, Ariz., March 26 - Circle K Corp said its chairman, Karl Eller, will buy 750,000 shares of Circle K common stock from the company's founder and Vice Chairman, Fred Hervey, in a private transaction. After the sale, Hervey will directly or beneficially own 6,764,004 shares, or 13.61 pct of Circle K stock and Eller will hold 2,873,300 shares, of 5.78 pct of the stock. Reuter  26-MAR-1987 12:40:02.47 earn usa F f1852reute d f BC-SHOE-TOWN-INC-<SHU>-Y 03-26 0060  SHOE TOWN INC <SHU> YEAR ENDED JAN THREE 1987 TOTOWA, N.J., March 26 - Shr 51 cts vs 75 cts Net 5,524,000 vs 8,094,000 Revs 142.4 mln vs 137.2 mln NOTE: 1986 and 1985 year net includes loss 785,000 dlrs or eight cts a share and 59,000 dlrs or one ct a share, respectively, for discontinued operations. 1985 year ended December 28, 1985. Reuter  26-MAR-1987 12:40:16.38 usaargentina F f1854reute d f BC-EASTERN-AIR-<TXN>-SEE 03-26 0102  EASTERN AIR <TXN> SEEKS MORE ARGENTINA FLIGHTS MIAMI, March 26 - Texas Air Corp's Eastern Airlines Inc said it asked the U.S. Department of Transportation to approve an increase in the number of its weekly roundtrip flights to Buenos Aires to 11 from five. It said if several of Pan Am Corp's <PN> one-stop flights to Buenos Aires were terminated in Rio de Janeiro, Eastern could add four non-stop flights from the U.S. The expanded weekly schedule would include seven nonstop flights from Miami, two from New York, and two one-stop flights from Los Angeles via Lima. It asked for the change by June 12. Reuter  26-MAR-1987 12:40:43.84 acq usa F A f1858reute r f BC-FIRST-WISCONSIN-<FWB> 03-26 0055  FIRST WISCONSIN <FWB> TO BUY MINNESOTA BANK MILWAUKEE, Wis., March 26 - First Wisconsin Corp said it plans to acquire Shelard Bancshares Inc for about 25 mln dlrs in cash, its first acquisition of a Minnesota-based bank. First Wisconsin said Shelard is the holding company for two banks with total assets of 168 mln dlrs. First Wisconsin, which had assets at yearend of 7.1 billion dlrs, said the Shelard purchase price is about 12 times the 1986 earnings of the bank. It said the two Shelard banks have a total of five offices in the Minneapolis-St. Paul area. Reuter  26-MAR-1987 12:40:52.65 usa F f1859reute r f BC-IMRE-<IMRE>-COMPLETES 03-26 0107  IMRE <IMRE> COMPLETES PRIVATE STOCK PLACEMENT SEATTLE, March 26 - IMRE Corp said it completed a private placement of about 400,000 shares of its securities with a group of European institutions for 2.5 mln dlrs. The company said proceeds will be used for working capital and to implement the company's business plan. IMRE also said it has established a light manufacturing facility in Richmond, Washington that makes raw material components for Prosorba column, a medical device that removes disease-related immune components from the human bloodstream. The company is awaiting Food and Drug Administration approval on the device. Reuter  26-MAR-1987 12:41:04.85 earn usa F f1860reute d f BC-AMERICAN-NURSERY-PROD 03-26 0070  AMERICAN NURSERY PRODUCTS <ANSY> 3RD QTR NET TAHLEQUAH, OKLA., March 26 - Period ended Feb 28 Shr profit five cts vs profit four cts Net profit 191,000 vs profit 108,000 Sales 6,561,000 vs 5,896,000 Nine mths Shr loss 28 cts vs loss 40 cts Net loss 871,000 vs loss 990,000 Sales 9,310,000 vs 8,894,000 Avg shrs 3,086,386 vs 2,465,996 NOTE: Full name is American Nursery Products Inc Reuter  26-MAR-1987 12:41:30.21 usa F f1864reute h f BC-CLINICAL-DATA-<CLDA> 03-26 0050  CLINICAL DATA <CLDA> AWARDED RESEARCH CONTRACTS BOSTON, March 26 - Clinical Data Inc said it has contracts with four major pharmaceutical firms to analyze certain data in research studies evaluating the efficacy and safety of new cardiovascular drugs. It said the contracts exceed 500,000 dlrs. Reuter  26-MAR-1987 12:43:18.88 F f1871reute f f BC-******DUN/BRADSTREET 03-26 0011  ******DUN/BRADSTREET SAYS BUSINESS FAILURES UP 10.8 PCT IN FEBRUARY Blah blah blah.  26-MAR-1987 12:44:43.83 usa F f1875reute u f BC-UAW-STRIKES-GENERAL-M 03-26 0097  UAW STRIKES GENERAL MOTORS <GM> PLANT PONTIAC, Mich., March 26 - The United Auto Workers struck General Motors Corp's truck and bus plants at Pontiac, Mich, General Motors said. General Motors' truck and bus group failed to reach an agreement on local issues with UAW Local 594 by the union's deadline of noon today, causing a strike by 9,000 hourly workers at the facility, the company said. General Motors said it was "eager" to continue meeting with union officials on the dispute. It was not immediately clear whether contract talks were continuing at the facility. General Motors spokesman Frank Cronin said the three plants at Pontiac stopped working "as of noon today." He said talks will resume Friday at 1000 EST in Pontiac. "We're hoping (the strike) will be of very brief duration," Cronin said. Bus-manufacturing operations at one of the three plants--the Pontiac Central facility--are being sold to Greyhound Corp <G>, although GM will retain the facility. Cronin said about 400 workers on the bus line will be laid off "whenever we fulfill production commitments" on the buses, "possibly in May." The Pontiac Central plant also makes medium- and heavy-duty trucks. Assembly of the medium trucks is scheduled to move to Janesville, Wis., in 1990, Chronin said. Heavy truck operations at the plant will be taken over by GM's joint venture with Volvo AB, and all vehicle assembly operations at the facility will eventually be ended, Chronin said. The plant also has sheet metal operations, which are so far unaffected, he said. The other two plants at Pontiac--Pontiac East and Pontiac West--make full-size pickups and sport utility vehicles. Reuter  26-MAR-1987 12:46:03.72 usa F f1880reute r f BC-S.P.I.-SUSPENSION-<SP 03-26 0046  S.P.I. SUSPENSION <SPILF> WINS CONTRACT NEW YORK, March 26 - S.P.I. Suspension and Parts Industries Ltd said it won four multi-year contracts from the U.S. Army worth 34.5 mln dlrs. The contracts, for wheels on U.S. Army vehicles, will run for five years beginning 1987. Reuter  26-MAR-1987 12:46:20.26 earn usa F f1881reute d f BC-DISCUS-CORP-<DISC>-4T 03-26 0046  DISCUS CORP <DISC> 4TH QTR LOSS BLOOMINGTON, Minn., March 26 - Shr loss six cts vs loss seven cts Net loss 125,000 vs loss 140,000 Rev 2.4 mln vs 2.2 mln Year Shr loss 13 cts vs loss 14 cts Net loss 271,000 vs loss 211,000 Rev 10.1 mln vs 8.2 mln Reuter  26-MAR-1987 12:48:35.24 F f1886reute b f BC-******ENTERTAINMENT-P 03-26 0009  ******ENTERTAINMENT PUBLICATIONS DISCONTINUES THREE UNITS Blah blah blah.  26-MAR-1987 12:49:18.15 usa C f1887reute d f BC-CFTC-OFFICIALS-SEE-NO 03-26 0106  CFTC OFFICIALS SEE NO MERGER WITH SEC WASHINGTON, March 26 - Officials of the Commodity Futures Trading Commission (CFTC) said merging the agency with the Securities and Exchange Commission (SEC) would not help regulation of commodities and securities markets. "I don't think that a merger would solve regulatory problems," CFTC chairman Susan Phillips told the House Subcommittee on Conservation, Credit and Rural Development. "I think what does solve our problems would be working with other agencies in a strong capacity," she said in response to a question. "We don't want agencies to trample on our jurisdiction either." CFTC Commissioner Fowler West said, "We ... do not have the expertise to regulate securities markets. I don't think the SEC has the expertise to regulate the futures markets." Increased attention to price volatility in stock index futures markets and reports of alleged futures trading abuses have raised concerns Congress may adopt a radically different regulatory structure for securities and futures markets. Rep. John Dingell (D-Mich.), chairman of the House Energy and Commerce Committee, which has jurisdiction over securities regulation, has said he will hold hearings on the questions of market volatility and alleged trading abuses. Reuter  26-MAR-1987 12:49:31.85 earn F f1889reute b f BC-*****ENTERTAINMENT-PU 03-26 0013  *****ENTERTAINMENT PUBLICATIONS SEES 31 CTS/SHR 3RD QTR LOSS ON UNITS DISPOSAL Blah blah blah.  26-MAR-1987 12:50:43.81 poland jaruzelski RM f1894reute u f BC-POLAND-FIRM-ON-ECONOM 03-26 0092  POLAND FIRM ON ECONOMY DESPITE CONCESSIONS By Irena Czekierska, Reuters WARSAW, March 26 - The Polish government has backed down from some proposed price rises in the face of strong opposition from trade unions, but has restated its commitment to economic reforms entailing tougher discipline and austerity measures. Following a warning from the officially-backed OPZZ unions that sharp price hikes could spark confrontation, the government has agreed that food prices this year will rise an average 9.6 pct instead of the planned 13 pct. A statement last night said the government had "partially accepted" demands for the protection of the low-paid and agreed to extend some social benefits. But Polish leader Wojciech Jaruzelski, at a separate meeting yesterday, sharply criticised the slow pace of reforms. He told an economic commission that tougher discipline and austerity measures, greater efficiency and initiative should replace waste, red tape and inertia. He announced cost-cutting measures affecting central administrative bodies. OPZZ economic expert Zbigniew Kochan welcomed the move on food prices. "This decrease was considerable," Kochan told Reuters today. "Also important is the fact that the government admitted we were right and agreed to consult us over prices from now on," he added. The communique made no mention of curbs on wage increases, or price rises in sectors including transport and energy. The authorities have said prices could go up by as much as 26 pct as state subsidies are sharply reduced in an effort to make the market more free and to improve efficiency. The OPZZ unions are officially recognised by the government and replaced the Solidarity movement suppressed under martial law. They claim a membership of seven million. Western diplomats said today the climb-down on food prices was a limited concession. "This is a small price to pay if they can push through the other price rises," one said, adding that fuel and energy rises would have a more significant effect. He noted that there had been a concerted media campaign to prepare people for price rises, including a major article in a mass-circulation women's magazine, "clearly aimed at those who do the shopping," he said. Other articles in the official press this week have focused on coal, which sells to both industrial and private consumers at far less than either the production or export costs. Countering scepticism from opposition sources and former Solidarity activists as to OPZZ's role, Kochan said "It was definitely not a question of gaining credibility, but true concern for people's living standards." Deputy Prime Minister Jozef Koziol said the authorities' main aim was not to harm workers' living standards. But he was also quoted by the official PAP news agency as saying the government had to take current economic realities into account. REUTER  26-MAR-1987 12:50:49.04 earn usa F f1895reute r f BC-PAY-'N-PAK-STORES-INC 03-26 0043  PAY 'N PAK STORES INC <PNP> 4TH QTR FEB 28 NET KENT, Wash., March 26 - Shr 11 cts vs 13 cts Net 1,129,000 vs 1,301,000 Revs 83.2 mln vs 74.5 mln Year Shr 57 cts vs 82 cts Net 5,686,000 vs 8,168,000 Revs 398.4 mln vs 333.8 mln Reuter  26-MAR-1987 12:50:57.93 gas usa F Y f1896reute r f BC-corrected---mobil 03-26 0119  (CORRECTED) - MOBIL <MOB> TO UPGRADE REFINERY UNIT NEW YORK, March 26 - Mobil Corp said it will spend over 30 mln dlrs to upgrade a gasoline-producing unit at its Beaumont, Texas, refinery. It said the unit is a catalytic reformer, which converts low-octane components of gasoline into high-octane components for use in Super Unleaded gasoline. The company said the modernization will allow the unit to regenerate catalysts on a continuous basis without shutdown. Currently, it must be shut twice a year. The unit produces 46,000 barrels of gasoline components a day. Construction will start late this year, with completion set for mid-1989. (Correcting unit's output to barrels/day from barrels/year) Reuter  26-MAR-1987 12:59:20.16 usa cbt C f1921reute d f BC-CFTC-SPECULATIVE-LIMI 03-26 0141  CFTC LIMIT PLAN MAY NOT REVERSE LIQUIDITY DROP WASHINGTON, March 26 - A proposal by the Commodity Futures Trading Commission, CFTC, to raise federal limits on futures speculative positions for certain agricultural commodity contracts would not reverse a decline in liquidity in those markets that started in 1981, two CFTC commissioners said. Commissioners William Seale and Kalo Hineman told a House Agriculture subcommittee a recent proposal that would have the effect of raising deferred month speculative position limits on several agricultural commodity contracts would not substantially increase liquidity in those months. "I seriously doubt that increasing speculative limits will create a great deal of liquidity in the back months," Seale told the House Agriculture Subcommittee on Conservation, Credit and Rural Development. Analysts have attributed much of the liquidity squeeze to a 1981 tax law change, which by changing the treatment of so-called straddles limited the ability of futures commission merchants to roll positions forward for tax purposes. CFTC Chairman Susan Phillips said only that the commission would take into account Congress' recommendation that federal speculative limits be raised. The Chicago Board of Trade and the MidAmerica Commodity Exchange have expressed concern that the CFTC plan would decrease spot month limits for certain of their contracts. Reuter  26-MAR-1987 13:00:01.51 earn usa F f1926reute d f BC-AMERICAN-NURSERY-PROD 03-26 0073  AMERICAN NURSERY PRODUCTS <ANSY> 3RD QTR NET TAHLEQUAH, Okla., March 26 - Qtr ends Feb 28 Shr profit five cts vs profit four cts Net profit 191,000 vs profit 108,000 Revs 6,561,000 vs 5,896,000 Avg shrs 3.6 mln vs 2.5 mln Nine mths Shr loss 28 cts vs loss 40 cts Net loss 871,000 vs loss 990,000 Revs 9,310,000 vs 8,894,000 Avg shrs 3.1 mln vs 2.5 mln NOTE: Full name American Nursery Products Inc. Reuter  26-MAR-1987 13:00:14.13 earn sweden F f1927reute d f BC-VOLVO-FINAL-RESULT-IM 03-26 0124  VOLVO 1986 RESULT OFF SLIGHTLY FROM 1985 STOCKHOLM, March 26 - AB Volvo <VOLV.ST> said the weakening dollar caused the drop in its 1986 profits, but company chief executive Pehr Gyllenhammar said 1986 was one of Volvo's best years ever. In its final report released earlier, the company said the group's 1986 profits before allocations and taxes was 7.53 billion crowns compared with 1985's 7.60 billion. Despite the fall, Gyllenhammar said, "Sales of industrial products have never been higher, and Volvo Cars and Volvo Trucks were both completely sold out at year-end. Operating income was slightly higher than a year earlier." He said the company's financial strength gave it exceptional opportunities to invest for the future. Although industrial sales were up, the company's yearend report said total sales were 84.09 billion crowns against 1985's 86.19 billion. Reuter  26-MAR-1987 13:00:46.83 acq usa F f1929reute h f BC-<MERIDIAN-ENERGY>,-CA 03-26 0045  <MERIDIAN ENERGY>, CASTONE END LETTER OF INTENT CHICAGO, March 26 - <Meridian Energy Inc> and Castone Development Corp, a privately-held company, jointly announced that they have decided to terminate the letter of intent under which Meridian would have acquired Castone. Reuter  26-MAR-1987 13:06:17.40 iron-steelship taiwansouth-koreajapanchinauk ec M f1955reute r f BC-REPORT-EXPECTS-SHARP 03-26 0107  REPORT EXPECTS SHARP DROP IN WORLD IRON IMPORTS LONDON, March 26 - World seaborne iron ore imports will fall sharply by the year 2000 with declining imports to the EC and Japan only partially offset by increased demand from South East Asia, a report by Ocean Shipping Consultants said. The report predicts annual world seaborne iron ore imports of 267.7 mln tonnes by 2000 versus 312.4 mln tonnes in 1985. It estimates that total bulk shipping demand from the iron ore sector will fall by almost 10 pct, or 200 billion tonne miles, with shipping demand associated with the coking trade down about 17 pct or 130 billion tonne miles. The report sees EC imports falling to 91.7 mln tonnes in 2000 from 123.6 mln in 1985 with Japanese imports falling to 89 mln from 124.6 mln tonnes. Imports to South East Asia are seen rising to 58.6 mln from 32.6 mln tonnes in 1985. It predicts that EC steel production will fall to 109 mln tonnes in 2000 from 135.7 mln in 1985 with Japanese production falling to 92 mln from 105.3 mln. South Korea and Taiwan are expected to double their output to 40 mln tonnes with Chinese production increasing by 25 mln tonnes to 80 mln, it added. Reuter  26-MAR-1987 13:06:50.85 usa F f1960reute d f BC-ROYCE-<RLAB>-TO-REDEE 03-26 0056  ROYCE <RLAB> TO REDEEM WARRANTS MIAMI, March 26 - Royce Laboratories Inc said it is calling for redemption its redeemable common purchase warrants on April 30 at 2.5 cts per warrant. It said warrant holders retain the right to purchase one share of its common at an exercise price of three dlrs per share until 1700 EST April 29. Reuter  26-MAR-1987 13:07:08.34 usa F f1961reute b f BC-DUN/BRADSTREET-<DB>-S 03-26 0056  DUN/BRADSTREET <DB> SAYS BUSINESS FAILURES UP NEW YORK, March 26 - Dun and Bradstreet Corp said business failures in February increased 10.8 pct, to 5,390, from 4,864 in February 1986. "The national level of business failures continues to be driven upward by substantial increases in the oil and agricultural states," Dun said. Dun said that of the nine U.S. Bureau of the Census regions, three reported a decrease in the number of failures and two had gains of less than 3.0 pct. The largest increase was reported in the West South Central states, Dun said, with business failures rising 47.8 pct, to 1,218. The East South Central states posted a 44 pct rise, to 298, Dun said, while the West North Central states recorded a 27.3 pct gain, to 489. The greatest decline, Dun reported, was registered by the Middle Atlantic states, down 8.2 pct in February, to 324. The Pacific states also reported a large decline in failing businesses, off 6.8 pct, to 1,028, Dun said. In the smokestack region of the East North Central states, there was a negligible decline of 0.6 pct, to 794, Dun said. Dun said the Mountain states recorded a gain in business failures of 1.5 pct, to 530. Business failures in the New England states rose 23.5 pct, to 105. By industry segment, Dun said the largest gain was recorded by the agricultural, forestry and fishing sector, up 62.7 pct, to 345. Year to date, Dun said business failures rose to 11,004, an increase of 5.3 pct over 1986. Reuter  26-MAR-1987 13:08:21.86 earn australia F f1966reute d f BC-GOLDFIELD-CORP-<GV>-4 03-26 0080  GOLDFIELD CORP <GV> 4TH QTR NET LOSS MELBOURNE, Fla., March 26 - Shr loss four cts vs loss five cts Net loss 527,065 vs loss 1,204,080 Revs 622,470 vs 613,205 Year Shr profit four cts vs loss 13 cts Net profit 1,099,778 vs loss 3,282,478 Revs 7,579,547 vs 6,068,254 NOTE: 1985 excludes loss from discontinued operations of four cts per share in the quarter and loss 10 cts in the year. 1986 year excludes extraordinary gain of two cts a share. Reuter  26-MAR-1987 13:08:52.54 A F RM f1970reute f f BC-******FED'S-HELLER-UR 03-26 0015  ******FED'S HELLER URGES FORMING FINANCIAL SERVICES HOLDING COMPANIES TO STRENGTHEN BANKING Blah blah blah.  26-MAR-1987 13:09:45.98 money-fx ukfrance balladurlawson ec RM f1973reute r f BC-BRITISH,-FRENCH-MINIS 03-26 0115  BRITISH, FRENCH MINISTERS DISCUSS PUBLIC SPENDING LONDON, March 26 - French Finance Minister Edouard Balladur discussed the need to control public spending in talks here today with British Chancellor of the Exchequer Nigel Lawson, a Treasury spokesman said. The spokesman said the ministers reviewed their economies, and public spending, domestic and European Community-wide. He declined to comment on whether the subject of concerted action to shore up the dollar had arisen. The U.S. Currency dipped sharply earlier this week after a month of relative stability after an agreement by six major industrialised nations in Paris on February 22 to stabilise their currencies. REUTER  26-MAR-1987 13:09:57.13 acq usa F A RM f1974reute b f BC-FED'S-HELLER-URGES-BR 03-26 0091  FED'S HELLER URGES BROAD REFORM TO AID BANKING WASHINGTON, March 26 - Federal Reserve Board Governor Robert Heller said the banking system could be strengthened by permitting formation of financial services holding companies involved in areas like banking, insurance, real estate and securities. In a speech prepared for delivery in New York to the Bank and Financial Analysts' Association, Heller said, "I believe that increased diversification along geographic and product lines is the key to strengthening the American banking system." He said he supported the idea of financial services holding companies advocated by the Association of Bank Holding Companies in which regulation of various bank, thrift, insurance, investment, securities and real estate subsidiaries would be handled on functional lines. "Limits would be placed on the extension of credit by the bank to the associated institutions, and all transactions would have to be on an arms-length basis," Heller said. Measures would be necessary to avoid abuse of the banks' special position by such holding companies or subsidiaries. Heller said he "would require the holding company to serve as a 'source of strength' to the bank by making a commitment to maintain the bank's capital. "In other words, the bank would not be allowed to fail as long as the holding company has a positive net worth." Heller also said commercial enterprises should be permitted to own a financial services holding company, again with the provision that capital would flow to the financial enterprise if necessary. Heller said the effects of these actions "would be banks that are at least as strong as the corporations holding them" in which customer deposits were assured while any incentive to "loot the bank" was removed. Such diversification would give access to national and international financial services to corporations across the United States. Heller said that would mean "the steady decline of America's banks in the world financial league tables would be arrested" by permitting them to become more competitive. Reuter  26-MAR-1987 13:11:37.69 earn F f1977reute f f BC-******FEDERATED-DEPAR 03-26 0014  ******FEDERATED DEPARTMENT STORES INC UPS QTLY DIV BY 10.5 PCT, SETS 2-FOR-1 STOCK SPLIT Blah blah blah.  26-MAR-1987 13:14:17.73 usa A RM f1990reute r f BC-OUTBOARD-MARINE-<OM> 03-26 0116  OUTBOARD MARINE <OM> SELLS 9.15 PCT DEBENTURES NEW YORK, March 26 - Outboard Marine Corp is raising 100 mln dlrs via an offering of sinking fund debentures due 2017 yielding 9.15 pct, said lead manager Salomon Brothers Inc. The debentures have a 9-1/8 pct coupon and were priced at 99.75 to yield 146 basis points over comparable Treasury bonds. Morgan Stanley co-managed the deal. The issue is non-refundable for 10 years. A sinking fund beginning in 1998 to retire annually five pct of the debt may be increased by 200 pct at the company's option, giving it an estimated minimum life of 13.85 years and maximum of 20.5 years. The debt is rated Baa-2 by Moody's and BBB-plus by S/P. Reuter  26-MAR-1987 13:15:04.62 acq usa F f1992reute r f BC-GOULD-<GLD>-SELLS-FRE 03-26 0052  GOULD <GLD> SELLS FRENCH BATTERY UNIT ROLLING MEADOWS, March 26 - Gould Inc said it sold its French Battery unit, Cie Francaise d'Electro Chimie, to a group of investors including the unit's employees and <GNB Inc> of Minnesota. Terms of the sale were not disclosed. The unit had 1986 sales of 65 mln dlrs. Reuter  26-MAR-1987 13:17:32.95 earn usa F f2003reute r f BC-ADVANCED-GENETIC-SCIE 03-26 0036  ADVANCED GENETIC SCIENCES <AGSI> YEAR LOSS OAKLAND, Calif., March 26 - Shr loss 30 cts vs loss 73 cts Net loss 3,895,267 vs loss 8,250,222 Revs 3,237,235 vs 234,745 Note: 4th qtr data not available Reuter  26-MAR-1987 13:25:26.95 earn usa F f2025reute u f BC-FEDERATED-DEPARTMENT 03-26 0077  FEDERATED DEPARTMENT <FDS> RAISES QTLY DIVIDEND CINCINNATI, March 26 - Federated Department Stores Inc said it raised its quarterly common stock dividend to 74 cts a share, from 67 cts, an increase of 10.5 pct. The company said it also approved a two-for-one stock split in the form of a 100 pct stock dividend. At the same time, Federated said it will ask shareholders to approve an increase in the number of authorized shares to 400 mln, from 200 mln. Federated said the dividend is payable on a pre-split basis on April 24 to shareholders of record April 10. New shares from the stock split will be distributed May 11, it said. Reuter  26-MAR-1987 13:29:49.49 usa F f2040reute r f BC-CFTC-SEES-NO-TRADING, 03-26 0087  CFTC SEES NO TRADING, TRIPLE WITCHING RULES WASHINGTON, March 26 - The chairman of the CFTC, Susan Phillips, said she does not expect the CFTC to restrict dual trading or to intervene in the quarterly expiration of stock index futures and their options. "At this time we have no plans to reexamine our policy (on dual trading)," she told the House Subcommittee on Conservation, Credit and Rural Development. She said it would not be appropriate to ban dual trading because it would decrease market liquidity. Dual trading refers to the ability of futures commission merchants to trade for their own as well as their clients' accounts. Exchange rules prohibit a broker from attempting to benefit from the market impact of a client's order by trading on his own account before placing the client's order. CFTC has required all futures exchanges by July 1 to have implemented audit trails permitting the reconstruction of all trades to the nearest minute. The move was designed in part to discourage abuse of dual trading. The board of directors of the Chicago Mercantile Exchange has proposed limiting but not banning dual trading in the Standard and Poor's 500 stock index future pit. Phillips indicated the CFTC would not move beyond requiring improved audit trails in its effort to allay concerns about dual trading abuses. "It would be inappropriate at this point until we see how the audit trail will work," she said in response to a question. On triple-witching, Phillips said recent experiments by markets to quell price fluctuations have been quite successful and that users of securities and derivative instruments were still learning how to deal with the quarterly phenomenon. Triple-witching refers to the simultaneous expiration of stock index futures, options on those futures and options on certain individual stocks. The CFTC chairman noted the commission has heightened surveillance of markets on triple-witching day. "We aren't sure any other regulatory changes are needed at this point," Phillips said. Reuter  26-MAR-1987 13:30:19.72 usa A RM f2041reute r f BC-TRINITY-INDUSTRIES-<T 03-26 0104  TRINITY INDUSTRIES <TRN> AND UNIT CUT BY S/P NEW YORK, March 26 - Standard and Poor's Corp said it cut to BB-minus from BB-plus Trinity Industries Inc's 275 mln dlrs of liquid yield option notes. Also downgraded were the unit Trinity Industries Leasing Co's 60 mln dlrs of convertible debentures due 2006 to BB-plus from BBB-minus. S and P said the actions reflected Trinity's weakened earnings due to depressed demand in several key markets, the likelihood that a significant sustained improvement would not occur in the near-term, as well as heightened financial risk from a series of debt-financed acquisitions. Reuter  26-MAR-1987 13:32:52.55 earn usa F f2054reute u f BC-DANZAR-INVESTMENT-<DN 03-26 0079  DANZAR INVESTMENT <DNZR> SETS SPECIAL DIVIDEND DALLAS, March 26 - Danzar Investment Group Inc said it received 60 mln shares of <Commonwealth Capital Ltd> in settlement of a debt and that it will distribute the shares to its stockholders as a dividend. Danzar said the dividend will also include 18,750,000 Commonwealth shares it already holds. The dividend of 39.9 shares per Danzar share held will be paid to shareholders of record April 15, the company said. Reuter  26-MAR-1987 13:38:15.46 acq usa F f2069reute d f BC-FIDELITY-<FNF>-UNIT-A 03-26 0058  FIDELITY <FNF> UNIT ACQUIRES CALIFORNIA CONCERN SCOTTSDALE, Ariz., March 26 - Fidelity National Financial Inc said its Fidelity National Title Insurance Co subsidiary acquired the operations of Safeco Title Insurance Co in the northern California counties of Alameda, Contra Costa and San Mateo. Terms of the acquisition were not disclosed. Reuter  26-MAR-1987 13:40:37.69 usa F f2070reute d f AM-LIABILITY 03-26 0113  ADMINISTRATION SAYS INSURANCE CRISIS EASED WASHINGTON, March 26 - The Reagan administration said the national crisis in liability insurance eased during the past year as the insurance industry's profits more than doubled to 11.5 billion dlrs, but some problems still persist. An administration working group, in an update of its report a year ago, found that insurance premiums generally have stabilized, but at high levels, as the crisis has abated. After severe financial difficulties in 1984 and 1985, the insurance industry's rate of return last year recovered to the same level as the performace of U.S. corporations in general, the group said in a 98-page study. While the crisis has eased, the study found that liability insurance will likely remain expensive and continue to be difficult to obtain for some lines of coverage and for some sectors of the American economy. Some types of insurance, especially associated with environmental liability, remain unavailable for many companies at any price, it said. The increased availability and the price stability for insurance the past year has been accompanied by higher deductibles, lower coverage limits and additional policy restrictions, the study said. The administration last year unveiled a wide range of recommendations aimed at dealing with the crisis, including limits on punitive damages and awards for pain, suffering and mental anguish at 100,000 dlrs. Attorney General Edwin Meese told a news conference today that the administration still supports state efforts to place limits on damage awards and to enact other reforms of the tort laws. Assistant Attorney General Richard Willard denied charges by consumer groups that the insurance crisis was caused by industry collusion to raise rates in violation of the antitrust laws. Willard, the head of the working group, said excessive jury damage awards was the main reason for the insurance liability problem. Reuter  26-MAR-1987 13:44:20.98 RM f2081reute f f BC-Saint-Gobain-U.S.-sub 03-26 0015  ******Saint Gobain U.S. Subsidiary seeks 150 mln dlr, five year facility - arranger Chemical Blah blah blah.  26-MAR-1987 13:45:13.45 earn usa F f2082reute u f BC-HOME-SAVINGS-BANK-<HM 03-26 0022  HOME SAVINGS BANK <HMSB> SETS INITIAL DIVIDEND NEW YORK, March 26 - Qtly div nine cts Pay April 30 Record April six Reuter  26-MAR-1987 13:46:09.82 cotton usa C G f2085reute u f BC-cotton-ginnings 03-26 0093  FINAL 1986 CROP U.S. COTTON GINNINGS WASHINGTON, March 26 - Final 1986 crop U.S. cotton ginnings totaled 9,438,425 running bales, vs 12,987,834 bales at the end of the 1985 season and 12,544,866 bales at end-1984 season, the U.S. Census Bureau said. The bureau said upland cotton ginnings from the final 1986 crop totaled 9,237,296 bales, vs 12,837,088 bales in 1985 and 12,418,749 bales in 1984. American Pima ginnings from the final 1986 crop totaled 201,129 bales, vs 150,746 bales in the 1985 crop and 126,117 bales in 1984, the bureau said. REUTER  26-MAR-1987 13:48:02.47 usa F A f2087reute d f AM-ANDERSON 03-26 0119  FORMER TREASURY SECRETARY PLEADS GUILTY TO TAX EVASION NEW YORK, March 26 - Former Secretary of the Treasury Robert Anderson, whom Dwight Eisenhower once said deserved to be president, pleaded guilty to income tax evason charges and illegally running an offshore bank. Anderson, declaring that he was "deeply regretful," admitted to evading tax on 127,500 dlrs in undeclared income. Much of the money was paid to him for lobbying for controversial South Korean evangelist Sun Myung Moon's Unification Church. The 77-year-old Anderson was President Eisenhower's treasury secretary from 1957 to 1961 and a prominent businessman afterwards. In his memoirs, Eisenhower said Anderson deserved to be president. Standing before Federal Court Judge Edmund Palmieri, Anderson, who faces up to 10 years in jail, said he had recently undergone two operations and treatment for alcoholism. The judge set May 7 for sentencing and U.S. Attorney Rudolph Giuliani declared the government would ask that Anderson be sent to jail. According to the indictment, Anderson was a prinicipal of the Commercial Exchange Bank and Trust Ltd of Anguilla in the British West Indies for two years ending in 1985. During that time, government prosecutors said the bank conducted operations in New York city but failed to register with state and federal banking authorities. Depositors have lost at least 4 mln dlrs. Anderson pleaded gulity only for the tax year 1984 but admitted other tax transgressions for the previous year and faces civil fines for both years. Among other things, he said he received 80,000 dlrs in 1983 from a shell corporation for lobbying for the Unification Church. The money was given to him as a no-interest loan repayable in 1990 but the government said it should have been reported as income. Reuter  26-MAR-1987 13:53:17.71 earn F f2104reute f f BC-******american-brankd 03-26 0009  ******AMERICAN BRANDS SEES RECORD FIRST QUARTER RESULTS Blah blah blah.  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-011.sgm000066400000000000000000002304211154025176300231370ustar00rootroot00000000000000 30-MAR-1987 14:22:36.87 usa F A RM f2192reute u f BC-FIDATA-<FID>-ANNOUNCE 03-30 0086  FIDATA <FID> ANNOUNCES PRELIMINARY ESM SETTLEMENT NEW YORK, March 30 - Fidata Corp <FID> and its subsidiary, Fidata Trust Company New York <FTCNY>, announced that they have reached a preliminary settlement agreement in principle in the lawsuits filed by major parties arising out of the E.S.M. Government Securities, Inc bankruptcy. Fidata Corp said that it anticipates that the cost of the proposed settlement, after anticipated recoveries, will be less than 4 mln dlrs, and possibly significantly less. The major terms of the settlement agreement, applicable to Fidata and FTCNY, provide for the release by Fidata of its claims to 1.125 mln dlrs held by the ESM estate, and the further payment of 8.425 mln dlrs for distribution to the public body plaintiffs and Home State Savings Bank. Fidata said it expects to recover along with its subsidiary at least half of the sums to be paid under the terms of the agreement, and potentially amounts substantially in excess of that. Reuter  30-MAR-1987 14:23:25.56 usa F f2194reute w f BC-LOUISVILLE-GAS<LOU>-T 03-30 0084  LOUISVILLE GAS<LOU> TO ASK PROTECTIVE MEASURES LOUISVILLE, KY., March 30 - Louisville Gas and Electric Co said it will ask stockholders at its May 12 annual meeting to approve several anti-takeover proposals. It said the measures include staggered terms for directors and a fair price provision that would require a potential purchaser to make the same offer to all stockholders. Louisville Gas said the amendments are not in response to any specific effort to obtain control of the company. Reuter  30-MAR-1987 14:23:31.58 usa F f2195reute h f BC-TRACOR-<TRR>-UNIT-WIN 03-30 0064  TRACOR <TRR> UNIT WINS NAVY CONTRACT AUSTIN, March 30 - Tracor Inc said its Tracor Applied Sciences unit was awarded a 1.9 mln dlr contract by the U.S. Navy's Naval Underwater Systems Center. Under the contract, Tracor said the unit will provide analytical, experimental, engineering and technical services to the Navy's Surface Ships Antisubmarine Warefare Development Program. Reuter  30-MAR-1987 14:23:38.33 usa F f2196reute r f BC-CAMPBELL-SOUP-<CPB>-T 03-30 0056  CAMPBELL SOUP <CPB> TO SELL PLANT IN DELAWARE CAMDEN, N.J., March 30 - Campbell Soup co said it will sell its W.L. Wheatley ingredients plant in Clayton, Del., as a going operation. It said it will continue to operate the plant until a buyer is found. The sale is aimed at improving Campbell's return on assets, the company said. Reuter  30-MAR-1987 14:28:03.38 usaindia F f2207reute h f BC-VIDEO-DISPLAY-<VIDE> 03-30 0065  VIDEO DISPLAY <VIDE> IN INDIAN JOINT VENTURE STONE MOUNTAIN, Ga., March 30 - Video Display Corp said it signed agreements with <Glowtronics <Ltd> to jointly build a manufacturing plant in the state of Karnatake, India. Video Display said the plant, in which it will own a 40 pct equity interest, will make cathodes, filament heatrers and electron gun assembles for television sets. Reuter  30-MAR-1987 14:28:16.03 acq F f2208reute f f BC-TAFT 03-30 0013  ******BASS GROUP SAYS IT HAS HAD TALKS ON SEEKING CONTROL OF TAFT BROADCASTING Blah blah blah.  30-MAR-1987 14:29:14.28 crude usa Y f2209reute u f BC-REFINE- 03-30 0103  LOWER REFINERY OPERATIONS SEEN PRODUCING PROFITS By BERNICE NAPACH, Reuters SAN ANTONIO, TEXAS, March 30 - U.S. refiners will have to reduce operations if they want to be profitable this year, said industry officials attending the National Petroleum Refiners Association meeting here. "If the refining sector can discipline itself to refine about 12 mln barrels of crude oil a day, we have a chance to pull down inventories to acceptable levels by the second quarter, said Archie Dunham, executive vice president of petroluem products at Conoco Inc "If not, the industry will have a tough 1987," he added. Last week's American Petroleum Institute report said that U.S. refining capacity rose three pct to 78.7 pct of capacity, with crude oil runs at 12.2 mln barrels per day for the week ended March 20. The API said that with the higher crude oil runs, distillate and gasoline inventories were sharply above year-ago levels. Gasoline stocks were at 245.6 mln barrels, some 17.2 mln barrels above year-ago levels. Distillate stocks, at 108.7 mln barrels, are 10.9 mln barrels above last year's level, the API said. Henry Rosenberg, chairman of Crown Central Petroleum Corp <CNP> told Reuters that unless refining and marketing return to profitability, oil companies will have to rely on downstream operations to produce an acceptable level of earnings. "The jump in refining capacity is a concern if it continues," said Kenneth Buckler, executive vice president of refining and marketing at <Total Petroleum Co>, a U.S. subsidiary of Cie Francaise Des Petroles of France. Refineries should operate near 75 pct of capacity given the current level of demand but the operating level should increase as gasoline demand picks up in the next quarter, Buckler said. Dunham said the potential operable capacity of U.S. refineries should also be cut about 500,000 barrels of crude per day. "I expect to see the shutdown of more small refineries over the next five years," he said, adding that these facilities refine between 10,000 and 30,000 barrels of crude oil per day. The API said U.S. operations have the capacity to refine 15.6 mln bpd of crude. Reuter  30-MAR-1987 14:29:24.83 usa F f2210reute r f BC-NYNEX 03-30 0103  NYNEX <NYN> UNIT FILES 500 MLN DLR DEBT OFFERING WASHINGTON, March 30 - New York Telephone Co, a subsidiary of NYNEX Corp, filed with the Securities and Exchange Commission for a shelf offering of up to 500 mln dlrs of debt securities on terms to be determined at the time of the sale. Proceeds from the offering, which is in addition to 50 mln dlrs of debt securities already registered with the SEC but unsold, will be used to refinance outstanding long-term debt, to repay short-term debt and for other general corporate purposes, the company said. The company did not name an underwriter for the sale. Reuter  30-MAR-1987 14:29:34.81 usa F f2212reute d f BC-HALIFAX-ENGINEERING-< 03-30 0101  HALIFAX ENGINEERING <HX> GETS CONTRACTS ALEXANDRIA, Va., March 30 - Halifax Engineering Inc said it has received a fixed-price contract woirth 6,700,000 dlrs for one year, plus two option years, to provide security services for the U.S. Embassy in Tegucigalpa. The company said it has also received a three-year U.S. Army contract, including two option years, for telecommunications installation support. The contract is worth a total of 7,500,000 dlrs, it said. Halifax said its backlog as of tomorrow, the end of its fiscal year, will be about 53 mln dlrs, up from 27 mln dlrs a year before. Reuter  30-MAR-1987 14:29:58.53 usasweden F f2213reute d f BC-<ELECTROLUX-AB>-UNIT 03-30 0095  <ELECTROLUX AB> UNIT TO BUILD WAREHOUSE ASHEVILLE, N.C., March 30 - The North Carolina Department of Commerce said Electrolux AB of Sweden's White Consolidated Industries subsidiary will locate a new 15 mln dlr 352,000 square foot national appliance parts distribution center at Asheville, N.C. It said the center will handle parts for Frigidaire, Tappan, Kelvinator, Gibson, Vesta and White-Westinghouse product lines. Each now has a separate distribution center. The department said construction will start immediately and should be finished in late 1987. Reuter  30-MAR-1987 14:30:15.88 ukfrance RM f2215reute u f BC-SALOMON-SA-EURO-CP/CR 03-30 0106  SALOMON SA EURO-CP/CREDIT TERMS DETAILED LONDON, March 30 - A seven-year credit facility for Salomon SA, the French ski bindings and boots maker, will have a facility fee of 7.5 basis point, banking sources said. The financing involves a 75 mln dlr euro-commercial paper program which will be supported by a 75 mln dlr committed syndicated revolving credit. Morgan Guaranty Ltd is the arranger. Drawings on the revolving credit will be at a margin of 10 basis points over the London Interbank Offered Rate (LIBOR). Banks are being invited to join at 7.5 mln dlrs for 10 basis points and at five mln dlrs for eight basis points. Reuter  30-MAR-1987 14:32:12.01 grainwheatcornoilseedsoybean usa C G f2221reute f f BC-export-inspections 03-30 0015  ******U.S. EXPORT INSPECTIONS, IN THOUS BUSHELS SOYBEANS 17,683 WHEAT 20,717 CORN 36,581 Blah blah blah.  30-MAR-1987 14:32:29.52 usa cbtnyce F RM f2222reute u f BC-REGULATORS-TO-CONSIDE 03-30 0112  REGULATORS TO CONSIDER CBT EVENING SESSION WASHINGTON, March 30 - The Commodity Futures Trading Commission, CFTC, said that on April 15 it will consider the Chicago Board of Trade's proposal to establish night trading. The Chicago exchange hopes to begin night trading at the end of the month. The proposed trading session -- which would be the first in the United States -- would extend from 1700 to 2100 local time (2300 to 0300 GMT). CFTC also said that on April 22 it will consider the Philadelphia Board of Trade's application to trade futures on the Australian dollar and the New York Cotton Exchange's application to trade the five-year U.S. Treasury Index. Reuter  30-MAR-1987 14:35:33.56 west-germanyjapan F f2239reute r f BC-SONY-INCREASING-PRODU 03-30 0099  SONY INCREASING PRODUCTION ABROAD BONN, March 30 - Sony Corp <SNE.T> will increase production abroad to overcome falling profits caused by the yen's rise against the dollar, managing board chairman Akio Morita told the West German newspaper Die Welt. He was quoted as saying that Sony, whose latest profit figures had been affected strongly by dollar fluctuations, would increase production in the U.S. And Europe. Several production facilities were being built, he added. "At the same time we are also investing capital in order to modernise our locations and raise our productivity." Morita said that to overcome the same currency problems, Japan needs to restructure its economy in order to live less from exports and more from domestic demand. He said U.S. And European companies had made the mistake of not investing enough in the future, which was why they had lost their lead in consumer electronics. "They may spend a lot of money on research and development," he said. "But planning and marketing are very important sectors in developing a marketable product." "If they don't spend money on these, they can't build up new business lines." Speaking of difficulties foreign firms experience in penetrating the Japanese market, Morita said "Naturally, I have to admit that there are still many obstacles in Japan." On the other hand, many foreign firms were too interested in short-term success, he said. "If, therefore, a company comes to Japan and wants to make a profit at once on this market, it is not so simple." "These people then complain, while the successful firms keep their mouths shut," Morita said. Reuter  30-MAR-1987 14:36:52.17 earn usa F f2244reute u f BC-NEWMONT-MINING-<NEM> 03-30 0084  NEWMONT MINING <NEM> PLANS 2-FOR-1 STOCK SPLIT NEW YORK, March 30 - Newmont Mining Corp's board has proposed a two-for-one stock split subject to shareholder approval of an increase to 120 mln from 60 mln in authorized common shares, the proxy for the company's annual meeting said. If holdings voting at the May six meeting in Wilmington, Del., approve the increase in authorized shares the split will be paid in the form of a stock dividend on June 10 to holders of record May 20, the proxy said. Newmont said it will also ask shareholders to approve amendments to its certificate of incorporation limiting certain liabilities of its directors. Reuter  30-MAR-1987 14:38:10.07 mexico F f2254reute u f BC-MEXICO-FUND-<MFX>-TO 03-30 0086  MEXICO FUND <MFX> TO BUY BACK TWO MLN SHARES MEXICO CITY, March 30 - The Mexico Fund Inc said its board authorized an offer to purchase two mln shares, or about 10.2 pct, of its common stock at 6.75 dlrs a share cash. The fund, at a special board meeting, said the offer is not conditioned on any minimum number of shares being tendered. The fund has issued and outstanding 19,513,200 shares of common stock, it said. As of March 26, 1987, the fund said the net asset value of its shares was 8.13 dlrs. The fund said it intends to commence the offer by a mailing to its shareholders as soon as possible. It said it purchased shares of its stock in open market transactions prior to the proposed cash tender and intends to purchase additional shares at prevailing market prices after completion of the offer. The fund's last price per share on the New York Stock Exchange at the halt was 5-3/4. Reuter  30-MAR-1987 14:42:08.80 usa F f2265reute d f BC-QUARTZ-ENGINEERING-<Q 03-30 0046  QUARTZ ENGINEERING <QRTZ> GETS SIEMENS ORDER TEMPE, Ariz., March 30 - Quartz Engineering and Materials Inc said it has received a 500,000 dlr order from <Siemens AG> of West Germany for its ATMOSCAN automated environmentally controlled semiconductor wafer processing system. Reuter  30-MAR-1987 14:43:54.75 earn usa F f2273reute d f BC-DENPAC-CORP-<DNPC>-YE 03-30 0043  DENPAC CORP <DNPC> YEAR LOSS HACKENSACK, N.J., March 30 - Shr loss one ct vs loss one ct Net loss 483,518 vs loss 220,582 Sales 381,841 vs 400,518 NOTE: 1985 net includes 196,868 dlr gain from forgiveness o accrued interest due to affiliates. Reuter  30-MAR-1987 14:44:06.64 earn usa F f2275reute d f BC-<AIN-LEASING-CORP>-3R 03-30 0049  <AIN LEASING CORP> 3RD QTR JAN 31 LOSS GREAT NECK, N.Y., March 30 - Shr loss six cts vs profit 22 cts Net loss 133,119 vs profit 496,391 Revs 136,918 vs 737,917 Nine mths Shr loss 21 cts vs profit 15 cts Net loss 478,991 vs profit 340,210 Revs 324,011 vs 841,908 Reuter  30-MAR-1987 14:47:20.29 usa F f2282reute r f BC-WARNER-LAMBERT-<WLA> 03-30 0097  WARNER-LAMBERT <WLA> WINS PACKAGING SUIT MORRIS PLAINS, N.J., March 30 - Warner-Lambert Co said a federal court judgment resulted in <My-K Laboratories Inc> agreeing to discontinue the sale of cough syrup and a children's allergy elixir because it imitates Warner-Lambert packaging. Warner-Lambert said the final consent judgment was entered in the U.S. District Court of the Northern District of Illinois. It also said the packaging in question imitated its own packaging of Benylin and Benadryl products. My-K agreed to adopt different packaging, Warner-Lambert said. Reuter  30-MAR-1987 14:47:40.85 usa F f2284reute d f BC-HARTMARX-<HMX>-UNIT-P 03-30 0094  HARTMARX <HMX> UNIT PRESIDENT RESIGNS CHICAGO, March 30 - Hartmarx Corp said Geoffrey Bloom resigned as president and chief executive officer of its Jaymar-Ruby Inc subsidiary to accept the position of president and chief operating officer of Wolverine World Wide Inc <WWW>. It said Elbert Hand, president and chief operating officer of Hartmarx, and president and chief executive officer of the Hartmarx Men's Apparel Group, was named chief executive officer of Jaymar-Ruby Inc. Burton Ruby, son of the Jaymar-Ruby founder, remains as chairman. Reuter  30-MAR-1987 14:48:20.82 usa A f2286reute u f BC-SENATE-BILL-WOULD-ALL 03-30 0102  SENATE BILL WOULD ALLOW FARM LOAN WRITE-DOWNS WASHINGTON, March 30 - The U.S. Senate has approved a measure that would allow an estimated 4,200 agricultural banks to write off loan losses over ten years. The measure, offered by Sen. Alan Dixon (D-Ill.), was attached to a bill to recapitalize the Federal Savings and Loan Insurance Corp that the Senate approved March 27. Dixon's amendment would permit agricultural banks -- banks with assets of 100 mln dlrs or less and at least 25 pct of total loans in farm loans -- to write down over ten years agricultural loan losses incurred between 1984 and 1992. Reuter  30-MAR-1987 14:49:29.53 usa C G f2291reute r f BC-U.S.-SENATE-BUDGET-CH 03-30 0131  U.S. SENATE BUDGET CHIEF EYES FARM POLICY CHANGE WASHINGTON, March 30 - U.S. Senate Budget Committee Chairman Lawton Chiles' (D-Fla.) fiscal 1988 budget plan would cut farm spending by about two billion dlrs, primarily by making unspecified changes in price and income support programs, Senate staff members said. Chiles presented his budget blueprint late last week and said he would like to begin voting on it this week. Senate Republican staff members said Chiles was recommending that policy changes be adopted for 1988 crops. While savings from the changes would accrue mainly in fiscal 1989, Chiles said his income and price support proposals would trim about two billion dlrs from advance deficiency payments, most of which would be made in the spring of next year. It was not clear how the Senate Budget panel head would achieve the savings in Commodity Credit Corp outlays. Aides to Chiles would not comment on how the CCC savings would be made. Recently the Congressional Budget Office released a report listing possible price and income support program savings. The options included lowering target prices, increasing unpaid acreage reduction programs, targeting income support payments to specific groups of producers, limiting the use of generic commodity certificates, raising loan rates and "decoupling" income support payments from production decisions. Chiles proposed saving about 100 mln dlrs by freezing the U.S. Agriculture Department's discretionary spending functions which include research and credit programs, Senate staff said. The Florida senator's plan also would provide 30 mln dlrs for organic farming research and 20 mln dlrs for homeless aid. Reuter  30-MAR-1987 14:54:12.48 usasouth-africa F f2301reute u f BC-newmont-mining-<nem> 03-30 0112  NEWMONT MINING <NEM> SEEKS SOUTH AFRICAN SALE NEW YORK, March 10 - Newmont Mining Corp will seek favorable terms for sale of its South African investments, the proxy statement for its annual meeting said. Recommending that shareholders vote against a proposal calling expeditious withdrawal from South Africa, the proxy said "a quick sale could be akin to abandonment" because of the depressed state of metal mining stocks and exchange rates on capital withdrawals from South Africa. The proxy said the company gave close consideration to alternatives to the continued holdings of four existing South African metal mining investments during the past year. Pointing out "a measurable number of investors incline to support" resolutions calling for South African divestment as part of their effort to avoid pressure to sell a given stock, the company said "this largely unspoken agenda of many supporters of disinvestment does receive attention by the corporation." Because of this, Newmont Mining said it "is prepared to consider, and will seek, favorable terms for sale of its South African investments," but asked stockholders to reject the resolution calling for withdrawal and leave the matter to the continuing judgment of management. Reuter  30-MAR-1987 15:00:51.14 crude venezuela Y f2311reute u f BC-VENEZ- 03-30 0109  VENEZUELA WANTS TO BOOST ITS REFINING CAPACITY SAN ANTONIO, TEXAS, March 30 - Venezuela's state oil company Petroleos de Venezuela S.A. wants to raise its worldwide refining capacity by 150,000 barrels of per day, a company official attending the National Petroleum Refiners Association meeting here said. He declined to be identified but said PdVSA has the capacity to refine about 650,000 bpd of crude oil from refining centers in Venezuela, Sweden, West Germany, Belgium, and the United States. The company recently purchased a 50 pct stake in the Corpus Christi, Texas refinery of Champlin Petroleum Co, a subsidiary of Union Pacific Corp <UNP>. Earlier it bought a similar stake in the Lake Charles, La refinery owned by Citgo Petroleum Corp, a unit of Southland Corp <SLC>. According to the official, Venezuela is searching worldwide for the additional refining capacity but he did not mention where the company was looking. Refineries abroad, he said, guarantee a refining outlet for Venezuelan crude oil while ensuring stability of supply to refiners. He said Venezuela currently produces about 1.4 mln bpd of crude oil, which is in line with its 1.495 bpd OPEC ceiling. Reuter  30-MAR-1987 15:02:17.84 usa F f2316reute r f BC-AUDI-OFFERS-CASH-INCE 03-30 0132  AUDI OFFERS CASH INCENTIVE TO CURRENT OWNERS TROY, MICH., March 30 - Audi of America Inc said it introduced the "Audi Private Purchase Plan" in which it will offer 5,000 dlr purchase certificates exclusively to current owners of 1984-86 Audi 5000 vehicles. It said owners must apply the certificates toward purchase or lease of any new 1987 Audi 5000 series vehicle. The program will run between April 1 and June 30, and more than 150,000 certificates will be mailed. A company spokesman said eligible owners need not trade in their old cars to take advantage of the offer. He also said the scheme was not prompted by the fact that Audi had to recall thousands of its cars earlier this year to correct a possible defect that caused some of the cars to accelerate suddenly. Reuter  30-MAR-1987 15:05:58.06 earn usa F f2335reute r f BC-PRIMEBANK-<PMBK>-SETS 03-30 0037  PRIMEBANK <PMBK> SETS 10 PCT STOCK DIVIDEND GRAND RAPIDS, Mich., March 30 - PrimeBank Federal Savings Bank said its board declared a 10 pct stock dividend to be distributed about April 15 to holders or record March 31. Reuter  30-MAR-1987 15:06:30.04 earn usa F f2336reute d f BC-AMERICAN-LOCKER-GROUP 03-30 0074  AMERICAN LOCKER GROUP INC <ALGI> 4TH QTR NET JAMESTOWN, N.Y., March 30 - Shr profit 23 cts vs loss six cts Net profit 319,564 vs loss 84,203 Sales 6,419,230 vs 5,583,560 Year Shr profit 1.11 dlrs vs profit 43 cts Net profit 1,582,125 vs profit 654,083 Sales 26.2 mln vs 22.6 mln NOTE: Full year 1985 includes gains of two cts per share from discontinued operations and four cts per share from disposal of assets. Reuter  30-MAR-1987 15:15:20.33 acq usa F f2351reute b f BC-TAFT 03-30 0087  BASS GROUP SAYS IT HAS HAD TALKS ON TAFT <TFB> WASHINGTON, March 30 - A group led by members of the wealthy Bass family of Fort Worth, Texas, which holds a 24.9 pct stake in Taft Broadcasting Co, said it has had talks about taking part in a move to take control of the company. In a filing with the Securities and Exchange Commission, the group said it has had discussions with other Taft stockholders and some company managers and directors "concerning participation in a group to acquire control" of the company. The Bass group, which did not identify any of the other people with whom it said it has had talks, said it plans to continue evaluating Taft and "will be involved in further discussions relating to the future control and direction" of the company. The group, which holds 2,291,210 Taft common shares, said its members may buy more shares of Taft common stock, or may decide to sell some or all of its stake. On Friday Taft said it would negotiate with a group led by its vice chairman, Dudley Taft, and a Rhode Island investment firm, which had offered 150 dlrs a share for the company. The Dudley Taft group, Theta Corp, which also includes Narragansett Capital Corp, a Providence, R.I., investment firm, is seeking to take the company private in a leveraged buyout valued at 1.38 billion dlrs. Besides the Bass group, another major Taft shareholder, Cincinnati, Ohio, financier Carl Lindner, has also said he has had talks about increasing his stake in the company, taking part in a takeover effort, or launching one himself. Lindner controls 1,489,298 shares of Taft common stock, or 16.2 pct of the total. Reuter  30-MAR-1987 15:16:34.99 iron-steel usa MQ FQ f2355reute u f BC-us-steel-production 03-30 0077  U.S. STEEL PRODUCTION ROSE 1.3 PCT IN WEEK New York, March 30 - Steel production rose 1.3 pct to 1,696,000 short tons in the week ended March 28 from 1,675,000 short tons, the American Iron and Steel Institute reported Production so far this year was 18,810,000 tons adjusted off 14.6 pct from 22,016,000 tons produced by the nations mills a year ago. Utilization for the week of March 28 was 78.7 pct and for the week of March 21 was was 77.8 pct. Reuter  30-MAR-1987 15:17:57.62 earn usa F f2366reute r f BC-NORTH-AMERICAN-GROUP 03-30 0070  NORTH AMERICAN GROUP <NAMG> 4TH QTR OPER LOSS CHICAGO, March 30 - Oper shr loss 12 cts vs loss 10 cts Oper net loss 474,270 vs loss 369,848 Revs 202,500 vs 111,210 Avg shrs 3,904,373 vs 3,495,579 Year Oper shr loss 28 cts vs loss 46 cts Oper net loss 1,069,550 vs loss 893,612 Revs 408,031 vs 438,933 Avg shrs 3,785,607 vs 1,944,627 NOTE: Full name is North American Group Ltd Earnings exclude losses on reorganization expenses of 33,453 dlrs, or one ct a share vs 59,520 dlrs, or two cts a sh are in the quarter and losses of 237,859 dlrs, or six cts a share vs 413,444 dlrs, or 21 cts a share for the year Earnings exclude gains on discontinued operations of 147,671, or four cts a share in the 1985 quarter and gains of 760,603 dlrs, or 20 cts a share vs 520,200 dlrs, or 27 cts a share for the year Reuter  30-MAR-1987 15:18:39.33 usa F f2371reute u f BC-PAY-'N-PAK-<PNP>-TO-E 03-30 0079  PAY 'N PAK <PNP> TO EXPLORE ITS ALTERNATIVES KENT, Wash., March 30 - Pay 'N Pak Stores Inc said it intends to explore all alternatives for the purpose of maximizing its value to stockholders. The company said it also retained Salomon Brothers Inc as its financial advisor to assist it in this regard. Last week investor Paul Bilzerian reported that he holds a 7.2 pct stake in Pay 'N Pak and is considering seeking control of the retail building materials firm. In a filing with the Securities and Exchange Commission Bilzerian said he and a Tampa, Fla., investment firm he controls called Bicoastal Financial Corp, may acquire additional Pay 'N Pak shares, or they may seek to acquire one or more positions on the company's board. He also said in the filing that he may attempt to obtain a controlling interest through a tender offer or otherwise. Reuter  30-MAR-1987 15:20:25.66 usa RM A f2377reute r f BC-SOCIETY-FOR-SAVINGS-< 03-30 0111  SOCIETY FOR SAVINGS <SOCS> TO OFFER NOTES NEW YORK, March 30 - Society for Savings said it will offer up to 100 mln dlrs of medium-term notes with maturites of one to five years through Goldman, Sachs and Co and Shearson Lehman Brothers Inc. The notes will be supported by an irrevocable letter of credit by the Federal Home Loan Bank of Boston. Each note will bear interest at a fixed-rate or variable rate formula established at the time of issuance, Society for Savings said. Bankers Trust Co will act as fiscal and paying agent. Non-redeemable to maturity, the notes will be issued only in registered form and in minimum denomiations of 100,000 dlrs. Reuter  30-MAR-1987 15:20:32.84 earn usa F f2378reute r f BC-<OXOCO-INC>-YEAR-LOSS 03-30 0072  <OXOCO INC> YEAR LOSS HOUSTON, March 30 - Oper shr loss 6.68 dlrs vs loss 9.95 dlrs Oper net loss 53.9 mln vs loss 69.8 mln Revs 16.5 mln vs 33.2 mln Avg shrs 8,329,492 vs 7,271,668 NOTE: 1986 excludes loss 12.9 mln for discontinued compressor operations vs loss 14.9 mln year prior. 1986 excludes gain of 98.7 mln for extinguishment of debt from company's chapter 11 filing and subsequent reorganization. Reuter  30-MAR-1987 15:20:48.00 earn usa F f2380reute d f BC-TEECO-PROPERTIES-L.P. 03-30 0094  TEECO PROPERTIES L.P. OPER INCOME DOWN NEW YORK, March 30 - <Teeco Properties L.P.> said the partnership recorded income from operations for 1986 of 140,000 dlrs, or two cts a unit. The partnerhsip said this compared to 1985 figures of 660,000 dlrs, or 10 cts a unit. Results of operations between both years is not comparable since the partnership's principle objective is to sell or dispose of its assets and distribute proceeds to unit holders, according to the partnership. It said the number of units outstanding for both years is 6,479,516. Reuter  30-MAR-1987 15:20:52.65 earn usa F f2381reute d f BC-BROUGHER-INSURANCE-GR 03-30 0042  BROUGHER INSURANCE GROUP INC<BIGI> 4TH QTR LOSS GREENWOOD, Ind., March 30 - Shr loss nine cts vs profit 20 cts Net loss 257,157 vs profit 414,890 Year Shr profit 54 cts vs profit 1.05 dlrs Net profit 1,295,104 vs profit 2,140,673 Reuter  30-MAR-1987 15:22:33.92 usa F f2385reute d f AM-COURT-CARS 03-30 0099  HIGH COURT DECLINES TO REVIEW AIR BAG RULE WASHINGTON, March 30 - The Supreme Court declined to review a federal regulation requiring automobile manufacturers to phase in automatic seat belts or air bags for new cars sold in the United States. The Department of Transportation (DOT) rule required that the safety devices be installed, for the first time, on 10 pct of this year's model cars. All new cars must have the devices by the 1990-model year. The regulation, however, can be rescinded if states with two-thirds of the U.S. population adopt mandatory seat belt-use laws by 1989. Reuter  30-MAR-1987 15:24:34.95 uk A f2395reute w f BC-TRADE-BODY-SETS-NEW-R 03-30 0105  TRADE BODY SETS NEW RULES FOR EURODLR MANAGERS London, March 30 - The International Primary Market Makers Association, a trade organisation, said its board last week adopted new rules recommending lead managers of eurodollar bond issues make a market in that security for 12 months. Currently, while there is an implied obligation on the part of firms to make markets in issues they underwrite, there is no formal obligation to do so. Christopher Sibson, secretary general of IPMA, in explaining why the recommendation was adopted, said "It is aimed at the problem of the lead manager who does a deal and disappears." Sibson said the organization cannot force its members to adhere to the rule. "We're under no illusions about the legal binding force of these recommendations," he said. Lead managers have occasionally abandoned efforts to support an unprofitable issue just a short while after it has been offered, leaving investors and smaller firms with no one to buy it back from them. Most recently, when prices of perpetual floating rates notes (FRNs) suddenly plunged, most market makers abandoned the securities altogether, leaving investors stuck with about 17 billion dlrs worth of unmarketable securities on their books. Sibson noted that the recommendation adopted by the board only applies to fixed-rate dollar issues and would not have helped the floating rate sector out of its current crisis. Among other measures, the IPMA also decided that the criteria for membership should be tightened to exclude some of the smaller firms. Under the new rules, a firm must be the book running lead manager during the two preceding years of 12 internationally distributed debt issues denominated in U.S. Dlrs or in one of eight other major currencies. The former requirement called for three lead-managed issues. Sibson said he expects the tighter entrance requirements to pare 3he current list of 67 members down by six to 10 members. Smaller firms have criticized IPMA's efforts to restrict membership to the larger firms, saying it is anti-competitive and that it reinforces the big firms' already large market share. "Belonging to IPMA carries a certain amount of prestige with borrowers," said a dealer at a small foreign bank. "The borrower says to himself, "Well I can travel economy or I can travel first class,'" he said. Reuter  30-MAR-1987 15:26:11.53 iron-steel usa F f2401reute r f BC-CSC-INDUSTRIES-UNIT-T 03-30 0091  CSC INDUSTRIES UNIT TO INCREASE PRICES WARREN, Ohio, March 30 - Copperweld Steel Co <CPSL>, a subsidiary of CSC Industries Inc., said it will increase from market price levels its bar, semi-finished and leaded products effective July One. Hot rolled and cold finished bar wil be increase 25 dlrs per net ton, while semi-finished products will be increased 15 dlrs per net ton, the company said. Anticipated higher energy and raw material costs, combined with current market trends, were cited by the company as reasons for the increases. Reuter  30-MAR-1987 15:26:25.70 grainwheat usa C G f2402reute u f BC-USDA-TO-UPDATE-WINTER 03-30 0098  USDA TO UPDATE WINTER WHEAT ACREAGE TOMORROW WASHINGTON, March 30 - The U.S. Agriculture Department said it will update its estimate of winter wheat seeded acreage in the prospective planting report, scheduled for release at 1500 est (2100 gmt) tomorrow, March 31. The original estimate of seedings of winter wheat was published in January. It said the new survey is possible because of the new integrated nationwide survey program that uses probability sampling procedures that combine information from farmers operating in selected areas and farmers identified on special lists. Reuter  30-MAR-1987 15:27:02.85 acq usa F f2404reute b f BC-SANTA-FE-<SFX>-AWARE 03-30 0121  SANTA FE <SFX> AWARE OF HENLEY <HENG> STAKE CHICAGO, March 30 - Santa Fe Southern Pacific Corp said it has discussed with Henley Group that company's almost five pct stake and was told the holdings are for investment purposes. "We have confirmed with the Henley Group that they own approximately 7.9 mln shares of Santa Fe Southern Pacific common stock. They have informed me that they like our company and purchased the stock last year for investment purposes," Santa Fe chairman John Schmidt said in a statement. Henley late Friday filed a 10-K report with the Securities and Exchange Commission concerning the Santa Fe stake. Earlier Santa Fe's stock was up 4-7/8 to 41 before slipping to be up 1-7/8 at 38. Reuter  30-MAR-1987 15:29:30.70 usa F f2406reute r f BC-OXOCO-CONCLUDES-PRIVA 03-30 0097  OXOCO CONCLUDES PRIVATE SALE OF NEW COMMON HOUSTON, March 30 - Oxoco Inc said it concluded the private placement of 3,906,250 shares of its new common stock at an average purchase price of 1.28 dlrs per share for a cash payment of five mln dlrs. Oxoco said the sale was to a group of venture capital investors led by Hambrecht and Quist of San Francisco. It said the venture capitalists now own 71.6 pct of the outstanding stock of the company. In addition, Andrew Loomis and Michael McGovern were elected chairman and co-chairman, respectively, of the company, it said. Reuter  30-MAR-1987 15:29:47.66 sugar usa C T f2407reute b f BC-sugar-imports 03-30 0122  U.S. SUGAR IMPORTS DOWN IN LATEST WEEK - USDA WASHINGTON, March 30 - Sugar imports subject to the U.S. sugar import quota during the week ended March 6 totaled 25,192 short tons versus 29,043 tons the previous week, the Agriculture Department said. Cumulative imports now total 130,804 tons, it said. The sugar import quota for the 1987 quota year (January-December) has been set at 1,001,430 short tons compared with 1,850,000 tons in the 1986 quota year, which was extended three months to December 31. The department said the Customs Service reported that weekly and cumulative imports are reported on an actual weight basis and when final polarizations are received, cumulative import data are adjusted accordingly. Reuter  30-MAR-1987 15:39:21.47 usa F f2427reute u f BC-TRANSAMERICAN-FILES-A 03-30 0092  TRANSAMERICAN FILES AMENDED REORGANIZATION PLAN HOUSTON, March 30 - TransAmerican Natural Gas Corp, which has been operating under Chapter 11 bankruptcy protection since January 1983, said it filed an amended and restated negotiated plan of reorganization. A hearing on the adequacy of the disclosure statement is scheduled for April 29 in the U.S. Bankruptcy Court for the Southern District of Texas. Basic terms of the amended and restated negotiated plan have not changed from the original plan filed last October, the company said. The amended filing reflects adding ancillary documents to the plan filed in October, it said. Assuming the plan is found adequate on April 29, TransAmerican would then seek acceptance from creditors which is relatively assured since they participated in the negotiations, the company said. Liabilities in excess of one billion dlrs are being reorganized under the amended plan which provides for full debt-repayment to secured bank lenders. Unsecured creditors would receive either 100 pct repayment, secured by liens on assets, or one-time lump sum payments of 25 to 35 cts on the dollar, in cash, shortly after confirmation of the plan by the court. TransAmerican is vigorously resisting efforts by Coastal Corp <CGP> to acquire its assets through a subsequent plan of liquidation. The spokesman said the company is confident its plan will be confirmed and is optimistic that it will emerge from Chapter 11 as early ninety days after the April 29 confirmation. A Coastal spokesman said it will file a plan in April with the court and will request the court to review its plan. On March 17, the company said that as a creditor, which is owed 625,000 dlrs, it has a right to file its own plan which will better serve the other creditors in a shorter time. A TransAmerican spokesman said the net worth of Coastal's offer is less than 25 pct of the fair market value of Transamerican's assets which are in excess of one billion dlrs. Reuter  30-MAR-1987 15:44:23.25 usa F f2434reute r f BC-TEXTRON-<TXT>-TO-REPA 03-30 0114  TEXTRON <TXT> TO REPAY DEBT THROUGH ASSET SALES PROVIDENCE, R.I., March 30 - Texton Inc said it intends to repay a substantial portion of the debt generated to acquire Ex-Cell-O Corp last year through internally generated cash and proceeds from the sale of assets. Textron financed the acquisition by borrowing about one billion dlrs under promissory notes, subsequently refinanced through the sale of commercial paper and bank borrowings. The large diversified conglomerate with operations ranging from defense to consumer and financial services, said in its annual report that it has not yet identified the units, other than its Gorham division, it expects to sell. Textron said it did expect to identify the units it intends to sell during the next year. It said the sales are expected to reduce income from continuing operations as the units' earnings will exceed the interest on the debt retired with the proceeds of the sales. It also said it plans to "return to a more conservative balance sheet ratio of debt-to-capital," through asset sales and increasing cash flow from continuing operations. It also said it will continue to examine "large acquisition opportunities," while "pruning" operations no longer expected to meet its strategic requirements. Reuter  30-MAR-1987 15:51:12.26 earn usa F f2449reute r f BC-TEMPLETON-ENERGY-INC 03-30 0064  TEMPLETON ENERGY INC <TMPL> 4TH QTR NET HOUSTON, March 30 - Shr profit four cts vs loss six cts Net profit 967,000 vs loss 1,219,000 Revs 10.1 mln vs 4.5 mln Year Shr profit three cts vs loss five cts Net profit 688,000 vs 982,000 Revs 24.6 mln vs 16.3 mln NOTE: 1986 includes results of Louisiana Energy and Development Corp acquired in November 1986. Reuter  30-MAR-1987 15:52:04.99 earn usa F f2450reute r f BC-AEL-INDUSTRIES-<AELNA 03-30 0063  AEL INDUSTRIES <AELNA> 4TH QTR FEB 27 NET LANSDALE, Pa., March 30 - Shr 66 cts vs 33 cts Net 2,955,000 vs 1,563,000 Revs 26.1 mln vs 23.9 mln 12 mths Shr 74 cts vs 1.01 dlrs Net 3,321,000 vs 4,739,000 Revs 108.4 mln vs 104.9 mln NOTE: year 1987 includes charge of 818,000 dlrs, or 18 cts per share, for sale of Elisra Electronic Systems Ltd. Reuter  30-MAR-1987 15:54:36.57 acq usa F f2452reute r f BC-AMOSKEAG-<AMKG>-TAKEO 03-30 0084  AMOSKEAG <AMKG> TAKEOVER BLOCKED BY COURT MANCHESTER, N.H., March 30 - Amoskeag Bank Shares Inc said the New Hampshire Supreme Court overturned its proposed acquisition of Portsmouth Savings Bank in a three-two vote. The acquisition had been opposed by some depositors, who filed an action to block the takeover. "We will respond to this news as soon as we have had an opportunity to analyze the decision, and any and all options available to us," chairman William Bushnell said in a statement. Reuter  30-MAR-1987 15:55:50.23 earn usa F f2454reute d f BC-METROMAIL-<MTMA>-PRED 03-30 0117  METROMAIL <MTMA> PREDICTS FLAT EARNINGS LINCOLN, Neb., March 30 - Metromail Corp said it expects flat operating profits for its 1987 fiscal year ending May 31 with last fiscal year's earnings from operations of 9,943,000 dlrs, or 1.05 dlrs a share. The company said the flat results will be due to higher than normal expenditures during the fourth quarter for expansion of its data processing capabilities. Earlier, Metromail reported fiscal 1987 third quarter earnings of 2.4 mln dlrs, or 25 cts a share, versus three mln dlrs, or 32 cts a share, the prior third quarter, and nine months net of 7.2 mln dlrs, or 76 cts a share, versus 7.8 mln dlrs, or 82 cts a share the prior nine months. Reuter  30-MAR-1987 15:56:28.52 usa F f2455reute r f BC-APPLE-<AAPL>-EXPANDS 03-30 0088  APPLE <AAPL> EXPANDS NETWORK CAPABILITIES CUPERTINO, Calif., March 30 - Apple Computer Inc said it has extended the ability of the Apple MacIntosh personal computer family to commmunicate over <Northern Telecom Ltd's> Meridian SL-1 integrated services network. The new capabilities include linking separate AppleTalk networks, dial-up remote use of LaserWriter printers, one step file transfer and conversion and Memorybank 485, a new 485 megabyte storage subsystem for use with MacIntosh personal computers, Apple said. Reuter  30-MAR-1987 15:58:33.75 acq usa F f2457reute u f BC-BALL-<BLL>-ENDS-TALKS 03-30 0056  BALL <BLL> ENDS TALKS WITH MONSANTO <MTC> MUNCIE, IND., March 30 - Ball Corp said it was unable to complete negotiations to acquire the plastic container business of Monsanto Co. It said the two companies had entered into exclusive negotiations last October. Neither company provided details on why the talks were terminated. Reuter  30-MAR-1987 15:58:44.17 oilseedrapeseed japancanada C G f2458reute u f BC-JAPAN-BUYS-CANADIAN-R 03-30 0030  JAPAN BUYS CANADIAN RAPESEED WINNIPEG, March 30 - Japanese crushers bought 2,000 tonnes of Canadian rapeseed in export business overnight for May shipment, trade sources said. Reuter  30-MAR-1987 15:59:18.08 usa F f2459reute u f BC-NEWMONT-MINING-<NEM> 03-30 0107  NEWMONT MINING <NEM> SETS HIGHER SPENDING IN 1987 NEW YORK, March 30 - Newmont Mining Corp estimates its 1987 capital spending at 137 mln dlrs, its annual report said. A company spokesman said this figure excludes <Magma Copper Co> and compares to spending of about 80 mln dlrs in 1986 excluding the 45 mln dlrs spent on Magma operations. As previously announced, Newmont is distributing 80 pct of Magma's stock to its shareholders in the form of a dividend. The report also said Newmont Mining increased its ownership of Du Pont Co <DD> stock during 1986 to 5,970,141 shares at year end from 5,250,376 shares a year earlier. Newmont's annual report said the company held 2.5 pct of Du Pont's stock at the end of 1986, up from 2.2 pct a year earlier. The report also said Newmont's proven oil reserves declined to 7,970,000 barrels at the end of 1986 from 8,530,000 barrels a year earlier and its natural gas reserves declined to 271.48 billion cubic feet from 274.82 billion at the end of 1985. Reuter  30-MAR-1987 15:59:24.50 usa F f2460reute r f BC-3COM-CORP-<COMS>-INTR 03-30 0085  3COM CORP <COMS> INTRODUCES NEW WORKSTATION SANTA CLARA, Calif., March 30 - 3Com Corp said it introduced a new network workstation for business applications. The product, called 3Station, is the first in a family of network workstations, which will later include a Token Ring version, the company said. It said the 3Station is an IBM-compatible 80286-based Ethernet product which can be integrated with personal computers on a network. The company also said it plans to begin shipments on May 15. Reuter  30-MAR-1987 16:00:03.76 usa A RM f2462reute r f BC-S/P-AFFIRMS-BANNER-<B 03-30 0110  S/P AFFIRMS BANNER <BNR>, LOWERS REXNORD <REX> NEW YORK, March 30 - Standard and Poor's Corp said it affirmed Banner Industries Inc's 135 mln dlrs of B-minus subordinated debt following its purchase of Rexnord Inc. Rexnord's 50 mln dlrs of 12-3/4 pct debentures of 1994 were cut to B from A-minus to reflect the merger with Banner. While increasing Banner's size and diversity, S and P said the transaction heightens financial risk, with debt to capital rising to more than 90 pct. Near-term earnings and cash flow protection will weaken from the acquisition, though Banner's plans to sell some Rexnord assets will reduce debt for the medium term. Reuter  30-MAR-1987 16:00:28.68 acq usa F f2463reute d f BC-REEF-ENERGY-<RFEN>-EN 03-30 0098  REEF ENERGY <RFEN> ENTERS PIPELINE AGREEMENT TRAVERSE CITY, MICH., March 30 - Reef Energy Corp said its board entered into agreements with Penteco Corp, a private Tulsa-based company, to buy a 12-pct interest in the general partnership of Penteco East Central Pipeline and a 10-pct interest in Lincoln Gas and Marketing Corp. Penteco East is a gas gathering and transmission system in southern Kansas and northern Oklahoma. It said Penteco in turn has purchased one mln shares of Reef common and taken options for the purchase of another two mln shares over the next 36 months. Reuter  30-MAR-1987 16:00:33.29 earn usa F f2464reute s f BC-AMERON-INC-<AMN>-QTLY 03-30 0025  AMERON INC <AMN> QTLY DIVIDEND MONTEREY PARK, Calif., March 30 - Shr 24 cts vs 24 cts prior qtr Pay May 15 Record April 24 Reuter  30-MAR-1987 16:00:39.33 earn usa F f2465reute d f BC-JOHNSON-ELECTRONICS-I 03-30 0070  JOHNSON ELECTRONICS INC <JHSN> 4TH QTR LOSS WINTER PARK, Fla., March 30 - Shr loss three cts vs profit eight cts Net loss 35,000 vs profit 128,000 Revs 1,133,000 vs 1,528,000 Year Shr profit four cts vs profit 21 cts Net profit 72,000 vs profit 339,000 Revs 4,837,000 vs 4,500,000 NOTE: 1985 net income included an after tax gain of 195,000 or 12 cts per share on sale of real property. Reuter  30-MAR-1987 16:01:55.85 money-fx usa A RM f2469reute u f BC-TREASURY-BALANCES-AT 03-30 0084  TREASURY BALANCES AT FED FELL ON MARCH 27 WASHINGTON, March 30 - Treasury balances at the Federal Reserve fell on March 27 to 2.424 billion dlrs from 2.508 billion dlrs on the previous business day, the Treasury said in its latest budget statement. Balances in tax and loan note accounts fell to 9.706 billion dlrs from 10.786 billion dlrs on the same respective days. The Treasury's operating cash balance totaled 12.131 billion dlrs on March 27 compared with 13.283 billion dlrs on March 26. Reuter  30-MAR-1987 16:06:38.27 earn usa F f2480reute r f BC-MORRISON-INC-<MORR>-3 03-30 0049  MORRISON INC <MORR> 3RD QTR FEB 28 NET MOBILE, Ala., March 30 - Shr 35 cts vs 29 cts Qtly div 12 cts vs 12 cts prior qtr Net 5,036,000 vs 4,165,000 Revs 147.6 mln vs 132.4 mln Nine mths Shr 1.12 dlrs vs one dlr Net 16.1 mln vs 14.4 mln Revs 433.4 mln vs 385 mln NOTE: Per share data reflect March 1986 five pct stock distribution. Cash dividend is payable April 30 to holders of record April 15. Reuter  30-MAR-1987 16:06:53.63 usa C G f2481reute d f BC-FOREIGN-OWNERSHIP-OF 03-30 0127  FOREIGN OWNERSHIP OF U.S. FARMLAND UP -- USDA WASHINGTON, March 30 - Non-U.S. citizens held 12.4 mln acres of privately owned U.S. agricultural land as of December 31, slightly less than one pct of the total agricultural land, but 369,000 acres above the foreign ownership at the end of 1985, the U.S. Agriculture Department said. The department said forest land accounted for 52 pct of all foreign-owned acreage, cropland 17 pct, pastures and other agricultural land 26 pct and non-agricultural and unreported uses, five pct. Corporations owned 79 pct of the foreign-held acreage, parternships 11 pct, and individuals eight pct, the department said. The remaining two pct was held by estates, trusts, associations, institutions and others, it said. Reuter  30-MAR-1987 16:07:10.68 usasouth-africa F f2483reute u f BC-U.S.-GROUP-ASKS-SPECI 03-30 0101  U.S. GROUP ASKS SPECIAL ROYAL DUTCH<RD> MEETING NEW YORK, March 30 - A group of U.S. investors opposed to Royal Dutch Shell Petroleum Co's South African policies plans to seek a special shareholders meeting to discuss their complaints. Representatives of the American Baptist Churches and the New York City Teachers Retirement System said the company has refused to include their proposals in proxy material prepared for the annual meeting in May. The group said its proposals call for an end to sales by Royal Dutch to the South African police and military and withdrawal from South Africa. Reuter  30-MAR-1987 16:08:25.90 acq usa F f2488reute r f BC-VANDERBILT-<VAGO>-TO 03-30 0116  VANDERBILT <VAGO> TO RAISE COMMON, MERGE LAS VEGAS, March 30 - Vanderbilt Gold Corp said shareholders at a special meeting approved its reincorporation in Delaware, an increase in authorized common to 25 mln shares from 12 mln shares, and a non-qualified stock option plan. It also said shareholders approved the merger of Morning Star Mine interests held by six corporations in exchange for issuing 2,098,602 shares of its common. It said the acquisition brings its ownership in Morning to over 94 pct and it intends to acquire the remaining interests before mid year. It said its plans call for 1987 production of 30,000 ounces of gold with product costs per ounce at about 200 dlrs. Reuter  30-MAR-1987 16:10:35.89 cotton usa C G f2491reute u f BC-/LITTLE-RISK-SEEN-FOR 03-30 0142  LITTLE RISK SEEN FOR TEXAS COTTON FROM COLD New York, March 30 - Texas' cotton crop stands little chance of damage from frigid temperatures expected tonight in that state, as very little cotton has been planted, according to Texas agricultural sources and cotton market analysts. "It's still pretty early for cotton planting. Only six pct of the crop was planted as of last week," said Doug Stillmann, a statistician at the Texas Agricultural Statistic Service in Austin, a division of the U.S. Agriculture Department. Stillmann and other cotton market sources said planting had begun in the Rio Grande Valley and South Texas areas only, with planting in the crucial high and low plains areas not slated to begin until next month. The high and low plains accounted for 60 pct of the 2.5 mln bales produced in Texas last year, Stillmann said. Temperatures tonight in most of Texas are expected to drop to freezing to the low 20s, although the lower Rio Grande Valley may see more moderate readings in the middle 30s, according to meteorologists at Accu-Weather Inc. The price of new-crop cotton on the New York cotton futures market rallied today on weather-related fears. Reuter  30-MAR-1987 16:11:45.14 grain usa C G f2493reute u f BC-REPORT-ON-EXPORT-MARK 03-30 0054  REPORT ON EXPORT MARKETS FOR U.S. GRAIN DELAYED WASHINGTON, March 30 - The U.S. Agriculture Department's report on Export Markets for U.S. Grain, scheudled for release today, has been delayed until Wednesday, April 1, a department spokeswoman said. No reason was given for the delay in releasing the monthly report. Reuter  30-MAR-1987 16:12:16.53 acq F f2497reute b f BC-******BILZERIAN-TELLS 03-30 0010  ******BILZERIAN TELLS SEC HE UPS PAY 'N PAK STAKE TO 9.9 PCT Blah blah blah.  30-MAR-1987 16:13:10.33 usa F f2501reute d f BC-ALLIED-SIGNAL-<ALD>-G 03-30 0037  ALLIED-SIGNAL <ALD> GETS 38.6 MLN DLR CONTRACT WASHINGTON, March 30 - Allied Corp, a division of Allied-Signal Inc, has received a 38.6 mln dlr contract for work on F-15 aircraft avionics maintenance, the Air Force said. reuter  30-MAR-1987 16:16:09.66 usa F f2503reute r f BC-MORRISON-<MORR>-SETS 03-30 0055  MORRISON <MORR> SETS SHAREHOLDER RIGHTS PLAN MOBILE, Ala., March 30 - Morrison Inc said its board adopted a shareholder rights plan to deter any possible hostile takeover of the company. It said details of the plan will be released shortly. A record date of April 10 was set for the distribution of the rights to shareholders. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-012.sgm000066400000000000000000002321771154025176300231520ustar00rootroot00000000000000 1-APR-1987 11:04:07.01 earn usa F f1288reute s f BC-REPUBLIC-SAVINGS-AND 04-01 0039  REPUBLIC SAVINGS AND LOAN <RSLA> SETS DIVIDEND MILWAUKEE, Wis., April 1 - Qtly div 30 cts vs 30 cts prior Pay April 27 Record April 13 NOTE: Company's full name is Republic Savings and Loan Association of Wisconsin. Reuter  1-APR-1987 11:04:40.35 wheatcornsoybeangrainoilseed usaussr C G f1292reute u f BC-/SHULTZ-USSR-TRIP-FUE 04-01 0108  SHULTZ USSR TRIP FUELS TALK OF EEP WHEAT OFFER By Nelson Graves, Reuters WASHINGTON, April 1 - Speculation the United States will offer subsidized wheat to the Soviet Union appears to have reached a new level of intensity in the run-up to Secretary of State George Shultz' visit later this month to Moscow. Rumors of an impending deal have coursed through wheat markets since officials from the two countries held their customary, semi-annual grain talks in February. Moscow's decision at that time to reenter the U.S. corn market strengthened the perception of warming farm trade prospects. Shultz is set to arrive in Moscow April 13. Shultz' statement two weeks ago that he would not stand in the way of a wheat subsidy offer under the Export Enhancement Program, EEP, coupled with the announcement of his visit to Moscow, was interpreted by many grain trade representatives here as a clear signal that the Reagan administration was preparing an offer. Administration officials -- in and out of the U.S. Agriculture Department -- have been extremely tight-lipped about the prospects of a subsidy offer. But USDA officials for the most part have abandoned the contention the proposal is dormant, suggesting that an offer, while not a "done deal," is a live possibility. Prominent U.S. grain trade representatives -- many of whom asked not to be identified -- continue to maintain that an offer to subsidize four mln tonnes of wheat is imminent. Others, who one month ago claimed a deal was not possible, are saying they would not rule one out. Rep. Pat Roberts, R-Kan., yesterday went so far as to predict a subsidy offer would be made within the next ten days to two weeks. Aides to Roberts said he had spoken to Republican leaders who had been in contact with administration officials. Richard Fritz, director of international marketing at U.S. Wheat Associates, said he was confident an export enhancement offer would be made by the middle of this month. Fritz also said he thought the value of the bonus would end up being close to the offer Washington made Peking earlier this year when USDA approved subsidies to China of around 36 dlrs per tonne on one mln tonnes of wheat. Some grain trade representatives say a four-mln-tonne wheat subsidy offer might help stimulate more Soviet purchases of U.S. corn and open the door to U.S. sales of soybeans. As ever, one of the crucial sticking points in a wheat deal would appear to be price. Last summer the administration took the controversial step of offering the Soviets subsidized wheat -- but were embarrassed when Moscow spurned the proposal on the grounds that the 15-dlr-per-tonne subsidy still left U.S. wheat prices far above world market prices. The administration's decision to set the subsidy level up front instead of accepting bids from exporters appeared to be a means of controlling the price while attempting to dampen criticism, grain trade sources said. Nonetheless, the pricing procedure did not prevent Shultz from saying the Soviets were "chortling" because Washington was offering Soviet housewives cheaper grain than that available to U.S. housewives. The conventional wisdom among grain trade representatives here is that a general warming of relations between the two countries since last summer, combined with continued hard times in the U.S. grain belt, would favor a subsidy offer. In addition, the USSR has made it clear it would consider buying U.S. wheat if it were priced more competitively. However, observers have not forgotten the circumstances surrounding the administration's announcement of the wheat subsidy offer last summer. Up until the time of the announcment, congressional and industry leaders were led to believe the White House had decided to expand the Export Enhancement Program to include not only the Soviets, but also a much broader list of countries. Instead, the administration scaled back the offer to include only the Soviets. That last-minute change of heart adds a measure of uncertainty even to the predictions of those most convinced that the administration will not now pass up the opportunity to sell four mln tonnes of wheat to the Soviet Union. Reuter  1-APR-1987 11:05:07.78 sugar ukindia C T f1295reute b f BC-KAINES-CONFIRMS-WHITE 04-01 0062  KAINES CONFIRMS WHITE SUGAR SALES TO INDIA LONDON, April 1 - London-based sugar operator Kaines Ltd confirmed it sold two cargoes of white sugar to India out of an estimated overall sales total of four or five cargoes in which other brokers participated. The sugar, for April/May and April/June shipment, was sold at between 214 and 218 dlrs a tonne cif, it said. Reuter  1-APR-1987 11:09:07.45 usa F f1325reute r f BC-LUXTEC-<LUXT>-CUTS-WA 04-01 0037  LUXTEC <LUXT> CUTS WARRANT EXERCISE PRICE STURBRIDGE, Mass., April 1 - Luxtec Corp said it has reduced the exercise price of its Class B common stock purchase warrants to one dlr from two dlrs from today through June 30. Reuter  1-APR-1987 11:09:11.43 earn usa F f1326reute r f BC-<THL-HOLDINGS-INC>-YE 04-01 0038  <THL HOLDINGS INC> YEAR JAN 31 NET CANTON, Mass., April 1 - Oper net 94.4 mln vs 74.1 mln Revs 1.3 bilion vs 1.2 billion NOTE: THL is parent to SCOA Industries Inc, acquired in a leveraged buyout in December 1985. Reuter  1-APR-1987 11:09:19.56 uk F f1327reute d f BC-GUARDIAN-ROYAL-SEES-E 04-01 0111  GUARDIAN ROYAL SEES EXPANSION IN LIFE ASSURANCE LONDON, April 1 - Insurance group Guardian Royal Exchange Plc <GREX.L> said it would expand its life assurance business and push further into European markets, but that U.K. Underwriting losses remained a heavy drag on profits. Earlier, the group had announced sharply increased pre-tax profits of 143.8 mln stg for calendar 1986, versus 3.5 mln the previous year. "We are anxious to develop our life assurance business," group managing director Peter Dugdale told a news conference. "If we have a thrust for the coming years, it is probably best to spend more time on life in the U.K. And abroad," he said. Reuter  1-APR-1987 11:09:50.05 acqstrategic-metal usa M f1330reute d f BC-MOUNTAIN-STATES-ADDS 04-01 0090  MOUNTAIN STATES ADDS TWO MINERALS PROPERTIES SALT LAKE CITY, April 1 - Mountain States Resources Corp said it acquired two properties to add to its strategic minerals holdings. The acquisitions include a total of 5,100 acres of titanium, zirconium and rare earth resources, the company said. Both properties, located in southern Utah, consist of approximately 1,430 acres of unpatented mining claims and one state lease, it said. The company also announced the formation of Rare Tech Minerals Inc, a wholly-owned subsidiary. Reuter  1-APR-1987 11:10:45.38 coffee ico-coffee C T f1333reute b f BC-Restoration-of-coffee 04-01 0016  ******RESTORATION OF COFFEE EXPORT QUOTAS BEFORE OCTOBER SEEMS UNLIKELY - ICO PRODUCER DELEGATES  1-APR-1987 11:11:41.60 wheatgrain usaussr F f1337reute d f BC-SHULTZ-USSR-TRIP-FUEL 04-01 0103  SHULTZ USSR TRIP FUELS TALK OF EEP WHEAT OFFER WASHINGTON, April 1 - Speculation the United States will offer subsidized wheat to the Soviet Union appears to have reached a new level of intensity in the run-up to Secretary of State George Shultz' visit later this month to Moscow. Rumors of an impending deal have coursed through wheat markets since officials from the two countries held their customary, semi-annual grain talks in February. Moscow's decision at that time to reenter the U.S. corn market strengthened the perception of warming farm trade prospects. Shultz is set to arrive in Moscow April 13. Reuter  1-APR-1987 11:11:46.21 interest usa RM A f1338reute r f BC-FREDDIE-MAC-ADJUSTS-S 04-01 0043  FREDDIE MAC ADJUSTS SHORT-TERM DISCOUNT RATES WASHINGTON, April 1 - The Federal Home Loan Mortgage Corp adjusted the rates on its short-term discount notes as follows: MATURITY RATE OLD RATE MATURITY 32 days 6.00 pct 6.10 pct 1 day Reuter  1-APR-1987 11:12:00.71 coffee ukbrazilguatemalacolombia ico-coffee C T f1340reute b f BC-COFFEE-QUOTAS-BEFORE 04-01 0082  ICO QUOTAS BEFORE OCTOBER UNLIKELY - DELEGATES LONDON, April 1 - The restoration of coffee export quotas before the end of the current 1986/87 coffee year (Oct 1/Sept 30) now seems unlikely, given reluctance by International Coffee Organization, ICO, producers and consumers to resume negotiations on an interim quota accord, producer delegates told reporters. Consumers and most producers see no point in reopening the quota dialogue while Brazil's position remains unchanged, they said. Brazil's refusal to accept a reduction in its previous 30 pct share of the ICO's global export quota effectively torpedoed talks here last month aimed at restoring quotas before October, the delegates noted. Disappointment at the lack of progress on quotas forced coffee futures in London and New York to new lows today, traders here said. Near May in New York fell below one dlr in early trading at around 99.10 cents per pound, traders said. Producer delegates said that while the possibility of reimposing quotas before October remained on the ICO agenda, in practice the idea had effectively been discarded. The ICO's executive board session here this week has so far barely touched on the quota debate, demonstrating general unwillingness to revive talks while chances of success are still remote, producer delegates said. Some producers are in no hurry to see quotas restored, despite the price collapse seen since the failure of last month's negotiations, they said. "With Brazil's frost season approaching, who wants to negotiate quotas," one leading producer delegate said. Coffee prices normally rise during Brazil's frost season (mainly June-August) as dealers and roasters build up stocks as insurance against possible severe frost damage to Brazil's crop. Many producers are more interested in working towards reimposing quotas from October 1, based on a new system of quota allocations valid until the International Coffee Agreement expires in 1989, they said. Guatemala has already proposed the "other oilds" producer group should meet in the next two months to begin talks on how to allocate quota shares. Producers still seem divided on how to overhaul the quota distribution system, with some producer delegates reporting growing support for a radical reallocation, based on the principle of "objective criteria" favoured by consumers. At last month's council session a splinter group of small producers backed consumer demands for new quota shares based on exportable production and stocks, while Brazil, Colombia and the rest of the producers favoured leaving quota allocations unchanged, except for some temporary adjustments. A delegate from one of the eight said more producers now supported their cause. The delegate said unless major producers like Brazil showed readiness to negotiate new quota shares, prospects for a quota accord in October also looked bleak. The U.S. and most other consumers are still determined to make reimposition of quotas conditional on a redistribution of quota shares based on "objective criteria." ICO observers remained sceptical that Brazil would be prepared to accept a quota reduction when the ICO council meets in September. Brazil has adopted a tough stance with banks on external debt negotiations and is likely to be just as tough on coffee, they said. They said Brazil's reluctance to open coffee export registrations might reflect fears this would provoke another price slide and force an emergency ICO council session, which would most likely end in failure. Producers met this afternoon to review the market situation but had only a general discussion about how further negotiations should proceed, a producer delegate said. Producers plan to hold consultations on quotas, and then may set a date for a formal producer meeting, but plans are not fixed, he said. The ICO executive board reconvened at 1650 hours local time to hear a report from consultants on ICO operations. The board meeting looks set to end today, a day earlier than scheduled, delegates said. Reuter  1-APR-1987 11:13:10.37 usa F f1346reute f f BC-******AMERICAN-MOTORS 04-01 0011  ******AMERICAN MOTORS MARCH U.S. CAR OUTPUT DOWN TO 2,578 FROM 5,922  1-APR-1987 11:16:02.05 yugoslavia mikulic A f1350reute h f BC-YUGOSLAVIA-WINS-TIME 04-01 0108  YUGOSLAVIA WINS TIME IN PARIS CLUB REFINANCING BELGRADE, April 1 - Yugoslavia has won breathing space from its major official creditors through yesterday's Paris Club refinancing agreement but it will take time for it to resolve its economic crisis, economists at western embassies said. Yugoslav delegation chief Finance Minister Svetozar Rikanovic said a refinancing was agreed for 475 mln dlrs of debt falling due between May 16 this year and May 31, 1988. The agreement was the second multi-year Yugoslav debt refinancing, based on a protocol signed last May which ushered in "enhanced monitoring" of Yugoslavia's economy by the IMF. Western economists who follow Yugoslav financial affairs said a similar deal would probably emerge from talks with commercial creditors at the end of this month. But they said the refinancings would only provide a breathing space, because Yugoslavia has to repay 5.5 billion dlrs in 1987. And the country is still struggling to reverse a dramatic decline in export earnings, which have fallen 12.5 pct so far this year, continuing a downward spiral of the past 18 months. The Yugoslav hard currency debt has grown from 1.2 billion dlrs in 1965 to stand at 19.7 billion dlrs at the end of 1986 and is one of the country's most dire economic problems. The debt began to snowball in the 1960s and 1970s due to an excessive investment rate exceeding the growth of the Gross Social Product and necessitating additional foreign borrowing. Rising international oil prices in the 1970s proved to be a serious blow to the country's balance of payments. Deputy Prime Minister Milos Milosavljevic said this month that Yugoslavia had repaid 640 mln dlrs of principal and 325 mln dlrs of interest so far this year. According to official Yugoslav figures, Yugoslavia repaid a record 5.97 billion dlrs in capital and interest in 1986, reducing overall indebtedness by 996 mln dlrs. Mikulic is trying to rein in rampant retail inflation of almost 100 pct a year through price and incomes controls. Janez Zemljaric, also a Deputy Prime Minister, said recently Yugoslavia expected a "definite measure of understanding" from its 16 major western creditor nations. Western economists said Yugoslavia has had its way with the Paris Club creditors but that not all creditors were satisfied with its economic performance last year. They said the Paris discussions were heated and emotional. "Economic factors were balanced by political realities," an economist at one of the main embassies here said, but added that creditors had no complaints regarding Yugoslavia's repayment record because it had so far always repaid debts on time. Yugoslavia has refinanced its debt regularly since 1983. In December 1985, it signed a deal with the International Coordinating Committee of 600 commercial banks to refinance maturities arising between January 1, 1985 and end-1988. It had signed bilateral refinancing agreements in March of that year for maturities arising from January 1, 1985 to March 25, 1986, following an agreement in Paris on March 25, 1985. Government ministers told Reuters this month that Yugoslavia had made too great an effort to repay its debts in 1986, at great cost to the economy, and that this was regretted. Mikulic has said Yugoslavia is unlikely to follow Brazil's lead and suspend its debt repayments "but we have understanding for what that country did." Western economists said, however, that Mikulic's remarks, taken with those of his ministers, could be a signal that some problems were seen ahead in refinancing debt repayments. Before the Paris talks, some Yugoslav officials had hinted that Yugoslavia could start to look to the Soviet Bloc for financial support if Belgrade failed to secure the necessary refinancing from western creditors. Sources close to the western creditors, however, said they did not view the threat as serious. REUTER  1-APR-1987 11:16:55.25 earn usa E f1353reute u f BC-(GEOFFRION-LECLERC-IN 04-01 0031  (GEOFFRION LECLERC INC) SIX MTHS NET MONTREAL, April 1 - Shr 39 cts vs 26 cts Net 3,466,000 vs 1,913,000 Revs 27.7 mln vs 19.4 mln Note: period ended February 28. REUTER Reuter  1-APR-1987 11:19:36.90 usa A RM f1358reute r f BC-ALLIED-SUPERMARKETS-< 04-01 0093  ALLIED SUPERMARKETS <ASU> FILES FOR OFFERING NEW YORK, April 1 - Allied Supermarkets Inc said it filed with the Securities and Exchange Commission a registration statement covering 240 mln dlrs of debt securities. The company plans to offer 140 mln dlrs of senior subordinated discount debentures and 100 mln dlrs of subordinated debentures. Proceeds will be used to finance Allied's acquisition of Vons Cos Inc. Allied named Drexel Burnham Lambert Inc and Donaldson, Lufkin and Jenrette Securities Corp as co-underwriters of both offerings. Reuter  1-APR-1987 11:19:44.38 interest usa RM A f1359reute r f BC-FHLBB-CHANGES-SHORT-T 04-01 0083  FHLBB CHANGES SHORT-TERM DISCOUNT NOTE RATES WASHINGTON, April 1 - The Federal Home Loan Bank Board adjusted the rates on its short-term discount notes as follows: MATURITY NEW RATE OLD RATE MATURITY 5.00 pct 30-69 days 5.92 pct 70-88 days 30-123 days 5.00 pct 5.00 pct 89-123 days 124-150 days 5.93 pct 5.93 pct 124-150 days 151-349 days 5.00 pct 5.00 pct 151-349 days 350-360 days 5.98 pct 5.98 pct 350-360 days Reuter  1-APR-1987 11:20:01.59 earn usa F f1361reute r f BC-TOWLE-MANUFACTURING-C 04-01 0044  TOWLE MANUFACTURING CO <QTOW> YEAR LOSS BOSTON, April 1 - Oper shr loss 4.71 dlrs vs loss 14.09 dlrs Oper loss 22 mln vs loss 67.2 mln NOTE: 1986 loss excludes gain on the sale of Gold Lance Corp of 12.1 mln dlrs. Company is operating under chapter 11. Reuter  1-APR-1987 11:21:36.73 acq F f1366reute f f BC-******DELTA-AIR-LINES 04-01 0009  ******DELTA AIR LINES COMPLETES ACQUISITION OF WESTERN AIR  1-APR-1987 11:22:14.20 interest james-baker V RM f1370reute f f BC-******TREASURY'S-BAKE 04-01 0011  ******TREASURY'S BAKER SAYS HE HOPES PRIME RATE INCREASES TEMPORARY  1-APR-1987 11:23:07.19 canada E f1371reute u f BC-NEW-MONTREAL-NEWSPAPE 04-01 0103  NEW MONTREAL NEWSPAPER FOLDS MONTREAL, April 1 - Le Matin, the French-language tabloid launched here in February, said it is shutting down its operations because it can no longer get financing. The paper, launched by private investors, was Montreal's fourth French-language newspaper and was aimed at readers with above average incomes and educations. It had a daily circulation of about 20,000 copies. Le Matin was printed and distributed by (Southam Inc)'s Montreal Gazette newspaper. A Gazette spokesman said his newspaper is Le Matin's biggest creditor but he declined to reveal the amount of debt Acting publisher Jean-Pierre Bordua said the newspaper's bank blocked its lines of credit after three of the paper's senior managers resigned Friday. Reuter  1-APR-1987 11:24:00.34 usa F f1377reute r f BC-TOWLE-<QTOW>-STOCK-MA 04-01 0103  TOWLE <QTOW> STOCK MAY BE DILUTED, CANCELED BOSTON, Mass., April 1 - Towle Manufacturing Co, in Chapter 11 of the U.S. bankruptcy code, said any plan of reorganization would likely lead to a dilution or cancellation of its common and preferred stock. The company also said claims for subordinated debentures would likely be paid at less than their 100 pct of their face value, and general unsecured claims would likely be paid without interest. The company has not yet filed a plan of reorganization. The company said it lost 22 mln dlrs from operations in 1986 against a loss of 67.2 mln dlrs a year ago. The company also said its independent accountants disclaimed an opinion on the financial statements for 1986 because of questions about its contination as a going concern. The company said, however, it substantially restructured its business, reducing borrowings on an outstanding credit line to 16.5 mln dlrs in 1986 from 57 mln dlrs a year ago. The company also cut its staff to 820 employees at the end of 1986 from 2,500 a year earlier. Reuter  1-APR-1987 11:24:06.95 earn usa F f1378reute d f BC-SOUTH-ATLANTIC-FINANC 04-01 0045  SOUTH ATLANTIC FINANCIAL CORP <SOAF> 4TH QTR STAMFORD, Conn., April 1 - Shr 12 cts vs 33 cts Net 699,037 vs 1,349,077 Year Shr 54 cts vs 55 cts Net 2,748,280 vs 1,833,766 NOTE: Per shr amounts reported after preferred stock dividend requirements. Reuter  1-APR-1987 11:25:07.00 usa F f1381reute r f BC-AMERICAN-MOTORS-<AMO> 04-01 0085  AMERICAN MOTORS <AMO> MARCH OUTPUT FALLS SOUTHFIELD, Mich., April 1 - American Motors Corp said it produced 2,578 U.S. cars in March, down from 5,922 in the same 1986 month. The automaker's March U.S. Jeep output was 21,390, up from 16,215 in the same month last year. Year-to-date U.S. car production by American Motors through the end of March was 8,647 vehicles compared to 12,553 in the same 1986 period. Year-to-date Jeep output was 58,597 compared to 56,801. Reuter  1-APR-1987 11:26:18.58 copper usa C M F f1385reute u f BC-CYPRUS-LOWERS-COPPER 04-01 0035  CYPRUS LOWERS COPPER PRICE 1.25 CTS TO 67 CTS DENVER, April 1 - Cyprus Minerals Company said it is decreasing its electrolytic copper cathode price by 1.25 cents to 67.0 cents a pound, effective immediately. Reuter  1-APR-1987 11:27:55.71 ukjapan thatcherlawson lse RM f1393reute u f BC-TOSHIBA-COULD-BE-FIRS 04-01 0113  TOSHIBA COULD BE FIRST TO FEEL U.K. TRADE ANGER By Sten Stovall, Reuters LONDON, April 1 - Toshiba Corp <TSBA.T>, the Japanese electronics group which plans to enter Britain's liberalised telecommunications equipment market, risks becoming the first casualty in the current war of words over trade between Japan and the U.K., Government and industry sources said. U.K. Authorities have lost patience with Japanese trading practices and said they are seeking ways to retaliate without unleashing a damaging trade war. "Toshiba's timing seems most unfortunate for the company, as it comes exactly when we are looking for someone to punch," one official told Reuters. Earlier, <Toshiba Information Systems (U.K.) Ltd> said it wanted to enter the British business facsimile and key telephone market. A facsimile machine sends printed data over telephone lines, while a key telephone system is used for switching calls within a business, industry sources said. The move by Toshiba comes in the middle of a dispute over Japan's refusal to open up its telecommunications market to foreign companies. "Toshiba's timing is most extraordinary," one official at the Department of Trade and Industry (DTI) said. Tomorrow, the U.K. Government will consider what legal action it can possible take to press for Japanese reform. Prime Minister Margaret Thatcher has given notice that the U.K. Would fight the Japanese government's attempt to prevent Cable and Wireless Plc <CAWL.L> from taking a significant position in a new Japanese international telecommunications venture. "We regard this as a test case," she told Parliament. But while the U.K. Is keen to see some movement on the issue by Japan, it is also worried that recent anti-Japanese rhetoric may cause developments to get out of hand, officials said. Japanese officials in Tokyo today reiterated that Japan had no plans to bow to U.K. And U.S. Pressure to give foreign telecommunications firms a bigger role there. The government, for which competition and the deregulation of markets are major political themes, is unlikely to make final decisions tomorrow on how to act against Japan, officials said. Detailed consideration of the issue has been shelved during Thatcher's official visit to the Soviet Union, which ends today. "We are waiting for the Prime Minister to decide what to do. The DTI will pass the ball to her as soon as she returns tonight," a DTI official said. He said Toshiba's application would be considered by the Office of Telecommunications (OFTEL). An OFTEL spokeswoman said "a decision on this application will take weeks, maybe months." Asked whether Toshiba's bid would fall victim to British retaliation, the OFTEL spokeswoman said: "Who knows what's going to happen given the current situation!" A Toshiba executive, who asked not to be named, told Reuters: "We do not anticipate any special problems." Some analysts queried by Reuters questioned the basis of Britain's strong stand on the Cable and Wireless bid. One said that the company's proposal was equivalent to a Japanese company wanting to take a stake in Mercury International, the subsidiary of Cable and Wireless that is the only real competitor of British Telecommunications Plc <BTY.L>. British Corporate Affairs minister Michael Howard leaves for Japan on Saturday. The minister will seek a clear timetable from Japan for easier access for British institutions to Japanese financial markets, reciprocating the easy access Japanese securities houses and banks have to the City of London. Britain has threatened to use its new Financial Services Act to revoke or deny licences to Japanese brokerage houses if it does not get satisfaction. But British authorities would be far from happy if forced to use that weapon, government sources said. Sir Nicholas Goodison, Chairman of the London Stock Exchange, said in New York yesterday that sanctions against Japanese financial institutions operating in the U.K. Would set back London's ambition to become a leading centre for corporate financing and securities trading. Chancellor of the Exchequer Nigel Lawson also warned yesterday of the negative effects that a trade war could have on the British economy. Such a development could hit U.K. Exports and sharply alter the outlook for the next general election in which economic recovery will be one of the government's main themes, political analysts said. REUTER  1-APR-1987 11:28:34.96 uk RM f1395reute u f BC-DOLLAR-EUROBONDS-END 04-01 0114  DOLLAR EUROBONDS END EASIER ON PRIME RATE RISES By Christopher Pizzey, Reuters LONDON, April 1 - The dollar straight sector of the eurobond market ended easier after a subdued day's trading as U.S. Banks began to match yesterday's surprise 1/4 point prime rate hikes by Citibank and Chase Manhattan Bank, dealers said. The prime rates were raised to 7-3/4 from 7-1/2 pct and the timing of the moves puzzled many dealers. However, reaction here was limited, with shorter dated paper ending steady to 1/4 point easier, while longer dates dipped by 1/4 to 1/2 point. In the primary market, activity again centred on currencies other than the U.S. Dollar, dealers noted. One dollar straight dealer at a U.S. Securities house commented "There was, in fact, the odd retail buyer today, but only in small sizes." He added that, ironically, the prime rate rises may help the market to stabilise since the dollar rose on the back of the news. The only U.S. Dollar deal launched during the day was, as has been the case recently, equity linked. The 15-year convertible bond was for the Bank of Tokyo Ltd and has an indicated coupon of two pct. One source at a house involved in the deal said, "It's got to be a blow-out. With a name like this you're talking about Japan Inc." The lead manager was the Bank of Tokyo International (BOTI) and the deal ended far above the par issue price at 108 109 pct. A BOTI official said "We've had worldwide interest in the deal." She noted the Tokyo stock market had experienced a mild correction at the beginning of the week but that bank stocks were hardly affected. The yen sector edged slightly firmer and one new straight deal was launched, a 20 billion yen bond for France's Caisse Nationale des Telecommunications. The state guaranteed five year bond pays 4-3/8 pct and was priced at 101-1/2 pct. The issue was lead managed by IBJ International Ltd and was quoted on the grey market at less 1-7/8 less 1-3/4 pct compared with the total fees of 1-7/8 pct. One syndicate official at a firm not involved in the deal said "It's tight, but overall I would say its fairly priced." Also launched was a five-year zero coupon bond with a total redemption amount of 19 billion yen for Rural Banking and Finance Corp of New Zealand. It was priced at 81.22 pct and lead managed by Nomura International. In the Australian dollar sector, GMAC (Australia) Finance Ltd issued a 50 mln Australian dlr bond. Hambros Bank Ltd was lead manager for the four-year deal which pays 14-1/4 pct and was priced at 101 pct. It was guranteed by General Motors Acceptance Corp and was quoted on the 1-3/4 pct fees at less 1-3/4 pct bid. McDonalds Corp issued a 75 mln Canadian dlr bond paying 8-1/2 pct over five years and priced at 101-5/8 pct. It was quoted around the 1-7/8 pct fees at less two less 1-3/4 and was led by Morgan Guaranty Ltd. The European Investment Bank launched a 300 mln Danish Crown, seven-year, bond withan 11 pct coupon and pricing of 101 pct. It was lead managed by Den Danske Bank. The floating rate note sector basically ended easier following the increase in period eurodollar deposit rates prompted by the prime rate increases, dealers said. But they noted that mis-match deals - issues whereby the coupon is re-fixed on a monthly basis - were firmer. REUTER  1-APR-1987 11:30:48.69 interest usa james-baker V RM f1401reute b f BC-TREASURY'S-BAKER-HOPE 04-01 0080  TREASURY'S BAKER HOPES PRIME RATE RISE TEMPORARY WASHINGTON, April 1 - Treasury Secretary James Baker said he hopes yesterday's small increase in two major money center banks' prime rate was a temporary phenomenon. "I hope it was a temporary blip upward," he told a House Appropriations subcommittee. He said the decline in interest rates since President Reagan took office remains "one of the significant accomplishments, in the economic area, of this administration." Reuter  1-APR-1987 11:31:43.99 acq usa F f1403reute u f BC-DELTA-<DAL>-COMPLETES 04-01 0064  DELTA <DAL> COMPLETES WESTERN AIR <WAL> BUY ATLANTA, April 1 - Delta Air Lines Inc said it completed the acquisition of Western Air Lines Inc this morning. The action follows U.S. Supreme Court Justice Sandra Day O'Connor's overnight granting of Delta and Western's request to stay an earlier injunction against the deal issued by the U.S. Court of Appeals for the Ninth Circuit. More  1-APR-1987 11:33:36.12 usa F f1412reute r f BC-NATIONAL-DISTILLERS-A 04-01 0099  NATIONAL DISTILLERS AND CHEMICAL <DR> EXPANDING NEW YORK, April 1 - National Distillers and Chemical Corp said its board approved a modernization and expansion program from its petrochemical division, USI Chemical Co, its polyethylene producer. The program will add 600 mln pounds per year to USI's existing capacity of 3.2 billion pounds, the company said. The increase will result from the addition of two linear reactors based on fluid bed gas phase technology for the production of linear low density or high density polyethylene at locations in the Midwest and Gulf Coast, it said. Plans are in the engineering stage with completion expected in mid 1989, the company said. In addition, USI is presently constructing a 300 mln pound linear low density polyethylene facility, scheduled to come on stream in early 1988 at its Port Author, Texas, plant. Reuter  1-APR-1987 11:34:07.33 usa F f1417reute r f BC-BALDWIN-PIANO-<BPAO> 04-01 0056  BALDWIN PIANO <BPAO> FILES FOR SECONDARY CINCINNATI, April 1 - Baldwin Piano and Organ Co said it has filed for a secondary offering of 630,000 common shares, including 490,000 to be sold by General Electric Co <GE> and 140,000 by other shareholders. Lead underwriters are William Blair and Co and McDonald and Co Investments <MDD>. Reuter  1-APR-1987 11:34:12.41 earn usa F f1418reute r f BC-AMERICAN-OIL-AND-GAS 04-01 0049  AMERICAN OIL AND GAS CORP <AOG> 4TH QTR LOSS HOUSTON, April 1 - Shr loss 34 cts vs loss 2.14 dlrs Net loss 2,275,000 vs loss 9,560,000 Revs 17.0 mln vs 19.9 mln Year Shr loss 49 cts vs loss 2.11 dlrs Net loss 2,661,000 vs loss 9,283,000 Revs 73.5 mln vs 93.6 mln NOTE: Results have been restated to reflects equity investment in WellTech Inc for one month ended Dec 31, 1986 and its investment in American Well Servicing for the 11 months ended Nov 30, 1986 and full year 1985. 1986 and 1985 net include loss of 3,512,000 dlrs and 5,944,000 dlrs, respectively, for equity in WellTech and predecessor operations. Reuter  1-APR-1987 11:35:12.00 acq F f1425reute f f BC-MACANDREWS/FORBES-UNI 04-01 0014  ******MACANDREWS/FORBES UNIT BEGINS OFFER TO BUY ALL REVLON GROUP NOT ALREADY OWNED  1-APR-1987 11:36:11.38 earn usa F f1433reute r f BC-<NEWPARK-RESOURCES-IN 04-01 0076  <NEWPARK RESOURCES INC> YEAR ENDED DEC 31 LOSS NEW ORLEANS, April 1 - Oper shr loss 1.99 dlr vs loss 4.88 dlrs Oper net loss 29.1 mln vs 70.8 mln Revs 34.8 mln vs 84.8 mln NOTE: 1986 and 1985 oper net excludes a loss of 5.5 mln dlrs or 37 cts a share and 64.6 mln dlrs or 4.43 dlrs a share, respectively, for discontinued operations. 1986 net also excludes a gain of 66.4 mln dlrs or 4.50 dlrs a share for credit on debt restructuring. Reuter  1-APR-1987 11:36:30.26 usa F f1435reute u f BC-CARDIS-<CDS>-EXPECTS 04-01 0096  CARDIS <CDS> EXPECTS SIGNIFICANT YEAR LOSS BEVERLY HILLS, Calif., April 1 - Cardis Corp said it anticipates reporting a loss from continuing operations of approximately 17.7 mln dlrs on revenues of 228 mln dlrs for fiscal year 1986. In addition, the company said it expects to report a year-end loss on the discontinued operations of its engine rebuilding divisions of approximately 1,100,000 mln dlrs. Cardis also said it expects to report a loss in excess of five mln dlrs for its first fiscal quarter ended Jan 31, 1987, on approximate revenues of 58 mlns dlrs. For fiscal 1985 Cardis reported operating income of 8,680,000 and net income of 1,150,000 dlrs, and in the first quarter of fiscal 1986, it reported a 495,000 dlr loss from continuing operations. The company said its auditor, Touche Ross and Co, has indicated to it that any opinion it issues on the company's soon-to-be completed year-end audit will be qualified. The company also said it expects to conclude soon its current negotiations with its primary lenders for extension of its loan agreements and expansion of its credit lines. Reuter  1-APR-1987 11:36:57.32 earn usa F f1439reute d f BC-TIERCO-GROUP-INC-<TIE 04-01 0031  TIERCO GROUP INC <TIER> YEAR ENDED DEC 31 LOSS OKLAHOMA CITY, April 1 - Shr loss 72 cts vs loss 1.57 dlr Net loss 1,526,359 vs loss 3,315,834 Revs 8,032,798 vs 7,276,517 Reuter  1-APR-1987 11:37:00.45 earn usa F f1440reute s f BC-MICRODYNE-CORP-<MCDY> 04-01 0022  MICRODYNE CORP <MCDY> SETS PAYOUT OCALA, Fla., April 1 - Semi div three cts vs three cts prior Pay June 12 Record May 15 Reuter  1-APR-1987 11:37:26.62 usa james-baker V RM f1442reute f f BC-******U.S.-TREASURY'S 04-01 0012  ******U.S. TREASURY'S BAKER SAYS JAPAN TARIFF ACTION NOT START OF TRADE WAR  1-APR-1987 11:37:46.98 brazil RM f1443reute u f BC-BRAZIL-CONFIRMS-RENEW 04-01 0098  BRAZIL CONFIRMS RENEWAL OF SHORT-TERM CREDIT LINES BRASILIA, April 1 - Brazilian economic officials confirmed a renewal of short-range credit lines by commercial creditors, bringing optimism that renegotiation of the 109 billion dlrs foreign debt is possible. Finance Ministry sources said a "large majority" of foreign banks had accepted to extend Brazil's credit lines before the midnight deadline of March 31 for payment of 15 billion dlrs servicing expired. Finance Minister Dilson Funaro told reporters all short range credit lines were renewed, "without exception." Central Bank sources, although incapable of confirming that 100 pct of the banks had renewed the credit lines, said that there was a massive affirmative reply. The credit lines were extended in their majority by 30 days, but there were banks which renewed the deadline by 90 days and, sometimes, by 180 days, Funaro told reporters. Brazil is pledging for an extension of the deadlines for an indefinite period, until its economic officials seek a global renegotiation of the debt. Last week Brazil had suggested to creditors an extension of the deadline for another two months, until May 31. REUTER  1-APR-1987 11:38:11.26 ukjapan thatcher F f1446reute d f BC-TOSHIBA-COULD-BE-FIRS 04-01 0112  TOSHIBA COULD BE FIRST TO FEEL U.K. TRADE ANGER By Sten Stovall, Reuters LONDON, April 1 - Toshiba Corp <TSBA.T>, the Japanese electronics group which plans to enter Britain's liberalised telecommunications equipment market, risks becoming the first casualty in the current war of words over trade between Japan and the U.K., Government and industry sources said. U.K. Authorities have lost patience with Japanese trading practices and said they are seeking ways to retaliate without unleashing a damaging trade war. "Toshiba's timing seems most unfortunate for the company, as it comes exactly when we are looking for someone to punch," one official told Reuters. Earlier, <Toshiba Information Systems (U.K.) Ltd> said it wanted to enter the British business facsimile and key telephone market. A facsimile machine sends printed data over telephone lines, while a key telephone system is used for switching calls within a business, industry sources said. The move by Toshiba comes in the middle of a dispute over Japan's refusal to open up its telecommunications market to foreign companies. "Toshiba's timing is most extraordinary," one official at the Department of Trade and Industry (DTI) said. Tommorrow, the U.K. Government will consider what legal action it can possible take to press for Japanese reform. Prime Minister Margaret Thatcher has given notice that the U.K. Would fight the Japanese government's attempt to prevent Cable and Wireless Plc <CAWL.L> from taking a significant position in a new Japanese international telecommunications venture. "We regard this as a test case," she told Parliament. But while the U.K. Is keen to see some movement on the issue by Japan, it is also worried that recent anti-Japanese rhetoric may cause developments to get out of hand, officials said. Japanese officials in Tokyo today reiterated that Japan had no plans to bow to U.K. And U.S. Pressure to give foreign telecommunications firms a bigger role there. reuter^M  1-APR-1987 11:38:19.87 interest usa RM A f1447reute r f BC-FHLBB-CHANGES-SHORT-T 04-01 0082  FHLBB CHANGES SHORT-TERM DISCOUNT NOTE RATES WASHINGTON, April 1 - The Federal Home Loan Bank Board adjusted the rates on its short-term discount notes as follows: MATURITY NEW RATE OLD RATE MATURITY 30-123 days 5.00 pct 5.00 pct 30-123 days 124-150 days 5.90 pct 5.93 pct 124-150 days 151-349 days 5.00 pct 5.00 pct 151-349 days 350-360 days 5.96 pct 5.98 pct 350-360 days Reuter  1-APR-1987 11:39:28.49 brazil A f1452reute r f BC-BRAZIL-CONFIRMS-RENEW 04-01 0097  BRAZIL CONFIRMS RENEWAL OF SHORT-TERM CREDIT LINES BRASILIA, April 1 - Brazilian economic officials confirmed a renewal of short-range credit lines by commercial creditors, bringing optimism that renegotiation of the 109 billion dlrs foreign debt is possible. Finance Ministry sources said a "large majority" of foreign banks had accepted to extend Brazil's credit lines before the midnight deadline of March 31 for payment of 15 billion dlrs servicing expired. Finance Minister Dilson Funaro told reporters all short range credit lines were renewed, "without exception." Central Bank sources, although incapable of confirming that 100 pct of the banks had renewed the credit lines, said that there was a massive affirmative reply. The credit lines were extended in their majority by 30 days, but there were banks which renewed the deadline by 90 days and, sometimes, by 180 days, Funaro told reporters. Brazil is pledging for an extension of the deadlines for an indefinite period, until its economic officials seek a global renegotiation of the debt. Last week Brazil had suggested to creditors an extension of the deadline for another two months, until May 31. Reuter  1-APR-1987 11:40:15.71 earn usa F f1457reute r f BC-CROWNAMERICA-INC-<CRN 04-01 0050  CROWNAMERICA INC <CRNA> 2ND QTR ENDED FEB 28 DALTON, Ga., April 1 - Shr two cts vs 29 cts Net 23,000 vs 338,000 Revs 20.2 mln vs 21.5 mln Six mths Shr 64 cts vs 97 cts Net 741,000 vs 1,113,000 Revs 43.2 mln vs 44.3 mln NOTE: 1986 2nd qtr and six mths ended March one. Reuter  1-APR-1987 11:40:30.77 usa F f1458reute d f BC-QUANTUM-DIAGNOSTICS-< 04-01 0057  QUANTUM DIAGNOSTICS <QTMCU> GETS PATENT HAUPPAUGE, N.Y., April 1 - Quantum Diagnostics Ltd said it has been granted a patent for a new imaging technology it has developed that uses electrmagnetic radiation. It said it sees applications in airport security screening devices, medical diagnostic imaging systems and quality control devices. Reuter  1-APR-1987 11:45:57.96 earn usa F Y f1471reute u f BC-DIAMOND-SHAMROCK-<DIA 04-01 0112  DIAMOND SHAMROCK <DIA> SEES BETTER 1987 EARNINGS NEW YORK, APRIL 1 - Diamond Shamrock Corp, which will split this month into two separate companies, expects to show improved earnings in 1987 over last year, executives of the new company told Reuters. Charles Blackburn, president and chief executive officer of Diamond Shamrock and the new company, which will emphasize exploration and production, said, "Earnings wil be better than in 1986." He declined to say how much better. In 1986 Diamond Shamrock reported a loss of 115.6 mln dlrs on total revenues of 2.543 billion dlrs. Exploration and production lost 18.5 mln dlrs on revenues of 593.5 mln dlrs. Roger Hemminghaus, Diamond Shamrock vice president and soon-to-be chief executive of the spin-off Diamond Shamrock Refining and Marketing Co, said, "Refining and marketing is a margin business. The margins will return and this will be a better year than 1986." In 1986, refining and marketing showed operating profits of 40.1 mln dlrs on revenues of 1.636 billion dlrs. "We are also expecting to be in the black in the first quarter (1987)," Heminghaus added. In the first quarter of 1986, the refining and marketing segment showed a loss of 27.1 mln dlrs on revenues of 492.1 mln dlrs. The executives were in New york for meetings with institutional investors aimed at increasing interest in the company's stock. On the New York Stock Exchange, Diamond Shamrock was trading at 16-1/4, down 1/4. Earlier this year, T. Boone Pickens offered 15 dlrs a share for Diamond Shamrock, and management countered with an offer at 17 dlrs and a decision to split off the refining and marketing operation to its shareholders. "Our advisors convinced us the market would give higher multiples for pure plays," Blackburn said. Reuter  1-APR-1987 11:46:53.00 earn usa F f1474reute r f BC-VMS-STRATEGIC-<VLANS> 04-01 0054  VMS STRATEGIC <VLANS> SETS INITIAL DIVIDEND CHICAGO, April 1 - VMS Strategic Land Trust said it delcared an initial quarterly cash dividend of 30 cts a share, payable May 15 to shareholders of record April 20. The company also said that effective today it will be trading on the NASDAQ system under the symbol <VLANS>. Reuter  1-APR-1987 11:47:47.24 iron-steel usa F f1479reute u f BC-BETHLEHEM-STEEL-<BS> 04-01 0087  BETHLEHEM STEEL <BS> SETS PLATE PRICE INCREASES BETHLEHEM, Pa., April 1 - Bethlehem Steel Corp said its base price for carbon plates and high-strength and low-alloy plates will be increased by 25 dlrs to 405 dlrs a short ton, effective July one. The company said its composite prices for alloy plates will also be increased 25 dlrs per ton on the same date, adding it does not publish its prices for this product. Bethlehem Steel said its composite prices for strip mill plates will be increased 15 dlrs a ton. Reuter  1-APR-1987 11:48:38.72 usajapan james-baker V RM f1482reute b f BC-/TRREASURY'S-BAKER-SE 04-01 0099  TRREASURY'S BAKER SEES NO TRADE WAR OVER TARIFFS WASHINGTON, April 1 - Treasury Secretary James Baker said the U.S. imposition of tariffs on Japanese goods over semiconductor trade does not signal the start of a trade war. He also played down the significance of the precipitous stock market decline earlier this week. "I don't think this action should be interpreted in any way as the start of a trade war," he said in response to a question from a House Appropriations subcommittee. He said a drop in stock market prices of the magnitude experienced Monday was not so unusual. "I don't think it is particularly unusual to see those kinds of days" on Wall Street, Baker said. Since Monday, he added, "The stock market has rebounded rather vigorously." He urged lawmakers to move cautiously on trade legislation to avoid overly protectionist moves which might aggravate world trade tensions. "You're not going to legislate this (trade) deficit away," he told the panel. Reuter  1-APR-1987 11:50:44.93 earn usa F f1490reute d f BC-EQUICOR-SEES-YEAR-REV 04-01 0115  EQUICOR SEES YEAR REVENUES TO TOP TWO BILLION NASHVILLE, Tenn., April 1 - Equicor, Equitable HCA Corp, said that the company will likely attain revenues in excess of two billion dlrs in its first year of operations. The company, created last October with initial equity of 400 mln dlrs, is owned equally by the Equitable Life Assurance Society of the U.S. and Hospital Corp of America <HCA>. Financial results for the first six months of the company's operations were not disclosed. Equicor provides employee group plans to 1,500 corporations nationwide. It said it aims to double its marketshare in five years from the about 3.5 pct of the employee benefits industry it controls. Reuter  1-APR-1987 11:50:55.18 acq usa F f1491reute b f BC-MACANDREWS/FORBES-UNI 04-01 0110  MACANDREWS/FORBES BEGINS REVLON <REV> OFFER NEW YORK, April 1 - MacAndrews and Forbes Group Inc said it began an 18.50-dlr-a-share cash offer for all common stock of Revlon Group Inc it does not already own. The offer, which is being made by a wholly owned subsidiary, Revmac Acquisition Corp, is subject to financing and at least 28.5 mln shares being tendered, the company said. MacAndrews and Forbes, wholly owned by Ronald Perelman, chairman of Revlon Group, held about 31.8 pct of the voting power of Revlon as of March 27, a spokesman said. The stake includes about 15.1 pct of Revlon common and 95 pct of its series A preferred stock, he said. More  1-APR-1987 11:51:56.55 earn usa F f1494reute u f BC-ARCO-<ARC>-UP-ON-HIGH 04-01 0109  ARCO <ARC> UP ON HIGHER EARNINGS ESTIMATE NEW YORK, April 1 - Atlantic Richfield Co's stock rose sharply after analyst Eugene Nowak of Dean Witter Reynolds Inc raised his earnings estmates of the company, traders said. ARCO jumped 1-3/4 to 81-3/4. Nowak said that based on an average oil price of 17 dlrs a barrel in 1987, the company should earn about 4.50 dlrs a share. Next year, based on an average oil price of 18 dlrs a barrel, ARCO should earn about five dlrs a share. The company earned 3.38 dlrs a share in 1986. "If oil prices should rise to an average of 20 dlrs a barrel," he said, "ARCO could record earnings of 6.50 dlrs a share. Nowak said his increased estimates come after the company told analysts yesterday that its first quarter earnings will comfortably cover its quarterly dividend requirement of one dlr a share. Nowak said, "The company has done an outstanding job reducing expenses, and ARCO is poised to generate greater earnings power." He said first quarter earnings will likely exceed the company's expectations stated yesterday and be in the 1.15-1.20 dlr-a-share range. Reuter  1-APR-1987 11:53:49.16 usa reagan V RM f1505reute b f BC-/SENATE-UPHOLDS-REAGA 04-01 0088  SENATE UPHOLDS REAGAN'S VETO BUT WILL REVOTE WASHINGTON, April 1 - The Senate voted to sustain President Reagan's veto of an 88 billion dlr highway and mass transit funding bill, but Senate Democratic leader Robert Byrd of West Virginia called for a second vote to reconsider the outcome. The first vote ended with 65 Senators voting for the bill and 35 voting to sustain the veto, two short of the two-thirds majority needed to override. One of those voting to sustain the veto was North Carolina Democrat Terry Sanford. Reuter  1-APR-1987 11:53:59.16 cornsorghumgrain usabelgiumspain ec C G f1506reute b f BC-EC-PROMISED-U.S.-BULK 04-01 0096  U.S. SAID PROMISED BULK OF MAIZE EXPORT TO SPAIN BRUSSELS, April 1 - The U.S. Has been promised a near monopoly of maize exports to Spain from third countries guaranteed under an agreement with the European Community, an EC official said. The official, who asked not to be named, told Reuters that the guarantee was given in an unpublished clause of the agreement. Under the accord, which began in January, third countries were guaranteed access for the next four years for two mln tonnes a year of maize to the Spanish market, as well as 300,000 tonnes of sorghum. However, the official said the U.S. Had been assured that almost all the exports would be reserved for its traders. The EC Commission is to ask member states to agree either a tender system to fix reduced import levies for the maize or to authorise direct imports by the Spanish intervention board. EC sources noted that under a tender system maize from outside the U.S. Would sometimes be offered on more favourable terms than that from the U.S. No Commission spokesman was immediately available for comment. Reuter  1-APR-1987 11:54:45.49 acq usauk F f1511reute d f BC-DEAK-INTERNATIONAL-BU 04-01 0114  DEAK INTERNATIONAL BUYS JOHNSON MATTHEY NEW YORK, APRIL 1 - Deak International, a foreign currency and precious metals firm, announced the acquisition of Johnson Matthey Commodities of New York from Minories Finance Limited, a unit of the Bank of England. The purchase valued at 14.8 mln dlrs follows the recent acquisition of London's Johnson Matthey Commodities Limited, Deak said. The New York firm will be known as Deak International Trading Ltd, the company said. Arkadi Kuhlmann, president and chief executive officer of Deak International said the purchase will expand Deak's operations into the precious metals and wholesale non-ferrous metals trading arenas. Reuter  1-APR-1987 11:56:02.30 acq usa F f1516reute u f BC-WALL-STREET-STOCKS/PU 04-01 0095  WALL STREET STOCKS/PUROLATOR COURIER <PCC> NEW YORK, April 1 - Purolator Courier Corp stock jumped 5-3/8 on a 40 dlr per share takeover offer from Emery Air Freight Corp <EAF>, traders said. Purolator was trading at 40-1/4, 1/4 above the offer price. The Emery offer tops a 35 dlr per share buyout agreement E.F. Hutton LBO Inc reached with Purolator February 27. That offer was to have expired today. Neither Hutton nor Purolator had any immediate comment. "There's probably some speculation out there that there might be another offer," said one analyst. Reuter  1-APR-1987 11:57:09.82 corngrain usaargentinaussr C G f1518reute b f BC-/ARGENTINE-CORN-SALES 04-01 0125  ARGENTINE CORN SALES TO USSR LOWER - USDA REPORT WASHINGTON, April 1 - Total corn sales by Argentina to the Soviet Union are only 1.5 to 1.8 mln tonnes, with delivery spread out from March to June, the U.S. Agriculture Department's Counselor in Buenos Aires said in a field report. The report, dated March 27, said many sources have stated that the Soviet Union was initially interested in purchasing 2.3 mln tonnes lof corn from Argentina. However, Soviet purchases from the United States have tended to displace additional Argentine purchases, the report said. The USDA has to date reported USSR purchases of 2.6 mln tonnes of U.S. corn for delivery in the current U.S.-USSR grain agreement year, which ends this September 30, it said. Reuter  1-APR-1987 11:57:23.68 usa F Y f1519reute r f BC-GPU'S-<GPU>-THREE-MIL 04-01 0085  GPU'S <GPU> THREE MILE ISLAND POWER REDUCED MIDDLETOWN, Pa., April 1 - General Public Utilities corp said its Three Mile Island Unit One's power output has been cut to 81 pct of reactor power, or 730 megawatts of electricity, due to mineral deposits on the secondary or non-nuclear side of its two steam generators. The company said the deposits do not affect the safe operation of the plant but interfere with the production of steam. It said the unit was similarly limited in power in late 1985. Reuter  1-APR-1987 11:58:09.69 usa F f1524reute r f BC-CYPRUS-MINERALS-<CYPM 04-01 0064  CYPRUS MINERALS <CYPM> WINS COAL CONTRACT DENVER, April 1 - Cyprus Minerals Co said it was awarded a five year contract to supply 360,000 tons of steam coal to Niagara Mohawk Power Co <NMK>. The company is currently shipping 240,000 tons of steam coal a year to Niagara Mohawk under a contract signed in 1985. The coal comes from the Emerald mine in Southwestern Pennsylvania. Reuter  1-APR-1987 11:58:19.48 usa F f1525reute r f BC-QUANTECH-<QANT>-SAYS 04-01 0103  QUANTECH <QANT> SAYS THREE DIRECTORS RESIGN LEVITTOWN, N.Y., April 1, Quantech Electronics Corp said Leonard N. Hecht, Jack Goldfarb and Harold V. Wallace resigned as directors. On March 26, the company announced the resignations of Bernard Weinblatt as president and a director, and Hecht as chief executive officer. It said Hecht will serve as a consultant for an interim period. Quantech said its remaining directors are Henry Ginsberg and David Siegel. Ginsberg, who is chairman, has been named president and chief executive officer, and Siegel has been named chief operating officer, the company said. Reuter  1-APR-1987 11:58:27.08 earn usa F f1526reute r f BC-BARNES-GROUP-<B>-EXPE 04-01 0104  BARNES GROUP <B> EXPECTS SALES TO GROW MODESTLY HARTFORD, Conn., April 1 - Barnes Group said it expects sales and net income for 1987 will be up slightly over 1986. Without supplying specific figures, Barnes told shareholders at its annual meeting it expected net income to improve at a rate exceeding its growth in sales, which was two pct higher than 1985. The company said it recorded income from continuing operations of 16.6 mln dlrs, or 2.57 dlrs per share, on sales of 440 mln dlrs in 1986. It said it recorded income from continuing operations of 16.4 mln dlrs, or 2.27 dlrs per share, in the previous year. Reuter  1-APR-1987 11:58:33.10 usa A RM f1527reute r f BC-UNITED-CITIES-<UCIT> 04-01 0078  UNITED CITIES <UCIT> PRIVATELY PLACES BONDS NEW YORK, April 1 - United Cities Gas Co said it placed privately on March 18 20 mln dlrs of 8.69 pct first mortgage bonds. Proceeds will be used to retire short-term debt and fund the company's current construction program, United Cities said. The company said more than 30 lending institutions participated in the bidding for the bonds and that 25 pct of the issue was placed with the U.S. unit of a Canadian firm. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-013.sgm000066400000000000000000002334451154025176300231520ustar00rootroot00000000000000 3-APR-1987 12:41:43.18 usa F f1680reute b f BC-CHRYSLER-<C>-LATE-MAR 04-03 0085  CHRYSLER <C> LATE MARCH U.S. CAR SALES UP DETROIT, April 3 - Chrysler Corp said car sales for the March 21-31 period rose 20.2 pct to 40,454 from 33,669 a year earlier. For the month of March, it said auto sales increased 6.3 pct to 96,649 from 90,945. Chrysler said U.S. truck sales in late March jumped 65.2 pct to 28,698 from 17,372 a year ago. For the entire month, truck sales advanced 28.9 pct to 63,283 from 49,102, it said. The company said it was still tabulating year-to-date figures. Reuter  3-APR-1987 12:42:15.79 usa F f1682reute u f BC-WALL-STREET-STOCKS/CO 04-03 0085  WALL STREET STOCKS/COMPAQ COMPUTER <CPQ> NEW YORK, April 3 - Compaq Computer Corp, IBM's chief rival in the personal computer market, scored a big gain on Wall Street today. Compaq's stock rose 1-3/8 to 32-1/4 on volume of 1.3 mln shares. "The rationale for the move," one trader said, "is that the damage from the IBM announcement yesterday was less than expected." He said Compaq's stock had been under pressure recently because of anticipation of IBM's unveiling of a new line of personal computers. International Business Machines <IBM> introduced four new personal computers and more than 100 new peripheral products. But analysts said the new computers, though they do contain a lot of proprietary concepts, will not be as hard to copy as some other PC makers had feared. "The long range issue here is who wins and who loses in the PC business, and that issue was not resolved yesterday and is unlikely to be decided any time soon," analyst Mark Stahlman of Sanford C. Bernstein and Co said. Stahlman reaffirmed his recommendation of Compaq and Apple Computer Inc <AAPL>. Stahlman said "The critical investment question now is who will have a pickup in sales in the near term. We expect to see a strong demand setting for PCs for the rest of this year, and that will boost the revenues for all of the major PC vendors." "The first quarter was the strongest PC sales period on record for Compaq, Apple and IBM," Stahlman said, "and I don't think the IBM announcement is going to change that trend soon." "In anticipating the IBM announcement, Compaq has made pricing adjustments necessary to compete for its immediate purposes," he said. Reuter  3-APR-1987 12:43:33.42 copper canada E F f1686reute r f BC-noranda-sets-temporar 04-03 0090  NORANDA SETS TEMPORARY MINE SHUTDOWN Murdochville, Quebec, April 3 - <Noranda Inc> said production will remain shut down at its fire-damaged copper mine here until it can completely examine the mine. The fire, which started Wednesday and burned itself out late yesterday, killed one miner and trapped 56 others underground for about 24 hours. The 56 were eventually brought safely out of the mine. Company spokesman Dale Coffin said the investigation could take from a few days to several weeks, but would not be more specific. Noranda said that, when it resumes production, it plans to operate the mine at about one-third of the normal 72,000 metric tons annual finished capacity. The fire weakened part of the mine's support structure, Coffin said. Noranda said if it decides to keep the mine open, it would take four or five months before it could resume full production. Reuter  3-APR-1987 12:48:00.50 canada E A RM f1694reute u f BC-CANADA-BUDGET-DEFICIT 04-03 0115  CANADA BUDGET DEFICIT RISES IN JANUARY OTTAWA, April 3 - The Canadian government's budget deficit rose to 1.78 billion dlrs in January from 1.67 billion dlrs in the same month last year, the finance department said. But the deficit in the first 10 months of the fiscal year which began on April 1, 1986, fell to 22.36 billion dlrs from 25.74 billion dlrs in the same period a year ago. January revenues rose to 7.96 billion dlrs from 7.56 billion dlrs while expenditures grew to 9.74 billion dlrs from 9.23 billion dlrs. Revenues in the first 10 months increased to 70.06 billion dlrs from 62.30 billion while expenditures grew to 92.42 billion dlrs from 88.05 billion. Reuter  3-APR-1987 12:49:26.47 acq usaswitzerland F f1697reute r f BC-CIS-TECHNOLOGIES<CIH> 04-03 0099  CIS TECHNOLOGIES<CIH> TO SELL SHARES TO SWISS CO TULSA, Okla, April 3 - CIS Technologies Inc said it executed a formal share purchase agreement with Swiss Reinsurance Co of Zurich, Switzerland. Under terms of the agreement, Swiss Re will acquire 5.5 mln newly issued CIS stock at 2.50 dlrs a share, or 13.8 mln dlrs. This purchase represents 30 pct of the outstanding shares. Swiss Re will acuqire 500,000 of the shares immediately and remaining shares will be bought after a due diligence report is completed by auditors. The transaction is expected to be complete by June 11. Reuter  3-APR-1987 12:51:05.81 earn usa F f1701reute r f BC-COPLEY-PROPERTIES-INC 04-03 0025  COPLEY PROPERTIES INC <COP> INCREASES DIVIDEND BOSTON, Mass, APril 3 - Qtly div 42 cts vs 41.5 cts prior Payable APril 28 Record April 14 Reuter  3-APR-1987 12:52:18.65 cpi colombia RM f1705reute r f BC-COLOMBIAN-INFLATION-S 04-03 0085  COLOMBIAN INFLATION STABLE AT AROUND 20 PCT BOGOTA, April 3 - Colombia's cost of living index rose 2.71 pct in March, after a 2.03 pct increase in February and a 2.21 pct rise in March 1986, the government statistics institute said. The result brought year-on-year inflation to 20.36 pct compared with 22.65 pct at end-March 1986 and 19.77 pct for the year ending February 1987. The government has predicted that inflation this year would be slightly lower than in 1986 when it reached 20.9 pct. REUTER  3-APR-1987 12:52:47.08 interest usa A RM f1708reute r f BC-FHLBB-SAYS-MORTGAGE-R 04-03 0103  FHLBB SAYS MORTGAGE RATES CONTINUE DECLINE WASHINGTON, April 3 - The Federal Home Loan Bank Board said home mortgage rates fell from early February to early March to their lowest point in nine years, but the rate of decline was slower than it had been in recent months. The bank board said the average effective commitment rate for fixed-rate mortgages for single family homes and a 25 pct loan-to-price ratio with a maturity of at least 15 years was 9.48 pct in early March. The rate was four basis points lower than a month ago, only one-eighth the size of decline in the previous month, the bank board said. Rates for adjustable-rate mortgages decline eight basis points from early February to 8.43 pct in early March, the bank board said. The drop was far less than the 15 basis point decline in the previous period, the agency said. The average effective interest rate on all loans closed by major mortgage lenders declined nine basis points from early February to early March, the agency said. The fall brought the rate to 9.14 pct was the lowest since December 1977, it said. The effective rate for ARMS was 8.39 pct, 15 basis points below a month earlier. For fixed-rate loans it was 9.36 pct, 14 basis points below a month earlier, the agency said. Reuter  3-APR-1987 12:56:19.95 usa nyse F f1713reute d f BC-NYFE-SEAT-SELLS-FOR-1 04-03 0048  NYFE SEAT SELLS FOR 1,500 DLRS NEW YORK, April 3 - The New York Stock Exchange said a seat on the New York Futures Exchange sold for 1,500 dlrs, which is up 250 dlrs from the previous sale yesterday. The Exchange said the current bid is 1,250 and the current offer is 1,500 dlrs. Reuter  3-APR-1987 12:56:53.22 money-supply canada E RM f1716reute f f BC-CANADIAN-MONEY-SUPPLY 04-03 0014  ******CANADIAN MONEY SUPPLY M-1 FALLS 291 MLN DLRS IN WEEK, BANK OF CANADA SAID Blah blah blah.  3-APR-1987 12:58:50.26 acq usa F f1722reute r f BC-BENEFICIAL-<BNL>-UNIT 04-03 0100  BENEFICIAL <BNL> UNIT SALE APPROVED NEW YORK, April 3 - Beneficial Corp said the sale of its American Centennial Insurance Co subsidiary to <First Delaware Holdings Inc> was approved by the Delaware Insurance Department. Under the transaction, American Centennial will receive a cash infusion of 200 mln dlrs, including the settlement of tax sharing agreements with Beneficial Corp, Beneficial said. It will also receive 25 mln dlrs from Beneficial International Insurance Co, another Beneficial subsidiary being purchased by the management-led group of First Delaware, the company said. Reuter  3-APR-1987 12:59:13.76 netherlands asecboe C f1724reute d f BC-LARGER-VOLUME-SEEN-ON 04-03 0114  LARGER VOLUME SEEN ON EUROPEAN OPTIONS EXCHANGES AMSTERDAM, April 3 - European options exchanges will see spectacular growth over the next five years as more professional investors discover the options markets, Bernard Reed, manager of the London options exchange said. At an options outlook seminar to mark tomorrow's official opening of a new Amsterdam options exchange (EOE) building, he forecast increasing interest from banks and institutional investors, using options for portfolio insurance. "But the dominance by the professionals should not make us neglect private clients," he noted. "Successful exploitation of retail business has been one of the keys to success." Reed said derived option products in particular will become a popular instrument for managing equity risks. On the Chicago Board Options Exchange (CBOE), the cash-settled S&P 100 index option is the most traded in the world. Dutch Stock Index Fund options to be relaunched on May 18 and the upcoming options on London's FTSE 100 index will see a 30 pct yearly turnover growth until 1990, Reed estimated. The CBOE and the Chicago Mercantile Exchange have agreed with Morgan Stanley to trade options and futures on the capital international EAFE index which will let investors participate in worldwide market moves. Reed said he did not believe in globalising the option business by introducing international products, because this would intensify competition among the exchanges, but he did see a future for global rules and regulations. Reuter  3-APR-1987 13:05:49.54 usa F f1749reute r f BC-TIERCO-<TIER>-SELLS-N 04-03 0057  TIERCO <TIER> SELLS NOTE OKLAHOMA CITY, April 3 - Tierco Group INc said it sold at par to the Kuwait Real Estate INvestment and Management Co its 10 mln dlrs 75. pct senior subordinated note due 1997, together with warrants to buy 1.1 mln shares of common stock. The warrant may be exercised within five years at 9.50 dlrs per share. Reuter  3-APR-1987 13:05:53.71 earn canada E F f1750reute r f BC-itt-canada-ltd 04-03 0040  <ITT CANADA LTD> YEAR NET TORONTO, April 3 - Shr 5.56 dlrs vs 3.88 dlrs Net 47.5 mln vs 33.2 mln Revs 254.5 mln vs 243.5 mln Note: shr after preferred dividends ITT Corp <ITT> owns 100 pct of ITT Canada common shares Reuter  3-APR-1987 13:06:02.09 usa F f1751reute d f BC-******ALLIED-SIGNAL-T 04-03 0089  CALIFORNIA MICRO DEVICES <CAMD> IN DEFENSE DEAL MILPITAS, Calif, April 3 - California Micro Devices Corp said an additional 3.2 mln dlrs contract was received from General Dynamics Corp <GD> to supply electronic components contained in the guidance control for Defense Electronics Systems. This contract follows a 750,000 dlrs contract awarded last year. Shipments will begin in APril 1987. The company also disclosed that Fuji Photo Film Co Ltd is the licensee of a one mln dlrs technology agreement announced last fall. Reuter  3-APR-1987 13:06:05.40 usa F f1752reute d f BC-STEWART-INFORMATION-R 04-03 0032  STEWART INFORMATION RESCHEDULES ANNUAL MEETING HOUSTON, APRIL 3 - Stewart INformation Services Corp said it rescheduled its annual meeting to May 18. It had been scheduled for APril 24. Reuter  3-APR-1987 13:06:11.03 usa F f1753reute h f BC-FISERVE-<FISV>-GETS-B 04-03 0061  FISERVE <FISV> GETS BUSINESS WORTH ONE MLN DLRS WEST ALLIS, Wis., April 3 - FIserve Inc said 14 savings and loans with 1.5 billion dlrs in cumulative assets will transfer their data processing to FIserve from Midwest Commerce Data Corp, a unit of Midwest Commerce Corp. About one mln dlrs a year in new recurring revenues will be generated for FIserve, it said. Reuter  3-APR-1987 13:14:52.25 usa F f1764reute r f BC-MONY-REAL-<MYM>-REPOR 04-03 0086  MONY REAL <MYM> REPORTS PORTFOLIO NEW YORK, April 3 - Mony Real Estate Investors Trust said its investment portfolio consists of 137.1 mln dlrs of mortgages with an average maturity of less than six years, 43.7 mln dlrs of real estate equities and 2.7 mln dlrs of foreclosed real estate. The trust's exposure to oil-dependent regions is limited to 2.2 mln dlrs, it said. It said it accepted an offer to sell foreclosed property and increased its loss reserve by 750,000 dlrs in anticipation of the sale. Reuter  3-APR-1987 13:17:05.48 money-supply canada E A RM f1768reute u f BC-CANADIAN-MONEY-SUPPLY 04-03 0099  CANADIAN MONEY SUPPLY FALLS IN WEEK OTTAWA, April 3 - Canadian narrowly-defined money supply M-1 fell 291 mln dlrs to 32.44 billion dlrs in the week ended March 25, Bank of Canada said. M-1-A, which is M-1 plus daily interest chequable and non-personal deposits, fell 7 mln dlrs to 75.14 billion dlrs and M-2, which is M-1-A plus other notice and personal fixed-term deposits, fell 56 mln dlrs to 177.54 billion dlrs. M-3, which is non-personal fixed term deposits and foreign currency deposits of residents booked at chartered banks in Canada, rose 321 mln dlrs to 216.67 billion dlrs. Chartered bank general loans outstanding fell 169 mln dlrs to 126.03 billion dlrs. Canadian liquid plus short term assets rose 72 mln dlrs to 36.47 billion dlrs and total Canadian dollar major assets of the chartered banks rose 507 mln dlrs to 224.22 billion dlrs. Chartered bank net foreign currency assets fell 231 mln dlrs to minus 2.00 billion dlrs. Notes in circulation totalled 16.16 billion dlrs, up 50 mln dlrs from the week before. Government cash balances fell 1.17 billion dlrs to 4.63 billion dlrs in week ended April 1. Government securities outstanding rose 1.09 billion dlrs to 226.42 billion dlrs in week ended April 1, treasury bills rose 1.35 billion dlrs to 76.95 billion dlrs and Canada Savings Bonds fell 47 mln dlrs to 43.87 billion dlrs. Reuter  3-APR-1987 13:17:16.61 usa F f1769reute r f BC-COPLEY-PROPERTIES-<CO 04-03 0072  COPLEY PROPERTIES <COP> TO INVEST IN JOINT PACT BOSTON, April 3 - Copley Properties Inc said the company will invest 9,500,000 dlrs in a joint venture to acquire and develop 33.4 acres of industrial land in Hayward, Calif. Copley said it will own 60 pct of the project and be entitled to a 10 pct preferential return on its investment plus 60 pct of all excess cash from operations, refinancings and other capital transactions. Reuter  3-APR-1987 13:18:53.02 acq usa F f1775reute r f BC-UNION-TO-PROTEST-DART 04-03 0103  UNION TO PROTEST DART'S SUPERMARKETS <SGL> BID LANDOVER, MD., April 3 - The United Food And Commercial Workers said that more than 1,000 rank-and-file members of the union will demonstrate Monday at Dart Group Corp's headquarters protesting Dart's proposed 1.73 billion dlr takover of Supermarkets General <SGL>. Supermarkets is best known for its Pathmark chain of supermarket drug stores in the New York and New Jersey area and also owns Rickels home centers. The union said that it is firmly against the Dart bid because "workers have always ended up with a raw deal in the current takeover mania." A Union statement said: "We do not intend to allow our members to pick up the tab for Supermarket General's executives and the bankers or the Dart Group who stand to make millions." Dart is controlled by the Haft family of Washington, which last year made a bid for California-based Safeway Stores Inc. The Hafts lost, but walked away with at least 100 mln dlrs in profits, analysts estimate. The union said that Dart's Safeway bid forced a major restructuring at Safeway to pay the Hafts and their lawyers and caused a loss of thousands of jobs. Reuter  3-APR-1987 13:19:08.87 usa F f1776reute u f BC-PAN-AM-<PN>-MARCH-LOA 04-03 0086  PAN AM <PN> MARCH LOAD FACTOR ROSE TO 60.6 PCT NEW YORK, April 3 - Pan Am Corp's Pan American World Airways said its load factor rose to 60.6 pct last month from 54.9 pct in March 1986. The airline said its scheduled March traffic increased 14.6 pct to 1.94 billion revenue passenger miles from 1.70 billion last year as available seat miles rose 3.8 pct to 3.21 billion from 3.09 billion. It said the March traffic increase was the third consecutive month of year over year traffic growth for Pan Am. For the first quarter, Pan Am said, its load factor increased to 56.3 pct from 53.4 pct as scheduled traffic increased 10.2 pct to 5.25 billion miles and available seat miles increased 4.5 pct to 9.32 billion. The airlines said its March scheduled freight ton miles increased 1.5 pct to 53.3 mln from 52.5 mln and was up 0.4 pct for the first quarter to 134.6 mln. Reuter  3-APR-1987 13:21:48.58 acq usa F f1785reute u f BC-FCS-LABORATORIES-<FCS 04-03 0099  FCS LABORATORIES <FCSI> TERMINATES DEAL TALKS TEMPE, Ariz., April 3 - FCS Laboratories Inc said merger discussions with an unnamed privately-held company in the health care field have ended without an agreement. The previously announced negotiations began last August, the company said. "It's disappointing to spend so much time on these negotiations and have them fail," said FCS chairman Nicholas Gallo III. "But the discussions could not produce a deal acceptable to our board in the context of the company's stronger financial position today as compared to six months ago." Gallo said FCS will stop actively seeking potential merger partners, but will respond to serious inquiries. "We are determined to follow our plan to restore this company to profitability," he said. "To continue actively searching for potential acquirers inherently forces us to postpone the implementation of critical decisions which are part of the plan." The company, which has 4,475,930 common shares outstanding, reaffirmed it expects to be profitable in the second half of the fiscal year ending September 30, 1987. Reuter  3-APR-1987 13:23:23.58 interest usa A RM f1794reute u f BC-WHITE-HOUSE-SAYS-INTE 04-03 0090  WHITE HOUSE SAYS INTEREST RATES REFLECT MARKET WASHINGTON, April 3 - The White House said the rise in interest rates was "unfortunate in a general sense" but reflected market forces. "There's always movement up and down and the basic fact is that we believe the economy is strong and growing and there will always be fluctuations in the interest rate, but the economy is sound and in good shape," spokesman Marlin Fitzwater said. Citibank raised its prime rate by one quarter of a point and the move was followed by other banks. Reuter  3-APR-1987 13:25:20.85 earn usa F f1799reute d f BC-REGAL-PETROLEUM-LTD-< 04-03 0049  REGAL PETROLEUM LTD <RPLO> YEAR THE WOODLANDS, TExas, April 3 - Shr loss nine cts Net loss 1.4 mln Revs 630,118 dlrs NOTE:Due to change in fiscal year, prior 4th qth and year cannot be presented on comparable basis. 1986 loss includes writedowns approximating 1.4 mln dlrs. Reuter  3-APR-1987 13:26:03.77 earn usa F f1801reute w f BC-CANTERBURY-PRESS-INC 04-03 0042  CANTERBURY PRESS INC YEAR NOV 30 MEDFORD, N.J., April 3 - Shr 1.1 cts vs 1.7 cts Net 26,708 vs 35,084 Revs 447,548 vs 243,161 NOTE:1986 net includes 4,300 dlrs gain from tax credit and 1985 includes gain of 8,300 dlrs gain from credit. Reuter  3-APR-1987 13:26:44.58 earn usa F f1803reute d f BC-GRAPHIC-MEDIA-INC-<GM 04-03 0044  GRAPHIC MEDIA INC <GMED> YEAR FAIRFIELD, N.J., April 3 - Shr nine cts vs 19 cts Net 188,000 vs 362,000 Revs 20.4 mln vs 11.3 mln NOTE:1985 restated for reversal of certain tax benefits. 1986 and 1985 reflects preferred stock dividend requirements. Reuter  3-APR-1987 13:27:04.11 CQ MQ f1804reute r f BC-cbt-silver-vol-oi 04-03 0080  CBT SILVER VOLUME/OPEN INTEREST FOR APRIL 2 VOLUME OPEN-INT CHANGE Apr 714 684 up 516 May 14 36 dn 1 Jun 3097 7109 dn 140 Aug 86 537 up 20 Oct 12 157 up 7 Dec 215 3125 up 56 Feb 3 252 up 1 Apr 28 1275 dn 2 Jun 54 103 up 49 Aug 0 9 unch TTL 4223 13287 up 506 Reuter  3-APR-1987 13:27:08.42 FQ EQ f1805reute u f BC-WALL-STREET-INDICES-1 04-03 0040  WALL STREET INDICES 1300 NYSE COMPOSITE 168.38 UP 1.62 NYSE INDUSTRIALS 203.81 UP 2.34 S AND P COMPOSITE 296.94 UP 3.31 NYSE-A VOLUME 154525400 AMEX INDEX 338.30 UP 3.06 AMEX-B VOLUME 11343900  3-APR-1987 13:27:38.57 usa F A f1806reute r f BC-BURLINGTON-<BNI>-UNIT 04-03 0082  BURLINGTON <BNI> UNIT SETTLES BONDHOLDER SUIT SEATTLE, April 3 - Burlington Northern Inc said its Burlington Northern Railroad Co unit reached an agreement in principle to settle a class action lawsuit filed against the company in May 1985 by holders of two series of the company's bonds. It said the settlement arrangement calls for the company to establish a cash settlement fund of 35.5 mln dlrs, which would be distributed to the bondholders after deductions for attorney's fees. The lawsuit, filed by holders of its four pct Prior Lien bonds due January 1, 1997 and its three pct General Lien Bonds due January 1, 2047, sought to prevent the release of collateral, the company said. If the settlement agreement is approved, the trading prices of the bonds will decline substantially because they will no longer reflect the speculative premiums at which the bonds currently trade, Burlington Northern also said. It said the settlement is subject to negotiation by Burlington Northern, the Citibank N.A. unit of Citicorp <CCI> and Bankers Trust Co <BT>, the bonds' trustees. Reuter  3-APR-1987 13:27:46.34 earn usa F f1807reute r f BC-RICHARDSON-ELECTRONIC 04-03 0073  RICHARDSON ELECTRONICS <RELL> 3RD QTR FEB 28 NET LaFox, Ill., April 3 - Shr 20 cts vs 20 cts Net 1,981,000 vs 1,689,000 Rev 24.7 mln vs 19.6 mln Nine months Shr 59 cts vs 53 cts Net 5,855,000 vs 4,360,000 Rev 70.9 mln vs 51.9 mln NOTE: Fiscal 1986 per share data reflects dilutive effect of shares issued for April 1986 convertible debenture conversion. Company's full name is Richarson Electronics Ltd. Reuter  3-APR-1987 13:29:07.38 earn usa F f1812reute d f BC-DIVERSIFIED-HUMAN-RES 04-03 0038  DIVERSIFIED HUMAN RESROUCES GROUP <HIRE> YEAR DALLAS, APril 3 - Shr loss five cts vs profit 72 cts Net loss 79,069 vs profit 829,737 Revs 14.4 mln vs 14.1 mln NOTE:1985 includes extraordainy credit of 11 cts. Reuter  3-APR-1987 13:30:04.51 usa F f1813reute r f BC-ALASKA-AIR-<ALK>-UNIT 04-03 0110  ALASKA AIR <ALK> UNIT HAS HIGHER LOAD FACTOR SEATTLE, April 3 - The Alaska Airlines unit of Alaska Air Group Inc said its March load factor rose to 58.1 pct from 57.3 pct a year earlier, but its year-to-date load factor dropped to 51.8 pct from 52.6 pct last year. March revenue passenger miles rose five pct to 225.9 mln from 215.6 mln, but year-to-date revenue miles fell one pct to 586.7 mln from 593 mln. Available seat miles for the month totaled 389.1 mln, a three pct increase over the 376.1 mln posted for March 1986, and for the year-to-date available miles totaled 1.132 billion compared with 1.128 billion a year earlier, Alaska Air said. Reuter  3-APR-1987 13:30:26.85 ukjapan nakasonethatcher RM f1815reute u f BC-UK-MINISTER-LOOKS-TO 04-03 0112  UK MINISTER LOOKS TO EASE TENSION ON TOKYO TRIP By Sten Stovall, Reuters LONDON, April 3 - The U.K. Government hopes for a breakthrough on the deadlock with Japan over trade policies during next week's visit to Tokyo by Corporate Affairs Minister Michael Howard, political sources said. Howard, who leaves for Japan tomorrow, told Reuters he will try to promote understanding on trade issues during his visit. Meanwhile, Britain will re-examine a letter from Japanese Prime Minister Yasuhiro Nakasone promising personal help in solving the row over a U.K. Firm's bid to win a significant role in Japan's telecommunications market, government sources said. Tensions have risen following Britain's decision to arm itself early with new statutory powers which it says could be used against certain Japanese financial institutions. Britain reacted optimistically at first to the letter from Nakasone to Prime Minister Margaret Thatcher, seeing it as a signal that he would work towards ensuring a satisfactory outcome to the bid launched by Cable and Wireless Plc <CAWL.L>, government officials said. But this view has since been clouded by reports from Tokyo that Nakasone's assurances really constituted little more than politeness in the face of British anger, they added. Howard said he would use his trip to push for a bigger role in Japan's telecommunications industry for Cable and Wireless Plc. The U.K. Government has made the issue a test case for Japan's willingness to open its markets adequately to outside competition. Asked whether the letter from Nakasone was a rejection of attempts by Britain to achieve that, Howard said "I am not sure it is correct to regard Mr Nakasone's letter as a rejection of Mrs Thatcher's request of him - and it says he is taking a personal interest in this problem. "I don't understand it to be closed at all." Howard added that during his Tokyo visit he would be "talking to them about it (the letter), finding out exactly what they do mean about it, and making it plain that we take a very serious view of the fact that access to Japanese markets is not as free as we allow access to our markets to be." He noted that under the new Financial Services Act, Britain could revoke or deny licences to Japanese banking and insurance institutions in London if U.K. Firms fail to receive similar treatment in financial markets in Japan soon. "I hope it won't come to that, and I don't think it will," Howard added. During the trip Howard will meet officials in the Tokyo Stock Exchange, the Ministry of Finance, the Trade Ministry, and Posts and Telecommunications Minister Shunjiro Karasawa. Karasawa is regarded as behind opposition to any significant role for Cable and Wireless in the Japanese telecommunications industry. Share prices on the London Stock Exchange were undermined again today by fears of a possible U.K./Japanese trade war. This was despite denials by Trade and Industry Secretary Paul Channon that Britain was on the verge of a trade war. He told a meeting of insurance brokers today that Britain believed a "sensible solution" could be found which would open Japanese markets to British goods. Government officials were at pains today to deny that Britain had set a deadline of three weeks for Japan to promise similar access to its financial markets to U.K.-based financial firms as that enjoyed in London by equivalent Japanese firms. They said that Department of Trade and Industry officials had said yesterday that the measures against Japanese financial institutions could be imposed from then but that this did not necessarily constitute a deadline. Experts believe Britain would lose out by acting against Japanese banks, insurance and investment institutions. But despite the danger of Japanese firms taking their trade elsewhere in Europe, Howard said he did not expect the move to backfire. He said in a radio interview today "it is true that we benefit from their presence - but they would not want to lose those advantages. And I am sure they are making their views plain to the Japanese government on this matter." Howard, who will also be visiting South Korea before returning to London on April 11, said his trip to Tokyo was planned well before the current trade row. Howard said his talks with Japanese officials would also include ways of jointly combating financial fraud in global markets with Japanese officials. This would be done through a cooperation between national regulatory bodies. He said a memorandum of understanding for exchanging information to combat financial fraud would be sought with Japan on terms similar to one signed last autumn between Britain and the United States. REUTER  3-APR-1987 13:33:25.31 usa F f1828reute d f BC-PACIFIC-GAS-<PCG>-PLA 04-03 0103  PACIFIC GAS <PCG> PLANT TO BEGIN REFUELING SAN FRANCISCO, April 3 - Pacific Gas and Electric Co said its Diablo Canyon Unit 2 nuclear power plant will begin its first refueling today after about 13 months of operation. The refueling outage is expected to last about 12 weeks and will include a variety of maintenance as well as the replacement of about one-third of Unit 2's fuel, the company said. Pacific Gas said Unit 2 generated power about 93.7 pct of the time during its first year of operation. Pacific Gas' two Diablo Canyon units generate about 2.2 mln kilowatts of electricity in full operation. Reuter  3-APR-1987 13:34:29.36 acq usa F f1833reute d f BC-MID-STATE-<MSSL>,-FIR 04-03 0067  MID-STATE <MSSL>, FIRST FEDERAL IN DEAL OCALA, Fla, April 3 - Mid-State Federal Savings and Loan Association said it and First Federal Savings and Loan Association of Brooksville <FFBV> reached a definitive merger agreement. As previously announced, Brooksville shareholders will get cash and stock in exchange for their shares. The transaction is expected to be completed during the summer 1987. Reuter  3-APR-1987 13:34:50.83 acq canada E F f1835reute r f BC-memotec-data-complete 04-03 0110  MEMOTEC DATA COMPLETES TELEGLOBE ACQUISITION MONTREAL, April 3 - <Memotec Data Inc> said it completed the previously announced 488.3 mln dlr acquisition of Teleglobe Canada from the federal government. Memotec Data said Teleglobe, which has provided Canada's overseas telecommunications services since 1950, now becomes Teleglobe Canada Inc, a unit of Memotec. Teleglobe president and chief executive Jean-Claude Delorme will continue in the same post, the company said. In addition to the sale price, the government will receive Teleglobe's accumulated cash of 102 mln dlrs and a special 18 mln dlr dividend, making total proceeds 608.3 mln dlrs. Reuter  3-APR-1987 13:37:55.73 usa F f1839reute d f BC-CITIZENS-FIRST-BANCOR 04-03 0133  CITIZENS FIRST BANCORP <CFB> RECEIVES FINE GLEN ROCK, N.J., April 3 - Citizens First Bancorp Inc said its banking subsidiary pleaded guilty to two technical violations of the Bank Secrecy Act and was fined 2,000 dlrs. The subsidiary, Citizens First National Bank of New Jersey, pleaded guilty to two misdemeanors in Federal District Court for the District of New Jersey. Charges had been brought by the U.S. Attorney's office. The company said no additional charges will be brought against it and that it has instituted additional procedures to reduce the possibility of future violations. It cooperated with authorities in the investigation. The violations occurred on Aug 12, 1982, and May 25, 1984, when the bank failed to report currency transactions involving more than 10,000 dlrs. Reuter  3-APR-1987 13:40:10.81 trade usajapan F f1844reute u f AM-TRADE-AMERICAN 04-03 0100  U.S., JAPANESE OPEN TALKS ON SEMICONDUCTORS WASHINGTON, April 5 - U.S. and Japanese officials meet tomorrow to try to settle a dispute over semiconductor trade and to cut short the 300 mln dlr penalty tariffs President Reagan has ordered imposed on Japanese exports. But U.S. officials held out little hope that any accord could be reached before the tariffs of 100 per cent - up from about five per cent - are to take effect on April 17. The Customs Bureau last week started to levy a bond on the Japanese goods that Reagan ordered penalized. The penalties would be retroactive to March 31. Reagan said on March 27 when ordering the tariffs that he hoped the Japanese would soon end their unfair practices in semiconductor trade and that sanctions could be lifted. Technical meetings are to be held today and tomorrow, with meetings at a more senior level scheduled for Thursday and Friday. Public hearings on the sanctions are set for April 13. The Japanese aides here for the technical talks include Shigeru Muraoka, director-general of international trade policy of the Ministry of International Trade and Industry (MITI), and Masashi Yamamoto, deputy director-general of the information and machinery bureau. Meeting with them will Glen Fukushima, director of the Japan office of the U.S. Trade Representative's Office, and Jim Gradoville, of trade representative's office of industry and services. The two sides in the Thursday and Friday talks will be headed by Deputy U.S. Trade Representative Michael Smith and MITI vice minister Makoto Kuroda. Reuter  3-APR-1987 13:41:26.38 usa F f1847reute r f BC-TRIBUNE-<TRB>-FILES-3 04-03 0051  TRIBUNE <TRB> FILES 300 MLN DLR SHELF REGISTRATION CHICAGO, April 3 - Tribune Co said it filed a shelf registration with the Securities and Exchange Commission for 300 mln dlrs in debt securities. Underwriters may include Salomon Bros Inc and Merrill Lynch, it said. Proceeds will be for general needs. Reuter  3-APR-1987 13:42:58.60 acq usa F f1854reute d f BC-AMERON-<AMN>-ADOPTS-S 04-03 0107  AMERON <AMN> ADOPTS SHAREHOLDER RIGHTS PLAN MONTEREY PARK, Calif., April 3 - Ameron Inc said its board adopted a rights plan designed to protect shareholders from potentially unfair takeover tactics. The plan calls for distribution of one right for each of its outstanding common shares and each right entitles the holder to buy one/one-hundredth of a share of newly authorized Series A Junior Participating cumulative Preferred stock at an exercise price of 55 dlrs, Ameron said. It said the rights are exercisable if a group acquires 20 pct or more of its common stock or announces a tender offer for 30 pct or more of its shares. Reuter  3-APR-1987 13:43:34.67 uknigeria RM f1856reute u f BC-BRITAIN'S-ECGD-DISCUS 04-03 0102  BRITAIN'S ECGD DISCUSSING NEW COVER FOR NIGERIA LONDON, April 3 - Britain's Export Credits Guarantee Department (ECGD) is holding talks with Nigeria aimed at resuming insurance cover for British exporters to Nigeria, the head of ECGD's international debt division, Gerry Breach, said. The ECGD suspended cover on Nigeria in 1984 after the country fell into arrears on payments of insured and uninsured debts. Following last week's bilateral accord between Britain and Nigeria to reschedule the country's insured trade debts, bankers had hoped that talks would commence on a resumption of cover. Breach made his comments in an address to a private meeting of businessmen, a copy of which was made available to the press. Breach noted that for the ECGD to consider "a gradual introduction of a package of new support" certain criteria would have to be met. This would involve the Nigerian economic structural adjustment program being put into effect and being endorsed by the International Monetary Fund, the program remaining on course and continuing to be endorsed by the IMF and a satisfactory level of acceptance by the Nigerian government of the ECGD insured short-term trade arrears. Breach said that these criteria are now beginning to be satisfied, adding that while the ECGD could not yet formally announce new cover, it was holding discussions with Nigeria on priorities for new credits. He said an announcement would be made "as soon as possible" on an agreement and the ECGD would create a package for Nigeria that would include the department's normal range of export trade support facilities. British exports to Nigeria exceeded 550 mln stg in 1986. Breach noted that since cover was removed, the ECGD has maintained a limited amount of short-term trade cover for Nigeria, which was backed by letters of credit from the Nigerian Central Bank. While the ECGD would initially continue to use this structure under a new package, it would also hope to expand the volume of coverage in the short-term area and relax the terms it is prepared to underwrite towards the commonly accepted maximum of 180 days. REUTER  3-APR-1987 13:44:08.77 acq usa F f1857reute d f BC-FCS-LABORATORIES-<FCS 04-03 0062  FCS LABORATORIES <FCSI> ENDS MERGER TALKS TEMPE, Ariz., April 3 - FCS Laboratories said its merger talks with another unidentified company in the health care field ended without agreement. The talks began last August, the company said. The company also said it will no longer actively seek out potential merger partners, but will respond to serious inquiries. Reuter  3-APR-1987 13:45:46.93 usa F f1860reute u f BC-******IBM-SECRETARY-J 04-03 0091  IBM <IBM> NEWLY NAMED SECRETARY DIES IN FIRE ARMONK, N.Y., APril 3 - International Business Machines Corp said recently elected secretary, John Manningham, and his wife, Patricia, died early this morning in a fire at their Reidgefield, Conn home. Manningham, 53, began his IBM career in 1959 as a marketing representative. His election would have been effective July 1. Tom Irwin is the current secretary. IBM Chairman John Akers said "this is a great loss to the IBM Company and to the Manningham's family, friends and community. Reuter  3-APR-1987 13:46:44.30 trade ukjapan C f1863reute d f BC-UK-MINISTER-LOOKS-TO 04-03 0106  UK MINISTER LOOKS TO EASE TENSION WITH JAPAN LONDON, April 3 - The U.K. government hopes for a breakthrough on the deadlock with Japan over trade policies during next week's visit to Tokyo by Corporate Affairs Minister Michael Howard, political sources said. Howard, who leaves for Japan tomorrow, told Reuters he will try to promote understanding on trade issues during his visit. Meanwhile, Britain will re-examine a letter from Japanese Prime Minister Yasuhiro Nakasone promising personal help in solving the row over a U.K. firm's bid to win a significant role in Japan's telecommunications market, government sources said. Tensions have risen following Britain's decision to arm itself early with new statutory powers which it says could be used against certain Japanese financial institutions. Britain reacted optimistically at first to the letter from Nakasone to Prime Minister Margaret Thatcher, seeing it as a signal that he would work towards ensuring a satisfactory outcome to the bid launched by Cable and Wireless Plc, government officials said. But this view has since been clouded by reports from Tokyo that Nakasone's assurances really constituted little more than politeness in the face of British anger, they added. Reuter  3-APR-1987 13:54:45.70 trade usajapan conable imfworldbank F RM A f1876reute u f BC-CONABLE-WARNS-PROTECT 04-03 0082  CONABLE WARNS PROTECTIONISM MIGHT SPREAD By Alver Carlson, Reuters WASHINGTON, April 3 - World Bank President Barber Conable expressed concern that trade protectionism, at the heart of a new showdown between the United States and Japan, might spread throughout the industrial world. But in an interview with Reuters, Conable said the action by the United States to slap tariffs on certain electronic goods from Japan did not mean the countries were heading for a full-scale trade war. Conable said the World Bank has been pressing developing countries to open their markets, arguing that a free trading environment increased the possibility of global economic growth. "We have, in fact, been making adjustment loans to many countries in the developing world which have encouraged the opening of their markets and we want to be sure that the developed world doesn't close at the same time," he said. He said the U.S. action against Japan was "a significant retaliatory step but it did not constitute a basic change in trade policy." The interview came just before next week's semi-annual meetings of the Bank and the International Monetary Fund. Referring to Brazil's recent interest payments moratorium, Conable also said the global debt situation was very serious and must be closely watched. He said the Bank, which in the past has concentrated on making loans that assist the basic underpinnings in the developing world such as dams, roads and sewers, will increasingly make assistance available for economic reform. The Bank has increased these loans, in part because of the debt crisis that has found countries desperately in need of new funds for balance of payments adjustment and economic reforms aimed at opening their markets, encouraging foreign investment and reducing government's role in the economy. "We're comfortable with adjustment lending, we expect, however, that it will never reach a majority of our portfolio," Conable said. He made clear, however, that adjustment lending would continue to increase as a proportion of overall Bank lending for some time. He noted, "the problem of debt was a severe one and many countries are asking for adjustment assistance because of the problem of debt." Conable, is a a former Republican Congressman from New York chosen by President Reagan for the Bank position last year. He is an associate of Treasury Secertary James Baker who launched the U.S. strategy for shoring up indebted nations in October, 1985 which included a call for increased adjustment lending by the World Bank. Conable also said that he expected the result of a major study of the Bank's organization to be completed in the next several weeks. He said the decision to seek a reorganization was based, in part, on the fact that the Bank had come under fire from the poorest countries for not doing enough to help and from the richest countries because of inefficiency. the reorganization is considered a major initiative by Conable, and is being closely-watched by the agency's 151 member-countries as an indication of his management style and priorities. "I want to be sure this institution is viewed by those who must support it as soundly constituted so that it will be permitted to grow," Conable said. However, he said "I don't believe there is anything basically wrong with this institution and I don't believe it has to have any redefinition of its purpose." He said, however, that it was apparent that the debt initiative proposed by Baker has given the Bank a central role in dealing with the debt crisis. Conable added that cooperation between the Bank and its sister agency, the International Monetary Fund, was good and that he talked often with IMF Managing Director Michel Camdessus on a variety of issues. On a personal level, Conable said that he not feel a need to put his personal stamp on the Bank noting that "I don't have a particular mission here except to be useful to the institution and to the process of development." He added, "so I don't feel a great calling to personalize the institution." On the development needs of sub-Sahara Africa, Conable said that the Bank was constantly reviewing new ways for assisting the region, noting that half of the recently agreed financing of 12.4 billion dlrs for Bank's International Development Association was earmarked for Africa. Leading industrial nations are expected to consider new forms of debt relief for the very poorest nations, like those in the Sub-Sahara, during next week's meetings. Reuter  3-APR-1987 13:55:17.71 usa F f1877reute r f BC-AMERICAN-SAVINGS-<AMS 04-03 0080  AMERICAN SAVINGS <AMSB> SEEKS STATE CHARTER TACOMA, Wash., April 3 - American Savings Bank F.S.B. said it applied for a state charter and it intends to change its depositor insurance coverage to the Federal Deposit Insurance Corp and to withdraw from coverage by the Federal Savings and Loan Insurance Corp. The savings bank also said state chartered institutions have broader banking powers and the conversion will be in the best interest of both shareholders and depositors. Reuter  3-APR-1987 13:55:26.39 usa F f1878reute r f BC-LTV-<QLTV>-UNIT-WINS 04-03 0063  LTV <QLTV> UNIT WINS TWO ARMY CONTRACTS SOUTH BEND, Ind., April 3 - LTV Corp said its AM General division received two contracts valued at 11.7 mln dlrs from the U.S. Army to make special equipment kits for Hummer troop and cargo vehicles. Deliveries are set for May 1987 through November 1988, the company said. AM General is part of LTV Missiles and Electronics Group. Reuter  3-APR-1987 13:57:12.03 usajapan F f1882reute r f AM-PLANE-BOEING 04-03 0112  BOEING SEEKS CAUSE OF JAL ENGINE PROBLEM SEATTLE, April 3 - Boeing Co. <BA> is trying to find out what caused an engine brace to snap on one of Japan Air Line's 747-SR jumbo jets, a spokesman for the airplane manufacturer said. "We know about the problem and we have provided a service advisory to operators of 747s," said the spokesman. "We are not advising any massive inspections at this time." The advisory alerts operators of the jumbo jets that a problem has occurred and under what circumstances, but it does not recommend any action. "A 'service bulletin' would be sent out if there is anything they should be concerned about," the spokesman said. A JAL spokesman in Toyko said inspectors making a routine check found one of three diagonal braces attaching an engine to the wing of a 747-SR had snapped due to metal fatigue. The airlines said it had ordered an inspection of all 11 of its 747-SR's. The plane is a full-sized jumbo jet that has been modified slightly to handle short-haul routes in Japan, mainly between Tokyo and Osaka. The jetliners have beefed-up landing gear to accommodate a higher-than-normal number of landings and takeoffs. Boeing's spokesman said only JAL and All Nippon Airlines use the 747-SR. JAL took delivery of its first 747-SR in 1973 and purchased two more last year. He said the braces had been shipped to a Boeing plant near Seattle where they were being inspected. Reuter  3-APR-1987 13:58:59.52 uknigeria C G T M f1886reute d f BC-BRITAIN'S-ECGD-DISCUS 04-03 0101  BRITAIN'S ECGD DISCUSSING NEW COVER FOR NIGERIA LONDON, April 3 - Britain's Export Credits Guarantee Department (ECGD) is holding talks with Nigeria aimed at resuming insurance cover for British exporters to Nigeria, the head of ECGD's international debt division, Gerry Breach, said. The ECGD suspended cover on Nigeria in 1984 after the country fell into arrears on payments of insured and uninsured debts. Following last week's bilateral accord between Britain and Nigeria to reschedule the country's insured trade debts, bankers had hoped that talks would commence on a resumption of cover. Breach told a businessmen's meeting that for the ECGD to consider "a gradual introduction of a package of new support" certain criteria would have to be met. This would involve the Nigerian economic structural adjustment program being put into effect and being endorsed by the International Monetary Fund, the program remaining on course and continuing to be endorsed by the IMF and a satisfactory level of acceptance by the Nigerian government of the ECGD insured short-term trade arrears. British exports to Nigeria exceeded 550 mln stg in 1986. Reuter  3-APR-1987 14:02:56.83 uk RM F f1899reute u f BC-BP-CREDIT-FACILITY-SU 04-03 0115  BP CREDIT FACILITY SUBSTANTIALLY OVERSUBSCRIBED LONDON, April 3 - A five billion dlr credit facility being arranged for two units of British Petroleum Co Plc <BP.L> attracted over 15 billion dlrs in syndication but will not be increased, Morgan Guaranty Ltd said on behalf of Morgan Guaranty Trust Co of New York, the arranger. It said that 64 of BP's relationship banks will be joining the facility, although their participations will be cut back dramatically. Banks had been invited as lead managers at 200 mln dlrs, managers at 125 mln and co-managers at 75 mln. BP will make the final decision on the allotments broadly based on relationships rather than on the amounts offered. The facility is being arranged for BP International and BP North America in conjunction with the company's planned tender offer for the 45 pct of Standard Oil Co it does not already own. Because of the purpose of the facility, Morgan only had five business days to arrange the facility. As a result, it carried terms that bankers considered relatively favourable when compared with those on most other recent credits. The facility fee, for example, was 1/8 pct compared with the 1/16 pct BP paid on a recent 1.5 billion dlr refinancing. REUTER  3-APR-1987 14:04:13.24 strategic-metal spain C M f1903reute u f BC-MINAS-DE-ALMADEN-RAIS 04-03 0113  MINAS DE ALMADEN RAISES MERCURY PRICE MADRID, April 3 - Spain's Minas de Almaden y Arrayanes S.A. has agreed with Algerian producer ENOF to establish a minimum price of 300 dlrs per flask for spot mercury sales, Almaden spokesman Jesus Gallego said. In response to enquiries from Reuters, he said his company had raised the minimum price for its spot sales from 240 dlrs per flask following talks with ENOF. In a separate press release, the company said that ENOF and Almaden held talks in Istanbul a week ago with Turkish mercury producers on ways to improve prices, but Gallego said he was not in a position to say what action the Turkish companies would be taking. Reuter  3-APR-1987 14:04:52.21 money-fx usa F A RM f1907reute u f BC-U.S.-JOBS-DATA-SAID-T 04-03 0099  U.S. JOBS DATA SAID TO RULE OUT FED TIGHTENING By Kathleen Hays, Reuters NEW YORK, April 3 - A steep drop in goods-producing jobs detracted from U.S. March non-farm payroll employment and makes it unlikely that the Federal Reserve will tighten monetary policy to defend the dollar, economists said. U.S. March non-farm payroll employment rose 164,000, less than the gain of 220,000 to 290,000 the financial markets expected. Manufacturing employment fell 25,000, compared with February's 50,000 gain, while March construction employment dropped 45,000 after being unchanged in February. "The momentum of industrial activity is tapering off as we end the first quarter," said Stephen Roach of Morgan Stanley and Co Inc. "This sets the stage for more sluggish growth in the second and third quarters." "The Fed will view this as a caution flag on the economy," he said. "They will not ease as long the dollar is weak, but clearly they can't tighten." David Wyss of Data Resources Inc said that the downward revision in February non-farm payroll employment to 236,000 from 337,000 means that employment gains in the first quarter were weaker than expected. While Wyss left his first-quarter forecast of real U.S. gross national product growth at 3.5 pct, he said the March jobs data suggested a downward revision in his second-quarter growth forecast to 2.5 pct from 2.8 pct. Bill Sullivan of Dean Witter Reynolds Inc said the average monthly gain in non-farm jobs in the first quarter was only 237,000, compared with 254,000 in the fourth quarter of 1986. "There's momentum in first quarter labor force activity, but less than assumed," he said. "Gains in goods-producing jobs were subdued at best. This rules out any possibilty of the Fed tightening for exchange-related purposes." In March, the average workweek fell back to its January level of 34.8 hours from 35.0 hours in February. Manufacturing hours also fell back to their January level, totalling 40.9 hours in March compared with 41.2 hours in February. The Commerce Department noted that loss of manufacturing jobs in March was concentrated in automobile, electrical and electronic manufacturing. Robert Brusca of Nikko Securities International said that a 13,000 decline in auto manufacturing employment accounted for nearly half of the total drop in manufacturing jobs. Economists said that a build-up in auto inventories resulting from a steep drop in sales has finally caught up with the labor force and may point to slower growth ahead. Most expect an increase in inventories of as much as five pct to offset a steep four to five pct drop in final sales in the first-quarter GNP accounts. Roach said he expects first quarter U.S. GNP to rise two pct, to be followed by a gain of 1.0-1.5 pct at best in the second and third quarters. He said the March drop in industrial activity "is a reasonable response in light of the inordinate contribution inventory accumulation made to GNP." Economists said the employment data also suggest weak gains in industrial production and personal income for March. They expect only marginal gains, if not small declines, for these indicators, compared with a February increases of 0.5 pct in industrial production and 0.9 pct in personal income. Steve Slifer of Lehman Government Securities said the drop in March construction employment may also signal a drop in March housing starts, which rose 2.6 pct in February to 1.851 million units at an annual rate from 1.804 million units in January. The rate of unemployment fell to 6.6 pct, its lowest level since March 1980, from 6.7 pct in February. But Wyss pointed out that this resulted from a drop in the labor force, which fell to 119.2 mln in March from 119.35 mln in February. "This just means that there were fewer people looking for work, so the drop in unemployment doesn't mean much," he said. He said the latest employment report will not concern the Fed because it does points to GNP growth in the first half of 2.5-3.0 pct, but "it does suggest they can't afford to tighten to quickly either." The statistical factors used to smooth out seasonal fluctuations in the jobs data may have understated March labor force gains, just as seasonal factors probably overstated them in January and February, Slifer said, but are consistent with his forecast of 1.8 pct first quarter GNP growth. Economic growth remains sluggish, but Silfer does not think that the Federal Open Market Committee changed policy at their meeting this week. "At some point they will be more inclined to ease," he said. For the time being, however, the March employment report "increases the likelihood they won't tighten, regardless of the dollar." Reuter  3-APR-1987 14:06:26.28 acq usa F f1912reute u f BC-BRISTOL-MYERS-<BMY>-R 04-03 0096  BRISTOL-MYERS <BMY> REVIEWING SCIMED MERGER MINNEAPOLIS, April 3 - SciMed Life Systems Inc <SMLS> said Bristol-Myers Co is analyzing the pending lawsuit brought against SciMed by <Advanced Cardiovascular Systems Inc> to determine whether to consummate its previously announced plans to merge with SciMed. The company said its was served the suit in Minneapolis on March 31, the day after it announced its definitive merger agreement with Bristol-Myers. SciMed said the suit, which alleges that SciMed infringed on Advanced Cardiovascular patents, is without merit. Reuter  3-APR-1987 14:07:59.28 ukjapan F f1919reute d f BC-UK-SEEKS-PACT-WITH-JA 04-03 0095  UK SEEKS PACT WITH JAPAN FOR INFORMATION EXCHANGE LONDON, April 3 - Corporate Affairs Minister Michael Howard said he will use a coming trip to Tokyo to seek a memorandum of understanding between Britain and Japan on the exchange of information to fight fraud in world financial markets. He told journalists that he would be seeking an agreement with Japan similar to one struck last autumn between the U.K. Department of Trade and Industry, on the one hand, and the Securities and Exchange Commission (SEC) and the Commodity Futures Trading Commission on the other. Market sources have persistently speculated that it was information passed on to the U.K. By the SEC through their pact that triggered the DTI's investigations into (Guinness Plc's) <GUIN.L> takeover of <Distillers Co Plc> last year. The probe, launched in December, triggered the resignation of some of Guinness' senior management, including Chairman Ernest Saunders. The Trade department, however, has never confirmed this and has yet to state what its investigation actually concerns. REUTER  3-APR-1987 14:08:38.07 crude iraqiran C f1921reute d f AM-GULF-IRAQ 04-03 0075  IRAQ SAYS ITS FORCES SINK THREE IRANIAN VESSELS BAGHDAD, April 3 - Iraq said its forces sank three Iranian boats which tried to approach its disused deep water oil terminal in the northern Gulf today. A military spokesman, quoted by the official Iraqi news agency, said other Iranian boats fled. He did not identify the vessels. Iraq's major oil outlets in the northern Gulf were closed shortly after the war with Iran started in late 1980. Reuter  3-APR-1987 14:09:38.75 france RM f1924reute r f BC-FRANCE-HLM-LAUNCHES-7 04-03 0083  FRANCE HLM LAUNCHES 750 MLN FRANC BOND PARIS, April 3 - Housing group France HLM is launching a 750 mln French franc 8.40 pct 15-year bond with an issue price of 95.36 pct and denominated in 5,000 franc units, lead manager Banque Paribas said. The issue is being co-led by Credit Lyonnais. Payment date is April 20 and redemption will be in 12 equal annual instalments starting after the first three years of the issue's life. It will be listed in the Official Bulletin (BALO) on April 6. REUTER  3-APR-1987 14:12:09.91 usa F f1928reute u f BC-******TEXAS-AIR'S-CON 04-03 0078  TEXAS AIR'S <TEX> CONTINENTAL MARCH TRAFFIC UP HOUSTON, April 3 - Texas Air Corp'S Continental Airlines said its March 1987 load factor rose to 65.6 pct from 64.3 pct last year. Available seat miles rose to 5.1 mln from 2.5 mln and revenues passenger miles rose to 3.3 mln from 1.6 mln For the year to date, load factor fell to 61.8 pct from 61.9 pct, available seat miles rose to 13.2 mln from 7.3 mln and revenue passenger miles rose to 8.2 mln from 4.5 mln Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-014.sgm000066400000000000000000001774371154025176300231630ustar00rootroot00000000000000 7-APR-1987 11:02:35.07 E f1137reute b f BC-JOHANNESBURG-GOLD-SHA 04-07 0120  JOHANNESBURG GOLD SHARES CLOSE MIXED TO FIRMER JOHANNESBURG, April 7 - Gold share prices closed mixed to slightly firmer in quiet and cautious trading, showing little reaction to a retreat in the bullion price back to below 420 dlrs and a firmer financial rand, dealers said. Heavyweight Vaal Reefs ended eight rand higher at 398 rand but Grootvlei eased 40 cents at 16.60 rand, while mining financials had Gold Fields up a rand at 63 rand despite weaker quarterly results. Other minings were firm but platinums eased. Industrials also closed mixed to firmer, the index once again hitting a new high of 1757 from Friday's 1753 finish. The overall index also hit a new high of 2188 versus 2179 on Friday. REUTER  7-APR-1987 11:02:40.82 TQ f1138reute u f BC-NY-SUGAR-11-1100 04-07 0024  NY SUGAR 11 1100 MAY7 662 OFF 17 JUL7 678 OFF 15 SEP7 696 OFF 12 OCT7 699 OFF 14 JAN8 UNTRD MAR8 739 OFF 16 MAY8 UNTRD JUL8 780 OFF 3  7-APR-1987 11:03:03.68 CQ TQ f1140reute u f BC-NY-COFFEE-11-00 04-07 0026  NY COFFEE 11:00 MAY7 10200 OFF 4 JUL7 10390 OFF 10 SEP7 10580 OFF 25 DEC7 10900 UNCH MAR8 11100 UP 50 MAY8 11300 UP 50 JUL8 UNTRD SEP8 UNTRD  7-APR-1987 11:03:30.55 CQ LQ f1143reute u f BC-peoria-actual-rcpts 04-07 0023  PEORIA ACTUAL LIVESTOCK RECEIPTS - USDA CATTLE HOGS For April 8 WEEK AGO 200 2,000 YEAR AGO 100 2,400 Reuter  7-APR-1987 11:04:03.63 C L f1145reute u f BC-feeder-cattle-report 04-07 0106  FEEDER CATTLE FUTURES SET NEW HIGHS, TURN MIXED CHICAGO, April 7 - Feeder Cattle futures advanced 0.20 to 0.30 cent at the start and posted new season's highs in April through August and October before slipping to trade 0.10 cent lower to 0.20 higher in latest trade. Futures ran up to new highs at the start on general demand prompted by continued strong cattle fundamentals. Posting of another 10 cent gain in the latest reported average feeder steer price added to support, traders said. However, prices retreated on profit-taking following the lead of other meat pits. Stotler notably sold April on the decline, they said. Reuter  7-APR-1987 11:04:12.58 FQ EQ f1146reute u f BC-AMEX-CONSOLIDATED-110 04-07 0050  AMEX-CONSOLIDATED 1100 ACTIVES 364,200 WESTERN DIG 25 7/8 UP 1 1/4 230,200 WANG LAB B 15 1/2 UP 1/8 223,800 WICKES COS 4 1/8 OFF 1/8 190,600 ALZA CP 37 1/2 UP 1 7/8 187,900 TEXAS AIR 41 1/2 OFF 1 ADVANCES 247 DECLINES 152  7-APR-1987 11:04:23.94 M f1147reute b f BC-LME-LEAD-AFT-2ND-RING 04-07 0025  LME LEAD AFT 2ND RING 1602 - APR 7 LAST BUYER SELLER Cash 308.0 -- -- 3 Months 301.5 301.0 302.0  7-APR-1987 11:04:29.67 GQ f1148reute u f BC-cbt-corn-spreads 04-07 0058  CBT CORN SPREADS APRIL 7 - 1000 hrs cdt MONTHS LAST DIFFERENCE Jul/May 3-1/4 over 3-1/2 over Dec/Jul 12-3/4 over 13 over Jul/Sep 4-3/4 under 5 under Sep/May no quote 8-1/4 over Sep/Dec no quote 8-1/4 under Dec/Mar8 no quote no quote May/Dec 16 under 16-1/2 under Reuter  7-APR-1987 11:04:47.19 FQ EQ f1150reute u f BC-NYSE-CONSOLIDATED-110 04-07 0090  NYSE-CONSOLIDATED 1100 ACTIVES 4,969,500 GCA CP 7/32 OFF 1/32 2,163,900 BELLSOUTH 39 3/8 OFF 1/8 2,058,500 TEXACO 34 1/8 UP 1/2 1,152,200 OKLAHO G&E 32 1/2 OFF 3/4 939,700 UNITED AIR 65 OFF 3/4 929,900 USX CORP 29 5/8 UP 3/8 918,100 GEN MOTORS 83 5/8 UP 2 1/8 917,500 FORD MOTOR 91 1/4 UP 1 1/8 755,700 DELMARVA 30 1/4 OFF 1/8 732,200 CAESARS 31 1/4 UP 5/8 ADVANCES 636 DECLINES 525  7-APR-1987 11:05:05.48 C L f1151reute u f BC-TEXAS-PANHANDLE/W-OKL 04-07 0098  TEXAS PANHANDLE/W OKLA FEEDLOT ROUNDUP - USDA Amarillo, April 7 - Cattle in the panhandle area monday were 0.50 to 1.50 dlr higher. Trading was very active. Feedlots reported very good interest and inquiry from buying sources. Confirmed sales of 22,700 steers and heifers 8,100 head. There were 37,900 head sold for the week to date. Steers - good and mostly choice 2-3, 70-85 pct choice, 1025-1150 lb 69.00-70.00, late mostly 69.50-70.00. Heifers - near 350 head mostly choice 2-3 1000 lb 68.25. Good and mostly choice 2-3 950-100 lb 66.50-68.00, late mostly 67.00-68.00. Reuter  7-APR-1987 11:05:17.86 CQ f1152reute u f BC-MIDWEST-GRAIN-FUTURES 04-07 0061  MIDWEST GRAIN FUTURES 11:00 EDT KANSAS CITY WHEAT MAY7 274 1/2 UP 1/2 JUL7 263 1/2 UP 1/2 SEP7 265 1/2 UP 1/4 DEC7 270 1/2 OFF 1/4 MAR8 -- --MINNEAPOLIS WHEAT MAY7 284 3/4 UP 1 1/4 JUL7 280 1/4 OFF 1/2 SEP7 277 UP 1 DEC7 -- -- MAR8 -- --  7-APR-1987 11:05:28.64 trade usa volcker V RM f1153reute b f BC-VOLCKER-PUSHES-SPENDI 04-07 0080  VOLCKER PUSHES SPENDING CUTS OVER TRADE BILL WASHINGTON, April 7 - Federal Reserve Board Chairman Paul Volcker said reducing the federal budget deficit was a more important goal for Congress than drafting trade legislation. "Reduce the budget deficit," Volcker responded when asked by a member of the Senate Banking Committee about trade legislation priorities. "If you don't deal with the budget deficit, everything else you do is going to be counterproductive," he said. Reuter  7-APR-1987 11:05:35.43 M f1154reute u f BC-cbt-metals-registns 04-07 0032  CBT METALS REGISTRATIONS - APRIL 7 AS OF 0945 CDT SILVER 1,000 OZ 13,943 UNC 5,000 OZ 203 UNC GOLD 100 OZ 42 UNC 3-KG 42 UNC 1-KG 658 UNC Reuter  7-APR-1987 11:05:44.09 GQ f1155reute u f BC-MIDWEST-GRAIN-FUTURES 04-07 0061  MIDWEST GRAIN FUTURES 11:01 EDT KANSAS CITY WHEAT MAY7 274 1/2 UP 1/2 JUL7 263 1/2 UP 1/2 SEP7 265 1/2 UP 1/4 DEC7 270 1/2 OFF 1/4 MAR8 -- --MINNEAPOLIS WHEAT MAY7 284 3/4 UP 1 1/4 JUL7 280 1/4 OFF 1/2 SEP7 277 UP 1 DEC7 -- -- MAR8 -- --  7-APR-1987 11:05:53.61 GQ f1156reute u f BC-cbt-soybean-spreads 04-07 0074  CBT SOYBEAN SPREADS APRIL 7 - 1000 hrs cdt MONTHS LAST DIFFERENCE May/Jul 1 under 1 under Jul/Aug even even Sep/Nov 1-1/2 under 2-1/2 under May/Nov 2-1/2 over 2-1/4 over Jul/Nov 3-1/2 over 3-1/2 over Nov/Jan 6-3/4 under 6-3/4 under Aug/Sep no quote 5 over Mar/May8 no quote no quote Jan/Mar8 no quote no quote Reuter  7-APR-1987 11:06:07.52 GQ f1157reute u f BC-CBT-11-01-EDT 04-07 0105  CBT 11:01 EDT WHEAT MAY7 288 UP 1 3/4 JUL7 273 UP 1/4 SEP7 273 1/2 UP 1/2 DEC7 279 UP 1 MAR8 278 1/4 UP 1 CORN MAY7 159 3/4 UP 1 1/2 JUL7 163 UP 1 1/4 SEP7 167 1/2 UP 1 1/4 DEC7 176 UP 1 1/4 MAR8 183 UP 1 1/4 OATS MAY7 150 UNCH JUL7 138 OFF 1/2 SEP7 128 1/4 UNCH DEC7 134 1/2 UP 1/2 MAR8 UNTRD BEANS MAY7 501 1/4 UP 1 1/2 JUL7 502 1/4 UP 2 AUG7 502 1/2 UP 3 SEP7 497 UP 3 NOV7 498 3/4 UP 2 3/4 JAN8 505 1/4 UP 2 3/4 MEAL MAY7 1456 UP 3 JUL7 1457 UP 6 AUG7 1455 UP 5 SEP7 UNTRD OCT7 1455 UP 4 OIL MAY7 1554 UP 11 JUL7 1589 UP 11 AUG7 1605 UP 10 SEP7 1620 UP 9 OCT7 1635 UP 10  7-APR-1987 11:06:13.18 C G f1158reute u f BC-cbt-registrations 04-07 0063  CBT REGISTRATIONS - APRIL 7 AS OF 0945 CDT SOYOIL 7,099 UNC SILVER 1,000 OZ 13,943 UNC 5,000 OZ 203 UNC GOLD 100 OZ 42 UNC 3-KG 42 UNC 1-KG 658 UNC CERTIFICATES OUTSTANDING SOYBEAN MEAL 0 UNC CENTRAL 0 MID-SOUTH 0 MISSOURI 0 EASTERN IOWA 0 NORTHEAST 0 NORTHERN 0 Reuter  7-APR-1987 11:06:16.90 L f1159reute u f BC-SIOUX-FALLS-CATTLE-UP 04-07 0044  SIOUX FALLS CATTLE UP 0.50 DLR - USDA sioux falls, april 7 - slaughter cattle rose 0.50 dlr in active trade, the usda said. stees - choice 2-4 1100-1400 lbs 66.00-67.00. heifers - load choice 3 near 1225 lbs 66.50. choice 2-4 950-1125 lbs 64.00-66.00. Reuter  7-APR-1987 11:06:31.29 GQ f1161reute u f BC-CME-11-01--EDT 04-07 0053  CME 11:01 EDT L-CATTLE APR7 69.57 UP 0.17 JUN7 64.92 OFF 0.10 AUG7 60.75 OFF 0.12 F-CATTLE APR7 69.00 OFF 0.10 MAY7 68.05 OFF 0.17 AUG7 66.50 UP 0.10 HOGS APR7 50.10 UP 0.28 JUN7 48.75 UP 0.28 JUL7 47.25 UP 0.38 BELLIES MAY7 66.15 OFF 0.25 JUL7 64.70 OFF 0.15 AUG7 61.65 UP 0.05 FEB8 56.00 UP 0.40  7-APR-1987 11:06:39.38 GQ f1162reute u f BC-cbt-soyoil-report 04-07 0060  CBT SOYBEAN OIL SPREADS APRIL 7 - 1000 hrs cdt MONTHS LAST DIFFERENCE May/Jul 0.34 under 0.35 under Jul/Aug 0.16 under 0.17 under Jul/Dec 0.78 under 0.77 under Aug/Sep 0.16 under 0.16 under May/Aug no quote 0.52 under May/Dec no quote 1.12 under Dec/Jan no quote no quote Reuter  7-APR-1987 11:06:45.97 MQ f1163reute u f BC-NY-COMEX-ALUMINUM-11- 04-07 0040  NY COMEX ALUMINUM 11:01 LAST CHANGE APR7 UNTRD MAY7 6150 UNCH JUN7 UNTRD JUL7 UNTRD SEP7 UNTRD DEC7 UNTRD JAN8 UNTRD FEB8 UNTRD MAR8 UNTRD MAY8 UNTRD JUL8 UNTRD SEP8 UNTRD DEC8 UNTRD JAN9 UNTRD  7-APR-1987 11:06:50.37 LQ f1164reute u f BC-FLASH-SIOUX-FALLS-HOG 04-07 0027  FLASH SIOUX FALLS HOGS UP 1.75 DLR - USDA sioux falls, april 7 - barrows and gilts rose 1.75 dlr in active trade, the usda said. us 1-3 220-250 lbs 51.75-52.00. Reuter  7-APR-1987 11:06:58.55 MQ CQ f1165reute u f BC-NY-COMEX-GOLD-11-01 04-07 0036  NY COMEX GOLD 11:01 APR7 4199 UP 14 MAY7 UNTRD JUN7 4237 UP 11 AUG7 4288 UP 15 OCT7 4327 UP 10 DEC7 4370 UP 9 FEB8 4415 UP 8 APR8 UNTRD JUN8 UNTRD AUG8 UNTRD OCT8 UNTRD DEC8 UNTRD FEB9 UNTRD  7-APR-1987 11:07:09.81 FQ f1167reute u f BC-NASDAQ-COMP-11-01 04-07 0007  NASDAQ COMP 11:01 COMP 437.49 OFF 0.29  7-APR-1987 11:07:18.11 GQ f1168reute u f BC-cbt-soymeal-spreads 04-07 0052  CBT SOYBEAN MEAL SPREADS APRIL 7 - 1000 hrs cdt MONTHS LAST DIFFERENCE May/Jul 0.10 over 0.10 over Jul/Aug no quote even Jul/Dec no quote 1.40 under Oct/Dec no quote 1.40 under Dec/Jan no quote 0.60 under Oct/Jan no quote 2.00 under Reuter  7-APR-1987 11:07:22.81 C G L M T RM f1169reute b f BC-LONDON-DOLLAR-FLUCTUA 04-07 0027  LONDON DOLLAR FLUCTUATIONS 1600 - APRIL 7 STG 1.6177/82 DMK 1.8235/45 SFR 1.5120/30 DFL 2.0578/88 FFR 6.0650/0700 YEN 145.20/30 LIT 1299/1301 BFC 37.76/81  7-APR-1987 11:07:28.63 G f1170reute r f BC-PRSFRENCH-GRAINS---AP 04-07 0069  PRSFRENCH GRAINS - APR 07 Prices in ff per 100 kilos. Cumulative monthly supplements of 17.40 ff per ton to be added from august 1986 onwards. Soft wheat- dlvd ROUEN APR 130.50 PAID, MAY 130.25 PAID. LA PALLICE APR/MAY 129.50 BYR. DUNKIRK APR 129.50 PAID. SOFT WHEAT - EX REGION EURE ET LOIR APR/OCT 126 PAID. CHALONS/MODANE APR/JUNE 122 BYR. SOFT WHEAT - FOB REGION METZ APR/JUNE 127 BYR/127.50 SLR. Feed barley - dlvd ROUEN APR/MAY 118.50 BYR/119 SLR. FEED BARLEY - EX REGION EURE ET LOIR APR/MAY 114.50 SLR. CHALONS/MODANE APR/MAY 112.50 BYR. FEED BARLEY - FOB REGION METZ APR/MAY 116 BYR. CORN - DLVD BAYONNE APR/JUNE 132.50 BYR. BORDEAUX APR/JUNE 134 BYR. TONNAY/CHARENTES APR/JUNE 131.75 BYR. CORN - EX REGION EURE ET LOIR 126 TO 127 NOMINAL. MARNE APR/JUNE 127 NOMINAL. CORN - FOB REGION METZ APR/JUNE 132.50 BYR. CREIL APR/MAY/JUNE 128 PAID, JUL/AUG/SEP 129/129.50 PAID. REUTER  7-APR-1987 11:07:45.56 acq usa F f1172reute d f BC-AMERICAN-SPORTS-ADVIS 04-07 0071  AMERICAN SPORTS ADVISORS <PIKS> TO LIQUIDATE CARFLE PLACE, N.Y., April 7 - American sports Advisors Inc said it has agreed to sell its sports handicapping and publication business to Professor Enterprises for about 1,650,000 dlrs and intends to liquidate after closing. The transaction is subject to shareholder approval. Professor is owned by American Sports president Edward C. Horowitz and Mike Warren, it said. Reuter  7-APR-1987 11:08:01.92 C T f1173reute u f BC-ny-coffee-opg-report 04-07 0106  N.Y. COFFEE FUTURES SLIGHTLY HIGHER, THIN EARLY NEW YORK, April 7 - N.Y. coffee futures were marginally firmer midmorning, trading in ranges of no more than 0.50 cent. May was up 0.16 cent at 102.20 cents at 1052 hrs EST, in a range of 102.00 to 102.50 cents. July was up 0.15 at 104.15 cents in a 35-point range. Traders said reports that the U.S. State Department does not forsee a meeting with Brazil prior to the next International Coffee Organization session in September did not affect the market as the news was expected. Operators are watching the cash market for indications of roaster interest or producer selling. Reuter  7-APR-1987 11:08:12.19 uk thatcher V f1174reute u f AM-BRITAIN 1STLD 04-07 0124  THATCHER FIRM AS PRESSURE MOUNTS FOR ELECTIONS By Colin McIntyre, Reuters LONDON, April 7 - As pressure mounted on British Prime Minister Margaret Thatcher to call a June election, she said today that the decision on when to go to the county was hers and hers alone. She was speaking to parliament after senior members of the ruling Conservative Party urged her to call elections due in June 1988 a year early in the wake of two more opinion polls giving her party a commanding lead. Asked by a Conservative back-bencher for an assurance that the decision was hers alone, and did not depend on "media hype, pressure and speculation," she replied: "The date of the next election will be decided by Downing Street, not Fleet Street." Downing Street is the Prime Minister's official residence, Fleet Street the traditional home of the British national press. A Harris poll for the breakfast-time program TV-AM gave the Tories 43 pct of the vote, representing a majority of 132 seats in parliament, their biggest lead since the party's landslide victory in the 1983 elections. In The Times of London, a MORI poll gave the Tories a 92 seat majority. It was the sixth poll to show the ruling party with a big lead over the opposition Labour Party and the fast-improving centrist Alliance. Leading the chorus urging Thatcher to go to the polls in June, Sir Marcus Fox, vice-chairman of the influential 1922 committee of Conservative back-benchers, said: "I have always felt that it would be June, and this reinforces my view. "I always thought June was right. We have got most of our legislation through and to go beyond that I do not think would be in the national interest." Another Tory back-bencher, Anthony Beaumont-Dark, said: "I have always been an October man, but I think it would be good to get it out of the way now." Their comments came as government officials dismissed speculation about a snap election to coincide with local polls in May, timed to reap maximum advantage from the recent popularity surge, Thatcher's successful trip to Moscow and Labour's current popularity slump. Calls for a May poll were also prompted by Tory concern over a steady advance by the Alliance, and the possibility that if it continues it could rob the Conservatives of an overall majority in parliament. Today's MORI poll showed an Alliance gain of eight points over the past month in around 100 key marginal seats where the outcome of the next election is likely to be decided. Reuter  7-APR-1987 11:08:21.35 ukportugal F f1175reute d f BC-PORTUGUESE-AIRLINE-CO 04-07 0122  PORTUGUESE AIRLINE CONFIRMS AIRBUS A310 ORDER LONDON, April 7 - Portugal's "flag carrier" airline TAP has confirmed an order for three Airbus Industrie <AINP.PA> A310-300 passenger aircraft, British Aerospace Plc <BAEL.L> (BAe), one of four shareholders in the international Airbus consortium, said. BAe said in a statement TAP had also taken options on another two Airbus aircraft, either the existing A310-300 medium range craft or the long-range four-engined A340 which Airbus hopes to launch in 1992, depending on the airline's needs. BAe said the firm order confirmed a commitment taken by TAP in January. Details of the value of the contract, delivery dates or which engine would power the aircraft were not available. Reuter  7-APR-1987 11:08:49.00 G f1177reute r f BC-LONDON-EC-BARLEY/WHEA 04-07 0053  LONDON EC BARLEY/WHEAT CLOSING - APR 7 BARLEY WHEAT May 114.65 May 122.80 Sep 99.85 Jul 125.50 Nov 102.45 Sep 101.20 Jan 105.05 Nov 103.40 Mar 107.50 Jan 106.35 May 109.40 Mar 108.75 May 111.40 ALL VALUES SALES BARLEY 24 WHEAT 197  7-APR-1987 11:09:35.39 LQ f1178reute b f BC-FLASH-ST-PAUL-HOGS-UP 04-07 0030  FLASH ST PAUL HOGS UP 1.00/2.00 DLRS - USDA st paul, april 7 - barrow and gilt prices rose 1.00 to 2.00 dlrs in very active trade, the usda said. us 1-3 220-260 lbs 51.50-52.00. Reuter  7-APR-1987 11:09:39.16 money-fx volcker V f1179reute f f BC-******VOLCKER-SAYS-RE 04-07 0011  ******VOLCKER SAYS RESTRICTIVE MONETARY POLICY WOULD HURT INVESTMENT Blah blah blah.  7-APR-1987 11:09:46.42 M f1180reute b f BC-LME-ZINC-AFT-2ND-RING 04-07 0025  LME ZINC AFT 2ND RING 1607 - APR 7 LAST BUYER SELLER Hg Cash -- -- -- 3 Months -- 456.0 457.0  7-APR-1987 11:09:52.58 MQ f1181reute u f BC-ny-metals-est-vols 04-07 0035  N.Y. METALS FUTURES ESTIMATED VOLUMES- APRIL 7 Time 10.00 11.00 Silver 8000 13000 Copper 900 1700 Gold 4500 8000 Aluminum 0 1 Palladium ---- 190 Platinum ---- 2226 Reuter  7-APR-1987 11:10:01.59 C T f1182reute u f BC-ny-sugar-mids-report 04-07 0102  WORLD SUGAR FUTURES TUMBLE IN EARLY TRADING NEW YORK, April 7 - World sugar futures tumbled early when sell stops were triggered at 6.60 and 6.55 cents basis the spot contract, traders said. Spot May dropped 0.27 cent to 6.52 cents a lb. It opened at 6.72 cents. Trade houses worked both sides of the market, analysts said. The decline may have been a continued reaction to the market's inability yesterday to breach resistance around 6.93 cents basis May, which unsettled traders, analysts said. The market should draw support from buying tenders slated for tomorrow and Saturday, they said. Reuter  7-APR-1987 11:10:11.23 RM C M f1183reute u f BC-GOLD-AND-SILVER-CLOSE 04-07 0111  GOLD AND SILVER CLOSE OFF HIGHS IN ZURICH ZURICH, April 7 - Gold and silver closed off the day's highs on profit-taking, but silver, which continued to set the pace, remained well up on yesterday's close, dealers said. Underlying speculative demand for silver remained strong but profit-taking eroded the gains, taking the metal off indicated highs at around 6.80 dlrs to close at 6.64/66 dlrs an ounce. Yesterday's close was 6.52/54 dlrs. Some investors were noted selling gold and switching into silver. This combined with profit-taking to push gold down to a close of 418.50/419.00 dlrs from its opening 421.80/422.20 and yesterday's 421.50/422.00. Dealers said it was unclear if the silver rally had peaked or if fresh gains could be achieved in New York. "A lot depends on the Dow Jones index," one dealer commented. "Further gains in stock prices would take away a lot of the support for silver and gold." Platinum ended 50 cents higher at 563/567 dlrs. REUTER  7-APR-1987 11:10:21.78 swedenusa F f1184reute d f BC-SWEDEN'S-ERICSSON-WIN 04-07 0081  SWEDEN'S ERICSSON WINS U.S. ORDER STOCKHOLM, April 7 - Sweden's Telefon AB L.M. Ericsson <ERIC.ST> said it has won its third contract from U.S. West Co Inc <WST> for digital exchange equipment to be supplied in the state of Idaho over the next five years. No financial details were available. The company said the contract provided for the replacement of more than 50 older exchanges run by <Mountain Bell>, one of U.S. West's three operating companies, with Ericsson's AXE system. Reuter  7-APR-1987 11:10:24.80 LQ CQ f1185reute b f BC-FLASH-OMAHA-HOGS-UP-1 04-07 0026  FLASH OMAHA HOGS UP 1.00 DLR - USDA omaha, april 7 - barrow and gilt prices rose 1.00 dlr in active trade, the usda said. us 1-3 220-260 lbs 51.00-51.50. Reuter  7-APR-1987 11:10:27.07 RM C f1186reute u f BC-BANK-OF-ENGLAND-STERL 04-07 0016  BANK OF ENGLAND STERLING INDEX - CLOSING APRIL 7 72.3 AFTER NOON 72.3 (PREVIOUS CLOSE 72.4 )  7-APR-1987 11:11:03.67 C G f1188reute u f BC-cbt-wheat-opg-report 04-07 0130  CBT WHEAT FUTURES OPEN FIRMER, SET NEW HIGHS CHICAGO, April 7 - CBT wheat futures opened firmer to again set new contract highs in new crop, then back off those highs to hold gains of 1-1/4 cents per bushel in May, with new crop July unchanged in light early dealings. Steady speculative buying after yesterday's strong close kept the chart picture very bullish and supported initial values, traders said. Rumors that exporters are planning to ship SRW wheat out of Toledo and/or Chicago, further tightening already low deliverable stocks, kept May firm relative to new crop months, they added. However, the rally failed to follow-through due to the lack of confirmed export sales of significant quantities of U.S. wheat so far this week, as some traders expected. Reuter  7-APR-1987 11:11:10.86 RM f1189reute u f BC-DOLLAR-CLOSES-LITTLE 04-07 0103  DOLLAR CLOSES LITTLE CHANGED IN FRANKFURT FRANKFURT, April 7 - The dollar closed virtually unchanged from yesterday's finish, but near the day's high after another extremely quiet session. With the G-5 meeting in Washington ahead of this week's IMF interim committee, traders remained reluctant to open any large positions. Towards the end of the day the dollar firmed after failing earlier to hold beneath 1.82 marks. Some dealers said Senate testimony from Fed Chairman Paul Volcker also lent support. The dollar closed at 1.8265/75 marks after opening at 1.8200/15 and closing yesterday at 1.8260/70. Volcker said that a further sizeable dollar decline could be counter-productive, and that exchange rate adjustments have been enough to narrow the U.S. Trade deficit. Such remarks in the past might have moved the dollar sharply, today they only pushed it up 20 or 30 basis points when it was already firming for technical reasons. The dollar in any case held in a narrow range today, trading early in the morning just below 1.82 marks and rising to a high of 1.8270. Dealers said they were awaiting comments after the G-5 meeting from U.S. Treasury Secretary James Baker. Looking slightly further ahead, the market is awaiting U.S. February trade data, due on April 14. Another set of disappointing figures could push the dollar below its recent 1.80-85 mark range if there have been no supportive statements from G-5 officials in Washington in the meantime, dealers said. Sterling closed slightly easier at 2.950/954 marks, after opening at 2.951/955 and closing yesterday at 2.954/958. The pound has been buoyed by expectations the ruling Conservatives will win the next U.K. Election. But dealers said sterling now looks high against the mark and room for further gains must be limited. Many dealers believe sterling will enter the EMS joint float after a U.K. Election. In this case, its ceiling could well be at or near 2.95 marks, dealers said. The yen closed at 1.2550/70 marks per 100 after closing yesterday at 1.2490/2510, and the Swiss franc firmed to 120.55/70 marks per 100 from 120.10/50. The French franc ended unchanged at 30.04/07 marks per 100. REUTER  7-APR-1987 11:11:20.04 YQ f1190reute u f BC-U.S.-POSTED-PRICES-RE 04-07 0104  U.S. POSTED PRICES REPORT (DLRS/BBL) COMPANY....EFFECTIVE DATE..W.T.I.....W.T.S...LT LOUISIANA AMOCO.......2/23/87........17.50.....16.60....17.85 ARCO........4/06/87........18.00.....17.10....18.35 CHAMPLIN....1/12/87........17.50.....17.00....17.85 CHEVRON.....2/04/87... ....17.50.....17.50....17.85 CITGO.......3/12/87........17.50.....17.50....17.85 COASTAL.....3/12/87........17.50.....16.60......... CONOCO......3/09/87........17.50.....16.60....17.85 DIAMOND.SH..3/12/87........17.50................... EXXON.......3/12/87........17.50.....16.60....17.85 MARATHON....3/12/87........17.50.....17.50....17.85 COMPANY....EFFECTIVE DATE..W.T.I.....W.T.S....LT LOUISIANA MOBIL......2/10/87.........17.50.....17.50....17.85 MURPHY.....3/12/87.........17.50.....17.50....17.85 PERMIAN....3/12/87.........17.50.....17.50....17.85 PHILLIPS...3/12/87.........17.50.....17.50......... SHELL......1/20/87.........18.11.....17.23....17.89 SUN........3/12/87.........17.50.....17.50....17.85 TEXACO*....4/01/87............................17.85 UNION......3/12/87.........17.50.....17.50....17.85 * Deleted West Texas-New Mexico postings.  7-APR-1987 11:12:10.97 C L f1193reute u f BC-live-hog-report 04-07 0127  LIVE HOG FUTURES HIGHER EARLY CHICAGO, April 7 - Live Hog futures ran up for gains of 0.57 to 0.07 cent in eary trade paced by April and June. Fairly active demand reflected strength in cash hogs and the continued discount of futures to cash. The start of fieldwork limited farmer movement of hogs to market and prompted packers to bid up for hogs. Mostly steady to firm cash pork products added to support, traders said. However, prices slipped from the highs in latest trade as commercial profit-taking developed. Some selling was also attributed to expectations that cash ham prices will be falling soon on a seasonal basis, they said. Thomson and RBH bought while Packers Trading and Refco sold. Stotler spread long June/short April, they added. Reuter  7-APR-1987 11:12:32.96 GQ f1194reute u f BC-MIDWEST-GRAIN-FUTURES 04-07 0060  MIDWEST GRAIN FUTURES 11:10 EDT KANSAS CITY WHEAT MAY7 274 1/2 UP 1/2 JUL7 263 1/2 UP 1/2 SEP7 265 1/2 UP 1/4 DEC7 270 1/2 OFF 1/4 MAR8 -- --MINNEAPOLIS WHEAT MAY7 285 UP 1 1/2 JUL7 280 3/4 UNCH SEP7 277 UP 1 DEC7 -- -- MAR8 -- --  7-APR-1987 11:12:47.66 RM f1196reute u f BC-LONDON-LIFFE-YEN-CLOS 04-07 0024  LONDON LIFFE YEN CLOSE 1610 - APR 7 MTH LAST HIGH LOW PR.SET Jun 6918 6928 6918 6878 Sep 6964 6964 6962 6923  7-APR-1987 11:12:56.28 RM f1197reute u f BC-LONDON-LIFFE-EURODOLL 04-07 0064  LONDON LIFFE EURODOLLAR CLOSE 1610 - APR 7 MTH LAST HIGH LOW PR.SET Jun 9333 9334 9330 9336 Sep 9326 9328 9325 9330 Dec 9318 9319 9317 9322 Mar 9304 9305 9300 9308 Jun 9284 9285 9283 9288 Sep 9262 9262 9260 9267 Dec 9240 9240 9238 9245 Mar 9219 9219 9218 9224  7-APR-1987 11:13:07.76 GQ f1198reute u f BC-CBT-11-10-EDT 04-07 0108  CBT 11:10 EDT WHEAT MAY7 287 1/2 UP 1 1/4 JUL7 273 UP 1/4 SEP7 273 1/2 UP 1/2 DEC7 279 1/4 UP 1 1/4 MAR8 278 1/4 UP 1 CORN MAY7 160 UP 1 3/4 JUL7 163 1/2 UP 1 3/4 SEP7 168 1/4 UP 2 DEC7 176 3/4 UP 2 MAR8 183 1/4 UP 1 1/2 OATS MAY7 149 1/2 OFF 1/2 JUL7 138 OFF 1/2 SEP7 128 3/4 UP 1/2 DEC7 134 UNCH MAR8 UNTRD BEANS MAY7 501 1/4 UP 1 1/2 JUL7 502 1/4 UP 2 AUG7 502 1/2 UP 3 SEP7 497 1/2 UP 3 1/2 NOV7 499 UP 3 JAN8 505 1/2 UP 3 MEAL MAY7 1455 UP 2 JUL7 1455 UP 4 AUG7 1455 UP 5 SEP7 1458 UP 7 OCT7 1457 UP 6 OIL MAY7 1556 UP 13 JUL7 1591 UP 13 AUG7 1608 UP 13 SEP7 1623 UP 12 OCT7 1635 UP 10  7-APR-1987 11:13:21.62 F f1200reute f f BC-******HONEYWELL-BULL 04-07 0013  ******HONEYWELL BULL INTRODUCES HIGH PERFORMANCE COMPUTERS FOR MEDIUM, LARGE FIRMS Blah blah blah.  7-APR-1987 11:13:32.95 C L f1201reute u f BC-PORK-BELLY-FUTURES-ST 04-07 0128  PORK BELLY FUTURES START HIGHER, THEN EASE CHICAGO, April 7 - Pork belly (bacon) futures ran up for gains of 0.55 to 0.30 cent at the start and then eased to trade 0.15 cent lower to 0.15 higher in early dealings. Active local carryover demand and mixed commission house buying lifted futures at the start. Higher cash hog markets on light runs and spillover from other meat pits prompted support, traders said. However, locals turned sellers along with Saul Stone and Paine Webber and prices turned mostly lower. Trimming of gains in other pits and expectations of possibly negative out of town storage report this afternoon weighed on the market. Guesses on the report ranged from in 1.0 to 2.25 mln lbs with most indications on the high side, they noted. Reuter  7-APR-1987 11:13:39.69 L f1202reute u f BC-miss-direct-hogs 04-07 0079  MISSOURI DIRECT HOGS UP 1.00-1.50 DLR - USDA JEFFERSON CITY, April 7 - Barrow and gilts in the east and west were 1.00 to 1.50 dlr higher than monday's midsession. Top 50.50 dlrs per cwt. EAST WEST U.S. 1-2 210-250 LB 49.50-50.50 49.50-50.50 U.S. 1-3 210-250 LB 49.50-50.50 49.50-50.50 U.S. 1-2 200-210 LB 48.50-49.50 48.50-49.50 SOWS - steady/up 2.00 dlrs. Top 46.00 dlrs. US 1-3 300-500 lb 42.00-43.00, over 500 lb 43.00-46.00 dlrs. Reuter  7-APR-1987 11:14:21.32 RM f1205reute u f BC-LOMDON-LIFFE-STERLING 04-07 0064  LOMDON LIFFE STERLING-DP CLOSE 1612 - APR 7 MTH LAST HIGH LOW PR.SET Jun 9071 9079 9070 9078 Sep 9096 9104 9096 9104 Dec 9051 9056 9051 9051 Mar 9089 9097 9089 9098 Jun 9076 9076 9076 9083 Sep 9055 9055 9055 9061 Dec 9055 9055 9055 9061 Mar 9027 9027 9027 9030  7-APR-1987 11:14:26.83 RM f1206reute u f BC-LONDON-LIFFE-STERLING 04-07 0038  LONDON LIFFE STERLING CLOSE 1612 - APR 7 MTH LAST HIGH LOW PR.SET Jun 16100 16100 16100 16085 Sep --- --- --- 15985 Dec --- --- --- 15885 Mar --- --- --- 15784  7-APR-1987 11:14:36.23 money-fx usa volcker V RM f1207reute b f BC-VOLCKER-SEES-TIGHT-PO 04-07 0076  VOLCKER SEES TIGHT POLICY HURTING INVESTMENT WASHINGTON, April 7 - Federal Reserve Board Chairman Paul Volcker said a restrictive monetary policy would be damaging to investment and that a better course would be to restrain spending. "A restrictive monetary policy would hit investment. You don't want to put interest rates up unless you have to," Volcker told the Senate Banking Committee. "That is not a constructive way to proceed," he said. Volcker said that given a choice between squeezing the budget deficit or squeezing investment, he would favor squeezing the budget deficit. In response to a question about banks, Volcker said he would be pleased if Congress decided to give banks a tax writeoff as an incentive for them to take greater reserves against loans to debtor countries. "If you give a tax writeoff for reserving against loans, then we will see more reserving and that would make me happy," Volcker told Committee Chairman Sen William Proxmire (D-Wisc). Reuter  7-APR-1987 11:14:55.96 usa F f1209reute d f BC-REUTERS-<RtrSY>-UNIT 04-07 0108  REUTERS <RtrSY> UNIT COMPLETES TRADING SYSTEM NEW YORK, April - Rich Inc, a wholly-owned subsidiary of Reuters Holdings PLC of London, said it completed installation of a 20 mln dlr trading system for Merrill Lynch and Co Inc <MER> in New York. The company said its Composite Information System was designed and installed for Merrill Lynch in the investment firm's World Financial Center offices in downtown Manhattan. The system, which offers access to financial news, in-house computers, commercial television and other services, includes 479 equity positions, 614 in the debt area and 152 municipal markets positions, the company said. Reuter  7-APR-1987 11:15:52.09 RM f1211reute u f BC-LONDON-LIFFE-D.MARK-C 04-07 0025  LONDON LIFFE D.MARK CLOSE 1614 - APR 7 MTH LAST HIGH LOW PR.SET Jun --- --- --- 5507 Sep --- --- --- 4885  7-APR-1987 11:17:29.61 GQ f1215reute u f BC-CME-11-15--EDT 04-07 0053  CME 11:15 EDT L-CATTLE APR7 69.60 UP 0.20 JUN7 64.97 OFF 0.05 AUG7 60.75 OFF 0.12 F-CATTLE APR7 69.00 OFF 0.10 MAY7 68.12 OFF 0.10 AUG7 66.50 UP 0.10 HOGS APR7 50.12 UP 0.30 JUN7 48.80 UP 0.33 JUL7 47.30 UP 0.43 BELLIES MAY7 66.25 OFF 0.15 JUL7 64.77 OFF 0.08 AUG7 61.75 UP 0.15 FEB8 56.10 UP 0.50  7-APR-1987 11:18:01.28 RM f1216reute u f BC-LONDON-LIFFE-S.FRANC 04-07 0025  LONDON LIFFE S.FRANC CLOSE 1616 - APR 7 MTH LAST HIGH LOW PR.SET Jun --- --- --- 6627 Sep --- --- --- 6041  7-APR-1987 11:18:17.62 RM f1217reute r f BC-stockholm-exchanges-c 04-07 0049  Stockholm exchanges clsg apr 6 stg 10.2807 10.2872 us 6.3540 6.3560 dmk 348.3170 348.4840 ffr 104.6787 104.7981 sfr 419.8216 420.2314 bfr con 16.8139 16.8281 dfl 308.7313 308.9186 dkr 92.4016 92.4643 nkr 93.1262 93.1965 lit 0.4889 0.4893 aus sch 49.5438 49.5788 can 4.8611 4.8645 yen 4.3730 4.3774  7-APR-1987 11:18:33.41 F f1219reute u f BC-HOSPITAL-CORP-OF-AMER 04-07 0017  HOSPITAL CORP OF AMERICA, 100,000 AT 38-1/2, UNCH, ALL BUYSIDE BY ABD SECURITIES ON THE BOSTON EXCHANGE  7-APR-1987 11:18:44.72 C G f1220reute u f BC-cbt-s'bean-opg-report 04-07 0102  CBT SOYBEAN FUTURES OPEN SLIGHTLY FIRMER CHICAGO, April 7 - CBT soybean futures opened steady, with new crop slightly firmer, then rallied further to hold gains of one cent to three cents per bushel higher in light early dealings. A firmer Gulf soybean basis this morning, strength in corn futures and delays in the Brazilian soybean harvest supported soybean futures, despite a disappointing drop in the weekly soybean export figure yesterday afternoon, traders said. A local professional house and a local house were the featured buyers of July, with sellers scattered and small-lot, pit brokers said. Reuter  7-APR-1987 11:18:57.30 RM C G L M T f1221reute u f BC-DOLLAR-REMAINS-IN-NAR 04-07 0096  DOLLAR REMAINS IN NARROW RANGE IN QUIET ZURICH ZURICH, April 7 - The dollar remained confined in the same narrow range in quiet trading, benefitting only slightly from comments by Fed Chairman Paul Volcker that further sizeable dollar losses would be counter-productive, dealers said. It finished at 1.5140/50 Swiss francs after opening at 1.5128/38 and closing yesterday at 1.5185/95. "Volcker's remarks produced some buying interest but most people were still waiting to see what comes out of the finance ministers' meetings in Washington," one dealer said. Other currencies lost ground against the Swiss franc. Sterling eased after advancing sharply yesterday on expectations of an early U.K. General election. The pound ended at 2.4469/4501 francs compared with 2.4547/4578 yesterday. The mark slipped to 82.83/93 centimes from 83.11/21 and the French franc dipped to 24.90/94 from 24.98/25.02. REUTER  7-APR-1987 11:19:14.60 M f1223reute b f BC-LME-COPPER-AFT-2ND-RI 04-07 0026  LME COPPER AFT 2ND RING 1617 - APR 7 LAST BUYER SELLER Std Cash -- -- -- 3 Months -- -- --  7-APR-1987 11:19:21.24 TQ f1224reute u f BC-ny-comms-est-vols 04-07 0053  N.Y. COMMODITY FUTURES ESTIMATED VOLUMES - APRIL 7 Time 11.00 Coffee 825 Cocoa 756 Sugar 11 7040 Sugar 14 16 Orange ---- Cotton ---- Sugar 11 options calls 364 Sugar 11 options puts 115 Reuter  7-APR-1987 11:19:24.46 M f1225reute b f BC-LME-COPPER-AFT-2ND-RI 04-07 0026  LME COPPER AFT 2ND RING 1617 - APR 7 LAST BUYER SELLER Hg Cash 909.5 909.5 910.0 3 Months 879.0 879.0 879.5  7-APR-1987 11:19:32.58 L f1226reute u f BC-ST-LOUIS-CATTLE-STEAD 04-07 0054  ST LOUIS CATTLE STEADY/UP 0.50 DLR - USDA st louis, april 7 - slaughter steers were firm to 0.50 dlr higher in active trade and heifers fully steady amid limited supply, the usda said. steers - choice 2-4 975-1250 lbs 64.00-65.50, package 2-3 1230 lbs 66.00. heifers - few lots choice 2-4 900-1075 lbs 61.50-63.00. Reuter  7-APR-1987 11:19:42.99 uk liffe RM f1227reute u f BC-LIFFE,-AFTER-RECORD-V 04-07 0111  LIFFE, AFTER RECORD VOLUMES, SEES MORE GROWTH LONDON, April 7 - The records in turnover set by the London International Financial Futures Exchange (LIFFE) in March could be surpassed in the coming months, Liffe Chief Executive Michael Jenkins said. Last month, Liffe saw record monthly futures volume at 1.15 mln lots, and record monthly options volume at 97,700. Total Liffe volume in first quarter 1987 rose to 2.8 mln contracts, or 89 pct up on the same 1986 period. Long gilt turnover in first quarter 1987 was 300 pct up on the year-ago period at 1.63 mln lots versus 409,500. But T-bond volume fell by 38 pct to 244,500 in first three months 1987. Jenkins told Reuters the higher volumes for gilts reflected in part the volatility in the U.K. Markets in recent months, while the falloff in T-bonds was an indication of the relative stability of U.S. Credit markets. Jenkins said he saw room for the whole financial futures sector to grow further in the coming months. In particular, FT- SE 100 futures had great scope for expansion, and turnover in them should be much higher by end 1987. FT-SE futures volume was 62,700 in first quarter 1987, an increase of 124 pct over the 28,000 contracts recorded in the same months of 1986. Institutions here had been slow to find out about the use of stock exchange futures, but they would now learn more, Jenkins predicted. Commenting on the difference in popularity between gilts and bonds, Jenkins said Liffe had designed the widest possible variety of contracts so that at any given time, at least one sector would be volatile enough to attract trading. The current situation of U.S. Markets being steady, and U.K. Ones changeable, might alter completely in coming months. A further boost to Liffe's volume and attractiveness should come with the introduction of yen bond futures, he added. REUTER  7-APR-1987 11:20:07.42 earn usa F f1230reute r f BC-NEW-BEDFORD-INSTITUTI 04-07 0025  NEW BEDFORD INSTITUTION FOR SAVINGS <NBBS> YEAR NEW BEDFORD, Mass., April 7 - Net 12.3 mln vs 6,438,000 NOTE: Company went public in March. Reuter  7-APR-1987 11:20:16.05 usa F f1231reute b f BC-HONEYWELL-BULL-UNVEIL 04-07 0077  HONEYWELL BULL UNVEILS FIVE NEW COMPUTERS MINNEAPOLIS, April 7 - Honeywell Bull, a 1.9 billion dlr computer systems company formed March 27 by Honeywell Inc <HON>, Compagnie des Machines Bull of France and NEC Corp of Japan, said it introduced a line of high-performance computers for medium and large companies. The company also unveiled software for the new systems to facilitate patient care in hospitals and control inventory and production in factories. Honeywell Bull said its new line includes five models in the DPS 7000 family of 32-bit virtual memory systems that support as many as 600 terminals and perform between 9,000 and 52,000 transactions an hour. Prices for the systems will range from 127,000 dlrs to more than 1.0 mln dlrs. It said two integrated, modular software packages introduced are specifically for operation on DPS 7000 computers. Reuter  7-APR-1987 11:20:25.56 usa F f1232reute r f BC-OXFORD-ENERGY-CO-<OEN 04-07 0095  OXFORD ENERGY CO <OEN> TO BUILD ENRGY PLANT NEW YORK , APri 7 - The Oxford Energy Co said it received final approval from the Connecticut Department of Public Utiliy Control of a power contract for the company's tire burning energy plant to be located in Sterling, Conn. The Oxford facility has an estimated total cost of approximately 70 mln dlrs, and is expected to start construction during the second half of 1987. Construction of the project is subject to the receipt of various state and local permits, the company said, and the arrangement of financing. Under the terms of the order, issued by the Connecticut Department of Publc Utility Control, Connecticut Light and Power Co will be required to purchase the output of the Sterling facility under a 25-year power purchase aagreemnt at prices fixed by the contract formulas, the company said. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-015.sgm000066400000000000000000002301411154025176300231420ustar00rootroot00000000000000 8-APR-1987 10:08:12.27 acq usa F f1041reute d f BC-PAXAR-CORP-<PAKS>-MAK 04-08 0032  PAXAR CORP <PAKS> MAKES ACQUISITION PEARL RIVER, N.Y., April 8 - Paxar Corp said it has acquired Thermo-Print GmbH of Lohn, West Germany, a distributor of Paxar products, for undisclosed terms. Reuter  8-APR-1987 10:08:15.55 earn canada E F f1042reute d f BC-<mark's-work-wearhous 04-08 0027  <MARK'S WORK WEARHOUSE LTD> YEAR JAN 31 NET Calgary, Alberta, April 8 - Shr 10 cts vs 32 cts Net 975,000 vs 3,145,000 Sales 159.1 mln vs 147.3 mln Reuter  8-APR-1987 10:08:21.25 usa F f1043reute d f BC-KEY-TRONIC-<KTCC>-GET 04-08 0068  KEY TRONIC <KTCC> GETS NEW BUSINESS SPOKANE, Wash., April 8 - Key Tronic corp said it has received contracts to provide seven original equipment manufacturers with which it has not done business recently with over 300,000 computer keyboards for delivery within the next 12 months. The company said "The new contracts represent an annual increase of approximately 25 pct in unit volume over last year." Reuter  8-APR-1987 10:08:26.93 acq canada E F Y f1044reute d f BC-canadian-bashaw,-ersk 04-08 0061  CANADIAN BASHAW, ERSKINE RESOURCES TO MERGE Edmonton, Alberta, April 8 - Canadian Bashaw Leduc Oil and Gas Ltd said it agreed to merge with Erskine Resources Ltd. Terms were not disclosed. Ownership of the combined company with 18.8 pct for the current shareholders of Canadian Bashaw and 81.2 pct to the current shareholders of Erskine, the companies said. Reuter  8-APR-1987 10:11:16.60 earn usa F f1055reute d f BC-ENTOURAGE-<ENTG>-HAS 04-08 0097  ENTOURAGE <ENTG> HAS FIRST QUARTER LOSS HOUSTON, April 8 - Entourage International Inc said it had a first quarter loss of 104,357 dlrs, after incurring 70,000 dlrs in costs for an internal audit, a report for shareholders and proxy soliciation and 24,000 dlrs in startup expenses for opening London offices. The company went public during 1986. Entourage also said it has started marketing a solid perfume packaged in a lipstick tube called "Amadeus," retailing at 15 dlrs. The company also said it has acquired North Country Media Group, a video productions company. Reuter  8-APR-1987 10:11:26.26 earn canada E F f1056reute d f BC-<mr.-jax-fashions-inc 04-08 0028  <MR. JAX FASHIONS INC> YEAR FEB 28 NET Vancouver, British Columbia, April 8 - Shr 58 cts vs 29 cts Net 3,141,000 vs 1,440,000 Sales 24.7 mln vs 13.0 mln Reuter  8-APR-1987 10:11:53.50 usa F f1060reute d f BC-DIGITAL-COMMUNICATION 04-08 0058  DIGITAL COMMUNICATIONS<DCAI> NAMES NEW PRESIDENT ALPHARETTA, Ga., April 8 - Digital Communications Associates Inc said its board has named James Ottinger president and chief operating officer. The company said Ottinger replaces Bertil Nordin as president. Nordin will become chairman and chief executive officer, Digital Communications added. Reuter  8-APR-1987 10:11:58.32 usa F f1061reute d f BC-DIGITAL-<DEC>-IN-TERA 04-08 0054  DIGITAL <DEC> IN TERADYNE <TER> LICENSING PACT BOSTON, April 8 - Teradyne Inc said Digital Equipment Corp signed a multi-license purchase agreement valed at over one mln dlrs for Teradyne's Lasar Version Six Simulation System. The company said the agreement includes the option for futrue lasar purchases by Digital. Reuter  8-APR-1987 10:12:18.53 usa F f1064reute d f BC-HOME-INTENSIVE-<KDNY> 04-08 0032  HOME INTENSIVE <KDNY> EXTENDS DIALYSIS AT HOME NORTH MIAMI BEACH, Fla., April 8 - Home Intensive Care Inc said it has opened a Dialysis at Home office in Philadelphia, its 12th nationwide. Reuter  8-APR-1987 10:14:36.24 canada tose E F f1071reute u f BC-bache-canada-buys 04-08 0113  BACHE CANADA BUYS TORONTO STOCK EXCHANGE SEAT TORONTO, April 8 - Bache Securities Inc, 80 pct owned by Prudential Bache Securities Inc, said it acquired its third Toronto Stock Exchange seat for 301,000 Canadian dlrs. The company said the price was the highest yet paid for an exchange seat. A Toronto Stock Exchange spokesman said an exchange seat last sold for 195,000 dlrs in March, which was acquired by <Toronto Dominion Bank>. Bache Securities said it needed a third exchange seat as part of an extensive plan to provide an enhanced level of service to clients. The seat will be used to further build its professional trading area, the investment dealer said. Reuter  8-APR-1987 10:17:29.78 earn F f1081reute f f BC-******F.W.-WOOLWORTH 04-08 0012  ******F.W. WOOLWORTH CO SAYS IT HIKES DIVIDEND TO 33 CTS A SHARE FROM 28 CTS Blah blah blah.  8-APR-1987 10:19:42.41 earn usa F f1088reute b f BC-F.W.-WOOLWORTH-CO-<Z> 04-08 0021  F.W. WOOLWORTH CO <Z> HIKES DIVIDEND NEW YORK, April 8 - Qtly div 33 cts vs 28 cts prior Pay June 1 Record May 1 Reuter  8-APR-1987 10:20:02.86 sugar netherlands C T f1089reute u f BC-DUTCH-SUGAR-BEET-PLAN 04-08 0103  DUTCH SUGAR BEET PLANTING HALF FINISHED ROTTERDAM, April 8 - Roughly half of this year's expected 130,000 hectare Dutch sugar beet crop is already in the ground, a spokesman for Suiker Unie, the largest sugar processor in the Netherlands, told Reuters. Conditions are generally good and the average sowing date for the crop is expected to be around April 11, against April 23 last year, and a 10-year average of April 14, the spokesman added. "It is far too early yet to say what kind of output we can expect when it comes to harvest in September, but at least the crop is off to a very good start," he said. Last year, the Netherlands planted a record 137,600 hectares of sugar beet and produced a record 1.2 mln tonnes of white sugar, substantially more than the country's combined "A" and "B" quota of 872,000 tonnes. This year, however, a self-imposed quota system has been introduced with the aim of cutting plantings to 130,000 hectares and reducing white sugar output to around 915,000 tonnes to minimise the amount of non-quota "C" sugar produced. Only farmers with a record of growing suger beet have been allotted quotas. This is expected to prevent the area being boosted by dairy or cereal farmers moving into sugar. Reuter  8-APR-1987 10:20:14.11 uk F f1090reute d f BC-U.K.-EXPECTS-SUBSTANT 04-08 0121  U.K. EXPECTS SUBSTANTIAL DEMAND FOR ROLLS SHARES LONDON, April 8 - Demand for shares in state-owned engine maker <Rolls Royce Plc> is expected to be substantial when the government privatises it at the end of April, Christopher Clark of the group's bankers Samuel Montagu and Sons Ltd said. He told a press conference after the release of an initial prospectus for the float that the issue would be offered to U.K. Institutions, company employees and the general public. As in previous flotations, clawback arrangements would be made if public subscriptions exceeded initial allocations. He declined to say how the shares would be allocated beyond saying that a "significant proportion" would go to institutions. A decision on what percentage would go to each sector would be made shortly before the sale price was announced on April 28. Minimum subscription would be for 400 shares with payment in two tranches, again a method broadly in line with previous privatisations. Chairman Sir Francis Tombs denied suggestions that Rolls was a stock that should be left to the institutions. He noted that although the aircraft industry was cyclical, Rolls had several operations -- such as spare parts and military equipment -- that evened out the swings. Rolls' 1986 research and development expenditure in 1986 was 255 mln stg and could be expected in the future to vary according to changes in turnover. He noted that net research and development expenditure was written off in the year it occurred, a policy that received "inadequate recognition in one or two of the more extravagant forecasts of future profits." He made no forecast himself. In 1986, Rolls reported that pretax profit rose 48 pct to 120 mln stg on turnover 12 pct higher at 1.8 billion. Reuter  8-APR-1987 10:25:01.82 netherlands nyse F f1109reute r f BC-NV-PHILIPS-SHARES-GET 04-08 0097  NV PHILIPS SHARES GET NYSE QUOTE FROM APRIL 14 EINDHOVEN, NETHERLANDS, APRIL 8 - NV Philips Gloeilampenfabrieken <PGLO.AS> shares are due to start trading on the New York Stock Exchange on April 14, Philips chairman Cor van der Klugt told the annual shareholders meeting. In March, the Dutch electronics group announced it would end its current over the counter listing on the New York NASDAQ system and move to the NYSE. Philips said the "big board" listing in New York is expected to boost its profile in the U.S., Where 10 pct of all outstanding Philips shares are held. Reuter  8-APR-1987 10:25:54.05 earn F f1110reute f f BC-******J.P.-MORGAN-AND 04-08 0010  ******J.P. MORGAN AND CO INC 1ST QTR SHR 1.22 DLRS VS 1.28 DLRS Blah blah blah.  8-APR-1987 10:28:08.79 sugar belgiumfrancewest-germanyspaindenmark ec T C f1117reute b f BC-EC-COMMISSION-DETAILS 04-08 0069  EC COMMISSION DETAILS SUGAR TENDER BRUSSELS, April 8 - The EC Commission confirmed it granted export licences for 118,350 tonnes of current series white sugar at a maximum export rebate of 46.496 European Currency Units (ECUs) per 100 kilos. Out of this, traders in France received 34,500 tonnes, in the U.K. 37,800, in West-Germany 20,000, in Belgium 18,500, in Spain 5,800 and in Denmark 1,750 tonnes. REUTER  8-APR-1987 10:30:36.41 canada E Y f1126reute r f BC-pancontinental-oil-ha 04-08 0093  PANCONTINENTAL OIL HAS PRIVATE FINANCING Calgary, Alberta, April 8 - <Pancontinental Oil Ltd> said it arranged a 10 mln dlr private financing with Pemberton Houston Willoughby Bell Gouinlock Inc. The private placement consists of special warrants to purchase seven pct convertible redeemable preferred shares. The shares will be convertible for five years into common shares at five dlrs per share. The preferred shares are not redeemable for 2-1/2 years. Net proceeds will be used to increase working capital and finance exploration and development. Reuter  8-APR-1987 10:30:58.28 uk RM f1128reute b f BC-FEDERAL-REALTY-CONVER 04-08 0102  FEDERAL REALTY CONVERTIBLE INCREASED, PRICED LONDON, April 8 - Today's dollar convertible eurobond for Federal Realty Investment Trust has been increased to 100 mln dlrs from the initial 75 mln, lead manager Salomon Brothers International said. The coupon has been fixed at 5-1/4 pct compared with the indicated range of 5-1/4 to 5-1/2 pct. The conversion price has been fixed at 30-5/8 dlrs compared with last night's close in the U.S. Of 25-1/2 dlrs. This represents a premium of 20 pct. The put option after seven years was priced at 120 pct to give the investor a yield to the put of 7.53 pct. REUTER  8-APR-1987 10:34:45.43 earn west-germany F f1147reute r f BC-VOLKSWAGEN-DIVIDEND-D 04-08 0114  VOLKSWAGEN DIVIDEND DECISION DUE TOMORROW WOLFSBURG, West Germany, April 8 - Volkswagen AG <VOWG.F>, VW, is due to make a formal announcement about its 1986 dividend tomorrow after saying the 1985 level of 10 marks per ordinary share would be held, despite massive losses because of a suspected foreign currency fraud. A spokesman said VW's supervisory board will meet tomorrow to discuss the payout. A statement will be made afterwards. VW has also said disclosed profits for 1986 will reach their 1985 level, despite provisions of a possible 480 mln marks linked to the currency affair. The figure is virtually the same as the 477 mln mark 1985 parent company net profit. When VW first confirmed the currency scandal on March 10 it said the management board would propose an unchanged 10-mark dividend to the supervisory board. A dividend of 11 marks would be proposed for the company's new preference shares. Share analysts said they saw supervisory board approval of the management board proposal as virtually a formality. "Anything else would be more than a surprise," one said. Company sources said VW would have to dig into reserves to maintain the disclosed profit. Parent company reserves stood at around three billion marks at end-1985. Reuter  8-APR-1987 10:35:24.55 uk RM f1152reute b f BC-TORONTO-DOMINION-UNIT 04-08 0082  TORONTO DOMINION UNIT ISSUES AUSTRALIAN DLR BOND LONDON, April 8 - Toronto Dominion Bank, Nassau Branch is issuing a 40 mln Australian dlr eurobond due May 15, 1990 paying 14-1/2 pct and priced at 101-3/8 pct, lead manager Hambros Bank Ltd said. The non-callable bond is available in denominations of 1,000 Australian dlrs and will be listed in London. The selling concession is one pct, while management and underwriting combined will pay 1/2 pct. The payment date is May 15. REUTER  8-APR-1987 10:36:31.07 uk E f1160reute b f BC-TORONTO-DOMINION-UNIT 04-08 0081  TORONTO DOMINION UNIT ISSUES AUSTRALIAN DLR BOND LONDON, April 8 - Toronto Dominion Bank, Nassau Branch is issuing a 40 mln Australian dlr eurobond due May 15, 1990 paying 14-1/2 pct and priced at 101-3/8 pct, lead manager Hambros Bank Ltd said. The non-callable bond is available in denominations of 1,000 Australian dlrs and will be listed in London. The selling concession is one pct, while management and underwriting combined will pay 1/2 pct. The payment date is May 15. Reuter  8-APR-1987 10:37:10.01 earn usa F f1167reute r f BC-CITYTRUST-BANCORP-INC 04-08 0028  CITYTRUST BANCORP INC <CITR> 1ST QTR NET BRIDGEPORT, Conn., April 8 - Shr 1.40 dlrs vs 1.16 dlrs Net 5,776,000 vs 4,429,000 Avg shrs 4,132,828 vs 3,834,117 Reuter  8-APR-1987 10:37:30.96 acq usa F f1170reute r f BC-SOUTHMARK-<SM>-ACQUIR 04-08 0071  SOUTHMARK <SM> ACQUIRES 28 NURSING HOMES DALLAS, April 8 - Southmark Corp said it acquired 28 long-term care facilities containing for approximately 70 mln dlrs in cash. It said the facilities, which contain approximately 2,500 beds in seven western states, were bought from Don Bybee and Associates, of Salem,Ore. The acquistion brings to 57 health care facilities acquired in the last three months, the company said. Reuter  8-APR-1987 10:38:13.19 usa A RM f1175reute r f BC-HELEN-OF-TROY-<HELE> 04-08 0084  HELEN OF TROY <HELE> FILES CONVERTIBLE OFFERING NEW YORK, April 8 - Helen of Troy Corp said it filed with the Securities and Exchange Commission a registration statement covering a 20 mln dlr issue of covertible subordinated debentures due 2007. Proceeds will be used for general corporate purposes, including possible repayment of bank debt, product development and possible acquisitions, Helen of Troy said. The company named Drexel Burnham Lambert Inc as sole underwriter of the offering. Reuter  8-APR-1987 10:38:19.91 earn usa F f1176reute b f BC-/J.P.-MORGAN-AND-CO-I 04-08 0088  J.P. MORGAN AND CO INC <JPM> 1ST QTR NET NEW YORK, April 8 - shr 1.22 dlrs vs 1.28 dlrs net 226.4 mln vs 233.9 mln assets 80.45 billion vs 70.23 billion loans 35.16 billion vs 35.99 billion deposits 45.22 billion vs 39.68 billion return on assets 1.14 pct vs 1.35 pct return on common equity 18.20 pct vs 22.08 pct NOTE: 1987 qtr net was reduced by 20 mln dlrs because 1.3 billion dlrs of loans to Brazil were placed on non-accrual. loan loss provision 35 mln dlrs vs 70 mln year earlier. Reuter  8-APR-1987 10:38:37.99 earn usa F f1179reute r f BC-FIRSTBANC-CORP-OF-OHI 04-08 0021  FIRSTBANC CORP OF OHIO <FBOH> 1ST QTR NET AKRON, Ohio, April 8 - Shr 74 cts vs 67 cts Net 8,067,000 vs 7,317,000 Reuter  8-APR-1987 10:39:08.80 earn usa F f1183reute r f BC-MAYFAIR-SUPER-MARKETS 04-08 0063  MAYFAIR SUPER MARKETS INC <MYFRA> 2ND QTR NET ELIZABETH, N.J., April 8 -Qtr ends Feb 28 Shr Class A 61 cts vs 48 cts Shr Class B 59 cts vs 46 cts Net 2,358,000 vs 1,876,000 Revs 122,508,000 vs 105,871,000 Six mths Shr Class A 1.15 dlrs vs 86 cts Shr Class B 1.13 dlrs vs 84 cts Net 4,485,000 vs 3,378,000 Revs 242,453,000 vs 210,117,000 NOTE: qtr and six mths prior figures reflect two-for-one stock split in August 1986. Reuter  8-APR-1987 10:39:16.52 earn usa F f1184reute r f BC-HANOVER-INSURANCE-<HI 04-08 0074  HANOVER INSURANCE <HINS> GET SPLIT APPROVAL WORCESTER, Mass., April 8 - Hanover Insurance Co said its stockholders approved a two-for-one stock split. As a result of the split, Hanover said it increases the number of authorized shares of capital stock from 10.4 mln, having a par value of one dlr, to 20.9 mln, also having a par value of one dlr. The stock split is payable April 30 to stockholders of record April 10, Hanover said. Reuter  8-APR-1987 10:39:22.31 usajapan F f1185reute d f BC-FEDERAL-PAPERBOARD-<F 04-08 0057  FEDERAL PAPERBOARD <FBO> ENTERS AGREEMENT MONTVALE, N.J., April 8 - Federal Paperboard Co Inc said it has entered into an agreement with Ozaki Trading Co Ltd of Osaka, Japan, allowing Ozaki to represent Federal Paperboard's bleached paperboard sales in Japan. Federal added it will be opening an office in Japan in the near future. Reuter  8-APR-1987 10:39:29.93 acq usa F f1186reute d f BC-NATIONAL-GUARDIAN-<NA 04-08 0099  NATIONAL GUARDIAN <NATG> MAKES ACQUISITIONS GREENWICH, Conn., April 8 - National Guardian Corp said it has acquired a number of security services companies recently, with aggregate revenues of about 3,500,000 dlrs, for an aggregate cost of about 2,700,000 dlrs. It said it acquired guard service companies C.S.C. Security Gaurd Service of Paramus, N.J., from Cartel Security Consultants Inc, the Guard Services Division of Security Services of America of Wayne, N.J., Capital Investigations and Protective Agency of Hackensack, N.J., and Meyer Detective Agency Inc of National Park, N.J. The company said it bought alarm service operations Certified Security Services Inc of Key West, Fla., Custom Security Services of Myrtle Beach, S.C., A-T-E Security Group Inc of Houston and the Louisville, Kent and Nashville, Tenn, offices of Wells Fargo Alarm Services. Reuter  8-APR-1987 10:40:25.85 earn usa F f1194reute s f BC-resending 04-08 0041  UNIVERSAL MEDICAL <UMBIZ> DISTRIBUTION SET MILWAUKEE, WIS., April 8 - Qtly distribution 7-1/2 cts vs 7-1/2 cts prior (excluding 2-1/2 cts special) Pay April 30 Record April 22 NOTE: Full name is Universal Medical Buildings L.P. Reuter  8-APR-1987 10:43:34.24 graincorn zambia imf G C f1209reute u f BC-ZAMBIA-DOES-NOT-PLAN 04-08 0097  ZAMBIA DOES NOT PLAN RETAIL MAIZE PRICE HIKE LUSAKA, April 8 - The Zambian government has no immediate plans to follow last week's increase in the producer price of maize with a hike in the retail price of maize meal, an official of the ruling party said. Last December, a 120 pct increase in the consumer price for refined maize meal, a Zambian staple, led to food riots in which at least 15 people died. That price increase, which President Kenneth Kaunda later revoked, followed pressure by the International Monetary Fund (IMF) to reduce the government's subsidy bill. However, if the producer price rise, from 6.10 dlrs to 8.67 dlrs per 90-kg bag, is not accompanied by a retail price increase, the government will have to spend more on subsidies, a practice discouraged by the IMF. "There is no way out but to raise the subsidy levels of meal. It (the government) would have to choose between the demands of the IMF and those of the people," a Ministry of Agriculture economist said. Reuter  8-APR-1987 10:45:27.04 usa F f1218reute r f BC-BLOCKER-ENERGY-<BLK> 04-08 0065  BLOCKER ENERGY <BLK> SHARE OFFERING UNDERWAY HOUSTON, April 8 - Blocker Energy corp said an offering of 20 mln common shares is underway at 2.625 dlrs per share through underwriters led by <Drexel Burnham Lambert Inc> and Alex. Brown and Sons Inc <ABSB>. The company is offering 19.7 mln shares and shareholders the rest. Before the offering it had about 33.6 mln shares outstanding. Reuter  8-APR-1987 10:45:36.01 usa F f1219reute r f BC-ASARCO-<AR>-COMPLETES 04-08 0082  ASARCO <AR> COMPLETES SHARE OFFERING NEW YORK, April 8 - Asarco Inc said it completed the sale of four mln shares of Asarco common stock to an underwriting group led by First Boston Corp. The underwriters sold the shares to the public at a price of 22.50 dlrs a share, the minerals and energy company said. Proceeds of about 86 mln dlrs will be used to reduce outstanding debt, it said. The offering included 3.5 mln shares announced April 1 and 500,000 to cover overallotments. Reuter  8-APR-1987 10:45:44.23 usa F f1220reute r f BC-AMERICAN-MIDLAND-<AMC 04-08 0088  AMERICAN MIDLAND <AMCO> SETS OPERATOR FOR CASINO ENGLEWOOD CLIFFS, N.J., April 8 - American Midland Corp said <Braodway Casinos Inc> has entered into a letter of intent for a new company to be formed by <Carnival Cruise Lines Inc> and <Continental Hotel Cos> to operate Broadway's planned hotel/casino in the Marina area of Atlantic City, N.J. American Midland has agreed to spin off its 8.2 acre Atlantic City property to Broadway, a new company in which American Midland shareholders would initially own an 85 pct interest. Reuter  8-APR-1987 10:45:50.03 acq usa F f1221reute r f BC-WEDGESTONE-REALTY-<WD 04-08 0046  WEDGESTONE REALTY <WDG> ACQUISITION APPROVED NEWTON, Mass., April 8 - Wedgestone Realty Investors Trust said shareholkders have approved the acquisition of its advisor, Wedgestone Advisory Corp, for 600,000 shares. It said completion is expected to take place April 10. Reuter  8-APR-1987 10:51:43.03 heat usa Y f1239reute u f BC-SUN-<SUN>-CUTS-HEATIN 04-08 0062  SUN <SUN> CUTS HEATING OIL BARGE PRICE NEW YORK, April 8 - Sun Co's Sun Refining and Marketing Co subsidiary said it is decreasing the price it charges contract barge customers for heating oil in ny harbor by 0.50 cent a gallon, effective today. The 0.50 cent a gallon price reduction brings Sun's heating oil contract barge price to 50 cts a gallon, the company said. Reuter  8-APR-1987 10:52:38.11 A RM f1241reute f f BC-******MOODY'S-AFFIRMS 04-08 0012  ******MOODY'S AFFIRMS AVCO FINANCIAL'S LONG-TERM DEBT, CUTS COMMERCIAL PAPER Blah blah blah.  8-APR-1987 10:56:40.19 usa F f1250reute u f BC-MEDICAL-JOURNAL-REPOR 04-08 0106  MEDICAL JOURNAL REPORTS NEW INTERLEUKIN PROMISE WASHINGTON, April 8 - Promising new findings in the use of a controversial experimental drug called Interleukin-2 as a cure for cancer will be published in the April 9 issue of the prestigious New England Journal of Medicine, according to a Wall Street analyst who has obtained an advance copy of the magazine. Among interleukin's principal U. S. makers are Cetus Corp <CTUS>, headquartered in Emeryville, Calif., and Immunex Corp <IMNX>, based in Seattle, Wash. The journal, to be released late today, contains two articles reporting high remission rates several cancer types. The journal also contains a signed editorial concluding that the new results mark a significant milestone in the search for a successful immunotherapy for cancer. Interleukin-2, also known as IL-2, is a substance naturally produced by living cells in the laboratory. The drug is controversial because it was widely praised as a promising cancer treatment in early reports on its effectiveness in late 1985, only to come under criticism a year later for its failure to live up to its promise and due to its ravaging side effects. One of the new studies, conducted by Dr. William West of Biotherapeutics Inc of Franklin, Tenn., is particularly significant because it found far fewer harsh side effects after it changed the way in which the drug is administered. In that study, researchers administered IL-2 to 48 cancer patients and found a 50-pct remission rate for kidney cancers and a 50 pct remission rate for melanoma, a type of skin cancer, according to Prudential-Bache Securities' Stuart Weisbrod, who obtained the advance copy of the magazine. For rectal and colon cancer, the researchers found no remissions, but none of the 48 patients treated had side effects serious enough to be placed under intensive hospital care, according to the article. In the second study, whose principal author is Dr. Steven Rosenberg of the National Cancer Institute, researchers administered IL-2 to 157 cancer patients and found a 33 pct remission rate in cancers of the kidney, a 27 pct rate in melanomas and a 15 pct rate in cancers of the colon and rectum. In the National Cancer Institute trials, a total of four patients died, the magazine reported, confirming the harshness of the drug's side effects as originally administered. "Perhaps we are at the end of the beginning of the search for successful immunotherapy for cancer," said the editorial, signed by John Durant of Philadelphia's Chase Cancer Center. "These observations reported by Rosenberg and West surely did not describe successful practical approaches ready for widespread applications in the therapy of cancer patients," the editorial said. "On the other hand, if they reflect, as seems possible, a successful manipulation of the cellular immune system, then we may be near the end of our search for a meaningful direction in the immunuotherapy of cancer," the editorial concluded. Reuter  8-APR-1987 10:58:23.92 usa F f1260reute u f BC-report-recommends-dis 04-08 0096  REPORT SEEKS TO DISALLOW SOUTHERN <SO> COSTS ATALANTA, April 8 - An audit submitted to the Georgia Public Service Commission claims that between 944 mln dlrs and 1.8 billion dlrs of the costs of the Plant Vogtle nuclear power station should be disallowed, a Southern Co spokeswoman said. Southern's Georgia Power Co subsidiary has a 45.7 pct interest in the plant and estimated earlier this year it would cost a total of 8.87 billion dlrs. Last year, the plant's owners pledged to Georgia regulators they would limit the cost passed on to rate payers to 8.4 billion dlrs. The Southern spokeswoman said the company feels the report by O'Brien-Kreitzberg is "flawed and biased." She said the report was released yesterday by the state attorney general. Responding to the report today, Georgia Power Chairman Robert W. Scherer told a news conference the conclusions drawn by the firm "are not only wrong -- they also reflect the same bias against nuclear power that these auditors have demonstrated in similar cases accross the country." Saying he was not suggesting Georgia power was without fault, Scherer said "the audit identified several things I wish we had done differently." Scherer pointed out a report O'Brien-Kreitzberg submitted to Georgia regulators in March 1986 projected Georgia Power would not finish Plant Vogtle unit one before the end of 1987. Noting "unit one is finished, and we expect it to be in commercial operationg by June," he said the firm's latest report ignored the earlier projection, gave the utility no credit for the completion and "actually penalized us by suggesting that costs to maintain t he schedule be disallowed." Scherer said the latest audit alleges Georgia Power could have saved 95 mln dlrs if it had stopped using four shifts, seven days a week to speed construction three years sooner. He said this would have delayed completion of the plant for another year "and it would have cost several hunderd million dlrs more." Noting the audit said costs were increased 600 mln dlrs by schedule delays totaling 20.5 months, he said "First, we have the best concrete placement record in the industry, Second new government regulations after the Three Mile Island incident significantly increased construction time. Reuter  8-APR-1987 10:58:52.50 uk A f1263reute r f BC-FINAL-TERMS-SET-ON-AT 04-08 0067  FINAL TERMS SET ON ATARI CORP CONVERTIBLE EUROBOND LONDON, April 8 - The coupon on the 75 mln dlr, 15-year, convertible eurobond for Atari Corp has been set at 5-1/4 pct compared with indicated range of five to 5-1/4 pct, lead manager Paine Webber International said. The conversion price was set at 32-5/8 dlrs, representing a premium of 20.38 pct over yesterday's Atari share close of 27 dlrs. REUTER  8-APR-1987 11:00:51.15 graincornsorghumsunseedwheatoilseedsoybean argentina C G f1271reute r f BC-FURTHER-ARGENTINE-COA 04-08 0112  FURTHER ARGENTINE COARSE GRAIN LOSSES FEARED By Manuel Villanueva BUENOS AIRES, April 8 - Argentine grain producers adjusted their yield estimates for the 1986/87 coarse grain crop downward in the week to yesterday after the heavy rains at the end of March and beginning of April, trade sources said. They said sunflower, maize and sorghum production estimates had been reduced despite some later warm, dry weather, which has allowed a return to harvesting in some areas. However, as showers fell intermittently after last weekend, producers feared another spell of prolonged and intense rain could cause more damage to crops already badly hit this season. Rains in the middle of last week reached an average of 27 millimetres in parts of Buenos Aires province, 83 mm in Cordoba, 41 in Santa Fe, 50 in Entre Rios and Misiones, 95 in Corrientes, eight in Chaco and 35 in Formosa. There was no rainfall in the same period in La Pampa. Producers feared continued damp conditions could produce rotting and lead to still lower yield estimates for all the crops, including soybean. However, as the lands began drying later in the week harvesting advanced considerably, reaching between 36 and 40 pct of the area sown in the case of sunflower. Deterioration of the sunflower crop evident in harvested material in Cordoba, La Pampa and Buenos Aires forced yield estimates per hectare to be adjusted down again. The season's sunflowerseed production is now forecast at 2.1 mln to 2.3 mln tonnes, against 2.2 mln to 2.4 mln forecast last week and down 43.9 to 48.8 pct on the 1985/86 record of 4.1 mln. Area sown to sunflowers was two to 2.2 mln hectares, 29.9 to 36.3 pct below the record 3.14 mln hectares last season. Maize harvesting has also reached 36 to 40 pct of the area sown. It is near completion in Cordoba and Santa Fe and will begin in La Pampa and southern Buenos Aires later in April. Production estimates for maize were down from last week at 9.5 mln to 9.8 mln tonnes, against 9.6 mln to 9.9 mln estimated previously. This is 22.2 to 23.4 pct below the 12.4 mln to 12.6 mln tonnes estimated by private sources for the 1985/86 crop and 21.9 to 25.8 pct down on the official figure of 12.8 mln tonnes. Maize was sown on 3.58 mln to 3.78 mln hectares, two to seven pct down on last season's 3.85 mln. Sorghum was harvested on 23 to 25 pct of the area sown in Cordoba, Santa Fe and Chaco. Harvest will start in La Pampa and Buenos Aires in mid-April. The total area sown was 1.23 mln to 1.30 mln hectares, 10.3 to 15.2 pct down on the 1.45 mln sown last season. The new forecast for the sorghum crop is 2.9 mln to 3.2 mln tonnes compared with three mln to 3.3 mln forecast last week, and is 23.8 to 29.3 pct down on last season's 4.1 mln to 4.2 mln tonne crop. The soybean crop for this season was not adjusted, remaining at a record 7.5 mln to 7.7 mln tonnes, up 4.2 to 5.5 pct on the 7.2 mln to 7.3 mln estimated by private sources for 1985/86 and 5.6 to 8.5 pct higher than the official figure of 7.1 mln. The area sown to soybeans this season was a record 3.7 mln to 3.8 mln hectares, 10.8 to 13.8 pct up on the record 3.34 mln sown in 1985/86. The soybean crop is showing excessive moisture in some areas and producers fear they may discover more damage. Some experimental harvesting was carried out in Santa Fe on areas making up only about one pct of the total crop but details on this were not available. Preparation of the fields for the 1987/88 wheat crop, which will be sown between May and August or September, has so far not been as intense as in previous years. Reuter  8-APR-1987 11:04:45.96 V RM f1297reute f f BC-******TOP-OFFICIALS-A 04-08 0012  ******TOP OFFICIALS ARRIVE AT U.S. TREASURY TO BEGIN GROUP OF FIVE MEETING Blah blah blah.  8-APR-1987 11:05:28.33 jobs netherlands RM f1304reute r f BC-DUTCH-ADJUSTED-UNEMPL 04-08 0082  DUTCH ADJUSTED UNEMPLOYMENT RISES IN MARCH THE HAGUE, April 8 - Dutch seasonally adjusted unemployment rose in the month to end-March to a total 693,000 from 690,600 at end-February, but was well down from 730,100 at end-March 1986, Social Affairs Ministry figures show. The figure for male jobless rose by 2,000 in the month to 436,500 compared with 470,700 a year earlier. The figure for women was 256,500 at end-March against 256,100 a month earlier and 259,400 at end-March 1986. On an unadjusted basis total unemployment fell by 16,500 in the month to end-March to 692,200. In March 1986 the figure was 725,000. A ministry spokesman said the unadjusted figures showed a smaller than usual seasonal decrease for the time of year, because of particularly cold weather delaying work in the building industry. He said this explained the increase in the adjusted statistics. Total vacancies available rose by 1,900 to 26,300 at end-March. A year earlier the figure was 28,763. REUTER  8-APR-1987 11:06:39.06 earn usa F f1309reute u f BC-HARTMARX-CORP-<HMX>-B 04-08 0021  HARTMARX CORP <HMX> BOOSTS DIVIDEND CHICAGO, April 8 Qtly div 25 cts vs 23 cts prior qtr Pay 15 May Record 1 May  8-APR-1987 11:11:12.33 usa A RM F f1329reute b f BC-MOODY'S-AFFIRMS-AVCO 04-08 0107  MOODY'S AFFIRMS AVCO UNIT'S LONG-TERM DEBT NEW YORK, April 8 - Moody's Investors Service Inc said it affirmed the long-term debt ratings but cut the commercial paper to Prime-2 from Prime-1 of Avco Financial Services Inc, a unit of Avco Corp. Avco Financial has 2.5 billion dlrs of debt outstanding. For the paper cut, Moody's cited a higher risk profile inherent in the company's core business. Moody's said the affirmation reflected its assessment of a less diversified risk profile in the company's receivables. Affirmed were Avco Financial's A-3 senior debt, Baa-2 senior subordinated debt and Baa-3 junior subordinated debt. Reuter  8-APR-1987 11:12:13.98 money-fx usa stoltenbergpoehlballadurde-larosieremiyazawasumitaleigh-pembertongoriajames-baker V RM f1335reute b f BC-TOP-OFFICIALS-ARRIVE 04-08 0108  TOP OFFICIALS ARRIVE AT TREASURY FOR G-5 TALKS WASHINGTON, April 8 - Top officials of leading industrial nations arrived at the U.S. Treasury main building to begin a meeting of the Group of Five. Officials seen arriving by Reuter correspondents included West German Finance Minister Gerhard Stoltenberg and Bundesbank President Karl Otto Poehl, French Finance Minister Edouard Balladur and his central banker Jacques de Larosiere. Also seen arriving were Japanese Finance Minister Kiichi Miyazawa and Japan's central bank governor Satoshi Sumita and British Chancellor of the Exchequer and central bank governor Robin Leigh Pemberton. There was no immediate sign of Italian or Canadian officials. Monetary sources have said a fully blown meeting of the Group of Seven is expected to begin around 3 p.m. local time (1900 gmt) and last at least until 6 p.m. (2200 gmt), when a communique is expected to be issued. Italian sources said Italian acting Finance Minister Giovanni Goria met Treasury Secretary James Baker last night. At those talks Baker apparently convinced Goria, who declined to attend the February meeting of the Group of Seven in Paris, that Italy would participate fully in any meaningful decisions. Reuter  8-APR-1987 11:12:43.58 interest usa V RM f1338reute b f BC-/-FED-EXPECTED-TO-SET 04-08 0110  FED EXPECTED TO SET CUSTOMER REPURCHASES NEW YORK, April 8 - The Federal Reserve is expected to intervene in the government securities market to supply temporary reserves indirectly via customer repurchase agreements, economists said. Economists expect the Fed to execute 2.0-2.5 billion dlrs of customer repos to offset pressures from the end of the two-week bank reserve maintenance period today. Some also look for a permanent reserve injection to offset seasonal pressures via an outright purchase of bills or coupons this afternoon. The Federal funds rate opened at 6-3/8 pct and remained at that level, up from yesterday's 6.17 pct average. Reuter  8-APR-1987 11:15:23.93 usa F f1352reute r f BC-BEST-BUY-<BBUY>-MARCH 04-08 0063  BEST BUY <BBUY> MARCH SALES RISE MINNEAPOLIS, April 8 - Best Buy Co Inc said its sales for March rose to 26.1 mln dlrs from 11.9 mln dlrs in the comparable 1986 period. It said sales for the fiscal year ended March 31 rose to 329.5 mln dlrs from 113.1 mln dlrs a year earlier. The company said sales performance was based on the addition of 12 new retail facilities. Reuter  8-APR-1987 11:15:28.57 usa F f1353reute r f BC-AUTOSPA-<LUBE>-TO-RED 04-08 0041  AUTOSPA <LUBE> TO REDEEM WARRANTS NEW YORK, April 8 - AutoSpa corp said it will redeem all its common stock purchase warrants on May Five at 7.5 cts each. Through May Four, each warrant may be exercised into one common share at 1.75 dlrs. Reuter  8-APR-1987 11:15:35.75 acq usa F f1354reute r f BC-READER'S-DIGEST-ASSOC 04-08 0071  READER'S DIGEST ASSOCIATION SELLS UNIT PLEASANTVILLE, N.Y., April 8 - <The Reader's Digest Association Inc> said it sold its subsidiary, Source Telecomputing Corp, to the venture capital firm of <Welsh, Carson, Anderson and Stowe>. The purchase price was not disclosed, Reader's Digest said. It said it purchased an 80 pct stake in Source in 1980 and earned an unspecified profit on 14 mln dlrs in revenues in 1986. Reuter  8-APR-1987 11:15:38.86 earn usa F f1355reute r f BC-WEIS-MARKETS-INC-<WMK 04-08 0026  WEIS MARKETS INC <WMK> 1ST QTR MARCH 28 NET SUNBURY, Pa., April 8 - Shr 59 cts vs 51 cts Net 18.0 mln vs 15.6 mln Revs 278.6 mln vs 272.2 mln Reuter  8-APR-1987 11:15:46.20 usa F f1356reute r f BC-AVNET-INC-<AVT>-FILES 04-08 0093  AVNET INC <AVT> FILES FOR DEBENTURE OFFERING NEW YORK, April 8 - Anvet Inc said it filed with the Securities and Exchange Commission a registration statement for a proposed public offering of 150 mln dlrs of convertible subordinated debentures due 2012. Avnet said it will use the net proceeds for general working capital purposes and the anticipated domestic and foreign expansion of its distribution, assembly and manufacturing businesses. The company said an investment banking group managed by Dillon Read and Co Inc will handle the offering. Reuter  8-APR-1987 11:15:53.12 earn canada E F f1357reute r f BC-CONTINENTAL-BANK-INIT 04-08 0100  CONTINENTAL BANK INITIAL DISTRIBUTION APPROVED TORONTO, April 8 - Continental Bank of Canada said shareholders approved a capital reorganization to allow an initial payout by the end of May to common shareholders from last year's 200 mln Canadian dlr sale of most Continental assets to <Lloyds Bank PLC>'s Lloyds Bank Canada. The bank said the initial distribution would take the form of a stock dividend of cumulative redeemable retractable class A series two preferred shares entitling holders to monthly floating rate dividends at 72 pct of prime and to 12.75 dlrs a share on retraction. Continental said the initial payout was subject to Canadian government approval. The bank reiterated that total distributions to common shareholders would range from 16.50 dlrs a share to 17.25 dlrs including the initial stock dividend and a final distribution in late 1988 or early 1989. The payout of existing preferred shareholders will be completed just before next month's initial distribution to common shareholders, Continental added. Reuter  8-APR-1987 11:15:58.96 earn usa F f1358reute r f BC-ATLAS-CONSOLIDATED-MI 04-08 0060  ATLAS CONSOLIDATED MINING AND DEVELOPMENT <ACMB> NEW YORK, April 8 - 4th qtr Shr loss 17 cts vs loss 22 cts Net loss 14.5 mln vs loss 18.0 mln Revs 27.3 mln vs 23.7 mln Year Shr 58 cts vs 1.01 dlrs Net loss 48.3 mln vs loss 84.2 mln Revs 111.7 mln vs 141.9 mln NOTE: Atlas Consolidated Mining and Development Corp of Manila. Translated from Philippine pesos at 20.3489 pesos to dollar vs 18.5571 in quarter and 20.2315 vs 18.2743 in year. Reuter  8-APR-1987 11:16:31.73 usa F f1362reute r f BC-FORD-<F>-EXTENDS-INCE 04-08 0119  FORD <F> EXTENDS INCENTIVES ON LIGHT TRUCKS DEARBORN, Mich., April 8 - Ford Motor Co said it extended its buyer incentive program on light trucks to April 30 from April 6, the program's previous expiration date. Ford, which saw a 23 pct rise in its March truck sales over the March 1986 level, said the incentives were extended to "maintain its truck sales momentum." The program itself was not changed. Customers have a choice of 3.9 to 9.9 annual percentage rate financing or a cash rebate of 300 dlrs or 600 dlrs, depending on the type of transmission chosen. Ford last week extended to April 30 from March 12 its incentive program on its compact trucks and the Ford Taurus and Mercury Sable cars. Reuter  8-APR-1987 11:16:47.23 italy fao C G T f1364reute d f BC-FAO-REPORTS-BETTER-CR 04-08 0104  FAO REPORTS BETTER CROPS IN DEVELOPING COUNTRIES ROME, April 8 - World output of staple foods maintained growth in 1986, following a record harvest the year before, and most of the increase was in developing countries, the director general of the U.N.'s Food and Agriculture Organisation (FAO) said. Speaking to FAO's committee on world food security, Edouard Saouma said sub-Saharan Africa registered a cereal production increase of 3.6 pct in 1986 and the Far East also continued to increase production. Despite ample supplies worldwide, many countries face problems in paying for all the food they need, he said. Saouma said many of the developing world's food problems were the result of "chaotic" world trade. He said it was vital to promote employment to improve the "food-security situation" of the poor, with policy reforms in developing countries to remove existing disincentives to production so that agriculture could play a greater role in stimulating economic growth. Reuter  8-APR-1987 11:16:54.96 usa F f1365reute r f BC-AVX-CORP-<AVX>-FILES 04-08 0061  AVX CORP <AVX> FILES FOR DEBENTURE OFFERING GREAT NECK, N.Y., April 8 - AVX Corp said it has filed a registration statement with the Securities and Exchange Commission for a proposed public offering of 75 mln dlrs prinicipal amount of convertible subordinated debentures. AVX said a syndicate managed by Shearson Lehman Brothers Inc will underwrite the offering. Reuter  8-APR-1987 11:17:19.96 acq usa F f1367reute u f BC-SCI-MED-<SMLS>-BOARD 04-08 0100  SCI-MED <SMLS> BOARD AGREES TO BRISTOL<BMY>DEAL MINNEAPOLIS, MINN., April 8 - Sci-Med Life Systems Inc said its directors approved a previously proposed agreement of merger with Bristol-Myers Co. The proposed transaction is subject to completion of a due diligence investigation, including a review by Bristol-Myers of a patent infringement suit served on Sci-Med by Advanced Cardiovascular Systems Inc on March 31, 1987. Bristol-Myers has the right to call off the agreement under certain circumstances, it said. Sci-Med said it continues to believe the patent suit is without merit. Reuter  8-APR-1987 11:18:14.40 acq usa F f1371reute r f BC-FIDELCOR-<FICR>-COMPL 04-08 0059  FIDELCOR <FICR> COMPLETES SALE OF UNIT PHILADELPHIA, April 8 - Fidelcor Inc said it has completed the sale of its Industrial Valley Title Insurance Co subsidiary to a group of investors including the unit's management for undisclosed terms. Industrial Valley has assets of about 37.6 mln dlrs and was acquired last year along with IVB Financial Corp. Reuter  8-APR-1987 11:18:20.11 earn usa F f1372reute d f BC-DATA-TRANSLATION-INC 04-08 0033  DATA TRANSLATION INC <DATX> 1ST QTR FEB 28 NET MARLBORO, Mass., April 8 - Shr 18 cts vs 13 cts Net 575,000 vs 379,000 Sales 6,625,000 vs 4,537,000 Avg shrs 3,173,000 vs 2,977,000 Reuter  8-APR-1987 11:18:37.67 pet-chemcrudeacqearn usa F Y f1375reute d f BC-petrochemical 04-08 0098  ENERGY/U.S. PETROCHEMICAL INDUSTRY By JULIE VORMAN, Reuters HOUSTON, April 8 - Cheap oil feedstocks, the weakened U.S. dollar and a plant utilization rate approaching 90 pct will propel the streamlined U.S. petrochemical industry to record profits this year, with growth expected through at least 1990, major company executives predicted. This bullish outlook for chemical manufacturing and an industrywide move to shed unrelated businesses has prompted GAF Corp <GAF>, privately-held Cain Chemical Inc, and other firms to aggressively seek acquisitions of petrochemical plants. Oil companies such as Ashland Oil Inc <ASH>, the Kentucky-based oil refiner and marketer, are also shopping for money-making petrochemical businesses to buy. "I see us poised at the threshold of a golden period," said Paul Oreffice, chairman of giant Dow Chemical Co <DOW>, adding, "There's no major plant capacity being added around the world now. The whole game is bringing out new products and improving the old ones." Analysts say the chemical industry's biggest customers, automobile manufacturers and home builders that use a lot of paints and plastics, are expected to buy quantities this year. U.S. petrochemical plants are currently operating at about 90 pct capacity, reflecting tighter supply that could hike product prices by 30 to 40 pct this year, said John Dosher, managing director of Pace Consultants Inc of Houston. Demand for some products such as styrene could push profit margins up by as much as 300 pct, he said. Oreffice, speaking at a meeting of chemical engineers in Houston, said Dow would easily top the 741 mln dlrs it earned last year and predicted it would have the best year in its history. In 1985, when oil prices were still above 25 dlrs a barrel and chemical exports were adversely affected by the strong U.S. dollar, Dow had profits of 58 mln dlrs. "I believe the entire chemical industry is headed for a record year or close to it," Oreffice said. GAF chairman Samuel Heyman estimated that the U.S. chemical industry would report a 20 pct gain in profits during 1987. Last year, the domestic industry earned a total of 13 billion dlrs, a 54 pct leap from 1985. The turn in the fortunes of the once-sickly chemical industry has been brought about by a combination of luck and planning, said Pace's John Dosher. Dosher said last year's fall in oil prices made feedstocks dramatically cheaper and at the same time the American dollar was weakening against foreign currencies. That helped boost U.S. chemical exports. Also helping to bring supply and demand into balance has been the gradual market absorption of the extra chemical manufacturing capacity created by Middle Eastern oil producers in the early 1980s. Finally, virtually all major U.S. chemical manufacturers have embarked on an extensive corporate restructuring program to mothball inefficient plants, trim the payroll and eliminate unrelated businesses. The restructuring touched off a flurry of friendly and hostile takeover attempts. GAF, which made an unsuccessful attempt in 1985 to acquire Union Carbide Corp <UK>, recently offered three billion dlrs for Borg Warner Corp <BOR>, a Chicago manufacturer of plastics and chemicals. Another industry powerhouse, W.R. Grace <GRA> has divested its retailing, restaurant and fertilizer businesses to raise cash for chemical acquisitions. But some experts worry that the chemical industry may be headed for trouble if companies continue turning their back on the manufacturing of staple petrochemical commodities, such as ethylene, in favor of more profitable specialty chemicals that are custom-designed for a small group of buyers. "Companies like DuPont <DD> and Monsanto Co <MTC> spent the past two or three years trying to get out of the commodity chemical business in reaction to how badly the market had deteriorated," Dosher said. "But I think they will eventually kill the margins on the profitable chemicals in the niche market." Some top chemical executives share the concern. "The challenge for our industry is to keep from getting carried away and repeating past mistakes," GAF's Heyman cautioned. "The shift from commodity chemicals may be ill-advised. Specialty businesses do not stay special long." Houston-based Cain Chemical, created this month by the Sterling investment banking group, believes it can generate 700 mln dlrs in annual sales by bucking the industry trend. Chairman Gordon Cain, who previously led a leveraged buyout of Dupont's Conoco Inc's chemical business, has spent 1.1 billion dlrs since January to buy seven petrochemical plants along the Texas Gulf Coast. The plants produce only basic commodity petrochemicals that are the building blocks of specialty products. "This kind of commodity chemical business will never be a glamorous, high-margin business," Cain said, adding that demand is expected to grow by about three pct annually. Garo Armen, an analyst with Dean Witter Reynolds, said chemical makers have also benefitted by increasing demand for plastics as prices become more competitive with aluminum, wood and steel products. Armen estimated the upturn in the chemical business could last as long as four or five years, provided the U.S. economy continues its modest rate of growth. Reuter  8-APR-1987 11:20:27.61 usa F f1387reute d f BC-FEDERAL-PAPER-BOARD-< 04-08 0047  FEDERAL PAPER BOARD <FBO> IN MARKETING DEAL MONTVALE, N.J., April 8 - Federal Paper Board Co Inc said it has named Ozaki Trading Co Ltd of Osaka to represent it it Japan on the sale of bleached paperboard. Federal said it plans to open its own Japanese office in the near future. Reuter  8-APR-1987 11:21:05.09 earn usa F f1390reute d f BC-FIDATA-CORP-<FID>-4TH 04-08 0094  FIDATA CORP <FID> 4TH QTR LOSS NEW YORK, April 8 - Shr loss two cts vs profit 38 cts Net loss 90,000 vs profit 1,685,000 Revs 1,826,000 vs 29.3 mln Year Shr profit 3.37 dlrs vs profit 46 cts Net profit 15.0 mln vs profit 2,047,000 Revs 26.2 mln vs 123.6 mln NOTE: Net includes pretax securities sale gain 10,000 dlrs vs loss 1,000 dlrs in quarter and gain 486,000 dlrs vs loss 112,000 dlrs in year. Net includes pretax gains on sale of businesses of nil vs 4,656,000 dlrs in quarter and 26.0 mln dlrs vs 4,656,000 dlrs in year. Net includes pretax losses on disposition of product line of nil vs 3,150,000 dlrs in quarter and 3,300,000 dlrs vs 3,150,000 dlrs in year. Quarter net includes tax credits of 102,000 dlrs vs 736,000 dlrs. Net includes reversal of tax loss carryforwards of 259,000 dlrs vs 264,000 dlrs in quarter and tax loss carryforwards of 8,635,000 dlrs vs 579,000 dlrs in year. Reuter  8-APR-1987 11:21:19.09 usa F f1392reute d f BC-CMS-<ACMS>-UNVEILS-FI 04-08 0111  CMS <ACMS> UNVEILS FIRST IBM SYSTEM/2 ADD ONS TUSTIN, Calif., April 8 - CMS Enhancements Inc said it has introduced the first add-on mass storage products for the new International Business Machines Corp <IBM> IBM Personal System/2 Model 30 personal computers. CMS said the products are available immediately and include hard disk drives, tape backup subsystems and a hard disk drive on an expansion card. It added it plans to introduce more products for higher- end models of the IBM personal computers within the next two months. Prices for the new products range from 795 dlrs for a tape backup subsystem, to 5,695 dlrs for a mass storage subsystem. Reuter  8-APR-1987 11:21:24.56 earn usa F f1393reute d f BC-MARBLE-FINANCIAL-CORP 04-08 0042  MARBLE FINANCIAL CORP <MRBL> 1ST QTR NET RUTLAND, Vt., April 8 - Oper shr 26 cts vs not given Oper net 866,000 vs 480,000 NOTE: 1987 net excludes 157,000 dlr gain from termination of pension plan. Company went public in August 1986. Reuter  8-APR-1987 11:22:35.93 usa F f1402reute d f BC-NANTUCKET-<NAN>-NAMES 04-08 0055  NANTUCKET <NAN> NAMES NEW HEAD FOR UNIT NEW YORK, April 8 - Nantucket Industries Inc said James Adams has been named president of its hosiery division, replacing John Wineapple, and Terry Hampton has been named vice president of manufacturing for the division, replacing Howard Fromkin. No reason was given for the changes. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-016.sgm000066400000000000000000002404711154025176300231520ustar00rootroot00000000000000 9-APR-1987 16:55:59.00 james-baker V RM f2652reute f f BC-******TREASURY'S-BAKE 04-09 0013  ******TREASURY'S BAKER SAYS MACROECONOMIC INDICATORS NEED MORE PROMINENT ROLE Blah blah blah.  9-APR-1987 16:56:03.23 acq F f2653reute b f BC-******HOSPITAL-CORP-O 04-09 0012  ******HOSPITAL CORP SAYS IT RECEIVED 47 DLR A SHARE OFFER FROM INVESTOR GROUP Blah blah blah.  9-APR-1987 16:56:14.45 earn usa F f2654reute s f BC-BEVERLY-ENTERPRISES-< 04-09 0026  BEVERLY ENTERPRISES <BEV> SETS REGULAR DIVIDEND PASEDENA, Calif., April 9 - Qtly div five cts vs five cts prior Pay July 13 Record June 30 Reuter  9-APR-1987 16:59:15.05 money-fx james-baker V RM f2662reute f f BC-******TREASURY'S-BAKE 04-09 0013  ******TREASURY'S BAKER SAYS FLOATING EXCHANGE RATE SYSTEM NEEDS GREATER STABILITY Blah blah blah.  9-APR-1987 17:03:06.18 crude usa Y f2669reute r f BC-/CRUDE-OIL-NETBACKS-U 04-09 0110  CRUDE OIL NETBACKS UP SHARPLY IN EUROPE, U.S. NEW YORK, April 9 - Crude oil netback values in complex refineries rose sharply in Europe and firmed in the U.S. last Friday from the previous week but fell sharply in Singapore, according to calculations by Reuters Pipeline. The firmer tone to refining margins in Europe and the U.S. relected higher prices for petroleum products, particularly gasoline, and support from crude oil prices. Netback values for crude oil refined in Northern Europe rose substantially following strong gains in gasoline prices there. Brent is valued at 19.45 dlrs, up 56 cts a barrel or three pct from the previous week. In the U.S. Gulf, sweet crudes rose in value by 14 cts to 19.33 dlrs for West Texas Intermediate, up about 0.7 pct. Sour grades in the U.S. Gulf showed an increase of 33 cts a barrel for Alaska North Slope, up 1.7 pct. But netbacks for crude oil refined in Singapore fell sharply, down 15 cts to as much as 68 cts a barrel as ample distillate supplies weighed on petroleum product prices. Attaka in Singapore is valued at 18.55 dlrs, a decline of 68 cts a barrel or 3.5 pct from the previous week. For refineries in the Mediterranean, netback values were mostly lower, with declines of seven to 14 cts. The value of Kuwait crude fell 14 cts to 18.37 dlrs, while Iranian Light fell 11 cts to 19.14 dlrs. On the U.S. West Coast, netback values for ANS CIF L.A. also jumped sharply, up 40 cts a barrel or 2.2 pct to 18.82 dlrs on higher gasoline prices. Reuter  9-APR-1987 17:04:00.71 money-fx usa james-baker imf V RM f2670reute b f BC-TREASURY'S-BAKER-SAYS 04-09 0098  TREASURY'S BAKER SAYS SYSTEM NEEDS STABILITY WASHINGTON, April 9 - Treasury Secretary James Baker said the floating exchange rate system has not been as effective as had been hoped in promoting stability and preventing imbalances from emerging in the global economy. In remarks before the afternoon session of the International Monetary Fund's Interim Committee, Baker said he was not suggesting that the system should be abandoned. "But I do suggest," he said, "that we need something to give it more stability and to keep it headed in the right direction when the wind shifts." He said that indicators can serve "as a kind of compass" but added that structural indicators can help focus attention on some policies. Baker, however, said the IMF "needs to move beyond macroeconomic indicators and find structural indicators that can help focus attention on some of the policies of specific relevance to the imbalances we face today." The Treasury Secretary said that indicators should be given a more prominent role in the annual economic reviews -- Article IV consultations -- that the Fund performs. Baker also told the policy making group that it was time for the IMF to adopt earlier recommendations making IMF surveillance more relevant to national policymakers and the public. "In particular, we urge increased publicity for IMF appraisals developed in Article IV consultations, the use of follow-up reports on country actions to implement IMF recommendations, and greater use of special consultation procedures," he said. Baker emphasized that indicators were a device "for moving beyond rhetoric to action." He said they provide "more structure to the system, and induce more discipline and peer pressure into the process of policy coordination." He said the Fund's procedures for surveillance need to be reviewed and updated to reflect the use of indicators. "This should be matter of priority for the executive board," he said. Baker also urged the Fund to develop alternative medium-term economic scenarios for countries that "can help us focus even more clearly on the most important imbalances, by identifying options for addressing them and analyzing the implications of these options." He said also that further work should be done on finding paths that lead toward possible medium-term objectives. "If we are to take effective remedial action when there are significant deviations from an intended course, then we must have more definitive ways of indentifying the right course for key variables," he said. Reuter  9-APR-1987 17:07:18.35 acqcrudenat-gas usa F f2677reute r f BC-NERCI-<NER>-UNIT-CLOS 04-09 0083  NERCI <NER> UNIT CLOSES OIL/GAS ACQUISITION PORTLAND, Ore., April 9 - Nerco Inc said its oil and gas unit closed the acquisition of a 47 pct working interest in the Broussard oil and gas field from <Davis Oil Co> for about 22.5 mln dlrs in cash. Nerco said it estimates the field's total proved developed and undeveloped reserves at 24 billion cubic feet, or equivalent, of natural gas, which more than doubles the company's previous reserves. The field is located in southern Louisiana. Reuter  9-APR-1987 17:10:03.66 usauksouth-africanamibia un C M f2679reute d f AM-TERRITORY-COUNCIL-1ST LD'*'*'* 04-09 0131  U.S. AND BRITAIN VETO SANCTIONS AGAINST S.AFRICA UNITED NATIONS, April 9 - For the second time in seven weeks, the United States and Britain vetoed a Security Council resolution to impose mandatory sanctions against South Africa. Nine of the Council's 15 members voted for the draft, aimed at forcing South Africa to implement an eight-year-old U.N. independence plan for Namibia (South West Africa), a vast, sparsely populated territory rich in minerals. The U.S. and Britain were joined by West Germany in casting negative votes. France, Italy and Japan abstained. The resolution called for comprehensive mandatory sanctions because Pretoria insists on making Namibian independence conditional on the withdrawal of more than 30,000 Cuban troops from neighbouring Angola. Reuter  9-APR-1987 17:14:55.93 money-fxgraincottonlivestockgoldsilver usa F C G L M T f2692reute r f BC-media-summary 04-09 0127  U.S. DOLLAR LOSSES PROPEL BROAD COMMODITY GAINS by Keith Leighty, Reuters CHICAGO, April 9 - Commodities from gold to grains to cotton posted solid gains in a flurry of buying today as losses in the U.S. dollar and rising interest rates kindled fears of inflation and economic instability. Gains were most pronounced on the Commodity Exchange in New York, where gold jumped 12.40 dlrs and closed at 436.50 dlrs a troy ounce, and silver 22.5 cents to 6.86 dlrs a troy ounce. A key factor behind the advance was anticipation that inflation will be the only way for the major industrial nations to halt the slide in the value of the U.S. dollar, said Steve Chronowitz, director of commodity research with Smith Barney, Harris Upham and Co., in New York. The dollar tumbled one day after top finance officials from the seven largest industrial nations reaffirmed their commitment to support its value, and despite reports of intervention by the U.S. Federal Reserve Bank, traders said. Traders said it appears that the industrial nations, known as the Group of Seven, lack the ability to change the long-term direction of the currency markets. "Maybe they have some ideas or plans," said Chronowitz. "If they do, it's not evident." "It looks like there's no cure but to let the free market take values to where they should be. "One way or another, we will force our major trading partners to stimulate their economies," as a measure to correct the mounting U.S. trade deficit, Chronowitz said. "I think the markets believe, and have believed for a long time, that the only recourse is to reflate at some point. It's going to be a long and tedious process, but that's what's happening," he said. The falling value of the dollar makes U.S. commodities cheaper for foreign buyers, stimulating demand. At the same time, traders who are holding stocks and bonds saw the value of their investments falling and many are turning to commodities such as precious metals as a hedge, said Marty McNeill, a metals analyst in New York with the trading house of Dominick and Dominick. The reaction in the metal markets reverberated throughout the commodities markets, as grains, livestock, and cotton posted broad gains. Traders at the Chicago Board of Trade said attention in the grain markets has shifted from concern about burdensome supplies to the outlook that a lower dollar will stimulate export demand. After the close of trading, the Agriculture Department raised its estimate for grain imports by the Soviet Union by two mln tonnes from the month-earlier report. Live hogs and frozen pork bellies posted sharp gains on the Chicago Mercantile Exchange, while live cattle were moderately higher. Analysts said several factors boosted hog prices. They said hogs haven't been making the weight gains that are normal at this time of year, and farmers have been too busy with field work to market animals. Reuter  9-APR-1987 17:15:43.34 usa F f2694reute u f BC-GENERAL-MOTORS-<GM>-T 04-09 0052  GENERAL MOTORS <GM> TO IDLE 9,800 WORKERS DETROIT, April 9 - General Motors Corp said it will temporarily lay off 9,800 workers at two plants next week. The layoffs will bring to 11,900 the number of General Motors workers temporarily let go by the company. Indefinite layoffs remain unchanged at 37,000. General Motors said its Chevrolet-Pontiac-GM of Canada plant at Okalhoma City, Okla., will be shut down April 13 through April 20 for inventory adjustment. Some 5,500 workers will be idled at the plant. General Motors' Chevrolet-Pontiac-GM of Canada plant at Doraville, Ga., will be closed for the same period for inventory adjustment, with 4,300 workers affected. The company's Lakewood, Ga., plant has been shut since December, with 2,100 workers on temporary layoff. General Motors said it will have one car plant and five truck plants working on on overtime Saturday, April 11. Reuter  9-APR-1987 17:16:11.81 usa F f2695reute d f BC-TENNEX-INDUSTRIES-TO 04-09 0076  TENNEX INDUSTRIES TO BUILD PLANT IN TENNESSEE NASHVILLE, Tenn., April 9 - <Tennex Industries Inc>, a Japanese owned supplier of air cleaners for the automotive industry, said it will build a seven mln dlr plant in Munfreesboro, Tenn. The company said the 37,500-square-foot plant will initially supply parts to <Nissan Motor Manufacturing Corp USA> in nearby Smyna. The company said it hopes to eventually produce parts for other U.S. car makers. Reuter  9-APR-1987 17:16:58.84 graincorn usaegypt C G f2697reute u f BC-EGYPT-SEEKING-500,000 04-09 0034  EGYPT SEEKING 500,000 TONNES CORN - U.S. TRADERS KANSAS CITY, April 9 - Egypt is expected to tender April 22 for 500,000 tonnes of corn for May through September shipments, private export sources said. Reuter  9-APR-1987 17:20:34.87 earn usa F f2704reute r f BC-TRUSTCORP-INC-<TTCO> 04-09 0048  TRUSTCORP INC <TTCO> 1ST QTR NET TOLEDO, Ohio, April 9 - Shr 67 cts vs 62 cts Net 9,160,000 vs 7,722,000 Assets 4.5 billion vs four billion Note: Shr and net data are before accounting change announced in 1986, which added 30 cts a share to year-ago 1st qtr results. Reuter  9-APR-1987 17:28:02.76 grainship usa G f2720reute r f BC-ny-grain-freights 04-09 0065  N.Y. GRAIN FREIGHTS - April 9 Nidera took TBN 12,000 tonnes HSS Toledo to Casablanca April 29-May 5 25.00 dlrs three days load 1,000 discharge Comanav took Radnik 20,000 tonnes Lakehead to Morocco April 15-25 22.00 dlrs 5,000 load 3,000 discharge Krohn took Akron 75,000 tonnes anygrains on 55 feet stowage Mississippi River to Rotterdam May 1-10 8.05 dlrs 12 days all purposes Continental took Legionario 40,000 tonnes River Plate to Japan April 25-May 10 22.50 dlrs 2,000 load 5,000 free discharge Garnac took Sokorri 30,000 tonnes U.S. Gulf to Constanza April 15-25 17.00 dlrs load terms unknown 3,000 discharge reuter  9-APR-1987 17:28:46.65 earn usa F f2724reute h f BC-NAPA-VALLEY-BANCORP-< 04-09 0019  NAPA VALLEY BANCORP <NVBC> 1ST QTR NET NAPA, Calif, April 9 - Shr 20 cts vs 25 cts Net 487,000 vs 435,000 Reuter  9-APR-1987 17:29:59.20 earn usa F f2728reute h f BC-INTERNATIONAL-POWER-M 04-09 0078  INTERNATIONAL POWER MACHINES <PWR> 4TH QTR LOSS MESQUITE, Texas, April 9 - Shr loss 21 cts vs loss 28 cts Net loss 817,000 vs loss 1,058,000 Revs 5,627,000 vs 7,397,000 Year Shr loss 75 cts vs loss 1.36 dlrs Net loss 2,872,000 vs loss 5,200,000 Revs 23.3 mln vs 21.1 mln Note: 1985 net includes 1,255,000 adjustment in inventory valuations and 486,000 in cost-reduction expenses. Full name is International Power Machines Corp. Reuter  9-APR-1987 17:33:46.96 usa cboe F RM f2736reute u f BC-CBOE-TO-LIST-NEW-S-AN 04-09 0112  CBOE TO LIST NEW S AND P OPTIONS <NSX> APRIL 20 CHICAGO, April 9 - The Chicago Board Options Exchange, CBOE, said it will list new Standard and Poor 500 stock index options beginning April 20 that will trade side-by-side with the existing S and P 500 options <SPX>. The new S and P 500 option contract differs from the existing contract in that settlement of the new contract will be based on the opening value of the index on expiration Friday. Settlement of the existing contract is based on the closing value of the index on expiration Friday. The new opening settlement S and P 500 options will be offered only in months in which there are S and P 500 futures. Initial months to be listed in the new options will be June, September and December, the CBOE said. Dissemination of the settlement of price of the new options will be made through a special ticker symbol -- <SET>, the exchange said. There will initially be seven series of strike prices for each contract month of the new options -- one strike price "at the money," or near to the actual spot index value, and three above and three below the spot index. Position limits in any combination of both the new and existing S and P 500 options will be 15,000 contracts. The exchange said in the rare event that a stock does not open on expiration Friday, the previous day's closing price of that stock will be used to calculate the settlement value of the index. Reuter  9-APR-1987 17:35:06.68 usa ec F A RM f2743reute r f BC-EC-WARNS-AGAINST-PASS 04-09 0111  EC WARNS AGAINST PASSAGE OF TEXTILE BILL WASHINGTON, April 9 - The European Community has told Congress that if textile legislation injuring EC interests is approved, there was no doubt the community would retaliate against U.S. exports. Roy Denmam, head of the EC delegation here, issued the warning in a letter to Senator Lloyd Bentsen, chairman of the Finance Committee. A copy of the letter was provided Reuters. Denmam told Bentsen, a Texas Democrat, that if the textile legislation passed on its own or was included in an omnibus trade bill and injured EC interests, "there should be no doubt that the EC will retaliate against the United States." He added that "at a time when U.S. textile exports to the EC are growing rapidly, one result of such retaliation would be a substantial reduction of U.S. exports and jobs." The textile legislation, backed strongly by the industry, hard hit by imports, and by senators from textile-producing states would impose new tough global quotas on textile imports and for the first time include Europe in the quotas. Reagan Administration officials have also opposed the textile legislation, saying that if it passed it would likely prompt a presidential veto. Denman made his comments on the textile issue in a general assessment of the Senate trade bill, titled S.490. He said he was concerned about provisions in the Senate bill that would limit, if not eliminate, the president's discretion if retaliating against nations for keeping their home markets closed to foreign goods. U.S. Trade Representative Clayton Yeutter has also opposed those provisions, arguing that presidential flexibility was needed in order to be able to negotiate with countries to open their markets, with retaliation being retained as a final, but discretionary, weapon. The pending overall trade legislation would force the Administration to consult often with Congress and seek its approval during step-by-step GATT negotiations. He said "enactment of S. 490 would reduce the confidence of other governments in America's commitment to multinational trade." Summing up the senate legislation, Denman said "a number of provisions of that bil may achieve the opposite of what is intended and lead to dangerous consequences for the world and the U.S. economy." Reuter  9-APR-1987 17:39:34.36 usa cboe C f2752reute u f BC-CBOE-TO-LIST-NEW-S-AN 04-09 0110  CBOE TO LIST NEW S AND P OPTIONS APRIL 20 CHICAGO, April 9 - The Chicago Board Options Exchange, CBOE, said it will list new Standard and Poor 500 stock index options beginning April 20 that will trade side-by-side with the existing S and P 500 options. The new S and P 500 option contract differs from the existing contract in that settlement of the new contract will be based on the opening value of the index on expiration Friday. Settlement of the existing contract is based on the closing value of the index on expiration Friday. The new opening settlement S and P 500 options will be offered only in months in which there are S and P 500 futures. Initial months to be listed in the new options will be June, September and December, the CBOE said. Dissemination of the settlement price of the new options will be made through a special ticker symbol -- <SET>, the exchange said. There will initially be seven series of strike prices for each contract month of the new options -- one strike price "at the money," or near to the actual spot index value, and three above and three below the spot index. Position limits in any combination of both the new and existing S and P 500 options will be 15,000 contracts. The exchange said in the rare event that a stock does not open on expiration Friday, the previous day's closing price of that stock will be used to calculate the settlement value of the index. Reuter  9-APR-1987 17:39:43.66 usa F f2753reute u f BC-THREE-TRADERS-INDICTE 04-09 0111  THREE TRADERS INDICTED FOR INSIDER TRADING NEW YORK, April 9 - A Grand Jury in Manhattan Federal Court indicted three arbitrageurs, charging they swapped inside information between their firms, Goldman Sachs and Co and Kidder Peabody and Co, court documents showed. Robert Freeman, head of risk arbitrage at Goldman Sachs and Co, Richard Wigton, an employee of Kidder Peabody Co Inc, and Timothy Tabor, also formerly with Kidder, were charged with trading on inside information between June 1984 and January 1986. They were arrested in February. The indictments also alledged that Goldman Sachs and Freeman made money on the insider trading scheme. According to the indictment, Freeman exchanged inside information with Martin Siegel, who at the time was a vice president of Kidder Peabody. Siegel pleaded guilty last February 13 to charges he participated in the conspiracy. The indictment charged Siegel passed on non-public information to both Wigton and Tabor from Freeman. Reuter  9-APR-1987 17:41:35.88 acq usa F f2762reute r f BC-GREAT-AMERICAN-MGMT<G 04-09 0102  GREAT AMERICAN MGMT<GAMI> HAS ATCOR<ATCO> STAKE WASHINGTON, April 9 - Great American Management and Investment Inc told the Securities and Exchange Commission it acquired a 7.7 pct stake in Atcor Inc. Great American said it bought the stake for investment. It added that it has also considered--but not yet decided--to buy additional Atcor shares, either in the open market, in private transactions, through a tender offer or otherwise. Great American said it paid about 6.1 mln dlrs for its 462,400 Atcor shares. It said its most recent purchases included 191,400 shares bought March 18-April 6. Reuter  9-APR-1987 17:42:26.40 earn usa F f2764reute h f BC-RAI-RESEARCH-CORP-<RA 04-09 0072  RAI RESEARCH CORP <RAC> 3RD QTR FEB 28 NET HAUPPAUGE, N.Y., April 9 - Oper shr one ct vs 13 cts Oper net 17,806 vs 312,692 Revs 1,318,165 vs 2,239,349 Nine mths Oper shr 27 cts cs 28 cts Oper net 640,156 vs 671,291 Revs 5,612,818 vs 5,632,044 Note: Oper excludes gain from discontinued operations of 15,598 for year-ago qtr and loss from discontinued operations of 49,040 for year-ago nine mths. Reuter  9-APR-1987 17:42:36.85 earn canada E F f2765reute r f BC-moore 04-09 0110  MOORE <MCL> SEES SUBSTANTIAL 1987 PROFIT GAIN TORONTO, April 9 - Moore Corp Ltd expects 1987 profits from continuing operations will exceed 1986 results and recover to 1985 levels when the company earned 152 mln U.S. dlrs or 1.70 dlrs a share, president M. Keith Goodrich said. "We'll have a substantial increase in earnings from continuing operations," he told reporters after the annual meeting. He said he expected profits would recover last year's lost ground and reach 1985 results. In 1986, profits from continuing operations slumped to 139.5 mln dlrs or 1.54 dlrs a share. The total excluded losses of 30 mln dlrs on discontinued operations. Goodrich said Moore is still actively looking for acquisitions related to its core areas of business forms manufacturing or handling. "We could do a large acquisition," he said when asked if the company could raise as much as one billion dlrs for this purpose. Chairman Judson Sinclair, answering a shareholder's question, told the annual meeting that a special resolution passed by shareholders to create a new class of preferred shares would allow Moore to move quickly if it decided to pursue an acquisition. "If we were to make a major acquisition ... it means we can move with a certain expediency," Sinclair said. Asked if the resolution was designed to give Moore protection from a possible hostile takeover, Sinclair said only, "I know of no threat to the corporation at this time." Reuter  9-APR-1987 17:47:39.74 usa F f2772reute r f BC-ARVIN-<ARV>-RAISES-NU 04-09 0081  ARVIN <ARV> RAISES NUMBER OF AUTHORIZED SHARES COLUMBUS, Ind., April 9 - Arvin Industries Inc said its shareholders at the annual meeting voted to increase authorized common shares to 50 mln from 30 mln. The company told shareholders that the offering of 1.7 mln common shares in January raised 50 mln dlrs, and the 500 shares of variable rated preferred stock offered in February also raised 50 mln dlrs. The company said it also placed 150 mln dlrs in long-term debt in March. Reuter  9-APR-1987 17:49:07.93 usa F f2775reute r f BC-RAYTHEON-<RTN>-WINS-U 04-09 0085  RAYTHEON <RTN> WINS U.S. NAVY CONTRACT LEXINGTON, Mass., April 9 - Raytheon Co said the United States Navy awarded it a 215.3 mln dlr contract to produce 1,927 AIM/RIM-7M Sparrow Missile Guidance and Control Sections and associated hardware. Under the contract, the company said it will provide missiles and associated hardware to the U.S. Navy and Air Force and to several U.S. allies. Raytheon said the contract represents the major share of the fiscal 1987 competitive Sparrow missile procurement. Reuter  9-APR-1987 17:50:16.86 acq usa F f2777reute r f BC-FIRM-HAS-14.8-PCT-OF 04-09 0102  FIRM HAS 14.8 PCT OF DECISION/CAPITAL FUND<DCF> WASHINGTON, April 9 - Gabelli Group Inc said it and two subsidiaries held a total of 295,800 Decision/Capital Fund Inc shares or 14.8 pct of the total outstanding. It said the shares were held on behalf of investment clients and it said it had no intention of seeking control of the fund. Gabelli said its most recent purchases of Decision/Capital Fund stock included 95,800 shares bought April 3-6 on the Philadelphia Stock Exchange. Gabelli is an investment firm headquartered in New York City. Its Gabelli and Co subsidiary is a brokerage firm. Reuter  9-APR-1987 17:51:34.88 usa A RM f2779reute r f BC-CONSUMERS-POWER-<CMS> 04-09 0077  CONSUMERS POWER <CMS> TO REDEEM BONDS JACKSON, Mich., April 9 - Consumers Power Co said it has 56 mln dlrs available to be used to redeem at par any 15 pct series first mortgage bonds that are not exchanged under an outstanding bond exchange program. The utility on March 17 offered to exchange its 15 pct first mortgage bonds due March 1, 1994 for a new series of first mortgage bonds, 9-1/4 pct due April 1, 1997. The offer will expire April 14, 1987. Reuter  9-APR-1987 17:52:21.04 usa F f2782reute u f BC-SEMICONDUCTOR-BOOK-TO 04-09 0110  SEMICONDUCTOR BOOK TO BILL RATIO AT 1.21 PCT CUPERTINO, Calif., April 9 - The Semiconductor Industry Association put the three-month average book-to-bill ratio at 1.21, which was above analysts' expectations and reflects the sixth straight increase in this indicator of computer industry activity. Average booking in the three month period ended in March totaled 910.8 mln dlrs, up 15.6 pct from a month ago and the highest bookings since September, 1984. March billings, or computer chip sales in the month, totaled 912.1 mln dlrs, up 34.6 pct from a month ago, the association said. The three month average billings totaled 751.3 mln dlrs, up 6.5 pct. March billings were the strongest recorded since November, 1984, the association said. The book to bill ratio, at 1.21, was the highest since May, 1984, it noted. Preliminary total solid state shipments for the first quarter of 1987 totaled 2.25 billion dlrs, up 4.9 pct from last quarter and up 15.9 pct from last year's first quarter. Semiconductor Industry Association President Andrew Procassini said the rise in the book to bill was due to a substantial increase in U.S. bookings during March. "We believe that the bookings increase reflects growing confidence by electronic equipment manufacturers that some end-equipment market segments have improved substantially during the first quarter," Procassini said in a statement. The association also revised its book-to-bill ratio estimate for the three months ended in February to 1.12, from 1.13 earlier. It further revised the January book-to-bill figure to 1.09 from 1.12 estimated earlier. The three-month average book-to-bill ratio of 1.21 for March means for every 100 dlrs worth of product shipped, computer chip maker received 121 dlrs in new orders. Drexel Burnham Lambert Inc analyst Michael Gumport said association numbers indicate March orders were up 20 pct above the normal seasonal level. The association does not break out March orders from its three-month average, which it put at 910.8 mln dlrs. Gumport noted the three-month average bookings were well above the 800-865 mln dlrs anticipated by the industry. He said semiconductor stock could rise five to ten pct on the stock market open tomorrow, due to the positive numbers. "Skeptics are going to have to have some pretty strong reasons not to like this group (of stocks)," Gumport said. Kidder Peabody and Co analyst Michael Kubiak said the ratio indicates March orders at about one billion dlrs, which would be the highest monthly order rate since April, 1984. He predicted at least a five pct rise in semiconductor stocks on the open, and said the stock group could soar as high as 15 pct during the session. "One month does not a boom-time make, but this is very good news," he said. Kubiak attributed the stong semiconductor orders to strength in the personal computer market, inventory restocking and strong buying by distributors. Purchasing managers had been keeping computer chip inventories low, due to the overcapacity in the industry and the slow growth of the economy in general, analysts noted. The semiconductor industry has been in a slump for the past three years. The analysts said the March order and sales numbers are the strongest evidence yet that the trend may be turning. Nevertheless, they do not expect the Administration to retreat from proposed sanctions against Japanese chip makers. They added, however, if the industry continues to improve, it could mean the sanctions will be short term. Jack Beedle, President of In-Stat, an electronics industry research firm, called the March numbers "excellent", but also cautioned against excessive optimism. "I still believe caution should be the word, rather than euphoria," said Beedle, adding that he has yet to see strong indications from the general economy or the computer industry that support a solid, long-term recovery. Beedle said while he thinks the semiconductor industry will have a very good second quarter, he still thinks positive shifts in exports and industrial production are needed to sustain a recovery. Reuter  9-APR-1987 17:54:38.77 acq usa F f2786reute u f BC-PARTNERSHIP-BUYS-IPCO 04-09 0097  PARTNERSHIP BUYS IPCO <IHS> STAKE OF 6.8 PCT WASHINGTON, April 9 - MP Co, a New York investment partnership, told the Securities and Exchange Commission it bought a 6.8 pct stake in IPCO Corp common stock. The partnership said it acquired 346,600 IPCO shares, paying 4.9 mln dlrs, because it believed the securities to be "an attractive investment opportunity." It said it planned to regularly review its investment and may in the future recommend business strategies or an extraordinary corporate transaction such as a merger, reorganization, liquidation or asset sale. The partnership is controlled by Marcus Schloss and Co Inc, a New York brokerage firm, and Prime Medical Products Inc, a Greenwood, S.C., medical supplies firm. Reuter  9-APR-1987 17:56:18.18 earn usa F f2792reute d f BC-DELMED-INC-<DMD>-YEAR 04-09 0081  DELMED INC <DMD> YEAR LOSS FREEHOLD, N.J., April 9 - Oper shr loss 30 cts vs loss 1.27 dlrs Oper net loss 8,648,000 vs loss 25.6 mln Revs 27.4 mln vs 33.3 mln Avg shrs 29.1 mln vs 20.1 mln Note: Oper excludes loss on provision for discontinued operations of 971,000 vs 12.2 mln and loss from conversion of debt 587,000 vs gain of 1,734,000. 1985 oper excludes loss from pension plan liquidation of 631,000 and loss from discontinued operations of 1,015,000. Reuter  9-APR-1987 17:56:55.34 usa F f2793reute r f BC-MARCH-TRUCK-SALES-SAI 04-09 0058  MARCH TRUCK SALES SAID UP 16.4 PCT DETROIT, April 9 - Retail sales of trucks in March rose 16.4 pct over the same month last year, said the Motor Vehicle Manufacturers Association. The trade group said dealers sold 377,617 trucks in March, up from 324,327 last year. Year-to-date truck sales were up 3.6 pct at 934,074 from 1986's 901,757. Reuter  9-APR-1987 18:01:43.61 usa F f2798reute r f AM-ASPIRIN (EMBARGOED) 04-09 0097  DRUG INDUSTRY ATTACKED ON ASPIRIN ISSUE CHICAGO, April 9 - Elements of the drug industry endangered the lives of children by pressuring the government to delay a now common warning on the link between aspirin and an often fatal disease, a doctor said. The warning involving Reye's Syndrome has since been required on aspirin products under a Food and Drug Administration (FDA) directive of one year ago, and now appears on the labels of aspirin and aspirin-containing products. The industry under government coaxing began voluntarily printing warning labels in mid-1985. But in an editorial in this week's Journal of the American Medical Association, Dr Edward Mortimer of Case Western Reserve University in Cleveland said some aspirin manufacturers misled physicians and acted irresponsibly in opposing the warning for several years before then. Mortimer's criticism was prompted by a new government study published in the same issue of the Journal which said it had found a "strong association" between aspirin and Reye's Syndrome. Reye's Syndrome, which kills about 20 per cent of its victims, strikes following chicken pox, influenza and other illnesses. Symptoms include lethargy, belligerence and excessive vomiting. Those who survive sometimes suffer brain damage. Reuter  9-APR-1987 18:04:04.54 acq E F f2802reute b f BC-cadillac-fairview-say 04-09 0011  ******CADILLAC FAIRVIEW SAYS IT HAS RECEIVED SOME ACQUISITION PROPOSALS Blah blah blah.  9-APR-1987 18:04:24.13 usa F f2803reute r f BC-GM-<GM>-UNIT-GETS-BOE 04-09 0053  GM <GM> UNIT GETS BOEING <BA> CONTRACT IRVINE, Calif., April 9 - General Motors Corp's Hughes Aircraft Co said it received a contract worth more than 20 mln dlrs from Boeing Co's Boeing Commercial Airplane Co. Hughes will supply a cabin entertainment and service system for Boeing's new 747-4000 jumbo jetliners. Reuter  9-APR-1987 18:05:37.57 usa F f2804reute d f BC-AUDEC-IN-PRIVATE-PLAC 04-09 0057  AUDEC IN PRIVATE PLACEMENT OF STOCK, WARRANTS SADDLEBROOK, N.J., April 9 - <Audec Corp> said it sold privately 24 units, each consisting of 40,000 common shares and 40,000 redeemable common share purchase warrants, for a total of 480,000 dlrs. Audec said the sale was part of its plan to place a total of 28 units at 20,000 dlrs each. Reuter  9-APR-1987 18:09:50.90 usafrance worldbankimf RM A f2808reute u f BC-FRENCH-PROPOSE-NEW-WO 04-09 0109  FRENCH PROPOSE NEW WORLD BANK DEBT FACILITY WASHINGTON, April 9 - The French government said it proposed the creation of a new facility for development and for debt reduction under the framework of the World Bank. In a statement issued in conjunction with the meeting of the International Monetary Fund's policy-making Interim Committee, the French said the "multilateral resources thus collected would permit a partial refinancing on highly concessional terms of previously rescheduled official debts." The statement said the "French government believes it is necessary to take new steps to deal with the issue of the poorest countries' debt." The French statement said that Paris club reschedulings should have a lengthening of the repayment period up to between 15 and 20 years instead of the current limit of 10 years. And grace periods would be extended. "These measures would be confined to the poorest, heavily indebted countries and would be decided on a case-by-case basis," it said. The French also called for making the IMF's compensatory financing facility for export shortfalls more concessional. Reuter  9-APR-1987 18:10:34.32 acq canada E F f2810reute r f BC-cadillac-fairview-say 04-09 0066  CADILLAC FAIRVIEW SAYS IT RECEIVED TAKEOVER BIDS Toronto, April 9 - <Cadillac Fairview Corp Ltd> said it received proposals to acquire the company, following its announcement last August that it had retained investment dealers to solicit offers for all outstanding common shares. Cadillac Fairview said the offers are subject to clarification and negotiation and offered no further details. Reuter  9-APR-1987 18:16:05.61 usa F f2816reute r f BC-ONE-CHRYSLER-<C>-PLAN 04-09 0083  ONE CHRYSLER <C> PLANT TO WORK OVERTIME DETROIT, April 9 - Chrysler Corp said one of its U.S. car and truck assembly plants will work overtime next week. Six of its seven U.S. facilities will work during the week. The plant on overtime, both during the week and on Saturday, April 11, is the company's Sterling Heights, Mich., factory. The company's U.S. plants and offices will be closed Friday, April 17, and Monday, April 20, for the Good Friday and Martin Luther King Jr. holidays. Reuter  9-APR-1987 18:19:25.11 usa ec C G f2817reute d f BC-EC-WARNS-AGAINST-PASS 04-09 0131  EC WARNS AGAINST PASSAGE OF TEXTILE BILL WASHINGTON, April 9 - The European Community (EC) will retaliate against U.S. textile exports if Congress passes trade legislation damaging European interests, an EC official warned today. Roy Denman, head of the EC delegation here, issued the warning in a letter to Senator Lloyd Bentsen, chairman of the Finance Committee. A copy was provided to Reuters. The bill, backed by the textile industry and senators from textile-producing states, would impose global quotas on textile imports and for the first time include Europe. Denman said he was concerned about provisions in the bill that would limit, if not eliminate, the president's discretion in retaliating against nations that keep their home markets closed to foreign goods. Reuter  9-APR-1987 18:20:35.91 shipcrude usa C f2818reute u f BC-ny-tankers 04-09 0084  N.Y. TANKERS - April 9 Tennaco took Nicopolis part cargo 50,000 tons dirty April 12 Caribbean to U.S. Gulf worldscale 130 Exxon took Brazil Glory 77,000 tons dirty April 17 East Coast Mexico to U.S. Atlantic Coast worldscale 75 Champlin took Tamba Maru part cargo 57,000 tons crude April 18 Caribbean to U.S. Gulf worldscale 105 Pecten took World Cliff part cargo 74,500 tons dirty April 14 Sullom Voe to U.S. Atlantic Coast/U.S. Gulf worldscale 70 for Atlantic Coast worldscale 67.5 for Gulf Crown Petroleum took British Skill (Gotco relet) part cargo 100,000 tons dirty April 18 West Africa to U.S. Gulf worldscale 63 Oroleum took Marika P. part cargo 59,000 tons dirty April 16 Caribbean to U.S. Atlantic Coast/U.S. Gulf rate not reported Reuter  9-APR-1987 18:21:04.22 acq usa F f2819reute d f BC-WINTERHALTER-<WNTLC> 04-09 0044  WINTERHALTER <WNTLC> HOLDERS OKAY TAKEOVER ANN ARBOR, Mich., April 9 - Winterhalter Inc said its shareholders approved the 525,000 dlr acquisition of Winterhalter by Interface Systems Inc <INTF>. The acquisition would be for 15 cts per Winterhalter share. Reuter  9-APR-1987 18:24:01.68 usa F f2822reute d f BC-LIBERTY-FINANCIAL-<LF 04-09 0078  LIBERTY FINANCIAL <LFG> PRESIDENT TO RESIGN HORSHAM, Pa., April 9 - Harold H. Kline, 48, will resign on May one as president of Liberty Financial Group Inc and its Liberty Savings Bank unit to pursue other business opportunties, the company said. The company said Kline's post will be filled by Charles G. Cheleden, chairman and chief executive officer. Kline will continue to serve on the boards of Liberty Financial and Liberty Savings, the company added. Reuter  9-APR-1987 18:25:31.98 usa F f2824reute r f BC-IMMUNOMEDICS-<IMMU>-T 04-09 0105  IMMUNOMEDICS <IMMU> TO SELL COMMON STOCK NEWARK, N.J., April 9 - Immunomedics Inc said it filed a registration statement with the Securities and Exchange Commission for the proposed sale of 2,500,000 shares of common stock. The company said it will sell 2,100,000 shares and that certain stockholders will sell the remaining 400,000 shares. Proceeds from the offering will be used for product development, basic research, staff expansion, prepayment of debt, capital expenditures and working capital, the company said. The offering will be co-managed by E.F. Hutton and Co Inc and First Boston Corp, Immunomedics said. Reuter  9-APR-1987 18:29:26.90 usa F Y f2826reute u f BC-MOBIL-(MOB)-WILL-NOT 04-09 0095  MOBIL <MOB> WILL NOT INCREASE BUDGET DALLAS, April 9 - Mobil Corp Chairman Allen E. Murray said the company's exploration and production budget would not be increased in the foreseeable future as it is "operating on the assumption that (oil) prices will remain on the lower end of the spectrum. "Our budget is at about the same level as it was last year and I think it is the right amount," said Murray who was in town for ceremonies celebrating the consolidation of Mobil's domestic exploration and production operations into a new, locally-based subsidiary. Last year, Mobil spent a total of 2.13 billion dlrs on exploration and production, 341 mln dlrs in the United States and 1.79 billion overseas. Murray said the new subsidiary, Mobil Exploration and Production U.S. Inc., was not created as "part of any cost saving effort" but instead to "increase our efficiency and ability to stay ahead of the pack." The consolidation will, however, save Mobil about 15 mln dlrs annually once relocation and reorganization costs have been absorbed, according to A.F. Stancell, vice president of U.S. producing operations for the company. Mobil, the nation's second largest oil company, responded to the collapse of oil prices last year -- from 30 dlrs a barrel at end-1985 to as low as 10 dlrs in mid-1986 -- by laying off 5,500 people and cutting its budget in midyear by 27 percent, or 1.1 billion dlrs. Of that amount, more than 900 mln dlrs was eliminated from its exploration and spending spending plans. But the company reported an increase in profits in 1986 over 1985 and a jump in per share earnings to 3.45 dlrs a share from 2.55 dlrs. Reuter  9-APR-1987 18:31:32.77 earn canada E F f2833reute d f BC-<american-eagle-petro 04-09 0030  <AMERICAN EAGLE PETROLEUMS LTD> YEAR LOSS Calgary, Alberta, April 9 - Shr loss 10 cts vs profit 17 cts Net loss 1,546,000 vs profit 4,078,000 Revs 22.6 mln vs 38.9 mln Reuter  9-APR-1987 18:33:20.67 james-baker V RM f2836reute f f BC-******TREASURY'S-BAKE 04-09 0011  ******TREASURY'S BAKER SAYS DEBTOR NATIONS NEED TIMELY DISBURSEMENTS Blah blah blah.  9-APR-1987 18:36:11.47 usa F f2837reute r f BC-GM'S<GM>-HUGHES-AIRCR 04-09 0091  GM'S<GM> HUGHES AIRCRAFT HAS BOEING<BA> CONTRACT IRVINE, Calif, April 9 - General Motors' Hughes Aircraft Co said it was awarded a contract worth more than 20 mln dlrs by Boeing's Boeing Commercial Airplane Co to provide an advanced cabin entertainment and service system for Boeing's new 747-400 airliners. Hughes said the new system uses advanced digital electronic techniques and also adds cabin lighting control, cabin advisory signs and seat information. Hughes said the first 747-400 is scheduled to be completed in early 1988. Reuter  9-APR-1987 18:36:43.22 usa reagan V f2838reute u f BC-REAGAN-HITS-HOUSE-PAS 04-09 0070  REAGAN HITS HOUSE-PASSED BUDGET WEST LAFAYETTE, Ind, April 9 - President Reagan criticized the House-passed budget by saying the Democratic budget plan was just business as usual. The budget cut defense by eight billion dlrs and called for 18 billion dlrs in new taxes. He said the defense cut potentially theratened national security and was asking the American taxpayers to pay for the Democrats' excesses. Reuter  9-APR-1987 18:36:56.22 usa RM A f2839reute r f BC-S/P-DOWNGRADES-ZENITH 04-09 0053  S/P DOWNGRADES ZENITH ELECTRONIC <ZE> NEW YORK, April 9 - Standard and Poor's said it lowered its rating on 190 mln dlrs of Zenith Electronic Corp debt because of continued poor earnings results and increased debt leverage. Among the rating changes, the company's senior debt was lowered to BB-plus from BBB-plus. Reuter  9-APR-1987 18:39:02.17 usa RM A f2841reute r f BC-MOODY'S-DOWNGRADES-RE 04-09 0102  MOODY'S DOWNGRADES REPUBLICBANK <RPT> NEW YORK, April 9 - Moody's Investors Service said it lowered the ratings on 464 mln dlrs of long-term debt issued by RepublicBank Corp and its two principal subsidiaries but upgraded 451 mln dlrs of securities of Interfirst Corp <IFC>. The rating adjustments are based on the likelihood that the proposed merger of the two Texas banks will be consummated. Moody's said Interfirst is considerably the weaker of the two institutions. Among the rating changes, RepublicBank's senior debt was downgraded to BA-1 from BAA-1 while Interfirst's was raised to BA-1 from B-1. Reuter  9-APR-1987 18:39:51.11 usa james-baker imf V RM f2842reute b f BC-TREASURY'S-BAKER-CALL 04-09 0092  TREASURY'S BAKER CALLS FOR MORE BANK FLEXIBILITY WASHINGTON, April 9 - Treasury Secretary James Baker said that commercial banks need to develop more flexibility in their concerted lending mechanisms "to help assure continued participation in new money packages." He said that major debtor nations need to be able to count on receiving timely disbursements on new loans essential to support well-conceived economic programs. His remarks were made to the afternoon session of the International Monetary Fund's policy making Interim Committee. Baker said, "The sense of urgency and willingness to cooperate in support of a larger general interest that helped to carry us through the difficult crisis period of 1982 and 1983 is now less evident." He said to address this problem, it is important for the commercial banks to "develop a menu of alternative new money options from which all banks with debt exposure can choose in providing continuing support for debtor reforms." He said the "continued implementation of the debt strategy may well rest on their doing so." Baker also said that growth prospects for the lowest income countries remain an issue of "critical concern to the United States." He said that he intended to address the problem of poor country prospects in greater detail at tomorrow's meeting of the joint IMF-World Bank Devlopment Committee. Baker said, however, that ministers should guard against what appear to be magical solutions to the complex debt problem. "I want to stress the need for all to guard against the ephemeral attraction of magical solutions, which may appear as tantalizing alternatives to the rigorous realities of grappling with our debt problems," he said. But he emphasized that the only lasting progress is to approach each situation on a case-by-case basis, "bringing to bear the policies and financing needed to bring the economy back to sustained economic growth." Reuter  9-APR-1987 18:41:59.03 trade chile RM A f2844reute u f BC-chilean-trade-surplus 04-09 0107  CHILEAN TRADE SURPLUS NARROWS SLIGHTLY IN FEBRUARY Santiago, april 9 - chile's trade surplus narrowed to 102.2 mln dlrs in february, from 105.4 mln dlrs in the same month last year, but it was above the 18.2-mln-dlr surplus recorded in january 1987, the central bank said. Exports in february totalled 379.4 mln dlrs, 17.2 pct above the january figure. Imports fell 9.2 pct from the previous month to 277.2 mln dlrs. The figures for the same month last year were 314 mln and 208.6 mln dlrs, respectively. The accumulated trade surplus over the first two months of 1987 stands at 120.4 mln dlrs against 132.8 mln dlrs the previous year. Reuter  9-APR-1987 18:42:19.11 interestmoney-fxdlr usa RM A f2845reute u f BC-ANALYSTS-DOUBT-FED-FI 04-09 0112  ANALYSTS DOUBT FED FIRMED DESPITE BORROWING RISE By Martin Cherrin, Reuters NEW YORK, April 9 - Economists said that they doubt the Federal Reserve is firming policy to aid the dollar, despite higher discount window borrowings in the latest two-week statement period and very heavy borrowings Wednesday. Data out today show net borrowings from the Fed averaged 393 mln dlrs in the two weeks to Wednesday, up from 265 mln dlrs in the prior statement period. Wednesday borrowings were 1.4 billion dlrs as Federal funds averaged a high 6.45 pct. "One could make a case that the Fed is firming, but it probably isn't," said William Sullivan of Dean Witter Reynolds. Sullivan said some may assume the Fed has firmed policy modestly to support the dollar because net borrowings in the two-weeks to Wednesday were nearly 400 mln dlrs after averaging around 250 mln dlrs over the previous two months. However, the Dean Witter economist noted that the latest two-week period included a quarter end when seasonal demand often pushes up borrrowings. "Some might argue that the Fed was firming policy, but it looks like it tried to play catchup with reserve provisions late in the statement period and didn't quite make it," said Ward McCarthy of Merrill Lynch Capital Markets. A Fed spokesman told a press press conference today that the Fed had no large net one-day miss of two billion dlrs or more in its reserve projections in the week ended Wednesday. Still, McCarthy said it may have had a cumulative miss in its estimates over the week that caused it to add fewer reserves earlier in the week than were actually needed. The Fed took no market reserve management action last Thursday and Friday, the first two days of the week. It added temporary reserves indirectly on Monday via two billion dlrs of customer repurchase agreements and then supplied reserves directly via System repurchases on Tuesday and Wednesday. Based on Fed data out today, economists calculated that the two-day System repurchase agreements the Fed arrranged on Tuesday totaled around 5.9 billion dlrs. They put Wednesday's overnight System repos at approximately 3.4 billion dlrs. "It is quite clear that the Fed is not firming policy at this time," said Larry Leuzzi of S.G. Warburg and Co Inc. Citing the view shared by the other two economists, Leuzzi said the Fed cannot really afford to seriously lift interest rates to help the dollar because that would harm already weak economies in the United States and abroad and add to the financial stress of developing countries and their lenders. "Those who believe the Fed tightened policy in the latest statement period have to explain why it acted before the dollar tumbled," said McCarthy of Merrill Lynch. He said the dollar staged a precipitous drop as a new statement period began today on disappointment yesterday's Washington meetings of international monetary officials failed to produce anything that would offer substantive dollar aid. In fact, currency dealers said there was nothing in Wednesday's G-7 communique to alter the prevailing view that the yen needs to rise further to redress the huge trade imbalance between the United States and Japan. The economists generally agreed that the Fed is aiming for steady policy now that should correspond to a weekly average Fed funds rate between six and 6-1/8 pct. This is about where the rate has been since early November. "I'm not so sure that the Fed is engineering a tighter policy to help the dollar, as some suspect," said Sullivan of Dean Witter. If it is, however, he said that Fed probably has just nudged up its funds rate goal to around 6.25 to 6.35 pct from six to 6.10 pct previously. Reuter  9-APR-1987 18:45:25.86 usapakistan worldbank RM f2848reute r f BC-PAKISTAN-GETS-70-MLN 04-09 0105  PAKISTAN GETS 70 MLN DLR WORLD BANK LOAN WASHINGTON, April 9 - The World Bank said it approved a 70-mln-dlr, 20-year loan to assist Pakistan in a project designed to improve power plant efficiency. Noting that a shortage of power constrains Pakistan's economic development, the Bank said one objective of the project is to provide at least 200 megawatts of additional generating capacity. Another objective is to improve the efficiency with which hydrocarbons are used by Pakistan's Water and Power Development Authority (WAPDA) in power production, it said. One effect of this would be reduced atmospheric pollution. Reuter  9-APR-1987 18:47:26.32 earn usa F f2853reute h f BC-VALEX-PETROLEUM-INC-< 04-09 0042  VALEX PETROLEUM INC <VALP> YEAR DEC 31 DENVER, Colo, April 9 - Shr loss six cts vs loss 84 cts Net loss 219,632 vs loss 16.3 mln Revs 1.4 mln vs 2.8 mln NOTE:1985 net includes 15.5 mln dlrs of writedowns and tax benefit of 51,294. Reuter  9-APR-1987 18:50:11.20 usa F f2855reute h f BC-VALEX-PETROLEUM-<VALP 04-09 0052  VALEX PETROLEUM <VALP> RECLASSIFIES DEBT DENVER, Colo, April 9 - Valex Petroleum Inc said its 1.3 mln dlrs in long-term debt with a commercial bank was reclassified as a current liability, which resulted in its auditors giving it a qualified opinion. Earlier, Valex reported a net loss 219,632 for 1986. Reuter  9-APR-1987 18:52:32.99 usa F f2856reute h f BC-DATA-ARCHITECTS-<DRCH 04-09 0052  DATA ARCHITECTS <DRCH> TO MAKE OFFERING WALTHAM, Mass, April 9 - Data Architects inc said it intends to make a public offering of 850,000 shares of its common stock, of which 672,000 shares will be sold by the company and 178,000 by certain shareholders. Proceeds will be used for general corporate purposes. Reuter  9-APR-1987 18:58:51.24 usa F f2860reute h f BC-FIVE-DIRECTORS-OF-TER 04-09 0051  FIVE DIRECTORS OF TERRAPET ENERGY RESIGN DALLAS, April 9 - <Terrapet Energy Corp> said five directors resigned because they could not obtain directors and officers liability insurance. It said the directors are Dean R. Fellows, Frederick B. Hegi Jr, W.D. Masterson, Thomas Sturgess and John C. Thomas. Reuter  9-APR-1987 19:03:16.01 usa F f2863reute u f BC-GOLDMAN,-SACHS-COMMEN 04-09 0109  GOLDMAN, SACHS COMMENTS ON FREEMAN INDICTMENT NEW YORK, April 9 - Goldman, Sachs and Co, responding to the indictment earlier today of Robert M. Freeman, who remains head of its risk arbitrage unit, said it believes the 44-year-old executive did not violate insider trading laws. "Based on all we now know, we continue to believe in him and to believe that he did not act illegally," the company said in a statement. Freeman was indicated by a federal grand jury along with two other top Wall Street executives, Richard Wigton and Timothy Tabor, for allegedly swapping insider information in a scheme that produced millions in illegal profits. The company said it based in belief in Freeman's innocence on an investigation conducted by its independent outside counsel after Freeman was arrested in February. Reuter  9-APR-1987 19:05:53.65 usamauritius worldbank A RM f2867reute r f BC-MAURITIUS-GETS-25-MLN 04-09 0091  MAURITIUS GETS 25 MLN DLR WORLD BANK LOAN WASHINGTON, April 9 - The World Bank said it approved a 25 mln dlr structural adjustment loan for Mauritius to aid that country's industrial sector. The Bank said the 17-year loan will support policy reforms designed to help increase the efficiency of the country's manufacturing sector, develop export enterprises and encourage efficient use of resources. It added, "The increased availability of foreign exchange for imports is expected to help the expansion of industrial output and exports." Reuter  9-APR-1987 19:24:29.96 canada tose E f2871reute r f BC-power 04-09 0119  TORONTO FINANCIAL DISTRICT HIT BY POWER OUTAGE TORONTO, April 9 - Toronto's financial district, the business heart of Canada, slowed to a near halt this afternoon after being struck by a power blackout, utility and business officials said. The blackout occurred around 1515 EDT in about an eight-square-block section of the city's downtown core, home to most of the city's skyscrapers, containing the headquarters of many of Canada's major corporations and financial institutions. Ontario Hydro spokeswoman Christina Warren told Reuters the blackout occurred when a transformer cable went down during routine maintenance at a downtown hydroelectricity station. Power was restored after 10 minutes. The power loss halted floor trading for 15 minutes on the Toronto Stock Exchange, Canada's largest equity market, although computerized trading - accounting for about 20 per cent of the Exchange's normal volume - continued, Toronto Stock Exchange official John Kolosky said. Bank operations were also affected. The headquarters or major offices of Canada's six major banks line a small section of Bay Street, the Wall Street of Canada. Bank of Montreal spokesman Brian Smith told Reuters the blackout shut down electronic banking machines and caused a minor slowdown in money trading operations, although "all in all we were not seriously affected." Officials at various downtown skyscrapers said the blackout also briefly shut down elevators and disrupted business in the downtown core's extensive network of underground shopping malls. Workers at some of the buildings said several people were briefly trapped on elevators, but police and firefighters reported no serious problems. Reuter  9-APR-1987 19:36:34.99 usa A RM f2876reute r f BC-U.S.-THRIFT-OFFICIAL 04-09 0119  U.S. THRIFT OFFICIAL URGES MORE LENDER INSURANCE NEW YORK, April 9 - The Administration's 15 billion dlr plan to recapitalize the Federal Savings and Loan Insurance Corporation is needed to ensure the future profitablity of the U.S. thrift industry, according to a top industry regulator. "Today thrifts in overwhelming numbers are profitable," Shannon Fairbanks, executive chief of staff of the Federal Home Loan Bank Board told a thrift industry conference. "But every thrift is paying a market tax for the inabliity of regulators to deal with problems carried forward from the past," she said, referring to the premium that thrifts have to pay in the marketplace to entice deposits away from banks. "The industry wants to see a five billion dlr plan passed now, and then to wait and see what happens," Fairbanks said. "They're saying, 'we don't want to pay more right away.' The argument is that it's a drain on the industry." "But the dollars paid out can be recaptured in the reduction in the market tax differential," she said. "The cost of recapitalization to the industry would be recaptured in bottom line profitability." Fairbanks said that the public's confidence in thrift instititutions eroded with the financial difficulties of savings and loan associations in Ohio and Maryland in 1985. As thrift institutions in economically distressed areas like Texas have continued to fall on hard times, this has increased depositors' demand for a higher premium on deposits in savings and loans compared with premiums paid on deposits in commercial banks, she said. Before 1983, thrift institutions paid a 25 basis point yield differential on savings deposits over that offered by commercial banks as mandated by U.S. financial regulations. With the elimination in 1983 of regulations that had drawn strict lines between savings and loans and commercial banks, the gap widened to as much as 50 to 75 basis points as wary depositors demanded a higher premium to place their funds in thrift institutions, Fairbanks said. "The market tax paid by today's thrift industry is the most significant impediment to future profits," she said. Depositor confidence is also eroded by the existence of thrifts that are failing but manage to stay in business by paying deposit rates well above prevailing market rates. Presently, the FHLBB cannot afford to close failing institiutions "because we can't afford it with the current FSLIC fund," she said. Fairbanks estimated that the high market tax differential paid by thrifts will drop by at least 10 to 20 basis points with an adequate recapitalization of FSLIC because it will help restore this lost confidence. Reuter  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-017.sgm000066400000000000000000002417671154025176300231640ustar00rootroot00000000000000 21-APR-1987 11:35:01.50 coffee ukbrazil dauster C T f1400reute b f BC-IBC-COFFEE-AUCTIONS-T 04-21 0115  IBC COFFEE AUCTIONS TO START SOON - DAUSTER LONDON, April 21 - The Brazilian Coffee Institute, IBC, plans to sell in a series of auctions over the next few weeks robusta coffee purchased in London last year, but details of where and when auctions will take place are still to be finalised, IBC president Jorio Dauster told reporters. The sales of 630,000 bags of robusta and an unspecified amount of Brazilian arabica coffee will take place over a minimum of six months but it is not decided where sales will take place or whether they will be held weekly or monthly. The amount offered at each sale has also not been set, but could be in the order of 100,000 bags, Dauster said. Reuter  21-APR-1987 11:37:33.52 canada E f1416reute u f BC-AMCA-(AIL)-NAMES-NEW 04-21 0054  AMCA (AIL) NAMES NEW CHAIRMAN TORONTO, April 21 - AMCA International Ltd said it appointed president and chief executive officer WIlliam Holland to succeed Kenneth Barclay as chairman. Barclay, who is 60 years old, decided not to stand for reappointment as chairman this year but will continue as a director, AMCA said. Reuter  21-APR-1987 11:38:04.12 crude usa Y f1418reute u f BC-API-OIL-INVENTORY-REP 04-21 0081  API OIL INVENTORY REPORT TO BE ISSUED TONIGHT NEW YORK, APRIL 21 - The American Petroleum Institute, API, said its weekly U.S. petroleum inventory report will be issued tonight, despite many company closures on Friday of last week for the Easter holiday. The API report is usually released around 1700 EDT on Tuesday nights. The Energy Information Administration said it also expects its weekly oil statistic report to be released as usual, on Wednesday night at about 1700 EDT. Reuter  21-APR-1987 11:44:00.53 acq usa F f1442reute u f BC-FAIRCHILD 04-21 0095  SORO GROUP TO LIMIT FAIRCHILD <FEN> STOCK BUYS WASHINGTON, April 21 - Quantum Fund N.V., a Netherlands Antilles mutual fund for which New York investor George Soros is investment adviser, said it has agreed to limit further purchases of Fairchild Industries Inc stock. In a filing with the Securities and Exchange Commission, Quantum, which already holds 1,647,481 Fairchild common shares, or 11.5 pct of the total outstanding, said it agreed to the restriction after Fairchild said its security clearance might be jeopardized if Quantum acquires a major stake in it. But Quantum said Fairchild management was told that Soros, acting either individually or through entities other than Quantum that he controls, may decide to buy common stock in the company on his own behalf. Quantum had recently notified the Federal Trade Commission under the Hart-Scott-Rodino Antitrust Improvements Act of 1976 that it might buy up to 49.9 pct of Fairchild's voting stock. Unless the FTC had objected, Quantum would have been free, but not obligated, to buy up to 49.9 pct of Fairchild stock. Fairchild management, however, warned that if Quantum, a foreign entity, raises its stake in the company to 49.9 pct, it could "impair" the government security clearances Fairchild needs to carry out its its defense contract work. In response, Quantum said it told Fairchild it will not make "significant additional purchases" of its common or preferred stock without giving Fairchild enough prior notice to enable it to consult with Quantum over the impact of action. Quantum also said it has withdrawn its notification request to the FTC and the antitrust division of the Justice Department of its intent to buy up to 49.9 pct of Fairchild. Quantum also said it told the FTC and the Justice Department that it does not expect to resubmit any further notifications of intent to significantly raise its stake in Fairchild at this time. The restrictions Quantum has agreed to follow regarding further dealings in Fairchild stock do not apply to Soros as an individual investor. Fairchild's annual shareholders meeting is scheduled to be held tomorrow. Reuter  21-APR-1987 11:45:56.03 money-fx usa V RM f1446reute b f BC-/-FED-ADDS-RESERVES-V 04-21 0059  FED ADDS RESERVES VIA TWO-DAY REPURCHASES NEW YORK, April 21 - The Federal Reserve entered the U.S. Government securities market to arrange two-day System repurchase agreements, a Fed spokesman said. Dealers said that Federal funds were trading at 6-7/16 pct when the Fed began its temporary and direct supply of reserves to the banking system. Reuter  21-APR-1987 11:49:31.32 usa nasdaq F f1466reute d f BC-CAPITAL-ASSOCIATES-<C 04-21 0053  CAPITAL ASSOCIATES <CAII.O> TO TRADE ON NASDAQ COLORADO SPRINGS, Colo., April 21 - Capital Associates Inc said its common stock will be included in NASDAQ's national market system, starting today. Capital Associates is an equipment leasing and financial service company with headquarters in Colorado Springs, Colo. Reuter  21-APR-1987 11:52:37.63 copper usa C M f1486reute u f BC-/MINT-REVIEWS-OFFERS 04-21 0105  MINT REVIEWS OFFERS ON 3,701,000 LBS COPPER WASHINGTON, April 21 - The U.S. Mint received 17 offers from seven firms at prices ranging from 0.66845-0.6840 dlrs per lb for payment by standard check and 0.66695-0.68 dlrs per lb for wire transfer payment in a review of offers on 3,701,000 lbs of electrolytic copper it is seeking to purchase. Philipp Brothers, N.Y., led with the lowest offers of 0.66695 for wire transfer payment and 0.66845 dlrs per lb to be paid by check, followed by Cerro Sales Corp, N.Y., with 0.6684 dlrs per lb on one mln lbs for wire payment, and 0.6713 dlrs per lb on one mln lbs for standard payment. Firms, in submitting offers, elect to be paid by standard check or wire transfer, with awards based on whichever of the two methods is more cost advantageous at that time. Cerro Sales also offered prices for wire payment of 0.6689 dlrs per lb on one mln lbs and 0.6693 dlrs per lb on 1,701,000 lbs. Cerro's standard payment offers included 0.6719 dlrs per lb on one mln lbs and 0.6723 dlrs per lb on 1,701,000 lbs. Cargill Metals, Minneapolis, offered 0.67025 dlrs per lb for wire payment and 0.67275 dlrs per lb for standard payment, while Elders Raw Materials, Darien, Ct., offered 0.6718 dlrs per lb for wire payment and 0.6735 dlrs per lb for standard payment on increments of 950,000 lbs each. Other offers for wire transfer payment include 0.6759 dlrs per lb on 380,000 lbs, submitted by Deak International, N.Y., 0.6789 dlrs per lb on the entire quantity by Diversified Metals Corp, St. Louis, and 0.68 dlrs per lb by Gerald Metals, Stamford, Ct. Other standard payment offers include 0.6819 dlrs per lb on 950,000 lbs by Diversified Metals, and 0.6840 dlrs per lb on the entire quantity by Gerald Metals. The Mint said the copper is for delivery the week of May 11 to Olin Corp, East Alton, Ill. The offers have a minimum acceptance period of three calendar days, it said. Reuter  21-APR-1987 11:55:33.03 canada E F f1500reute r f BC-ahed-<aHM.TO>-may-iss 04-21 0076  AHED <AHM.TO> MAY ISSUE ONE MLN SHARES Toronto, April 21 - Ahed Corp said it began discussions with an investment dealer about issuing an additional one mln treasury shares in the near future. Ahed also said it believes recent increases in its stock price could be attributable to a published report describing the activities of the company. Ahed said no other events are known to have taken place which would cause these recent price increases. Reuter  21-APR-1987 11:55:57.82 usa F f1503reute r f BC-U.S.-WEST-<USW>-INTRO 04-21 0082  U.S. WEST <USW> INTRODUCES DATA NETWORK PRODUCT NEW YORK, April 21 - U.S. WEST INC said it introduced its first product for managing data networks, called the NETCENTER graphic network monitor. The product was developed by U.S. WEST Network Systems Inc, a subsidiary of U.S. WEST INC, it said. It will be distributed in the third quarter of 1987. The company said the product is aimed at companies with IBM SNA networks, and will allow customers control over their own networks. The initial license fee for a typical configuration will be in the 100,000 dlr to 300,000 dlr range, depending on the size of the network, the company said. Reuter  21-APR-1987 12:04:11.03 grainwheatbarleyoilseedrapeseed france C G f1537reute u f BC-FRENCH-WINTER-CEREAL 04-21 0106  FRENCH WINTER CEREAL SOWING SEEN LITTLE CHANGED PARIS, April 21 - The Ministry of Agriculture left its estimates of French winter cereal sowings for the 1986/87 campaign barely changed at 6.606 mln hectares compared with its previous forecast of 6.601 mln. This compared with the 6.41 mln ha of winter cereals harvested in the 1985/86 campaign. Winter soft wheat sowings were put at 4.647 mln ha compared with its previous estimate of 4.651 mln and 4.57 mln ha harvested last campaign. Winter barley plantings were forecast at 1.46 mln ha, unchanged from its previous estimate and compared with 1.41 mln harvested last season. The ministry put hard winter wheat sowings at 246,000 ha versus a February 1 estimate of 236,000 and actual area harvested last campaign of 217,000. Winter rape plantings were forecast at 627,000 ha against a previous estimate of 621,000 and 375,000 rpt 375,000 harvested in 1985/86. Reuter  21-APR-1987 12:11:18.43 gold canada F f1591reute r f BC-ENERGEX-MINERALS-<EGX 04-21 0101  ENERGEX MINERALS <EGX> MAY RUN UP TO THREE PITS VANCOUVER, British Columbia, April 21 - Energex Minerals Ltd said economic evaluation of reserves indicates high-grade operation from three open pits may be feasable based on five-year operation at 100 tons a day, a payback of less than 1-1/2 years. An increase in the project's life, profitability and scale is anticipated as additional reserves are developed in 1987, the company said. Current reserves are one mln long tons at 0.20 ounce gold per ton, all categories; proven-probable 262,242 long tons at 0.25 ounce gold per ton, the company said. Reuter  21-APR-1987 12:13:27.73 acq canada E F Y f1605reute r f BC-dome-<dmp>-executives 04-21 0083  TURNER TO MEET WITH DOME <DMP> EXECUTIVES Ottawa, April 21 - Liberal Party leader John Turner said he will meet with senior executives of Dome Petroleum Ltd in Calgary tomorrow to discuss the proposed sale of Dome. Turner's office said he will hold a news conference tomorrow at 1400 MDT (1600 EDT) in Calgary. Turner, who is opposition leader in Parliament, has criticized Dome's acceptance of a 5.1 billion dlr takeover bid from Amoco Corp <AN> as a sell-out of Canada's oil industry. Reuter  21-APR-1987 12:13:34.25 usa F f1606reute r f BC-NEW-YORK-TIMES-<NYT> 04-21 0079  NEW YORK TIMES <NYT> SEES UNEVEN GAINS IN 1987 HUNTSVILLE, Ala., April 21 - The New York Times Co said that if prevailing business conditions continue, the company sees "another outstanding year, although the remaining quarters of 1987 will probably not show uniform gains." The company's first quarter earnings rose 21 pct to 41.1 mln dlrs or 50 cts a share compared to 33.9 mln dlrs or 42 cts a share in the year-ago quarter restated for a two-for-one stock split. The company also said its newspaper division, which includes the New York Times and 32 regional newspapers, had a first quarter operating profit of 69.8 mln dlrs compared with 60.7 mln dlrs in the year-ago first quarter mainly due to advertising volume and rate increases. The company's magazine division, which includes "Family Circle," had a first quarter profit of 9.7 mln dlrs compared to 7.4 mln dlrs in the year ago quarter. The company's broadcasting and cable tv group reported an operating profit of 2.9 mln dlrs compared to 2.6 mln dlrs in the year-ago first quarter. Reuter  21-APR-1987 12:14:27.18 usa F A RM f1611reute u f BC-BANKERS-TRUST-<BT>-TI 04-21 0115  BANKERS TRUST <BT> TIES NET TO CURRENCY EARNINGS NEW YORK, April 21 - Bankers Trust New York Corp said its first quarter foreign exchange trading income rose to 82.8 mln dlrs from 20.9 mln dlrs in the first qtr of 1986, offsetting the bank's 7.4 mln dlr loss incurred from placing 540 mln dlrs of Brazilian loans on a non-accrual status. Earlier, the bank reported that first quarter net income increased to 124.2 mln dlrs, or 1.77 dlrs a share, from 115.9 mln dlrs, or 1.64 dlrs a share, a year ago. Bankers Trust chairman Alfred Brittain III said increased non-interest income, a lower provision for loan-losses and increased net interest income also helped first quarter net. Bankers Trust previously announced that the 540 mln dlrs in non-accruable Brazilian loans would cut its first quarter earnings by 7.4 mln dlrs, and could slice about 30 mln dlrs from the full year's net. Bankers Trust said non-interest income in the first quarter equaled 275.4 mln dlrs, up 37.1 mln dlrs from a year ago. Loan losses fell in the quarter to 22 mln dlrs, versus 40 mln dlrs a year ago while taxable net interest income remained flat at 266 mln dlrs, the bank said. Reuter  21-APR-1987 12:15:12.80 acq usa F Y f1618reute r f BC-ALTEX-<AII>-TO-SELL-O 04-21 0072  ALTEX <AII> TO SELL OILFIELD SERVICES ASSETS DENVER, April 21 - Altex Industries Inc said it agreed to sell the assets of its wholly-owned oilfield service subsidiary, Parrish Oil Tools Inc. The price and buyer were not disclosed. Altex said Parrish had a loss from operations of 428,000 dlrs on revenues of 881,000 dlrs in fiscal 1986 and a loss from operations of 48,000 dlrs on revenues of two mln dlrs in fiscal 1985. Reuter  21-APR-1987 12:17:02.35 usa F f1633reute r f BC-IMARK-INDS-<IMAR.O>-V 04-21 0041  IMARK INDS <IMAR.O> VOTES ANNUAL 25 CT DIVIDEND GENESEO, ILL., April 21 - Imark Industries Inc said its directors approved payment of an annual dividend of 25 cts on May 21, record May seven. The company paid the same dividend last year. Reuter  21-APR-1987 12:17:09.99 usa F f1634reute r f BC-DUQUESNE-LIGHT-<DQU> 04-21 0083  DUQUESNE LIGHT <DQU> HURT BY LEGISLATION PITTSBURGH, APril 21 - Duquesne Light Co president Wesley von Schack told shareholders that current state law and regulatory policies will result in higher capital rates and higher rates for customers. "Pennsylvania's recently enacted excess capacity legislation denies shareholders the opportunity to earn a fair return on their investment and undermines economic development in Pennsylvania," von Schack told shareholders at the annual meeting. Von Schack said two major bond rating agencies have recently downgraded Duquesne's credit rating due to regulatory uncertainty. The action will result in higher capital rates and higher rates for customers, he said. He said the Pennsylvania Utility commission indicated in its most recent rate case decision that even if newly constructed Perry No. 1 nuclear plant was in commercial operation, shareholders would be denied a return on their investment in the plant. Von Schack called on shareholders to join it and certain legislators' efforts to create a partnership to fight these issues and resolve these problems. Reuter  21-APR-1987 12:17:49.31 interestmoney-fxgnp kuwait RM f1638reute r f BC-CREATIVE-MONETARY-POL 04-21 0109  CREATIVE MONETARY POLICY TO SPUR KUWAITI ECONOMY By Rory Channing, Reuters KUWAIT, April 21 - Kuwait, a major oil producer hit by last year's price slump, is leaning towards a more creative monetary policy to help spur its economy, banking sources said. "There is a clear emphasis on encouraging the use of money in productive ventures, rather than having it all tied up in interest bearing investments which have no direct productive outlet," one banker said. Kuwait's Central Bank yesterday cut one key money market rate and abandoned another which had been used since February 1986 to direct inter-bank borrowing and lending costs. The bank reduced to six pct from 6-1/2 pct the rate at which it will offer funds of one month to one year in the inter-bank market. This, in turn, affected retail rates. The cut, the third this year, followed a major overhaul of interest rate policy last month which Central Bank Governor Sheikh Salem Abdul-Aziz al-Sabah said was designed to revive the economy. One banker said "There is growing flexibility, creativity, in interest rate policy, amid an awareness of the need to diversify the economy by stimulating the non-oil sector." For the first time in nearly three years domestic interest rates are now significantly below those for the U.S. Dollar, a favourite haven for Gulf speculative and investor funds in the past, banking sources said. Despite uncertainties generated by the 6-1/2 year old Iran- Iraq war on Kuwait's northern doorstep, bankers play down the prospect of any significant capital flight. The Kuwaiti dinar, whose value is set by the Central Bank and was fixed today at 0.27095/129 to the dollar, is stronger now than for several years. Fears that the dollar may fall further will prompt second thoughts among Kuwaiti investors prepared to consider switching funds into the U.S. Currency, the sources said. "There is a distinct exchange rate risk," they added. Bankers said the dollar slump hurt many investors behind the last major capital outflow in 1984, encouraged then by 18 pct U.S. Interest rates and the start of Iranian attacks on neutral shipping in the Gulf. The Central Bank calculates its dinar exchange rate against a basket of currencies. Bankers do not know the basket's exact make-up but say it is weighted heavily in favour of the dollar. Some bankers believe any strengthening of the dinar beyond 0.27000 to the dollar might provoke investors into shifting funds into the U.S. Currency. "They may ask:When will the dollar be so cheap again?" one said. And with dinar interest rates now roughly one pct below those for the dollar, they say the Central Bank faces a delicate balancing role requiring further flexibility. Bankers said the current, expansionary interest rate policy is only part of a broader attempt to encourage local investment and strengthen the backbone of the economy. They estimate the economy, measured in terms of GDP and allowing for inflation, shrank 19 pct in 1986 after an 8.1 pct contraction the previous year. Bankers also noted recent measures to stimulate stock market activity, capped today by sharp cuts in brokerage fees to make it cheaper for investors to trade. REUTER  21-APR-1987 12:23:33.91 usa F f1672reute r f BC-CSX-<CSX>-UNIT-CHAIRM 04-21 0065  CSX <CSX> UNIT CHAIRMAN RETIRES WHITE SULPHUR SPRINGS, W. Va., April 21 - CSX Corp said that Joseph Abely, chairman and chief executive officer of CSX's Sea-Land Corp unit, will retire by the end of the month. The company said he will be replaced by Robert Hintz, executive vice president of CSX and president and chief executive officer of the company's energy and properties groups. Reuter  21-APR-1987 12:28:08.02 brazil F f1702reute d f BC-BRAZIL-FUND-SHOULD-ST 04-21 0095  BRAZIL FUND SHOULD START OPERATING SOON SAO PAULO, April 21 - A Brazil Fund through which foreign investors will be able to buy stocks in Brazilian companies should start operating in about two months, the Securities and Exchange Commission said. A spokesman told Reuters that four institutions in the United States were interested in participating in the Fund -- Merrill Lynch and Co Inc, Salomon Brothers Inc, the IFC and the First Boston Corp. The spokesman said the Fund, approved last December, was expected to attract about 100 mln dlrs of investments. Reuter  21-APR-1987 12:36:27.62 oilseedrapeseed japancanada C G f1756reute u f BC-JAPAN-BUYS-4,000-TONN 04-21 0043  JAPAN BUYS 4,000 TONNES OF CANADIAN RAPESEED WINNIPEG, April 21 - Japan bought 4,000 tonnes of Canadian rapeseed for last-half May/first-half June shipment, nearly completing buying for May needs, trade sources said. Price details were not available. Reuter  21-APR-1987 12:39:08.68 grainwheat south-koreacanada C G f1763reute u f BC-SOUTH-KOREA-BUYS-50,0 04-21 0038  SOUTH KOREA BUYS 50,000 TONNES CANADIAN WHEAT WINNIPEG, April 21 - South Korea yesterday bought 50,000 tonnes of Canadian feed wheat for late June/early July shipment at 95.00 dlrs per tonne FOB Vancouver, trade sources said. Reuter  21-APR-1987 12:39:55.30 trade usa reagan RM A f1766reute r f BC-WASHINGTON-BUDGET 04-21 0106  SENATE PREPARING FOR NEW U.S. BUDGET BATTLE By Michael Posner, Reuters WASHINGTON, April 21 - Congress returned from its Easter recess ready for the annual Spring budget battle that promises to be a partisan dispute. The budget fight pitting Democrats against President Reagan and Republicans is expected to get underway this week in the Senate late this week and last at least another week. It is taking on new prominence because of current trade woes. That is because the budget problems and its associated huge deficits are said to be at the root of related international trade friction currently worrying financiers. As the dollar slides downward on global markets and stock exchanges gyrate wildly, the trade dispute involving the United States and Japan once again is spreading fears of a major trade war between the two trading giants for the first time since World War II. Ostensibly that dispute is over U.S. charges that Japan is refusing to open its markets to semi-conductor chips and the resulting U.S. tariffs doubling prices of Japanese televisions and small computers. Behind the elements of a brewing trade war which neither side wants, is the dilemma of the U.S. budget and its deficit. Some analysts say the financial markets may be waking up to the economic realities that the huge debt cannot continue to grow without repercussions. A large portion of the U.S. debt has been financed by foreigners from their accumulated trade surpluses. But if they withdraw this support the result can only be further problems, including higher interest rates for Americans. In a nutshell, the U.S. budget process has now moved to the showdown stages in Congress. Reagan's own trillion dollar spending budget for the government year 1988, starting Oct. 1, was trounced badly in the House on April 9. The Senate takes up a plan similar to one that passed the House, calling for slashing the deficit from its estimated 171 billion dlr level next year to about 134 billion dlrs, through defense and domestic spending cuts and about 18.5 billion dlrs in new, unspecified, taxes. As the Senate prepares to take up its own budget plan, majority Democrats predict there will be passage of a bill, only after a protracted partisan battle. In the House, not one Republican voted for the budget, which passed by 230 to 192. In the Senate, none of Reagan's Republicans voted for the budget as it passed out of the Senate Budget Committee for full Senate consideration. A key Senate Budget Committee source told Reuters he believes this very unusual unanimous opposition was by design among congressional Republicans, perhaps with the tacit approval of the White House. "Republicans want Democrats to take the heat for any tax hikes and defense cuts," he said. In the coming weeks, the source said, Democrats will press for a bipartisan budget and seek a negotiated budget with Reagan -- who already is opposed to the idea. But "it is not clear how the Republicans will act," he added. He said Republicans may propose their own plan for lower taxes and more defense spending, which they did not offer after Reagan's budget was clobbered in an early vote in the House. When Reagan entered the White House in 1981, he inherited what was labelled a huge deficit from Jimmy Carter that wound up to be nearly 79 billion dlrs that year. Despite Reagan's promise to balance the budget by 1983, critics note that his administration's record of accumulated debt is estimated over one trillion dlrs, or 1,100 billion dlrs. That is money the government must borrow, and pay back, and many analysts say it is what kept the dollar high and caused the worst U.S. trade deficit ever. Last year the United States bought goods from the world worth 169.8 billion dlrs more than what it sold, including purchases of 58.6 billion dlrs in Japanese goods. While Congress is trying to attack the trade deficit on one front through a get-tough trade bill promising retaliatory measures unless all markets are opened, its success so far against the budget deficit has been marked by limited progress. Congress, which controls the pursestrings, has put the deficit on a downward path from its record high of 220.7 billion dlrs accumulated in fiscal 1986, which ended Sept. 30. Because of the Gramm-Rudman-Hollings balanced budget law enacted in late 1985, there has been pressure on Congress to do more than talk about deficits. That law, named after Republican Senators Phil Gramm of Texas, Warren Rudman of New Hampshire and Democrat Ernest Hollings of South Carolina, calls for a balanced budget by 1991 through a series of set deficit targets that Congress must meet. The law has been followed, even though an enforcement mechanism to mandate automatic across-the-board cuts if Congress misses its goal was stricken by the Supreme Court. The legislators have followed the targets -- on paper. But in reality, the goal has actually been missed. For example, Congress last year approved legislation to meet the 1987 target of a 144 billion dlr deficit. But even after approving the numbers, the deficit for 1987 is estimated at over 170 billion dlrs -- far off the target. This year the target is 108 billion dlrs and that goal is expected to be missed widely. Reuter  21-APR-1987 12:42:37.02 usa A RM f1778reute r f BC-COMMONWEALTH-EDISON-< 04-21 0112  COMMONWEALTH EDISON <CWE> SELLS MORTGAGE BONDS NEW YORK, April 21 - Commonwealth Edison Co is raising 360 mln dlrs via a two-tranche offering of first and refunding mortgage bonds, said lead manager Morgan Stanley and Co Inc. A 200 mln dlr issue of bonds due 1990 has an 8-1/8 pct coupon and was priced at 99.775 to yield 8.21 pct, or 65 basis points over comparable Treasury securities. A 160 mln dlr offering of bonds due 1992 has an 8-5/8 pct coupon and was priced at 99.85 to yield 8.661 pct, or 78 basis points more than Treasuries. Both tranches are non-callable for life and rated A-3 by Moody's and A by S and P. Salomon Brothers Inc co-managed the deal. Reuter  21-APR-1987 12:47:33.66 acq usa F f1796reute r f BC-ROYAL-RESOURCES 04-21 0058  BUSINESSMAN HAS ROYAL RESOURCES <RRCO.O> STAKE WASHINGTON, April 21 - James Stuckert, a Louisville, Ky., businessman, told the Securities and Exchange Commission he has acquired 380,000 shares of Royal Resources Corp, or 5.7 pct of the total outstanding common stock. Stuckert said he bought the stake for 600,000 dlrs solely as an investment. Reuter  21-APR-1987 12:48:28.99 usa F f1800reute d f BC-ATT-<T>-LAUNCHES-SYST 04-21 0091  ATT <T> LAUNCHES SYSTEMS FOR SMALL BUSINESSES NEW YORK, April 21 - American Telephone and Telegraph Co introduced two communications systems, Spirit and Merlin, and other products, in a bid to strengthen its position with small businesses, the company said. The Spirit system, with a basic price tag of 1,500 dlrs, can handle up to six lines and 16 telephones and a more advanced line which can handle up to 24 lines and 48 tlelphones. ATT said the Merlin line, which starts at 2,500 dlrs, can handle up to 32 lines and 72 telephones. ATT said the new products will eventually replace the current Merlin product family. Some of the systems will be available in May and others in the third quarter. ATT also introduced software enhancements for the System 25, for business that require PBX voice and data communications and need up to 150 phones. These and other enhancements will be available in the third quarter, the company said. Reuter  21-APR-1987 12:53:58.04 cpi spain RM f1823reute r f BC-SPAIN-MAINTAINS-FIVE 04-21 0091  SPAIN MAINTAINS FIVE PCT INFLATION TARGET MADRID, April 21 - Spanish Secretary of State for the economy Guillermo de la Dehesa said the government maintained its five pct inflation target for this year although a 0.6 pct increase in March pushed the rise in the year on year consumer price index to 6.3 pct. De la Dehesa said the March rise, announced today by the National Statistics Institute, was not entirely satisfactory but acceptable. The year on year rate at the end of February was six pct. Prices rose 8.3 pct last year. The March rise included a 0.05 pct increase correcting an error in last January's consumer price index. Economists had earlier said the error could have been as high as 0.2 pct. De la Dehesa said seasonal increases in food prices pushed the index up in March and he expected the rate to be lower in April. The Communist-led Workers Commissions union said the March price rise showed inflation was going up again and the government looked increasingly unlikely to meet its five pct target. The Workers Commissions said the inflation trend fuelled unions's claims to wage increases beyond the government's recomendation to limit wage rises at around five pct. Spain is being affected by a two-month-old wave of strikes for wage rises. Government officials note wage settlements so far this year have yielded average increases upwards of six pct, while unions say the figure is higher then seven pct. REUTER  21-APR-1987 13:00:06.84 crude usa Y f1842reute u f BC-API-SAID-STATISTICS-T 04-21 0036  API SAID STATISTICS TO BE RELEASED TONIGHT NEW YORK, April 21 - The American Petroleum Institute said it plans to release its weekly report on U.S. oil inventories tonight, even though last Friday was a holiday. Reuter  23-APR-1987 18:32:18.42 usa F f3036reute r f BC-GCA-<GCA>-COMPLETES-F 04-23 0102  GCA <GCA> COMPLETES FINANCIAL RESTRUCTURING ANDOVER, Mass., April 23 - GCA Corp said it completed its previously announced plan of financial restructuring under which Hallwood Group Inc <HWG> took a 14 pct interest in the company, a maker of semiconductor manufacturing equipment. The company said it also implemented a one-for-50 reverse stock split. Under terms of the plan, the company exchanged about 109 mln dlrs in debt to creditors and suppliers for 43 mln dlrs in cash, and warrants to purchase 2.2 mln shares of its common stock. GCA also raised 71.7 mln dlrs through the sale of common stock. Reuter  23-APR-1987 18:34:33.58 usa F f3040reute u f BC-SEC 04-23 0098  SEC WARNS SECURITIES DEALERS ON HIGH MARK-UPS WASHINGTON, April 23 - The Securities and Exchange Commission reminded securities dealers that its mark-up disclosure requirements also applies to transactions on zero-coupon securities. Dealers and brokers are required by U.S. securities law to disclose their mark-ups if they are excessive, the SEC said in a public notice. Further, excessive mark-ups on securities transactions, whether disclosed or not, violate the rules of the national Association of Securities Dealers Inc and Municipal Securities Rulemaking Board, it said. In a separate action, the SEC filed a friend-of-the-court brief in a private civil case involving a complaint against Merrill Lynch over excessive mark-ups on zero-coupon bonds. The case is being appealed to the U.S. Appeals Court. The lower court dismissed the complaint, finding antifraud provisions of securities laws do not prohibit undisclosed excessive mark-ups on securities transactions. The SEC is urging the appeals court to reverse the decision, citing its nearly 50 year-old position that undisclosed excessive mark-ups by securities dealers violate the general antifraud provisions of securities laws. Reuter  23-APR-1987 18:37:03.79 earn canada E F f3044reute u f BC-SOUTHAM-INC-<STM.TO> 04-23 0043  SOUTHAM INC <STM.TO> 1ST QTR NET TORONTO, April 23 - Oper shr 32 cts vs 37 cts Oper net 18.9 mln vs 21.6 mln Revs 352.1 mln vs 323.0 mln Note: 1987 net excludes extraordinary gain of 2.8 mln dlrs or five cts shr from sale of surplus property. Reuter  23-APR-1987 18:45:40.42 earn usa F f3052reute r f BC-LOCTITE-CORP-<LOC>-3R 04-23 0044  LOCTITE CORP <LOC> 3RD QTR MARCH 31 NET NEWINGTON, Conn., April 23 - Shr 96 cts vs 53 cts Net 8,663,000 vs 4,798,000 Revs 89.7 m ln vs 66.8 mln Nine mths Shr 2.33 dlrs vs 1.67 dlrs Net 21.1 mln vs 15.1 mln Revs 241.3 mln vs 192.8 mln Reuter  23-APR-1987 18:56:03.00 usajapan RM V f3056reute u f BC-U.S.-CONGRESS-STILL-A 04-23 0104  U.S. CONGRESS STILL ANGRY WITH JAPAN - ABE NEW YORK, April 23 - Special Japanese envoy Shintaro Abe said in a brief interview with Reuters that the feeling in the U.S. congress is "very severe" against Japan. However, Abe said he believed that neither Congress nor the Reagan administration wants to undermine relations with Japan. He said the Reagan administration showed "relative understanding" of how Japan is trying to alleviate its U.S. trade imbalance. Abe said he was convinced "Congress and the administration had the same view that the relationship between Tokyo and Washington should not be undermined." Reuter  23-APR-1987 18:59:23.50 earn usa F f3060reute u f BC-GLENFED-INC-<GLN>-3RD 04-23 0070  GLENFED INC <GLN> 3RD QTR MARCH 31 NET GLENDALE, Calif., April 23 - Oper shr 1.54 dlrs vs 82 cts Oper net 33.7 mln vs 17.66 mln Revs 473.1 mln vs 419.0 mln Nine mths Oper shr 4.60 dlrs vs 2.39 dlrs Oper net 100.4 mln vs 51.0 mln Revs 1.38 billion vs 1.21 billion Assets 18.5 billion vs 15.5 billion Deposits 13.00 billion vs 11.29 billion Loans 15.04 billion vs 12.56 billion Note: Oper net excludes extraordinary loss 6,636,000 and 11.9 mln for 1987 qtr and nine mths on prepayment of borrowings from the Federal Home Loan Bank Board. Oper also excludes tax credits of 15.8 mln vs 5,954,000 for qtr and 17.8 mln vs 11.6 mln for nine mths. Reuter  23-APR-1987 19:00:51.40 earn usa F f3062reute r f BC-HORIZON-INDUSTRIES-IN 04-23 0053  HORIZON INDUSTRIES INC <HRZN> 2ND QTR NET CALHOUN, Ga., April 23 - Qtr ended April four Shr profit eight cts vs loss 22 cts Net profit 341,000 vs loss 903,000 Revs 58.4 mln vs 46.3 mln Six mths Shr profit 35 cts vs loss 19 cts Net profit 1,466,000 vs loss 767,000 Revs 121.4 ln vs 95.9 mln Reuter  23-APR-1987 19:02:27.01 money-supply usa RM V f3063reute u f BC-/FED-DATA-PROVIDE-NEW 04-23 0097  FED DATA PROVIDE NEW EVIDENCE OF TIGHTER POLICY By Alan Wheatley, Reuters NEW YORK, April 23 - U.S. banking data released today are too distorted to draw sweeping conclusions about monetary policy, but they do support the market's assumption that the Federal Reserve has started to tighten its grip on credit, economists said. "It's clear that the Fed has firmed somewhat. Discount window borrowings, net free reserves, the Fed funds rate average and the pattern of reserve additions are all consistent with a modest tightening," said Dana Johnson of First Chicago Corp. Johnson, and several other economists, now estimate that the Fed funds rate should trade between 6-1/4 and 6-3/8 pct. Discount window borrowings in the week to Wednesday were 935 mln dlrs a day, producing a daily average for the two-week statement period of 689 mln dlrs, the highest since the week of December 31, 1986, and up from 393 mln dlrs previously. Moreover, banks were forced to borrow a huge 5.2 billion dlrs from the Fed on Wednesday - the highest daily total this year - even though unexpectedly low Treasury balances at the Fed that day left banks with over two billion dlrs more in reserves than the Fed had anticipated. However, economists said it is almost certain that the Fed is aiming for much lower discount window borrowings than witnessed this week. They pointed to two factors that may have forced banks to scramble for reserves at the end of the week. First, economists now expect M-1 money supply for the week ended April 29 to rise by a staggering 15 to 20 billion dlrs, partly reflecting the parking in checking accounts of the proceeds from stock market sales and mutual fund redemptions to pay annual income taxes. As banks' checking-account liabilities rise, so do the reserves that they are required to hold on deposit at the Fed. Required reserves did indeed rise sharply by 2.5 billion dlrs a day in the two weeks ended Wednesday, but economists said the Fed may not have believed in the magnitude of the projected M-1 surge until late in the week and so started to add reserves too late. Second, an apparent shortage of Treasury bills apparently left Wall Street dealers with too little collateral with which to enagage in repurchase agreements with the Fed, economists said. Thus, although there were 10.3 billion dlrs of repos outstanding on Wednesday night, the Fed may have wanted to add even more reserves but was prevented from doing so. "It's not at all inconceivable that the Fed didn't add as much as they wanted to because of the shortage of collateral," said Ward McCarthy of Merrill Lynch Economics Inc. McCarthy estimated that the Fed is now targetting discount-window borrowings of about 400 mln dlrs a day, equivalent to a Fed funds rate of around 6-3/8 pct. After citing the reasons why the Fed probably has not tightened credit to the degree suggested by the data, economists said the fact that the Fed delayed arranging overnight injections of reserves until the last day of the statement period was a good sign of a more restrictive policy. Jeffrey Leeds of Chemical Bank had not been convinced that the Fed was tightening policy. But after reviewing today's figures, he said, "It's fair to say that the Fed may be moving toward a slightly less accommodative reserve posture." Leeds expects Fed funds to trade between 6-1/4 and 6-3/8 pct and said the Fed is unlikely to raise the discount rate unless the dollar's fall gathers pace. Johnson at First Chicago agreed, citing political opposition in Washington to a dollar-defense package at a time when Congress sees further dollar depreciation as the key to reducing the U.S. trade surplus with Japan. Reuter  23-APR-1987 19:08:09.42 earn usa F f3066reute r f BC-RORER-GROUP-INC-<ROR> 04-23 0072  RORER GROUP INC <ROR> 1ST QTR NET FORT WASHINGTON, Pa., April 23 - Oper shr profit 34 cts vs loss 78 cts Oper net profit 7,434,000 vs loss 17.0 mln Revs 201.2 mln vs 171.7 mln Note: Year-ago oper exludes gain on sale of businesses of 139.6 mln. Year-ago oper includes charges of 27.8 mln resulting from allocation of the purchase price of Revlon's businesses to inventory and 7.1 mln for restructuring costs. Reuter  23-APR-1987 19:36:56.77 coffee costa-ricaguatemala ico-coffee T f3073reute u f AM-centam-coffee 04-23 0088  MILD COFFEE GROWERS TO MEET IN GUATEMALA SAN JOSE, April 23 - A large group of "other milds" coffee-growing nations will hold talks in Guatemala next month to map their strategy for next September's meeting of the International Coffee Organisation (ICO). Mario Fernandez, executive director of the Costa Rican coffee institute, said delegates from Mexico, the Dominican Republic, Peru, Ecuador, India, Papua New Guinea and five central american nations will participate in the two-day strategy session beginning May 4. The main topic will be reform of what many producing countries perceive as the ICO's unfair distribution of export quotas, Fernandez said. He said Costa Rica would press for quotas "based on the real production and export potential of each country in the past few years" and to distribute quotas based on "historic" production levels rather than recent harvests and crop estimates. Reuter  23-APR-1987 19:48:08.94 acq usa F f3076reute u f AM-COMSAT 04-23 0107  US STUDY DISCUSSES DROPPED COMSAT-CONTEL MERGER WASHINGTON, April 23 - A congressional study today said the proposed, but now apparently abandoned, merger of the Communications Satellite Corp <CQ> and Contel Corp <CTC> would technically be legal but could violate the spirt of the law setting up COMSAT. Two weeks ago before the study was completed, Contel announced it would seek to terminate the proposed merger. The study by the non partisan Congressional Research Service (CRS) said "the proposed merger appears to comply, technically, with the mandates or letter of statutes, if may nevertheless violate the spirit of the law." Comsat, created by a 1962 act of Congress, and Contel, a corporation of local telephone and communications firms, filed with the Federal Communications Commission last November 3 an application for merger. Several firms had protested the proposed merger. In an analysis of the law, the research service issued several critical comments about the structure of the new firm and said apparent domination by Contel of a restructured COMSAT would have broken the spirit of the law setting up COMSAT.COMSAT is the U.S. arm of Intelstat, the international satellite communications firm. Reuter...^M  23-APR-1987 19:48:47.25 japanusa nakasone C f3077reute u f BC-JAPANESE-PARLIAMENT-P 04-23 0138  SETBACK SEEN FOR NAKASONE IN JAPANESE PARLIAMENT TOKYO, April 24 - Japan's Lower House passed the 1987 budget after the ruling Liberal Democratic Party agreed to a mediation proposal that could kill its plan to introduce a controversial sales tax, political analysts said. The move was seen as a major blow to Prime Minister Yasuhiro Nakasone, the leading advocate of the five pct tax. Some analysts predicted Nakasone might be forced to step down just after the June summit of leaders from major industrial democracies, well before his one-year term is due to expire at the end of October. The ruling party though was anxious to pass the budget before Nakasone leaves next week for the U.S. so that he could tell Washington the Japanese government was doing its utmost to boost the sagging economy and imports. Reuter  23-APR-1987 20:21:46.09 money-fxdlr RM f3091reute b f BC-BANK-OF-JAPAN-INTERVE 04-23 0086  BANK OF JAPAN INTERVENES IN TOKYO MARKET TOKYO, April 24 - The Bank of Japan intervened just after the Tokyo market opened to support the dollar from falling below 140.00 yen, dealers said. The central bank bought a moderate amount of dollars to prevent its decline amid bearish sentiment for the U.S. Currency, they said. The dollar opened at a record Tokyo low of 140.00 yen against 140.70/80 in New York and 141.15 at the close here yesterday. The previous Tokyo low was 140.55 yen set on April 15. REUTER  23-APR-1987 20:24:10.50 money-supply australia RM f3092reute b f BC-AUSTRALIA'S-M-3-MONEY 04-23 0101  AUSTRALIA'S M-3 MONEY SUPPLY RISE 1.5 PCT IN MARCH SYDNEY, April 24 - Australia's M-3 money supply growth was 1.5 pct in March and 11.3 pct in the 12 months to March, the Reserve Bank said. This compared with a revised rise of 0.5 pct in February and 11.1 pct in the year to end-February. The Reserve Bank said the M-3 data for March was affected by the start of the operations of <National Mutual Royal Savings Bank Ltd>, which has resulted in the transfer of deposits (equivalent to around 1.5 pct of m-3) from the United Permanent Building Society to National Mutual Royal Savings Bank Ltd. The Reserve Bank said M-3 money supply in March was 110.77 billion Australian dlrs compared with a revised 109.11 billion in February and 99.48 billion in March, 1986. M-3 is deposits of the private sector held by trading and savings banks plus holdings of notes and coins. REUTER  23-APR-1987 20:30:17.87 japan RM f3094reute b f BC-JAPANESE-PARLIAMENT-P 04-23 0111  JAPANESE PARLIAMENT PASSES 1987 BUDGET TOKYO, April 24 - Parliament's Lower House passed the 1987 budget shortly before midnight local time, official parliamentary sources said. The move followed agreement by the ruling Liberal Democratic Party to a proposal that could kill its plan to introduce a controversial sales tax, political analysts said. The move was seen as a major blow to Prime Minister Yasuhiro Nakasone, the leading advocate of the five pct tax, they said. Some analysts said Nakasone may be forced to step down after the June summit of heads of major industrial democracies and before his one-year term is due to expire at end-October. Under the compromise agreed by the LDP and opposition parties, Lower House Speaker Kenzaburo Hara will take charge of the sales tax bill, appoint a ruling/opposition party council to debate it and allow opposition leaders to review the present tax system, analysts said. Hara also verbally agreed to scrap the sales tax plan entirely if the joint council fails to reach agreement on how to handle the tax. The opposition parties, who have been vociferously attacking the sales tax plan for months, hailed the decision as a great victory. The opposition parties had already delayed passage of the budget for three weeks after the April 1 start of the fiscal year by intermittent parliamentary boycotts. Although the LDP had more than enough votes to ram the budget through parliament, it had been reluctant to do so for fear of a backlash of public opinion, especially after its setback in recent local elections due to the sales tax issue. The ruling party though was anxious to pass the budget before Nakasone leaves next week for the U.S. So that he could tell Washington the Japanese government was doing its utmost to boost the sagging economy and imports. According to Kyodo News Service, Nakasone told reporters he did not think the sales tax was dead. If the sales tax is dropped, it could prove a major boost to the economy because it would increase the government budget deficit, economists said. The sales tax was originally scheduled to be introduced next January to help offset the loss of government revenues stemming from a cut in income and corporate taxes due to go into effect this month. REUTER  23-APR-1987 20:35:24.14 money-fxdlr usajapan RM f3095reute f f BC-Dollar-trades-at-post 04-23 0011  ******Dollar trades at post-war low of 139.50 yen in Tokyo - brokers Blah blah blah.  23-APR-1987 21:19:18.12 dlr RM f3111reute f f BC-Many-major-nations-ye 04-23 0012  ******Many major nations yesterday intervened heavily to aid dlr - Miyazawa Blah blah blah.  23-APR-1987 21:25:22.52 acq uk F f3114reute f f BC-STANDARD-OIL-SAYS-BRI 04-23 0012  ******STANDARD OIL SAYS BRITISH PETROLEUM SHARE TENDER EXTENDED UNTIL MAY 4 Blah blah blah.  23-APR-1987 21:28:14.05 money-fxdlr usajapan miyazawa RM f3115reute b f BC-JAPAN-HAS-NO-PLANS-FO 04-23 0110  JAPAN HAS NO PLANS FOR NEW MEASURES TO AID DLR TOKYO, April 24 - Finance Minister Kiichi Miyazawa said Japan has no plans to take new emergency measures to support the dollar, other than foreign exchange intervention. He also told reporters that many major nations yesterday intervened heavily to support the dollar against the yen. Yesterday's intervention was large in terms of the countries involved and the amounts expended, he said. With the continued fall of the dollar against the yen, 0speculation had arisen in currency markets here that Japan might take new measures to support the U.S. Currency, such as curbing capital outflows. Miyazawa said that yesterday's news of a 4.3 pct rise in U.S. Gnp in the first quarter had been expected. Although the growth looks robust on the surface, the figures in reality are not that good, he said. He said the ruling Liberal Democratic Party (LDP) is expected to come up with a final set of recommendations of ways to stimulate the Japanese economy before Prime Minister Yasuhiro Nakasone leaves for Washington next week. Commenting on yesterday's report on economic restructuring by a high-level advisory panel to Nakasone, Miyazawa said it was important to put the panel's recommendations into effect. REUTER  23-APR-1987 21:34:36.89 acq usauk F f3117reute b f BC-STANDARD-OIL-SAYS-BP 04-23 0082  STANDARD OIL SAYS BP EXTENDS TENDER NEW YORK, April 23 - Standard Oil Co <SRD> said in a brief announcement issued after a meeting of its board of directors that British Petroleum Co PLC <BP.L> (BP) has extended its 70 dlr per share tender offer until midnight May 4. The offer for the 45 pct of Standard shares not owned by BP had been due to expire midnight April 28. Standard Oil said discussions with BP concerning the tender were continuing but provided no further details. "So long as those discussions continue, no recommendation will be made to Standard Oil shareholders regarding the offer," Standard said. Standard directors met at the company's Cleveland headquarters on Thursday in a regularly scheduled meeting. The spokesman was unable to say if the meeting would continue on Friday. A committee of independent directors previously obtained an opinion from First Boston Corp that the Standard shares were worth 85 dlrs each, 15 dlrs more than the BP offer. REUTER  23-APR-1987 21:38:26.85 usa F f3120reute u f BC-QANTAS-TO-BUY-EXTENDE 04-23 0104  QANTAS TO BUY EXTENDED RANGE BOEING 767 AIRCRAFT SYDNEY, April 24 - State-owned <Qantas Airways Ltd> said it has placed a firm order for a single Boeing Co <BA.N> 767-300ER (extended range) aircraft for delivery in August 1988 at a cost of 150 mln Australian dlrs, including spares. A statement said it also has options to buy six more and will decide in mid-1987 whether to use engines made by United Technologies Corp <UTX> unit Pratt and Whitney or General Electric Co <GE>. The 767-300ER can carry more cargo and passengers and is more fuel-efficient than the 767-200, six of which Qantas has in service. REUTER  23-APR-1987 21:40:47.37 usajapan RM f3123reute u f BC-JAPAN-AGENCY-URGES-WA 04-23 0115  JAPAN AGENCY URGES WATCH ON YEN RISE EFFECTS TOKYO, April 24 - Japan should look out for possible effects of the yen's recent sharp rise on Japan's economy as growth remains slow, the government's Economic Planning Agency said in a monthly report submitted to cabinet ministers. EPA officials told reporters the underlying trend of the economy is firm but growth is slow due to sluggish exports. Customs-cleared exports by volume fell 4.9 pct month-on-month in February after a 2.8 pct fall in March. The government must take adequate economic measures to expand domestic demand and stabilise exchange rates in a bid to ensure sustained econonic growth, the report said. The report made a special reference to the yen's renewed rise and its effect on the economy, the officials said, adding the agency's judgement of current economic conditions has not changed since last month. The EPA said last month Japan's economy is beginning to show signs of bottoming out, conditional upon exchange rates. The dollar fell below 139 yen in early trading today - a post-war low. REUTER  23-APR-1987 22:03:13.44 money-supplyinterest japan RM f3135reute b f BC-JAPAN-DOES-NOT-INTEND 04-23 0108  JAPAN DOES NOT INTEND TO EASE CREDIT - OFFICIALS TOKYO, April 24 - The Bank of Japan does not intend to ease credit policy further, bank officials told Reuters. They were responding to rumours in the Japanese bond market that the central bank was planning to cut its 2.5 pct discount rate soon, possibly before Prime Minister Yasuhiro Nakasone leaves for Washington on April 29. Bank of Japan governor Satoshi Sumita will be in Osaka, western Japan on April 27 and 28 for the annual meeting of the Asian Development Bank, making a rate cut announcement early next week a virtual impossibility, they said. April 29 is a holiday here. REUTER  23-APR-1987 22:49:55.57 interest australia RM f3162reute u f BC-NATIONAL-MUTUAL-CUTS 04-23 0068  NATIONAL MUTUAL CUTS AUSTRALIAN PRIME TO 17.75 PCT MELBOURNE, April 24 - National Mutual Royal Bank Ltd said it would cut its prime rate to 17.75 pct from 18.25, effective April 27. The cut follows a trend toward lower rates started last month and accelerated by Westpac Banking Corp, which yesterday cut its prime to 17.50 pct from 18.25 pct. Westpac's 17.50 pct is the lowest prevailing rate. REUTER  23-APR-1987 23:12:19.63 acq australiacanada F f3171reute u f BC-ELDERS-PURCHASE-OF-CA 04-23 0102  ELDERS PURCHASE OF CANADIAN BREWER APPROVED SYDNEY, April 24 - Elders IXL Ltd <ELXA.S> said the Canadian government approved its bid for <Carling O'Keefe Ltd>. Elders earlier announced it was buying 10.9 mln shares, or 50.1 pct of Carling, from the Canadian subsidiary of Rothmans International Plc <ROT.L> for 18 Canadian dlrs each. Elders chairman John Elliott said in a statement when the offer for the ordinary shares closed on April 23, that acceptances representing over 93 pct of outstanding shares had been received. <IXL Holdings> would proceed to acquire the rest compulsorily, he said. REUTER  23-APR-1987 23:51:21.93 crude ecuadorcolombia opec RM f3186reute u f BC-ECUADOR-TO-USE-COLOMB 04-23 0106  ECUADOR TO USE COLOMBIA OIL LINK FOR FIVE YEARS BOGOTA, April 23 - Ecuador will use a new pipeline link with Colombia to export crude oil for the next five years, Colombian mines and energy minister Guillermo Perry said. The link will be inaugurated on May 8. It was built to allow Ecuador to resume exports of crude oil halted on March 5 by earthquake damage to its Lago Agrio to Balao pipeline, Once that pipeline is repaired, Ecuador will exceed its OPEC quota in order to offset lost income and pay debts contracted with Venezuela and Nigeria since the quake, Ecuador mines and energy minister Javier Espinosa said. The two ministers were speaking at a news conference after signing an agreement for joint oil exploration and exploitation of the jungle border zone between the two nations. Drilling will begin in September. "The agreement to transport Ecuadorean crude oil is not only for this emergency period but for the next five years, with possibility of an extension. Between 20,000 and 50,000 barrels per day (bpd) will be pumped along it," Perry said. Espinosa said Ecuador planned to pump 35 mln barrels through the link in the next five years, at a cost of 75 cents per barrel during the first year. The 43-km link, with a maximum capacity of 50,000 bpd, will run from Lago Agrio, the centre of of Ecuador's jungle oilfields, to an existing Colombian pipeline that runs to the Pacific port of Tumaco. Espinosa said the 32-km stretch of the link built on the Ecuadorean side cost 10.5 mln dlrs. Perry gave no figures for Colombia's 11 km segment but said it was "insignificant compared with what we are going to earn." OPEC member Ecuador was pumping around 250,000 bpd before the quake. Lost exports of 185,000 bpd are costing it 90 mln dlrs per month, Espinosa said. REUTER  23-APR-1987 23:57:39.18 indonesia RM f0001reute u f BC-SUHARTO-PARTY-SET-FOR 04-23 0107  SUHARTO PARTY SET FOR EASY WIN IN INDONESIA POLLS JAKARTA, April 24 - President Suharto's ruling Golkar party appears to have made substantial gains with over 75 pct of the votes counted in Indonesia's national elections. Figures released by the election commission showed Golkar on target to take 70 pct of the vote. Provisional figures indicate that with results of 68.9 mln ballots announced, Golkar had won 50.29 mln, the Moslem-based United Development Party 10.93 mln and the nationalist Democratic Party 7.69 mln. The total electorate is 94 mln and officials said they thought about 90 pct of the votes had been counted.  24-APR-1987 06:10:35.04 denmark zse F f0368reute r f BC-DENMARK'S-NOVO-INDUST 04-24 0108  DENMARK'S NOVO INDUSTRI GETS SWISS SHARE LISTING COPENHAGEN, April 24 - Danish-based insulin and enzymes producer Novo Industri A/S <NVO.CO> said in a statement that its "B" shares would be listed on stock exchanges in Zurich, Basel and Geneva from May 4. The aim is to create broader European interest in Novo stock, currently listed in Copenhagen, London and New York, said the statement issued after yesterday's ordinary general meeting. Novo said more than 50 pct of its B shares were owned by U.S. Investors. The new listings, the first by a Danish company on the Swiss exchanges, will not involve issuing of new share capital. REUTER  24-APR-1987 06:16:49.25 graincorn taiwanusa G C f0376reute u f BC-TAIWAN-TO-TENDER-UP-T 04-24 0088  TAIWAN TO TENDER UP TO 87,000 TONNES OF U.S. MAIZE TAIPEI, April 24 - The joint committee of Taiwan's maize importers will tender on April 29 for two cargoes of U.S. Maize, totalling between 54,000 and 87,000 tonnes for delivery between May 21 and June 25, a committee spokesman told Reuters. Taiwan has set a calendar 1987 import target of 2.92 mln tonnes compared with imports of 3.05 mln in 1986. About 80 pct of the imports are expected to come from the U.S. And the rest from South Africa, the spokesman said. REUTER  24-APR-1987 06:18:18.37 money-fx switzerland languetin RM f0379reute u f BC-SWISS-COMMITTED-TO-JO 04-24 0106  SWISS COMMITTED TO JOINT CURRENCY INTERVENTION BERNE, April 24 - The Swiss National Bank will continue to take part in concerted intervention on currency markets as necessary, president Pierre Languetin told the bank's annual meeting. He said the dollar had on occasion hit highs or lows which bore no relation to economic fundamentals and cooperation between all monetary authorities was necessary to prevent it breaching thresholds that would damage everyone. "We are resolved -- as we have done in the past -- to take part in concerted intervention to the extent that this is possible and desirable," Languetin said. Languetin said Switzerland had noted with satisfaction the six nation Paris accord on currency stabilisation measures in February, adding that it had anchored the principle of strengthened international cooperation. He said measures such as recent concerted intervention were useful in the short term. But he added, "The (Paris) Louvre accord can produce no lasting effects without a correction of the fundamental imbalances, without a reduction of the American budget deficit and without stronger growth in Europe and Japan." Languetin said certain changes would probably be necessary in the "too expansive" monetary policy of the United States, adding that there was a prevailing view that U.S. Money supply was expanding too strongly. "If this should last long the dollar could only be stabilised at the cost of a substantial easing in monetary policy on the part of the other central banks, which would in turn create the basis for a new wave of world-wide inflation," he said. One positive factor was that monetary authorities in the most important countries had not relinquished their anti-inflation policies. REUTER  24-APR-1987 06:34:22.72 sugar japancuba C T f0409reute u f BC-JAPANESE-BUYERS-ACCEP 04-24 0103  JAPANESE BUYERS ACCEPT CUBA SUGAR DELAY - TRADERS TOKYO, April 24 - Several Japanese buyers have accepted postponement of between 150,000 and 200,000 tonnes of Cuban raw sugar scheduled for delivery in calendar 1987 until next year following a request from Cuba, trade sources said. Cuba had sought delays for some 300,000 tonnes of deliveries, they said. It made a similar request in January when Japanese buyers agreed to postpone some 200,000 tonnes of sugar deliveries for 1987 until 1988. Some buyers rejected the Cuban request because they have already sold the sugar on to refiners, they added. Japanese buyers are believed to have contracts to buy some 950,000 tonnes of raw sugar from Cuba for 1987 shipment. But Japan's actual raw sugar imports from Cuba are likely to total only some 400,000 to 450,000 tonnes this year, against 576,990 in 1986, reflecting both the postponements and sales earlier this year by Japanese traders of an estimated 150,000 tonnes of Cuban sugar to the USSR for 1987 shipment, they said. They estimated Japan's total sugar imports this year at 1.8 mln tonnes, against 1.81 mln in 1986, of which Australia is expected to supply 550,000, against 470,000, South Africa 350,000, against 331,866, and Thailand 400,000, after 390,776. REUTER  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-018.sgm000066400000000000000000002261301154025176300231500ustar00rootroot00000000000000 2-JUN-1987 10:04:07.81 cpi brazil sarney C f1027reute u f BC-BRAZIL'S-SARNEY-DECLA 06-02 0092  BRAZIL'S SARNEY RENEWS CALL FOR WAR ON INFLATION BRASILIA, June 2 - President Jose Sarney today declared "a war without quarter" on inflation and said the government would watch every cent of public expenditure. Sarney, addressing his cabinet live on television, also reiterated that he intended to remain in power for five years, until 1990. There has been a long-running political debate about how long his mandate should be. Brazil is currently suffering from the worst inflation of its history. In April monthly inflation reached 21 pct. Reuter  2-JUN-1987 10:04:26.11 reaganvolckergreenspan V RM f1030reute f f BC-******REAGAN-SAYS-VOL 06-02 0014  ******REAGAN SAYS VOLCKER WILL NOT ACCEPT 3rd TERM AS FED CHAIRMAN, NOMINATES GREENSPAN Blah blah blah.  2-JUN-1987 10:05:19.67 usa V RM f1034reute b f BC-/U.S.-HOME-SALES-ROSE 06-02 0079  U.S. HOME SALES ROSE 7.6 PCT IN APRIL WASHINGTON, June 2 - Sales of new, single-family homes rose 7.6 pct in April from March to a seasonally adjusted annual rate of 777,000 units, the Commerce Department said. The department revised March sales to show a 2.7 pct decrease from the previous month to 722,000 units instead of the previously reported 3.6 pct drop in March. The April increase brought home sales 12.0 pct below the April, 1986, level of 883,000 units. The April increase brought home sales to the highest level since last April's 883,000 units. The Commerce Department said that before seasonal adjustment, the number of homes actually sold in April was 76,000, up from 71,000 in March but down from 84,000 in April, 1986. The average price was 118,800 dlrs in April, down from 121,200 dlrs in March but up from 110,300 dlrs a year ago. The median price was unchanged from March at 99,000 dlrs but up from 92,500 dlrs in April, 1986, the department said. Reuter  2-JUN-1987 10:06:06.42 uk RM f1036reute b f BC-BRIXTON-ESTATE-LAUNCH 06-02 0075  BRIXTON ESTATE LAUNCHES UNLIMITED STG CP PROGRAM LONDON, June 2 - Brixton Estate Plc is establishing a sterling commercial paper program for an unlimited amount, J. Henry Schroder Wagg and Co Ltd said as arranger. Dealers will be Schroder Wagg, S.G. Warburg and Co Ltd and County Natwest Capital Markets Ltd. The paper will be issued in denominations of 500,000 and one mln stg and will have maturities between seven and 364 days. REUTER  2-JUN-1987 10:06:53.99 usa reaganvolckergreenspanjames-baker V RM f1037reute b f BC-REAGAN-FED 06-02 0043  REAGAN SAYS VOLCKER WILL NOT SERVE NEW TERM WASHINGTON, June 2 - President Reagan said Paul Volcker has declined to serve another term as chairman of the Federal Reserve Board, the U.S. central bank. Reagan nominated economist Alan Greenspan in his place. Volcker's term expires in August. Reagan, in a brief announcement in the White House briefing room, said he accepted Volcker's decision "with great reluctance and regret." Volcker, first appointed to the Fed post by President Jimmy Carter in 1979, said "there is a time to leave and a time to come ... I have no feeling I was being pushed." Volcker, appearing with Reagan, Greenspan, and Treasury Secretary James Baker in the briefing room, said he will remain on the job until Greenspan's nomination is approved by the Senate. In a tribute to a smiling Volcker standing beside him, Greenspan told reporters that one of the departing chairman's greatest achievements was reducing inflation. "It will be up to those of us who follow him to be certain that those very hard won gains will not be lost. Assuring that will be one of my primary goals," Greenspan said. Financial markets reacted with dismay at the departure of Volcker, who has been widely credited with holding the line on inflation and seeking to maintain stability in currency values. Immediately following Reagan's announcement, the U.S. dollar weakened sharply against all major currencies and both the bond and stock markets declined. But Greenspan told reporters he thought the dollar, which has fallen sharply over the past year, has reached its low point. "There certainly is evidence in that direction," Greenspan said when reporters asked if the dollar has bottomed out. The market reaction was probably exaggerated by surprise because the announcement followed a number of published reports that the White House had decided to reappoint Volcker. Volcker's tenure at the Fed began under the cloud of major inflation under Carter with consumer prices rising more than 10 per cent annually and the prime interest rate exceeding 20 per cent. With Reagan's backing, Volcker pursued a tight money policy that cut inflation to about three per cent annually and reduced interest rates to their lowest level in nearly a decade. The tight money policies were also blamed for producing a deep recession in 1981 and 1982 that caused major political problems for Reagan. Reagan reappointed Volcker to the chairmanship in 1983. Greenspan, who heads his own Wall Street consulting firm, was chairman of President Ford's Council of Economic Advisers from September 1974 until January 1977. Greenspan, a Republican, is considered a traditional conservative economist and has been an adviser to several presidents. Reuter  2-JUN-1987 10:11:04.12 belgium RM f1051reute u f BC-BELGIAN-PUBLIC-SPENDI 06-02 0106  BELGIAN PUBLIC SPENDING DEFICIT FALLS IN MAY BRUSSELS, June 2 - Belgium's public expenditure deficit fell sharply to 59.5 billion francs in May from 96.7 billion in the same month last year, the first major sign of the effects of the government's public spending curbs, the Budget Ministry said. During the first five months of this year, the net government financing requirement was down by 44.1 billion francs from year ago levels at 345.8 billion francs, it said in a statement. The government is aiming to cut this year's financing requirement to below 420 billion francs this year from around 560 billion in 1986. The Ministry said it was expected that more than half the projected cut should have been achieved by the end of July. Ministry sources noted that for technical reasons, the financing requirement is always highest in the early months of the year. REUTER  2-JUN-1987 10:11:37.96 switzerland RM f1055reute u f BC-CHRISTIANIA-RAISES-AM 06-02 0091  CHRISTIANIA RAISES AMOUNT OF GOLD LINKED BOND ZURICH, June 2 - Norway's Christiania Bank <CHBO.OL> is increasing the size of its 2-1/2 pct seven year bond issue with gold call and put warrants to 75 mln Swiss francs from 50 mln, lead manager Bank Gutzwiller, Kurz, Bungener Ltd said. The issue is priced at par. Each 5,000 franc bond carries three 18 month call warrants with a strike price of 490 dlrs and four three year put warrants with a strike price of 420 dlrs. Subscriptions close on June 22 and payment date is July 8. REUTER  2-JUN-1987 10:13:22.63 usa V RM f1060reute b f BC-/U.S.-FACTORY-ORDERS 06-02 0107  U.S. FACTORY ORDERS ROSE 0.2 PCT IN APRIL WASHINGTON, June 2 - New orders for manufactured goods rose 401 mln dlrs, or 0.2 pct, in April to a seasonally adjusted 199.8 billion dlrs, the Commerce Department said. The slight April gain followed a revised orders increase in March of 2.6 pct. The department originally reported a March increase of 2.3 pct. Excluding defense, factory orders fell 0.2 pct in April after rising 1.1 pct in March. Orders for durable goods were virtually unchanged in April, up only 13 mln dlrs to 106.2 billion dlrs. The department had estimated on May 22 that April durable goods orders rose 0.1 pct. The department said defense capital goods orders were up 808 mln dlrs, or 8.1 pct, in April to 10.8 billion dlrs. Defense orders had risen 43.2 pct in March. New orders for non-durable goods were up 388 mln dlrs, or 0.4 pct, in April to 93.6 billion dlrs. These figures compared with a March increase of 4.2 pct in durables orders and a 0.8 pct rise in non-durables orders. Orders for non-defense capital goods were up 0.8 pct in April after rising 2.0 pct in March. Within major industry categories orders for transportation equipment fell 7.6 pct in April after rising 10.8 pct in March. Primary metals gained 5.4 pct in April after a 6.8 pct March orders increase. Orders for non-electrical machinery were down 0.9 pct in April after rising 2.3 pct in March. Electrical machinery orders rose during April by 19.3 pct after falling in March by 3.4 pct. Reuter  2-JUN-1987 10:13:44.37 gnp pakistan RM f1062reute r f BC-PAKISTAN-SAYS-GOOD-EC 06-02 0107  PAKISTAN SAYS GOOD ECONOMIC GROWTH CONTINUES ISLAMABAD, June 2 - Pakistan says its economy has continued its recent outstanding performance during the financial year 1986/87 ending on June 30 but areas like balance of payments, investments and energy were causing concern. GDP grew in line with the average growth rate since 1980 and the inflation rate was the lowest since 1969/70, according to a government economic survey. The reform of economic regulation had gathered momentum and there was an impressive performance in a five point government program for rural uplift, education and poverty alleviation, said the survey. Ministry Economic Adviser Qazi Alimullah told a news conference that before recent unseasonal rains and hailstorms damaged the wheat crop, GDP growth was calculated at 7.04 pct compared to 7.25 pct in 1985/86.He said the figure might now slide down a little to around 6.8 or 6.9 pct. The survey said monetary expansion was estimated to be nine pct to date but might rise to around 12 pct by the year-end. Alimullah said exports rose 18 pct to 3.5 billion dlrs from 2.9 billion dlrs in 1985/86. But the at the same time, home remittances by Pakistanis abroad dropped to 2.3 billion dlrs from the 1985/86 level of 2.595 billion. More exports and an improvement in the balance of payments situation will be required to overcome this declining trend in home remittances, he said. The survey said the trade deficit was expected to fall to 2.4 billion dlrs from three billion dlrs in 1985/86 because of the boost in exports. He said national investment continued to be small because of a poor rate of savings, about 14 pct of GDP. He said more savings were required to maintain or possibly step up the present growth rate and to finance the country's seventh five-year development plan to be launched in July 1988. REUTER  2-JUN-1987 10:18:10.62 money-fxdlr greenspan V RM f1077reute f f BC-******GREENSPAN-SAYS 06-02 0010  ******GREENSPAN SAYS THERE IS EVIDENCE DOLLAR HAS BOTTOMED OUT Blah blah blah.  2-JUN-1987 10:20:19.41 interest RM f1084reute f f BC-BANK-OF-FRANCE-LEAVES 06-02 0013  ******BANK OF FRANCE LEAVES INTERVENTION RATE UNCHANGED AT 7-3/4 PCT - OFFICIAL Blah blah blah.  2-JUN-1987 10:21:40.24 money-fxdlr usa greenspan V RM f1090reute u f BC-/GREENSPAN-SEES-EVIDE 06-02 0060  GREENSPAN SEES EVIDENCE DOLLAR FALL OVER WASHINGTON, June 2 - Newly-nominated Federal Reserve Board chairman Alan Greenspan said there was evidence the dollar finally had bottomed out. In a White House briefing Greenspan was asked by reporters if he thought the dollar had bottomed out. "There certainly is evidence in that direction," he replied. Reuter  2-JUN-1987 10:22:29.78 goldsilverplatinum volcker V RM f1091reute f f BC-******U.S.-GOLD,-SILV 06-02 0012  ******U.S. GOLD, SILVER, PLATINUM SOAR ON VOLCKER REJECTION OF 3RD TERM Blah blah blah.  2-JUN-1987 10:25:00.56 cocoa uk icco C T f1106reute b f BC-ICCO-BUYS-5,000-TONNE 06-02 0063  ICCO BUYS 5,000 TONNES COCOA FOR BUFFER STOCK LONDON, June 2 - The International Cocoa Organization (ICCO) buffer stock manager bought 5,000 tonnes of cocoa today for the buffer stock, traders said. The cocoa is believed to have been entirely made up of second hand material, they added. Such a purchase would bring cumulative buffer stock purchases to 26,000 tonnes. Reuter  2-JUN-1987 10:27:58.21 usa F f1123reute u f BC-YANKEE-COS-<YNK>-SEEK 06-02 0063  YANKEE COS <YNK> SEEKS DEBT RESTRUCTURING COHASSET, Mass., June 2 - Yankee Cos Inc said it will be working with the holders of substantially all of its 12-5/8 pct senior secured notres due 1996 to develop and overall debt and asset restructuring program, and as a first step, the noteholder has agreed to the deferral of the June One interest payment on the notes until June 30. Yankee said interest was paid to other noteholders yesterday. The company said it plans to meet and work with all interest parties, including the holders of its three debt issues and federal banking authorities, over the next several weeks to formulate and implement a restructuring plan. Reuter  2-JUN-1987 10:29:27.94 usa F f1132reute u f BC-Q-MED-<QEKG.O>-SEES-S 06-02 0106  Q-MED <QEKG.O> SEES SHARPLY HIGHER REVENUES CLARK, N.J., June 2 - Q-Med Inc said preliminary results show its second quarter, ended May 31, revenues exceeded 4.2 mln dlrs. A year earlier revenues were nearly 1.4 mln dlrs. The company also said it had appointed Coopers and Lybrand as its auditors. Chairman Michael Cox declined any comment on this appointment. The company said its preliminary second quarter revenues are consistent with management's expectations and represent a greater than 40 pct increase in sales over those reported for the first quarter. Earnings should show a similar growth pattern, the company added. Reuter  2-JUN-1987 10:29:31.47 acq usa F f1133reute u f BC-ACME-PRECISION-<ACL> 06-02 0028  ACME PRECISION <ACL> BUYOUT BID DROPPED DETROIT, June 2 - Acme Precision Products Inc said a management group has withdrawn a six dlr per share leveraged buyout offer. Acme said the management group dropped its bid due to continued weakness in the machine tool industry and in Acme Precision's operating results and to the inability of the management group to obtain modifications to terms of its financing commitment. It said, "The effect of these factors led the management group to conclude that the six dlr per share price was excessive under current conditions." Reuter  2-JUN-1987 10:29:53.30 usa A RM f1136reute r f BC-DOMINION-<D>-UNIT-SEL 06-02 0111  DOMINION <D> UNIT SELLS 30-YEAR BONDS NEW YORK, June 2 - Virginia Electric and Power Co, a unit of Dominion Resources Inc, is raising 100 mln dlrs via an offering of first and refunding mortgage bonds due 2017 yielding 9.89 pct, said sole manager E.F. Hutton and Co Inc. Hutton led a group that won the bonds in competitive bidding. It bid them at 99.376, representing a net interest charge to the company of 9.94 pct. The underwriter set a 9-7/8 pct coupon and reoffering price of 99.85 to yield 123 basis points more than comparable Treasury securities. Non-refundable for five years, the bonds are rated A-1 by Moody's and A-plus by Standard and Poor's. The gross spread is four dlrs and the reallowance is 2.50 dlrs, bookrunner Hutton said of the Virginia Electric deal. Virginia Electric last visited the domestic debt market in October 1986 when it sold 100 mln dlrs of same-rated, same-maturity 9-1/4 pct bonds. That issue was priced to yield 9.27 pct, or 141 basis points over Treasuries. Reuter  2-JUN-1987 10:30:02.50 usa F f1137reute r f BC-GENERAL-SIGNAL-<GSX> 06-02 0073  GENERAL SIGNAL <GSX> LOW BIDDER ON RADIO JOB STAMFORD, Conn., June 2 - General Signal Corp said its General Railway Signal Co unit is the apparent low bidder at 32.5 mln dlrs on a transit radio system contract for the Southern California Rapid Transit District in Los Angeles. The company also said its General Farebox Inc subsidiary received a 3.1 mln dlr farebox system contract from the Greater Cleveland Regional Transit Authority. Reuter  2-JUN-1987 10:30:24.62 usa F f1141reute r f BC-WILLIAMS-<WMB>-REINCO 06-02 0034  WILLIAMS <WMB> REINCORPORATES IN DELAWARE TULSA, June 2- Williams Cos said it has been reincorporated in Delaware as Williams Cos Inc following approval by shareholders at the annual meeting last month. Reuter  2-JUN-1987 10:30:58.70 usa A RM f1142reute r f BC-NOBLE-AFFILIATES-<NBL 06-02 0112  NOBLE AFFILIATES <NBL> SELLS CONVERTIBLE DEBT NEW YORK, June 2 - Noble Affiliates Inc is raising 100 mln dlrs via an offering of convertible subordinated debentures due 2012 with a 7-1/4 pct coupon and par pricing, said lead underwriter Morgan Stanley and Co Inc. The debentures can be converted into the company's common stock at 19.625 dlrs per share, representing a premium of 25.6 pct over the stock price when terms on the debt were set. Non-callable for three years, the issue is rated Baa-3 by Moody's and BBB-plus by Standard and Poor's. Noble Affiliates is also offering 125 mln dlrs of 10-1/8 pct notes due 1997 through a group led by Morgan Stanley. Reuter  2-JUN-1987 10:31:26.20 usa nasdaq F f1146reute r f BC-MERIDIAN-INSURANCE-<M 06-02 0033  MERIDIAN INSURANCE <MIGI.O> IN NASDAQ EXPANSION INDIANAPOLIS, June 2 - Meridian Insurance Group Inc said its common stock has been included in the NASDAQ National Market System, effective today. Reuter  2-JUN-1987 10:33:30.27 uk RM f1161reute b f BC-CANON-SALES-ISSUES-10 06-02 0104  CANON SALES ISSUES 100 MLN DLR WARRANT BOND LONDON, June 2 - Canon Sales Co Inc is issuing a 100 mln dlr equity warrant bond due June 30, 1992 with an indicated coupon of 1-5/8 pct and par pricing, lead manager Yamaichi International (Europe) Ltd said. The issue is guaranteed by Fuji Bank Ltd and final terms will be set on June 9. The selling concession is 1-1/2 pct while management and underwriting combined pays 3/4 pct. The deal is available in denominations of 5,000 dlrs and will be listed in Luxembourg. The warrants are exercisable from July 15, until June 23, 1992. The payment date is June 30. REUTER  2-JUN-1987 10:35:06.58 grainbarley italy G f1173reute d f BC-ITALIAN-BARLEY-CROP-R 06-02 0085  ITALIAN BARLEY CROP REPORTED IN GOOD CONDITION ROME, June 2 - Italy's barley crop is generally in good condition and harvesting is expected to begin shortly, the agricultural marketing information and research board Irvam said. First consignments were expected to be available around mid-June. Excellent weather, characterised by alternating periods of sunshine and rain, has encouraged growth except in Sardinia, which was expected to lose a large part of its barley crop because of extreme dryness. Irvam said yields are expected higher than last year's low levels if favourable weather continues in the next few weeks. Given an average yield of 3.5 tonnes per hectare, national production would be around two pct higher than in the previous season at just above 1.6 mln tonnes, it said. If yields reach the record 3.78 tonnes per hectare achieved in 1984, production would be around 1.75 mln tonnes, an increase of 11 pct compared to 1986. Reuter  2-JUN-1987 10:35:41.13 uk RM f1176reute b f BC-ASIAN-DEVELOPMENT-BAN 06-02 0082  ASIAN DEVELOPMENT BANK ISSUES 50 MLN STG EUROBOND LONDON, June 2 - The Asian Development Bank is issuing a 50 mln stg eurobond due July 1, 1997 paying 9-1/2 pct and priced at 101-7/8 pct, lead manager County Natwest Capital Markets Ltd said. The non-callable bond is available in denominations of 1,000 and 10,000 stg and will be listed in Luxembourg. The selling concession is 1-3/8 pct while management and underwriting combined pays 5/8 pct. Payment date is July 1. REUTER  2-JUN-1987 10:38:09.89 usa F f1191reute r f BC-DATA-GENERAL-<DGN>-OF 06-02 0095  DATA GENERAL <DGN> OFFERS NEW NETWORK PRODUCTS NEW YORK, June 2 - Data General Corp said it introduced several new hardware and software products that link International Business Machines Corp <IBM> and IBM-compatible personal computers into mainframe and minicomputer systems. Data General said the products include three local area networks that conform to industry standards. It said it is now offering a Starlan network, which was originally introduced by American telephone and Telegraph Co <t>, a thin Ethernet and a PC interface for the standard Ethernet. In addition, Data General said it will offer several software packages for PC networks, including MS Net, a product developed by Microsoft Corp <MSFT.O> that allows PCs to share printers, data files and other peripherals. The company said it also introduced a PC version of its popular CEO office automation software. Data General said the new products allow computer users to divide work among a collection of PCs and larger computers. "Data General is the first vendor to offer three different local area networks for personal computer integration," said Colin Crook, senior vice president of the company's communications systems group. "We're really giving users freedom of choice with industry standard products," added J. David Lyons, vice president of group marketing. In addition to the new products, which were expected, Data General announced a joint product development agreement with <Gold Hill Computers>, a Cambridge, Mass.,-based artificial intelligence software company. The company also announced the formation of a new network services group that will help customers plan and design computer networks. The group will also provide service and maintenance for Data General and other vendors' equipment, the company said. Reuter  2-JUN-1987 10:38:33.20 usa F f1194reute r f BC-PERPETUAL-SAVINGS-<PA 06-02 0067  PERPETUAL SAVINGS <PASB.O> SETS HOLDING COMPANY ALEXANDRIA, Va., June 2 - Perpetual Savings Bank said its board has approved formation of a holding company to be incorporated in Virginia, subject to Federal Home Loan Bank Board and shareholder approval. It said its common and prefered shares would be exchanged on a one-for-one basis for shares of the holding company, Perpetual Financial corp. Reuter  2-JUN-1987 10:39:23.41 earn usa F f1200reute u f BC-PEP-BOYS---MANNY,-MOE 06-02 0046  PEP BOYS - MANNY, MOE AND JACK INC <PBY> 1ST QTR PHILADELPHIA, June 2 - May Two net Shr 11 cts vs eight cts Net 5,895,000 vs 3,896,000 Sales 127.3 mln vs 110.5 mln NOTE: Share adjusted for three-for-one stock split payable July 27 to holders of record July One. Reuter  2-JUN-1987 10:40:26.29 acq canada E F f1202reute r f BC-elders-says-bid-made 06-02 0100  ELDERS HAPPY TO LEAVE CARLING SHARES OUTSTANDING TORONTO, June 2 - Elders IXL Ltd <ELXA.S> says it is happy to leave preferences shares of brewer Carling O'Keefe Ltd outstanding after an undisclosed bidder made an offer to acquire all of Carling's outstanding preferred stock. Elders, which owns 100 pct of Carling's outstanding common shares, previously proposed to redeem the 433,745 Carling series A preferred shares at 33.50 Canadian dlrs each and redeem the 386,662 series B preferreds at 40 dlrs a share. The series A and B preferred shares carry no vote while dividends are paid. Elders says neither it nor Carling knows the identity of the bidder for Carling's preferred shares. On May 29, the bidder offered to acquire the Carling preferred for 36 dlrs for each series A and 40.50 dlrs for each series B share. Elders said leaving the Carling preferred shares outstanding will not affect ongoing plans of the company. Series B preferred shareholders had previously rejected Carling's proposal to redeem the shares and a series A preferred shareholders meeting was adjourned to June 12. Reuter  2-JUN-1987 10:40:39.77 belgium ec C G T f1203reute r f BC-EC-FARM-MINISTERS-DIS 06-02 0116  EC FARM MINISTERS DISAGREE ON DIRECT INCOME AIDS GENVAL, Belgium, June 2 - Plans to provide direct income aids for European Community (EC) small farmers to help them face deep cuts in guaranteed crop prices received a mixed reception from EC agriculture ministers, EC officials said. The plans were discussed at an informal meeting of the ministers hosted in the village of Genval by the Council of Ministers' current chairman, Belgium's Paul de Keersmaeker. The EC Executive Commission has proposed that the richer member states be allowed to make direct payments to their farmers in special difficulties, while the EC itself would finance a similar scheme in the poorer EC countries. However, EC officials said only the Netherlands and Luxembourg supported this idea at today's meeting, and France, Denmark and Belgium showed marked hostility to it. French minister Francois Guillaume told reporters, "Farmers should not become recipients of public assistance -- their survival should be assured by price mechanisms and the market." The officials said the ministers had not sought to resolve their more urgent differences over guaranteed farm prices for 1987/88 at this meeting. The ministers will resume talks on the price fixing issue in Luxembourg on June 15. Reuter  2-JUN-1987 10:44:13.90 usa F f1226reute d f BC-ONE-OF-TWO-SARA-LEE-< 06-02 0098  ONE OF TWO SARA LEE <SLE> STRIKES SETTLED DEERFIELD, ILL., June 2 - Sara Lee Corp said 500 workers at its Kitchens of Sara Lee bakery operation in Deerfield, Ill., have returned to work this week after ratifying a contract. A company spokesman said members of Local Two of the Bakery, Confectionery and Tobacco Workers, who had walked out May 10, reached "mutually agreeable terms" in a new two-year contract. Meanwhile, about 100 Teamster drivers and warehouse employees, whose contract expired May 16, remained out, the company said. No new talks were scheduled, Sara Lee said. Details of the new contract were not immediately available, but a company spokesman said it "maintained benefits and called for no sacrifices from current employees." Union sources reported that the contract freezes wages and introduces a sharply lower starting rate for new hires. They said it also gives Sara Lee concessions on a workplace issue involving excused absences. Reuter  2-JUN-1987 10:44:26.34 usa F f1228reute d f BC-CRAY-<CYR>-GETS-3.6-M 06-02 0051  CRAY <CYR> GETS 3.6 MLN DLR COMPUTER ORDER MINNEAPOLIS, June 2 - Cray Research Inc said Aerospatiale, a French aerospace company, ordered a Cray X-MP/14se computer system valued at about 3.6 mln dlrs. It said the leased system will be installed in the fourth quarter, pending export license approval. Reuter  2-JUN-1987 10:48:49.65 portugal RM f1246reute u f BC-PORTUGAL-CONTRACTS-FO 06-02 0105  PORTUGAL CONTRACTS FOR 150 MLN ECU LOAN LISBON, June 2 - Portugal has contracted a six-year, 150 mln ECU loan from a group of foreign banks led by Daiwa Europe Ltd to finance investment projects, the finance ministry said. Interest of 7.75 pct is to be paid in annual instalments starting in 1988, ministry spokesman Luis Vilhena de Cunha said. The loan will first be in the form of a temporary global note and be replaced later by subscriptions of 1,000 and 10,000 ECUs. The issue price was set at 101.75 pct. Banque Generale du Luxembourg SA will act as listing agent and fiscal agent, the spokesman added. REUTER  2-JUN-1987 10:50:08.18 carcass usa C G L f1251reute b f BC-CHICKEN-NOT-MAIN-SALM 06-02 0140  CHICKEN NOT MAIN SALMONELLA CAUSE, OFFICIAL SAYS WASHINGTON, June 2 - A representative of the poultry industry said statistics showed that chicken is less frequently the cause of salmonella poisoning than beef, dairy products or salads and other mixed foods. Kenneth May, President of Holly Farms Poultry Industries and a director of the National Broiler Council, told a House Agriculture subcommittee the incidence of salmonella in chicken has not increased in recent years and that chicken is neither the major source of the bacterial poisoning nor the cause of an increase in outbreaks of the disease. May said the Center for Disease Control figures showed that between 1978 and 1982, chicken was involved in four pct of all U.S. salmonellosis outbreaks, while beef accounted for ten pct of outbreaks and dairy products six pct. May said the remaining outbreaks were caused by salads and mixed food, turkey, seafood, pork, eggs and other foods. May said the chicken industry favored moving away from bird-by-bird inspection procedures to a risk assessment system better able to identify microbial and bacterial contamination of poultry. However, Ellen Haas, executive director of Public Voice for Food and Health Policy, said bird-by-bird inspection should be retained and labels should be attached to each ready-to-cook chicken to remind consumers about preparation procedures necessary to avoid illness. Haas also called for a review of present chicken industry inspection methods that she said can worsen poultry hazards. Reuter  2-JUN-1987 10:51:10.96 graincorn usa C G f1254reute u f BC-/U.S.-HOUSE-PANEL-VOT 06-02 0110  U.S. HOUSE PANEL VOTES TO SPEED UP CORN PAYMENTS WASHINGTON, June 2 - The House Agriculture Committee voted to make approximately 2.8 billion dlrs of feedgrains deficiency payments immediately instead of in the late fall. A similar measure was decisively defeated on the Senate floor last week. The bill, which passed by a voice vote, would allow so-called Findley payments to be made immediately rather than late this year. Payments for 1987-90 feedgrains crops would not be changed. Because the bill would move 2.8 billion dlrs of spending into fiscal 1987 from fiscal 1988, the measure is expected to meet stiff resistance in the full House. Reuter  2-JUN-1987 10:51:16.67 acq usa F f1255reute u f BC-JONES-AND-VINING-<JNS 06-02 0031  JONES AND VINING <JNSV.O> STARTS BID FOR SHARES BRAINTREE, Mass., June 2 - Jones and Vining Inc said it has started a tender offer for all of its own shares at five dlrs per share. The company said it will hold a special meeting on July 10 for a vote on approval of a merger at the tender price. It said the price to be paid in the tender and merger could be reduced by any fees and expenses the court may award to counsel for the plaintiffs in the class action suit brought against it in Delaware Chancery Court by Ronda Inc. The plaintfiffs' counsel are seeking fees of up to 10 cts per share, Jones and Vining said. The company said the court has scheduled a hearing on the proposed settlement of the suit for July Eight. The company said the start of the tender offer and the calling of the special meeting are conditions of the settlement, and completion of the tender and merger are conditioned on final approval of the settlement. Reuter  2-JUN-1987 10:51:48.40 acq usa F f1258reute d f BC-HEALTHSOUTH-<HSRC.O> 06-02 0064  HEALTHSOUTH <HSRC.O> MAKES ACQUISITION BIRMINGHAM, Ala., June 2 - HEALTHSOUTH Rehabilitation Corp said it has acquired Pine Island Sports Medicine Center in Fort Lauderdale, Fla., and will incorporate the facility into its HEALTHSOUTH Rehabilitation Center of Fort Lauderdale, which is now under construction and should be in operation by mid-summer. Terms were not disclosed. Reuter  2-JUN-1987 10:51:55.69 acq usa F f1259reute d f BC-BANC-ONE-<ONE>-MAKES 06-02 0033  BANC ONE <ONE> MAKES INDIANA ACQUISITION COLUMBUS, Ohio, June 2 - Banc One Corp said it has completed the acquisition of First National Bank of Bloomington, Ind, which has assets of 271 mln dlrs. Reuter  2-JUN-1987 10:53:42.76 usa F f1265reute r f BC-PENTLAND-INDUSTRIES-P 06-02 0062  PENTLAND INDUSTRIES PLC HOLDERS APPROVE SPLIT NEW YORK, June 2 - Pentland Industries PLC said shareholders at the annual meeting approved an increase in authorized share capital to 36 mln stg to 12 mln stg by creation of another 240 mln ordinary shares, allowing for a three-for-one stock split. It said dealings in the new shares are expected to start on June 15. Reuter  2-JUN-1987 10:54:40.06 acq usa F f1270reute d f BC-ORION-BROADCAST-<OBGI 06-02 0079  ORION BROADCAST <OBGI.O> BUYS FORD <F> UNIT DENVER, June 2 - Orion Broadcast Group Inc said its majority-owned Orion Financial Services Corp subsidiary has agreed to purchase FN Realty Services Inc from Ford Motor Co for 1,200,000 to 1,500,000 dlrs in cash and notes. It said closing is expected within 45 days after receipt of regulatory approvals. FN provides loan collection, accounting, data processing and administrative services to the real estate industry. Reuter  2-JUN-1987 10:54:52.48 luxembourg ec C G T f1271reute r f BC-EC-BUDGET-MINISTERS-S 06-02 0100  EC BUDGET MINISTERS SET TO REFUSE PLEA FOR CASH LUXEMBOURG, June 2 - A plea for extra cash to bail the European Community (EC) out of its latest financial crisis was likely to be rejected at a meeting today of EC budget ministers, diplomats said. The ministers were meeting for the first time since the EC Executive Commission unveiled an emergency budget for 1987 aimed at plugging a deficit caused by soaring farm spending and falling revenues. The emergency package includes a demand for member states to pay an extra 1.5 billion European currency units (Ecus) to help meet the deficit. Officials said Britain and West Germany were expected to lead opposition to contributing any extra cash, with the U.K insisting instead on a clampdown on runaway farm spending. The Commission says there will be a shortfall of at least five billion Ecus this year, more than 1/8 of total spending. It hopes to make up much of the shortfall in a one-time accounting exercise by paying member states in arrears rather than in advance for their spending on Community farm policies. But if member states do not make up the rest of the gap, the Commission has warned that spending on regional and social projects could be slashed by half. Reuter  2-JUN-1987 10:55:50.84 usa F f1273reute h f BC-ORBIT-<ORBT.O>-UNIT-I 06-02 0083  ORBIT <ORBT.O> UNIT INCREASES BACKLOG HAUPPAUGE, N.Y., June 2 - Orbit Instrument Corp said its unit, Orbit Semiconductor Inc, has received orders totalling about 2.5 mln dlrs which puts its backlog at a record level of about 4.7 mln dlrs. Additionally, the company said it will now offer two Micron CMOS processes that can withstand Megarad total dose radiation. Applications for the processes include products manufactured for military, medical and power industry market, the company said. Reuter  2-JUN-1987 10:57:14.48 south-africa C M f1281reute u f BC-SOUTH-AFRICA-NAMES-1, 06-02 0100  SOUTH AFRICA SAYS 1,500 STILL DETAINEES CAPE TOWN, June 2 - South Africa said the number of people it was detaining without trial has dropped to 1,500, far fewer than previous official figures during the past year of emergency rule. A government spokesman said the latest set of names, presented to parliament, included all current detainees who had been held for over a month. Previous lists have named up to 8,500 people. The official figure was supported by civil rights groups who said many detainees had been freed in recent weeks, possibly to empty cells for a new government crackdown. Reuter  2-JUN-1987 11:02:51.01 japan C G T f1297reute d f BC-JAPANESE-FARMERS-MARC 06-02 0098  JAPANESE FARMERS PROTEST OPENING MARKETS TOKYO, June 2 - Thousands of farmers gathered in central Tokyo to urge the government to stand firm against foreign pressure for further opening up of Japan's markets to foreign agricultural products, union officials said. Officials of the Central Union of Agricultural Cooperatives said about 5,000 representatives from 4,200 farming groups joined the demonstration. The organisers said the farmers demanded that the government should avoid easy compromises on liberalising agricultural imports at next week's economic summit in Venice. The United States and the European Community want Japan to remove tariffs and quotas to help cut their trade deficits with Japan. Under a banner reading "The government and parliament must not sacrifice farmers," the demonstrators adopted a declaration saying they would fight any unreasonable moves to open Japanese markets to foreign agricultural products. An agriculture ministry official said Japan and the United States were expected to hold talks on Japanese import ceilings for U.S. Beef and citrus fruit in September. Reuter  2-JUN-1987 11:04:44.51 RM C G L M T F f1303reute b f BC-LONDON-GOLD-1500-FIX 06-02 0008  ******LONDON GOLD 1500 FIX - JUNE 2 - 455.00 DLRS Blah blah blah.  2-JUN-1987 11:07:06.07 norway de-clercq ec C G L M T f1316reute d f BC-FRESH-DEBATE-ON-NORWA 06-02 0091  FRESH DEBATE ON NORWAY'S EC MEMBERSHIP WELCOMED OSLO, June 2 - European Community officials welcomed Norway's recent move to renew a public debate on Community membership but said Norway should not expect special trade advantages as long as it stays outside the EC. Belgian Willy de Clercq, EC Commissioner on external affairs and trade policy, said high level talks this week with Norway's minority Labour government had helped clarify several misconceptions that led to Norway's narrow rejection of EC membership in a 1972 referendum. "But you (Norway) cannot be in the club and remain outside the club. You can expect equal footing in the club, but not out of it," de Clercq added, referring to Norway's attempts to adapt its EC trade ties in the face of Community moves to launch an internal trade market from 1992. The government, worried that the internal market will hamper trade with the EC, which takes about two-thirds of Norway's exports, last month sent a report to parliament asking political parties and the public to reassess the country's relationship to the EC. Reuter  2-JUN-1987 11:08:09.27 F f1321reute f f BC-******GULF-AND-WESTER 06-02 0009  ******GULF AND WESTERN INC 2ND QTR SHR 86 CTS VS 73 CTS Blah blah blah.  2-JUN-1987 11:08:48.90 earn usa F f1325reute u f BC-PHH-GROUP-INC-<PHH>-4 06-02 0057  PHH GROUP INC <PHH> 4TH QTR APRIL 30 NET HUNT VALLEY, Md., June 2 - Shr 71 cts vs 47 cts Net 12.1 mln vs 7.8 mln Revs 369.8 mln vs 307.9 mln 12 mths Shr 2.35 dlrs vs 2.33 dlrs Net 39.5 mln vs 39 mln Revs 1.36 billion vs 1.24 billion NOTE: Prior year restated to reflect results from current year acquisitions. Reuter  2-JUN-1987 11:10:13.59 usa volcker V RM f1330reute u f AM-VOLCKER-TEXT 06-02 0062  VOLCKER IN LETTER DECLINES NEW FED TERM WASHINGTON, June 2 - Following is the full text of Federal Reserve Board Chairman Paul Volcker's letter to President Reagan declining reappointment to the Fed: Dear Mr. President, As the end of my term as chairman of the Federal Reserve Board approaches, you naturally have to consider an appropriate new appointment. In that connection, you will recall that, upon my reappointment as chairman in 1983, I felt unable to make a firm commitment to you or to the Congress to remain in office for a second full four-year term. Despite my reservations at the time, that term is in fact now almost finished. However, I do think, after eight years as chairman, a natural time has now come for me to return to private life as soon as reasonably convenient and consistent with an orderly transition. Consequently, I do not desire reappointment as chairman and I plan to resign as governor when a new chairman is prepared to assume office. I will be leaving with a sense of great appreciation for your unfailing courtesy to me personally. More broadly, your consistent support of the work of the Federal Reserve during a particularly challenging period for it, for the financial system, and for the economy has been critical to whatever success we have had. Without doubt, strong challenges remain for all of those involved in economic policy. In that effort, I believe the nation will continue to be well served by a strong Federal Reserve System -- a system firmly dedicated to fostering economic and financial strength and stability and able to bring to that effort a combination of sound and independent professional judgement and continuity beyond any partisan considerations. May I add, too, my personal best wishes for the remainder of your own term in office during which you have done so much to restore a sense of confidence and self-reliance among the American people. Faithfully yours, Paul A Volcker Reuter  2-JUN-1987 11:18:53.04 money-fx uk lawson RM f1373reute u f BC-LAWSON-CALLS-INTERVEN 06-02 0120  LAWSON CALLS INTERVENTION PROOF OF STABILITY GOAL LONDON, June 2 - The scale of foreign exchange intervention the Bank of England has carried out recently is clear proof of Britain's determination to stabilise exchange rates as agreed between the Group of Seven industrialised countries in Paris in February, Chancellor of the Exchequer Nigel Lawson said. Saying he was "content" with sterling's current value, Lawson told reporters he wanted "to maintain the exchange rate stability we have all signed up for." He declined to say if he favoured a rise or a fall from present sterling levels. May currency reserves, out today, showed a record 4.8 billion stg rise, pointing to massive currency intervention. In April, reserves rose a hefty 2.9 billion stg. Pointing to the reserves data, Lawson said, "We have been playing a very full part ourselves" in meeting our commitments toward exchange rate stability as agreed in Paris. "We wish to see it (stability) continuing," he added. Asked which techniques were available to preserve stability, Lawson said both central bank intervention and interest rate changes could be used to tackle "the market pressures there are from time to time." "Interest rate stability is not an objective in that sense...Rates have to be moved up and down at times," he added. Lawson said he expected intervention to be "sterilised" by draining excess sterling liquidity from the market through new issues of government securities and foreign currency sales, when the market allowed. This would limit the inflationary impact of intervention, he said. "Sterilisation will be dictated by market tactics...Not necessarily in the month in which intervention occurs," Lawson said. "I am confident that we can sterilise on this scale." REUTER  2-JUN-1987 11:19:19.10 money-fxinterest usa V RM f1376reute b f BC-/-FED-NOT-EXPECTED-TO 06-02 0071  FED NOT EXPECTED TO TAKE MONEY MARKET ACTION NEW YORK, June 2 - The Federal Reserve is not expected to intervene in the government securities market to add or drain reserves at its usual intervention time this morning, economists said. With the Federal funds rate trading comfortably at 6-9/16 pct, down from yesterday's 6.74 pct average, economists said the Fed did not need to take reserve management action today. Reuter  2-JUN-1987 11:19:50.44 earn usa F f1379reute b f BC-******GULF-AND-WESTER 06-02 0044  GULF AND WESTERN INC <GW> 2ND QTR APRIL 30 NET NEW YORK, June 2 - Shr 86 cts vs 73 cts Net 52.7 mln vs 45.7 mln Revs 989.9 mln vs 863.9 mln Six mths Shr 1.97 dlrs vs 1.28 dlrs Net 122 mln vs 79.9 mln Revs 2.078 billion vs 1.726 billion Reuter  2-JUN-1987 11:20:12.43 F E f1382reute b f BC-******ALLEGIS-SAID-IT 06-02 0014  ******ALLEGIS SAID IT IS CREATING A LIMITED PARTNERSHIP TO SELL SOME CANADIAN HOTELS Blah blah blah.  2-JUN-1987 11:22:06.08 F f1395reute b f BC-******BROWN-GROUP-INC 06-02 0008  ******BROWN GROUP INC 1ST QTR SHR 56 CTS VS 42 CTS Blah blah blah.  2-JUN-1987 11:22:55.99 F E f1402reute b f BC-******ALLEGIS-SAID-IT 06-02 0013  ******ALLEGIS SAID IT SEES PROCEEDS OF 350 MLN CANADIAN DLRS WHEN HOTELS ARE SOLD Blah blah blah.  2-JUN-1987 11:23:12.29 icco T f1404reute f f BC-ICCO-BUFFER-STOCK-MAN 06-02 0010  ******ICCO BUFFER STOCK MANAGER BUYS 5,000 TONNES - OFFICIAL Blah blah blah.  2-JUN-1987 11:24:34.77 switzerland volckergreenspan RM f1415reute u f BC-CSFB-ECONOMIST-SAYS-V 06-02 0104  CSFB ECONOMIST SAYS VOCLKER'S RESIGNATION A SHOCK ZURICH, June 2 - The decision by Paul Volcker not to serve a third term as chairman of the U.S. Federal Reserve Board is a shock for financial markets and the world economy, Hans Mast, senior economic adviser to Credit Suisse First Boston, said. "The markets will believe there will be pressure for a more expansive policy (in the United States)," he said. "I would say this is quite a shock for the world economy," he added. "He always stood for an anti-inflationary policy and tight fiscal discipline. He was one of the best central bankers America has had." Mast said the markets would now be trying to assess what sort of direction the Fed would be taking under Alan Greenspan, designated to succeed Volcker. "Greenspan is more of a politician than an academician, but the most important thing is that he has little experience in banking," Mast said. Greenspan's first comments on being named were that the dollar appeared to have bottomed out but Mast said that conviction would have to be backed by policy. "How can you say the dollar has bottomed out with the present level of current account deficits?" he said. "I would be sceptical." REUTER  2-JUN-1987 11:24:48.49 usa volcker A RM f1417reute u f BC-SHEARSON-ECONOMIST-SA 06-02 0109  SHEARSON ECONOMIST SAYS VOLCKER EFFECT SHORT-TERM NEW YORK, June 2 - Alan Sinai, chief economist of Shearson Lehman Brothers Inc, said news that Federal Reserve Chairman Paul Volcker declined to accept reappointment would have only a short-term effect on financial markets. "The markets should not go into a panic," Sinai told a fixed-income conference in New York sponsored by the Institute for International Research. Sinai said he thought that Volcker was one of the best Fed governors in the country's history. Still, he predicted that the markets would calm after today's tremors. Alan Greenspan has been nominated to replace Volcker. Reuter  2-JUN-1987 11:25:21.16 usa F f1421reute r f BC-PERRY-DRUG-STORES-<PD 06-02 0068  PERRY DRUG STORES <PDS> NAMES NEW PRESIDENT PONTIAC, Mich., June 2 - Perry Drug Stores Inc said it has elected David Schwartz as president and chief executive officer, effective immediately. Perry said Schwartz, who will also serve on the board, replaced Donald Fox, who resigned January 12. Previously, Schwartz was vice president of drug and general merchandise for Kroger Co <KR>, Perry said. Reuter  2-JUN-1987 11:25:35.88 usa F f1423reute r f BC-MICRO-D-<MCRD.O>-IN-A 06-02 0088  MICRO D <MCRD.O> IN AGREEMENT WITH ZENITH <ZE> GLENVIEW, ILL., June 2 - Zenith Electronics Corp said its computer subsidiary signed an agreement under which Micro D Inc will market the new Zenith Data Systems monitor, which uses the flat tension mask color video display. The monitor offers more than 50 pct greater brightness and contrast performance than conventional high-revolution computer monitors, Zenith said. It is compatible with the new IBM Personal System/2 computers and will be available later this summer. Reuter  2-JUN-1987 11:25:47.87 trade turkey RM f1425reute r f BC-TURKISH-TRADE-DEFICIT 06-02 0083  TURKISH TRADE DEFICIT WIDENS IN APRIL ANKARA, June 2 - Turkey's trade deficit widened to 382 mln dlrs in April from 275 mln in March and 273 mln in April 1986, the State Statistics Institute said. The deficit for the first quarter of 1987 widened to 1.23 billion dlrs from 1.20 billion a year earlier. April exports totalled 702 mln dlrs compared with imports of 1.08 billion. Exports in the first four months were worth 2.69 billion dlrs compared with imports of 3.92 billion. REUTER  2-JUN-1987 11:25:57.77 earn usa F f1427reute r f BC-UNITED-FINANCIAL-BANK 06-02 0039  UNITED FINANCIAL BANKING <UFBC.O> 1ST QTR NET VIENNA, Va., June 2 - Shr four cts vs 21 cts Net 29,862 vs 152,826 NOTE: Full name is United Financial Banking Cos Inc. Net includes loan loss provision nil vs 40,000 dlrs. Reuter  2-JUN-1987 11:26:37.03 usa F f1432reute d f BC-DREYFUS-<DRY>-INTRODU 06-02 0099  DREYFUS <DRY> INTRODUCES STOCK INDEX FUND NEW YORK, June 2 - Dreyfus Corp said it introduced a stock index mutual fund designed primarily for use by bank trust departments in managing their corporate pension accounts. Dreyfus said the fund is keyed to matching the performance of Standard and Poor's 500 Composite Stock Price Index, and in addition to purchasing stock of the S and P index, the fund may also deal in index futures. The company said the fund will be managed by <Wells Fargo Investment Advisors>. Minimum investment requirement is one mln dlrs, the company said. Reuter  2-JUN-1987 11:27:37.15 usa greenspanvolcker A RM f1437reute u f BC-SEN-DOLE-SAYS-GREENSP 06-02 0113  SEN DOLE SAYS GREENSPAN WILL BE GOOD FED CHAIRMAN WASHINGTON, June 2 - Senate Republican Leader Robert Dole of Kansas said Alan Greenspan would be a good replacement for Paul Volcker as Federal Reserve Chairman. "While Paul Volcker's retirement is a real loss, this country is very fortunate to have a man of Alan Greenspan's caliber to take his place," Dole said in a statement. "Alan's knowledge of the economy, coupled with his experience at the top levels of government, means that the leadership of the Federal Reserve Board will be in good hands. Alan, literally, has some big shoes to fill. But I haven't any doubts he's more than equal to the task," Dole said. Reuter  2-JUN-1987 11:27:45.10 earn usa F f1438reute u f BC-BROWN-GROUP-INC-<BG> 06-02 0032  BROWN GROUP INC <BG> 1ST QTR MAY 2 NET ST. LOUIS, Junee 2 - Shr 56 cts vs 42 cts Net 10,030,000 vs 7,833,000 Sales 392.1 mln vs 339.6 mln Avg shrs 17,966,000 vs 18,709,000 Reuter  2-JUN-1987 11:28:11.97 crude usa C f1439reute d f BC-U.S.-ENERGY-SECRETARY 06-02 0141  U.S. ENERGY SECRETARY SEES HIGHER OIL PRICES WASHINGTON, June 2 - Energy Secretary Donald Hodel said he expects oil prices to rise significantly by the year 2000, probably to around 33 dlrs a barrel in current dollars. "I do anticipate a significant increase (by 2000). Thirty-three dlrs a barrel is not unreasonable," Hodel told the Senate Energy Committee. Hodel said the loss of some domestic oil production through the shutdown of stripper (10 barrels a day or less) wells because of low prices was probably permanent. He said he was also concerned by the decline in domestic oil exploration. Hodel urged Congress to approve oil exploration in section 1002 of the Arctic National Wildlife Refuge in Alaska. He said geologic condtions in the area were favorable for the discovery of oil fields equal to those in nearby Prudhoe Bay. Reuter  2-JUN-1987 11:28:46.97 usa F f1444reute s f BC-MUTUAL-OF-OMAHA-INTER 06-02 0024  MUTUAL OF OMAHA INTEREST SHARES INC <MUO> PAYOUT OMAHA, Neb., June 2 - Qtly div 36 cts vs 36 cts prior Payable July 1 Record June 12 Reuter  2-JUN-1987 11:29:35.72 earn usa F f1445reute r f BC-NORTHWEST-TELEPRODUCT 06-02 0043  NORTHWEST TELEPRODUCTIONS <NWTL.O> 4TH QTR NET MINNEAPOLIS, MINN., June 2 - Shr 15 cts vs 16 cts Net 239,034 vs 264,485 Sales 2,932,782 vs 2,664,853 Year Shr 57 cts vs 45 cts Net 929,524 vs 741,121 Sales 10.9 mln vs 9,708,792 Reuter  2-JUN-1987 11:31:07.63 F f1451reute b f BC-******U.S.-JUDGE-SAYS 06-02 0014  ******U.S. JUDGE SAYS TO DECIDE BURLINGTON REQUEST FOR SAMJENS INJUNCTION IN "FEW DAYS" Blah blah blah.  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-019.sgm000066400000000000000000002454111154025176300231540ustar00rootroot00000000000000 18-JUN-1987 18:46:13.14 usa F f4966reute u f BC-BEVERLY-HILLS-COP-II 06-18 0074  BEVERLY HILLS COP II TOPS 100 MLN AT BOX OFFICE NEW YORK, June 18 - Gulf and Western Inc's <GW> Paramount Pictures Corp division said its movie "Beverly Hills Cop II" has topped the 100 mln dlr mark at the box office on the 29th day of its North American release. Paramount said the the movie has become the fastest movie to hit the 100 mln dlr mark with an "R" rating, which means that anyone under 17 must be accompanied by their parents. Reuter  18-JUN-1987 18:46:33.73 usa F f4968reute s f BC-TRANSAMERICA-CORP-<TA 06-18 0022  TRANSAMERICA CORP <TA> QUARTERLY DIVIDEND SAN FRANCISCO, June 18 - Qtly div 44 cts vs 44 cts Pay July 31 Record July 3 Reuter  18-JUN-1987 18:48:35.56 usajapan F A f4972reute d f AM-POLICY 06-18 0078  U.S. HOUSE CALLS HIGHER JAPAN DEFENSE SPENDING WASHINGTON, June 18 - The House today supported a call for Japan to boost its defense spending to help share the burden of protecting Western interests in sensitive areas around the world, including in the Gulf. House member approved a measure that would require Secretary of State George Shultz to enter into talks with Japan on increasing Japanese defense spending to at least 3 pct of its gross national product. The measure, passed during consideration of the 1988-89 State Department funding bill would not require an increase, but legislators called on Japan to spend more on defense. The Senate must approve the measure before it becomes law. "We don't have to bash the Japanese. We have to show them how to share the burden of the defense of the free world," said Rep. Robert Dornan, a California Republican. The amendment calls on Shultz to enter into talks with Japan with the aim of reaching agreement on one of two alternatives: either Japan can spend 3 pct of its GNP on defense by itself or give the equivalent amount of money to the United States as a kind of security fee. Reuter  18-JUN-1987 18:55:48.68 gnp oecd RM f4988reute f f BC-OECD-SEES-1.5-PCT-WES 06-18 0010  ****** OECD SEES 1.5 PCT WEST GERMAN REAL GNP GROWTH IN 1987  18-JUN-1987 18:56:07.09 gnpcpibop franceaustralia oecd RM f4990reute u f BC-AUSTRALIA-SET-TO-GROW 06-18 0117  AUSTRALIA SET TO GROW, BUT UNEMPLOYMENT MAY RISE PARIS, June 19 - Australia's economy should manage modest growth over the next two years after a sharp slowdown but unemployment could still edge upwards, the Organisation for Economic Cooperation and Development (OECD) said. The organisation's latest half-yearly report says Gross Domestic Product will grow by 2.5 pct this year and by 2.75 pct in 1988 compared with only 1.4 pct in 1986. The growth will be helped by higher stockbuilding and stronger domestic demand following tax cuts and higher real wages, it added. The report forecasts a decline in inflation, with consumer prices increasing by 8.5 pct this year and 6.25 pct in 1988. The current account deficit shows signs of easing slightly and could narrow to 12 billion dlrs by the end of 1988. While predicting slightly stronger growth than last year, however, the report revises downwards the OECD's earlier growth forecast for 1987 of 3.75 pct. The OECD predicts a similar combination of modest economic growth and rising unemployment for New Zealand, which is struggling to recover from a major economic crisis. The country's GDP, which contracted by 0.6 pct last year, should again show growth over the next two years, rising by 0.25 pct this year and a more substantial 2.75 pct in 1988. Reuter  18-JUN-1987 19:03:26.58 acq usa F f4996reute u f BC-/SQUIBB-<SQB>-SAID-NO 06-18 0104  SQUIBB <SQB> SAID NOT INTERESTED IN BUYING CETUS BY MARJORIE SHAFFER, REUTERS NEW YORK, June 18 - Robert Fildes, president and chief executive of Cetus Corp <CTUS.O>, told Reuters that Squibb Corp is not interested in buying Cetus. Earlier the companies said Squibb would buy from Cetus a five pct equity postion in Cetus for about 40 mln dlrs. "This is not an attempt by Squibb to become a major majority holder in Cetus," Fildes told Reuters in an interview. "Squibb has not approached us with any indication that they want to acquire us and we wouldn't be interested in that kind of arrangement," said Fildes. Squibb could not be reached to comment on the late comments by Fildes. Squibb is Cetus' first pharmaceutical partner and the only one to own an equity position in Cetus. Eastman Kodak Co <EK> and W.R. Grace <WR> both have joint ventures with Cetus, but neither owns an equity position in the company, said Fildes. Cetus has a venture with Kodak to develp diagnostic products and with Grace to develop agricultural products. Earlier, Squibb and Cetus announced in a joint statement an agreement in principle to form a joint venture to develop new biotechnology products in several fields. As part of the deal Squibb will license several of Cetus' anticancer agents, including interleukin-2, in development. Squibb will sell the drugs only in Japan and other markets but not in North American and Western Europe. "We wouldn't have done this deal had it not been understood that Cetus wants to build its own fully integrated business in North America and Europe," said Fildes. He said Squibb was the good partner because Squibb has a major joint venture in Japan and has sales capabilities of its own in that market. Fildes said Cetus has shunned licensing arrangements with pharmaceutical companies because it wanted to build its own business. Many large corporations have invested in small biotech firms. But Squibb's investment in Cetus is the first it has made in biotechnology. Fildes said that was attractive to Cetus because it wanted a partner that didn't have a relationship with a large number of other biotechnology companies." Fildes said his strategy was to have partners in non drug areas like diagnostics and agriculture, but to "keep the biggest developments in anticancer drugs to ourselves." Fildes said the partnership with Squibb would be used to broaden the company's reach in such big money making areas as the cardiovascular, anti-infective and the anti-inflammatory markets. Squibb is also investming 75 mln dlrs in Cetus' research over the next five years. "Squibb is putting up over 75 mln dlrs in research and development to make it happen, while the equity position part of the package is simply to demonstrate the seriousness of this partnership," said Fildes. Reuter  18-JUN-1987 19:44:15.31 usa F f5022reute b f BC-NBC-SAYS-IT-WILL-IMPL 06-18 0116  NBC SAYS IT WILL IMPLEMENT CONTRACT JUNE 29 NEW YORK, June 29 - The National Broadcasting Co, a unit of General Electric Co <GE>, said it intends to implement on June 29 a labor contract rejected by union represenatives. A spokesman for the National Association of Broadcast Employees and Technicians, represening 2,800 workers, said its negotiating committee adopted a formal resolution today stating it will inform NBC it will strike upon implementation. "The union will have to decide what action it thinks is appropriate," said Day Krolik, NBC's vice president for labor relations. A union spokesman said NBC has until the day of implemetation to peacefully negotiate a contract. Reuter  18-JUN-1987 19:50:03.10 usa F f5025reute u f BC-FORMER-SHEARSON-<SHE> 06-18 0099  FORMER SHEARSON <SHE> OFFICIAL PLEADS GUILTY NEW YORK, June 18 - Mark Stahl, 45, who was a former senior vice president of Shearson Lehman Brothers, until his suspension on April 16, today admitted in U.S. District court here, embezzling almost 19 mln dlrs from his firm over the past year. He entered a guilty plea before United States District Court Judge Vincent Broderick to four specific charges totaling 1,031,000 dlrs on wire fraud. Stahl, who was a senior vice president for finance, told the judge that the total embezzlement amounted to "a little less than" 19 mln dlrs. Through an attorney, Stahl agreed to make restitution to Shearson Lehman of all the embezzled funds if possible. However his guilty pleas today to the four counts will cover all criminal liability of the embezzlement that occurred between April 1986 to last April. Judge Broderick scheduled sentencing for December nine. Stahl faces a maximum sentence of 20 years in jail and one mln dlrs in fines, or both. Reuter  18-JUN-1987 19:53:55.04 earn usa F f5027reute u f BC-TRI-STAR-PICTURES-INC 06-18 0083  TRI-STAR PICTURES INC <TRSP.O> 1ST QTR MAY 31 NEW YORK, June 18 - Shr four cts vs four cts Net 1,180,000 vs 902,000 Revs 146.9 mln vs 37.0 mln Avg shrs 33 mln vs 23.9 mln NOTE: Company changed its fiscal year from December 31 to the last day of February, thus results of operations for the year-ago period have been restated to reflect this change. Current first quarter includes results of operations of Loews Theatre Management Corp which Tri-Star acquired December 31. Reuter  18-JUN-1987 20:07:05.93 E F RM f5035reute f f BC-CANADA-BUDGET-DEFICIT 06-18 0013  ******CANADA BUDGET DEFICIT DECLINE TO SLOW IN LATE 1980S - OFFICIAL Reuter  18-JUN-1987 20:07:10.18 V RM E f5036reute f f BC-CANADA-UPS-CORPORATE 06-18 0014  ******CANADA LIFTS CORPORATE TAX REVENUES BY FIVE BILLION DLRS OVER FIVE YEARS - OFFICIAL  18-JUN-1987 20:07:45.08 wilson E F RM f5037reute f f BC-WILSON-CUTS-PERSONAL 06-18 0011  ******WILSON CUTS PERSONAL TAX RATES, LIMITS CAPITAL GAINS EXEMPTIONS Reuter  18-JUN-1987 20:08:00.01 V RM E f5038reute f f BC-CANADA-UPS-FINANCIAL 06-18 0015  ******CANADA LIFTS FINANCIAL INSTITUTION AVERAGE TAX RATE TO 21.3 PCT FROM 14.5 PCT - OFFICIAL  18-JUN-1987 20:12:23.11 canada wilson V E RM f5040reute u f BC-WILSON-TO-HIKE-CORPOR 06-18 0085  CANADA TO INCREASE CORPORATE TAX REVENUES OTTAWA, June 18 - Canada will increase corporate tax revenues by about five billion dlrs over the next five years by broadening the tax base and allowing fewer exemptions, finance minister Michael Wilson said. As Wilson previously promised, he said corporations will bear an increased tax burden, despite new measures to lower overall tax rates. Increased corporate revenues will result from broadening the tax base and eliminating special tax exemptions. "The jobs of many Canadians depend on a corporate income tax system that is competitive with other countries, particularly the United States," Wilson said in a prepared speech to the House of Commons. "And it (tax reform) will ensure that profitable corporations carry a bigger share of the total tax burden," he added. Federal tax revenue from corporations will increase by 470 mln dlrs in the fiscal year ending March 31, 1988, 410 mln dlrs in fiscal 1989 and 1.19 billion dlrs in fiscal 1990, according to documents tabled with Wilson's speech. Reuter  18-JUN-1987 20:15:24.21 canada wilson V E RM f5041reute u f BC-CANADA-FINANCIAL-TAX 06-18 0074  CANADA FINANCIAL TAX RATE INCREASED OTTAWA, June 18 - The average tax rate for Canadian financial insitutions will increase to 21.3 pct from 14.5 pct under the new tax reform package, the federal finance department said. The amount of financial institutions' income that is taxed will also increase to 74.0 pct from 48.7 pct, it said in documents tabled with finance minister Michael Wilson's prepared speech to the House of Commons. Under Wilson's plan, the federal government will collect 1.36 billion dlrs more over the next five years from financial insitutions, including banks, trust mortgage and life insurance companies, according to finance department documents. Financial institutions "are going to complain, but we believe the changes are appropriate and affordable," said one finance department official who asked not to be identified. Ottawa will collect more revenue from financial institutions by reducing the amount of reserves they can deduct from taxes, which "will broaden the tax base for this low tax paying sector," the finance department said. Among the changes, chartered banks will no longer be able to use a five-year averaging formula to calculate loan losses that may be deducted for tax purposes. Effective June 17, 1987, banks will deduct bad or doubtful loans during the year they are incurred. The finance department said the impact of the new provisions will be cushioned over a period of five years. The changes are needed to ensure that all financial companies are taxed fairly under deregulation of the financial services industry. "It would be inconsistent for the tax system to continue to provide different reserves for tax purposes for institutions competing in the same marketplace," the finance department said. Reuter  18-JUN-1987 20:20:39.69 canada wilson V E RM f5048reute u f BC-OTTAWA-WIDENS-SALES-T 06-18 0089  OTTAWA WIDENS SALES TAX, STUDIES REPLACEMENT OTTAWA, June 18 - Canada will broaden a federal sales tax levied on manufacturers before scrapping the system in favor of a broad based, multi-staged sales tax, finance minister Michael Wilson said. As expected, Wilson did not include a new sales tax system as part of his wide-ranging tax reforms tabled in the House of Commons today. Instead, the federal government will make interim changes to the existing sales tax to make it more fair for low and middle income Canadians. "The present (sales) tax is fundamentally flawed. It is a hidden, arbitrary and capricious tax," Wilson told the House of Commons. The existing federal sales tax system hurts the Canadian economy by putting more tax on Canadian produced goods than imported goods and adding a hidden tax on Canadian exports that makes them less competitive, Wilson said. Interim changes effective January 1, 1988 will include: -- applying the federal sales tax to marketing companies related to manufacturers -- levying the tax at the wholesale level instead of the manufacturer for a selected range of products -- applying a 10 pct sales tax to telecommunication services, except for residential telephone lines -- quicker collection of federal sales taxes. To offset these changes for low income Canadians, refundable tax credits will be increased to 70 dlrs from 50 dlrs for adults and to 35 dlrs from 25 dlrs for children, the finance department said. Ottawa is considering three alternative forms for a new sales tax, including a goods and services tax, a value added tax and a national sales tax that would combine existing federal and provincial levies into one system, Wilson told the House of Commons. He said the federal government will explore the possibility of one national sales tax with Canada's 10 provincial governments. All provinces except Albeta now levy a provincial sales of tax of varying amounts. Wilson said one joint system would be simpler for taxpayers and maximize economic benefits of tax reform. If Ottawa and the provinces can't agree on a national sales tax system, Wilson said the federal government will consider either a goods and services tax or a value-added tax. A goods and services tax would apply at one rate to virtually all goods and services in Canada and would include further increases in refundable tax credits for low and middle income Canadians, the finance department said in documents accompanying Wilson's speech. A federal value-added tax, similar to European tax systems, would also be broad based but would allow more flexibility to exempt selected goods and services, the department said. The finance deparment said the main drawback of a value added tax is that it would be more complex and costly to implement than the other two proposals. Reuter  18-JUN-1987 20:28:39.01 gnp canada wilson V E RM f5055reute u f BC-CANADIAN-BUDGET-DEFIC 06-18 0088  FALL IN CANADIAN BUDGET DEFICIT TO SLOW OTTAWA, June 18 - Finance Minister Michael Wilson said tax reform will not affect his determination to reign in expenditures, but his forecasts show a slowing of the decline in the budget deficit in the late 1980s. "Responsible tax reform must be fiscally responsible," Wilson said in a speech prepared for the House of Commons. Wilson estimated the deficit will fall to 29.3 billion dlrs in the year ending March 31, 1988, the same level as he forecast in the February budget. And in the year ended this past March, the deficit was expected to have been one billion dlrs lower than the 32 billion dlr shortfall originally forecast, Wilson said. Wilson said in the current 1988 fiscal year higher-than-anticipated spending, particularly in farm income support programs, will be offset by higher-than-anticipated revenues. But finance department documents show the pace of deficit reduction was expected to slow temporarily in fiscal 1989 and 1990 as a result of lower oil and grain prices and the transition to the reformed taxation system. The deficit is expected to total 28.9 billion dlrs in fiscal 1989 and 28.6 billion dlrs in 1989 and then fall to 26.1 billion dlrs in 1991. Wilson was optimistic about the outlook for the Canadian economy, forcasting gross domestic product would expand 2.8 pct this year and 3.0 pct in 1988. In 1986 the economy grew by an actual 3.1 pct. Inflation, meanwhile, is expected to stabilize at around the current four pct level over the next two years. Reuter  18-JUN-1987 20:33:47.78 canada wilson V E RM f5060reute u f BC-CANADA'S-WILSON-SETS 06-18 0106  CANADA'S WILSON SETS NEW PREFERRED SHARE TAX OTTAWA, June 18 - Finance Minister Michael Wilson tabled a ways and means motion to immediately impose a special tax on preferred share dividends to eliminate a significant loss of corporate tax revenue. Under the motion, which is used to introduce most financial tax changes, dividends on all preferred shares issued after June 18 will be taxable. The issuing corporation will be able to choose between two forms of tax, one that imposes a 25 pct tax on dividends with a subsequent additional 10 pct tax paid by the shareholder, and one that imposes a flat 40 pct tax on dividends. "Measures to reduce the tax advantages of after-tax financing arrangements using preferred shares are a critical step in achieving the broadened corporate tax base required to fund personal income tax reductions," Wilson explained. The minister said many profitable corporations, using various deductions built up over the years, pay no taxes, although they are in a position to pay dividends out of their profits. Reuter  18-JUN-1987 20:35:36.77 canada wilson V E RM f5063reute u f BC-CANADA-SETS-WIDE-RANG 06-18 0089  CANADA SETS WIDE-RANGING PERSONAL TAX CHANGES OTTAWA, June 18 - Finance Minister Michael Wilson unveiled a wide-ranging reform of the personal tax system that includes limiting the capital gains exemption and a sharp cut in the dividend tax credit. With most changes effective at the first of next year, Wilson also announced he was cutting the number of tax brackets from 10 to three. He said the changes will cut personal tax revenues by two billion dlrs in 1988 and by more than 11 billion dlrs over the next five years. "Most Canadians will pay lower taxes because of two far-reaching changes. A new structure of federal income tax rates and the conversion of exemptions and deductions to tax credits," Wilson told the House of Commons. The new tax brackets will be 17 pct on the first 27,500 dlrs of taxable income, 26 pct on the next 27,500 dlrs and 29 pct on taxable income in excess of 55,000 dlrs. The maximum tax rate is 34 pct under the current system. In a major reversal of his own initiative, Wilson said the controversial 500,000 dlrs capital gains exemption will be reduced to 100,000 dlrs over an investors' lifetime. Wilson introduced the exemption shortly after taking office in 1984 as a a way of stimulating investment, but it was sharply criticized by the opposition as over-generous to wealthy investors. The 500,000 dlr lifetime exemption will be kept on the sale of farm land and for small businesess, however. Also, the taxable portion of a capital gain will increase from 50 pct currently to 66-2/3 pct in 1988 and 75 pct in 1990. The dividend tax credit will be reduced from 33-1/3 pct to 25 pct and the deduction for up to 1,000 dlrs of interest and dividend income will be eliminated in 1988. Wilson said tax treatment for registered retirement savings plan contributions will be maintained but the phase in of the increase in the maximum limit to 15,500 dlrs will be delayed four years to 1994. Reuter  18-JUN-1987 20:48:32.87 interest RM f5072reute f f BC-ANZ-BANKING-GROUP-SAY 06-18 0014  ******ANZ BANKING GROUP SAYS IT WILL CUT PRIME RATE TO 16.00 PCT FROM 16.50 ON JUNE 22  18-JUN-1987 21:07:33.30 money-fxdlr miyazawa RM AI f5083reute f f BC-Japan-still-asking-in 06-18 0013  ******Japan still asking institutions to limit speculative dlr deals - Miyazawa  18-JUN-1987 21:09:30.49 interest australia RM AI f5084reute b f BC-ANZ-BANKING-GROUP-CUT 06-18 0092  ANZ BANKING GROUP CUTS PRIME RATE TO 16.00 PCT MELBOURNE, June 19 - The Australia and New Zealand Banking Group Ltd <ANZA.S> said it will cut its prime rate to 16.00 pct from 16.50, effective June 22. The cut takes the ANZ's prime to the lower end of the range of prime rates being offered by Australian trading banks. The highest rate is 17.50 pct. The cut follows announcements of cuts yesterday by <Citibank Ltd> to 16.00 pct from 16.5, effective today, and <Commonwealth Bank of Australia> to 15.75 pct from 16.25, effective June 24. REUTER  18-JUN-1987 21:15:11.47 money-fxdlr japan miyazawa RM AI f5087reute b f BC-JAPAN-STILL-WANTS-SPE 06-18 0069  JAPAN STILL WANTS SPECULATIVE DLR DEALS LIMITED TOKYO, June 19 - The Finance Ministry is still asking financial institutions to limit speculative dollar dealings, Finance Minister Kiichi Miyazawa told reporters. He was responding to rumours in the New York currency market overnight that the Ministry was reducing its pressure on institutions to refrain from excessively speculative dollar dealings. REUTER  18-JUN-1987 21:32:28.55 india gandhi RM V f5094reute u f BC-GANDHI-PARTY-BADLY-DE 06-18 0108  GANDHI PARTY BADLY DEFEATED IN INDIA STATE POLL NEW DELHI, June 19 - Prime Minister Rajiv Gandhi's Congress (I) party was swept from power in the northern state of Haryana by an opposition landslide. The loss was a major personal setback for Gandhi whose vote-winning ability was on trial after political scandals in Delhi and a string of electoral losses since he took command of the party in 1984. With 53 results in for Haryana's 90-seat assembly, Congress had won only two seats against 63 previously. Before the poll, Congress politicians in Delhi said privately that a loss in Haryana could open a party leadership debate. REUTER  18-JUN-1987 21:34:55.99 south-korea RM V f5096reute u f BC-SOUTH-KOREA-THREATENS 06-18 0107  SOUTH KOREA THREATENS EMERGENCY MEASURES SEOUL, June 19 - The government will take emergency measures if the present wave of violent protest demonstrations continues, state radio said. The radio, which did not specify the measures, said the decision was taken today at a meeting of top ministers and security officials attended by Prime Minister Lee Han-key. It said a special statement would be made shortly. Thousands of demonstrators took to the streets of Seoul and other cities yesterday, battling riot police and demanding the resignation of President Chun Doo Hwan. It was the ninth successive day of violent protests. REUTER  18-JUN-1987 21:56:40.46 usa F f5107reute r f BC-COURT-ORDERS-INT'L-ME 06-18 0107  COURT ORDERS INT'L MEDICAL INSURER TO SHOW CAUSE TALLAHASSEE, Fla., June 18 - A Circuit Court judge ordered the company that insured the solvency of International Medical Centres Inc to show cause why it should not honour its contract with International, according to Florida's Department of Insurance, which had filed a petition on the matter. As previously reported, International, the largest health maintenance organisation in Florida was declared insolvent on May 14. Federal regulators had also told the company its Medicare contract would be terminated on July 31 because of the company's financial and management problems. Michelle McLawhorn, Florida Department spokeswoman, said International's insurer, State Mutual Life Assurance Co of America, had made clear it would fight activation of the policy because International did not provide it with accurate financial records. State Mutual could not be reached for comment. McLawhorn said it was not yet known how many creditors International had or how big its debt was. The court gave State Mutual 20 days to show why it should not be obliged to pay claims against the solvency policy. REUTER  18-JUN-1987 22:26:37.58 brazil sarney RM AI f5137reute u f BC-BRAZIL-RULING-PARTY-T 06-18 0101  BRAZIL RULING PARTY TO DECIDE ON PRESIDENTIAL TERM BRASILIA, June 18 - The ruling Brazilian Democratic Movement Party (PMDB) will hold a national convention on July 18 and 19 to discuss the length of the Presidential term, a PMDB spokesman said. Although the country's constitution allows for a six-year term, Sarney said he would remain only five years after he came to power in 1984. The Constituent Assembly is drawing up a new constitution and severe economic problems have increased the pressure on it to call early elections. A faction of the PMDB favours a poll in November next year. REUTER  18-JUN-1987 22:33:01.85 money-supplymoney-fxdlr usa RM AI f5141reute u f BC-FED-DATA-SUGGEST-NO-C 06-18 0086  FED DATA SUGGEST NO CHANGE IN MONETARY POLICY By Kathleen Hays, Reuters NEW YORK, June 18 - New U.S. Banking data suggest the Federal Reserve is guiding monetary policy along a steady path and is not signalling any imminent change of course, economists said. But they also said that if money supply growth remains weak, as this week's unexpected eight billion dlr M-1 decline suggests it may, this could influence the Fed to loosen its credit reins and move toward a more accommodative monetary policy. A Reuter survey of 17 money market economists produced a forecast of a 600 mln dlr M-1 decline for the week ended June 8, with estimates ranging from a gain of one billion dlrs to a decline of four billion. Instead, M-1 fell eight billion dlrs to 745.7 billion dlrs at a seasonally adjusted annual rate. Coming on the heels of a 4.3 billion decrease in M-1 for the week ended June 1, this means the nation's money supply has fallen more than 12 billion dlrs in the past two weeks, economists said. "M-1 has hit an air pocket of weakness," said Bill Sullivan of Dean Witter Reynolds Inc. While M-1 may have lost its significance as an indicator of economic growth, Sullivan said Fed officials might be concerned the latest drop in M-1 means another month of sluggish growth in the broader monetary aggregates, M-2 and M-3, which are seen as better gauges of economic growth. Latest monthly M-2 and M-3 data showed that as of May, both measures were growing at rates below the bottom of the Fed's 5-1/2 to 8-1/2 pct target ranges. If money growth does not accelerate, Fed officials, concerned that this indicates economic growth is flagging, could turn toward easier monetary policy, economists said. "Does this mean that the Fed abandons its current open market position? No," Sullivan said. "But does this mean the end of tightening for the time being? Definitely yes." Economists said average adjusted discount window borrowings of 385 mln dlrs for the latest two-week bank statement period were lower than they had expected. Most believed the Fed had targetted a two-week borrowings average of around 500 mln dlrs. But they said that if it had not been for a large one-day net miss in the Fed's reserve projections, the higher borrowings target would probably have been reached. A drop in May U.S. Housing starts and continued weakness in auto sales show key sectors of the U.S. Economy are lagging, while a recent modest 0.3 pct gain in May producer prices has helped dispel inflation fears, Slifer said. "If this continues, we can entertain the notion of Fed easing at some point," he said. Other economists said the Fed would probably pay little attention to weak money supply growth. "It has been a number of years since M-1 has given good signs of what's going on in the economy," one said. "I don't think M-1 shows that the economy is falling apart and the Fed should ease." Economists agreed a stable dollar will continue to be a prerequisite for any move by the Fed toward easier monetary policy. They said the Fed is reluctant to lower short-term rates for fear this would spur expectations of a weaker dollar and higher inflation which would push up long-term yields and choke off econmomic growth. But Sullivan said the dollar has been steady since late April. "The Fed has to determine if this represents a fundamental change for the dollar. If it does, then this gives them more room to ease," he said. REUTER  18-JUN-1987 22:34:58.79 earn usa F f5142reute b f BC-NATIONAL-SEMICONDUCTO 06-18 0067  NATIONAL SEMICONDUCTOR CORP <NSM> FOURTH QUARTER SANTA CLARA, Calif., June 18 - Shr profit six cents vs loss 10 Net profit 8.1 mln dlrs vs loss 7.1 mln Sales 511.9 mln vs 397.8 mln Avg shrs 97.0 mln vs 90.5 mln YEAR Shr loss 38 cents vs loss 1.10 dlrs Net loss 24.6 mln dlrs vs loss 91.5 mln Sales 1.87 billion vs 1.48 billion Avg shrs 91.7 mln vs 89.8 mln NOTE - Current year figure includes previously announced 15 mln dlr restructuring charge. Figures include extraordinary credit from tax benefit of 4.2 mln dlrs in quarter vs 2.3 mln a year earlier and 4.2 mln for year vs 5.6 mln year earlier. The 1986 year net reflects 51.2 mln dlr gain from cumulative effect of accounting change. REUTER  18-JUN-1987 23:12:09.91 usa F f5168reute u f BC-NATIONAL-SEMICONDUCTO 06-18 0104  NATIONAL SEMICONDUCTOR <NSM> SEES IMPROVED YEAR SANTA CLARA, Calif., June 18 - National SemiConductor Corp, which earlier reported a profitable fiscal fourth quarter after a year ago loss, said it expects improved financial performance during its new fiscal year. The company reported a profit of 8.1 mln dlrs in the quarter ended May 31, after a loss of 7.1 mln dlrs in the year ago period. The company said orders for its core businesses have improved, adding "Our strong balance sheet and the improved business environment should enable us to improve our financial performance during our new fiscal year." The company said that during the fourth quarter both its semiconductor group and its information systems group had higher sales and improved operating performance than in the prior quarter and the year-earlier quarter. REUTER  18-JUN-1987 23:19:19.77 usa RM AI f5172reute u f BC-OKLAHOMA-THRIFT-PLACE 06-18 0117  OKLAHOMA THRIFT PLACED UNDER RECEIVERSHIP WASHINGTON, June 18 - The Federal Home Loan Bank Board (FHLBB) today placed <Investors Federal Bank> of El Reno, Oklahoma under receivership and transferred its 97.8 mln dlrs in assets to the <Investors Savings and Loan Association>. An FHLBB statement said the thrift was insolvent and "had substantially dissipated its assets," mainly by participating in large commercial real estate developments. It said it violated federal laws and regulations on loan documentation, loans to directors and conflict of interest. The sucessor organisation is a federal savings and loan to be managed under contract by Sunwood Management Corp of Parker, Colorado. REUTER  18-JUN-1987 23:26:43.72 japanusa F f5175reute u f BC-MITSUBISHI-ELECTRIC-T 06-18 0114  MITSUBISHI ELECTRIC TO ASSEMBLE PC'S IN U.S. TOKYO, June 19 - Mitsubishi Electric Corp <MIET.T> plans to assemble personal computers in the U.S. To counteract the imposition of a 100 pct import tax in April and a drop in profits due to the yen's appreciation against the dollar, a company spokesman told Reuters. It will assemble 16-bit MP-286 and 32-bit MP-386 desk-top computers at its wholly-owned computer and computer-related equipment sales unit <Mitsubishi Electronics America Inc> in Torrance, California at a rate if 10,000 a month, he said. This will include 2,000 TO 3,000 to be sold in the U.S. Under the Mitsubishi name, he said without giving more details. REUTER  18-JUN-1987 23:30:02.35 trade usasingaporebruneiindonesiamalaysiaphilippinesthailand RM V f5177reute u f BC-SHULTZ-WARNS-ASEAN-OF 06-18 0100  SHULTZ WARNS ASEAN OF LOOMING TRADE PROBLEM SINGAPORE, June 19 - U.S. Secretary of State George Shultz warned members of the Association of Southeast Asian Nations (ASEAN) they could no longer rely on increased exports to the U.S. For growth. "Given the importance of exports, particularly export manufactures, to all of your countries, you are going to have to work hard to diversify your markets," he said. "While you may be able to maintain your current market share in the U.S., You clearly will not be able to look to the U.S. To take major increases in your exports," he added. Shultz told the foreign ministers of Brunei, Indonesia, Malaysia, the Philippines, Singapore and Thailand the U.S. Would cut its huge foreign trade deficit more rapidly than many now believed. He said ASEAN's looming trade problems would not necessarily stem from protectionist legislation now being contemplated by Congress, "but simply because of the adjustments the U.S. Economy will have to make in order to service our large and growing external debt." Shultz said the U.S. Deficit had resulted not from falling exports but from higher imports that had fuelled world growth. REUTER  18-JUN-1987 23:52:30.35 australia keatinghawke RM AI f5192reute u f BC-AUSTRALIA'S-OPPOSITIO 06-18 0107  AUSTRALIA'S OPPOSITION FACES SETBACK ON TAX PLAN By Francis Daniel, Reuters SYDNEY, June 19 - The conservative opposition, already fighting an uphill election battle, now faces controversy in its own ranks over a possible error in its major tax cutting program, economists said. Professor Michael Porter, architect of the tax plan, declined to refute Treasurer Paul Keating's charge that the opposition miscalculated tax and expenditure cuts by several billion dollars. Economists said the opposition, trailing behind Labour in opinion polls, would find its chances further diminished if its tax policy was a miscalculation. The tax plan, unveiled by opposition leader John Howard last week, is the cornerstone of the Liberal Party's economic strategy to oust the Labour Party in the July 11 poll. Keating has said the Howard tax plan would sharply increase the budget deficit to more than nine billion dlrs and severely damage Australia's economy, already overburdened with balance of payments and foreign debt problems. In his mini-budget on May 13, Keating said the budget deficit for the year ending June 1988 would be between two and three billion dlrs. Porter, a key member of the opposition economic think tank, said he played a leading role in formulating the tax plan but not Howard's proposed expenditure savings, which Keating claimed were distorted through double counting. Some opposition members said there appeared to be errors, but a Liberal Party spokesman refused comment, saying the package was being reexamined. "The whole thing is so deceitful," Prime Minister Bob Hawke said in a radio interview. "Howard has made a mess of it. If they can't govern themselves, how can they expect to govern the country?" Hawke, who is seeking a third term, said the opposition had made the election one of the easiest for him. "I've never felt more physically and mentally relaxed (during an election). We've no problems at all," he said. The latest public opinion poll, published in the Melbourne Sun newspaper, showed Labour was leading the opposition by 12 points, indicating a 66-seat majority for Hawke in parliament. The Election Commission announced last night that 613 candidates would contest the 148-seat House of Representatives, while 255 candidates would fight for the 76 Senate seats. REUTER  18-JUN-1987 23:58:21.89 japan F f0001reute u f BC-FUJITSU,-FUJIAN-PROVI 06-18 0108  FUJITSU, FUJIAN PROVINCE FORM JOINT VENTURE TOKYO, June 19 - Fujitsu Ltd <ITSU.T> said it signed a joint venture agreement with the Post and Telecommunication Administration Bureau of Fujian Province (PTABF), China to develop and sell software for the Fujitsu-designed digital telephone switching machine FETEX-150. It said in a statement the joint company, <Fujian Fujitsu Communications Software Ltd> located in Fuzhou city, was capitalised at about 10 mln yuan and was owned 51 pct by PTABF and 49 pct by Fujitsu. It would create about 20 local jobs and has a target of annual software sales of 330 mln yen in 1992, Fujitsu said. REUTER  18-JUN-1987 23:59:08.26 japan F f0002reute u f BC-MITSUI,-ALLIANCE-IN-F 06-18 0116  MITSUI, ALLIANCE IN FUND MANAGEMENT TIE-UP TOKYO, June 19 - <Mitsui Investment Management Co Ltd> (MIMCL) and <Alliance Capital Management International Inc> (ACMII) will sign an agreement late this month to cooperate in international fund management, a ACMII spokesman said. MIMCL, 55-pct controlled by affiliated companies of Mitsui Bank Ltd <MIBT.T>, will reconsign some of its foreign securities investment orders to ACMII, he told Reuters. ACMII, the London-based 100 pct-owned subsidiary of <Alliance Capital Management Corp> of New York, will reconsign some of its foreign orders to MIMCL and instruct MIMCL in international fund management techniques, the spokesman said. Both firms were among 56 investment advisory companies granted Japanese government approval for discretionary fund management on June 10, the Mitsui spokesman said. Alliance Capital Management Corp is the world's biggest firm devoted exclusively to fund management and has 35 billion dlrs in funds, he said. Mitsui Investment Co Ltd, established two years ago, controls about 800 mln dlrs, 80 pct of which is invested in Japanese equities. REUTER  19-JUN-1987 00:05:03.32 alum indonesia F M C f0006reute u f BC-INDONESIA-RAISES-STAK 06-19 0107  INDONESIA RAISES STAKE IN ALUMINIUM PLANT JAKARTA, June 19 - Indonesia has increased its share in a 434-billion-yen aluminium smelter joint venture with Japan from 25 to 37 pct, Asahan Project Authority director A.R. Suhud said. The Japanese Export-Import Bank said Indonesia had raised its share of (P.T. Indonesia Asahan Aluminium) company, capitalised in 1975 at 91 billion, by swapping 32 billion yen in government loans to the company for an equity stake. The Japanese shareholders, the Overseas Economic Cooperation Fund and 12 companies, are to invest another 24 billion yen raising capitalisation to 147 billion yen. Asahan reported total losses of 97.6 billion rupiah between 1982 and 1985. Suhud said much of the company's 320 billion yen debt had been caused by falling tin prices and the appreciation of the yen against the U.S. Dollar. Aluminium is sold in dollars. Prices improved from 1,150 dlrs a tonne six months ago to about 1,450 dlrs today. The plant is supposed to break even if prices stay at 1,500 dlrs a tonne. Sahud said the plant, with a capacity of 220,000 tonnes a year, would probably lose money again in 1987. The plant, situated in North Sumatra, produces mostly for Japan. REUTER  19-JUN-1987 00:12:36.11 philippines F f0010reute u f BC-PHILIPPINE-STOCKS-SOA 06-19 0094  PHILIPPINE STOCKS SOAR TO NEW HIGHS, RECORD VOLUME By Greg Hutchinson, Reuters MANILA, June 19 - Investors on Philippine stock markets have shrugged off growing communist activity in the cities to push share prices to all-time highs on record turnover, brokers said. Regularly heavy trading of more than one billion shares a day has sent the Manila exchange's composite index soaring to 775.9 from 577.2 points in just over three weeks. Brokers described recent trading as "frantic" and "hectic" as trading records were smashed day after day. A total 2.6 billion shares worth 259.4 million pesos changed hands on the main Manila and the less important Makati exchanges yesterday, with much of the activity among centavo priced stocks, brokers said. The turnover was more than double the record of 1.1 billion shares worth 118.1 million pesos set on Wednesday. Brokers said rising gold prices caused mining shares to shoot up three weeks ago, and other sectors followed. Share prices continued their rise even when the gold price fell back to 450 dlrs an ounce, due to rising confidence in President Corazon Aquino's handling of the economy, they said. Brokers said Aquino's handling of the 18-year-old communist insurgency and the maintenance of relatively low interest rates also contributed to the rise. Blue chip stocks, such as those of San Miguel Corp and Philippine Long Distance Telephone Co (PLDT), have risen 25 pct in three weeks, and the trend is upward in the medium term although a temporary correction is overdue, they said. Since the surge began on May 26, Manila's Mining index has risen to 5,700.4 points from 4,042.4, its commercial and industrial index has shot up to 881.0 from 694.9 points, and the oils indicator has increased to 4.1 from 2.9 points. Market activity has been rising in spurts since Ferdinand Marcos was replaced by Aquino 16 months ago. One broker said he thought the Philippine stock market "may at last have come of age." Wilson Sy, president of Prudential Securities, a local stockbroking firm with Hong Kong affiliations, told Reuters, "Barring any unforeseen political events you can bet on the Philippine market. It has shrugged off the communist inroads into Manila." Assassins have killed 52 policemen, soldiers and security guards in the capital this year. Communist hitmen known as sparrows have claimed they killed 22 of them. Sy said Philippine stocks were undervalued in world terms with price-earnings ratios often half those in Hong Kong and one-sixth those in Japan. He said PLDT, which is also U.S. Listed, has a price-earnings ratio of about nine. Sy predicted Manila's composite index would rise beyond 1,000 points from its current 775.9 mark by year-end. Other brokers were more cautious, saying Aquino had to improve peace and order before investors could treat the Philippines as they would Hong Kong or Tokyo. One broker said he believed about 30 pct of the money going into stocks was now foreign, much of it from fund managers and their agents based in Hong Kong and New York. Manila Stock Exchange chairman Robert Coyuito told Reuters, "If the peace and order situation really improved the market could move beyond a price-earnings ratio of 20 times." "But all depends on how Congress performs and the local elections go," he said. A new two-chamber legislature was elected last month and is due to sit on July 27. Local elections are scheduled for November. PLDT shares closed at 630 pesos a share yesterday, 30 pesos above Wednesday's record close. PLDT share prices have risen about nine-fold in 18 months. San Miguel shares closed at 190 pesos, also a historic high, brokers said. REUTER  19-JUN-1987 01:04:05.45 canada RM AI f0043reute u f BC-CANADIAN-TAX-REFORM-C 06-19 0103  CANADIAN TAX REFORM CALLED AN IMPORTANT STEP By Larry Welsh, Reuters OTTAWA, June 18 - Canada's sweeping tax reform package, announced today, is an important step towards a fairer system, but is not as bold a revamp of the tax structure as some had expected, economists and business leaders said. "It's the biggest step towards tax reform we've taken in a great many years," Merrill Lynch Canada Inc chief economist Michael Manford told Reuters. "But the system is the same old system with a lot of important changes, as opposed to a brand new system," he added. (See spotlight index page on ECRA) Manford said changes introduced by Finance Minister Michael Wilson did not go far enough in simplifying the federal tax system. They represent evolutionary rather than revolutionary reform. "Overall, I thought that it was a more timid step than we were led to believe," he said. Wilson's move to increase money collected from corporations while cutting individual taxes "is probably an acceptable shift," said Bill James, president of Falconbridge Ltd, an international mining company. Wilson spread corporate tax increases fairly evenly across the corporate sector, James said. "So it's not going to hit anyone too hard and we will remain competitive." Wilson said in his speech to the House of Commons that Canada's tax system needed to be changed to compete with sweeping reforms in the United States last year. "The critical thing on the corporate side is that Wilson moved most of the taxes much closer to the U.S. System," Manford said. The federal government increased taxes paid by corporations by about five billion dlrs over the next five years, but lowered personal taxes by 11 billion dlrs in the same period. Despite collecting more corporate taxes, Wilson was able to lower the tax rate on individual companies by removing many special tax exemptions and broadening the tax base. Wilson's plan also reduced the capital cost allowance, used by companies to write off major investments, which some business spokesmen said will hurt business in the long run. "That will affect some investment decisions negatively," said Laurent Thiebeault, Canadian Manufacturers Association president. Tax analysts said for some industries it will take several days to assess the impact of the capital cost allowance reductions that will be made over a number of years. As anticipated, Canada's opposition parties signalled they intend to fight the new tax measures as they are introduced in Parliament over the next few months. "It's not tax reform, it's a tax grab," said Liberal leader John Turner. Turner labelled changes to the federal sales tax "a money machine for the minister of finance." Wilson broadened the federal sales tax to include additional products and also promised to introduce a broad-based, multi-staged sales tax. "It's not at all a fair package and Canadians are going to see that very quickly," New Democratic Party leader Ed Broadbent said. However, economist Manford said Wilson acted wisely to protect lower income Canadians by providing tax credits that will cut 850,000 people from the tax rolls. REUTER  19-JUN-1987 01:07:20.73 money-fxreserves taiwan RM AI f0050reute u f BC-TAIWAN-DOLLAR-AND-RES 06-19 0086  TAIWAN DOLLAR AND RESERVES SEEN RISING MORE SLOWLY By Chen Chien-Kuo, Reuters TAIPEI, June 19 - Recent government moves to curb capital inflow have temporarily helped to slow the rise of Taiwan's foreign exchange reserves and to stabilise the local dollar against the U.S. Currency, officials and bankers said. Central bank governor Chang Chi-Cheng told reporters the reserves rose only about 500 mln U.S. Dlrs in the past two weeks and the local dollar appreciated more slowly against the U.S. Dollar. Chang said, "The pace of increase in our reserves is much slower now than before and our currency is getting more stable." He said the reserves, mainly the result of the trade surplus with the U.S., Rose at the rate of two to three billion U.S. Dlrs a month between January and May. The reserves, the world's third largest after Japan and West Germany, now total well over 60 billion U.S. Dlrs. On June 2 the central bank froze overseas borrowings of local and foreign banks and cut the limit on central bank purchases of forward U.S. Dollars from banks to 40 pct from 90 pct of the value of a contract. Local and foreign bankers said the June 2 measures had drastically limited their ability to lend foreign exchange to importers and exporters. They said their overseas borrowings and forward dollar transactions showed a drastic decline with some banks registering a fall of up to 30 pct. Bank dealers said the Taiwan dollar has stabilised against the U.S. Currency this week after rising two to five Taiwanese cents a day between June 2 and 13 compared with a rise of five to eight cents in May. The bank dealers said the central bank, which had previously bought U.S. Dollars heavily, sold at least 1.1 billion U.S. Dlrs in the past two weeks to meet commercial demand. They said they expected the government to keep the local dollar stable in the near term to give breathing space to businesses experiencing slower exports because of the rise of more than 23 pct in the value of the Taiwan dollar since September 1985. The Taiwan dollar opened at 31.09 to the U.S. Dollar today, unchanged from yesterday. Keh Fei-Lo, vice president of First Commercial Bank, said, "It appears the central bank's move to curb the capital inflow is quite successful." Vice economic minister Wang Chien-Shien said the slower rise in foreign exchange reserves would help ease pressure from Washington over the large U.S. Trade deficit with Taiwan. Over the past year Taiwanese businessmen have delayed imports of machinery and production equipment because of exchange rate uncertainty, he said. The stable exchange rate would help boost imports, particularly from the United States. REUTER  19-JUN-1987 01:23:58.25 alum japanindonesiabrazil RM AI f0063reute u f BC-JAPAN-APPROVES-AID-FO 06-19 0112  JAPAN APPROVES AID FOR INDONESIA, BRAZIL ALUMINIUM TOKYO, June 19 - Japan's cabinet approved a plan to help financially-troubled aluminium ventures in Indonesia and Brazil, an official at the Ministry of International and Trade Industry (MITI) said. Japan will invest 24 billion yen in <PT Indonesia Asahan Aluminium> in addition to the 68.3 billion yen already invested in the company. The government and private interests will equally share the additional investment, he said. They will also provide equal shares in 6.3 billion yen in new investment in the Albras Amazon aluminium project in Brazil, in addition to the 45.7 billion yen already invested. The Japan Export-Import Bank will cut its rates on loans to Asahan and Albras to about five pct from about seven pct, the official said. Interest rates on loans by Japan's private banks to the two projects are expected to be reduced to around five pct from the current seven to eight pct, but an agreement has yet to be reached, industry sources said. Under the rescue scheme for Asahan, in which 91.1 billion yen has been invested, Indonesia will also extend another 32 billion yen to the company. This will raise Indonesia's investment ratio to about 40 pct from the current 25 pct. The Brazilian government has already agreed to invest an additional 6.5 billion yen in Albras, in which investment now totals 93.2 billion yen, but its stake will not change from 51 pct, the official said. The sources said the rescue programs for the two projects were larger than earlier expected, reflecting Japan's desire to help develop the economies of Indonesia and Brazil and to stabilise sources of aluminium. Japan depends on imports for more than 90 pct of its aluminium demand, which totals some 1.8 mln tonnes a year, they said. REUTER  19-JUN-1987 01:38:31.06 acq japanusa F f0069reute u f BC-MITSUI-BUYS-FIVE-PCT 06-19 0104  MITSUI BUYS FIVE PCT STAKE IN U.S. CHIP MAKER TOKYO, June 19 - Mitsui and Co Ltd <MITS.T> paid 1.5 mln dlrs in early May for a five pct stake in <Zoran Corp>, a California-based maker of large scale integrated circuits (LSI) with computer graphic, communications and medical applications, a Mitsui spokesman told Reuters. He said the two firms will form a marketing company in Japan as early as next year, although details of the joint venture are not yet fixed. Mitsui expects last year's 10 billion yen Japanese LSI market to grow quickly. Zoran was founded in 1981 and now has about 100 employees, he said. REUTER  19-JUN-1987 01:59:21.71 japan F f0081reute u f BC-JAPAN-REPORT-SAYS-FAU 06-19 0100  JAPAN REPORT SAYS FAULTY REPAIRS CAUSED JAL CRASH TOKYO, June 19 - Faulty repairs and inadequate inspection caused the 1985 crash of a Japan Airlines Co Ltd <JAPN.T> (JAL) Boeing 747 which killed 520 people, the Japanese government said in a final official report. The clear cause of the crash was faulty repair work by the Boeing Co <BA>, said Shun Takeda, the ministry of transport official leading the accident investigation committee. But the report also criticised the ministry's inspectors for failing to carry out a full check of the repairs before signing the clearance sheet. The aircraft hit Mount Osutaka, north of Tokyo, on August 12, 1985, after a bulkhead separating the pressurised cabin from the unpressurised tail suddenly burst, fracturing key navigation systems. Only four people survived. A Japan Air Lines spokesman declined comment on the report. Boeing is expected to release a statement later today. The report cleared the JAL crew of all responsibility. In a separate set of recommendations, the investigators said large aircraft operating in Japan should have fail-safe systems, but did not say how this should be done. A press statement by a group of lawyers representing victims of the crash criticised the report for not dealing in greater depth with the fail-safe aspect. The lawyers said Boeing had showed it believed the crash was due to design defects by specifying two design modifications to prevent a recurrence in a memorandum filed in King County, Washington, Superior Court last March 24. They said similar official recommendations for fail-safe systems following two air disasters involving DC-10 aircraft, near Paris in 1974 and at Chicago in 1979, had been rejected after objections from aircraft manufacturers. The government investigators asked the ministry to formulate concrete guidelines for its inspectors. An internal ministry memo earlier this year complained that inspectors were left too much on their own when making aircraft checks. A Boeing team made repairs to the aircraft's aft bulkhead under JAL supervision, and Transport Ministry inspectors approved the repairs without actually seeing them, today's report said. The inspectors were unable to check Boeing's work because the part repaired had been covered by a seal, the report said. Over time, cabin pressurisation speeded up the process of metal fatigue in the repaired bulkhead. Boeing issued an official statement on September 6, 1985, saying the 1978 repairs it had carried out were faulty. It did not link them with the crash. REUTER  19-JUN-1987 02:05:48.53 trade japan RM AI f0088reute u f BC-JAPAN'S-JUNE-INTERIM 06-19 0095  JAPAN'S JUNE INTERIM TRADE SURPLUS NARROWS TOKYO, June 19 - Japan's custom-cleared trade surplus narrowed to 1.61 billion dlrs in the first 10 days of June from 1.97 billion a year earlier, the Finance Ministry said. The June interim surplus compares with a 1.76 billion dlr surplus in the same May period. FOB exports in the first 10 days of June rose 17.6 pct from a year earlier to 6.05 billion dlrs while CIF imports rose 39.6 pct to 4.44 billion. The average yen/dollar rate used for the figures was 141.04 yen against 169.03 a year earlier. REUTER  19-JUN-1987 02:45:16.79 earn japan F f0106reute u f BC-C.-ITOH-AND-CO-LTD-<C 06-19 0046  C. ITOH AND CO LTD <CITT.T> TOKYO, June 19 - Year ended March 31 Group shr 18.83 yen vs 18.73 Net 20.07 billion vs 18.47 billion Pretax 22.14 billion vs 25.36 billion Operating 37.57 billion vs 51.57 billion Sales 14,762 billion vs 15,900 billion REUTER  19-JUN-1987 03:01:42.04 japan RM AI f0119reute u f BC-JAPAN-MACHINERY-ORDER 06-19 0103  JAPAN MACHINERY ORDERS FALL IN APRIL TOKYO, June 19 - Japan's private sector machinery orders, excluding shipbuilding, fell 10.4 pct in April from March to a seasonally adjusted 663.8 billion yen, after rising 17.6 pct in March, the government's Economic Planning Agency said. April orders rose 2.0 pct from a year earlier after a 22.6 pct year-on-year rise in March, an agency spokesman told Reuters. Seasonally adjusted private sector orders, excluding those for shipbuilding and electric power firms, fell 7.5 pct in April from March to 517.4 billion yen, after a 5.7 pct rise in March from February. April orders fell 1.3 pct from a year earlier after being unchanged in March. The April drop was due mainly to a 12.9 pct decrease in orders from machine tool industries and a 15.3 pct drop in orders from car makers, the spokesman said. REUTER  19-JUN-1987 03:53:39.82 japanusa RM AI f0189reute u f BC-U.S.-SEEKS-JAPAN-HELP 06-19 0090  U.S. SEEKS JAPAN HELP IN EVENT OF 1988 RECESSION By Rich Miller, Reuters TOKYO, June 19 - Senior U.S. Officials are looking to Japan for help in buttressing the world economy in the event of an American recession next year, Japanese government sources said. During a visit to the U.S. Earlier this month, Economic Planning Minister Tetsuo Kondo was asked by both U.S. Federal Reserve chairman Paul Volcker and Council of Economic Advisers chairman Beryl Sprinkel what Japan could do if the U.S. Enters recession next year. Although Sprinkel indicated that he personally did not expect a recession next year, Volcker seemed to acknowledge that an economic downturn was at least a possibility, the sources said. Faced with with a huge budget deficit, the U.S. Has little room to manoeuvre on fiscal policy to counteract any downturn that might occur in 1988. It is also hamstrung as far as monetary policy is concerned because U.S. Inflation is already showing some signs of picking up, one source said. But Japan is also limited in what action it could take to help counteract a U.S. Recession without running the risk of overstimulating its domestic economy and pushing up inflation, the sources said. Money supply growth is accelerating and interest rates are at record low levels. In May, M-2 money supply plus certificates of deposit grew at a year-on-year rate of 10.2 pct, well above nominal GNP growth of four to five pct. Some government sources are also worried that the recently announced 6,000 billion yen emergency economic package could push up land prices and the construction sector's inflation. Public investment spending grew at a year-on-year rate of about 10 pct in April, but that could accelerate to 20 pct later this year under the impact of the emergency package, one source said. The 6,000 billion yen package was generally well received in the U.S., Although U.S. Congressmen and businessmen told Kondo they wanted the measures implemented quickly, sources said. The Japanese minister explained that the acceleration of public works spending in the package was taking place immediately, they said. U.S. Congressmen were particularly interested in how much impact the package would have on reducing the bilateral trade imbalance, a question which Kondo was unable to answer clearly, given the many economic uncertainties involved, the sources said. While recognizing that Japan's trade surplus is falling in terms of volume, some Congressmen expressed concern that it was not falling fast enough. But the sources said no one pressed Kondo for a further rise of the yen as a solution to correcting the bilateral trade imbalance. REUTER  19-JUN-1987 03:59:02.90 acq F f0194reute f f BC-Sainsbury's-says-it-t 06-19 0013  ******Sainsbury's says it taking control of Shaw's Supermarkets for 30 dlrs a share  19-JUN-1987 04:08:37.39 japanindonesiabolivia RM AI f0206reute u f BC-JAPAN-TO-MAKE-LOANS-T 06-19 0085  JAPAN TO MAKE LOANS TO INDONESIA AND BOLIVIA TOKYO, June 19 - Japan will lend 27.17 billion yen to Indonesia and will share equally with the World Bank a 7.25 billion yen loan to Bolivia as part of its efforts to help Third World countries, a Foreign Ministry spokesman said. The lending is in line with Japan's plan to contribute 20 billion dlrs over the next three years to developing countries. Both loans will be used for development, the spokesman told Reuters. He declined to name terms. REUTER  19-JUN-1987 04:11:27.72 acq uk F f0207reute b f BC-SAINSBURY'S-TAKING-CO 06-19 0104  SAINSBURY'S TAKING CONTROL OF SHAW'S SUPERMARKETS LONDON, June 19 - J Sainsbury Plc<SNB.L> said it agreed to take control of the U.S. Shaw's Supermarkets Inc through a combination of share purchases and a tender offer at 30 dlrs a share. Sainsbury bought about 21 pct of the stock in 1983. It said its U.S. Subsidiary, Chene Investments Inc, bought 2.55 mln common shares from the controlling Davis family yesterday at 30 dlrs a share for 76.5 mln dlrs, lifting its stake to 49.4 pct. A tender offer for the outstanding shares will be launched, also at 30 dlrs a share for a maximum further cost of 184.4 mln. The Shaw's Board and the Davis family has agreed to accept the offer, thus assuring Sainsbury's a total holding of 74.0 pct. The company had allotted 20.18 mln new ordinary shares to <Warburg Securities Ltd> which it said would be sufficient to finance about 188 mln dlrs of the maximum 261 mln dlrs payable. Shaw's operates a chain of 49 supermarkets in Massachusetts, Maine and New Hampshire which in 1986 produced sales of 1.1 billiob dlrs and pretax profit of 31.1 mln. At the end of 1986 it had net assets of 88 mln dlrs. Last September, Sainsbury's increased its stake in Shaw's to 28.5 pct. In the year to March 21, it reported a rise in pretax profit to 246.9 mln stg from 192.7 mln on sales that increased to 4.04 billion from 3.58 billion. Sainsbury shares had fallen five pence before the announcement to 590p from last night's close but were unmoved by news of the deal. REUTER  19-JUN-1987 04:20:47.11 japan F f0223reute u f BC-C.-ITOH-SEES-NO-GROWT 06-19 0108  C. ITOH SEES NO GROWTH IN 1987/88 GROUP PROFIT TOKYO, June 19 - C. Itoh and Co Ltd <CITT.T> said its group net profit in the year ending March 31, 1988, is expected to be unchanged from a year earlier. The prediction assumes a yen/dollar rate of 140 yen and a crude oil price of 18 dlrs a barrel, a company spokesman told Reuters. Sales in 1987/88 are estimated at 15,100 billion yen, up 2.3 pct from a year earlier. The company earlier reported group net profit of 20.07 billion yen in the year ended March 31, 1987, up 8.6 pct from a year earlier, helped by a drop in sales and administration costs and reduced interest charges. REUTER  19-JUN-1987 04:25:32.92 uk F f0231reute r f BC-UBS-TO-SELL-25,000-SA 06-19 0065  UBS TO SELL 25,000 SANDOZ SHARES LONDON, June 19 - Union Bank of Switzerland (Securities) Ltd said it is lead managing the sale of 25,000 new bearer shares of Sandoz Ltd. The shares closed in Zurich yesterday at 12,100 Swiss francs each. Final terms will be set on, or before, June 25. The selling concession is two pct while management and underwriting each pays 3/4 pct. REUTER  19-JUN-1987 04:25:41.52 earn japan F f0232reute u f BC-ISUZU-MOTORS-LTD-<ISU 06-19 0066  ISUZU MOTORS LTD <ISUM.T> SIX MONTHS TO APRIL 30 TOKYO, June 19 - Parent shr loss 15.85 yen vs profit 2.02 Interim div nil vs nil Net loss 12.92 billion vs profit 1.65 billion Current loss 12.52 billion vs profit 4.44 billion Operating loss 8.76 billion vs profit 6.52 billion Sales 443.90 billion vs 528.03 billion Outstanding shrs 815.10 mln vs 814.97 mln REUTER  19-JUN-1987 04:31:03.46 japan F f0237reute u f BC-ISUZU-DENIES-PLANS-TO 06-19 0091  ISUZU DENIES PLANS TO IMPORT GM CARS TO JAPAN TOKYO, June 19 - Isuzu Motors Ltd <ISUM.T> has no plans to import cars made by General Motors Corp <GM.N> to Japan, an Isuzu spokesman told Reuters. The Japanese daily Yomiuri Shimbun reported that Isuzu had decided to import cars directly from GM. Each month Isuzu's domestic distributors sell five to 10 cars from GM's Buick, Chevrolet, and Oldsmobile range. The cars are supplied by Yanase and Co Ltd, a Japanese importer and distributor. Isuzu is owned 38.6 pct by GM. REUTER  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-020.sgm000066400000000000000000002443461154025176300231520ustar00rootroot00000000000000 19-OCT-1987 23:49:31.45 money-fx japanusa RM AI f0001reute u f BC-IF-DOLLAR-FOLLOWS-WAL 10-19 0105  IF DOLLAR FOLLOWS WALL STREET JAPANESE WILL DIVEST By Yoshiko Mori TOKYO, Oct 20 - If the dollar goes the way of Wall Street, Japanese will finally move out of dollar investments in a serious way, Japan investment managers say. The Japanese, the dominant foreign investors in U.S. Dollar securities, have already sold U.S. Equities. But "if the dollar falls steeply, which did not happen yesterday, Japanese investors will definitely try to withdraw significant funds from U.S. Shares," said Akira Kawakami, deputy manager of Nomura Investment Trust and Management Co Ltd's international investment department. An unstable, lower dollar would also affect Japanese investment in U.S. Bonds. "Japan-U.S. Interest rate differentials, which currently look wide enough, mean nothing in the absence of dollar stability," said Kawakami. U.S. Bonds could benefit due to a gloomy economic picture following the estimated huge losses in stocks by major U.S. Institutional and individual investors, he said. The effect should be to rule out any U.S. Interest rate rise. But most Japanese investors in U.S. Bonds are still wiating to see if the dollar really is stable, he said. The dollar was holding firm at above 142 yen on Tuesday morning. "Although Japanese investors sold huge amounts of stocks in New York yesterday, most are still looking for chances to lighten their U.S. Stock inventories," Hiromitsu Sunada, manager of Meiji Mutual Life Insurance Co's international investment department said. Their sales helped send Wall Street stocks down 508 points to 1,738, the market's biggest percentage drop since 1914. "Investment in U.S. Stocks and bonds is difficult, considering the dangers," said Katsuhiko Okiyama, deputy general manager and chief adviser of Yamaichi Securities Co Ltd's fixed income securities marketing group. Japanese investment at home could start to pick up once markets have stopped reacting to Wall Street, the managers said. The Tokyo yen bond market is likely to stabilise in one or two weeks, which is what investors have been waiting for. The bottom for yen bonds should be around a 6.3 pct yield for the 5.1 pct 89th bond, they said. "The basic background which has supported the stocks and bonds markets has not changed," said Norio Okutsu, assistant general manager of Nikko Securities' bond department. "But new outflows of funds to the U.S. Will be decreasing." However, this was already evident three months ago, he said. REUTER  19-OCT-1987 23:58:39.11 japanfrance F f0012reute u f BC-NEC-TO-SUPPLY-CHIP-TE 10-19 0085  NEC TO SUPPLY CHIP TECHNOLOGY TO FRANCE TOKYO, Oct 20 - NEC Corp <NIPN.T> will supply <Matra-Harris Semiconducteurs SA(A)> (MHS) of France with manufacturing technology for 16-bit microchips used in microcomputers, an NEC spokesman said. MHS, a joint venture between France's MATRA <MATR.PA> and Harris Corp <HRS> of the U.S., Will manufacture and market globally a microcomputer based on NEC's Micron PD 78312 and Micron PD78310 chips. MHS will pay NEC an undisclosed sum for the technology. REUTER  19-OCT-1987 23:59:09.79 japan tse RM AI f0013reute b f BC-JAPAN-TAKES-WAIT-AND- 10-19 0107  JAPAN TAKES WAIT-AND-SEE STANCE ON STOCKS-OFFICIAL TOKYO, Oct 20 - The Finance Ministry will take a wait-and-see stance on Tokyo Stock Exchange movement, although it is gravely concerned about the sharp fall in stock prices, a senior Ministry official said. The official, who declined to be identified, told reporters the 7.3 pct drop in Tokyo stock prices this morning was caused primarily by psychological factors following the 22.5 pct fall in New York stock prices overnight. He said the Ministry is in close contact with the Tokyo Stock Exchange, but has no plans yet to take any specific measures regarding the fall. REUTER  20-OCT-1987 00:08:10.16 mexico RM f0017reute u f BC-MEXICAN-STOCKMARKET-H 10-20 0112  MEXICAN STOCKMARKET HEAD SEES NO CRISIS AFTER FALL MEXICO CITY, Oct 19 - The outlook for Mexico's economy and stockmarket remains optimistic despite the market's worst-ever fall of 52,671.56 points on Monday, the president of the Mexican stock exchange, Manuel Somoza, said. He said the 16.51 pct drop in the exchange's index reflected a "totally emotional" reaction to Monday's fall on the New York stock exchange and was not a reflection of a new crisis for the Mexican economy or the stockmarket." He was speaking at a news conference here on Monday. "We think that after the psycological effect the market will tend to stabilize itself," Somoza said. Somoza said he based his optimism on the relatively bright outlook of the Mexican economy due to increased income from oil and non-petroleum exports, record high foreign reserves and government efforts to promote a modernization of the industrial sector. "The U.S. Economy is not the same as the Mexican," he said. He did not say when he thought the market would stabilize. He said traders had originally expected the market to level out on Monday after last week's profit taking pulled the index down 44,207 points. News of the "enormous problems" in New York, which reached Mexico City before the local market opened, caused a flurry of selling on the Mexican exchange, Somoza said. The stockmarket had risen 629 pct over the year by the end of September. Somoza said Monday's light volume of 15.3 mln shares compared to an average of 53 mln was an indication the day's drop was not a sign of a major collapse. He also denied rumours that the day's loss was the result of government and brokerage house manipulation. REUTER  20-OCT-1987 00:15:04.00 cocoa indonesiaukmalaysiausapapua-new-guineawest-germanynetherlands T f0021reute u f BC-ASIAN-COCOA-PRODUCERS 10-20 0097  ASIAN COCOA PRODUCERS EXPAND DESPITE CRITICS By Jeremy Clift JAKARTA, Oct 20 - Asian cocoa producers are expanding output despite depressed world prices and they dismiss suggestions in the London market that their cocoa is inferior. "Leading cocoa producers are trying to protect their market from our product," said a spokesman for Indonesia's directorate general of plantations. "We're happy about our long-term future." Malaysian growers said they would try to expand sales in Asia and the United States if Malaysian cocoa was not suitable for European tastes. They were responding to comments by London traders that large tonnages of unwanted cocoa beans from Malaysia, Indonesia and Papua New Guinea (PNG) were helping to depress cocoa prices. London traders said the Asian cocoa was considered unsuitable for western palates because of an acrid odour and a high level of free fatty acids. Ng Siew Kee, the chairman of Malaysia's Cocoa Growers' Council, said Malaysia should expand its sales to Asia and the United States if it did not produce a type suitable for Western Europe. A spokesman for the PNG Cocoa Industry Board said the London market was mistaken if it linked PNG cocoa with high-acid Malaysian and Indonesian beans. "When the market is declining, buyers seize on anything to talk down prices," the spokesman said. He said that PNG could sell whatever cocoa it produces. PNG exported 33,000 tonnes of cocoa in the 1986/87 cocoa year ending September 30, of which nearly 50 pct was exported to West Germany, 16 pct to the U.S. And the rest to the Netherlands and Britain. The Indonesia spokesman, an Agriculture Ministry official who wished not to be identified, said Indonesia had no problem with quality and would continue to expand sales. He described criticism of the quality of Indonesian beans as "trade politics" and said Jakarta's traditional links with Dutch buyers meant it did not have any difficulty with exports. Indonesia and Malaysia, Asia's two biggest commodity producers, are expanding cocoa output and are both outside the International Cocoa Organization (ICCO). Officials have said Malaysian production is expected to total 150,000 to 155,000 tonnes in calendar 1987. This is up from 131,000 tonnes in 1986, partly because of the end of a three-year drought in Sabah, the country's largest cocoa growing area. Production of Indonesian cocoa beans tripled to 31,600 tonnes in calendar 1986 from 10,284 tonnes in 1980. Output is projected to rise to 50,000 tonnes in 1988 from 38,000 tonnes this year as young trees mature. Both Malaysia and Indonesia are low cost producers and traders said they could last out low prices longer than West African countries. According to one Kuala Lumpur trader, world prices would have to fall another 1,000 ringgit per tonne (about 250 stg) to make cocoa production in Malaysia uneconomic. Some traders believe the main quality problem is with harvesting and fermentation techniques. One trader said Malaysian cocoa is virtually indistinguishable from West African output if treated in the same way but this is not possible on the larger Malaysian estates. REUTER  20-OCT-1987 00:20:44.23 tse RM AI f0029reute f f BC-Tokyo-stock-index-dow 10-20 0012  ******Tokyo stock index down 2,210.19 points to 23,536.37 in early afternoon Blah blah blah.  20-OCT-1987 00:30:35.73 japan nakasone RM AI f0036reute b f BC-JAPANESE-PREMIER-SAYS 10-20 0110  JAPANESE PREMIER SAYS HE WATCHING STOCK SITUATION TOKYO, Oct 20 - Japanese Prime Minister Yasuhiro Nakasone was quoted by Kyodo News Service as saying he was watching the stock market situation. "We must watch things a little longer. New York is down 22 pct, London 10 pct, while compared to this Japan is seven pct down," Kyodo quoted him as telling reporters. Asked if he agreed with analysts who called the stock sell-off "Black Monday," Nakasone said: "Compared with times past, economics have changed completely." He rejected a comparison between the present situation and the stock market collapse of 1929 and the recession which followed. REUTER  20-OCT-1987 00:48:57.47 crude malaysia opec Y f0049reute u f BC-MALAYSIA-ADVISED-TO-R 10-20 0116  MALAYSIA ADVISED TO RAISE CRUDE OIL OUTPUT IN 1988 KUALA LUMPUR, Oct 20 - Malaysia's national oil company, Petronas, has advised the government to raise crude oil output to 540,000 barrels a day (bpd) in 1988 from a current 500,000 bpd, a senior company official said. "We have the capacity to produce the amount," Rastam Hadi, Petronas's Vice-President for Upstream Sector said. The government will announce its decision on Friday when it unveils the country's budget. Malaysia raised output this month to current levels from 420,000 bpd after reviewing the world oil market. In May, Malaysia cut output to 420,000 bpd from 459,000 in response to a call by OPEC to boost prices. REUTER  20-OCT-1987 02:15:10.98 money-fx usawest-germany sumita RM AI f0103reute f f BC-Sumita-welcomes-U.S.- 10-20 0012  ******Sumita welcomes U.S.-West German joint confirmation of Louvre accord Blah blah blah.  20-OCT-1987 02:18:33.93 tse RM AI f0105reute f f BC-Tokyo-stock-index-slu 10-20 0010  ******Tokyo stock index slumps 14.9 pct to close at 21,910.08 Blah blah blah.  20-OCT-1987 02:20:31.11 sumita RM AI f0106reute f f BC-Sumita-says-world-sto 10-20 0013  ******Sumita says world stockmarkets excessively concerned about economic future Blah blah blah.  20-OCT-1987 02:29:24.58 money-fx japanusawest-germany sumita RM AI f0111reute b f BC-SUMITA-WELCOMES-U.S.- 10-20 0109  SUMITA WELCOMES U.S.-JAPAN AGREEMENT ON LOUVRE TOKYO, Oct 20 - Bank of Japan governor Satoshi Sumita said he welcomed Monday's U.S. And West German joint confirmation of their commitment to the Louvre accord. Sumita said in a statement that world stockmarkets were excessively concerned about the economic future. The Bank of Japan will continue to adhere to a system of policy coordination based upon the Louvre accord of February, he said. The accord called for stability in foreign exchange rates. Exchange rates generally are regaining stability and the economies of industrialised nations are heading for a steady recovery, he said. REUTER  20-OCT-1987 02:31:05.43 money-fx new-zealand RM f0112reute u f BC-NEW-ZEALAND-WILL-CONT 10-20 0074  NEW ZEALAND WILL CONTINUE FIRM MONETARY POLICY WELLINGTON, Oct 20 - The Reserve Bank of New Zealand said there was no evidence to suggest the fall in share prices had affected financial stability and it would maintain its firm monetary policy. Governor Spencer Russell said in a statement the central bank did not accept arguments that the battle against inflation should now take a low second priority after the sharemarket's plunge. Russell said the bank had two statutory responsibilities -- to implement the government's monetary policy to bring down inflation, and to ensure the financial sector's stability. "Unless the bank is directed otherwise, the firm monetary policy will continue because it is very much in the national interest that it do so," he said. "And there is yet no evidence available to the bank to suggest that the fall in share prices has affected the stability of the financial sector." The Barclays share index fell a record 504.75 points to 2,925,26 on Tuesday, a decline of 14.7 pct. REUTER  20-OCT-1987 02:51:54.24 tse RM AI f0126reute f f BC-Tokyo-Stock-Exchange 10-20 0013  ******Tokyo Stock Exchange has no plan to suspend trading on Wednesday-president Blah blah blah.  20-OCT-1987 02:52:04.37 tse F f0127reute f f BC-Tokyo-Stock-Exchange 10-20 0013  ******Tokyo Stock Exchange to ease margin requirements, exchange president says Blah blah blah.  20-OCT-1987 03:02:08.52 money-supply japan RM AI f0132reute f f BC-Japan-September-M-2-p 10-20 0014  ******Japan September M-2 plus CD money supply rises 11.1 pct year on year (Aug 11.0) Blah blah blah.  20-OCT-1987 03:12:36.51 james-baker RM V f0146reute f f BC-BAKER-HEADS-HOME-AFTE 10-20 0013  ******BAKER HEADS HOME AFTER CUTTING SHORT EUROPE TRIP - SWEDISH FINANCE MINISTRY Blah blah blah.  20-OCT-1987 03:14:08.12 graincorn tanzaniamalawimozambiquezaire G f0147reute u f BC-TANZANIA-SELLS-MAIZE 10-20 0075  TANZANIA SELLS MAIZE TO MALAWI, MOZAMBIQUE, ZAIRE DAR ES SALAAM, Oct 20 - Tanzania has arranged to sell 53,000 tonnes of maize to Malawi, Mozambique and Zaire, radio Tanzania said. The radio said the grain would be delivered soon, but gave no details about the value of the sales. Tanzania is expecting a record maize harvest of 2.3 mln tonnes in the 1987/88 financial year ending June, up from a bumper crop of 2.1 mln in 1986/87. REUTER  20-OCT-1987 03:14:33.15 cotton tanzania G f0148reute u f BC-TANZANIAN-COTTON-THRE 10-20 0100  TANZANIAN COTTON THREATENED BY LACK OF STORAGE DAR ES SALAAM, Oct 20 - About 60,000 tonnes of harvested raw cotton may be spoiled by rain in Tanzania's northern Shinyanga region because it is stored in the open or in crude village sheds, radio Tanzania reported. The cotton, worth one billion shillings, cannot be moved to ginneries in the region because most mill warehouses are full. Many mills are not working because of a lack of spare parts, it added. Agriculture Ministry officials have forecast a 1987/88 cotton harvest of about 200,000 tonnes, down from 215,000 in 1986/87. REUTER  20-OCT-1987 03:17:41.87 japan tse RM AI f0153reute b f BC-TOKYO-STOCK-EXCHANGE 10-20 0082  TOKYO STOCK EXCHANGE WILL NOT SUSPEND TRADING TOKYO, Oct 20 - Tokyo Stock Exchange president Michio Takeuchi said the exchange has no immediate plans to suspend trading to cool off panic stock selling. However, he said Tokyo may consider such a measure if the London and New York exchanges are closed overnight. "I don't think it will happen," he added. He also told reporters the exchange will relax margin requirements effective on Wednesday to encourage stock buying. Takeuchi said the sharp fall in stock prices was mostly due to psychological factors. "We need to keep close watch on market movement but we expect the market will stabilise soon," he said, adding that individual investors should remain calm. "It is advisable to wait for an autonomous recovery of the market," he said. The margin requirement in cash will be reduced to 50 pct from 70 pct while the margin collateral requirement in equity will rise to 70 pct from 60 pct, effective on Wednesday, he said. Takeuchi also said the exchange has no specific plan to take coordinated action with the New York and London exchanges to help stabilise stock prices. The drop on Wall Street was caused by various factors but was primarily the result of a correction of overvalued share prices, he said. The current stock price plunge cannot compare with the Great Depression as the economic environment is very different, he added. The exchange has not changed plans to introduce stock futures trading next year despite press reports that the Wall Street fall was linked with futures trading, he said. REUTER  20-OCT-1987 03:26:57.39 interest philippines RM f0166reute u f BC-AQUINO-SAYS-MANILA-WA 10-20 0111  AQUINO SAYS MANILA WATCHING INTEREST RATES CLOSELY MANILA, Oct 20 - President Corazon Aquino said the Philippines was closely monitoring interest rates in the wake of Monday's record drop on Wall Street and steep declines in Manila and other Asian stock markets. "We will monitor these developments closely and will continue to hope that they do not precipitate large declines in economic activity around the world," Aquino told a meeting of 13 major Philippine business groups. "The Philippines, as a trading country in the world economy, depends on the continued health and growth of both the world economy and the world trading system," she said. The Manila Stock Exchange composite index plunged 105.49 points or 11.79 pct by the midday close to 789.54, depressed by the record 508 point fall of the Dow Jones industrial average on Monday. "The Philippines, in addition, as a large borrower nation, is affected by developments in interest rate levels around the world and will carefully monitor the impact of these developments on interest rates, on gold and on commodity prices," Aquino said. "We welcome the statements from world leaders that urge calm in the present difficult situation," she added. REUTER  20-OCT-1987 03:36:58.94 japan F f0181reute u f BC-NISSAN-STARTS-TO-MARK 10-20 0101  NISSAN STARTS TO MARKET REMODELLED 4WD VEHICLES TOKYO, Oct 20 - Nissan Motor Co Ltd <NSAN.T> said it has started to market a remodelled version of its four wheel drive (4WD) Safari vehicle in Japan. Nissan said in a statement it hopes to sell 250 vehicles a month in Japan. It also plans soon to start exporting 3,400 vehicles a month to the Australian, Middle East and Asian markets under the name Patrol, a spokesman said. It will sell the vehicle in Europe sometime in the future, with shipments from <Motor Iberica S.A.>, its Spanish unit. The volume for Europe will be set later. REUTER  20-OCT-1987 03:38:14.97 japan RM f0182reute u f BC-JAPAN-TO-SCRUTINISE-L 10-20 0113  JAPAN TO SCRUTINISE LIFE INSURERS' CAPITAL GAINS TOKYO, Oct 20 - The Finance Ministry plans to examine how life insurance companies realised capital gains through transactions undertaken in June, just before the yen bond market began to fall sharply, a senior Ministry official said. The move is aimed at cooling fierce competition in the field and will pave the way for a Ministry system to check that insurers do not inflate investment returns on the accounts to attract investors, he said. Some insurers transfer part of their unrealised gains from general accounts to the variable life accounts, violating their internal regulations, industry sources said. The eight major local life-insurers which offer variable life policies here realised an average return of 21.01 pct on such policies in the year ended September. The Ministry will scrutinise the policies of 17 local and foreign life insurers which offer the variable life schemes. Japan has 23 major local life insurers, none of which is listed on the stock market. REUTER  20-OCT-1987 04:03:13.28 lse RM V f0211reute f f BC-FTSE-100-share-index 10-20 0013  ******FTSE 100 share index opens 186.0 down at 1,866.3 - London Stock Exchange Blah blah blah.  20-OCT-1987 04:10:11.01 money-supply japan RM AI f0223reute b f BC-JAPAN-MONEY-GROWTH-TO 10-20 0110  JAPAN MONEY GROWTH TO STAY AT 11-12 PCT - OFFICIAL TOKYO, Oct 20 - Growth in Japan's M-2 plus certificates of deposit (CD) money supply in the October to December period is not expected to accelerate, but will remain at high levels between 11 and 12 pct, a senior Bank of Japan official said. The central bank will keep a watch on high growth in liquidity because this is a factor that may cause rises in prices of goods, he said. The September growth of 11.1 pct year on year announced earlier today should not be taken as implying that the money supply has started to expand very rapidly, he said. In August the rate of increase was 11.0 pct. REUTER  20-OCT-1987 04:11:39.73 west-germany F f0225reute u f BC-W.GERMAN-CAR-OUTPUT, 10-20 0093  W.GERMAN CAR OUTPUT, EXPORTS RISES IN SEPTEMBER FRANKFURT, Oct 20 - West German car and van production rose in September to 407,600 from 386,000 in September 1986, while exports climbed to 226,300 from 218,200, the German Automobile Industry Association VDA said. The association added that incoming domestic orders in September were above, and foreign orders roughly equal, to those in September last year. Car and van production rose in the first nine months of the year to 3.25 mln from 3.19 mln. But exports fell to 1.80 mln from 1.85 mln Output of light trucks fell in September to 13,200 from 14,700, while heavy truck production was unchanged at 10,100. Over the nine month period, light truck production fell to 109,300 from 129,200, while heavy truck production dipped to 83,800 from 84,700. Exports of light trucks fell in September to 7,800 from 9,000 and to 66,600 from 84,300 in the first nine months. Exports of heavy trucks rose to 5,500 in September from 4,600 in September last year and to 47,800 from 45,300 in the first nine months. REUTER  20-OCT-1987 04:19:37.24 new-zealand douglas RM f0240reute u f BC-DOUGLAS-SAYS-N.Z.-NOT 10-20 0099  DOUGLAS SAYS N.Z. NOT ISOLATED FROM WORLD MARKETS WELLINGTON, Oct 20 - Finance Minister Roger Douglas said the fall in share prices on local and world markets demonstrated that New Zealand could not be isolated from global trends. "We can't expect to isolate ourselves from developments around the world," Douglas told reporters. "I think above all what today's problems illustrate is that the sort of policies that we have been putting in place the last three years are absolutely essential so that New Zealand's economic performance improves, relative to the rest of the world." The New Zealand share market fell 14.7 pct on Tuesday in a record one-day fall. Douglas told a news conference, at which the government announced plans to sell its 89 pct stake in <New Zealand Steel Ltd>, that the sharemarket fall would not affect plans to sell parts of state-owned corporations such as <Air New Zealand>, <DFC New Zealand Ltd> and <Petroleum Corp of New Zealand Ltd>. Asked if the government considered acting to close the sharemarket for a period, Douglas said: "No. I'm not sure it would have been my job to do so." REUTER  20-OCT-1987 04:21:55.55 japanusa RM V f0243reute u f BC-WILL-WORLD-RECESSION 10-20 0086  WILL WORLD RECESSION FOLLOW STOCK MARKET PLUNGE? By Linda Sieg TOKYO, Oct 20 - Some economists fear a world recession if stock exchanges continue to plunge. Others are more sanguine. The pessimists say the stocks shakeout is destroying personal assets and dampening consumption. "The real economic effects can be significant -- the destruction of wealth and a deflationary impact on the economy," said an economist at a U.S. Securities house. But other economists said such fears were overblown. "Because of lower appreciation of corporate or personal assets, that much negative impact could be observed (in the U.S.)," said Keikichi Honda, general manager of economic research at the Bank of Tokyo Ltd. "But the appreciation of stock prices has not been playing such a major role in the entire U.S. Gross national product (GNP)," Honda said. The pessimists noted that the record fall on Wall Street on Monday was sparked by fears the U.S. Economy is heading for a recession or serious slowdown much earlier than expected. But the optimists said a dampening effect on consumption due to stock market losses was less likely in Japan. "In Japan the weight of stocks in individuals' total assets is less than in the U.S., And the total weight of individuals' holdings in the stock market is less, so there will be less damage than in the U.S.," said an economist at one of Japan's major brokerage houses. "Japan is taking strong measures to stimulate domestic demand, so while there could be some impact from the reduction of assets value, it would not be a major impact," said the Bank of Tokyo's Honda. Optimists also pointed to incipient declines in U.S. Interest rates as a positive sign for the U.S. Economy. "U.S. Interest rates are coming down so there is a feeling that interest rates have hit their ceiling, and the U.S. Economy is strong, so there should be no direct impact from the collapse of share prices," said Toshiaki Kakimoto, Sumitomo Bank Ltd chief economist. Some economists suggested that should markets continue to slump, the major industrial nations may have to discuss possible joint lowering of official discount rates. "Until last week, a discussion of lower rates was unthinkable, now it's not," said the Japanese brokerage house economist. "There has been a move from the purely rational to the emotional -- it's a central bankers' nightmare," said the foreign economist. "It will require strong global leadership by politicians to snuff out," he said. However, "previously, the stocks correction was due to fears of higher interest rates, a possible resurgence of inflation and the depreciation of the dollar," said Nobuyuki Ueda, senior economist at the Long-Term Credit Bank Ltd. "Now some people have an uneasy feeling about the outlook of the U.S. Economy," Ueda said. "If the stock market is a leading indicator of the future movement of the economy, this decline will have very significant implications for the U.S. Economy," he said. "If the low levels hold, those who were keeping consumption high because of unrealised gains could curb consumption," said Salomon Brothers (Asia) Ltd economist Ron Napier. "If the paper gains aren't there, people won't spend." A U.S. Recession could then trigger similar declines in other economies, some economists said. "I don't know if a possible recession in the U.S. Would trigger a world recession because other nations, such as Japan, are showing good economic performance," LTCB's Ueda said. "But we can't rule out the possibility because the U.S. Is still playing a very dominant role in the world economy." REUTER  20-OCT-1987 04:25:26.49 japan nakasonemiyazawa tse RM V f0246reute u f BC-JAPAN-TRIES-TO-STEM-S 10-20 0097  JAPAN TRIES TO STEM STOCKS DIVE By Linda Sieg TOKYO, Oct 20 - Government and monetary authorities today staged a concerted effort to calm spreading panic on Japanese stock exchanges but market analysts said there were limits to their ability to succeed. "The ability of the Big Four (Japanese securities houses) and the Finance Ministry is limited," said Barclays de Zoete Wedd economist Peter Morgan. Finance Ministry officials asked the big four securities companies this afternoon to help calm panic selling on the Tokyo Stock Exchange, ministry officials said. Prime Minister Yasuhiro Nakasone was quoted by Kyodo News Service as saying he was watching the stock market situation. But he rejected comparisons with the 1929 stock market collapse and subsequent recession. Finance Minister Kiichi Miyazawa said the Tokyo stock market should not be gravely affected by downturns in New York and London because there are clear signs of a Japanese economic recovery and exchange rate stability. Bank of Japan Governor Satoshi Sumita also tried to calm the panic, saying in a statement that world stock markets were excessively concerned about the economic future. Traditionally, the four big houses -- Nomura Securities Co Ltd, Yamaichi Securities Co Ltd, Daiwa Securities Co Ltd, and Nikko Securities Co Ltd -- have influenced the market because of their sheer size and overwhelming market share. This strength has in the past made it possible for the brokerages to calm down markets under guidance from the Finance Ministry, analysts said. But the analysts questioned whether the brokerages, which have already suffered heavy losses from falling bond markets over the past year, would have the strength this time to turn things around. "The question is, are the Japanese brokerages strong enough to force investors to buy," said Johsen Takahashi, research director at the Mitsubishi Research Institute. "If we consider that they have suffered serious losses in the bond markets and in their U.S. Investments, it is debatable whether they they could support buying," he said. "We can support things to some extent, but we can't completely suppress selling," said one Japanese broker. Some analysts said the high percentage of shares cross-held by financial institutions and other corporations could have a stabilising effect on the market. Some 80 pct of shares are held by corporate shareholders, said Keikichi Honda, general manager of the Bank of Tokyo Ltd's economic research division. "This is a tightly woven textile. In its own way it is stronger than Wall Street." But other analysts expressed doubt about this argument. "If a high percent of shares is cross held, everything happens at the edges and the relative moves can be larger," said Kleinwort Benson Ltd financial analyst Simon Smithson. "Selling will drive prices down an enormous distance because of no liquidity." "You don't need big volume to get big declines in the market -- you just need a huge imbalance between sellers and buyers," said Barclay's Morgan. Shares held by what are termed "stable shareholders," or banks and other companies with which a firm does business, might also find their way onto the market if the outlook gets bad enough, some analsyst said. "Closely held shares could become unclosely held," said Morgan. But he said such a prospect is unlikely right now because companies, with their improved earnings prospects, do not need to sell shares for cash flow reasons. REUTER  20-OCT-1987 04:30:24.90 crudeship indonesia subroto opec RM V Y f0257reute u f BC-WORLD-COULD-COPE-WITH 10-20 0105  WORLD COULD COPE WITH HORMUZ CLOSURE, SUBROTO SAYS JAKARTA, Oct 20 - Oil prices would skyrocket for a time if conflict in the Gulf closed the Strait of Hormuz, but oil supplies could be adjusted to take care of world demand, Indonesian Energy Minister Subroto said. He made no explicit reference to the latest U.S. Military action in the Gulf. But in an address to a conference of the Indonesian Petroleum Association, he said, "If worst comes to worst and say the flow of oil through the Straits of Hormuz is completely shut off, I believe the world oil supply, given time to adjust, can take care of the situation." "But this is not to say that prices, at least for a short duration, will not skyrocket as speculators take advantage of the situation," he declared. Tensions in the Gulf, however, usually had a relatively short-term impact on prices, he added. Assessing future price trends, he said, "Short-term spot prices will probably still fluctuate, but they will most likely hover around the official Opec price basket of 18 dlrs per barrel. "The upward deviations, however, are likely to be greater than the downward ones." "The balance between supply and demand in the short term will still be delicate," he added. "Non-Opec production may still go up, competing with Opec for the expected additional increase in world demand." Subroto, a member of Opec's three-man quota committee which has been touring cartel members, said speculation may play havoc with spot prices, but Opec was trying to stabilize the situation by urging cooperation by non-Opec producers. In the medium term, non-Opec production would reach a plateau in the early 1990s, leaving Opec much stronger, he said. REUTER  20-OCT-1987 04:34:41.19 jet bangladesh Y f0264reute u f BC-BANGLADESH-TENDERS-FO 10-20 0059  BANGLADESH TENDERS FOR TWO MLN BARRELS PETROLEUM DHAKA, Oct 20 - Bangladesh Petroleum Corp said it floated an international tender for imports of two mln barrels of Jet Kero, Superior Kero and High Speed Diesel for shipment during January-June 1988. It said the offer for the petroleum products would be open until 0600 gmt on November 19. REUTER  20-OCT-1987 04:48:51.01 interest poehl RM V f0286reute f f BC-Poehl-says-German-and 10-20 0014  ****** Poehl says German and international interest rate rises are cause for concern Blah blah blah.  20-OCT-1987 04:49:48.44 poehl RM V f0287reute f f BC-Bundesbank-has-no-int 10-20 0012  ****** Bundesbank has no interest in higher capital market rates - Poehl Blah blah blah.  20-OCT-1987 04:53:02.87 ship bahrainiran Y f0289reute u f BC-IRANIAN-TANKER-REPORT 10-20 0079  IRANIAN TANKER REPORTS SIGHTING MINE IN GULF BAHRAIN, Oct 20 - An Iranian shuttle tanker reported spotting a floating mine in the central Gulf on Tuesday about 50 miles west of Lavan Island, regional shipping sources said. The Khark III, owned by the National Iranian Tanker Co, gave the position of the mine as 27 degrees 14 minutes north, 52.06 east. There was no indication of measures being taken against the mine, which is in Iranian territorial waters. REUTER  20-OCT-1987 04:54:40.64 acq uk F f0290reute r f BC-FABER-OPEN-FOR-OFFERS 10-20 0093  FABER OPEN FOR OFFERS ON MORGAN GRENFELL STAKE LONDON, Oct 20 - Willis Faber Plc <WIFL.L> chairman and chief executive David Palmer said the company would consider any bid for its 20.8 pct shareholding in Morgan Grenfell Group Plc <MGFL.L> but had not yet received any offers. "We will entertain any approaches," he told Reuters in reply to questions, following U.K. Press speculation. In an earlier statement, Faber said that if an offer were to be received for its stake in the merchant banking group, "it would be considered on its merits." REUTER  20-OCT-1987 04:58:56.26 poehl RM V f0293reute f f BC-Inflationary-fears-ar 10-20 0011  ****** Inflationary fears are unjustified and exaggerated, Poehl says Blah blah blah.  20-OCT-1987 04:59:07.79 acq ukcanada F f0294reute u f BC-CORBY-DISTILLERIES-TO 10-20 0107  CORBY DISTILLERIES TO EXPAND IN CANADA LONDON, Oct 20 - <Corby Distilleries Ltd>, 52 pct owned by Allied Lyons Plc <ALLD.L> subsidiary <Hiram Walker-Goodman & Worts> is to buy the spirits business of <McGuinness Distillers Ltd> of Toronto for 45 mln Canadian dlrs. McGuinness is a producer and marketer of spirits and also has exclusive agencies for some imported wines and spirits. The sale is subject to the approval of the Bureau of Competition Policy. Michael Jackaman, president and chief executive officer of Hiram Walker and Allied Vintners, said, "The acquisition is an excellent one both commercially and financially." REUTER  20-OCT-1987 04:59:48.03 interest west-germany poehljames-bakerstoltenberg RM V f0295reute b f BC-POEHL-SAYS-RATE-RISES 10-20 0088  POEHL SAYS RATE RISES ARE CAUSE FOR CONCERN FRANKFURT, Oct 20 - Rises in West German and international interest rates are a cause for concern and the Bundesbank has no interest in higher capital market rates, Bundesbank President Karl Otto Poehl said. "We consider the interest rate increase that has occurred here and internationally to be a problem and cause for concern," Poehl told an investment conference. "I would like to stress that the Bundesbank has no interest in higher capital market rates," he said. Shortly after Poehl spoke, the Bundesbank announced a tender for a securities repurchase pact at a fixed rate of 3.80 pct. Previous tenders over the last month by interest rate have seen the allocation rate on these facilities rise to 3.85 pct at last week's pact from 3.60 on the last fixed-rate tender in late September. The Bundesbank's reduction of the key allocation rate to 3.80 from 3.85 pct was heralded Monday by repeated injections of money market liquidity at between 3.70 and 3.80 pct. These moves to cap interest rates followed a meeting between Poehl, Finance Minister Gerhard Stoltenberg and U.S. Treasury Secretary James Baker Monday in Frankfurt. Officials said afterwards the three men had reaffirmed their commitment to the Louvre accord on currency stability. Over the weekend, criticism by Baker of the tightening in West German monetary policy had prompted a sharp fall of the dollar on speculation that Louvre cooperation had ended. But the dollar rallied on news of Monday's meeting in nervous trading to trade above 1.79 marks Tuesday. Poehl said that the recent rise in interest rates was not due to central bank policy, but to markets' expectations, and currency developments. Commenting on the inflationary expectations, Poehl said "You have to get to the root of the problem, you have to pursue a policy which reveals that there are no grounds for such fears." The inflationary fears were unjustified and exaggerated, he said. Poehl rebuffed recent U.S. Criticism of West Germany, saying the Bundesbank had made a substantial contribution to international cooperation in interest and monetary policy. The Bundesbank has tolerated an overshooting of its money supply target, arousing criticism from other quarters, he said. "Today we still have lower interest rates than at the end of 1986... Quite the contrary of other countries, where interest rates have risen substantially more," Poehl said. This had to be taken into account when considering recent rises in repurchase pact allocation rates, which were due to rising international money market rates that had spilled over into the German market, he said. Poehl expressed surprise that financial markets had so far ignored improvements in the U.S. Deficits. "The adjustment process in the U.S. Trade balance is definitely underway," he said, noting that this was not so noticeable in absolute figures. The spectacular improvement in the budget deficit had also attracted little attention, he said. REUTER  20-OCT-1987 05:00:49.66 acq uk lawson RM f0296reute b f BC-LAWSON-SAYS-BP-SHARE 10-20 0108  LAWSON SAYS BP SHARE OFFER GOING AHEAD LONDON, Oct 20 - U.K. Chancellor of the Exchequer Nigel Lawson said the Government was going ahead with this month's flotation of British Petroleum Co Plc <BP.L> shares despite the collapse on international stock markets. "We are going ahead because the whole issue has been underwritten - we had it underwritten because there is always a risk of this sort of thing happening," Lawson said in a BBC radio interview. Lawson's remarks came as renewed selling on the London stock market took BP shares down a further 33p to 283, well below the 330p price set for the around seven billion stg issue. Lawson said the U.K. Economy is fundamentally sound and added that stock markets had reflected that recently. "I profoundly believe in the market system as the best way for securing economic prosperity (but) that does not mean to say the markets are infallible." "My advice to small investors...Is to remain calm. There is absolutely no reason not to do so," Lawson said. REUTER  20-OCT-1987 05:01:49.86 RM f0300reute f f BC- 10-20 0014  ****** Bundesbank sets 35-day securities repurchase tender at fixed rpt fixed 3.80 pct Blah blah blah.  20-OCT-1987 05:03:42.33 pse F f0303reute f f BC-Paris-share-price-ind 10-20 0010  ******Paris share price indicator opens 2.31 pct down - official Blah blah blah.  20-OCT-1987 05:05:18.65 ukusa lawson lse F f0305reute u f BC-LAWSON-CALLS-DEGREE-O 10-20 0114  LAWSON CALLS DEGREE OF SHARE FALL ABSURD LONDON, Oct 20 - U.K. Chancellor of the Exchequer Nigel Lawson said the severity of the current rout on world stock markets was an absurd over-reaction sparked on Wall Street by a spreading lack of confidence in the U.S. Economy. Lawson said in a BBC radio interview, "This began on Wall Street. It has a lot to do with the American stock market (and) a lack of confidence in the U.S. - and some careless talk by those who should have known better." In a further wave of selling this morning in London, the FTSE 100 index had lost a further 233.2 points only 50 minutes after the official 0800 GMT opening to stand at 1,819.1. Lawson said a correction on world stock markets was to have been expected after the bull markets of recent years. "What was not expected was the severity of the downturn, which quite frankly is rather absurd." He said he saw no fundamental signs why the U.S. Economy should go into recession, adding, "Indeed the possibility of higher (U.S.) interest rates would certainly in my judgment not lead the American economy into a recession." "The only way in which the American economy would go into recession was if it actually talks itself into recession," he said. REUTER  20-OCT-1987 05:06:25.13 japan RM AI f0308reute u f BC-BANK-OF-JAPAN-SEES-ST 10-20 0114  BANK OF JAPAN SEES STEADY ECONOMIC RECOVERY TOKYO, Oct 20 - The Japanese economy is firmly on the recovery path, supported by robust domestic demand, the Bank of Japan said in a regular monthly report. The report said industrial production is strengthening as manufacturing companies have almost completed adjustments of their plant and equipment investment while non-manufacturing firms have continued to be positive in their capital spending. Strong domestic demand, such as consumer spending and housing investment, will more than offset declining exports, the central bank report said. It also noted the continued rise in domestic wholesale prices and money supply. REUTER  20-OCT-1987 05:07:16.01 lse RM V f0311reute f f BC-London's-FTSE-100-sha 10-20 0011  ******London's FTSE 100 share index falls below 1,800 - Stock Exchange Blah blah blah.  20-OCT-1987 05:08:54.04 coconut philippinesusa G f0315reute u f BC-PHILIPPINES-APPLAUDS 10-20 0108  PHILIPPINES APPLAUDS DEFEAT OF U.S. LABELLING BILL By Diane Stormont MANILA, Oct 20 - The Philippine coconut industry has greeted with relief the defeat in the U.S. Senate of a bill requiring some edible oils to be labelled as saturated fats. The bill, which was defeated by the Senate Agriculture Committee on Monday, could have cost about 60 mln dlrs a year in lost exports, the Philippine Coconut Authority (PCA) said. "Naturally, we welcomed the defeat but there is a chance the bill will be resurrected and attached as a rider to another Senate bill," a spokesman for the United Coconut Association of the Philippines (UCAP). PCA chairman Jose Romero noted the vote was close, with eight senators voting for it, 10 against and one abstaining. The UCAP spokesman said the American Soybean Association (ASA) had spent about 25 mln dlrs lobbying for the bill. He said the ASA also had obscured the health issue during the debate. "Coconut oil is high in saturated fats, but unlike saturated animal fats, they do not enter the blood and lymph systems leaving fatty deposits connected to heart disease," he said. U.S. Soybean and cottonseed producers had argued that saturated fats cause heart disease and that the labels would discourage consumption by health conscious consumers in favour of domestic unsaturated alternatives. Opponents of the bill said the proposal discriminated against imports and would damage the Philippines, Malaysia and Indonesia. The Philippines earned 488 mln dlrs from coconut products in 1986, up from 477 mln in 1985, UCAP figures show. Exports to the United States for edible and non-edible use account for about half of that total, PCA's Romero said. REUTER  20-OCT-1987 05:17:40.79 thailand F f0331reute u f BC-THAI-STOCKS-PLUNGE-IN 10-20 0091  THAI STOCKS PLUNGE IN REACTION TO WORLDWIDE TREND By Vithoon Amorn BANGKOK, Oct 20 - Thai stock prices plunged on Tuesday as nervous investors unloaded shares on reports of steep declines on major world stock markets. Brokers said the Securities Exchange of Thailand Index fell a record 36.64 points, or nearly eight pct, to close at 422.37. "It's impossible to halt the slide in this situation. The market just doesn't behave logically," said Sirivat Voravetvuthikun, executive vice president of Asian Securities Trading Co Ltd. But Sirivat said he did not believe the fall would mark the end of the SET's 16 month bull run, which has accelerated during the last two months. He expected Thai stocks to fluctuate widely in the next few weeks. The slide on Tuesday followed a 13.85 point decline of the 97-stock index on Monday when it closed at 459.01. Brokers said they were flooded with sell orders when the market opened this morning and a SET announcement urging investors not to panic was ignored. The index reached a record 472.86 last Friday, up 57.7 pct from end-June and 128.2 pct higher than last December. SET officials said 77 issues were traded on Tuesday, of which all but two declined. Of the losers, 68 plummeted the daily maximum 10 pct allowed by the exchange. Prices on the special foreign column also fell sharply. SET vice president Suthichai Chitvanich told reporters the 10 pct floor serves as a restraint, making it unnecessary to suspend trading should the panic continue. The Thai exchange has lately been gaining on its own strength with most buying coming from local investors. Investors should not be unduly influenced by foreign market reports, he added. Suthichai said sound local fundamentals, including low interest rates and promising economic growth, favoured investment in the stock market. The SET also announced it would release third quarter corporate earnings earlier than expected as part of efforts to shore up public confidence. REUTER  20-OCT-1987 05:28:05.60 mise F f0355reute f f BC-Milan-bourse-opening 10-20 0011  ******Milan bourse opening delayed one hour to 1200 GMT - official Blah blah blah.  20-OCT-1987 05:31:21.81 interest japan RM V f0357reute u f BC-TOKYO-STOCK-PLUNGE-CO 10-20 0106  TOKYO STOCK PLUNGE COULD FORCE EASIER MONEY POLICY By Rich Miller TOKYO, Oct 20 - Plunging Tokyo stock prices will prevent the Bank of Japan from raising its discount rate and could even force it to ease monetary policy if the collapse continues, government and private economists said. A rise in interest rates now would only serve to spark further selling of shares that could ultimately have a major deflationary impact on the real economy, they said. Although Bank of Japan officials have consistently maintained that they had no plans to raise the 2.5 pct discount rate, many in the markets have thought otherwise. Fears of a rise in the discount rate were fanned by the central bank's apparent decision last week to countenance higher rates on commercial bills, dealers said. But today's stock market collapse -- prices fell nearly 15 pct -- means that the Bank of Japan would be hard pressed to raise the discount rate now, despite its concerns about a renewed outbreak of inflation, dealers and economists said. Japanese government bond prices rose sharply today as the markets concluded that the stock market's collapse precluded the central bank from carrying out the widely-rumoured discount rate increase. A senior government economist suggested that both the U.S. And Japan needed to ease monetary policy now to prevent a further drop in New York and Tokyo stock prices. "They need to support the stock and security markets," he said. But Bank of Japan officials said they saw no need to change policy for the moment, although one admitted that the central bank may have to rethink its strategy if Tokyo stock prices continue to plunge during the rest of the week. Both government and Bank of Japan economists agreed the economy is better placed now to cope with the deflationary impact of plunging stock prices than it was a few months ago. With the economy recovering strongly, the steep drop in stock prices is not likely to put a major dent in consumer and business confidence, one government economist said. "There will be some impact on the real economy, but it won't be that big," said another. Individuals are not heavily invested in stocks on their own, although they do participate through trust funds and other investment vehicles. And while many manufacturing firms turned to financial market investments for profits during last year's economic downturn, the recent rebound has allowed them to refocus their attention on their core businesses, he said. Paradoxically, it is the pick-up in the economy that is partly to blame for the stock market collapse as companies have shifted funds away from financial investments to increase inventories and step up capital spending, one government economist said. In deciding what response to make to the steep stock price drop, the Bank of Japan must first determine whether prices will continue to fall further and then decide if they pose a greater economic danger than the threat of higher inflation, one central bank official said. "That will at least take a couple of days, if not weeks," he said. REUTER  20-OCT-1987 05:34:04.54 mise F f0363reute f f BC-CORRECTED-Milan-Bours 10-20 0014  ******CORRECTED-Milan Bourse opening delayed an hour to 1000 GMT (NOT 1200 GMT)-official Blah blah blah.  20-OCT-1987 05:43:10.09 philippines aquino RM AI f0379reute u f BC-AQUINO-SAYS-GROWTH-HA 10-20 0098  AQUINO SAYS GROWTH HAS PRIORITY OVER DEBT PAYMENTS MANILA, Oct 20 - President Corazon Aquino said economic growth took priority over debt repayments but she sought to dispel fears that the Philippines would not honour a July agreement rescheduling 13.2 billion dlrs of debt. In a speech to 13 major business groups, Aquino said, "Our policy has been very clear fm the start -- growth must take priority, for the plain and simple reason that if we have no money to pay, we can't. And if we starve the nation of essential services, there may be no one around to honour the debt." Aquino said her officials would try to get all 483 creditor banks to sign the debt rescheduling pact by the November 15 effective date. "That should end speculation and remove at least one excuse for hoarding dollars," Aquino said. Violent fluctuations in the peso's exchange rate and the end of a 17-month bull run in local stock markets have triggered dollar-hoarding. Aquino said the country's foreign debt, which rose to nearly 29 billion dlrs in April, was growing even without fresh borrowing. Debt servicing took up 40 pct of the budget and 45 pct of export earnings, Aquino said. Over the next six years, the Philippines would be paying its creditors 20 billion dlrs while getting only four billion dlrs in new loans. Aquino acknowledged there were grave doubts about her government's ambitious privatisation program. "There is always an excuse for government not to sell," she said, but she added: "I want government to get out of business." She said non-performing assets would be sold in open bidding and Filipinos and foreigners would compete on equal terms. REUTER  20-OCT-1987 05:43:53.22 ukusa RM f0380reute b f BC-E.F.-HUTTON-DENIES-RU 10-20 0113  E.F. HUTTON DENIES RUMOURED SOLVENCY PROBLEMS LONDON, Oct 20 - Brokerage firm E.F. Hutton Group Inc <EFH> is not facing liquidity problems as a result of the fall on Wall Street, nor is the firm on the brink of insolvency, London joint managing director Harry Romney said. He was replying to Reuter questions about market rumours that Hutton could be in financial difficulties. Romney noted the New York-based firm employs 16,000 to 17,000 people worldwide. Questioned on whether Hutton might be considering cutbacks in line with some other big U.S. Securities houses, he said Hutton's operations were under contuous review, but no announcements were imminent. REUTER  20-OCT-1987 05:46:18.76 grainrice philippines G f0386reute u f BC-RICE-RESEARCH-INSTITU 10-20 0100  RICE RESEARCH INSTITUTE NAMES NEW HEAD MANILA, Oct 20 - The Manila-based International Rice Research Institute (IRRI) said West German agricultural scientist Klaus Lampe will take over as its director-general in early 1988, succeeding M.S. Swaminathan. An IRRI statement said Lampe, 56, is currently senior adviser to the German Agency for Technical Cooperation at Eschborn and was a former head of the agriculture section of the Federal Ministry for Economic Cooperation. It said Swaminathan, who has headed IRRI since 1982, will concentrate on environmental and agricultural issues. REUTER  20-OCT-1987 05:46:54.39 mise F f0392reute b f BC-CONSOB-DELAYS-MILAN-B 10-20 0089  CONSOB DELAYS MILAN BOURSE OPENING ONE HOUR MILAN, Oct 20 - The opening of the Milan bourse and Italy's nine other stock exchanges has been delayed one hour to 1000 GMT by stock market regulatory agency Consob. A Consob spokesman told Reuters the action was taken "to give operators time to reflect on the agreement between Treasury Secretary James Baker and West German officials on the Louvre accord." He did not elaborate. The Milan Stock Index (MIB), base January 2 equals 1000, closed down 6.26 pct yesterday. REUTER  20-OCT-1987 06:07:59.83 uk lse RM V f0436reute b f BC-STOCK-EXCHAGE-SAYS-NO 10-20 0093  STOCK EXCHAGE SAYS NO QUESTION OF HALTING TRADING LONDON, Oct 20 - A spokeswoman for the London Stock Exchange said there was no question of trading being suspended because of the unprecedented three-day drop in prices, which has seen almost 23 pct wiped off share values. Trading on the Hong Kong market has been called off until Monday because of the steep slide on Wall Street amid panic selling on all the world's stock exchanges. The Tokyo market was 14.9 pct off last night after a huge 508 point (22.5 pct) fall on Wall Street yesterday. The Stock Exchange said although the Stock Exchange Automated Quotation (SEAQ) system was working perfectly, "fast market" conditions may pevail periodically. A "fast market" indicator is displayed at the bottom of the SEAQ screen when the huge volume of activity is delaying prices from entering the system, making screen prices lag behind the prevailing market. Such conditions are reviewed every 30 minutes and at 1000 GMT were withdrawn and all on screen prices became firm. The Exchange said the mandatory quote period will still end at 1600 GMT but depending upon trading activity the market indices may again be calculated up to 1630 GMT instead of the usual 1600 GMT. At 0945 GMT the FTSE 100 share index was down 259.1 points at 1,793.2, 12.6 pct lower so far today. REUTER  20-OCT-1987 06:12:19.69 alum C M f0446reute f f BC-Sept-daily-ave-primar 10-20 0013  ****** Sept daily ave primary aluminium output 34,900 tonnes, up 400 tonnes, IPAI. Blah blah blah.  20-OCT-1987 06:14:40.08 F f0447reute f f BC-Blue-Arrow-says-Conse 10-20 0012  ******Blue Arrow says Conservative Party Chairman Norman Tebbit to join board Blah blah blah.  20-OCT-1987 06:18:31.24 south-korea RM f0462reute u f BC-SAMSUNG-BOND-GOES-CON 10-20 0118  SAMSUNG BOND GOES CONVERTIBLE BUT NO SHARE DEMAND SEOUL, Oct 20 - The first convertible bond issued by a South Korean firm overseas -- by Samsung Electronics Co Ltd <SAMS.SE> -- became eligible for conversion but there was no demand for shares as the government still bans direct share ownership by foreigners, a Samsung official said. "There was no demand from holders, so the lead managers made no approach to us to issue shares," the official said. The five pct bond, co-lead managed by S.G. Warburg and Goldman Sachs Co, raised 20 mln dlrs when issued in 1985. The only other Korean convertible bonds were issued by Daewoo Heavy Industries Ltd <DAEW.SE> and <Yukong Ltd>, both in 1986. REUTER  20-OCT-1987 06:20:40.59 alum ukbrazilcuba M f0470reute r f BC-GROUNDED-BRITISH-BAUX 10-20 0060  GROUNDED BRITISH BAUXITE VESSEL REFLOATED IN ORINOCO LONDON, Oct 20 - The British bulk carrier Envoy, which ran aground in the Orinoco river on October 16, was refloated without lightening on October 19, Lloyds Shipping Intelligence service said. The Envoy, 75,453 tonnes dw, was carrying a cargo of 50,000 tonnes of bauxite from Brazil to Cuba. REUTER  20-OCT-1987 06:21:43.60 zse F f0472reute f f BC-Swiss-Stock-Index-fal 10-20 0013  ******Swiss Stock Index falls 3.7 pct or 38.4 points at opening to 989.5 - official Blah blah blah.  20-OCT-1987 06:27:57.36 austriausaussrjapan ec Y f0483reute u f BC-EAST,-WEST-APPROVE-NU 10-20 0118  EAST, WEST APPROVE NUCLEAR FUSION ENERGY PROJECT VIENNA, Oct 20 - East and West on Monday decided to go ahead with an ambitious nuclear fusion project billed as possibly providing an inexhaustible source of energy, the International Atomic Energy Agency (IAEA) said. Representatives of the U.S., The Soviet Union, the European Community and Japan agreed to develop plans for a revolutionary thermonuclear reactor, to produce energy not from splitting atoms as in today's nuclear plants, but by joining them. Work is due to begin next year at the Institute for Plasma Physics at the Max Planck Foundation near Munich, West Germany, and is scheduled for completion by 1990, an IAEA statement said. Research into fusion's scientific feasibility has been under way for many years but the project approved on Monday, known as International Thremonuclear Experimental Reactor (ITER) will study if an actual plant could be built. The project represents an unprecedented display of East-West scientific cooperation, but a decision will not be made until its completion on whether an actual reactor would be jointly constructed or by individual participant countries. Dieter Sigmar, a leading U.S. Fusion researcher, said last month that the development of a demonstration plant would cost several billion dlrs and need at least another 10 years. Fusion plants would produce little radioactive waste. While today's nuclear power plants need uranium, mined in only a few countries and producing dangerous waste, fusion plants would eventually run only on deuterium, an element related to hydrogen and available from almost limitless supplies of sea water, according to experts. REUTER  20-OCT-1987 06:28:03.88 japan takeshita RM f0484reute u f BC-TAKESHITA-FACES-TOUGH 10-20 0098  TAKESHITA FACES TOUGH ECONOMIC MANAGEMENT JOB By Tsukasa Maekawa TOKYO, Oct 20 - Former Finance Minister Noboru Takeshita, chosen on Monday to be Japan's next prime minister, will face a tough test in managing Japan's economy from the very start of his two-year term, economists and businessmen said. Takeshita told a news conference on Tuesday that he would do his best to continue the domestic reforms and external policies of Prime Minister Yasuhiro Nakasone. However, leading Japanese businessmen called on Takeshita to outdo Nakasone by showing stronger leadership. "Takeshita should not merely follow the Nakasone policies but should cope with mounting economic issues with a new vision and policies," Takashi Ishihara, chairman of the Japan Committee for Economic Development, said in a statement. Economists generally agreed that there will be no major changes in Japan's economic policies under a new leader. However, expectations are high among major industries for new initiatives by Takeshita for immediate and effective measures to solve economic problems such as trade friction with the U.S., Administrative and tax reforms, and soaring land prices. Eishiro Saito, chairman of the Federation of Economic Organisations (Keidanren), urged Takeshita to succeed in unifying the ruling Liberal Democratic Party as soon as possible to tackle difficult tasks. Regarding foreign economic polices, Yoshitoki Chino, chairman of the Japan Securities Dealers Association, said Takeshita should come up with economic measures well before economic issues develop into problems. Behind those calls on Takeshita for prompt action are doubts about his capability in handling international issues due to his lack of experience in diplomacy, economists said. Economists said foreign countries should be patient with Takeshita, who is widely known as an ultra-cautious politician. Takeshita has repeatedly said, "There should be consensus before taking action." Takeshita has so far failed to unveil specific measures to reduce Japan's huge trade surplus, economists said. He has said Japan will continue to stimulate the economy and to open the market wider to foreign products. REUTER  clucene-core-2.3.3.4/src/test/data/reuters-21578/reut2-021.sgm000066400000000000000000002153371154025176300231510ustar00rootroot00000000000000 19-OCT-1987 15:37:46.03 F f2882reute f f BC-CITYFED-FINANCI 10-19 0013  ******CITYFED FINANCIAL CORP SAYS IT CUT QTRLY DIVIDEND TO ONE CENT FROM 10 CTS/SHR Blah blah blah.  19-OCT-1987 15:35:53.55 crudeship bahrainiranusa Y f2873reute r f AM-GULF-PLATFORM 10-19 0101  HUGE OIL PLATFORMS DOT GULF LIKE BEACONS By ASHRAF FOUAD BAHRAIN, Oct 19 - Huge oil platforms dot the Gulf like beacons -- usually lit up like Christmas trees at night. One of them, sitting astride the Rostam offshore oilfield, was all but blown out of the water by U.S. Warships on Monday. The Iranian platform, an unsightly mass of steel and concrete, was a three-tier structure rising 200 feet (60 metres) above the warm waters of the Gulf until four U.S. Destroyers pumped some 1,000 shells into it. The U.S. Defense Department said just 10 pct of one section of the structure remained. U.S. helicopters destroyed three Iranian gunboats after an American helicopter came under fire earlier this month and U.S. forces attacked, seized, and sank an Iranian ship they said had been caught laying mines. But Iran was not deterred, according to U.S. defense officials, who said Iranian forces used Chinese-made Silkworm missiles to hit a U.S.-owned Liberian-flagged ship on Thursday and the Sea Isle City on Friday. Both ships were hit in the territorial waters of Kuwait, a key backer of Iraq in its war with Iran. Henry Schuler, a former U.S. diplomat in the Middle East now with CSIS said Washington had agreed to escort Kuwaiti tankers in order to deter Iranian attacks on shipping. But he said the deterrence policy had failed and the level of violence and threats to shipping had increased as a result of U.S. intervention and Iran's response. The attack on the oil platform was the latest example of a U.S. "tit-for-tat" policy that gave Iran the initiative, said Harlan Ullman, an ex-career naval officer now with CSIS. He said with this appraoch America would suffer "the death of one thousand cuts." But for the United States to grab the initiative militarily, it must take warlike steps such as mining Iran's harbors or blockading the mouth of the Gulf through which its shipping must pass, Schuler said. He was among those advocating mining as a means of bringing Iran to the neogtiating table. If vital supplies were cut off, Tehran could not continue the war with Iraq. Ullman said Washington should join Moscow in a diplomatic initiative to end the war and the superpowers should impose an arms embargo against Tehran if it refused to negotiate. He said the United States should also threaten to mine and blockade Iran if it continued fighting and must press Iraq to acknowledge responsibility for starting the war as part of a settlement. Iranian and Western diplomats say Iraq started the war by invading Iran's territory in 1980. Iraq blames Iran for the outbreak of hostilities, which have entailed World War I-style infantry attacks resulting in horrific casualties. Each side has attacked the others' shipping. Reuter  19-OCT-1987 15:34:40.05 acq F f2863reute b f BC-CCR-VIDEO-SAYS 10-19 0015  ******CCR VIDEO SAYST RECEIVED OFFER TO NEGOTIATE A TAKEOVER BY INTERCEP INVESTMENT CORP Blah blah blah.  19-OCT-1987 15:32:25.38 canada E F f2855reute b f BC-GM-<GM>-CANADA-UNIT-M 10-19 0096  GM <GM> CANADA UNIT MAJOR OFFER ACCEPTED BY UNION TORONTO, Oct 19 - The Canadian Auto Workers' Union said it accepted an economic offer from the Canadian division of General Motors Corp <GM> in contract negotiations. But union president Bob White said many local issues at the 11 plants in Ontario and Quebec still remained unresolved ahead of Thursday's deadline for a strike by 40,000 workers. "It minimizes the possibility of a strike," White told reporters. However, "if we don't have local agreements settled by Thursday, there will be a strike," he said. The local issues still unresolved involved health care, skilled trades and job classifications, White said. GM Canada negotiator Rick Curd said he believed a strike would be avoided. "Even though there are some tough issues to be resolved we're on the right schedule to meet the target," Curd said. "I'm very pleased with the state of the negotiations," he said. Union membership meetings have been scheduled for the weekend in case a tentative settlement, said White. White said the union has also received assurances that a job protection pact negotiated with GM workers in the U.S. does not threaten Canadian jobs. The economic offer for a three-year pact largely matches agreements at Ford <F> and Chrysler <C> in Canada, which include inflation-indexed payments for future retirees and fixed annual payments for current retirees. It also gives workers wage increases of three pct immediately and 1.5 pct in each of the second and third years. Reuter  19-OCT-1987 15:32:11.59 canada E F f2854reute u f BC-CANADA-DEVELOPMENT-UN 10-19 0092  CANADA DEVELOPMENT UNIT <CDC.TO> REFINANCES SARNIA, Ontario, Oct 19 - Canada Development Corp said its <Polysar Ltd> unit completed a refinancing package worth about 830 mln Canadian dlrs. The company said the financing, which involves 24 banks and four syndicated loans, consists of a 380 mln Canadian dlr revolver, a 200 mln Canadian dlr European medium term loan, a 149 mln Canadian dlr revolver and a 100 mln Canadian dlr operating loan. The company said the refinancing will reduce borrowing costs, in addition to having other benefits. Reuter  19-OCT-1987 15:31:35.28 crudeship bahrainusairan C f2849reute u f BC-/DIPLOMATS-CALL-U.S. 10-19 0110  DIPLOMATS CALL U.S. ATTACK ON OIL RIG RESTRAINED By Ian MacKenzie BAHRAIN, Oct 19 - A U.S. attack on an Iranian oil platform in the Gulf on Monday appeared to be a tit-for-tat raid carefully orchestrated not to be too provocative or upset Arab allies, Western diplomats in the region said. U.S. Defence Secretary Caspar Weinberger said Monday that U.S. Warships destroyed the oil platform in the southern Gulf in response to a missile strike on the American-registered Kuwaiti tanker Sea Isle City in Kuwaiti waters on Friday. "We consider the matter closed," he said, a signal the U.S. administration did not want the Gulf crisis to escalate. Iran had warned the United States earlier in the day against exacerbating the Gulf crisis, saying military action would endanger American interests. Following the raid, a okesman for Tehran's War Information Headquarters vowed to avenge the attack with a "crushing blow." "The United States has entered a swamp from which it can in no way get out safely," Tehran Radio quoted him as saying. Diplomats noted, however, Iran was also seeking to avoid ostracism by Arab states due to meet at a summit in Amman on November 8 and discuss the Iran-Iraq war. Iranian Prime Minister Mir-Hossein Mousavi is currently in Damascus, and diplomats said he would seek Syrian help in preventing a total Arab breach with Tehran. Further escalation of the war threatening the Gulf Arab states could work against Tehran at the Amman gathering, they said. "The ball is in Iran's court now. It's up to Tehran to respond one way or the other," a diplomat said. President Ronald Reagan warned Iran of stronger American countermeasures if the military escalation continued. Western diplomats and military sources in the area said shelling the platform appeared to be the least provocative act the United States could have taken once it had decided to retaliate for the tanker attack, blamed by both the Americans and Kuwaitis on Iran. "It's interesting that they chose something in international waters because it doesn't implicate any other nation," one diplomat said. "This was better for U.S. Relations with the Gulf Arab states, particularly Kuwait." Commented another diplomat: "Kuwait must be happy that the U.S. Has done something, but relieved that Faw was not attacked on its doorstep." One source said of the attack on the oil platform: "They managed to warn off the crew and hit something that was the least nuisance to everybody." A diplomat commented: "They were very clever in the place they chose. It gets attention, but it hasn't devastated anything because it wasn't working in the first place." A senior Arab banker in the area said after the news broke: "This was a good, measured response without risking a flare-up ... It is a face-saving response (for the Americans)." Reuter  19-OCT-1987 15:30:22.56 acq usafrance F f2842reute r f BC-BROWN-DISC-TO-BUY-RHO 10-19 0076  BROWN DISC TO BUY RHONE-POULENC <RHON.PA> UNIT COLORADO SPRINGS, Colo., Oct 19 - Brown Disc Products Co Inc, a unit fo Genevar Enterprises Inc, said it has purchased the ongoing business, trademarks and certain assets of Rhone-Poulenc's Brown Disc Manufacturing unit, for undisclosed terms. Rhone-Poulenc is a French-based chemical company. Under the agreement, Rhone-Poulenc will supply magnetic tape and media products to Brown Disc Products. Reuter  19-OCT-1987 15:28:27.68 V RM f2834reute f f BC-DOW-SINKS-TO-LO 10-19 0011  ******DOW SINKS TO LOWEST LEVEL OF THE YEAR, DOWN 370 POINTS TO 1876 Blah blah blah.  19-OCT-1987 15:27:23.12 usa F f2832reute h f BC-LANE-TELECOMMUNICATIO 10-19 0080  LANE TELECOMMUNICATIONS PRESIDENT RESIGNS HOUSTON, Oct 19 - Lane Telecommunications Inc <LNTL.O> said Richard Lane, its president and chief operating officer, resigned effective Oct 23. Lane founded the company in 1976 and has been its president since its inception, the company said. He said he resigned to pursue other business interests. Kirk Weaver, chairman and chief executive officer, said Lane's resignation was amicable. No replacement has been named. Reuter  19-OCT-1987 15:24:34.02 usa F f2824reute d f BC-PERKIN-ELMER-<PKN>-WI 10-19 0072  PERKIN-ELMER <PKN> WINS EPA CONTRACT NORWALK, Conn., Oct 19 - Perkin-Elmer Corp said it won a contract to provide laboratory information management systems to the Enviromental Protection Agency's 10 regional laboratories. The value and the exact duration of the contract was not disclosed. The company said the contract will include hardware, software, installation, support services, and software analyst consultations. Reuter  19-OCT-1987 15:23:44.84 usa F f2822reute s f BC-WHIRLPOOL-CORP-<WHR> 10-19 0026  WHIRLPOOL CORP <WHR> REG QTLY DIV BENTON HARBOR, MICH., Oct 19 - Qtly div 27-1/2 cts vs 27-1/2 cts prior Pay December 31 Record December Four Reuter  19-OCT-1987 15:23:41.70 earn usa F f2821reute d f BC-CONSOLIDATED-FREIGHTW 10-19 0045  CONSOLIDATED FREIGHTWAYS INC <CNF> 3RD QTR NET PALO ALTO, Calif., Oct 19 - Shr 43 cts vs 63 cts Net 16,362,000 vs 24,325,000 Revs 589.3 mln vs 549.1 mln Nine Mths Shr 1.40 dlrs vs 1.73 dlrs Net 54,011,000 66,591,000 Revs 1.68 1.58 billion Reuter  19-OCT-1987 15:23:36.33 crudeship usairaniraqkuwait Y RM f2820reute u f AM-GULF-FUTURE 10-19 0081  LATEST ATTACK SEEN POINTING UP DILEMMAS FOR US By CHRISTOPHER HANSON WASHINGTON, Oct 19 - Military experts say the United States faces a dilemma in the Gulf following U.S. destruction of an Iranian oil platform in retaliation for an attack on a U.S.-flagged tanker. The experts told Reuters Tehran holds the initiative and is likely to control the tempo and direction of the conflict as long as America simply reacts to Iranian attacks by launching limited retaliatory strikes. But if Washington seizes the initiative with bolder steps -- such as mining Iran's harbors, blockading its shipping, or destroying key bases -- it could find itself in a major war. "Iran is in the driver's seat in an absolute sense as the cycle of attack and retaliation continues," said Fred Axelgard, a Gulf War expert with the private Center for Strategic and International Studies (CSIS). "It's like a Greek tragedy," said retired Adm. Eugene Carroll of Washington's private Center for Defense Information (CDI) think tank. Some Middle East experts say the only way out is for Washington to join forces with Moscow in pressing for an end to the war between Iran and Iraq. They say it is not feasible for America to withdraw its 30-ship force from the Gulf area, where the Navy began escorting U.S.-flagged Kuwaiti tankers in July. Withdrawal would give the appearance of being chased away by Iran, which President Reagan could never accept. U.S. Defense Secretary Caspar Weinberger told a Pentagon news conference the destroyers Kidd, Young, Leftwich and Hoel fired about 1,000 rounds of five-inch shells at Iran's Rostam oil rig 120 miles east of Bahrain beginning at about 1400 Gulf time (0700 EDT) on Monday. Weinberger said the platform had been used as a military base by Iran and that the attack responded to an Iranian Silkworm missile strike on the U.S.-flagged Kuwaiti tanker Sea Isle City on Friday. Iranians manning the platform were warned in advance and allowed to escape. "We do not seek further confrontation with Iran, but we will be prepared to meet any escalation of military action by Iran with stronger countermeasures," Weinberger said. "We consider this matter closed," he said. Analysts ranging from the liberal CDI to conservatives agreed the U.S. reaction was measured, reasonable and did not escalate the conflict unduly. But they said the question was whether Iran would consider the matter closed. It had not taken this view after earlier clashes. Reuter  19-OCT-1987 15:23:02.47 earn usa F f2817reute d f BC-ROCHESTER-TELEPHONE-C 10-19 0044  ROCHESTER TELEPHONE CORP <RTC> 3RD QTR NET ROCHESTER, N.Y., Oct 19 - Shr 96 cts vs 87 cts Net 10.8 mln vs 9,671,000 Revs 103.9 mln vs 97.5 mln Nine mths Shr 2.73 dlrs vs 2.62 dlrs Net 30.7 mln vs 29.3 mln Revs 325.7 mln vs 302.8 mln Reuter  19-OCT-1987 15:21:54.33 usa F f2815reute h f BC-NATIONAL-CITY-<NCTY.O 10-19 0106  NATIONAL CITY <NCTY.O> UNIT BEGINS NEW SERVICE CLEVELAND, Oct 19 - National City Corp's National City Bank unit said it has begun a personal computer-based financial management service for small businesses. The service, the InTouch Financial Manager, is based on a personal computer system develoed by <Harbinger Comput Services> of Atlanta, and is licensed in Ohio by <Money Station Inc>, an electronic funds transfer network. National City said the service will allow businesses to use a personal computer and a local telephone call to communicate with their bank to initiate transactions and to receive data anmessages. Reuter  19-OCT-1987 15:20:42.71 earn usa F f2813reute r f BC-SOUTH-CAROLINA-NATION 10-19 0054  SOUTH CAROLINA NATIONAL CORP <SCNC.O> 3RD QTR COLUMBIA, S.C., Oct 19 - Shr 64 cts vs 55 cts Net 14.0 mln vs 11.8 mln Nine mths Shr 1.83 dlrs vs 1.53 dlrs Net 39.7 mln vs 32.7 mln Assets 4.65 billion vs 4.53 billion Loans 3.24 billion vs 2.92 billion Deposits 3.32 billion vs 3.15 billion Reuter  19-OCT-1987 15:19:34.63 earn usa F f2809reute u f BC-MARINE-CORP-<MCOR.O> 10-19 0056  MARINE CORP <MCOR.O> 3RD QTR NET SPRINGFIELD, Ill., Oct 19 - Shr 30 cts vs 30 cts Net 1,804,000 vs 1,800,000 Nine mths Shr 89 cts vs 79 cts Net 5,334,00 vs 4,496,000 NOTE: Earnings per share reflect initial public offering of 534,750 common shares in March 1986 and 2-for-1 stock splits in January and June 1986. Reuter  19-OCT-1987 15:18:52.46 crude uknorway F Y f2807reute r f BC-STATOIL-AWARDS-VESLEF 10-19 0110  STATOIL AWARDS VESLEFRIKK OIL FIELD CONTRACTS LONDON, Oct 19 - Norwegian state oil company Den Norske Stats Oljeselskap (Statoil) signed contracts worth a total of 1.5 billion Norwegian crowns in connection with the development of the Veslefrikk oil field, Statoil said. Moss Rosenberg Verft of Stavanger has been awarded a contract to convert the the drilling platform West Vision to a floating production platform. The work is to be completed in the summer of 1989. Aker Verdal has been awarded a contract for the engineering, purchasing and construction of the steel jacket for the wellhead platform, also to be completed in 1989, Statoil said. Reuter  19-OCT-1987 15:17:20.73 acq uk F Y f2798reute h f BC-U.K.-TREASURY-CONFIRM 10-19 0106  U.K. TREASURY CONFIRMS BP SALE TO GO AHEAD LONDON, Oct 19 - The British Treasury confirmed that the sale of British Petroleum Co Plc will go ahead as planned, despite Monday's stock market crash which forced BP below the 330p a share set for the 7.2 billion stg issue. "The government are not considering terminating the BP offer. The offer has been fully underwritten," a Treasury spokesman said. The issue, which remains open until October 28, was fully underwritten last week when the issue price was set. BP shares closed down 33p at 317p as the FT-SE 100 share index crashed a record 249.6 points, more than 10 pct. Reuter  19-OCT-1987 15:14:42.04 ugandaegypt RM f2787reute r f AM-UGANDA-EGYPT 10-19 0108  EGYPT TO BUILD HOUSING ESTATES AND ROADS FOR UGANDA KAMPALA, Oct 19 - Egypt has agreed to build two housing estates and two new roads in Uganda worth a total of 295 million dollars, Egyptian commercial attache Muhammud el Tahan said. He said Egyptian companies will build 8,000 housing units in Kampala and reconstruct the roads between Fort Portal and Bundibugyo near the Zaire border in western Uganda and between Kapchorwa and Swam near Mount Elgon in the east of the country. Uganda would repay 70 per cent of the Egyptian Government credit to finance the projects in the form of barter goods and 30 per cent in hard currency, Tahan said. Reuter  19-OCT-1987 15:12:27.51 E F f2781reute f f BC-UNION-ACCEPTS-G 10-19 0013  ******UNION ACCEPTS GM CANADA'S ECONOMIC OFFER - MANY LOCAL ISSUES UNRESOLVED Blah blah blah.  19-OCT-1987 15:10:34.40 earn usa F f2773reute d f BC-HARMAN-INTERNATIONAL 10-19 0044  HARMAN INTERNATIONAL <HIII.O> 1ST QTR SEPT 30 WASHINGTON, Oct 19 - Shr 30 cts vs 26 cts Net 2,534,000 vs 1,695,000 Revs 98.8 mln vs 67.1 mln Avg shrs 8,447,000 vs 6,563,000 NOTE: full name of company is harman international industries inc. Reuter  19-OCT-1987 15:10:11.16 money-fx west-germany RM A f2771reute u f BC-GERMAN-BANKER-CALLS-F 10-19 0107  GERMAN BANKER CALLS FOR SPECIAL MONETARY MEETING BONN, Oct 19 - Finance ministers from major industrial nations should hold a special meeting to deal with the U.S. Dollar's sharp decline, Helmut Geiger, president of the West German savings bank association, said. Geiger told Reuters: "Finance ministers should meet soon to take confidence-building measures to limit the damage caused by the dollar's fall." Separately, Geiger told Bild newspaper in an interview released ahead of publication on Tuesday that the lower dollar, which had been artificially talked down by U.S. officials, would damage West German exports and cost jobs. Reuter  19-OCT-1987 15:07:16.28 usa F A RM f2754reute r f BC-FIRST-BOSTON-<FBC>-ST 10-19 0092  FIRST BOSTON <FBC> STRATEGIC REVIEW IS UNDERWAY NEW YORK, Oct 19 - First Boston Inc said it is conducting a strategic review of its operations as part of a general policy to periodically evaluate its business plans. The company said it is too early to predict the outcome of the review, although it does not expect radical changes in its organization. Salomon Inc <SB> last week completed a strategic review that resulted in substantial layoffs. Other brokerage firms are either engaged in reviews or have made major personnel cutbacks. Reuter  19-OCT-1987 15:07:01.53 nyse V RM f2752reute f f BC-NYSE-TRADES-MOR 10-19 0010  ******NYSE TRADES MORE THAN 500 MLN SHARES IN RECORD VOLUME Blah blah blah.  19-OCT-1987 15:06:04.62 usa F f2750reute s f BC-FEDERAL-SIGNAL-CORP-< 10-19 0025  FEDERAL SIGNAL CORP <FSS> REG QTLY DIV OAK BROOK, ILL., Oct 19 - Qtly div 20 cts vs 20 cts prior Pay January Seven Record December 17 Reuter  19-OCT-1987 15:06:01.13 usa F f2749reute d f BC-ENTERTAINMENT-MARKETI 10-19 0061  ENTERTAINMENT MARKETING <EM> HEAD TO BUY SHARES HOUSTON, Oct 19 - Elias Zinn, chairman and chief executive of Entertainment Marketing Inc, said he planned to personally purchase up to 500,000 shares of Entertaiment Marketing common stock from time to time in the open market. Zinn said his purchases would be subject to availability and acceptable price levels. Reuter  19-OCT-1987 15:05:55.95 earn usa F f2748reute r f BC-THE-BANKING-CENTER-<T 10-19 0053  THE BANKING CENTER <TBCX.O> 3RD QTR NET WATERBURY, Conn., Oct 19 - Shr 25 cts Net 3,081,000 vs 2,063,000 Nine months Shr 86 cts Net 10.5 mln vs 6,966,000 Assets 1.43 billion vs 1.30 billion Deposits 912.5 mln vs 875.8 mln NOTE: Company converted to a stock savings bank on Aug 13, 1986. 1986 results include operations of Realtech Realtors, which was acquired in 1986. 1987 results include operations of Burgdorff Realtors, acquired in December 1986; Cornerstone Mortgage Co, acquired in July 1987; Centerbank Mortgage Co, acquired in July 1987; and Center Capital Corp, formed in August 1987. Reuter  19-OCT-1987 15:05:50.99 usa F f2747reute r f BC-ROTO-ROOTER-<ROTO.O> 10-19 0072  ROTO-ROOTER <ROTO.O> SEES IMPROVED 4TH QTR NET CINCINNATI, Ohio, Oct 16 - Roto-Rooter Inc said it expects fourth quarter profits to exceed the 22 cts a share reported for the final quarter of 1986 and the 23 cts earned in 1987's third quarter. It reported the third quarter profit was up pct from the 20 cts a share earned during the quarter in 1986. Nine month profits were up 23 pct to 64 cts a share from 52 cts last year. Reuter  19-OCT-1987 15:05:42.30 acq usa F f2745reute u f BC-CALMAT-<CZM>-SUES-IND 10-19 0082  CALMAT <CZM> SUES INDUSTRIAL EQUITY LOS ANGELES, Oct 19 - CalMat Co said it filed suit in Los Angeles Superior Court against Industrial Equity (Pacific) Ltd, against certain of its affiliates and against Ronald Langley, president of Industrial Equity's North American operations. The company said its sut charges that Langley missapropriated material non-public information acquired in his capacity as a CalMat director and used the information for the benefit of Industrial Equity. According to its more recent amendment to its Schedule 13D, Industrial Equity owned about 19.17 pct of CalMat's stock at October 14, CalMat said. It said Industrial has also stated that it intends to pursue a possible business combination in the near future. Reuter  19-OCT-1987 15:05:31.45 trade usaussr reaganverity F A RM f2743reute r f AM-REAGAN-VERITY 10-19 0104  REAGAN CALLS FOR VIGILANCE ON CERTAIN EXPORTS WASHINGTON, Oct 19 - President Reagan said the Commerce Department should be vigilant in preventing the flow of strategic technology from reaching the the Soviet Union and other communist countries. He was speaking at the swearing in of C. William Verity as Secretary of the Commerce Department. Verity said the U.S. should make certain that militarily sensitive high technology does not wind up in communist nations. But he also said the U.S. must reduce the list of products of a nontechnological nature, thereby allowing manufacturers to increase exports and jobs. Reuter  19-OCT-1987 15:02:51.54 earn usa F f2726reute d f BC-WATTS-INDUSTRIES-INC 10-19 0032  WATTS INDUSTRIES INC <WATTA.O> 1ST QTR SEPT 27 ANDOVER, Mass., Oct 19 - Shr 36 cts vs 27 cts Net 4,538,000 vs 3,160,000 Sales 41.8 mln vs 32.8 mln Avg shrs 12.6 mln vs 11.9 mln Reuter  19-OCT-1987 15:01:06.27 usa F f2712reute h f BC-WHIRLPOOL-<WHR>-NAMES 10-19 0070  WHIRLPOOL <WHR> NAMES NEW CHAIRMAN BENTON HARBOR, MICH., Oct 19 - Whirlpool Corp said it named David Whitwam to the additional position of chairman, effective December One, replacing Jack Sparks, who retires November 30. It said Whitwam was elected president and chief executive officer effective July One. Sparks will continue to serve on Whirlpool's board of directors as chairman of the finance committee. Reuter  19-OCT-1987 14:59:03.82 earn usa F f2706reute h f BC-MONITERM-CORP-<MTRM.O 10-19 0084  MONITERM CORP <MTRM.O> 3RD QTR OPER NET MINNETONKA, MINN., Oct 19 - Oper shr profit 13 cts vs nil Oper net profit 612,806 vs profit 2,363 Sales 8,317,933 vs 2,823,243 Nine mths Oper shr profit 32 cts vs loss four cts Oper net profit 1,464,338 vs loss 161,315 Sales 20.3 mln vs 8,241,463 NOTE: 1987 earnings exclude gains from utilization of tax loss carryforwards of 321,980 dlrs, or seven cts a share in the quarter and 772,285 dlrs, or 17 cts a share for the nine months Reuter  19-OCT-1987 14:57:51.62 usa F f2700reute h f BC-SEEQ-<SEEQD.O>,-NATIO 10-19 0082  SEEQ <SEEQD.O>, NATIONAL SEMI <NSM> IN ACCORD SANTA CLARA, Calif., Oct 19 - Seeq Technology Corp and National Semiconductor Corp said they signed a four-year exclusive technology licensing and manufacturing agreement. The agreement allows the two companies to share technology and marketing rights to Seeq's 512-kilobit and one-megabit semiconductors and for National Semiconductor's 256-Kb FLASH EEPROMs, the companies said. Financial terms of the arrangement were not disclosed. Reuter  19-OCT-1987 14:57:12.59 earn usa F f2697reute d f BC-ERIE-LACKAWANNA-INC-< 10-19 0047  ERIE LACKAWANNA INC <ERIE.O> 3RD QTR NET CLEVELAND, Oct 19 - Shr 1.32 dlrs vs 1.59 dlrs Net 1,217,649 vs 1,471,824 Total income 1,896,018 vs 2,278,642 Nine mths Shr 4.92 dlrs vs 5.38 dlrs Net 4,553,380 vs 4,979,626 Total income 6,918,266 vs 8,134,313 Reuter  19-OCT-1987 14:56:58.45 earn usa F f2696reute h f BC-QUANTUM-CORP-<QNTM.O> 10-19 0043  QUANTUM CORP <QNTM.O> 2ND QTR SEPT 27 NET MILPITAS, Calif., Oct 19 - Shr 44 cts vs 30 cts Net 4,057,000 vs 2,716,000 Sales 49.5 mln vs 29.6 mln Six Mths Shr six cts vs 55 cts Net 518,000 vs 5,167,000 Sales 89.7 mln vs 54.9 mln Reuter  19-OCT-1987 14:56:46.00 earn usa F f2695reute w f BC-TERMIFLEX-CORP-<TFLX. 10-19 0038  TERMIFLEX CORP <TFLX.O> 1ST QTR SEPT 30 NET MERRIMACK, N.H., Oct 19 - Shr five cts vs seven cts Net 64,652 vs 96,157 Sales 1,205,321 vs 1,499,591 NOTE: Backlog three mln dlrs vs 2,600,000 as of June 30, 1987. Reuter  19-OCT-1987 14:56:31.92 acq usa F f2692reute s f BC-DURAKON-<DRKN.O>-TO-M 10-19 0050  DURAKON <DRKN.O> TO MAKE ACQUISITION LAPEER, Mich., Oct 19 - Durakon Industries Inc said it has entered into a definitive agreement to acquire DFM Corp, a maker of bug and gravel protective shields for trucks and cars, for an undisclosed amount of cash and debentures, retroactive to September One. Reuter  19-OCT-1987 14:56:25.95 acq usa F f2691reute r f BC-CHARTER-CRELLIN 10-19 0089  ATLANTIS <AGH> MAY BID FOR CHARTER-CRELLIN<CRTR.O> WASHINGTON, Oct 19 - Atlantis Group Inc said it bought 100,000 shares of Charter-Crellin Inc common stock, or 6.3 pct of the total outstanding, and may seek control in a negotiated transaction. In a filing with the Securities and Exchange Commission, Atlantis said it has informally discussed a business combination with Charter-Crellin management. But the company said it has not held negotiations with Charter-Crellin and does not intend to initiate further discussions. Pending development of specific proposals, Atlantis said it will continue to purchase additional Charter-Crellin shares in private or open market transactions depending on a range of factors including the market price of the stock. Atlantis said it bought its Charter-Crellin common stock in open market transactions between September 22 and October 7 at 14.91 dlrs to 15.62 dlrs a share, or for a total of about 1.51 mln dlrs. Reuter  19-OCT-1987 14:56:02.82 acq usa F f2690reute s f BC-ALLWASTE-<ALWS.O>-TO 10-19 0066  ALLWASTE <ALWS.O> TO MAKE ACQUISITION HOUSTON, Oct 19 - Allwaste Inc said it has agreed in principle to acquire a privately-held firm that performs interior cleaning services for tank-trailers for 1,300,000 common shares. It said the firm, which it did not name, earned about 1,500,000 dlrs pretax for the first nine mons of 1987. The company said closing is expected by October 31. Reuter  19-OCT-1987 14:55:53.51 earn usa F f2689reute d f BC-TRAVELERS-REAL-ESTATE 10-19 0051  TRAVELERS REAL ESTATE <TRAT.O> 3RD QTR NET BOSTON, Oct 19 - Shr 18 cts vs 27 cts Net 444,387 vs 676,593 Revs 549,437 vs 764,901 Nine mths Shr 67 cts vs 81 cts Net 1,690,670 vs 2,031,937 Revs 1,986,938 vs 2,302,278 NOTE: Full name is Travelers Real Estate Investment Trust Reuter  19-OCT-1987 14:55:34.56 usa F f2687reute d f BC-SAFEGUARD-<SFGD.O>-TO 10-19 0070  SAFEGUARD <SFGD.O> TO BUY BACK MORE SHARES ANAHEIM, Calif., Oct 19 - Safeguard Health Enterprises Inc said its board authorized management to step up its stock repurchase program by doubling the repurchase ceiling to 1.6 mln shares. The company also said it has already purchased 691,000 shares through September 30 under the previous authorization to buy 800,000 shares, or 10 pct of the stock then outstanding. Reuter  19-OCT-1987 14:55:26.31 earn usa F f2686reute u f BC-NEW-YORK-TIMES-CO-<NY 10-19 0042  NEW YORK TIMES CO <NYT> 3RD QTR NET NEW YORK, Oct 19 - Shr 40 cts vs 33 cts Net 32.6 mln vs 26.7 mln Revs 406.5 mln vs 370.1 mln Nine months Shr 1.44 dlrs vs 1.20 dls Net 117.8 mln vs 97.5 mln Revs 1.2 billion vs 1.1 billion Reuter  19-OCT-1987 14:55:10.41 earn usa F f2685reute d f BC-SAFEGUARD-HEALTH-<SFG 10-19 0051  SAFEGUARD HEALTH <SFGD.O> 3RD QTR NET ANAHEIM, Calif., Oct 19 - Shr 11 cts vs five cts Net 806,000 vs 384,000 Revs 18.0 mln vs 15.6 mln Nine Mths Shr 28 cts vs 17 cts Net 2,105,000 vs 1,320,000 Revs 51.9 mln vs 46.1 mln Note: Full name Safeguard Health Enterprises Inc. Reuter  19-OCT-1987 14:55:01.65 acq usa F f2684reute u f BC-HENLEY-<HENG.O>-ENDS 10-19 0084  HENLEY <HENG.O> ENDS TALKS WITH SANTE FE LA JOLLA, Calif., Oct 19 - Henley Group Inc said it ended talks with Sante Fe Southern Pacific Corp concerning the possible acquisition of Sante Fe's Southern Pacific Transportation Co subsidiary. The company also said it is reviewing its investment in Santa Fe Southern Pacific in light of Sante Fe's announcement that it recieved several bids ranging from 750 mln dlrs to more than one billion dlrs for its Southern Pafific Transportation subsidiary. Henley said it held discussions with Sante Fe concerning the acquisition by Henley of Bankers Leasing and Financial Corp and certain Sante Fe transportation and real estate assets. Henley said it began talks with Sante Fe after it announced its restructuring program in August 1987. As previously disclosed, Henley made necessary filings under the Hart-Scott-Rodino Antitrust Improvement Acts to permit Henley to increase its investment in Sante Fe to 24.9 pct of the outstanding common stock from 5.03 pct. Henley said that depending on prevailing conditions, including price and availability of Sante Fe stock, substantial developments affecting Sante Fe, other investment and business opportunities available to Henley, Henley may additional Sante Fe shares, or sell all or part of its investment in Sante Fe. Reuter  19-OCT-1987 14:54:15.03 earn usa F f2683reute d f BC-MERCURY-SAVINGS-AND-L 10-19 0053  MERCURY SAVINGS AND LOAN <MSL> 3RD QTR LOSS HUNTINGTON BEACH, Calif., Oct 19 - Shr loss 39 cts vs profit 44 cts Net loss 2,169,000 vs profit 2,417,000 Nine Mths Shr profit 56 cts vs profit 1.68 dlrs Net profit 3,111,000 vs profit 9,317,000 Note: Full name Mercury Savings and Loan Association ' Reuter  19-OCT-1987 14:53:33.35 usa F f2679reute a f BC-CARMIKE-<CMIKA.O>-OPE 10-19 0028  CARMIKE <CMIKA.O> OPENS SIX-SCREEN THEATER COLUMBUS, Ga., Oct 19 - Carmike Cinemas Inc said it has opened a six-screen theter called Carmike Six in Milledgeville, Ga. Reuter  19-OCT-1987 14:53:09.31 earn usa F f2677reute d f BC-BURNHAM-SERVICE-CORP 10-19 0043  BURNHAM SERVICE CORP <BSCO.O> 3RD QTR NET COLUMBUS, Ga., Oct 19 - Shr 45 cts vs 36 cts Net 2,554,000 vs 1,954,000 Revs 44.4 mln vs 32.5 mln Nine mths Shr 1.00 dlrs vs 75 cts Net 5,461,000 vs 3,756,000 Revs 109.5 mln vs 89.9 mln Reuter  19-OCT-1987 14:52:58.11 acq usa F f2676reute d f BC-TEXAS-AMERICAN-BANCSH 10-19 0087  TEXAS AMERICAN BANCSHARES <TXA> TO SELL UNIT FORT WORTH, Texas, Oct 19 - Texas American Bancshares Inc said it agreed to sell its Texas American Bank/Levelland unit to <First American Bancorp Inc> for about 12 mln dlrs in cash. Texas American said regulatory approval ofthe transaction is expected in December, and the sale will close shortly thereafter. Once the sale is completed, the unit's name will change to First American Bank of Texas. The unit reported total assets of 196.7 mln dlrs on Juen 30, 1987. Reuter  19-OCT-1987 14:52:34.06 acq usa F f2675reute d f BC-SUPERMARKETS-GENERAL 10-19 0113  SUPERMARKETS GENERAL <SGL> SELLS 11 DRUG STORES CARTERET, N.J., Oct 19 - Supermarkets General Corp said it agreed to sell 11 super drug stores to <F and M Distributors>. The nine existing and two unopened stores are located in Maryland, Virginia and upstate New York and are operated under the Pathmark Super Drug trade name, the company said. Terms of the transaction were not disclosed. The nine existing stores generated approximately 34.8 mln dlrs of Supermarkets General's total sales of 2.9 billion during the six-month period ended Aug One, 1987. F and M Distributors operates 42 discount drug stores in Michigan, Ohio, Illinois, Indiana and Wisconsin. Reuter  19-OCT-1987 14:51:53.39 usa F f2673reute r f BC-TRAVELERS-REAL-ESTATE 10-19 0077  TRAVELERS REAL ESTATE <TRAT.O> PAYOUT CUT BOSTON, Oct 19 - Travelers Real Estate Investment Trust Qtly div 17 cts vs 23 cts in prior qtr Payable November 25 Record October 30 It said the lower dividend reflects the reduction in cash flow from a mortgage secured by a motel in Covington, La. The trust said an appraisal is being made of the Covington property to determine whether an increase in loss reserve will be required at year end. Travelers REIT said its investment adviser, Keystone Realty Advisers has committed to lend the trust up to 500,000 dlrs for a term of two years to cover past due payables and capital improvements on the Covington motel. Keystone Realty is an affiliate of the Keystone Group, a Traverlers Corp <TIC> subsidiary. Reuter  19-OCT-1987 14:51:34.80 earn usa F f2671reute r f BC-ERC-INTERNATIONAL-INC 10-19 0070  ERC INTERNATIONAL INC <ERC> 3RD QTR NET FAIRFAX, Va., Oct 19 - Shr 31 cts vs nine cts Net 1,345,000 vs 368,000 Revs 31.9 mln vs 26.4 mln Nine mths Shr 91 cts vs 40 cts Net 3,890,000 vs 3,556,000 Revs 89.3 mln vs 71.7 mln NOTE: 1986 qtr and nine mths include loss 831,000 dlrs, or 19 cts per share, and loss 1,872,000 dlrs, or 44 cts per share, respectively, from discontinued operations. Reuter  19-OCT-1987 14:51:26.65 usa F f2670reute r f BC-KING-WORLD-<KWP>-SAYS 10-19 0049  KING WORLD <KWP> SAYS SHOW EXTENDED NEW YORK, Oct 19 - King World Productions Inc said its syndicated television series "The Oprah Winfrey Show" has been extended through the 1989-90 broadcast season. It said six of the top 10 markets have renewed the series through the end of the decade. Reuter  19-OCT-1987 14:50:41.28 earn usa F f2666reute u f BC-/PAINEWEBBER-GROUP-IN 10-19 0056  PAINEWEBBER GROUP INC <PWG> 3RD QTR NET NEW YORK, Oct 19 - Shr 44 cts vs 71 cts Net 14.8 mln vs 21.1 mln Revs 628.6 mln vs 605.6 mln Avg shrs 30,743,000 vs 26,969,000 Nine mths Shr 2.01 dlrs vs 1.93 dlrs Net 65.0 mln vs 57.4 mln Revs 1.89 billion vs 1.81 billion Avg shrs 30,782,000 vs 26,619,000 Reuter  19-OCT-1987 14:49:20.85 E RM f2661reute f f BC-CANADA-JUNE-BUDGET-DE 10-19 0016  *****CANADA JUNE BUDGET DEFICIT 2.66 BILLION DLRS VS YEAR AGO 2.80 BILLION DLRS - OFFICIAL Blah blah blah.  19-OCT-1987 14:47:08.40 usa F f2647reute d f BC-COUNTRYWIDE-<CCR>-SEE 10-19 0106  COUNTRYWIDE <CCR> SEES 3RD QTR NET OF 20 CTS NEW YORK, Oct 19 - Countrywide Credit Industries Inc said it expects fiscal third quarter earnings of 20 or 21 cents per fully diluted share, based on 18 mln shares outstanding. The company posted net income of 31 cents per fully diluted share in the previous third quarter ended November 30 last year, based on 12 mln shares outstanding. Angelo Mozilo, vice chairman and executive vice president, also told security analysts that that company should have a total loan servicing portfolio of 11 billion or 12 billion dlrs by the end of the current fiscal year, in February 1988. Countrywide Credit, a financial service company primarily involved in mortgage banking, reported 4.5 billion dlrs in its loan servicing portfolio for the last fiscal year. In addition, Mozilo said the company was continuing to reduce expenses by one mln dlrs a month and should bring total costs down by three mln dlrs at the end of the quarter. He said about 55 pct of the cost cuts were in personnel, and that the company had reduced the number of its offices nationwide by 11 in recent months. Reuter  19-OCT-1987 14:45:58.06 crude venezuela opec Y f2641reute u f BC-VENEZUELA-SAYS-OPEC-O 10-19 0105  VENEZUELA SAYS OPEC OIL OUTPUT 0VER 18 MLN BPD CARACAS, Oct 19 - The current OPEC oil production is above 18 mln barrels per day (bpd) and this level threatens the precarious equilibrium of the of oil market, Venezuelan Energy and Mines Minister Arturo Hernandez Grisanti said on Monday. He told reporters three or four countries out of OPEC's 13 members were mainly responsible for the overproduction, but declined to identify them. OPEC's production ceiling for the second half of 1987 is 16.6 mln bpd. The Venezuelan minister said OPEC's production reached a peak this year when it went over 19 mln bpd in August. Hernandez Grisanti, together with the oil ministers of Nigeria and Indonesia, met the heads of state of six Mideast Gulf countries earlier this month to urge OPEC members to comply with assigned production quotas. He said some of the countries which were complying as Venezuela, Indonesia, Libya, Algeria, Ecuador, Saudi Arabia and Iran. Hernandez declined to say whether the three or four countries he said were overproducing bordered the Mideast Gulf. REUTER  19-OCT-1987 14:45:13.72 acq usa F f2638reute b f BC-ATLANTIS-GROUP 10-19 0013  ****ATLANTIS GROUP TELLS SEC IT SEEKS NEGOTIATED PURCHASE OF CHARTER-CRELLIN Blah blah blah.  19-OCT-1987 14:44:27.84 acq usa F f2634reute d f BC-DYNASCAN-<DYNA.O>-COM 10-19 0109  DYNASCAN <DYNA.O> COMPLETES MANAGEMENT BUYOUT CHICAGO, Oct 19 - Dynascan Corp said it completed the sale of its industrial electronic products group and expects to recognize about a 3.0 mln dlr pretax gain on the transaction in the fourth quarter. It said the group was sold October 15 for 13.5 mln dlrs to Maxtec International Corp, a privately held company created by the company's management team. It said the purchase price was 12 mln dlrs in cash and 1.5 mln dlrs in five-year notes plus warrants to buy 7.0 pct of the stock of Maxtec. Dynascan said the group was projected to provide about 12 pct of its consolidated sales in 1987. Reuter  19-OCT-1987 14:43:45.78 acq F f2633reute f f BC-HENLEY-GROUP-RE 10-19 0011  ******HENLEY GROUP REVIEWING INVESTMENT IN SANTA FE SOUTHERN PACIFIC Blah blah blah.  19-OCT-1987 14:43:38.56 usa F f2632reute s f BC-PALL-CORP-<PLL>-SETS 10-19 0022  PALL CORP <PLL> SETS QUARTERLY GLEN COVE, N.Y., Oct 19 - Qtly div 8-1/2 cts vs 8-1/2 cts prior Pay Nov 13 Record Oct 30 Reuter  19-OCT-1987 14:42:48.01 acq F f2628reute f f BC-HENLEY-GROUP-SA 10-19 0015  ******HENLEY GROUP SAID IT ENDED TALKS ON BUYING SOUTHERN PACIFIC FROM SANTA FE SOUTHERN Blah blah blah.  19-OCT-1987 14:42:12.65 F f2627reute f f BC-PAINEWEBBER-GRO 10-19 0009  ******PAINEWEBBER GROUP INC 3RD QTR SHARE 44 CTS VS 71 CTS Blah blah blah.  19-OCT-1987 14:42:08.28 acq spainukusa F f2626reute r f BC-RENTA-INMOBILIARIA-SE 10-19 0099  RENTA INMOBILIARIA SEEKS CANNON GROUP <CAN> ASSETS MADRID, Oct 19 - Spanish property firm <Renta Inmobiliaria SA> is negotiating to buy the property assets of U.S. media company Cannon Group Inc <CAN>, Renta's finance director Jose Luis Sanchez said. Sanchez told Reuters that Renta's chairman Juan Antonio Robles was currently in the U.S. to negotiate the deal but declined to give other details. Interpart, a Luxembourg-based holding company chaired by Italian financier Giancarlo Paretti, payed around 12.2 billion pesetas in July to acquire a 63.5 pct stake in Renta Inmobiliaria. The Spanish daily newspaper El Pais said the Cannon property assets sought by Renta included the Elstree film studios in Britain and a chain of movie-theaters in Europe and the U.S. Reuter  19-OCT-1987 14:41:38.02 usa F f2625reute r f BC-STOP-AND-SHOP-<SHP>-T 10-19 0035  STOP AND SHOP <SHP> TO REPURCHASE SHARES BOSTON, Oct 19 - Stop and Shop Cos Inc said its board has authorized the repurchase of up to five pct of its common shares from time to time at prevailing market prices. Reuter  19-OCT-1987 14:41:28.16 crude usa F Y f2623reute u f BC-SOUTHLAND-<SLC>-UNIT 10-19 0078  SOUTHLAND <SLC> UNIT RAISES CRUDE OIL PRICES New York, Oct 19 - Citgo Petroleum Corp, a subsidiary of Southland Corp, said it raised the contract price it will pay for all grades of crude oil by 50 cts a barrel, effective Oct 16 The increase brings Citgo's postings for the West Texas Intermediate and West Texas Sour grades to 19.00 dlrs/barrel, while Light Louisiana SWeet is now priced at 19.35 dlrs. Citgo last changed it crude oil postings on Sept 9. Reuter  19-OCT-1987 14:41:09.93 F f2621reute f f BC-NEW-YORK-TIMES 10-19 0008  ******NEW YORK TIMES CO 3RD QTR SHR 40 CTS VS 33 CTS Blah blah blah.  19-OCT-1987 14:40:54.90 usa F f2619reute d f BC-<THERMASCAN-INC>-RECE 10-19 0110  <THERMASCAN INC> RECEIVES FDA APPROVAL ON DRUG NEW YORK, Oct 19 - Thermascan Inc said the U.S. Food and Drug Administration has approved clinical trials of a new, advanced AIDS confirmation test developed by the company. Thermascan said that about 10,000 trials will be taken on the the new test, called Fluorognost in the next three months through blood banks, hospitals and health centers as well as by individual physicians. The trials will be conducted in New York at the Beth Israel Medical Centre, the Sacremento Medical foundation Blood Center, the Karolinska Institute, Stockholm, and the Institute of Hygiene at the University of Innspruck. Reuter  19-OCT-1987 14:40:47.20 usa F f2618reute d f BC-GOTTSCHALKS-<GOT>-TO 10-19 0061  GOTTSCHALKS <GOT> TO BUY BACK STOCK FRESCalif., Oct 19 - Gottschalks Inc said its board authorized management to purchase up to 300,000 of the company's outstanding shares, or about 3.5 pct of the stock outstanding, because the company believes its shares are currently undervalued. It said the purchases will be made from time to time on the open market. Reuter  19-OCT-1987 14:40:42.14 acq usa F f2617reute r f BC-CCX-INC 10-19 0083  GROUP SELLS MOST OF STAKE IN CCX INC <CCX> WASHINGTON, Oct 19 - A shareholder group including Far Hills, N.J. attorney Natalie Koether said it reduced its stake in CCX Inc common stock to 10,000 shares, or less than one pct of the company's common stock outstanding, from a previous stake of about ten pct. In a filing with the Securities and Exchange Commission, the group said it sold 380,000 CCX common shares on October 15 at four dlrs a share. The group gave no reason for the sales. Reuter  19-OCT-1987 14:40:07.34 usa A RM f2612reute d f BC-LEISURE-AND-TECHNOLOG 10-19 0070  LEISURE AND TECHNOLOGY <LVX> SELLS NOTES NEW YORK, Oct 19 - Leisure and Technology In is raising 40 mln dlrs through an offering of notes due 1999, said sole manager Merrill Lynch Capital Markets. The notes have a 15-3/4 pct coupon and were priced at par. Non-callable for three years and non-refundable for five years, the issue is rated B-2 by Moody's Investors Service Inc and B by Standard and Poor's Corp. Reuter  19-OCT-1987 14:39:55.20 acq usa F f2611reute r f BC-TWIN-DISC 10-19 0106  ORION <OC> HAS 5.2 PCT TWIN DISC <TDI> STAKE WASHINGTON, Oct 19 - Orion Capital Corp said it acquired 163,000 shares of Twin Disc Inc common stock, or 5.2 pct of the company's common stock outstanding. In a filing with the Securities and Exchange Commission, Orion Capital said the stock represents "a favorable investment opportunity at current market prices." In open market transactions between August 21 and October 16, an Orion Capital subsidiary bought 56,200 Twin Disc common shares at 21.06 dlrs to 22.43 dlrs a share. The entire 5.2 pct stake was purchased at a cost of 3.2 mln dlrs, Orion Capital told the SEC. Reuter  clucene-core-2.3.3.4/src/test/data/utf8text/000077500000000000000000000000001154025176300205035ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/data/utf8text/arabic_utf8.txt000066400000000000000000000031201154025176300234270ustar00rootroot00000000000000ﻞﻴﻤﻳﺭ استبعدت تونس كابتن منتخبها القومي خالد بدرة من المجموعة الخامسة ÙÙŠ كأس العالم أمام ملاوي ÙÙŠ 26 مارس/ آذار. وكان كابتن المنتخب القومي روجر ليمير قد استبعد بدرة، 32 عاما، والذي قاد ÙØ±ÙŠÙ‚ بلاده ÙÙŠ كأس الأمم Ø§Ù„Ø¥ÙØ±ÙŠÙ‚ية، من Ø§Ù„ÙØ±ÙŠÙ‚ الذي يضم 23 لاعبا يوم الثلاثاء. وقد تم استبدال بدرة بالمهاجم علاء الدين يحيى المعار حاليا إلى ÙØ±ÙŠÙ‚ سان اتيان Ø§Ù„ÙØ±Ù†Ø³ÙŠ Ù…Ù† ÙØ±ÙŠÙ‚Ù‡ الإنجليزي ساوثامبتون. كما سيلعب منتخب تونس المعرو٠باسم نسور قرطاج دون لاعب الوسط عادل شيلدي الذي أوق٠عن اللعب. ومن المقرر أن تمثل المباراة ÙØ±ØµØ© لتونس لاستعادة اللاعب Ø§Ù„ÙØ±Ù†Ø³ÙŠ Ø§Ù„Ù…ÙˆÙ„Ø¯ حامد ناموتشي. وكان ناموتشي، 20 عاما، لاعب الوسط والذي يلعب لصالح Ø§Ù„ÙØ±ÙŠÙ‚ الاسكتلندي رينجرز يلعب مع Ø§Ù„ÙØ±ÙŠÙ‚ القومي ÙÙŠ ÙØ¨Ø±Ø§ÙŠØ±/ شباط ÙÙŠ المباراة الودية أمام تركيا غير أن المباراة ألغيت بسبب سوء الأحوال الجوية. ووÙقا لقوانين الاتحاد الدولي لكرة القدم (الÙÙŠÙØ§) يسمح للاعب كرة القدم تمثيل دولة أخرى طالما يحمل جنسية مزدوجة ويطلب تغيير الجنسية قبل سن 21. clucene-core-2.3.3.4/src/test/data/utf8text/chinese_utf8.txt000066400000000000000000000026331154025176300236340ustar00rootroot00000000000000啤酒 é…’ é’島啤酒與美國釀酒商åˆä½œ 百å¨å•¤é…’是安海斯-布希公å¸ç”¢å“之一 中國é’島啤酒集團和世界最大釀酒商美國安海斯-布希公å¸(Anheuser-Busch)锿ˆå”議,組æˆå•†æ¥­ç­–ç•¥è¯ç›Ÿã€‚ 安海斯-å¸ƒå¸Œå…¬å¸æ˜¯ç”Ÿç”¢ç™¾å¨å•¤é…’(Budweiser Beer)的公å¸ã€‚ 安海斯-布希和é’å³¶å…©å®¶å…¬å¸å°‡çµåˆé›™æ–¹çš„資æºï¼Œé€²ä¸€æ­¥æ‹“展中國的市場。 é’島啤酒表示,兩家公å¸åˆè³‡çš„è©³æƒ…ä»æœ‰å¾…商討。 安海斯-å¸ƒå¸Œå·²ç¶“æŒæœ‰é’å³¶4.5%的股權。 é’å³¶å°å®‰æµ·æ–¯-布希來說,å¸å¼•力éžå¸¸å¤§ï¼Œä¸»è¦æ˜¯ç”±æ–¼é’å³¶éåŠé¾å¤§ä¸­åœ‹å¸‚å ´çš„æ¯å€‹è§’è½ã€‚ é’島一直收購å°åž‹é‡€é…’商,æé«˜å…¶å¸‚場佔有率。é’å³¶ç›®å‰çš„市場佔有率是11%。該公å¸è¡¨ç¤ºï¼Œå¸‚場佔有率æ¯å¹´å¢žé•·6%。 é æ–™è©²å…¬å¸åœ¨2002å¹´1月到6月的盈利增長了50%,å³è¶…éŽ1億元人民幣。 世界上30å¤šå€‹åœ‹å®¶å‡æœ‰å‡ºå”®é’島啤酒。 æ¥ ã€Šè¯‘å‘˜ã€‹ä¸‹æœˆå°†å…¨çƒåŒæ­¥ä¸Šæ˜  妮å¯å°†æœ‰æœ›æ¥åŽ æ›´æ–° æ¥æºï¼šåƒé¾™æ–°é—»ç½‘ 第1页/å…±1页 << 上一页 | 下一页 å› ä¸ºå°†å‚æ¼”王家å«çš„《从上海æ¥çš„女人》,好莱åžè‘—å女星妮å¯Â·åŸºå¾·æ›¼åœ¨ä¸­å›½å†…地的人气激增。记者昨天了解到,由她主演的好莱åžå¤§ç‰‡ã€Šå›½å®¶ç¿»è¯‘员》作为今年内地首部全çƒåŒæ­¥å¼•进大片,将于4月22æ—¥å…¬æ˜ ï¼Œè€Œå¦®å¯æœ¬äººå°†æœ‰æœ›æ¥åŽå‚加该片的宣传活动 clucene-core-2.3.3.4/src/test/data/utf8text/czech_utf8.txt000066400000000000000000000112571154025176300233140ustar00rootroot00000000000000BudÄ›jovický Základní informace NaÅ¡e mise Tradice: PÅ™i výrobÄ› originálního budÄ›jovického ležáku Budweiser Budvar používáme tradiÄní postupy a stavíme na znalostech a vÄ›domostech, které nám zanechaly generace sládků. Kvalita: NaÅ¡e pivo vaříme z nejkvalitnÄ›jších surovin, žateckého chmelu, moravského sladu a vody z naÅ¡ich vlastních artéských studní. JedineÄnost:Díky lahodné chuti a jedineÄnému složení a charakteru vyhledávají náš ležák tisíce milovníků kvalitních piv prakticky po celém svÄ›tÄ›. Originalita: Kdekoli na svÄ›tÄ› si koupíte Budweiser Budvar, můžete si být jisti, že byl vyroben v místÄ› svého původu ÄŒeských BudÄ›jovicích (dříve Budweis). Proto se můžeme v rámci přístupu ÄŒeské republiky do Evropské unie pyÅ¡nit "ochranou podle místa původu" pro naÅ¡e výrobky. Pivovar BudÄ›jovický Budvar Kvalita a vÄ›hlas budÄ›jovického piva, jehož historie sahá až do 13. století, vedly k tomu, že originální receptura i jeho jméno byly Äasto pÅ™edmÄ›tem napodobování a kopírování. Pivovar BudÄ›jovický Budvar je dlouhodobÄ› jedním z nejúspěšnÄ›jších potravinářských podniků v ÄŒeské republice. Téměř polovina produkce je úspěšnÄ› prodávána ve více než 60 zemích celého svÄ›ta. Novodobá historie pivovaru se datuje do roku 1967, kdy Ministerstvo zemÄ›dÄ›lství ÄŒeské republiky založilo národní podnik BudÄ›jovický Budvar jako přímého nástupce ÄŒeského akciového pivovaru, který vaÅ™il pivo v ÄŒeských BudÄ›jovicích již od roku 1895. Ten byl založen Äeskými právováreÄníky, kteří navázali na více než 700 let starou historii vaÅ™ení piva v ÄŒeských BudÄ›jovicích (dříve Budweis). BudÄ›jovický Budvar vlastní cenné duÅ¡evní vlastnictví v podobÄ› více než 380 ochranných známek registrovaných ve 101 zemích svÄ›ta. Mezi nejznámÄ›jší patří Budweiser, Budvar, Budweiser Budvar, Bud, BudÄ›jovický Budvar a Czechvar. Toto ohromné duÅ¡evní bohatství souvisí s místem svého původu, mÄ›stem ÄŒeské BudÄ›jovice, dříve Budiwoyz Äi Budweis. Postupnou a cílevÄ›domou expanzí na zahraniÄní trhy a posilováním prodejů doma dosáhl BudÄ›jovický Budvar pozice klíÄového hráÄe na trhu piva nejen v ÄŒeské republice. Objem exportovaného výstavu Å™adí prémiový originální ležák Budweiser Budvar k jedné z nejexportovanÄ›jších pivních znaÄek ÄŒeské republiky. V BudÄ›jovickém Budvaru, n. p., dnes pracuje pÅ™es 670 zamÄ›stnanců. Hlavní pÅ™edstavitelé pivovaru Ing. Jiří BoÄek – Å™editel Ing. Josef Tolar – sládek Ing. Petr Jánský – finanÄní a ekonomický manager Ing. Robert Chrt – obchodní manager Äesky english deutsche Úvod Mapa stránek Katalog výrobků Katalog výrobků To nejvzácnÄ›jší, co máme … NaÅ¡e vlastní vyÅ¡lechtÄ›ná kultura kvasinek (Saccharomyces cerevisiae subsp. uvarum), která dozrává pod peÄlivým dohledem sládků, otváří tu nejjemnÄ›jší souÄást lahodné chuti naÅ¡eho piva. K výrobÄ› naÅ¡eho piva jsou použity jen ty nejkvalitnÄ›jší suroviny a každá z nich je pro jeho unikátní chuÅ¥ neménÄ› důležitá. Panensky Äistá přírodní voda, která Äekala téměř 10 000 let na vysvobození z naÅ¡ich 300 m hlubokých artéských studní, dotváří jeho nezamÄ›nitelnou lahodnou chuÅ¥, kterou oceníte pokaždé, když se napijete. NaÅ¡e pivo vyniká dokonalou harmonickou chutí. Její základ tvoří kombinace tÄ›ch nejkvalitnÄ›jších domácích surovin a dlouholetá zkuÅ¡enost generací sládků. K výrobÄ› jsou použity jen ty nejmodernÄ›jší technologie, zároveň se vÅ¡ak úzkostlivÄ› dbá na dodržování tradiÄních výrobních postupů, aby byla zachována stále stejná, vysoká kvalita. Velký důraz je kladen na zrání („ležení“) piva, které u prémiového originálního ležáku dosahuje minimálnÄ› 90 dní, u speciálního piva Bud Super Strong až 200 dní. SamiÄí hlávky vysoce kvalitního žateckého chmele (Humulus lupulus) dÄ›lají z naÅ¡eho piva opravdovou vzácnost. Dodávají mu totiž jeho nenapodobitelný, vysoce cenÄ›ný, jemný chmelový charakter. Zrnka unikátní odrůdy moravského jeÄmene (Hordeum vulgaris), která každoroÄnÄ› pÅ™ednostnÄ› vybíráme z prvotřídních sklizní, dodávají naÅ¡emu pivu jeho nenapodobitelnou zlatavou barvu. Seznam produktů Budweiser Budvar prémiový ležák Budweiser Budvar prémiový ležák BudÄ›jovický Budvar svÄ›tlé výÄepní pivo Bud Super Strong Budweiser Budvar Free nealkoholické pivo Budweiser Budvar Free nealkoholické pivo Budweiser Budvar tmavý ležák © 2003 VÅ¡echna práva vyhrazena, BudÄ›jovický Budvar n.p. Maintenance by ÄŒeský Web, a.s. clucene-core-2.3.3.4/src/test/data/utf8text/english_utf8.txt000066400000000000000000000061051154025176300236450ustar00rootroot00000000000000MSN vs. Google and Yahoo, Round 3 Published: March 15, 2005, 7:41 PM PST By Stefanie Olsen Staff Writer, CNET News.com TrackBack Print E-mail TalkBack Microsoft CEO Steve Ballmer is expected to show off a new paid-search service on Wednesday that will eventually go toe-to-toe with rival Google and supplant partner Yahoo's advertising. As previously reported, Microsoft's Internet group is developing a pay-per-click ad-bidding system that pairs search results with sponsored text messages from advertisers. Yahoo's Overture Services currently supplies MSN with sponsored search links, which complement MSN-sold "featured sites." But the new MSN service, called AdCenter and set to roll out in Singapore and France in the coming months, will bump Overture ads in the long run and let MSN own a major source of its advertising revenue. (Microsoft splits fees collected from marketers with Overture.) News.context What's new: MSN is set to show off its version of a system for selling text ads linked to search queries and results, a direct challenge to market leaders Google and Yahoo. Bottom line: Microsoft's Internet group is hungry for a bigger piece of the multibillion-dollar ad business related to search, and the new service will eventually allow it to jettison a deal with Yahoo's Overture Services. That agreement provides ad revenue but requires MSN to split the money with Yahoo. More stories on this topic Microsoft does not have a specific date for a U.S. launch, but it envisions operating the ad network globally, said Adam Sohn, an MSN spokesman. "Call this the third leg of the search stool," said Sohn. "First, we introduced algorithmic search, then desktop (search), which is still in beta, and now the advertising platform." With the product, Microsoft will move into the mother lode of a multibillion-dollar ad business dominated by Google and Yahoo. Search-engine marketing is expected to be worth as much as $5 billion this year, and nearly $9 billion annually within four years, according to Jupiter Research. Microsoft's piece of the pie is smaller than the shares enjoyed by market leaders Yahoo and Google, and the software giant is hungry for more. Google fields 35.1 percent of the searches online, followed by Yahoo at 31.8 percent and MSN at 16 percent, according to ComScore QSearch. If the number of searches translates to the percentage of the ad market, MSN generates roughly $1.6 billion annually from search, minus the portion shared with Overture. MSN's product is far from fully baked, according to Sohn, but it could eventually crowd rivals, search engine watchers say. Given that there is a finite number of searches conducted on the Internet, and hence a limited number of opportunities to display search-related ads, MSN will grab ad dollars away from Yahoo and Google, they say. According to data from ComScore QSearch, there were roughly 4.9 billion search queries in the United States during the month of January. "The big pie of searches out there isn't getting any bigger" because of MSN's ad platform, said industry expert Danny Sullivan. "All that's Continued ... clucene-core-2.3.3.4/src/test/data/utf8text/french_utf8.txt000066400000000000000000000055701154025176300234660ustar00rootroot00000000000000réputé comédie Hitch - expert en séduction Alex Hitchens est un entremetteur (marieur) professionnel qui utilise des moyens peu orthodoxes pour coacher ses clients et jouer avec le destin. Il réussit ainsi avec succès à unir des hommes ordinaires avec des femmes extraordinaires. Malgré tout cela, Hitch ne croit pas en l'amour. Pourtant sa rencontre avec Sara, une jeune journaliste sexy qui partage les mêmes points de vue cyniques sur les relations amoureuses va les amener sur un territoire inconnu... Vidéos : bande annonce Interviews Amber Valletta Kevin James Eva Mendes Andy Tennant À propos du film Notes de production : WILL SMITH COMME JAMAIS… Will Smith est l’une des plus célèbres stars de Hollywood. Héros d’action réputé pour son charme et son humour, il n’avait cependant encore jamais joué dans une comédie romantique. James Lassiter, producteur de HITCH et associé de Will Smith dans leur société de production, Overbrook Entertainment, explique : « Cela faisait des années que nous cherchions un bon scénario de comédie romantique pour Will. Ce n’est pas aussi facile que ça en a l’air. Ce genre de scénario est finalement assez rare, et les bons le sont encore plus ! » James Lassiter et Teddy Zee ont été séduits par le scénario de Kevin Bisch, qui semblait fait pour Smith. Un « conseiller en séduction », un homme cool et sûr de lui aide, contre un peu d’argent, des hommes timides et qui ne brillent pas en société à gagner le cÅ“ur de n’importe quelle femme. James Lassiter explique : « C’est la légende urbaine parfaite : l’histoire d’un homme si charismatique qu’il peut enseigner aux autres comment s’y prendre pour séduire. « Selon la philosophie de Hitch, poursuit-il, trois jours suffisent pour mettre en lumière le « vrai vous » et conquérir la femme de vos rêves. » Teddy Zee, également producteur chez Overbrook, a lui aussi vu tout de suite le potentiel de l’histoire. « Il y a à la fois quelque chose de très urbain et de très raffiné dans ce scénario ; c’est contemporain, chic et très humain. Il faut aussi noter que l’histoire est racontée du point de vue masculin, ce qui est extrêmement rare dans les comédies romantiques. » Le scénariste Kevin Bisch a puisé son inspiration dans ses expériences personnelles à l’université. Après une suite de rendez-vous plus ou moins réussis avec différentes jeunes filles, il a réalisé qu’il finissait généralement assis au bord du lit avec elles, à feuilleter longuement des albums photos… « J’ai eu une révélation, confie-t-il en souriant. Comment avais-je pu être aussi bête ? Elles ne faisaient que tuer le temps en attendant que je les embrasse. Après ça, je me suis intéressé de près à la mécanique et au timing des débuts d’une relation avec une femme, et aux petits détails infimes… » clucene-core-2.3.3.4/src/test/data/utf8text/german_utf8.txt000066400000000000000000000034361154025176300234710ustar00rootroot00000000000000Damit können führt Damit Sie sich aus allgemein zugänglichen Quellen ungehindert "unterrichten" können und tagesaktuell informiert sind, bieten wir Ihnen in Zusammenarbeit mit nationalen und internationalen Redaktionen einen Schlagzeilenservice der Sie direkt zum jeweiligen Artikel des Herausgeber führt. Grundgesetz der Bundesrepublik Deutschland Artikel 5 Meinungs-, Informations-, Pressefreiheit; Kunst und Wissenschaft (1) Jeder hat das Recht, seine Meinung in Wort, Schrift und Bild frei zu äußern und zu verbreiten und sich aus allgemein zugänglichen Quellen ungehindert zu unterrichten. Die Pressefreiheit und die Freiheit der Berichterstattung durch Rundfunk und Film werden gewährleistet. Eine Zensur findet nicht statt. (2) Diese Rechte finden ihre Schranken in den Vorschriften der allgemeinen Gesetze, den gesetzlichen Bestimmungen zum Schutze der Jugend und in dem Recht der persönlichen Ehre. (3) Kunst und Wissenschaft, Forschung und Lehre sind frei. Die Freiheit der Lehre entbindet nicht von der Treue zur Verfassung. Anmerkung: Jeder veröffentlichte Artikel wird von Journalisten mehr oder weniger gut recherchiert. Kein Journalist ist frei von Fehlern und frei von Subjektivität seine eigene Sicht zum jeweiligen Thema darzustellen. Aus diesem Grund sollten Sie zur Meinungsbildung immer mehrere Medien nutzen. Wir hoffen Ihnen mit diesem Service dabei helfen zu können. Auf die Auswahl der Schlagzeilen hat die German News Redaktion keinen Einfluss. Alle publizierten Schlagzeilen und Einführungstexte (teaser) geben nicht unbedingt die Meinung der German News Redaktion wieder. Eine weitere Verwendung der Schlagzeilen aus German News ist nicht gestattet und kann nur durch Einwilligung des jeweiligen Herausgeber erfolgen. Die Zuordnung zur Themenauswahl erfolgt frei. clucene-core-2.3.3.4/src/test/data/utf8text/greek_utf8.txt000066400000000000000000000032541154025176300233130ustar00rootroot00000000000000στείλτε Ελληνικό Yahoo!: ΕÏγαλεία Επικοινωνίας Yahoo! Mail - Διαβάστε και στείλτε emails από οπουδήποτε στον κόσμο με το Yahoo! Mail. ΜποÏείτε να έχετε Ï€Ïόσβαση ακόμα και στον POP3 mail λογαÏιασμό σας, μέσω του Web. Yahoo! ΗμεÏολόγιο - Κάνει εÏκολη την οÏγάνωση της ημέÏας σας με τις υπενθυμίσεις, τις e-mail Ï€Ïοσκλήσεις, και τη λίστα εκκÏεμοτήτων. Yahoo! Ατζέντα - ΟÏγανώστε τις διευθÏνσεις των φίλων σας. ΜποÏείτε να μεταφέÏετε όλες τις πληÏοφοÏίες για τους φίλους σας από το Microsoft Outlook, από το Netscape Address Book ή από το Palmtop σας. Yahoo! Messenger - Στείλτε άμεσα μηνÏματα στους φίλους σας ή στους συνεÏγάτες σας. Σας στέλνει υπενθυμίσεις σε συνεÏγασία με το Yahoo! ΗμεÏολόγιο, ώστε να μη χάνετε κανένα σημαντικό ÏαντεβοÏ. Yahoo! Σημειώσεις - ΑποθηκεÏστε όλες τις σημειώσεις σας στο Web. ΤώÏα μποÏείτε να έχετε Ï€Ïόσβαση στις σημειώσεις σας από οπουδήποτε, οποιαδήποτε στιγμή. ΤώÏα στο Ελληνικό Yahoo! όλα αυτά τα εÏγαλεία είναι εντελώς δωÏεάν. Και μποÏείτε να τα έχετε για πάντα! clucene-core-2.3.3.4/src/test/data/utf8text/hebrew_utf8.txt000066400000000000000000000463531154025176300235010ustar00rootroot00000000000000ב×רצות Ale בירה נפוצה מ×ד בעיקר ב×רצות ×נגלוסקסיות, צבעה ×›×”×” ולייצורה ×ž×©×ª×ž×©×™× ×‘×©×ž×¨×™ תסיסה עילית. בירה קילקני ×”×™× ×‘×™×¨×” מסוג ×–×”. CO2 ×’×– פחמן דו חמצני הנוצר על ידי ×”×©×ž×¨×™× ×‘×ª×”×œ×™×š התסיסה. זהו ×”×’×– ×ותו ×נו ×—×©×™× ×‘×¢×ª שתיית הבירה. Lager הבירה הנפוצה ביותר בעול×, צבעה בהיר, קלה לשתיה, בעלת ×רומה קלה ונעימה, ידועה ×’× ×‘×©× Pilsner על-×©× ×”×‘×™×¨×” הצ'כית המפורסמת ולייצורה ×ž×©×ª×ž×©×™× ×‘×©×ž×¨×™ תסיסה תחתית. קרלסברג, טובורג רד וטובורג גרין הן בירה מסוג ×–×”. Stout צבעה ×›×”×” ולייצורה ×ž×©×ª×ž×©×™× ×‘×©×ž×¨×™ תסיסה עילית. בירה גינס ×”×™× ×‘×™×¨×” מסוג ×–×”. Widget התקן מיוחד שהינו למעשה מיכלון קטן המכיל ×’×– חנקן ומוחדר בעת המילוי לבקבוק ×ו לפחית של גינס Draught. ×›×©×¤×•×ª×—×™× ×ת הבקבוק ×ו הפחית, המיכלון מתבקע ומשחרר ×ת החנקן היוצר ×ת הקצף העשיר והסמיך המיוחד של גינס. ×לכוהול ×תנול, ×ו כוהל ×תילי. נוצר בזמן התסיסה של השמרי×. ב×לטיקה ב×לטיקה ×”×™× ×” המבשלה הגדולה ביותר לייצור בירה ברוסיה ו×חת מהמובילות ב×ירופה. למבשלות בירה ב×לטיקה ×¡×•×’×™× ×¨×‘×™× ×•×ž×’×•×•× ×™× ×©×œ בירה ×›×שר העיקרון המנחה ×ת המבשלה ×”×•× ×‘×™×©×•×œ בירה המבוססת על ×ž×¨×›×™×‘×™× ××™×›×•×ª×™×™× ×‘×™×•×ª×¨. מבשלות בירה ישר×ל משווקת בקבוקי ב×לטיקה 0.5 ליטר מספר 3, 4, 6 ו-9 ופחיות 0.5 ליטר מספר 5 ו-7. בירה הבירה ×”×™× ×” משקה מוגז בדרך-כלל ×לכוהולי עשוי ×ž×“×’× ×™× ×©×•× ×™×. במשך ×לפי שנות קיומה הבירה פשטה ולבשה טעמי×, ריחות ×•×¦×‘×¢×™× ×‘×”×ª×× ×œ×ž×¡×•×¨×•×ª, יכולות טכנולוגיות והתקדמות מדעית. הבירה נחשבת למשקה פופולרי בכל היבשות ובקרב כל העמי×. בירה ×œ×œ× ×לכוהול בירה שתססה בתהליך רגיל ×ך ×”×לכוהול הורחק ממנה בתהליכי זיקוק ×ו בעזרת ממברנות דוגמת Reverse Osmosis. בירה מ×לט בירה ×œ× ×›×•×”×œ×™×ª המכילה כמות של ×¡×•×›×¨×™× ×•×¢×œ כן מתוקה. הבירה יכולה לתסוס זמן קצר על מנת לסלק ×˜×¢×ž×™× ×•×¨×™×—×•×ª ××•×¤×™×™× ×™×™× ×œ×ª×™×¨×•×©. הבירה ×›×”×” לרוב בגין הוספת כמות נכבדת של לתת קלוי ×›×”×” מ×ד. בירה מתסיסה פר×ית בירה ש××™× ×” מוססת על ידי זן ×©×ž×¨×™× ×ž×•×’×“×¨ ××œ× ×¢×œ ידי ×©×ž×¨×™× ×”× ×ž×¦××™× ×‘×ווירת המבשלה. זוהי תסיסה ספונטנית המקובלת בעיקר בבלגיה. גינס בירה מסוג Stout, ×יכותית ביותר. בעלת צבע ×›×”×” מ×ד שמקורו בלתת קלוי היטב. בירה מרירה מ×ד ובעלת קצף מיוחד ועשיר הנובע מהתערובת הייחודית של חנקן ו-CO2. גינס ייחודית בבקבוק מהפכני. ב×מצעות התקן מיוחד בתוך הבקבוק ×ž×©×ª×—×¨×¨×™× ×”×’×–×™× ×¢× ×”×¤×ª×™×—×” וכך נוצר קצף עשיר וסמיך ×•×˜×¢× ×”×–×”×™× ×œ×‘×™×¨×” הנמזגת מהחבית. די×ט מ×לטי בירה שחורה די×ט מ×לטי בה הוחלף חלק גדול ×ž×”×¡×•×›×¨×™× ×©×‘×” ×‘×ž×ž×ª×™×§×™× ×ž×œ××›×•×ª×™×™× ×›×š שכמות הקלוריות בה ×”×™× ×” כמחצית מכמות הקלוריות של בירה מ×לטי רגילה ובכל מקרה ×œ× ×™×•×ª×¨ מ 20 קלוריות ל 100 מ"ל. הלתתה תהליך יצור לתת במהלכו השעורה עוברת הנבטה בתהליך מבוקר של רטיבות וטמפרטורה. תוך כדי נביטת הגרעין ×ž×™×•×¦×¨×™× ×‘×•, מסונתזי×, ×× ×–×™×ž×™× ×”×ž×¡×™×™×¢×™× ×œ×¤×¨×§ ×ת מ×גר ×”×נרגיה שבו, ×”×¢×ž×™×œ× ×™× ×”× ×ž×¦××™× ×‘×נדוספר×. בשלב ר×שון ×ž×¡×•× ×ª×–×™× ×”×× ×–×™×ž×™× ×”×ž××¤×©×¨×™× ×’×™×©×” לתוך ת××™ העמילן ×•×”× ×ž×¤×¨×§×™× ×ת דופן הת××™× ×”×ž×›×™×œ×™× ×¢×ž×™×œ×Ÿ. בשלב שני ×ž×¡×•× ×ª×–×™× ×× ×–×™×ž×™× ×”×ž×¡×™×™×¢×™× ×œ×¤×¨×§ ×ת ×”×¢×ž×™×œ× ×™× ×¢×¦×ž×, ×× ×–×™×ž×™× ×¢×ž×™×œ×•×œ×™×˜×™×™×. בשלב ×–×” מופסקת הנביטה בתהליך קלייה. תהליך ×–×” מייבש ×ת הגרעין ו"מקפי×" למעשה ×ת ×ž×¦×‘× ×©×œ ×”×נזימי×. למרות ×”×—×•× ×”×¨×‘ ×ליו נחשף הגרעין בתהליך הייבוש, חיוניות ×”×× ×–×™×ž×™× × ×©×ž×¨×ª ×ך ×”× ××™× × ×¤×¢×™×œ×™×. ×× ×–×™×ž×™× ×לה ×ž×©×ž×©×™× ×ותנו בתהליך בתחילת תהליך מיצוי ×”×¡×•×›×¨×™× ×‘×‘×™×ª הבישול במבשלת הבירה. בתחילת תהליך ×–×” ×נו ×’×•×¨×¡×™× ×”×œ×ª×ª ×•×ž×¨×˜×™×‘×™× ×ת הלתת ×‘×ž×™× ×—×ž×™×ž×™×. ×ª×”×œ×™×›×™× ×לו ×ž×¢×•×¨×¨×™× ×ת ×”×× ×–×™×ž×™× ×œ×¤×¢×•×œ×” ×•×”× ×ž×ª×—×™×œ×™× ×‘×ª×”×œ×™×›×™ פירוק ×”×¢×ž×™×œ× ×™× ×œ×¡×•×›×¨×™×. ×¡×•×›×¨×™× ×לו ישמשו ×ת שמרי הבירה במהלך תסיסתה. ×ž×©×˜×¨×™× ×©×•× ×™× ×©×œ הנבטה וקליה ×™×•×¦×¨×™× ×¡×•×’×™× ×©×•× ×™× ×©×œ לתת ×”× ×‘×“×œ×™× ×‘×¦×‘×¢× ×•×‘×˜×¢×ž× ×•×ž××¤×©×¨×™× ×œ×™×¦×•×¨ מגוון של בירות. ווינשטפן מבשלה ×‘×“×¨×•× ×ž×–×¨×— גרמניה הנחשבת למבשלה העתיקה ×‘×¢×•×œ× ×שר החלה לייצר בירה בשנת 1040. הבירה עשויה מתערובת של לתת שעורה ולתת חיטה. הבירה קלה חמצמצה ו×רומטית. בירת חיטה ×”×™× ×” בירה שבתהליך הבישול המיוחד שלה ×ž×•×¡×™×¤×™× ×œ×” חיטה ×•×©×ž×¨×™× ×‘×יכות הטובה ביותר ×•×ž×‘×“×œ×™× ×ת הבירה בתכונות הסנסוריות שלה ש×ותן ×ž×–×”×™× ×“×¨×š החושי×: ×˜×¢× ×ž×™×•×—×“ ×¢× ×רומות וניחוחות ×¤×™×¨×•×ª×™×™× ×¨×ש קצף ×חיד ומיוחד בירה לבנה ומעוננת בעלת עכירות טבעית ×חוז ×לכוהול גבוה יחסית, 5.4% חבית למה בירה מהחבית? בגלל הטע×: החשיפה הקצרה ×œ×—×•× ×‘×ª×”×œ×™×š הפסטור מש×ירה ×ת ×˜×¢× ×”×‘×™×¨×” קרוב מ×ד לטעמה המקורי. בנוסף, כתוצ××” מהמזיגה נוזל הבירה משחרר CO2 המשביח ×ת ×˜×¢× ×”×‘×™×¨×”. ×”×˜×¢× ×¤×—×•×ª מריר, יותר קליל ופחות מוגז. בירה מהחבית תמיד מוגשת בטמפרטורה הנכונה בגלל הטריות: מחזור החביות בשוק קצר ביותר ומרבית החביות נמזגות בתוך ×©×‘×•×¢×™×™× ×¢×“ חודש ×ž×™×•× ×”×ž×™×œ×•×™ כך שהבירה טרייה מ×ד. חומרי ×’×œ× ×—×•×ž×¨×™ ×”×’×œ× ×”×ž×©×ž×©×™× ×œ×™×™×¦×•×¨ בירה כוללי×: מי×, לתת, לתת קלוי, ×—×•×ž×¨×™× ×¢×ž×™×œ× ×™×™×, סוכר (לעתי×), כשות, שמרי×, חו×, CO2. ×—×•×ž×¨×™× ×¢×ž×™×œ× ×™×™× ×•×¡×•×›×¨ עמילן ממקורות ×¦×ž×—×™×™× ××—×¨×™× ×ž×©×ž×© כחומר ×’×œ× × ×•×¡×£ לייצור בירה יחד ×¢× ×”×œ×ª×ª. במערב ×ירופה ×ž×©×ª×ž×©×™× ×‘×ª×™×¨×¡, במזרח ×ירופה נעשה שימוש בתירס ובניגריה ×•×‘×ž×¦×¨×™×™× ×¡×•×¨×’×•× ×”×•× ×”×¢×ž×™×œ×Ÿ שבשימוש. ×‘×¡×•×’×™× ×ž×™×•×—×“×™× ×©×œ בירה ×ž×©×ª×ž×©×™× ×‘×—×™×˜×” (דוגמת בירה ווינשטפן). החיטה תורמת סמיכות וקצף בעיקר בבירות מסוג Ale. ניתן להוסיף סוכר ממקורות ×©×•× ×™× ×ך סוכר ×–×” ×ינו ×ª×•×¨× ×˜×¢× ×•×¦×‘×¢. תירס ו×ורז ×ž×©×ž×©×™× ×‘×™×™×¦×•×¨ בירות ×יכותיות, קלות וחזקות בעיקר מסוג Lager. חוק טוהר הבירה הגרמני משנת 1564 ×œ× ×ž×¨×©×” שימוש ×‘×—×•×ž×¨×™× ××—×¨×™× ×–×•×œ×ª לתת שעורה. ××•×œ× ×—×•×§ ×–×” ×ינו מחייב במדינות ×חרות. ×—×™×™ מדף ×—×™×™ מדף של בירה מתחלק לשלוש ×”×ריזות הקיימות בשוק. חבית: שישה ×—×•×“×©×™× ×ž×™×•× ×”×ž×™×œ×•×™ בקבוק: ×©× ×™× ×¢×©×¨ ×—×•×“×©×™× ×ž×™×•× ×”×ž×™×œ×•×™ פחית: ×©× ×™× ×¢×©×¨ ×—×•×“×©×™× ×ž×™×•× ×”×ž×™×œ×•×™ טובורג רד בירה ×›×”×” מסוג בירה Lager. הבירה מכילה 5.2% ×לכוהול, צבעה עמוק וטעמה עשיר. טובורג גרין בירה בהירה, עדינה וטעימה מסוג בירה Lager. הבירה מכילה 4.6% ×לכוהול. טעימות בירה ×ת הבירות ×˜×•×¢×ž×™× ×‘×˜×ž×¤×¨×˜×•×¨×” של 15 מע"צ ובטמפרטורה המומלצת שלהן ×›×שר כוס הטעימה שקופה ונקייה ובדומה לכוס היין, ×’× ×ž×¢×˜ מעוגלת בכדי שה×רומה ×œ× ×ª×‘×¨×—. טעימת בירה מזכירה במקצת טעימת יין: התרשמות ויזו×לית: ×ž×ª×‘×•× × ×™× ×‘×‘×™×¨×” ×•×‘×•×—× ×™× ×ת צבע, השקיפות, המר××” והקצף. הרחה: ×ž×¨×™×—×™× ×•×ž×ª×¨×©×ž×™× ×ž×”×רומות השונות. לגימה: ×˜×•×¢×ž×™× ×•×ž×’×œ×’×œ×™× ×ת הבירה בחלל הפה ×•×ž× ×™×—×™× ×œ×œ×©×•×Ÿ ×œ×˜×¢×•× ×ת קשת ×”×˜×¢×ž×™× ×ª×•×š כדי בליעתה. כוהל בנפח ×חוז הכוהל בבירה ×ž×‘×•×˜× ×‘×™×—×™×“×•×ª נפח (מ"ל לליטר) כשות (Hops) כשות הינו צמח מטפס הגדל ב×ירופה וזקוק לקור. בן דודו גדל ב×רץ כמטפס טפיל. ב×ירופה ב×רה"ב ובמדינות נוספות ×ž×’×“×œ×™× ×ותו במיוחד כחומר חשוב ליצור בירה. לכשות תפרחת קטנה בצבע ירוק ובצורת חרוט. בתחתית עלי הכותרת ×”×™×¨×•×§×™× ×ž×¦×•×™×•×ª בלוטות קטנות המייצרות חומצת ××œ×¤× ×”×™× ×”×—×•×ž×¨ הנותן ×ת ×”×˜×¢× ×”×ž×¨ לבירה, ×•×’× ×©×ž× ×™× ××ª×¨×™×™× ××¨×•×ž×˜×™×™× ×”×ª×•×¨×ž×™× ×’× ×רומה לבירה. ×§×™×™×ž×™× ×–× ×™× ×©×•× ×™× ×©×œ כשות ולכל ×חד הריחות ×•×”×˜×¢×ž×™× ×©×œ×•. הברומ×סטר בוחר ×ת הכשות שמת×ימה לבירה שברצונו לייצר. לבד מ×רומה לכשות תכונה המעכבת גידול של חיידקי×. בעבר הוסיפו ×ת שיחי הכשות למיכל ההרתחה ××•×œ× ×›×™×•× ×¢× ×”×ª×¤×ª×—×•×ª התעשייה ×ž×•×¡×™×¤×™× ×›×•×¤×ª×™×•×ª העשויות מהתפרחת ×ו מיצוי מרוכז שלהן. לתת (Malt) גרעיני שעורה שעברו תהליך הלתתה בבתי הלתתה מיוחדי×. העמילן שבלתת קל לפירוק לסוכר הדרוש ×œ×©×ž×¨×™× ×œ×ª×¡×™×¡×”. שלבי ייצור הלתת: השריית השעורה במי×, נביטה, קלייה וייבוש, ניפוי ו×חסון. לתת קלוי לתת שתהליך הקלייה הסופי שלו מתבצע בטמפרטורה גבוהה במיוחד הגורמת להיווצרות צבע ×›×”×” ×•×˜×¢× ×§×œ×™×™×” ×ופייני. מ×לטי בירה שחורה ×œ×œ× ×לכוהול. מיוצרת מלתת קלוי המקנה לה ×ת צבעה השחור ו×ת טעמה המיוחד. ××™× ×” מכילה ×לכוהול בזכות תהליך ייצור מיוחד השונה מייצור בירה רגילה. למ×לטי תכונות ברי×ותיות רבות ומגוונות: מ×לטי ×”×•× ×ž×©×§×” ×יזוטוני הנספג במהירות במערכת העיכול ונוזלי הגוף, מ×לטי מעשיר ×ת הגוף במגוון ×¡×•×›×¨×™× ×”×ž×ª×¤×¨×§×™× ×œ×ורך זמן וכן מכילה ×•×™×˜×ž×™× ×™× ×•×ž×™× ×¨×œ×™× ×”×ž×¡×™×™×¢×™× ×œ×ª×¤×§×•×“ מערכות הגוף. מילוי ×ספטי תהליך מילוי ייחודי של משקה לתוך ×”×ריזה בצורה המונעת ×–×™×”×•× ×”×ž×©×§×” ×”×ריזה ×ו הפקק, לקבלת ×ריזה סטרילית. מילוי קר מילוי של משק×ות לתוך ××¨×™×–×ª× ×‘×˜×ž×¤×¨×˜×•×¨×” נמוכה. משק×ות ×ž×•×’×–×™× ×—×™×™×‘×™× ×œ×ž×œ× ×‘×˜×ž×¤×¨×˜×•×¨×” נמוכה כדי למנוע "בריחת" ×”×’×– במהלך המילוי. ×ž×™× ×ž×™× ×”× ×œ×›×ורה חומר ×’×œ× ×¤×©×•×˜ ביותר ×ך ×œ× ×›×š הדבר. יש חשיבות להרכב ×”×ž×™× ×•×œ×ž×•×ž×¡×™× ×”×ž×¦×•×™×™× ×‘×”×. ×ž×™× ×¨×›×™×, ×”×ž×›×™×œ×™× ×›×ž×•×ª קטנה של סידן מת××™×ž×™× ×œ×™×¦×•×¨ בירות מסוג Lager ו-Pilsner (בירות של תסיסה עילית). העיר פילזן שבצ'×›×™×” ידועה בכל ×”×¢×•×œ× ×‘×ž×™× ×”×˜×•×‘×™× ×©×œ×” המת××™×ž×™× ×ž×ד ליצור בירות מסוג ×–×” (ומכ×ן ×’× ×”×©× Pilsner). ×ž×™× ×§×©×™×, ×”×ž×›×™×œ×™× ×”×¨×‘×” סידן מת××™×ž×™× ×œ×™×¦×•×¨ הבירות מסוג Ale ו-Stout (בירות של תסיסה עילית הנפוצות ב××™×™× ×”×‘×¨×™×˜×™×™×). ערך ברי×ותי לבירה ערך ברי×ותי בשני ×ª×—×•×ž×™× ×—×©×•×‘×™×: 1. זירוז פעילות מערכת השתן והכליות בגוף ×”×ד×. 2. מניעת מחלות בכל ×”×“× ×•×”×œ×‘. ערך קלורי בירה ××™× ×” משמינה יותר ממשקה קל רגיל וברוב ×”×ž×§×¨×™× ××£ מכילה פחות קלוריות. השוו×ת ערך קלורי של משק×ות ל-100 מ"ל משקה: בירה קרלסברג: 43 בירה טובורג גרין: 39 בירה מ×לטי: 35 בירה מ×לטי די×ט: 18 חלב 1% שומן: 41 חלב 3% שומן: 57 משק×ות ×§×œ×™× ×•×ž×™×¦×™×: 40-50 × ×§×˜×¨×™× ×©×•× ×™×: 45-55 ערך תזונתי בירה מיוצרת ×ž×—×•×ž×¨×™× ×˜×‘×¢×™×™× ×‘×œ×‘×“! ×ין בה ×—×•×ž×¨×™× ×ž×œ××›×•×ª×™×™× ×•×—×•×ž×¨×™× ×ž×©×ž×¨×™×. בירה מכילה ×ž×™× ×¨×œ×™× ×•×•×™×˜×ž×™× ×™× ×¨×‘×™× ×›×’×•×Ÿ ×שלגן, סידן ×ž×’× ×–×™×•× ×•×–×¨×—×Ÿ. ×›×•×œ× ×—×•×ž×¨×™× ×—×™×•× ×™×™× ×œ×’×•×£ ×”×ד×. הרכב תזונתי ל-100 מ"ל בירה קלוריות: 43 שומני×: 0 ×—×œ×‘×•× ×™× (גר×): 0.1 פחמימות (גר×): 4 ×לכוהול (גר×): 3.9 פסטור פסטור בירה ×‘×‘×§×‘×•×§×™× ×•×‘×¤×—×™×•×ª נועד לשמר ×ת הבירה לתקופת ×—×™×™ המדף שלה על-ידי השמדת כל המיקרו××•×¨×’× ×™×–×ž×™× ×”× ×ž×¦××™× ×‘×ריזה. תהליך הפסטור ×”×•×ž×¦× ×¢×œ-ידי לו××™ פסטר ועיקרו ×—×™×ž×•× ×”×‘×™×¨×” לטמפרטורה של 60-70 מעלות צלזיוס למשך מספר דקות. מכיוון ×©×—×•× ×¤×•×’×¢ ×‘×˜×¢× ×”×‘×™×¨×”, על ×”×—×™×ž×•× ×œ×”×™×•×ª קצר ככל ×”×פשר. פסטור בירה בבקבוקי×/פחיות מתבצע במנהרת פסטור מיוחדת על-ידי התזת ×ž×™× ×—×ž×™× ×¢×œ ×”×ריזות ל×חר המילוי והפיקוק. ×”×ž×™× ×ž×—×ž×ž×™× ×ת הבירה עד לפסטורה ול×חר מכן ×ž×§×¨×¨×™× ×ותה על-ידי התזת ×ž×™× ×§×¨×™×. פרוקטוז סוכר פירות צלילות שקיפות הבירה. בגמר תהליך התסיסה הבירה עכורה בשל ×”×©×ž×¨×™× ×©×‘×”. ×”×©×ž×¨×™× ×ž×•×¤×¨×“×™× ×œ×§×‘×œ×ª בירה צלולה. קילקני בירה ×ירית מסוג Ale, עדינה מ×ד וקלה לשתיה. מבית גינס העולמית. צבעה ××“×•× ×¢×ž×•×§ ×•×”×™× ×ž×™×•×¦×¨×ª מ-100% מ×לט ×ירי משובח. טמפרטורת ההגשה שלה נמוכה (4-6 מעלות). מ×פייני הבירה ×”× ×ž×–×™×’×ª×” הייחודית ושילוב ×”×’×–×™×, חנקן ו-CO2 מעניק לבירה ר×ש קצף עדין הנשמר ל×ורך זמן. קצף הקצף הינו תכונה חשובה של הבירה ×•×ª×•×¨× ×œ×ž×¨××” ולהנ××” ממנה. הקצף נוצר על ידי ×”×—×œ×‘×•× ×™× ×©×‘×‘×™×¨×” וגז ×”-CO2. קרלסברג בירה בהירה ומשובחת ביותר מסוג בירה Lager. בעלת ×˜×¢× ×•×יכות ×ž×™×•×—×“×™× ×©×”×§× ×• לה ×©× ×¢×•×œ×ž×™ בשוק הבירות. מיוצרת עפ"×™ המסורת הדנית הידועה ומכילה 5.0% ×לכוהול. קרמל סוכר שרוף המקנה למשק×ות צבע ×›×”×” ×•×˜×¢× ×™×™×—×•×“×™ (קרמלי) שמרי בירה ×”×©×ž×¨×™× ×”× ××•×ª× ×ž×™×§×¨×•××•×¨×’× ×™×–×ž×™× ×”×ž×¡×•×’×œ×™× ×œ×”×ª×¡×™×¡ סוכר לגז ול×לכוהול. ×”×©×ž×¨×™× ×ž×ª×¡×™×¡×™× ×ת הסוכר לצורך הפקת ×נרגיה ×œ×’×“×™×œ×ª× ×•×”×ª×¨×‘×•×ª×. ××•×œ× ×ª×•×š כדי תהליך התסיסה ×”× ×’× ×ž×™×™×¦×¨×™× ×•×ž×¤×¨×™×©×™× ×ž×ות רבות של ×—×•×ž×¨×™× ×”× ×•×ª× ×™× ×‘×™×—×“ ×ת ×”×˜×¢× ×”×ופייני לבירה. ×™×©× × ×–× ×™× ×©×•× ×™× ×•×¨×‘×™× ×©×œ שמרי×. לכל מבשלה ×”×©×ž×¨×™× ×”×ž×™×•×—×“×™× ×©×œ×”. כל ×”×©×ž×¨×™× ×ž×©×ª×™×™×›×™× ×œ×ž×©×¤×—×ª ×©×ž×¨×™× ×”× ×§×¨×ת Saccharomyces על ×©×•× ×™×›×•×œ×ª× ×œ×”×ª×¡×™×¡ סוכר. במבשלות קרלסברג שבקופנהגן, דנמרק, פותחה לר×שונה בעול×, לפני ×› 150 שנה, שיטת "התרבית ×”× ×§×™×”" (Pure Culture) ×©×”×™× ×בן יסוד למיקרוביולוגיה המודרנית. השמר הר×שון שבודד בשיטה זו × ×§×¨× ×¢×œ כן Saccharomyces Carlsbergnesis ×•×”×•× ×”×©×ž×¨ המשמש עד ×”×™×•× ×œ×™×¦×•×¨ בירה קרלסברג ×‘×¢×•×œ× ×›×•×œ×• ×•×’× ×‘×ž×‘×©×œ×•×ª בירה ישר×ל בע"מ שב×שקלון. שעורה סוג של דגן ממנו ×¢×•×©×™× ×œ×ª×ª המשמש לייצור בירה. תסיסה עילית בסוג תסיסה ×–×” ×”×©×ž×¨×™× ×¢×•×œ×™× ×œ×¨×ש מיכל התסיסה בגמר התהליך. טמפרטורת התסיסה גבוהה בין 15-22 מעלות, משך התסיסה קצר בין 3-8 ×™×ž×™× ×•×רומת הבירה ×”×™× ×©×œ פירות. הבירות ממשפחה זו ×ž×§×•×¨× ×‘××™×™× ×”×‘×¨×™×˜×™×, ×נגליה, ×ירלנד וסקוטלנד וכן בירות מיוחדות מבלגיה, הולנד וגרמניה. סוגי בירות ×לו נקר××™× Ale ו-Stout. גינס וקילקני נמנות על הבירות המיוצרות מסוג תסיסה ×–×”. תסיסה תחתית בסוג תסיסה ×–×” ×”×©×ž×¨×™× ×©×•×§×¢×™× ×œ×ª×—×ª×™×ª מיכל התסיסה בגמר התהליך. טמפרטורת התסיסה נמוכה בין 5-15 מעלות, משך התסיסה ×רוך בין 2-12 שבועות ו×רומת הבירה ×”×™× ×©×œ פרחי×. בירות ×לה נפוצות ×‘×¢×•×œ× ×•×ž×§×•×¨×Ÿ בצ'×›×™×”, גרמניה, דנמרק והולנד. הבירות הנפוצות ממשפחה זו הן בירה ×”-Lager וה-Pilsner. בירות בהירות, קלות לשתיה ובעלות ×רומה קלה ונעימה. קרלסברג, טובורג רד וטובורג גרין נמנות על הבירות המיוצרות מסוג תסיסה ×–×”. clucene-core-2.3.3.4/src/test/data/utf8text/japanese_utf8.txt000066400000000000000000000121621154025176300240020ustar00rootroot00000000000000見学 1 ページ / 2 ページ 次㸠7月22・23日を利用ã—ã¦ï¼ŒPlzen ã«ã„ã£ã¦ãã¾ã—ãŸï¼Žãƒ¡ã‚¤ãƒ³ã¯ã“ã®ãƒ“ールåšç‰©é¤¨ï¼†å·¥å ´è¦‹å­¦ï¼Žã¤ã„ã§ã«å‘³è¦‹ã‚‚.ã¨ã¦ã‚‚èˆˆå‘³æ·±ã„æ—¥ã‚’éŽã”ã™ã“ã¨ãŒå‡ºæ¥ã¾ã—ãŸï¼Ž  多ãã®æ–¹ãŒã”å­˜ã˜ã¨æ€ã„ã¾ã™ãŒï¼Œã“ã®Plzensky Prazdroj (プルゼーニュスキー・プラズドロイ)ã¯ï¼Œãƒ‰ã‚¤ãƒ„・ミュンヘンã‹ã‚‰ï¼‘842年ã«å°Žå…¥ã•れãŸä½Žæ¸©ä¸‹ã«ãŠã‘る「下é¢ç™ºé…µã€ã¨ã„ã†é†¸é€ æŠ€è¡“ãŒï¼Œã“ã®åœŸåœ°ã®éº¦ãƒ»ãƒ›ãƒƒãƒ—・水・風土ã¨ã†ã¾ã調和ã—,ã¾ãŸäººã€…ã®å¤§ããªåŠªåŠ›ã«ã‚ˆã£ã¦ã¾ã•ã«èб開ã„ãŸãã®å…ƒç¥–ã®ãƒ“ールã§ã™ï¼Žä»Šæ—¥ã€Œãƒ”ルスナービールã€ã¨å‘¼ã°ã‚Œã‚‹ãƒ“ールãŒï¼Œä¸–界ã®å¤§ããªå‹¢åŠ›ã¨ãªã£ã¦ã„ã¾ã™ãŒï¼Œãã®ã€Œãƒ”ルスナーã€ã¨ã¯ã“ã®Plzen(プルゼーニュ)ã¨ã„ã†è¡—ã®ãƒ‰ã‚¤ãƒ„å,Pilsen(ピルゼン)ã®ï¼Œã¨ã„ã†æ„味ã§ã™ï¼Ž  ãã®é‡åŽšãªï¼Œã—ã‹ã—爽やã‹ã§é£²ã¿è¶Šã—ã®ã„ã„ビールã¯ï¼Œé£²ã‚“ã äººã™ã¹ã¦ãŒä¸–界最高ã®ãƒ“ールã§ã‚ã‚‹ã¨ã„ã†ã§ã—ょã†ï¼Žéº¦ã¨æ°´ã¨ãƒ›ãƒƒãƒ—ã ã‘ã‹ã‚‰ç¹°ã‚Šå‡ºã•れるã“ã®å‘³ã¯æœ¬å½“ã«å¿˜ã‚Œã‚‰ã‚Œãªã„ã‚‚ã®ã§ã™ï¼Ž  ã¡ãªã¿ã«ï¼Œã“ã®ãƒ“ール,特ã«ãƒãƒªãƒ³ã‚°åº¦ï¼ˆæœ€åˆã«ãƒ¢ãƒ«ãƒˆã‹ã‚‰ã¨ã‚‹éº¦æ±ã‚’æ°´ã§ã‚ã£ãŸã¨ãã®éº¦æ±æ¿ƒåº¦ï¼‰ãŒï¼‘ï¼’ï¼…ã®ã‚‚ã®ï¼ˆPrazdroj ã§ã¯ãã®ä¸‹ã¯ï¼‘ï¼ï¼…,一般ã«ï¼‘ï¼’ï¼…ã‚’è¶Šãˆã‚‹ã‚‚ã®ã¯å°‘ãªã„)ã¯ï¼Œã®ã©ãŒæ¸‡ã„ãŸã‹ã‚‰ä¸€æ°—ã«é£²ã‚€ï¼Œã¨ã„ã†ã‚ˆã†ãªé£²ã¿æ–¹ã¯ã‚‚ã¯ã‚„出æ¥ãšï¼Œã‚€ã—ã‚パンã®ä»£ã‚りã«å°‘ã—ãšã¤ã”ãã”ã飲む,ã¨ã„ã†ã®ãŒã¡ã‚‡ã†ã©ã„ã„よã†ã§ã™ï¼ŽãŸãã•ん飲むã¨ã‚‚ã®ã™ã”ãã®ã©ãŒæ¸‡ãã®ã§ï¼Œã®ã©ã‚’潤ã™ã«ã¯ã‚€ã—ã‚良ããªã„ã‹ã‚‚ã—れã¾ã›ã‚“.ã—ã‹ã—æ­´å²çš„ã«è¦‹ã‚‹ã¨ï¼Œã‚­ãƒªã‚¹ãƒˆæ•™ã§ã¯ã€Œãƒ“ãƒ¼ãƒ«ã¯æ¶²ä½“ã®ãƒ‘ンã€ã¨ã—ã¦é‡è¦ãªå½¹å‰²ã‚’ã—ã¦ã„ã¾ã™ï¼Žãƒ¯ã‚¤ãƒ³ã¯ã‚­ãƒªã‚¹ãƒˆã®è¡€ï¼Œãƒ‘ンã¯ã‚­ãƒªã‚¹ãƒˆã®è‚‰ï¼Œãƒ“ãƒ¼ãƒ«ã¯æ¶²ä½“ã®ãƒ‘ン,ã§ã™ï¼Žå®Ÿéš›ï¼Œä¿®é“院ãªã©ã§ã¯æ–­é£ŸæœŸé–“ã«æ°´ã®ä»£ã‚りã®ãƒ“ãƒ¼ãƒ«ã§æ „養を補給ã—ã¦ã„ãŸã¨ã„ã†è©±ã‚‚ã‚り,時代ã«ã‚ˆã£ã¦ã¯é†¸é€ ã®è¨±å¯ãŒæ•™ä¼šé–¢ä¿‚ã ã‘ã«ä¸Žãˆã‚‰ã‚Œã¦ã„ãŸã‚Šï¼Œã¾ãŸæ•™ä¼šãŒå…許ã®äº¤ä»˜æ¨©ã‚’æŒã£ã¦ã„ãŸã‚Šï¼Œã¨ã„ã†ã‚‚ã‚りã¾ã—ãŸï¼Ž  工場ã«è¡Œã£ã¦ã¿ã‚‹ã¨ï¼Œä¸€é¢ãƒ¢ãƒ«ãƒˆã‚’煮出ã—ã¦ã„る匂ã„ãŒã—ã¦ï¼Œã‚~ã‚,麦ã ã,ã¨ã„ã†æ„Ÿã˜ãŒã—ã¾ã™ï¼Žä¸–界中ã‹ã‚‰å¹´é–“5万人もã®äººãŒè¨ªã‚Œã‚‹ã¨ã„ã†ã“ã®ãƒ“ールåšç‰©é¤¨å…±ã€…,我々ビールã®ã¿ã«ã‚‚,ã¾ãŸãã†ã§ãªã„人ã«ã¨ã£ã¦ã‚‚大変興味深ã„ã‚‚ã®ã ã¨æ€ã„ã¾ã™ï¼Ž   ã“ã®ãƒšãƒ¼ã‚¸ã®å†™çœŸã‚‚,クリックã™ã‚‹ã¨å¤§ããªåŽŸç‰ˆãŒè¦‹ã‚‰ã‚Œã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ï¼Žã‚‚ã®ã™ã”ã大ãã„ã§ã™ãŒï¼Œè‰¯ã‹ã£ãŸã‚‰ãã¡ã‚‰ã‚‚ã”覧下ã•ã„. ã“れ㌠Plzen 旧市街ã«ã‚る「ビール醸造åšç‰©é¤¨ã€ã§ã™ï¼Žæ˜”実際ã«ãƒ“ールã®é†¸é€ æ‰€ã§ã‚り,パブã¨ã—ã¦ä½¿ã‚れãŸã“ã¨ã‚‚ã‚る建物ã§ï¼Œãƒ“ールã®é†¸é€ ã®é“å…·ã‹ã‚‰æ˜”ã®è¡£è£…,ビアホールã®å†…装,ã¾ãŸåœ°ä¸‹ã«ã¯ãã®æ˜”氷を入れã¦å†·è”µåº«ã«ã—ã¦ã„ãŸè²¯è”µå€‰ã‚‚ã‚り,ã¨ã«ã‹ã見るã¨ã“ã‚ã¯ãŸãã•ã‚“ã‚りã¾ã™ï¼Ž ã“れ㯠Plzensky Prazdroj (Pilsner Urquell) ã®ä¼šç¤¾ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§é‹å–¶ã•れã¦ã„ã¾ã™ï¼Žä¸­ã«ã¯ã„ã‚‹ã¨è§£èª¬æ›¸ã‚’貸ã—ã¦ãれã¾ã™ï¼Žæ—¥æœ¬èªžã®è§£èª¬æ›¸ã‚‚ã‚りã¾ã™ï¼Ž ã“ã®å…¥ã‚Šå£ã‚’見るã¨ï¼Œã„ã‹ã«ã‚‚醸造所ã‹ãƒ‘ブã§ã™ã­ï¼Žä¸­ã«ã¯ Urquell ã®æ—¥æœ¬ã§ã®åºƒå‘Šã‚‚ã‚りã¾ã™ï¼Žã¯ã£ãりã¯ã‚ã‹ã‚Šã¾ã›ã‚“ãŒï¼Œå°åˆ·ã®æ„Ÿã˜ã‹ã‚‰ã™ã‚‹ã¨ï¼‘96ï¼å¹´ä»£ã§ã¯ãªã„ã‹ã¨æ€ã„ã¾ã™ï¼Žæ—¥æœ¬ã§ã®å•†æ¨™ç™»éŒ²è¨¼ã¨ã„ã†ã“ã¨ã§ Urquell ã®å•†æ¨™ç™»éŒ²ã®è¨¼æ›¸ãŒã‚ã‚‹ã®ã§ã™ãŒï¼Œã¡ã‚‡ã£ã¨æ„味ã®åˆ†ã‹ã‚‰ãªã„ã¨ã“ã‚ãŒã‚ã£ã¦ï¼Œè‹¥å¹²è¬Žã§ã™ï¼Ž 残念ï¼ã€€Plzensky Prazdroj ã®å·¥å ´ã®æ­£é–€ï¼ˆHistorical gate)ã§ã™ï¼Žã¡ã‚‡ã†ã©æ”¹è£…工事中ã§è‚è…Žã®æ‰€ãŒè¦‹ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸï¼Žæ—§å¸‚è¡—ã®ä¸­å¿ƒã‹ã‚‰ï¼•分ãらã„ã®ã¨ã“ã‚ã§ã™ï¼Ž ã“ã® Gate ãŒå£ç”»ã«ã—ã¦ã‚りã¾ã—ãŸï¼Ž ã“れãŒã‚ã®å·¥å ´ã§ã™ï¼Žå¤§ããªå†™çœŸã‚’ã”覧下ã•れã°ï¼Œå·¦ã®æ–¹ã«ã€€Prazdroj ã¨æ›¸ã„ã¦ã‚ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šã¾ã™ï¼Ž ã“れã¯å‰ã®å†™çœŸã®å³å´ã«å½“ãŸã‚‹ã¨ã“ã‚ã§ã™ï¼Žä»Šã¯ä½¿ã£ã¦ã„ã‚‹ã®ã‹ã©ã†ã‹ã‚ã‹ã‚Šã¾ã›ã‚“ãŒï¼ŒGate を通ã£ã¦ã“ã®å±‹æ ¹ã®ä¸‹ã¾ã§é‰„é“ã®ç·šè·¯ãŒå¼•ã‹ã‚Œã¦ãŠã‚Šï¼Œæ˜”ã¯ãれを使ã£ã¦å„地ã¸è¼¸é€ã—ã¦ã„ãŸã“ã¨ãŒã‚ã‹ã‚Šã¾ã™ï¼Ž 12時åŠé›†åˆã§ï¼Œãƒ“デオ上映ã®å¾Œå·¥å ´å†…ã®è¦‹å­¦ãƒ„アーãŒã‚りã¾ã™ï¼Žæœ€åˆã«å¤§ããªãƒœãƒ¼ãƒ‰ã§ Prazdroj ã®è£½æ³•ã«ã¤ã„ã¦èª¬æ˜ŽãŒã‚り,ãã®å¾Œå·¥å ´å†…ã®è¦‹å­¦ï¼Œã¤ã„ã§åœ°ä¸‹ã®ç™ºé…µè²¯è”µç”¨ã®å€‰ã‚’見学ã§ã™ï¼Žã¨ã¦ã‚‚寒ã‹ã£ãŸï¼Žã§ã‚‚ãã®æ¸©åº¦ã®ä¸‹ã§ã‚ã®ã‚ˆã†ãªãƒªãƒƒãƒãªãƒ“ールãŒã§ãã‚ãŒã‚‹ã®ã§ã™ï¼Žã¾ã•ã‹ã„ã„ã¨ã„ã‚れるã¨ã¯æ€ã‚ãªã‹ã£ãŸã®ã§ï¼Œå…¨ç„¶å†™çœŸã‚’撮りã¾ã›ã‚“ã§ã—ãŸãŒï¼Œä»–ã®äººãŒèžã„ãŸã‚‰OKãŒå‡ºãŸã®ã§ã¤ã„ã§ã«ã¨ã£ã¦è¦‹ã¾ã—ãŸï¼Žã“ã®ä¸­ã§ã¡ã‚‡ã†ã©ãƒ“ールãŒç™ºé…µä¸­ã§ã™ï¼Žï¼Ž clucene-core-2.3.3.4/src/test/data/utf8text/korean_utf8.txt000066400000000000000000000104431154025176300234730ustar00rootroot0000000000000010 ì¼ë¶€í„° 7ì¼ê°„ ë…ì¼ ê¸ˆ 융 í¬ ì»¤ìŠ¤ 세계를 정복할 한국기업 세계ì¼ë¥˜ë¥¼ 꿈꾸는 ì‚¼ì„±ì „ìž ì‚¼ì„±ì „ìžëŠ” 1988 ë…„ 하드디스í¬ë“œë¼ì´ë¸Œ(HDD) ì‚¬ì—…ì„ ì‹œìž‘í•œ ì´ëž˜ 지난해 처ìŒìœ¼ë¡œ.. '세빗2005' 한국관 중소업체 눈부신 성과- 머니투ë°ì´ 03/16 16:07 '세빗 2005' 한국공ë™ê´€ì— 참가한 ì¤‘ì†Œì—…ì²´ë“¤ì´ ì„ ì „ì„ ê±°ë’€ë‹¤. 지난 10 ì¼ë¶€í„° 7ì¼ê°„ ë…ì¼ í•˜ë…¸ë²„ '세빗 2005' ì—서 í•œêµ­ê´€ì— ì°¸ê°€í•œ 중소 IT ë²¤ì²˜ì—…ì²´ë“¤ì€ ìž ì • 집계 ê²°ê³¼, 수출ìƒë‹´ì•¡ì€ 12 ì–µ 5000 만달러, ê³„ì•½ê¸ˆì•¡ì€ 2 ì–µ5000 만달러를 ë„˜ì€ ê²ƒìœ¼ë¡œ ... [세빗 2005] ê±°ì›ì‹œìŠ¤í…œ, 유럽 MP3 공략 본격화- ì•„ì´ë‰´ìФ 03/16 13:20 <ì•„ì´ë‰´ìФ24> ê±°ì›ì‹œìŠ¤í…œì´ ìœ ëŸ½ MP3 기기 시장 ê³µëžµì„ ë³¸ê²©í™”í•œë‹¤. 박남규 ê±°ì›ì‹œìŠ¤í…œ ì‚¬ìž¥ì€ 15ì¼(현지시간) ë…ì¼ í•˜ë…¸ë²„ì—서 열리고 있는 세빗 2005 전시회ì—서 "ì´ë²ˆì²˜ëŸ¼ ì„¸ë¹—ì— ëŒ€í˜• 부스를 마련하기는 처ìŒ"ì´ë¼ë©° "ìœ ëŸ½ì— ì§€ì‚¬ë¥¼ 설립, ... LS그룹 "세계 ì¼ë¥˜ê¸°ì—… ë°œë‹ì›€"- 디지탈타임즈 03/15 11:07 CIì„ í¬ì‹ 가져… 국내외 브랜드 í™ë³´ ì ê·¹ 나서 LS그룹(회장 구ìží™ã†êµ¬ LG전선그룹)ì€ 14ì¼ ê·¸ëžœë“œì¸í„°ì½˜í‹°ë„¨íƒˆí˜¸í…”ì—서 가진 CI(통합기업ì´ë¯¸ì§€)ì„ í¬ì‹ì„ 통해 LS브랜드를 ëŒ€ë‚´ì™¸ì— ê³µí¬í•˜ê³ , ì‚°ì—…ìš© 전기ã†ì „ìžã†ì†Œìž¬ë¶„ì•¼ì˜ ì„¸ê³„ì¼ë¥˜ê·¸ë£¹ìœ¼ë¡œ ë„... [세빗2005]ë ˆì¸ì½¤ã†ì‚¼ì„±ì „ìž, MP3P시장 넘버3 ê²½ìŸ- 디지탈타임즈 03/15 03:57 대형 단ë…부스 설치 ê³µê²©ì  ë§ˆì¼€íŒ… 올 íŒë§¤ëª©í‘œ ìƒí–¥â€¦ 수성ã†íƒˆí™˜ ì´ë ¥ì „ ë ˆì¸ì½¤ê³¼ 삼성전ìžê°€ MP3플레ì´ì–´ 세계시장 3위ìžë¦¬ë¥¼ 놓고 격ëŒí•œë‹¤.애플과 í¬ë¦¬ì—ì´í‹°ë¸Œê°€ 1, 2위를 차지하고 있는 ê°€ìš´ë° ë‘ íšŒì‚¬ëŠ” 올해 íŒë§¤ëŒ€ìˆ˜ 목표를 ëŒ€í­ ìƒí–¥ì¡°... 세빗ì—서 확ì¸í•œ 양극화- ì´ë°ì¼ë¦¬ 03/14 16:56 세계 최대 ê·œëª¨ì˜ ì •ë³´í†µì‹  ë°•ëžŒíšŒì¸ `세빗(CeBIT)2005` ê°€ 지난주부터 ë…ì¼ í•˜ë…¸ë²„ì—서 열리고 있습니다. 지난 1ì›” 미국 ë¼ìŠ¤ë² ê°€ìŠ¤ì—서 열린 CESì— ì´ì–´ ìš°ë¦¬ë‚˜ë¼ ê¸°ì—…ë“¤ì´ ì„¸ê³„ì¸ì˜ ì£¼ëª©ì„ ë°›ì•„ ITê°•êµ­ì˜ ìœ„ìƒì„ 재차 확ì¸í•˜ëŠ” ìžë¦¬ì˜€ìŠµë‹ˆë‹¤. 하... LGì „ìž "2010ë…„ 세계톱3 기필코 달성"- 머니투ë°ì´ 03/14 15:41 "올해 ë§¤ì¶œì„ 30ì¡°ì›ìœ¼ë¡œ 늘려 글로벌 톱5 ê¸°ì—…ì— ë“¤ê³  ì´ë¥¼ 바탕으로 2010ë…„ì—는 글로벌 톱3ê°€ ëœë‹¤" LGì „ìžì˜ 중장기 비젼ì´ë‹¤.막연하게 1등 ê¸°ì—…ì´ ë˜ê² ë‹¤ëŠ” ì„ ì–¸ì— ê·¸ì¹˜ëŠ” 게 ì•„ë‹ˆë¼ êµ¬ì²´ì ì¸ 시기와 목표를 제시하고 있다. ë„ì „ 역시 만만치 ... ITì‚°ì—… 미래는 한국ì´ë‹¤ <美ì¼ê°„ì§€>- 연합뉴스 03/14 09:38 =실리콘 밸리 "í•œêµ­ì€ ë¯¸ëž˜ë¡œ 가는 타임머신" 워싱턴 박노황 íŠ¹íŒŒì› = ë¯¸êµ­ì˜ ì¼ê°„ 샌프란시스코 í¬ë¡œë‹ˆí´ì€ 13ì¼ '미래는 한국'ì´ë¼ëŠ” ì œí•˜ì˜ ê¸°ì‚¬ë¥¼ 통해 세계 ì œì¼ì˜ 광대역 ì¸í„°ë„·ë§ë° 휴대 ì „í™” ë³´ê¸‰ë¥ ì„ ëˆ„ë¦¬ê³  있는 IT ê°•êµ­ í•œêµ­ì˜ í˜„í™©ì„ ... ìžê¸°ë§Œì¡±ì— ë¹ ì§„ 소니, ì‚¼ì„±ì— íŒ¨ë°°- ë™ì•„ì¼ë³´ 03/12 09:09 ‘한국 삼성전ìžì™€ ì¼ë³¸ 소니(Sony)ì˜ ì—­ì „.’ 뉴욕타임스는 10ì¼ 1997ë…„ ì´í›„ 7ë…„ ë§Œì— ì‚¼ì„±ì „ìžì™€ ì†Œë‹ˆì˜ ìœ„ìƒì´ 뒤바뀌었다고 전했다.1997ë…„ì€ ì‚¼ì„±ì „ìžê°€ í•œêµ­ì— ëª°ì•„ë‹¥ì¹œ 외환위기ì—서 벗어나기 위해 사투를 벌ì´ë˜ 때ì´ìž 7ì¼ ì†Œë‹ˆ 최고경ì˜... [기íšíŠ¹ì§‘ - 글로벌 리ë”기업Ⅲ]LG필립스LCD- 헤럴드경제 03/11 11:41 앞선 투ìžã†ê¸°ìˆ â€¦LCD 최강ìžë¡œ 지난 2004ë…„ 7ì›”, LG필립스LCD는 한국 기업으로는 최초로 한국과 미국 ì¦ì‹œ ë™ì‹œ ìƒìž¥ì— 성공했다.ì´ëŠ” 남들보다 한발 앞선 ì ê¸° 투ìžì™€ 기술개발로 세계 TFT-LCD 업계를 ì´ëŒì–´ì˜¨ 리ë”ë¡œì„œì˜ ê¸°ì—…ê°€ì¹˜ë¥¼ 다시 한번 ... [기íšíŠ¹ì§‘ - 글로벌 리ë”기업Ⅰ] ì¼ë“±ë§Œì´ 산다- 헤럴드경제 03/11 11:41 세계 ì´ˆì¼ë¥˜ ê¸°ì—…ìœ¼ë¡œì˜ ë„ì•½ì„ ìœ„í•œ 글로벌 ê²½ì˜ì€ ì´ë¯¸ ëŒ€ê¸°ì—…ë“¤ì˜ ì„ íƒì´ 아닌 필수로 ìžë¦¬ìž¡ì•˜ë‹¤.êµ­ë‚´ ëŒ€ê¸°ì—…ë“¤ë„ ê¸€ë¡œë²Œ ê²½ì˜ì— 박차를 가해 ì´ì   글로벌 ë¦¬ë” ê¸°ì—…ìœ¼ë¡œ ìžë¦¬ë§¤ê¹€í•˜ê³  있거나 ìžë¦¬ë¥¼ 굳혀가고 있는 ê¸°ì—…ë“¤ì´ ìƒë‹¹ìˆ˜ì— ì´ë¥¸ë‹¤.... clucene-core-2.3.3.4/src/test/data/utf8text/polish_utf8.txt000066400000000000000000000153001154025176300235070ustar00rootroot00000000000000spółka Fermentacja to proces, w wyniku którego wytworzona w warzelni brzeczka staje siÄ™ piwem. Do ochÅ‚odzonej brzeczki dodawane sÄ… drożdże, które zamieniajÄ… cukier w dwutlenek wÄ™gla i alkohol. Oprócz tego drożdże formujÄ… tysiÄ…ce innych komponentów, które podczas fermentacji nadajÄ… piwu okreÅ›lony smak. Proces fermentacji prowadzimy w ogromnych, cylindrycznych, nowoczesnych zbiornikach fermentacyjnych zwanych tankofermentorami. NajwiÄ™ksze z nich mogÄ… pomieÅ›cić po 3 600 hektolitrów piwa czyli 720 000 półlitrowych butelek np. piwa Frater. W celu zapewnienia optymalnych temperatur dla procesu fermentacji tanki muszÄ… być chÅ‚odzone. Po procesie fermentacji piwo zwane "piwem mÅ‚odym" musi otrzymać swój peÅ‚ny smak. Odbywa siÄ™ to podczas nastÄ™pnego cyklu produkcyjnego, jakim jest leżakowanie (dojrzewanie) w temperaturach minusowych. CaÅ‚y proces fermentacji i dojrzewania zajmuje okoÅ‚o dwóch - trzech tygodni. drożdży spółka 3 marca 2004 roku Browar Belgia i spółka Dominium, reprezentujÄ…ca Opactwo o.o. Cystersów w Szczyrzycu, podpisali kontrakt na produkcjÄ™ piwa. Umowa jest zwieÅ„czeniem kilkuletnich dziaÅ‚aÅ„ obu stron, zmierzajÄ…cych do wykorzystania unikalnej receptury. Wprowadzenie piwa Frater, warzonego wedÅ‚ug starego przepisu oznacza kontynuacjÄ™ kulturowego dziedzictwa klasztoru. Tradycyjna, wielowiekowa receptura dajÄ…ca podstawy unikalnego piwa, zostaÅ‚a połączona z nowoczesnÄ… technologiÄ…. Piwo warzone przez cystersów ze Szczyrzyca ma wielowiekowÄ… tradycjÄ™. Lata praktyki i wnikliwych obserwacji pozwoliÅ‚y zakonnikom stworzyć niepowtarzalnÄ… recepturÄ™, bÄ™dÄ…cÄ… idealnym połączeniem czterech skÅ‚adników (sÅ‚odu, wody, chmielu i drożdży). ZostaÅ‚a ona przywrócona do życia w postaci Fratera, a poprzez wykorzystani Jak wskazujÄ… zachowane dokumenty, browar w Szczyrzycu powstaÅ‚ w 1623 roku i jest jednym z najstarszych browarów w Polsce. Wedle starych kronik od poczÄ…tku XVII wieku mnisi w Szczyrzycu produkowali napój nazywany "cerewizjÄ…", robiony z palonego ziarna, cykorii, wody i chmielu. Cerewizja zawieraÅ‚a do 1 % alkoholu i byÅ‚a pita zamiast kawy i herbaty, chÅ‚odzÄ…c gardÅ‚a spragnionych rolników i mnichów pracujÄ…cych na terenach należących do opactwa. Mury w klasztorze postawiono w 1824 r., wczeÅ›niej zabudowania byÅ‚y drewniane. Do 1948 r. caÅ‚a produkcja prowadzona byÅ‚a rÄ™cznie, co pozwalaÅ‚o rozlewać rocznie 250 tys. hektolitrów zÅ‚ocistego napoju. Przez ponad sto lat piwo leżakujÄ…ce w beczkach chÅ‚odzono potężnymi blokami lodowymi wycinanymi zimÄ… z pobliskiego stawu. Lód nie roztapiaÅ‚ siÄ™ nawet latem, bo w podziemiach browaru przez caÅ‚y rok temperatura nie przekraczaÅ‚a 2 stopni C. Najlepsze czasy browaru przypadajÄ… na okres miÄ™dzy 1925 a 1945 rokiem. W 1925 roku Eugeniusz Czerny wydzierżawiÅ‚ browar. Warzono wówczas piwo "ZÅ‚oty zdrój" sÅ‚ynÄ…ce z wyjÄ…tkowego smaku i rozsÅ‚awione sloganem "Mocne jak gÅ‚os kuryera, sÅ‚odkie jak gÅ‚os Kiepury". ZachowaÅ‚o siÄ™ wiele pamiÄ…tek z tego okresu jak specjalne kufle z pokrywkami i etykiety. Można je obejrzeć w przyklasztornym muzeum. Czerny kontynuowaÅ‚ produkcjÄ™ do koÅ„ca II wojny Å›wiatowej. W 1939 r. zakÅ‚ad przejÄ™li Niemcy, pozwalajÄ…c na kontynuowanie nadal produkcji pod okiem Czernego. W 1951 roku wiÄ™kszość majÄ…tku browaru przejęło paÅ„stwo. Wówczas byÅ‚ to jedyny klasztorny browar miÄ™dzy ÅabÄ… a WÅ‚adywostokiem. W latach powojennych browar podupadÅ‚. Piwo, sprzedawane pod najróżniejszymi wymyÅ›lnymi nazwami ("Czarny Mnich", "Pils Klasztorny", "Eliksir", "Dama Pik", "Gryf"), nie cieszyÅ‚o siÄ™ uznaniem smakoszy. Piwo produkowane w Szczyrzycu, można byÅ‚o kupić tylko w okolicznych miejscowoÅ›ciach: Limanowej, MyÅ›lenicach, Rabce. W 1993 r. Opactwo Ojców Cystersów odzyskaÅ‚o browar i kontynuowaÅ‚o produkcjÄ™ piwa. Pomieszczenia zakÅ‚adu, choć nie byÅ‚y zdewastowane, wymagaÅ‚y gruntownego remontu. Podobnie jak i urzÄ…dzenia. Nie daÅ‚o siÄ™ na nich produkować dobrej jakoÅ›ci piwa, a szczególnie tego, jakie byÅ‚o warzone w przeszÅ‚oÅ›ci. Opactwo, nie chcÄ…c firmować swoim wizerunkiem tak zÅ‚ej jakoÅ›ci produktu, nie posiadajÄ…c Å›rodków na remont urzÄ…dzeÅ„ i obiektu, postanowiÅ‚o zaprzestać produkcji. W 1996 r. browar, po 373 (!) latach nieprzerwanej pracy, zakoÅ„czyÅ‚ produkcjÄ™ piwa, a wkrótce potem zostaÅ‚ zamkniÄ™ty. Piwo jest jednym z najstarszych napojów znanych ludzkoÅ›ci. Warzono je już w starożytnym Egipcie. Pierwsze piwa o niewielkiej zawartoÅ›ci alkoholu przyrzÄ…dzano z wieloma dodatkami, a ich głównym przeznaczeniem byÅ‚o gaszenie pragnienia. Napój ten nierozerwalnie wiąże siÄ™ z tradycjami religijnymi. W starożytnym Egipcie byÅ‚ warzony przez kapÅ‚anów, a w Å›redniowiecznej Europie przez mnichów zakonnych. Od XI wieku piwo byÅ‚o warzone przez setki mnichów z caÅ‚ego Å›wiata. W Polsce warzelnictwo na dużą skalÄ™ zapoczÄ…tkowali cystersi w XIII w. W Europie wielkim powodzeniem cieszÄ… siÄ™ od dziesiÄ™cioleci tzw. piwa klasztorne. W wielu zakonach zaÅ‚ożonych w Å›redniowieczu mnisi instalowali warzelnie, w których produkowali piwo wedÅ‚ug wÅ‚asnych receptur cieszÄ…ce siÄ™ powodzeniem. Niektóre po wielu latach dziaÅ‚ania z powodu problemów finansowych oddawaÅ‚y licencjÄ™ innym, nie klasztornym browarom, i w ten sposób "religijne" piwo trafiÅ‚o na komercyjny rynek. Najbardziej znane marki klasztorne to Leffe, Grimbergen i Steenbrugge (współpracujÄ…cy z Palm Breweries). Chwila, na którÄ… czekasz przez caÅ‚y dzieÅ„. Ciche westchnienie, towarzyszÄ…ce otwarciu chÅ‚odnej butelki. Głęboki, zÅ‚ocisty kolor, przyjemny, naturalny aromat, a już po chwili lekki, szlachetny smak. Na tÄ™ chwilÄ™ warto byÅ‚o czekać. Frater. Piwo, którego duch wywodzi siÄ™ z głębi cysterskich manuskryptów, a charakter nadaje mu współczesne pojmowanie szlachetnej sztuki warzenia. W poczÄ…tkach minionego milennium na ziemie polskie przybyli z zachodu pierwsi mnisi. WÅ›ród rozlicznych praktykowanych w zakonach nauk i sztuk poczesne miejsce zajmowaÅ‚a sztuka warzenia piwa. Wraz z zakapturzonymi braćmi przybyÅ‚ do Polski ten znakomity, zÅ‚ocisty napój oraz pnÄ…ce siÄ™ po zakonnych murach szlachetne odmiany chmielu. W XIII wieku w malowniczej podbeskidzkiej miejscowoÅ›ci Szczyrzyc powstaÅ‚o cysterskie opactwo. Zgodnie z regułą część czasu mnisi poÅ›wiÄ™cali na wytężonÄ… pracÄ™, której efektem byÅ‚o sÅ‚ynÄ…ce z niezrównanego smaku, starannie warzone zÅ‚ociste piwo. MÄ…drość gromadzona przez stulecia pozwoliÅ‚a stworzyć szlachetny, zÅ‚ocisty napój, który prócz barwy, smaku iaromatu prawdziwego pilsnera, ma również duszÄ™. TajemnicÄ™, którÄ… odkrywasz z każdym jego Å‚ykiem. Spróbuj w peÅ‚ni docenić tÄ™ chwilÄ™ prawdziwej, peÅ‚nej, głębokiej przyjemnoÅ›ci. clucene-core-2.3.3.4/src/test/data/utf8text/russian_utf8.txt000066400000000000000000000021061154025176300236750ustar00rootroot00000000000000Великие тайны наших любимцев ИÑточник: ПРÐВДÐ.Ру ПоÑтоÑнный адреÑ: http://www.pravda.ru/science/2004/6/20/55/18599_animals.html ЧудÑÑ‚ не только люди, но и домашние питомцы. Мы решили пополнить «каталог иÑторий» о Ñтранных выходках кошек, Ñобак, птичек и другой живноÑти, обитающей по ÑоÑедÑтву Ñ Ñ‡ÐµÐ»Ð¾Ð²ÐµÑ‡ÐµÑтвом Когда зоопÑихологов проÑÑÑ‚ объÑÑнить ÑтранноÑти в поведении животных или их неожиданно фантаÑтичеÑкую прозорливоÑть, они чеÑтно признаютÑÑ, что не в Ñилах дать разумное иÑтолкование даже Ñравнительно чаÑто вÑтречающимÑÑ Ð¸ опиÑанным в ÑоответÑтвующей литературе отклонениÑм в поведении домашних животных. clucene-core-2.3.3.4/src/test/debug/000077500000000000000000000000001154025176300170655ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/debug/TestError.cpp000066400000000000000000000044361154025176300215310ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" //#include "CLucene/util/_ThreadLocal.h" #include "CLucene/util/Equators.h" void testError ( CuTest *tc ) { const char* msg = "test"; CLuceneError err ( 0,msg,false ); CLuceneError err2 = err; CuAssert ( tc,_T ( "Error did not copy properly" ),err.what() !=err2.what() ); CuAssert ( tc,_T ( "Error values did not correspond" ),strcmp ( err.what(),err2.what() ) ==0 ); IndexReader* reader = NULL; try { RAMDirectory dir; _CL_LDECREF(& dir); reader = IndexReader::open ( &dir,true ); } catch ( CLuceneError& ) { _CLDELETE ( reader ); } catch ( ... ) { _CLDELETE ( reader ); CuAssert ( tc,_T ( "Error did not catch properly" ),false ); } } /* typedef CL_NS(util)::ThreadLocal tlTest; struct Data{ tlTest* tl; CuTest *tc; }; _LUCENE_THREAD_FUNC ( threadLocalTest, arg ) { Data* data = (Data*)arg; CuTest *tc = data->tc; tlTest* tl = data->tl; char* val = tl->get(); CLUCENE_ASSERT(val == NULL); tl->set(STRDUP_AtoA("test")); tl->setNull(); val = _CL_NEWARRAY(char, 50); _snprintf(val, 50, "hello from thread %d", (int)_LUCENE_CURRTHREADID); tl->set(val); CLUCENE_ASSERT(tl->get() != NULL); //wait a bit until thread local deleted our data... Misc::sleep(1000); CLUCENE_ASSERT(tl->get() == NULL); } void testThreadLocal ( CuTest *tc ) { const int threadsCount = 10; //read using multiple threads... _LUCENE_THREADID_TYPE threads[threadsCount]; Data data; data.tc = tc; data.tl = _CLNEW tlTest; int i; for ( i=0;i= 0 ) this->len = length; else this->len = strlen(value); this->pos = 0; this->value = _CL_NEWARRAY(signed char, this->len); memcpy(this->value, value, this->len); } virtual ~MemReader(){ _CLDELETE_ARRAY(this->value); } int32_t read(const signed char*& start, int32_t min, int32_t max){ start = this->value + pos; int32_t r = max>min?max:min; if ( len-pos < r ) r = len-pos; pos += r; return r; } int64_t position(){ return pos; } int64_t skip(int64_t ntoskip){ int64_t s = ntoskip; if ( len-pos < s ) s = len-pos; this->pos += s; return s; } size_t size(){ return len; } }; void TestFields(CuTest *tc){ Field *f = _CLNEW Field(_T("test"), _T("value"), Field::INDEX_TOKENIZED); CLUCENE_ASSERT(f->isIndexed() && f->isTokenized()); CLUCENE_ASSERT(!f->isStored() && !f->isBinary() && !f->getOmitNorms()); _CLDELETE(f); f = _CLNEW Field(_T("test"), _T("value"), Field::STORE_YES | Field::INDEX_NONORMS); CLUCENE_ASSERT(f->isIndexed()); CLUCENE_ASSERT(!f->isTokenized()); CLUCENE_ASSERT(f->getOmitNorms()); CLUCENE_ASSERT(f->isStored() && !f->isBinary()); _CLDELETE(f); Document doc; doc.add(*_CLNEW Field(_T("f1"), _T("value"), Field::INDEX_TOKENIZED)); doc.add(*_CLNEW Field(_T("f2"), _T("value"), Field::INDEX_TOKENIZED)); doc.add(*_CLNEW Field(_T("f3"), _T("value1"), Field::INDEX_TOKENIZED)); doc.add(*_CLNEW Field(_T("f3"), _T("value2"), Field::INDEX_TOKENIZED)); doc.add(*_CLNEW Field(_T("f4"), _T("value"), Field::INDEX_TOKENIZED)); CLUCENE_ASSERT( doc.getFields()->size() == 5); _CLLDELETE(doc.fields());//just fetch the fields (to test deprecated loads) doc.removeField(_T("f3")); CLUCENE_ASSERT( doc.getFields()->size() == 4); //test deprecated enumerator DocumentFieldEnumeration* e = doc.fields(); int count = 0; while ( e->hasMoreElements() ) { Field* field4 = e->nextElement(); CLUCENE_ASSERT(field4!=NULL); count++; } CLUCENE_ASSERT(count==4); _CLDELETE(e); doc.add(*_CLNEW Field(_T("f3"), _T("value3"), Field::INDEX_TOKENIZED)); CLUCENE_ASSERT( doc.getFields()->size() == 5); //test deprecated enumerator e = doc.fields(); count = 0; while ( e->hasMoreElements() ) { Field* field5 = e->nextElement(); CLUCENE_ASSERT(field5!=NULL); count++; } CLUCENE_ASSERT(count==5); _CLDELETE(e); doc.removeFields(_T("f3")); CLUCENE_ASSERT( doc.getFields()->size() == 3); doc.removeFields(_T("f4")); CLUCENE_ASSERT( doc.getFields()->size() == 2); doc.removeFields(_T("f1")); CLUCENE_ASSERT( doc.getFields()->size() == 1); doc.removeFields(_T("f2")); CLUCENE_ASSERT( doc.getFields()->size() == 0); } /* void TestDateTools(CuTest *tc) { TCHAR* t = CL_NS(document)::DateTools::timeToString( Misc::currentTimeMillis() , CL_NS(document)::DateTools::MILLISECOND_FORMAT); _CLDELETE_ARRAY(t); TCHAR buf[30]; const TCHAR* xpt = _T("19700112102054321"); int64_t vv = (int64_t)987654321; CL_NS(document)::DateTools::timeToString( vv , CL_NS(document)::DateTools::MILLISECOND_FORMAT, buf, 30); if ( _tcscmp(buf,xpt) != 0 ) { CuFail(tc, _T("timeToString failed\n"), buf, xpt); } _CLDELETE_ARRAY(t); } */ void TestFieldSelectors(CuTest *tc){ RAMDirectory dir; const TCHAR* longStrValue = _T("too long a field..."); { WhitespaceAnalyzer a; IndexWriter w(&dir,&a,true); for (int i=0;i<3;i++){ Document doc; doc.add(*_CLNEW Field(_T("f1"), _T("value1"), Field::STORE_YES)); doc.add(*_CLNEW Field(_T("f2"), _T("value2"), Field::STORE_YES)); doc.add(*_CLNEW Field(_T("f3"), _T("value3"), Field::STORE_YES)); doc.add(*_CLNEW Field(_T("f4"), _T("value4"), Field::STORE_YES)); doc.add(*_CLNEW Field(_T("f5"), longStrValue, Field::STORE_YES)); w.addDocument(&doc); } w.flush(); } IndexReader* reader = IndexReader::open(&dir); MapFieldSelector fieldsToLoad; fieldsToLoad.add(_T("f2"), FieldSelector::LOAD ); fieldsToLoad.add(_T("f3"), FieldSelector::LAZY_LOAD ); fieldsToLoad.add(_T("f5"), FieldSelector::SIZE ); Document doc; CLUCENE_ASSERT(reader->document(0,doc,&fieldsToLoad)); CLUCENE_ASSERT(doc.getFields()->size()==3); CuAssertStrEquals(tc,_T("check f2"), _T("value2"), doc.get(_T("f2")) ); CuAssertStrEquals(tc,_T("check f3"), _T("value3"), doc.get(_T("f3")) ); Field* byteField = doc.getField(_T("f5")); const ValueArray& bytes = *byteField->binaryValue(); uint32_t shouldBeInt = 2 * _tcslen(longStrValue); ValueArray shouldBe(4); shouldBe[0] = (uint8_t) (shouldBeInt>>24); shouldBe[1] = (uint8_t) (shouldBeInt>>16); shouldBe[2] = (uint8_t) (shouldBeInt>> 8); shouldBe[3] = (uint8_t) shouldBeInt ; CLUCENE_ASSERT(byteField!=NULL); CLUCENE_ASSERT(memcmp(shouldBe.values,bytes.values,4)==0); _CLDELETE(reader); _CL_LDECREF(&dir); //derefence since we are on the stack... } void _TestDocumentWithOptions(CuTest *tc, int storeBit, FieldSelector::FieldSelectorResult fieldSelectorBit){ char factbook[1024]; strcpy(factbook, clucene_data_location); strcat(factbook, "/reuters-21578/feldman-cia-worldfactbook-data.txt"); CuAssert(tc,_T("Factbook file does not exist"),Misc::dir_Exists(factbook)); Document doc; Field* f; const TCHAR *_ts, *_ts2; const ValueArray* strm; RAMDirectory ram; const char* areaderString = "a binary field"; const TCHAR* treaderString = _T("a string reader field"); size_t readerStringLen = strlen(areaderString); SimpleAnalyzer an; IndexWriter writer(&ram,&an,true); //no analyzer needed since we are not indexing... ValueArray b( (uint8_t*)strdup(areaderString), strlen(areaderString) ); //use binary utf8 doc.add( *_CLNEW Field(_T("binaryField"), &b, Field::TERMVECTOR_NO | storeBit | Field::INDEX_NO,true) ); writer.addDocument(&doc); doc.clear(); //use reader doc.add( *_CLNEW Field(_T("readerField"),_CLNEW StringReader (treaderString), Field::TERMVECTOR_NO | storeBit | Field::INDEX_NO) ); writer.addDocument(&doc); doc.clear(); //done adding a few documents, now try and add a few more... writer.optimize(); //use big file doc.add( *_CLNEW Field(_T("fileField"), _CLNEW FileReader(factbook, SimpleInputStreamReader::ASCII), Field::TERMVECTOR_NO | storeBit | Field::INDEX_NO) ); writer.addDocument(&doc); doc.clear(); //another optimise... writer.optimize(); writer.close(); IndexReader* reader = IndexReader::open(&ram); MapFieldSelector fieldsToLoad; fieldsToLoad.add(_T("fileField"), fieldSelectorBit ); fieldsToLoad.add(_T("readerField"), fieldSelectorBit ); fieldsToLoad.add(_T("binaryField"), fieldSelectorBit ); //now check binary field reader->document(0, doc); f = doc.getField(_T("binaryField")); strm = f->binaryValue(); CuAssertIntEquals(tc, _T("Check binary length is correct"), readerStringLen, b.length); for ( size_t i=0;idocument(1, doc); f = doc.getField(_T("readerField")); _ts = f->stringValue(); CuAssertStrEquals( tc, _T("Check readerField length is correct"), treaderString, _ts); doc.clear(); //now check the large field field reader->document(2, doc); f = doc.getField(_T("fileField")); _ts = f->stringValue(); FileReader fbStream(factbook, FileReader::ASCII); int i=0; _ts2 = NULL; do{ int32_t rd = fbStream.read(_ts2,1,1); if ( rd == -1 ) break; CLUCENE_ASSERT(rd==1); CLUCENE_ASSERT(_ts[i]==*_ts2); i++; }while(true); CLUCENE_ASSERT(i == _tcslen(_ts)); doc.clear(); reader->close(); _CLDELETE(reader); _CL_LDECREF(&ram); //this is in the stack... } void TestBinaryDocument(CuTest *tc){ _TestDocumentWithOptions(tc, Field::STORE_YES, FieldSelector::LOAD); } void TestCompressedDocument(CuTest *tc){ _TestDocumentWithOptions(tc, Field::STORE_COMPRESS, FieldSelector::LOAD); } void TestLazyBinaryDocument(CuTest *tc){ _TestDocumentWithOptions(tc, Field::STORE_YES, FieldSelector::LAZY_LOAD); } void TestLazyCompressedDocument(CuTest *tc){ _TestDocumentWithOptions(tc, Field::STORE_COMPRESS, FieldSelector::LAZY_LOAD); } CuSuite *testdocument(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Document Test")); SUITE_ADD_TEST(suite, TestCompressedDocument); SUITE_ADD_TEST(suite, TestBinaryDocument); SUITE_ADD_TEST(suite, TestLazyCompressedDocument); SUITE_ADD_TEST(suite, TestLazyBinaryDocument); SUITE_ADD_TEST(suite, TestFieldSelectors); SUITE_ADD_TEST(suite, TestFields); //SUITE_ADD_TEST(suite, TestDateTools); return suite; } clucene-core-2.3.3.4/src/test/document/TestField.cpp000066400000000000000000000040071154025176300222050ustar00rootroot00000000000000#include "test.h" #include "CLucene/_SharedHeader.h" CL_NS_USE(document); void testFieldConfig(CuTest* tc) { Field termVector(_T("name"), _T("value"), Field::INDEX_TOKENIZED | Field::TERMVECTOR_YES); Field termVectorPositions(_T("name"), _T("value"), Field::INDEX_TOKENIZED | Field::TERMVECTOR_WITH_POSITIONS); Field termVectorOffsets(_T("name"), _T("value"), Field::INDEX_TOKENIZED | Field::TERMVECTOR_WITH_OFFSETS); Field termVectorPositionsOffsets(_T("name"), _T("value"), Field::INDEX_TOKENIZED | Field::TERMVECTOR_WITH_POSITIONS_OFFSETS); CuAssertTrue(tc, termVector.isTermVectorStored(), _T("Term vector is not stored!")); CuAssertTrue(tc, !termVector.isStoreOffsetWithTermVector(), _T("Term vector with offset is stored!")); CuAssertTrue(tc, !termVector.isStorePositionWithTermVector(), _T("Term vector with position is stored!")); CuAssertTrue(tc, termVectorPositions.isTermVectorStored(), _T("Term vector is not stored!")); CuAssertTrue(tc, !termVectorPositions.isStoreOffsetWithTermVector(), _T("Term vector with offset is stored!")); CuAssertTrue(tc, termVectorPositions.isStorePositionWithTermVector(), _T("Term vector with position is not stored!")); CuAssertTrue(tc, termVectorOffsets.isTermVectorStored(), _T("Term vector is not stored!")); CuAssertTrue(tc, termVectorOffsets.isStoreOffsetWithTermVector(), _T("Term vector with offset is not stored!")); CuAssertTrue(tc, !termVectorOffsets.isStorePositionWithTermVector(), _T("Term vector with position is stored!")); CuAssertTrue(tc, termVectorPositionsOffsets.isTermVectorStored(), _T("Term vector is not stored!")); CuAssertTrue(tc, termVectorPositionsOffsets.isStoreOffsetWithTermVector(), _T("Term vector with offset is not stored!")); CuAssertTrue(tc, termVectorPositionsOffsets.isStorePositionWithTermVector(), _T("Term vector with position is not stored!")); } CuSuite *testField(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Field Test")); SUITE_ADD_TEST(suite, testFieldConfig); return suite; } clucene-core-2.3.3.4/src/test/document/TestNumberTools.cpp000066400000000000000000000054641154025176300234430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" void subtestTwoLongs(CuTest *tc, int64_t i, int64_t j) { // convert to strings TCHAR* a = NumberTools::longToString(i); TCHAR* b = NumberTools::longToString(j); // are they the right length? CuAssertTrue(tc, NumberTools::STR_SIZE == _tcslen(a)); CuAssertTrue(tc, NumberTools::STR_SIZE == _tcslen(b)); // are they the right order? if (i < j) { CuAssertTrue(tc, _tcscmp(a,b) < 0); } else if (i > j) { CuAssertTrue(tc, _tcscmp(a,b) > 0); } else { CuAssertTrue(tc, _tcscmp(a,b) == 0); } // can we convert them back to longs? int64_t i2 = NumberTools::stringToLong(a); int64_t j2 = NumberTools::stringToLong(b); CuAssertTrue(tc, i == i2); CuAssertTrue(tc, j == j2); _CLDELETE_CARRAY(a); _CLDELETE_CARRAY(b); } void testNearZero(CuTest *tc) { for (int32_t i = -100; i <= 100; i++) { for (int32_t j = -100; j <= 100; j++) { subtestTwoLongs(tc, i, j); } } } void testMin(CuTest *tc) { // make sure the constants convert to their equivelents CuAssertTrue(tc, LUCENE_INT64_MIN_SHOULDBE == NumberTools::stringToLong(const_cast(NumberTools::MIN_STRING_VALUE))); TCHAR* actual = NumberTools::longToString(LUCENE_INT64_MIN_SHOULDBE); CuAssertStrEquals(tc, _T("Min value"), NumberTools::MIN_STRING_VALUE, actual); _CLDELETE_LCARRAY(actual); // test near MIN, too for (int64_t l = LUCENE_INT64_MIN_SHOULDBE; l < LUCENE_INT64_MIN_SHOULDBE + 10000; l++) { subtestTwoLongs(tc,l, l + 1); } } void testMax(CuTest *tc) { // make sure the constants convert to their equivelents CuAssertTrue(tc, LUCENE_INT64_MAX_SHOULDBE == NumberTools::stringToLong(const_cast(NumberTools::MAX_STRING_VALUE))); TCHAR* actual = NumberTools::longToString(LUCENE_INT64_MAX_SHOULDBE); CuAssertStrEquals(tc, _T("Max value"), NumberTools::MAX_STRING_VALUE, actual); _CLDELETE_LCARRAY(actual); // test near MAX, too for (int64_t l = LUCENE_INT64_MAX_SHOULDBE; l > LUCENE_INT64_MAX_SHOULDBE - 10000; l--) { subtestTwoLongs(tc,l, l - 1); } } CuSuite *testNumberTools(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Number Tools Test")); SUITE_ADD_TEST(suite, testNearZero); SUITE_ADD_TEST(suite, testMin); SUITE_ADD_TEST(suite, testMax); return suite; } clucene-core-2.3.3.4/src/test/index/000077500000000000000000000000001154025176300171065ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/index/IndexWriter4Test.cpp000066400000000000000000000021531154025176300230030ustar00rootroot00000000000000#include "CLucene/_ApiHeader.h" #include "IndexWriter4Test.h" #include "CLucene/index/_SegmentInfos.h" CL_NS_DEF(index) IndexWriter4Test::IndexWriter4Test(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, const bool create) : IndexWriter(d, a, create) { } IndexWriter4Test::IndexWriter4Test(CL_NS(store)::Directory* d, bool autoCommit, CL_NS(analysis)::Analyzer* a, const bool create) : IndexWriter(d, autoCommit, a, create) { } // for test purpose int32_t IndexWriter4Test::getDocCount(int32_t i) { return IndexWriter::getDocCount(i); } // for test purpose int32_t IndexWriter4Test::getNumBufferedDocuments(){ return IndexWriter::getNumBufferedDocuments(); } // for test purpose int32_t IndexWriter4Test::getSegmentCount(){ return IndexWriter::getSegmentCount(); } int32_t IndexWriter4Test::getBufferedDeleteTermsSize() { return IndexWriter::getBufferedDeleteTermsSize(); } int32_t IndexWriter4Test::getNumBufferedDeleteTerms() { return IndexWriter::getNumBufferedDeleteTerms(); } SegmentInfo* IndexWriter4Test::newestSegment() { return IndexWriter::newestSegment(); } CL_NS_END clucene-core-2.3.3.4/src/test/index/IndexWriter4Test.h000066400000000000000000000021301154025176300224430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2010 Borivoj Kostka and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_test_index_IndexWriter4Test_ #define _lucene_test_index_IndexWriter4Test_ #include "CLucene/index/IndexWriter.h" CL_NS_DEF(index) /* * Derived from IndexWriter, contains methods used only for testing purposes. * */ class IndexWriter4Test : public IndexWriter { public: IndexWriter4Test(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, const bool create); IndexWriter4Test(CL_NS(store)::Directory* d, bool autocommit, CL_NS(analysis)::Analyzer* a, const bool create); int32_t getDocCount(int32_t i); int32_t getNumBufferedDocuments(); int32_t getSegmentCount(); int32_t getBufferedDeleteTermsSize(); int32_t getNumBufferedDeleteTerms(); SegmentInfo* newestSegment(); }; CL_NS_END #endif clucene-core-2.3.3.4/src/test/index/TestAddIndexesNoOptimize.cpp000066400000000000000000000377241154025176300245150ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2010 Borivoj Kostka and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/document/Document.h" #include "CLucene/document/Field.h" #include "CLucene/index/IndexReader.h" #include "CLucene/store/Directory.h" #include "CLucene/store/RAMDirectory.h" #include "CLucene/index/MergeScheduler.h" #include "../store/MockRAMDirectory.h" #include "IndexWriter4Test.h" CL_NS_USE(store) CL_NS_USE(index) CL_NS_USE(document) CL_NS_USE2(analysis,standard) static IndexWriter4Test * newWriter(Directory * dir, WhitespaceAnalyzer * analyzer, bool create) { IndexWriter4Test * writer = _CLNEW IndexWriter4Test(dir, analyzer, create); writer->setMergePolicy(_CLNEW LogDocMergePolicy()); return writer; } static void addDocs(IndexWriter4Test * writer, int numDocs) { for (int i = 0; i < numDocs; i++) { Document doc; doc.add(* _CLNEW Field(_T("content"), _T("aaa"), Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); } } static void addDocs2(IndexWriter4Test * writer, int numDocs) { for (int i = 0; i < numDocs; i++) { Document doc; doc.add(* _CLNEW Field(_T("content"), _T("bbb"), Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); } } static void verifyNumDocs(CuTest *tc, Directory * dir, int numDocs) { IndexReader * reader = IndexReader::open(dir); assertEquals(numDocs, reader->maxDoc()); assertEquals(numDocs, reader->numDocs()); reader->close(); _CLLDELETE(reader); } static void verifyTermDocs(CuTest *tc, Directory * dir, Term * term, int numDocs) { IndexReader * reader = IndexReader::open(dir); TermDocs * termDocs = reader->termDocs(term); int count = 0; while (termDocs->next()) count++; assertEquals(numDocs, count); termDocs->close(); _CLLDELETE(termDocs); reader->close(); _CLLDELETE(reader); } void setUpDirs(CuTest *tc, Directory * dir, Directory * aux) { IndexWriter4Test * writer = NULL; WhitespaceAnalyzer analyzer; writer = newWriter(dir, &analyzer, true); writer->setMaxBufferedDocs(1000); // add 1000 documents in 1 segment addDocs(writer, 1000); assertEquals(1000, writer->docCount()); assertEquals(1, writer->getSegmentCount()); writer->close(); _CLLDELETE(writer); writer = newWriter(aux, &analyzer, true); writer->setUseCompoundFile(false); // use one without a compound file writer->setMaxBufferedDocs(100); writer->setMergeFactor(10); // add 30 documents in 3 segments for (int i = 0; i < 3; i++) { addDocs(writer, 10); writer->close(); _CLLDELETE(writer); writer = newWriter(aux, &analyzer, false); writer->setUseCompoundFile(false); // use one without a compound file writer->setMaxBufferedDocs(100); writer->setMergeFactor(10); } assertEquals(30, writer->docCount()); assertEquals(3, writer->getSegmentCount()); writer->close(); _CLLDELETE(writer); } void testSimpleCase(CuTest *tc) { // main directory Directory * dir = _CLNEW RAMDirectory(); // two auxiliary directories Directory * aux = _CLNEW RAMDirectory(); Directory * aux2 = _CLNEW RAMDirectory(); IndexWriter4Test * writer = NULL; WhitespaceAnalyzer analyzer; writer = newWriter(dir, &analyzer, true); // add 100 documents addDocs(writer, 100); assertEquals(100, writer->docCount()); writer->close(); _CLLDELETE(writer); writer = newWriter(aux, &analyzer, true); writer->setUseCompoundFile(false); // use one without a compound file // add 40 documents in separate files addDocs(writer, 40); assertEquals(40, writer->docCount()); writer->close(); _CLLDELETE(writer); writer = newWriter(aux2, &analyzer, true); // add 40 documents in compound files addDocs2(writer, 50); assertEquals(50, writer->docCount()); writer->close(); _CLLDELETE(writer); // test doc count before segments are merged writer = newWriter(dir, &analyzer, false); assertEquals(100, writer->docCount()); { ValueArray dirs(2); dirs[0] = aux; dirs[1] = aux2; writer->addIndexesNoOptimize( dirs ); } assertEquals(190, writer->docCount()); writer->close(); _CLLDELETE(writer); // make sure the old index is correct verifyNumDocs(tc, aux, 40); // make sure the new index is correct verifyNumDocs(tc, dir, 190); // now add another set in. Directory * aux3 = _CLNEW RAMDirectory(); writer = newWriter(aux3, &analyzer, true); // add 40 documents addDocs(writer, 40); assertEquals(40, writer->docCount()); writer->close(); _CLLDELETE(writer); // test doc count before segments are merged/index is optimized writer = newWriter(dir, &analyzer, false); assertEquals(190, writer->docCount()); { ValueArray dirs(1); dirs[0] = aux3; writer->addIndexesNoOptimize( dirs ); } assertEquals(230, writer->docCount()); writer->close(); _CLLDELETE(writer); // make sure the new index is correct verifyNumDocs(tc, dir, 230); Term t1(_T("content"), _T("aaa")); Term t2(_T("content"), _T("bbb")); verifyTermDocs(tc, dir, &t1, 180); verifyTermDocs(tc, dir, &t2, 50); // now optimize it. writer = newWriter(dir, &analyzer, false); writer->optimize(); writer->close(); _CLLDELETE(writer); // make sure the new index is correct verifyNumDocs(tc, dir, 230); verifyTermDocs(tc, dir, &t1, 180); verifyTermDocs(tc, dir, &t2, 50); // now add a single document Directory * aux4 = _CLNEW RAMDirectory(); writer = newWriter(aux4, &analyzer, true); addDocs2(writer, 1); writer->close(); _CLLDELETE(writer); writer = newWriter(dir, &analyzer, false); assertEquals(230, writer->docCount()); { ValueArray dirs(1); dirs[0] = aux4; writer->addIndexesNoOptimize( dirs ); } assertEquals(231, writer->docCount()); writer->close(); _CLLDELETE(writer); verifyNumDocs(tc, dir, 231); verifyTermDocs(tc, dir, &t2, 51); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); aux2->close(); _CLLDELETE(aux2); aux3->close(); _CLLDELETE(aux3); aux4->close(); _CLLDELETE(aux4); } // case 0: add self or exceed maxMergeDocs, expect exception void testAddSelf(CuTest * tc) { // main directory Directory * dir = _CLNEW RAMDirectory(); // auxiliary directory Directory * aux = _CLNEW RAMDirectory(); IndexWriter4Test * writer = NULL; WhitespaceAnalyzer analyzer; writer = newWriter(dir, &analyzer, true); // add 100 documents addDocs(writer, 100); assertEquals(100, writer->docCount()); writer->close(); _CLLDELETE(writer); writer = newWriter(aux, &analyzer, true); writer->setUseCompoundFile(false); // use one without a compound file writer->setMaxBufferedDocs(1000); // add 140 documents in separate files addDocs(writer, 40); writer->close(); _CLLDELETE(writer); writer = newWriter(aux, &analyzer, true); writer->setUseCompoundFile(false); // use one without a compound file writer->setMaxBufferedDocs(1000); addDocs(writer, 100); writer->close(); _CLLDELETE(writer); writer = newWriter(dir, &analyzer, false); try { // cannot add self ValueArray dirs(2); dirs[0] = aux; dirs[1] = dir; writer->addIndexesNoOptimize( dirs ); assertTrue(false); } catch (CLuceneError&) { assertEquals(100, writer->docCount()); } writer->close(); _CLLDELETE(writer); // make sure the index is correct verifyNumDocs(tc, dir, 100); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); } // in all the remaining tests, make the doc count of the oldest segment // in dir large so that it is never merged in addIndexesNoOptimize() // case 1: no tail segments void testNoTailSegments(CuTest * tc) { // main directory Directory *dir = _CLNEW RAMDirectory(); // auxiliary directory Directory *aux = _CLNEW RAMDirectory(); WhitespaceAnalyzer analyzer; setUpDirs(tc, dir, aux); IndexWriter4Test * writer = newWriter(dir, &analyzer, false); writer->setMaxBufferedDocs(10); writer->setMergeFactor(4); addDocs(writer, 10); ValueArray dirs(1); dirs[0] = aux; writer->addIndexesNoOptimize(dirs); assertEquals(1040, writer->docCount()); assertEquals(2, writer->getSegmentCount()); assertEquals(1000, writer->getDocCount(0)); writer->close(); _CLLDELETE(writer); // make sure the index is correct verifyNumDocs(tc, dir, 1040); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); } // case 2: tail segments, invariants hold, no copy void testNoCopySegments(CuTest * tc) { // main directory Directory * dir = _CLNEW RAMDirectory(); // auxiliary directory Directory * aux = _CLNEW RAMDirectory(); WhitespaceAnalyzer an; setUpDirs(tc, dir, aux); IndexWriter4Test * writer = newWriter(dir, &an, false); writer->setMaxBufferedDocs(9); writer->setMergeFactor(4); addDocs(writer, 2); ValueArray dirs(1); dirs[0] = aux; writer->addIndexesNoOptimize(dirs); assertEquals(1032, writer->docCount()); assertEquals(2, writer->getSegmentCount()); assertEquals(1000, writer->getDocCount(0)); writer->close(); _CLLDELETE(writer); // make sure the index is correct verifyNumDocs(tc, dir, 1032); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); } // case 3: tail segments, invariants hold, copy, invariants hold void testNoMergeAfterCopy(CuTest * tc) { // main directory Directory * dir = _CLNEW RAMDirectory(); // auxiliary directory Directory * aux = _CLNEW RAMDirectory(); WhitespaceAnalyzer an; setUpDirs(tc, dir, aux); IndexWriter4Test * writer = newWriter(dir, &an, false); writer->setMaxBufferedDocs(10); writer->setMergeFactor(4); ValueArray dirs(2); dirs[0] = aux; dirs[1] = aux; writer->addIndexesNoOptimize(dirs); assertEquals(1060, writer->docCount()); assertEquals(1000, writer->getDocCount(0)); writer->close(); _CLLDELETE(writer); // make sure the index is correct verifyNumDocs(tc, dir, 1060); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); } // case 4: tail segments, invariants hold, copy, invariants not hold void testMergeAfterCopy(CuTest * tc) { // main directory Directory * dir = _CLNEW RAMDirectory(); // auxiliary directory Directory * aux = _CLNEW RAMDirectory(); WhitespaceAnalyzer an; setUpDirs(tc, dir, aux); IndexReader * reader = IndexReader::open(aux); for (int i = 0; i < 20; i++) { reader->deleteDocument(i); } assertEquals(10, reader->numDocs()); reader->close(); _CLLDELETE(reader); IndexWriter4Test * writer = newWriter(dir, &an, false); writer->setMaxBufferedDocs(4); writer->setMergeFactor(4); ValueArray dirs(2); dirs[0] = aux; dirs[1] = aux; writer->addIndexesNoOptimize(dirs); assertEquals(1020, writer->docCount()); assertEquals(1000, writer->getDocCount(0)); writer->close(); _CLLDELETE(writer); // make sure the index is correct verifyNumDocs(tc, dir, 1020); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); } // case 5: tail segments, invariants not hold void testMoreMerges(CuTest * tc) { // main directory Directory * dir = _CLNEW RAMDirectory(); // auxiliary directory Directory * aux = _CLNEW RAMDirectory(); Directory * aux2 = _CLNEW RAMDirectory(); WhitespaceAnalyzer an; setUpDirs(tc, dir, aux); IndexWriter4Test * writer = newWriter(aux2, &an, true); writer->setMaxBufferedDocs(100); writer->setMergeFactor(10); ValueArray dirs(1); dirs[0] = aux; writer->addIndexesNoOptimize(dirs); assertEquals(30, writer->docCount()); assertEquals(3, writer->getSegmentCount()); writer->close(); _CLLDELETE(writer); IndexReader * reader = IndexReader::open(aux); for (int i = 0; i < 27; i++) { reader->deleteDocument(i); } assertEquals(3, reader->numDocs()); reader->close(); _CLLDELETE(reader); reader = IndexReader::open(aux2); for (int i = 0; i < 8; i++) { reader->deleteDocument(i); } assertEquals(22, reader->numDocs()); reader->close(); _CLLDELETE( reader ); writer = newWriter(dir, &an, false); writer->setMaxBufferedDocs(6); writer->setMergeFactor(4); ValueArray dirs2(2); dirs2[0] = aux; dirs2[1] = aux2; writer->addIndexesNoOptimize(dirs2); assertEquals(1025, writer->docCount()); assertEquals(1000, writer->getDocCount(0)); writer->close(); _CLLDELETE( writer ); // make sure the index is correct verifyNumDocs(tc, dir, 1025); dir->close(); _CLLDELETE(dir); aux->close(); _CLLDELETE(aux); aux2->close(); _CLLDELETE(aux2); } // LUCENE-1270 void testHangOnClose(CuTest * tc) { WhitespaceAnalyzer an; MockRAMDirectory * dir = _CLNEW MockRAMDirectory(); dir->setRandomIOExceptionRate(0.0, 0); IndexWriter4Test * writer = _CLNEW IndexWriter4Test(dir, false, &an, true); writer->setMergePolicy(_CLNEW LogByteSizeMergePolicy()); writer->setMaxBufferedDocs(5); writer->setUseCompoundFile(false); writer->setMergeFactor(100); Document doc; doc.add(* _CLNEW Field(_T("content"), _T("aaa bbb ccc ddd eee fff ggg hhh iii"), Field::STORE_YES | Field::INDEX_TOKENIZED | Field::TERMVECTOR_WITH_POSITIONS_OFFSETS)); for(int i=0;i<60;i++) writer->addDocument(&doc); writer->setMaxBufferedDocs(200); Document doc2; doc2.add(* _CLNEW Field(_T("content"), _T("aaa bbb ccc ddd eee fff ggg hhh iii"), Field::STORE_YES | Field::INDEX_NO)); doc2.add(* _CLNEW Field(_T("content"), _T("aaa bbb ccc ddd eee fff ggg hhh iii"), Field::STORE_YES | Field::INDEX_NO)); doc2.add(* _CLNEW Field(_T("content"), _T("aaa bbb ccc ddd eee fff ggg hhh iii"), Field::STORE_YES | Field::INDEX_NO)); doc2.add(* _CLNEW Field(_T("content"), _T("aaa bbb ccc ddd eee fff ggg hhh iii"), Field::STORE_YES | Field::INDEX_NO)); for(int i=0;i<10;i++) writer->addDocument(&doc2); writer->close(); _CLLDELETE(writer); MockRAMDirectory * dir2 = _CLNEW MockRAMDirectory(); dir2->setRandomIOExceptionRate(0.0, 0); writer = _CLNEW IndexWriter4Test(dir2, false, &an, true); LogByteSizeMergePolicy * lmp = _CLNEW LogByteSizeMergePolicy(); lmp->setMinMergeMB(0.0001); writer->setMergePolicy(lmp); writer->setMergeFactor(4); writer->setUseCompoundFile(false); writer->setMergeScheduler(_CLNEW SerialMergeScheduler()); ValueArray dirs(1); dirs[0] = dir; writer->addIndexesNoOptimize(dirs); writer->close(); _CLLDELETE(writer); dir->close(); _CLLDELETE(dir); dir2->close(); _CLLDELETE(dir2); } CuSuite *testAddIndexesNoOptimize(void) { CuSuite *suite = CuSuiteNew(_T("CLucene AddIndexesNoOptimize Test")); SUITE_ADD_TEST(suite, testSimpleCase); SUITE_ADD_TEST(suite, testAddSelf); SUITE_ADD_TEST(suite, testNoTailSegments); SUITE_ADD_TEST(suite, testNoCopySegments); SUITE_ADD_TEST(suite, testNoMergeAfterCopy); SUITE_ADD_TEST(suite, testMergeAfterCopy); SUITE_ADD_TEST(suite, testMoreMerges); SUITE_ADD_TEST(suite, testHangOnClose); return suite; } clucene-core-2.3.3.4/src/test/index/TestHighFreqTerms.cpp000066400000000000000000000047431154025176300231720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" class TestTermInfo: LUCENE_BASE { public: int32_t docFreq; Term* term; TestTermInfo(Term* t, int32_t df) { term = _CL_POINTER(t); docFreq = df; } ~TestTermInfo(){ _CLDECDELETE(term); } }; class TermInfoQueue: public PriorityQueue > { public: TermInfoQueue(int32_t size) { initialize(size,true); } bool lessThan(TestTermInfo* A, TestTermInfo* B) { return A->docFreq < B->docFreq; } }; void _TestHighFreqTerms(const char* index, size_t numTerms) { IndexReader* reader = IndexReader::open(index); TermInfoQueue* tiq = _CLNEW TermInfoQueue(100); TermEnum* terms = reader->terms(); int32_t c=0; int32_t minFreq = 0; while (terms->next()) { if (terms->docFreq() > minFreq) { Term* term = terms->term(false); tiq->put(_CLNEW TestTermInfo(term, terms->docFreq())); c++; if (tiq->size() >= numTerms) { // if tiq overfull TestTermInfo* tti=tiq->pop(); _CLLDELETE(tti); // remove lowest in tiq c--; minFreq = ((TestTermInfo*)tiq->top())->docFreq; // reset minFreq } } } while (tiq->size() != 0) { TestTermInfo* termInfo = (TestTermInfo*)tiq->pop(); _CLLDELETE(termInfo); c--; } terms->close(); _CLDELETE(terms); _CLDELETE(tiq); reader->close(); _CLDELETE( reader ); //CuMessageA(tc,"%d milliseconds\n",(int32_t)(Misc::currentTimeMillis()-start)); } void TestHighFreqTerms(CuTest *tc){ char loc[1024]; strcpy(loc, clucene_data_location); strcat(loc, "/reuters-21578-index"); CuAssert(tc,_T("Index does not exist"),Misc::dir_Exists(loc)); _TestHighFreqTerms(loc,100); } CuSuite *testhighfreq(void) { CuSuite *suite = CuSuiteNew(_T("CLucene High Frequencies Test")); SUITE_ADD_TEST(suite, TestHighFreqTerms); return suite; } clucene-core-2.3.3.4/src/test/index/TestIndexModifier.cpp000066400000000000000000000124231154025176300232020ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/index/IndexModifier.h" #include CL_NS_USE(store) CL_NS_USE(index) CL_NS_USE(document) CL_NS_USE2(analysis,standard) void IndexModifierExceptionTest(CuTest *tc) { class LockedLock : public LuceneLock { public: LockedLock() : LuceneLock() {}; virtual bool obtain() {return obtain(0);}; virtual void release() {}; virtual bool isLocked() {return true;}; bool obtain(int64_t lockWaitTimeout) {return false;}; virtual std::string toString() {return "LockedLock";}; virtual const char* getObjectName() const {return "LockedLock";}; }; class LockedDirectory : public RAMDirectory { public: bool errOn; LockedDirectory() : RAMDirectory(), errOn(false) {}; // this simulates locking problem, only if errOn is true LuceneLock* makeLock(const char* name) { if (errOn) return _CLNEW LockedLock(); else return RAMDirectory::makeLock(name); }; }; LockedDirectory directory; StandardAnalyzer analyzer; Document doc; IndexModifier * pIm = NULL; try { doc.add(* _CLNEW Field(_T("text"), _T("Document content"), Field::STORE_YES | Field::INDEX_TOKENIZED)); pIm = _CLNEW IndexModifier(&directory, &analyzer, true); pIm->addDocument(&doc); pIm->deleteDocument(0); } catch (CLuceneError & err) { CuFail(tc, _T("Exception thrown upon startup")); return; } try { // switch on locking timeout simulation directory.errOn = true; // throws lock timeout exception pIm->addDocument(&doc); CuFail(tc, _T("Exception was not thrown during addDocument")); } catch (CLuceneError & err) { } // this produces Access Violation exception try { _CLLDELETE(pIm); } catch (...) { CuFail(tc, _T("Exception thrown upon deletion")); } } class bulk_modification { public: void modify_index(CuTest *tc, IndexModifier& ndx); }; class incremental_modification { public: void modify_index(CuTest *tc, IndexModifier& ndx); }; template class IMinsertDelete_tester : public modification { public: void invoke(Directory& storage, CuTest *tc); }; void bulk_modification::modify_index(CuTest *tc, IndexModifier& ndx){ std::basic_stringstream field; for ( int i=0;i<1000;i++ ){ field.str(_T("")); field << _T("fielddata") << i; Document doc; doc.add ( *_CLNEW Field( _T("field0"), field.str().c_str(), Field::STORE_YES | Field::INDEX_UNTOKENIZED ) ); ndx.addDocument(&doc); } for ( int i=0;i<1000;i+=2 ){ field.str(_T("")); field << _T("fielddata") << i; Term deleted( _T("field0"), field.str().c_str(), true ); CLUCENE_ASSERT(ndx.deleteDocuments(&deleted) > 0); } } void incremental_modification::modify_index(CuTest *tc, IndexModifier& ndx){ std::basic_stringstream field; for ( int i=0;i<1000;i++ ){ field.str(_T("")); field << _T("fielddata") << i; Document doc; doc.add ( *_CLNEW Field( _T("field0"), field.str().c_str(), Field::STORE_YES | Field::INDEX_UNTOKENIZED ) ); ndx.addDocument(&doc); if ( 0 == i % 2 ) { Term deleted( _T("field0"), field.str().c_str(), true ); CLUCENE_ASSERT(ndx.deleteDocuments(&deleted) > 0); } } } template void IMinsertDelete_tester::invoke( Directory& storage, CuTest *tc ){ SimpleAnalyzer a; IndexModifier ndx2(&storage,&a,true); ndx2.close(); IndexModifier ndx(&storage,&a,false); ndx.setUseCompoundFile(false); ndx.setMergeFactor(2); this->modify_index(tc, ndx); ndx.optimize(); ndx.close(); //test the ram loading RAMDirectory ram2(&storage); IndexReader* reader2 = IndexReader::open(&ram2); Term* term = _CLNEW Term(_T("field0"),_T("fielddata1")); TermDocs* en = reader2->termDocs(term); CLUCENE_ASSERT(en->next()); _CLDELETE(en); _CLDECDELETE(term); term = _CLNEW Term(_T("field0"),_T("fielddata0")); en = reader2->termDocs(term); CLUCENE_ASSERT(!en->next()); _CLDELETE(en); _CLDECDELETE(term); _CLDELETE(reader2); } void testIMinsertDelete(CuTest *tc){ char fsdir[CL_MAX_PATH]; _snprintf(fsdir,CL_MAX_PATH,"%s/%s",cl_tempDir, "test.search"); RAMDirectory ram; FSDirectory* disk = FSDirectory::getDirectory(fsdir); IMinsertDelete_tester().invoke(ram, tc); IMinsertDelete_tester().invoke(ram, tc); IMinsertDelete_tester().invoke(*disk, tc); IMinsertDelete_tester().invoke(*disk, tc); disk->close(); _CLDECDELETE(disk); } CuSuite *testIndexModifier(void) { CuSuite *suite = CuSuiteNew(_T("CLucene IndexModifier Test")); SUITE_ADD_TEST(suite, IndexModifierExceptionTest); SUITE_ADD_TEST(suite, testIMinsertDelete); return suite; } clucene-core-2.3.3.4/src/test/index/TestIndexReader.cpp000066400000000000000000000231471154025176300226530ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include #include "CLucene/index/_SegmentHeader.h" #include "CLucene/index/_MultiSegmentReader.h" #include "CLucene/index/MultiReader.h" typedef IndexReader* (*TestIRModifyIndex)(CuTest* tc, IndexReader* reader, int modify); DEFINE_MUTEX(createReaderMutex) void createDocument(Document& doc, int n, int numFields) { doc.clear(); StringBuffer sb; sb.append( _T("a")); sb.appendInt(n); doc.add(* _CLNEW Field( _T("field1"), sb.getBuffer(), Field::STORE_YES | Field::INDEX_TOKENIZED)); sb.append(_T(" b")); sb.appendInt(n); for (int i = 1; i < numFields; i++) { TCHAR buf[10]; _sntprintf(buf,10,_T("field%d"), i+1); doc.add(* _CLNEW Field(buf, sb.getBuffer(), Field::STORE_YES | Field::INDEX_TOKENIZED)); } } void createIndex(CuTest* tc, Directory* dir, bool multiSegment) { WhitespaceAnalyzer whitespaceAnalyzer; IndexWriter w(dir, &whitespaceAnalyzer, true); w.setMergePolicy(_CLNEW LogDocMergePolicy()); Document doc; for (int i = 0; i < 100; i++) { createDocument(doc, i, 4); w.addDocument(&doc); if (multiSegment && (i % 10) == 0) { w.flush(); } } if (!multiSegment) { w.optimize(); } w.close(); IndexReader* r = IndexReader::open(dir); if (multiSegment) { CuAssert(tc,_T("check is multi"), strcmp(r->getObjectName(),"MultiSegmentReader")==0); } else { CuAssert(tc,_T("check is segment"), strcmp(r->getObjectName(),"SegmentReader")==0); } r->close(); _CLDELETE(r); } struct ReaderCouple{ IndexReader* newReader; IndexReader* refreshedReader; }; void assertReaderClosed(CuTest* tc, IndexReader* reader, bool checkSubReaders, bool checkNormsClosed) { //TODO: CuAssertIntEquals(tc, _T("Check refcount is zero"), 0, reader->getRefCount()); /* can't test internal... if (checkNormsClosed && reader->instanceOf(SegmentReader::getClassName())) { CuAssertTrue(tc, ((SegmentReader*) reader)->normsClosed()); }*/ if (checkSubReaders) { /* can't test internal... if (reader->instanceOf(MultiSegmentReader::getClassName())) { const CL_NS(util)::ArrayBase& subReaders = *((MultiSegmentReader*) reader)->getSubReaders(); for (int i = 0; i < subReaders.length; i++) { assertReaderClosed(tc, subReaders[i], checkSubReaders, checkNormsClosed); } }*/ if (reader != NULL && reader->instanceOf(MultiReader::getClassName())) { const CL_NS(util)::ArrayBase& subReaders = *((MultiReader*) reader)->getSubReaders(); for (size_t i = 0; i < subReaders.length; i++) { assertReaderClosed(tc, subReaders[i], checkSubReaders, checkNormsClosed); } } } } void assertReaderOpen(CuTest* /*tc*/, IndexReader* reader) { Document doc; reader->document(0, doc);//hack to call ensureOpen... /* can't test internal... if (reader->instanceOf(MultiSegmentReader::getClassName())) { const CL_NS(util)::ArrayBase& subReaders = *((MultiSegmentReader*) reader)->getSubReaders(); for (int i = 0; i < subReaders.length; i++) { assertReaderOpen(tc, subReaders[i]); } }*/ } Directory* defaultModifyIndexTestDir1 = NULL; IndexReader* defaultModifyIndexTest(CuTest* /*tc*/, IndexReader* reader, int i){ WhitespaceAnalyzer whitespaceAnalyzer; switch (i) { case 0: { IndexWriter w(defaultModifyIndexTestDir1, &whitespaceAnalyzer, false); Term* t1 = _CLNEW Term(_T("field2"), _T("a11")); w.deleteDocuments(t1); Term* t2 = _CLNEW Term(_T("field2"), _T("b30")); w.deleteDocuments(t2); _CLDECDELETE(t1); _CLDECDELETE(t2); w.close(); break; } case 1: { IndexReader* reader = IndexReader::open(defaultModifyIndexTestDir1); reader->setNorm(4, _T("field1"), (uint8_t)123); reader->setNorm(44, _T("field2"), (uint8_t)222); reader->setNorm(44, _T("field4"), (uint8_t)22); reader->close(); _CLDELETE(reader); break; } case 2: { IndexWriter w(defaultModifyIndexTestDir1, &whitespaceAnalyzer, false); w.optimize(); w.close(); break; } case 3: { IndexWriter w(defaultModifyIndexTestDir1, &whitespaceAnalyzer, false); Document doc; createDocument(doc, 101, 4); w.addDocument(&doc); w.optimize(); createDocument(doc,102, 4); w.addDocument(&doc); createDocument(doc,103, 4); w.addDocument(&doc); w.close(); break; } case 4: { IndexReader* reader = IndexReader::open(defaultModifyIndexTestDir1); reader->setNorm(5, _T("field1"), (uint8_t)123); reader->setNorm(55, _T("field2"), (uint8_t)222); reader->close(); _CLDELETE(reader); break; } } return IndexReader::open(defaultModifyIndexTestDir1); } Directory* defaultModifyIndexTestDir2 = NULL; IndexReader* defaultModifyIndexTestMulti(CuTest* tc, IndexReader* reader, int i){ IndexReader* x = defaultModifyIndexTest(tc,reader,i); //call main test _CLDELETE(x); Directory* tmp = defaultModifyIndexTestDir1; defaultModifyIndexTestDir1 = defaultModifyIndexTestDir2; x = defaultModifyIndexTest(tc,reader,i); //call main test _CLDELETE(x); defaultModifyIndexTestDir1 = tmp; ValueArray readers(2); readers[0] = IndexReader::open(defaultModifyIndexTestDir1); readers[1] = IndexReader::open(defaultModifyIndexTestDir2); return _CLNEW MultiReader(&readers, true); } ReaderCouple refreshReader(CuTest* tc, IndexReader* reader, TestIRModifyIndex test, int modify, bool hasChanges) { SCOPED_LOCK_MUTEX(createReaderMutex) IndexReader* r = NULL; if (test != NULL) { r = (*test)(tc, reader, modify); } IndexReader* refreshed = reader->reopen(); if (hasChanges) { CuAssert(tc, _T("No new IndexReader instance created during refresh."), refreshed != reader ); } else { CuAssert(tc, _T("New IndexReader instance created during refresh even though index had no changes."), refreshed == reader); } ReaderCouple ret = {r, refreshed}; return ret; } ReaderCouple refreshReader(CuTest* tc, IndexReader* reader, bool hasChanges) { return refreshReader(tc,reader, NULL, -1, hasChanges); } void performDefaultIRTests(CuTest *tc, IndexReader* index1, IndexReader* index2, IndexReader* index2B, TestIRModifyIndex test){ TestAssertIndexReaderEquals(tc, index1, index2); // verify that reopen() does not return a new reader instance // in case the index has no changes ReaderCouple couple = refreshReader(tc, index2, false); CuAssertTrue(tc, couple.refreshedReader == index2); couple = refreshReader(tc, index2, test, 0, true); index1 = couple.newReader; IndexReader* index2_refreshed = couple.refreshedReader; index2->close(); assertReaderClosed(tc, index2, true, true); if ( index2_refreshed != index2 ){ _CLDELETE(index2); } // test if refreshed reader and newly opened reader return equal results TestAssertIndexReaderEquals(tc, index1, index2_refreshed); index1->close(); _CLDELETE(index1); index2_refreshed->close(); assertReaderClosed(tc, index2_refreshed, true, true); _CLDELETE(index2_refreshed); index2 = index2B; for (int i = 1; i < 4; i++) { couple = refreshReader(tc, index2, test, i, true); // refresh IndexReader index2->close(); if ( couple.refreshedReader != index2 ){ _CLDELETE(index2); } index2 = couple.refreshedReader; index1 = couple.newReader; TestAssertIndexReaderEquals(tc, index1, index2); index1->close(); assertReaderClosed(tc, index1, true, true); _CLDELETE(index1); } index2->close(); assertReaderClosed(tc, index2, true, true); _CLDELETE(index2); } void testIndexReaderReopen(CuTest *tc){ RAMDirectory dir; createIndex(tc, &dir, false); IndexReader* index1 = IndexReader::open(&dir); IndexReader* index2 = IndexReader::open(&dir); IndexReader* index2B = IndexReader::open(&dir); defaultModifyIndexTestDir1 = &dir; performDefaultIRTests(tc, index1, index2, index2B, defaultModifyIndexTest); defaultModifyIndexTestDir1 = NULL; index1->close(); _CLDELETE(index1); //_CLDELETE(index2);this one gets deleted... //_CLDELETE(index2B); } void testMultiReaderReopen(CuTest *tc){ RAMDirectory dir1; createIndex(tc, &dir1, true); RAMDirectory dir2 ; createIndex(tc, &dir2, true); ValueArray readers1(2); readers1[0] = IndexReader::open(&dir1); readers1[1] = IndexReader::open(&dir2); IndexReader* index1 = _CLNEW MultiReader(&readers1, true); ValueArray readers2(2); readers2[0] = IndexReader::open(&dir1); readers2[1] = IndexReader::open(&dir2); IndexReader* index2 = _CLNEW MultiReader(&readers2, true); ValueArray readers2b(2); readers2b[0] = IndexReader::open(&dir1); readers2b[1] = IndexReader::open(&dir2); IndexReader* index2b = _CLNEW MultiReader(&readers2b, true); defaultModifyIndexTestDir1 = &dir1; defaultModifyIndexTestDir2 = &dir2; performDefaultIRTests(tc, index1, index2, index2b, defaultModifyIndexTestMulti); defaultModifyIndexTestDir1 = NULL; defaultModifyIndexTestDir2 = NULL; _CLDELETE(index1); //_CLDELETE(index2);this one gets deleted... //_CLDELETE(index2B); } CuSuite *testindexreader(void) { CuSuite *suite = CuSuiteNew(_T("CLucene IndexReader Test")); SUITE_ADD_TEST(suite, testIndexReaderReopen); SUITE_ADD_TEST(suite, testMultiReaderReopen); return suite; } // EOF clucene-core-2.3.3.4/src/test/index/TestIndexWriter.cpp000066400000000000000000000507241154025176300227260ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include #include //checks if a merged index finds phrases correctly void testIWmergePhraseSegments(CuTest *tc){ char fsdir[CL_MAX_PATH]; _snprintf(fsdir, CL_MAX_PATH, "%s/%s",cl_tempDir, "test.indexwriter"); SimpleAnalyzer a; Directory* dir = FSDirectory::getDirectory(fsdir); IndexWriter ndx2(dir,&a,true); ndx2.setUseCompoundFile(false); Document doc0; doc0.add( *_CLNEW Field( _T("field0"), _T("value0 value1"), Field::STORE_YES | Field::INDEX_TOKENIZED ) ); ndx2.addDocument(&doc0); ndx2.optimize(); ndx2.close(); IndexWriter ndx(fsdir,&a,false); ndx.setUseCompoundFile(false); Document doc1; doc1.add( *_CLNEW Field( _T("field0"), _T("value1 value0"), Field::STORE_YES | Field::INDEX_TOKENIZED ) ); ndx.addDocument(&doc1); ndx.optimize(); ndx.close(); //test the index querying IndexSearcher searcher(fsdir); Query* query0 = QueryParser::parse( _T("\"value0 value1\""), _T("field0"), &a ); Hits* hits0 = searcher.search(query0); CLUCENE_ASSERT(hits0->length() > 0); Query* query1 = QueryParser::parse( _T("\"value1 value0\""), _T("field0"), &a ); Hits* hits1 = searcher.search(query1); CLUCENE_ASSERT(hits1->length() > 0); _CLDELETE(query0); _CLDELETE(query1); _CLDELETE(hits0); _CLDELETE(hits1); _CLDECDELETE(dir); } //checks that adding more than the min_merge value goes ok... //checks for a mem leak that used to occur void testIWmergeSegments1(CuTest *tc){ RAMDirectory ram; SimpleAnalyzer a; IndexWriter ndx2(&ram,&a,true); ndx2.close(); //test immediate closing bug reported IndexWriter ndx(&ram,&a,true); //set create to false ndx.setUseCompoundFile(false); ndx.setMergeFactor(2); TCHAR fld[1000]; for ( int i=0;i<1000;i++ ){ English::IntToEnglish(i,fld,1000); Document doc; doc.add ( *_CLNEW Field(_T("field0"),fld,Field::STORE_YES | Field::INDEX_TOKENIZED) ); doc.add ( *_CLNEW Field(_T("field1"),fld,Field::STORE_YES | Field::INDEX_TOKENIZED) ); doc.add ( *_CLNEW Field(_T("field2"),fld,Field::STORE_YES | Field::INDEX_TOKENIZED) ); doc.add ( *_CLNEW Field(_T("field3"),fld,Field::STORE_YES | Field::INDEX_TOKENIZED) ); ndx.addDocument(&doc); } //ndx.optimize(); //optimize so we can read terminfosreader with segmentreader ndx.close(); //test the ram loading RAMDirectory ram2(&ram); IndexReader* reader2 = IndexReader::open(&ram2); Term* term = _CLNEW Term(_T("field0"),fld); TermEnum* en = reader2->terms(term); CLUCENE_ASSERT(en->next()); _CLDELETE(en); _CLDECDELETE(term); _CLDELETE(reader2); } //checks if appending to an index works correctly void testIWmergeSegments2(CuTest *tc){ char fsdir[CL_MAX_PATH]; _snprintf(fsdir, CL_MAX_PATH, "%s/%s",cl_tempDir, "test.indexwriter"); SimpleAnalyzer a; Directory* dir = FSDirectory::getDirectory(fsdir); IndexWriter ndx2(dir,&a,true); ndx2.setUseCompoundFile(false); Document doc0; doc0.add( *_CLNEW Field( _T("field0"), _T("value0"), Field::STORE_YES | Field::INDEX_TOKENIZED ) ); ndx2.addDocument(&doc0); ndx2.optimize(); ndx2.close(); IndexWriter ndx(fsdir,&a,false); ndx.setUseCompoundFile(false); Document doc1; doc1.add( *_CLNEW Field( _T("field0"), _T("value1"), Field::STORE_YES | Field::INDEX_TOKENIZED ) ); ndx.addDocument(&doc1); ndx.optimize(); ndx.close(); //test the ram querying IndexSearcher searcher(fsdir); Term* term0 = _CLNEW Term(_T("field0"),_T("value1")); Query* query0 = QueryParser::parse(_T("value0"),_T("field0"),&a); Hits* hits0 = searcher.search(query0); CLUCENE_ASSERT(hits0->length() > 0); Term* term1 = _CLNEW Term(_T("field0"),_T("value0")); Query* query1 = QueryParser::parse(_T("value1"),_T("field0"),&a); Hits* hits1 = searcher.search(query1); CLUCENE_ASSERT(hits1->length() > 0); _CLDELETE(query0); _CLDELETE(query1); _CLDELETE(hits0); _CLDELETE(hits1); _CLDECDELETE(term0); _CLDECDELETE(term1); dir->close(); _CLDECDELETE(dir); } void testAddIndexes(CuTest *tc){ char reuters_origdirectory[1024]; strcpy(reuters_origdirectory, clucene_data_location); strcat(reuters_origdirectory, "/reuters-21578-index"); { RAMDirectory dir; WhitespaceAnalyzer a; IndexWriter w(&dir, &a, true); ValueArray dirs(2); dirs[0] = FSDirectory::getDirectory(reuters_origdirectory); dirs[1] = FSDirectory::getDirectory(reuters_origdirectory); w.addIndexesNoOptimize(dirs); w.flush(); CLUCENE_ASSERT(w.docCount()==62); //31 docs in reuters... // TODO: Currently there is a double ref-counting mechanism in place for Directory objects, // so we need to dec them both dirs[1]->close();_CLDECDELETE(dirs[1]); dirs[0]->close();_CLDECDELETE(dirs[0]); } { RAMDirectory dir; WhitespaceAnalyzer a; IndexWriter w(&dir, &a, true); ValueArray dirs(2); dirs[0] = FSDirectory::getDirectory(reuters_origdirectory); dirs[1] = FSDirectory::getDirectory(reuters_origdirectory); w.addIndexes(dirs); w.flush(); CLUCENE_ASSERT(w.docCount()==62); //31 docs in reuters... // TODO: Currently there is a double ref-counting mechanism in place for Directory objects, // so we need to dec them both dirs[1]->close();_CLDECDELETE(dirs[1]); dirs[0]->close();_CLDECDELETE(dirs[0]); } } void testHashingBug(CuTest* /*tc*/){ //Manuel Freiholz's indexing bug CL_NS(document)::Document doc; CL_NS(document)::Field* field; CL_NS(analysis::standard)::StandardAnalyzer analyzer; CL_NS(store)::RAMDirectory dir; CL_NS(index)::IndexWriter writer(&dir, &analyzer, true, true ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VERSION"), _T("1"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_PID"), _T("5"), CL_NS(document)::Field::STORE_YES | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_DATE"), _T("20090722"), CL_NS(document)::Field::STORE_YES | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_SEARCHDATA"), _T("all kind of data"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_TOKENIZED ); doc.add( (*field) ); writer.addDocument( &doc ); // ADDING FIRST DOCUMENT. -> this works! doc.clear(); field = _CLNEW CL_NS(document)::Field( _T("CNS_VERSION"), _T("1"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_PID"), _T("5"), CL_NS(document)::Field::STORE_YES | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_LINEID"), _T("20"), CL_NS(document)::Field::STORE_YES | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VT_ORDER"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VN_H"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VN_HF"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VN_D"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VN_OD"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VN_P1"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); field = _CLNEW CL_NS(document)::Field( _T("CNS_VN_H1"), _T("456033000"), CL_NS(document)::Field::STORE_NO | CL_NS(document)::Field::INDEX_UNTOKENIZED ); doc.add( (*field) ); // the problematic field! writer.addDocument( &doc ); // ADDING SECOND DOCUMENT - will never return from this function writer.optimize(); // stucks in line 222-223 writer.close(); _CL_LDECREF(&dir); } class IWlargeScaleCorrectness_tester { public: void invoke(Directory& storage, CuTest *tc); }; void IWlargeScaleCorrectness_tester::invoke( Directory& storage, CuTest *tc ){ SimpleAnalyzer a; IndexWriter* ndx = _CLNEW IndexWriter(&storage,&a,true); ndx->setUseCompoundFile(false); const long documents = 200; const long step = 23; const long inverted_step = 113; const long repetitions = 5; CLUCENE_ASSERT(0 == (step * inverted_step + 1) % documents); long value0; long value1 = 0; long block_size = 1; long reopen = 1; for (value0 = 0; value0 < documents * repetitions; value0++) { if (reopen == value0) { ndx->optimize(); ndx->close(); _CLDELETE(ndx); ndx = _CLNEW IndexWriter(&storage,&a,false); ndx->setUseCompoundFile(false); reopen += block_size; block_size++; } TCHAR* value0_string = NumberTools::longToString(value0 % documents); TCHAR* value1_string = NumberTools::longToString(value1); Document doc; doc.add ( *_CLNEW Field( _T("field0"), value0_string, Field::STORE_YES | Field::INDEX_UNTOKENIZED ) ); doc.add ( *_CLNEW Field( _T("field1"), value1_string, Field::STORE_YES | Field::INDEX_UNTOKENIZED ) ); ndx->addDocument(&doc); _CLDELETE_ARRAY(value0_string); _CLDELETE_ARRAY(value1_string); value1 = (value1 + step) % documents; } ndx->optimize(); ndx->close(); IndexSearcher searcher(&storage); Query* query0 = _CLNEW MatchAllDocsQuery; Sort by_value1( _CLNEW SortField( _T("field1"), SortField::STRING, true ) ); Hits* hits0 = searcher.search(query0, &by_value1); long last = 0; for (long i = 0; i < hits0->length(); i++) { Document& retrieved = hits0->doc(i); TCHAR const* value = retrieved.get(_T("field0")); long current = NumberTools::stringToLong(value); long delta = (current + documents - last) % documents; if (0 == (i % repetitions)) { CLUCENE_ASSERT(inverted_step == delta); } else { CLUCENE_ASSERT(0 == delta); } last = current; } _CLDELETE(query0); _CLDELETE(hits0); _CLDELETE(ndx); } void testIWlargeScaleCorrectness(CuTest *tc){ char fsdir[CL_MAX_PATH]; _snprintf(fsdir,CL_MAX_PATH,"%s/%s",cl_tempDir, "test.search"); RAMDirectory ram; FSDirectory* disk = FSDirectory::getDirectory(fsdir); IWlargeScaleCorrectness_tester().invoke(ram, tc); IWlargeScaleCorrectness_tester().invoke(*disk, tc); disk->close(); _CLDECDELETE(disk); } void testExceptionFromTokenStream(CuTest *tc) { class TokenFilterWithException : public TokenFilter { private: int count; public: TokenFilterWithException(TokenStream * in) : TokenFilter(in, true), count(0) {}; Token* next(Token * pToken) { if (count++ == 5) { _CLTHROWA(CL_ERR_IO, "TokenFilterWithException testing IO exception"); } return input->next(pToken); }; }; class AnalyzerWithException : public Analyzer { TokenStream* lastStream; public: AnalyzerWithException() { lastStream = NULL; } virtual ~AnalyzerWithException() { _CLDELETE( lastStream ); } TokenStream* tokenStream(const TCHAR * fieldName, Reader * reader) { return _CLNEW TokenFilterWithException(_CLNEW WhitespaceTokenizer(reader)); }; TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { _CLDELETE( lastStream ); lastStream = _CLNEW TokenFilterWithException(_CLNEW WhitespaceTokenizer(reader)); return lastStream; } }; RAMDirectory * dir = _CLNEW RAMDirectory(); AnalyzerWithException a; IndexWriter * writer = _CLNEW IndexWriter(dir, &a, true); Document* doc = _CLNEW Document(); doc->add(* _CLNEW Field(_T("content"), _T("aa bb cc dd ee ff gg hh ii"), Field::STORE_NO | Field::INDEX_TOKENIZED)); try { writer->addDocument(doc); CuFail(tc, _T("did not hit expected exception")); } catch (CLuceneError&) { } _CLLDELETE(doc); // Make sure we can add another normal document doc = _CLNEW Document(); doc->add(* _CLNEW Field(_T("content"), _T("aa bb cc dd"), Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); // Make sure we can add another normal document doc = _CLNEW Document(); doc->add(* _CLNEW Field(_T("content"), _T("aa bb cc dd"), Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); writer->close(); _CLLDELETE(writer); IndexReader* reader = IndexReader::open(dir); Term* t = _CLNEW Term(_T("content"), _T("aa")); assertEquals(reader->docFreq(t), 3); // Make sure the doc that hit the exception was marked // as deleted: TermDocs* tdocs = reader->termDocs(t); int count = 0; while(tdocs->next()) { count++; } _CLLDELETE(tdocs); assertEquals(2, count); t->set(_T("content"), _T("gg")); assertEquals(reader->docFreq(t), 0); _CLDECDELETE(t); reader->close(); _CLLDELETE(reader); dir->close(); _CLDECDELETE(dir); } /** * Make sure we skip wicked long terms. */ void testWickedLongTerm(CuTest *tc) { RAMDirectory* dir = _CLNEW RAMDirectory(); StandardAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter(dir, &a, true); TCHAR bigTerm[16383]; for (int i=0; i<16383; i++) bigTerm[i]=_T('x'); bigTerm[16382] = 0; Document* doc = _CLNEW Document(); // Max length term is 16383, so this contents produces // a too-long term: TCHAR* contents = _CL_NEWARRAY(TCHAR, 17000); _tcscpy(contents, _T("abc xyz x")); _tcscat(contents, bigTerm); _tcscat(contents, _T(" another term")); doc->add(* _CLNEW Field(_T("content"), contents, Field::STORE_NO | Field::INDEX_TOKENIZED)); _CLDELETE_CARRAY(contents); writer->addDocument(doc); _CLLDELETE(doc); // Make sure we can add another normal document doc = _CLNEW Document(); doc->add(* _CLNEW Field(_T("content"), _T("abc bbb ccc"), Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); writer->close(); _CLDELETE(writer); IndexReader* reader = IndexReader::open(dir); // Make sure all terms < max size were indexed Term* t = _CLNEW Term(_T("content"), _T("abc"), true); assertEquals(2, reader->docFreq(t)); t->set(_T("content"), _T("bbb"), true); assertEquals(1, reader->docFreq(t)); t->set(_T("content"), _T("term"), true); assertEquals(1, reader->docFreq(t)); t->set(_T("content"), _T("another"), true); assertEquals(1, reader->docFreq(t)); // Make sure position is still incremented when // massive term is skipped: t->set(_T("content"), _T("another"), true); TermPositions* tps = reader->termPositions(t); assertTrue(tps->next()); assertEquals(1, tps->freq()); assertEquals(3, tps->nextPosition()); _CLLDELETE(tps); // Make sure the doc that has the massive term is in // the index: assertEqualsMsg(_T("document with wicked long term should is not in the index!"), 1, reader->numDocs()); reader->close(); _CLLDELETE(reader); // Make sure we can add a document with exactly the // maximum length term, and search on that term: doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("content"), bigTerm, Field::STORE_NO | Field::INDEX_TOKENIZED)); StandardAnalyzer sa; sa.setMaxTokenLength(100000); writer = _CLNEW IndexWriter(dir, &sa, true); writer->addDocument(doc); _CLLDELETE(doc); writer->close(); reader = IndexReader::open(dir); t->set(_T("content"), bigTerm); assertEquals(1, reader->docFreq(t)); reader->close(); _CLDECDELETE(t); _CLLDELETE(writer); _CLLDELETE(reader); dir->close(); _CLDECDELETE(dir); } void testDeleteDocument(CuTest* tc) { const int size = 205; RAMDirectory* dir = _CLNEW RAMDirectory(); StandardAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter(dir, &a, true); // build an index that is big enough that a deletion files is written // in the DGaps format for (int i = 0; i < size; i++) { Document* doc = _CLNEW Document(); TCHAR* contents = _CL_NEWARRAY(TCHAR, (size / 10) + 1); _i64tot(i, contents, 10); doc->add(* _CLNEW Field(_T("content"), contents, Field::STORE_NO | Field::INDEX_TOKENIZED)); _CLDELETE_CARRAY(contents); writer->addDocument(doc); _CLDELETE_ARRAY( contents ); _CLLDELETE(doc); } // assure that the index has only one segment writer->optimize(); // close and flush index writer->close(); _CLLDELETE( writer ); // reopen the index and delete the document next to last writer = _CLNEW IndexWriter(dir, &a, false); TCHAR* contents = _CL_NEWARRAY(TCHAR, (size / 10) + 1); _i64tot(size - 2, contents, 10); Term* t = _CLNEW Term(_T("content"), contents); _CLDELETE_LARRAY( contents ); writer->deleteDocuments(t); writer->close(); // now the index has a deletion file in the DGaps format _CLLDELETE(writer); _CLDECDELETE(t); // open this index with a searcher to read the deletions file again IndexReader* reader = IndexReader::open(dir); IndexSearcher* searcher = _CLNEW IndexSearcher(reader); searcher->close(); reader->close(); _CLLDELETE(searcher); _CLLDELETE(reader); dir->close(); _CLLDELETE( dir ); } void testMergeIndex(CuTest* tc) { // A crash depends on the following: // - The first document needs two differently named fields that set TERMVECTOR_YES. // - The IndexWriter needs to reopen an existing index. // - The reopened IndexWriter needs to call optimize() to force a merge // on term vectors. This merging causes the crash. // Submitted by McCann RAMDirectory* dir = _CLNEW RAMDirectory(); // open a new lucene index SimpleAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter( dir, false, &a, true ); writer->setUseCompoundFile( false ); // add two fields to document Document* doc = _CLNEW Document(); doc->add ( *_CLNEW Field(_T("field0"), _T("value0"), Field::STORE_NO | Field::TERMVECTOR_YES | Field::INDEX_TOKENIZED) ); doc->add ( *_CLNEW Field(_T("field1"), _T("value1"), Field::STORE_NO | Field::TERMVECTOR_YES | Field::INDEX_TOKENIZED) ); writer->addDocument(doc); _CLLDELETE(doc); // close and flush index writer->close(); _CLLDELETE( writer ); // open the previous lucene index writer = _CLNEW IndexWriter( dir, false, &a, false ); writer->setUseCompoundFile( false ); // add a field to document // note: the settings on this field don't seem to affect the crash doc = _CLNEW Document(); doc->add ( *_CLNEW Field(_T("field"), _T("value"), Field::STORE_NO | Field::TERMVECTOR_YES | Field::INDEX_TOKENIZED) ); writer->addDocument(doc); _CLLDELETE(doc); // optimize index to force a merge writer->optimize(); // close and flush index writer->close(); _CLLDELETE( writer ); // Close directory dir->close(); _CLLDELETE( dir ); } CuSuite *testindexwriter(void) { CuSuite *suite = CuSuiteNew(_T("CLucene IndexWriter Test")); SUITE_ADD_TEST(suite, testHashingBug); SUITE_ADD_TEST(suite, testAddIndexes); SUITE_ADD_TEST(suite, testIWmergeSegments1); SUITE_ADD_TEST(suite, testIWmergeSegments2); SUITE_ADD_TEST(suite, testIWmergePhraseSegments); SUITE_ADD_TEST(suite, testIWlargeScaleCorrectness); // TODO: This test fails due to differences between CLucene's StandardTokenizer and JLucene's; this test // should work when the tokenizer will be brought up-to-date, //SUITE_ADD_TEST(suite, testWickedLongTerm); SUITE_ADD_TEST(suite, testExceptionFromTokenStream); SUITE_ADD_TEST(suite, testDeleteDocument); SUITE_ADD_TEST(suite, testMergeIndex); return suite; } // EOF clucene-core-2.3.3.4/src/test/index/TestReuters.cpp000066400000000000000000000155341154025176300221130ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/util/dirent.h" #include "CLucene/util/CLStreams.h" #include "CLucene/LuceneThreads.h" #include "CLucene/search/Explanation.h" CL_NS_USE(search) #ifdef _CL_HAVE_SYS_STAT_H #include #endif #include #include using namespace std; CL_NS_USE(util) //an extremelly simple analyser. this eliminates differences //caused by differences in character classifications functions class ReutersTokenizer:public CharTokenizer { public: // Construct a new LetterTokenizer. ReutersTokenizer(CL_NS(util)::Reader* in): CharTokenizer(in) {} ~ReutersTokenizer(){} protected: bool isTokenChar(const TCHAR c) const{ if ( c == ' ' || c == '\t' || c == '-' || c == '.' || c == '\n' || c == '\r' || c == ',' || c == '<' || c == '>' || c<=9){ return false; }else return true; } TCHAR normalize(const TCHAR c) const{ return c; } }; class ReutersAnalyzer: public Analyzer { public: TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader){ return _CLNEW ReutersTokenizer(reader); } TokenStream* reusableTokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader) { Tokenizer* tokenizer = static_cast(getPreviousTokenStream()); if (tokenizer == NULL) { tokenizer = _CLNEW ReutersTokenizer(reader); setPreviousTokenStream(tokenizer); } else tokenizer->reset(reader); return tokenizer; } virtual ~ReutersAnalyzer(){} }; bool stringLowercaseCompare( const string &left, const string &right ){ for( string::const_iterator lit = left.begin(), rit = right.begin(); lit != left.end() && rit != right.end(); ++lit, ++rit ) if( tolower( *lit ) < tolower( *rit ) ) return true; else if( tolower( *lit ) > tolower( *rit ) ) return false; if( left.size() < right.size() ) return true; return false; } char reuters_fsdirectory[CL_MAX_PATH]; bool reuters_ready = false; char reuters_srcdirectory[1024]; char reuters_origdirectory[1024]; //indexes the reuters-21578 data. void testReuters(CuTest *tc) { strcpy(reuters_srcdirectory, clucene_data_location); strcat(reuters_srcdirectory, "/reuters-21578"); CuAssert(tc,_T("Data does not exist"),Misc::dir_Exists(reuters_srcdirectory)); strcpy(reuters_origdirectory, clucene_data_location); strcat(reuters_origdirectory, "/reuters-21578-index"); CuAssert(tc,_T("Index does not exist"),Misc::dir_Exists(reuters_origdirectory)); FSDirectory* fsdir = FSDirectory::getDirectory(reuters_fsdirectory); ReutersAnalyzer a; IndexWriter writer(fsdir,&a,true); writer.setUseCompoundFile(false); //NOTE: when comparing against indexes created <~= 1.9, there was always 1 more field //added then the actual limit... writer.setMaxFieldLength(10001); vector files; CuAssertTrue(tc, Misc::listFiles(reuters_srcdirectory, files,false)); sort(files.begin(), files.end(), stringLowercaseCompare); char tmppath[CL_MAX_DIR]; strncpy(tmppath,reuters_srcdirectory,CL_MAX_DIR); strcat(tmppath,"/"); char* tmppathP = tmppath + strlen(tmppath); TCHAR tpath[CL_MAX_PATH]; struct cl_stat_t buf; vector::iterator fl = files.begin(); while ( fl != files.end() ){ strcpy(tmppathP,fl->c_str()); STRCPY_AtoT(tpath,fl->c_str(),CL_MAX_PATH); fileStat(tmppath,&buf); if ( buf.st_mode & S_IFREG){ Document* doc = _CLNEW Document; doc->add(*_CLNEW Field(_T("path"),tpath,Field::INDEX_UNTOKENIZED | Field::STORE_YES)); doc->add(*_CLNEW Field(_T("contents"), _CLNEW FileReader(tmppath, "ASCII"),Field::INDEX_TOKENIZED)); writer.addDocument( doc ); _CLDELETE(doc); } fl++; } writer.close(); fsdir->close(); _CLDECDELETE(fsdir); //note: for those comparing 0.9.16 to later, the optimize() has been removed so //we can do certain tests with the multi-* classes (reader,etc) //performance will naturally be worse reuters_ready = true; } void testBySection(CuTest* tc){ IndexReader* reader1 = IndexReader::open(reuters_origdirectory); IndexReader* reader2 = IndexReader::open(reuters_fsdirectory); TestAssertIndexReaderEquals(tc,reader1,reader2); reader1->close(); reader2->close(); _CLDELETE(reader1); _CLDELETE(reader2); } #define threadsCount 10 void threadSearch(IndexSearcher* searcher, const TCHAR* qry, StandardAnalyzer* threadAnalyzer){ Query* q = NULL; Hits* h = NULL; try{ q = QueryParser::parse(qry , _T("contents"), threadAnalyzer); if ( q != NULL ){ h = searcher->search( q ); if ( h->length() > 0 ){ //check for explanation memory leaks... CL_NS(search)::Explanation expl1; searcher->explain(q, h->id(0), &expl1); TCHAR* tmp = expl1.toString(); _CLDELETE_CARRAY(tmp); if ( h->length() > 1 ){ //do a second one just in case CL_NS(search)::Explanation expl2; searcher->explain(q, h->id(1), &expl2); tmp = expl2.toString(); _CLDELETE_CARRAY(tmp); } } } }_CLFINALLY( _CLDELETE(h); _CLDELETE(q); ); } _LUCENE_THREAD_FUNC(threadedSearcherTest, arg){ IndexSearcher* searcher = (IndexSearcher*)(((void**)arg)[0]); StandardAnalyzer* threadAnalyzer = (StandardAnalyzer*)(((void**)arg)[1]); for ( int i=0;i<100;i++ ){ threadSearch(searcher, _T("test"), threadAnalyzer ); threadSearch(searcher, _T("reuters"), threadAnalyzer ); threadSearch(searcher, _T("data"), threadAnalyzer ); } _LUCENE_THREAD_FUNC_RETURN(0); } void testThreaded(CuTest* tc){ CLUCENE_ASSERT(reuters_ready); IndexSearcher searcher(reuters_origdirectory); //read using multiple threads... _LUCENE_THREADID_TYPE threads[threadsCount]; int i; StandardAnalyzer threadAnalyzer; void* args[2]; args[0] = &searcher; args[1] = &threadAnalyzer; for ( i=0;i #include CL_NS_USE(analysis); CL_NS_USE(index); CL_NS_USE(util); //Must be lexicographically sorted, will do in setup, versus trying to maintain here const TCHAR* testFields_values[] = {_T("f1"), _T("f2"), _T("f3"), _T("f4")}; const bool testFieldsStorePos_values[] = {true, false, true, false}; const bool testFieldsStoreOff_values[] = {true, false, false, true}; const TCHAR* testTerms_values[] = {_T("this"), _T("is"), _T("a"), _T("test")}; CL_NS(store)::MockRAMDirectory dir; std::string seg; FieldInfos *fieldInfos = NULL; const int TERM_FREQ = 3; struct TestToken { const TCHAR* text; int pos; int startOffset; int endOffset; }; std::vector testFields(testFields_values, testFields_values + sizeof(testFields_values) / sizeof(TCHAR*)); std::vector testTerms(testTerms_values, testTerms_values + sizeof(testTerms_values) / sizeof(TCHAR*)); std::vector testFieldsStorePos(testFieldsStorePos_values, testFieldsStorePos_values + sizeof(testFieldsStorePos_values) / sizeof(bool)); std::vector testFieldsStoreOff(testFieldsStoreOff_values, testFieldsStoreOff_values + sizeof(testFieldsStoreOff_values) / sizeof(bool)); std::vector tokens; std::vector< std::vector > positions(4); std::vector< std::vector > offsets(4); class MyTokenStream : public TokenStream { private: std::vector::size_type tokenUpto; public: MyTokenStream() : tokenUpto(0) { } virtual Token* next(Token *token) { if (tokenUpto >= tokens.size()) return NULL; else { if (token == NULL) { token = _CLNEW Token(); } const TestToken* testToken = tokens[tokenUpto++]; token->setText(testToken->text); if (tokenUpto > 1) token->setPositionIncrement(testToken->pos - tokens[tokenUpto-2]->pos); else token->setPositionIncrement(testToken->pos+1); token->setStartOffset(testToken->startOffset); token->setEndOffset(testToken->endOffset); return token; } } virtual void close() { } }; class MyAnalyzer : public CL_NS(analysis)::Analyzer { public: virtual TokenStream* tokenStream(const TCHAR* fieldName, Reader* reader) { return _CLNEW MyTokenStream(); } }; class MyIndexWriter : public IndexWriter { public: MyIndexWriter(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, const bool create) : IndexWriter(d, a, create) { } virtual SegmentInfo* newestSegment() { return IndexWriter::newestSegment(); } }; struct MyTCharCompare : public std::binary_function { bool operator () (const TCHAR* v1, const TCHAR* v2) const { return _tcscmp(v1, v2) < 0; } }; struct TestTokenCompare : public std::binary_function { bool operator () (const TestToken* t1, const TestToken* t2) const { return t1->pos < t2->pos; } }; void setUp() { tokens.clear(); std::sort(testTerms.begin(), testTerms.end(), MyTCharCompare()); int tokenUpto = 0; for (std::vector::size_type i = 0; i < testTerms.size(); i++) { positions[i] = std::vector(TERM_FREQ); offsets[i] = std::vector(TERM_FREQ); // first position must be 0 for (int j = 0; j < TERM_FREQ; j++) { // positions are always sorted in increasing order positions[i][j] = (int) (j * 10 + (rand() % 10)); // offsets are always sorted in increasing order offsets[i][j] = _CLNEW TermVectorOffsetInfo(j * 10, j * 10 + _tcslen(testTerms[i])); TestToken* token = _CLNEW TestToken(); tokens.push_back(token); tokenUpto++; token->text = testTerms[i]; token->pos = positions[i][j]; token->startOffset = offsets[i][j]->getStartOffset(); token->endOffset = offsets[i][j]->getEndOffset(); } } std::sort(tokens.begin(), tokens.end(), TestTokenCompare()); MyAnalyzer analyzer; MyIndexWriter writer(&dir, &analyzer, true); writer.setUseCompoundFile(false); Document* doc = _CLNEW Document(); for(std::vector::size_type i=0;iadd(* _CLNEW Field(testFields[i], _T(""), Field::STORE_NO | Field::INDEX_TOKENIZED | tv)); } //Create 5 documents for testing, they all have the same //terms for(int j=0;j<5;j++) writer.addDocument(doc); _CLLDELETE(doc); writer.flush(); seg = writer.newestSegment()->name; writer.close(); std::string tmp = seg; tmp.append("."); tmp.append(IndexFileNames::FIELD_INFOS_EXTENSION); fieldInfos = _CLNEW FieldInfos(&dir, tmp.c_str()); } void test(CuTest* tc) { //Check to see the files were created properly in setup std::string tmp = seg; tmp.append("."); tmp.append(IndexFileNames::VECTORS_DOCUMENTS_EXTENSION); CuAssertTrue(tc, dir.fileExists(tmp.c_str()), _T("Missing file!")); tmp = seg; tmp.append("."); tmp.append(IndexFileNames::VECTORS_INDEX_EXTENSION); CuAssertTrue(tc, dir.fileExists(tmp.c_str()), _T("Missing file!")); } void testTermVectorsReader(CuTest* tc) { TermVectorsReader reader(&dir, seg.c_str(), fieldInfos); for (int j = 0; j < 5; j++) { TermFreqVector* vector = reader.get(j, testFields[0]); CuAssertTrue(tc, vector != NULL, _T("Expected term frequency vector!")); const ArrayBase* terms = vector->getTerms(); CuAssertTrue(tc, terms != NULL, _T("Array of terms expected!")); CuAssertTrue(tc, terms->length == testTerms.size()); for (int i = 0; i < terms->length; i++) { const TCHAR* term = (*terms)[i]; CuAssertStrEquals(tc, _T(""), testTerms[i], (TCHAR*)term, false); } } } void testPositionReader(CuTest* tc) { TermVectorsReader reader(&dir, seg.c_str(), fieldInfos); TermPositionVector* vector; const ArrayBase* terms; vector = dynamic_cast(reader.get(0, testFields[0])); CuAssertTrue(tc, vector != NULL, _T("Term position vector expected!")); terms = vector->getTerms(); CuAssertTrue(tc, terms != NULL, _T("Terms expected!")); CuAssertTrue(tc, terms->length == testTerms.size(), _T("Unexpected number of terms!")); for (int i = 0; i < terms->length; i++) { const TCHAR* term = (*terms)[i]; CuAssertStrEquals(tc, _T(""), testTerms[i], (TCHAR*)term, false); const ArrayBase* termPositions = vector->getTermPositions(i); CuAssertTrue(tc, termPositions != NULL, _T("Term positions expected!")); CuAssertTrue(tc, termPositions->length == positions[i].size(), _T("Unexpected number of term positions!")); for (int j = 0; j < termPositions->length; j++) { int position = (*termPositions)[j]; CuAssertTrue(tc, position == positions[i][j], _T("Postion not equal!")); } const ArrayBase* termOffset = vector->getOffsets(i); CuAssertTrue(tc, termOffset != NULL, _T("Term vector offset info expected!")); CuAssertTrue(tc, termOffset->length == offsets[i].size(), _T("Unexpected length of term positions!")); for (int j = 0; j < termOffset->length; j++) { TermVectorOffsetInfo* termVectorOffsetInfo = (*termOffset)[j]; CuAssertTrue(tc, termVectorOffsetInfo->equals(offsets[i][j]), _T("Term vector offset info not equal!")); } } TermFreqVector* freqVector = reader.get(0, testFields[1]); //no pos, no offset CuAssertTrue(tc, freqVector != NULL, _T("Term frequency vector expected!")); CuAssertTrue(tc, dynamic_cast(freqVector) == NULL, _T("Unepexcted term position vector!")); terms = freqVector->getTerms(); CuAssertTrue(tc, terms != NULL, _T("Terms expected!")); CuAssertTrue(tc, terms->length == testTerms.size(), _T("Unexpected length of term positions!")); for (int i = 0; i < terms->length; i++) { const TCHAR* term = (*terms)[i]; CuAssertStrEquals(tc, _T(""), testTerms[i], (TCHAR*)term, false); } } class DocNumAwareMapper : public TermVectorMapper { private: int documentNumber; public: DocNumAwareMapper() : documentNumber(-1) { } virtual ~DocNumAwareMapper() { } virtual void setExpectations(const TCHAR* _field, const int32_t numTerms, const bool storeOffsets, const bool storePositions) { if (documentNumber == -1) { _CLTHROWA(CL_ERR_Runtime, "Documentnumber should be set at this point!"); } } virtual void map(const TCHAR* term, const int32_t termLen, const int32_t frequency, CL_NS(util)::ArrayBase* offsets, CL_NS(util)::ArrayBase* positions) { if (documentNumber == -1) { _CLTHROWA(CL_ERR_Runtime, "Documentnumber should be set at this point!"); } } int getDocumentNumber() const { return documentNumber; } virtual void setDocumentNumber(const int32_t documentNumber) { this->documentNumber = documentNumber; } }; void testOffsetReader(CuTest* tc) { TermVectorsReader reader(&dir, seg.c_str(), fieldInfos); TermPositionVector* vector = dynamic_cast(reader.get(0, testFields[0])); CuAssertTrue(tc, vector != NULL, _T("Term position vector expected!")); const CL_NS(util)::ArrayBase* terms = vector->getTerms(); CuAssertTrue(tc, terms != NULL, _T("Terms expected")); CuAssertTrue(tc, terms->length == testTerms.size(), _T("Unexpected number of terms!")); for (int i = 0; i < terms->length; i++) { const TCHAR* term = (*terms)[i]; CuAssertStrEquals(tc, _T(""), testTerms[i], (TCHAR*)term, false); const ArrayBase* termPositions = vector->getTermPositions(i); CuAssertTrue(tc, termPositions != NULL, _T("Term positions expected!")); CuAssertTrue(tc, termPositions->length == positions[i].size()); for (int j = 0; j < termPositions->length; j++) { int position = (*termPositions)[j]; CuAssertTrue(tc, position == positions[i][j], _T("Unexpected position!")); } const ArrayBase* termOffset = vector->getOffsets(i); CuAssertTrue(tc, termOffset != NULL, _T("Term vector offset info expected!")); CuAssertTrue(tc, termOffset->length == offsets[i].size(), _T("Unexpected number of term positions!")); for (int j = 0; j < termOffset->length; j++) { TermVectorOffsetInfo* termVectorOffsetInfo = (*termOffset)[j]; CuAssertTrue(tc, termVectorOffsetInfo->equals(offsets[i][j]), _T("Term vector offset info not equal!")); } } } //void testMapper(CuTest* tc) { // TermVectorsReader reader(&dir, seg, fieldInfos); // SortedTermVectorMapper mapper = new SortedTermVectorMapper(new TermVectorEntryFreqSortedComparator()); // reader.get(0, mapper); // SortedSet set = mapper.getTermVectorEntrySet(); // CuAssertTrue(tc, set != NULL, "set is null and it shouldn't be"); // //three fields, 4 terms, all terms are the same // CuAssertTrue(set.size() == 4, _T("set Size: " + set.size() + " is not: 4"); // //Check offsets and positions // for (Iterator iterator = set.iterator(); iterator.hasNext();) { // TermVectorEntry* tve = (TermVectorEntry) iterator.next(); // CuAssertTrue(tc, tve != NULL, _T("tve is null and it shouldn't be")); // CuAssertTrue(tc, tve->getOffsets() != NULL, _T("tve.getOffsets() is null and it shouldn't be")); // CuAssertTrue(tc, tve->getPositions() != NULL, _T("tve.getPositions() is null and it shouldn't be")); // } // mapper = new SortedTermVectorMapper(new TermVectorEntryFreqSortedComparator()); // reader.get(1, mapper); // set = mapper.getTermVectorEntrySet(); // assertTrue("set is null and it shouldn't be", set != null); // //three fields, 4 terms, all terms are the same // assertTrue("set Size: " + set.size() + " is not: " + 4, set.size() == 4); // //Should have offsets and positions b/c we are munging all the fields together // for (Iterator iterator = set.iterator(); iterator.hasNext();) { // TermVectorEntry tve = (TermVectorEntry) iterator.next(); // assertTrue("tve is null and it shouldn't be", tve != null); // assertTrue("tve.getOffsets() is null and it shouldn't be", tve.getOffsets() != null); // assertTrue("tve.getPositions() is null and it shouldn't be", tve.getPositions() != null); // } // FieldSortedTermVectorMapper fsMapper = new FieldSortedTermVectorMapper(new TermVectorEntryFreqSortedComparator()); // reader.get(0, fsMapper); // Map map = fsMapper.getFieldToTerms(); // assertTrue("map Size: " + map.size() + " is not: " + testFields.length, map.size() == testFields.length); // for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) { // Map.Entry entry = (Map.Entry) iterator.next(); // SortedSet sortedSet = (SortedSet) entry.getValue(); // assertTrue("sortedSet Size: " + sortedSet.size() + " is not: " + 4, sortedSet.size() == 4); // for (Iterator inner = sortedSet.iterator(); inner.hasNext();) { // TermVectorEntry tve = (TermVectorEntry) inner.next(); // assertTrue("tve is null and it shouldn't be", tve != null); // //Check offsets and positions. // assertTrue("tve is null and it shouldn't be", tve != null); // String field = tve.getField(); // if (field.equals(testFields[0])) { // //should have offsets // assertTrue("tve.getOffsets() is null and it shouldn't be", tve.getOffsets() != null); // assertTrue("tve.getPositions() is null and it shouldn't be", tve.getPositions() != null); // } // else if (field.equals(testFields[1])) { // //should not have offsets // assertTrue("tve.getOffsets() is not null and it shouldn't be", tve.getOffsets() == null); // assertTrue("tve.getPositions() is not null and it shouldn't be", tve.getPositions() == null); // } // } // } // //Try mapper that ignores offs and positions // fsMapper = new FieldSortedTermVectorMapper(true, true, new TermVectorEntryFreqSortedComparator()); // reader.get(0, fsMapper); // map = fsMapper.getFieldToTerms(); // assertTrue("map Size: " + map.size() + " is not: " + testFields.length, map.size() == testFields.length); // for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) { // Map.Entry entry = (Map.Entry) iterator.next(); // SortedSet sortedSet = (SortedSet) entry.getValue(); // assertTrue("sortedSet Size: " + sortedSet.size() + " is not: " + 4, sortedSet.size() == 4); // for (Iterator inner = sortedSet.iterator(); inner.hasNext();) { // TermVectorEntry tve = (TermVectorEntry) inner.next(); // assertTrue("tve is null and it shouldn't be", tve != null); // //Check offsets and positions. // assertTrue("tve is null and it shouldn't be", tve != null); // String field = tve.getField(); // if (field.equals(testFields[0])) { // //should have offsets // assertTrue("tve.getOffsets() is null and it shouldn't be", tve.getOffsets() == null); // assertTrue("tve.getPositions() is null and it shouldn't be", tve.getPositions() == null); // } // else if (field.equals(testFields[1])) { // //should not have offsets // assertTrue("tve.getOffsets() is not null and it shouldn't be", tve.getOffsets() == null); // assertTrue("tve.getPositions() is not null and it shouldn't be", tve.getPositions() == null); // } // } // } // // test setDocumentNumber() // IndexReader ir = IndexReader.open(&dir); // DocNumAwareMapper docNumAwareMapper = new DocNumAwareMapper(); // assertEquals(-1, docNumAwareMapper.getDocumentNumber()); // ir.getTermFreqVector(0, docNumAwareMapper); // assertEquals(0, docNumAwareMapper.getDocumentNumber()); // docNumAwareMapper.setDocumentNumber(-1); // ir.getTermFreqVector(1, docNumAwareMapper); // assertEquals(1, docNumAwareMapper.getDocumentNumber()); // docNumAwareMapper.setDocumentNumber(-1); // ir.getTermFreqVector(0, "f1", docNumAwareMapper); // assertEquals(0, docNumAwareMapper.getDocumentNumber()); // docNumAwareMapper.setDocumentNumber(-1); // ir.getTermFreqVector(1, "f2", docNumAwareMapper); // assertEquals(1, docNumAwareMapper.getDocumentNumber()); // docNumAwareMapper.setDocumentNumber(-1); // ir.getTermFreqVector(0, "f1", docNumAwareMapper); // assertEquals(0, docNumAwareMapper.getDocumentNumber()); // ir.close(); //} /** * Make sure exceptions and bad params are handled appropriately */ void testBadParams(CuTest* tc) { try { TermVectorsReader reader(&dir, seg.c_str(), fieldInfos); //Bad document number, good field number reader.get(50, testFields[0]); CuFail(tc, _T("Expected an IO exception!")); } catch (CLuceneError& e) { if (e.number() != CL_ERR_IO) { CuFail(tc, e.twhat()); } } try { TermVectorsReader reader(&dir, seg.c_str(), fieldInfos); //Bad document number, no field reader.get(50); CuFail(tc, _T("")); } catch (CLuceneError& e) { if (e.number() != CL_ERR_IO) { CuFail(tc, e.twhat()); } } try { TermVectorsReader reader(&dir, seg.c_str(), fieldInfos); //good document number, bad field number TermFreqVector* vector = reader.get(0, _T("f50")); CuAssertTrue(tc, vector == NULL, _T("")); } catch (CLuceneError& e) { CuFail(tc, e.twhat()); } } CuSuite *testTermVectorsReader(void) { CuSuite *suite = CuSuiteNew(_T("CLucene TermVectorsReader Test")); setUp(); SUITE_ADD_TEST(suite, test); SUITE_ADD_TEST(suite, testTermVectorsReader); SUITE_ADD_TEST(suite, testPositionReader); SUITE_ADD_TEST(suite, testOffsetReader); //SUITE_ADD_TEST(suite, testMapper); SUITE_ADD_TEST(suite, testBadParams); return suite; } clucene-core-2.3.3.4/src/test/index/TestThreading.cpp000066400000000000000000000113451154025176300223630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include #include "CLucene/index/_SegmentHeader.h" #include "CLucene/index/_MultiSegmentReader.h" #include "CLucene/index/MultiReader.h" #include _LUCENE_THREADID_TYPE* atomicSearchThreads = NULL; bool atomicSearchFailed = false; #define ATOMIC_SEARCH_RUN_TIME_SEC 3 _LUCENE_THREAD_FUNC(atomicIndexTest, _writer){ IndexWriter* writer= (IndexWriter*)_writer; uint64_t stopTime = Misc::currentTimeMillis() + 1000*ATOMIC_SEARCH_RUN_TIME_SEC; int count = 0; try { while(Misc::currentTimeMillis() < stopTime && !atomicSearchFailed) { // Update all 100 docs... TCHAR buf[30]; StringBuffer sb; for(int i=0; i<100; i++) { Document d; _i64tot(rand(), buf, 10); sb.clear(); English::IntToEnglish(i+10*count, &sb); d.add(*_CLNEW Field(_T("contents"), sb.getBuffer() , Field::STORE_NO | Field::INDEX_TOKENIZED)); _i64tot(i,buf,10); d.add(*_CLNEW Field(_T("id"), buf, Field::STORE_YES | Field::INDEX_UNTOKENIZED)); Term* t = _CLNEW Term(_T("id"), buf); writer->updateDocument(t, &d); _CLDECDELETE(t); } count++; } } catch (CLuceneError& e) { fprintf(stderr, "err 1: #%d: %s\n", e.number(), e.what()); atomicSearchFailed = true; } _LUCENE_THREAD_FUNC_RETURN(0); } _LUCENE_THREAD_FUNC(atomicSearchTest, _directory){ Directory* directory = (Directory*)_directory; uint64_t stopTime = Misc::currentTimeMillis() + 1000*ATOMIC_SEARCH_RUN_TIME_SEC; int count = 0; try { while(Misc::currentTimeMillis() < stopTime && !atomicSearchFailed) { IndexReader* r = IndexReader::open(directory); try { if ( 100 != r->numDocs() ){ fprintf(stderr, "err 2: 100 != %d \n", r->numDocs()); atomicSearchFailed = true; } } catch (CLuceneError& e) { fprintf(stderr, "err 3: %d:%s\n", e.number(), e.what()); atomicSearchFailed = true; break; } r->close(); _CLDELETE(r); count++; } } catch (CLuceneError& e) { fprintf(stderr, "err 4: #%d: %s\n", e.number(), e.what()); atomicSearchFailed = true; } _LUCENE_THREAD_FUNC_RETURN(0); } /* Run one indexer and 2 searchers against single index as stress test. */ void runThreadingTests(CuTest* tc, Directory& directory){ SimpleAnalyzer ANALYZER; IndexWriter writer(&directory, &ANALYZER, true); // Establish a base index of 100 docs: StringBuffer sb; TCHAR buf[10]; for(int i=0;i<100;i++) { Document d; _i64tot(i,buf,10); d.add(*_CLNEW Field(_T("id"), buf, Field::STORE_YES | Field::INDEX_UNTOKENIZED)); sb.clear(); English::IntToEnglish(i, &sb); d.add(*_CLNEW Field(_T("contents"), sb.getBuffer(), Field::STORE_NO | Field::INDEX_TOKENIZED)); writer.addDocument(&d); } writer.flush(); //read using multiple threads... atomicSearchThreads = _CL_NEWARRAY(_LUCENE_THREADID_TYPE, 4); atomicSearchThreads[0] = _LUCENE_THREAD_CREATE(&atomicIndexTest, &writer); atomicSearchThreads[1] = _LUCENE_THREAD_CREATE(&atomicIndexTest, &writer); atomicSearchThreads[2] = _LUCENE_THREAD_CREATE(&atomicSearchTest, &directory); atomicSearchThreads[3] = _LUCENE_THREAD_CREATE(&atomicSearchTest, &directory); for ( int i=0;i<4;i++ ){ _LUCENE_THREAD_JOIN(atomicSearchThreads[i]); } _CLDELETE_ARRAY(atomicSearchThreads); writer.close(); CuAssert(tc, _T("hit unexpected exception in one of the threads\n"), !atomicSearchFailed); } /* Run above stress test against RAMDirectory and then FSDirectory. */ void testRAMThreading(CuTest *tc){ // First in a RAM directory: RAMDirectory directory; //todo: use MockRAMDirectory? runThreadingTests(tc,directory); directory.close(); } /* Run above stress test against FSDirectory. */ void testFSThreading(CuTest *tc){ //setup some variables char tmpfsdirectory[1024]; strcpy(tmpfsdirectory,cl_tempDir); strcat(tmpfsdirectory,"/threading-index"); // Second in an FSDirectory: Directory* directory = FSDirectory::getDirectory(tmpfsdirectory); runThreadingTests(tc,*directory); directory->close(); _CLDECDELETE(directory); } CuSuite *testatomicupdates(void) { srand ( (unsigned int)Misc::currentTimeMillis() ); CuSuite *suite = CuSuiteNew(_T("CLucene Atomic Updates Test")); SUITE_ADD_TEST(suite, testRAMThreading); SUITE_ADD_TEST(suite, testFSThreading); return suite; } // EOF clucene-core-2.3.3.4/src/test/index/TestUtf8.cpp000066400000000000000000000132731154025176300213060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/util/dirent.h" #include "CLucene/util/CLStreams.h" CL_NS_USE(util) #ifdef _UCS2 void _Index(CuTest *tc, IndexWriter* ndx, const char* file){ char path[CL_MAX_PATH]; TCHAR tlang[20]; strcpy(path,clucene_data_location); strcat(path,"/utf8text"); CuAssert(tc,_T("Utf8 directory does not exist"),Misc::dir_Exists(path)); strcat(path,"/"); strcat(path,file); strcat(path,"_utf8.txt"); CuAssert(tc,_T("Language file does not exist"),Misc::dir_Exists(path)); STRCPY_AtoT(tlang,file,CL_MAX_PATH); Document doc; doc.add(* _CLNEW Field(_T("language"),tlang,Field::STORE_YES | Field::INDEX_UNTOKENIZED)); doc.add(* _CLNEW Field(_T("contents"),_CLNEW FileReader(path, "UTF-8",1024), Field::INDEX_TOKENIZED)); ndx->addDocument(&doc); } void _Search(CuTest *tc, IndexSearcher* srch, Analyzer* analyzer, const char* file, const char* query){ TCHAR tlang[20]; STRCPY_AtoT(tlang,file,CL_MAX_PATH); TCHAR tquery[80]; lucene_utf8towcs(tquery,query,80); Query* q = QueryParser::parse(tquery,_T("contents"), analyzer); Hits* h = srch->search(q); CLUCENE_ASSERT( h->length() == 1 ); Document& doc = h->doc(0); CLUCENE_ASSERT( _tcscmp(doc.get(_T("language")), tlang)==0 ); _CLDELETE(q); _CLDELETE(h); } void testUTF8(CuTest *tc) { RAMDirectory ram; StandardAnalyzer a; IndexWriter ndx(&ram,&a,true); _Index(tc, &ndx,"arabic"); _Index(tc, &ndx,"chinese"); _Index(tc, &ndx,"czech"); _Index(tc, &ndx,"english"); _Index(tc, &ndx,"french"); _Index(tc, &ndx,"german"); _Index(tc, &ndx,"greek"); _Index(tc, &ndx,"hebrew"); _Index(tc, &ndx,"japanese"); _Index(tc, &ndx,"korean"); _Index(tc, &ndx,"polish"); _Index(tc, &ndx,"russian"); ndx.close(); IndexSearcher srch(&ram); _Search(tc,&srch,&a,"arabic", "\xef\xbb\x9e\xef\xbb\xb4\xef\xbb\xa4\xef\xbb\xb3\xef\xba\xad"); //????? - arabic _Search(tc,&srch,&a,"chinese", "\xe5\x95\xa4\xe9\x85\x92"); //?? - chinese _Search(tc,&srch,&a,"czech", "Bud\xc4\x9bjovick\xc3\xbd" ); //Budejovick� - czech _Search(tc,&srch,&a,"english", "google"); //English - google _Search(tc,&srch,&a,"french", "r\xc3\xa9put\xc3\xa9"); //r�put� - french _Search(tc,&srch,&a,"german", "k\xc3\xb6nnen"); //k�nnen - german _Search(tc,&srch,&a,"greek", "\xcf\x83\xcf\x84\xce\xb5\xce\xaf\xce\xbb\xcf\x84\xce\xb5"); //ste??te - greek _Search(tc,&srch,&a,"hebrew", "\xd7\x91\xd7\x90\xd7\xa8\xd7\xa6\xd7\x95\xd7\xaa" ); //?????? - hebrew _Search(tc,&srch,&a,"japanese", "\xe8\xa6\x8b\xe5\xad\xa6" ); //?? - japanese _Search(tc,&srch,&a,"korean", "\xea\xb8\x88" ); //? - korean _Search(tc,&srch,&a,"polish", "sp\xc3\xb3\xc5\x82ka"); ;//sp�lka - polish _Search(tc,&srch,&a,"russian", "\xd0\x92\xd0\xb5\xd0\xbb\xd0\xb8\xd0\xba\xd0\xb8\xd0\xb5\x20"); //??????? - russian srch.close(); } void readBuffered(CuTest* tc, Reader& utf8, Reader& unicode, int readLen){ const TCHAR* buf1; const TCHAR* buf2; int32_t s; size_t p, p1, p2; p = p1 = p2 = 0; while(true){ s = utf8.read(buf1, 1, readLen); if ( s == -1 ) break; p1+=s; s = unicode.read(buf2, 1, readLen); if (s == -1) break; p2+=s; CLUCENE_ASSERT(p1==p2); //make sure both readers read the same amount. todo: i guess this is not strictly required... for ( int32_t i=0;iset( _T("phrase2"), savedStart, savedEnd); return token; }else{ while( input->next(token) ){ if ( _tcscmp(token->termBuffer(), _T("phrase")) == 0 ) { inPhrase = true; savedStart = token->startOffset(); savedEnd = token->endOffset(); token->set( _T("phrase1"), savedStart, savedEnd); return token; }else if ( _tcscmp(token->termBuffer(), _T("stop") ) !=0 ){ return token; } } } return NULL; } }; class MQPTestAnalyzer: public Analyzer { public: MQPTestAnalyzer() { } /** Filters LowerCaseTokenizer with StopFilter. */ TokenStream* tokenStream(const TCHAR* /*fieldName*/, Reader* reader) { return _CLNEW MQPTestFilter(_CLNEW LowerCaseTokenizer(reader)); } }; void assertQueryEquals(CuTest *tc,const TCHAR* result, Query* q) { if ( q == NULL ) return; TCHAR* s = q->toString(); int ret = _tcscmp(s,result); _CLDELETE(q); if ( ret != 0 ) { TCHAR buf[HUGE_STRING_LEN]; _sntprintf(buf, HUGE_STRING_LEN, _T("FAILED Query yielded /%s/, expecting /%s/\n"), s, result); _CLDELETE_LCARRAY(s); CuFail(tc, buf); return; } _CLDELETE_LCARRAY(s); } // verify parsing of query using a stopping analyzer void assertStopQueryEquals(CuTest *tc, const TCHAR* qtxt, const TCHAR* expectedRes) { const TCHAR* fields[] = {_T("b"), _T("t"), NULL }; const uint8_t occur[] = {BooleanClause::SHOULD, BooleanClause::SHOULD, NULL}; MQPTestAnalyzer *a = _CLNEW MQPTestAnalyzer(); MultiFieldQueryParser mfqp(fields, a); Query *q = mfqp.parse(qtxt); assertQueryEquals(tc, expectedRes, q); q = MultiFieldQueryParser::parse(qtxt, reinterpret_cast(&fields), reinterpret_cast(&occur), a); assertQueryEquals(tc, expectedRes, q); _CLDELETE(a); } /** test stop words arsing for both the non static form, and for the * corresponding static form (qtxt, fields[]). */ void tesStopwordsParsing(CuTest *tc) { assertStopQueryEquals(tc, _T("one"), _T("b:one t:one")); assertStopQueryEquals(tc, _T("one stop"), _T("b:one t:one")); assertStopQueryEquals(tc, _T("one (stop)"), _T("b:one t:one")); assertStopQueryEquals(tc, _T("one ((stop))"), _T("b:one t:one")); assertStopQueryEquals(tc, _T("stop"), _T("")); assertStopQueryEquals(tc, _T("(stop)"), _T("")); assertStopQueryEquals(tc, _T("((stop))"), _T("")); } void testMFQPSimple(CuTest *tc) { const TCHAR* fields[] = {_T("b"), _T("t"), NULL}; Analyzer* a = _CLNEW StandardAnalyzer(); MultiFieldQueryParser mfqp(fields, a); Query *q = mfqp.parse(_T("one")); assertQueryEquals(tc, _T("b:one t:one"), q); q = mfqp.parse(_T("one two")); assertQueryEquals(tc, _T("(b:one t:one) (b:two t:two)"),q); q = mfqp.parse(_T("+one +two")); assertQueryEquals(tc, _T("+(b:one t:one) +(b:two t:two)"), q); q = mfqp.parse(_T("+one -two -three")); assertQueryEquals(tc, _T("+(b:one t:one) -(b:two t:two) -(b:three t:three)"), q); q = mfqp.parse(_T("one^2 two")); assertQueryEquals(tc, _T("((b:one t:one)^2.0) (b:two t:two)"), q); q = mfqp.parse(_T("one~ two")); assertQueryEquals(tc, _T("(b:one~0.5 t:one~0.5) (b:two t:two)"), q); q = mfqp.parse(_T("one~0.8 two^2")); assertQueryEquals(tc, _T("(b:one~0.8 t:one~0.8) ((b:two t:two)^2.0)"), q); q = mfqp.parse(_T("one* two*")); assertQueryEquals(tc, _T("(b:one* t:one*) (b:two* t:two*)"), q); q = mfqp.parse(_T("[a TO c] two")); assertQueryEquals(tc, _T("(b:[a TO c] t:[a TO c]) (b:two t:two)"), q); q = mfqp.parse(_T("w?ldcard")); assertQueryEquals(tc, _T("b:w?ldcard t:w?ldcard"), q); q = mfqp.parse(_T("\"foo bar\"")); assertQueryEquals(tc, _T("b:\"foo bar\" t:\"foo bar\""), q); q = mfqp.parse(_T("\"aa bb cc\" \"dd ee\"")); assertQueryEquals(tc, _T("(b:\"aa bb cc\" t:\"aa bb cc\") (b:\"dd ee\" t:\"dd ee\")"), q); q = mfqp.parse(_T("\"foo bar\"~4")); assertQueryEquals(tc, _T("b:\"foo bar\"~4 t:\"foo bar\"~4"), q); // make sure that terms which have a field are not touched: q = mfqp.parse(_T("one f:two")); assertQueryEquals(tc, _T("(b:one t:one) f:two"), q); // AND mode: mfqp.setDefaultOperator(QueryParser::AND_OPERATOR); q = mfqp.parse(_T("one two")); assertQueryEquals(tc, _T("+(b:one t:one) +(b:two t:two)"), q); q = mfqp.parse(_T("\"aa bb cc\" \"dd ee\"")); assertQueryEquals(tc, _T("+(b:\"aa bb cc\" t:\"aa bb cc\") +(b:\"dd ee\" t:\"dd ee\")"), q); _CLDELETE(a); } CuSuite *testMultiFieldQueryParser(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Multi-Field QP Test")); SUITE_ADD_TEST(suite, tesStopwordsParsing); SUITE_ADD_TEST(suite, testMFQPSimple); return suite; } clucene-core-2.3.3.4/src/test/queryParser/TestQueryParser.cpp000066400000000000000000001016161154025176300241540ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" /// Java QueryParser tests /// Helper functions and classes class QPTestFilter: public TokenFilter { public: bool inPhrase; int32_t savedStart, savedEnd; /** * Filter which discards the token 'stop' and which expands the * token 'phrase' into 'phrase1 phrase2' */ QPTestFilter(TokenStream* in): TokenFilter(in,true), inPhrase(false), savedStart(0), savedEnd(0) { } CL_NS(analysis)::Token* next(CL_NS(analysis)::Token* token) { if (inPhrase) { inPhrase = false; token->set( _T("phrase2"), savedStart, savedEnd); return token; }else{ while( input->next(token) != NULL ){ if ( _tcscmp(token->termBuffer(), _T("phrase")) == 0 ) { inPhrase = true; savedStart = token->startOffset(); savedEnd = token->endOffset(); token->set( _T("phrase1"), savedStart, savedEnd); return token; }else if ( _tcscmp(token->termBuffer(), _T("stop") ) !=0 ){ return token; } } } return NULL; } }; class QPTestAnalyzer: public Analyzer { public: QPTestAnalyzer() { } /** Filters LowerCaseTokenizer with StopFilter. */ TokenStream* tokenStream(const TCHAR* /*fieldName*/, Reader* reader) { return _CLNEW QPTestFilter(_CLNEW LowerCaseTokenizer(reader)); } }; class QPTestParser : public QueryParser { public: QPTestParser(TCHAR* f, Analyzer* a) : QueryParser(f, a){ } virtual ~QPTestParser(){ } protected: Query* getFuzzyQuery(TCHAR* /*field*/, TCHAR* /*termStr*/, float_t /*minSimilarity*/) { _CLTHROWA(CL_ERR_Parse,"Fuzzy queries not allowed"); } Query* getWildcardQuery(TCHAR* /*field*/, TCHAR* /*termStr*/) { _CLTHROWA(CL_ERR_Parse,"Wildcard queries not allowed"); } }; QueryParser* getParser(Analyzer* a) { if (a == NULL) return NULL; QueryParser* qp = _CLNEW QueryParser(_T("field"), a); qp->setDefaultOperator(QueryParser::OR_OPERATOR); return qp; } Query* getQuery(CuTest *tc,const TCHAR* query, Analyzer* a, int ignoreCLError=0) { bool del = (a==NULL); QueryParser* qp = NULL; try{ if (a == NULL) a = _CLNEW SimpleAnalyzer(); qp = getParser(a); Query* ret = qp->parse(query); _CLLDELETE(qp); if ( del ) _CLLDELETE(a); return ret; }catch(CLuceneError& e){ _CLLDELETE(qp); if ( del ) _CLLDELETE(a); if (ignoreCLError != e.number()) CuFail(tc,e); else throw e; return NULL; }catch(...){ _CLLDELETE(qp); if ( del ) _CLLDELETE(a); CuFail(tc,_T("/%s/ threw an error.\n"),query); return NULL; } } void assertQueryEquals(CuTest* tc, QueryParser* qp, const TCHAR* field, const TCHAR* query, const TCHAR* result) { Query* q = qp->parse(query); TCHAR* s = q->toString(field); _CLLDELETE(q); if (_tcscmp(s,result)!=0){ TCHAR str[CL_MAX_PATH]; _tcscpy(str,s); _CLDELETE_LCARRAY(s); _CLLDELETE(qp); CuFail(tc, _T("Query /%s/ yielded /%s/, expecting /%s/\n"), query, str, result); return; } _CLDELETE_LCARRAY(s); } void assertQueryEquals(CuTest *tc,const TCHAR* query, Analyzer* a, const TCHAR* result) { Query* q = getQuery(tc,query, a); if ( q == NULL ){ CuFail(tc, _T("getQuery returned NULL unexpectedly for query /%s/\n"), query); return; } TCHAR* s = q->toString(_T("field")); int ret = _tcscmp(s,result); _CLDELETE(q); if ( ret != 0 ) { TCHAR str[CL_MAX_PATH]; _tcscpy(str,s); _CLDELETE_LCARRAY(s); CuFail(tc, _T("FAILED Query /%s/ yielded /%s/, expecting /%s/\n"), query, str, result); } _CLDELETE_CARRAY(s); } void assertWildcardQueryEquals(CuTest *tc, const TCHAR* query, bool lowercase, const TCHAR* result, bool allowLeadingWildcard=false){ SimpleAnalyzer a; QueryParser* qp = getParser(&a); qp->setLowercaseExpandedTerms(lowercase); qp->setAllowLeadingWildcard(allowLeadingWildcard); Query* q = qp->parse(query); _CLLDELETE(qp); TCHAR* s = q->toString(_T("field")); _CLLDELETE(q); if (_tcscmp(s,result) != 0) { TCHAR str[CL_MAX_PATH]; _tcscpy(str,s); _CLDELETE_CARRAY(s); CuFail(tc,_T("WildcardQuery /%s/ yielded /%s/, expecting /%s/"),query, str, result); } _CLDELETE_CARRAY(s); } void assertCorrectQuery(CuTest *tc,const TCHAR* query, Analyzer* a, const char* inst, const TCHAR* msg){ Query* q = getQuery(tc,query,a); bool success = q->instanceOf(inst); _CLDELETE(q); CuAssert(tc,msg,success); } void assertCorrectQuery(CuTest *tc,Query* q, const char* inst, bool bDeleteQuery = false){ bool ret = q->instanceOf(inst); if (bDeleteQuery) _CLLDELETE(q); CuAssertTrue(tc,ret); } void assertParseException(CuTest *tc,const TCHAR* queryString) { try { getQuery(tc,queryString, NULL, CL_ERR_Parse); } catch (CLuceneError&){ return; } CuFail(tc,_T("ParseException expected, not thrown")); } void assertEscapedQueryEquals(CuTest *tc,const TCHAR* query, Analyzer* a, const TCHAR* result){ TCHAR* escapedQuery = QueryParser::escape(query); if (_tcscmp(escapedQuery, result) != 0) { TCHAR str[CL_MAX_PATH]; _tcscpy(str,escapedQuery); _CLDELETE_LCARRAY(escapedQuery); CuFail(tc, _T("Query /%s/ yielded /%s/, expecting /%s/\n"), query, escapedQuery, result); } _CLDELETE_LCARRAY(escapedQuery); } Query* getQueryDOA(const TCHAR* query, Analyzer* a=NULL) { bool bOwnsAnalyzer=false; if (a == NULL){ a = _CLNEW SimpleAnalyzer(); bOwnsAnalyzer=true; } QueryParser* qp = _CLNEW QueryParser(_T("field"), a); qp->setDefaultOperator(QueryParser::AND_OPERATOR); Query* q = qp->parse(query); _CLLDELETE(qp); if (bOwnsAnalyzer) _CLLDELETE(a); return q; } void assertQueryEqualsDOA(CuTest *tc,const TCHAR* query, Analyzer* a, const TCHAR* result){ Query* q = getQueryDOA(query, a); TCHAR* s = q->toString(_T("field")); _CLLDELETE(q); if (_tcscmp(s,result)!=0) { TCHAR str[CL_MAX_PATH]; _tcscpy(str,s); _CLDELETE_LCARRAY(s); CuFail(tc,_T("Query /%s/ yielded /%s/, expecting /%s/"),query, str, result); } _CLDELETE_LCARRAY(s); } /// END Helper functions and classes void testSimple(CuTest *tc) { StandardAnalyzer a; KeywordAnalyzer b; assertQueryEquals(tc,_T("term term term"), NULL, _T("term term term")); #ifdef _UCS2 TCHAR tmp1[100]; lucene_utf8towcs(tmp1,"t\xc3\xbcrm term term",100); assertQueryEquals(tc,tmp1, NULL, tmp1); assertQueryEquals(tc,tmp1, &a, tmp1); lucene_utf8towcs(tmp1,"\xc3\xbcmlaut",100); assertQueryEquals(tc,tmp1, NULL, tmp1); assertQueryEquals(tc,tmp1, &a, tmp1); #endif assertQueryEquals(tc, _T("\"\""), &b, _T("")); assertQueryEquals(tc, _T("foo:\"\""), &b, _T("foo:")); assertQueryEquals(tc,_T("a AND b"), NULL, _T("+a +b")); assertQueryEquals(tc,_T("(a AND b)"), NULL, _T("+a +b")); assertQueryEquals(tc,_T("c OR (a AND b)"), NULL, _T("c (+a +b)")); assertQueryEquals(tc,_T("a AND NOT b"), NULL, _T("+a -b")); assertQueryEquals(tc,_T("a AND -b"), NULL, _T("+a -b")); assertQueryEquals(tc,_T("a AND !b"), NULL, _T("+a -b")); assertQueryEquals(tc,_T("a && b"), NULL, _T("+a +b")); assertQueryEquals(tc,_T("a && ! b"), NULL, _T("+a -b")); assertQueryEquals(tc,_T("a OR b"), NULL, _T("a b")); assertQueryEquals(tc,_T("a || b"), NULL, _T("a b")); assertQueryEquals(tc,_T("a OR !b"), NULL, _T("a -b")); assertQueryEquals(tc,_T("a OR ! b"), NULL, _T("a -b")); assertQueryEquals(tc,_T("a OR -b"), NULL, _T("a -b")); assertQueryEquals(tc,_T("+term -term term"), NULL, _T("+term -term term")); assertQueryEquals(tc,_T("foo:term AND field:anotherTerm"), NULL, _T("+foo:term +anotherterm")); assertQueryEquals(tc,_T("term AND \"phrase phrase\""), NULL, _T("+term +\"phrase phrase\"") ); assertQueryEquals(tc,_T("\"hello there\""), NULL, _T("\"hello there\"") ); assertCorrectQuery(tc, _T("a AND b"), NULL,"BooleanQuery",_T("a AND b") ); assertCorrectQuery(tc, _T("hello"), NULL,"TermQuery", _T("hello")); assertCorrectQuery(tc, _T("\"hello there\""), NULL,"PhraseQuery", _T("\"hello there\"")); assertQueryEquals(tc,_T("germ term^2.0"), NULL, _T("germ term^2.0")); assertQueryEquals(tc,_T("(term)^2.0"), NULL, _T("term^2.0")); assertQueryEquals(tc,_T("(germ term)^2.0"), NULL, _T("(germ term)^2.0")); assertQueryEquals(tc,_T("term^2.0"), NULL, _T("term^2.0")); assertQueryEquals(tc,_T("term^2"), NULL, _T("term^2.0")); assertQueryEquals(tc,_T("term^2.3"), NULL, _T("term^2.3")); assertQueryEquals(tc,_T("\"germ term\"^2.0"), NULL, _T("\"germ term\"^2.0")); assertQueryEquals(tc,_T("\"germ term\"^2.02"), NULL, _T("\"germ term\"^2.0")); assertQueryEquals(tc,_T("\"term germ\"^2"), NULL, _T("\"term germ\"^2.0") ); assertQueryEquals(tc,_T("(foo OR bar) AND (baz OR boo)"), NULL, _T("+(foo bar) +(baz boo)")); assertQueryEquals(tc,_T("((a OR b) AND NOT c) OR d"), NULL, _T("(+(a b) -c) d")); assertQueryEquals(tc,_T("+(apple \"steve jobs\") -(foo bar baz)"), NULL, _T("+(apple \"steve jobs\") -(foo bar baz)") ); assertQueryEquals(tc,_T("+title:(dog OR cat) -author:\"bob dole\""), NULL, _T("+(title:dog title:cat) -author:\"bob dole\"") ); QueryParser* qp = _CLNEW QueryParser(_T("field"), &a); // make sure OR is the default: CLUCENE_ASSERT(QueryParser::OR_OPERATOR == qp->getDefaultOperator()); qp->setDefaultOperator(QueryParser::AND_OPERATOR); CLUCENE_ASSERT(QueryParser::AND_OPERATOR == qp->getDefaultOperator()); // try creating a query and make sure it uses AND Query* bq = qp->parse(_T("term1 term2")); CLUCENE_ASSERT( bq != NULL ); TCHAR* s = bq->toString(_T("field")); if ( _tcscmp(s,_T("+term1 +term2")) != 0 ) { CuFail(tc, _T("FAILED Query /term1 term2/ yielded /%s/, expecting +term1 +term2\n"), s); } _CLDELETE_CARRAY(s); _CLDELETE(bq); qp->setDefaultOperator(QueryParser::OR_OPERATOR); CLUCENE_ASSERT(QueryParser::OR_OPERATOR == qp->getDefaultOperator()); _CLDELETE(qp); } void testPunct(CuTest *tc) { WhitespaceAnalyzer a; assertQueryEquals(tc,_T("a&b"), &a, _T("a&b")); assertQueryEquals(tc,_T("a&&b"), &a, _T("a&&b")); assertQueryEquals(tc,_T(".NET"), &a, _T(".NET")); } void testSlop(CuTest *tc) { assertQueryEquals(tc,_T("\"term germ\"~2"), NULL, _T("\"term germ\"~2") ); assertQueryEquals(tc,_T("\"term germ\"~2 flork"), NULL, _T("\"term germ\"~2 flork") ); assertQueryEquals(tc,_T("\"term\"~2"), NULL, _T("term")); assertQueryEquals(tc,_T("\" \"~2 germ"), NULL, _T("germ")); assertQueryEquals(tc,_T("\"term germ\"~2^2"), NULL, _T("\"term germ\"~2^2.0") ); /* ### These do not work anymore with the new QP, and they do not exist in the official Java tests assertQueryEquals(tc,_T("term~2"), NULL, _T("term")); assertQueryEquals(tc,_T("term~0.5"), NULL, _T("term")); assertQueryEquals(tc,_T("term~0.6"), NULL, _T("term")); */ } void testNumber(CuTest *tc) { // The numbers go away because SimpleAnalzyer ignores them assertQueryEquals(tc,_T("3"), NULL, _T("")); assertQueryEquals(tc,_T("term 1.0 1 2"), NULL, _T("term")); assertQueryEquals(tc,_T("term term1 term2"), NULL, _T("term term term")); StandardAnalyzer a; assertQueryEquals(tc,_T("3"), &a, _T("3")); assertQueryEquals(tc,_T("term 1.0 1 2"), &a, _T("term 1.0 1 2")); assertQueryEquals(tc,_T("term term1 term2"), &a, _T("term term1 term2")); } void testWildcard(CuTest *tc) { assertQueryEquals(tc,_T("term*"), NULL, _T("term*")); assertQueryEquals(tc,_T("term*^2"), NULL, _T("term*^2.0")); assertQueryEquals(tc,_T("term~"), NULL, _T("term~0.5")); assertQueryEquals(tc,_T("term~0.7"), NULL, _T("term~0.7")); assertQueryEquals(tc,_T("term~^2"), NULL, _T("term~0.5^2.0")); assertQueryEquals(tc,_T("term^2~"), NULL, _T("term~0.5^2.0")); assertQueryEquals(tc,_T("term*germ"), NULL, _T("term*germ")); assertQueryEquals(tc,_T("term*germ^3"), NULL, _T("term*germ^3.0")); assertCorrectQuery(tc, _T("term*"), NULL,"PrefixQuery", _T("term*")); assertCorrectQuery(tc, _T("term*^2"), NULL,"PrefixQuery", _T("term*^2.0")); assertCorrectQuery(tc, _T("term~"), NULL,"FuzzyQuery", _T("term~0.5")); assertCorrectQuery(tc, _T("term~0.7"), NULL,"FuzzyQuery", _T("term~0.7")); assertCorrectQuery(tc, _T("t*"), NULL,"PrefixQuery", _T("t*")); FuzzyQuery* fq = (FuzzyQuery*)getQuery(tc,_T("term~0.7"), NULL); float_t simDiff = fq->getMinSimilarity() - 0.7; if ( simDiff < 0 ) simDiff *= -1; CuAssertTrue(tc, simDiff < 0.1); CuAssertTrue(tc, FuzzyQuery::defaultPrefixLength == fq->getPrefixLength()); _CLLDELETE(fq); fq = (FuzzyQuery*)getQuery(tc, _T("term~"), NULL); simDiff = fq->getMinSimilarity() - 0.5; if ( simDiff < 0 ) simDiff *= -1; CuAssertTrue(tc, simDiff < 0.1); CuAssertTrue(tc, FuzzyQuery::defaultPrefixLength == fq->getPrefixLength()); _CLDELETE(fq); assertParseException(tc,_T("term~1.1")); // value > 1, throws exception assertCorrectQuery(tc, _T("term*germ"), NULL,"WildcardQuery", _T("term*germ")); /* Tests to see that wild card terms are (or are not) properly * lower-cased with propery parser configuration */ // First prefix queries: // by default, convert to lowercase: assertWildcardQueryEquals(tc,_T("Term*"), true, _T("term*")); // explicitly set lowercase: assertWildcardQueryEquals(tc,_T("term*"), true, _T("term*")); assertWildcardQueryEquals(tc,_T("Term*"), true, _T("term*")); assertWildcardQueryEquals(tc,_T("TERM*"), true, _T("term*")); // explicitly disable lowercase conversion: assertWildcardQueryEquals(tc,_T("term*"), false, _T("term*")); assertWildcardQueryEquals(tc,_T("Term*"), false, _T("Term*")); assertWildcardQueryEquals(tc,_T("TERM*"), false, _T("TERM*")); // Then 'full' wildcard queries: // by default, convert to lowercase: assertQueryEquals(tc,_T("Te?m"), NULL,_T("te?m")); // explicitly set lowercase: assertWildcardQueryEquals(tc,_T("te?m"), true, _T("te?m")); assertWildcardQueryEquals(tc,_T("Te?m"), true, _T("te?m")); assertWildcardQueryEquals(tc,_T("TE?M"), true, _T("te?m")); assertWildcardQueryEquals(tc,_T("Te?m*gerM"), true, _T("te?m*germ")); // explicitly disable lowercase conversion: assertWildcardQueryEquals(tc,_T("te?m"), false, _T("te?m")); assertWildcardQueryEquals(tc,_T("Te?m"), false, _T("Te?m")); assertWildcardQueryEquals(tc,_T("TE?M"), false, _T("TE?M")); assertWildcardQueryEquals(tc,_T("Te?m*gerM"), false, _T("Te?m*gerM")); // Fuzzy queries: assertQueryEquals(tc,_T("Term~"), NULL,_T("term~0.5")); assertWildcardQueryEquals(tc,_T("Term~"), true, _T("term~0.5")); assertWildcardQueryEquals(tc,_T("Term~"), false, _T("Term~0.5")); // Range queries: assertQueryEquals(tc,_T("[A TO C]"), NULL,_T("[a TO c]")); assertWildcardQueryEquals(tc,_T("[A TO C]"), true, _T("[a TO c]")); assertWildcardQueryEquals(tc,_T("[A TO C]"), false, _T("[A TO C]")); // Test suffix queries: first disallow assertParseException(tc,_T("*Term")); assertParseException(tc,_T("?Term")); // Test suffix queries: then allow assertWildcardQueryEquals(tc,_T("*Term"), true, _T("*term"), true); assertWildcardQueryEquals(tc,_T("?Term"), true, _T("?term"), true); // ### not in the Java tests // assertQueryEquals(tc,_T("term~0.5"), NULL, _T("term")); } void testLeadingWildcardType(CuTest *tc) { SimpleAnalyzer a; QueryParser* qp = getParser(&a); qp->setAllowLeadingWildcard(true); assertCorrectQuery(tc, qp->parse(_T("t*erm*")), WildcardQuery::getClassName(), true); assertCorrectQuery(tc, qp->parse(_T("?t*erm*")), WildcardQuery::getClassName(), true); // should not throw an exception assertCorrectQuery(tc, qp->parse(_T("*t*erm*")), WildcardQuery::getClassName(), true); _CLLDELETE(qp); } void testQPA(CuTest *tc) { QPTestAnalyzer qpAnalyzer; assertQueryEquals(tc,_T("term term^3.0 term"), &qpAnalyzer, _T("term term^3.0 term") ); assertQueryEquals(tc,_T("term stop^3.0 term"), &qpAnalyzer, _T("term term") ); assertQueryEquals(tc,_T("term term term"), &qpAnalyzer, _T("term term term") ); assertQueryEquals(tc,_T("term +stop term"), &qpAnalyzer, _T("term term") ); assertQueryEquals(tc,_T("term -stop term"), &qpAnalyzer, _T("term term") ); assertQueryEquals(tc,_T("drop AND (stop) AND roll"), &qpAnalyzer, _T("+drop +roll") ); assertQueryEquals(tc,_T("term +(stop) term"), &qpAnalyzer, _T("term term") ); assertQueryEquals(tc,_T("term -(stop) term"), &qpAnalyzer, _T("term term") ); assertQueryEquals(tc,_T("drop AND stop AND roll"), &qpAnalyzer, _T("+drop +roll") ); assertQueryEquals(tc,_T("term phrase term"), &qpAnalyzer, _T("term \"phrase1 phrase2\" term") ); assertQueryEquals(tc,_T("term AND NOT phrase term"), &qpAnalyzer, _T("+term -\"phrase1 phrase2\" term") ); assertQueryEquals(tc,_T("stop^3"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("stop"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("(stop)^3"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("((stop))^3"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("(stop^3)"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("((stop)^3)"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("(stop)"), &qpAnalyzer, _T("") ); assertQueryEquals(tc,_T("((stop))"), &qpAnalyzer, _T("") ); assertCorrectQuery(tc, _T("term term term"), &qpAnalyzer,"BooleanQuery", _T("term term term")); assertCorrectQuery(tc, _T("term +stop"), &qpAnalyzer,"TermQuery", _T("term +stop")); } void testRange(CuTest *tc) { StandardAnalyzer a; assertQueryEquals(tc, _T("[ a TO z]"), NULL, _T("[a TO z]")); assertCorrectQuery(tc, _T("[ a TO z]"), NULL, "ConstantScoreRangeQuery", _T("[a TO z]")); QueryParser* qp = _CLNEW QueryParser(_T("field"), &a); qp->setUseOldRangeQuery(true); Query* q = qp->parse(_T("[ a TO z]")); _CLLDELETE(qp); CLUCENE_ASSERT(q->instanceOf("RangeQuery")); _CLLDELETE(q); assertQueryEquals(tc, _T("[ a TO z ]"), NULL, _T("[a TO z]")); assertQueryEquals(tc, _T("{ a TO z}"), NULL, _T("{a TO z}")); assertQueryEquals(tc, _T("{ a TO z }"), NULL, _T("{a TO z}")); assertQueryEquals(tc, _T("{ a TO z }^2.0"), NULL, _T("{a TO z}^2.0")); assertQueryEquals(tc, _T("[ a TO z] OR bar"), NULL, _T("[a TO z] bar")); assertQueryEquals(tc, _T("[ a TO z] AND bar"), NULL, _T("+[a TO z] +bar")); assertQueryEquals(tc, _T("( bar blar { a TO z}) "), NULL, _T("bar blar {a TO z}")); assertQueryEquals(tc, _T("gack ( bar blar { a TO z}) "), NULL, _T("gack (bar blar {a TO z})")); // Old CLucene tests - check this is working without TO as well assertQueryEquals(tc,_T("[ a z]"), NULL, _T("[a TO z]")); assertCorrectQuery(tc, _T("[ a z]"), NULL, "ConstantScoreRangeQuery", _T("[ a z]") ); assertQueryEquals(tc,_T("[ a z ]"), NULL, _T("[a TO z]")); assertQueryEquals(tc,_T("{ a z}"), NULL, _T("{a TO z}")); assertQueryEquals(tc,_T("{ a z }"), NULL, _T("{a TO z}")); assertQueryEquals(tc,_T("{ a z }^2.0"), NULL, _T("{a TO z}^2.0")); assertQueryEquals(tc,_T("[ a z] OR bar"), NULL, _T("[a TO z] bar")); assertQueryEquals(tc,_T("[ a z] AND bar"), NULL, _T("+[a TO z] +bar")); assertQueryEquals(tc,_T("( bar blar { a z}) "), NULL, _T("bar blar {a TO z}")); assertQueryEquals(tc,_T("gack ( bar blar { a z}) "), NULL, _T("gack (bar blar {a TO z})")); // ### Incompatiable with new QP, and does not appear in the Java tests; use the format below instead // assertQueryEquals(tc,_T("[050-070]"), &a, _T("[050 TO -070]")); assertQueryEquals(tc,_T("[050 -070]"), &a, _T("[050 TO -070]")); } /// TODO: Complete missing date tests here /** for testing DateTools support */ TCHAR* getDate(int64_t d, DateTools::Resolution resolution) { if (resolution == DateTools::NO_RESOLUTION) { return DateField::timeToString(d); } else { return DateTools::timeToString(d, resolution); } } /** for testing DateTools support */ TCHAR* getDate(const TCHAR* s, DateTools::Resolution resolution) { return getDate(DateTools::stringToTime(s), resolution); } void assertDateRangeQueryEquals(CuTest* tc, QueryParser* qp, const TCHAR* field, const TCHAR* startDate, const TCHAR* endDate, int64_t endDateInclusive, DateTools::Resolution resolution) { StringBuffer query; query.append(field); query.append(_T(":[")); query.append(startDate); query.append(_T(" TO ")); query.append(endDate); query.appendChar(_T(']')); StringBuffer result; result.appendChar(_T('[')); TCHAR* tmp = getDate(startDate, resolution); result.append(tmp); _CLDELETE_LCARRAY(tmp); result.append(_T(" TO ")); tmp = getDate(endDateInclusive, resolution); result.append(tmp); _CLDELETE_LCARRAY(tmp); result.appendChar(_T(']')); assertQueryEquals(tc, qp, field, query.getBuffer(), result.getBuffer()); query.clear(); result.clear(); query.append(field); query.append(_T(":{")); query.append(startDate); query.append(_T(" TO ")); query.append(endDate); query.appendChar(_T('}')); result.appendChar(_T('{')); tmp = getDate(startDate, resolution); result.append(tmp); _CLDELETE_LCARRAY(tmp); result.append(_T(" TO ")); tmp = getDate(endDate, resolution); result.append(tmp); _CLDELETE_LCARRAY(tmp); result.appendChar(_T('}')); assertQueryEquals(tc, qp, field, query.getBuffer(), result.getBuffer()); } TCHAR* getLocalizedDate(int32_t year, int32_t month, int32_t day, bool extendLastDate) { if (extendLastDate) return CL_NS(document)::DateTools::getISOFormat(year, month, day, 11, 59, 59, 999); else return CL_NS(document)::DateTools::getISOFormat(year, month, day); } void testDateRange(CuTest* tc) { TCHAR* startDate = getLocalizedDate(2002, 1, 1, false); TCHAR* endDate = getLocalizedDate(2002, 1, 4, false); const int64_t endDateExpected = CL_NS(document)::DateTools::getTime(2002,1,4,23,59,59,999); const TCHAR* defaultField = _T("default"); const TCHAR* monthField = _T("month"); const TCHAR* hourField = _T("hour"); SimpleAnalyzer a; QueryParser* qp = _CLNEW QueryParser(_T("field"), &a); // Don't set any date resolution and verify if DateField is used assertDateRangeQueryEquals(tc, qp, defaultField, startDate, endDate, endDateExpected, DateTools::NO_RESOLUTION); // set a field specific date resolution qp->setDateResolution(monthField, DateTools::MONTH_FORMAT); // DateField should still be used for defaultField assertDateRangeQueryEquals(tc, qp, defaultField, startDate, endDate, endDateExpected, DateTools::NO_RESOLUTION); // set default date resolution to MILLISECOND qp->setDateResolution(DateTools::MILLISECOND_FORMAT); // set second field specific date resolution qp->setDateResolution(hourField, DateTools::HOUR_FORMAT); // for this field no field specific date resolution has been set, // so verify if the default resolution is used assertDateRangeQueryEquals(tc, qp, defaultField, startDate, endDate, endDateExpected, DateTools::MILLISECOND_FORMAT); // verify if field specific date resolutions are used for these two fields assertDateRangeQueryEquals(tc, qp, monthField, startDate, endDate, endDateExpected, DateTools::MONTH_FORMAT); assertDateRangeQueryEquals(tc, qp, hourField, startDate, endDate, endDateExpected, DateTools::HOUR_FORMAT); _CLDELETE_LCARRAY(startDate); _CLDELETE_LCARRAY(endDate); } void testEscaped(CuTest *tc) { WhitespaceAnalyzer a; /*assertQueryEquals(tc, _T("\\[brackets"), &a, _T("[brackets") ); assertQueryEquals(tc, _T("\\\\\\[brackets"), &a, _T("\\[brackets") ); assertQueryEquals(tc,_T("\\[brackets"), NULL, _T("brackets") );*/ assertQueryEquals(tc,_T("\\a"), &a, _T("a") ); assertQueryEquals(tc,_T("a\\-b:c"), &a, _T("a-b:c") ); assertQueryEquals(tc,_T("a\\+b:c"), &a, _T("a+b:c") ); assertQueryEquals(tc,_T("a\\:b:c"), &a, _T("a:b:c") ); assertQueryEquals(tc,_T("a\\\\b:c"), &a, _T("a\\b:c") ); assertQueryEquals(tc,_T("a:b\\-c"), &a, _T("a:b-c") ); assertQueryEquals(tc,_T("a:b\\+c"), &a, _T("a:b+c") ); assertQueryEquals(tc,_T("a:b\\:c"), &a, _T("a:b:c") ); assertQueryEquals(tc,_T("a:b\\\\c"), &a, _T("a:b\\c") ); assertQueryEquals(tc,_T("a:b\\-c*"), &a, _T("a:b-c*") ); assertQueryEquals(tc,_T("a:b\\+c*"), &a, _T("a:b+c*") ); assertQueryEquals(tc,_T("a:b\\:c*"), &a, _T("a:b:c*") ); assertQueryEquals(tc,_T("a:b\\\\c*"), &a, _T("a:b\\c*") ); assertQueryEquals(tc,_T("a:b\\-?c"), &a, _T("a:b-?c") ); assertQueryEquals(tc,_T("a:b\\+?c"), &a, _T("a:b+?c") ); assertQueryEquals(tc,_T("a:b\\:?c"), &a, _T("a:b:?c") ); assertQueryEquals(tc,_T("a:b\\\\?c"), &a, _T("a:b\\?c") ); assertQueryEquals(tc,_T("a:b\\-c~"), &a, _T("a:b-c~0.5") ); assertQueryEquals(tc,_T("a:b\\+c~"), &a, _T("a:b+c~0.5") ); assertQueryEquals(tc,_T("a:b\\:c~"), &a, _T("a:b:c~0.5") ); assertQueryEquals(tc,_T("a:b\\\\c~"), &a, _T("a:b\\c~0.5") ); assertQueryEquals(tc,_T("[ a\\- TO a\\+ ]"), &a, _T("[a- TO a+]") ); assertQueryEquals(tc,_T("[ a\\: TO a\\~ ]"), &a, _T("[a: TO a~]") ); assertQueryEquals(tc,_T("[ a\\\\ TO a\\* ]"), &a, _T("[a\\ TO a*]") ); assertQueryEquals(tc, _T("[\"c\\:\\\\temp\\\\\\~foo0.txt\" TO \"c\\:\\\\temp\\\\\\~foo9.txt\"]"), &a, _T("[c:\\temp\\~foo0.txt TO c:\\temp\\~foo9.txt]")); assertQueryEquals(tc, _T("a\\\\\\+b"), &a, _T("a\\+b")); assertQueryEquals(tc, _T("a \\\"b c\\\" d"), &a, _T("a \"b c\" d")); assertQueryEquals(tc, _T("\"a \\\"b c\\\" d\""), &a, _T("\"a \"b c\" d\"")); assertQueryEquals(tc, _T("\"a \\+b c d\""), &a, _T("\"a +b c d\"")); assertQueryEquals(tc, _T("c\\:\\\\temp\\\\\\~foo.txt"), &a, _T("c:\\temp\\~foo.txt")); assertParseException(tc, _T("XY\\")); // there must be a character after the escape char // test unicode escaping assertQueryEquals(tc,_T("a\\u0062c"), &a, _T("abc")); assertQueryEquals(tc,_T("XY\\u005a"), &a, _T("XYZ")); assertQueryEquals(tc,_T("XY\\u005A"), &a, _T("XYZ")); assertQueryEquals(tc,_T("\"a \\\\\\u0028\\u0062\\\" c\""), &a, _T("\"a \\(b\" c\"")); assertParseException(tc,_T("XY\\u005G")); // test non-hex character in escaped unicode sequence assertParseException(tc,_T("XY\\u005")); // test incomplete escaped unicode sequence // Tests bug LUCENE-800 assertQueryEquals(tc,_T("(item:\\\\ item:ABCD\\\\)"), &a, _T("item:\\ item:ABCD\\")); assertParseException(tc,_T("(item:\\\\ item:ABCD\\\\))")); // unmatched closing paranthesis assertQueryEquals(tc,_T("\\*"), &a, _T("*")); assertQueryEquals(tc,_T("\\\\"), &a, _T("\\")); // escaped backslash assertParseException(tc,_T("\\")); // a backslash must always be escaped } void testQueryStringEscaping(CuTest *tc) { WhitespaceAnalyzer a; assertEscapedQueryEquals(tc, _T("a-b:c"), &a, _T("a\\-b\\:c")); assertEscapedQueryEquals(tc,_T("a+b:c"), &a, _T("a\\+b\\:c")); assertEscapedQueryEquals(tc, _T("a:b:c"), &a, _T("a\\:b\\:c")); assertEscapedQueryEquals(tc, _T("a\\b:c"), &a, _T("a\\\\b\\:c")); assertEscapedQueryEquals(tc,_T("a:b-c"), &a, _T("a\\:b\\-c")); assertEscapedQueryEquals(tc,_T("a:b+c"), &a, _T("a\\:b\\+c")); assertEscapedQueryEquals(tc,_T("a:b:c"), &a, _T("a\\:b\\:c")); assertEscapedQueryEquals(tc,_T("a:b\\c"), &a, _T("a\\:b\\\\c")); assertEscapedQueryEquals(tc,_T("a:b-c*"), &a, _T("a\\:b\\-c\\*")); assertEscapedQueryEquals(tc,_T("a:b+c*"), &a, _T("a\\:b\\+c\\*")); assertEscapedQueryEquals(tc,_T("a:b:c*"), &a, _T("a\\:b\\:c\\*")); assertEscapedQueryEquals(tc,_T("a:b\\\\c*"), &a, _T("a\\:b\\\\\\\\c\\*")); assertEscapedQueryEquals(tc,_T("a:b-?c"), &a, _T("a\\:b\\-\\?c")); assertEscapedQueryEquals(tc,_T("a:b+?c"), &a, _T("a\\:b\\+\\?c")); assertEscapedQueryEquals(tc,_T("a:b:?c"), &a, _T("a\\:b\\:\\?c")); assertEscapedQueryEquals(tc,_T("a:b?c"), &a, _T("a\\:b\\?c")); assertEscapedQueryEquals(tc,_T("a:b-c~"), &a, _T("a\\:b\\-c\\~")); assertEscapedQueryEquals(tc,_T("a:b+c~"), &a, _T("a\\:b\\+c\\~")); assertEscapedQueryEquals(tc,_T("a:b:c~"), &a, _T("a\\:b\\:c\\~")); assertEscapedQueryEquals(tc,_T("a:b\\c~"), &a, _T("a\\:b\\\\c\\~")); assertEscapedQueryEquals(tc,_T("[ a - TO a+ ]"), NULL, _T("\\[ a \\- TO a\\+ \\]")); assertEscapedQueryEquals(tc,_T("[ a : TO a~ ]"), NULL, _T("\\[ a \\: TO a\\~ \\]")); assertEscapedQueryEquals(tc,_T("[ a\\ TO a* ]"), NULL, _T("\\[ a\\\\ TO a\\* \\]")); // LUCENE-881 assertEscapedQueryEquals(tc,_T("|| abc ||"), &a, _T("\\|\\| abc \\|\\|")); assertEscapedQueryEquals(tc,_T("&& abc &&"), &a, _T("\\&\\& abc \\&\\&")); } void testTabNewlineCarriageReturn(CuTest *tc){ assertQueryEqualsDOA(tc,_T("+weltbank +worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("+weltbank\n+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \n+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \n +worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("+weltbank\r+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \r+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \r +worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("+weltbank\r\n+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \r\n+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \r\n +worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \r \n +worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("+weltbank\t+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \t+worlbank"), NULL, _T("+weltbank +worlbank")); assertQueryEqualsDOA(tc,_T("weltbank \t +worlbank"), NULL, _T("+weltbank +worlbank")); } void testSimpleDAO(CuTest *tc){ assertQueryEqualsDOA(tc,_T("term term term"), NULL, _T("+term +term +term")); assertQueryEqualsDOA(tc,_T("term +term term"), NULL, _T("+term +term +term")); assertQueryEqualsDOA(tc,_T("term term +term"), NULL, _T("+term +term +term")); assertQueryEqualsDOA(tc,_T("term +term +term"), NULL, _T("+term +term +term")); assertQueryEqualsDOA(tc,_T("-term term term"), NULL, _T("-term +term +term")); } void testBoost(CuTest *tc){ const TCHAR* stopWords[] = {_T("on"), NULL}; StandardAnalyzer* oneStopAnalyzer = _CLNEW StandardAnalyzer(reinterpret_cast(&stopWords)); QueryParser* qp = _CLNEW QueryParser(_T("field"), oneStopAnalyzer); Query* q = qp->parse(_T("on^1.0")); CLUCENE_ASSERT(q != NULL); _CLLDELETE(q); q = qp->parse(_T("\"hello\"^2.0")); CLUCENE_ASSERT(q != NULL); CLUCENE_ASSERT(q->getBoost() == 2.0f); _CLLDELETE(q); q = qp->parse(_T("hello^2.0")); CLUCENE_ASSERT(q != NULL); CLUCENE_ASSERT(q->getBoost() == 2.0f); _CLLDELETE(q); q = qp->parse(_T("\"on\"^1.0")); CLUCENE_ASSERT(q != NULL); _CLLDELETE(q); _CLLDELETE(qp); _CLLDELETE(oneStopAnalyzer); StandardAnalyzer a; QueryParser* qp2 = _CLNEW QueryParser(_T("field"), &a); q = qp2->parse(_T("the^3")); // "the" is a stop word so the result is an empty query: CLUCENE_ASSERT(q != NULL); TCHAR* tmp = q->toString(); CLUCENE_ASSERT( _tcscmp(tmp, _T("")) == 0 ); _CLDELETE_LCARRAY(tmp); CLUCENE_ASSERT(1.0f == q->getBoost()); _CLLDELETE(q); _CLLDELETE(qp2); } /// TODO: Port tests starting from assertParseException void testMatchAllDocs(CuTest *tc) { WhitespaceAnalyzer a; QueryParser* qp = _CLNEW QueryParser(_T("field"), &a); assertCorrectQuery(tc,qp->parse(_T("*:*")),"MatchAllDocsQuery",true); assertCorrectQuery(tc,qp->parse(_T("(*:*)")),"MatchAllDocsQuery",true); BooleanQuery* bq = (BooleanQuery*)qp->parse(_T("+*:* -*:*")); BooleanClause** clauses = _CL_NEWARRAY(BooleanClause*, bq->getClauseCount() + 1); bq->getClauses(clauses); assertCorrectQuery(tc, clauses[0]->getQuery(), "MatchAllDocsQuery"); assertCorrectQuery(tc, clauses[1]->getQuery(), "MatchAllDocsQuery"); _CLDELETE_LARRAY(clauses); _CLLDELETE(bq); _CLLDELETE(qp); } // Tracker Bug ID 2870826 by Veit Jahns void testDefaultField(CuTest* tc){ WhitespaceAnalyzer a; QueryParser* qp = _CLNEW QueryParser(_T("field"), &a); Query* bq = qp->parse(_T("term1 author:term2 term3")); CLUCENE_ASSERT( bq != NULL ); TCHAR* s = bq->toString(_T("field")); _CLLDELETE(bq); if ( _tcscmp(s,_T("term1 author:term2 term3")) != 0 ) CuFail(tc, _T("FAILED Query /term1 author:term2 term3/ yielded /%s/, expecting term1 author:term2 term3\n"), s); _CLDELETE_LCARRAY(s); bq = qp->parse(_T("term1 *:term2 term3")); s = bq->toString(_T("field")); if ( _tcscmp(s,_T("term1 *:term2 term3")) != 0 ) CuFail(tc, _T("FAILED Query /term1 *:term2 term3/ yielded /%s/, expecting term1 *:term2 term3\n"), s); _CLDELETE_LCARRAY(s); _CLLDELETE(bq); _CLLDELETE(qp); } CuSuite *testQueryParser(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Query Parser Test")); SUITE_ADD_TEST(suite, testSimple); SUITE_ADD_TEST(suite, testPunct); SUITE_ADD_TEST(suite, testSlop); SUITE_ADD_TEST(suite, testNumber); SUITE_ADD_TEST(suite, testWildcard); SUITE_ADD_TEST(suite, testLeadingWildcardType); SUITE_ADD_TEST(suite, testQPA); SUITE_ADD_TEST(suite, testRange); //SUITE_ADD_TEST(suite, testDateRange); SUITE_ADD_TEST(suite, testEscaped); SUITE_ADD_TEST(suite, testQueryStringEscaping); SUITE_ADD_TEST(suite, testTabNewlineCarriageReturn); SUITE_ADD_TEST(suite, testSimpleDAO); SUITE_ADD_TEST(suite, testBoost); SUITE_ADD_TEST(suite, testMatchAllDocs); SUITE_ADD_TEST(suite, testDefaultField); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/000077500000000000000000000000001154025176300172445ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/search/BaseTestRangeFilter.cpp000066400000000000000000000063131154025176300236100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "BaseTestRangeFilter.h" #include static const size_t getMaxIntLength() { TCHAR buf[40]; _itot(std::numeric_limits::max(), buf, 10); return _tcslen(buf); } BaseTestRangeFilter::BaseTestRangeFilter(CuTest* _tc) : index(new RAMDirectory()) , maxR(std::numeric_limits::min()), minR(std::numeric_limits::max()) , minId(0), maxId(10000), intLength(getMaxIntLength()) , tc(_tc) { srand ( 101 ); // use a set seed to test is deterministic build(); } BaseTestRangeFilter::~BaseTestRangeFilter() { index->close(); _CLLDECDELETE(index); } std::tstring BaseTestRangeFilter::pad(int n) { std::tstring b; if (n < 0) { b = _T("-"); n = std::numeric_limits::max() + n + 1; } else b = _T("0"); TCHAR buf[40]; _itot(n, buf, 10); for (size_t i = _tcslen(buf); i <= intLength; i++) { b += _T("0"); } b += buf; return b; } void BaseTestRangeFilter::build() { try { /* build an index */ SimpleAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter(index, &a, T); for (int32_t d = minId; d <= maxId; d++) { Document doc; std::tstring paddedD = pad(d); doc.add(* _CLNEW Field(_T("id"),paddedD.c_str(), Field::STORE_YES | Field::INDEX_UNTOKENIZED)); int r= rand(); if (maxR < r) { maxR = r; } if (r < minR) { minR = r; } std::tstring paddedR = pad(r); doc.add( * _CLNEW Field(_T("rand"),paddedR.c_str(), Field::STORE_YES | Field::INDEX_UNTOKENIZED)); doc.add( * _CLNEW Field(_T("body"),_T("body"), Field::STORE_YES | Field::INDEX_UNTOKENIZED)); writer->addDocument(&doc); } writer->optimize(); writer->close(); _CLLDELETE(writer); } catch (CLuceneError&) { _CLTHROWA(CL_ERR_Runtime, "can't build index"); } } void BaseTestRangeFilter::testPad() { const int32_t tests[] = { -9999999, -99560, -100, -3, -1, 0, 3, 9, 10, 1000, 999999999 }; const size_t testsLen = 11; for (size_t i = 0; i < testsLen - 1; i++) { const int32_t a = tests[i]; const int32_t b = tests[i+1]; const TCHAR* aa = pad(a).c_str(); const TCHAR* bb = pad(b).c_str(); StringBuffer label(50); label << a << _T(':') << aa << _T(" vs ") << b << _T(':') << bb; std::tstring tmp(_T("length of ")); tmp += label.getBuffer(); assertEqualsMsg(tmp.c_str(), _tcslen(aa), _tcslen(bb)); tmp = _T("compare less than "); tmp += label.getBuffer(); assertTrueMsg(tmp.c_str(), _tcscmp(aa, bb) < 0); } } // EOF clucene-core-2.3.3.4/src/test/search/BaseTestRangeFilter.h000066400000000000000000000017561154025176300232630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_BaseTestRangeFilter #define _lucene_search_BaseTestRangeFilter #include "test.h" class BaseTestRangeFilter { public: static const bool F = false; static const bool T = true; RAMDirectory* index; int32_t maxR; int32_t minR; int32_t minId; int32_t maxId; const size_t intLength; CuTest* tc; BaseTestRangeFilter(CuTest* _tc); virtual ~BaseTestRangeFilter(); /** * a simple padding function that should work with any int */ std::tstring pad(int32_t n); private: void build(); public: void testPad(); }; #endif clucene-core-2.3.3.4/src/test/search/CheckHits.cpp000066400000000000000000000436551154025176300216320ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "CheckHits.h" #include "QueryUtils.h" ///////////////////////////////////////////////////////////////////////////// float_t CheckHits::EXPLAIN_SCORE_TOLERANCE_DELTA = 0.00005f; ///////////////////////////////////////////////////////////////////////////// /** * Asserts that the score explanation for every document matching a * query corresponds with the true score. * * NOTE: this HitCollector should only be used with the Query and Searcher * specified at when it is constructed. * * @see CheckHits#verifyExplanation */ class ExplanationAsserter : public HitCollector { private: Query * q; Searcher * s; TCHAR * d; bool deep; CuTest * tc; public: /** Constructs an instance which does shallow tests on the Explanation */ ExplanationAsserter( Query * q, const TCHAR * defaultFieldName, Searcher * s, CuTest * tc ) { this->q = q; this->s = s; this->d = q->toString( defaultFieldName ); this->deep = false; this->tc = tc; } ExplanationAsserter( Query * q, const TCHAR * defaultFieldName, Searcher * s, bool deep, CuTest * tc ) { this->q = q; this->s = s; this->d = q->toString( defaultFieldName ); this->deep = deep; this->tc = tc; } virtual ~ExplanationAsserter() { _CLDELETE_LARRAY( d ); } void collect( const int32_t doc, const float_t score ) { Explanation exp; s->explain( q, doc, &exp ); if( exp.getDetailsLength() == 0 ) // ToDo: Fix IndexSearcher::explain() method { StringBuffer buffer; buffer.append( _T( "Explanation of [[" )); buffer.append( d ); buffer.append( _T( "]] for #" )); buffer.appendInt( doc ); buffer.append( _T( " is null" )); assertTrueMsg( buffer.getBuffer(), false ); } assertTrue( exp.getDetailsLength() == 1 ); CheckHits::verifyExplanation( tc, d, doc, score, deep, exp.getDetail( 0 ) ); // ToDo: Fix IndexSearcher::explain() method } }; ///////////////////////////////////////////////////////////////////////////// /** * an IndexSearcher that implicitly checks hte explanation of every match * whenever it executes a search. * * @see ExplanationAsserter */ class ExplanationAssertingSearcher : public CL_NS(search)::IndexSearcher { private: CuTest * tc; public: ExplanationAssertingSearcher( Directory * d, CuTest * tc ) : IndexSearcher( d ) { this->tc = tc; } ExplanationAssertingSearcher( IndexReader * r, CuTest * tc ) : IndexSearcher( r ) { this->tc = tc; } virtual ~ExplanationAssertingSearcher() {} Hits * search( Query * query, Filter * filter ) { checkExplanations( query ); return IndexSearcher::search( query, filter ); } Hits * search( Query * query, Sort * sort ) { checkExplanations( query ); return IndexSearcher::search( query, sort ); } Hits * search( Query * query, Filter * filter, Sort * sort ) { checkExplanations( query ); return IndexSearcher::search( query, filter, sort ); } TopFieldDocs * _search( Query * query, Filter * filter, int32_t n, Sort * sort ) { checkExplanations( query ); return IndexSearcher::_search( query, filter, n, sort ); } void _search( Query * query, HitCollector * results ) { checkExplanations( query ); IndexSearcher::_search( query, NULL, results ); } void _search( Query * query, Filter * filter, HitCollector * results ) { checkExplanations( query ); IndexSearcher::_search( query, filter, results ); } TopDocs * search_( Query * query, Filter * filter, int32_t n ) { checkExplanations( query ); return IndexSearcher::_search( query, filter, n ); } protected: void checkExplanations( Query * q ) { IndexSearcher::_search( q, NULL, _CLNEW ExplanationAsserter( q, NULL, this, tc )); } }; ///////////////////////////////////////////////////////////////////////////// class HitSetCollector : public HitCollector { public: set actual; public: HitSetCollector() : HitCollector() {}; virtual ~HitSetCollector() {}; virtual void collect( const int32_t doc, const float_t score ) { actual.insert( doc ); } }; ///////////////////////////////////////////////////////////////////////////// bool CheckHits::setEquals( set& s1, set& s2 ) { bool bEquals = ( s1.size() == s2.size() ); set::iterator iS1 = s1.begin(); set::iterator iS2 = s2.begin(); for( ; bEquals && ( iS1 != s1.end() ); iS1++, iS2++ ) bEquals = ( *iS1 == *iS2 ); return bEquals; } bool CheckHits::stringEndsWith( const TCHAR* tszStr, const TCHAR * tszEnd ) { if( ! tszStr || ! tszEnd ) return false; size_t lenStr = _tcslen( tszStr ); size_t lenEnd = _tcslen( tszEnd ); if( lenEnd > lenStr ) return false; const TCHAR * tszReadEnd = tszEnd + lenEnd; const TCHAR * tszReadStr = tszStr + lenStr; while( tszEnd != tszReadEnd ) { if( *tszReadEnd-- != *tszReadStr-- ) return false; } return true; } void CheckHits::checkNoMatchExplanations( CuTest* tc, Query * q, const TCHAR * defaultFieldName, Searcher * searcher, int32_t * results, size_t resultsCount ) { TCHAR * d = q->toString( defaultFieldName ); set ignore; for( size_t i = 0; i < resultsCount; i++ ) ignore.insert( results[ i ] ); int32_t maxDoc = searcher->maxDoc(); for( int32_t doc = 0; doc < maxDoc; doc++ ) { if( ignore.find( doc ) != ignore.end() ) continue; Explanation exp; searcher->explain( q, doc, &exp ); if( 0.0f != exp.getValue() ) { StringBuffer buffer; TCHAR * tszExp = exp.toString(); buffer.append( _T( "Explanation of [[" )); buffer.append( d ); buffer.append( _T( "]] for #" )); buffer.appendInt( doc ); buffer.append( _T( " doesn't indicate non-match: " )); buffer.append( tszExp ); _CLDELETE_LARRAY( tszExp ); assertTrueMsg( buffer.getBuffer(), false ); } } _CLDELETE_LARRAY( d ); } void CheckHits::checkHitCollector( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher, int32_t * results, size_t resultsCount ) { set correct; for( size_t i = 0; i < resultsCount; i++ ) correct.insert( results[ i ] ); HitSetCollector hitSet; searcher->_search( query, &hitSet ); if( ! setEquals( correct, hitSet.actual )) { TCHAR * tszQry = query->toString( defaultFieldName ); assertTrueMsg( tszQry, false ); _CLDELETE_LARRAY( tszQry ); } QueryUtils::check( tc, query, searcher ); } ///////////////////////////////////////////////////////////////////////////// void CheckHits::checkHits( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher, int32_t * results, size_t resultsCount ) { if( searcher->getObjectName() == IndexSearcher::getClassName() ) QueryUtils::check( tc, query, (IndexSearcher *) searcher ); // Hits * hits = searcher->search( query ); // // set correct; // for( size_t i = 0; i < resultsCount; i++ ) // correct.insert( results[ i ] ); // // set actual; // for( size_t i = 0; i < hits->length(); i++ ) // actual.insert( hits->id( i )); // // _CLLDELETE( hits ); // // if( ! setEquals( correct, actual )) // { // TCHAR * tszQry = query->toString( defaultFieldName ); // assertTrueMsg( tszQry, false ); // _CLDELETE_LARRAY( tszQry ); // } // // QueryUtils::check( tc, query, searcher ); } void CheckHits::checkDocIds( CuTest* tc, const TCHAR * mes, int32_t * results, size_t resultsCount, Hits * hits ) { StringBuffer buffer; if( resultsCount != hits->length() ) { buffer.append( mes ); buffer.append( _T( " nr of hits" )); assertTrueMsg( buffer.getBuffer(), false ); } for( size_t i = 0; i < resultsCount; i++ ) { if( results[ i ] != hits->id( i )) { buffer.clear(); buffer.append( mes ); buffer.append( _T( " doc nrs for hit " )); buffer.appendInt( i ); assertTrueMsg( buffer.getBuffer(), false ); } } } void CheckHits::checkHitsQuery( CuTest* tc, Query * query, Hits * hits1, Hits * hits2, int32_t * results, size_t resultsCount ) { checkDocIds( tc, _T( "hits1" ), results, resultsCount, hits1 ); checkDocIds( tc, _T( "hits2" ), results, resultsCount, hits2 ); checkEqual( tc, query, hits1, hits2 ); } void CheckHits::checkEqual( CuTest* tc, Query * query, Hits * hits1, Hits * hits2 ) { float_t scoreTolerance = 1.0e-6f; assertTrueMsg( _T( "Unequal lengths of supplied hits." ), hits1->length() == hits2->length() ); for( size_t i = 0; i < hits1->length(); i++ ) { if( hits1->id( i ) != hits2->id( i )) { StringBuffer buffer; buffer.append( _T( "Hit " )); buffer.appendInt( i ); buffer.append( _T( " docnumbers don't match\n" )); appendHits( buffer, hits1, hits2, 0, 0 ); buffer.append( _T( "for query:" )); TCHAR * tszQry = query->toString(); buffer.append( tszQry ); _CLDELETE_LARRAY( tszQry ); assertTrueMsg( buffer.getBuffer(), false ); } float_t sd = hits1->score( i ) - hits2->score( i ); if ( sd < 0 ) sd *= -1; if(( hits1->id( i ) != hits2->id( i )) || sd > scoreTolerance ) { StringBuffer buffer; buffer.append( _T( "Hit " )); buffer.appendInt( i ); buffer.append( _T( ", doc nrs " )); buffer.appendInt( hits1->id( i )); buffer.append( _T( " and " )); buffer.appendInt( hits2->id( i )); buffer.append( _T( "\nunequal : " )); buffer.appendFloat( hits1->score( i ), 2 ); buffer.append( _T( "\n and: " )); buffer.appendFloat( hits2->score( i ), 2 ); buffer.append( _T( "\nfor query:" )); TCHAR *tszQry = query->toString(); buffer.append( tszQry ); _CLDELETE_LARRAY( tszQry ); assertTrueMsg( buffer.getBuffer(), false ); } } } void CheckHits::appendHits( StringBuffer& buffer, Hits * hits1, Hits * hits2, size_t start, size_t end ) { size_t len1 = hits1 ? hits1->length() : 0; size_t len2 = hits2 ? hits2->length() : 0; if( end <= 0 ) end = len1 < len2 ? len2 : len1; // max buffer.append( _T( "Hits length1=" )); buffer.appendInt( len1 ); buffer.append( _T( "\tlength2=" )); buffer.appendInt( len2 ); buffer.append( _T( "\n" )); for( size_t i = start; i < end; i++ ) { buffer.append( _T( "hit=" )); buffer.appendInt( i ); buffer.append( _T( ":" )); if( i < len1 ) { buffer.append( _T( " doc" )); buffer.appendInt( hits1->id( i ) ); buffer.append( _T( "=" )); buffer.appendFloat( hits1->score( i ), 2); } else { buffer.append( _T( " " )); } buffer.append( _T( ",\t" )); if( i < len2 ) { buffer.append( _T( " doc" )); buffer.appendInt( hits2->id( i )); buffer.append( _T( "= ")); buffer.appendFloat( hits2->score( i ), 2 ); } buffer.append( _T( "\n" )); } } void CheckHits::appendTopdocs( StringBuffer& buffer, TopDocs * docs, size_t start, size_t end ) { buffer.append( _T( "TopDocs totalHits=" )); buffer.appendInt( docs->totalHits ); buffer.append( _T( " top=" )); buffer.appendInt( docs->scoreDocsLength ); buffer.append( _T( "\n" )); if( end <= 0 ) end = docs->scoreDocsLength; else end = end < (size_t)docs->scoreDocsLength ? end : (size_t)docs->scoreDocsLength; // min for( size_t i = start; i < end; i++ ) { buffer.append( _T( "\t" )); buffer.appendInt( i ); buffer.append( _T( ") doc=" )); buffer.appendInt( docs->scoreDocs[ i ].doc ); buffer.append( _T( "\tscore=" )); buffer.appendFloat( docs->scoreDocs[ i ].score, 2 ); buffer.append( _T( "\n" )); } } void CheckHits::checkExplanations( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher ) { checkExplanations( tc, query, defaultFieldName, searcher, false ); } void CheckHits::checkExplanations( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher, bool deep ) { ExplanationAsserter asserter( query, defaultFieldName, searcher, deep, tc ); searcher->_search( query, &asserter ); } void CheckHits::verifyExplanation( CuTest* tc, const TCHAR * q, int32_t doc, float_t score, bool deep, Explanation * expl ) { StringBuffer buffer; TCHAR * tmp; float_t value = expl->getValue(); if( ( score > value ? score - value : value - score ) > EXPLAIN_SCORE_TOLERANCE_DELTA ) { buffer.append( q ); buffer.append( _T( ": score(doc=" )); buffer.appendInt( doc ); buffer.append( _T( ")=" )); buffer.appendFloat( score, 2 ); buffer.append( _T( " != explanationScore=" )); buffer.appendFloat( value, 2 ); buffer.append( _T( " Explanation: " )); tmp = expl->toString(); buffer.append( tmp ); _CLDELETE_LARRAY( tmp ); assertTrueMsg( buffer.getBuffer(), false ); } if( ! deep ) return; Explanation ** detail = _CL_NEWARRAY( Explanation *, expl->getDetailsLength() + 1 ); expl->getDetails( detail ); if( expl->getDetailsLength() > 0 ) { if( expl->getDetailsLength() == 1 ) { // simple containment, no matter what the description says, // just verify contained expl has same score verifyExplanation( tc, q, doc, score, deep, detail[ 0 ] ); } else { // explanation must either: // - end with one of: "product of:", "sum of:", "max of:", or // - have "max plus times others" (where is float). float_t x = 0; const TCHAR* descr = expl->getDescription(); TCHAR* descrLwr = STRDUP_TtoT( descr ); _tcslwr( descrLwr ); bool productOf = stringEndsWith( descr, _T( "product of:" )); bool sumOf = stringEndsWith( descr, _T( "sum of:" )); bool maxOf = stringEndsWith( descr, _T( "max of:" )); bool maxTimesOthers = false; if( ! ( productOf || sumOf || maxOf )) { // maybe 'max plus x times others' const TCHAR * k1 = _tcsstr( descr, _T( "max plus " )); if( k1 ) { k1 += 9; // "max plus ".length(); const TCHAR * k2 = _tcsstr( k1, _T( " " )); x = _tcstod( k1, NULL ); // Float::parseFloat( descr.substring(k1,k2).trim()); if( k2 && 0 == _tcscmp( k2, _T( " times others of:" ))) maxTimesOthers = true; } } if( ! ( productOf || sumOf || maxOf || maxTimesOthers )) { buffer.clear(); buffer.append( q ); buffer.append( _T( ": multi valued explanation description=\"" )); buffer.append( descrLwr ); buffer.append( _T( "\" must be 'max of plus x times others' or end with 'product of' or 'sum of:' or 'max of:' - " )); tmp = expl->toString(); buffer.append( tmp ); _CLDELETE_LARRAY( tmp ); assertTrueMsg( buffer.getBuffer(), false ); } float_t sum = 0; float_t product = 1; float_t max = 0; for( size_t i = 0; i < expl->getDetailsLength(); i++ ) { float_t dval = detail[ i ]->getValue(); verifyExplanation( tc, q, doc, dval, deep, detail[ i ] ); product *= dval; sum += dval; max = max > dval ? max : dval; // max } float_t combined = 0; if( productOf ) combined = product; else if( sumOf ) combined = sum; else if( maxOf ) combined = max; else if( maxTimesOthers ) combined = max + x * (sum - max); else { assertTrueMsg( _T( "should never get here!" ), false ); } if( ( combined > value ? combined - value : value - combined ) > EXPLAIN_SCORE_TOLERANCE_DELTA ) { buffer.clear(); buffer.append( q ); buffer.append( _T( ": actual subDetails combined==" )); buffer.appendFloat( combined, 2 ); buffer.append( _T( " != value=" )); buffer.appendFloat( value, 2 ); buffer.append( _T( " Explanation: " )); tmp = expl->toString(); buffer.append( tmp ); _CLDELETE_LARRAY( tmp ); assertTrueMsg( buffer.getBuffer(), false ); } _CLDELETE_LARRAY( descrLwr ); } } _CLDELETE_ARRAY_ALL( detail ); } clucene-core-2.3.3.4/src/test/search/CheckHits.h000066400000000000000000000124021154025176300212610ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_CheckHits #define _lucene_search_CheckHits #include "test.h" class CheckHits { public: /** * Some explains methods calculate their values though a slightly * different order of operations from the actaul scoring method ... * this allows for a small amount of variation */ static float_t EXPLAIN_SCORE_TOLERANCE_DELTA; public: /** * Tests that all documents up to maxDoc which are *not* in the * expected result set, have an explanation which indicates no match * (ie: Explanation value of 0.0f) */ static void checkNoMatchExplanations( CuTest* tc, Query * q, const TCHAR * defaultFieldName, Searcher * searcher, int32_t * results, size_t resultsCount ); /** * Tests that a query matches the an expected set of documents using a * HitCollector. * *

* Note that when using the HitCollector API, documents will be collected * if they "match" regardless of what their score is. *

* @param query the query to test * @param searcher the searcher to test the query against * @param defaultFieldName used for displaing the query in assertion messages * @param results a list of documentIds that must match the query * @see Searcher#search(Query,HitCollector) * @see #checkHits */ static void checkHitCollector( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher, int32_t * results, size_t resultsCount ); /** * Tests that a query matches the an expected set of documents using Hits. * *

* Note that when using the Hits API, documents will only be returned * if they have a positive normalized score. *

* @param query the query to test * @param searcher the searcher to test the query against * @param defaultFieldName used for displaing the query in assertion messages * @param results a list of documentIds that must match the query * @see Searcher#search(Query) * @see #checkHitCollector */ static void checkHits( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher, int32_t * results, size_t resultsCount ); /** Tests that a Hits has an expected order of documents */ static void checkDocIds( CuTest* tc, const TCHAR * mes, int32_t * results, size_t resultsCount, Hits * hits ); /** Tests that two queries have an expected order of documents, * and that the two queries have the same score values. */ static void checkHitsQuery( CuTest* tc, Query * query, Hits * hits1, Hits * hits2, int32_t * results, size_t resultsCount ); static void checkEqual( CuTest* tc, Query * query, Hits * hits1, Hits * hits2 ); static void appendHits( StringBuffer& buffer, Hits * hits1, Hits * hits2, size_t start, size_t end ); static void appendTopdocs( StringBuffer& buffer, TopDocs * docs, size_t start, size_t end ); /** * Asserts that the explanation value for every document matching a * query corresponds with the true score. * * @see ExplanationAsserter * @see #checkExplanations(Query, String, Searcher, boolean) for a * "deep" testing of the explanation details. * * @param query the query to test * @param searcher the searcher to test the query against * @param defaultFieldName used for displaing the query in assertion messages */ static void checkExplanations( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher ); /** * Asserts that the explanation value for every document matching a * query corresponds with the true score. Optionally does "deep" * testing of the explanation details. * * @see ExplanationAsserter * @param query the query to test * @param searcher the searcher to test the query against * @param defaultFieldName used for displayng the query in assertion messages * @param deep indicates whether a deep comparison of sub-Explanation details should be executed */ static void checkExplanations( CuTest* tc, Query * query, const TCHAR * defaultFieldName, Searcher * searcher, bool deep ); /** * Assert that an explanation has the expected score, and optionally that its * sub-details max/sum/factor match to that score. * * @param q String representation of the query for assertion messages * @param doc Document ID for assertion messages * @param score Real score value of doc with query q * @param deep indicates whether a deep comparison of sub-Explanation details should be executed * @param expl The Explanation to match against score */ static void verifyExplanation( CuTest* tc, const TCHAR * q, int32_t doc, float_t score, bool deep, Explanation * expl ); static bool setEquals( set& s1, set& s2 ); static bool stringEndsWith( const TCHAR* tszStr, const TCHAR * tszEnd ); }; #endif clucene-core-2.3.3.4/src/test/search/MockHitCollector.h000066400000000000000000000016671154025176300226340ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2011 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_MockHitCollector #define _lucene_search_MockHitCollector #include "CLucene/search/SearchHeader.h" CL_NS_DEF(search) class MockHitCollector : public HitCollector { public: MockHitCollector() : HitCollector(), collectCalls(0) {} virtual ~MockHitCollector() {} virtual void collect(const int32_t doc, const float_t score) { collectCalls++; } int32_t getCollectCalls() const { return collectCalls; } private: int32_t collectCalls; }; CL_NS_END #endif // _lucene_search_MockHitCollector clucene-core-2.3.3.4/src/test/search/MockScorer.h000066400000000000000000000033441154025176300214700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2011 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_MockScorer #define _lucene_search_MockScorer #include "CLucene/search/Scorer.h" CL_NS_DEF(search) class MockScorer : public Scorer { public: MockScorer(Similarity* similarity) : Scorer(similarity), nextCalls(0), skipToCalls(0), scoreHitCollectorCalls(0), scoreCalls(0) { /* empty */ } virtual bool next() { nextCalls++; return false; } virtual int32_t doc() const { return 0; } virtual bool skipTo(int32_t target) { skipToCalls++; return true; } virtual Explanation* explain(int32_t doc) { return NULL; } virtual TCHAR* toString() { return NULL; } virtual float_t score() { scoreCalls++; return 0; } virtual void score(HitCollector* hc) { scoreHitCollectorCalls++; } int32_t getNextCalls() const { return nextCalls; } int32_t getSkipToCalls() const { return skipToCalls; } int32_t getScoreCalls() const { return scoreCalls; } int32_t getScoreHitCollectorCalls() const { return scoreHitCollectorCalls; } private: int32_t nextCalls; int32_t skipToCalls; int32_t scoreHitCollectorCalls; int32_t scoreCalls; }; CL_NS_END #endif // _lucene_search_MockScorer clucene-core-2.3.3.4/src/test/search/QueryUtils.cpp000066400000000000000000000304701154025176300221020ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "QueryUtils.h" #include "CLucene/search/Scorer.h" #include "CheckHits.h" ///////////////////////////////////////////////////////////////////////////// int32_t QueryUtils::skip_op = 0; int32_t QueryUtils::next_op = 1; float_t QueryUtils::maxDiff = 1e-5f; ///////////////////////////////////////////////////////////////////////////// class WhackyQuery : public CL_NS(search)::Query { public: WhackyQuery() {}; virtual ~WhackyQuery() {} Query * clone() const { return _CLNEW WhackyQuery(); } static const char * getClassName() { return "WhackyQuery"; } const char * getObjectName() const { return getClassName(); } TCHAR* toString(const TCHAR* field) const { return STRDUP_TtoT( _T( "My Whacky Query" )); } bool equals(Query* other) const { if( this == other ) return true; if( other == NULL || !( other->instanceOf( WhackyQuery::getClassName() ))) return false; return true; } size_t hashCode() const { size_t result = Similarity::floatToByte( getBoost() ) ^ 0x97AF937F; return result; } }; ///////////////////////////////////////////////////////////////////////////// class QueryUtilsHitCollector1 : public CL_NS(search)::HitCollector { public: int32_t * order; int32_t * opidx; int32_t orderLength; int32_t * sdoc; Scorer * scorer; Query * q; CuTest * tc; public: void collect( const int32_t doc, const float_t score ) { int32_t op = order[ (opidx[ 0 ]++ ) % orderLength ]; bool more = ( op == QueryUtils::skip_op ) ? scorer->skipTo( sdoc[ 0 ] + 1 ) : scorer->next(); sdoc[ 0 ] = scorer->doc(); float_t scorerScore = scorer->score(); float_t scorerScore2 = scorer->score(); float_t scoreDiff = score > scorerScore ? score - scorerScore : scorerScore - score; float_t scorerDiff = scorerScore2 > scorerScore2 ? scorerScore2 - scorerScore : scorerScore - scorerScore2; if( ! more || doc != sdoc[ 0 ] || scoreDiff > QueryUtils::maxDiff || scorerDiff > QueryUtils::maxDiff ) { StringBuffer buffer; buffer.append( _T( "ERROR matching docs:\n\t" )); buffer.append( doc != sdoc[ 0 ] ? _T( "--> doc=" ) : _T( "doc=" )); buffer.appendInt( sdoc[ 0 ] ); buffer.append( ! more ? _T( "\n\t--> tscorer.more=" ) : _T( "\n\ttscorer.more=" )); buffer.appendBool( more ); buffer.append( scoreDiff > QueryUtils::maxDiff ? _T( "\n\t--> scorerScore=" ) : _T( "\n\tscorerScore=" )); buffer.appendFloat( scorerScore, 2 ); buffer.append( _T( " scoreDiff=" )); buffer.appendFloat( scoreDiff, 2 ); buffer.append( _T( " maxDiff=" )); buffer.appendFloat( QueryUtils::maxDiff, 2 ); buffer.append( scorerDiff > QueryUtils::maxDiff ? _T( "\n\t--> scorerScore2=" ) : _T( "\n\tscorerScore2=" )); buffer.appendFloat( scorerScore2, 2 ); buffer.append( _T( " scorerDiff=" )); buffer.appendFloat( scorerDiff, 2 ); buffer.append( _T( "\n\thitCollector.doc=" )); buffer.appendInt( doc ); buffer.append( _T( " score=" )); buffer.appendFloat( score, 2 ); buffer.append( _T( "\n\t Scorer=" )); TCHAR * tmp = scorer->toString(); buffer.append( tmp ); _CLDELETE_LARRAY( tmp ); buffer.append( _T( "\n\t Query=" )); tmp = q->toString(); buffer.append( tmp ); _CLDELETE_ARRAY( tmp ); buffer.append( _T( "\n\t Order=" )); for( int32_t i = 0; i < orderLength; i++) buffer.append( order[ i ] == QueryUtils::skip_op ? _T( " skip()" ): _T( " next()" )); buffer.append( _T( "\n\t Op=" )); buffer.append( op == QueryUtils::skip_op ? _T( " skip()" ) : _T( " next()" )); assertTrueMsg( buffer.getBuffer(), false ); } } }; ///////////////////////////////////////////////////////////////////////////// class QueryUtilsHitCollector2 : public CL_NS(search)::HitCollector { public: int32_t * lastDoc; Query * q; IndexSearcher * s; CuTest * tc; public: void collect( const int32_t doc, const float_t score ) { for( int32_t i = lastDoc[ 0 ] + 1; i <= doc; i++ ) { Weight * w = q->weight( s ); Scorer * scorer = w->scorer( s->getReader() ); if( ! scorer->skipTo( i ) ) { StringBuffer buffer; buffer.append( _T( "query collected " )); buffer.appendInt( doc ); buffer.append( _T( " but skipTo(" )); buffer.appendInt( i ); buffer.append( _T( ") says no more docs!" )); assertTrueMsg( buffer.getBuffer(), false ); } if( doc != scorer->doc() ) { StringBuffer buffer; buffer.append( _T( "query collected " )); buffer.appendInt( doc ); buffer.append( _T( " but skipTo(" )); buffer.appendInt( i ); buffer.append( _T( ") got to " )); buffer.appendInt( scorer->doc() ); assertTrueMsg( buffer.getBuffer(), false ); } float_t skipToScore = scorer->score(); float_t sd = skipToScore - scorer->score(); if( ( sd < 0 ? sd * -1 : sd ) > QueryUtils::maxDiff ) { StringBuffer buffer; buffer.append( _T( "unstable skipTo(" )); buffer.appendInt( i ); buffer.append( _T( ") score: " )); buffer.appendFloat( skipToScore, 2 ); buffer.append( _T( "/") ); buffer.appendFloat( QueryUtils::maxDiff, 2 ); assertTrueMsg( buffer.getBuffer(), false ); } if( ( skipToScore > score ? skipToScore - score : score - skipToScore ) > QueryUtils::maxDiff ) { StringBuffer buffer; buffer.append( _T( "query assigned doc " )); buffer.appendInt( doc ); buffer.append( _T( " a score of <" )); buffer.appendFloat( score, 2 ); buffer.append( _T( "> but skipTo(" )); buffer.appendInt( i ); buffer.append( _T( ") has <" )); buffer.appendFloat( skipToScore, 2 ); buffer.append( _T( ">!" )); assertTrueMsg( buffer.getBuffer(), false ); } _CLLDELETE( scorer ); _CLLDELETE( w ); } lastDoc[ 0 ] = doc; } }; ///////////////////////////////////////////////////////////////////////////// void QueryUtils::check( CuTest* tc, Query * q ) { checkHashEquals( tc, q ); } void QueryUtils::checkHashEquals( CuTest* tc, Query * q ) { Query * q2 = q->clone(); checkEqual( tc, q, q2 ); Query * q3 = q->clone(); q3->setBoost( 7.21792348f ); checkUnequal( tc, q, q3 ); // test that a class check is done so that no exception is thrown // in the implementation of equals() Query * whacky = _CLNEW WhackyQuery(); whacky->setBoost( q->getBoost() ); checkUnequal( tc, q, whacky ); _CLLDELETE( q2 ); _CLLDELETE( q3 ); _CLLDELETE( whacky ); } void QueryUtils::checkEqual( CuTest* tc, Query * q1, Query * q2 ) { assertTrue( q1->equals( q2 )); assertTrue( q2->equals( q1 )); assertTrue( q1->hashCode() == q2->hashCode() ); } void QueryUtils::checkUnequal( CuTest* tc, Query * q1, Query * q2 ) { assertTrue( ! q1->equals( q2 )); assertTrue( ! q2->equals( q1 )); // possible this test can fail on a hash collision... if that // happens, please change test to use a different example. assertTrue( q1->hashCode() != q2->hashCode()); } void QueryUtils::checkExplanations( CuTest* tc, Query * q, Searcher * s ) { CheckHits::checkExplanations( tc, q, NULL, s, true ); } void QueryUtils::check( CuTest* tc, Query * q1, Searcher * s ) { check( tc, q1 ); if( s ) { if( s->getObjectName() == IndexSearcher::getClassName()) { IndexSearcher * is = (IndexSearcher*) s; checkFirstSkipTo( tc, q1, is ); checkSkipTo( tc, q1, is ); } checkExplanations( tc, q1, s ); checkSerialization( tc, q1, s ); } } void QueryUtils::checkSerialization( CuTest* tc, Query * q, Searcher * s ) { Weight * w = q->weight( s ); // TODO: Port this test // try { // ByteArrayOutputStream bos = new ByteArrayOutputStream(); // ObjectOutputStream oos = new ObjectOutputStream(bos); // oos.writeObject(w.); // oos.close(); // ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); // ois.readObject(); // ois.close(); // // //skip rquals() test for now - most weights don't overide equals() and we won't add this just for the tests. // //TestCase.assertEquals("writeObject(w) != w. ("+w+")",w2,w); // // } catch (Exception e) { // IOException e2 = new IOException("Serialization failed for "+w); // e2.initCause(e); // throw e2; // } _CLLDELETE( w ); } void QueryUtils::checkSkipTo( CuTest* tc, Query * q, IndexSearcher * s ) { if( BooleanQuery::getAllowDocsOutOfOrder()) return; // in this case order of skipTo() might differ from that of next(). int32_t order0[] = {next_op}; int32_t order1[] = {skip_op}; int32_t order2[] = {skip_op, next_op}; int32_t order3[] = {next_op, skip_op}; int32_t order4[] = {skip_op, skip_op, next_op, next_op}; int32_t order5[] = {next_op, next_op, skip_op, skip_op}; int32_t order6[] = {skip_op, skip_op, skip_op, next_op, next_op}; int32_t ordersLength[] = { 1, 1, 2, 2, 4, 4, 5 }; int32_t * orders[] = { order0, order1, order2, order3, order4, order5, order6 }; size_t ordersCount = 7; for( size_t k = 0; k < ordersCount; k++ ) { int32_t * order = orders[ k ]; int32_t opidx[] = { 0 }; Weight * w = q->weight( s ); Scorer * scorer = w->scorer( s->getReader() ); // FUTURE: ensure scorer.doc()==-1 int32_t * sdoc = _CL_NEWARRAY( int32_t, 1 ); sdoc[ 0 ] = -1; QueryUtilsHitCollector1 hitCollector; hitCollector.order = order; hitCollector.opidx = opidx; hitCollector.orderLength = ordersLength[ k ]; hitCollector.sdoc = sdoc; hitCollector.scorer = scorer; hitCollector.q = q; hitCollector.tc = tc; s->_search( q, NULL, &hitCollector ); // make sure next call to scorer is false. int32_t op = order[ (opidx[ 0 ]++ ) % ordersLength[ k ] ]; bool more = ( op == skip_op ) ? scorer->skipTo( sdoc[ 0 ] + 1 ) : scorer->next(); assertTrue( ! more ); _CLDELETE_LARRAY( sdoc ); _CLLDELETE( scorer ); _CLLDELETE( w ); } } void QueryUtils::checkFirstSkipTo( CuTest* tc, Query * q, IndexSearcher * s ) { int32_t lastDoc[] = {-1}; QueryUtilsHitCollector2 hitCollector; hitCollector.lastDoc = lastDoc; hitCollector.q = q; hitCollector.s = s; hitCollector.tc = tc; s->_search( q, NULL, &hitCollector ); Weight * w = q->weight( s ); Scorer * scorer = w->scorer( s->getReader() ); bool more = scorer->skipTo( lastDoc[ 0 ] + 1 ); if( more ) { StringBuffer buffer; buffer.append( _T( "query's last doc was " )); buffer.appendInt( lastDoc[ 0 ] ); buffer.append( _T( " but skipTo(" )); buffer.appendInt( lastDoc[ 0 ] + 1 ); buffer.append( _T( ") got to " )); buffer.appendInt( scorer->doc() ); assertTrueMsg( buffer.getBuffer(), false ); } _CLLDELETE( scorer ); _CLLDELETE( w ); } clucene-core-2.3.3.4/src/test/search/QueryUtils.h000066400000000000000000000036321154025176300215470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_QueryUtils #define _lucene_search_QueryUtils #include "test.h" class QueryUtils { public: static int32_t skip_op; static int32_t next_op; static float_t maxDiff; public: /** Check the types of things query objects should be able to do. */ static void check( CuTest* tc, Query * q ); /** check very basic hashCode and equals */ static void checkHashEquals( CuTest* tc, Query * q ); static void checkEqual( CuTest* tc, Query * q1, Query * q2 ); static void checkUnequal( CuTest* tc, Query * q1, Query * q2); /** deep check that explanations of a query 'score' correctly */ static void checkExplanations( CuTest* tc, Query * q, Searcher * s ); /** * various query sanity checks on a searcher, including explanation checks. * @see #checkExplanations * @see #checkSkipTo * @see #check(Query) */ static void check( CuTest* tc, Query * q1, Searcher * s ); /** alternate scorer skipTo(),skipTo(),next(),next(),skipTo(),skipTo(), etc * and ensure a hitcollector receives same docs and scores */ static void checkSkipTo( CuTest* tc, Query * q, IndexSearcher * s ); private: /** check that the query weight is serializable. * @throws IOException if serialization check fail. */ static void checkSerialization( CuTest* tc, Query * q, Searcher * s ); // check that first skip on just created scorers always goes to the right doc static void checkFirstSkipTo( CuTest* tc, Query * q, IndexSearcher * s ); }; #endif clucene-core-2.3.3.4/src/test/search/TestBoolean.cpp000066400000000000000000000150031154025176300221660ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/search/_BooleanScorer2.h" #include "CLucene/search/Similarity.h" #include "MockScorer.h" #include "MockHitCollector.h" /// TestBooleanQuery.java, ported 5/9/2009 void testEquality(CuTest *tc) { BooleanQuery* bq1 = _CLNEW BooleanQuery(); Term* t = _CLNEW Term(_T("field"), _T("value1")); bq1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("value2")); bq1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); BooleanQuery* nested1 = _CLNEW BooleanQuery(); t = _CLNEW Term(_T("field"), _T("nestedvalue1")); nested1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("nestedvalue2")); nested1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); bq1->add(nested1, true, BooleanClause::SHOULD); BooleanQuery* bq2 = _CLNEW BooleanQuery(); t = _CLNEW Term(_T("field"), _T("value1")); bq2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("value2")); bq2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); BooleanQuery* nested2 = _CLNEW BooleanQuery(); t = _CLNEW Term(_T("field"), _T("nestedvalue1")); nested2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("nestedvalue2")); nested2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); bq2->add(nested2, true, BooleanClause::SHOULD); CLUCENE_ASSERT(bq1->equals(bq2)); _CLLDELETE(bq1); _CLLDELETE(bq2); } void testException(CuTest *tc) { try { BooleanQuery::setMaxClauseCount(0); CuFail(tc, _T("setMaxClauseCount(0) did not throw an exception")); } catch (CLuceneError&) { // okay } } /// TestBooleanScorer.java, ported 5/9/2009 void testBooleanScorer(CuTest *tc) { const TCHAR* FIELD = _T("category"); RAMDirectory directory; const TCHAR* values[] = { _T("1"), _T("2"), _T("3"), _T("4"), NULL}; try { WhitespaceAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter(&directory, &a, true); for (size_t i = 0; values[i]!=NULL; i++) { Document* doc = _CLNEW Document(); doc->add(*_CLNEW Field(FIELD, values[i], Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); } writer->close(); _CLLDELETE(writer); BooleanQuery* booleanQuery1 = _CLNEW BooleanQuery(); Term *t = _CLNEW Term(FIELD, _T("1")); booleanQuery1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(FIELD, _T("2")); booleanQuery1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); BooleanQuery* query = _CLNEW BooleanQuery(); query->add(booleanQuery1, true, BooleanClause::MUST); t = _CLNEW Term(FIELD, _T("9")); query->add(_CLNEW TermQuery(t), true, BooleanClause::MUST_NOT); _CLDECDELETE(t); IndexSearcher *indexSearcher = _CLNEW IndexSearcher(&directory); Hits *hits = indexSearcher->search(query); CLUCENE_ASSERT(2 == hits->length()); // Number of matched documents _CLLDELETE(hits); _CLLDELETE(indexSearcher); _CLLDELETE(query); } catch (CLuceneError& e) { CuFail(tc, e.twhat()); } } /// TestBooleanPrefixQuery.java, ported 5/9/2009 void testBooleanPrefixQuery(CuTest* tc) { RAMDirectory directory; WhitespaceAnalyzer a; const TCHAR* categories[] = {_T("food"), _T("foodanddrink"), _T("foodanddrinkandgoodtimes"), _T("food and drink"), NULL}; Query* rw1 = NULL; Query* rw2 = NULL; try { IndexWriter* writer = _CLNEW IndexWriter(&directory, &a, true); for (size_t i = 0; categories[i]!=NULL; i++) { Document* doc = new Document(); doc->add(*_CLNEW Field(_T("category"), categories[i], Field::STORE_YES | Field::INDEX_UNTOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); } writer->close(); _CLLDELETE(writer); IndexReader* reader = IndexReader::open(&directory); Term* t = _CLNEW Term(_T("category"), _T("foo")); PrefixQuery* query = _CLNEW PrefixQuery(t); _CLDECDELETE(t); rw1 = query->rewrite(reader); BooleanQuery* bq = _CLNEW BooleanQuery(); bq->add(query, true, BooleanClause::MUST); rw2 = bq->rewrite(reader); reader->close(); // TODO: check necessity (_CLLDELETE(reader) alone will not do the same cleanup) _CLLDELETE(reader); _CLLDELETE(bq); } catch (CLuceneError& e) { CuFail(tc, e.twhat()); } BooleanQuery* bq1 = NULL; if (rw1->instanceOf(BooleanQuery::getClassName())) { bq1 = (BooleanQuery*) rw1; } BooleanQuery* bq2 = NULL; if (rw2->instanceOf(BooleanQuery::getClassName())) { bq2 = (BooleanQuery*) rw2; } else { CuFail(tc, _T("Rewrite")); } bool bClausesMatch = bq1->getClauseCount() == bq2->getClauseCount(); _CLLDELETE(rw1); _CLLDELETE(rw2); if (!bClausesMatch) { CuFail(tc, _T("Number of Clauses Mismatch")); } } void testBooleanScorer2WithProhibitedScorer(CuTest* tc) { CL_NS(search)::DefaultSimilarity similarity; BooleanScorer2 scorer(&similarity, 0, true); MockScorer prohibitedScorer(&similarity); scorer.add(&prohibitedScorer, false, true); CL_NS(search)::MockHitCollector collector; scorer.score(&collector); CuAssertIntEquals(tc, _T("Unexpected calls of next()!"), 1, prohibitedScorer.getNextCalls()); } CuSuite *testBoolean(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Boolean Tests")); SUITE_ADD_TEST(suite, testEquality); SUITE_ADD_TEST(suite, testException); SUITE_ADD_TEST(suite, testBooleanScorer); SUITE_ADD_TEST(suite, testBooleanPrefixQuery); SUITE_ADD_TEST(suite, testBooleanScorer2WithProhibitedScorer); //_CrtSetBreakAlloc(1179); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestConstantScoreRangeQuery.cpp000066400000000000000000000460151154025176300254060ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. * ------------------------------------------------------------------------------*/ #include "test.h" #include "QueryUtils.h" #include "BaseTestRangeFilter.h" #include "CLucene/search/ConstantScoreQuery.h" /*------------------------------------------------------------------------------ * Test based on JLucene-2.3.2 (06/08/2010) ------------------------------------------------------------------------------*/ class TestConstantScoreRangeQuery : public BaseTestRangeFilter { private: Directory * m_pSmall; public: TestConstantScoreRangeQuery( CuTest * _tc ) : BaseTestRangeFilter( _tc ), m_pSmall( NULL ) {} ~TestConstantScoreRangeQuery() { if( m_pSmall ) { m_pSmall->close(); _CLLDECDELETE( m_pSmall ); } } ///////////////////////////////////////////////////////////////////////////// void setUp() { TCHAR tbuffer[16]; const TCHAR* data[] = { _T( "A 1 2 3 4 5 6" ), _T( "Z 4 5 6" ), NULL, _T( "B 2 4 5 6" ), _T( "Y 3 5 6" ), NULL, _T( "C 3 6" ), _T( "X 4 5 6" ) }; m_pSmall = _CLNEW RAMDirectory(); Analyzer * pAnalyzer = _CLNEW WhitespaceAnalyzer(); IndexWriter * pWriter = _CLNEW IndexWriter( m_pSmall, pAnalyzer, true ); for( size_t i = 0; i < sizeof( data ) / sizeof( data[0] ); i++ ) { _itot( i, tbuffer, 10 ); Document doc; doc.add( * _CLNEW Field( _T( "id" ), tbuffer, Field::STORE_YES | Field::INDEX_UNTOKENIZED )); doc.add( * _CLNEW Field( _T( "all" ), _T( "all" ), Field::STORE_YES | Field::INDEX_UNTOKENIZED )); if( data[ i ] ) doc.add( * _CLNEW Field( _T( "data" ), data[ i ], Field::STORE_YES | Field::INDEX_TOKENIZED )); pWriter->addDocument( &doc ); } pWriter->optimize(); pWriter->close(); _CLDELETE( pWriter ); _CLDELETE( pAnalyzer ); } ///////////////////////////////////////////////////////////////////////////// Query * csrq(const TCHAR* f, const TCHAR* l, const TCHAR* h, bool il, bool ih) { return _CLNEW ConstantScoreRangeQuery( f, l, h, il, ih ); } ///////////////////////////////////////////////////////////////////////////// void testBasics() { Query * q1 = csrq( _T( "data" ), _T( "1" ), _T( "6" ), true, true ); Query * q2 = csrq( _T( "data" ), _T( "A" ) ,_T( "Z" ), true, true ); QueryUtils::check( tc, q1 ); QueryUtils::check( tc, q2 ); QueryUtils::checkUnequal( tc, q1, q2 ); _CLLDELETE( q2 ); _CLLDELETE( q1 ); } ///////////////////////////////////////////////////////////////////////////// void testEqualScores() { // NOTE: uses index build in *this* setUp IndexReader * pReader = IndexReader::open( m_pSmall ); IndexSearcher * pSearch = _CLNEW IndexSearcher( pReader ); Hits * pResult; // some hits match more terms then others, score should be the same Query * q = csrq( _T( "data" ), _T( "1" ), _T( "6" ), true, true ); pResult = pSearch->search( q ); size_t numHits = pResult->length(); assertEqualsMsg( _T( "wrong number of results" ), 6, numHits ); float_t score = pResult->score( 0 ); for( size_t i = 1; i < numHits; i++ ) { assertTrueMsg( _T( "score was not the same" ), score == pResult->score( i )); } _CLDELETE( pResult ); _CLDELETE( q ); pSearch->close(); _CLDELETE( pSearch ); pReader->close(); _CLDELETE( pReader ); } ///////////////////////////////////////////////////////////////////////////// void testBoost() { // NOTE: uses index build in *this* setUp IndexReader * pReader = IndexReader::open( m_pSmall ); IndexSearcher * pSearch = _CLNEW IndexSearcher( pReader ); Hits * pResult; // test for correct application of query normalization // must use a non score normalizing method for this. Query * q = csrq( _T( "data" ), _T( "1" ), _T( "6" ), true, true ); q->setBoost( 100 ); pResult = pSearch->search( q ); for( size_t i = 1; i < pResult->length(); i++ ) { assertTrueMsg( _T( "score was not was not correct" ), 1.0f == pResult->score( i )); } _CLDELETE( pResult ); _CLDELETE( q ); // // Ensure that boosting works to score one clause of a query higher // than another. // Query * q1 = csrq( _T( "data" ), _T( "A" ), _T( "A" ), true, true ); // matches document #0 q1->setBoost( .1f ); Query * q2 = csrq( _T( "data" ), _T( "Z" ), _T( "Z" ), true, true ); // matches document #1 BooleanQuery * bq = _CLNEW BooleanQuery( true ); bq->add( q1, true, BooleanClause::SHOULD ); bq->add( q2, true, BooleanClause::SHOULD ); pResult = pSearch->search( bq ); assertEquals( 1, pResult->id( 0 )); assertEquals( 0, pResult->id( 1 )); assertTrue( pResult->score( 0 ) > pResult->score( 1 )); _CLDELETE( pResult ); _CLDELETE( bq ); q1 = csrq( _T( "data" ), _T( "A" ), _T( "A" ), true, true ); // matches document #0 q1->setBoost( 10.0f ); q2 = csrq( _T( "data" ), _T( "Z" ), _T( "Z" ), true, true ); // matches document #1 bq = _CLNEW BooleanQuery( true ); bq->add( q1, true, BooleanClause::SHOULD ); bq->add( q2, true, BooleanClause::SHOULD ); pResult = pSearch->search( bq ); assertEquals( 0, pResult->id( 0 )); assertEquals( 1, pResult->id( 1 )); assertTrue( pResult->score( 0 ) > pResult->score( 1 )); _CLDELETE( pResult ); _CLDELETE( bq ); pSearch->close(); _CLDELETE( pSearch ); pReader->close(); _CLDELETE( pReader ); } ///////////////////////////////////////////////////////////////////////////// void testBooleanOrderUnAffected() { // NOTE: uses index build in *this* setUp IndexReader * pReader = IndexReader::open( m_pSmall ); IndexSearcher * pSearch = _CLNEW IndexSearcher( pReader ); // first do a regular RangeQuery which uses term expansion so // docs with more terms in range get higher scores Term * pLower = _CLNEW Term( _T( "data" ), _T( "1" )); Term * pUpper = _CLNEW Term( _T( "data" ), _T( "4" )); Query * rq = _CLNEW RangeQuery( pLower, pUpper, true ); _CLLDECDELETE( pUpper ); _CLLDECDELETE( pLower ); Hits * pExpected = pSearch->search( rq ); size_t numHits = pExpected->length(); // now do a boolean where which also contains a // ConstantScoreRangeQuery and make sure the order is the same BooleanQuery * q = _CLNEW BooleanQuery(); q->add( rq, true, BooleanClause::MUST ); q->add( csrq( _T( "data" ), _T( "1" ), _T( "6" ), true, true ), true, BooleanClause::MUST ); Hits * pActual = pSearch->search( q ); assertEqualsMsg( _T( "wrong number of hits" ), numHits, pActual->length() ); for( size_t i = 0; i < numHits; i++ ) { assertEqualsMsg( _T( "mismatch in docid for a hit" ), pExpected->id( i ), pActual->id( i )); } _CLDELETE( pActual ); _CLDELETE( pExpected ); _CLDELETE( q ); pSearch->close(); _CLDELETE( pSearch ); pReader->close(); _CLDELETE( pReader ); } ///////////////////////////////////////////////////////////////////////////// void testRangeQueryId() { // NOTE: uses index build in *super* setUp IndexReader * pReader = IndexReader::open( index ); IndexSearcher * pSearch = _CLNEW IndexSearcher( pReader ); int32_t medId = ((maxId - minId) / 2); std::tstring sMinIP = pad(minId); std::tstring sMaxIP = pad(maxId); std::tstring sMedIP = pad(medId); const TCHAR* minIP = sMinIP.c_str(); const TCHAR* maxIP = sMaxIP.c_str(); const TCHAR* medIP = sMedIP.c_str(); size_t numDocs = static_cast( pReader->numDocs() ); assertEqualsMsg( _T("num of docs"), numDocs, static_cast(1+ maxId - minId)); Hits * pResult; Query * q; // test id, bounded on both ends q = csrq( _T( "id" ), minIP, maxIP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "find all" ), numDocs, pResult->length() ); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, maxIP, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "all but last" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, maxIP, false, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "all but first" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, maxIP, false,false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "all but ends" ), numDocs-2, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), medIP, maxIP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "med and up" ), 1+maxId-medId, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, medIP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "up to med" ), 1+medId-minId, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); // unbounded id q = csrq( _T( "id" ), minIP, NULL, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "min and up" ), numDocs, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), NULL, maxIP, false, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max and down" ), numDocs, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, NULL, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "not min, but up" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), NULL, maxIP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "not max, but down" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), medIP, maxIP, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "med and up, not max" ), maxId-medId, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, medIP, false,true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "not min, up to med" ), medId-minId, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); // very small sets q = csrq( _T( "id" ), minIP, minIP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "min,min,F,F" ), 0, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), medIP, medIP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "med,med,F,F" ), 0, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id") , maxIP, maxIP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max,max,F,F" ), 0, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), minIP, minIP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "min,min,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), NULL, minIP, false, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "nul,min,F,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), maxIP, maxIP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max,max,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), maxIP, NULL, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max,nul,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "id" ), medIP, medIP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "med,med,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); pSearch->close(); _CLDELETE( pSearch ); pReader->close(); _CLDELETE( pReader ); } ///////////////////////////////////////////////////////////////////////////// void testRangeQueryRand() { // NOTE: uses index build in *super* setUp IndexReader * pReader = IndexReader::open( index ); IndexSearcher * pSearch = _CLNEW IndexSearcher( pReader ); std::tstring sMinRP = pad(minR); std::tstring sMaxRP = pad(maxR); const TCHAR* minRP = sMinRP.c_str(); const TCHAR* maxRP = sMaxRP.c_str(); size_t numDocs = static_cast( pReader->numDocs() ); assertEqualsMsg( _T("num of docs"), numDocs, static_cast(1+ maxId - minId)); Hits * pResult; Query * q; // test extremes, bounded on both ends q = csrq( _T( "rand" ), minRP, maxRP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "find all" ), numDocs, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), minRP, maxRP, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "all but biggest" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), minRP, maxRP, false, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "all but smallest" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), minRP, maxRP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "all but extremes" ), numDocs-2, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); // unbounded q = csrq( _T( "rand" ), minRP, NULL, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "smallest and up" ), numDocs, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), NULL, maxRP, false, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "biggest and down" ), numDocs, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), minRP, NULL, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "not smallest, but up" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), NULL, maxRP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "not biggest, but down" ), numDocs-1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); // very small sets q = csrq( _T( "rand" ), minRP, minRP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "min,min,F,F" ), 0, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), maxRP, maxRP, false, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max,max,F,F" ), 0, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), minRP, minRP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "min,min,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), NULL, minRP, false, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "nul,min,F,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), maxRP, maxRP, true, true ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max,max,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); q = csrq( _T( "rand" ), maxRP, NULL, true, false ); pResult = pSearch->search( q ); assertEqualsMsg( _T( "max,nul,T,T" ), 1, pResult->length()); _CLDELETE( pResult ); _CLDELETE( q ); pSearch->close(); _CLDELETE( pSearch ); pReader->close(); _CLDELETE( pReader ); } ///////////////////////////////////////////////////////////////////////////// // CLucene specific // Visual Studio 2005 shows memory leaks for this test, but some other // tools do not detect any memory leaks. So what is right? // IN VC80 shows memory leaks ONLY if both sub-queries are added as // MUST BooleanClauses. void testBooleanMemLeaks() { IndexReader * pReader = IndexReader::open( m_pSmall ); IndexSearcher * pSearch = _CLNEW IndexSearcher( pReader ); Query * q1 = csrq( _T( "data" ), _T( "A" ), _T( "A" ), true, true ); // matches document #0 Query * q2 = csrq( _T( "data" ), _T( "Z" ), _T( "Z" ), true, true ); // matches document #1 BooleanQuery * bq = _CLNEW BooleanQuery( true ); bq->add( q1, true, BooleanClause::MUST ); bq->add( q2, true, BooleanClause::MUST ); Hits * pResult = pSearch->search( bq ); _CLDELETE( pResult ); _CLDELETE( bq ); pSearch->close(); _CLDELETE( pSearch ); pReader->close(); _CLDELETE( pReader ); } ///////////////////////////////////////////////////////////////////////////// void runTests() { setUp(); testBasics(); testEqualScores(); testBoost(); testBooleanOrderUnAffected(); testRangeQueryId(); testRangeQueryRand(); testBooleanMemLeaks(); } }; ///////////////////////////////////////////////////////////////////////////// void testConstantScoreRangeQuery( CuTest * pTc ) { /// Run Java Lucene tests TestConstantScoreRangeQuery tester( pTc ); tester.runTests(); } ///////////////////////////////////////////////////////////////////////////// CuSuite *testConstantScoreQueries(void) { CuSuite *suite = CuSuiteNew( _T( "CLucene ConstScoreQuery Test" )); SUITE_ADD_TEST(suite, testConstantScoreRangeQuery); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestDateFilter.cpp000066400000000000000000000137731154025176300226460ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" void testBefore(CuTest *tc) { // create an index char fsdir[CL_MAX_PATH]; _snprintf(fsdir,CL_MAX_PATH,"%s/%s",cl_tempDir, "dfindex"); FSDirectory* indexStore = FSDirectory::getDirectory( fsdir); Analyzer* a = _CLNEW SimpleAnalyzer(); IndexWriter* writer = _CLNEW IndexWriter(indexStore, a, true); int64_t now = Misc::currentTimeMillis()/1000; Document doc; // add time that is in the past TCHAR* tn = DateField::timeToString(now - 1000); doc.add(*_CLNEW Field(_T("datefield"), tn,Field::STORE_YES | Field::INDEX_UNTOKENIZED)); _CLDELETE_CARRAY(tn); doc.add(*_CLNEW Field(_T("body"), _T("Today is a very sunny day in New York City"),Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); writer->close(); _CLDELETE( writer ); IndexReader* reader = IndexReader::open(indexStore); IndexSearcher* searcher = _CLNEW IndexSearcher(reader); // filter that should preserve matches DateFilter* df1 = DateFilter::Before(_T("datefield"), now); // filter that should discard matches DateFilter* df2 = DateFilter::Before(_T("datefield"), now - 999999); // search something that doesn't exist with DateFilter Term* term = _CLNEW Term(_T("body"), _T("NoMatchForThis")); Query* query1 = _CLNEW TermQuery(term); _CLDECDELETE(term); // search for something that does exists term=_CLNEW Term(_T("body"), _T("sunny")); Query* query2 = _CLNEW TermQuery(term); _CLDECDELETE(term); Hits* result = NULL; // ensure that queries return expected results without DateFilter first result = searcher->search(query1); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); result = searcher->search(query2); CLUCENE_ASSERT(1 == result->length()); _CLDELETE(result); // run queries with DateFilter result = searcher->search(query1, df1); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); result = searcher->search(query1, df2); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); result = searcher->search(query2, df1); CLUCENE_ASSERT(1 == result->length()); _CLDELETE(result); result = searcher->search(query2, df2); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); reader->close(); searcher->close(); _CLDELETE(a) _CLDELETE(reader); _CLDELETE(searcher); _CLDELETE(query1); _CLDELETE(query2); _CLDELETE(df1); _CLDELETE(df2); indexStore->close(); _CLDECDELETE(indexStore); } void testAfter(CuTest *tc) { // create an index RAMDirectory* indexStore = _CLNEW RAMDirectory; Analyzer* a = _CLNEW SimpleAnalyzer(); IndexWriter* writer = _CLNEW IndexWriter(indexStore, a, true); int64_t now = Misc::currentTimeMillis()/1000; // add time that is in the future TCHAR* tf = DateField::timeToString(now + 888888); Document* doc = _CLNEW Document; doc->add(*_CLNEW Field(_T("datefield"), tf,Field::STORE_YES | Field::INDEX_UNTOKENIZED)); _CLDELETE_CARRAY(tf); doc->add(*_CLNEW Field(_T("body"), _T("Today is a very sunny day in New York City"),Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLDELETE(doc); writer->close(); _CLDELETE( writer ); //read the index IndexReader* reader = IndexReader::open(indexStore); IndexSearcher* searcher = _CLNEW IndexSearcher(reader); // filter that should preserve matches DateFilter* df1 = DateFilter::After(_T("datefield"), now); // filter that should discard matches DateFilter* df2 = DateFilter::After(_T("datefield"), now + 999999); // search something that doesn't exist with DateFilter Term* term = _CLNEW Term(_T("body"), _T("NoMatchForThis")); Query* query1 = _CLNEW TermQuery(term); _CLDECDELETE(term); // search for something that does exists term=_CLNEW Term(_T("body"), _T("sunny")); Query* query2 = _CLNEW TermQuery(term); _CLDECDELETE(term); Hits* result = NULL; // ensure that queries return expected results without DateFilter first result = searcher->search(query1); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); result = searcher->search(query2); CLUCENE_ASSERT(1 == result->length()); _CLDELETE(result); // run queries with DateFilter result = searcher->search(query1, df1); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); result = searcher->search(query1, df2); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); result = searcher->search(query2, df1); CLUCENE_ASSERT(1 == result->length()); _CLDELETE(result); result = searcher->search(query2, df2); CLUCENE_ASSERT(0 == result->length()); _CLDELETE(result); reader->close(); searcher->close(); _CLDELETE(query1); _CLDELETE(query2); _CLDELETE(df1); _CLDELETE(df2); _CLDELETE(reader); _CLDELETE(searcher); _CLDELETE(a); indexStore->close(); _CLDECDELETE(indexStore); } void testDateFilterDestructor(CuTest *tc){ char loc[1024]; strcpy(loc, clucene_data_location); strcat(loc, "/reuters-21578-index"); CuAssert(tc,_T("Index does not exist"),Misc::dir_Exists(loc)); IndexReader* reader = IndexReader::open(loc); int64_t now = Misc::currentTimeMillis()/1000; DateFilter* df1 = DateFilter::After(_T("datefield"), now); BitSet* bs = df1->bits(reader); _CLDELETE(bs); _CLDELETE(df1); reader->close(); _CLDELETE(reader); } CuSuite *testdatefilter(void) { CuSuite *suite = CuSuiteNew(_T("CLucene DateFilter Test")); SUITE_ADD_TEST(suite, testDateFilterDestructor); SUITE_ADD_TEST(suite, testBefore); SUITE_ADD_TEST(suite, testAfter); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestExplanations.cpp000066400000000000000000000150641154025176300232630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestExplanations.h" #include "CheckHits.h" #include "CLucene/search/spans/SpanQuery.h" #include "CLucene/search/spans/SpanOrQuery.h" #include "CLucene/search/spans/SpanTermQuery.h" #include "CLucene/search/spans/SpanNotQuery.h" #include "CLucene/search/spans/SpanNearQuery.h" #include "CLucene/search/spans/SpanFirstQuery.h" ///////////////////////////////////////////////////////////////////////////// const TCHAR * TestExplanations::field = _T( "field" ); const TCHAR * TestExplanations::docFields[] = { _T( "w1 w2 w3 w4 w5" ), _T( "w1 w3 w2 w3 zz" ), _T( "w1 xx w2 yy w3" ), _T( "w1 w3 xx w2 yy w3 zz" ) }; ///////////////////////////////////////////////////////////////////////////// TestExplanations::ItemizedFilter::ItemizedFilter( int32_t * docs, size_t docsCount ) { this->docs = _CL_NEWARRAY( int32_t, docsCount ); memcpy( this->docs, docs, docsCount * sizeof( int32_t )); this->docsCount = docsCount; } TestExplanations::ItemizedFilter::~ItemizedFilter() { _CLDELETE_LARRAY( docs ); docsCount = 0; } CL_NS(util)::BitSet * TestExplanations::ItemizedFilter::bits( CL_NS(index)::IndexReader * r ) { CL_NS(util)::BitSet * b = _CLNEW CL_NS(util)::BitSet( r->maxDoc() ); for( size_t i = 0; i < docsCount; i++ ) b->set( docs[ i ] ); return b; } ///////////////////////////////////////////////////////////////////////////// TestExplanations::TestExplanations( CuTest* tc ) { this->searcher = NULL; this->directory = NULL; this->qp = NULL; this->qpAnalyzer = NULL; this->tc = tc; } TestExplanations::~TestExplanations() { if( searcher ) { searcher->close(); _CLDELETE( searcher ); } if( directory ) { directory->close(); _CLDELETE( directory ); } if( qp ) { _CLDELETE( qp ); } if( qpAnalyzer ) { _CLDELETE( qpAnalyzer ); } } void TestExplanations::setUp() { directory = _CLNEW RAMDirectory(); qpAnalyzer = _CLNEW WhitespaceAnalyzer(); qp = _CLNEW QueryParser( field, qpAnalyzer ); IndexWriter * writer= _CLNEW IndexWriter( directory, qpAnalyzer, true ); for( size_t i = 0; i < sizeof( docFields ) / sizeof( docFields[0] ); i++ ) { Document doc; doc.add( * _CLNEW Field( field, docFields[ i ], Field::STORE_NO | Field::INDEX_TOKENIZED )); writer->addDocument( &doc ); } writer->close(); _CLDELETE( writer ); searcher = _CLNEW IndexSearcher( directory ); } Query * TestExplanations::makeQuery( const TCHAR * queryText ) { return qp->parse( queryText ); } void TestExplanations::qtest( const TCHAR * queryText, int32_t * expDocNrs, size_t expDocNrsCount ) { Query * q = makeQuery( queryText ); qtest( q , expDocNrs, expDocNrsCount ); _CLLDELETE( q ); } void TestExplanations::qtest( Query * q, int32_t * expDocNrs, size_t expDocNrsCount ) { CheckHits::checkHitCollector( tc, q, field, searcher, expDocNrs, expDocNrsCount ); } void TestExplanations::bqtest( Query * q, int32_t * expDocNrs, size_t expDocNrsCount ) { qtest( reqB( q ), expDocNrs, expDocNrsCount ); qtest( optB( q ), expDocNrs, expDocNrsCount ); } void TestExplanations::bqtest( const TCHAR * queryText, int32_t * expDocNrs, size_t expDocNrsCount ) { Query * q = makeQuery( queryText ); bqtest( q, expDocNrs, expDocNrsCount ); _CLLDELETE( q ); } Term ** TestExplanations::ta( const TCHAR ** s, size_t count ) { Term ** t = _CL_NEWARRAY( Term *, count ); for( size_t i = 0; i < count; i++ ) t[ i ] = _CLNEW Term( field, s[ i ] ); return t; } SpanTermQuery * TestExplanations::st( const TCHAR * s ) { Term * t = _CLNEW Term( field, s ); SpanTermQuery * q = _CLNEW SpanTermQuery( t ); _CLLDECDELETE( t ); return q; } SpanNotQuery * TestExplanations::snot( SpanQuery * i, SpanQuery * e ) { return _CLNEW SpanNotQuery( i, e, true ); } SpanOrQuery * TestExplanations::sor( const TCHAR * s, const TCHAR * e ) { return sor( st( s ), st( e )); } SpanOrQuery * TestExplanations::sor( SpanQuery * s, SpanQuery * e ) { SpanQuery * clauses[] = { s, e }; return _CLNEW SpanOrQuery( clauses, clauses+2, true ); } SpanOrQuery * TestExplanations::sor( const TCHAR * s, const TCHAR * m, const TCHAR * e) { return sor(st(s), st(m), st(e)); } SpanOrQuery * TestExplanations::sor( SpanQuery * s, SpanQuery * m, SpanQuery * e ) { SpanQuery * clauses[] = { s, m, e }; return _CLNEW SpanOrQuery( clauses, clauses+3, true ); } SpanNearQuery * TestExplanations::snear( const TCHAR * s, const TCHAR * e, int32_t slop, bool inOrder ) { return snear( st(s), st(e), slop, inOrder ); } SpanNearQuery * TestExplanations::snear( SpanQuery * s, SpanQuery * e, int32_t slop, bool inOrder ) { SpanQuery * clauses[] = { s, e }; return _CLNEW SpanNearQuery( clauses, clauses+2, slop, inOrder, true ); } SpanNearQuery * TestExplanations::snear( const TCHAR * s, const TCHAR * m, const TCHAR * e, int32_t slop, bool inOrder ) { return snear( st( s ), st( m ), st( e ), slop, inOrder ); } SpanNearQuery * TestExplanations::snear( SpanQuery * s, SpanQuery * m, SpanQuery * e, int32_t slop, bool inOrder ) { SpanQuery * clauses[] = { s, m, e }; return _CLNEW SpanNearQuery( clauses, clauses+3, slop, inOrder, true ); } SpanFirstQuery * TestExplanations::sf( const TCHAR * s, int32_t b ) { return _CLNEW SpanFirstQuery( st( s ), b, true ); } Query * TestExplanations::optB( const TCHAR * q ) { return optB( makeQuery( q )); } Query * TestExplanations::optB( Query * q ) { Term * t = _CLNEW Term( _T( "NEVER" ), _T( "MATCH" )); TermQuery * tq = _CLNEW TermQuery( t ); _CLLDECDELETE( t ); BooleanQuery * bq = _CLNEW BooleanQuery( true ); bq->add( q, true, BooleanClause::SHOULD ); bq->add( tq, true, BooleanClause::MUST_NOT ); return bq; } Query * TestExplanations::reqB( const TCHAR * q ) { return reqB( makeQuery( q )); } Query * TestExplanations::reqB( Query * q ) { Term * t = _CLNEW Term( field, _T( "w1" )); TermQuery * tq = _CLNEW TermQuery( t ); _CLLDECDELETE( t ); BooleanQuery * bq = _CLNEW BooleanQuery( true ); bq->add( q, BooleanClause::MUST ); bq->add( tq, BooleanClause::SHOULD ); return bq; } clucene-core-2.3.3.4/src/test/search/TestExplanations.h000066400000000000000000000122271154025176300227260ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_TestExplanations #define _lucene_search_TestExplanations #include "test.h" CL_CLASS_DEF2(search,spans,SpanQuery); CL_CLASS_DEF2(search,spans,SpanOrQuery); CL_CLASS_DEF2(search,spans,SpanTermQuery); CL_CLASS_DEF2(search,spans,SpanNotQuery); CL_CLASS_DEF2(search,spans,SpanNearQuery); CL_CLASS_DEF2(search,spans,SpanFirstQuery); CL_NS_USE2(search,spans); /** * Tests primative queries (ie: that rewrite to themselves) to * insure they match the expected set of docs, and that the score of each * match is equal to the value of the scores explanation. * *

* The assumption is that if all of the "primative" queries work well, * then anythingthat rewrites to a primative will work well also. *

* * @see "Subclasses for actual tests" */ class TestExplanations { public: /** A filter that only lets the specified document numbers pass */ class ItemizedFilter : public CL_NS(search)::Filter { public: int32_t * docs; size_t docsCount; public: ItemizedFilter( int32_t * docs, size_t docsCount ); virtual ~ItemizedFilter(); CL_NS(util)::BitSet * bits( CL_NS(index)::IndexReader * r ); }; protected: CL_NS(search)::IndexSearcher * searcher; CL_NS(store)::RAMDirectory * directory; CL_NS(queryParser)::QueryParser * qp; CL_NS(analysis)::Analyzer * qpAnalyzer; static const TCHAR * docFields[]; static const TCHAR * field; CuTest * tc; public: TestExplanations( CuTest* tc ); virtual ~TestExplanations(); void setUp(); Query * makeQuery( const TCHAR * queryText ); /** check the expDocNrs first, then check the query (and the explanations) */ virtual void qtest( const TCHAR * queryText, int32_t * expDocNrs, size_t expDocNrsCount ); /** check the expDocNrs first, then check the query (and the explanations) */ virtual void qtest( Query * q, int32_t * expDocNrs, size_t expDocNrsCount ); /** * Tests a query using qtest after wrapping it with both optB and reqB * @see #qtest * @see #reqB * @see #optB */ virtual void bqtest( Query * q, int32_t * expDocNrs, size_t expDocNrsCount ); /** * Tests a query using qtest after wrapping it with both optB and reqB * @see #qtest * @see #reqB * @see #optB */ virtual void bqtest( const TCHAR * queryText, int32_t * expDocNrs, size_t expDocNrsCount ); /** helper for generating MultiPhraseQueries */ static Term ** ta( const TCHAR ** s, size_t count ); /** MACRO for SpanTermQuery */ CL_NS2(search,spans)::SpanTermQuery * st( const TCHAR * s); /** MACRO for SpanNotQuery */ SpanNotQuery * snot( SpanQuery * i, SpanQuery * e); /** MACRO for SpanOrQuery containing two SpanTerm queries */ SpanOrQuery * sor( const TCHAR * s, const TCHAR * e ); /** MACRO for SpanOrQuery containing two SpanQueries */ SpanOrQuery * sor( SpanQuery * s, SpanQuery * e ); /** MACRO for SpanOrQuery containing three SpanTerm queries */ SpanOrQuery * sor( const TCHAR * s, const TCHAR * m, const TCHAR * e ); /** MACRO for SpanOrQuery containing two SpanQueries */ SpanOrQuery * sor( SpanQuery * s, SpanQuery * m, SpanQuery * e ); /** MACRO for SpanNearQuery containing two SpanTerm queries */ SpanNearQuery * snear( const TCHAR * s, const TCHAR * e, int32_t slop, bool inOrder ); /** MACRO for SpanNearQuery containing two SpanQueries */ SpanNearQuery * snear( SpanQuery * s, SpanQuery * e, int32_t slop, bool inOrder ); /** MACRO for SpanNearQuery containing three SpanTerm queries */ SpanNearQuery * snear( const TCHAR * s, const TCHAR * m, const TCHAR * e, int32_t slop, bool inOrder ); /** MACRO for SpanNearQuery containing three SpanQueries */ SpanNearQuery * snear( SpanQuery * s, SpanQuery * m, SpanQuery * e, int32_t slop, bool inOrder ); /** MACRO for SpanFirst(SpanTermQuery) */ SpanFirstQuery * sf( const TCHAR * s, int32_t b ); /** * MACRO: Wraps a Query in a BooleanQuery so that it is optional, along * with a second prohibited clause which will never match anything */ Query * optB( const TCHAR * q ); /** * MACRO: Wraps a Query in a BooleanQuery so that it is optional, along * with a second prohibited clause which will never match anything */ Query * optB( Query * q ); /** * MACRO: Wraps a Query in a BooleanQuery so that it is required, along * with a second optional clause which will match everything */ Query * reqB( const TCHAR * q ); /** * MACRO: Wraps a Query in a BooleanQuery so that it is required, along * with a second optional clause which will match everything */ Query * reqB( Query * q ); }; #endif clucene-core-2.3.3.4/src/test/search/TestExtractTerms.cpp000066400000000000000000000222511154025176300232370ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Jiri Splichal and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" ///////////////////////////////////////////////////////////////////////////// Directory * setUpIndex() { TCHAR tbuffer[16]; const TCHAR* data[] = { _T( "aaaaa aaaab aaabb aabbb abbbb bbbbb" ), _T( "aaaaa aaaac aaacc aaccc acccc ccccc" ) }; RAMDirectory * pDirectory = _CLNEW RAMDirectory(); WhitespaceAnalyzer analyzer; IndexWriter writer( pDirectory, &analyzer, true ); for( int i = 0; i < sizeof( data ) / sizeof( data[0] ); i++ ) { _itot( i, tbuffer, 10 ); Document doc; doc.add( * _CLNEW Field( _T( "id" ), tbuffer, Field::STORE_YES | Field::INDEX_UNTOKENIZED )); doc.add( * _CLNEW Field( _T( "data" ), data[ i ], Field::STORE_YES | Field::INDEX_TOKENIZED )); writer.addDocument( &doc ); } writer.optimize(); writer.close(); return pDirectory; } ///////////////////////////////////////////////////////////////////////////// void closeIndex( Directory * pDirectory ) { if( pDirectory ) { pDirectory->close(); _CLLDECDELETE( pDirectory ); } } ///////////////////////////////////////////////////////////////////////////// void clearTermSet( TermSet& termSet ) { for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; _CLLDECDELETE( pTerm ); } termSet.clear(); } ///////////////////////////////////////////////////////////////////////////// void testExtractFromTermQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; Term * t1 = _CLNEW Term( _T("data"), _T("aaaaa") ); Term * t2 = _CLNEW Term( _T("data"), _T("bbbbb") ); Query * q1 = _CLNEW TermQuery( t1 ); Query * q2 = _CLNEW TermQuery( t2 ); Query * rewrite1 = q1->rewrite( pReader ); Query * rewrite2 = q2->rewrite( pReader ); rewrite1->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 1, termSet.size() ); assertEqualsMsg( _T( "wrong term" ), 0, t1->compareTo( *(termSet.begin())) ); clearTermSet( termSet ); rewrite2->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 1, termSet.size() ); assertEqualsMsg( _T( "wrong term" ), 0, t2->compareTo( *(termSet.begin())) ); clearTermSet( termSet ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); if( q1 != rewrite1 ) _CLDELETE( rewrite1 ); _CLDELETE( q1 ); if( q2 != rewrite2 ) _CLDELETE( rewrite2 ); _CLDELETE( q2 ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; } ///////////////////////////////////////////////////////////////////////////// void testExtractFromPhraseQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; Term * t1 = _CLNEW Term( _T("data"), _T("aaaab") ); Term * t2 = _CLNEW Term( _T("data"), _T("ccccc") ); Term * t3 = _CLNEW Term( _T("data"), _T("aaaab") ); PhraseQuery * phrase = _CLNEW PhraseQuery(); phrase->add( t1 ); phrase->add( t2 ); phrase->add( t3 ); Query * rewrite = phrase->rewrite( pReader ); rewrite->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 2, termSet.size() ); for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; assertTrueMsg( _T( "wrong term" ), ( 0 == t1->compareTo( pTerm ) || 0 == t2->compareTo( pTerm ))); } clearTermSet( termSet ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); _CLLDECDELETE( t3 ); if( rewrite != phrase ) _CLDELETE( rewrite ); _CLDELETE( phrase ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; } ///////////////////////////////////////////////////////////////////////////// void testExtractFromBooleanQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; Term * t1 = _CLNEW Term( _T("data"), _T("aaaab") ); Term * t2 = _CLNEW Term( _T("data"), _T("aaabb") ); Term * t3 = _CLNEW Term( _T("data"), _T("aaabb") ); BooleanQuery * bq = _CLNEW BooleanQuery(); bq->add( _CLNEW TermQuery( t1 ), true, BooleanClause::SHOULD ); bq->add( _CLNEW TermQuery( t2 ), true, BooleanClause::SHOULD ); bq->add( _CLNEW TermQuery( t3 ), true, BooleanClause::SHOULD ); Query * rewrite = bq->rewrite( pReader ); rewrite->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 2, termSet.size() ); for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; assertTrueMsg( _T( "wrong term" ), ( 0 == t1->compareTo( pTerm ) || 0 == t2->compareTo( pTerm ))); } clearTermSet( termSet ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); _CLLDECDELETE( t3 ); if( rewrite != bq ) _CLDELETE( rewrite ); _CLDELETE( bq ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; } ///////////////////////////////////////////////////////////////////////////// void testExtractFromWildcardQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; WildcardQuery * wildcard; Term * t1; Query * rewrite; t1 = _CLNEW Term( _T("data"), _T("aaaa?") ); wildcard = _CLNEW WildcardQuery( t1 ); rewrite = wildcard->rewrite( pReader ); rewrite->extractTerms( &termSet ); _CLLDECDELETE( t1 ); assertEqualsMsg( _T( "wrong number of terms" ), 3, termSet.size() ); for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; if( 0 != _tcscmp( _T( "aaaaa" ), pTerm->text()) && 0 != _tcscmp( _T( "aaaab" ), pTerm->text()) && 0 != _tcscmp( _T( "aaaac" ), pTerm->text())) { assertTrueMsg( _T( "wrong term" ), false ); } } clearTermSet( termSet ); if( rewrite != wildcard ) _CLDELETE( rewrite ); _CLDELETE( wildcard ); t1 = _CLNEW Term( _T("data"), _T("aaa*") ); wildcard = _CLNEW WildcardQuery( t1 ); rewrite = wildcard->rewrite( pReader ); rewrite->extractTerms( &termSet ); _CLLDECDELETE( t1 ); assertEqualsMsg( _T( "wrong number of terms" ), 5, termSet.size() ); for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; assertTrueMsg( _T( "wrong term" ), ( 0 == _tcsncmp( _T( "aaa" ), pTerm->text(), 3 ))); } clearTermSet( termSet ); if( rewrite != wildcard ) _CLDELETE( rewrite ); _CLDELETE( wildcard ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; } ///////////////////////////////////////////////////////////////////////////// void testExtractFromFuzzyQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; FuzzyQuery * fuzzy; Term * t1; Query * rewrite; t1 = _CLNEW Term( _T("data"), _T("aaaab") ); fuzzy = _CLNEW FuzzyQuery( t1, 0.7f ); rewrite = fuzzy->rewrite( pReader ); rewrite->extractTerms( &termSet ); _CLLDECDELETE( t1 ); assertEqualsMsg( _T( "wrong number of terms" ), 4, termSet.size() ); for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; if( 0 != _tcscmp( _T( "aaaaa" ), pTerm->text()) && 0 != _tcscmp( _T( "aaaab" ), pTerm->text()) && 0 != _tcscmp( _T( "aaabb" ), pTerm->text()) && 0 != _tcscmp( _T( "aaaac" ), pTerm->text())) { assertTrueMsg( _T( "wrong term" ), false ); } } clearTermSet( termSet ); if( rewrite != fuzzy ) _CLDELETE( rewrite ); _CLDELETE( fuzzy ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; } ///////////////////////////////////////////////////////////////////////////// // Custom CLucene tests CuSuite *testExtractTerms(void) { CuSuite *suite = CuSuiteNew( _T( "CLucene ExtractTerms Test" )); SUITE_ADD_TEST( suite, testExtractFromTermQuery ); SUITE_ADD_TEST( suite, testExtractFromPhraseQuery ); SUITE_ADD_TEST( suite, testExtractFromBooleanQuery ); SUITE_ADD_TEST( suite, testExtractFromWildcardQuery ); SUITE_ADD_TEST( suite, testExtractFromFuzzyQuery ); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestForDuplicates.cpp000066400000000000000000000107451154025176300233630ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" static void print_tHits( CuTest *tc, Hits* hits ) { CuMessageA(tc,"%d total results\n\n", hits->length()); for (size_t i = 0 ; i < hits->length(); i++) { if ( i < 10 || (i > 94 && i < 105) ) { const Document& d = hits->doc(i); CuMessage(tc, _T("%d %s\n"), i, d.get(_T("id")) ); } } } void testSearchTestForDuplicatesRaw(CuTest *tc){ const int MAX_DOCS=1500; const char *strBody[10] = {"test", "value", "why not", "computer", "clucene", "sun", "program", "main", "database", "code"}; RAMDirectory ram; //--- WhitespaceAnalyzer an; IndexWriter* writer = _CLNEW IndexWriter(&ram, &an, true); Document *doc = 0; //--- TCHAR strDb[1024]; //printf("Indexing, please wait...\n"); for (int32_t i = 0; i < MAX_DOCS; i++) { //**** //printf("%d/%d=%s\n", i, MAX_DOCS,strBody[i%10]); doc = _CLNEW Document(); //--- _sntprintf(strDb, 1024, _T("%d"), i); doc->add( *_CLNEW Field(_T("id"), strDb,Field::STORE_YES | Field::INDEX_UNTOKENIZED) ); STRCPY_AtoT(strDb, strBody[i%10], 1022); doc->add(*_CLNEW Field(_T("body"), strDb,Field::STORE_NO | Field::INDEX_TOKENIZED) ); //--- writer->addDocument(doc); _CLDELETE(doc); //**** } //printf("\nDone.\n"); //--- writer->close(); _CLDELETE(writer); IndexSearcher searcher(&ram); //--- int32_t dupl = 0; Query* query = QueryParser::parse(_T("test"), _T("body"), &an); Hits* result = searcher.search(query); CLUCENE_ASSERT(result->length()==((int)MAX_DOCS/10)); //printf("Building result map...\n"); std::map resMap; int32_t id; for (size_t j = 0; j < result->length(); j++) { doc = &result->doc(j); id = _ttoi(doc->get(_T("id"))); if ( resMap.find(id) ==resMap.end() ) { resMap.insert( std::pair(id, 1)); //printf("Inserted $d\n",id); } else { TCHAR tmp[2048]; _sntprintf(tmp,2048,_T("Duplicated result found - Id: %d\n"), id); CuAssert(tc,tmp,false); dupl++; } } //printf("Total duplicated found: %d\n", dupl); //--- _CLDELETE(result); _CLDELETE(query); searcher.close(); ram.close(); } void testSearchTestForDuplicates(CuTest *tc) { RAMDirectory directory; SimpleAnalyzer analyzer; IndexWriter* writer = _CLNEW IndexWriter(&directory, &analyzer, true); const int32_t MAX_DOCS = 255; for (int32_t j = 0; j < MAX_DOCS; j++) { Document* d = _CLNEW Document(); d->add(*_CLNEW Field(_T("priority"), _T("high"),Field::STORE_YES | Field::INDEX_TOKENIZED)); TCHAR buf[80]; _i64tot(j,buf,10); d->add(*_CLNEW Field(_T("id"), buf,Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(d); _CLDELETE(d); } writer->close(); _CLDELETE(writer); // try a search without OR Searcher* searcher = _CLNEW IndexSearcher( &directory ); QueryParser* parser = _CLNEW QueryParser(_T("priority"), &analyzer); Hits* hits = NULL; Query* query = parser->parse(_T("high")); TCHAR* tmp = query->toString(_T("priority")); CuMessage(tc, _T("Query: %s\n"), tmp ); _CLDELETE_CARRAY(tmp); hits = searcher->search(query); print_tHits(tc, hits); _CLDELETE(hits); _CLDELETE(query); _CLDELETE(parser); searcher->close(); _CLDELETE(searcher); // try a new search with OR searcher = _CLNEW IndexSearcher( &directory ); parser = _CLNEW QueryParser(_T("priority"), &analyzer); hits = NULL; query = parser->parse(_T("high OR medium")); tmp = query->toString(_T("priority")); CuMessage(tc, _T("Query: %s\n"), tmp ); _CLDELETE_CARRAY(tmp); hits = searcher->search(query); print_tHits(tc, hits); _CLDELETE(hits); _CLDELETE(query); _CLDELETE(parser); searcher->close(); _CLDELETE(searcher); directory.close(); } CuSuite *testduplicates(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Duplicates Test")); SUITE_ADD_TEST(suite, testSearchTestForDuplicates); SUITE_ADD_TEST(suite, testSearchTestForDuplicatesRaw); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestIndexSearcher.cpp000066400000000000000000000055041154025176300233400ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2010 the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" DEFINE_MUTEX(searchMutex); DEFINE_CONDITION(searchCondition); DEFINE_MUTEX(deleteMutex); DEFINE_CONDITION(deleteCondition); _LUCENE_THREAD_FUNC(searchDocs, _searcher) { WhitespaceAnalyzer an; IndexSearcher * searcher = (IndexSearcher *)_searcher; Query * query = QueryParser::parse(_T("one"), _T("content"), &an); Hits * hits = searcher->search(query); usleep(9999); //make sure that searchMutex is being waited on... CONDITION_NOTIFYALL(searchCondition); SCOPED_LOCK_MUTEX(deleteMutex); _CLLDELETE(hits); _CLLDELETE(query); CONDITION_WAIT(deleteMutex, deleteCondition); _LUCENE_THREAD_FUNC_RETURN(0); } void testEndThreadException(CuTest *tc) { const int MAX_DOCS=1500; RAMDirectory ram; WhitespaceAnalyzer an; IndexWriter* writer = _CLNEW IndexWriter(&ram, &an, true); // add some documents Document doc; for (int i = 0; i < MAX_DOCS; i++) { TCHAR * tmp = English::IntToEnglish(i); doc.add(* new Field(_T("content"), tmp, Field::STORE_YES | Field::INDEX_UNTOKENIZED)); writer->addDocument(&doc); doc.clear(); _CLDELETE_ARRAY( tmp ); } CuAssertEquals(tc, MAX_DOCS, writer->docCount()); writer->close(); _CLLDELETE(writer); // this sequence is OK: delete searcher after search thread finish { IndexSearcher * searcher = _CLNEW IndexSearcher(&ram); _LUCENE_THREADID_TYPE thread = _LUCENE_THREAD_CREATE(&searchDocs, searcher); SCOPED_LOCK_MUTEX(searchMutex); CONDITION_WAIT(searchMutex, searchCondition); usleep(9999); //make sure that deleteMutex is being waited on... CONDITION_NOTIFYALL(deleteCondition); _LUCENE_THREAD_JOIN(thread); searcher->close(); _CLLDELETE(searcher); } // this produces memory exception: delete searcher after search finish but before thread finish { IndexSearcher * searcher = _CLNEW IndexSearcher(&ram); _LUCENE_THREADID_TYPE thread = _LUCENE_THREAD_CREATE(&searchDocs, searcher); SCOPED_LOCK_MUTEX(searchMutex); CONDITION_WAIT(searchMutex, searchCondition); searcher->close(); _CLLDELETE(searcher); CONDITION_NOTIFYALL(deleteCondition); _LUCENE_THREAD_JOIN(thread); } ram.close(); } CuSuite *testIndexSearcher(void) { CuSuite *suite = CuSuiteNew(_T("CLucene IndexSearcher Test")); SUITE_ADD_TEST(suite, testEndThreadException); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestQueries.cpp000066400000000000000000000332711154025176300222330ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/search/MultiPhraseQuery.h" #include "QueryUtils.h" /// Java PrefixQuery test, 2009-06-02 void testPrefixQuery(CuTest *tc){ WhitespaceAnalyzer analyzer; RAMDirectory directory; const TCHAR* categories[] = {_T("/Computers"), _T("/Computers/Mac"), _T("/Computers/Windows")}; IndexWriter writer( &directory, &analyzer, true); for (int i = 0; i < 3; i++) { Document *doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("category"), categories[i], Field::STORE_YES | Field::INDEX_UNTOKENIZED)); writer.addDocument(doc); _CLDELETE(doc); } writer.close(); Term* t = _CLNEW Term(_T("category"), _T("/Computers")); PrefixQuery *query = _CLNEW PrefixQuery(t); IndexSearcher searcher(&directory); Hits *hits = searcher.search(query); CLUCENE_ASSERT(3 == hits->length()); // All documents in /Computers category and below _CLDELETE(query); _CLDELETE(t); _CLDELETE(hits); t = _CLNEW Term(_T("category"), _T("/Computers/Mac")); query = _CLNEW PrefixQuery(t); hits = searcher.search(query); CLUCENE_ASSERT(1 == hits->length()); // One in /Computers/Mac _CLDELETE(query); _CLDELETE(t); _CLDELETE(hits); } #ifndef NO_FUZZY_QUERY /// Java FuzzyQuery test, 2009-06-02 class TestFuzzyQuery { private: CuTest *tc; void addDoc(const TCHAR* text, IndexWriter* writer) { Document* doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("field"), text, Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); } Hits* searchQuery(IndexSearcher* searcher, const TCHAR* field, const TCHAR* text, float_t minSimilarity=FuzzyQuery::defaultMinSimilarity, size_t prefixLen=0){ Term* t = _CLNEW Term(field, text); FuzzyQuery* query = _CLNEW FuzzyQuery(t, minSimilarity, prefixLen); Hits* hits = searcher->search(query); _CLLDELETE(query); _CLLDECDELETE(t); return hits; } size_t getHitsLength(IndexSearcher* searcher, const TCHAR* field, const TCHAR* text, float_t minSimilarity=FuzzyQuery::defaultMinSimilarity, size_t prefixLen=0){ Hits* hits = searchQuery(searcher, field, text, minSimilarity, prefixLen); size_t ret = hits->length(); _CLLDELETE(hits); return ret; } public: TestFuzzyQuery(CuTest *_tc):tc(_tc){ } ~TestFuzzyQuery(){ } void testFuzziness() { RAMDirectory directory; WhitespaceAnalyzer a; IndexWriter writer(&directory, &a, true); addDoc(_T("aaaaa"), &writer); addDoc(_T("aaaab"), &writer); addDoc(_T("aaabb"), &writer); addDoc(_T("aabbb"), &writer); addDoc(_T("abbbb"), &writer); addDoc(_T("bbbbb"), &writer); addDoc(_T("ddddd"), &writer); writer.optimize(); writer.close(); IndexSearcher searcher(&directory); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa")) == 3); // same with prefix CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa"),FuzzyQuery::defaultMinSimilarity,1) == 3); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa"),FuzzyQuery::defaultMinSimilarity,2) == 3); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa"),FuzzyQuery::defaultMinSimilarity,3) == 3); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa"),FuzzyQuery::defaultMinSimilarity,4) == 2); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa"),FuzzyQuery::defaultMinSimilarity,5) == 1); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaaaa"),FuzzyQuery::defaultMinSimilarity,6) == 1); // not similar enough: CuAssertTrue(tc, getHitsLength(&searcher, _T("field"), _T("xxxxx")) == 0); CuAssertTrue(tc, getHitsLength(&searcher, _T("field"), _T("aaccc")) == 0); // edit distance to "aaaaa" = 3 // query identical to a word in the index: Hits* hits = searchQuery(&searcher, _T("field"), _T("aaaaa")); CLUCENE_ASSERT( hits->length() == 3); CuAssertStrEquals(tc, NULL, _T("aaaaa"), hits->doc(0).get(_T("field"))); // default allows for up to two edits: CuAssertStrEquals(tc, NULL, _T("aaaab"), hits->doc(1).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaabb"), hits->doc(2).get(_T("field"))); _CLLDELETE(hits); // query similar to a word in the index: hits = searchQuery(&searcher, _T("field"), _T("aaaac")); CLUCENE_ASSERT( hits->length() == 3); CuAssertStrEquals(tc, NULL, _T("aaaaa"), hits->doc(0).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaaab"), hits->doc(1).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaabb"), hits->doc(2).get(_T("field"))); _CLLDELETE(hits); // now with prefix hits = searchQuery(&searcher, _T("field"), _T("aaaac"), FuzzyQuery::defaultMinSimilarity, 1); CLUCENE_ASSERT( hits->length() == 3); CuAssertStrEquals(tc, NULL, _T("aaaaa"), hits->doc(0).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaaab"), hits->doc(1).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaabb"), hits->doc(2).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("aaaac"), FuzzyQuery::defaultMinSimilarity, 2); CLUCENE_ASSERT( hits->length() == 3); CuAssertStrEquals(tc, NULL, _T("aaaaa"), hits->doc(0).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaaab"), hits->doc(1).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaabb"), hits->doc(2).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("aaaac"), FuzzyQuery::defaultMinSimilarity, 3); CLUCENE_ASSERT( hits->length() == 3); CuAssertStrEquals(tc, NULL, _T("aaaaa"), hits->doc(0).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaaab"), hits->doc(1).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaabb"), hits->doc(2).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("aaaac"), FuzzyQuery::defaultMinSimilarity, 4); CLUCENE_ASSERT( hits->length() == 2); CuAssertStrEquals(tc, NULL, _T("aaaaa"), hits->doc(0).get(_T("field"))); CuAssertStrEquals(tc, NULL, _T("aaaab"), hits->doc(1).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("aaaac"), FuzzyQuery::defaultMinSimilarity, 5); CLUCENE_ASSERT( hits->length() == 0); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("ddddX")); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("ddddd"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); // now with prefix hits = searchQuery(&searcher, _T("field"), _T("ddddX"), FuzzyQuery::defaultMinSimilarity, 1); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("ddddd"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("ddddX"), FuzzyQuery::defaultMinSimilarity, 2); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("ddddd"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("ddddX"), FuzzyQuery::defaultMinSimilarity, 3); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("ddddd"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("ddddX"), FuzzyQuery::defaultMinSimilarity, 4); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("ddddd"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("ddddX"), FuzzyQuery::defaultMinSimilarity, 5); CLUCENE_ASSERT( hits->length() == 0); _CLLDELETE(hits); // different field = no match: hits = searchQuery(&searcher, _T("anotherfield"), _T("ddddX")); CLUCENE_ASSERT( hits->length() == 0); _CLLDELETE(hits); searcher.close(); directory.close(); } void testFuzzinessLong() { RAMDirectory directory; WhitespaceAnalyzer a; IndexWriter writer(&directory, &a, true); addDoc(_T("aaaaaaa"), &writer); addDoc(_T("segment"), &writer); writer.optimize(); writer.close(); IndexSearcher searcher(&directory); // not similar enough: CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("xxxxx")) == 0); // edit distance to "aaaaaaa" = 3, this matches because the string is longer than // in testDefaultFuzziness so a bigger difference is allowed: Hits* hits = searchQuery(&searcher, _T("field"), _T("aaaaccc")); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("aaaaaaa"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); // now with prefix hits = searchQuery(&searcher, _T("field"), _T("aaaaccc"), FuzzyQuery::defaultMinSimilarity, 1); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("aaaaaaa"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("aaaaccc"), FuzzyQuery::defaultMinSimilarity, 4); CLUCENE_ASSERT( hits->length() == 1); CuAssertStrEquals(tc, NULL, _T("aaaaaaa"), hits->doc(0).get(_T("field"))); _CLLDELETE(hits); hits = searchQuery(&searcher, _T("field"), _T("aaaaccc"), FuzzyQuery::defaultMinSimilarity, 5); CLUCENE_ASSERT( hits->length() == 0); _CLLDELETE(hits); // no match, more than half of the characters is wrong: CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaacccc")) == 0); // now with prefix CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("aaacccc"), FuzzyQuery::defaultMinSimilarity, 2) == 0); // "student" and "stellent" are indeed similar to "segment" by default: CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("student")) == 1); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("stellent")) == 1); // now with prefix CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("student"), FuzzyQuery::defaultMinSimilarity, 1) == 1); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("stellent"), FuzzyQuery::defaultMinSimilarity, 1) == 1); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("student"), FuzzyQuery::defaultMinSimilarity, 2) == 0); CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("stellent"), FuzzyQuery::defaultMinSimilarity, 2) == 0); // "student" doesn't match anymore thanks to increased minimum similarity: CLUCENE_ASSERT( getHitsLength(&searcher, _T("field"), _T("student"), 0.6f, 0) == 0); try { new FuzzyQuery(_CLNEW Term(_T("field"), _T("student")), 1.1f); CuFail(tc, _T("Expected IllegalArgumentException")); } catch (CLuceneError& /*e*/) { // expecting exception } try { new FuzzyQuery(_CLNEW Term(_T("field"), _T("student")), -0.1f); CuFail(tc, _T("Expected IllegalArgumentException")); } catch (CLuceneError& /*e*/) { // expecting exception } searcher.close(); directory.close(); } }; void testFuzzyQuery(CuTest *tc){ /// Run Java Lucene tests TestFuzzyQuery tester(tc); tester.testFuzziness(); /// Legacy CLucene tests RAMDirectory ram; //--- WhitespaceAnalyzer an; IndexWriter* writer = _CLNEW IndexWriter(&ram, &an, true); //--- Document *doc = 0; //**** doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("body"),_T("test"),Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLDELETE(doc); //**** doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("body"),_T("home"),Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLDELETE(doc); //**** doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("body"), _T("pc linux"),Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLDELETE(doc); //**** doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("body"), _T("tested"),Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLDELETE(doc); //**** doc = _CLNEW Document(); doc->add(*_CLNEW Field(_T("body"), _T("source"),Field::STORE_NO | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLDELETE(doc); //--- writer->close(); _CLDELETE(writer); //--- IndexSearcher searcher (&ram); //--- Term* term = _CLNEW Term(_T("body"), _T("test~")); Query* query = _CLNEW FuzzyQuery(term); Hits* result = searcher.search(query); CLUCENE_ASSERT(result && result->length() > 0); //--- _CLDELETE(result); _CLDELETE(query); _CLDECDELETE(term); searcher.close(); ram.close(); } #else void _NO_FUZZY_QUERY(CuTest *tc){ CuNotImpl(tc,_T("Fuzzy")); } #endif void testMultiPhraseQuery( CuTest * tc ) { MultiPhraseQuery * pQuery = _CLNEW MultiPhraseQuery(); Term * t1 = _CLNEW Term( _T( "field" ), _T( "t1" )); Term * t2 = _CLNEW Term( _T( "field" ), _T( "t2" )); Term * t3 = _CLNEW Term( _T( "field" ), _T( "t3" )); Term * t4 = _CLNEW Term( _T( "field" ), _T( "t4" )); CL_NS(util)::ValueArray terms( 3 ); terms[ 0 ] = t2; terms[ 1 ] = t3; terms[ 2 ] = t4; pQuery->add( t1 ); pQuery->add( &terms ); Query * pClone = pQuery->clone(); QueryUtils::checkEqual( tc, pQuery, pClone ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); _CLLDECDELETE( t3 ); _CLLDECDELETE( t4 ); _CLLDELETE( pQuery ); _CLLDELETE( pClone ); } CuSuite *testqueries(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Queries Test")); SUITE_ADD_TEST(suite, testPrefixQuery); SUITE_ADD_TEST(suite, testMultiPhraseQuery); #ifndef NO_FUZZY_QUERY SUITE_ADD_TEST(suite, testFuzzyQuery); #else SUITE_ADD_TEST(suite, _NO_FUZZY_QUERY); #endif return suite; } //EOF clucene-core-2.3.3.4/src/test/search/TestRangeFilter.cpp000066400000000000000000000264071154025176300230230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/search/RangeFilter.h" #include "BaseTestRangeFilter.h" class TestRangeFilter : BaseTestRangeFilter { public: TestRangeFilter(CuTest* _tc) : BaseTestRangeFilter(_tc) { } void testRangeFilterId() { IndexReader* reader = IndexReader::open(index); IndexSearcher* search = new IndexSearcher(reader); int medId = ((maxId - minId) / 2); std::tstring minIPstr = pad(minId); const TCHAR* minIP = minIPstr.c_str(); std::tstring maxIPstr = pad(maxId); const TCHAR* maxIP = maxIPstr.c_str(); std::tstring medIPstr = pad(medId); const TCHAR* medIP = medIPstr.c_str(); size_t numDocs = static_cast(reader->numDocs()); assertEqualsMsg(_T("num of docs"), numDocs, static_cast(1+ maxId - minId)); Hits* result; Term* term = _CLNEW Term(_T("body"),_T("body")); Query* q = _CLNEW TermQuery(term); _CLDECDELETE(term); // test id, bounded on both ends Filter* f = _CLNEW RangeFilter(_T("id"),minIP,maxIP,T,T); result = search->search(q, f); assertEqualsMsg(_T("find all"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,maxIP,T,F); result = search->search(q,f); assertEqualsMsg(_T("all but last"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f =_CLNEW RangeFilter(_T("id"),minIP,maxIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("all but first"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,maxIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("all but ends"), numDocs-2, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,maxIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("med and up"), 1+ maxId-medId, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,medIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("up to med"), 1+ medId-minId, result->length()); _CLLDELETE(result); _CLLDELETE(f); // unbounded id f=_CLNEW RangeFilter(_T("id"),minIP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("min and up"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),NULL,maxIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("max and down"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,NULL,F,F); result = search->search(q,f); assertEqualsMsg(_T("not min, but up"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),NULL,maxIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("not max, but down"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,maxIP,T,F); result = search->search(q,f); assertEqualsMsg(_T("med and up, not max"), maxId-medId, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,medIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("not min, up to med"), medId-minId, result->length()); _CLLDELETE(result); _CLLDELETE(f); // very small sets f=_CLNEW RangeFilter(_T("id"),minIP,minIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("min,min,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,medIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("med,med,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),maxIP,maxIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("max,max,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,minIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("min,min,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),NULL,minIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("nul,min,F,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),maxIP,maxIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("max,max,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),maxIP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("max,nul,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,medIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("med,med,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); search->close(); _CLLDELETE(search); reader->close(); _CLLDELETE(reader); _CLLDELETE(q); } void testRangeFilterRand() { IndexReader* reader = IndexReader::open(index); IndexSearcher* search = _CLNEW IndexSearcher(reader); std::tstring minRPstr = pad(minR); const TCHAR* minRP = minRPstr.c_str(); std::tstring maxRPstr = pad(maxR); const TCHAR* maxRP = maxRPstr.c_str(); size_t numDocs = static_cast(reader->numDocs()); assertEqualsMsg(_T("num of docs"), numDocs, 1+ maxId - minId); Hits* result; Term* term = _CLNEW Term(_T("body"),_T("body")); Query* q = _CLNEW TermQuery(term); _CLDECDELETE(term); // test extremes, bounded on both ends Filter* f = _CLNEW RangeFilter(_T("rand"),minRP,maxRP,T,T); result = search->search(q,f); assertEqualsMsg(_T("find all"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,maxRP,T,F); result = search->search(q,f); assertEqualsMsg(_T("all but biggest"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,maxRP,F,T); result = search->search(q,f); assertEqualsMsg(_T("all but smallest"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,maxRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("all but extremes"), numDocs-2, result->length()); _CLLDELETE(result); _CLLDELETE(f); // unbounded f=_CLNEW RangeFilter(_T("rand"),minRP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("smallest and up"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),NULL,maxRP,F,T); result = search->search(q,f); assertEqualsMsg(_T("biggest and down"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,NULL,F,F); result = search->search(q,f); assertEqualsMsg(_T("not smallest, but up"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),NULL,maxRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("not biggest, but down"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); // very small sets f=_CLNEW RangeFilter(_T("rand"),minRP,minRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("min,min,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),maxRP,maxRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("max,max,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,minRP,T,T); result = search->search(q,f); assertEqualsMsg(_T("min,min,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),NULL,minRP,F,T); result = search->search(q,f); assertEqualsMsg(_T("nul,min,F,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),maxRP,maxRP,T,T); result = search->search(q,f); assertEqualsMsg(_T("max,max,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),maxRP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("max,nul,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); search->close(); _CLLDELETE(search); reader->close(); _CLLDELETE(reader); _CLLDELETE(q); } }; void testRangeFilterTrigger(CuTest* tc) { TestRangeFilter trf(tc); trf.testRangeFilterId(); trf.testRangeFilterRand(); } void testIncludeLowerTrue(CuTest* tc) { WhitespaceAnalyzer a; RAMDirectory* index = _CLNEW RAMDirectory(); IndexWriter* writer = _CLNEW IndexWriter(index, &a, true); Document doc; doc.add(*_CLNEW Field(_T("Category"), _T("a 1"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); doc.clear(); doc.add(*_CLNEW Field(_T("Category"), _T("a 2"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); doc.clear(); doc.add(*_CLNEW Field(_T("Category"), _T("a 3"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); doc.clear(); writer->close(); _CLLDELETE(writer); IndexSearcher* s = _CLNEW IndexSearcher(index); Filter* f = _CLNEW RangeFilter(_T("Category"), _T("3"), _T("3"), true, true); Term* t = _CLNEW Term(_T("Category"), _T("a")); Query* q1 = _CLNEW TermQuery(t); _CLLDECDELETE(t); t = _CLNEW Term(_T("Category"), _T("3")); Query* q2 = _CLNEW TermQuery(t); _CLLDECDELETE(t); Hits* h = s->search(q1); assertTrue(h->length() == 3); _CLLDELETE(h); h = s->search(q2); assertTrue(h->length() == 1); _CLLDELETE(h); h = s->search(q1, f); assertTrue(h->length() == 1); _CLLDELETE(h); s->close(); _CLLDELETE(s); _CLLDELETE(q1); _CLLDELETE(q2); _CLLDELETE(f); index->close(); _CLLDECDELETE(index); } CuSuite *testRangeFilter(void) { CuSuite *suite = CuSuiteNew(_T("CLucene RangeFilter Test")); SUITE_ADD_TEST(suite, testRangeFilterTrigger); SUITE_ADD_TEST(suite, testIncludeLowerTrue); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestSearch.cpp000066400000000000000000000335611154025176300220250ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include #include "test.h" #include #include "CLucene/search/MultiPhraseQuery.h" SimpleAnalyzer a; StandardAnalyzer aStd; WhitespaceAnalyzer aWS; IndexSearcher* s=NULL; void _TestSearchesRun(CuTest *tc, Analyzer* analyzer, Searcher* search, const TCHAR* qry){ Query* q = NULL; Hits* h = NULL; try{ q = QueryParser::parse(qry , _T("contents"), analyzer); if ( q != NULL ){ h = search->search( q ); if ( h->length() > 0 ){ //check for explanation memory leaks... CL_NS(search)::Explanation expl1; search->explain(q, h->id(0), &expl1); TCHAR* tmp = expl1.toString(); _CLDELETE_CARRAY(tmp); if ( h->length() > 1 ){ //do a second one just in case CL_NS(search)::Explanation expl2; search->explain(q, h->id(1), &expl2); tmp = expl2.toString(); _CLDELETE_CARRAY(tmp); } } } }catch(CLuceneError& err){ CuFail(tc,_T("Error: %s\n"), err.twhat()); }catch(...){ CuFail(tc,_T("Error: unknown\n")); } _CLDELETE(h); _CLDELETE(q); } void testSrchOpenIndex(CuTest *tc ){ char loc[1024]; strcpy(loc, clucene_data_location); strcat(loc, "/reuters-21578-index"); CuAssert(tc,_T("Index does not exist"), Misc::dir_Exists(loc)); s=_CLNEW IndexSearcher(loc); } void testSrchCloseIndex(CuTest* /*tc*/ ){ if ( s!=NULL ){ s->close(); _CLDELETE(s); } } void testSrchPunctuation(CuTest *tc ){ CuAssert(tc,_T("Searcher was not open"),s!=NULL); //test punctuation _TestSearchesRun(tc, &a,s, _T("a&b") ); _TestSearchesRun(tc, &a,s, _T("a&&b") ); _TestSearchesRun(tc, &a,s, _T(".NET") ); } void testSrchSlop(CuTest *tc ){ #ifdef NO_FUZZY_QUERY CuNotImpl(tc,_T("Fuzzy")); #else CuAssert(tc,_T("Searcher was not open"),s!=NULL); //test slop _TestSearchesRun(tc, &a,s, _T("\"term germ\"~2") ); _TestSearchesRun(tc, &a,s, _T("\"term germ\"~2 flork") ); _TestSearchesRun(tc, &a,s, _T("\"term\"~2") ); _TestSearchesRun(tc, &a,s, _T("\" \"~2 germ") ); _TestSearchesRun(tc, &a,s, _T("\"term germ\"~2^2") ); #endif } void testSrchNumbers(CuTest *tc ){ CuAssert(tc,_T("Searcher was not open"),s!=NULL); // The numbers go away because SimpleAnalzyer ignores them _TestSearchesRun(tc, &a,s, _T("3") ); _TestSearchesRun(tc, &a,s, _T("term 1.0 1 2") ); _TestSearchesRun(tc, &a,s, _T("term term1 term2") ); _TestSearchesRun(tc, &aStd,s, _T("3") ); _TestSearchesRun(tc, &aStd,s, _T("term 1.0 1 2") ); _TestSearchesRun(tc, &aStd,s, _T("term term1 term2") ); } void testSrchWildcard(CuTest *tc ){ #ifdef NO_WILDCARD_QUERY CuNotImpl(tc,_T("Wildcard")); #else CuAssert(tc,_T("Searcher was not open"),s!=NULL); //testWildcard _TestSearchesRun(tc, &a,s, _T("term*") ); _TestSearchesRun(tc, &a,s, _T("term*^2") ); _TestSearchesRun(tc, &a,s, _T("term~") ); _TestSearchesRun(tc, &a,s, _T("term^2~") ); _TestSearchesRun(tc, &a,s, _T("term~^2") ); _TestSearchesRun(tc, &a,s, _T("term*germ") ); _TestSearchesRun(tc, &a,s, _T("term*germ^3") ); //test problem reported by Gary Mangum BooleanQuery* bq = _CLNEW BooleanQuery(); Term* upper = _CLNEW Term(_T("contents"),_T("0105")); Term* lower = _CLNEW Term(_T("contents"),_T("0105")); RangeQuery* rq=_CLNEW RangeQuery(lower,upper,true); bq->add(rq,true,true,false); _CLDECDELETE(upper); _CLDECDELETE(lower); Term* prefix = _CLNEW Term(_T("contents"),_T("reuters21578")); PrefixQuery* pq = _CLNEW PrefixQuery(prefix); _CLDECDELETE(prefix); bq->add(pq,true,true,false); Hits* h = NULL; try{ h = s->search( bq ); }_CLFINALLY( _CLDELETE(h); _CLDELETE(bq); ); #endif } void testSrchEscapes(CuTest *tc ){ CuAssert(tc,_T("Searcher was not open"),s!=NULL); //testEscaped _TestSearchesRun(tc, &aWS,s, _T("\\[brackets") ); _TestSearchesRun(tc, &a,s, _T("\\[brackets") ); _TestSearchesRun(tc, &aWS,s, _T("\\\\") ); _TestSearchesRun(tc, &aWS,s, _T("\\+blah") ); _TestSearchesRun(tc, &aWS,s, _T("\\(blah") ); } void testSrchRange(CuTest *tc ){ #ifdef NO_RANGE_QUERY CuNotImpl(tc,_T("Range")); #else CuAssert(tc,_T("Searcher was not open"),s!=NULL); //testRange _TestSearchesRun(tc, &a,s, _T("[ j m]") ); _TestSearchesRun(tc, &a,s, _T("[ j m ]") ); _TestSearchesRun(tc, &a,s, _T("{ j m}") ); _TestSearchesRun(tc, &a,s, _T("{ j m }") ); _TestSearchesRun(tc, &a,s, _T("{a TO b}") ); _TestSearchesRun(tc, &a,s, _T("{ j m }^2.0") ); _TestSearchesRun(tc, &a,s, _T("[ j m] OR bar") ); _TestSearchesRun(tc, &a,s, _T("[ j m] AND bar") ); _TestSearchesRun(tc, &a,s, _T("( bar blar { j m}) ") ); _TestSearchesRun(tc, &a,s, _T("gack ( bar blar { j m}) ") ); #endif } void testSrchSimple(CuTest *tc ){ CuAssert(tc,_T("Searcher was not open"),s!=NULL); //simple tests _TestSearchesRun(tc, &a,s, _T("a AND b") ); _TestSearchesRun(tc, &a,s, _T("term term term") ); #ifdef _UCS2 TCHAR tmp1[100]; lucene_utf8towcs(tmp1,"t\xc3\xbcrm term term",100); _TestSearchesRun(tc, &a,s, tmp1 ); lucene_utf8towcs(tmp1,"\xc3\xbcmlaut",100); _TestSearchesRun(tc, &a,s, tmp1 ); #endif _TestSearchesRun(tc, &a,s, _T("(a AND b)") ); _TestSearchesRun(tc, &a,s, _T("c OR (a AND b)") ); _TestSearchesRun(tc, &a,s, _T("a AND NOT b") ); _TestSearchesRun(tc, &a,s, _T("a AND -b") ); _TestSearchesRun(tc, &a,s, _T("a AND !b") ); _TestSearchesRun(tc, &a,s, _T("a && b") ); _TestSearchesRun(tc, &a,s, _T("a && ! b") ); _TestSearchesRun(tc, &a,s, _T("a OR b") ); _TestSearchesRun(tc, &a,s, _T("a || b") ); _TestSearchesRun(tc, &a,s, _T("a OR !b") ); _TestSearchesRun(tc, &a,s, _T("a OR ! b") ); _TestSearchesRun(tc, &a,s, _T("a OR -b") ); _TestSearchesRun(tc, &a,s, _T("+term -term term") ); _TestSearchesRun(tc, &a,s, _T("foo:term AND field:anotherTerm") ); _TestSearchesRun(tc, &a,s, _T("term AND \"phrase phrase\"") ); _TestSearchesRun(tc, &a,s, _T("search AND \"meaningful direction\"") ); _TestSearchesRun(tc, &a,s, _T("\"hello there\"") ); _TestSearchesRun(tc, &a,s, _T("a AND b") ); _TestSearchesRun(tc, &a,s, _T("hello") ); _TestSearchesRun(tc, &a,s, _T("\"hello there\"") ); _TestSearchesRun(tc, &a,s, _T("germ term^2.0") ); _TestSearchesRun(tc, &a,s, _T("term^2.0") ); _TestSearchesRun(tc, &a,s, _T("term^2") ); _TestSearchesRun(tc, &a,s, _T("term^2.3") ); _TestSearchesRun(tc, &a,s, _T("\"germ term\"^2.0") ); _TestSearchesRun(tc, &a,s, _T("\"term germ\"^2") ); _TestSearchesRun(tc, &a,s, _T("(foo OR bar) AND (baz OR boo)") ); _TestSearchesRun(tc, &a,s, _T("((a OR b) AND NOT c) OR d") ); _TestSearchesRun(tc, &a,s, _T("+(apple \"steve jobs\") -(foo bar baz)") ); _TestSearchesRun(tc, &a,s, _T("+title:(dog OR cat) -author:\"bob dole\"") ); _TestSearchesRun(tc, &a,s, _T(".*") ); _TestSearchesRun(tc, &a,s, _T("<*") ); _TestSearchesRun(tc, &a,s, _T("/*") ); _TestSearchesRun(tc, &a,s, _T(";*") ); } void SearchTest(CuTest *tc, bool bram) { uint64_t start = Misc::currentTimeMillis(); SimpleAnalyzer analyzer; char fsdir[CL_MAX_PATH]; _snprintf(fsdir,CL_MAX_PATH,"%s/%s",cl_tempDir, "test.search"); Directory* ram = (bram?(Directory*)_CLNEW RAMDirectory():(Directory*)FSDirectory::getDirectory(fsdir) ); IndexWriter writer( ram, &analyzer, true); writer.setUseCompoundFile(false); writer.setMaxBufferedDocs(3); const TCHAR* docs[] = { _T("a b c d e asdf"), _T("a b c d e a b c d e asdg"), _T("a b c d e f g h i j"), _T("a c e"), _T("e c a"), _T("a c e a c e asef"), _T("a c e a b c") }; for (int j = 0; j < 7; j++) { Document* d = _CLNEW Document(); //no need to delete fields... document takes ownership d->add(*_CLNEW Field(_T("contents"),docs[j],Field::STORE_YES | Field::INDEX_TOKENIZED)); writer.addDocument(d); _CLDELETE(d); } writer.close(); if (!bram){ ram->close(); _CLDECDELETE(ram); ram = (Directory*)FSDirectory::getDirectory(fsdir); } IndexReader* reader = IndexReader::open(ram); IndexSearcher searcher(reader); const TCHAR* queries[] = { _T("a AND NOT b"), _T("+a -b"), _T("\"a b\""), _T("\"a b c\""), _T("a AND b"), _T("a c"), _T("\"a c\""), _T("\"a c e\"") }; int shouldbe[] = {3,3,4,4,4,7,3,3}; Hits* hits = NULL; QueryParser parser(_T("contents"), &analyzer); for (int k = 0; k < 8; k++) { Query* query = parser.parse(queries[k]); TCHAR* qryInfo = query->toString(_T("contents")); hits = searcher.search(query); CLUCENE_ASSERT( hits->length() == shouldbe[k] ); _CLDELETE_CARRAY(qryInfo); _CLDELETE(hits); _CLDELETE(query); } //test MultiPositionQuery... { MultiPhraseQuery* query = _CLNEW MultiPhraseQuery(); RefCountArray terms(3); Term* termE = _CLNEW Term(_T("contents"), _T("e")); terms[0] = _CLNEW Term(_T("contents"), _T("asdf")); terms[1] = _CLNEW Term(_T("contents"), _T("asdg")); terms[2] = _CLNEW Term(_T("contents"), _T("asef")); query->add(termE); _CLDECDELETE(termE); query->add(&terms); terms.deleteValues(); TCHAR* qryInfo = query->toString(_T("contents")); hits = searcher.search(query); CLUCENE_ASSERT( hits->length() == 3 ); _CLDELETE_CARRAY(qryInfo); _CLDELETE(hits); _CLDELETE(query); } searcher.close(); reader->close(); _CLDELETE( reader ); ram->close(); _CLDECDELETE(ram); CuMessageA (tc,"took %d milliseconds\n", (int32_t)(Misc::currentTimeMillis()-start)); } void testNormEncoding(CuTest *tc) { //just a quick test of the default similarity CLUCENE_ASSERT(CL_NS(search)::Similarity::getDefault()->queryNorm(1)==1.0); float_t f = CL_NS(search)::Similarity::getDefault()->queryNorm(9); f -= (1.0/3.0); if ( f < 0 ) f *= -1; CLUCENE_ASSERT(f < 0.1); //test that div by zero is handled float_t tmp = CL_NS(search)::Similarity::getDefault()->lengthNorm(_T("test"),0); tmp = CL_NS(search)::Similarity::getDefault()->queryNorm(0); //test that norm encoding is working properly CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(-1)==0 ); CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(0)==0 ); CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(1)==124 ); CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(1)==124 ); CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(7516192768.0 )==255); CLUCENE_ASSERT( CL_NS(search)::Similarity::decodeNorm(124)==1 ); CLUCENE_ASSERT( CL_NS(search)::Similarity::decodeNorm(255)==7516192768.0 ); //well know value: CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(0.5f) == 120 ); //can decode self CLUCENE_ASSERT( CL_NS(search)::Similarity::encodeNorm(CL_NS(search)::Similarity::decodeNorm(57)) == 57 ); } void testSrchManyHits(CuTest* /*tc*/) { SimpleAnalyzer analyzer; RAMDirectory ram; IndexWriter writer( &ram, &analyzer, true); const TCHAR* docs[] = { _T("a b c d e"), _T("a b c d e a b c d e"), _T("a b c d e f g h i j"), _T("a c e"), _T("e c a"), _T("a c e a c e"), _T("a c e a b c") }; for (int j = 0; j < 140; j++) { Document* d = _CLNEW Document(); //no need to delete fields... document takes ownership int x = j%7; d->add(*_CLNEW Field(_T("contents"),docs[x],Field::STORE_YES | Field::INDEX_TOKENIZED)); writer.addDocument(d); _CLDELETE(d); } writer.close(); IndexSearcher searcher(&ram); BooleanQuery query; Term* t = _CLNEW Term(_T("contents"), _T("a")); query.add(_CLNEW TermQuery(t),true,false, false); _CLDECDELETE(t); Hits* hits = searcher.search(&query); for ( size_t x=0;xlength();x++ ){ hits->doc(x); } _CLDELETE(hits); searcher.close(); } void testSrchMulti(CuTest *tc) { SimpleAnalyzer analyzer; RAMDirectory ram0; IndexWriter writer0( &ram0, &analyzer, true); const TCHAR* docs0[] = { _T("a") }; Document* d = _CLNEW Document(); //no need to delete fields... document takes ownership d->add(*_CLNEW Field(_T("contents"),docs0[0],Field::STORE_YES | Field::INDEX_TOKENIZED)); writer0.addDocument(d); _CLDELETE(d); writer0.close(); RAMDirectory ram1; IndexWriter writer1( &ram1, &analyzer, true); const TCHAR* docs1[] = { _T("e") }; d = _CLNEW Document(); //no need to delete fields... document takes ownership d->add(*_CLNEW Field(_T("contents"),docs1[0],Field::STORE_YES | Field::INDEX_TOKENIZED)); writer1.addDocument(d); _CLDELETE(d); writer1.close(); IndexSearcher searcher0(&ram0); IndexSearcher searcher1(&ram1); Searchable* searchers[3]; searchers[0] = &searcher0; searchers[1] = &searcher1; searchers[2] = NULL; MultiSearcher searcher(searchers); Term* termA = _CLNEW Term(_T("contents"), _T("a")); Term* termC = _CLNEW Term(_T("contents"), _T("c")); RangeQuery query(termA, termC, true); _CLDECDELETE(termA); _CLDECDELETE(termC); Query* rewritten = searcher.rewrite(&query); Hits* hits = searcher.search(rewritten); for ( size_t x=0;xlength();x++ ){ hits->doc(x); } CLUCENE_ASSERT(hits->length() == 1); if (&query != rewritten) { _CLDELETE(rewritten); } _CLDELETE(hits); searcher.close(); } void ramSearchTest(CuTest *tc) { SearchTest(tc, true); } void fsSearchTest(CuTest *tc) { SearchTest(tc, false); } CuSuite *testsearch(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Search Test")); SUITE_ADD_TEST(suite, ramSearchTest); SUITE_ADD_TEST(suite, fsSearchTest); SUITE_ADD_TEST(suite, testNormEncoding); SUITE_ADD_TEST(suite, testSrchManyHits); SUITE_ADD_TEST(suite, testSrchMulti); SUITE_ADD_TEST(suite, testSrchOpenIndex); SUITE_ADD_TEST(suite, testSrchPunctuation); SUITE_ADD_TEST(suite, testSrchSlop); SUITE_ADD_TEST(suite, testSrchNumbers); SUITE_ADD_TEST(suite, testSrchWildcard); SUITE_ADD_TEST(suite, testSrchEscapes); SUITE_ADD_TEST(suite, testSrchRange); SUITE_ADD_TEST(suite, testSrchSimple); SUITE_ADD_TEST(suite, testSrchCloseIndex); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestSort.cpp000066400000000000000000000533521154025176300215470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" /** * Unit tests for sorting code. * */ Searcher* sort_full; Searcher* sort_searchX; Searcher* sort_searchY; Query* sort_queryX; Query* sort_queryY; Query* sort_queryA; Query* sort_queryF; Sort* _sort; SimpleAnalyzer sort_analyser; typedef StringMap sortScores; typedef std::pair scorePair; // document data: // the tracer field is used to determine which document was hit // the contents field is used to search and _sort by relevance // the int field to _sort by int // the float field to _sort by float // the string field to _sort by string const TCHAR* data[11][6] = { // tracer contents int float string custom { _T("A"), _T("x a"), _T("5"), _T("4f"), _T("c"), _T("A-3") }, { _T("B"), _T("y a"), _T("5"), _T("3.4028235E38"), _T("i"), _T("B-10") }, { _T("C"), _T("x a b c"), _T("2147483647"), _T("1.0"), _T("j"), _T("A-2") }, { _T("D"), _T("y a b c"), _T("-1"), _T("0.0f"), _T("a"), _T("C-0") }, { _T("E"), _T("x a b c d"), _T("5"), _T("2f"), _T("h"), _T("B-8") }, { _T("F"), _T("y a b c d"), _T("2"), _T("3.14159f"), _T("g"), _T("B-1") }, { _T("G"), _T("x a b c d"), _T("3"), _T("-1.0"), _T("f"), _T("C-100") }, { _T("H"), _T("y a b c d"), _T("0"), _T("1.4E-45"), _T("e"), _T("C-88") }, { _T("I"), _T("x a b c d e f"), _T("-2147483648"), _T("1.0e+0"), _T("d"), _T("A-10") }, { _T("J"), _T("y a b c d e f"), _T("4"), _T(".5"), _T("b"), _T("C-7") }, { _T("Z"), _T("f"), NULL, NULL, NULL, NULL } }; Searcher* sort_getIndex (bool even, bool odd){ RAMDirectory* indexStore = _CLNEW RAMDirectory; IndexWriter writer(indexStore, &sort_analyser, true); for (int i=0; i<11; ++i) { if (((i%2)==0 && even) || ((i%2)==1 && odd)) { Document doc; doc.add (*_CLNEW Field ( _T("tracer"), data[i][0], Field::STORE_YES)); doc.add (*_CLNEW Field ( _T("contents"), data[i][1], Field::INDEX_TOKENIZED)); if (data[i][2] != NULL) doc.add (*_CLNEW Field (_T("int"), data[i][2], Field::INDEX_UNTOKENIZED)); if (data[i][3] != NULL) doc.add (*_CLNEW Field (_T("float"), data[i][3], Field::INDEX_UNTOKENIZED)); if (data[i][4] != NULL) doc.add (*_CLNEW Field (_T("string"), data[i][4], Field::INDEX_UNTOKENIZED)); if (data[i][5] != NULL) doc.add (*_CLNEW Field (_T("custom"), data[i][5], Field::INDEX_UNTOKENIZED)); writer.addDocument (&doc); } } writer.close (); IndexSearcher* res = _CLNEW IndexSearcher(indexStore); _CLDECDELETE(indexStore); return res; } void testSortSetup(CuTest* /*tc*/) { sort_full = sort_getIndex (true, true); sort_searchX = sort_getIndex (true, false); sort_searchY = sort_getIndex (false, true); Term* tmp; tmp = _CLNEW Term (_T("contents"), _T("x")); sort_queryX = _CLNEW TermQuery (tmp); _CLDECDELETE(tmp); tmp = _CLNEW Term (_T("contents"), _T("y")); sort_queryY = _CLNEW TermQuery (tmp); _CLDECDELETE(tmp); tmp = _CLNEW Term (_T("contents"), _T("a")); sort_queryA = _CLNEW TermQuery (tmp); _CLDECDELETE(tmp); tmp = _CLNEW Term (_T("contents"), _T("f")); sort_queryF = _CLNEW TermQuery (tmp); _CLDECDELETE(tmp); _sort = _CLNEW Sort(); } void testSortCleanup(CuTest* /*tc*/) { _CLDELETE(sort_full); _CLDELETE(sort_searchX); _CLDELETE(sort_searchY); _CLDELETE(sort_queryX); _CLDELETE(sort_queryY); _CLDELETE(sort_queryA); _CLDELETE(sort_queryF); _CLDELETE(_sort); } // make sure the documents returned by the search match the expected list void sortMatches (CuTest *tc, Searcher* searcher, Query* query, Sort* sort, const TCHAR* expectedResult){ Hits* result = searcher->search (query, sort); StringBuffer buff(10); int32_t n = result->length(); for (int i=0; idoc(i); TCHAR** v = doc.getValues(_T("tracer")); //todo: should be const??? for (int j=0; v[j]!=NULL; ++j) { buff.append (v[j]); } _CLDELETE_CARRAY_ALL(v); } CuAssertStrEquals (tc, _T("tracer value"), expectedResult, buff.getBuffer()); _CLDELETE(result); } void sortSameValues (CuTest* tc, sortScores* m1, sortScores* m2, bool deleteM1=false, bool deleteM2=true) { CuAssertIntEquals (tc, _T("sortScores size not equal"),m1->size(), m2->size()); sortScores::iterator iter = m1->begin(); float_t m=pow(10.0,-8); while (iter != m1->end()) { TCHAR* key = iter->first; sortScores::iterator i1 = m1->find(key); sortScores::iterator i2 = m2->find(key); float_t f1 = i1->second; float_t f2 = i2->second; float_t diff = f1-f2; if ( diff < 0 ) diff *= -1; if ( diff>m ) CuAssert(tc,_T("sortSameValue f1!=f2"),false); iter++; } if ( deleteM1 ) _CLDELETE(m1); if ( deleteM2 ) _CLDELETE(m2); } // make sure the documents returned by the search match the expected list pattern void sortMatchesPattern (CuTest* tc, Searcher* searcher, Query* query, Sort* sort, const TCHAR* pattern){ Hits* result = searcher->search (query, sort); int32_t n = result->length(); StringBuffer buff; for (int i=0; idoc(i); TCHAR** v = doc.getValues(_T("tracer")); for (int j=0; v[j]!=NULL; ++j) { buff.append (v[j]); } _CLDELETE_CARRAY_ALL(v); } //todo:need to actually test these matches... don't have regexp... CuMessage(tc,_T("\nmatching \"%s\" against pattern \"%s\""),buff.getBuffer(),pattern); // System.out.println ("matching \""+buff+"\" against pattern \""+pattern+"\""); //assertTrue (Pattern.compile(pattern).matcher(buff.toString()).matches()); _CLDELETE(result); } // runs a variety of sorts useful for multisearchers void sort_runMultiSorts (CuTest* tc, Searcher* multi) { _sort->setSort (SortField::FIELD_DOC()); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("[AB]{2}[CD]{2}[EF]{2}[GH]{2}[IJ]{2}")); _sort->setSort (_CLNEW SortField (_T("int"), SortField::INT, false)); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("IDHFGJ[ABE]{3}C")); SortField* sorts1[3]= {_CLNEW SortField (_T("int"), SortField::INT, false), SortField::FIELD_DOC(), NULL}; _sort->setSort ( sorts1 ); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("IDHFGJ[AB]{2}EC")); _sort->setSort (_T("int")); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("IDHFGJ[AB]{2}EC")); SortField* sorts2[3] = { _CLNEW SortField (_T("float"), SortField::FLOAT, false), SortField::FIELD_DOC(), NULL}; _sort->setSort (sorts2); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("GDHJ[CI]{2}EFAB")); _sort->setSort (_T("float")); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("GDHJ[CI]{2}EFAB")); _sort->setSort (_T("string")); sortMatches (tc, multi, sort_queryA, _sort, _T("DJAIHGFEBC")); _sort->setSort (_T("int"), true); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("C[AB]{2}EJGFHDI")); _sort->setSort (_T("float"), true); sortMatchesPattern (tc, multi, sort_queryA, _sort, _T("BAFE[IC]{2}JHDG")); _sort->setSort (_T("string"), true); sortMatches (tc, multi, sort_queryA, _sort, _T("CBEFGHIAJD")); //_sort->setSort (_CLNEW SortField[] { _CLNEW SortField (_T("string"), Locale.US) }); //sortMatches (tc, multi, sort_queryA, _sort, _T("DJAIHGFEBC")); //_sort->setSort (_CLNEW SortField[] { _CLNEW SortField (_T("string"), Locale.US, true) }); //sortMatches (tc, multi, sort_queryA, _sort, _T("CBEFGHIAJD")); const TCHAR* sorts3[3] = {_T("int"),_T("float"),NULL}; _sort->setSort ( sorts3 ); sortMatches (tc, multi, sort_queryA, _sort, _T("IDHFGJEABC")); const TCHAR* sorts4[3] = {_T("float"),_T("string"),NULL}; _sort->setSort (sorts4); sortMatches (tc, multi, sort_queryA, _sort, _T("GDHJICEFAB")); _sort->setSort (_T("int")); sortMatches (tc, multi, sort_queryF, _sort, _T("IZJ")); _sort->setSort (_T("int"), true); sortMatches (tc, multi, sort_queryF, _sort, _T("JZI")); _sort->setSort (_T("float")); sortMatches (tc, multi, sort_queryF, _sort, _T("ZJI")); _sort->setSort (_T("string")); sortMatches (tc, multi, sort_queryF, _sort, _T("ZJI")); _sort->setSort (_T("string"), true); sortMatches (tc, multi, sort_queryF, _sort, _T("IJZ")); } sortScores* sort_getScores (CuTest* tc, Hits* hits, bool deleteHits=true){ sortScores* scoreMap = _CLNEW sortScores(true); int n = hits->length(); float_t m=pow(10.0,-8); for (int i=0; idoc(i); TCHAR** v = doc.getValues( _T("tracer")); int vLength=0; while(v[vLength]!=NULL) vLength++; CuAssertIntEquals (tc, _T("tracer values"), vLength, 1); if ( scoreMap->find(v[0]) != scoreMap->end () ){ //this (should) be a multi search... the document will be double, so here we check that //the existing value is the same as this value... and then delete and ignore it. float_t diff = scoreMap->find(v[0])->second - hits->score(i); if ( diff < 0 ) diff *= -1; if ( diff>m ) CuAssert(tc,_T("sort_getScores(multi or incorrect) f1!=f2"),false); _CLDELETE_CARRAY_ALL(v); }else{ scoreMap->insert ( scorePair(v[0], hits->score(i)) ); _CLDELETE_ARRAY(v); } } if ( deleteHits ) _CLDELETE(hits); return scoreMap; } ////////////////////////////////////////////////////////////////////// // The actual tests ////////////////////////////////////////////////////////////////////// void testBuiltInSorts(CuTest *tc) { _CLDELETE(_sort); _sort = _CLNEW Sort(); sortMatches (tc, sort_full, sort_queryX, _sort, _T("ACEGI")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("BDFHJ")); _sort->setSort(SortField::FIELD_DOC()); sortMatches (tc, sort_full, sort_queryX, _sort, _T("ACEGI")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("BDFHJ")); } // test sorts where the type of field is specified void testTypedSort(CuTest *tc){ SortField* sorts1[3] = { _CLNEW SortField (_T("int"), SortField::INT,false), SortField::FIELD_DOC(), NULL }; _sort->setSort (sorts1); sortMatches (tc, sort_full, sort_queryX, _sort, _T("IGAEC")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("DHFJB")); SortField* sorts2[3] = { _CLNEW SortField (_T("float"), SortField::FLOAT,false), SortField::FIELD_DOC(), NULL }; _sort->setSort (sorts2); sortMatches (tc, sort_full, sort_queryX, _sort, _T("GCIEA")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("DHJFB")); SortField* sorts3[3] = { _CLNEW SortField (_T("string"), SortField::STRING,false), SortField::FIELD_DOC(), NULL }; _sort->setSort (sorts3); sortMatches (tc, sort_full, sort_queryX, _sort, _T("AIGEC")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("DJHFB")); } // test sorts when there's nothing in the index void testEmptyIndex(CuTest *tc) { Searcher* empty = sort_getIndex(false,false); _CLDELETE(_sort); _sort = _CLNEW Sort(); sortMatches (tc, empty, sort_queryX, _sort, _T("")); _sort->setSort(SortField::FIELD_DOC()); sortMatches (tc, empty, sort_queryX, _sort, _T("")); SortField* sorts1[3] = { _CLNEW SortField (_T("int"), SortField::INT,false), SortField::FIELD_DOC(), NULL }; _sort->setSort (sorts1); sortMatches (tc, empty, sort_queryX, _sort, _T("")); SortField* sorts3[3] = { _CLNEW SortField (_T("string"), SortField::STRING,false), SortField::FIELD_DOC(), NULL }; _sort->setSort (sorts3); sortMatches (tc, empty, sort_queryX, _sort, _T("")); SortField* sorts2[3] = { _CLNEW SortField (_T("float"), SortField::FLOAT,false), SortField::FIELD_DOC(), NULL }; _sort->setSort (sorts2); sortMatches (tc, empty, sort_queryX, _sort, _T("")); _CLDELETE(empty); } // test sorts where the type of field is determined dynamically void testAutoSort(CuTest *tc) { _sort->setSort(_T("int")); sortMatches (tc, sort_full, sort_queryX, _sort, _T("IGAEC")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("DHFJB")); _sort->setSort(_T("float")); sortMatches (tc, sort_full, sort_queryX, _sort, _T("GCIEA")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("DHJFB")); _sort->setSort(_T("string")); sortMatches (tc, sort_full, sort_queryX, _sort, _T("AIGEC")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("DJHFB")); } // test sorts in reverse void testReverseSort(CuTest *tc){ /*SortField* sorts[3] = { _CLNEW SortField (NULL, SortField::INT,true), SortField::FIELD_DOC, NULL }; _sort->setSort (sorts); sortMatches (tc, sort_full, sort_queryX, _sort, _T("IEGCA")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("JFHDB"));*/ _sort->setSort (_CLNEW SortField (NULL, SortField::DOC, true)); sortMatches (tc, sort_full, sort_queryX, _sort, _T("IGECA")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("JHFDB")); _sort->setSort (_T("int"), true); sortMatches (tc, sort_full, sort_queryX, _sort, _T("CAEGI")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("BJFHD")); _sort->setSort (_T("float"), true); sortMatches (tc, sort_full, sort_queryX, _sort, _T("AECIG")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("BFJHD")); _sort->setSort (_T("string"), true); sortMatches (tc, sort_full, sort_queryX, _sort, _T("CEGIA")); sortMatches (tc, sort_full, sort_queryY, _sort, _T("BFHJD")); } void testEmptyFieldSort(CuTest *tc) { _sort->setSort ( _T("string")); sortMatches (tc, sort_full, sort_queryF, _sort, _T("ZJI")); _sort->setSort ( _T("string"), true); sortMatches (tc, sort_full, sort_queryF, _sort, _T("IJZ")); _sort->setSort ( _T("int")); sortMatches (tc, sort_full, sort_queryF, _sort, _T("IZJ")); _sort->setSort ( _T("int"), true); sortMatches (tc, sort_full, sort_queryF, _sort, _T("JZI")); _sort->setSort ( _T("float")); sortMatches (tc, sort_full, sort_queryF, _sort, _T("ZJI")); _sort->setSort ( _T("float"), true); sortMatches (tc, sort_full, sort_queryF, _sort, _T("IJZ")); } // test sorts using a series of fields void testSortCombos(CuTest *tc) { const TCHAR* sorts1[3]= {_T("int"),_T("float"), NULL}; _sort->setSort ( sorts1 ); sortMatches (tc, sort_full, sort_queryX, _sort, _T("IGEAC")); SortField* sorts2[3] = { _CLNEW SortField (_T("int"), SortField::AUTO, true), _CLNEW SortField (NULL, SortField::DOC, true), NULL }; _sort->setSort ( sorts2); sortMatches (tc, sort_full, sort_queryX, _sort, _T("CEAGI")); const TCHAR* sorts3[3]= {_T("float"),_T("string"), NULL}; _sort->setSort (sorts3); sortMatches (tc, sort_full, sort_queryX, _sort, _T("GICEA")); } // test a custom _sort function /*void testCustomSorts(CuTest *tc) { _sort->setSort (_CLNEW SortField (_T("custom"), SampleComparable.getComparatorSource())); sortMatches (tc, sort_full, sort_queryX, _sort, _T("CAIEG")); _sort->setSort (_CLNEW SortField (_T("custom"), SampleComparable.getComparatorSource(), true)); sortMatches (tc, sort_full, sort_queryY, _sort, _T("HJDBF")); SortComparator custom = SampleComparable.getComparator(); _sort->setSort (_CLNEW SortField (_T("custom"), custom)); sortMatches (tc, sort_full, sort_queryX, _sort, _T("CAIEG")); _sort->setSort (_CLNEW SortField (_T("custom"), custom, true)); sortMatches (tc, sort_full, sort_queryY, _sort, _T("HJDBF")); }*/ // test a variety of sorts using more than one searcher void testMultiSort(CuTest *tc) { Searchable* searchables[3] ={ sort_searchX, sort_searchY, NULL }; MultiSearcher searcher(searchables); sort_runMultiSorts (tc, &searcher); searcher.close(); } // test that the relevancy scores are the same even if // hits are sorted void testNormalizedScores(CuTest *tc) { // capture relevancy scores sortScores* scoresX = sort_getScores (tc, sort_full->search (sort_queryX)); sortScores* scoresY = sort_getScores (tc, sort_full->search (sort_queryY)); sortScores* scoresA = sort_getScores (tc, sort_full->search (sort_queryA)); // we'll test searching locally, remote and multi // note: the multi test depends on each separate index containing // the same documents as our local index, so the computed normalization // will be the same. so we make a multi searcher over two equal document // sets - not realistic, but necessary for testing. //MultiSearcher remote(_CLNEW Searchable[] { getRemote() }); Searchable* searchables[3] = { sort_full, sort_full,NULL }; MultiSearcher multi( searchables ); // change sorting and make sure relevancy stays the same _CLDELETE(_sort); _sort = _CLNEW Sort(); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); _sort->setSort(SortField::FIELD_DOC()); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); _sort->setSort (_T("int")); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); _sort->setSort (_T("float")); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); _sort->setSort (_T("string")); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); const TCHAR* sorts1[3] = { _T("int"),_T("float"),NULL}; _sort->setSort ( sorts1 ); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); SortField* sorts2[3] = { _CLNEW SortField (_T("int"), SortField::AUTO, true), _CLNEW SortField (NULL, SortField::DOC, true), NULL }; _sort->setSort ( sorts2 ); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); const TCHAR* sorts3[3] = { _T("float"),_T("string"),NULL}; _sort->setSort (sorts3); sortSameValues (tc, scoresX, sort_getScores(tc, sort_full->search(sort_queryX,_sort))); sortSameValues (tc, scoresX, sort_getScores(tc, multi.search(sort_queryX,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, sort_full->search(sort_queryY,_sort))); sortSameValues (tc, scoresY, sort_getScores(tc, multi.search(sort_queryY,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, sort_full->search(sort_queryA,_sort))); sortSameValues (tc, scoresA, sort_getScores(tc, multi.search(sort_queryA,_sort))); _CLDELETE(scoresX); _CLDELETE(scoresY); _CLDELETE(scoresA); } CuSuite *testsort(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Sort Test")); SUITE_ADD_TEST(suite, testSortSetup); SUITE_ADD_TEST(suite, testBuiltInSorts); SUITE_ADD_TEST(suite, testTypedSort); SUITE_ADD_TEST(suite, testEmptyIndex); SUITE_ADD_TEST(suite, testAutoSort); SUITE_ADD_TEST(suite, testEmptyFieldSort); SUITE_ADD_TEST(suite, testSortCombos); //SUITE_ADD_TEST(suite, testCustomSorts); SUITE_ADD_TEST(suite, testMultiSort); SUITE_ADD_TEST(suite, testNormalizedScores); SUITE_ADD_TEST(suite, testReverseSort); SUITE_ADD_TEST(suite, testSortCleanup); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestTermVector.cpp000066400000000000000000000216611154025176300227100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" IndexSearcher* tv_searcher = NULL; RAMDirectory* tv_directory = NULL; void testTermPositionVectors(CuTest *tc) { CLUCENE_ASSERT(tv_searcher!=NULL); Term* term = _CLNEW Term(_T("field"), _T("fifty")); TermQuery query(term); _CLDECDELETE(term); try { Hits* hits = tv_searcher->search(&query); CuAssert (tc,_T("hits.length != 100"), 100 == hits->length()); for (size_t i = 0; i < hits->length(); i++) { ArrayBase* vector = tv_searcher->getReader()->getTermFreqVectors(hits->id(i)); CLUCENE_ASSERT(vector != NULL); CLUCENE_ASSERT(vector->length== 1); vector->deleteValues(); _CLLDELETE(vector); } _CLDELETE(hits); } catch (CLuceneError& e) { if ( e.number() == CL_ERR_IO ) CuAssert(tc, _T("IO Error"),false); throw e; } } void testTermVectors(CuTest *tc) { CLUCENE_ASSERT(tv_searcher!=NULL); Term* term = _CLNEW Term(_T("field"), _T("seventy")); TermQuery query(term); _CLDECDELETE(term); try { Hits* hits = tv_searcher->search(&query); CuAssertIntEquals(tc,_T("hits!=100"), 100, hits->length()); for (size_t i = 0; i < hits->length(); i++) { ArrayBase* vector = tv_searcher->getReader()->getTermFreqVectors(hits->id(i)); CLUCENE_ASSERT(vector != NULL); CLUCENE_ASSERT(vector->length == 1); vector->deleteValues(); _CLLDELETE(vector); } //test mem leaks with vectors CL_NS(search)::Explanation expl; tv_searcher->explain(&query, hits->id(50), &expl); TCHAR* tmp = expl.toString(); _CLDELETE_CARRAY(tmp); _CLDELETE(hits); } catch (CLuceneError& e) { if ( e.number() == CL_ERR_IO ) CuAssert(tc,_T("IO Exception"),false); else throw e; } } void testTVSetup(CuTest* /*tc*/) { SimpleAnalyzer a; tv_directory = _CLNEW RAMDirectory(); IndexWriter writer(tv_directory, &a, true); writer.setUseCompoundFile(false); TCHAR buf[200]; for (int32_t i = 0; i < 1000; i++) { Document doc; English::IntToEnglish(i,buf,200); int mod3 = i % 3; int mod2 = i % 2; int termVector = 0; if (mod2 == 0 && mod3 == 0) termVector = Field::TERMVECTOR_WITH_POSITIONS_OFFSETS; else if (mod2 == 0) termVector = Field::TERMVECTOR_WITH_POSITIONS; else if (mod3 == 0) termVector = Field::TERMVECTOR_WITH_OFFSETS; else termVector = Field::TERMVECTOR_YES; doc.add(*new Field(_T("field"), buf, Field::STORE_YES | Field::INDEX_TOKENIZED | termVector )); writer.addDocument(&doc); } writer.close(); tv_searcher = _CLNEW IndexSearcher(tv_directory); } void testTVCleanup(CuTest* /*tc*/) { _CLDELETE(tv_searcher); tv_directory->close(); _CLDELETE(tv_directory); } void setupDoc(Document& doc, const TCHAR* text) { doc.add(*new Field(_T("field"), text, Field::STORE_YES | Field::INDEX_TOKENIZED | Field::TERMVECTOR_YES)); } struct __TCharCompare { bool operator()(const TCHAR* s1, const TCHAR* s2) const { return _tcscmp(s1, s2) < 0; } }; void testKnownSetOfDocuments(CuTest *tc) { const TCHAR* test1 = _T("eating chocolate in a computer lab"); //6 terms const TCHAR* test2 = _T("computer in a computer lab"); //5 terms const TCHAR* test3 = _T("a chocolate lab grows old"); //5 terms const TCHAR* test4 = _T("eating chocolate with a chocolate lab in an old chocolate colored computer lab"); //13 terms typedef std::map test4MapType; test4MapType test4Map; test4Map.insert( std::pair(_T("chocolate"), 3) ); test4Map.insert( std::pair(_T("lab"), 2) ); test4Map.insert( std::pair(_T("eating"), 1) ); test4Map.insert( std::pair(_T("computer"), 1) ); test4Map.insert( std::pair(_T("with"), 1) ); test4Map.insert( std::pair(_T("a"), 1) ); test4Map.insert( std::pair(_T("colored"), 1) ); test4Map.insert( std::pair(_T("in"), 1) ); test4Map.insert( std::pair(_T("an"), 1) ); test4Map.insert( std::pair(_T("computer"), 1) ); test4Map.insert( std::pair(_T("old"), 1) ); Document testDoc1; setupDoc(testDoc1, test1); Document testDoc2; setupDoc(testDoc2, test2); Document testDoc3; setupDoc(testDoc3, test3); Document testDoc4; setupDoc(testDoc4, test4); RAMDirectory dir; try { SimpleAnalyzer a; IndexWriter writer(&dir, &a, true); writer.addDocument(&testDoc1); writer.addDocument(&testDoc2); writer.addDocument(&testDoc3); writer.addDocument(&testDoc4); writer.close(); IndexSearcher knownSearcher(&dir); TermEnum* termEnum = knownSearcher.getReader()->terms(); TermDocs* termDocs = knownSearcher.getReader()->termDocs(); CL_NS(search)::Similarity* sim = knownSearcher.getSimilarity(); while (termEnum->next() == true) { Term* term = termEnum->term(true); //System.out.println("Term: " + term); termDocs->seek(term); while (termDocs->next()) { int32_t docId = termDocs->doc(); int32_t freq = termDocs->freq(); //System.out.println("Doc Id: " + docId + " freq " + freq); TermFreqVector* vector = knownSearcher.getReader()->getTermFreqVector(docId, _T("field")); float_t tf = sim->tf(freq); float_t idf = sim->idf(term, &knownSearcher); //float_t qNorm = sim.queryNorm() idf += tf; //remove warning const ArrayBase* terms = vector->getTerms(); CLUCENE_ASSERT(vector != NULL); int termsCount=terms != NULL ? terms->length : 0; //This is fine since we don't have stop words float_t lNorm = sim->lengthNorm(_T("field"), termsCount); lNorm ++;//remove warning //float_t coord = sim.coord() //System.out.println("TF: " + tf + " IDF: " + idf + " LenNorm: " + lNorm); const ArrayBase* vTerms = vector->getTerms(); const ArrayBase* freqs = vector->getTermFrequencies(); size_t i=0; while ( vTerms && i < vTerms->length ) { if ( _tcscmp(term->text(), vTerms->values[i]) == 0 ) { CLUCENE_ASSERT((*freqs)[i] == freq); } i++; } _CLDELETE(vector); } _CLDECDELETE(term); //System.out.println("--------"); } _CLDELETE(termEnum); _CLDELETE(termDocs); Term* tqTerm = _CLNEW Term(_T("field"), _T("chocolate")); TermQuery query(tqTerm); _CLDECDELETE(tqTerm); Hits* hits = knownSearcher.search(&query); //doc 3 should be the first hit b/c it is the shortest match CLUCENE_ASSERT(hits->length() == 3); float_t score = hits->score(0); score++; CLUCENE_ASSERT(2==hits->id(0) ); CLUCENE_ASSERT(3==hits->id(1) ); CLUCENE_ASSERT(0==hits->id(2) ); TermFreqVector* vector = knownSearcher.getReader()->getTermFreqVector(hits->id(1), _T("field")); CLUCENE_ASSERT(vector != NULL); //_tprintf(_T("Vector: %s\n"),vector); const ArrayBase* terms = vector->getTerms(); const ArrayBase* freqs = vector->getTermFrequencies(); CLUCENE_ASSERT(terms != NULL); int termsLength = terms->length; CLUCENE_ASSERT(termsLength == 10); for (int32_t i = 0; i < termsLength; i++) { const TCHAR* term = terms->values[i]; //_tprintf(_T("Term: %s, test4map.size()=%d\n"),term, test4Map.size()); int32_t freq = (*freqs)[i]; CLUCENE_ASSERT( _tcsstr(test4,term) != NULL ); test4MapType::const_iterator itr = test4Map.find(term); CLUCENE_ASSERT( itr != test4Map.end() ); int32_t freqInt = itr->second; CLUCENE_ASSERT(freqInt == freq); } _CLDELETE(vector); _CLDELETE(hits); knownSearcher.close(); } catch (CLuceneError& e) { CuAssert(tc, e.twhat(),false); } } CuSuite *testtermvector(void) { tv_searcher = NULL; CuSuite *suite = CuSuiteNew(_T("CLucene Term Vector Test")); SUITE_ADD_TEST(suite, testTVSetup); SUITE_ADD_TEST(suite, testKnownSetOfDocuments); SUITE_ADD_TEST(suite, testTermVectors); SUITE_ADD_TEST(suite, testTermPositionVectors); SUITE_ADD_TEST(suite, testTVCleanup); return suite; } // EOF clucene-core-2.3.3.4/src/test/search/TestWildcard.cpp000066400000000000000000000074751154025176300223560ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #ifndef NO_WILDCARD_QUERY void _testWildcard(CuTest* tc, IndexSearcher* searcher, const TCHAR* qt, int expectedLen){ Term* term = _CLNEW Term(_T("body"), qt); Query* query = _CLNEW WildcardQuery(term); //test the wildcardquery Hits* result = searcher->search(query); CLUCENE_ASSERT(expectedLen == result->length()); _CLDELETE(result); _CLDELETE(query); //now test wildcardfilter Filter* filter = _CLNEW WildcardFilter(term); BitSet* bits = filter->bits(searcher->getReader()); CLUCENE_ASSERT(expectedLen == bits->count()); _CLDELETE(filter); _CLDELETE(bits); _CLDECDELETE(term); } void testAsterisk(CuTest *tc){ RAMDirectory indexStore; SimpleAnalyzer an; IndexWriter* writer = _CLNEW IndexWriter(&indexStore, &an, true); Document doc1; Document doc2; doc1.add(*_CLNEW Field(_T("body"), _T("metal"),Field::STORE_YES | Field::INDEX_TOKENIZED)); doc2.add(*_CLNEW Field(_T("body"), _T("metals"),Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc1); writer->addDocument(&doc2); writer->close(); _CLDELETE(writer); ////////////////////////////////////////////////// IndexReader* reader = IndexReader::open(&indexStore); IndexSearcher* searcher = _CLNEW IndexSearcher(reader); _testWildcard(tc, searcher, _T("metal*"), 2); _testWildcard(tc, searcher, _T("m*tal"), 1); _testWildcard(tc, searcher, _T("m*tal*"), 2); Term* term = _CLNEW Term(_T("body"), _T("metal")); Query* query1 = _CLNEW TermQuery(term); _CLDECDELETE(term); Hits* result = searcher->search(query1); CLUCENE_ASSERT(1 == result->length()); _CLDELETE(result); _CLDELETE(query1); indexStore.close(); searcher->close(); reader->close(); _CLDELETE(reader); _CLDELETE(searcher); } void testQuestionmark(CuTest *tc){ RAMDirectory indexStore; SimpleAnalyzer an; IndexWriter* writer = _CLNEW IndexWriter(&indexStore, &an, true); Document doc1; Document doc2; Document doc3; Document doc4; doc1.add(*_CLNEW Field(_T("body"), _T("metal"),Field::STORE_YES | Field::INDEX_TOKENIZED)); doc2.add(*_CLNEW Field(_T("body"), _T("metals"),Field::STORE_YES | Field::INDEX_TOKENIZED)); doc3.add(*_CLNEW Field(_T("body"), _T("mXtals"),Field::STORE_YES | Field::INDEX_TOKENIZED)); doc4.add(*_CLNEW Field(_T("body"), _T("mXtXls"),Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc1); writer->addDocument(&doc2); writer->addDocument(&doc3); writer->addDocument(&doc4); writer->close(); _CLDELETE(writer); ////////////////////////////////////////////////////// IndexReader* reader = IndexReader::open(&indexStore); IndexSearcher* searcher = _CLNEW IndexSearcher(reader); _testWildcard(tc, searcher, _T("m?tal"), 1); _testWildcard(tc, searcher, _T("metal?"), 1); _testWildcard(tc, searcher, _T("metal??"), 0); _testWildcard(tc, searcher, _T("meta??"), 1); //metals _testWildcard(tc, searcher, _T("metals?"), 0); _testWildcard(tc, searcher, _T("m?t?ls"), 3); indexStore.close(); reader->close(); searcher->close(); _CLDELETE(reader); _CLDELETE(searcher); } #else void _NO_WILDCARD_QUERY(CuTest *tc){ CuNotImpl(tc,_T("Wildcard")); } #endif CuSuite *testwildcard(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Wildcard Test")); #ifndef NO_WILDCARD_QUERY SUITE_ADD_TEST(suite, testQuestionmark); SUITE_ADD_TEST(suite, testAsterisk); #else SUITE_ADD_TEST(suite, _NO_WILDCARD_QUERY); #endif return suite; } // EOF clucene-core-2.3.3.4/src/test/search/spans/000077500000000000000000000000001154025176300203705ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/search/spans/TestBasics.cpp000066400000000000000000000507761154025176300231570ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "../QueryUtils.h" #include "../CheckHits.h" #include "TestBasics.h" #include "CLucene/search/spans/SpanQuery.h" #include "CLucene/search/spans/SpanTermQuery.h" #include "CLucene/search/spans/SpanNearQuery.h" #include "CLucene/search/spans/SpanNotQuery.h" #include "CLucene/search/spans/SpanOrQuery.h" #include "CLucene/search/spans/SpanFirstQuery.h" CL_NS_USE2(search,spans); TestBasics::TestBasics( CuTest* tc ) { this->tc = tc; this->searcher = NULL; this->directory = NULL; } TestBasics::~TestBasics() { if( searcher ) { searcher->close(); _CLDELETE( searcher ); } if( directory ) { directory->close(); _CLDELETE( directory ); } } void TestBasics::setUp() { directory = _CLNEW RAMDirectory(); Analyzer * analyzer = _CLNEW SimpleAnalyzer(); IndexWriter * writer = _CLNEW IndexWriter( directory, analyzer, true ); TCHAR buffer[ 200 ]; for( int32_t i = 0; i < 1000; i++ ) { Document doc; English::IntToEnglish( i, buffer, 200 ); doc.add( * _CLNEW Field( _T( "field" ), buffer, Field::STORE_YES | Field::INDEX_TOKENIZED )); writer->addDocument( &doc ); } writer->close(); _CLDELETE( writer ); _CLDELETE( analyzer ); searcher = _CLNEW IndexSearcher( directory ); } void TestBasics::testTerm() { int32_t expectedDocs[] = { 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979 }; Term * term = _CLNEW Term( _T( "field" ), _T( "seventy" )); Query * query = new TermQuery( term ); _CLLDECDELETE( term ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::testTerm2() { Term * term = _CLNEW Term( _T( "field" ), _T( "seventish" )); Query * query = new TermQuery( term ); _CLLDECDELETE( term ); checkHits( query, NULL, 0 ); _CLLDELETE( query ); } void TestBasics::testPhrase() { int32_t expectedDocs[] = { 77, 177, 277, 377, 477, 577, 677, 777, 877, 977 }; Term * term1 = _CLNEW Term( _T( "field" ), _T( "seventy" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "seven" )); PhraseQuery * query = _CLNEW PhraseQuery(); query->add( term1 ); query->add( term2 ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::testPhrase2() { Term * term1 = _CLNEW Term( _T( "field" ), _T( "seventish" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "sevenon" )); PhraseQuery * query = _CLNEW PhraseQuery(); query->add( term1 ); query->add( term2 ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, NULL, 0 ); _CLLDELETE( query ); } void TestBasics::testBoolean() { int32_t expectedDocs[] = {77, 777, 177, 277, 377, 477, 577, 677, 770, 771, 772, 773, 774, 775, 776, 778, 779, 877, 977}; Term * term1 = _CLNEW Term( _T( "field" ), _T( "seventy" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "seven" )); BooleanQuery * query = _CLNEW BooleanQuery(); query->add( _CLNEW TermQuery( term1 ), true, BooleanClause::MUST ); query->add( _CLNEW TermQuery( term2 ), true, BooleanClause::MUST ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::testBoolean2() { Term * term1 = _CLNEW Term( _T( "field" ), _T( "sevento" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "sevenly" )); BooleanQuery * query = _CLNEW BooleanQuery(); query->add( _CLNEW TermQuery( term1 ), true, BooleanClause::MUST ); query->add( _CLNEW TermQuery( term2 ), true, BooleanClause::MUST ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, NULL, 0 ); _CLLDELETE( query ); } void TestBasics::testSpanNearExact() { int32_t expectedDocs[] = {77, 177, 277, 377, 477, 577, 677, 777, 877, 977}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "seventy" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "seven" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * query = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 77, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 977, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method QueryUtils::check( tc, clauses[ 0 ] ); QueryUtils::check( tc, clauses[ 1 ] ); QueryUtils::checkUnequal( tc, clauses[ 0 ], clauses[ 1 ] ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDELETE( query ); } void TestBasics::testSpanNearUnordered() { int32_t expectedDocs[] = {609, 629, 639, 649, 659, 669, 679, 689, 699, 906, 926, 936, 946, 956, 966, 976, 986, 996}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "nine" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "six" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * query = _CLNEW SpanNearQuery( clauses, clauses+2, 4, false, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::testSpanNearOrdered() { int32_t expectedDocs[] = {906, 926, 936, 946, 956, 966, 976, 986, 996}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "nine" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "six" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * query = _CLNEW SpanNearQuery( clauses, clauses+2, 4, true, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::testSpanNot() { int32_t expectedDocs[] = {801, 821, 831, 851, 861, 871, 881, 891}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "eight" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "one" )); Term * term3 = _CLNEW Term( _T( "field" ), _T( "forty" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * near = _CLNEW SpanNearQuery( clauses, clauses+2, 4, true, true ); SpanNotQuery * query = _CLNEW SpanNotQuery( near, _CLNEW SpanTermQuery( term3 ), true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDECDELETE( term3 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 801, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 891, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testSpanWithMultipleNotSingle() { int32_t expectedDocs[] = {801, 821, 831, 851, 861, 871, 881, 891}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "eight" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "one" )); Term * term3 = _CLNEW Term( _T( "field" ), _T( "forty" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * near = _CLNEW SpanNearQuery( clauses, clauses+2, 4, true, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( term3 ); SpanOrQuery * orQuery = _CLNEW SpanOrQuery( clauses, clauses+1, true ); SpanNotQuery * query = _CLNEW SpanNotQuery( near, orQuery, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDECDELETE( term3 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 801, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 891, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testSpanWithMultipleNotMany() { int32_t expectedDocs[] = {801, 821, 831, 851, 871, 891}; SpanQuery * clauses[ 3 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "eight" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "one" )); Term * term3 = _CLNEW Term( _T( "field" ), _T( "forty" )); Term * term4 = _CLNEW Term( _T( "field" ), _T( "sixty" )); Term * term5 = _CLNEW Term( _T( "field" ), _T( "eighty" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * near = _CLNEW SpanNearQuery( clauses, clauses+2, 4, true, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( term3 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term4 ); clauses[ 2 ] = _CLNEW SpanTermQuery( term5 ); SpanOrQuery * orQuery = _CLNEW SpanOrQuery( clauses, clauses+3, true ); SpanNotQuery * query = _CLNEW SpanNotQuery( near, orQuery, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDECDELETE( term3 ); _CLLDECDELETE( term4 ); _CLLDECDELETE( term5 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 801, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 891, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testNpeInSpanNearWithSpanNot() { int32_t expectedDocs[] = {801, 821, 831, 851, 861, 871, 881, 891}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "eight" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "one" )); Term * hun = _CLNEW Term( _T( "field" ), _T( "hundred" )); Term * term3 = _CLNEW Term( _T( "field" ), _T( "forty" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * near = _CLNEW SpanNearQuery( clauses, clauses+2, 4, true, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( hun ); clauses[ 1 ] = _CLNEW SpanTermQuery( term3 ); SpanNearQuery * exclude = _CLNEW SpanNearQuery( clauses, clauses+2, 1, true, true ); SpanNotQuery * query = _CLNEW SpanNotQuery( near, exclude, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDECDELETE( hun ); _CLLDECDELETE( term3 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 801, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 891, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testNpeInSpanNearInSpanFirstInSpanNot() { int32_t expectedDocs[] = {40,41,42,43,44,45,46,47,48,49}; SpanQuery * clauses[ 2 ]; int32_t n = 5; Term * hun = _CLNEW Term( _T( "field" ), _T( "hundred" )); Term * term40 = _CLNEW Term( _T( "field" ), _T( "forty" )); SpanTermQuery * termQry40 = _CLNEW SpanTermQuery( term40 ); clauses[ 0 ] = _CLNEW SpanTermQuery( hun ); clauses[ 1 ] = (SpanTermQuery *) termQry40->clone(); SpanFirstQuery * include = _CLNEW SpanFirstQuery( termQry40, n, true ); SpanNearQuery * near = _CLNEW SpanNearQuery( clauses, clauses+2, n-1, true, true ); SpanFirstQuery * exclude = _CLNEW SpanFirstQuery( near, n-1, true ); SpanNotQuery * q = _CLNEW SpanNotQuery( include, exclude, true ); _CLLDECDELETE( hun ); _CLLDECDELETE( term40 ); checkHits( q, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( q ); } void TestBasics::testSpanFirst() { int32_t expectedDocs[] = { 5, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599 }; Term * term1 = _CLNEW Term( _T( "field" ), _T( "five" )); SpanFirstQuery * query = _CLNEW SpanFirstQuery( _CLNEW SpanTermQuery( term1 ), 1, true ); _CLLDECDELETE( term1 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 5, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 599, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testSpanOr() { int32_t expectedDocs[] = {33, 47, 133, 147, 233, 247, 333, 347, 433, 447, 533, 547, 633, 647, 733, 747, 833, 847, 933, 947}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "thirty" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "three" )); Term * term3 = _CLNEW Term( _T( "field" ), _T( "forty" )); Term * term4 = _CLNEW Term( _T( "field" ), _T( "seven" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * near1 = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( term3 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term4 ); SpanNearQuery * near2 = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); clauses[ 0 ] = near1; clauses[ 1 ] = near2; SpanOrQuery * query = _CLNEW SpanOrQuery( clauses, clauses+2, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDECDELETE( term3 ); _CLLDECDELETE( term4 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 33, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method Explanation explanation2; searcher->explain( query, 947, &explanation2 ); assertTrue( explanation2.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testSpanExactNested() { int32_t expectedDocs[] = {333}; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "three" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "hundred" )); Term * term3 = _CLNEW Term( _T( "field" ), _T( "thirty" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanNearQuery * near1 = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( term3 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term1 ); SpanNearQuery * near2 = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); clauses[ 0 ] = near1; clauses[ 1 ] = near2; SpanNearQuery * query = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); _CLLDECDELETE( term3 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); Explanation explanation1; searcher->explain( query, 333, &explanation1 ); assertTrue( explanation1.getDetail( 0 )->getValue() > 0.0f ); // ToDo: Fix IndexSearcher::explain() method _CLLDELETE( query ); } void TestBasics::testSpanNearOr() { int32_t expectedDocs[] = { 606, 607, 626, 627, 636, 637, 646, 647, 656, 657, 666, 667, 676, 677, 686, 687, 696, 697, 706, 707, 726, 727, 736, 737, 746, 747, 756, 757, 766, 767, 776, 777, 786, 787, 796, 797 }; SpanQuery * clauses[ 2 ]; Term * term1 = _CLNEW Term( _T( "field" ), _T( "six" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "seven" )); clauses[ 0 ] = _CLNEW SpanTermQuery( term1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term2 ); SpanOrQuery * to1 = _CLNEW SpanOrQuery( clauses, clauses+2, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( term2 ); clauses[ 1 ] = _CLNEW SpanTermQuery( term1 ); SpanOrQuery * to2 = _CLNEW SpanOrQuery( clauses, clauses+2, true ); clauses[ 0 ] = to1; clauses[ 1 ] = to2; SpanNearQuery * query = _CLNEW SpanNearQuery( clauses, clauses+2, 10, true, true ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::testSpanComplex1() { int32_t expectedDocs[] = { 606, 607, 626, 627, 636, 637, 646, 647, 656, 657, 666, 667, 676, 677, 686, 687, 696, 697, 706, 707, 726, 727, 736, 737, 746, 747, 756, 757, 766, 767, 776, 777, 786, 787, 796, 797 }; SpanQuery * clauses[ 2 ]; Term * termSix = _CLNEW Term( _T( "field" ), _T( "six" )); Term * termHun = _CLNEW Term( _T( "field" ), _T( "hundred" )); Term * termSev = _CLNEW Term( _T( "field" ), _T( "seven" )); clauses[ 0 ] = _CLNEW SpanTermQuery( termSix ); clauses[ 1 ] = _CLNEW SpanTermQuery( termHun ); SpanNearQuery * tt1 = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( termSev ); clauses[ 1 ] = _CLNEW SpanTermQuery( termHun ); SpanNearQuery * tt2 = _CLNEW SpanNearQuery( clauses, clauses+2, 0, true, true ); clauses[ 0 ] = tt1; clauses[ 1 ] = tt2; SpanOrQuery * to1 = _CLNEW SpanOrQuery( clauses, clauses+2, true ); clauses[ 0 ] = _CLNEW SpanTermQuery( termSev ); clauses[ 1 ] = _CLNEW SpanTermQuery( termSix ); SpanOrQuery * to2 = _CLNEW SpanOrQuery( clauses, clauses+2, true ); clauses[ 0 ] = to1; clauses[ 1 ] = to2; SpanNearQuery * query = _CLNEW SpanNearQuery( clauses, clauses+2, 100, true, true ); _CLLDECDELETE( termSix ); _CLLDECDELETE( termHun ); _CLLDECDELETE( termSev ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); } void TestBasics::checkHits( Query * query, int32_t * results, size_t resultsCount ) { CheckHits::checkHits( tc, query, _T( "field" ), searcher, results, resultsCount ); } clucene-core-2.3.3.4/src/test/search/spans/TestBasics.h000066400000000000000000000035051154025176300226100ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestBasics #define _lucene_search_spans_TestBasics #include "test.h" /** * Tests basic search capabilities. * *

Uses a collection of 1000 documents, each the english rendition of their * document number. For example, the document numbered 333 has text "three * hundred thirty three". * *

Tests are each a single query, and its hits are checked to ensure that * all and only the correct documents are returned, thus providing end-to-end * testing of the indexing and search code. * * @author Doug Cutting */ class TestBasics { private: CL_NS(search)::IndexSearcher * searcher; CL_NS(store)::RAMDirectory * directory; public: CuTest * tc; public: TestBasics( CuTest* tc ); virtual ~TestBasics(); void setUp(); void testTerm(); void testTerm2(); void testPhrase(); void testPhrase2(); void testBoolean(); void testBoolean2(); void testSpanNearExact(); void testSpanNearUnordered(); void testSpanNearOrdered(); void testSpanNot(); void testSpanWithMultipleNotSingle(); void testSpanWithMultipleNotMany(); void testNpeInSpanNearWithSpanNot(); void testNpeInSpanNearInSpanFirstInSpanNot(); void testSpanFirst(); void testSpanOr(); void testSpanExactNested(); void testSpanNearOr(); void testSpanComplex1(); private: void checkHits( Query * query, int32_t * results, size_t resultsCount ); }; #endif clucene-core-2.3.3.4/src/test/search/spans/TestNearSpansOrdered.cpp000066400000000000000000000146241154025176300251420ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestNearSpansOrdered.h" #include "../CheckHits.h" #include "CLucene/search/spans/SpanQuery.h" #include "CLucene/search/spans/SpanTermQuery.h" #include "CLucene/search/spans/SpanNearQuery.h" #include "CLucene/search/spans/Spans.h" #include "CLucene/search/Scorer.h" CL_NS_USE2(search,spans); CL_NS_USE(search); const TCHAR * TestNearSpansOrdered::field = _T( "field" ); const TCHAR * TestNearSpansOrdered::docFields[] = { _T( "w1 w2 w3 w4 w5" ), _T( "w1 w3 w2 w3 zz" ), _T( "w1 xx w2 yy w3" ), _T( "w1 w3 xx w2 yy w3 zz" ) }; TestNearSpansOrdered::TestNearSpansOrdered( CuTest* tc ) { this->tc = tc; this->searcher = NULL; this->directory = NULL; } TestNearSpansOrdered::~TestNearSpansOrdered() { if( searcher ) { searcher->close(); _CLDELETE( searcher ); } if( directory ) { directory->close(); _CLDELETE( directory ); } } void TestNearSpansOrdered::setUp() { directory = _CLNEW RAMDirectory(); Analyzer * analyzer = _CLNEW WhitespaceAnalyzer(); IndexWriter * writer= _CLNEW IndexWriter( directory, analyzer, true ); for( size_t i = 0; i < sizeof( docFields ) / sizeof( docFields[0] ); i++ ) { Document doc; doc.add( * _CLNEW Field( field, docFields[ i ], Field::STORE_NO | Field::INDEX_TOKENIZED )); writer->addDocument( &doc ); } writer->close(); _CLDELETE( writer ); _CLDELETE( analyzer ); searcher = _CLNEW IndexSearcher( directory ); } SpanNearQuery * TestNearSpansOrdered::makeQuery( const TCHAR * s1, const TCHAR * s2, const TCHAR * s3, int32_t slop, bool inOrder ) { SpanTermQuery * clauses[ 3 ]; Term * t1 = _CLNEW Term( field, s1 ); Term * t2 = _CLNEW Term( field, s2 ); Term * t3 = _CLNEW Term( field, s3 ); clauses[ 0 ] = _CLNEW SpanTermQuery( t1 ); clauses[ 1 ] = _CLNEW SpanTermQuery( t2 ); clauses[ 2 ] = _CLNEW SpanTermQuery( t3 ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); _CLLDECDELETE( t3 ); return _CLNEW SpanNearQuery( clauses, clauses+3, slop, inOrder, true ); } SpanNearQuery * TestNearSpansOrdered::makeQuery() { return makeQuery( _T( "w1" ), _T( "w2" ), _T( "w3" ), 1, true ); } bool TestNearSpansOrdered::checkSpans( CL_NS2(search,spans)::Spans * spans, int32_t doc, int32_t start, int32_t end ) { return spans && spans->doc() == doc && spans->end() == end && spans->start() == start; } void TestNearSpansOrdered::testSpanNearQuery() { int32_t expectedDocs[] = {0,1}; SpanNearQuery * q = makeQuery(); CheckHits::checkHits( tc, q, field, searcher, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( q ); } void TestNearSpansOrdered::testNearSpansNext() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( spans->next()); assertTrue( checkSpans( spans, 0, 0 ,3 )); assertTrue( spans->next() ); assertTrue( checkSpans( spans, 1, 0, 4 )); assertTrue( ! spans->next() ); _CLLDELETE( spans ); _CLLDELETE( q ); } /** * test does not imply that skipTo(doc+1) should work exactly the * same as next -- it's only applicable in this case since we know doc * does not contain more than one spans */ void TestNearSpansOrdered::testNearSpansSkipToLikeNext() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( spans->skipTo(0) ); assertTrue( checkSpans( spans, 0, 0, 3 )); assertTrue( spans->skipTo(1) ); assertTrue( checkSpans( spans, 1, 0, 4 )); assertTrue( ! spans->skipTo(2) ); _CLLDELETE( spans ); _CLLDELETE( q ); } void TestNearSpansOrdered::testNearSpansNextThenSkipTo() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( spans->next() ); assertTrue( checkSpans( spans, 0, 0, 3 )); assertTrue( spans->skipTo( 1 )); assertTrue( checkSpans( spans, 1, 0, 4 )); assertTrue( ! spans->next() ); _CLLDELETE( spans ); _CLLDELETE( q ); } void TestNearSpansOrdered::testNearSpansNextThenSkipPast() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( spans->next() ); assertTrue( checkSpans( spans, 0, 0, 3 )); assertTrue( ! spans->skipTo( 2 )); _CLLDELETE( spans ); _CLLDELETE( q ); } void TestNearSpansOrdered::testNearSpansSkipPast() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( ! spans->skipTo( 2 )); _CLLDELETE( spans ); _CLLDELETE( q ); } void TestNearSpansOrdered::testNearSpansSkipTo0() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( spans->skipTo( 0 )); assertTrue( checkSpans( spans, 0, 0, 3 )); _CLLDELETE( spans ); _CLLDELETE( q ); } void TestNearSpansOrdered::testNearSpansSkipTo1() { SpanNearQuery * q = makeQuery(); Spans * spans = q->getSpans( searcher->getReader() ); assertTrue( spans->skipTo(1) ); assertTrue( checkSpans( spans, 1, 0, 4 )); _CLLDELETE( spans ); _CLLDELETE( q ); } /** * not a direct test of NearSpans, but a demonstration of how/when * this causes problems */ void TestNearSpansOrdered::testSpanNearScorerSkipTo1() { SpanNearQuery * q = makeQuery(); Weight * w = q->_createWeight( searcher ); Scorer * s = w->scorer( searcher->getReader() ); assertTrue( s->skipTo( 1 )); assertTrue( 1 == s->doc()); _CLLDELETE( s ); _CLLDELETE( w ); _CLLDELETE( q ); } /** * not a direct test of NearSpans, but a demonstration of how/when * this causes problems */ void TestNearSpansOrdered::testSpanNearScorerExplain() { SpanNearQuery * q = makeQuery(); Weight * w = q->_createWeight( searcher ); Scorer * s = w->scorer( searcher->getReader() ); Explanation * e = s->explain( 1 ); assertTrueMsg( _T( "Scorer explanation value for doc#1 isn't positive." ), 0.0f < e->getValue() ); _CLLDELETE( e ); _CLLDELETE( s ); _CLLDELETE( w ); _CLLDELETE( q ); } clucene-core-2.3.3.4/src/test/search/spans/TestNearSpansOrdered.h000066400000000000000000000031411154025176300245770ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestNearSpansOrdered #define _lucene_search_spans_TestNearSpansOrdered #include "test.h" CL_CLASS_DEF2(search,spans,SpanNearQuery); CL_CLASS_DEF2(search,spans,Spans); class TestNearSpansOrdered { private: CL_NS(search)::IndexSearcher * searcher; CL_NS(store)::RAMDirectory * directory; static const TCHAR * docFields[]; static const TCHAR * field; public: CuTest * tc; public: TestNearSpansOrdered( CuTest* tc ); virtual ~TestNearSpansOrdered(); void setUp(); void testSpanNearQuery(); void testNearSpansNext(); void testNearSpansSkipToLikeNext(); void testNearSpansNextThenSkipTo(); void testNearSpansNextThenSkipPast(); void testNearSpansSkipPast(); void testNearSpansSkipTo0(); void testNearSpansSkipTo1(); void testSpanNearScorerSkipTo1(); void testSpanNearScorerExplain(); private: CL_NS2(search,spans)::SpanNearQuery * makeQuery( const TCHAR * s1, const TCHAR * s2, const TCHAR * s3, int32_t slop, bool inOrder ); CL_NS2(search,spans)::SpanNearQuery * makeQuery(); bool checkSpans( CL_NS2(search,spans)::Spans * spans, int32_t doc, int32_t start, int32_t end ); }; #endif clucene-core-2.3.3.4/src/test/search/spans/TestSpanExplanations.cpp000066400000000000000000000162471154025176300252350ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestSpanExplanations.h" #include "CLucene/search/spans/SpanQuery.h" #include "CLucene/search/spans/SpanOrQuery.h" #include "CLucene/search/spans/SpanTermQuery.h" #include "CLucene/search/spans/SpanNotQuery.h" #include "CLucene/search/spans/SpanNearQuery.h" #include "CLucene/search/spans/SpanFirstQuery.h" TestSpanExplanations::TestSpanExplanations( CuTest * tc ) : TestExplanations( tc ) { } TestSpanExplanations::~TestSpanExplanations() { } void TestSpanExplanations::testST1() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = st( _T( "w1" )); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testST2() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = st( _T( "w1" )); q->setBoost(1000); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testST4() { int32_t expDocs[] = {2,3}; SpanQuery * q = st( _T( "xx" )); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testST5() { int32_t expDocs[] = {2,3}; SpanQuery * q = st( _T( "xx" )); q->setBoost(1000); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSF1() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = sf(( _T( "w1" )),1); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSF2() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = sf(( _T( "w1" )),1); q->setBoost(1000); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSF4() { int32_t expDocs[] = {2}; SpanQuery * q = sf(( _T( "xx" )),2); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSF5() { SpanQuery * q = sf(( _T( "yy" )),2); qtest( q, NULL, 0 ); _CLLDELETE( q ); } void TestSpanExplanations::testSF6() { int32_t expDocs[] = {2}; SpanQuery * q = sf(( _T( "yy" )),4); q->setBoost(1000); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSO1() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = sor( _T( "w1" ), _T( "QQ" )); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSO2() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = sor( _T( "w1" ), _T( "w3" ), _T( "zz" )); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSO3() { int32_t expDocs[] = {0,2,3}; SpanQuery * q = sor( _T( "w5" ), _T( "QQ" ), _T( "yy" )); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSO4() { int32_t expDocs[] = {0,2,3}; SpanQuery * q = sor( _T( "w5" ), _T( "QQ" ), _T( "yy" )); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear1() { SpanQuery * q = snear( _T( "w1" ), _T( "QQ" ),100,true); qtest( q, NULL, 0 ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear2() { int32_t expDocs[] = {2,3}; SpanQuery * q = snear( _T( "w1" ), _T( "xx" ),100,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear3() { int32_t expDocs[] = {2}; SpanQuery * q = snear( _T( "w1" ), _T( "xx" ),0,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear4() { int32_t expDocs[] = {2,3}; SpanQuery * q = snear( _T( "w1" ), _T( "xx" ),1,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear5() { int32_t expDocs[] = {2}; SpanQuery * q = snear( _T( "xx" ), _T( "w1" ),0,false); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear6() { SpanQuery * q = snear( _T( "w1" ), _T( "w2" ), _T( "QQ" ),100,true); qtest( q, NULL, 0 ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear7() { int32_t expDocs[] = {2,3}; SpanQuery * q = snear( _T( "w1" ), _T( "xx" ), _T( "w2" ),100,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear8() { int32_t expDocs[] = {2}; SpanQuery * q = snear( _T( "w1" ), _T( "xx" ), _T( "w2" ),0,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear9() { int32_t expDocs[] = {2,3}; SpanQuery * q = snear( _T( "w1" ), _T( "xx" ), _T( "w2" ),1,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear10() { int32_t expDocs[] = {2}; SpanQuery * q = snear( _T( "xx" ), _T( "w1" ), _T( "w2" ),0,false); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNear11() { int32_t expDocs[] = {0,1}; SpanQuery * q = snear( _T( "w1" ), _T( "w2" ), _T( "w3" ),1,true); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNot1() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = snot(sf( _T( "w1" ),10),st( _T( "QQ" ))); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNot2() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = snot(sf( _T( "w1" ),10),st( _T( "QQ" ))); q->setBoost(1000); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNot4() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = snot(sf( _T( "w1" ),10),st( _T( "xx" ))); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNot5() { int32_t expDocs[] = {0,1,2,3}; SpanQuery * q = snot(sf( _T( "w1" ),10),st( _T( "xx" ))); q->setBoost(1000); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNot7() { int32_t expDocs[] = {0,1,3}; SpanQuery * f = snear( _T( "w1" ), _T( "w3" ),10,true); f->setBoost(1000); SpanQuery * q = snot(f, st( _T( "xx" ))); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } void TestSpanExplanations::testSNot10() { int32_t expDocs[] = {0,1,3}; SpanQuery * t = st( _T( "xx" )); t->setBoost(10000); SpanQuery * q = snot(snear( _T( "w1" ), _T( "w3" ),10,true), t); qtest( q, expDocs, sizeof(expDocs)/sizeof(expDocs[0]) ); _CLLDELETE( q ); } clucene-core-2.3.3.4/src/test/search/spans/TestSpanExplanations.h000066400000000000000000000025511154025176300246730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestSpanExplanations #define _lucene_search_spans_TestSpanExplanations #include "../TestExplanations.h" /** * TestExplanations subclass focusing on span queries */ class TestSpanExplanations : public TestExplanations { public: TestSpanExplanations( CuTest * tc ); virtual ~TestSpanExplanations(); void testST1(); void testST2(); void testST4(); void testST5(); void testSF1(); void testSF2(); void testSF4(); void testSF5(); void testSF6(); void testSO1(); void testSO2(); void testSO3(); void testSO4(); void testSNear1(); void testSNear2(); void testSNear3(); void testSNear4(); void testSNear5(); void testSNear6(); void testSNear7(); void testSNear8(); void testSNear9(); void testSNear10(); void testSNear11(); void testSNot1(); void testSNot2(); void testSNot4(); void testSNot5(); void testSNot7(); void testSNot10(); }; #endif clucene-core-2.3.3.4/src/test/search/spans/TestSpanExplanationsOfNonMatches.cpp000066400000000000000000000015141154025176300274710ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestSpanExplanationsOfNonMatches.h" #include "../CheckHits.h" TestSpanExplanationsOfNonMatches::TestSpanExplanationsOfNonMatches( CuTest * tc ) : TestSpanExplanations( tc ) { } TestSpanExplanationsOfNonMatches::~TestSpanExplanationsOfNonMatches() { } void TestSpanExplanationsOfNonMatches::qtest( Query * q, int32_t * expDocNrs, size_t expDocNrsCount ) { CheckHits::checkNoMatchExplanations( tc, q, field, searcher, expDocNrs, expDocNrsCount ); } clucene-core-2.3.3.4/src/test/search/spans/TestSpanExplanationsOfNonMatches.h000066400000000000000000000017761154025176300271500ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestSpanExplanationsOfNonMatches #define _lucene_search_spans_TestSpanExplanationsOfNonMatches #include "TestSpanExplanations.h" /** * subclass of TestSimpleExplanations that verifies non matches. */ class TestSpanExplanationsOfNonMatches : public TestSpanExplanations { public: TestSpanExplanationsOfNonMatches( CuTest * tc ); virtual ~TestSpanExplanationsOfNonMatches(); /** * Overrides superclass to ignore matches and focus on non-matches * @see CheckHits#checkNoMatchExplanations */ virtual void qtest( Query * q, int32_t * expDocNrs, size_t expDocNrsCount ); }; #endif clucene-core-2.3.3.4/src/test/search/spans/TestSpanQueries.cpp000066400000000000000000000123721154025176300242000ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestBasics.h" #include "TestSpans.h" #include "TestNearSpansOrdered.h" #include "TestSpansAdvanced2.h" #include "TestSpanExplanationsOfNonMatches.h" ///////////////////////////////////////////////////////////////////////////// void testBasics( CuTest * tc ) { TestBasics basicsTest( tc ); basicsTest.setUp(); basicsTest.testTerm(); basicsTest.testTerm2(); basicsTest.testPhrase(); basicsTest.testPhrase2(); basicsTest.testBoolean(); basicsTest.testBoolean2(); basicsTest.testSpanNearExact(); basicsTest.testSpanNearUnordered(); basicsTest.testSpanNearOrdered(); basicsTest.testSpanNot(); basicsTest.testSpanWithMultipleNotSingle(); basicsTest.testSpanWithMultipleNotMany(); basicsTest.testNpeInSpanNearWithSpanNot(); basicsTest.testNpeInSpanNearInSpanFirstInSpanNot(); basicsTest.testSpanFirst(); basicsTest.testSpanOr(); basicsTest.testSpanExactNested(); basicsTest.testSpanNearOr(); basicsTest.testSpanComplex1(); } ///////////////////////////////////////////////////////////////////////////// void testSpans( CuTest * tc ) { TestSpans spansTest( tc ); spansTest.setUp(); spansTest.testSpanNearOrdered(); spansTest.testSpanNearOrderedEqual(); spansTest.testSpanNearOrderedEqual1(); spansTest.testSpanNearOrderedOverlap(); // CLucene specific: SpanOr query with no clauses are not allowed // spansTest.testSpanOrEmpty(); spansTest.testSpanOrSingle(); spansTest.testSpanOrDouble(); spansTest.testSpanOrDoubleSkip(); spansTest.testSpanOrUnused(); spansTest.testSpanOrTripleSameDoc(); } ///////////////////////////////////////////////////////////////////////////// void testNearSpansOrdered( CuTest * tc ) { TestNearSpansOrdered test( tc ); test.setUp(); test.testSpanNearQuery(); test.testNearSpansNext(); test.testNearSpansSkipToLikeNext(); test.testNearSpansNextThenSkipTo(); test.testNearSpansNextThenSkipPast(); test.testNearSpansSkipPast(); test.testNearSpansSkipTo0(); test.testNearSpansSkipTo1(); test.testSpanNearScorerSkipTo1(); test.testSpanNearScorerExplain(); } ///////////////////////////////////////////////////////////////////////////// void testSpansAdvanced( CuTest * tc ) { TestSpansAdvanced test( tc ); test.setUp(); test.testBooleanQueryWithSpanQueries(); } ///////////////////////////////////////////////////////////////////////////// void testSpansAdvanced2( CuTest * tc ) { TestSpansAdvanced2 test( tc ); test.setUp(); test.testVerifyIndex(); test.testSingleSpanQuery(); test.testMultipleDifferentSpanQueries(); test.testBooleanQueryWithSpanQueries(); } ///////////////////////////////////////////////////////////////////////////// void testSpanExplanations( CuTest * tc ) { TestSpanExplanations test( tc ); test.setUp(); test.testST1(); test.testST2(); test.testST4(); test.testST5(); test.testSF1(); test.testSF2(); test.testSF4(); test.testSF5(); test.testSF6(); test.testSO1(); test.testSO2(); test.testSO3(); test.testSO4(); test.testSNear1(); test.testSNear2(); test.testSNear3(); test.testSNear4(); test.testSNear5(); test.testSNear6(); test.testSNear7(); test.testSNear8(); test.testSNear9(); test.testSNear10(); test.testSNear11(); test.testSNot1(); test.testSNot2(); test.testSNot4(); test.testSNot5(); test.testSNot7(); test.testSNot10(); } ///////////////////////////////////////////////////////////////////////////// void testSpanExplanationsOfNonMatches( CuTest * tc ) { TestSpanExplanationsOfNonMatches test( tc ); test.setUp(); test.testST1(); test.testST2(); test.testST4(); test.testST5(); test.testSF1(); test.testSF2(); test.testSF4(); test.testSF5(); test.testSF6(); test.testSO1(); test.testSO2(); test.testSO3(); test.testSO4(); test.testSNear1(); test.testSNear2(); test.testSNear3(); test.testSNear4(); test.testSNear5(); test.testSNear6(); test.testSNear7(); test.testSNear8(); test.testSNear9(); test.testSNear10(); test.testSNear11(); test.testSNot1(); test.testSNot2(); test.testSNot4(); test.testSNot5(); test.testSNot7(); test.testSNot10(); } ///////////////////////////////////////////////////////////////////////////// // Test suite for all tests of span queries CuSuite *testSpanQueries(void) { CuSuite *suite = CuSuiteNew( _T( "CLucene SpanQuery Tests" )); SUITE_ADD_TEST( suite, testBasics ); SUITE_ADD_TEST( suite, testSpans ); SUITE_ADD_TEST( suite, testNearSpansOrdered ); SUITE_ADD_TEST( suite, testSpansAdvanced ); SUITE_ADD_TEST( suite, testSpansAdvanced2 ); SUITE_ADD_TEST( suite, testSpanExplanations ); SUITE_ADD_TEST( suite, testSpanExplanationsOfNonMatches ); return suite; } clucene-core-2.3.3.4/src/test/search/spans/TestSpans.cpp000066400000000000000000000214471154025176300230300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "../CheckHits.h" #include "TestSpans.h" #include "CLucene/search/spans/Spans.h" #include "CLucene/search/spans/SpanNearQuery.h" #include "CLucene/search/spans/SpanOrQuery.h" const TCHAR * TestSpans::field = _T( "field" ); const TCHAR * TestSpans::docFields[] = { _T( "w1 w2 w3 w4 w5" ), _T( "w1 w3 w2 w3" ), _T( "w1 xx w2 yy w3" ), _T( "w1 w3 xx w2 yy w3" ), _T( "u2 u2 u1" ), _T( "u2 xx u2 u1" ), _T( "u2 u2 xx u1" ), _T( "u2 xx u2 yy u1" ), _T( "u2 xx u1 u2" ), _T( "u2 u1 xx u2" ), _T( "u1 u2 xx u2" ), _T( "t1 t2 t1 t3 t2 t3" ) }; TestSpans::TestSpans( CuTest* tc ) { this->tc = tc; this->searcher = NULL; this->directory = NULL; } TestSpans::~TestSpans() { if( searcher ) { searcher->close(); _CLDELETE( searcher ); } if( directory ) { directory->close(); _CLDELETE( directory ); } } void TestSpans::setUp() { directory = _CLNEW RAMDirectory(); Analyzer * analyzer = _CLNEW WhitespaceAnalyzer(); IndexWriter * writer = _CLNEW IndexWriter( directory, analyzer, true ); for( size_t i = 0; i < sizeof( docFields ) / sizeof( docFields[0] ); i++ ) { Document doc; doc.add( * _CLNEW Field( field, docFields[ i ], Field::STORE_YES | Field::INDEX_TOKENIZED )); writer->addDocument( &doc ); } writer->close(); _CLDELETE( writer ); _CLDELETE( analyzer ); searcher = _CLNEW IndexSearcher( directory ); } SpanTermQuery * TestSpans::makeSpanTermQuery( const TCHAR * text ) { Term * term = _CLNEW Term( field, text ); SpanTermQuery * query = _CLNEW SpanTermQuery( term ); _CLDECDELETE( term ); return query; } void TestSpans::checkHits( Query * query, int32_t * results, size_t resultsCount ) { CheckHits::checkHits( tc, query, field, searcher, results, resultsCount ); } void TestSpans::orderedSlopTest3SQ( SpanQuery * q1, SpanQuery * q2, SpanQuery * q3, int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ) { bool ordered = true; SpanQuery ** clauses = _CL_NEWARRAY( SpanQuery *, 3 ); clauses[ 0 ] = q1; clauses[ 1 ] = q2; clauses[ 2 ] = q3; SpanNearQuery * snq = _CLNEW SpanNearQuery( clauses, clauses+3, slop, ordered, true ); checkHits( snq, expectedDocs, expectedDocsCount ); _CLLDELETE( snq ); _CLDELETE_LARRAY( clauses ); } void TestSpans::orderedSlopTest3( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ) { orderedSlopTest3SQ( makeSpanTermQuery( _T( "w1" )), makeSpanTermQuery( _T( "w2" )), makeSpanTermQuery( _T( "w3" )), slop, expectedDocs, expectedDocsCount ); } void TestSpans::orderedSlopTest3Equal( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ) { orderedSlopTest3SQ( makeSpanTermQuery( _T( "w1" )), makeSpanTermQuery( _T( "w3" )), makeSpanTermQuery( _T( "w3" )), slop, expectedDocs, expectedDocsCount ); } void TestSpans::orderedSlopTest1Equal( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ) { orderedSlopTest3SQ( makeSpanTermQuery( _T( "u2" )), makeSpanTermQuery( _T( "u2" )), makeSpanTermQuery( _T( "u1" )), slop, expectedDocs, expectedDocsCount ); } void TestSpans::testSpanNearOrdered() { int32_t expectedDocs[] = { 0, 1, 2, 3 }; orderedSlopTest3( 0, expectedDocs, 1 ); orderedSlopTest3( 1, expectedDocs, 2 ); orderedSlopTest3( 2, expectedDocs, 3 ); orderedSlopTest3( 3, expectedDocs, 4 ); orderedSlopTest3( 4, expectedDocs, 4 ); } void TestSpans::testSpanNearOrderedEqual() { int32_t expectedDocs[] = { 1, 3 }; orderedSlopTest3Equal( 0, expectedDocs, 0 ); orderedSlopTest3Equal( 1, expectedDocs, 1 ); orderedSlopTest3Equal( 2, expectedDocs, 1 ); orderedSlopTest3Equal( 3, expectedDocs, 2 ); } void TestSpans::testSpanNearOrderedEqual1() { int32_t expectedDocs[] = { 4, 5, 6, 7 }; orderedSlopTest1Equal( 0, expectedDocs, 1 ); orderedSlopTest1Equal( 0, expectedDocs, 1 ); orderedSlopTest1Equal( 1, expectedDocs, 3 ); orderedSlopTest1Equal( 2, expectedDocs, 4 ); orderedSlopTest1Equal( 3, expectedDocs, 4 ); } void TestSpans::testSpanNearOrderedOverlap() { bool ordered = true; int32_t slop = 1; SpanQuery ** clauses = _CL_NEWARRAY( SpanQuery *, 3 ); clauses[ 0 ] = makeSpanTermQuery( _T( "t1" )); clauses[ 1 ] = makeSpanTermQuery( _T( "t2" )); clauses[ 2 ] = makeSpanTermQuery( _T( "t3" )); SpanNearQuery * snq = _CLNEW SpanNearQuery( clauses, clauses+3, slop, ordered, true ); Spans * spans = snq->getSpans( searcher->getReader() ); assertTrueMsg( _T( "first range" ), spans->next() ); assertEqualsMsg( _T( "first doc" ), 11, spans->doc()); assertEqualsMsg( _T( "first start" ), 0, spans->start()); assertEqualsMsg( _T( "first end" ), 4, spans->end()); assertTrueMsg( _T( "second range" ), spans->next()); assertEqualsMsg( _T( "second doc" ), 11, spans->doc()); assertEqualsMsg( _T( "second start" ), 2, spans->start()); assertEqualsMsg( _T( "second end" ), 6, spans->end()); assertTrueMsg( _T( "third range" ), ! spans->next()); _CLLDELETE( spans ); _CLLDELETE( snq ); _CLDELETE_LARRAY( clauses ); } void TestSpans::orSpans( const TCHAR ** terms, size_t termsCount, Spans *& spans, Query *& query ) { SpanQuery ** clauses = _CL_NEWARRAY( SpanQuery *, termsCount ); for( size_t i = 0; i < termsCount; i++ ) clauses[ i ] = makeSpanTermQuery( terms[ i ]); SpanOrQuery * soq = _CLNEW SpanOrQuery( clauses, clauses + termsCount, true ); _CLDELETE_LARRAY( clauses ); spans = soq->getSpans( searcher->getReader() ); query = soq; } void TestSpans::tstNextSpans( Spans * spans, int32_t doc, int32_t start, int32_t end ) { assertTrueMsg( _T( "next" ), spans->next()); assertEqualsMsg( _T( "doc" ), doc, spans->doc()); assertEqualsMsg( _T( "start" ), start, spans->start()); assertEqualsMsg( _T( "end" ), end, spans->end()); } void TestSpans::testSpanOrEmpty() { Spans * spans; Query * query; orSpans( NULL, 0, spans, query ); assertTrueMsg( _T( "empty next" ), ! spans->next()); _CLLDELETE( spans ); _CLLDELETE( query ); } void TestSpans::testSpanOrSingle() { Spans * spans; Query * query; const TCHAR* terms[] = { _T( "w5" ) }; orSpans( terms, 1, spans, query ); tstNextSpans( spans, 0, 4, 5 ); assertTrueMsg( _T( "final next" ), ! spans->next()); _CLLDELETE( spans ); _CLLDELETE( query ); } void TestSpans::testSpanOrDouble() { Spans * spans; Query * query; const TCHAR* terms[] = { _T( "w5" ), _T( "yy" ) }; orSpans( terms, 2, spans, query ); tstNextSpans( spans, 0, 4, 5 ); tstNextSpans( spans, 2, 3, 4 ); tstNextSpans( spans, 3, 4, 5 ); tstNextSpans( spans, 7, 3, 4 ); assertTrueMsg( _T( "final next" ), ! spans->next()); _CLLDELETE( spans ); _CLLDELETE( query ); } void TestSpans::testSpanOrDoubleSkip() { Spans * spans; Query * query; const TCHAR* terms[] = { _T( "w5" ), _T( "yy" ) }; orSpans( terms, 2, spans, query ); assertTrueMsg( _T( "initial skipTo" ), spans->skipTo( 3 )); assertEqualsMsg( _T( "doc" ), 3, spans->doc() ); assertEqualsMsg( _T( "start" ), 4, spans->start() ); assertEqualsMsg( _T( "end" ), 5, spans->end() ); tstNextSpans( spans, 7, 3, 4 ); assertTrueMsg( _T( "final next" ), ! spans->next() ); _CLLDELETE( spans ); _CLLDELETE( query ); } void TestSpans::testSpanOrUnused() { Spans * spans; Query * query; const TCHAR* terms[] = { _T( "w5" ), _T( "unusedTerm" ), _T( "yy" ) }; orSpans( terms, 3, spans, query ); tstNextSpans( spans, 0, 4, 5 ); tstNextSpans( spans, 2, 3, 4 ); tstNextSpans( spans, 3, 4, 5 ); tstNextSpans( spans, 7, 3, 4 ); assertTrueMsg( _T( "final next" ), ! spans->next()); _CLLDELETE( spans ); _CLLDELETE( query ); } void TestSpans::testSpanOrTripleSameDoc() { Spans * spans; Query * query; const TCHAR* terms[] = { _T( "t1" ), _T( "t2" ), _T( "t3" ) }; orSpans( terms, 3, spans, query ); tstNextSpans( spans, 11, 0, 1 ); tstNextSpans( spans, 11, 1, 2 ); tstNextSpans( spans, 11, 2, 3 ); tstNextSpans( spans, 11, 3, 4 ); tstNextSpans( spans, 11, 4, 5 ); tstNextSpans( spans, 11, 5, 6 ); assertTrueMsg( _T( "final next" ), ! spans->next()); _CLLDELETE( spans ); _CLLDELETE( query ); } clucene-core-2.3.3.4/src/test/search/spans/TestSpans.h000066400000000000000000000037151154025176300224730ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestSpans #define _lucene_search_spans_TestSpans #include "test.h" #include "CLucene/search/spans/SpanTermQuery.h" CL_NS_USE2(search,spans) class TestSpans { private: CL_NS(search)::IndexSearcher * searcher; CL_NS(store)::RAMDirectory * directory; static const TCHAR * docFields[]; public: static const TCHAR * field; CuTest * tc; public: TestSpans( CuTest* tc ); virtual ~TestSpans(); void setUp(); SpanTermQuery * makeSpanTermQuery( const TCHAR* text ); void orderedSlopTest3( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ); void orderedSlopTest3Equal( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ); void orderedSlopTest1Equal( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount ); void testSpanNearOrdered(); void testSpanNearOrderedEqual(); void testSpanNearOrderedEqual1(); void testSpanNearOrderedOverlap(); void testSpanOrEmpty(); void testSpanOrSingle(); void testSpanOrDouble(); void testSpanOrDoubleSkip(); void testSpanOrUnused(); void testSpanOrTripleSameDoc(); private: void checkHits( Query * query, int32_t * results, size_t resultsCount ); void orderedSlopTest3SQ( SpanQuery * q1, SpanQuery * q2, SpanQuery * q3, int32_t slop, int32_t * expectedDocs, size_t expectedDocCount ); void orSpans( const TCHAR ** terms, size_t termsCount, Spans *& spans, Query *& query ); void tstNextSpans( Spans * spans, int32_t doc, int32_t start, int32_t end ); }; #endif clucene-core-2.3.3.4/src/test/search/spans/TestSpansAdvanced.cpp000066400000000000000000000110601154025176300244440ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestSpansAdvanced.h" #include "../QueryUtils.h" #include "CLucene/search/spans/SpanTermQuery.h" CL_NS_USE2(search,spans); CL_NS_USE(search); const TCHAR * TestSpansAdvanced::field_id = _T( "ID" ); const TCHAR * TestSpansAdvanced::field_text = _T( "TEXT" ); TestSpansAdvanced::TestSpansAdvanced( CuTest* tc ) { this->tc = tc; this->searcher = NULL; this->directory = NULL; } TestSpansAdvanced::~TestSpansAdvanced() { if( searcher ) { searcher->close(); _CLDELETE( searcher ); } if( directory ) { directory->close(); _CLDELETE( directory ); } } void TestSpansAdvanced::setUp() { directory = _CLNEW RAMDirectory(); Analyzer * analyzer = _CLNEW StandardAnalyzer(); IndexWriter * writer = _CLNEW IndexWriter( directory, analyzer, true ); addDocuments( writer ); writer->close(); _CLDELETE( writer ); _CLDELETE( analyzer ); searcher = _CLNEW IndexSearcher( directory ); } void TestSpansAdvanced::addDocuments( IndexWriter * writer ) { addDocument( writer, _T( "1" ), _T( "I think it should work." )); addDocument( writer, _T( "2" ), _T( "I think it should work." )); addDocument( writer, _T( "3" ), _T( "I think it should work." )); addDocument( writer, _T( "4" ), _T( "I think it should work." )); } void TestSpansAdvanced::addDocument( IndexWriter * writer, const TCHAR * id, const TCHAR * text ) { Document document; document.add( * _CLNEW Field( field_id, id, Field::STORE_YES | Field::INDEX_UNTOKENIZED )); document.add( * _CLNEW Field( field_text, text, Field::STORE_YES | Field::INDEX_TOKENIZED )); writer->addDocument( &document ); } void TestSpansAdvanced::testBooleanQueryWithSpanQueries() { doTestBooleanQueryWithSpanQueries( 0.3884282f ); } void TestSpansAdvanced::doTestBooleanQueryWithSpanQueries( const float_t expectedScore ) { Term * t1 = _CLNEW Term( field_text, _T( "work" )); Query * spanQuery = _CLNEW SpanTermQuery( t1 ); BooleanQuery * query = _CLNEW BooleanQuery(); query->add( spanQuery, false, BooleanClause::MUST ); query->add( spanQuery, false, BooleanClause::MUST ); const TCHAR * expectedIds[] = { _T( "1" ), _T( "2" ), _T( "3" ), _T( "4" ) }; float_t expectedScores[] = { expectedScore, expectedScore, expectedScore, expectedScore }; assertHits( query, _T( "two span queries" ), expectedIds, expectedScores, 4 ); _CLLDECDELETE( t1 ); _CLLDELETE( spanQuery ); _CLLDELETE( query ); } void TestSpansAdvanced::assertHits( Query * query, const TCHAR * description, const TCHAR ** expectedIds, float_t * expectedScores, size_t expectedCount ) { float_t tolerance = 1e-5f; QueryUtils::check( tc, query, searcher ); // Hits hits = searcher.search(query); // hits normalizes and throws things off if one score is greater than 1.0 TopDocs * topdocs = searcher->_search( query, NULL, 10000 ); /***** // display the hits System.out.println(hits.length() + " hits for search: \"" + description + '\"'); for (int i = 0; i < hits.length(); i++) { System.out.println(" " + FIELD_ID + ':' + hits.doc(i).get(FIELD_ID) + " (score:" + hits.score(i) + ')'); } *****/ // did we get the hits we expected assertEquals( expectedCount, topdocs->totalHits ); for( size_t i = 0; i < expectedCount; i++ ) { //System.out.println(i + " exp: " + expectedIds[i]); //System.out.println(i + " field: " + hits.doc(i).get(FIELD_ID)); int32_t id = topdocs->scoreDocs[ i ].doc; float_t score = topdocs->scoreDocs[ i ].score; Document doc; searcher->doc( id, doc ); assertTrueMsg( _T( "actual document does not match the expected one" ), 0 == _tcscmp( expectedIds[ i ], doc.get( field_id ))); assertTrueMsg( _T( "score does not match" ), ( expectedScores[ i ] > score ? expectedScores[ i ] - score : score - expectedScores[ i ] ) < tolerance ); Explanation exp; searcher->explain( query, id, &exp ); float_t sd = exp.getDetail( 0 )->getValue() - score; if ( sd < 0 ) sd *= -1; assertTrueMsg( _T( "explained score does not match" ), sd < tolerance ); } _CLLDELETE( topdocs ); } clucene-core-2.3.3.4/src/test/search/spans/TestSpansAdvanced.h000066400000000000000000000035561154025176300241240ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestSpansAdvanced #define _lucene_search_spans_TestSpansAdvanced #include "test.h" /******************************************************************************* * Tests the span query bug in Lucene. It demonstrates that SpanTermQuerys don't * work correctly in a BooleanQuery. * * @author Reece Wilton */ class TestSpansAdvanced { protected: CL_NS(search)::IndexSearcher * searcher; CL_NS(store)::RAMDirectory * directory; static const TCHAR * field_id; static const TCHAR * field_text; public: CuTest * tc; public: TestSpansAdvanced( CuTest* tc ); virtual ~TestSpansAdvanced(); void setUp(); void testBooleanQueryWithSpanQueries(); protected: virtual void addDocuments( IndexWriter * writer ); void addDocument( IndexWriter * writer, const TCHAR * id, const TCHAR * text ); /** * Tests two span queries. */ void doTestBooleanQueryWithSpanQueries( const float_t expectedScore ); /** * Checks to see if the hits are what we expected. * * @param query the query to execute * @param description the description of the search * @param expectedIds the expected document ids of the hits * @param expectedScores the expected scores of the hits * * @throws IOException */ void assertHits( Query * query, const TCHAR * description, const TCHAR ** expectedIds, float_t * expectedScores, size_t expectedCount ); }; #endif clucene-core-2.3.3.4/src/test/search/spans/TestSpansAdvanced2.cpp000066400000000000000000000056731154025176300245430ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "TestSpansAdvanced2.h" #include "CLucene/search/spans/SpanTermQuery.h" CL_NS_USE2(search, spans); CL_NS_USE(search); TestSpansAdvanced2::TestSpansAdvanced2( CuTest* tc ) : TestSpansAdvanced( tc ) { } TestSpansAdvanced2::~TestSpansAdvanced2() { } void TestSpansAdvanced2::addDocuments( IndexWriter * writer ) { TestSpansAdvanced::addDocuments( writer ); addDocument( writer, _T( "A" ), _T( "Should we, could we, would we?" )); addDocument( writer, _T( "B" ), _T( "It should. Should it?" )); addDocument( writer, _T( "C" ), _T( "It shouldn't." )); addDocument( writer, _T( "D" ), _T( "Should we, should we, should we." )); } /** * Verifies that the index has the correct number of documents. */ void TestSpansAdvanced2::testVerifyIndex() { IndexReader * reader = IndexReader::open( directory ); assertEquals( 8, reader->numDocs() ); reader->close(); _CLDELETE( reader ); } /** * Tests a single span query that matches multiple documents. */ void TestSpansAdvanced2::testSingleSpanQuery() { Term * t1 = _CLNEW Term( field_text, _T( "should" )); Query * spanQuery = _CLNEW SpanTermQuery( t1 ); const TCHAR * expectedIds[] = { _T( "B" ), _T( "D" ), _T( "1" ), _T( "2" ), _T( "3" ), _T( "4" ), _T( "A" ) }; float_t expectedScores[] = { 0.625f, 0.45927936f, 0.35355338f, 0.35355338f, 0.35355338f, 0.35355338f, 0.26516503f, }; assertHits( spanQuery, _T( "single span query" ), expectedIds, expectedScores, 7 ); _CLLDELETE( spanQuery ); _CLLDECDELETE( t1 ); } /** * Tests a single span query that matches multiple documents. */ void TestSpansAdvanced2::testMultipleDifferentSpanQueries() { Term * t1 = _CLNEW Term( field_text, _T( "should" )); Term * t2 = _CLNEW Term( field_text, _T( "we" )); Query * spanQuery1 = _CLNEW SpanTermQuery( t1 ); Query * spanQuery2 = _CLNEW SpanTermQuery( t2 ); BooleanQuery * query = _CLNEW BooleanQuery(); query->add( spanQuery1, true, BooleanClause::MUST ); query->add( spanQuery2, true, BooleanClause::MUST ); const TCHAR * expectedIds[] = { _T( "D" ), _T( "A" ) }; // these values were pre LUCENE-413 // final float[] expectedScores = new float[] { 0.93163157f, 0.20698164f }; float_t expectedScores[] = { 1.0191123f, 0.93163157f }; assertHits( query, _T( "multiple different span queries" ), expectedIds, expectedScores, 2 ); _CLDELETE( query ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); } /** * Tests two span queries. */ void TestSpansAdvanced2::testBooleanQueryWithSpanQueries() { doTestBooleanQueryWithSpanQueries( 0.73500174f ); } clucene-core-2.3.3.4/src/test/search/spans/TestSpansAdvanced2.h000066400000000000000000000020721154025176300241760ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_spans_TestSpansAdvanced2 #define _lucene_search_spans_TestSpansAdvanced2 #include "TestSpansAdvanced.h" /******************************************************************************* * Some expanded tests to make sure my patch doesn't break other SpanTermQuery * functionality. * * @author Reece Wilton */ class TestSpansAdvanced2 : public TestSpansAdvanced { public: TestSpansAdvanced2( CuTest* tc ); virtual ~TestSpansAdvanced2(); void testVerifyIndex(); void testSingleSpanQuery(); void testMultipleDifferentSpanQueries(); void testBooleanQueryWithSpanQueries(); protected: virtual void addDocuments( IndexWriter * writer ); }; #endif clucene-core-2.3.3.4/src/test/store/000077500000000000000000000000001154025176300171335ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/store/MockRAMDirectory.cpp000066400000000000000000000174471154025176300227720ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "MockRAMDirectory.h" #include #include #include "CLucene/_ApiHeader.h" CL_NS_DEF(store) MockRAMDirectory::MockRAMDirectory() : RAMDirectory(), noDeleteOpenFile(true), maxSize(0) { // empty } MockRAMDirectory::MockRAMDirectory(const char* dir) : RAMDirectory(dir), noDeleteOpenFile(true), maxSize(0) { // empty } MockRAMDirectory::MockRAMDirectory(Directory* dir) : RAMDirectory(dir), noDeleteOpenFile(true), maxSize(0) { // empty } MockRAMDirectory::~MockRAMDirectory() { while (!failures.empty()) { delete failures.back(); failures.pop_back(); } } IndexOutput* MockRAMDirectory::createOutput(const char* name) { MockRAMFile* file = new MockRAMFile(this); { SCOPED_LOCK_MUTEX(openFiles_mutex); if (noDeleteOpenFile && openFiles.find(name) != openFiles.end()) { char buffer[200]; _snprintf(buffer, 200, "MockRAMDirectory: file %s is still open: cannot overwrite", name); _CLTHROWA(CL_ERR_IO, buffer); } } SCOPED_LOCK_MUTEX(files_mutex); MockRAMFile* existing = static_cast(files->get((char*)name)); if (existing != NULL && strcmp(name, "segments.gen") != 0) { char buffer[200]; _snprintf(buffer, 200, "MockRAMDirectory: file %s already exist", name); _CLTHROWA(CL_ERR_IO, buffer); } else { if (existing != NULL) { SCOPED_LOCK_MUTEX(THIS_LOCK); sizeInBytes -= existing->getSizeInBytes(); existing->setDirectory(NULL); } files->put(STRDUP_AtoA(name), file); } return _CLNEW MockRAMOutputStream(this, file); } bool MockRAMDirectory::openInput(const char* name, IndexInput*& ret, CLuceneError& error, int32_t buffferSize) { SCOPED_LOCK_MUTEX(files_mutex); MockRAMFile* file = static_cast(files->get((char*)name)); if (file == NULL) { char buffer[200]; _snprintf(buffer, 200, "MockRAMDirectory: file %s not found", name); error.set(CL_ERR_IO, buffer); return false; } else { SCOPED_LOCK_MUTEX(openFiles_mutex); if (openFiles.find(name) != openFiles.end()) { ++openFiles[name]; } else { openFiles.insert(std::make_pair(name, 1)); } } ret = _CLNEW MockRAMInputStream(this, name, file); return true; } void MockRAMDirectory::close() { SCOPED_LOCK_MUTEX(openFiles_mutex); if (noDeleteOpenFile && !openFiles.empty()) { char buffer[200]; _snprintf(buffer, 200, "MockRAMDirectory: cannot close: there are still open files: %d", (int)openFiles.size()); _CLTHROWA(CL_ERR_IO, buffer); } } bool MockRAMDirectory::deleteFile(const char* name, const bool throwError) { SCOPED_LOCK_MUTEX(openFiles_mutex); if (noDeleteOpenFile && openFiles.find(name) != openFiles.end() && throwError) { char buffer[200]; _snprintf(buffer, 200, "MockRAMDirectory: file %s is still open: cannot delete", name); _CLTHROWA(CL_ERR_IO, buffer); } return RAMDirectory::deleteFile(name, throwError); } void MockRAMDirectory::setNoDeleteOpenFile(bool value) { noDeleteOpenFile = value; } void MockRAMDirectory::setMaxUsedSize(int64_t value) { maxUsedSize = value; } int64_t MockRAMDirectory::getMaxUsedSize(void) const { return maxUsedSize; } void MockRAMDirectory::resetMaxUsedSize(void) { maxUsedSize = getRecomputedActualSizeInBytes(); } void MockRAMDirectory::setMaxSizeInBytes(int64_t value) { maxSize = value; } int64_t MockRAMDirectory::getMaxSizeInBytes() const { return maxSize; } void MockRAMDirectory::setRandomIOExceptionRate(float_t rate, int32_t seed) { srand(seed); randomIOExceptionRate = rate; } float_t MockRAMDirectory::getRandomIOExceptionRate(void) const { return randomIOExceptionRate; } bool MockRAMDirectory::getNoDeleteOpenFile() const { return noDeleteOpenFile; } std::map& MockRAMDirectory::getOpenFiles() { return openFiles; } void MockRAMDirectory::maybeThrowIOException(void) { if (randomIOExceptionRate > 0.0) { // don't use low bits from rand() // (see http://en.wikipedia.org/wiki/Linear_congruential_generator#Advantages_and_disadvantages_of_LCGs) int32_t number = ((rand() >> 4) % 1000); if (number < randomIOExceptionRate * 1000) { char buffer[200]; _snprintf(buffer, 200, "MockRAMDirectory: a random IOException"); _CLTHROWA(CL_ERR_IO, buffer); } } } int64_t MockRAMDirectory::getRecomputedSizeInBytes(void) { SCOPED_LOCK_MUTEX(files_mutex); int64_t size = 0; RAMDirectory::FileMap::iterator it = files->begin(); while (it != files->end()) { size += (*it).second->getSizeInBytes(); it++; } return size; } int64_t MockRAMDirectory::getRecomputedActualSizeInBytes(void) { SCOPED_LOCK_MUTEX(files_mutex); int64_t size = 0; RAMDirectory::FileMap::iterator it = files->begin(); while (it != files->end()) { size += (*it).second->getLength(); it++; } return size; } void MockRAMDirectory::failOn(Failure* fail) { failures.push_back(fail); } void MockRAMDirectory::maybeThrowDeterministicException(void) { std::vector::iterator it = failures.begin(); while (it != failures.end()) { (*it)->eval(this); it++; } } // // MockRAMOutputStream // MockRAMOutputStream::MockRAMOutputStream() : RAMOutputStream(), dir(NULL), first(true) { // empty } MockRAMOutputStream::MockRAMOutputStream(MockRAMDirectory* d, MockRAMFile* f) : RAMOutputStream(f), dir(d), first(true) { // empty } void MockRAMOutputStream::close() { RAMOutputStream::close(); int64_t size = dir->getRecomputedActualSizeInBytes(); if (size > dir->getMaxUsedSize()) { dir->setMaxUsedSize(size); } } void MockRAMOutputStream::flush() { dir->maybeThrowDeterministicException(); RAMOutputStream::flush(); } void MockRAMOutputStream::writeByte(const uint8_t b) { singleByte[0] = b; writeBytes(singleByte, 1); } void MockRAMOutputStream::writeBytes(const uint8_t* b, const int32_t length) { int64_t freeSpace = dir->getMaxSizeInBytes() - dir->sizeInBytes; int64_t realUsage = 0; // Enforce disk full if (dir->getMaxSizeInBytes() != 0 && freeSpace < length) { // Compute the real disk free. This will greatly slow // down our test but makes it more accurate: realUsage = dir->getRecomputedActualSizeInBytes(); freeSpace = dir->getMaxSizeInBytes() - realUsage; } if (dir->getMaxSizeInBytes() != 0 && freeSpace <= length) { if (freeSpace > 0 && freeSpace < length) { realUsage += freeSpace; RAMOutputStream::writeBytes(b, freeSpace); } if (realUsage > dir->getMaxUsedSize()) { dir->setMaxUsedSize(realUsage); } char buffer[200]; _snprintf(buffer, 200, "MockRAMOutputStream: fake disk full at %d bytes", (int)dir->getRecomputedActualSizeInBytes()); _CLTHROWA(CL_ERR_IO, buffer); } else { RAMOutputStream::writeBytes(b, length); } dir->maybeThrowDeterministicException(); if (first) { // Maybe throw random exception; only do this on first // write to a new file: first = false; dir->maybeThrowIOException(); } } int64_t MockRAMOutputStream::length() const { return RAMOutputStream::length(); } // // MockRAMInputStream // MockRAMInputStream::MockRAMInputStream(const MockRAMInputStream& clone) : RAMInputStream(clone), isClone(true) { dir = clone.dir; name = clone.name; } MockRAMInputStream::MockRAMInputStream(MockRAMDirectory* d, const char* n, MockRAMFile* f) : RAMInputStream(f), dir(d), name(n), isClone(false) { // empty } void MockRAMInputStream::close() { RAMInputStream::close(); if (!isClone) { SCOPED_LOCK_MUTEX(openFiles_mutex); int v = dir->getOpenFiles()[name.c_str()]; if (v == 1) { dir->getOpenFiles().erase(name.c_str()); } else { --dir->getOpenFiles()[name.c_str()]; } } } CL_NS_END clucene-core-2.3.3.4/src/test/store/MockRAMDirectory.h000066400000000000000000000111741154025176300224260ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_MockRAMDirectory_ #define _lucene_store_MockRAMDirectory_ #include "CLucene.h" #include "CLucene/_clucene-config.h" #include #include #include #include "CLucene/store/RAMDirectory.h" #include "CLucene/store/_RAMDirectory.h" CL_NS_DEF(store) /** * This is a subclass of RAMDirectory that adds methods * intented to be used only by unit tests. */ class MockRAMDirectory : public RAMDirectory { public: /** * Objects that represent fail-able conditions. Objects of a derived * class are created and registered with the mock directory. After * register, each object will be invoked once for each first write * of a file, giving the object a chance to throw an IOException. */ class Failure { public: Failure() { doFail = false; } void eval(MockRAMDirectory* dir) {} /** * reset should set the state of the failure to its default * (freshly constructed) state. Reset is convenient for tests * that want to create one failure object and then reuse it in * multiple cases. This, combined with the fact that Failure * subclasses are often anonymous classes makes reset difficult to * do otherwise. * * A typical example of use is * Failure* failure = new Failure(); * ... * mock.failOn(failure->reset()) */ Failure* reset() { return this; } void setDoFail() { doFail = true; }; void clearDoFail() { doFail = false; } private: bool doFail; }; MockRAMDirectory(); MockRAMDirectory(const char* dir); MockRAMDirectory(Directory* dir); virtual ~MockRAMDirectory(); virtual IndexOutput* createOutput(const char* name); virtual bool openInput(const char* name, IndexInput*& ret, CLuceneError& error, int32_t bufferSize = -1); virtual void close(); virtual bool deleteFile(const char* name, const bool throwError=true); /** * Emulate windows whereby deleting an open file is not * allowed (raise IOException). */ void setNoDeleteOpenFile(bool value); bool getNoDeleteOpenFile() const; void setMaxUsedSize(int64_t value); int64_t getMaxUsedSize() const; void resetMaxUsedSize(); void setMaxSizeInBytes(int64_t value); int64_t getMaxSizeInBytes() const; /** * If 0.0, no exceptions will be thrown. Else this should * be a double 0.0 - 1.0. We will randomly throw an * IOException on the first write to an OutputStream based * on this probability. */ void setRandomIOExceptionRate(float_t rate, int32_t seed); float_t getRandomIOExceptionRate() const; void maybeThrowIOException(); /** Provided for testing purposes. Use sizeInBytes() instead. */ int64_t getRecomputedSizeInBytes(); /** * Like getRecomputedSizeInBytes(), but, uses actual file * lengths rather than buffer allocations (which are * quantized up to nearest * RAMOutputStream.BUFFER_SIZE (now 1024) bytes. */ int64_t getRecomputedActualSizeInBytes(); void failOn(Failure* fail); void maybeThrowDeterministicException(); std::map& getOpenFiles(); DEFINE_MUTABLE_MUTEX(openFiles_mutex); private: std::map openFiles; std::vector failures; bool noDeleteOpenFile; int64_t maxUsedSize; int64_t maxSize; float_t randomIOExceptionRate; }; /** * Subclass of RAMFile to access RAMFile::directory without making it public in RAMFile. */ class MockRAMFile : public RAMFile { public: MockRAMFile(RAMDirectory* directory) : RAMFile(directory) { // empty } virtual ~MockRAMFile() { // empty } void setDirectory(RAMDirectory* value) { directory = value; } }; class MockRAMOutputStream : public RAMOutputStream { public: MockRAMOutputStream(); MockRAMOutputStream(MockRAMDirectory* d, MockRAMFile* f); virtual void close(void); virtual void flush(void); virtual void writeByte(const uint8_t b); virtual void writeBytes(const uint8_t* b, const int32_t length); virtual int64_t length() const; private: MockRAMDirectory* dir; bool first; uint8_t singleByte[1]; }; class MockRAMInputStream : public RAMInputStream { public: MockRAMInputStream(const MockRAMInputStream& clone); MockRAMInputStream(MockRAMDirectory* d, const char* n, MockRAMFile* f); void close(void); DEFINE_MUTABLE_MUTEX(openFiles_mutex); private: MockRAMDirectory* dir; std::string name; bool isClone; }; CL_NS_END #endif // _lucene_store_MockRAMDirectory_ clucene-core-2.3.3.4/src/test/store/TestRAMDirectory.cpp000066400000000000000000000144101154025176300230030ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2010 Borivoj Kostka and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include #include #include "CLucene.h" #include "CLucene/_clucene-config.h" #include "CLucene/analysis/Analyzers.h" #include "CLucene/document/Document.h" #include "CLucene/document/Field.h" #include "CLucene/index/IndexReader.h" #include "CLucene/index/IndexWriter.h" #include "CLucene/search/IndexSearcher.h" #include "CLucene/store/Directory.h" #include "CLucene/store/FSDirectory.h" #include "CLucene/store/RAMDirectory.h" #include "MockRAMDirectory.h" /** * JUnit testcase to test RAMDirectory. RAMDirectory itself is used in many testcases, * but not one of them uses an different constructor other than the default constructor. * * @author Bernhard Messer * * @version $Id: RAMDirectory.java 150537 2004-09-28 22:45:26 +0200 (Di, 28 Sep 2004) cutting $ */ static int docsToAdd = 500; static char indexDir[CL_MAX_PATH] = ""; struct ThreadData { MockRAMDirectory * dir; IndexWriter * writer; int num; CuTest * tc; }; // setup the index void testRAMDirectorySetUp (CuTest *tc) { if (strlen(cl_tempDir) + 13 > CL_MAX_PATH) CuFail(tc, _T("Not enough space in indexDir buffer")); sprintf(indexDir, "%s/RAMDirIndex", cl_tempDir); WhitespaceAnalyzer analyzer; IndexWriter * writer = new IndexWriter(indexDir, &analyzer, true); // add some documents TCHAR * text; for (int i = 0; i < docsToAdd; i++) { Document doc; text = English::IntToEnglish(i); doc.add(* new Field(_T("content"), text, Field::STORE_YES | Field::INDEX_UNTOKENIZED)); writer->addDocument(&doc); _CLDELETE_ARRAY(text); } CuAssertEquals(tc, docsToAdd, writer->docCount(), _T("document count")); writer->close(); _CLDELETE( writer ); } // BK> all test functions are the same except RAMDirectory constructor, so shared code moved here void checkDir(CuTest *tc, MockRAMDirectory * ramDir) { // Check size CuAssertTrue(tc, ramDir->sizeInBytes == ramDir->getRecomputedSizeInBytes(), _T("RAMDir size")); // open reader to test document count IndexReader * reader = IndexReader::open(ramDir); CuAssertEquals(tc, docsToAdd, reader->numDocs(), _T("document count")); // open search to check if all doc's are there IndexSearcher * searcher = _CLNEW IndexSearcher(reader); // search for all documents Document doc; for (int i = 0; i < docsToAdd; i++) { searcher->doc(i, doc); CuAssertTrue(tc, doc.getField(_T("content")) != NULL, _T("content is NULL")); } // cleanup reader->close(); searcher->close(); _CLLDELETE(reader); _CLLDELETE(searcher); } void testRAMDirectory (CuTest *tc) { Directory * dir = FSDirectory::getDirectory(indexDir); MockRAMDirectory * ramDir = _CLNEW MockRAMDirectory(dir); // close the underlaying directory dir->close(); _CLDELETE( dir ); checkDir(tc, ramDir); ramDir->close(); _CLLDELETE(ramDir); } void testRAMDirectoryString (CuTest *tc) { MockRAMDirectory * ramDir = _CLNEW MockRAMDirectory(indexDir); checkDir(tc, ramDir); ramDir->close(); _CLLDELETE(ramDir); } static int numThreads = 50; static int docsPerThread = 40; _LUCENE_THREAD_FUNC(indexDocs, _data) { ThreadData * data = (ThreadData *)_data; int cnt = 0; TCHAR * text; for (int j=1; jnum*docsPerThread+j); doc.add(*new Field(_T("sizeContent"), text, Field::STORE_YES | Field::INDEX_UNTOKENIZED)); data->writer->addDocument(&doc); _CLDELETE_ARRAY(text); { SCOPED_LOCK_MUTEX(data->dir->THIS_LOCK); CuAssertTrue(data->tc, data->dir->sizeInBytes == data->dir->getRecomputedSizeInBytes()); } } _LUCENE_THREAD_FUNC_RETURN( 0 ); } void testRAMDirectorySize(CuTest * tc) { MockRAMDirectory * ramDir = _CLNEW MockRAMDirectory(indexDir); WhitespaceAnalyzer analyzer; IndexWriter * writer = _CLNEW IndexWriter(ramDir, &analyzer, false); writer->optimize(); CuAssertTrue(tc, ramDir->sizeInBytes == ramDir->getRecomputedSizeInBytes(), _T("RAMDir size")); _LUCENE_THREADID_TYPE* threads = _CL_NEWARRAY(_LUCENE_THREADID_TYPE, numThreads); ThreadData * tdata = _CL_NEWARRAY(ThreadData, numThreads); for (int i=0; ioptimize(); CuAssertTrue(tc, ramDir->sizeInBytes == ramDir->getRecomputedSizeInBytes(), _T("RAMDir size")); CuAssertEquals(tc, docsToAdd + (numThreads * (docsPerThread-1)), writer->docCount(), _T("document count")); writer->close(); _CLLDELETE(writer); ramDir->close(); _CLLDELETE(ramDir); } #if 0 public void testSerializable() throws IOException { Directory dir = new RAMDirectory(); ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); assertEquals("initially empty", 0, bos.size()); ObjectOutput out = new ObjectOutputStream(bos); int headerSize = bos.size(); out.writeObject(dir); out.close(); assertTrue("contains more then just header", headerSize < bos.size()); } #endif void testRAMDirectoryTearDown(CuTest * tc) { // cleanup if (*indexDir) { // delete index dir + all files in it (portable way!) } } CuSuite *testRAMDirectory(void) { CuSuite *suite = CuSuiteNew(_T("CLucene RAMDirectory Test")); SUITE_ADD_TEST(suite, testRAMDirectorySetUp); SUITE_ADD_TEST(suite, testRAMDirectory); SUITE_ADD_TEST(suite, testRAMDirectoryString); SUITE_ADD_TEST(suite, testRAMDirectorySize); SUITE_ADD_TEST(suite, testRAMDirectoryTearDown); return suite; } clucene-core-2.3.3.4/src/test/store/TestStore.cpp000066400000000000000000000062311154025176300215750ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexInput.h" #include void StoreTest(CuTest *tc,int32_t count, int mode){ srand(1251971); int32_t i; uint64_t veryStart = Misc::currentTimeMillis(); uint64_t start = Misc::currentTimeMillis(); char fsdir[CL_MAX_PATH]; _snprintf(fsdir, CL_MAX_PATH, "%s/%s",cl_tempDir, "test.store"); Directory* store = NULL; if ( mode == 1 ) store = _CLNEW RAMDirectory(); else{ store = (Directory*)FSDirectory::getDirectory(fsdir); ((FSDirectory*)store)->setUseMMap(mode == 3); } int32_t LENGTH_MASK = 0xFFF; char name[260]; for (i = 0; i < count; i++) { _snprintf(name,260,"%d.dat",i); int32_t length = rand() & LENGTH_MASK; uint8_t b = (uint8_t)(rand() & 0x7F); IndexOutput* file = store->createOutput(name); for (int32_t j = 0; j < length; j++) file->writeByte(b); file->close(); _CLDELETE(file); } CuMessageA(tc, "%d total milliseconds to create\n", (int32_t)(Misc::currentTimeMillis() - start)); if (mode != 1){ store->close(); _CLDECDELETE(store); store = (Directory*)FSDirectory::getDirectory(fsdir); }else{ CuMessageA(tc, "Memory used at end: %l", ((RAMDirectory*)store)->sizeInBytes); } srand(1251971); start = Misc::currentTimeMillis(); for (i = 0; i < count; i++) { _snprintf(name,260,"%d.dat",i); size_t length = rand() & LENGTH_MASK; uint8_t b = (uint8_t)(rand() & 0x7F); IndexInput* file = store->openInput(name); if (file->length() != length) _CLTHROWA(CL_ERR_Runtime, "length incorrect" ); for (size_t j = 0; j < length; j++){ if (file->readByte() != b){ TCHAR buf[100]; _tprintf(buf,_T("contents incorrect in file %d.dat"),i); _CLTHROWT(CL_ERR_Runtime, buf); } } file->close(); _CLDELETE(file); } CuMessageA(tc,"%d total milliseconds to read\n", (int32_t)(Misc::currentTimeMillis() - start)); srand(1251971); start = Misc::currentTimeMillis(); for (i = 0; i < count; i++) { _snprintf(name,260,"%d.dat",i); store->deleteFile(name); } CuMessageA(tc, "%d total milliseconds to delete\n",(int32_t)(Misc::currentTimeMillis() - start)); CuMessageA(tc, "%d total milliseconds \n", (int32_t)(Misc::currentTimeMillis() - veryStart)); //test makeLock::toString CL_NS(store)::LuceneLock* lf = store->makeLock("testlock"); std::string ts = lf->toString(); CLUCENE_ASSERT( ts.compare("fail") != 0 ); _CLDELETE(lf); store->close(); _CLDECDELETE(store); } void ramtest(CuTest *tc){ StoreTest(tc,1000,1); } void fstest(CuTest *tc){ StoreTest(tc,100,2); } void mmaptest(CuTest *tc){ StoreTest(tc,100,3); } CuSuite *teststore(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Store Test")); SUITE_ADD_TEST(suite, ramtest); SUITE_ADD_TEST(suite, fstest); SUITE_ADD_TEST(suite, mmaptest); return suite; } // EOF clucene-core-2.3.3.4/src/test/test.h000066400000000000000000000102441154025176300171300ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef TEST_H #define TEST_H #include "CLucene.h" #include "CLucene/_clucene-config.h" #include "CLucene/config/repl_tchar.h" #include "CLucene/config/repl_wchar.h" #include "CLucene/debug/_condition.h" #include "CLucene/util/StringBuffer.h" #include "CLucene/util/Misc.h" #include "CLucene/store/RAMDirectory.h" #include "CLucene/store/Lock.h" #include "CLucene/index/TermVector.h" #include "CLucene/queryParser/MultiFieldQueryParser.h" #include #include #include #include using namespace std; #define LUCENE_INT64_MAX_SHOULDBE _ILONGLONG(0x7FFFFFFFFFFFFFFF) #define LUCENE_INT64_MIN_SHOULDBE (-LUCENE_INT64_MAX_SHOULDBE - _ILONGLONG(1) ) CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(store) CL_NS_USE(search) CL_NS_USE(document) CL_NS_USE(queryParser) CL_NS_USE(analysis) CL_NS_USE2(analysis,standard) #include "CuTest.h" CuSuite *testatomicupdates(void); CuSuite *testRAMDirectory(void); CuSuite *testindexwriter(void); CuSuite *testIndexModifier(void); CuSuite *testindexreader(void); CuSuite *testIndexSearcher(void); CuSuite *testAddIndexesNoOptimize(void); CuSuite *teststore(void); CuSuite *testanalysis(void); CuSuite *testanalyzers(void); CuSuite *testhighfreq(void); CuSuite *testhighlight(void); CuSuite *testpriorityqueue(void); CuSuite *testQueryParser(void); CuSuite *testMultiFieldQueryParser(void); CuSuite *testqueries(void); CuSuite *testConstantScoreQueries(void); CuSuite *testsearch(void); CuSuite *testtermvector(void); CuSuite *testsort(void); CuSuite *testduplicates(void); CuSuite *testRangeFilter(void); CuSuite *testdatefilter(void); CuSuite *testwildcard(void); CuSuite *testdebug(void); CuSuite *testutf8(void); CuSuite *testreuters(void); CuSuite *testdocument(void); CuSuite *testField(void); CuSuite *testNumberTools(void); CuSuite *testDateTools(void); CuSuite *testBoolean(void); CuSuite *testBitSet(void); CuSuite *testExtractTerms(void); CuSuite *testSpanQueries(void); CuSuite *testStringBuffer(void); CuSuite *testTermVectorsReader(void); #ifdef TEST_CONTRIB_LIBS CuSuite *testGermanAnalyzer(void); #endif class English{ public: static void IntToEnglish(int32_t i, CL_NS(util)::StringBuffer* result); static TCHAR* IntToEnglish(int32_t i); static void IntToEnglish(int32_t i, TCHAR* buf, int32_t buflen); }; class TCharCompare{ public: bool operator()( const TCHAR* val1, const TCHAR* val2 ) const{ if ( val1==val2) return false; bool ret = (_tcscmp( val1,val2 ) < 0); return ret; } }; class CharCompare{ public: bool operator()( const char* val1, const char* val2 ) const{ if ( val1==val2) return false; bool ret = (strcmp( val1,val2 ) < 0); return ret; } }; template class StringMap : public std::map<_K,_T,_Comparator>{ bool delKey; public: StringMap(bool delKey){ this->delKey = delKey; } void remove(_K val){ std::iterator<_K,_T,_Comparator> itr; itr = this->find(val); if ( itr == this->end() ) return; _K v = itr->first; this->erase(itr); if ( delKey ){ _CLDELETE_CARRAY(v); } } virtual ~StringMap(){ while ( this->begin() != this->end() ){ _K v = this->begin()->first; this->erase(this->begin()); if ( delKey ){ _CLDELETE_CARRAY(v); } } } void add(_K k, _T v){ this->insert ( std::pair<_K,_T>(k,v) ); } }; void TestAssertIndexReaderEquals(CuTest *tc, IndexReader* reader1, IndexReader* reader2); extern unittest tests[]; #define CLUCENE_DATA_LOCATION1 "../../src/test/data/" #define CLUCENE_DATA_LOCATION2 "../src/test/data/" #define CLUCENE_DATA_LOCATION3 "../../../src/test/data/" #define CLUCENE_DATA_LOCATIONENV "srcdir" extern const char* cl_tempDir; #endif clucene-core-2.3.3.4/src/test/testall.cpp000066400000000000000000000261161154025176300201610ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ //msvc test for memory leaks: #ifdef _MSC_VER #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include #include #endif #endif #include "test.h" #include #include #include #ifdef _CL_HAVE_DIRECT_H #include #endif #ifdef _CL_HAVE_SYS_STAT_H #include #endif #ifdef _CL_HAVE_IO_H #include #endif std::string cl_tempDirS; const char* cl_tempDir; bool cl_quiet; char clucene_data_location[1024]; int main(int argc, char *argv[]) { #ifdef _MSC_VER #ifdef _DEBUG _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF _crtBreakAlloc=-1; #endif #endif #ifdef DMALLOC if ( getenv("DMALLOC_OPTIONS") == NULL ){ dmalloc_debug_setup("low,log=dmalloc.log.txt"); }else{ //apparently cygwin has to have this code.... dmalloc_debug_setup(getenv("DMALLOC_OPTIONS")); } #endif int ret_result = 0; int i=0; int exclude = 0; int list_provided = 0; CuSuiteList *alltests = NULL; CuString *output = CuStringNew(); bool silent = false; bool verbose = false; bool times = true; uint64_t startTime=0; if ( Misc::dir_Exists("/tmp") ) cl_tempDirS = "/tmp"; if ( getenv("TEMP") != NULL ) cl_tempDirS = getenv("TEMP"); else if ( getenv("TMP") != NULL ) cl_tempDirS = getenv("TMP"); if ( Misc::dir_Exists( (cl_tempDirS + "/clucene").c_str() ) ) cl_tempDirS += "/clucene"; cl_tempDir = cl_tempDirS.c_str(); clucene_data_location[0]=0; if ( CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION1 "/reuters-21578-index/segments") ) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION1); else if ( CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION2 "/reuters-21578-index/segments") ) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION2); else if ( CL_NS(util)::Misc::dir_Exists(CLUCENE_DATA_LOCATION3 "/reuters-21578-index/segments") ) strcpy(clucene_data_location, CLUCENE_DATA_LOCATION3); else if ( getenv(CLUCENE_DATA_LOCATIONENV) != NULL ){ strcpy(clucene_data_location,getenv(CLUCENE_DATA_LOCATIONENV)); strcat(clucene_data_location,"/data/reuters-21578-index/segments"); if ( CL_NS(util)::Misc::dir_Exists( clucene_data_location ) ){ strcpy(clucene_data_location, getenv(CLUCENE_DATA_LOCATIONENV)); strcat(clucene_data_location, "/data"); }else clucene_data_location[0]=0; } /* first check that we are running the test for the correct position */ //todo: make this configurable if ( !*clucene_data_location ){ fprintf(stderr,"%s must be run from a subdirectory of the application's root directory\n",argv[0]); fprintf(stderr,"ensure that the test data exists in %s or %s or %s\n",CLUCENE_DATA_LOCATION1, CLUCENE_DATA_LOCATION2, CLUCENE_DATA_LOCATION3); if ( getenv(CLUCENE_DATA_LOCATIONENV) != NULL ) fprintf(stderr,"%s/data was also checked because of the " CLUCENE_DATA_LOCATIONENV " environment variable", getenv(CLUCENE_DATA_LOCATIONENV)); ret_result = 1; goto exit_point; } CuInit(argc, argv); /* see if we're in exclude mode, see if list of testcases provided */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i],"-h") || !strcmp(argv[i],"--help") || !strcmp(argv[i],"/?")){ printf("%s [-l list] [-q quiet] [-v verbose] [-t show times] [-p printf messages immediatelly] [-x exclude] [tests...]\n",argv[0]); goto exit_point; } if (!strcmp(argv[i], "-v")) { verbose = true; continue; } if (!strcmp(argv[i], "-p")) { //used in CuInit continue; } if (!strcmp(argv[i], "-q")) { silent = true; continue; } if (!strcmp(argv[i], "-x")) { exclude = 1; continue; } if (!strcmp(argv[i], "-t")) { times = true; continue; } if (!strcmp(argv[i], "-l")) { for (i = 0; tests[i].func != NULL; i++) { printf("%s\n", tests[i].testname); } ret_result = 0; goto exit_point; } if (argv[i][0] == '-') { fprintf(stderr, "invalid option: `%s'\n", argv[i]); ret_result = 1; goto exit_point; } list_provided = 1; } if (!list_provided) { /* add everything */ alltests = CuSuiteListNew(_T("All CLucene Tests")); for (i = 0; tests[i].func != NULL; i++) { CuSuiteListAdd(alltests, tests[i].func()); } } else if (exclude) { /* add everything but the tests listed */ alltests = CuSuiteListNew(_T("Partial CLucene Tests")); for (i = 0; tests[i].func != NULL; i++) { int this_test_excluded = 0; int j; for (j = 1; j < argc && !this_test_excluded; j++) { if (!strcmp(argv[j], tests[i].testname)) { this_test_excluded = 1; } } if (!this_test_excluded) { CuSuiteListAdd(alltests, tests[i].func()); } } } else { /* add only the tests listed */ alltests = CuSuiteListNew(_T("Partial CLucene Tests")); for (i = 1; i < argc; i++) { int j; int found = 0; if (argv[i][0] == '-') { continue; } for (j = 0; tests[j].func != NULL; j++) { if (!strcmp(argv[i], tests[j].testname)) { CuSuiteListAdd(alltests, tests[j].func()); found = 1; } } if (!found) { fprintf(stderr, "invalid test name: `%s'\n", argv[i]); ret_result = 1; goto exit_point; } } } startTime = Misc::currentTimeMillis(); printf("Key: .= pass N=not implemented F=fail\n"); if ( silent ) CuSuiteListRun(alltests); else CuSuiteListRunWithSummary(alltests,verbose,times); i = CuSuiteListDetails(alltests, output); _tprintf(_T("%s\n"), output->buffer); if ( times ) printf("Tests run in %dms\n\n", (int32_t)(CL_NS(util)::Misc::currentTimeMillis()-startTime)); exit_point: if ( alltests != NULL ) CuSuiteListDelete(alltests); CuStringFree(output); _lucene_shutdown(); //clears all static memory if ( ret_result != 0 ) return ret_result; else return i > 0 ? 1 : 0; //Debuggin techniques: //For msvc, use this for breaking on memory leaks: // _crtBreakAlloc //for linux, use valgrind } void TestAssertIndexReaderEquals(CuTest *tc, IndexReader* index1, IndexReader* index2){ const Document::FieldsType* fields1, *fields2; Document::FieldsType::const_iterator it1, it2; CuAssertPtrNotNull(tc, _T("check index1!=null"), index1); CuAssertPtrNotNull(tc, _T("check index1!=null"), index2); //misc CuAssertIntEquals(tc,_T("IndexReaders have different values for numDocs"), index1->numDocs(), index2->numDocs()); CuAssertIntEquals(tc,_T("IndexReaders have different values for maxDoc"), index1->maxDoc(), index2->maxDoc()); CuAssertIntEquals(tc,_T("Only one IndexReader has deletions"), index1->hasDeletions(), index2->hasDeletions()); CuAssertIntEquals(tc,_T("Only one IndexReader is optimized"), index1->isOptimized(), index2->isOptimized()); //test field names StringArrayWithDeletor fn1; StringArrayWithDeletor fn2; index1->getFieldNames(IndexReader::ALL, fn1); index2->getFieldNames(IndexReader::ALL, fn2); //make sure field length is the same int fn1count = fn1.size(); int fn2count = fn2.size(); CuAssertIntEquals(tc, _T("reader fieldnames count not equal"), fn1count, fn2count ); for (int n=0;nnorms(fn1[n]); uint8_t* norms2 = index2->norms(fn1[n]); if ( norms1 != NULL ){ CLUCENE_ASSERT(norms2 != NULL); for ( int i=0;imaxDoc();i++ ){ int diff = norms1[i]-norms2[i]; if ( diff < 0 ) diff *= -1; if ( diff > 16 ){ TCHAR tmp[1024]; _sntprintf(tmp,1024,_T("Norms are off by more than the threshold! %d, should be %d"), (int32_t)norms2[i], (int32_t)norms1[i]); CuAssert(tc,tmp,false); } } }else CLUCENE_ASSERT(norms2 == NULL); //////////////////// } fn1.clear(); //save memory fn2.clear(); //save memory // check deletions for (int i = 0; i < index1->maxDoc(); i++) { CuAssertIntEquals( tc, _T("only deleted in one index."), index1->isDeleted(i), index2->isDeleted(i)); } // check stored fields Document doc1; Document doc2; for (int i = 0; i < index1->maxDoc(); i++) { if (!index1->isDeleted(i)) { doc1.clear(); doc2.clear(); index1->document(i, doc1); index2->document(i, doc2); fields1 = doc1.getFields(); fields2 = doc2.getFields(); CuAssertIntEquals(tc, _T("Different numbers of fields for doc "), fields1->size(), fields2->size()); it1 = fields1->begin(); it2 = fields2->begin(); while ( it1 != fields1->end() ) { Field* curField1 = *it1; Field* curField2 = *it2; CuAssertStrEquals( tc, _T("Different fields names for doc "), curField1->name(), curField2->name()); CuAssertStrEquals( tc, _T("Different field values for doc "), curField1->stringValue(), curField2->stringValue()); it1++; it2++; } } } // check dictionary and posting lists TermEnum* enum1 = index1->terms(); TermEnum* enum2 = index2->terms(); TermPositions* tp1 = index1->termPositions(); TermPositions* tp2 = index2->termPositions(); while(enum1->next()) { CuAssertTrue(tc,enum2->next()); CuAssertStrEquals(tc, _T("Different term field in dictionary."), enum1->term(false)->field(), enum2->term(false)->field() ); CuAssertStrEquals(tc, _T("Different term field in dictionary."), enum1->term(false)->text(), enum2->term(false)->text() ); CuAssert(tc, _T("Different term in dictionary."), enum1->term(false)->equals(enum2->term(false)) ); tp1->seek(enum1->term(false)); tp2->seek(enum1->term(false)); while(tp1->next()) { CuAssertTrue(tc, tp2->next()); CuAssertIntEquals(tc,_T("Different doc id in postinglist of term"), tp1->doc(), tp2->doc()); CuAssertIntEquals(tc,_T("Different term frequence in postinglist of term"), tp1->freq(), tp2->freq()); for (int i = 0; i < tp1->freq(); i++) { CuAssertIntEquals(tc,_T("Different positions in postinglist of term"), tp1->nextPosition(), tp2->nextPosition()); } } } _CLDELETE(enum1); _CLDELETE(enum2); _CLDELETE(tp1); _CLDELETE(tp2); } clucene-core-2.3.3.4/src/test/tests.cpp000066400000000000000000000034151154025176300176500ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" unittest tests[] = { {"threads", testatomicupdates}, {"indexreader", testindexreader}, {"indexsearcher", testIndexSearcher}, {"reuters", testreuters}, {"analysis", testanalysis}, {"analyzers", testanalyzers}, {"document", testdocument}, {"field", testField}, {"numbertools", testNumberTools}, {"debug", testdebug}, {"ramdirectory", testRAMDirectory}, {"indexwriter", testindexwriter}, {"indexmodifier", testIndexModifier}, {"addIndexesNoOptimize", testAddIndexesNoOptimize}, {"highfreq", testhighfreq}, {"priorityqueue", testpriorityqueue}, {"datetools", testDateTools}, {"queryparser", testQueryParser}, {"mfqueryparser", testMultiFieldQueryParser}, {"boolean", testBoolean}, {"search", testsearch}, {"rangefilter", testRangeFilter}, {"queries", testqueries}, {"csrqueries", testConstantScoreQueries}, {"termvector",testtermvector}, {"sort",testsort}, {"duplicates", testduplicates}, {"datefilter", testdatefilter}, {"wildcard", testwildcard}, {"store", teststore}, {"utf8", testutf8}, {"bitset", testBitSet}, {"extractterms",testExtractTerms}, {"spanqueries",testSpanQueries}, {"stringbuffer", testStringBuffer}, {"termvectorsreader",testTermVectorsReader}, #ifdef TEST_CONTRIB_LIBS {"germananalyzer", testGermanAnalyzer}, #endif {"LastTest", NULL} }; clucene-core-2.3.3.4/src/test/util/000077500000000000000000000000001154025176300167545ustar00rootroot00000000000000clucene-core-2.3.3.4/src/test/util/English.cpp000066400000000000000000000056771154025176300210700ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" CL_NS_USE(util) void English::IntToEnglish(int32_t i, StringBuffer* result) { if (i == 0) { result->append(_T("zero")); return ; } if (i < 0) { result->append(_T("minus ")); i = - i; } if (i >= 1000000000) { // billions IntToEnglish(i / 1000000000, result); result->append(_T("billion, ")); i = i % 1000000000; } if (i >= 1000000) { // millions IntToEnglish(i / 1000000, result); result->append(_T("million, ")); i = i % 1000000; } if (i >= 1000) { // thousands IntToEnglish(i / 1000, result); result->append(_T("thousand, ")); i = i % 1000; } if (i >= 100) { // hundreds IntToEnglish(i / 100, result); result->append(_T("hundred ")); i = i % 100; } if (i >= 20) { switch (i / 10) { case 9: result->append(_T("ninety")); break; case 8: result->append(_T("eighty")); break; case 7: result->append(_T("seventy")); break; case 6: result->append(_T("sixty")); break; case 5: result->append(_T("fifty")); break; case 4: result->append(_T("forty")); break; case 3: result->append(_T("thirty")); break; case 2: result->append(_T("twenty")); break; } i = i % 10; if (i == 0) result->append(_T(" ")); else result->append(_T("-")); } switch (i) { case 19: result->append(_T("nineteen ")); break; case 18: result->append(_T("eighteen ")); break; case 17: result->append(_T("seventeen ")); break; case 16: result->append(_T("sixteen ")); break; case 15: result->append(_T("fifteen ")); break; case 14: result->append(_T("fourteen ")); break; case 13: result->append(_T("thirteen ")); break; case 12: result->append(_T("twelve ")); break; case 11: result->append(_T("eleven ")); break; case 10: result->append(_T("ten ")); break; case 9: result->append(_T("nine ")); break; case 8: result->append(_T("eight ")); break; case 7: result->append(_T("seven ")); break; case 6: result->append(_T("six ")); break; case 5: result->append(_T("five ")); break; case 4: result->append(_T("four ")); break; case 3: result->append(_T("three ")); break; case 2: result->append(_T("two ")); break; case 1: result->append(_T("one ")); break; case 0: result->append(_T("")); break; } } TCHAR* English::IntToEnglish(int32_t i) { StringBuffer result; IntToEnglish(i, &result); return result.toString(); } void English::IntToEnglish(int32_t i, TCHAR* buf, int32_t buflen) { StringBuffer result; IntToEnglish(i, &result); _tcsncpy(buf,result.getBuffer(),buflen); } clucene-core-2.3.3.4/src/test/util/TestBitSet.cpp000066400000000000000000000150361154025176300215170ustar00rootroot00000000000000#include "test.h" #include "CLucene/store/Directory.h" #include "CLucene/store/IndexInput.h" #include "CLucene/util/BitSet.h" CL_NS_USE(util) CL_NS_USE(store) /** * Compare two BitVectors. * This should really be an equals method on the BitVector itself. * @param bv One bit vector * @param compare The second to compare */ bool doCompare(BitSet& bv, BitSet& compare) { bool equal = true; for(int i=0;isize();i++) { CLUCENE_ASSERT(!bv->get(i)); CLUCENE_ASSERT(i==bv->count()); bv->set(i); CLUCENE_ASSERT(bv->get(i)); CLUCENE_ASSERT(i+1==bv->count()); } _CLLDELETE(bv); bv = _CLNEW BitSet(n); // test count when setting then clearing bits for(int i=0;isize();i++) { CLUCENE_ASSERT(!bv->get(i)); CLUCENE_ASSERT(0==bv->count()); bv->set(i, true); CLUCENE_ASSERT(bv->get(i)); CLUCENE_ASSERT(1==bv->count()); bv->set(i, false); CLUCENE_ASSERT(!bv->get(i)); CLUCENE_ASSERT(0==bv->count()); } _CLLDELETE(bv); } /** * Test the count() method on BitVectors of various sizes. * @throws Exception */ void testCount(CuTest* tc) { doTestCountVectorOfSize(tc, 8); doTestCountVectorOfSize(tc, 20); doTestCountVectorOfSize(tc, 100); doTestCountVectorOfSize(tc, 1000); } void doTestWriteRead(CuTest* tc, int n) { Directory* d = new RAMDirectory(); BitSet bv(n); // test count when incrementally setting bits for(int i=0;iset(i); CLUCENE_ASSERT(i+1==bv->count()); } bv->write(d, "TESTBV"); // gradually increase number of set bits for (int i=count1; iset(i, true); CLUCENE_ASSERT(i+1==bv->count()); bv->write(d, "TESTBV"); } // now start decreasing number of set bits for (int i=count2-1; i>=count1; i--) { BitVector* bv2 = _CLNEW BitSet(d, "TESTBV"); CLUCENE_ASSERT(doCompare(*bv,*bv2)); _CLLDELETE(bv); bv = bv2; bv->set(i, false); CLUCENE_ASSERT(i==bv->count()); bv->write(d, "TESTBV"); } _CLLDELETE(bv); _CLLDECDELETE( d ); } /** * Test r/w when size/count cause switching between bit-set and d-gaps file formats. * @throws Exception */ void testDgaps(CuTest* tc) { doTestDgaps(tc, 1,0,1); doTestDgaps(tc, 10,0,1); doTestDgaps(tc, 100,0,1); doTestDgaps(tc, 202,0,1); doTestDgaps(tc, 1000,4,7); doTestDgaps(tc, 10000,40,43); doTestDgaps(tc, 100000,415,418); doTestDgaps(tc, 1000000,3123,3126); } void doTestBitAtEndOfBitSet(CuTest* tc, int size, int pos) { Directory* d = _CLNEW RAMDirectory(); BitSet* bv = _CLNEW BitSet(size); bv->set(pos, true); bv->write(d, "TESTBV"); _CLLDELETE(bv); bv = _CLNEW BitSet(d, "TESTBV"); CLUCENE_ASSERT(bv->get(pos)); _CLLDELETE( bv ); _CLLDECDELETE( d ); } void testBitAtEndOfBitSet(CuTest* tc) { doTestBitAtEndOfBitSet(tc, 202, 200); } void doTestNextSetBit(CuTest* tc, int nSize) { BitSet bv( nSize ); int nIdx; int nExpectedIdx; // initialize bit set by setting every second bit starting with 0 for( int32_t i = 0; i < bv.size(); i+=2 ) bv.set(i); // iterate the bits nIdx = 0; nExpectedIdx = 0; while( (nIdx = bv.nextSetBit( nIdx )) != -1 ) { assertEquals( nExpectedIdx, nIdx ); nExpectedIdx += 2; nIdx++; } } /** * Test the nextSetBit() method on BitVectors of various sizes. * CLucene specific * @throws Exception */ void testNextSetBit(CuTest* tc) { doTestNextSetBit(tc, 8); doTestNextSetBit(tc, 20); doTestNextSetBit(tc, 100); } CuSuite *testBitSet(void) { CuSuite *suite = CuSuiteNew(_T("CLucene BitSet Test")); SUITE_ADD_TEST(suite, testConstructSize); SUITE_ADD_TEST(suite, testGetSet); SUITE_ADD_TEST(suite, testClear); SUITE_ADD_TEST(suite, testCount); SUITE_ADD_TEST(suite, testWriteRead); SUITE_ADD_TEST(suite, testDgaps); SUITE_ADD_TEST(suite, testBitAtEndOfBitSet); SUITE_ADD_TEST(suite, testNextSetBit); return suite; } clucene-core-2.3.3.4/src/test/util/TestPriorityQueue.cpp000066400000000000000000000040521154025176300231470ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include #include //test string buffer //StringBuffer sb; //sb.appendFloat(0.02f,2); //CuAssertStrEquals(tc, _T("appendFloat failed"), _T("0.02"), sb.getBuffer()); class integerQueue: public CL_NS(util)::PriorityQueue{ public: integerQueue(int32_t count) { initialize(count,false); } protected: bool lessThan(int32_t a, int32_t b) { return (a < b); } }; void _test_PriorityQueue(CuTest *tc,int32_t count){ integerQueue pq(count); srand ( (unsigned)time(NULL) ); int32_t sum = 0, sum2 = 0; uint64_t start = CL_NS(util)::Misc::currentTimeMillis(); for (int32_t i = 0; i < count; i++) { int32_t next = -rand(); //int32_t next = (count+1)-i; sum += next; pq.put( next ); } CuMessageA(tc,"%d milliseconds/", (int32_t)(CL_NS(util)::Misc::currentTimeMillis()-start)); CuMessageA(tc,"%d puts\n",count); start = CL_NS(util)::Misc::currentTimeMillis(); int32_t last = -0x7FFFFFFF; for (int32_t j = 0; j < count; j++) { int32_t next = pq.pop(); if ( next < last ){ TCHAR buf[1024]; _sntprintf(buf,1024,_T("next < last at %d (last: %d, next: %d)"),j,last,next); CuAssert(tc,buf,false); } last = next; sum2 += last; } CuMessageA(tc,"%d milliseconds", (int32_t)(CL_NS(util)::Misc::currentTimeMillis()-start)); CuMessageA(tc,"/%d pops\n",count); CLUCENE_ASSERT(sum == sum); } void testPriorityQueue(CuTest *tc){ _test_PriorityQueue(tc,100000); } CuSuite *testpriorityqueue(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Priority Queue Test")); SUITE_ADD_TEST(suite, testPriorityQueue); return suite; } // EOF clucene-core-2.3.3.4/src/test/util/TestStringBuffer.cpp000066400000000000000000000101471154025176300227230ustar00rootroot00000000000000/*------------------------------------------------------------------------------ * Copyright (C) 2003-2010 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #include "test.h" #include "CLucene/util/StringBuffer.h" #include CL_NS_USE(util) void testStringBufferConstruct(CuTest *tc) { StringBuffer sb; CuAssertEquals(tc, 0, sb.length()); StringBuffer sb1(10); CuAssertEquals(tc, 0, sb1.length()); StringBuffer sb2(_T("test")); CuAssertEquals(tc, 4, sb2.length()); CuAssertStrEquals(tc, _T(""), _T("test"), sb2.getBuffer()); } void testStringBufferCharAt(CuTest *tc) { StringBuffer sb(_T("test abcd")); CuAssertTrue(tc, sb.charAt(0) == _T('t'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(1) == _T('e'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(2) == _T('s'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(3) == _T('t'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(4) == _T(' '), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(5) == _T('a'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(6) == _T('b'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(7) == _T('c'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(8) == _T('d'), _T("unexpected character")); sb.setCharAt(4, _T('-')); CuAssertTrue(tc, sb.charAt(0) == _T('t'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(1) == _T('e'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(2) == _T('s'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(3) == _T('t'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(4) == _T('-'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(5) == _T('a'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(6) == _T('b'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(7) == _T('c'), _T("unexpected character")); CuAssertTrue(tc, sb.charAt(8) == _T('d'), _T("unexpected character")); } void testStringBufferClear(CuTest *tc) { StringBuffer sb(_T("test abcd wxyz")); sb.clear(); CuAssertEquals(tc, 0, sb.length()); CuAssertStrEquals(tc, _T(""), _T("\0"), sb.getBuffer()); } void testStringBufferInsert(CuTest *tc) { StringBuffer sb(_T("test abcd")); sb.insert(5, _T('X')); CuAssertStrEquals(tc, _T(""), _T("test Xabcd"), sb.getBuffer()); sb.insert(7, _T("YY")); CuAssertStrEquals(tc, _T(""), _T("test XaYYbcd"), sb.getBuffer()); sb.insert(7, _T("")); CuAssertStrEquals(tc, _T(""), _T("test XaYYbcd"), sb.getBuffer()); sb.insert(12, _T("ZZZ")); CuAssertStrEquals(tc, _T(""), _T("test XaYYbcdZZZ"), sb.getBuffer()); sb.insert(15, _T('_')); CuAssertStrEquals(tc, _T(""), _T("test XaYYbcdZZZ_"), sb.getBuffer()); sb.insert(0, _T('_')); CuAssertStrEquals(tc, _T(""), _T("_test XaYYbcdZZZ_"), sb.getBuffer()); sb.insert(0, _T("123")); CuAssertStrEquals(tc, _T(""), _T("123_test XaYYbcdZZZ_"), sb.getBuffer()); } void testStringBufferDelete(CuTest *tc) { StringBuffer sb(_T("test abcd")); sb.deleteCharAt(4); CuAssertStrEquals(tc, _T(""), _T("testabcd"), sb.getBuffer()); sb.deleteChars(4, 7); CuAssertStrEquals(tc, _T(""), _T("testd"), sb.getBuffer()); sb.deleteChars(3, 3); CuAssertStrEquals(tc, _T(""), _T("testd"), sb.getBuffer()); } void testSubstringEquals(CuTest *tc) { StringBuffer sb(_T("test abcd")); CuAssertTrue(tc, sb.substringEquals(3, 6, _T("t a"))); CuAssertTrue(tc, sb.substringEquals(3, 6, _T("t a"), 3)); CuAssertTrue(tc, !sb.substringEquals(3, 6, _T("t-a"), 3)); } CuSuite *testStringBuffer(void) { CuSuite *suite = CuSuiteNew(_T("CLucene StringBuffer Test")); SUITE_ADD_TEST(suite, testStringBufferConstruct); SUITE_ADD_TEST(suite, testStringBufferCharAt); SUITE_ADD_TEST(suite, testStringBufferClear); SUITE_ADD_TEST(suite, testStringBufferInsert); SUITE_ADD_TEST(suite, testStringBufferDelete); SUITE_ADD_TEST(suite, testSubstringEquals); return suite; }