summaryrefslogtreecommitdiffstats
path: root/ext/tcltklib
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-07-05 05:55:58 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-07-05 05:55:58 +0000
commit69100ebb4d8fc48c985061631d09a01a2c6b2b82 (patch)
tree4b1223c94538d16ba68ef6f1ce74491e310a1011 /ext/tcltklib
parent648ac9b2416c00ab70b5a1c0f39950a55c91120b (diff)
downloadruby-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.eng20
-rw-r--r--ext/tcltklib/MANUAL.euc20
-rw-r--r--ext/tcltklib/tcltklib.c115
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);