立石@JAISTです。
TclTkLibでTcl8.1のEncodingを行なえるよう
にできました。
Tcl8.1をお使いの方は試してみて下さい。
;; 以前できなかったのは初歩的なミスでした、、、、(^^;
以下のように使います。
require "tcltklib"
ip = TclTkIp.new
cmd1 = ip._encoding("button .b -text 終了","euc-jp")
cmd2 = "pack .b"
ip._eval(cmd1)
ip._eval(cmd2)
TclTkLib.mainloop
以下パッチです。
*** tcltklib.c.old Tue Jul 7 13:01:56 1998
--- tcltklib.c Sat Jul 11 08:30:31 1998
***************
*** 243,248 ****
--- 243,274 ----
}
static VALUE
+ ip_encoding(VALUE self, VALUE str, VALUE encodename)
+ {
+ Tcl_Interp *interp;
+ Tcl_Encoding encoding;
+ Tcl_DString dstr;
+ struct tcltkip *ptr;
+ char buff1[1024],buff2[1024];
+
+ Data_Get_Struct(self,struct tcltkip, ptr);
+ interp = ptr->ip;
+
+ encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename));
+ strcpy(buff1,STR2CSTR(str));
+
+ Tcl_DStringInit(&dstr);
+ Tcl_DStringFree(&dstr);
+ Tcl_ExternalToUtfDString(encoding,buff1,strlen(buff1),&dstr);
+ strcpy(buff2,Tcl_DStringValue(&dstr));
+
+ Tcl_FreeEncoding(encoding);
+ Tcl_DStringFree(&dstr);
+
+ return str_new2(buff2);
+ };
+
+ static VALUE
ip_invoke(int argc, VALUE *argv, VALUE obj)
{
struct tcltkip *ptr; /* tcltkip data struct */
***************
*** 356,361 ****
--- 382,388 ----
rb_define_singleton_method(ip, "new", ip_new, 0);
rb_define_method(ip, "_eval", ip_eval, 1);
+ rb_define_method(ip, "_encoding",ip_encoding,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);