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
|
--- ./src/japanese_tag.c.orig Fri Jan 5 00:35:31 2001
+++ ./src/japanese_tag.c Fri Jan 4 05:58:49 2002
@@ -64,6 +64,16 @@
*p2 -= cellOffset;
}
+static void _sjis_rev_shift(int *p1, int *p2)
+{
+ unsigned char c1 = *p1;
+ unsigned char c2 = *p2;
+ int rowOffset = c1 < 95 ? 112 : 176;
+ int cellOffset = c1 % 2 ? (c2 > 95 ? 32 : 31) : 126;
+ *p1 = ((c1 + 1) >> 1) + rowOffset;
+ *p2 += cellOffset;
+}
+
static unsigned char *_skip_esc(unsigned char *str, int *esc_in)
{
int c;
@@ -139,6 +149,36 @@
*str2 = '\0';
}
+static void _euc2shift(unsigned char const *str, unsigned char *str2)
+{
+ int p1,p2;
+
+ while ((p1 = (int)*str) != '\0') {
+ /* SB-SJIS with SS2 */
+ if (p1 == 0x8e) {
+ if((p2 = (int)*(++str)) == '\0') break;
+ CHAROUT(p1);
+ str++;
+ continue;
+ }
+
+ if ( (p1 >= 161) && ( p1 <= 254) ) {
+ if ((p2 = (int)*(++str)) == '\0') break;
+ if ( (p2 >= 161) && ( p2 <= 254) ) {
+ p1 -= 128, p2 -= 128;
+ _sjis_rev_shift(&p1,&p2);
+ }
+ CHAROUT(p1);
+ CHAROUT(p2);
+ str++;
+ continue;
+ }
+ CHAROUT(p1);
+ str++;
+ }
+ *str2='\0';
+}
+
static int _detect(unsigned char *str, int expected)
{
register int c;
@@ -313,6 +353,22 @@
ret = g_strdup(buf);
g_free(buf);
+ return ret;
+}
+
+char *to_string_sjis_from_euc(char const *str)
+{
+ char *buf, *ret;
+
+ if(!str) return (NULL);
+
+ buf = (char*)g_malloc(strlen(str)*2 + 1);
+ if (!buf) return NULL;
+
+ _euc2shift((unsigned char *)str, (unsigned char *)buf);
+
+ ret = strdup(buf);
+ free(buf);
return ret;
}
|