0
|
1 /*-
|
|
2 * RAZF : Random Access compressed(Z) File
|
|
3 * Version: 1.0
|
|
4 * Release Date: 2008-10-27
|
|
5 *
|
|
6 * Copyright 2008, Jue Ruan <ruanjue@gmail.com>, Heng Li <lh3@sanger.ac.uk>
|
|
7 *
|
|
8 * All rights reserved.
|
|
9 *
|
|
10 * Redistribution and use in source and binary forms, with or without
|
|
11 * modification, are permitted provided that the following conditions
|
|
12 * are met:
|
|
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.
|
|
18 *
|
|
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
|
|
29 * SUCH DAMAGE.
|
|
30 */
|
|
31
|
|
32
|
|
33 #ifndef __RAZF_RJ_H
|
|
34 #define __RAZF_RJ_H
|
|
35
|
|
36 #include <stdint.h>
|
|
37 #include <stdio.h>
|
|
38 #include "zlib.h"
|
|
39
|
|
40 #ifdef _USE_KNETFILE
|
|
41 #include "knetfile.h"
|
|
42 #endif
|
|
43
|
|
44 #if ZLIB_VERNUM < 0x1221
|
|
45 #define _RZ_READONLY
|
|
46 struct _gz_header_s;
|
|
47 typedef struct _gz_header_s _gz_header;
|
|
48 #define gz_header _gz_header
|
|
49 #endif
|
|
50
|
|
51 #define WINDOW_BITS 15
|
|
52
|
|
53 #ifndef RZ_BLOCK_SIZE
|
|
54 #define RZ_BLOCK_SIZE (1<<WINDOW_BITS)
|
|
55 #endif
|
|
56
|
|
57 #ifndef RZ_BUFFER_SIZE
|
|
58 #define RZ_BUFFER_SIZE 4096
|
|
59 #endif
|
|
60
|
|
61 #ifndef RZ_COMPRESS_LEVEL
|
|
62 #define RZ_COMPRESS_LEVEL 6
|
|
63 #endif
|
|
64
|
|
65 #define RZ_BIN_SIZE ((1LLU << 32) / RZ_BLOCK_SIZE)
|
|
66
|
|
67 typedef struct {
|
|
68 uint32_t *cell_offsets; // i
|
|
69 int64_t *bin_offsets; // i / BIN_SIZE
|
|
70 int size;
|
|
71 int cap;
|
|
72 } ZBlockIndex;
|
|
73 /* When storing index, output bytes in Big-Endian everywhere */
|
|
74
|
|
75 #define FILE_TYPE_RZ 1
|
|
76 #define FILE_TYPE_PLAIN 2
|
|
77 #define FILE_TYPE_GZ 3
|
|
78
|
|
79 typedef struct RandomAccessZFile {
|
|
80 char mode; /* 'w' : write mode; 'r' : read mode */
|
|
81 int file_type;
|
|
82 /* plain file or rz file, razf_read support plain file as input too, in this case, razf_read work as buffered fread */
|
|
83 #ifdef _USE_KNETFILE
|
|
84 union {
|
|
85 knetFile *fpr;
|
|
86 int fpw;
|
|
87 } x;
|
|
88 #else
|
|
89 int filedes; /* the file descriptor */
|
|
90 #endif
|
|
91 z_stream *stream;
|
|
92 ZBlockIndex *index;
|
|
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;
|
|
101 int header_size;
|
|
102 gz_header *header;
|
|
103 /* header is used to transfer inflate_state->mode from HEAD to TYPE after call inflateReset */
|
|
104 int buf_off, buf_len;
|
|
105 int z_err, z_eof;
|
|
106 int seekable;
|
|
107 /* Indice where the source is seekable */
|
|
108 int load_index;
|
|
109 /* set has_index to 0 in mode 'w', then index will be discarded */
|
|
110 } RAZF;
|
|
111
|
|
112 #ifdef __cplusplus
|
|
113 extern "C" {
|
|
114 #endif
|
|
115
|
|
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);
|
|
122
|
|
123 #define razf_tell(rz) ((rz)->out)
|
|
124
|
|
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);
|
|
129
|
|
130 #ifdef __cplusplus
|
|
131 }
|
|
132 #endif
|
|
133
|
|
134 #endif
|