filter duplicated blocks
[opensuse:clicfs.git] / doenerfs.h
1 #include <stdint.h>
2 #include <stdio.h>
3 #include <limits.h>
4 #include <sys/types.h>
5
6 extern int preset;
7 extern FILE *packfile;
8
9 #define DOENER_MAGIC 1
10
11 extern char thefile[PATH_MAX];
12 extern size_t thefilesize;
13 extern uint64_t *sizes;
14 extern uint64_t *offs;
15 extern uint32_t parts;
16 extern uint32_t pindex;
17 extern size_t bsize;
18
19 struct block {
20     uint32_t orig;
21     uint32_t mapped;
22 };
23 extern struct block *blocks;
24
25 /* qsort int comparison function */
26 static inline int block_cmp(const void *a, const void *b)
27 {
28     const struct block *ba = (const struct block *)a; // casting pointer types
29     const struct block *bb = (const struct block *)b;
30     return ba->orig  - bb->orig;
31 }
32
33 /* slightly modified binary_search.
34    If target is not found, return the index of the value that's
35    in the array before it
36 */
37 static inline int binary_search(struct block *A, int size, uint32_t target)
38 {
39     int lo = 0, hi = size-1;
40     if (target > A[hi].orig)
41         return hi;
42     while (lo <= hi) {
43         int mid = lo + (hi-lo)/2;
44         if (A[mid].orig == target)
45             return mid;
46         else {
47             if (A[mid].orig < target)
48                 lo = mid+1;
49             else
50                 hi = mid-1;
51         }
52     }
53
54     return hi;
55 }
56
57 extern int doenerfs_read_pack(const char *packfilename);
58 extern void doener_decompress_part(unsigned char *out, const unsigned char *in, size_t size);
59 extern size_t doener_readpart(unsigned char *buffer, int part);
60 extern off_t doener_map_block(off_t block);