xref: /netbsd/common/dist/zlib/examples/zran.h (revision 6164d288)
1*6164d288Schristos /* zran.h -- example of zlib/gzip stream indexing and random access
2*6164d288Schristos  * Copyright (C) 2005, 2012, 2018 Mark Adler
3*6164d288Schristos  * For conditions of distribution and use, see copyright notice in zlib.h
4*6164d288Schristos  * Version 1.2  14 Oct 2018  Mark Adler */
5*6164d288Schristos 
6*6164d288Schristos #include <stdio.h>
7*6164d288Schristos #include "zlib.h"
8*6164d288Schristos 
9*6164d288Schristos /* Access point list. */
10*6164d288Schristos struct deflate_index {
11*6164d288Schristos     int have;           /* number of list entries */
12*6164d288Schristos     int gzip;           /* 1 if the index is of a gzip file, 0 if it is of a
13*6164d288Schristos                            zlib stream */
14*6164d288Schristos     off_t length;       /* total length of uncompressed data */
15*6164d288Schristos     void *list;         /* allocated list of entries */
16*6164d288Schristos };
17*6164d288Schristos 
18*6164d288Schristos /* Make one entire pass through a zlib or gzip compressed stream and build an
19*6164d288Schristos    index, with access points about every span bytes of uncompressed output.
20*6164d288Schristos    gzip files with multiple members are indexed in their entirety. span should
21*6164d288Schristos    be chosen to balance the speed of random access against the memory
22*6164d288Schristos    requirements of the list, about 32K bytes per access point. The return value
23*6164d288Schristos    is the number of access points on success (>= 1), Z_MEM_ERROR for out of
24*6164d288Schristos    memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a file
25*6164d288Schristos    read error. On success, *built points to the resulting index. */
26*6164d288Schristos int deflate_index_build(FILE *in, off_t span, struct deflate_index **built);
27*6164d288Schristos 
28*6164d288Schristos /* Deallocate an index built by deflate_index_build() */
29*6164d288Schristos void deflate_index_free(struct deflate_index *index);
30*6164d288Schristos 
31*6164d288Schristos /* Use the index to read len bytes from offset into buf. Return bytes read or
32*6164d288Schristos    negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past
33*6164d288Schristos    the end of the uncompressed data, then deflate_index_extract() will return a
34*6164d288Schristos    value less than len, indicating how much was actually read into buf. This
35*6164d288Schristos    function should not return a data error unless the file was modified since
36*6164d288Schristos    the index was generated, since deflate_index_build() validated all of the
37*6164d288Schristos    input. deflate_index_extract() will return Z_ERRNO if there is an error on
38*6164d288Schristos    reading or seeking the input file. */
39*6164d288Schristos int deflate_index_extract(FILE *in, struct deflate_index *index, off_t offset,
40*6164d288Schristos                           unsigned char *buf, int len);
41