From: EGUCHI Osamu Date: 1999-08-25T22:39:39+09:00 Subject: [ruby-list:16316] Re: printf の $ について ----Next_Part(Wed_Aug_25_22:38:51_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit えぐち@エスアンドイー です。 >>> In message [ruby-list:16315] Re: printf の $ について On Wed, 25 Aug 1999 21:44:04 +0900, EGUCHI Osamu said: eguchi> えぐち@エスアンドイー です。 eguchi> eguchi> >>> In message [ruby-list:16314] Re: printf の $ について eguchi> On Wed, 25 Aug 1999 20:51:27 +0900, EGUCHI Osamu said: eguchi> 参照順位の数え上げが間違えていました。 eguchi> これでいいはず、、 あまかった、、結構ミスありました。 特に、 %n$ と *n$ の合わせ技がグッと来ます。(汗) % ./ruby -e 'printf "%2$s - %1$s : %s\n", "One", "Two", "Three"' Two - One : Three % ./ruby -e 'printf("%% (%3$*1$d) %d\n", 10, 20, 30)' % ( 30) 30 が通るのは確認しました。(もう大丈夫、、、かなぁ) あと従来からの動作ですが、 % ruby -e 'printf "|%3.14%|\n"' |%| これって仕様ですか、? バグだとしたら `printf': malformed format string - %% (ArgumentError) かなぁ、、 えぐち ----Next_Part(Wed_Aug_25_22:38:51_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Description: sprintf3.diff Content-Disposition: attachment; filename="sprintf3.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 13:23:54 @@ -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,7 @@ p = t + 1; /* skip `%' */ width = prec = -1; + i = index; retry: switch (*p) { default: @@ -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,18 @@ } flags |= FWIDTH; - tmp = GETARG(); + tmp = GETARG(index); + index++; + switch (p[1]) { + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (p[2] == '$') { + int inx = p[1] - '0'; + p = &p[2]; + tmp = GETARG(inx); + } + break; + } width = NUM2INT(tmp); if (width < 0) { flags |= FMINUS; @@ -241,7 +261,18 @@ prec = 0; p++; if (*p == '*') { - tmp = GETARG(); + tmp = GETARG(index); + index++; + switch (p[1]) { + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (p[2] == '$') { + int inx = p[1] - '0'; + p = &p[2]; + tmp = GETARG(inx); + } + break; + } prec = NUM2INT(tmp); if (prec > 0) flags |= FPREC; @@ -264,11 +295,13 @@ case '\0': case '%': PUSH("%", 1); + flags = FNONE; + continue; break; case 'c': { - VALUE val = GETARG(); + VALUE val = GETARG(i); char c; if (!(flags & FMINUS)) @@ -283,7 +316,7 @@ case 's': { - VALUE arg = GETARG(); + VALUE arg = GETARG(i); int len; str = rb_obj_as_string(arg); @@ -329,7 +362,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 +596,7 @@ case 'e': case 'E': { - VALUE val = GETARG(); + VALUE val = GETARG(i); double fval; int i, need = 6; char fbuf[32]; @@ -605,6 +638,7 @@ } break; } + index++; flags = FNONE; } ----Next_Part(Wed_Aug_25_22:38:51_1999_809)----