From: ttate@... Date: 1998-07-11T20:55:09+09:00 Subject: [ruby-list:8694] tcltklib + {_to|_from}UTF8 (part 2) 立石@JAISTです。 TclTkLibに_toUTF8,_fromUTF8の関数を 追加するパッチです。 今朝のものはTcl8.1専用のものでしたが、 Tcl8.0以下でも一応何もしないメソッド ということで扱えるようにしました。 ;; このあとのメールでtk.rbへのパッチも ;; 流します。 *** tcltklib.c.old Sat Jul 11 09:09:11 1998 --- tcltklib.c Sat Jul 11 20:22:27 1998 *************** *** 242,247 **** --- 242,313 ---- return(str_new2(ptr->ip->result)); } + + static VALUE + ip_toUTF8(VALUE self, VALUE str, VALUE encodename) + { + #ifndef TCL_UTF_MAX + return str + #else + Tcl_Interp *interp; + Tcl_Encoding encoding; + Tcl_DString dstr; + struct tcltkip *ptr; + char *buff1,*buff2; + + Data_Get_Struct(self,struct tcltkip, ptr); + interp = ptr->ip; + + encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename)); + buff1 = ALLOCA_N(char,strlen(STR2CSTR(str))+1); + strcpy(buff1,STR2CSTR(str)); + + Tcl_DStringInit(&dstr); + Tcl_DStringFree(&dstr); + Tcl_ExternalToUtfDString(encoding,buff1,strlen(buff1),&dstr); + buff2 = ALLOCA_N(char,Tcl_DStringLength(&dstr)+1); + strcpy(buff2,Tcl_DStringValue(&dstr)); + + Tcl_FreeEncoding(encoding); + Tcl_DStringFree(&dstr); + + return str_new2(buff2); + #endif + }; + + static VALUE + ip_fromUTF8(VALUE self, VALUE str, VALUE encodename) + { + #ifndef TCL_UTF_MAX + return str + #else + Tcl_Interp *interp; + Tcl_Encoding encoding; + Tcl_DString dstr; + struct tcltkip *ptr; + char *buff1,*buff2; + + Data_Get_Struct(self,struct tcltkip, ptr); + interp = ptr->ip; + + encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename)); + buff1 = ALLOCA_N(char,strlen(STR2CSTR(str))+1); + strcpy(buff1,STR2CSTR(str)); + + Tcl_DStringInit(&dstr); + Tcl_DStringFree(&dstr); + Tcl_UtfToExternalDString(encoding,buff1,strlen(buff1),&dstr); + buff2 = ALLOCA_N(char,Tcl_DStringLength(&dstr)+1); + strcpy(buff2,Tcl_DStringValue(&dstr)); + + Tcl_FreeEncoding(encoding); + Tcl_DStringFree(&dstr); + + return str_new2(buff2); + #endif + }; + + static VALUE ip_invoke(int argc, VALUE *argv, VALUE obj) { *************** *** 356,361 **** --- 422,429 ---- rb_define_singleton_method(ip, "new", ip_new, 0); rb_define_method(ip, "_eval", ip_eval, 1); + rb_define_method(ip, "_toUTF8",ip_toUTF8,2); + rb_define_method(ip, "_fromUTF8",ip_fromUTF8,2); rb_define_method(ip, "_invoke", ip_invoke, -1); rb_define_method(ip, "_return_value", ip_retval, 0); rb_define_method(ip, "mainloop", lib_mainloop, 0);