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