Fossil SCM

fossil-scm / compat / zlib / examples / zran.h
Blame History Raw 54 lines
1
/* zran.h -- example of deflate stream indexing and random access
2
* Copyright (C) 2005, 2012, 2018, 2023, 2024, 2025 Mark Adler
3
* For conditions of distribution and use, see copyright notice in zlib.h
4
* Version 1.7 16 May 2025 Mark Adler */
5
6
#include <stdio.h>
7
#include "zlib.h"
8
9
// Access point.
10
typedef struct point {
11
off_t out; // offset in uncompressed data
12
off_t in; // offset in compressed file of first full byte
13
int bits; // 0, or number of bits (1-7) from byte at in-1
14
unsigned dict; // number of bytes in window to use as a dictionary
15
unsigned char *window; // preceding 32K (or less) of uncompressed data
16
} point_t;
17
18
// Access point list.
19
struct deflate_index {
20
int have; // number of access points in list
21
int mode; // -15 for raw, 15 for zlib, or 31 for gzip
22
off_t length; // total length of uncompressed data
23
point_t *list; // allocated list of access points
24
z_stream strm; // re-usable inflate engine for extraction
25
};
26
27
// Make one pass through a zlib, gzip, or raw deflate compressed stream and
28
// build an index, with access points about every span bytes of uncompressed
29
// output. gzip files with multiple members are fully indexed. span should be
30
// chosen to balance the speed of random access against the memory requirements
31
// of the list, which is about 32K bytes per access point. The return value is
32
// the number of access points on success (>= 1), Z_MEM_ERROR for out of
33
// memory, Z_BUF_ERROR for a premature end of input, Z_DATA_ERROR for a format
34
// or verification error in the input file, or Z_ERRNO for a file read error.
35
// On success, *built points to the resulting index, otherwise it's NULL.
36
int deflate_index_build(FILE *in, off_t span, struct deflate_index **built);
37
38
// Use the index to read len bytes from offset into buf. Return the number of
39
// bytes read or a negative error code. If data is requested past the end of
40
// the uncompressed data, then deflate_index_extract() will return a value less
41
// than len, indicating how much was actually read into buf. If given a valid
42
// index, this function should not return an error unless the file was modified
43
// somehow since the index was generated, given that deflate_index_build() had
44
// validated all of the input. If nevertheless there is a failure, Z_BUF_ERROR
45
// is returned if the compressed data ends prematurely, Z_DATA_ERROR if the
46
// deflate compressed data is not valid, Z_MEM_ERROR if out of memory,
47
// Z_STREAM_ERROR if the index is not valid, or Z_ERRNO if there is an error
48
// reading or seeking on the input file.
49
ptrdiff_t deflate_index_extract(FILE *in, struct deflate_index *index,
50
off_t offset, unsigned char *buf, size_t len);
51
52
// Deallocate an index built by deflate_index_build().
53
void deflate_index_free(struct deflate_index *index);
54

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button