[#8168] {literal}#[]= — EGUCHI Osamu <eguchi@...>

えぐち@エスアンドイーです。

16 messages 1999/11/01
[#8172] Re: {literal}#[]= — matz@... (Yukihiro Matsumoto) 1999/11/01

まつもと ゆきひろです

[#8176] Multiple self assignment — Kazuhiro Yoshida <moriq.kazuhiro@...>

もりきゅうです。

35 messages 1999/11/01
[#8178] Re: Multiple self assignment — matz@... (Yukihiro Matsumoto) 1999/11/01

まつもと ゆきひろです

[#8212] Re: Multiple self assignment — Kazuhiro Yoshida <moriq.kazuhiro@...> 1999/11/02

もりきゅうです。

[#8213] Re: Multiple self assignment — matz@... (Yukihiro Matsumoto) 1999/11/03

まつもと ゆきひろです

[#8232] 例外を処理する 2 項演算子 — Kazunori NISHI <kazunori@...> 1999/11/05

西@九大です。

[#8233] Re: 例外を処理する 2 項演算子 — matz@... (Yukihiro Matsumoto) 1999/11/05

まつもと ゆきひろです

[#8236] Re: 例外を処理する 2 項演算子 — Kazuhiro Yoshida <moriq.kazuhiro@...> 1999/11/05

もりきゅうです。

[#8266] Re: 例外を処理する 2 項演算子 — EGUCHI Osamu <eguchi@...> 1999/11/07

えぐち@エスアンドイー です。

[#8269] Re: 例外を処理する 2 項演算子 — gotoken@... (GOTO Kentaro) 1999/11/07

In message "[ruby-dev:8266] Re: 例外を処理する 2 項演算子"

[#8271] Re: 例外を処理する 2 項演算子 — matz@... (Yukihiro Matsumoto) 1999/11/08

まつもと ゆきひろです

[#8274] Re: 例外を処理する 2 項演算子 — keiju@... (石塚圭樹) 1999/11/08

けいじゅ@日本ラショナルソフトウェアです.

[#8204] Re: [ruby-list:18281] Re: アクセス制御について — Shugo Maeda <shugo@...>

前田です。

12 messages 1999/11/02
[#8205] Re: [ruby-list:18281] Re: アクセス制御について — Shin-ichiro Hara <sinara@...> 1999/11/02

原です。

[#8315] Re: [ruby-list:18601] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — Kazunori NISHI <kazunori@...>

西@九大です。

37 messages 1999/11/15
[#8316] Re: [ruby-list:18601] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — matz@... (Yukihiro Matsumoto) 1999/11/15

まつもと ゆきひろです

[#8369] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — Koji Arai <JCA02266@...> 1999/11/18

新井です。

[#8374] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — matz@... (Yukihiro Matsumoto) 1999/11/18

まつもと ゆきひろです

[#8384] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — Koji Arai <JCA02266@...> 1999/11/19

新井です。

[#8405] 1.4.3 (Re: Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{}) — matz@... (Yukihiro Matsumoto) 1999/11/24

[#8319] Re: Exception handling — Jun Adachi <adachi@...>

安達@沖データと申します。

21 messages 1999/11/16
[#8350] Re: Exception handling — Kazunori NISHI <kazunori@...> 1999/11/17

西@九大です。

[#8446] [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...>

西@九大です。

37 messages 1999/11/29
[#8449] Re: [REQ] {enumerable, integer, range}.rand — matz@... (Yukihiro Matsumoto) 1999/11/30

まつもと ゆきひろです

[#8463] Re: [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...> 1999/11/30

西@九大です。

[#8474] Re: [REQ] {enumerable, integer, range}.rand — matz@... (Yukihiro Matsumoto) 1999/12/01

まつもと ゆきひろです

[#8476] Re: [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...> 1999/12/01

西@九大です。

[#8487] Re: [REQ] {enumerable, integer, range}.rand — matz@... (Yukihiro Matsumoto) 1999/12/02

まつもと ゆきひろです

[#8494] Re: [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...> 1999/12/02

西@九大です。

[#8451] new Hash (Re: [ruby-list:19043]) — Wakou Aoyama <wakou@...>

青山です。

18 messages 1999/11/30

[ruby-dev:8379] [PATCH] use kconv with stream

From: IWAMURO Motonori <iwa@...>
Date: 1999-11-19 09:54:33 UTC
List: ruby-dev #8379
岩室@富士通です。

  ruby/gtkとhtml-parserとhttp-accessでちょっと遊んでいるのですが、http 
経由の入力はけっこうぶつ切れで来るので、文字コードの変換をしようとする
と単にkconvを使うだけではうまくいきません。

  文字の区切りとかをちゃんと見てやればいいわけなのですが、せっかく
kconvがあるのに一所懸命自力でパターンマッチ等で調べるのもなんかまぬけ
なので添付のようなパッチを作成してみました。取り込んでいただけると幸い
です。

  Kconv::kconvを以下のように変更しています。

    Kconv::kconv(STRING, OUT_CODE [, IN_CODE [, INCOMP_FLAG]])

INCOMP_FLAGが真ならば要素が二つの配列(0番目が変換後の文字列、1番目が変
換できなかった文字列)を返します。偽もしくはnilならば従来と同じです。変
換できなかった文字列としては以下のものが返されます。

  ・完全に変換できた場合は空文字列

  ・マルチバイト文字の1バイト目のみ

  ・エスケープシーケンスでASCII以外にdesignateしたまま終わっている場合
    はそのときの状態に対応したエスケープシーケンス

  ・SOの後SIしていない場合はSO

  ・不完全なエスケープシーケンス (ESCのみも含む)

例えばJISコードで「あいうえお」という文字列が「う」の真ん中で切れてい
る場合、以下のようになります。

test.rb:
------------------------------------------------------------------------------
#!/usr/local/bin/ruby
require "kconv"
jstr1 = "\e$B$\"$$$"
jstr2 = "&$($*\e(B"
estr1, incomp1 = Kconv::kconv(jstr1, Kconv::EUC, Kconv::AUTO, true)
print "estr1 = #{estr1}, incomp1 = #{incomp1.dump}\n"
estr2, incomp2 = Kconv::kconv(incomp1 + jstr2, Kconv::EUC, Kconv::AUTO, true)
print "estr2 = #{estr2}, incomp2 = #{incomp2.dump}\n"
------------------------------------------------------------------------------

実行結果
------------------------------------------------------------------------------
estr1 = あい, incomp1 = "\e$B$"
estr2 = うえお, incomp2 = ""
------------------------------------------------------------------------------

  なお、このパッチには以下の問題点があります。

  ・nkf.cを見ると、nkf1.7/nkf.cには直接手を出さないようにしているよう
    に思える。しかし、どうしてもnkf1.7/nkf.cの中でlostしてしまう情報が
    必要なので、こちらにもパッチを当ててしまっているがそれでもかまわな
    いか?

  ・手抜きでkconv.rbのKconv::toXXX系関数は修正していない。(取り込まれ
    るなら修正します^^;)

  ・インターフェースは妥当か? (一応これでいいと思ってるんですけれども)

diff -ru1 nkf.ORIG/lib/kconv.rb nkf/lib/kconv.rb
--- nkf.ORIG/lib/kconv.rb	Tue Nov  2 13:23:41 1999
+++ nkf/lib/kconv.rb	Fri Nov 19 15:24:54 1999
@@ -10,3 +10,3 @@
   UNKNOWN = NKF::UNKNOWN
-  def kconv(str, out_code, in_code = AUTO)
+  def kconv(str, out_code, in_code = AUTO, incomp = nil)
     opt = '-'
@@ -34,3 +34,3 @@
 
-    NKF::nkf(opt, str)
+    NKF::nkf(opt, str, incomp)
   end
diff -ru1 nkf.ORIG/nkf.c nkf/nkf.c
--- nkf.ORIG/nkf.c	Wed Oct 20 16:10:23 1999
+++ nkf/nkf.c	Fri Nov 19 17:21:30 1999
@@ -18,2 +18,7 @@
 
+#define RUBY_NKF_OCONV_BEGIN \
+			do {void (*oconv) _((int, int)) = rb_nkf_set_incomp
+#define RUBY_NKF_OCONV_END \
+			} while (0)
+
 #define INCSIZE		32
@@ -42,2 +47,15 @@
 
+/* Incomplete multibyte character or escape sequence. */
+#define INCOMP_OFFSET 4 /* Sequence of max length: ESC `$' `B' SO */
+#define MAX_INCOMP_MBC_LEN 5 /* max byte count of UTF-8 char is 6. */
+static int incomp_buf_ctr;
+static unsigned char incomp_buf[INCOMP_OFFSET + MAX_INCOMP_MBC_LEN];
+
+static void
+rb_nkf_set_incomp(c2, c1)
+     int c2, c1;
+{
+  incomp_buf[INCOMP_OFFSET + incomp_buf_ctr++] = c1;
+}
+
 #define PERL_XS 1
@@ -46,5 +64,8 @@
 static VALUE
-rb_nkf_kconv(obj, opt, src)
-     VALUE obj, opt, src;
+rb_nkf_kconv(argc, argv, obj)
+     int argc;
+     VALUE *argv;
+     VALUE obj;
 {
+  VALUE opt, src, incomp;
   int i;
@@ -53,2 +74,3 @@
 
+  rb_scan_args(argc, argv, "21", &opt, &src, &incomp);
   reinit();
@@ -79,2 +101,4 @@
 
+  incomp_buf_ctr = 0;
+
   kanji_convert(NULL);
@@ -83,2 +107,28 @@
 
+  if (incomp != Qnil && incomp != Qfalse) {
+    int offset = INCOMP_OFFSET;
+    if (input_mode == X0201) {
+      incomp_buf_ctr += 3;
+      offset -= 3;
+      incomp_buf[offset] = ESC;
+      incomp_buf[offset + 1] = '(';
+      incomp_buf[offset + 2] = 'I';
+    } else {
+      if (shift_mode) {
+	incomp_buf_ctr++;
+	offset--;
+	incomp_buf[offset] = SO;
+      }
+      if (input_mode == X0208) {
+	incomp_buf_ctr += 3;
+	offset -= 3;
+	incomp_buf[offset] = ESC;
+	incomp_buf[offset + 1] = '$';
+	incomp_buf[offset + 2] = 'B';
+      }
+    }
+    return rb_ary_new3(2, dst, rb_str_new(incomp_buf + offset,
+					  incomp_buf_ctr));
+  }
+
   return dst;
@@ -185,3 +235,3 @@
 
-    rb_define_module_function(mKconv, "nkf", rb_nkf_kconv, 2);
+    rb_define_module_function(mKconv, "nkf", rb_nkf_kconv, -1);
     rb_define_module_function(mKconv, "guess", rb_nkf_guess, 1);
diff -ru1 nkf.ORIG/nkf1.7/nkf.c nkf/nkf1.7/nkf.c
--- nkf.ORIG/nkf1.7/nkf.c	Mon Oct  4 13:51:06 1999
+++ nkf/nkf1.7/nkf.c	Fri Nov 19 16:45:36 1999
@@ -751,3 +751,9 @@
                                     (*oconv)(cv[(c1-SSP)*2],cv[(c1-SSP)*2+1]);
+#ifdef RUBY
+				    RUBY_NKF_OCONV_BEGIN;
+#endif
                                     (*oconv)(0,SSO); 
+#ifdef RUBY
+				    RUBY_NKF_OCONV_END;
+#endif
                                     LAST;
@@ -875,3 +881,9 @@
                 if((c1 = GETC(f)) == EOF) {
+#ifdef RUBY
+		    RUBY_NKF_OCONV_BEGIN;
+#endif
                     (*oconv)(0, ESC);
+#ifdef RUBY
+		    RUBY_NKF_OCONV_END;
+#endif
                     LAST;
@@ -879,4 +891,10 @@
                     if((c1 = GETC(f)) == EOF) {
+#ifdef RUBY
+			RUBY_NKF_OCONV_BEGIN;
+#endif
                         (*oconv)(0, ESC);
                         (*oconv)(0, '$');
+#ifdef RUBY
+			RUBY_NKF_OCONV_END;
+#endif
                         LAST;
@@ -889,2 +907,5 @@
 			if((c1 = GETC(f)) == EOF) {
+#ifdef RUBY
+			    RUBY_NKF_OCONV_BEGIN;
+#endif
 			    (*oconv)(0, ESC);
@@ -892,2 +913,5 @@
 			    (*oconv)(0, '(');
+#ifdef RUBY
+			    RUBY_NKF_OCONV_END;
+#endif
 			    LAST;
@@ -917,4 +941,10 @@
                     if((c1 = GETC(f)) == EOF) {
+#ifdef RUBY
+			RUBY_NKF_OCONV_BEGIN;
+#endif
                         (*oconv)(0, ESC);
                         (*oconv)(0, '(');
+#ifdef RUBY
+			RUBY_NKF_OCONV_END;
+#endif
                         LAST;
@@ -960,2 +990,6 @@
 
+#ifdef RUBY
+    if (c2 && c2 != EOF)
+	rb_nkf_set_incomp(0, c2);
+#endif
     /* epilogue */
-- 
岩室元典 [E-Mail: vmi@kw.netlaputa.ne.jp / iwa@mmp.fujitsu.co.jp]
「おばは〜〜〜ん♪」「おばは〜〜〜ん♪」「おばは〜〜〜ん♪」
「さあみなさんごいっしょに」「「「おばは〜〜〜ん♪」」」
(「マール王国の人形姫」日本一ソフトウェア/PlayStation)

In This Thread

Prev Next