b942cae860
X-SVN-Rev: 18
225 lines
7.4 KiB
C++
225 lines
7.4 KiB
C++
/******************************************************************************
|
|
* COPYRIGHT:
|
|
* (C) Copyright Taligent, Inc., 1996
|
|
* (C) Copyright IBM Corp. 1996-1999
|
|
* Licensed Material - Program-Property of IBM - All Rights Reserved.
|
|
* US Government Users Restricted Rights - Use, duplication, or disclosure
|
|
* restricted by GSA ADP Schedule Contact with IBM Corp.
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
//=============================================================================
|
|
//
|
|
// File mergecol.h
|
|
//
|
|
//
|
|
//
|
|
// Created by: Helena Shih
|
|
//
|
|
// Modification History:
|
|
//
|
|
// Date Name Description
|
|
// 3/5/97 mark Cleaned up fixEntry(). Added constants BYTEPOWER
|
|
// and BYTEMASK to replace BYTESIZE.
|
|
// 6/17/97 helena In getPattern, added the queue-up list for entries
|
|
// with the same extension chars.
|
|
// 8/18/97 helena Added internal API documentation.
|
|
// 8/13/98 erm Synched up with 1.2 version of MergeCollation.java
|
|
// 04/23/99 stephen Removed EDecompositionMode, merged with
|
|
// Normalizer::EMode
|
|
//=============================================================================
|
|
|
|
#ifndef MERGECOL_H
|
|
#define MERGECOL_H
|
|
|
|
#include "unistr.h"
|
|
#include "ptnentry.h"
|
|
#include "tables.h"
|
|
#include "coll.h"
|
|
#include "normlzr.h"
|
|
|
|
|
|
/**
|
|
* Utility class for normalizing and merging patterns for collation.
|
|
* Patterns are strings of the form <entry>*, where <entry> has the
|
|
* form:
|
|
* <pre>
|
|
* <pattern> := <entry>*
|
|
* <entry> := <separator><chars>{"/"<extension>}
|
|
* <separator> := "=", ",", ";", "<", "&"
|
|
* <chars>, and <extension> are both arbitrary strings.
|
|
* </pre>
|
|
* <P>Unquoted whitespaces are ignored.
|
|
* 'xxx' can be used to quote characters.
|
|
* <P>
|
|
* One difference from Collation is that & is used to reset to a current
|
|
* point. Or, in other words, it introduces a new sequence which is to
|
|
* be added to the old.
|
|
* <P>
|
|
* That is: "a < b < c < d" is the same as "a < b & b < c & c < d" OR
|
|
* "a < b < d & b < c"
|
|
* XXX: make '' be a single quote.
|
|
* @see PatternEntry
|
|
* @version 1.4 1/7/97
|
|
* @author Mark Davis, Helena Shih
|
|
*/
|
|
|
|
class MergeCollation
|
|
{
|
|
public:
|
|
|
|
/**
|
|
* Creates a merged collation table from a pattern string.
|
|
* @param pattern the pattern string.
|
|
* @param status the error code status. If the input pattern is incorrect,
|
|
* this will be set to U_INVALID_FORMAT_ERROR.
|
|
*/
|
|
MergeCollation( const UnicodeString& pattern,
|
|
Normalizer::EMode decompMode,
|
|
UErrorCode& success);
|
|
/**
|
|
* Copy constructor.
|
|
*/
|
|
MergeCollation( const MergeCollation& other);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
~MergeCollation();
|
|
|
|
/** Assignment operator
|
|
*/
|
|
const MergeCollation& operator=(const MergeCollation& other);
|
|
/**
|
|
* Recovers current pattern from this merged collation object.
|
|
* @param pattern the result buffer.
|
|
* @return the recovered result.
|
|
*/
|
|
UnicodeString& getPattern(UnicodeString& pattern) const;
|
|
|
|
/**
|
|
* Recovers current pattern with white spaces.
|
|
* @param pattern the result buffer.
|
|
* @param withWhiteSpace puts spacing around the entries, and \n
|
|
* before & and <
|
|
* @return the recovered result.
|
|
*/
|
|
UnicodeString& getPattern(UnicodeString& pattern, bool_t withWhiteSpace) const;
|
|
|
|
/**
|
|
* Emits the pattern for collation builder.
|
|
* @param pattern the result buffer.
|
|
* @return Emits the string in the format understable to the collation
|
|
* builder.
|
|
*/
|
|
UnicodeString& emitPattern(UnicodeString& pattern) const;
|
|
|
|
/**
|
|
* Emits the pattern for collation builder.
|
|
* @param pattern the result buffer.
|
|
* @param withWhiteSpace puts spacing around the entries, and \n
|
|
* before & and <
|
|
* @return Emits the string in the format understable to the collation
|
|
* builder.
|
|
*/
|
|
UnicodeString& emitPattern(UnicodeString& pattern, bool_t withWhiteSpace) const;
|
|
|
|
/**
|
|
* Sets the pattern.
|
|
* @param pattern string.
|
|
* @param status the error code status, it will be set to U_INVALID_FORMAT_ERROR
|
|
* if the pattern is incorrect.
|
|
*/
|
|
void setPattern(const UnicodeString& pattern,
|
|
Normalizer::EMode decompMode,
|
|
UErrorCode& status);
|
|
|
|
/**
|
|
* Adds a pattern to the current merge collation object.
|
|
* @param pattern the new pattern to be added.
|
|
* @param status the error code status, it will be set to U_INVALID_FORMAT_ERROR
|
|
* if the pattern is incorrect.
|
|
*/
|
|
void addPattern(const UnicodeString& pattern,
|
|
Normalizer::EMode decompMode,
|
|
UErrorCode& status);
|
|
|
|
/**
|
|
* Gets count of separate entries in the merge collation object.
|
|
* @return the number of pattern entries
|
|
*/
|
|
int32_t getCount(void) const;
|
|
|
|
/**
|
|
* Gets the specified pattern entry out of the merge collation object.
|
|
* @param index the offset of the desired pattern entry
|
|
* @return the requested pattern entry
|
|
*/
|
|
const PatternEntry* getItemAt(UTextOffset index) const;
|
|
|
|
private:
|
|
|
|
//============================================================
|
|
// privates
|
|
//============================================================
|
|
|
|
VectorOfPointersToPatternEntry* patterns; // a vector of PatternEntries
|
|
static const int32_t BITARRAYSIZE;
|
|
static const uint8_t BITARRAYMASK;
|
|
static const int32_t BYTEPOWER;
|
|
static const int32_t BYTEMASK;
|
|
|
|
PatternEntry* lastEntry;
|
|
PatternEntry* saveEntry;
|
|
uint8_t* statusArray;
|
|
|
|
|
|
/**
|
|
* Finds the last pattern entry before the specified offset that does not have
|
|
* extension chars.
|
|
* @param i the offset.
|
|
* @return the pattern entry.
|
|
*/
|
|
const PatternEntry* findLastWithNoExtension(int32_t i) const;
|
|
|
|
/**
|
|
* Fixes the new pattern entry in the merge collation table.
|
|
* If the strength is RESET, then just change the lastEntry to
|
|
* be the current. (If the current is not in patterns, signal an error).
|
|
* If not, then remove the current entry, and add it after lastEntry
|
|
* (which is usually at the end). Strength indicates the text order
|
|
* weight for an entry.
|
|
* @param newEntry the new pattern entry
|
|
* @param status the error code status, it will be set to U_INVALID_FORMAT_ERROR
|
|
* if the strength is RESET and a previous entry can't be found.
|
|
*/
|
|
void fixEntry( PatternEntry* newEntry,
|
|
UErrorCode& status);
|
|
|
|
/**
|
|
* Finds the offset of the specified entry that was previously installed in the
|
|
* merge collation object.
|
|
* @param lastEntry the entry that was previously installed.
|
|
* @param excess the extra characters
|
|
* @param status the error code status, it will be set to U_INVALID_FORMAT_ERROR
|
|
* if the strength is RESET and a previous entry can't be found.
|
|
* @return the offset of the found entry
|
|
*/
|
|
int32_t findLastEntry( const PatternEntry* lastEntry,
|
|
UnicodeString& excess,
|
|
UErrorCode& success) const;
|
|
};
|
|
|
|
inline UnicodeString& MergeCollation::getPattern(UnicodeString& result) const
|
|
{
|
|
return getPattern(result, TRUE);
|
|
}
|
|
|
|
inline UnicodeString& MergeCollation::emitPattern(UnicodeString& result) const
|
|
{
|
|
return emitPattern(result, TRUE);
|
|
}
|
|
|
|
|
|
#endif // _MERGECOL
|