From: EGUCHI Osamu Date: 1999-08-25T21:44:04+09:00 Subject: [ruby-list:16315] Re: printf の $ について ----Next_Part(Wed_Aug_25_21:43:22_1999_518)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit えぐち@エスアンドイー です。 >>> In message [ruby-list:16314] Re: printf の $ について On Wed, 25 Aug 1999 20:51:27 +0900, EGUCHI Osamu said: eguchi> えぐち@エスアンドイー です。 eguchi> eguchi> >>> In message [ruby-list:16313] Re: printf の $ について eguchi> On Wed, 25 Aug 1999 15:54:56 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) said: eguchi> eguchi> matz> まつもと ゆきひろです eguchi> ... eguchi> matz> sprintf.cのGETARG()マクロとかを書き換えればできるのかなあ。 eguchi> matz> しかし、当面私自身が手を付ける気は無いですね。 eguchi> matz> 誰かやる? eguchi> eguchi> やっつけてみました。 参照順位の数え上げが間違えていました。 これでいいはず、、 えぐち ----Next_Part(Wed_Aug_25_21:43:22_1999_518)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Description: sprintf2.diff Content-Disposition: attachment; filename="sprintf2.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 12:39:28 @@ -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); @@ -172,6 +175,8 @@ p = t + 1; /* skip `%' */ width = prec = -1; + incl: + i = index++; retry: switch (*p) { default: @@ -208,6 +213,12 @@ 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]; + index++; + goto retry; + } flags |= FWIDTH; width = 0; for (; p < end && ISDIGIT(*p); p++) { @@ -224,14 +235,23 @@ } 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; width = -width; } p++; - goto retry; + goto incl; case '.': if (flags & FPREC) { @@ -241,12 +261,21 @@ 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; p++; - goto retry; + goto incl; } for (; p < end && ISDIGIT(*p); p++) { @@ -264,11 +293,12 @@ case '\0': case '%': PUSH("%", 1); + index--; break; case 'c': { - VALUE val = GETARG(); + VALUE val = GETARG(i); char c; if (!(flags & FMINUS)) @@ -283,7 +313,7 @@ case 's': { - VALUE arg = GETARG(); + VALUE arg = GETARG(i); int len; str = rb_obj_as_string(arg); @@ -329,7 +359,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 +593,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_21:43:22_1999_518)----