File Coverage

eucjp.c
Criterion Covered Total %
statement 47 93 50.5
branch 38 130 29.2
condition n/a
subroutine n/a
pod n/a
total 85 223 38.1


line stmt bran cond sub pod time code
1              
2             #include "Japanese.h"
3             #include "sjis.h"
4              
5             #ifdef TEST
6             #define DISP_E2S 0
7             #define DISP_S2E 0
8             #endif
9              
10             /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
11             /* sjis=>eucjp変換 */
12             EXTERN_C
13             SV*
14 2           xs_sjis_eucjp(SV* sv_str)
15             {
16             unsigned char* src;
17             STRLEN len;
18             SV_Buf result;
19             const unsigned char* src_end;
20              
21 2 50         if( sv_str==&PL_sv_undef )
22             {
23 0           return newSVsv(&PL_sv_undef);
24             }
25 2 50         if( SvGMAGICAL(sv_str) )
26             {
27 0           mg_get(sv_str);
28             }
29 2 50         if( !SvOK(sv_str) )
30             {
31 0           return newSVsv(&PL_sv_undef);
32             }
33            
34 2           src = (unsigned char*)SvPV(sv_str, len);
35             /*fprintf(stderr,"Unicode::Japanese::(xs)sjis_eucjp\n",len); */
36             /*bin_dump("in ",src,len); */
37 2 50         if( len == 0 )
38             {
39 0           return newSVsv(&PL_sv_undef);
40             }
41 2 50         SV_Buf_init(&result,len);
    50          
42 2           src_end = src+len;
43              
44 4 100         while( src
45             {
46 2           switch(chk_sjis[*src])
47             {
48 1           case CHK_SJIS_THROUGH:
49 1           {
50 1           const unsigned char* start = src;
51 7 100         while( ++src
    50          
52             ;
53 1 50         SV_Buf_append_mem(&result,start,src-start);
    50          
    50          
54 1           continue;
55             }
56 1           case CHK_SJIS_C:
57             {
58 1 50         if( src+2-1
    50          
    50          
    50          
59 1           {
60             union {
61             UJ_UINT16 u16_val;
62             UJ_UINT8 u8_val[2];
63             } tmp;
64 1 50         if( 0x9f <= src[1] )
65             {
66 1 50         tmp.u8_val[0] = src[0]*2 - (src[0]>=0xe0 ? 0xe0 : 0x60);
67 1           tmp.u8_val[1] = src[1] + 2;
68             }else
69             {
70 0 0         tmp.u8_val[0] = src[0]*2 - (src[0]>=0xe0 ? 0xe1 : 0x61);
71 0           tmp.u8_val[1] = src[1] + 0x60 + (src[1] < 0x7f);
72             }
73 1 50         SV_Buf_append_ch2(&result, tmp.u16_val);
    50          
    50          
74 1           src += 2;
75 1           continue;
76             }
77 0           break;
78             }
79 0           case CHK_SJIS_KANA:
80 0           {
81             union {
82             UJ_UINT16 u16_val;
83             UJ_UINT8 u8_val[2];
84             } tmp;
85 0           tmp.u8_val[0] = 0x8e;
86 0           tmp.u8_val[1] = src[0];
87 0 0         SV_Buf_append_ch2(&result, tmp.u16_val);
    0          
    0          
88 0           ++src;
89 0           continue;
90             }
91 0           default:
92             {
93             #ifdef TEST
94             fprintf(stderr,"xs_sjis_eucjp: invalid value [%02x] at chk_sjis[%05x]\n",chk_sjis[*src],*src);
95             #endif
96 0 0         SV_Buf_append_ch(&result,*src);
    0          
    0          
97 0           ++src;
98             }
99             } /*switch */
100              
101             /* invalid char */
102 0 0         SV_Buf_append_ch(&result,*src);
    0          
    0          
103 0           ++src;
104              
105             } /*while */
106              
107             /*bin_dump("out",result.getBegin(),result.getLength()); */
108 2           SV_Buf_setLength(&result);
109              
110 2           return SV_Buf_getSv(&result);
111             }
112              
113             /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
114             /* eucjp=>sjis変換文字判定 */
115             /* 1:EUCJP:0212, 3:EUCJP:C 4:EUCJP:KANA */
116             #define CHK_EUCJP_THROUGH 0
117             #define CHK_EUCJP_0212 1
118             #define CHK_EUCJP_C 3
119             #define CHK_EUCJP_KANA 4
120             static const unsigned char chk_eucjp[256] =
121             {
122             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0 */
123             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1 */
124             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2 */
125             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3 */
126             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4 */
127             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5 */
128             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6 */
129             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7 */
130             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, /* 8 */
131             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9 */
132             0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* a */
133             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* b */
134             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* c */
135             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* d */
136             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* e */
137             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, /* f */
138             };
139              
140             /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
141             /* eucjp=>sjis変換 */
142             EXTERN_C
143             SV*
144 1           xs_eucjp_sjis(SV* sv_str)
145             {
146             unsigned char* src;
147             STRLEN len;
148             SV_Buf result;
149             const unsigned char* src_end;
150              
151 1 50         if( sv_str==&PL_sv_undef )
152             {
153 0           return newSVsv(&PL_sv_undef);
154             }
155 1 50         if( SvGMAGICAL(sv_str) )
156             {
157 0           mg_get(sv_str);
158             }
159 1 50         if( !SvOK(sv_str) )
160             {
161 0           return newSVsv(&PL_sv_undef);
162             }
163            
164 1           src = (unsigned char*)SvPV(sv_str, len);
165             #if DISP_E2S
166             fprintf(stderr,"Unicode::Japanese::(xs)eucjp_sjis\n",len);
167             bin_dump("in ",src,len);
168             #endif
169 1 50         SV_Buf_init(&result,len);
    50          
170 1           src_end = src+len;
171              
172 2 100         while( src
173             {
174 1           switch(chk_eucjp[*src])
175             {
176 0           case CHK_EUCJP_THROUGH:
177 0           {
178 0           const unsigned char* start = src;
179 0 0         while( ++src
    0          
180             ;
181 0 0         SV_Buf_append_mem(&result,start,src-start);
    0          
    0          
182 0           continue;
183             }
184 0           case CHK_EUCJP_0212:
185             {
186 0 0         if( src+3-1
187             {
188 0 0         SV_Buf_append_mem(&result,UNDEF_SJIS,UNDEF_SJIS_LEN);
    0          
    0          
189 0           src += 3;
190 0           continue;
191             }
192 0           break;
193             }
194 1           case CHK_EUCJP_C:
195             {
196 1 50         if( src+2-1
    50          
    50          
197 1           {
198             union {
199             UJ_UINT16 u16_val;
200             UJ_UINT8 u8_val[2];
201             } tmp;
202 1 50         if( src[0]%2 )
203             {
204 0 0         tmp.u8_val[0] = (src[0]>>1) + (src[0] < 0xdf ? 0x31 : 0x71);
205 0 0         tmp.u8_val[1] = src[1] - ( 0x60 + (src[1] < 0xe0) );
206             }else
207             {
208 1 50         tmp.u8_val[0] = (src[0]>>1) + (src[0] < 0xdf ? 0x30 : 0x70);
209 1           tmp.u8_val[1] = src[1] - 2;
210             }
211 1 50         SV_Buf_append_ch2(&result, tmp.u16_val);
    50          
    50          
212 1           src += 2;
213 1           continue;
214             }
215 0           break;
216             }
217 0           case CHK_EUCJP_KANA:
218             {
219 0 0         if( src+2-1
    0          
    0          
220             {
221 0 0         SV_Buf_append_ch(&result,src[1]);
    0          
    0          
222 0           src += 2;
223 0           continue;
224             }
225 0           break;
226             }
227 0           default:
228             {
229             #ifdef TEST
230             fprintf(stderr,"xs_eucjp_sjis, invalid value [%02x] at chk_sjis[%05x]\n",chk_sjis[*src],*src);
231             #endif
232             }
233             } /*switch */
234              
235             /* invalid char */
236 0 0         SV_Buf_append_ch(&result,*src);
    0          
    0          
237 0           ++src;
238             } /*while */
239              
240             #if DISP_E2S
241             bin_dump("out",result.getBegin(),result.getLength());
242             #endif
243              
244 1           SV_Buf_setLength(&result);
245              
246 1           return SV_Buf_getSv(&result);
247             }