-/*
- * 2ooM: The Master of Orion II Reverse Engineering Project
- * Miscellaneous common routines for liblbx.
- * Copyright (C) 2006-2008 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
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-
-#include "misc.h"
-#include "lbx.h"
-
-int _lbx_fseek(FILE *f, long *current, size_t offset)
-{
- static unsigned char oblivion[1024];
- long dist;
-
- if (*current < offset) {
- dist = offset - *current;
- } else if (*current > offset) {
- dist = -(long)(*current - offset);
- } else {
- return 0;
- }
-
- if (fseek(f, dist, SEEK_CUR) == 0) {
- *current += dist;
- } else if (*current < offset) {
- while (dist) {
- size_t rc, amt = MIN(sizeof oblivion, dist);
- rc = fread(oblivion, 1, amt, f);
- *current += rc;
- dist -= rc;
- if (rc < amt) {
- if (feof(f))
- lbx_errno = LBX_EEOF;
- else
- lbx_errno = -errno;
- return -1;
- }
- }
- } else {
- lbx_errno = -errno;
- return -1;
- }
- return 0;
-}