diff options
| author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-07-05 05:55:58 +0000 |
|---|---|---|
| committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-07-05 05:55:58 +0000 |
| commit | 69100ebb4d8fc48c985061631d09a01a2c6b2b82 (patch) | |
| tree | 4b1223c94538d16ba68ef6f1ce74491e310a1011 /ext/tcltklib | |
| parent | 648ac9b2416c00ab70b5a1c0f39950a55c91120b (diff) | |
| download | ruby-69100ebb4d8fc48c985061631d09a01a2c6b2b82.tar.gz ruby-69100ebb4d8fc48c985061631d09a01a2c6b2b82.tar.xz ruby-69100ebb4d8fc48c985061631d09a01a2c6b2b82.zip | |
* ext/tcltklib/tcltklib.c: bug fix on treating Unicode strings.
* ext/tcltklib/tcltklib.c: add methods to treat encoding mode.
* ext/tcltklib/MANUAL.eng: add description of TclTkLib#encoding,
encoding_system, and so on.
* ext/tcltklib/MANUAL.euc: ditto.
* ext/tk/tkutil.c: fail to create a Tcl's list string from an
array including multiple kind of encoded strings.
* ext/tk/lib/tk.rb: ditto.
* ext/tk/lib/multi-tk.rb: 2nd arg of _{to|from}UTF8 is omissible.
* ext/tk/lib/remote-tk.rb: ditto.
* ext/tk/lib/tk.rb: override TclTkLib#encoding and encoding= to
use TkCore::INTERP.encoding and encoding=.
* ext/tk/lib/tk.rb: when "require 'tk'" and $KCODE=='NONE', check
DEFAULT_TK_ENCODING to decide Ruby/Tk's system encoding mode.
* ext/tk/lib/tk/encodedstr.rb: check both of Tk.encoding and
Tk.encoding_system. Tk.encoding has higher priority.
* ext/tk/lib/tk/optiondb.rb: ditto.
* ext/tk/lib/tk/spinbox.rb: ditto.
* ext/tk/lib/tk/validation.rb: ditto.
* ext/tk/lib/tk/namespace.rb: arguemnts for TclTkIp#_merge_tklist
should be UTF-8 strings.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@8720 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tcltklib')
| -rw-r--r-- | ext/tcltklib/MANUAL.eng | 20 | ||||
| -rw-r--r-- | ext/tcltklib/MANUAL.euc | 20 | ||||
| -rw-r--r-- | ext/tcltklib/tcltklib.c | 115 |
3 files changed, 110 insertions, 45 deletions
diff --git a/ext/tcltklib/MANUAL.eng b/ext/tcltklib/MANUAL.eng index 9523096d2..9e7bd20d3 100644 --- a/ext/tcltklib/MANUAL.eng +++ b/ext/tcltklib/MANUAL.eng @@ -1,5 +1,5 @@ (tof) - 2004/03/28 Hidetoshi NAGAI + 2005/07/05 Hidetoshi NAGAI This document discribes about the 'tcltklib' library. Although there is the 'tcltk' library (tcltk.rb) under this directory, no description @@ -227,8 +227,8 @@ module TclTklib : Convert the argument to a valid Tcl list element with : Tcl/Tk's library function. - _toUTF8(str, encoding) - _fromUTF8(str, encoding) + _toUTF8(str, encoding=nil) + _fromUTF8(str, encoding=nil) : Call the function (which is internal function of Tcl/Tk) to : convert to/from a UTF8 string. @@ -239,6 +239,16 @@ module TclTklib : _subst_Tcl_backslash method parses all backslash sequence. : _subst_UTF_backslash method parses \uhhhh only. + encoding_system + encoding_system=(encoding) + : Get and set Tcl's system encoding. + + encoding + encoding=(encoding) + : alias of encoding_system / encoding_system= + : ( probably, Ruby/Tk's tk.rb will override them ) + + class TclTkIp [class methods] new(ip_name=nil, options='') @@ -322,8 +332,8 @@ class TclTkIp : to _eval and regist the command once, after that, the : command can be called by _invoke. - _toUTF8(str, encoding) - _fromUTF8(str, encoding) + _toUTF8(str, encoding=nil) + _fromUTF8(str, encoding=nil) : Call the function (which is internal function of Tcl/Tk) to : convert to/from a UTF8 string. diff --git a/ext/tcltklib/MANUAL.euc b/ext/tcltklib/MANUAL.euc index a2a14cb19..f90dcff3e 100644 --- a/ext/tcltklib/MANUAL.euc +++ b/ext/tcltklib/MANUAL.euc @@ -1,5 +1,5 @@ (tof) - 2004/03/28 Hidetoshi NAGAI + 2005/07/05 Hidetoshi NAGAI 本ドキュメントには古い tcltk ライブラリ,tcltklib ライブラリの説明 が含まれていますが,その記述内容は古いものとなっています. @@ -341,8 +341,8 @@ require "tcltklib" すると, 以下のモジュール, クラスが利用可能です. : 一つのリスト要素として適切な表現になるように変換した文 : 字列を返す. - _toUTF8(str, encoding) - _fromUTF8(str, encoding) + _toUTF8(str, encoding=nil) + _fromUTF8(str, encoding=nil) : Tcl/Tk が内蔵している UTF8 変換処理を呼び出す. _subst_UTF_backslash(str) @@ -353,6 +353,16 @@ require "tcltklib" すると, 以下のモジュール, クラスが利用可能です. : 置き換えるのに対し,_subst_UTF_backslash は \uhhhh : による Unicode 文字表現だけを置き換える. + encoding_system + encoding_system=(encoding) + : Tcl の system encoding の獲得および設定 + + encoding + encoding=(encoding) + : encoding_system / encoding_system= の alias + : ( Ruby/Tk の tk.rb では置き換えられる予定のもの.) + + クラス TclTkIp クラスメソッド new(ip_name=nil, options='') @@ -433,8 +443,8 @@ require "tcltklib" すると, 以下のモジュール, クラスが利用可能です. : して登録に成功しさえすれば,以降は _invoke でも利用で : きるようになる. - _toUTF8(str, encoding) - _fromUTF8(str, encoding) + _toUTF8(str, encoding=nil) + _fromUTF8(str, encoding=nil) : Tcl/Tk が内蔵している UTF8 変換処理を呼び出す. _thread_vwait(var_name) diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c index 7651084b2..244902dd4 100644 --- a/ext/tcltklib/tcltklib.c +++ b/ext/tcltklib/tcltklib.c @@ -4,7 +4,7 @@ * Oct. 24, 1997 Y. Matsumoto */ -#define TCLTKLIB_RELEASE_DATE "2005-06-16" +#define TCLTKLIB_RELEASE_DATE "2005-07-05" #include "ruby.h" #include "rubysig.h" @@ -1894,7 +1894,7 @@ ip_set_exc_message(interp, exc) /* to avoid a garbled error message dialog */ buf = ALLOC_N(char, (RSTRING(msg)->len)+1); - strncpy(buf, RSTRING(msg)->ptr, RSTRING(msg)->len); + memcpy(buf, RSTRING(msg)->ptr, RSTRING(msg)->len); buf[RSTRING(msg)->len] = 0; Tcl_DStringInit(&dstr); @@ -1990,10 +1990,10 @@ ip_ruby_eval_body(arg) errtype_len = strlen(errtype); len = errtype_len + RSTRING(rb_obj_as_string(ruby_errinfo))->len; buf = ALLOC_N(char, len + 1); - strncpy(buf, errtype, errtype_len); - strncpy(buf + errtype_len, - RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, - RSTRING(rb_obj_as_string(ruby_errinfo))->len); + memcpy(buf, errtype, errtype_len); + memcpy(buf + errtype_len, + RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, + RSTRING(rb_obj_as_string(ruby_errinfo))->len); *(buf + len) = 0; RARRAY(arg->failed)->ptr[0] = rb_exc_new2(eTkCallbackReturn, buf); @@ -2005,10 +2005,10 @@ ip_ruby_eval_body(arg) errtype_len = strlen(errtype); len = errtype_len + RSTRING(rb_obj_as_string(ruby_errinfo))->len; buf = ALLOC_N(char, len + 1); - strncpy(buf, errtype, errtype_len); - strncpy(buf + errtype_len, - RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, - RSTRING(rb_obj_as_string(ruby_errinfo))->len); + memcpy(buf, errtype, errtype_len); + memcpy(buf + errtype_len, + RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, + RSTRING(rb_obj_as_string(ruby_errinfo))->len); *(buf + len) = 0; RARRAY(arg->failed)->ptr[0] = rb_exc_new2(eTkCallbackBreak, buf); @@ -2020,10 +2020,10 @@ ip_ruby_eval_body(arg) errtype_len = strlen(errtype); len = errtype_len + RSTRING(rb_obj_as_string(ruby_errinfo))->len; buf = ALLOC_N(char, len + 1); - strncpy(buf, errtype, errtype_len); - strncpy(buf + errtype_len, - RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, - RSTRING(rb_obj_as_string(ruby_errinfo))->len); + memcpy(buf, errtype, errtype_len); + memcpy(buf + errtype_len, + RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, + RSTRING(rb_obj_as_string(ruby_errinfo))->len); *(buf + len) = 0; RARRAY(arg->failed)->ptr[0] = rb_exc_new2(eTkCallbackContinue,buf); @@ -2155,7 +2155,7 @@ ip_ruby_eval(clientData, interp, argc, argv) str = Tcl_GetStringFromObj(argv[1], &len); arg->string = ALLOC_N(char, len + 1); - strncpy(arg->string, str, len); + memcpy(arg->string, str, len); arg->string[len] = 0; rb_thread_critical = thr_crit_bup; @@ -2377,10 +2377,10 @@ ip_ruby_cmd_body(arg) errtype_len = strlen(errtype); len = errtype_len + RSTRING(rb_obj_as_string(ruby_errinfo))->len; buf = ALLOC_N(char, len + 1); - strncpy(buf, errtype, errtype_len); - strncpy(buf + errtype_len, - RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, - RSTRING(rb_obj_as_string(ruby_errinfo))->len); + memcpy(buf, errtype, errtype_len); + memcpy(buf + errtype_len, + RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, + RSTRING(rb_obj_as_string(ruby_errinfo))->len); *(buf + len) = 0; RARRAY(arg->failed)->ptr[0] = rb_exc_new2(eTkCallbackReturn, buf); @@ -2392,10 +2392,10 @@ ip_ruby_cmd_body(arg) errtype_len = strlen(errtype); len = errtype_len + RSTRING(rb_obj_as_string(ruby_errinfo))->len; buf = ALLOC_N(char, len + 1); - strncpy(buf, errtype, errtype_len); - strncpy(buf + errtype_len, - RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, - RSTRING(rb_obj_as_string(ruby_errinfo))->len); + memcpy(buf, errtype, errtype_len); + memcpy(buf + errtype_len, + RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, + RSTRING(rb_obj_as_string(ruby_errinfo))->len); *(buf + len) = 0; RARRAY(arg->failed)->ptr[0] = rb_exc_new2(eTkCallbackBreak, buf); @@ -2407,10 +2407,10 @@ ip_ruby_cmd_body(arg) errtype_len = strlen(errtype); len = errtype_len + RSTRING(rb_obj_as_string(ruby_errinfo))->len; buf = ALLOC_N(char, len + 1); - strncpy(buf, errtype, errtype_len); - strncpy(buf + errtype_len, - RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, - RSTRING(rb_obj_as_string(ruby_errinfo))->len); + memcpy(buf, errtype, errtype_len); + memcpy(buf + errtype_len, + RSTRING(rb_obj_as_string(ruby_errinfo))->ptr, + RSTRING(rb_obj_as_string(ruby_errinfo))->len); *(buf + len) = 0; RARRAY(arg->failed)->ptr[0] = rb_exc_new2(eTkCallbackContinue,buf); @@ -2559,7 +2559,7 @@ ip_ruby_cmd(clientData, interp, argc, argv) len = strlen(str); buf = ALLOC_N(char, len + 2); buf[0] = '$'; - strncpy(buf + 1, str, len); + memcpy(buf + 1, str, len); buf[len + 1] = 0; receiver = rb_gv_get(buf); free(buf); @@ -5814,7 +5814,7 @@ ip_eval(self, str) *alloc_done = 0; eval_str = ALLOC_N(char, RSTRING(str)->len + 1); - strncpy(eval_str, RSTRING(str)->ptr, RSTRING(str)->len); + memcpy(eval_str, RSTRING(str)->ptr, RSTRING(str)->len); eval_str[RSTRING(str)->len] = 0; /* allocate memory (freed by Tcl_ServiceEvent) */ @@ -6101,9 +6101,8 @@ lib_toUTF8_core(ip_obj, src, encodename) rb_thread_critical = thr_crit_bup; return str; } - buf = ALLOC_N(char,(RSTRING(str)->len)+1); - strncpy(buf, RSTRING(str)->ptr, RSTRING(str)->len); + memcpy(buf, RSTRING(str)->ptr, RSTRING(str)->len); buf[RSTRING(str)->len] = 0; Tcl_DStringInit(&dstr); @@ -6112,7 +6111,8 @@ lib_toUTF8_core(ip_obj, src, encodename) Tcl_ExternalToUtfDString(encoding, buf, RSTRING(str)->len, &dstr); /* str = rb_tainted_str_new2(Tcl_DStringValue(&dstr)); */ - str = rb_str_new2(Tcl_DStringValue(&dstr)); + /* str = rb_str_new2(Tcl_DStringValue(&dstr)); */ + str = rb_str_new(Tcl_DStringValue(&dstr), Tcl_DStringLength(&dstr)); rb_ivar_set(str, ID_at_enc, rb_tainted_str_new2("utf-8")); if (taint_flag) OBJ_TAINT(str); @@ -6261,7 +6261,7 @@ lib_fromUTF8_core(ip_obj, src, encodename) } buf = ALLOC_N(char,strlen(RSTRING(str)->ptr)+1); - strncpy(buf, RSTRING(str)->ptr, RSTRING(str)->len); + memcpy(buf, RSTRING(str)->ptr, RSTRING(str)->len); buf[RSTRING(str)->len] = 0; Tcl_DStringInit(&dstr); @@ -6270,7 +6270,8 @@ lib_fromUTF8_core(ip_obj, src, encodename) Tcl_UtfToExternalDString(encoding,buf,RSTRING(str)->len,&dstr); /* str = rb_tainted_str_new2(Tcl_DStringValue(&dstr)); */ - str = rb_str_new2(Tcl_DStringValue(&dstr)); + /* str = rb_str_new2(Tcl_DStringValue(&dstr)); */ + str = rb_str_new(Tcl_DStringValue(&dstr), Tcl_DStringLength(&dstr)); rb_ivar_set(str, ID_at_enc, encodename); if (taint_flag) OBJ_TAINT(str); @@ -6337,7 +6338,7 @@ lib_UTF_backslash_core(self, str, all_bs) rb_thread_critical = Qtrue; src_buf = ALLOC_N(char,(RSTRING(str)->len)+1); - strncpy(src_buf, RSTRING(str)->ptr, RSTRING(str)->len); + memcpy(src_buf, RSTRING(str)->ptr, RSTRING(str)->len); src_buf[RSTRING(str)->len] = 0; dst_buf = ALLOC_N(char,(RSTRING(str)->len)+1); @@ -6380,6 +6381,41 @@ lib_Tcl_backslash(self, str) return lib_UTF_backslash_core(self, str, 1); } +static VALUE +lib_get_system_encoding(self) + VALUE self; +{ +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + return rb_str_new2(Tcl_GetEncodingName((Tcl_Encoding)NULL)); +#else + return Qnil; +#endif +} + +static VALUE +lib_set_system_encoding(self, enc_name) + VALUE self; + VALUE enc_name; +{ +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + if NIL_P(enc_name) { + Tcl_SetSystemEncoding((Tcl_Interp *)NULL, (CONST char *)NULL); + return lib_get_system_encoding(self); + } + + enc_name = rb_funcall(enc_name, ID_to_s, 0, 0); + if (Tcl_SetSystemEncoding((Tcl_Interp *)NULL, + RSTRING(enc_name)->ptr) != TCL_OK) { + rb_raise(rb_eArgError, "unknown encoding name '%s'", + RSTRING(enc_name)->ptr); + } + + return enc_name; +#else + return Qnil; +#endif +} + /* invoke Tcl proc */ struct invoke_info { @@ -8500,6 +8536,15 @@ Init_tcltklib() rb_define_module_function(lib, "_subst_Tcl_backslash", lib_Tcl_backslash, 1); + rb_define_module_function(lib, "encoding_system", + lib_get_system_encoding, 0); + rb_define_module_function(lib, "encoding_system=", + lib_set_system_encoding, 1); + rb_define_module_function(lib, "encoding", + lib_get_system_encoding, 0); + rb_define_module_function(lib, "encoding=", + lib_set_system_encoding, 1); + /* --------------------------------------------------------------- */ rb_define_alloc_func(ip, ip_alloc); |
