blob: b06146436ef6311de9699c6cb6f9f5ef528fee2e (
plain) (
blame)
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
|
--- epic4-0.9.9/source/kanji.c.orig Mon Dec 4 03:44:17 2000
+++ epic4-0.9.9/source/kanji.c Mon Dec 4 03:44:17 2000
@@ -0,0 +1,133 @@
+/* kanji.c */
+#include "kanji.h"
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#define ESC '\033'
+#define KI1 '$'
+#define KI21 'B'
+#define KI22 '@'
+#define KO1 '('
+#define KO21 'B'
+#define KO22 'J'
+#define KO23 'H'
+
+#define EUC2JIS(c) (unsigned char)((c) & 0x7f)
+#define JIS2EUC(c) (char)((c) | 0x80)
+
+/* proto types */
+static int ParseESC(char **jisstr);
+
+/* Euc2Jis : convert euc to jis. */
+/* eucstr : input string (euc) */
+/* jisstr : output string (jis) */
+/* limit : output string limit length */
+int Euc2Jis(unsigned char *eucstr, char *jisstr, int limit)
+{
+ int length, shifted;
+
+ shifted = FALSE;
+
+ while (*eucstr) {
+ length = 0;
+ if(ISKANJI(*eucstr)){
+ if(!shifted){
+ *jisstr++ = ESC;
+ *jisstr++ = KI1;
+ *jisstr++ = KI21;
+ shifted = TRUE;
+ length += 3;
+ }
+ *jisstr++ = EUC2JIS(*eucstr++);
+ *jisstr++ = EUC2JIS(*eucstr++);
+ length += 2;
+ }else{
+ if(shifted){
+ *jisstr++ = ESC;
+ *jisstr++ = KO1;
+ *jisstr++ = KO21;
+ length += 3;
+ shifted = FALSE;
+ }
+ *jisstr++ = *eucstr++;
+ length += 1;
+ }
+
+ limit -= length;
+ if(limit < 4){
+ jisstr -= length;
+ break; /* goto _break_1; */
+ }
+ }
+ _break_1:
+ if (shifted) {
+ *jisstr++ = ESC;
+ *jisstr++ = KO1;
+ *jisstr++ = KO21;
+ }
+ *jisstr = '\0';
+ return 0;
+}
+
+
+/* Jis2Euc : convert jis to euc. */
+/* jisstr : input string (jis) */
+/* eucstr : output string (euc) */
+void Jis2Euc(char *jisstr, unsigned char *eucstr)
+{
+ int shifted;
+ char c;
+ char* bg = eucstr;
+
+ shifted = FALSE;
+
+ while ((c = *jisstr++) != '\0') {
+ if (c == ESC) {
+ shifted = ParseESC(&jisstr);
+ }else{
+ if (shifted) {
+ if (*jisstr) {
+ *eucstr++ = JIS2EUC(c);
+ *eucstr++ = JIS2EUC(*jisstr);
+ jisstr++;
+ }
+ }else{
+ *eucstr++ = c;
+ }
+ }
+ }
+ *eucstr = '\0';
+}
+
+
+/* ParseESC : parse escape code */
+/* input : esc code */
+/* output : ESC $ B / ESC $ @ / ESC $ @ : shifted and skip esc code */
+/* ESC ( B / ESC ( J / ESC ( H : unshifted and skip esc code */
+int ParseESC(char **jisstr)
+{
+ char c1, c2;
+ int shifted;
+ char* pos = *jisstr;
+
+ shifted = FALSE;
+ c1 = *pos++; c2 = c1 ? *pos++ : '\0';
+
+ if (c1 == KO1) {
+ if (c2 == KO21 || c2 == KO22 || c2 == KO23) {
+ *jisstr = pos;
+ }
+ } else if (c1 == KI1) {
+ if (c2 == KI21 || c2 == KI22) {
+ *jisstr = pos;
+ shifted = TRUE;
+ }
+ }
+ return shifted;
+}
|