]> git.draconx.ca Git - liblbx.git/blob - src/misc.c
b09e6186f71bc0d717019409c83f41e1a52d9054
[liblbx.git] / src / misc.c
1 #ifdef HAVE_CONFIG_H
2 #       include "config.h"
3 #endif
4
5 #include <stdio.h>
6 #include <errno.h>
7
8 #include "misc.h"
9 #include "lbx.h"
10
11 int _lbx_fseek(FILE *f, long *current, size_t offset)
12 {
13         static unsigned char oblivion[1024];
14         long dist;
15
16         if (*current < offset) {
17                 dist = offset - *current;
18         } else if (*current > offset) {
19                 dist = -(long)(*current - offset);
20         } else {
21                 return 0;
22         }
23
24         if (fseek(f, dist, SEEK_CUR) == 0) {
25                 *current += dist;
26         } else if (*current < offset) {
27                 while (dist) {
28                         size_t rc, amt = MIN(sizeof oblivion, dist);
29                         rc = fread(oblivion, 1, amt, f);
30                         *current += rc;
31                         dist -= rc;
32                         if (rc < amt) {
33                                 if (feof(f))
34                                         lbx_errno = LBX_EEOF;
35                                 else
36                                         lbx_errno = -errno;
37                                 return -1;
38                         }
39                 }
40         } else {
41                 lbx_errno = -errno;
42                 return -1;
43         }
44         return 0;
45 }