зеркало из https://github.com/mozilla/pjs.git
597 строки
23 KiB
C++
597 строки
23 KiB
C++
/*
|
|
* @(#)CharToByteX11Johab.java 1.1 99/08/28
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public
|
|
* License Version 1.1 (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.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is CharToByteX11Johab.java
|
|
*
|
|
* The Initial Developer of the Original Code is Deogtae Kim
|
|
* <dtkim@calab.kaist.ac.kr> (98/05/03) and
|
|
* Based on: Hanterm source code adapted by Jungshik Shin
|
|
* <jshin@pantheon.yale.edu>
|
|
*
|
|
* Contributor(s):
|
|
* Deogtae Kim <dtkim@calab.kaist.ac.kr> (99/08/28)
|
|
* Jungshik Shin <jshin@pantheon.yale.edu>
|
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
|
*
|
|
* - Purposes:
|
|
* 1. Enable displaying all 11,172 Modern hangul syllables with Hanterm
|
|
* johab fonts on Unix
|
|
* 2. Enable displaying some of Unicode 2.0 ancient hangul syllables
|
|
* with Hanterm johab fonts on Unix
|
|
* 3. Enable displaying all of Unicode 2.0 ancient hangul syllables with
|
|
* possible future extended Hanterm johab fonts on Unix
|
|
*
|
|
* - Installation Instructions:
|
|
* 1. Install Hanterm Johab fonts and a proper font property file to Unix system.
|
|
* (Confer http://calab.kaist.ac.kr/~dtkim/java/)
|
|
* 2. Make a directory "jdk1.x.x/classes/"
|
|
* 3. Compile this class into "jdk1.x.x/classes/"
|
|
*
|
|
* - Hangule syllable break rule algorithm descriptions:
|
|
* The algorithm used here is slightly different from that of the Unicode standard 2.0.
|
|
* The standard saids that a (canonical) hangul syllable block is a sequence of leading
|
|
* consonants and a sequence of vowels and an optional sequence of trailing
|
|
* consonants.
|
|
* I think this unncessarily complicate matters.
|
|
* So, the algorithm chosen here is:
|
|
* A (non-canonical) hangul syllable block is the longest sequence comprised of
|
|
* an optional leading consonant and an optional vowel and an optional trailing consonant.
|
|
* The skipped leading consonants and vowels are considered as fillers.
|
|
* The merit of this algorithm is that any sequence of jamos can be composed validly.
|
|
*/
|
|
#include "nsUnicodeToX11Johab.h"
|
|
#include "nsUCvKODll.h"
|
|
|
|
|
|
typedef char byte;
|
|
|
|
// XPCOM stuff
|
|
NS_IMPL_ADDREF(nsUnicodeToX11Johab);
|
|
NS_IMPL_RELEASE(nsUnicodeToX11Johab);
|
|
nsresult nsUnicodeToX11Johab::QueryInterface(REFNSIID aIID,
|
|
void** aInstancePtr)
|
|
{
|
|
if (NULL == aInstancePtr) {
|
|
return NS_ERROR_NULL_POINTER;
|
|
}
|
|
|
|
*aInstancePtr = NULL;
|
|
|
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
|
|
|
if (aIID.Equals(NS_GET_IID(nsIUnicodeEncoder))) {
|
|
*aInstancePtr = (void*) ((nsIUnicodeEncoder*)this);
|
|
NS_ADDREF_THIS();
|
|
return NS_OK;
|
|
}
|
|
if (aIID.Equals(NS_GET_IID(nsICharRepresentable))) {
|
|
*aInstancePtr = (void*) ((nsICharRepresentable*)this);
|
|
NS_ADDREF_THIS();
|
|
return NS_OK;
|
|
}
|
|
if (aIID.Equals(kISupportsIID)) {
|
|
*aInstancePtr = (void*) ((nsISupports*)((nsIUnicodeEncoder*)this));
|
|
NS_ADDREF_THIS();
|
|
return NS_OK;
|
|
}
|
|
|
|
return NS_NOINTERFACE;
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsUnicodeToX11Johab::SetOutputErrorBehavior(
|
|
PRInt32 aBehavior,
|
|
nsIUnicharEncoder * aEncoder, PRUnichar aChar)
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
|
|
nsresult nsUnicodeToX11Johab::CreateInstance(nsISupports **aResult)
|
|
{
|
|
nsIUnicodeEncoder *p = new nsUnicodeToX11Johab();
|
|
if(p) {
|
|
*aResult = p;
|
|
return NS_OK;
|
|
}
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
|
|
// 1 /*
|
|
// 2 * @(#)CharToByteX11Johab.java 1.0 98/05/03
|
|
// 3 *
|
|
// 4 * Purposes:
|
|
// 5 * 1. Enable displaying all 11,172 Modern hangul syllables with Hanterm
|
|
// 6 * johab fonts on Unix
|
|
// 7 * 2. Enable displaying some of Unicode 2.0 ancient hangul syllables
|
|
// 8 * with Hanterm johab fonts on Unix
|
|
// 9 * 3. Enable displaying all of Unicode 2.0 ancient hangul syllables with
|
|
// 10 * possible future extended Hanterm johab fonts on Unix
|
|
// 11 *
|
|
// 12 * Installation Instructions:
|
|
// 13 * 1. Install Hanterm Johab fonts and a proper font property file to Unix syste
|
|
// 14 m.
|
|
// 15 * (Confer http://calab.kaist.ac.kr/~dtkim/java/ )
|
|
// 16 * 2. Make a directory "jdk1.x.x/classes/"
|
|
// 17 * 3. Compile this class into "jdk1.x.x/classes/"
|
|
// 18 *
|
|
// 19 * Author: Deogtae Kim <dtkim@calab.kaist.ac.kr>, 98/05/03
|
|
// 20 *
|
|
// 21 * Based on: Hanterm source code adapted by Jungshik Shin <jshin@pantheon.yale.
|
|
// 22 edu>
|
|
// 23 */
|
|
// 24
|
|
// 25 import sun.io.CharToByteConverter;
|
|
// 26 import sun.io.MalformedInputException;
|
|
// 27 import sun.io.UnknownCharacterException;
|
|
// 28 import sun.io.ConversionBufferFullException;
|
|
// 29
|
|
// 30 public class CharToByteX11Johab extends CharToByteConverter
|
|
// 31 {
|
|
// 32 int state = START;
|
|
// 33
|
|
// 34 public static final int START = 0;
|
|
// 35 public static final int LEADING_CONSONANT = 1;
|
|
// 36 public static final int VOWEL = 2;
|
|
// 37
|
|
// 38 int l = 0x5f; // leading consonant
|
|
// 39 int v = 0; // vowel
|
|
// 40 int t = 0; // trailing consonant
|
|
|
|
#define START 1
|
|
#define LEADING_CONSONANT 1
|
|
#define VOWEL 2
|
|
|
|
// constructor and destroctor
|
|
|
|
nsUnicodeToX11Johab::nsUnicodeToX11Johab()
|
|
{
|
|
Reset();
|
|
state = START;
|
|
l = 0x5f;
|
|
v = 0;
|
|
t = 0;
|
|
NS_INIT_REFCNT();
|
|
PR_AtomicIncrement(&g_InstanceCount);
|
|
|
|
}
|
|
nsUnicodeToX11Johab::~nsUnicodeToX11Johab()
|
|
{
|
|
PR_AtomicDecrement(&g_InstanceCount);
|
|
}
|
|
|
|
// 41
|
|
// 42 /*
|
|
// 43 * This method indicates the charset name for this font.
|
|
// 44 */
|
|
// 45 public String getCharacterEncoding()
|
|
// 46 {
|
|
// 47 return "X11Johab";
|
|
// 48 }
|
|
// 49
|
|
// 50 /*
|
|
// 51 * This method indicates the range this font covers.
|
|
// 52 */
|
|
// 53 public boolean canConvert(char ch)
|
|
// 54 {
|
|
// 55 if ( 0xac00 <= ch && ch <= 0xd7a3 // Modern hangul syllables
|
|
// 56 || 0x1100 <= ch && ch <= 0x1112 // modern leading consonants (19
|
|
// 57 )
|
|
// 58 || 0x1113 <= ch && ch <= 0x1159 // ancient leading consonants (7
|
|
// 59 1)
|
|
// 60 && lconBase[ch-0x1100] != 0
|
|
// 61 || ch == 0x115f // leading consonants filler
|
|
// 62 || 0x1160 <= ch && ch <= 0x1175 // modern vowels (21)
|
|
// 63 || 0x1176 <= ch && ch <= 0x11a2 // ancient vowels (45)
|
|
// 64 && vowBase[ch-0x1160] != 0
|
|
// 65 || 0x11a8 <= ch && ch <= 0x11c2 // modern trailing consonants (2
|
|
// 66 7)
|
|
// 67 || 0x11c3 <= ch && ch <= 0x11f9 // ancient trailing consonants (
|
|
// 68 55)
|
|
// 69 && tconBase[ch-0x11a7] != 0 )
|
|
// 70 return true;
|
|
// 71 return false;
|
|
// 72 }
|
|
|
|
#define canConvert(ch) \
|
|
(((0xac00 <=(ch))&&((ch)<= 0xd7a3)) /* Modern hangul syllables */\
|
|
|| ((0x1100 <=(ch))&&((ch)<= 0x1112)) /* modern leading consonants (19) */\
|
|
|| ((0x1113 <=(ch))&&((ch)<= 0x1159) /* ancient leading consonants (71) */\
|
|
&& (lconBase[ch-0x1100] != 0)) */\
|
|
|| ((ch) == 0x115f) /* leading consonants filler */\
|
|
|| ((0x1160 <=(ch))&&((ch)<= 0x1175)) /* modern vowels (21) */\
|
|
|| ((0x1176 <=(ch))&&((ch)<= 0x11a2) /* ancient vowels (45) */\
|
|
&& (vowBase[(ch)-0x1160] != 0 )) */\
|
|
|| ((0x11a8 <=(ch))&&((ch)<= 0x11c2))/* modern trailing consonants (27) */\
|
|
|| ((0x11c3 <=(ch))&&((ch)<= 0x11f9) /* ancient trailing consonants (55)*/\
|
|
&& (tconBase[(ch)-0x11a7] != 0 )))
|
|
|
|
// 73
|
|
// 74 /*
|
|
// 75 * This method converts the unicode to this font index.
|
|
// 76 * Note: ConversionBufferFullException is not handled
|
|
// 77 * since this class is only used for character display.
|
|
// 78 */
|
|
// 79 public int convert(char[] input, int inStart, int inEnd,
|
|
// 80 byte[] output, int outStart, int outEnd)
|
|
// 81 throws MalformedInputException, UnknownCharacterException
|
|
// 82 {
|
|
NS_IMETHODIMP nsUnicodeToX11Johab::Convert(
|
|
const PRUnichar * input, PRInt32 * aSrcLength,
|
|
char * output, PRInt32 * aDestLength)
|
|
{
|
|
// 83 charOff = inStart;
|
|
// 84 byteOff = outStart;
|
|
charOff = byteOff = 0;
|
|
/* 85 */
|
|
/* 86 */ for (; charOff < *aSrcLength; charOff++)
|
|
/* 87 */ {
|
|
/* 88 */ PRUnichar ch = input[charOff];
|
|
/* 89 */ if (0xac00 <= ch && ch <= 0xd7a3)
|
|
/* 90 */ {
|
|
/* 91 */ if ( state != START )
|
|
/* 92 */ composeHangul(output);
|
|
/* 93 */ ch -= 0xac00;
|
|
/* 94 */ l = (ch / 588); // 588 = 21*28
|
|
/* 95 */ v = ( ch / 28 ) % 21 + 1;
|
|
/* 96 */ t = ch % 28;
|
|
/* 97 */ composeHangul(output);
|
|
/* 98 */ } else if (0x1100 <= ch && ch <= 0x115f)
|
|
/* 99 */ { // leading consonants (19 + 71 + 1)
|
|
/* 100 */ if ( state != START )
|
|
/* 101 */ composeHangul(output);
|
|
/* 102 */ l = ch - 0x1100;
|
|
/* 103 */ state = LEADING_CONSONANT;
|
|
/* 104 */ } else if (1160 <= ch && ch <= 0x11a2)
|
|
/* 105 */ { // vowels (1 + 21 + 45)
|
|
/* 106 */ v = ch - 0x1160;
|
|
/* 107 */ state = VOWEL;
|
|
/* 108 */ } else if (0x11a8 <= ch && ch <= 0x11f9)
|
|
/* 109 */ { // modern trailing consonants (27)
|
|
/* 110 */ t = ch - 0x11a7;
|
|
/* 111 */ composeHangul(output);
|
|
// 112 } else
|
|
// 113 {
|
|
// 114 throw new UnknownCharacterException();
|
|
/* 115 */ }
|
|
/* 116 */ }
|
|
/* 117 */
|
|
/* 118 */ if ( state != START )
|
|
/* 119 */ composeHangul( output );
|
|
/* 120 */
|
|
// 121 return byteOff - outStart;
|
|
// 122 }
|
|
*aDestLength = byteOff;
|
|
return NS_OK;
|
|
}
|
|
// 123
|
|
// 124 public int flush(byte output[], int i, int j)
|
|
// 125 throws MalformedInputException
|
|
// 126 {
|
|
NS_IMETHODIMP nsUnicodeToX11Johab::Finish(
|
|
char * output, PRInt32 * aDestLength)
|
|
{
|
|
/* 127 */ byteOff = 0;
|
|
/* 128 */ PRInt32 len = 0;
|
|
/* 129 */ if ( state != START )
|
|
/* 130 */ {
|
|
/* 131 */ composeHangul( output );
|
|
/* 132 */ len = byteOff;
|
|
/* 133 */ }
|
|
/* 134 */ byteOff = charOff = 0;
|
|
// 135 return len;
|
|
*aDestLength = len;
|
|
// 136 }
|
|
// 137
|
|
return NS_OK;
|
|
}
|
|
|
|
//================================================================
|
|
NS_IMETHODIMP nsUnicodeToX11Johab::Reset()
|
|
// 138 public void reset()
|
|
/* 139 */ {
|
|
/* 140 */ byteOff = charOff = 0;
|
|
/* 141 */ state = START;
|
|
/* 142 */ l = 0x5f;
|
|
/* 143 */ v = t = 0;
|
|
return NS_OK;
|
|
/* 144 */ }
|
|
//================================================================
|
|
// 145
|
|
// 146 public int getMaxBytesPerChar()
|
|
// 147 {
|
|
// 148 return 6;
|
|
// 149 }
|
|
|
|
NS_IMETHODIMP nsUnicodeToX11Johab::GetMaxLength(
|
|
const PRUnichar * aSrc, PRInt32 aSrcLength,
|
|
PRInt32 * aDestLength)
|
|
{
|
|
*aDestLength = (aSrcLength + 1) * 6;
|
|
return NS_OK;
|
|
}
|
|
//================================================================
|
|
|
|
// 150
|
|
// 151 // The base font index for leading consonants
|
|
// 152
|
|
// 153 static final short[] lconBase = {
|
|
static PRUint16 lconBase[] = {
|
|
/* 154 */ // modern leading consonants (19)
|
|
/* 155 */ 1, 11, 21, 31, 41, 51,
|
|
/* 156 */ 61, 71, 81, 91, 101, 111,
|
|
/* 157 */ 121, 131, 141, 151, 161, 171,
|
|
/* 158 */ 181,
|
|
/* 159 */
|
|
/* 160 */ // ancient leading consonants (71 + reserved 5 + filler 1)
|
|
/* 161 */ 0, 0, 0, 0, 0, 0, // \u1113 ~ :
|
|
/* 162 */ 0, 0, 0, 0, 0, 201, // \u1119 ~ :
|
|
/* 163 */ 0, 221, 251, 0, 0, 0, // \u111f ~ :
|
|
/* 164 */ 0, 0, 281, 0, 0, 0, // \u1125 ~ :
|
|
/* 165 */ 191, 0, 211, 0, 231, 0, // \u112b ~ :
|
|
/* 166 */ 0, 241, 0, 0, 0, 291, // \u1131 ~ :
|
|
/* 167 */ 0, 0, 0, 0, 0, 0, // \u1137 ~ :
|
|
/* 168 */ 0, 0, 0, 261, 0, 0, // \u113d ~ :
|
|
/* 169 */ 0, 0, 0, 0, 0, 0, // \u1143 ~ :
|
|
/* 170 */ 0, 0, 0, 271, 0, 0, // \u1149 ~ :
|
|
/* 171 */ 0, 0, 0, 0, 0, 0, // \u114f ~ :
|
|
/* 172 */ 0, 0, 0, 0, 301, // \u1155 ~ :
|
|
/* 173 */ 0, 0, 0, 0, 0, // \u115a ~ : reserved
|
|
/* 174 */ 0, // \u115f : leading consonant filler
|
|
/* 175 */ };
|
|
//================================================================
|
|
// 176
|
|
// 177 // The base font index for vowels
|
|
// 178
|
|
// 179 static final short[] vowBase = {
|
|
static PRUint16 vowBase[] = {
|
|
/* 180 */ // modern vowels (filler + 21)
|
|
/* 181 */ 0,311,314,317,320,323, // (Fill), A, AE, YA, YAE, EO
|
|
/* 182 */ 326,329,332,335,339,343, // E, YEO, YE, O, WA, WAE
|
|
/* 183 */ 347,351,355,358,361,364, // OI, YO, U, WEO, WE, WI
|
|
/* 184 */ 367,370,374,378, // YU, EU, UI, I
|
|
/* 185 */
|
|
/* 186 */ // ancient vowels (45)
|
|
/* 187 */ 0, 0, 0, 0, 0, 0, // \u1176 ~ : A-O, A-U, YA-O, YA-YO, EO-O, EO- U
|
|
/* 189 */ 0, 0, 0, 0, 0, 0, // \u117c ~ : EO-EU, YEO-O, YEO-U, O-EO, O-E, O-YE
|
|
/* 191 */ 0, 0, 381, 384, 0, 0, // \u1182 ~ : O-O, O-U, YO-YA, YO-YAE, YO-YEO, YO-O
|
|
/* 193 */ 387, 0, 0, 0, 0, 0, // \u1188 ~ : YO-I, U-A, U-AE, U-EO-EU, U-YE, U-U
|
|
/* 195 */ 0, 0, 0, 390, 393, 0, // \u118e ~ : YU-A, YU-EO, YU-E, YU-YEO, YU-YE , YU-U
|
|
/* 197 */ 396, 0, 0, 0, 0, 0, // \u1194 ~ : YU-I, EU-U, EU-EU, YI-U, I-A, I- YA
|
|
/* 199 */ 0, 0, 0, 0, 399, 0, // \u119a ~ : I-O, I-U, I-EU, I-ARAEA, ARAEA, ARAEA-EO
|
|
/* 201 */ 0, 402, 0 // \u11a0 ~ : ARAEA-U, ARAEA-I,SSANGARAEA
|
|
/* 202 */ };
|
|
//================================================================
|
|
// 203
|
|
// 204 // The base font index for trailing consonants
|
|
// 205
|
|
// 206 static final short[] tconBase = {
|
|
static PRUint16 tconBase[] = {
|
|
// 207 // modern trailing consonants (filler + 27)
|
|
/* 208 */ 0,
|
|
/* 209 */ 405, 409, 413, 417, 421,
|
|
/* 210 */ 425, 429, 433, 437, 441,
|
|
/* 211 */ 445, 459, 453, 457, 461,
|
|
/* 212 */ 465, 469, 473, 477, 481,
|
|
/* 213 */ 485, 489, 493, 497, 501,
|
|
/* 214 */ 505, 509,
|
|
// 215
|
|
// 216 // ancient trailing consonants (55)
|
|
/* 217 */ 0, 0, 0, 0, 0, 0, // \u11c3 ~ :
|
|
/* 218 */ 0, 0, 0, 0, 0, 0, // \u11c9 ~ :
|
|
/* 219 */ 0, 0, 0, 0, 0, 0, // \u11cf ~ :
|
|
/* 220 */ 0, 0, 0, 0, 513, 517, // \u11d5 ~ :
|
|
/* 221 */ 0, 0, 0, 0, 0, 0, // \u11db ~ :
|
|
/* 222 */ 0, 0, 0, 0, 0, 0, // \u11e1 ~ :
|
|
/* 223 */ 0, 0, 0, 0, 0, 0, // \u11e7 ~ :
|
|
/* 224 */ 0, 0, 0, 525, 0, 0, // \u11ed ~ :
|
|
/* 225 */ 0, 0, 0, 0, 0, 0, // \u11f3 ~ :
|
|
/* 226 */ 521 // \u11f9:
|
|
/* 227 */ };
|
|
//================================================================
|
|
// 228
|
|
// 229 // The mapping from vowels to leading consonant type
|
|
// 230 // in absence of trailing consonant
|
|
// 231
|
|
// 232 static final short[] lconMap1 = {
|
|
static PRUint8 lconMap1[] = {
|
|
/* 233 */ 0,0,0,0,0,0, // (Fill), A, AE, YA, YAE, EO
|
|
/* 234 */ 0,0,0,1,3,3, // E, YEO, YE, O, WA, WAE
|
|
/* 235 */ 3,1,2,4,4,4, // OI, YO, U, WEO, WE, WI
|
|
/* 236 */ 2,1,3,0, // YU, EU, UI, I
|
|
// 237
|
|
// 238 // ancient vowels (45)
|
|
/* 239 */ 3, 4, 3, 3, 3, 4, // \u1176 ~ : A-O, A-U, YA-O, YA-YO, EO-O, EO-U
|
|
/* 240 */ 4, 3, 4, 3, 3, 3, // \u117c ~ : EO-EU, YEO-O, YEO-U, O-EO, O-E, O-YE
|
|
/* 241 */ 1, 1, 3, 3, 3, 1, // \u1182 ~ : O-O, O-U, YO-YA, YO-YAE, YO-YEO, YO-O
|
|
/* 242 */ 3, 4, 4, 4, 4, 2, // \u1188 ~ : YO-I, U-A, U-AE, U-EO-EU, U-YE, U-U
|
|
/* 243 */ 3, 3, 3, 3, 3, 2, // \u118e ~ : YU-A, YU-EO, YU-E, YU-YEO, YU-YE, YU-U
|
|
/* 245 */ 4, 2, 2, 4, 0, 0, // \u1194 ~ : YU-I, EU-U, EU-EU, YI-U, I-A, I-YA
|
|
/* 246 */ 3, 4, 3, 0, 1, 3, // \u119a ~ : I-O, I-U, I-EU, I-ARAEA, ARAEA, ARAEA-EO
|
|
/* 248 */ 2, 3, 1 // \u11a0 ~ : ARAEA-U, ARAEA-I, SSANGARAEA
|
|
/* 249 */ };
|
|
//================================================================
|
|
// 250
|
|
// 251 // The mapping from vowels to leading consonant type
|
|
// 252 // in presence of trailing consonant
|
|
// 253
|
|
static PRUint8 lconMap2[] = {
|
|
// 254 static final short[] lconMap2 = {
|
|
/* 255 */ 5,5,5,5,5,5, // (Fill), A, AE, YA, YAE, EO
|
|
/* 256 */ 5,5,5,6,8,8, // E, YEO, YE, O, WA, WAE
|
|
/* 257 */ 8,6,7,9,9,9, // OI, YO, U, WEO, WE, WI
|
|
/* 258 */ 7,6,8,5, // YU, EU, UI, I
|
|
// 259
|
|
// 260 // ancient vowels (45)
|
|
/* 261 */ 8, 9, 8, 8, 8, 9, // \u1176 ~ : A-O, A-U, YA-O, YA-YO, EO-O, EO-U
|
|
/* 262 */ 9, 8, 9, 8, 8, 8, // \u117c ~ : EO-EU, YEO-O, YEO-U, O-EO, O-E, O-YE
|
|
/* 263 */ 6, 6, 8, 8, 8, 6, // \u1182 ~ : O-O, O-U, YO-YA, YO-YAE, YO-YEO, YO-O
|
|
/* 264 */ 8, 9, 9, 9, 9, 7, // \u1188 ~ : YO-I, U-A, U-AE, U-EO-EU, U-YE, U-U
|
|
/* 265 */ 8, 8, 8, 8, 8, 7, // \u118e ~ : YU-A, YU-EO, YU-E, YU-YEO, YU-YE, Y
|
|
/* 267 */ 9, 7, 7, 9, 5, 5, // \u1194 ~ : YU-I, EU-U, EU-EU, YI-U, I-A, I-YA
|
|
/* 268 */ 8, 9, 8, 5, 6, 8, // \u119a ~ : I-O, I-U, I-EU, I-ARAEA, ARAEA, ARAEA-EO
|
|
/* 270 */ 7, 8, 6 // \u11a0 ~ : ARAEA-U, ARAEA-I, SSANGARAEA
|
|
/* 271 */ };
|
|
//================================================================
|
|
// 272
|
|
// 273 // vowel type ; 1 = o and its alikes, 0 = others
|
|
// 274 static final short[] vowType = {
|
|
static PRUint8 vowType[] = {
|
|
/* 275 */ 0,0,0,0,0,0,
|
|
/* 276 */ 0,0,0,1,1,1,
|
|
/* 277 */ 1,1,0,0,0,0,
|
|
/* 278 */ 0,1,1,0,
|
|
// 279
|
|
// 280 // ancient vowels (45)
|
|
/* 281 */ 1, 0, 1, 1, 1, 0, // \u1176 ~ : A-O, A-U, YA-O, YA-YO, EO-O, EO-U
|
|
/* 282 */ 0, 1, 0, 1, 1, 1, // \u117c ~ : EO-EU, YEO-O, YEO-U, O-EO, O-E, O-YE
|
|
/* 283 */ 1, 1, 0, 0, 0, 0, // \u1182 ~ : O-O, O-U, YO-YA, YO-YAE, YO-YEO, YO-O
|
|
/* 284 */ 0, 0, 0, 0, 0, 0, // \u1188 ~ : YO-I, U-A, U-AE, U-EO-EU, U-YE, U-U
|
|
/* 285 */ 0, 0, 0, 0, 0, 0, // \u118e ~ : YU-A, YU-EO, YU-E, YU-YEO, YU-YE, YU-U
|
|
/* 287 */ 0, 0, 0, 0, 0, 0, // \u1194 ~ : YU-I, EU-U, EU-EU, YI-U, I-A, I-YA
|
|
/* 288 */ 0, 0, 0, 0, 0, 0, // \u119a ~ : I-O, I-U, I-EU, I-ARAEA, ARAEA, ARAEA-EO
|
|
/* 290 */ 0, 0, 0 // \u11a0 ~ : ARAEA-U, ARAEA-I, SSANGARAEA
|
|
/* 291 */ };
|
|
//================================================================
|
|
// 292
|
|
// 293 // The mapping from trailing consonants to vowel type
|
|
// 294
|
|
// 295 static final int[] tconType = {
|
|
static PRUint8 tconType[] = {
|
|
/* 296 */ 0, 1, 1, 1, 2, 1,
|
|
/* 297 */ 1, 1, 1, 1, 1, 1,
|
|
/* 298 */ 1, 1, 1, 1, 1, 1,
|
|
/* 299 */ 1, 1, 1, 1, 1, 1,
|
|
/* 300 */ 1, 1, 1, 1,
|
|
// 301
|
|
// 302 // ancient trailing consonants (55)
|
|
/* 303 */ 1, 1, 1, 1, 1, 1, // \u11c3 ~ :
|
|
/* 304 */ 1, 1, 1, 1, 1, 1, // \u11c9 ~ :
|
|
/* 305 */ 1, 1, 1, 1, 1, 1, // \u11cf ~ :
|
|
/* 306 */ 1, 1, 1, 1, 1, 1, // \u11d5 ~ :
|
|
/* 307 */ 1, 1, 1, 1, 1, 1, // \u11db ~ :
|
|
/* 308 */ 1, 1, 1, 1, 1, 1, // \u11e1 ~ :
|
|
/* 309 */ 1, 1, 1, 1, 1, 1, // \u11e7 ~ :
|
|
/* 310 */ 1, 1, 1, 1, 1, 1, // \u11ed ~ :
|
|
/* 311 */ 1, 1, 1, 1, 1, 1, // \u11f3 ~ :
|
|
/* 312 */ 1 // \u11f9:
|
|
/* 313 */ };
|
|
//================================================================
|
|
// 314
|
|
// 315 // The mapping from vowels to trailing consonant type
|
|
// 316
|
|
// 317 static final int[] tconMap = {
|
|
static PRUint8 tconMap[] = {
|
|
/* 318 */ 0, 0, 2, 0, 2, 1, // (Fill), A, AE, YA, YAE, EO
|
|
/* 319 */ 2, 1, 2, 3, 0, 0, // E, YEO, YE, O, WA, WAE
|
|
/* 320 */ 0, 3, 3, 1, 1, 1, // OI, YO, U, WEO, WE, WI
|
|
/* 321 */ 3, 3, 0, 1, // YU, EU, UI, I
|
|
// 322
|
|
// 323 // ancient vowels (45)
|
|
/* 324 */ 3, 3, 3, 3, 3, 3, // \u1176 ~ : A-O, A-U, YA-O, YA-YO, EO-O, EO-U
|
|
/* 325 */ 3, 3, 3, 1, 0, 0, // \u117c ~ : EO-EU, YEO-O, YEO-U, O-EO, O-E, O-YE
|
|
/* 326 */ 3, 3, 3, 1, 0, 3, // \u1182 ~ : O-O, O-U, YO-YA, YO-YAE, YO-YEO, YO-O
|
|
/* 327 */ 0, 0, 0, 0, 0, 3, // \u1188 ~ : YO-I, U-A, U-AE, U-EO-EU, U-YE, U-U
|
|
/* 328 */ 0, 1, 1, 1, 1, 3, // \u118e ~ : YU-A, YU-EO, YU-E, YU-YEO, YU-YE, YU- U
|
|
/* 330 */ 1, 3, 3, 3, 2, 2, // \u1194 ~ : YU-I, EU-U, EU-EU, YI-U, I-A, I-YA
|
|
/* 331 */ 3, 3, 3, 1, 3, 0, // \u119a ~ : I-O, I-U, I-EU, I-ARAEA, ARAEA, ARAEA -EO
|
|
/* 333 */ 3, 2, 3 // \u11a0 ~ : ARAEA-U, ARAEA-I, SSANGARAEA
|
|
/* 334 */ };
|
|
//================================================================
|
|
// 335
|
|
// 336 void composeHangul(byte[] output)
|
|
void nsUnicodeToX11Johab::composeHangul(char* output)
|
|
/* 337 */ {
|
|
// 338 int ind;
|
|
PRUint16 ind;
|
|
/* 339 */
|
|
/* 340 */ if ( lconBase[l] != 0 )
|
|
/* 341 */ { // non-filler and supported by Hanterm Johab fonts
|
|
/* 342 */ ind = lconBase[l] + ( t > 0 ? lconMap2[v] : lconMap1[v] );
|
|
/* 343 */ output[byteOff++] = (byte) (ind / 256);
|
|
/* 344 */ output[byteOff++] = (byte) (ind % 256);
|
|
/* 345 */ }
|
|
/* 346 */
|
|
/* 347 */ if ( vowBase[v] != 0 )
|
|
/* 348 */ { // non-filler and supported by Hanterm Johab fonts
|
|
/* 349 */ ind = vowBase[v];
|
|
/* 350 */ if ( vowType[v] == 1)
|
|
/* 351 */ { //'o' and alikes
|
|
/* 352 */ // GIYEOK and KIEUK got special treatment
|
|
/* 353 */ ind += ( (l == 0 || l == 15) ? 0 : 1)
|
|
/* 354 */ + (t > 0 ? 2 : 0 );
|
|
/* 355 */ }
|
|
/* 356 */ else
|
|
/* 357 */ {
|
|
/* 358 */ ind += tconType[t];
|
|
/* 359 */ }
|
|
/* 360 */
|
|
/* 361 */ output[byteOff++] = (byte) (ind / 256);
|
|
/* 362 */ output[byteOff++] = (byte) (ind % 256);
|
|
/* 363 */ }
|
|
/* 364 */
|
|
/* 365 */ if ( tconBase[t] != 0 )
|
|
/* 366 */ { // non-filler and supported by Hanterm Johab fonts
|
|
/* 367 */ ind = tconBase[t] + tconMap[v];
|
|
/* 368 */ output[byteOff++] = (byte) (ind / 256);
|
|
/* 369 */ output[byteOff++] = (byte) (ind % 256);
|
|
/* 370 */ } else if (vowBase[v] == 0)
|
|
/* 371 */ { // give one syllable display width since current display width is 0.
|
|
/* 372 */ output[byteOff++] = (byte) 0;
|
|
/* 373 */ output[byteOff++] = (byte) 0;
|
|
/* 374 */ }
|
|
/* 375 */
|
|
/* 376 */ state = START;
|
|
/* 377 */ l = 0x5f;
|
|
/* 378 */ v = t = 0;
|
|
/* 379 */ }
|
|
// 380 }
|
|
// 381
|
|
|
|
NS_IMETHODIMP nsUnicodeToX11Johab::FillInfo(PRUint32* aInfo)
|
|
{
|
|
// ac00-d7a3
|
|
PRUint32 b = 0xac00 >> 5;
|
|
PRUint32 e = 0xd7a3 >> 5;
|
|
aInfo[ e ] |= (0xFFFFFFFFL >> (31 - ((0xd7a3) & 0x1f)));
|
|
for( ; b < e ; b++)
|
|
aInfo[b] |= 0xFFFFFFFFL;
|
|
|
|
PRUnichar i;
|
|
|
|
// 1100-1112
|
|
for(i=0x1100;i<=0x1112;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
// 1113-1159
|
|
for(i=0x1113;i<=0x1159;i++)
|
|
if(lconBase[i-0x1100]!=0)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
// 115f
|
|
SET_REPRESENTABLE(aInfo, 0x115f);
|
|
// 1160-1175
|
|
for(i=0x1160;i<=0x1175;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
// 1176-11a2
|
|
for(i=0x1176;i<=0x11a2;i++)
|
|
if(vowBase[i-0x1160]!=0)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
// 11a8-11c2
|
|
for(i=0x11a8;i<=0x11c2;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
// 11c3-11f9
|
|
for(i=0x11c3;i<=0x11f9;i++)
|
|
if(tconBase[i-0x11a7]!=0)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
return NS_OK;
|
|
}
|