From: EGUCHI Osamu Date: 1999-08-25T20:51:27+09:00 Subject: [ruby-list:16314] Re: printf の $ について ----Next_Part(Wed_Aug_25_20:50:46_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit えぐち@エスアンドイー です。 >>> In message [ruby-list:16313] Re: printf の $ について On Wed, 25 Aug 1999 15:54:56 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) said: matz> まつもと ゆきひろです ... matz> まあ、言えるのは使えないプラットフォームが結構あるので、Ruby matz> としてこれがあることを仮定することはできないってことですね。 matz> matz> もっともRubyのprintfって実際にはprintfそのままではないんで、 matz> スルーしてくれないから、$nが使えるプラットフォームでも対応で matz> きないんですが、このRubyのprintf自身が$nに対応することそのも matz> のは面倒であっても不可能ではないですね。 matz> matz> sprintf.cのGETARG()マクロとかを書き換えればできるのかなあ。 matz> しかし、当面私自身が手を付ける気は無いですね。 matz> 誰かやる? やっつけてみました。 + % の使える場所に %digit$ を使えるようにした。 + % を修飾する * の場所に *digit$ を使えるようにした。 ※digit の取り得る範囲は 1..9 です。 という内容です。 # $n ぢゃなくって、 %n$ でいいんですよね ^^;;; えぐち ----Next_Part(Wed_Aug_25_20:50:46_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Description: sprintf.diff Content-Disposition: attachment; filename="sprintf.diff" Index: sprintf.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/sprintf.c,v retrieving revision 1.2 diff -d -u -r1.2 sprintf.c --- sprintf.c 1999/08/13 05:45:14 1.2 +++ sprintf.c 1999/08/25 11:29:57 @@ -135,8 +135,9 @@ blen += (l);\ } -#define GETARG() \ - ((argc == 0)?(rb_raise(rb_eArgError, "too few argument."),0):(argc--,((argv++)[0]))) +#define GETARG(index) \ + ((index<0||index>=argc)?(rb_raise(rb_eArgError, "too few argument."),0)\ + :argv[index]) VALUE rb_f_sprintf(argc, argv) @@ -148,11 +149,12 @@ int blen, bsiz; VALUE result; - int width, prec, flags = FNONE; + int width, prec, flags = FNONE, index = 0; VALUE tmp; VALUE str; - fmt = GETARG(); + fmt = GETARG(index); + index++; p = str2cstr(fmt, &blen); end = p + blen; blen = 0; @@ -161,6 +163,7 @@ for (; p < end; p++) { char *t; + int i; for (t = p; t < end && *t != '%'; t++) ; CHECK(t - p); @@ -173,6 +176,7 @@ width = prec = -1; retry: + i = index++; switch (*p) { default: if (ISPRINT(*p)) @@ -208,6 +212,11 @@ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + if (p[1] == '$') { + i = *p - '0'; + p = &p[2]; + goto retry; + } flags |= FWIDTH; width = 0; for (; p < end && ISDIGIT(*p); p++) { @@ -224,7 +233,16 @@ } flags |= FWIDTH; - tmp = GETARG(); + switch (p[1]) { + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (p[2] == '$') { + i = p[1] - '0'; + p = &p[2]; + } + break; + } + tmp = GETARG(i); width = NUM2INT(tmp); if (width < 0) { flags |= FMINUS; @@ -241,7 +259,16 @@ prec = 0; p++; if (*p == '*') { - tmp = GETARG(); + switch (p[1]) { + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (p[2] == '$') { + i = p[1] - '0'; + p = &p[2]; + } + break; + } + tmp = GETARG(i); prec = NUM2INT(tmp); if (prec > 0) flags |= FPREC; @@ -264,11 +291,12 @@ case '\0': case '%': PUSH("%", 1); + index--; break; case 'c': { - VALUE val = GETARG(); + VALUE val = GETARG(i); char c; if (!(flags & FMINUS)) @@ -283,7 +311,7 @@ case 's': { - VALUE arg = GETARG(); + VALUE arg = GETARG(i); int len; str = rb_obj_as_string(arg); @@ -329,7 +357,7 @@ case 'b': case 'u': { - volatile VALUE val = GETARG(); + volatile VALUE val = GETARG(i); char fbuf[32], nbuf[64], *s, *t; char *prefix = 0; int sign = 0; @@ -563,7 +591,7 @@ case 'e': case 'E': { - VALUE val = GETARG(); + VALUE val = GETARG(i); double fval; int i, need = 6; char fbuf[32]; ----Next_Part(Wed_Aug_25_20:50:46_1999_809)----