OSDN Git Service

stop using trunk directory in rectool
[rec10/rec10-git.git] / epgdump / aribstr.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <iconv.h>
6
7 #include "aribstr.h"
8
9 #define CODE_UNKNOWN            0       // 不明なグラフィックセット(非対応)
10 #define CODE_KANJI              1       // Kanji
11 #define CODE_ALPHANUMERIC       2       // Alphanumeric
12 #define CODE_HIRAGANA           3       // Hiragana
13 #define CODE_KATAKANA           4       // Katakana
14 #define CODE_MOSAIC_A           5       // Mosaic A
15 #define CODE_MOSAIC_B           6       // Mosaic B
16 #define CODE_MOSAIC_C           7       // Mosaic C
17 #define CODE_MOSAIC_D           8       // Mosaic D
18 #define CODE_PROP_ALPHANUMERIC  9       // Proportional Alphanumeric
19 #define CODE_PROP_HIRAGANA      10      // Proportional Hiragana
20 #define CODE_PROP_KATAKANA      11      // Proportional Katakana
21 #define CODE_JIS_X0201_KATAKANA 12      // JIS X 0201 Katakana
22 #define CODE_JIS_KANJI_PLANE_1  13      // JIS compatible Kanji Plane 1
23 #define CODE_JIS_KANJI_PLANE_2  14      // JIS compatible Kanji Plane 2
24 #define CODE_ADDITIONAL_SYMBOLS 15      // Additional symbols
25
26
27 #define TCHAR char
28 #define BYTE  char
29 #define WORD  int
30 #define DWORD int
31 #define bool  int
32 #define true  1
33 #define false 0
34 #define TEXT(a) a
35 #define _T(a) a
36 #define CODE_SET int
37
38 static int m_CodeG[4];
39 static int *m_pLockingGL;
40 static int *m_pLockingGR;
41 static int *m_pSingleGL;
42         
43 static  BYTE m_byEscSeqCount;
44 static  BYTE m_byEscSeqIndex;
45 static  bool m_bIsEscSeqDrcs;
46
47
48 static  const DWORD AribToStringInternal(TCHAR *lpszDst, const BYTE *pSrcData, const DWORD dwSrcLen);
49 static  const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet);
50
51 static  const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode);
52 static  const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode);
53 //static        const DWORD PutAlphanumericHankakuChar(TCHAR *lpszDst, const WORD wCode);
54 static  const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode);
55 static  const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode);
56 static  const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode);
57 static  const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode);
58
59 static  void ProcessEscapeSeq(const BYTE byCode);
60
61 static  void LockingShiftGL(const BYTE byIndexG);
62 static  void LockingShiftGR(const BYTE byIndexG);
63 static  void SingleShiftGL(const BYTE byIndexG);
64
65 static  const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode);
66 static  const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode);
67
68 static const bool abCharSizeTable[] =
69 {
70         false,  // CODE_UNKNOWN                                 不明なグラフィックセット(非対応)
71         true,   // CODE_KANJI                                   Kanji
72         false,  // CODE_ALPHANUMERIC                    Alphanumeric
73         false,  // CODE_HIRAGANA                                Hiragana
74         false,  // CODE_KATAKANA                                Katakana
75         false,  // CODE_MOSAIC_A                                Mosaic A
76         false,  // CODE_MOSAIC_B                                Mosaic B
77         false,  // CODE_MOSAIC_C                                Mosaic C
78         false,  // CODE_MOSAIC_D                                Mosaic D
79         false,  // CODE_PROP_ALPHANUMERIC               Proportional Alphanumeric
80         false,  // CODE_PROP_HIRAGANA                   Proportional Hiragana
81         false,  // CODE_PROP_KATAKANA                   Proportional Katakana
82         false,  // CODE_JIS_X0201_KATAKANA              JIS X 0201 Katakana
83         true,   // CODE_JIS_KANJI_PLANE_1               JIS compatible Kanji Plane 1
84         true,   // CODE_JIS_KANJI_PLANE_2               JIS compatible Kanji Plane 2
85         true    // CODE_ADDITIONAL_SYMBOLS              Additional symbols
86 };
87
88 typedef enum{
89         STR_SMALL = 0,  //SSZ
90         STR_MEDIUM,             //MSZ
91         STR_NORMAL,             //NSZ
92         STR_MICRO,              //SZX 0x60
93         STR_HIGH_W,             //SZX 0x41
94         STR_WIDTH_W,    //SZX 0x44
95         STR_W,                  //SZX 0x45
96         STR_SPECIAL_1,  //SZX 0x6B
97         STR_SPECIAL_2,  //SZX 0x64
98 } STRING_SIZE;
99
100 STRING_SIZE m_emStrSize;
101
102 bool IsSmallCharMode(void)
103 {
104         bool bRet = false;
105         switch(m_emStrSize){
106                 case STR_SMALL:
107                         bRet = true;
108                         break;
109                 case STR_MEDIUM:
110                         bRet = true;
111                         break;
112                 case STR_NORMAL:
113                         bRet = false;
114                         break;
115                 case STR_MICRO:
116                         bRet = true;
117                         break;
118                 case STR_HIGH_W:
119                         bRet = false;
120                         break;
121                 case STR_WIDTH_W:
122                         bRet = false;
123                         break;
124                 case STR_W:
125                         bRet = false;
126                         break;
127                 case STR_SPECIAL_1:
128                         bRet = false;
129                         break;
130                 case STR_SPECIAL_2:
131                         bRet = false;
132                         break;
133                 default:
134                         break;
135         }
136         return bRet;
137 }
138
139 int AribToString(
140         char *lpszDst, 
141         const char *pSrcData, 
142         const int dwSrcLen) {
143   
144         return AribToStringInternal(lpszDst, pSrcData, dwSrcLen);
145 }
146
147
148 const DWORD AribToStringInternal(TCHAR *lpszDst, 
149                                                                  const BYTE *pSrcData, const DWORD dwSrcLen)
150 {
151         if(!pSrcData || !dwSrcLen || !lpszDst)return 0UL;
152   
153         DWORD dwSrcPos = 0UL;
154         DWORD dwDstLen = 0UL;
155         int   dwSrcData;
156   
157         // 状態初期設定
158         m_byEscSeqCount = 0U;
159         m_pSingleGL = NULL;
160
161         m_CodeG[0] = CODE_KANJI;
162         m_CodeG[1] = CODE_ALPHANUMERIC;
163         m_CodeG[2] = CODE_HIRAGANA;
164         m_CodeG[3] = CODE_KATAKANA;
165
166         m_pLockingGL = &m_CodeG[0];
167         m_pLockingGR = &m_CodeG[2];
168
169         m_emStrSize = STR_NORMAL;
170         while(dwSrcPos < dwSrcLen){
171                 dwSrcData = pSrcData[dwSrcPos] & 0xFF;
172
173                 //printf("Arib:pos%d:%d:%s\n",dwSrcPos,dwSrcData,lpszDst);
174                 if(!m_byEscSeqCount){
175       
176                         // GL/GR領域
177                         if((dwSrcData >= 0x21U) && (dwSrcData <= 0x7EU)){
178                                 // GL領域
179                                 const CODE_SET CurCodeSet = (m_pSingleGL)? *m_pSingleGL : *m_pLockingGL;
180                                 m_pSingleGL = NULL;
181                                 
182                                 if(abCharSizeTable[CurCodeSet]){
183                                         // 2バイトコード
184                                         if((dwSrcLen - dwSrcPos) < 2UL)break;
185                                         
186                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)pSrcData[dwSrcPos + 0] << 8) | (WORD)pSrcData[dwSrcPos + 1], CurCodeSet);
187                                         dwSrcPos++;
188                                 }
189                                 else{
190                                         // 1バイトコード
191                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)dwSrcData, CurCodeSet);
192                                 }
193                         }
194                         else if((dwSrcData >= 0xA1U) && (dwSrcData <= 0xFEU)){
195                                 // GR領域
196                                 const CODE_SET CurCodeSet = *m_pLockingGR;
197                                 
198                                 if(abCharSizeTable[CurCodeSet]){
199                                         // 2バイトコード
200                                         if((dwSrcLen - dwSrcPos) < 2UL)break;
201                                         
202                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)(pSrcData[dwSrcPos + 0] & 0x7FU) << 8) | (WORD)(pSrcData[dwSrcPos + 1] & 0x7FU), CurCodeSet);
203                                         dwSrcPos++;
204                                 }
205                                 else{
206                                         // 1バイトコード
207                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)(dwSrcData & 0x7FU), CurCodeSet);
208                                 }
209                         }
210                         else{
211                                 // 制御コード
212                                 switch(dwSrcData){
213                                 case 0x0FU      : LockingShiftGL(0U);                           break;  // LS0
214                                 case 0x0EU      : LockingShiftGL(1U);                           break;  // LS1
215                                 case 0x19U      : SingleShiftGL(2U);                            break;  // SS2
216                                 case 0x1DU      : SingleShiftGL(3U);                            break;  // SS3
217                                 case 0x1BU      : m_byEscSeqCount = 1U;                         break;  // ESC
218                                 case 0x89U      : m_emStrSize = STR_MEDIUM;                     break;  // MSZ
219                                 case 0x8AU      : m_emStrSize = STR_NORMAL;                     break;  // NSZ
220                                 case 0x20U      :
221                                 case 0xA0U      :
222                                         //SP 空白
223                                         //空白は文字サイズの影響あり
224                                         if( IsSmallCharMode() == false ){
225                                                 strcpy(&lpszDst[dwDstLen], " ");
226                                                 dwDstLen += 3U;
227                                         } else {
228                                                 lpszDst[dwDstLen++] = TEXT(' ');
229                                         }
230                                         break;
231                                 default         : break;        // 非対応
232                                 }
233                         }
234                 }
235                 else{
236                         // エスケープシーケンス処理
237                         ProcessEscapeSeq(dwSrcData);
238                 }
239                 
240                 dwSrcPos++;
241         }
242
243         // 終端文字
244         lpszDst[dwDstLen] = TEXT('\0');
245         return dwDstLen;
246 }
247
248 const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet)
249 {
250         switch(CodeSet){
251         case CODE_KANJI :
252         case CODE_JIS_KANJI_PLANE_1 :
253         case CODE_JIS_KANJI_PLANE_2 :
254                 // 漢字コード出力
255                 return PutKanjiChar(lpszDst, wCode);
256
257         case CODE_ALPHANUMERIC :
258         case CODE_PROP_ALPHANUMERIC :
259                 // 英数字コード出力
260                 if( IsSmallCharMode() == false ){
261                         //全角テーブルコード取得
262                 return PutAlphanumericChar(lpszDst, wCode);
263                 } else {
264                         //半角はそのまま出力
265                         lpszDst[0] = wCode;
266                         return 1UL;
267                 }
268
269         case CODE_HIRAGANA :
270         case CODE_PROP_HIRAGANA :
271                 // ひらがなコード出力
272                 return PutHiraganaChar(lpszDst, wCode);
273
274         case CODE_PROP_KATAKANA :
275         case CODE_KATAKANA :
276                 // カタカナコード出力
277                 return PutKatakanaChar(lpszDst, wCode);
278
279         case CODE_JIS_X0201_KATAKANA :
280                 // JISカタカナコード出力
281                 return PutJisKatakanaChar(lpszDst, wCode);
282
283         case CODE_ADDITIONAL_SYMBOLS :
284                 // 追加シンボルコード出力
285                 return PutSymbolsChar(lpszDst, wCode);
286
287         default :
288                 return 0UL;
289         }
290 }
291
292 const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode)
293 {
294         char code[9];
295         char xcode[5];
296         iconv_t cd;
297
298         size_t inbyte = 8;
299         size_t outbyte = sizeof(xcode);
300
301         memset(xcode, '\0', sizeof(xcode));
302   
303         const char *fptr;
304         char *tptr;
305
306         code[0] = 0x1BU;
307         code[1] = 0x24U;
308         code[2] = 0x40U;
309         code[3] = wCode >> 8;
310         code[4] = wCode & 0xFF;
311         code[5] = 0x1BU;
312         code[6] = 0x28U;
313         code[7] = 0x4AU;
314         code[8] = '\0';
315
316         cd = iconv_open("UTF-8","ISO-2022-JP");
317
318         fptr = code;
319         tptr = xcode;
320         iconv(cd, &fptr, &inbyte, &tptr, &outbyte);
321
322         iconv_close(cd);
323
324         strncpy(lpszDst, xcode, strlen(xcode));
325
326         return strlen(lpszDst);
327 }
328
329 const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode)
330 {
331         // 英数字全角文字コード変換
332         static const TCHAR *acAlphanumericTable = 
333                 TEXT("                ")
334                 TEXT("                ")
335                 TEXT(" !”#$%&’()*+,-./")
336                 TEXT("0123456789:;<=>?")
337                 TEXT("@ABCDEFGHIJKLMNO")
338                 TEXT("PQRSTUVWXYZ[¥]^_")
339                 TEXT(" abcdefghijklmno")
340                 TEXT("pqrstuvwxyz{|} ̄ ");
341
342 #ifdef _UNICODE
343         lpszDst[0] = acAlphanumericTableZenkaku[wCode];
344
345         return 1UL;
346 #else
347         lpszDst[0] = acAlphanumericTable[wCode * 3U + 0U];
348         lpszDst[1] = acAlphanumericTable[wCode * 3U + 1U];
349         lpszDst[2] = acAlphanumericTable[wCode * 3U + 2U];
350
351         return 3UL;
352 #endif
353 }
354
355 const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode)
356 {
357         // ひらがな文字コード変換
358         static const TCHAR *acHiraganaTable = 
359                 TEXT("                ")
360                 TEXT("                ")
361                 TEXT(" ぁあぃいぅうぇえぉおかがきぎく")
362                 TEXT("ぐけげこごさざしじすずせぜそぞた")
363                 TEXT("だちぢっつづてでとどなにぬねのは")
364                 TEXT("ばぱひびぴふぶぷへべぺほぼぽまみ")
365                 TEXT("むめもゃやゅゆょよらりるれろゎわ")
366                 TEXT("ゐゑをん   ゝゞー。「」、・ ");
367         
368 #ifdef _UNICODE
369         lpszDst[0] = acHiraganaTable[wCode];
370
371         return 1UL;
372 #else
373         lpszDst[0] = acHiraganaTable[wCode * 3U + 0U];
374         lpszDst[1] = acHiraganaTable[wCode * 3U + 1U];
375         lpszDst[2] = acHiraganaTable[wCode * 3U + 2U];
376
377         return 3UL;
378 #endif
379 }
380
381 const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode)
382 {
383         // カタカナ英数字文字コード変換
384         static const TCHAR *acKatakanaTable = 
385                 TEXT("                ")
386                 TEXT("                ")
387                 TEXT(" ァアィイゥウェエォオカガキギク")
388                 TEXT("グケゲコゴサザシジスズセゼソゾタ")
389                 TEXT("ダチヂッツヅテデトドナニヌネノハ")
390                 TEXT("バパヒビピフブプヘベペホボポマミ")
391                 TEXT("ムメモャヤュユョヨラリルレロヮワ")
392                 TEXT("ヰヱヲンヴヵヶヽヾー。「」、・ ");
393         
394 #ifdef _UNICODE
395         lpszDst[0] = acKatakanaTable[wCode];
396
397         return 1UL;
398 #else
399         lpszDst[0] = acKatakanaTable[wCode * 3U + 0U];
400         lpszDst[1] = acKatakanaTable[wCode * 3U + 1U];
401         lpszDst[2] = acKatakanaTable[wCode * 3U + 2U];
402
403         return 3UL;
404 #endif
405 }
406
407 const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode)
408 {
409         // JISカタカナ文字コード変換
410         static const TCHAR *acJisKatakanaTable = 
411                 TEXT("                ")
412                 TEXT("                ")
413                 TEXT(" 。「」、・ヲァィゥェォャュョッ")
414                 TEXT("ーアイウエオカキクケコサシスセソ")
415                 TEXT("タチツテトナニヌネノハヒフヘホマ")
416                 TEXT("ミムメモヤユヨラリルレロワン゛゜")
417                 TEXT("                ")
418                 TEXT("                ");
419         
420 #ifdef _UNICODE
421         lpszDst[0] = acJisKatakanaTable[wCode];
422
423         return 1UL;
424 #else
425         lpszDst[0] = acJisKatakanaTable[wCode * 3U + 0U];
426         lpszDst[1] = acJisKatakanaTable[wCode * 3U + 1U];
427         lpszDst[2] = acJisKatakanaTable[wCode * 3U + 2U];
428
429         return 3UL;
430 #endif
431 }
432
433 const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode)
434 {
435         // 追加シンボル文字コード変換(とりあえず必要そうなものだけ)
436         static const TCHAR *aszSymbolsTable1[] =
437                 {
438                         _T("[HV]"),             _T("[SD]"),             _T("[P]"),            _T("[W]"),            _T("[MV]"),             _T("[手]"),            _T("[字]"),            _T("[双]"),                    // 0x7A50 - 0x7A57      90/48 - 90/55
439                         _T("[デ]"),            _T("[S]"),            _T("[二]"),            _T("[多]"),            _T("[解]"),            _T("[SS]"),             _T("[B]"),            _T("[N]"),                    // 0x7A58 - 0x7A5F      90/56 - 90/63
440                         _T("■"),              _T("●"),              _T("[天]"),            _T("[交]"),            _T("[映]"),            _T("[無]"),            _T("[料]"),            _T("[年齢制限]"),   // 0x7A60 - 0x7A67      90/64 - 90/71
441                         _T("[前]"),            _T("[後]"),            _T("[再]"),            _T("[新]"),            _T("[初]"),            _T("[終]"),            _T("[生]"),            _T("[販]"),                    // 0x7A68 - 0x7A6F      90/72 - 90/79
442                         _T("[声]"),            _T("[吹]"),            _T("[PPV]"),    _T("(秘)"),            _T("ほか")                                                                                                                    // 0x7A70 - 0x7A74      90/80 - 90/84
443                 };
444
445         static const TCHAR *aszSymbolsTable2[] =
446                 {
447                         _T("→"),              _T("←"),              _T("↑"),              _T("↓"),              _T("●"),              _T("○"),              _T("年"),              _T("月"),                      // 0x7C21 - 0x7C28      92/01 - 92/08
448                         _T("日"),              _T("円"),              _T("㎡"),              _T("㎥"),              _T("㎝"),              _T("㎠"),              _T("㎤"),              _T("0."),                     // 0x7C29 - 0x7C30      92/09 - 92/16
449                         _T("1."),             _T("2."),             _T("3."),             _T("4."),             _T("5."),             _T("6."),             _T("7."),             _T("8."),                     // 0x7C31 - 0x7C38      92/17 - 92/24
450                         _T("9."),             _T("氏"),              _T("副"),              _T("元"),              _T("故"),              _T("前"),              _T("新"),              _T("0,"),                     // 0x7C39 - 0x7C40      92/25 - 92/32
451                         _T("1,"),             _T("2,"),             _T("3,"),             _T("4,"),             _T("5,"),             _T("6,"),             _T("7,"),             _T("8,"),                     // 0x7C41 - 0x7C48      92/33 - 92/40
452                         _T("9,"),             _T("(社)"),            _T("(財)"),            _T("(有)"),            _T("(株)"),            _T("(代)"),            _T("(問)"),            _T("▶"),                      // 0x7C49 - 0x7C50      92/41 - 92/48
453                         _T("◀"),              _T("〖"),              _T("〗"),              _T("⟐"),              _T("^2"),               _T("^3"),               _T("(CD)"),             _T("(vn)"),                     // 0x7C51 - 0x7C58      92/49 - 92/56
454                         _T("(ob)"),             _T("(cb)"),             _T("(ce"),              _T("mb)"),              _T("(hp)"),             _T("(br)"),             _T("(p)"),              _T("(s)"),                      // 0x7C59 - 0x7C60      92/57 - 92/64
455                         _T("(ms)"),             _T("(t)"),              _T("(bs)"),             _T("(b)"),              _T("(tb)"),             _T("(tp)"),             _T("(ds)"),             _T("(ag)"),                     // 0x7C61 - 0x7C68      92/65 - 92/72
456                         _T("(eg)"),             _T("(vo)"),             _T("(fl)"),             _T("(ke"),              _T("y)"),               _T("(sa"),              _T("x)"),               _T("(sy"),                      // 0x7C69 - 0x7C70      92/73 - 92/80
457                         _T("n)"),               _T("(or"),              _T("g)"),               _T("(pe"),              _T("r)"),               _T("(R)"),              _T("(C)"),              _T("(箏)"),                    // 0x7C71 - 0x7C78      92/81 - 92/88
458                         _T("DJ"),               _T("[演]"),            _T("Fax")                                                                                                                                                                                       // 0x7C79 - 0x7C7B      92/89 - 92/91
459                 };
460
461         static const TCHAR *aszSymbolsTable3[] =
462                 {
463                         _T("㈪"),              _T("㈫"),              _T("㈬"),              _T("㈭"),              _T("㈮"),              _T("㈯"),              _T("㈰"),              _T("㈷"),                      // 0x7D21 - 0x7D28      93/01 - 93/08
464                         _T("㍾"),              _T("㍽"),              _T("㍼"),              _T("㍻"),              _T("№"),              _T("℡"),              _T("〶"),              _T("○"),                      // 0x7D29 - 0x7D30      93/09 - 93/16
465                         _T("〔本〕"),        _T("〔三〕"),        _T("〔二〕"),        _T("〔安〕"),        _T("〔点〕"),        _T("〔打〕"),        _T("〔盗〕"),        _T("〔勝〕"),                // 0x7D31 - 0x7D38      93/17 - 93/24
466                         _T("〔敗〕"),        _T("〔S〕"),        _T("[投]"),        _T("[捕]"),        _T("[一]"),        _T("[二]"),        _T("[三]"),        _T("[遊]"),                // 0x7D39 - 0x7D40      93/25 - 93/32
467                         _T("[左]"),        _T("[中]"),        _T("[右]"),        _T("[指]"),        _T("[走]"),        _T("[打]"),        _T("㍑"),              _T("㎏"),                      // 0x7D41 - 0x7D48      93/33 - 93/40
468                         _T("㎐"),              _T("ha"),               _T("㎞"),              _T("㎢"),              _T("㍱"),              _T("・"),              _T("・"),              _T("1/2"),                      // 0x7D49 - 0x7D50      93/41 - 93/48
469                         _T("0/3"),              _T("1/3"),              _T("2/3"),              _T("1/4"),              _T("3/4"),              _T("1/5"),              _T("2/5"),              _T("3/5"),                      // 0x7D51 - 0x7D58      93/49 - 93/56
470                         _T("4/5"),              _T("1/6"),              _T("5/6"),              _T("1/7"),              _T("1/8"),              _T("1/9"),              _T("1/10"),             _T("☀"),                      // 0x7D59 - 0x7D60      93/57 - 93/64
471                         _T("☁"),              _T("☂"),              _T("☃"),              _T("☖"),              _T("☗"),              _T("▽"),              _T("▼"),              _T("♦"),                      // 0x7D61 - 0x7D68      93/65 - 93/72
472                         _T("♥"),              _T("♣"),              _T("♠"),              _T("⌺"),              _T("⦿"),              _T("‼"),              _T("⁉"),              _T("(曇/晴)"),                // 0x7D69 - 0x7D70      93/73 - 93/80
473                         _T("☔"),              _T("(雨)"),            _T("(雪)"),            _T("(大雪)"), _T("⚡"),              _T("(雷雨)"), _T(" "),              _T("・"),                      // 0x7D71 - 0x7D78      93/81 - 93/88
474                         _T("・"),              _T("♬"),              _T("☎")                                                                                                                                                                                       // 0x7D79 - 0x7D7B      93/89 - 93/91
475                 };
476
477         static const TCHAR *aszSymbolsTable4[] =
478                 {
479                         _T("Ⅰ"),              _T("Ⅱ"),              _T("Ⅲ"),              _T("Ⅳ"),              _T("Ⅴ"),              _T("Ⅵ"),              _T("Ⅶ"),              _T("Ⅷ"),                      // 0x7E21 - 0x7E28      94/01 - 94/08
480                         _T("Ⅸ"),              _T("Ⅹ"),              _T("Ⅺ"),              _T("Ⅻ"),              _T("⑰"),              _T("⑱"),              _T("⑲"),              _T("⑳"),                      // 0x7E29 - 0x7E30      94/09 - 94/16
481                         _T("⑴"),              _T("⑵"),              _T("⑶"),              _T("⑷"),              _T("⑸"),              _T("⑹"),              _T("⑺"),              _T("⑻"),                      // 0x7E31 - 0x7E38      94/17 - 94/24
482                         _T("⑼"),              _T("⑽"),              _T("⑾"),              _T("⑿"),              _T("㉑"),              _T("㉒"),              _T("㉓"),              _T("㉔"),                      // 0x7E39 - 0x7E40      94/25 - 94/32
483                         _T("(A)"),              _T("(B)"),              _T("(C)"),              _T("(D)"),              _T("(E)"),              _T("(F)"),              _T("(G)"),              _T("(H)"),                      // 0x7E41 - 0x7E48      94/33 - 94/40
484                         _T("(I)"),              _T("(J)"),              _T("(K)"),              _T("(L)"),              _T("(M)"),              _T("(N)"),              _T("(O)"),              _T("(P)"),                      // 0x7E49 - 0x7E50      94/41 - 94/48
485                         _T("(Q)"),              _T("(R)"),              _T("(S)"),              _T("(T)"),              _T("(U)"),              _T("(V)"),              _T("(W)"),              _T("(X)"),                      // 0x7E51 - 0x7E58      94/49 - 94/56
486                         _T("(Y)"),              _T("(Z)"),              _T("㉕"),              _T("㉖"),              _T("㉗"),              _T("㉘"),              _T("㉙"),              _T("㉚"),                      // 0x7E59 - 0x7E60      94/57 - 94/64
487                         _T("①"),              _T("②"),              _T("③"),              _T("④"),              _T("⑤"),              _T("⑥"),              _T("⑦"),              _T("⑧"),                      // 0x7E61 - 0x7E68      94/65 - 94/72
488                         _T("⑨"),              _T("⑩"),              _T("⑪"),              _T("⑫"),              _T("⑬"),              _T("⑭"),              _T("⑮"),              _T("⑯"),                      // 0x7E69 - 0x7E70      94/73 - 94/80
489                         _T("❶"),              _T("❷"),              _T("❸"),              _T("❹"),              _T("❺"),              _T("❻"),              _T("❼"),              _T("❽"),                      // 0x7E71 - 0x7E78      94/81 - 94/88
490                         _T("❾"),              _T("❿"),              _T("⓫"),              _T("⓬"),              _T("㉛")                                                                                                                       // 0x7E79 - 0x7E7D      94/89 - 94/93
491                 };
492
493         static const TCHAR *aszSymbolsTable5[] =
494                 {
495                         _T("㐂"),              _T("亭"),              _T("份"),              _T("仿"),              _T("侚"),              _T("俉"),              _T("傜"),              _T("儞"),                      // 0x7521 - 0x7528      85/01 - 85/08
496                         _T("冼"),              _T("㔟"),              _T("匇"),              _T("卡"),              _T("卬"),              _T("詹"),              _T("吉"),              _T("呍"),                      // 0x7529 - 0x7530      85/09 - 85/16
497                         _T("咖"),              _T("咜"),              _T("咩"),              _T("唎"),              _T("啊"),              _T("噲"),              _T("囤"),              _T("圳"),                      // 0x7531 - 0x7538      85/17 - 85/24
498                         _T("圴"),              _T("塚"),              _T("墀"),              _T("姤"),              _T("娣"),              _T("婕"),              _T("寬"),              _T("﨑"),                      // 0x7539 - 0x7540      85/25 - 85/32
499                         _T("㟢"),              _T("庬"),              _T("弴"),              _T("彅"),              _T("德"),              _T("怗"),              _T("恵"),              _T("愰"),                      // 0x7541 - 0x7548      85/33 - 85/40
500                         _T("昤"),              _T("曈"),              _T("曙"),              _T("曺"),              _T("曻"),              _T("桒"),              _T("・"),              _T("椑"),                      // 0x7549 - 0x7550      85/41 - 85/48
501                         _T("椻"),              _T("橅"),              _T("檑"),              _T("櫛"),              _T("・"),              _T("・"),              _T("・"),              _T("毱"),                      // 0x7551 - 0x7558      85/49 - 85/56
502                         _T("泠"),              _T("洮"),              _T("海"),              _T("涿"),              _T("淊"),              _T("淸"),              _T("渚"),              _T("潞"),                      // 0x7559 - 0x7560      85/57 - 85/64
503                         _T("濹"),              _T("灤"),              _T("・"),              _T("・"),              _T("煇"),              _T("燁"),              _T("爀"),              _T("玟"),                      // 0x7561 - 0x7568      85/65 - 85/72
504                         _T("・"),              _T("珉"),              _T("珖"),              _T("琛"),              _T("琡"),              _T("琢"),              _T("琦"),              _T("琪"),                      // 0x7569 - 0x7570      85/73 - 85/80
505                         _T("琬"),              _T("琹"),              _T("瑋"),              _T("㻚"),              _T("畵"),              _T("疁"),              _T("睲"),              _T("䂓"),                      // 0x7571 - 0x7578      85/81 - 85/88
506                         _T("磈"),              _T("磠"),              _T("祇"),              _T("禮"),              _T("・"),              _T("・")                                                                                       // 0x7579 - 0x757E      85/89 - 85/94
507                 };
508
509         static const TCHAR *aszSymbolsTable6[] =
510                 {
511                         _T("・"),              _T("秚"),              _T("稞"),              _T("筿"),              _T("簱"),              _T("䉤"),              _T("綋"),              _T("羡"),                      // 0x7621 - 0x7628      86/01 - 86/08
512                         _T("脘"),              _T("脺"),              _T("・"),              _T("芮"),              _T("葛"),              _T("蓜"),              _T("蓬"),              _T("蕙"),                      // 0x7629 - 0x7630      86/09 - 86/16
513                         _T("藎"),              _T("蝕"),              _T("蟬"),              _T("蠋"),              _T("裵"),              _T("角"),              _T("諶"),              _T("跎"),                      // 0x7631 - 0x7638      86/17 - 86/24
514                         _T("辻"),              _T("迶"),              _T("郝"),              _T("鄧"),              _T("鄭"),              _T("醲"),              _T("鈳"),              _T("銈"),                      // 0x7639 - 0x7640      86/25 - 86/32
515                         _T("錡"),              _T("鍈"),              _T("閒"),              _T("雞"),              _T("餃"),              _T("饀"),              _T("髙"),              _T("鯖"),                      // 0x7641 - 0x7648      86/33 - 86/40
516                         _T("鷗"),              _T("麴"),              _T("麵")                                                                                                                                                                                       // 0x7649 - 0x764B      86/41 - 86/43
517                 };
518
519         // シンボルを変換する
520         if((wCode >= 0x7A50U) && (wCode <= 0x7A74U)){
521                 strcpy(lpszDst, aszSymbolsTable1[wCode - 0x7A50U]);
522         }
523         else if((wCode >= 0x7C21U) && (wCode <= 0x7C7BU)){
524                 strcpy(lpszDst, aszSymbolsTable2[wCode - 0x7C21U]);
525         }
526         else if((wCode >= 0x7D21U) && (wCode <= 0x7D7BU)){
527                 strcpy(lpszDst, aszSymbolsTable3[wCode - 0x7D21U]);
528         }
529         else if((wCode >= 0x7E21U) && (wCode <= 0x7E7DU)){
530                 strcpy(lpszDst, aszSymbolsTable4[wCode - 0x7E21U]);
531         }
532         else if((wCode >= 0x7521U) && (wCode <= 0x757EU)){
533                 strcpy(lpszDst, aszSymbolsTable5[wCode - 0x7521U]);
534         }
535         else if((wCode >= 0x7621U) && (wCode <= 0x764BU)){
536                 strcpy(lpszDst, aszSymbolsTable6[wCode - 0x7621U]);
537         }
538         else{
539                 strcpy(lpszDst, TEXT("・"));
540         }
541
542         return strlen(lpszDst);
543 }
544
545 void ProcessEscapeSeq(const BYTE byCode)
546 {
547         // エスケープシーケンス処理
548         switch(m_byEscSeqCount){
549                 // 1バイト目
550         case 1U :
551                 switch(byCode){
552                         // Invocation of code elements
553                 case 0x6EU      : LockingShiftGL(2U);   m_byEscSeqCount = 0U;   return;         // LS2
554                 case 0x6FU      : LockingShiftGL(3U);   m_byEscSeqCount = 0U;   return;         // LS3
555                 case 0x7EU      : LockingShiftGR(1U);   m_byEscSeqCount = 0U;   return;         // LS1R
556                 case 0x7DU      : LockingShiftGR(2U);   m_byEscSeqCount = 0U;   return;         // LS2R
557                 case 0x7CU      : LockingShiftGR(3U);   m_byEscSeqCount = 0U;   return;         // LS3R
558
559                         // Designation of graphic sets
560                 case 0x24U      :       
561                 case 0x28U      : m_byEscSeqIndex = 0U;         break;
562                 case 0x29U      : m_byEscSeqIndex = 1U;         break;
563                 case 0x2AU      : m_byEscSeqIndex = 2U;         break;
564                 case 0x2BU      : m_byEscSeqIndex = 3U;         break;
565                 default         : m_byEscSeqCount = 0U;         return;         // エラー
566                 }
567                 break;
568
569                 // 2バイト目
570         case 2U :
571                 if(DesignationGSET(m_byEscSeqIndex, byCode)){
572                         m_byEscSeqCount = 0U;
573                         return;
574                 }
575                         
576                 switch(byCode){
577                 case 0x20       : m_bIsEscSeqDrcs = true;       break;
578                 case 0x28       : m_bIsEscSeqDrcs = true;       m_byEscSeqIndex = 0U;   break;
579                 case 0x29       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 1U;   break;
580                 case 0x2A       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 2U;   break;
581                 case 0x2B       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 3U;   break;
582                 default         : m_byEscSeqCount = 0U;         return;         // エラー
583                 }
584                 break;
585
586                 // 3バイト目
587         case 3U :
588                 if(!m_bIsEscSeqDrcs){
589                         if(DesignationGSET(m_byEscSeqIndex, byCode)){
590                                 m_byEscSeqCount = 0U;
591                                 return;
592                         }
593                 }
594                 else{
595                         if(DesignationDRCS(m_byEscSeqIndex, byCode)){
596                                 m_byEscSeqCount = 0U;
597                                 return;
598                         }
599                 }
600
601                 if(byCode == 0x20U){
602                         m_bIsEscSeqDrcs = true;
603                 }
604                 else{
605                         // エラー
606                         m_byEscSeqCount = 0U;
607                         return;
608                 }
609                 break;
610
611                 // 4バイト目
612         case 4U :
613                 DesignationDRCS(m_byEscSeqIndex, byCode);
614                 m_byEscSeqCount = 0U;
615                 return;
616         }
617
618         m_byEscSeqCount++;
619 }
620
621 void LockingShiftGL(const BYTE byIndexG)
622 {
623         // LSx
624         m_pLockingGL = &m_CodeG[byIndexG];
625 }
626
627 void LockingShiftGR(const BYTE byIndexG)
628 {
629         // LSxR
630         m_pLockingGR = &m_CodeG[byIndexG];
631 }
632
633 void SingleShiftGL(const BYTE byIndexG)
634 {
635         // SSx
636         m_pSingleGL  = &m_CodeG[byIndexG];
637 }
638
639 const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)
640 {
641         // Gのグラフィックセットを割り当てる
642         switch(byCode){
643         case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
644         case 0x4AU      : m_CodeG[byIndexG] = CODE_ALPHANUMERIC;                return true;    // Alphanumeric
645         case 0x30U      : m_CodeG[byIndexG] = CODE_HIRAGANA;                    return true;    // Hiragana
646         case 0x31U      : m_CodeG[byIndexG] = CODE_KATAKANA;                    return true;    // Katakana
647         case 0x32U      : m_CodeG[byIndexG] = CODE_MOSAIC_A;                    return true;    // Mosaic A
648         case 0x33U      : m_CodeG[byIndexG] = CODE_MOSAIC_B;                    return true;    // Mosaic B
649         case 0x34U      : m_CodeG[byIndexG] = CODE_MOSAIC_C;                    return true;    // Mosaic C
650         case 0x35U      : m_CodeG[byIndexG] = CODE_MOSAIC_D;                    return true;    // Mosaic D
651         case 0x36U      : m_CodeG[byIndexG] = CODE_PROP_ALPHANUMERIC;   return true;    // Proportional Alphanumeric
652         case 0x37U      : m_CodeG[byIndexG] = CODE_PROP_HIRAGANA;               return true;    // Proportional Hiragana
653         case 0x38U      : m_CodeG[byIndexG] = CODE_PROP_KATAKANA;               return true;    // Proportional Katakana
654         case 0x49U      : m_CodeG[byIndexG] = CODE_JIS_X0201_KATAKANA;  return true;    // JIS X 0201 Katakana
655         case 0x39U      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_1;   return true;    // JIS compatible Kanji Plane 1
656         case 0x3AU      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_2;   return true;    // JIS compatible Kanji Plane 2
657         case 0x3BU      : m_CodeG[byIndexG] = CODE_ADDITIONAL_SYMBOLS;  return true;    // Additional symbols
658         default         : return false;         // 不明なグラフィックセット
659         }
660 }
661
662 const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)
663 {
664         // DRCSのグラフィックセットを割り当てる
665         switch(byCode){
666         case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
667         case 0x41U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-1
668         case 0x42U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-2
669         case 0x43U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-3
670         case 0x44U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-4
671         case 0x45U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-5
672         case 0x46U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-6
673         case 0x47U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-7
674         case 0x48U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-8
675         case 0x49U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-9
676         case 0x4AU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-10
677         case 0x4BU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-11
678         case 0x4CU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-12
679         case 0x4DU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-13
680         case 0x4EU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-14
681         case 0x4FU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-15
682         case 0x70U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // Macro
683         default         : return false;         // 不明なグラフィックセット
684 }
685 }