OSDN Git Service

initial files
[iptd/iPTd_R3.git] / src / b25 / aribstr.c
1 #include <stdio.h>\r
2 #include <stdlib.h>\r
3 #include <string.h>\r
4 //#include <iconv.h>\r
5 \r
6 #undef _UNICODE\r
7 #include "aribstr.h"\r
8 \r
9 #define CODE_UNKNOWN            0       // 不明なグラフィックセット(非対応)\r
10 #define CODE_KANJI              1       // Kanji\r
11 #define CODE_ALPHANUMERIC       2       // Alphanumeric\r
12 #define CODE_HIRAGANA           3       // Hiragana\r
13 #define CODE_KATAKANA           4       // Katakana\r
14 #define CODE_MOSAIC_A           5       // Mosaic A\r
15 #define CODE_MOSAIC_B           6       // Mosaic B\r
16 #define CODE_MOSAIC_C           7       // Mosaic C\r
17 #define CODE_MOSAIC_D           8       // Mosaic D\r
18 #define CODE_PROP_ALPHANUMERIC  9       // Proportional Alphanumeric\r
19 #define CODE_PROP_HIRAGANA      10      // Proportional Hiragana\r
20 #define CODE_PROP_KATAKANA      11      // Proportional Katakana\r
21 #define CODE_JIS_X0201_KATAKANA 12      // JIS X 0201 Katakana\r
22 #define CODE_JIS_KANJI_PLANE_1  13      // JIS compatible Kanji Plane 1\r
23 #define CODE_JIS_KANJI_PLANE_2  14      // JIS compatible Kanji Plane 2\r
24 #define CODE_ADDITIONAL_SYMBOLS 15      // Additional symbols\r
25 \r
26 \r
27 #define TCHAR char\r
28 #define BYTE  char\r
29 #define WORD  int\r
30 #define DWORD int\r
31 #define bool  int\r
32 #define true  1\r
33 #define false 0\r
34 #define TEXT(a) a\r
35 #define _T(a) a\r
36 #define CODE_SET int\r
37 \r
38 static int m_CodeG[4];\r
39 static int *m_pLockingGL;\r
40 static int *m_pLockingGR;\r
41 static int *m_pSingleGL;\r
42         \r
43 static  BYTE m_byEscSeqCount;\r
44 static  BYTE m_byEscSeqIndex;\r
45 static  bool m_bIsEscSeqDrcs;\r
46 \r
47 \r
48 static  const DWORD AribToStringInternal(TCHAR *lpszDst, const BYTE *pSrcData, const DWORD dwSrcLen);\r
49 static  const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet);\r
50 \r
51 static  const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode);\r
52 static  const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode);\r
53 static  const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode);\r
54 static  const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode);\r
55 static  const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode);\r
56 static  const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode);\r
57 \r
58 static  void ProcessEscapeSeq(const BYTE byCode);\r
59 \r
60 static  void LockingShiftGL(const BYTE byIndexG);\r
61 static  void LockingShiftGR(const BYTE byIndexG);\r
62 static  void SingleShiftGL(const BYTE byIndexG);\r
63 \r
64 static  const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode);\r
65 static  const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode);\r
66 \r
67 static WORD convertjis(DWORD);\r
68 \r
69 static const bool abCharSizeTable[] =\r
70 {\r
71         false,  // CODE_UNKNOWN                                 不明なグラフィックセット(非対応)\r
72         true,   // CODE_KANJI                                   Kanji\r
73         false,  // CODE_ALPHANUMERIC                    Alphanumeric\r
74         false,  // CODE_HIRAGANA                                Hiragana\r
75         false,  // CODE_KATAKANA                                Katakana\r
76         false,  // CODE_MOSAIC_A                                Mosaic A\r
77         false,  // CODE_MOSAIC_B                                Mosaic B\r
78         false,  // CODE_MOSAIC_C                                Mosaic C\r
79         false,  // CODE_MOSAIC_D                                Mosaic D\r
80         false,  // CODE_PROP_ALPHANUMERIC               Proportional Alphanumeric\r
81         false,  // CODE_PROP_HIRAGANA                   Proportional Hiragana\r
82         false,  // CODE_PROP_KATAKANA                   Proportional Katakana\r
83         false,  // CODE_JIS_X0201_KATAKANA              JIS X 0201 Katakana\r
84         true,   // CODE_JIS_KANJI_PLANE_1               JIS compatible Kanji Plane 1\r
85         true,   // CODE_JIS_KANJI_PLANE_2               JIS compatible Kanji Plane 2\r
86         true    // CODE_ADDITIONAL_SYMBOLS              Additional symbols\r
87 };\r
88 \r
89 int AribToString(\r
90         char *lpszDst, \r
91         const char *pSrcData, \r
92         const int dwSrcLen) {\r
93   \r
94         return AribToStringInternal(lpszDst, pSrcData, dwSrcLen);\r
95 }\r
96 \r
97 const DWORD AribToStringInternal(TCHAR *lpszDst,\r
98                                                                  const BYTE *pSrcData, const DWORD dwSrcLen)\r
99 {\r
100         if(!pSrcData || !dwSrcLen || !lpszDst)return 0UL;\r
101   \r
102         DWORD dwSrcPos = 0UL;\r
103         DWORD dwDstLen = 0UL;\r
104         int   dwSrcData;\r
105   \r
106         // 状態初期設定\r
107         m_byEscSeqCount = 0U;\r
108         m_pSingleGL = NULL;\r
109 \r
110         m_CodeG[0] = CODE_KANJI;\r
111         m_CodeG[1] = CODE_ALPHANUMERIC;\r
112         m_CodeG[2] = CODE_HIRAGANA;\r
113         m_CodeG[3] = CODE_KATAKANA;\r
114 \r
115         m_pLockingGL = &m_CodeG[0];\r
116         m_pLockingGR = &m_CodeG[2];\r
117 \r
118         while(dwSrcPos < dwSrcLen){\r
119                 dwSrcData = pSrcData[dwSrcPos] & 0xFF;\r
120 \r
121                 if(!m_byEscSeqCount){\r
122       \r
123                         // GL/GR領域\r
124                         if((dwSrcData >= 0x21U) && (dwSrcData <= 0x7EU)){\r
125                                 // GL領域\r
126                                 const CODE_SET CurCodeSet = (m_pSingleGL)? *m_pSingleGL : *m_pLockingGL;\r
127                                 m_pSingleGL = NULL;\r
128                                 \r
129                                 if(abCharSizeTable[CurCodeSet]){\r
130                                         // 2バイトコード\r
131                                         if((dwSrcLen - dwSrcPos) < 2UL)break;\r
132                                         \r
133                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)pSrcData[dwSrcPos + 0] << 8) | (WORD)pSrcData[dwSrcPos + 1], CurCodeSet);\r
134                                         dwSrcPos++;\r
135                                 }\r
136                                 else{\r
137                                         // 1バイトコード\r
138                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)dwSrcData, CurCodeSet);\r
139                                 }\r
140                         }\r
141                         else if((dwSrcData >= 0xA1U) && (dwSrcData <= 0xFEU)){\r
142                                 // GR領域\r
143                                 const CODE_SET CurCodeSet = *m_pLockingGR;\r
144                                 \r
145                                 if(abCharSizeTable[CurCodeSet]){\r
146                                         // 2バイトコード\r
147                                         if((dwSrcLen - dwSrcPos) < 2UL)break;\r
148                                         \r
149                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)(pSrcData[dwSrcPos + 0] & 0x7FU) << 8) | (WORD)(pSrcData[dwSrcPos + 1] & 0x7FU), CurCodeSet);\r
150                                         dwSrcPos++;\r
151                                 }\r
152                                 else{\r
153                                         // 1バイトコード\r
154                                         dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)(dwSrcData & 0x7FU), CurCodeSet);\r
155                                 }\r
156                         }\r
157                         else{\r
158                                 // 制御コード\r
159                                 switch(dwSrcData){\r
160                                 case 0x0FU      : LockingShiftGL(0U);                           break;  // LS0\r
161                                 case 0x0EU      : LockingShiftGL(1U);                           break;  // LS1\r
162                                 case 0x19U      : SingleShiftGL(2U);                            break;  // SS2\r
163                                 case 0x1DU      : SingleShiftGL(3U);                            break;  // SS3\r
164                                 case 0x1BU      : m_byEscSeqCount = 1U;                         break;  // ESC\r
165                                 case 0x20U      :\r
166                                 case 0xA0U      : lpszDst[dwDstLen++] = TEXT(' ');      break;  // SP\r
167                                 default         : break;        // 非対応\r
168                                 }\r
169                         }\r
170                 }\r
171                 else{\r
172                         // エスケープシーケンス処理\r
173                         ProcessEscapeSeq(dwSrcData);\r
174                 }\r
175                 \r
176                 dwSrcPos++;\r
177         }\r
178 \r
179         // 終端文字\r
180         lpszDst[dwDstLen] = TEXT('\0');\r
181 \r
182         return dwDstLen;\r
183 }\r
184 \r
185 const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet)\r
186 {\r
187         switch(CodeSet){\r
188         case CODE_KANJI :\r
189         case CODE_JIS_KANJI_PLANE_1 :\r
190         case CODE_JIS_KANJI_PLANE_2 :\r
191                 // 漢字コード出力\r
192                 return PutKanjiChar(lpszDst, wCode);\r
193 \r
194         case CODE_ALPHANUMERIC :\r
195         case CODE_PROP_ALPHANUMERIC :\r
196                 // 英数字コード出力\r
197                 return PutAlphanumericChar(lpszDst, wCode);\r
198 \r
199         case CODE_HIRAGANA :\r
200         case CODE_PROP_HIRAGANA :\r
201                 // ひらがなコード出力\r
202                 return PutHiraganaChar(lpszDst, wCode);\r
203 \r
204         case CODE_PROP_KATAKANA :\r
205         case CODE_KATAKANA :\r
206                 // カタカナコード出力\r
207                 return PutKatakanaChar(lpszDst, wCode);\r
208 \r
209         case CODE_JIS_X0201_KATAKANA :\r
210                 // JISカタカナコード出力\r
211                 return PutJisKatakanaChar(lpszDst, wCode);\r
212 #if 1\r
213         case CODE_ADDITIONAL_SYMBOLS :\r
214                 // 追加シンボルコード出力\r
215                 return PutSymbolsChar(lpszDst, wCode);\r
216 #endif\r
217         default :\r
218                 return 0UL;\r
219         }\r
220 }\r
221 \r
222 const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode)\r
223 {\r
224         // JIS→Shift-JIS漢字コード変換\r
225         const WORD wShiftJIS = convertjis(wCode);\r
226 \r
227 #ifdef _UNICODE\r
228         // Shift-JIS → UNICODE\r
229         const char szShiftJIS[3] = {(char)(wShiftJIS >> 8), (char)(wShiftJIS & 0x00FFU), '\0'};\r
230         ::MultiByteToWideChar(CP_OEMCP, MB_PRECOMPOSED, szShiftJIS, 2, lpszDst, 2);\r
231 \r
232         return 1UL;\r
233 #else\r
234         // Shift-JIS → Shift-JIS\r
235         lpszDst[0] = (wShiftJIS >> 8) & 0xFF;\r
236         lpszDst[1] = (char)(wShiftJIS & 0x00FFU);\r
237   \r
238         return 2UL;\r
239 #endif\r
240 }\r
241 \r
242 const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode)\r
243 {\r
244         // 英数字文字コード変換\r
245         static const TCHAR *acAlphanumericTable = \r
246                 TEXT("                ")\r
247                 TEXT("                ")\r
248                 TEXT(" !”#$%&’()*+,-./")\r
249                 TEXT("0123456789:;<=>?")\r
250                 TEXT("@ABCDEFGHIJKLMNO")\r
251                 TEXT("PQRSTUVWXYZ[¥]^_")\r
252                 TEXT(" abcdefghilklmno")\r
253                 TEXT("pqrstuvwxyz{|} ̄ ");\r
254 \r
255 #ifdef _UNICODE\r
256         lpszDst[0] = acAlphanumericTable[wCode];\r
257 \r
258         return 1UL;\r
259 #else\r
260         lpszDst[0] = acAlphanumericTable[wCode * 2U + 0U];\r
261         lpszDst[1] = acAlphanumericTable[wCode * 2U + 1U];\r
262 \r
263         return 2UL;\r
264 #endif\r
265 }\r
266 \r
267 const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode)\r
268 {\r
269         // ひらがな文字コード変換\r
270         static const TCHAR *acHiraganaTable = \r
271                 TEXT("                ")\r
272                 TEXT("                ")\r
273                 TEXT(" ぁあぃいぅうぇえぉおかがきぎく")\r
274                 TEXT("ぐけげこごさざしじすずせぜそぞた")\r
275                 TEXT("だちぢっつづてでとどなにぬねのは")\r
276                 TEXT("ばぱひびぴふぶぷへべぺほぼぽまみ")\r
277                 TEXT("むめもゃやゅゆょよらりるれろゎわ")\r
278                 TEXT("ゐゑをん   ゝゞー。「」、・ ");\r
279         \r
280 #ifdef _UNICODE\r
281         lpszDst[0] = acHiraganaTable[wCode];\r
282 \r
283         return 1UL;\r
284 #else\r
285         lpszDst[0] = acHiraganaTable[wCode * 2U + 0U];\r
286         lpszDst[1] = acHiraganaTable[wCode * 2U + 1U];\r
287 \r
288         return 2UL;\r
289 #endif\r
290 }\r
291 \r
292 const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode)\r
293 {\r
294         // カタカナ英数字文字コード変換\r
295         static const TCHAR *acKatakanaTable = \r
296                 TEXT("                ")\r
297                 TEXT("                ")\r
298                 TEXT(" ァアィイゥウェエォオカガキギク")\r
299                 TEXT("グケゲコゴサザシジスズセゼソゾタ")\r
300                 TEXT("ダチヂッツヅテデトドナニヌネノハ")\r
301                 TEXT("バパヒビピフブプヘベペホボポマミ")\r
302                 TEXT("ムメモャヤュユョヨラリルレロヮワ")\r
303                 TEXT("ヰヱヲンヴヵヶヽヾー。「」、・ ");\r
304         \r
305 #ifdef _UNICODE\r
306         lpszDst[0] = acKatakanaTable[wCode];\r
307 \r
308         return 1UL;\r
309 #else\r
310         lpszDst[0] = acKatakanaTable[wCode * 2U + 0U];\r
311         lpszDst[1] = acKatakanaTable[wCode * 2U + 1U];\r
312 \r
313         return 2UL;\r
314 #endif\r
315 }\r
316 \r
317 const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode)\r
318 {\r
319         // JISカタカナ文字コード変換\r
320         static const TCHAR *acJisKatakanaTable = \r
321                 TEXT("                ")\r
322                 TEXT("                ")\r
323                 TEXT(" 。「」、・ヲァィゥェォャュョッ")\r
324                 TEXT("ーアイウエオカキクケコサシスセソ")\r
325                 TEXT("タチツテトナニヌネノハヒフヘホマ")\r
326                 TEXT("ミムメモヤユヨラリルレロワン゛゜")\r
327                 TEXT("                ")\r
328                 TEXT("                ");\r
329         \r
330 #ifdef _UNICODE\r
331         lpszDst[0] = acJisKatakanaTable[wCode];\r
332 \r
333         return 1UL;\r
334 #else\r
335         lpszDst[0] = acJisKatakanaTable[wCode * 2U + 0U];\r
336         lpszDst[1] = acJisKatakanaTable[wCode * 2U + 1U];\r
337 \r
338         return 2UL;\r
339 #endif\r
340 }\r
341 \r
342 const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode)\r
343 {\r
344         // 追加シンボル文字コード変換(とりあえず必要そうなものだけ)\r
345         static const TCHAR *aszSymbolsTable1[] =\r
346                 {\r
347                         _T("[HV]"),             _T("[SD]"),             _T("[P]"),            _T("[W]"),            _T("[MV]"),             _T("[手]"),            _T("[字]"),            _T("[双]"),                    // 0x7A50 - 0x7A57      90/48 - 90/55\r
348                         _T("[デ]"),            _T("[S]"),            _T("[二]"),            _T("[多]"),            _T("[解]"),            _T("[SS]"),             _T("[B]"),            _T("[N]"),                    // 0x7A58 - 0x7A5F      90/56 - 90/63\r
349                         _T("■"),              _T("●"),              _T("[天]"),            _T("[交]"),            _T("[映]"),            _T("[無]"),            _T("[料]"),            _T("[年齢制限]"),   // 0x7A60 - 0x7A67      90/64 - 90/71\r
350                         _T("[前]"),            _T("[後]"),            _T("[再]"),            _T("[新]"),            _T("[初]"),            _T("[終]"),            _T("[生]"),            _T("[販]"),                    // 0x7A68 - 0x7A6F      90/72 - 90/79\r
351                         _T("[声]"),            _T("[吹]"),            _T("[PPV]"),    _T("(秘)"),            _T("ほか")                                                                                                                    // 0x7A70 - 0x7A74      90/80 - 90/84\r
352                 };\r
353 \r
354         static const TCHAR *aszSymbolsTable2[] =\r
355                 {\r
356                         _T("→"),              _T("←"),              _T("↑"),              _T("↓"),              _T("●"),              _T("○"),              _T("年"),              _T("月"),                      // 0x7C21 - 0x7C28      92/01 - 92/08\r
357                         _T("日"),              _T("円"),              _T("㎡"),              _T("立方m"),        _T("㎝"),              _T("平方cm"), _T("立方㎝"),        _T("0."),                     // 0x7C29 - 0x7C30      92/09 - 92/16\r
358                         _T("1."),             _T("2."),             _T("3."),             _T("4."),             _T("5."),             _T("6."),             _T("7."),             _T("8."),                     // 0x7C31 - 0x7C38      92/17 - 92/24\r
359                         _T("9."),             _T("氏"),              _T("副"),              _T("元"),              _T("故"),              _T("前"),              _T("新"),              _T("0,"),                     // 0x7C39 - 0x7C40      92/25 - 92/32\r
360                         _T("1,"),             _T("2,"),             _T("3,"),             _T("4,"),             _T("5,"),             _T("6,"),             _T("7,"),             _T("8,"),                     // 0x7C41 - 0x7C48      92/33 - 92/40\r
361                         _T("9,"),             _T("(社)"),            _T("(財)"),            _T("(有)"),            _T("(株)"),            _T("(代)"),            _T("(問)"),            _T(">"),                      // 0x7C49 - 0x7C50      92/41 - 92/48\r
362                         _T("<"),              _T("【"),              _T("】"),              _T("◇"),              _T("^2"),               _T("^3"),               _T("(CD)"),             _T("(vn)"),                     // 0x7C51 - 0x7C58      92/49 - 92/56\r
363                         _T("(ob)"),             _T("(cb)"),             _T("(ce"),              _T("mb)"),              _T("(hp)"),             _T("(br)"),             _T("(p)"),              _T("(s)"),                      // 0x7C59 - 0x7C60      92/57 - 92/64\r
364                         _T("(ms)"),             _T("(t)"),              _T("(bs)"),             _T("(b)"),              _T("(tb)"),             _T("(tp)"),             _T("(ds)"),             _T("(ag)"),                     // 0x7C61 - 0x7C68      92/65 - 92/72\r
365                         _T("(eg)"),             _T("(vo)"),             _T("(fl)"),             _T("(ke"),              _T("y)"),               _T("(sa"),              _T("x)"),               _T("(sy"),                      // 0x7C69 - 0x7C70      92/73 - 92/80\r
366                         _T("n)"),               _T("(or"),              _T("g)"),               _T("(pe"),              _T("r)"),               _T("(R)"),              _T("(C)"),              _T("(箏)"),                    // 0x7C71 - 0x7C78      92/81 - 92/88\r
367                         _T("DJ"),               _T("[演]"),            _T("Fax")                                                                                                                                                                                       // 0x7C79 - 0x7C7B      92/89 - 92/91\r
368                 };\r
369 \r
370         static const TCHAR *aszSymbolsTable3[] =\r
371                 {\r
372                         _T("(月)"),            _T("(火)"),            _T("(水)"),            _T("(木)"),            _T("(金)"),            _T("(土)"),            _T("(日)"),            _T("(祝)"),                    // 0x7D21 - 0x7D28      93/01 - 93/08\r
373                         _T("㍾"),              _T("㍽"),              _T("㍼"),              _T("㍻"),              _T("№"),              _T("℡"),              _T("(〒)"),            _T("○"),                      // 0x7D29 - 0x7D30      93/09 - 93/16\r
374                         _T("〔本〕"),        _T("〔三〕"),        _T("〔二〕"),        _T("〔安〕"),        _T("〔点〕"),        _T("〔打〕"),        _T("〔盗〕"),        _T("〔勝〕"),                // 0x7D31 - 0x7D38      93/17 - 93/24\r
375                         _T("〔敗〕"),        _T("〔S〕"),        _T("[投]"),        _T("[捕]"),        _T("[一]"),        _T("[二]"),        _T("[三]"),        _T("[遊]"),                // 0x7D39 - 0x7D40      93/25 - 93/32\r
376                         _T("[左]"),        _T("[中]"),        _T("[右]"),        _T("[指]"),        _T("[走]"),        _T("[打]"),        _T("㍑"),              _T("㎏"),                      // 0x7D41 - 0x7D48      93/33 - 93/40\r
377                         _T("Hz"),               _T("ha"),               _T("km"),               _T("平方km"), _T("hPa"),              _T("・"),              _T("・"),              _T("1/2"),                      // 0x7D49 - 0x7D50      93/41 - 93/48\r
378                         _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\r
379                         _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\r
380                         _T("曇り"),           _T("雨"),              _T("雪"),              _T("△"),              _T("▲"),              _T("▽"),              _T("▼"),              _T("◆"),                      // 0x7D61 - 0x7D68      93/65 - 93/72\r
381                         _T("・"),              _T("・"),              _T("・"),              _T("◇"),              _T("◎"),              _T("!!"),               _T("!?"),               _T("曇/晴"),          // 0x7D69 - 0x7D70      93/73 - 93/80\r
382                         _T("雨"),              _T("雨"),              _T("雪"),              _T("大雪"),           _T("雷"),              _T("雷雨"),           _T(" "),              _T("・"),                      // 0x7D71 - 0x7D78      93/81 - 93/88\r
383                         _T("・"),              _T("♪"),              _T("℡")                                                                                                                                                                                       // 0x7D79 - 0x7D7B      93/89 - 93/91\r
384                 };\r
385 \r
386         static const TCHAR *aszSymbolsTable4[] =\r
387                 {\r
388                         _T("Ⅰ"),              _T("Ⅱ"),              _T("Ⅲ"),              _T("Ⅳ"),              _T("Ⅴ"),              _T("Ⅵ"),              _T("Ⅶ"),              _T("Ⅷ"),                      // 0x7E21 - 0x7E28      94/01 - 94/08\r
389                         _T("Ⅸ"),              _T("Ⅹ"),              _T("XI"),               _T("XⅡ"),             _T("⑰"),              _T("⑱"),              _T("⑲"),              _T("⑳"),                      // 0x7E29 - 0x7E30      94/09 - 94/16\r
390                         _T("(1)"),              _T("(2)"),              _T("(3)"),              _T("(4)"),              _T("(5)"),              _T("(6)"),              _T("(7)"),              _T("(8)"),                      // 0x7E31 - 0x7E38      94/17 - 94/24\r
391                         _T("(9)"),              _T("(10)"),             _T("(11)"),             _T("(12)"),             _T("(21)"),             _T("(22)"),             _T("(23)"),             _T("(24)"),                     // 0x7E39 - 0x7E40      94/25 - 94/32\r
392                         _T("(A)"),              _T("(B)"),              _T("(C)"),              _T("(D)"),              _T("(E)"),              _T("(F)"),              _T("(G)"),              _T("(H)"),                      // 0x7E41 - 0x7E48      94/33 - 94/40\r
393                         _T("(I)"),              _T("(J)"),              _T("(K)"),              _T("(L)"),              _T("(M)"),              _T("(N)"),              _T("(O)"),              _T("(P)"),                      // 0x7E49 - 0x7E50      94/41 - 94/48\r
394                         _T("(Q)"),              _T("(R)"),              _T("(S)"),              _T("(T)"),              _T("(U)"),              _T("(V)"),              _T("(W)"),              _T("(X)"),                      // 0x7E51 - 0x7E58      94/49 - 94/56\r
395                         _T("(Y)"),              _T("(Z)"),              _T("(25)"),             _T("(26)"),             _T("(27)"),             _T("(28)"),             _T("(29)"),             _T("(30)"),                     // 0x7E59 - 0x7E60      94/57 - 94/64\r
396                         _T("①"),              _T("②"),              _T("③"),              _T("④"),              _T("⑤"),              _T("⑥"),              _T("⑦"),              _T("⑧"),                      // 0x7E61 - 0x7E68      94/65 - 94/72\r
397                         _T("⑨"),              _T("⑩"),              _T("⑪"),              _T("⑫"),              _T("⑬"),              _T("⑭"),              _T("⑮"),              _T("⑯"),                      // 0x7E69 - 0x7E70      94/73 - 94/80\r
398                         _T("①"),              _T("②"),              _T("③"),              _T("④"),              _T("⑤"),              _T("⑥"),              _T("⑦"),              _T("⑧"),                      // 0x7E71 - 0x7E78      94/81 - 94/88\r
399                         _T("⑨"),              _T("⑩"),              _T("⑪"),              _T("⑫"),              _T("(31)")                                                                                                                      // 0x7E79 - 0x7E7D      94/89 - 94/93\r
400                 };\r
401 \r
402         // シンボルを変換する\r
403         if((wCode >= 0x7A50U) && (wCode <= 0x7A74U)){\r
404                 strcpy(lpszDst, aszSymbolsTable1[wCode - 0x7A50U]);\r
405         }\r
406         else if((wCode >= 0x7C21U) && (wCode <= 0x7C7BU)){\r
407                 strcpy(lpszDst, aszSymbolsTable2[wCode - 0x7C21U]);\r
408         }\r
409         else if((wCode >= 0x7D21U) && (wCode <= 0x7D7BU)){\r
410                 strcpy(lpszDst, aszSymbolsTable3[wCode - 0x7D21U]);\r
411         }\r
412         else if((wCode >= 0x7E21U) && (wCode <= 0x7E7DU)){\r
413                 strcpy(lpszDst, aszSymbolsTable4[wCode - 0x7E21U]);\r
414         }\r
415         else{\r
416                 strcpy(lpszDst, TEXT("・"));\r
417         }\r
418 \r
419         return strlen(lpszDst);\r
420 }\r
421 \r
422 void ProcessEscapeSeq(const BYTE byCode)\r
423 {\r
424         // エスケープシーケンス処理\r
425         switch(m_byEscSeqCount){\r
426                 // 1バイト目\r
427         case 1U :\r
428                 switch(byCode){\r
429                         // Invocation of code elements\r
430                 case 0x6EU      : LockingShiftGL(2U);   m_byEscSeqCount = 0U;   return;         // LS2\r
431                 case 0x6FU      : LockingShiftGL(3U);   m_byEscSeqCount = 0U;   return;         // LS3\r
432                 case 0x7EU      : LockingShiftGR(1U);   m_byEscSeqCount = 0U;   return;         // LS1R\r
433                 case 0x7DU      : LockingShiftGR(2U);   m_byEscSeqCount = 0U;   return;         // LS2R\r
434                 case 0x7CU      : LockingShiftGR(3U);   m_byEscSeqCount = 0U;   return;         // LS3R\r
435 \r
436                         // Designation of graphic sets\r
437                 case 0x24U      :       \r
438                 case 0x28U      : m_byEscSeqIndex = 0U;         break;\r
439                 case 0x29U      : m_byEscSeqIndex = 1U;         break;\r
440                 case 0x2AU      : m_byEscSeqIndex = 2U;         break;\r
441                 case 0x2BU      : m_byEscSeqIndex = 3U;         break;\r
442                 default         : m_byEscSeqCount = 0U;         return;         // エラー\r
443                 }\r
444                 break;\r
445 \r
446                 // 2バイト目\r
447         case 2U :\r
448                 if(DesignationGSET(m_byEscSeqIndex, byCode)){\r
449                         m_byEscSeqCount = 0U;\r
450                         return;\r
451                 }\r
452                         \r
453                 switch(byCode){\r
454                 case 0x20       : m_bIsEscSeqDrcs = true;       break;\r
455                 case 0x28       : m_bIsEscSeqDrcs = true;       m_byEscSeqIndex = 0U;   break;\r
456                 case 0x29       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 1U;   break;\r
457                 case 0x2A       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 2U;   break;\r
458                 case 0x2B       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 3U;   break;\r
459                 default         : m_byEscSeqCount = 0U;         return;         // エラー\r
460                 }\r
461                 break;\r
462 \r
463                 // 3バイト目\r
464         case 3U :\r
465                 if(!m_bIsEscSeqDrcs){\r
466                         if(DesignationGSET(m_byEscSeqIndex, byCode)){\r
467                                 m_byEscSeqCount = 0U;\r
468                                 return;\r
469                         }\r
470                 }\r
471                 else{\r
472                         if(DesignationDRCS(m_byEscSeqIndex, byCode)){\r
473                                 m_byEscSeqCount = 0U;\r
474                                 return;\r
475                         }\r
476                 }\r
477 \r
478                 if(byCode == 0x20U){\r
479                         m_bIsEscSeqDrcs = true;\r
480                 }\r
481                 else{\r
482                         // エラー\r
483                         m_byEscSeqCount = 0U;\r
484                         return;\r
485                 }\r
486                 break;\r
487 \r
488                 // 4バイト目\r
489         case 4U :\r
490                 DesignationDRCS(m_byEscSeqIndex, byCode);\r
491                 m_byEscSeqCount = 0U;\r
492                 return;\r
493         }\r
494 \r
495         m_byEscSeqCount++;\r
496 }\r
497 \r
498 void LockingShiftGL(const BYTE byIndexG)\r
499 {\r
500         // LSx\r
501         m_pLockingGL = &m_CodeG[byIndexG];\r
502 }\r
503 \r
504 void LockingShiftGR(const BYTE byIndexG)\r
505 {\r
506         // LSxR\r
507         m_pLockingGR = &m_CodeG[byIndexG];\r
508 }\r
509 \r
510 void SingleShiftGL(const BYTE byIndexG)\r
511 {\r
512         // SSx\r
513         m_pSingleGL  = &m_CodeG[byIndexG];\r
514 }\r
515 \r
516 const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)\r
517 {\r
518         // Gのグラフィックセットを割り当てる\r
519         switch(byCode){\r
520         case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji\r
521         case 0x4AU      : m_CodeG[byIndexG] = CODE_ALPHANUMERIC;                return true;    // Alphanumeric\r
522         case 0x30U      : m_CodeG[byIndexG] = CODE_HIRAGANA;                    return true;    // Hiragana\r
523         case 0x31U      : m_CodeG[byIndexG] = CODE_KATAKANA;                    return true;    // Katakana\r
524         case 0x32U      : m_CodeG[byIndexG] = CODE_MOSAIC_A;                    return true;    // Mosaic A\r
525         case 0x33U      : m_CodeG[byIndexG] = CODE_MOSAIC_B;                    return true;    // Mosaic B\r
526         case 0x34U      : m_CodeG[byIndexG] = CODE_MOSAIC_C;                    return true;    // Mosaic C\r
527         case 0x35U      : m_CodeG[byIndexG] = CODE_MOSAIC_D;                    return true;    // Mosaic D\r
528         case 0x36U      : m_CodeG[byIndexG] = CODE_PROP_ALPHANUMERIC;   return true;    // Proportional Alphanumeric\r
529         case 0x37U      : m_CodeG[byIndexG] = CODE_PROP_HIRAGANA;               return true;    // Proportional Hiragana\r
530         case 0x38U      : m_CodeG[byIndexG] = CODE_PROP_KATAKANA;               return true;    // Proportional Katakana\r
531         case 0x49U      : m_CodeG[byIndexG] = CODE_JIS_X0201_KATAKANA;  return true;    // JIS X 0201 Katakana\r
532         case 0x39U      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_1;   return true;    // JIS compatible Kanji Plane 1\r
533         case 0x3AU      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_2;   return true;    // JIS compatible Kanji Plane 2\r
534         case 0x3BU      : m_CodeG[byIndexG] = CODE_ADDITIONAL_SYMBOLS;  return true;    // Additional symbols\r
535         default         : return false;         // 不明なグラフィックセット\r
536         }\r
537 }\r
538 \r
539 const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)\r
540 {\r
541         // DRCSのグラフィックセットを割り当てる\r
542         switch(byCode){\r
543         case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0\r
544         case 0x41U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-1\r
545         case 0x42U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-2\r
546         case 0x43U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-3\r
547         case 0x44U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-4\r
548         case 0x45U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-5\r
549         case 0x46U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-6\r
550         case 0x47U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-7\r
551         case 0x48U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-8\r
552         case 0x49U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-9\r
553         case 0x4AU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-10\r
554         case 0x4BU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-11\r
555         case 0x4CU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-12\r
556         case 0x4DU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-13\r
557         case 0x4EU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-14\r
558         case 0x4FU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-15\r
559         case 0x70U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // Macro\r
560         default         : return false;         // 不明なグラフィックセット\r
561         }\r
562 }\r
563 \r
564 WORD convertjis(DWORD jiscode) {\r
565         // 自前で書き直し\r
566         int hi = (jiscode >> 8) & 0xFF;\r
567         int lo = (jiscode >> 0) & 0xFF;\r
568         hi -= 0x21;\r
569         // 下位バイトの処理\r
570         if ( hi & 1 )\r
571                 lo += 0x7E;\r
572         else\r
573         {\r
574                 lo += 0x1F;\r
575                 if ( 0x7F <= lo && lo <= 0x9D )\r
576                         lo++;\r
577         }\r
578         // 上位バイトの処理\r
579         hi >>= 1;                               // 上位7ビットを取り出す\r
580         if ( hi <= 0x1E )\r
581                 hi += 0x81;\r
582         else\r
583                 hi += 0xC1;\r
584 \r
585         return ((hi&0xFF) << 8) | (lo & 0xFF);\r
586 }\r
587 \r
588 \r