LibC: Fix FILE buffering once again :D
This commit is contained in:
@@ -82,13 +82,10 @@ static void init_closed_file(FILE* file)
|
|||||||
|
|
||||||
static int drop_read_buffer(FILE* file)
|
static int drop_read_buffer(FILE* file)
|
||||||
{
|
{
|
||||||
if (file->buffer_rd_size == 0)
|
const off_t bytes_remaining = file->buffer_rd_size - file->buffer_idx;
|
||||||
return 0;
|
if (bytes_remaining > 0)
|
||||||
ASSERT(file->buffer_idx != 0);
|
if (syscall(SYS_SEEK, file->fd, -bytes_remaining, SEEK_CUR) == -1)
|
||||||
if (file->buffer_idx == 1)
|
return EOF;
|
||||||
return 0;
|
|
||||||
if (syscall(SYS_SEEK, file->fd, file->buffer_idx - 1, SEEK_CUR) == -1)
|
|
||||||
return EOF;
|
|
||||||
file->buffer_rd_size = 0;
|
file->buffer_rd_size = 0;
|
||||||
file->buffer_idx = 0;
|
file->buffer_idx = 0;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -452,8 +449,7 @@ int fseeko(FILE* file, off_t offset, int whence)
|
|||||||
ScopeLock _(file);
|
ScopeLock _(file);
|
||||||
if (fflush(file) == EOF)
|
if (fflush(file) == EOF)
|
||||||
return -1;
|
return -1;
|
||||||
long ret = syscall(SYS_SEEK, file->fd, offset, whence);
|
if (syscall(SYS_SEEK, file->fd, offset, whence) == -1)
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
return -1;
|
||||||
file->eof = false;
|
file->eof = false;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -472,12 +468,12 @@ long ftell(FILE* file)
|
|||||||
off_t ftello(FILE* file)
|
off_t ftello(FILE* file)
|
||||||
{
|
{
|
||||||
ScopeLock _(file);
|
ScopeLock _(file);
|
||||||
if (fflush(file) == EOF)
|
auto offset = syscall(SYS_TELL, file->fd);
|
||||||
|
if (offset == -1)
|
||||||
return -1;
|
return -1;
|
||||||
long ret = syscall(SYS_TELL, file->fd);
|
if (file->buffer_rd_size)
|
||||||
if (ret < 0)
|
offset -= file->buffer_rd_size - file->buffer_idx;
|
||||||
return -1;
|
return offset - file->unget_buf_idx;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftrylockfile(FILE* fp)
|
int ftrylockfile(FILE* fp)
|
||||||
@@ -541,10 +537,7 @@ int getc_unlocked(FILE* file)
|
|||||||
if (file->unget_buf_idx)
|
if (file->unget_buf_idx)
|
||||||
{
|
{
|
||||||
file->unget_buf_idx--;
|
file->unget_buf_idx--;
|
||||||
unsigned char ch = file->unget_buffer[file->unget_buf_idx];
|
return file->unget_buffer[file->unget_buf_idx];
|
||||||
if (fseeko(file, 1, SEEK_CUR) == -1)
|
|
||||||
return EOF;
|
|
||||||
return ch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// read from unbuffered file
|
// read from unbuffered file
|
||||||
@@ -582,8 +575,6 @@ int getc_unlocked(FILE* file)
|
|||||||
((nread == 0) ? file->eof : file->error) = true;
|
((nread == 0) ? file->eof : file->error) = true;
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
if (fseeko(file, 1 - nread, SEEK_CUR) == -1)
|
|
||||||
return EOF;
|
|
||||||
file->buffer_rd_size = nread;
|
file->buffer_rd_size = nread;
|
||||||
file->buffer_idx = 1;
|
file->buffer_idx = 1;
|
||||||
return file->buffer[0];
|
return file->buffer[0];
|
||||||
@@ -1020,9 +1011,6 @@ int ungetc_unlocked(int c, FILE* stream)
|
|||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fseeko(stream, -1, SEEK_CUR) == -1)
|
|
||||||
return EOF;
|
|
||||||
|
|
||||||
stream->unget_buffer[stream->unget_buf_idx] = c;
|
stream->unget_buffer[stream->unget_buf_idx] = c;
|
||||||
stream->unget_buf_idx++;
|
stream->unget_buf_idx++;
|
||||||
stream->eof = false;
|
stream->eof = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user