[#16211] pstore.rb and sync.rb — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

19 messages 2002/03/04
[#16245] Re: pstore.rb and sync.rb — keiju@... (石塚圭樹) 2002/03/07

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

[#16240] [Oni Guruma] look behind — nobu.nakada@...

なかだです。

14 messages 2002/03/07

[#16283] ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

124 messages 2002/03/08
[#16307] Re: ライブラリ拡大計画 — TAKAHASHI Masayoshi <maki@...> 2002/03/10

高橋征義です。

[#16317] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/11

まつもと ゆきひろです

[#16318] Re: ライブラリ拡大計画 — Tanaka Akira <akr@...17n.org> 2002/03/11

In article <1015827556.101112.6552.nullmailer@ev.netlab.jp>,

[#16320] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/11

まつもと ゆきひろです

[#16347] Re: ライブラリ拡大計画 — Minero Aoki <aamine@...> 2002/03/12

あおきです。

[#16308] Re: ライブラリ拡大計画 — WATANABE Hirofumi <eban@...> 2002/03/11

わたなべです。

[#16626] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/27

まつもと ゆきひろです

[#16628] Re: ライブラリ拡大計画 — Takaaki Tateishi <ttate@...> 2002/03/27

At Wed, 27 Mar 2002 18:56:03 +0900,

[#16629] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/27

まつもと ゆきひろです

[#16647] Re: ライブラリ拡大計画 — Takaaki Tateishi <ttate@...> 2002/03/28

At Thu, 28 Mar 2002 00:12:49 +0900,

[#16674] Re: ライブラリ拡大計画 — Takaaki Tateishi <ttate@...> 2002/03/29

At Thu, 28 Mar 2002 23:45:49 +0900,

[#16675] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/29

まつもと ゆきひろです

[#16680] Re: ライブラリ拡大計画 — nobu.nakada@... 2002/03/29

なかだです。

[#16681] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/29

まつもと ゆきひろです

[#16683] Re: ライブラリ拡大計画 — nobu.nakada@... 2002/03/29

なかだです。

[#16687] Re: ライブラリ拡大計画 — Takaaki Tateishi <ttate@...> 2002/03/30

At Fri, 29 Mar 2002 20:32:17 +0900,

[#16718] Re: ライブラリ拡大計画 — Takaaki Tateishi <ttate@...> 2002/04/02

At Sun, 31 Mar 2002 02:20:04 +0900,

[#16371] Re: ライブラリ拡大計画 — Takaaki Tateishi <ttate@...> 2002/03/13

At Fri, 8 Mar 2002 18:05:01 +0900,

[#16373] Re: ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto) 2002/03/14

まつもと ゆきひろです

[#16397] Re: ライブラリ拡大計画 — nobu.nakada@... 2002/03/14

なかだです。

[#16404] Re: ライブラリ拡大計画 — Tanaka Akira <akr@...17n.org> 2002/03/14

In article <20020314133401.3918E10F3@sharui.nakada.kanuma.tochigi.jp>,

[#16406] Re: ライブラリ拡大計画 — nobu.nakada@... 2002/03/15

なかだです。

[#16290] IO#gets improvement — nobu.nakada@...

なかだです。

27 messages 2002/03/08
[#16291] Re: IO#gets improvement — Tanaka Akira <akr@...17n.org> 2002/03/08

In article <20020308131426.8C36123B9@sharui.nakada.kanuma.tochigi.jp>,

[#16294] Re: IO#gets improvement — nobu.nakada@... 2002/03/09

なかだです。

[#16549] Re: IO#gets improvement — nobu.nakada@... 2002/03/23

なかだです。

[#16486] mswin32 configuration — nobu.nakada@...

なかだです。

20 messages 2002/03/19
[#16488] Re: mswin32 configuration — "U.Nakamura" <usa@...> 2002/03/19

こんにちは、なかむら(う)です。

[#16489] Re: mswin32 configuration — nobu.nakada@... 2002/03/19

なかだです。

[#16490] Re: mswin32 configuration — "U.Nakamura" <usa@...> 2002/03/19

こんにちは、なかむら(う)です。

[#16545] BigFloat — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

51 messages 2002/03/23
[#16547] Re: BigFloat — "Akinori MUSHA" <knu@...> 2002/03/23

At Sat, 23 Mar 2002 22:55:45 +0900,

[#16548] Re: BigFloat — "Akinori MUSHA" <knu@...> 2002/03/23

At Sun, 24 Mar 2002 02:20:26 +0900,

[#16550] Re: BigFloat — Tanaka Akira <akr@...17n.org> 2002/03/23

In article <867ko3yyik.wl@archon.local.idaemons.org>,

[#16551] Re: BigFloat — "Akinori MUSHA" <knu@...> 2002/03/23

At Sun, 24 Mar 2002 04:21:59 +0900,

[#16552] Re: BigFloat — Tanaka Akira <akr@...17n.org> 2002/03/23

In article <864rj7yljs.wl@archon.local.idaemons.org>,

[#16553] Re: BigFloat — "Akinori MUSHA" <knu@...> 2002/03/23

At Sun, 24 Mar 2002 07:44:15 +0900,

[#16560] Re: BigFloat — Tanaka Akira <akr@...17n.org> 2002/03/24

In article <861yeazvtg.wl@archon.local.idaemons.org>,

[#16565] Re: BigFloat — "Akinori MUSHA" <knu@...> 2002/03/24

At Sun, 24 Mar 2002 15:41:18 +0900,

[#16575] Re: if Re: BigFloat — keiju@... (石塚圭樹) 2002/03/24

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

[#16715] Re: if Re: BigFloat — keiju@... (石塚圭樹) 2002/04/02

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

[#16725] Re: if Re: BigFloat — "Akinori MUSHA" <knu@...> 2002/04/02

At Tue, 2 Apr 2002 16:16:04 +0900,

[#16789] Re: if Re: BigFloat — "Shigeo Kobayashi" <shigeo@...> 2002/04/08

[#16805] Re: if Re: BigFloat — Shin-ichiro HARA <sinara@...> 2002/04/09

原です。

[#16811] Re: if Re: BigFloat — "Shigeo Kobayashi" <shigeo@...> 2002/04/09

[#16555] File.fnmatch (Re: [rubyist:1286] Re: ARGV の機能) — Koji Arai <JCA02266@...>

新井です。

11 messages 2002/03/24

[#16593] Oniguruma and multibyte character literal — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

15 messages 2002/03/25
[#16594] Re: Oniguruma and multibyte character literal — matz@... (Yukihiro Matsumoto) 2002/03/25

まつもと ゆきひろです

[#16652] [OniGuruma] nested repeat operator — "K.Kosako" <kosako@...>

[ruby-talk:36959]で指摘された

31 messages 2002/03/29
[#16669] Re: [OniGuruma] nested repeat operator — Tanaka Akira <akr@...17n.org> 2002/03/29

In article <20020329022810.68F9E17@helium.ruby-lang.org>,

[#16676] Re: [OniGuruma] nested repeat operator — "K.Kosako" <kosako@...> 2002/03/29

Tanaka Akiraさんの<hvohemzoku6.fsf@coulee.a02.aist.go.jp>から

[ruby-dev:16351] map in printf format

From: nobu.nakada@...
Date: 2002-03-12 14:52:01 UTC
List: ruby-dev #16351
なかだです。

Pythonの"%(x)s"形式のフォーマット(正式にはなんて言うんだか?)を
見て、実装してみました。

それと"%2$s%s"としたときに、現状では二番目と三番目の引数を使っ
てますが、glibcなどでは二番目と最初のが使われるようです。この議
論はなんか昔あったような気がしますが、"*"の後の"$"ではカウンタ
が進まないことと一貫してないように思えるので、揃えてみました。


Index: sprintf.c
===================================================================
RCS file: /cvs/ruby/src/ruby/sprintf.c,v
retrieving revision 1.19
diff -u -2 -p -r1.19 sprintf.c
--- sprintf.c	2002/02/01 10:23:22	1.19
+++ sprintf.c	2002/03/12 14:34:05
@@ -20,4 +20,5 @@
 
 static void fmt_setup _((char*,int,int,int,int));
+static ID keyid _((const char *p, int n));
 
 static char*
@@ -128,29 +129,62 @@ remove_sign_bits(str, base)
 }
 
-#define GETARG() \
-    ((nextarg >= argc) ? (rb_raise(rb_eArgError, "too few argument."), 0) : argv[nextarg++])
+#define GETARG() (nextvalue == Qundef ? GETNTHARG(nextarg) : nextvalue)
 
+#define GETNTHARG(nth) \
+    ((nth >= argc) ? (rb_raise(rb_eArgError, "too few argument."), 0) : argv[nth++])
+
 #define GETASTER(val) { \
     t = p++; \
     n = 0; \
-    for (; p < end && ISDIGIT(*p); p++) { \
-	n = 10 * n + (*p - '0'); \
-    } \
-    if (p >= end) { \
-	rb_raise(rb_eArgError, "malformed format string - %%*[0-9]"); \
+    if (*p == '(') { \
+	GETKEY(tmp); \
     } \
-    if (*p == '$') { \
-	int curarg = nextarg; \
-	nextarg = n; \
-	tmp = GETARG(); \
-	nextarg = curarg; \
-    } \
     else { \
-	tmp = GETARG(); \
-	p = t; \
+	for (; p < end && ISDIGIT(*p); p++) { \
+	    n = 10 * n + (*p - '0'); \
+	} \
+	if (p >= end) { \
+	    rb_raise(rb_eArgError, "malformed format string - %%*[0-9]"); \
+	} \
+	if (*p == '$') { \
+	    tmp = GETNTHARG(n); \
+	} \
+	else { \
+	    tmp = GETARG(); \
+	    p = t; \
+	} \
     } \
     val = NUM2INT(tmp); \
 }
 
+#define GETKEY(val) { \
+    VALUE id; \
+    t = ++p; \
+    while ((p < end) ? (*p != ')') : \
+	   (rb_raise(rb_eArgError, "incomplete format key: %.*s", \
+		     end - t, t), 1)) { \
+	p++; \
+    } \
+    id = keyid(t, p - t); \
+    if (!keyargs) { \
+	if (nextarg >= argc) rb_raise(rb_eArgError, "format require mapping."); \
+	keyargs = argv[--argc]; \
+	Check_Type(keyargs, T_HASH); \
+    } \
+    if (!fetch) fetch = rb_intern("fetch"); \
+    val = rb_funcall3(keyargs, fetch, 1, &id); \
+}
+
+static VALUE
+keyid(p, n)
+    const char *p;
+    int n;
+{
+    char *str = ALLOCA_N(char, n + 1);
+    MEMCPY(str, p, char, n);
+    str[n] = '\0';
+    return ID2SYM(rb_intern(str));
+}
+
 VALUE
 rb_f_sprintf(argc, argv)
@@ -158,4 +192,5 @@ rb_f_sprintf(argc, argv)
     VALUE *argv;
 {
+    static ID fetch;
     VALUE fmt;
     char *buf, *p, *end;
@@ -166,8 +201,10 @@ rb_f_sprintf(argc, argv)
     int nextarg = 0;
     int tainted = 0;
+    VALUE nextvalue;
     VALUE tmp;
     VALUE str;
+    VALUE keyargs = 0;
 
-    fmt = GETARG();
+    fmt = GETNTHARG(nextarg);
     if (OBJ_TAINTED(fmt)) tainted = 1;
     StringValue(fmt);
@@ -191,4 +228,5 @@ rb_f_sprintf(argc, argv)
 
 	width = prec = -1;
+	nextvalue = Qundef;
       retry:
 	switch (*p) {
@@ -235,5 +273,8 @@ rb_f_sprintf(argc, argv)
 	    }
 	    if (*p == '$') {
-		nextarg = n;
+		if (nextvalue != Qundef) {
+		    rb_raise(rb_eArgError, "value given twice");
+		}
+		nextvalue = GETNTHARG(n);
 		p++;
 		goto retry;
@@ -241,4 +282,12 @@ rb_f_sprintf(argc, argv)
 	    width = n;
 	    flags |= FWIDTH;
+	    goto retry;
+
+	  case '(':
+	    if (nextvalue != Qundef) {
+		rb_raise(rb_eArgError, "value given twice");
+	    }
+	    GETKEY(nextvalue);
+	    ++p;
 	    goto retry;
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next