* io.c (io_binwrite): extracted from io_fwrite.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19290 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2008-09-10 18:00:36 +00:00
Родитель 1bd34a09c9
Коммит 7e0b2b1d9b
2 изменённых файлов: 41 добавлений и 30 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Thu Sep 11 02:59:47 2008 Tanaka Akira <akr@fsij.org>
* io.c (io_binwrite): extracted from io_fwrite.
Thu Sep 11 02:25:34 2008 Tanaka Akira <akr@fsij.org>
* transcode.c (make_encoding): new function.

67
io.c
Просмотреть файл

@ -744,40 +744,12 @@ make_writeconv(rb_io_t *fptr)
}
/* writing functions */
static long
io_fwrite(VALUE str, rb_io_t *fptr)
io_binwrite(VALUE str, rb_io_t *fptr)
{
long len, n, r, l, offset = 0;
if (NEED_WRITECONV(fptr)) {
VALUE common_encoding = Qnil;
make_writeconv(fptr);
if (fptr->writeconv) {
if (!NIL_P(fptr->writeconv_asciicompat))
common_encoding = fptr->writeconv_asciicompat;
else if (!rb_enc_asciicompat(rb_enc_get(str))) {
rb_raise(rb_eArgError, "ASCII incompatible string written for text mode IO without encoding conversion: %s",
rb_enc_name(rb_enc_get(str)));
}
}
else {
if (fptr->encs.enc2)
common_encoding = rb_enc_from_encoding(fptr->encs.enc2);
else
common_encoding = rb_enc_from_encoding(fptr->encs.enc);
}
if (!NIL_P(common_encoding)) {
str = rb_str_transcode(str, common_encoding,
fptr->writeconv_pre_ecflags, fptr->writeconv_pre_ecopts);
}
if (fptr->writeconv) {
str = rb_econv_str_convert(fptr->writeconv, str, ECONV_PARTIAL_INPUT);
}
}
len = RSTRING_LEN(str);
if ((n = len) <= 0) return n;
if (fptr->wbuf == NULL && !(fptr->mode & FMODE_SYNC)) {
@ -840,6 +812,41 @@ io_fwrite(VALUE str, rb_io_t *fptr)
return len;
}
static long
io_fwrite(VALUE str, rb_io_t *fptr)
{
if (NEED_WRITECONV(fptr)) {
VALUE common_encoding = Qnil;
make_writeconv(fptr);
if (fptr->writeconv) {
if (!NIL_P(fptr->writeconv_asciicompat))
common_encoding = fptr->writeconv_asciicompat;
else if (!rb_enc_asciicompat(rb_enc_get(str))) {
rb_raise(rb_eArgError, "ASCII incompatible string written for text mode IO without encoding conversion: %s",
rb_enc_name(rb_enc_get(str)));
}
}
else {
if (fptr->encs.enc2)
common_encoding = rb_enc_from_encoding(fptr->encs.enc2);
else
common_encoding = rb_enc_from_encoding(fptr->encs.enc);
}
if (!NIL_P(common_encoding)) {
str = rb_str_transcode(str, common_encoding,
fptr->writeconv_pre_ecflags, fptr->writeconv_pre_ecopts);
}
if (fptr->writeconv) {
str = rb_econv_str_convert(fptr->writeconv, str, ECONV_PARTIAL_INPUT);
}
}
return io_binwrite(str, fptr);
}
long
rb_io_fwrite(const char *ptr, long len, FILE *f)
{