2 * RAZF : Random Access compressed(Z) File
4 * Release Date: 2008-10-27
6 * Copyright 2008, Jue Ruan <ruanjue@gmail.com>, Heng Li <lh3@sanger.ac.uk>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 #if ZLIB_VERNUM < 0x1221
47 typedef struct _gz_header_s _gz_header
;
48 #define gz_header _gz_header
51 #define WINDOW_BITS 15
54 #define RZ_BLOCK_SIZE (1<<WINDOW_BITS)
57 #ifndef RZ_BUFFER_SIZE
58 #define RZ_BUFFER_SIZE 4096
61 #ifndef RZ_COMPRESS_LEVEL
62 #define RZ_COMPRESS_LEVEL 6
65 #define RZ_BIN_SIZE ((1LLU << 32) / RZ_BLOCK_SIZE)
68 uint32_t *cell_offsets
; // i
69 int64_t *bin_offsets
; // i / BIN_SIZE
73 /* When storing index, output bytes in Big-Endian everywhere */
75 #define FILE_TYPE_RZ 1
76 #define FILE_TYPE_PLAIN 2
77 #define FILE_TYPE_GZ 3
79 typedef struct RandomAccessZFile
{
80 char mode
; /* 'w' : write mode; 'r' : read mode */
82 /* plain file or rz file, razf_read support plain file as input too, in this case, razf_read work as buffered fread */
89 int filedes
; /* the file descriptor */
93 int64_t in
, out
, end
, src_end
;
94 /* in: n bytes total in; out: n bytes total out; */
95 /* end: the end of all data blocks, while the start of index; src_end: the true end position in uncompressed file */
96 int buf_flush
; // buffer should be flush, suspend inflate util buffer is empty
97 int64_t block_pos
, block_off
, next_block_pos
;
98 /* block_pos: the start postiion of current block in compressed file */
99 /* block_off: tell how many bytes have been read from current block */
100 void *inbuf
, *outbuf
;
103 /* header is used to transfer inflate_state->mode from HEAD to TYPE after call inflateReset */
104 int buf_off
, buf_len
;
107 /* Indice where the source is seekable */
109 /* set has_index to 0 in mode 'w', then index will be discarded */
116 RAZF
* razf_dopen(int data_fd
, const char *mode
);
117 RAZF
*razf_open(const char *fn
, const char *mode
);
118 int razf_write(RAZF
* rz
, const void *data
, int size
);
119 int razf_read(RAZF
* rz
, void *data
, int size
);
120 int64_t razf_seek(RAZF
* rz
, int64_t pos
, int where
);
121 void razf_close(RAZF
* rz
);
123 #define razf_tell(rz) ((rz)->out)
125 RAZF
* razf_open2(const char *filename
, const char *mode
);
126 RAZF
* razf_dopen2(int fd
, const char *mode
);
127 uint64_t razf_tell2(RAZF
*rz
);
128 int64_t razf_seek2(RAZF
*rz
, uint64_t voffset
, int where
);