b29f1fbf93c9df5aa65fed050d9f8132dc6a2c73 braney Tue Nov 24 14:20:10 2015 -0800 support htslib for sam/bam/cram/tabix support #14717 diff --git src/lib/knetUdc.c src/lib/knetUdc.c index 4bbf9c2..0b85438 100644 --- src/lib/knetUdc.c +++ src/lib/knetUdc.c @@ -1,97 +1,106 @@ /* knetUdc -- install udc i/o functions in knetfile interface in samtools. */ /* As of 2/23/10, the KNETFILE_HOOKS extension is a UCSC-local modification of samtools. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #if ((defined USE_BAM || defined USE_TABIX) && defined KNETFILE_HOOKS) #include "common.h" #include "udc.h" #include "knetUdc.h" +#ifdef USE_HTS +#include "htslib/knetfile.h" +#else #include "knetfile.h" struct knetFile_s { struct udcFile *udcf; }; // typedef'd to knetFile in knetfile.h +#endif static char *udcCacheDir = NULL; static knetFile *kuOpen(const char *filename, const char *mode) /* Open the given filename with mode which must be "r". */ { +#ifdef USE_HTS +if (!(sameOk((char *)mode, "r") || sameOk((char *)mode, "rb"))) + errAbort("mode passed to kuOpen must be 'r' or 'rb' not '%s'", mode); +#else if (!sameOk((char *)mode, "r")) errAbort("mode passed to kuOpen must be 'r' not '%s'", mode); +#endif struct udcFile *udcf = udcFileMayOpen((char *)filename, udcCacheDir); if (udcf == NULL) return NULL; knetFile *kf = NULL; AllocVar(kf); kf->udcf = udcf; verbose(2, "kuOpen: returning %lu\n", (unsigned long)(kf->udcf)); return kf; } static knetFile *kuDopen(int fd, const char *mode) /* Open from a file descriptor -- not necessary for our use of samtools. */ { errAbort("kuDopen not implemented"); return NULL; } static off_t kuRead(knetFile *fp, void *buf, off_t len) /* Read len bytes into buf, return amount actually read. */ { verbose(2, "udcRead(%lu, buf, %lld)\n", (unsigned long)(fp->udcf), (long long)len); return (off_t)udcRead(fp->udcf, buf, (int)len); } static off_t kuSeek(knetFile *fp, int64_t off, int whence) /* Seek to off according to whence (but don't waste time with samtools' SEEK_END to * check empty record at end of file. Don't be fooled by the off_t return type -- * it's 0 for OK, non-0 for fail. */ { bits64 offset; if (whence == SEEK_SET) offset = off; else if (whence == SEEK_CUR) offset = off+ udcTell(fp->udcf); else return -1; verbose(2, "udcSeek(%lu, %lld)\n", (unsigned long)(fp->udcf), offset); udcSeek(fp->udcf, offset); return 0; } static off_t kuTell(knetFile *fp) /* Tell current offset in file. */ { verbose(2, "udcTell(%lu)\n", (unsigned long)(fp->udcf)); return udcTell(fp->udcf); } static int kuClose(knetFile *fp) /* Close and free fp->udcf. */ { verbose(2, "udcClose(%lu)\n", (unsigned long)(fp->udcf)); udcFileClose(&(fp->udcf)); return 0; } void knetUdcInstall() /* install udc i/o functions in knetfile interface in Heng Li's samtools lib. */ { // maybe init udcCacheDir from hg.conf? knet_init_alt(kuOpen, kuDopen, kuRead, kuSeek, kuTell, kuClose); } #else// no (USE_BAM || USE_TABIX) && KNETFILE_HOOKS void knetUdcInstall() /* Required libs aren't installed; do nothing. */ { } #endif