-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrazf.h
More file actions
117 lines (100 loc) · 3.78 KB
/
Copy pathrazf.h
File metadata and controls
117 lines (100 loc) · 3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*-
* RAZF : Random Access compressed(Z) File
* Version: 1.0
* Release Date: 2008-10-27
*
* Copyright 2008, Jue Ruan <ruanjue@gmail.com>, Heng Li <lh3@sanger.ac.uk>
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef __RAZF_RJ_H
#define __RAZF_RJ_H
#include <stdint.h>
#include <stdio.h>
#include "zlib.h"
#include "zutil.h"
#define WINDOW_BITS 15
#ifndef RZ_BLOCK_SIZE
#define RZ_BLOCK_SIZE (1<<WINDOW_BITS)
#endif
#ifndef RZ_BUFFER_SIZE
#define RZ_BUFFER_SIZE 4096
#endif
#ifndef RZ_COMPRESS_LEVEL
#define RZ_COMPRESS_LEVEL 6
#endif
#define RZ_BIN_SIZE ((1LLU << 32) / RZ_BLOCK_SIZE)
typedef struct {
uint32_t *cell_offsets; // i
int64_t *bin_offsets; // i / BIN_SIZE
int size;
int cap;
} ZBlockIndex;
/* When storing index, output bytes in Big-Endian everywhere */
#define FILE_TYPE_RZ 1
#define FILE_TYPE_PLAIN 2
#define FILE_TYPE_GZ 3
typedef struct RandomAccessZFile {
char mode; /* 'w' : write mode; 'r' : read mode */
int file_type;
/* plain file or rz file, razf_read support plain file as input too, in this case, razf_read work as buffered fread */
int filedes; /* the file descriptor */
z_stream *stream;
ZBlockIndex *index;
int64_t in, out, end, src_end;
/* in: n bytes total in; out: n bytes total out; */
/* end: the end of all data blocks, while the start of index; src_end: the true end position in uncompressed file */
int buf_flush; // buffer should be flush, suspend inflate util buffer is empty
int64_t block_pos, block_off, next_block_pos;
/* block_pos: the start postiion of current block in compressed file */
/* block_off: tell how many bytes have been read from current block */
void *inbuf, *outbuf;
int header_size;
gz_header *header;
/* header is used to transfer inflate_state->mode from HEAD to TYPE after call inflateReset */
int buf_off, buf_len;
int z_err, z_eof;
int seekable;
/* Indice where the source is seekable */
int load_index;
/* set has_index to 0 in mode 'w', then index will be discarded */
} RAZF;
#ifdef __cplusplus
extern "C" {
#endif
RAZF* razf_dopen(int data_fd, const char *mode);
RAZF *razf_open(const char *fn, const char *mode);
int razf_write(RAZF* rz, const void *data, int size);
int razf_read(RAZF* rz, void *data, int size);
int64_t razf_seek(RAZF* rz, int64_t pos, int where);
void razf_close(RAZF* rz);
#define razf_tell(rz) ((rz)->out)
RAZF* razf_open2(const char *filename, const char *mode);
RAZF* razf_dopen2(int fd, const char *mode);
uint64_t razf_tell2(RAZF *rz);
int64_t razf_seek2(RAZF *rz, uint64_t voffset, int where);
#ifdef __cplusplus
}
#endif
#endif