File Coverage

jis.c
Criterion Covered Total %
statement 102 123 82.9
branch 116 242 47.9
condition n/a
subroutine n/a
pod n/a
total 218 365 59.7


line stmt bran cond sub pod time code
1              
2             /* $Id: jis.c 5403 2008-02-01 05:06:12Z hio $ */
3              
4             #include "Japanese.h"
5             #include "sjis.h"
6              
7             #include
8              
9             #define S2J_DISP 0
10             #define J2S_DISP 0
11              
12             #if S2J_DISP
13             #define ECHO_S2J(arg) fprintf arg
14             #define ON_S2J(cmd) cmd
15             #else
16             #define ECHO_S2J(arg)
17             #define ON_S2J(cmd)
18             #endif
19             #if J2S_DISP
20             #define ECHO_J2S(arg) fprintf arg
21             #define ON_J2S(cmd) cmd
22             #else
23             #define ECHO_J2S(arg)
24             #define ON_J2S(cmd)
25             #endif
26              
27             /*
28             # JIS C 6226-1979 \e$@
29             # JIS X 0208-1983 \e$B
30             # JIS X 0208-1990 \e&@\e$B
31             # JIS X 0212-1990 \e$(D
32             */
33              
34             #define JIS_C6226_1979 ((const unsigned char*)"\x1b$@")
35             #define JIS_X0208_1983 ((const unsigned char*)"\x1b$B")
36             #define JIS_X0208_1990 ((const unsigned char*)"\x1b&@\x1b$B")
37             #define JIS_X0212_1990 ((const unsigned char*)"\x1b$(D")
38              
39             #define JIS_ASC ((const unsigned char*)"\x1b(B")
40             #define JIS_ROMAN ((const unsigned char*)"\x1b(J")
41             #define JIS_KANA ((const unsigned char*)"\x1b(I")
42              
43             #define JIS_C6226_1979_LEN 3
44             #define JIS_X0208_1983_LEN 3
45             #define JIS_X0208_1990_LEN 6
46             #define JIS_X0212_1990_LEN 4
47              
48             #define JIS_ASC_LEN 3
49             #define JIS_ROMAN_LEN 3
50             #define JIS_KANA_LEN 3
51              
52             /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
53             /* sjis=>jisÊÑ´¹ */
54             EXTERN_C
55             SV*
56 64           xs_sjis_jis(SV* sv_str)
57             {
58             unsigned char* src;
59             STRLEN len;
60             SV_Buf result;
61             int esc_asc;
62             const unsigned char* src_end;
63              
64 64 50         if( sv_str==&PL_sv_undef )
65             {
66 0           return newSVsv(&PL_sv_undef);
67             }
68 64 50         if( SvGMAGICAL(sv_str) )
69             {
70 0           mg_get(sv_str);
71             }
72 64 50         if( !SvOK(sv_str) )
73             {
74 0           return newSVsv(&PL_sv_undef);
75             }
76            
77 64           src = (unsigned char*)SvPV(sv_str, len);
78             ECHO_S2J((stderr,"Unicode::Japanese::(xs)sjis_jis, len:%d\n",len));
79             ON_S2J(bin_dump("in ",src,len));
80 64 50         SV_Buf_init(&result,len+8);
    50          
81 64           esc_asc = 1;
82 64           src_end = src+len;
83              
84 129 100         while( src
85             {
86             ECHO_S2J((stderr, "switch: %02x : %d\n", *src, chk_sjis[*src]));
87 65           switch(chk_sjis[*src])
88             {
89 2           case CHK_SJIS_THROUGH:
90             { /* SJIS:THROUGH => JIS:ASCII */
91             const unsigned char* begin;
92 2 100         if( !esc_asc )
93             {
94 1 50         SV_Buf_append_mem(&result,JIS_ASC,JIS_ASC_LEN);
    0          
    0          
95 1           esc_asc = 1;
96             }
97             #if TEST && S2J_DISP
98             fprintf(stderr," (throuh) %c[%02x]",*src,*src);
99             fflush(stderr);
100             #endif
101 2           begin = src;
102 11 100         while( ++src
    50          
103             {
104             #if TEST && S2J_DISP
105             fprintf(stderr," %c[%02x]",*src,*src);
106             fflush(stderr);
107             #endif
108             }
109             #if TEST && S2J_DISP
110             fprintf(stderr,"\n");
111             fflush(stderr);
112             #endif
113 2 50         SV_Buf_append_mem(&result,begin,src-begin);
    0          
    0          
114 2           break;
115             }
116 63           case CHK_SJIS_C:
117             {
118 63 50         SV_Buf_append_mem(&result,JIS_X0208_1983,JIS_X0208_1983_LEN);
    0          
    0          
119 63           esc_asc = 0;
120             ECHO_S2J((stderr," (sjis:c)"));
121             do
122             {
123             union {
124             UJ_UINT16 u16_val;
125             UJ_UINT8 u8_val[2];
126             } tmp;
127             ECHO_S2J((stderr, "%c%c[%02x.%02x]",src[0],src[1],src[0],src[1]));
128 64 50         if( src[1]<0x40 || 0xfc
    50          
    50          
129             {
130             ECHO_S2J((stderr, "*"));
131 0 0         SV_Buf_append_mem(&result,UNDEF_JIS,UNDEF_JIS_LEN);
    0          
    0          
132 0           ++src;
133 0           break;
134             }
135 64 100         if( 0x9f <= src[1] )
136             {
137 26 100         tmp.u8_val[0] = src[0]*2 - (src[0]>=0xe0 ? 0xe0 : 0x60);
138 26           tmp.u8_val[1] = src[1] + 2;
139             }else
140             {
141 38 100         tmp.u8_val[0] = src[0]*2 - (src[0]>=0xe0 ? 0xe1 : 0x61);
142 38           tmp.u8_val[1] = src[1] + 0x60 + (src[1] < 0x7f);
143             }
144 64           tmp.u8_val[0] &= 0x7f;
145 64           tmp.u8_val[1] &= 0x7f;
146 64 50         SV_Buf_append_ch2(&result, tmp.u16_val);
    0          
    0          
147 64           src += 2;
148 64 100         }while( src
    100          
149             ECHO_S2J((stderr,"\n"));
150 63           break;
151             }
152 0           case CHK_SJIS_KANA:
153             { /* SJIS:KANA => JIS:KANA */
154 0 0         SV_Buf_append_mem(&result,JIS_KANA,JIS_KANA_LEN);
    0          
    0          
155 0           esc_asc = 0;
156             #if TEST && S2J_DISP
157             fprintf(stderr," (sjis:kana)");
158             fflush(stderr);
159             #endif
160             do
161             {
162             #if TEST && S2J_DISP
163             fprintf(stderr," %02x",*src);
164             fflush(stderr);
165             #endif
166 0 0         SV_Buf_append_ch(&result,*src&0x7f);
    0          
    0          
167 0 0         }while( ++src
    0          
168             #if TEST && S2J_DISP
169             fprintf(stderr,"\n");
170             #endif
171 0           break;
172             }
173 0           default:
174             {
175             #ifdef TEST
176             fprintf(stderr,"xs_sjis_eucjp, unknown check-code[%02x] on char-code[%05x]\n",chk_sjis[*src],*src);
177             #endif
178 0 0         SV_Buf_append_ch(&result,*src);
    0          
    0          
179 0           ++src;
180             }
181             } /*switch */
182             } /*while */
183              
184 64 100         if( !esc_asc )
185             {
186 62 50         SV_Buf_append_mem(&result,JIS_ASC,JIS_ASC_LEN);
    0          
    0          
187             }
188             /* bin_dump("out",SV_Buf_getBegin(&result),SV_Buf_getLength(&result)); */
189 64           SV_Buf_setLength(&result);
190              
191 64           return SV_Buf_getSv(&result);
192             }
193              
194             /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
195             /* jis=>sjisÊÑ´¹ */
196             EXTERN_C
197             SV*
198 29           xs_jis_sjis(SV* sv_str)
199             {
200             unsigned char* src;
201             STRLEN len;
202             SV_Buf result;
203             const unsigned char* src_end;
204              
205 29 50         if( sv_str==&PL_sv_undef )
206             {
207 0           return newSVsv(&PL_sv_undef);
208             }
209 29 50         if( SvGMAGICAL(sv_str) )
210             {
211 0           mg_get(sv_str);
212             }
213 29 50         if( !SvOK(sv_str) )
214             {
215 0           return newSVsv(&PL_sv_undef);
216             }
217            
218 29           src = (unsigned char*)SvPV(sv_str, len);
219             ECHO_J2S((stderr,"Unicode::Japanese::(xs)jis_sjis, len:%d\n",len));
220             ON_J2S(bin_dump("in ",src,len));
221 29 50         SV_Buf_init(&result,len);
    50          
222 29           src_end = src+len;
223            
224 29 50         if( len!=0 && *src!='\x1b' )
    50          
225             {
226 0           const unsigned char* begin = src;
227 0 0         while( ++src
    0          
228             {
229             }
230 0 0         SV_Buf_append_mem(&result,begin,src-begin);
    0          
    0          
231             }
232 87 100         while( src
233             {
234             ECHO_J2S((stderr," len: %d\n",src_end-src));
235 58 50         if( src_end-src>=JIS_ASC_LEN && memcmp(src,JIS_ASC,JIS_ASC_LEN)==0 )
    100          
236 25           { /* <> */
237             const unsigned char* begin;
238             /*fprintf(stderr," \n"); */
239 25           src += JIS_ASC_LEN;
240 25           begin = src;
241 43 100         while( src
    100          
242             {
243 18           ++src;
244             }
245 25 100         if( src!=begin )
246             {
247 5 50         SV_Buf_append_mem(&result,begin,src-begin);
    0          
    0          
248             }
249 33 50         }else if( src_end-src>=JIS_ROMAN_LEN && memcmp(src,JIS_ROMAN,JIS_ROMAN_LEN)==0 )
    100          
250 1           { /* <> */
251             const unsigned char* begin;
252             /*fprintf(stderr," \n"); */
253 1           src += JIS_ROMAN_LEN;
254 1           begin = src;
255 7 50         while( src
    100          
256             {
257 6           ++src;
258             }
259 1 50         if( src!=begin )
260             {
261 1 50         SV_Buf_append_mem(&result,begin,src-begin);
    0          
    0          
262             }
263 32 50         }else if( src_end-src>=JIS_KANA_LEN && memcmp(src,JIS_KANA,JIS_KANA_LEN)==0 )
    100          
264             { /* <> */
265             /*fprintf(stderr," \n"); */
266 2           src += JIS_KANA_LEN;
267 14 50         while( src
    100          
268             {
269 12 50         SV_Buf_append_ch(&result,*src|0x80);
    0          
    0          
270 12           ++src;
271             }
272 30 50         }else if( (src_end-src>=JIS_X0208_1983_LEN && memcmp(src,JIS_X0208_1983,JIS_X0208_1983_LEN)==0)
    100          
273 11 100         || (src_end-src>=JIS_X0208_1990_LEN && memcmp(src,JIS_X0208_1990,JIS_X0208_1990_LEN)==0)
    100          
274 10 50         || (src_end-src>=JIS_C6226_1979_LEN && memcmp(src,JIS_C6226_1979,JIS_C6226_1979_LEN)==0)
    100          
275             )
276             { /* <> */
277             ECHO_J2S((stderr," ");fflush(stderr));
278 21 100         src += src[1]!='&' ? 3 : 6;
279 43 50         while( src
280             {
281             union {
282             UJ_UINT16 u16_val;
283             UJ_UINT8 u8_val[2];
284             } tmp;
285 45 100         if( *src=='\x1b' ) break;
286             ECHO_J2S((stderr," %02x",src[0]);fflush(stderr));
287 24 100         if( *src>=0x21 && *src<0x7e )
    50          
288             {}else
289             {
290             ECHO_J2S((stderr,"+");fflush(stderr));
291             break;
292             }
293 22 50         if( src+1==src_end || src[1]=='\x1b' )
    50          
294             {
295             ECHO_J2S((stderr,"*");fflush(stderr));
296             break;
297             }
298             ECHO_J2S((stderr," %02x",src[0]);fflush(stderr));
299 22           tmp.u8_val[0] = src[0] | 0x80;
300 22           tmp.u8_val[1] = src[1] | 0x80;
301 22 100         if( src[0]%2 )
302             {
303 17 100         tmp.u8_val[0] = (tmp.u8_val[0]>>1) + (tmp.u8_val[0] < 0xdf ? 0x31 : 0x71);
304 17 100         tmp.u8_val[1] = tmp.u8_val[1] - ( 0x60 + (tmp.u8_val[1] < 0xe0) );
305             }else
306             {
307 5 100         tmp.u8_val[0] = (tmp.u8_val[0]>>1) + (tmp.u8_val[0] < 0xdf ? 0x30 : 0x70);
308 5           tmp.u8_val[1] = tmp.u8_val[1] - 2;
309             }
310 22 50         SV_Buf_append_ch2(&result, tmp.u16_val);
    0          
    0          
311 22           src += 2;
312             }
313             ECHO_J2S((stderr,"\n"));
314 9 100         }else if( src_end-src>=JIS_X0212_1990_LEN && memcmp(src,JIS_X0212_1990,JIS_X0212_1990_LEN)==0 )
    100          
315 1           { /* <> */
316             const unsigned char* begin;
317             int i;
318             ECHO_J2S((stderr," ");fflush(stderr));
319 1           src += JIS_X0212_1990_LEN;
320 1           begin = src;
321 3 50         while( src
    100          
322             {
323 2           ++src;
324             }
325 2 100         for( i=0; i<(src-begin)/2; ++i )
326             {
327 1 50         SV_Buf_append_mem(&result,UNDEF_SJIS,UNDEF_SJIS_LEN);
    0          
    0          
328             }
329 8 100         }else if( src[0]!='\x1b') /* !='\e' */
330             { /* <> */
331             const unsigned char* begin;
332             ECHO_J2S((stderr," ");fflush(stderr));
333 5           begin = src;
334 22 100         while( src
    50          
335             {
336 17           ++src;
337             }
338 5 50         if( src!=begin )
339             {
340 5 100         SV_Buf_append_mem(&result,begin,src-begin);
    50          
    50          
341             }
342             }else
343             { /* <> */
344             ECHO_J2S((stderr," ");fflush(stderr));
345 3 50         SV_Buf_append_ch(&result,*src);
    0          
    0          
346 3           ++src;
347             }
348             } /*while */
349              
350             ON_J2S(bin_dump("out",SV_Buf_getBegin(&result), SV_Buf_getLength(&result)));
351 29           SV_Buf_setLength(&result);
352              
353 29           return SV_Buf_getSv(&result);
354             }