/* $Id: ucs2_utf8.c,v 1.3 2002/10/31 11:08:50 hio Exp $ */ #include "Japanese.h" /* * ucs2=>utf8文字列変換 */ EXTERN_C SV* xs_ucs2_utf8(SV* sv_str) { unsigned char* src; int len; SV_Buf result; const unsigned char* src_end; unsigned char buf[4]; if( sv_str==&PL_sv_undef ) { return newSVpvn("",0); } src = (unsigned char*)SvPV(sv_str,PL_na); len = sv_len(sv_str); src_end = src+(len&~1); /*fprintf(stderr,"Unicode::Japanese::(xs)ucs2_utf8\n",len);*/ /*bin_dump("in ",src,len);*/ SV_Buf_init(&result,len*3/2+4); if( len&1 ) { Perl_croak(aTHX_ "Unicode::Japanese::ucs2_utf8, invalid length (not 2*n)"); } for(; src> 6); buf[1] = 0x80 | (ucs2 & 0x3F); SV_Buf_append_ch2(&result,*(unsigned short*)buf); }else { buf[0] = 0xE0 | (ucs2 >> 12); buf[1] = 0x80 | ((ucs2 >> 6) & 0x3F); buf[2] = 0x80 | (ucs2 & 0x3F); SV_Buf_append_ch3(&result,*(unsigned int*)buf); } } /*bin_dump("out",result.getBegin(),result.getLength()); */ SV_Buf_setLength(&result); return SV_Buf_getSv(&result); } /* * utf8=>ucs2文字列変換 */ EXTERN_C SV* xs_utf8_ucs2(SV* sv_str) { unsigned char* src; int len; SV_Buf result; const unsigned char* src_end; if( sv_str==&PL_sv_undef ) { return newSVpvn("",0); } src = (unsigned char*)SvPV(sv_str,PL_na); len = sv_len(sv_str); src_end = src+len; /*fprintf(stderr,"Unicode::Japanese::(xs)utf8_ucs2\n",len); */ /*bin_dump("in ",src,len); */ SV_Buf_init(&result,len); while( src=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf