]> git.draconx.ca Git - liblbx.git/blobdiff - src/lbx.c
Split off _lbx_fseek() into a shared component of the library.
[liblbx.git] / src / lbx.c
index 8ddcf1860ec51b6665767cb0d9bfc6738a900a2a..d3815a92e2a382acef57e7fd41ddb4cc5a2d1f8f 100644 (file)
--- a/src/lbx.c
+++ b/src/lbx.c
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+#      include "config.h"
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #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;
 
@@ -165,43 +169,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)
 {
@@ -225,7 +192,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) {