2 * 2ooM: The Master of Orion II Reverse Engineering Project
3 * Default file operations structures for liblbx.
4 * Copyright (C) 2010 Nick Bowler
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 /* Default I/O operations for ordinary files. */
27 static size_t file_read(void *buf, size_t size, void *handle)
29 size_t rc = fread(buf, 1, size, (FILE *)handle);
31 if (rc < size && ferror((FILE *)handle))
32 lbx_error_raise(-errno);
36 static int file_seek(void *handle, long offset, int whence)
38 if (fseek((FILE *)handle, offset, whence) == -1) {
39 lbx_error_raise(-errno);
46 static long file_tell(void *handle)
48 return ftell((FILE *)handle);
51 static int file_eof(void *handle)
53 return feof((FILE *)handle);
56 const struct lbx_file_ops lbx_default_fops = {
63 /* Read function for pipes that tracks the number of bytes read. */
64 static size_t pipe_read(void *buf, size_t size, void *handle)
66 struct lbx_pipe_state *state = handle;
69 rc = file_read(buf, size, state->f);
74 /* Seek function for pipes that reads data into the void. */
75 static int pipe_seek(void *handle, long offset, int whence)
77 struct lbx_pipe_state *state = handle;
82 distance = offset - state->offset;
95 while (distance > 0) {
96 static unsigned char oblivion[1024];
97 size_t rc, amount = MIN(sizeof oblivion, distance);
99 rc = pipe_read(oblivion, amount, handle);
110 static long pipe_tell(void *handle)
112 struct lbx_pipe_state *state = handle;
114 return state->offset;
117 static int pipe_eof(void *handle)
119 struct lbx_pipe_state *state = handle;
121 return feof(state->f);
124 const struct lbx_file_ops lbx_pipe_fops = {
131 static size_t lbx_read(void *buf, size_t size, void *handle)
133 return lbx_file_read(handle, buf, size);
136 static int lbx_seek(void *handle, long offset, int whence)
138 return lbx_file_seek(handle, offset, whence);
141 static long lbx_tell(void *handle)
143 return lbx_file_tell(handle);
146 static int lbx_eof(void *handle)
148 return lbx_file_eof(handle);
151 const struct lbx_file_ops lbx_arch_fops = {