--- /dev/null +++ htslib/os/lzma_stub.h @@ -0,0 +1,85 @@ +#ifndef LZMA_STUB_H +#define LZMA_STUB_H + +/* Some platforms, notably macOS, ship a usable liblzma shared library but + do not ship any LZMA header files. The <lzma.h> and <lzma/{*}.h> header + files that come with the library contain the following statement: + + * + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + + Accordingly the following declarations have been copied and distilled + from <lzma/base.h> and <lzma/container.h> (primarily) and are sufficient + to compile cram/cram_io.c in the absence of proper LZMA headers. + + This file, lzma_stub.h, remains in the public domain. */ + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { LZMA_OK = 0, LZMA_STREAM_END = 1 } lzma_ret; +typedef enum { LZMA_RUN = 0, LZMA_FINISH = 3 } lzma_action; +typedef enum { LZMA_CHECK_CRC32 = 1 } lzma_check; +typedef enum { LZMA_RESERVED_ENUM = 0 } lzma_reserved_enum; + +struct lzma_allocator; +struct lzma_internal; + +typedef struct { + const uint8_t *next_in; + size_t avail_in; + uint64_t total_in; + + uint8_t *next_out; + size_t avail_out; + uint64_t total_out; + + const struct lzma_allocator *allocator; + struct lzma_internal *internal; + + void *reserved_ptr1; + void *reserved_ptr2; + void *reserved_ptr3; + void *reserved_ptr4; + uint64_t reserved_int1; + uint64_t reserved_int2; + size_t reserved_int3; + size_t reserved_int4; + lzma_reserved_enum reserved_enum1; + lzma_reserved_enum reserved_enum2; +} lzma_stream; + +#define LZMA_STREAM_INIT \ + { NULL, 0, 0, NULL, 0, 0, NULL, NULL, \ + NULL, NULL, NULL, NULL, 0, 0, 0, 0, \ + LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM } + +extern size_t lzma_stream_buffer_bound(size_t uncompressed_size); + +extern lzma_ret lzma_easy_buffer_encode( + uint32_t preset, lzma_check check, + const struct lzma_allocator *allocator, + const uint8_t *in, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size); + +extern lzma_ret lzma_stream_decoder( + lzma_stream *strm, uint64_t memlimit, uint32_t flags); + +extern uint64_t lzma_easy_decoder_memusage(uint32_t preset); + +extern lzma_ret lzma_code(lzma_stream *strm, lzma_action action); + +extern void lzma_end(lzma_stream *strm); + +#ifdef __cplusplus +} +#endif + +#endif --- /dev/null +++ htslib/os/rand.c @@ -0,0 +1,97 @@ +/* rand.c -- drand48 implementation from the FreeBSD source tree. */ + +// This file is an amalgamation of the many small files in FreeBSD to do with +// drand48 and friends implementations. +// It comprises _rand48.c, rand48.h, srand48.c, drand48.c, erand48.c, lrand48.c + +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +//#include <sys/cdefs.h> +//__FBSDID("$FreeBSD: src/lib/libc/gen/_rand48.c,v 1.2 2002/03/22 21:52:05 obrien Exp $"); + +#include <math.h> + +#define RAND48_SEED_0 (0x330e) +#define RAND48_SEED_1 (0xabcd) +#define RAND48_SEED_2 (0x1234) +#define RAND48_MULT_0 (0xe66d) +#define RAND48_MULT_1 (0xdeec) +#define RAND48_MULT_2 (0x0005) +#define RAND48_ADD (0x000b) + +static unsigned short _rand48_seed[3] = { + RAND48_SEED_0, + RAND48_SEED_1, + RAND48_SEED_2 +}; +static unsigned short _rand48_mult[3] = { + RAND48_MULT_0, + RAND48_MULT_1, + RAND48_MULT_2 +}; +static unsigned short _rand48_add = RAND48_ADD; + +static void +_dorand48(unsigned short xseed[3]) +{ + unsigned long accu; + unsigned short temp[2]; + + accu = (unsigned long) _rand48_mult[0] * (unsigned long) xseed[0] + + (unsigned long) _rand48_add; + temp[0] = (unsigned short) accu; /* lower 16 bits */ + accu >>= sizeof(unsigned short) * 8; + accu += (unsigned long) _rand48_mult[0] * (unsigned long) xseed[1] + + (unsigned long) _rand48_mult[1] * (unsigned long) xseed[0]; + temp[1] = (unsigned short) accu; /* middle 16 bits */ + accu >>= sizeof(unsigned short) * 8; + accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0]; + xseed[0] = temp[0]; + xseed[1] = temp[1]; + xseed[2] = (unsigned short) accu; +} + +void +hts_srand48(long seed) +{ + _rand48_seed[0] = RAND48_SEED_0; + _rand48_seed[1] = (unsigned short) seed; + _rand48_seed[2] = (unsigned short) (seed >> 16); + _rand48_mult[0] = RAND48_MULT_0; + _rand48_mult[1] = RAND48_MULT_1; + _rand48_mult[2] = RAND48_MULT_2; + _rand48_add = RAND48_ADD; +} + +double +hts_erand48(unsigned short xseed[3]) +{ + _dorand48(xseed); + return ldexp((double) xseed[0], -48) + + ldexp((double) xseed[1], -32) + + ldexp((double) xseed[2], -16); +} + +double +hts_drand48(void) +{ + return hts_erand48(_rand48_seed); +} + +long +hts_lrand48(void) +{ + _dorand48(_rand48_seed); + return ((long) _rand48_seed[2] << 15) + ((long) _rand48_seed[1] >> 1); +} --- /dev/null +++ htslib/version.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +# Master version, for use in tarballs or non-git source copies +VERSION=1.9 + +# If we have a git clone, then check against the current tag +if [ -e .git ] +then + # If we ever get to 10.x this will need to be more liberal + VERSION=`git describe --match '[0-9].[0-9]*' --dirty` +fi + +# Numeric version is for use in .dylib or .so libraries +# +# Follows the same logic from the Makefile commit c2e93911 +# as non-numeric versions get bumped to patch level 255 to indicate +# an unknown value. +if [ "$1" = "numeric" ] +then + v1=`expr "$VERSION" : '\([0-9]*\)'` + v2=`expr "$VERSION" : '[0-9]*.\([0-9]*\)'` + v3=`expr "$VERSION" : '[0-9]*.[0-9]*.\([0-9]*\)'` + if [ -z "`expr "$VERSION" : '^\([0-9.]*\)$'`" ] + then + VERSION="$v1.$v2.255" + else + VERSION="$v1.$v2${v3:+.}$v3" + fi +fi + +echo $VERSION