[#23332] to_str再考 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

15 messages 2004/04/05

[#23380] [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

17 messages 2004/04/15
[#23400] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。落ちる場所がわかりました。

[#23402] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[#23403] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — nobu.nakada@... 2004/04/16

なかだです。

[#23405] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[#23407] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[ruby-dev:23423] backslash substitution for utf-8 character

From: Hidetoshi NAGAI <nagai@...>
Date: 2004-04-21 09:24:49 UTC
List: ruby-dev #23423
永井@知能.九工大です.

文字列リテラルに UTF-8 文字のバックスラッシュ記法を加えるというのは
ダメでしょうか?
添付のパッチは Tcl/Tk と同様に \u を用いるようにした例です.

p "\u7D42\u4E86" ==> "\347\265\202\344\272\206" ( UTF-8 の "終了" )

# uv_to_utf8 を pack.c からほぼコピーしてきている等,
# パッチ自体は良いものではありません.

別に \u でなくても良い (pack と揃えるなら \U の方が良い?) のですが,
こうした記法について一考いただけますと幸いです.

Index: parse.y
===================================================================
RCS file: /src/ruby/parse.y,v
retrieving revision 1.319
diff -u -r1.319 parse.y
--- parse.y	5 Apr 2004 13:16:40 -0000	1.319
+++ parse.y	21 Apr 2004 09:01:49 -0000
@@ -3005,6 +3005,56 @@
 }
 
 static int
+uv_to_utf8(buf, uv)
+    char *buf;
+    unsigned long uv;
+{
+    if (uv <= 0x7f) {
+        buf[0] = (char)uv;
+        return 1;
+    }
+    if (uv <= 0x7ff) {
+        buf[0] = ((uv>>6)&0xff)|0xc0;
+        buf[1] = (uv&0x3f)|0x80;
+        return 2;
+    }
+    if (uv <= 0xffff) {
+        three:
+        buf[0] = ((uv>>12)&0xff)|0xe0;
+        buf[1] = ((uv>>6)&0x3f)|0x80;
+        buf[2] = (uv&0x3f)|0x80;
+        return 3;
+    }
+    if (uv <= 0x1fffff) {
+        buf[0] = ((uv>>18)&0xff)|0xf0;
+        buf[1] = ((uv>>12)&0x3f)|0x80;
+        buf[2] = ((uv>>6)&0x3f)|0x80;
+        buf[3] = (uv&0x3f)|0x80;
+        return 4;
+    }
+    if (uv <= 0x3ffffff) {
+        buf[0] = ((uv>>24)&0xff)|0xf8;
+        buf[1] = ((uv>>18)&0x3f)|0x80;
+        buf[2] = ((uv>>12)&0x3f)|0x80;
+        buf[3] = ((uv>>6)&0x3f)|0x80;
+        buf[4] = (uv&0x3f)|0x80;
+        return 5;
+    }
+    if (uv <= 0x7fffffff) {
+        buf[0] = ((uv>>30)&0xff)|0xfc;
+        buf[1] = ((uv>>24)&0x3f)|0x80;
+        buf[2] = ((uv>>18)&0x3f)|0x80;
+        buf[3] = ((uv>>12)&0x3f)|0x80;
+        buf[4] = ((uv>>6)&0x3f)|0x80;
+        buf[5] = (uv&0x3f)|0x80;
+        return 6;
+    }
+
+    uv = 0xfffd;
+    goto three;
+}
+
+static int
 tokadd_string(func, term, paren, nest)
     int func, term, paren, *nest;
 {
@@ -3039,6 +3089,37 @@
 
 	      case '\\':
 		if (func & STR_FUNC_ESCAPE) tokadd(c);
+		break;
+
+	      case 'u':
+		if (func & STR_FUNC_EXPAND) {
+		    /* read uni-char */
+		    static char hex[] = "0123456789abcdef0123456789ABCDEF";
+		    char buf[6], *tmp;
+		    unsigned long uv = 0;
+		    int i, len;
+
+		    c = nextc();
+		    for(i = 0; i < 4 && c && (tmp = strchr(hex, c)); i++) {
+			uv <<= 4;
+			uv |= (tmp - hex) & 15;
+			c = nextc();
+		    }
+		    pushback(c);
+		    if (i == 0) {
+			tokadd('u');
+		    }
+		    else {
+			len = uv_to_utf8(buf, uv);
+			for(i = 0; i < len; i++) {
+			    tokadd(buf[i]);
+			}
+		    }
+		    continue;
+		}
+		else if (c != term && !(paren && c == paren)) {
+		    tokadd('\\');
+		}
 		break;
 
 	      default:

-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai@ai.kyutech.ac.jp

In This Thread

Prev Next