diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-02-28 18:45:31 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-02-28 18:45:31 +0900 |
| commit | cb7f82ac452cf0e869d1a3e3e2e58e6bb25bf347 (patch) | |
| tree | a6a916a891abf4fc89b9f23633f82aaaf9242c59 /mrbgems/mruby-sprintf/src/sprintf.c | |
| parent | 6bd3d88eddb8932bd02fadfbf2235c3cba2ad624 (diff) | |
| parent | d60944ef3aaebefa3380cc984d32c127b1ed1782 (diff) | |
| download | mruby-cb7f82ac452cf0e869d1a3e3e2e58e6bb25bf347.tar.gz mruby-cb7f82ac452cf0e869d1a3e3e2e58e6bb25bf347.zip | |
Merge pull request #1756 from chasonr/sprintf-utf8
Implement sprintf("%c") for UTF-8.
Diffstat (limited to 'mrbgems/mruby-sprintf/src/sprintf.c')
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index b20cbe1df..5b255d28e 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -666,38 +666,37 @@ retry: case 'c': { mrb_value val = GETARG(); mrb_value tmp; - unsigned int c; + char *c; tmp = mrb_check_string_type(mrb, val); if (!mrb_nil_p(tmp)) { - if (RSTRING_LEN(tmp) != 1 ) { + if (mrb_fixnum(mrb_funcall(mrb, tmp, "size", 0)) != 1 ) { mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character"); } - c = RSTRING_PTR(tmp)[0]; - n = 1; } - else { - c = mrb_fixnum(val); - n = 1; + else if (mrb_fixnum_p(val)) { + tmp = mrb_funcall(mrb, val, "chr", 0); } - if (n <= 0) { + else { mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character"); } + c = RSTRING_PTR(tmp); + n = RSTRING_LEN(tmp); if (!(flags & FWIDTH)) { CHECK(n); - buf[blen] = c; + memcpy(buf+blen, c, n); blen += n; } else if ((flags & FMINUS)) { CHECK(n); - buf[blen] = c; + memcpy(buf+blen, c, n); blen += n; FILL(' ', width-1); } else { FILL(' ', width-1); CHECK(n); - buf[blen] = c; + memcpy(buf+blen, c, n); blen += n; } } |
