| /* |
| ********************************************************************** |
| * 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; |
| } |