Mercurial > repos > lsong10 > psiclass
comparison PsiCLASS-1.0.2/samtools-0.1.19/razf.h @ 0:903fc43d6227 draft default tip
Uploaded
| author | lsong10 |
|---|---|
| date | Fri, 26 Mar 2021 16:52:45 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:903fc43d6227 |
|---|---|
| 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 |
