/* ***************************************************************************************** * * * COPYRIGHT: * * (C) Copyright Taligent, Inc., 1997 * * (C) Copyright International Business Machines Corporation, 1997-1998 * * Licensed Material - Program-Property of IBM - All Rights Reserved. * * US Government Users Restricted Rights - Use, duplication, or disclosure * * restricted by GSA ADP Schedule Contract with IBM Corp. * * * ***************************************************************************************** * * File UNICDCM.CPP * * Modification History: * * Date Name Description * 02/18/97 aliu Converted from OpenClass. * 03/11/97 aliu Recoded mappedChar() slightly to clean up code and improve * performance. * 04/15/97 aliu Worked around bug in AIX xlC compiler which occurs if static * arrays contain const elements. * 05/06/97 aliu Made SpecialMapping an array of objects instead of pointers, * to help out non-compliant compilers. ***************************************************************************************** */ // ***************************************************************************** // This file was generated from the java source file UnicodeClassMapping.java // ***************************************************************************** #include "unicdcm.h" #include "unicode.h" // ***************************************************************************** // class UnicodeClassMapping // This class maps categories to state change inputs for the // WordBreakTable. An entire category is mapped to the same // value unless the character in question appears in the exception list. // ***************************************************************************** // ------------------------------------- UnicodeClassMapping::UnicodeClassMapping(Type* mappedValue, int32_t mappedValue_length, const SpecialMapping* exceptionChars, int32_t exceptionChars_length, const bool_t *hasException, Type* asciiValues) : fMappedValue(mappedValue), fMappedValue_length(mappedValue_length), fExceptionChars(exceptionChars), fExceptionChars_length(exceptionChars_length), fHasException(hasException), fAsciiValues(asciiValues) { } // ------------------------------------- TextBoundaryData::Type UnicodeClassMapping::mappedChar(UChar ch) const { if (ch <= 255) { return fAsciiValues[ ch ]; } // get an appropriate category based on the character's Unicode class // if there's no entry in the exception table for that Unicode class, // we're done; otherwise we have to look in the exception table for // the character's category (\uffff is treated here as a sentinel // value meaning "end of the string"-- we always look in the exception // table for its category) Type chType = Unicode::getType(ch); if ((fExceptionChars_length == 0) || (!fHasException[chType] && (ch != (UChar)0xFFFF))) { return fMappedValue[chType]; } // The invariant during this loop is that the character ch is <= max and // >= min. We iterate until min == max. int32_t min = 0; int32_t max = fExceptionChars_length - 1; while (max > min) { int32_t pos = (max + min) >> 1; if (ch > fExceptionChars[pos].fEndChar) { min = pos + 1; }else{ max = pos; } } const SpecialMapping* sm = &fExceptionChars[min]; if (sm->fStartChar <= ch && ch <= sm->fEndChar) return sm->fNewValue; else return fMappedValue[chType]; } //eof