]> git.draconx.ca Git - liblbx.git/commitdiff
Split off _lbx_fseek() into a shared component of the library.
authorNick Bowler <draconx@gmail.com>
Sat, 29 Dec 2007 23:08:48 +0000 (18:08 -0500)
committerNick Bowler <draconx@gmail.com>
Sat, 29 Dec 2007 23:08:48 +0000 (18:08 -0500)
src/Makefile.am
src/lbx.c
src/lbx.h
src/misc.c [new file with mode: 0644]
src/misc.h [new file with mode: 0644]

index 6867d306aa4185f4bc64207ba7e76c6232babdc0..8bec70027a5f9eb8f4221e5f21da66b4f69e4853 100644 (file)
@@ -2,7 +2,7 @@ lib_LTLIBRARIES   = liblbx.la
 bin_PROGRAMS      = lbxtool
 include_HEADERS   = lbx.h
 
-liblbx_la_SOURCES = byteorder.h lbx.c image.c
+liblbx_la_SOURCES = byteorder.h misc.h misc.c lbx.c image.c
 
 lbxtool_SOURCES   = lbxtool.c
 lbxtool_LDADD     = liblbx.la
index 253da5e870485bab33249f28bd872bdad2146703..d3815a92e2a382acef57e7fd41ddb4cc5a2d1f8f 100644 (file)
--- a/src/lbx.c
+++ b/src/lbx.c
 #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 +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)
 {
@@ -229,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) {
index 78e4502bec5f0f60167be60c63d35b765323507d..ec525d0bf56eee05b6fa12eee283b43d8e0ea09b 100644 (file)
--- a/src/lbx.h
+++ b/src/lbx.h
@@ -1,7 +1,7 @@
 #ifndef LBX_H_
 #define LBX_H_
 
-#include <stddef.h>
+#include <stdio.h>
 
 /* Errors */
 enum {
diff --git a/src/misc.c b/src/misc.c
new file mode 100644 (file)
index 0000000..b09e618
--- /dev/null
@@ -0,0 +1,45 @@
+#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;
+}
diff --git a/src/misc.h b/src/misc.h
new file mode 100644 (file)
index 0000000..d7a7605
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef LBX_MISC_H_
+#define LBX_MISC_H_
+
+#include <stdio.h>
+
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MAX(a,b) (((a)>(b))?(a):(b))
+
+/** _lbx_fseek()
+ * Seeks the specified file to the specified offset, given that the file is
+ * currently positioned at *current.  If the file does not support seeking,
+ * and offset > *current, perform the seek by reading (and discarding) data.
+ */
+int _lbx_fseek(FILE *f, long *current, size_t offset);
+
+#endif