Bug #5714 » set_binmode_fix_r34120.patch
| io.c | ||
|---|---|---|
|
# endif
|
||
|
#endif
|
||
|
#define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path))
|
||
|
static int io_fflush(rb_io_t *);
|
||
|
#define NEED_NEWLINE_DECORATOR_ON_READ(fptr) ((fptr)->mode & FMODE_TEXTMODE)
|
||
| ... | ... | |
|
ssize_t read_size;
|
||
|
long i;
|
||
|
long newlines = 0;
|
||
|
long extra_max;
|
||
|
char *p;
|
||
|
if (!rb_w32_fd_is_text((fptr)->fd)) return O_BINARY;
|
||
|
if (!rb_w32_fd_is_text(fptr->fd)) return O_BINARY;
|
||
|
if ((fptr)->rbuf.len == 0 || (fptr)->mode & FMODE_DUPLEX) {
|
||
|
setmode((fptr)->fd, O_BINARY);
|
||
|
return O_TEXT;
|
||
|
if (fptr->rbuf.len == 0 || fptr->mode & FMODE_DUPLEX) {
|
||
|
return setmode(fptr->fd, O_BINARY);
|
||
|
}
|
||
|
if (io_fflush(fptr) < 0) {
|
||
|
rb_sys_fail(0);
|
||
|
}
|
||
|
errno = 0;
|
||
|
pos = lseek((fptr)->fd, 0, SEEK_CUR);
|
||
|
pos = lseek(fptr->fd, 0, SEEK_CUR);
|
||
|
if (pos < 0 && errno) {
|
||
|
if (errno == ESPIPE)
|
||
|
(fptr)->mode |= FMODE_DUPLEX;
|
||
|
setmode((fptr)->fd, O_BINARY);
|
||
|
return O_TEXT;
|
||
|
fptr->mode |= FMODE_DUPLEX;
|
||
|
return setmode(fptr->fd, O_BINARY);
|
||
|
}
|
||
|
/* add extra offset for '\r' */
|
||
|
p = (fptr)->rbuf.ptr+(fptr)->rbuf.off;
|
||
|
for (i = 0; i < (fptr)->rbuf.len; i++) {
|
||
|
/* add extra offset for removed '\r' in rbuf */
|
||
|
extra_max = pos - fptr->rbuf.len;
|
||
|
p = fptr->rbuf.ptr + fptr->rbuf.off;
|
||
|
for (i = 0; i < fptr->rbuf.len; i++) {
|
||
|
if (*p == '\n') newlines++;
|
||
|
if (extra_max == newlines) break;
|
||
|
p++;
|
||
|
}
|
||
|
while (newlines >= 0) {
|
||
|
r = lseek((fptr)->fd, pos - (fptr)->rbuf.len - newlines, SEEK_SET);
|
||
|
r = lseek(fptr->fd, pos - fptr->rbuf.len - newlines, SEEK_SET);
|
||
|
if (newlines == 0) break;
|
||
|
if (read_size = _read((fptr)->fd, (fptr)->rbuf.ptr, (fptr)->rbuf.len + newlines)) {
|
||
|
if (read_size == (fptr)->rbuf.len) {
|
||
|
lseek((fptr)->fd, r, SEEK_SET);
|
||
|
break;
|
||
|
}
|
||
|
else {
|
||
|
newlines--;
|
||
|
}
|
||
|
if (r < 0) {
|
||
|
newlines--;
|
||
|
continue;
|
||
|
}
|
||
|
read_size = _read(fptr->fd, fptr->rbuf.ptr, fptr->rbuf.len + newlines);
|
||
|
if (read_size < 0) {
|
||
|
rb_sys_fail_path(fptr->pathv);
|
||
|
}
|
||
|
if (read_size == fptr->rbuf.len) {
|
||
|
lseek(fptr->fd, r, SEEK_SET);
|
||
|
break;
|
||
|
}
|
||
|
else {
|
||
|
newlines--;
|
||
|
}
|
||
|
}
|
||
|
(fptr)->rbuf.off = 0;
|
||
|
(fptr)->rbuf.len = 0;
|
||
|
setmode((fptr)->fd, O_BINARY);
|
||
|
return O_TEXT;
|
||
|
fptr->rbuf.off = 0;
|
||
|
fptr->rbuf.len = 0;
|
||
|
return setmode(fptr->fd, O_BINARY);
|
||
|
}
|
||
|
#define SET_BINARY_MODE_WITH_SEEK_CUR(fptr) set_binary_mode_with_seek_cur(fptr)
|
||
| ... | ... | |
|
#define shutdown(a,b) 0
|
||
|
#endif
|
||
|
#define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path))
|
||
|
#if defined(_WIN32)
|
||
|
#define is_socket(fd, path) rb_w32_is_socket(fd)
|
||
|
#elif !defined(S_ISSOCK)
|
||
| test/ruby/test_io_m17n.rb | ||
|---|---|---|
|
end
|
||
|
}
|
||
|
end if /mswin|mingw/ =~ RUBY_PLATFORM
|
||
|
def test_seek_with_setting_binmode
|
||
|
with_tmpdir {
|
||
|
str = "a\r\nb\r\nc\r\n\r\n\n\n\n\n\n\n\n"
|
||
|
generate_file("tmp", str)
|
||
|
open("tmp", "r") do |f|
|
||
|
assert_equal("a\n", f.gets) # text
|
||
|
assert_equal("b\r\n", f.read(3)) # binary
|
||
|
end
|
||
|
}
|
||
|
end if /mswin|mingw/ =~ RUBY_PLATFORM
|
||
|
end
|
||
- « Previous
- 1
- …
- 4
- 5
- 6
- Next »