7df6e18265341f87a69fba808aa1f92f8ebca841 markd Wed Apr 15 13:39:42 2026 -0700 move copy of htslib diff --git src/htslib/cram/zfio.c src/htslib/cram/zfio.c deleted file mode 100644 index 46727c5c413..00000000000 --- src/htslib/cram/zfio.c +++ /dev/null @@ -1,183 +0,0 @@ -/* -Copyright (c) 2009-2013 Genome Research Ltd. -Author: James Bonfield <jkb@sanger.ac.uk> - -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. - - 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger -Institute nor the names of its contributors may be used to endorse or promote -products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD 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 GENOME RESEARCH LTD 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. -*/ - -#include <config.h> - -#include <stdlib.h> -#include <unistd.h> - -#include "cram/os.h" -#include "cram/zfio.h" - -/* ------------------------------------------------------------------------ */ -/* Some wrappers around FILE * vs gzFile *, allowing for either */ - -/* - * gzopen() works on both compressed and uncompressed data, but it has - * a significant performance hit even for uncompressed data (tested as - * 25s using FILE* to 46s via gzOpen and 66s via gzOpen when gzipped). - * - * Hence we use our own wrapper 'zfp' which is a FILE* when uncompressed - * and gzFile* when compressed. This also means we could hide bzopen in - * there too if desired. - */ - -off_t zftello(zfp *zf) { - return zf->fp ? ftello(zf->fp) : -1; -} - -int zfseeko(zfp *zf, off_t offset, int whence) { - return zf->fp ? fseeko(zf->fp, offset, whence) : -1; -} - - -/* - * A wrapper for either fgets or gzgets depending on what has been - * opened. - */ -char *zfgets(char *line, int size, zfp *zf) { - if (zf->fp) - return fgets(line, size, zf->fp); - else - return gzgets(zf->gz, line, size); -} - -/* - * A wrapper for either fputs or gzputs depending on what has been - * opened. - */ -int zfputs(char *line, zfp *zf) { - if (zf->fp) - return fputs(line, zf->fp); - else - return gzputs(zf->gz, line) ? 0 : EOF; -} - -/* - * Peeks at and returns the next character without consuming it from the - * input. (Ie a combination of getc and ungetc). - */ -int zfpeek(zfp *zf) { - int c; - - if (zf->fp) { - c = getc(zf->fp); - if (c != EOF) - ungetc(c, zf->fp); - } else { - c = gzgetc(zf->gz); - if (c != EOF) - gzungetc(c, zf->gz); - } - - return c; -} - -/* A replacement for either feof of gzeof */ -int zfeof(zfp *zf) { - return zf->fp ? feof(zf->fp) : gzeof(zf->gz); -} - -/* A replacement for either fopen or gzopen */ -zfp *zfopen(const char *path, const char *mode) { - char path2[1024]; - zfp *zf; - - if (!(zf = (zfp *)malloc(sizeof(*zf)))) - return NULL; - zf->fp = NULL; - zf->gz = NULL; - - /* Try normal fopen */ - if (mode[0] != 'z' && mode[1] != 'z' && - NULL != (zf->fp = fopen(path, mode))) { - unsigned char magic[2]; - if (2 != fread(magic, 1, 2, zf->fp)) { - free(zf); - return NULL; - } - if (!(magic[0] == 0x1f && - magic[1] == 0x8b)) { - fseeko(zf->fp, 0, SEEK_SET); - return zf; - } - - fclose(zf->fp); - zf->fp = NULL; - } - -#ifdef HAVE_POPEN - /* - * I've no idea why, by gzgets is VERY slow, maybe because it handles - * arbitrary seeks. - * popen to gzip -cd is 3 times faster though. - */ - if (*mode == 'w') { - } else { - if (access(path, R_OK) == 0) { - sprintf(path2, "gzip -cd < %.*s", 1000, path); - if (NULL != (zf->fp = popen(path2, "r"))) - return zf; - } - - sprintf(path2, "gzip -cd < %.*s.gz", 1000, path); - if (NULL != (zf->fp = popen(path2, "r"))) - return zf; - - printf("Failed on %s\n", path); - } else { - sprintf(path2, "gzip > %.*s", 1000, path); - if (NULL != (zf->fp = popen(path2, "w"))) - return zf; - } - - printf("Failed on %s\n", path); - } -#else - /* Gzopen instead */ - if ((zf->gz = gzopen(path, mode))) - return zf; - - sprintf(path2, "%.*s.gz", 1020, path); - if ((zf->gz = gzopen(path2, mode))) - return zf; -#endif - - perror(path); - - free(zf); - return NULL; -} - -int zfclose(zfp *zf) { - int r = (zf->fp) ? fclose(zf->fp) : gzclose(zf->gz); - free(zf); - return r; -}