/* ********************************************************************** * Copyright (c) 2000, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 01/17/2000 aliu Ported from Java. ********************************************************************** */ #include "unicode/hangjamo.h" #include "unicode/rep.h" #include "unicode/unifilt.h" #include "unicode/unicode.h" // These constants are from the Unicode book's algorithm. #define SBase (0xAC00) #define LBase (0x1100) #define VBase (0x1161) #define TBase (0x11A7) #define LCount (19) #define VCount (21) #define TCount (28) #define NCount (VCount * TCount) // 588 #define SCount (LCount * NCount) // 11172 /** * ID for this transliterator. */ const char* HangulJamoTransliterator::_ID = "Hangul-Jamo"; /** * Constructs a transliterator. */ HangulJamoTransliterator::HangulJamoTransliterator(UnicodeFilter* adoptedFilter) : Transliterator(_ID, adoptedFilter) { } /** * Copy constructor. */ HangulJamoTransliterator::HangulJamoTransliterator(const HangulJamoTransliterator& o) : Transliterator(o) { } /** * Assignment operator. */ HangulJamoTransliterator& HangulJamoTransliterator::operator=( const HangulJamoTransliterator& o) { Transliterator::operator=(o); return *this; } /** * Transliterator API. */ Transliterator* HangulJamoTransliterator::clone(void) const { return new HangulJamoTransliterator(*this); } /** * Implements {@link Transliterator#handleTransliterate}. */ void HangulJamoTransliterator::handleTransliterate(Replaceable& text, UTransPosition& offsets, UBool isIncremental) const { int32_t cursor = offsets.start; int32_t limit = offsets.limit; UnicodeString replacement; while (cursor < limit) { UChar c = filteredCharAt(text, cursor); if (decomposeHangul(c, replacement)) { text.handleReplaceBetween(cursor, cursor+1, replacement); int32_t len = replacement.length(); cursor += len; // skip over replacement limit += len - 1; // fix up limit offsets.contextLimit += len - 1; // fix up limit } else { ++cursor; } } offsets.contextLimit += limit - offsets.limit; offsets.limit = limit; offsets.start = cursor; } UBool HangulJamoTransliterator::decomposeHangul(UChar s, UnicodeString& result) { int32_t SIndex = s - SBase; if (0 > SIndex || SIndex >= SCount) { return FALSE; } int32_t L = LBase + SIndex / NCount; int32_t V = VBase + (SIndex % NCount) / TCount; int32_t T = TBase + SIndex % TCount; result.truncate(0); result.append((UChar)L); result.append((UChar)V); if (T != TBase) { result.append((UChar)T); } return TRUE; }