OSDN Git Service

add tstools.
[rec10/rec10-git.git] / tstools / 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 PutHiraganaChar(TCHAR *lpszDst, const WORD wCode);
54 static  const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode);
55 static  const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode);
56 static  const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode);
57
58 static  void ProcessEscapeSeq(const BYTE byCode);
59
60 static  void LockingShiftGL(const BYTE byIndexG);
61 static  void LockingShiftGR(const BYTE byIndexG);
62 static  void SingleShiftGL(const BYTE byIndexG);
63
64 static  const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode);
65 static  const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode);
66
67 static WORD convertjis(DWORD);
68
69 static const bool abCharSizeTable[] =
70 {
71         false,  // CODE_UNKNOWN                                 ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È(ÈóÂбþ)
72         true,   // CODE_KANJI                                   Kanji
73         false,  // CODE_ALPHANUMERIC                    Alphanumeric
74         false,  // CODE_HIRAGANA                                Hiragana
75         false,  // CODE_KATAKANA                                Katakana
76         false,  // CODE_MOSAIC_A                                Mosaic A
77         false,  // CODE_MOSAIC_B                                Mosaic B
78         false,  // CODE_MOSAIC_C                                Mosaic C
79         false,  // CODE_MOSAIC_D                                Mosaic D
80         false,  // CODE_PROP_ALPHANUMERIC               Proportional Alphanumeric
81         false,  // CODE_PROP_HIRAGANA                   Proportional Hiragana
82         false,  // CODE_PROP_KATAKANA                   Proportional Katakana
83         false,  // CODE_JIS_X0201_KATAKANA              JIS X 0201 Katakana
84         true,   // CODE_JIS_KANJI_PLANE_1               JIS compatible Kanji Plane 1
85         true,   // CODE_JIS_KANJI_PLANE_2               JIS compatible Kanji Plane 2
86         true    // CODE_ADDITIONAL_SYMBOLS              Additional symbols
87 };
88
89 int AribToString(
90         char *lpszDst, 
91         const char *pSrcData, 
92         const int dwSrcLen) {
93   
94         return AribToStringInternal(lpszDst, pSrcData, dwSrcLen);
95 }
96
97
98 const DWORD AribToStringInternal(TCHAR *lpszDst, 
99                                                                  const BYTE *pSrcData, const DWORD dwSrcLen)
100 {
101         if(!pSrcData || !dwSrcLen || !lpszDst)return 0UL;
102   
103         DWORD dwSrcPos = 0UL;
104         DWORD dwDstLen = 0UL;
105         int   dwSrcData;
106   
107         // ¾õÂÖ½é´üÀßÄê
108         m_byEscSeqCount = 0U;
109         m_pSingleGL = NULL;
110
111         m_CodeG[0] = CODE_KANJI;
112         m_CodeG[1] = CODE_ALPHANUMERIC;
113         m_CodeG[2] = CODE_HIRAGANA;
114         m_CodeG[3] = CODE_KATAKANA;
115
116         m_pLockingGL = &m_CodeG[0];
117         m_pLockingGR = &m_CodeG[2];
118
119         while(dwSrcPos < dwSrcLen){
120                 dwSrcData = pSrcData[dwSrcPos] & 0xFF;
121
122                 if(!m_byEscSeqCount){
123       
124                         // GL/GRÎΰè
125                         if((dwSrcData >= 0x21U) && (dwSrcData <= 0x7EU)){
126                                 // GLÎΰè
127                                 const CODE_SET CurCodeSet = (m_pSingleGL)? *m_pSingleGL : *m_pLockingGL;
128                                 m_pSingleGL = NULL;
129                                 
130                                 if(abCharSizeTable[CurCodeSet]){
131                                         // 2¥Ð¥¤¥È¥³¡¼¥É
132                                         if((dwSrcLen - dwSrcPos) < 2UL)break;
133                                         
134                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)pSrcData[dwSrcPos + 0] << 8) | (WORD)pSrcData[dwSrcPos + 1], CurCodeSet);
135                                         dwSrcPos++;
136                                 }
137                                 else{
138                                         // 1¥Ð¥¤¥È¥³¡¼¥É
139                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)dwSrcData, CurCodeSet);
140                                 }
141                         }
142                         else if((dwSrcData >= 0xA1U) && (dwSrcData <= 0xFEU)){
143                                 // GRÎΰè
144                                 const CODE_SET CurCodeSet = *m_pLockingGR;
145                                 
146                                 if(abCharSizeTable[CurCodeSet]){
147                                         // 2¥Ð¥¤¥È¥³¡¼¥É
148                                         if((dwSrcLen - dwSrcPos) < 2UL)break;
149                                         
150                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)(pSrcData[dwSrcPos + 0] & 0x7FU) << 8) | (WORD)(pSrcData[dwSrcPos + 1] & 0x7FU), CurCodeSet);
151                                         dwSrcPos++;
152                                 }
153                                 else{
154                                         // 1¥Ð¥¤¥È¥³¡¼¥É
155                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)(dwSrcData & 0x7FU), CurCodeSet);
156                                 }
157                         }
158                         else{
159                                 // À©¸æ¥³¡¼¥É
160                                 switch(dwSrcData){
161                                 case 0x0FU      : LockingShiftGL(0U);                           break;  // LS0
162                                 case 0x0EU      : LockingShiftGL(1U);                           break;  // LS1
163                                 case 0x19U      : SingleShiftGL(2U);                            break;  // SS2
164                                 case 0x1DU      : SingleShiftGL(3U);                            break;  // SS3
165                                 case 0x1BU      : m_byEscSeqCount = 1U;                         break;  // ESC
166                                 case 0x20U      :
167                                 case 0xA0U      : lpszDst[dwDstLen++] = TEXT(' ');      break;  // SP
168                                 default         : break;        // ÈóÂбþ
169                                 }
170                         }
171                 }
172                 else{
173                         // ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹½èÍý
174                         ProcessEscapeSeq(dwSrcData);
175                 }
176                 
177                 dwSrcPos++;
178         }
179
180         // ½ªÃ¼Ê¸»ú
181         lpszDst[dwDstLen] = TEXT('\0');
182
183         return dwDstLen;
184 }
185
186 const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet)
187 {
188         switch(CodeSet){
189         case CODE_KANJI :
190         case CODE_JIS_KANJI_PLANE_1 :
191         case CODE_JIS_KANJI_PLANE_2 :
192                 // ´Á»ú¥³¡¼¥É½ÐÎÏ
193                 return PutKanjiChar(lpszDst, wCode);
194
195         case CODE_ALPHANUMERIC :
196         case CODE_PROP_ALPHANUMERIC :
197                 // ±Ñ¿ô»ú¥³¡¼¥É½ÐÎÏ
198                 return PutAlphanumericChar(lpszDst, wCode);
199
200         case CODE_HIRAGANA :
201         case CODE_PROP_HIRAGANA :
202                 // ¤Ò¤é¤¬¤Ê¥³¡¼¥É½ÐÎÏ
203                 return PutHiraganaChar(lpszDst, wCode);
204
205         case CODE_PROP_KATAKANA :
206         case CODE_KATAKANA :
207                 // ¥«¥¿¥«¥Ê¥³¡¼¥É½ÐÎÏ
208                 return PutKatakanaChar(lpszDst, wCode);
209
210         case CODE_JIS_X0201_KATAKANA :
211                 // JIS¥«¥¿¥«¥Ê¥³¡¼¥É½ÐÎÏ
212                 return PutJisKatakanaChar(lpszDst, wCode);
213 #if 1
214         case CODE_ADDITIONAL_SYMBOLS :
215                 // Äɲå·¥ó¥Ü¥ë¥³¡¼¥É½ÐÎÏ
216                 return PutSymbolsChar(lpszDst, wCode);
217 #endif
218         default :
219                 return 0UL;
220         }
221 }
222
223 const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode)
224 {
225         // JIS¢ªShift-JIS´Á»ú¥³¡¼¥ÉÊÑ´¹
226         const WORD wShiftJIS = convertjis(wCode);
227
228 #ifdef _UNICODE
229         // Shift-JIS ¢ª UNICODE
230         const char szShiftJIS[3] = {(char)(wShiftJIS >> 8), (char)(wShiftJIS & 0x00FFU), '\0'};
231         ::MultiByteToWideChar(CP_OEMCP, MB_PRECOMPOSED, szShiftJIS, 2, lpszDst, 2);
232
233         return 1UL;
234 #else
235         // Shift-JIS ¢ª Shift-JIS
236         lpszDst[0] = (wShiftJIS >> 8) & 0xFF;
237         lpszDst[1] = (char)(wShiftJIS & 0x00FFU);
238   
239         return 2UL;
240 #endif
241 }
242
243 const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode)
244 {
245         // ±Ñ¿ô»úʸ»ú¥³¡¼¥ÉÊÑ´¹
246         static const TCHAR *acAlphanumericTable = 
247                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
248                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
249                 TEXT("¡¡¡ª¡É¡ô¡ð¡ó¡õ¡Ç¡Ê¡Ë¡ö¡Ü¡¤¡Ý¡¥¡¿")
250                 TEXT("£°£±£²£³£´£µ£¶£·£¸£¹¡§¡¨¡ã¡á¡ä¡©")
251                 TEXT("¡÷£Á£Â£Ã£Ä£Å£Æ£Ç£È£É£Ê£Ë£Ì£Í£Î£Ï")
252                 TEXT("£Ð£Ñ£Ò£Ó£Ô£Õ£Ö£×£Ø£Ù£Ú¡Î¡ï¡Ï¡°¡²")
253                 TEXT("¡¡£á£â£ã£ä£å£æ£ç£è£é£ì£ë£ì£í£î£ï")
254                 TEXT("£ð£ñ£ò£ó£ô£õ£ö£÷£ø£ù£ú¡Ð¡Ã¡Ñ¡±¡¡");
255
256 #ifdef _UNICODE
257         lpszDst[0] = acAlphanumericTable[wCode];
258
259         return 1UL;
260 #else
261         lpszDst[0] = acAlphanumericTable[wCode * 2U + 0U];
262         lpszDst[1] = acAlphanumericTable[wCode * 2U + 1U];
263
264         return 2UL;
265 #endif
266 }
267
268 const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode)
269 {
270         // ¤Ò¤é¤¬¤Êʸ»ú¥³¡¼¥ÉÊÑ´¹
271         static const TCHAR *acHiraganaTable = 
272                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
273                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
274                 TEXT("¡¡¤¡¤¢¤£¤¤¤¥¤¦¤§¤¨¤©¤ª¤«¤¬¤­¤®¤¯")
275                 TEXT("¤°¤±¤²¤³¤´¤µ¤¶¤·¤¸¤¹¤º¤»¤¼¤½¤¾¤¿")
276                 TEXT("¤À¤Á¤Â¤Ã¤Ä¤Å¤Æ¤Ç¤È¤É¤Ê¤Ë¤Ì¤Í¤Î¤Ï")
277                 TEXT("¤Ð¤Ñ¤Ò¤Ó¤Ô¤Õ¤Ö¤×¤Ø¤Ù¤Ú¤Û¤Ü¤Ý¤Þ¤ß")
278                 TEXT("¤à¤á¤â¤ã¤ä¤å¤æ¤ç¤è¤é¤ê¤ë¤ì¤í¤î¤ï")
279                 TEXT("¤ð¤ñ¤ò¤ó¡¡¡¡¡¡¡µ¡¶¡¼¡£¡Ö¡×¡¢¡¦¡¡");
280         
281 #ifdef _UNICODE
282         lpszDst[0] = acHiraganaTable[wCode];
283
284         return 1UL;
285 #else
286         lpszDst[0] = acHiraganaTable[wCode * 2U + 0U];
287         lpszDst[1] = acHiraganaTable[wCode * 2U + 1U];
288
289         return 2UL;
290 #endif
291 }
292
293 const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode)
294 {
295         // ¥«¥¿¥«¥Ê±Ñ¿ô»úʸ»ú¥³¡¼¥ÉÊÑ´¹
296         static const TCHAR *acKatakanaTable = 
297                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
298                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
299                 TEXT("¡¡¥¡¥¢¥£¥¤¥¥¥¦¥§¥¨¥©¥ª¥«¥¬¥­¥®¥¯")
300                 TEXT("¥°¥±¥²¥³¥´¥µ¥¶¥·¥¸¥¹¥º¥»¥¼¥½¥¾¥¿")
301                 TEXT("¥À¥Á¥Â¥Ã¥Ä¥Å¥Æ¥Ç¥È¥É¥Ê¥Ë¥Ì¥Í¥Î¥Ï")
302                 TEXT("¥Ð¥Ñ¥Ò¥Ó¥Ô¥Õ¥Ö¥×¥Ø¥Ù¥Ú¥Û¥Ü¥Ý¥Þ¥ß")
303                 TEXT("¥à¥á¥â¥ã¥ä¥å¥æ¥ç¥è¥é¥ê¥ë¥ì¥í¥î¥ï")
304                 TEXT("¥ð¥ñ¥ò¥ó¥ô¥õ¥ö¡³¡´¡¼¡£¡Ö¡×¡¢¡¦¡¡");
305         
306 #ifdef _UNICODE
307         lpszDst[0] = acKatakanaTable[wCode];
308
309         return 1UL;
310 #else
311         lpszDst[0] = acKatakanaTable[wCode * 2U + 0U];
312         lpszDst[1] = acKatakanaTable[wCode * 2U + 1U];
313
314         return 2UL;
315 #endif
316 }
317
318 const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode)
319 {
320         // JIS¥«¥¿¥«¥Êʸ»ú¥³¡¼¥ÉÊÑ´¹
321         static const TCHAR *acJisKatakanaTable = 
322                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
323                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
324                 TEXT("¡¡¡£¡Ö¡×¡¢¡¦¥ò¥¡¥£¥¥¥§¥©¥ã¥å¥ç¥Ã")
325                 TEXT("¡¼¥¢¥¤¥¦¥¨¥ª¥«¥­¥¯¥±¥³¥µ¥·¥¹¥»¥½")
326                 TEXT("¥¿¥Á¥Ä¥Æ¥È¥Ê¥Ë¥Ì¥Í¥Î¥Ï¥Ò¥Õ¥Ø¥Û¥Þ")
327                 TEXT("¥ß¥à¥á¥â¥ä¥æ¥è¥é¥ê¥ë¥ì¥í¥ï¥ó¡«¡¬")
328                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
329                 TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡");
330         
331 #ifdef _UNICODE
332         lpszDst[0] = acJisKatakanaTable[wCode];
333
334         return 1UL;
335 #else
336         lpszDst[0] = acJisKatakanaTable[wCode * 2U + 0U];
337         lpszDst[1] = acJisKatakanaTable[wCode * 2U + 1U];
338
339         return 2UL;
340 #endif
341 }
342
343 const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode)
344 {
345         // Äɲå·¥ó¥Ü¥ëʸ»ú¥³¡¼¥ÉÊÑ´¹(¤È¤ê¤¢¤¨¤ºÉ¬Íפ½¤¦¤Ê¤â¤Î¤À¤±)
346         static const TCHAR *aszSymbolsTable1[] =
347                 {
348                         _T("[HV]"),             _T("[SD]"),             _T("[£Ð]"),             _T("[£×]"),             _T("[MV]"),             _T("[¼ê]"),             _T("[»ú]"),             _T("[ÁÐ]"),                     // 0x7A50 - 0x7A57      90/48 - 90/55
349                         _T("[¥Ç]"),             _T("[£Ó]"),             _T("[Æó]"),             _T("[¿]"),             _T("[²ò]"),             _T("[SS]"),             _T("[£Â]"),             _T("[£Î]"),                     // 0x7A58 - 0x7A5F      90/56 - 90/63
350                         _T("¢£"),               _T("¡ü"),               _T("[Å·]"),             _T("[¸ò]"),             _T("[±Ç]"),             _T("[̵]"),             _T("[ÎÁ]"),             _T("[ǯÎðÀ©¸Â]"),       // 0x7A60 - 0x7A67      90/64 - 90/71
351                         _T("[Á°]"),             _T("[¸å]"),             _T("[ºÆ]"),             _T("[¿·]"),             _T("[½é]"),             _T("[½ª]"),             _T("[À¸]"),             _T("[ÈÎ]"),                     // 0x7A68 - 0x7A6F      90/72 - 90/79
352                         _T("[À¼]"),             _T("[¿á]"),             _T("[PPV]"),    _T("(Èë)"),             _T("¤Û¤«")                                                                                                                      // 0x7A70 - 0x7A74      90/80 - 90/84
353                 };
354
355         static const TCHAR *aszSymbolsTable2[] =
356                 {
357                         _T("¢ª"),               _T("¢«"),               _T("¢¬"),               _T("¢­"),               _T("¡ü"),               _T("¡û"),               _T("ǯ"),               _T("·î"),                       // 0x7C21 - 0x7C28      92/01 - 92/08
358                         _T("Æü"),               _T("±ß"),               _T("­Ö"),               _T("ΩÊý£í"),   _T("­Ñ"),               _T("Ê¿Êý­Ñ"),   _T("ΩÊý­Ñ"),   _T("£°."),                      // 0x7C29 - 0x7C30      92/09 - 92/16
359                         _T("£±."),              _T("£²."),              _T("£³."),              _T("£´."),              _T("£µ."),              _T("£¶."),              _T("£·."),              _T("£¸."),                      // 0x7C31 - 0x7C38      92/17 - 92/24
360                         _T("£¹."),              _T("»á"),               _T("Éû"),               _T("¸µ"),               _T("¸Î"),               _T("Á°"),               _T("¿·"),               _T("£°,"),                      // 0x7C39 - 0x7C40      92/25 - 92/32
361                         _T("£±,"),              _T("£²,"),              _T("£³,"),              _T("£´,"),              _T("£µ,"),              _T("£¶,"),              _T("£·,"),              _T("£¸,"),                      // 0x7C41 - 0x7C48      92/33 - 92/40
362                         _T("£¹,"),              _T("(¼Ò)"),             _T("(ºâ)"),             _T("(Í­)"),             _T("(³ô)"),             _T("(Âå)"),             _T("(Ìä)"),             _T("¡ä"),                       // 0x7C49 - 0x7C50      92/41 - 92/48
363                         _T("¡ã"),               _T("¡Ú"),               _T("¡Û"),               _T("¡þ"),               _T("^2"),               _T("^3"),               _T("(CD)"),             _T("(vn)"),                     // 0x7C51 - 0x7C58      92/49 - 92/56
364                         _T("(ob)"),             _T("(cb)"),             _T("(ce"),              _T("mb)"),              _T("(hp)"),             _T("(br)"),             _T("(p)"),              _T("(s)"),                      // 0x7C59 - 0x7C60      92/57 - 92/64
365                         _T("(ms)"),             _T("(t)"),              _T("(bs)"),             _T("(b)"),              _T("(tb)"),             _T("(tp)"),             _T("(ds)"),             _T("(ag)"),                     // 0x7C61 - 0x7C68      92/65 - 92/72
366                         _T("(eg)"),             _T("(vo)"),             _T("(fl)"),             _T("(ke"),              _T("y)"),               _T("(sa"),              _T("x)"),               _T("(sy"),                      // 0x7C69 - 0x7C70      92/73 - 92/80
367                         _T("n)"),               _T("(or"),              _T("g)"),               _T("(pe"),              _T("r)"),               _T("(R)"),              _T("(C)"),              _T("(ä·)"),                     // 0x7C71 - 0x7C78      92/81 - 92/88
368                         _T("DJ"),               _T("[±é]"),             _T("Fax")                                                                                                                                                                                       // 0x7C79 - 0x7C7B      92/89 - 92/91
369                 };
370
371         static const TCHAR *aszSymbolsTable3[] =
372                 {
373                         _T("(·î)"),             _T("(²Ð)"),             _T("(¿å)"),             _T("(ÌÚ)"),             _T("(¶â)"),             _T("(ÅÚ)"),             _T("(Æü)"),             _T("(½Ë)"),                     // 0x7D21 - 0x7D28      93/01 - 93/08
374                         _T("­í"),               _T("­î"),               _T("­ï"),               _T("­ß"),               _T("­â"),               _T("­ä"),               _T("(¢©)"),             _T("¡û"),                       // 0x7D29 - 0x7D30      93/09 - 93/16
375                         _T("¡ÌËÜ¡Í"),   _T("¡Ì»°¡Í"),   _T("¡ÌÆó¡Í"),   _T("¡Ì°Â¡Í"),   _T("¡ÌÅÀ¡Í"),   _T("¡ÌÂÇ¡Í"),   _T("¡ÌÅð¡Í"),   _T("¡Ì¾¡¡Í"),           // 0x7D31 - 0x7D38      93/17 - 93/24
376                         _T("¡ÌÇÔ¡Í"),   _T("¡Ì£Ó¡Í"),   _T("¡ÎÅê¡Ï"),   _T("¡ÎÊá¡Ï"),   _T("¡Î°ì¡Ï"),   _T("¡ÎÆó¡Ï"),   _T("¡Î»°¡Ï"),   _T("¡ÎÍ·¡Ï"),           // 0x7D39 - 0x7D40      93/25 - 93/32
377                         _T("¡Îº¸¡Ï"),   _T("¡ÎÃæ¡Ï"),   _T("¡Î±¦¡Ï"),   _T("¡Î»Ø¡Ï"),   _T("¡ÎÁö¡Ï"),   _T("¡ÎÂÇ¡Ï"),   _T("­È"),               _T("­Ô"),                       // 0x7D41 - 0x7D48      93/33 - 93/40
378                         _T("Hz"),               _T("ha"),               _T("km"),               _T("Ê¿Êýkm"),   _T("hPa"),              _T("¡¦"),               _T("¡¦"),               _T("1/2"),                      // 0x7D49 - 0x7D50      93/41 - 93/48
379                         _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
380                         _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
381                         _T("ÆÞ¤ê"),             _T("±«"),               _T("Àã"),               _T("¢¤"),               _T("¢¥"),               _T("¢¦"),               _T("¢§"),               _T("¢¡"),                       // 0x7D61 - 0x7D68      93/65 - 93/72
382                         _T("¡¦"),               _T("¡¦"),               _T("¡¦"),               _T("¡þ"),               _T("¡ý"),               _T("!!"),               _T("!?"),               _T("ÆÞ/À²"),            // 0x7D69 - 0x7D70      93/73 - 93/80
383                         _T("±«"),               _T("±«"),               _T("Àã"),               _T("ÂçÀã"),             _T("Íë"),               _T("Í뱫"),             _T("¡¡"),               _T("¡¦"),                       // 0x7D71 - 0x7D78      93/81 - 93/88
384                         _T("¡¦"),               _T("¢ö"),               _T("­ä")                                                                                                                                                                                        // 0x7D79 - 0x7D7B      93/89 - 93/91
385                 };
386
387         static const TCHAR *aszSymbolsTable4[] =
388                 {
389                         _T("­µ"),               _T("­¶"),               _T("­·"),               _T("­¸"),               _T("­¹"),               _T("­º"),               _T("­»"),               _T("­¼"),                       // 0x7E21 - 0x7E28      94/01 - 94/08
390                         _T("­½"),               _T("­¾"),               _T("XI"),               _T("X­¶"),              _T("­±"),               _T("­²"),               _T("­³"),               _T("­´"),                       // 0x7E29 - 0x7E30      94/09 - 94/16
391                         _T("(1)"),              _T("(2)"),              _T("(3)"),              _T("(4)"),              _T("(5)"),              _T("(6)"),              _T("(7)"),              _T("(8)"),                      // 0x7E31 - 0x7E38      94/17 - 94/24
392                         _T("(9)"),              _T("(10)"),             _T("(11)"),             _T("(12)"),             _T("(21)"),             _T("(22)"),             _T("(23)"),             _T("(24)"),                     // 0x7E39 - 0x7E40      94/25 - 94/32
393                         _T("(A)"),              _T("(B)"),              _T("(C)"),              _T("(D)"),              _T("(E)"),              _T("(F)"),              _T("(G)"),              _T("(H)"),                      // 0x7E41 - 0x7E48      94/33 - 94/40
394                         _T("(I)"),              _T("(J)"),              _T("(K)"),              _T("(L)"),              _T("(M)"),              _T("(N)"),              _T("(O)"),              _T("(P)"),                      // 0x7E49 - 0x7E50      94/41 - 94/48
395                         _T("(Q)"),              _T("(R)"),              _T("(S)"),              _T("(T)"),              _T("(U)"),              _T("(V)"),              _T("(W)"),              _T("(X)"),                      // 0x7E51 - 0x7E58      94/49 - 94/56
396                         _T("(Y)"),              _T("(Z)"),              _T("(25)"),             _T("(26)"),             _T("(27)"),             _T("(28)"),             _T("(29)"),             _T("(30)"),                     // 0x7E59 - 0x7E60      94/57 - 94/64
397                         _T("­¡"),               _T("­¢"),               _T("­£"),               _T("­¤"),               _T("­¥"),               _T("­¦"),               _T("­§"),               _T("­¨"),                       // 0x7E61 - 0x7E68      94/65 - 94/72
398                         _T("­©"),               _T("­ª"),               _T("­«"),               _T("­¬"),               _T("­­"),               _T("­®"),               _T("­¯"),               _T("­°"),                       // 0x7E69 - 0x7E70      94/73 - 94/80
399                         _T("­¡"),               _T("­¢"),               _T("­£"),               _T("­¤"),               _T("­¥"),               _T("­¦"),               _T("­§"),               _T("­¨"),                       // 0x7E71 - 0x7E78      94/81 - 94/88
400                         _T("­©"),               _T("­ª"),               _T("­«"),               _T("­¬"),               _T("(31)")                                                                                                                      // 0x7E79 - 0x7E7D      94/89 - 94/93
401                 };
402
403         // ¥·¥ó¥Ü¥ë¤òÊÑ´¹¤¹¤ë
404         if((wCode >= 0x7A50U) && (wCode <= 0x7A74U)){
405                 strcpy(lpszDst, aszSymbolsTable1[wCode - 0x7A50U]);
406         }
407         else if((wCode >= 0x7C21U) && (wCode <= 0x7C7BU)){
408                 strcpy(lpszDst, aszSymbolsTable2[wCode - 0x7C21U]);
409         }
410         else if((wCode >= 0x7D21U) && (wCode <= 0x7D7BU)){
411                 strcpy(lpszDst, aszSymbolsTable3[wCode - 0x7D21U]);
412         }
413         else if((wCode >= 0x7E21U) && (wCode <= 0x7E7DU)){
414                 strcpy(lpszDst, aszSymbolsTable4[wCode - 0x7E21U]);
415         }
416         else{
417                 strcpy(lpszDst, TEXT("¡¦"));
418         }
419
420         return strlen(lpszDst);
421 }
422
423 void ProcessEscapeSeq(const BYTE byCode)
424 {
425         // ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹½èÍý
426         switch(m_byEscSeqCount){
427                 // 1¥Ð¥¤¥ÈÌÜ
428         case 1U :
429                 switch(byCode){
430                         // Invocation of code elements
431                 case 0x6EU      : LockingShiftGL(2U);   m_byEscSeqCount = 0U;   return;         // LS2
432                 case 0x6FU      : LockingShiftGL(3U);   m_byEscSeqCount = 0U;   return;         // LS3
433                 case 0x7EU      : LockingShiftGR(1U);   m_byEscSeqCount = 0U;   return;         // LS1R
434                 case 0x7DU      : LockingShiftGR(2U);   m_byEscSeqCount = 0U;   return;         // LS2R
435                 case 0x7CU      : LockingShiftGR(3U);   m_byEscSeqCount = 0U;   return;         // LS3R
436
437                         // Designation of graphic sets
438                 case 0x24U      :       
439                 case 0x28U      : m_byEscSeqIndex = 0U;         break;
440                 case 0x29U      : m_byEscSeqIndex = 1U;         break;
441                 case 0x2AU      : m_byEscSeqIndex = 2U;         break;
442                 case 0x2BU      : m_byEscSeqIndex = 3U;         break;
443                 default         : m_byEscSeqCount = 0U;         return;         // ¥¨¥é¡¼
444                 }
445                 break;
446
447                 // 2¥Ð¥¤¥ÈÌÜ
448         case 2U :
449                 if(DesignationGSET(m_byEscSeqIndex, byCode)){
450                         m_byEscSeqCount = 0U;
451                         return;
452                 }
453                         
454                 switch(byCode){
455                 case 0x20       : m_bIsEscSeqDrcs = true;       break;
456                 case 0x28       : m_bIsEscSeqDrcs = true;       m_byEscSeqIndex = 0U;   break;
457                 case 0x29       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 1U;   break;
458                 case 0x2A       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 2U;   break;
459                 case 0x2B       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 3U;   break;
460                 default         : m_byEscSeqCount = 0U;         return;         // ¥¨¥é¡¼
461                 }
462                 break;
463
464                 // 3¥Ð¥¤¥ÈÌÜ
465         case 3U :
466                 if(!m_bIsEscSeqDrcs){
467                         if(DesignationGSET(m_byEscSeqIndex, byCode)){
468                                 m_byEscSeqCount = 0U;
469                                 return;
470                         }
471                 }
472                 else{
473                         if(DesignationDRCS(m_byEscSeqIndex, byCode)){
474                                 m_byEscSeqCount = 0U;
475                                 return;
476                         }
477                 }
478
479                 if(byCode == 0x20U){
480                         m_bIsEscSeqDrcs = true;
481                 }
482                 else{
483                         // ¥¨¥é¡¼
484                         m_byEscSeqCount = 0U;
485                         return;
486                 }
487                 break;
488
489                 // 4¥Ð¥¤¥ÈÌÜ
490         case 4U :
491                 DesignationDRCS(m_byEscSeqIndex, byCode);
492                 m_byEscSeqCount = 0U;
493                 return;
494         }
495
496         m_byEscSeqCount++;
497 }
498
499 void LockingShiftGL(const BYTE byIndexG)
500 {
501         // LSx
502         m_pLockingGL = &m_CodeG[byIndexG];
503 }
504
505 void LockingShiftGR(const BYTE byIndexG)
506 {
507         // LSxR
508         m_pLockingGR = &m_CodeG[byIndexG];
509 }
510
511 void SingleShiftGL(const BYTE byIndexG)
512 {
513         // SSx
514         m_pSingleGL  = &m_CodeG[byIndexG];
515 }
516
517 const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)
518 {
519         // G¤Î¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È¤ò³ä¤êÅö¤Æ¤ë
520         switch(byCode){
521         case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
522         case 0x4AU      : m_CodeG[byIndexG] = CODE_ALPHANUMERIC;                return true;    // Alphanumeric
523         case 0x30U      : m_CodeG[byIndexG] = CODE_HIRAGANA;                    return true;    // Hiragana
524         case 0x31U      : m_CodeG[byIndexG] = CODE_KATAKANA;                    return true;    // Katakana
525         case 0x32U      : m_CodeG[byIndexG] = CODE_MOSAIC_A;                    return true;    // Mosaic A
526         case 0x33U      : m_CodeG[byIndexG] = CODE_MOSAIC_B;                    return true;    // Mosaic B
527         case 0x34U      : m_CodeG[byIndexG] = CODE_MOSAIC_C;                    return true;    // Mosaic C
528         case 0x35U      : m_CodeG[byIndexG] = CODE_MOSAIC_D;                    return true;    // Mosaic D
529         case 0x36U      : m_CodeG[byIndexG] = CODE_PROP_ALPHANUMERIC;   return true;    // Proportional Alphanumeric
530         case 0x37U      : m_CodeG[byIndexG] = CODE_PROP_HIRAGANA;               return true;    // Proportional Hiragana
531         case 0x38U      : m_CodeG[byIndexG] = CODE_PROP_KATAKANA;               return true;    // Proportional Katakana
532         case 0x49U      : m_CodeG[byIndexG] = CODE_JIS_X0201_KATAKANA;  return true;    // JIS X 0201 Katakana
533         case 0x39U      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_1;   return true;    // JIS compatible Kanji Plane 1
534         case 0x3AU      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_2;   return true;    // JIS compatible Kanji Plane 2
535         case 0x3BU      : m_CodeG[byIndexG] = CODE_ADDITIONAL_SYMBOLS;  return true;    // Additional symbols
536         default         : return false;         // ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È
537         }
538 }
539
540 const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)
541 {
542         // DRCS¤Î¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È¤ò³ä¤êÅö¤Æ¤ë
543         switch(byCode){
544         case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
545         case 0x41U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-1
546         case 0x42U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-2
547         case 0x43U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-3
548         case 0x44U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-4
549         case 0x45U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-5
550         case 0x46U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-6
551         case 0x47U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-7
552         case 0x48U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-8
553         case 0x49U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-9
554         case 0x4AU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-10
555         case 0x4BU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-11
556         case 0x4CU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-12
557         case 0x4DU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-13
558         case 0x4EU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-14
559         case 0x4FU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-15
560         case 0x70U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // Macro
561         default         : return false;         // ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È
562         }
563 }
564
565 WORD convertjis(DWORD jiscode) {
566         char code[3];
567         char xcode[4];
568         iconv_t cd;
569   
570         size_t inbyte = 2;
571         size_t outbyte = 4;
572
573         const char *fptr;
574         char *tptr;
575
576         WORD rtn;
577
578         code[0] = jiscode >> 8;
579         code[1] = jiscode & 0xFF;
580         code[3] = '\0';
581
582         /*
583           cd = iconv_open("ISO-2022-JP","UTF-8");
584
585           fptr = code;
586           tptr = xcode;
587           iconv(cd, &fptr, &inbyte, &tptr, &outbyte);
588
589           iconv_close(cd);
590         */
591
592         xcode[0] = code[0] | 0x80;
593         xcode[1] = code[1] | 0x80;
594
595         rtn = ((xcode[0] << 8) & 0xFF00) | (xcode[1] & 0xFF);
596
597         return rtn;
598
599 }