forked from lh3/samtools
-
Notifications
You must be signed in to change notification settings - Fork 1
/
razf.h
134 lines (115 loc) · 4.15 KB
/
razf.h
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*-
* RAZF : Random Access compressed(Z) File
* Version: 1.0
* Release Date: 2008-10-27
*
* Copyright 2008, Jue Ruan <[email protected]>, Heng Li <[email protected]>
*
* 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"
#ifdef _USE_KNETFILE
#include "knetfile.h"
#endif
#if ZLIB_VERNUM < 0x1221
#define _RZ_READONLY
struct _gz_header_s;
typedef struct _gz_header_s _gz_header;
#define gz_header _gz_header
#endif
#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 ((1ULL << 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 */
#ifdef _USE_KNETFILE
union {
knetFile *fpr;
int fpw;
} x;
#else
int filedes; /* the file descriptor */
#endif
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