00001
00002
00003
00004
00005 #include "transcode_data.h"
00006
00007
00008
00009 static const unsigned char
00010 japanese_byte_array[895] = {
00011 #define eucjp2sjis_8E_offsets 0
00012 161, 254,
00013 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00014 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00015 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00016 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
00017 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00018 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00019
00020 #define eucjp2sjis_8F_A1toFE_offsets 96
00021 161, 254,
00022 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00023 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00024 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00025 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00026 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00027 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00028
00029 #define eucjp2sjis_offsets 192
00030 0, 254,
00031 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00032 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00033 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00034 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00035 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00036 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00037 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00038 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00039 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
00040 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00041 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00042 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00043 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00044 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00045 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00046 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00047
00048 #define sjis2eucjp_81to9F_offsets 449
00049 64, 252,
00050 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00051 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00052 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00053 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
00054 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00055 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00056 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00057 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00058 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00059 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00060 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00061 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00062
00063 #define sjis2eucjp_offsets 640
00064 0, 252,
00065 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00066 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00067 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00068 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00069 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00070 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00071 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00072 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00073 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00074 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00075 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
00076 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
00077 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
00078 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
00079 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00080 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
00081
00082 };
00083 static const unsigned int
00084 japanese_word_array[35] = {
00085 #define eucjp2sjis_8E_infos WORDINDEX2INFO(0)
00086 INVALID, FUNso, UNDEF,
00087
00088 #define eucjp2sjis_8E WORDINDEX2INFO(3)
00089 eucjp2sjis_8E_offsets,
00090 eucjp2sjis_8E_infos,
00091
00092 #define eucjp2sjis_8F_A1toFE_infos WORDINDEX2INFO(5)
00093 INVALID, UNDEF,
00094
00095 #define eucjp2sjis_8F_A1toFE WORDINDEX2INFO(7)
00096 eucjp2sjis_8F_A1toFE_offsets,
00097 eucjp2sjis_8F_A1toFE_infos,
00098
00099 #define eucjp2sjis_8F_infos WORDINDEX2INFO(9)
00100 INVALID, eucjp2sjis_8F_A1toFE,
00101
00102 #define eucjp2sjis_8F WORDINDEX2INFO(11)
00103 eucjp2sjis_8F_A1toFE_offsets,
00104 eucjp2sjis_8F_infos,
00105
00106 #define eucjp2sjis_A1toFE_infos WORDINDEX2INFO(13)
00107 INVALID, FUNso,
00108
00109 #define eucjp2sjis_A1toFE WORDINDEX2INFO(15)
00110 eucjp2sjis_8F_A1toFE_offsets,
00111 eucjp2sjis_A1toFE_infos,
00112
00113 #define eucjp2sjis_infos WORDINDEX2INFO(17)
00114 NOMAP, INVALID,
00115 eucjp2sjis_8E, eucjp2sjis_8F,
00116 eucjp2sjis_A1toFE,
00117
00118 #define eucjp2sjis WORDINDEX2INFO(22)
00119 eucjp2sjis_offsets,
00120 eucjp2sjis_infos,
00121
00122 #define sjis2eucjp_81to9F WORDINDEX2INFO(24)
00123 sjis2eucjp_81to9F_offsets,
00124 eucjp2sjis_A1toFE_infos,
00125
00126 #define sjis2eucjp_F0toFC WORDINDEX2INFO(26)
00127 sjis2eucjp_81to9F_offsets,
00128 eucjp2sjis_8F_A1toFE_infos,
00129
00130 #define sjis2eucjp_infos WORDINDEX2INFO(28)
00131 NOMAP, INVALID,
00132 sjis2eucjp_81to9F, FUNso,
00133 sjis2eucjp_F0toFC,
00134
00135 #define sjis2eucjp WORDINDEX2INFO(33)
00136 sjis2eucjp_offsets,
00137 sjis2eucjp_infos,
00138
00139 };
00140 #define TRANSCODE_TABLE_INFO japanese_byte_array, 895, japanese_word_array, 35, ((int)sizeof(unsigned int))
00141
00142
00143 static ssize_t
00144 fun_so_eucjp2sjis(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize)
00145 {
00146 if (s[0] == 0x8e) {
00147 o[0] = s[1];
00148 return 1;
00149 }
00150 else {
00151 int h, m, l;
00152 m = s[0] & 1;
00153 h = (s[0]+m) >> 1;
00154 h += s[0] < 0xdf ? 0x30 : 0x70;
00155 l = s[1] - m * 94 - 3;
00156 if (0x7f <= l)
00157 l++;
00158 o[0] = h;
00159 o[1] = l;
00160 return 2;
00161 }
00162 }
00163
00164 static ssize_t
00165 fun_so_sjis2eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize)
00166 {
00167 if (l == 1) {
00168 o[0] = '\x8e';
00169 o[1] = s[0];
00170 return 2;
00171 }
00172 else {
00173 int h, l;
00174 h = s[0];
00175 l = s[1];
00176 if (0xe0 <= h)
00177 h -= 64;
00178 l += l < 0x80 ? 0x61 : 0x60;
00179 h = h * 2 - 0x61;
00180 if (0xfe < l) {
00181 l -= 94;
00182 h += 1;
00183 }
00184 o[0] = h;
00185 o[1] = l;
00186 return 2;
00187 }
00188 }
00189
00190 static const rb_transcoder
00191 rb_eucjp2sjis = {
00192 "EUC-JP", "Shift_JIS", eucjp2sjis,
00193 TRANSCODE_TABLE_INFO,
00194 1,
00195 3,
00196 2,
00197 asciicompat_converter,
00198 0, NULL, NULL,
00199 NULL, NULL, NULL, fun_so_eucjp2sjis
00200 };
00201
00202 static const rb_transcoder
00203 rb_sjis2eucjp = {
00204 "Shift_JIS", "EUC-JP", sjis2eucjp,
00205 TRANSCODE_TABLE_INFO,
00206 1,
00207 2,
00208 2,
00209 asciicompat_converter,
00210 0, NULL, NULL,
00211 NULL, NULL, NULL, fun_so_sjis2eucjp
00212 };
00213
00214 void
00215 Init_japanese(void)
00216 {
00217 rb_register_transcoder(&rb_eucjp2sjis);
00218 rb_register_transcoder(&rb_sjis2eucjp);
00219 }
00220
00221