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