Imported Debian patch 0.1.5c-1
[samtools.git] / razf.h
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 #if ZLIB_VERNUM < 0x1221
41 #define _RZ_READONLY
42 struct _gz_header_s;
43 typedef struct _gz_header_s _gz_header;
44 #define gz_header _gz_header
45 #endif
46
47 #define WINDOW_BITS   15
48
49 #ifndef RZ_BLOCK_SIZE
50 #define RZ_BLOCK_SIZE (1<<WINDOW_BITS)
51 #endif
52
53 #ifndef RZ_BUFFER_SIZE
54 #define RZ_BUFFER_SIZE 4096
55 #endif
56
57 #ifndef RZ_COMPRESS_LEVEL
58 #define RZ_COMPRESS_LEVEL 6
59 #endif
60
61 #define RZ_BIN_SIZE ((1LLU << 32) / RZ_BLOCK_SIZE)
62
63 typedef struct {
64         uint32_t *cell_offsets; // i
65         int64_t  *bin_offsets; // i / BIN_SIZE
66         int size;
67         int cap;
68 } ZBlockIndex;
69 /* When storing index, output bytes in Big-Endian everywhere */
70
71 #define FILE_TYPE_RZ    1
72 #define FILE_TYPE_PLAIN 2
73 #define FILE_TYPE_GZ    3
74
75 typedef struct RandomAccessZFile  {
76         char mode; /* 'w' : write mode; 'r' : read mode */
77         int file_type;
78         /* plain file or rz file, razf_read support plain file as input too, in this case, razf_read work as buffered fread */
79         int filedes; /* the file descriptor */
80         z_stream *stream;
81         ZBlockIndex *index;
82         int64_t in, out, end, src_end;
83         /* in: n bytes total in; out: n bytes total out; */
84         /* end: the end of all data blocks, while the start of index; src_end: the true end position in uncompressed file */
85         int buf_flush; // buffer should be flush, suspend inflate util buffer is empty
86         int64_t block_pos, block_off, next_block_pos;
87         /* block_pos: the start postiion of current block  in compressed file */
88         /* block_off: tell how many bytes have been read from current block */
89         void *inbuf, *outbuf;
90         int header_size;
91         gz_header *header;
92         /* header is used to transfer inflate_state->mode from HEAD to TYPE after call inflateReset */
93         int buf_off, buf_len;
94         int z_err, z_eof;
95         int seekable;
96         /* Indice where the source is seekable */
97         int load_index;
98         /* set has_index to 0 in mode 'w', then index will be discarded */
99 } RAZF;
100
101 #ifdef __cplusplus
102 extern "C" {
103 #endif
104
105         RAZF* razf_dopen(int data_fd, const char *mode);
106         RAZF *razf_open(const char *fn, const char *mode);
107         int razf_write(RAZF* rz, const void *data, int size);
108         int razf_read(RAZF* rz, void *data, int size);
109         int64_t razf_seek(RAZF* rz, int64_t pos, int where);
110         void razf_close(RAZF* rz);
111
112 #define razf_tell(rz) ((rz)->out)
113
114         RAZF* razf_open2(const char *filename, const char *mode);
115         RAZF* razf_dopen2(int fd, const char *mode);
116         uint64_t razf_tell2(RAZF *rz);
117         int64_t razf_seek2(RAZF *rz, uint64_t voffset, int where);
118
119 #ifdef __cplusplus
120 }
121 #endif
122
123 #endif