X-Git-Url: https://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/690f160e36849a41199023c5addd54afd00f01fd..bd5f6b55320b6889827908762197642b484ea28d:/src/fops.c?ds=inline
diff --git a/src/fops.c b/src/fops.c
index 2a3db82..521b50b 100644
--- a/src/fops.c
+++ b/src/fops.c
@@ -1,7 +1,7 @@
/*
* 2ooM: The Master of Orion II Reverse Engineering Project
* Default file operations structures for liblbx.
- * Copyright (C) 2010 Nick Bowler
+ * Copyright © 2010, 2014 Nick Bowler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,25 +16,33 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+#include
#include
+#include
+#include
#include "misc.h"
+#include "error.h"
#include "lbx.h"
/* Default I/O operations for ordinary files. */
static size_t file_read(void *buf, size_t size, void *handle)
{
- return fread(buf, 1, size, (FILE *)handle);
+ size_t rc = fread(buf, 1, size, (FILE *)handle);
+
+ if (rc < size && ferror((FILE *)handle))
+ lbx_error_raise(-errno);
+ return rc;
}
static int file_seek(void *handle, long offset, int whence)
{
- return fseek((FILE *)handle, offset, whence);
-}
+ if (fseek((FILE *)handle, offset, whence) == -1) {
+ lbx_error_raise(-errno);
+ return -1;
+ }
-static long file_tell(void *handle)
-{
- return ftell((FILE *)handle);
+ return 0;
}
static int file_eof(void *handle)
@@ -45,7 +53,6 @@ static int file_eof(void *handle)
const struct lbx_file_ops lbx_default_fops = {
.read = file_read,
.seek = file_seek,
- .tell = file_tell,
.eof = file_eof,
};
@@ -55,7 +62,7 @@ static size_t pipe_read(void *buf, size_t size, void *handle)
struct lbx_pipe_state *state = handle;
size_t rc;
- rc = fread(buf, 1, size, state->f);
+ rc = file_read(buf, size, state->f);
state->offset += rc;
return rc;
}
@@ -76,6 +83,8 @@ static int pipe_seek(void *handle, long offset, int whence)
case SEEK_END:
distance = -1;
break;
+ default:
+ assert(0);
}
if (distance < 0)
@@ -92,16 +101,10 @@ static int pipe_seek(void *handle, long offset, int whence)
return -1;
}
+ clearerr(state->f);
return 0;
}
-static long pipe_tell(void *handle)
-{
- struct lbx_pipe_state *state = handle;
-
- return state->offset;
-}
-
static int pipe_eof(void *handle)
{
struct lbx_pipe_state *state = handle;
@@ -112,7 +115,6 @@ static int pipe_eof(void *handle)
const struct lbx_file_ops lbx_pipe_fops = {
.read = pipe_read,
.seek = pipe_seek,
- .tell = pipe_tell,
.eof = pipe_eof,
};
@@ -126,11 +128,6 @@ static int lbx_seek(void *handle, long offset, int whence)
return lbx_file_seek(handle, offset, whence);
}
-static long lbx_tell(void *handle)
-{
- return lbx_file_tell(handle);
-}
-
static int lbx_eof(void *handle)
{
return lbx_file_eof(handle);
@@ -139,6 +136,5 @@ static int lbx_eof(void *handle)
const struct lbx_file_ops lbx_arch_fops = {
.read = lbx_read,
.seek = lbx_seek,
- .tell = lbx_tell,
.eof = lbx_eof,
};