]> git.draconx.ca Git - liblbx.git/blobdiff - src/lbx.c
Add the tools.h that should have been included a while ago.
[liblbx.git] / src / lbx.c
index 253da5e870485bab33249f28bd872bdad2146703..b7127ad2c3b9cc789a738150571ad0356fef1a13 100644 (file)
--- a/src/lbx.c
+++ b/src/lbx.c
@@ -1,3 +1,21 @@
+/* 2ooM: The Master of Orion II Reverse Engineering Project
+ * Library for working with LBX archive files.
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 #ifdef HAVE_CONFIG_H
 #      include "config.h"
 #endif
 #include <sys/mman.h>
 
 #include "byteorder.h"
+#include "misc.h"
 #include "lbx.h"
 
 #define LBX_MAGIC 0x0000fead
-#define MIN(a,b) (((a)<(b))?(a):(b))
 
 int lbx_errno = 0;
 
@@ -169,43 +187,6 @@ int lbx_stat(struct lbx_state *lbx, size_t index, struct lbx_statbuf *buf)
        return 0;
 }
 
-/* Advance to the beginning of the index'th file by either fseek or reading. */
-static int _lbx_fseek(struct lbx_state *lbx, size_t base)
-{
-       static unsigned char oblivion[1024];
-       long dist;
-
-       if (lbx->foff < base) {
-               dist = base - lbx->foff;
-       } else if (lbx->foff > base) {
-               dist = -(long)(lbx->foff - base);
-       } else {
-               return 0;
-       }
-
-       if (fseek(lbx->f, dist, SEEK_CUR) == 0) {
-               lbx->foff += dist;
-       } else if (lbx->foff < base) {
-               while (dist) {
-                       size_t rc, amt = MIN(sizeof oblivion, dist);
-                       rc = fread(oblivion, 1, amt, lbx->f);
-                       lbx->foff += rc;
-                       dist -= rc;
-                       if (rc < amt) {
-                               if (feof(lbx->f))
-                                       lbx_errno = LBX_EEOF;
-                               else
-                                       lbx_errno = -errno;
-                               return -1;
-                       }
-               }
-       } else {
-               lbx_errno = -errno;
-               return -1;
-       }
-       return 0;
-}
-
 static size_t
 _lbx_mextract(struct lbx_state *lbx, size_t base, size_t len, FILE *of)
 {
@@ -229,7 +210,7 @@ _lbx_fextract(struct lbx_state *lbx, size_t base, size_t len, FILE *of)
 
        assert(lbx->f);
 
-       if (_lbx_fseek(lbx, base) == -1)
+       if (_lbx_fseek(lbx->f, &lbx->foff, base) == -1)
                return 0;
        
        while (len) {
@@ -329,6 +310,7 @@ const char *lbx_strerror(void)
        case LBX_EMAGIC:   return "Bad magic number";
        case LBX_EEOF:     return "Unexpected end-of-file";
        case LBX_ERANGE:   return "Index out of range";
+       case LBX_EFORMAT:  return "Invalid file format";
        }
 
        return "Unknown error";