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
#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;
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)
{
assert(lbx->f);
- if (_lbx_fseek(lbx, base) == -1)
+ if (_lbx_fseek(lbx->f, &lbx->foff, base) == -1)
return 0;
while (len) {
#ifndef LBX_H_
#define LBX_H_
-#include <stddef.h>
+#include <stdio.h>
/* Errors */
enum {
--- /dev/null
+#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;
+}
--- /dev/null
+#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