7df6e18265341f87a69fba808aa1f92f8ebca841 markd Wed Apr 15 13:39:42 2026 -0700 move copy of htslib diff --git src/htslib/htslib/hfile.h src/htslib/htslib/hfile.h deleted file mode 100644 index cd772dd3244..00000000000 --- src/htslib/htslib/hfile.h +++ /dev/null @@ -1,215 +0,0 @@ -/* hfile.h -- buffered low-level input/output streams. - - Copyright (C) 2013-2015 Genome Research Ltd. - - Author: John Marshall <jm18@sanger.ac.uk> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. */ - -#ifndef HTSLIB_HFILE_H -#define HTSLIB_HFILE_H - -#include <string.h> - -#include <sys/types.h> - -#include "hts_defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* These fields are declared here solely for the benefit of the inline functions - below. They may change in future releases. User code should not use them - directly; you should imagine that hFILE is an opaque incomplete type. */ -struct hFILE_backend; -typedef struct hFILE { - char *buffer, *begin, *end, *limit; - const struct hFILE_backend *backend; - off_t offset; - unsigned at_eof:1; - int has_errno; -} hFILE; - -/*! - @abstract Open the named file or URL as a stream - @return An hFILE pointer, or NULL (with errno set) if an error occurred. - @notes The usual @c fopen(3) @a mode letters are supported: one of - @e r (read), @e w (write), @e a (append), optionally followed by any of - @e + (update), @e e (close on @c exec(2)), @e x (create exclusively). -*/ -hFILE *hopen(const char *filename, const char *mode) HTS_RESULT_USED; - -/*! - @abstract Associate a stream with an existing open file descriptor - @return An hFILE pointer, or NULL (with errno set) if an error occurred. - @notes For socket descriptors (on Windows), mode should contain 's'. -*/ -hFILE *hdopen(int fd, const char *mode) HTS_RESULT_USED; - -/*! - @abstract Report whether the file name or URL denotes remote storage - @return 0 if local, 1 if remote. - @notes "Remote" means involving e.g. explicit network access, with the - implication that callers may wish to cache such files' contents locally. -*/ -int hisremote(const char *filename) HTS_RESULT_USED; - -/*! - @abstract Flush (for output streams) and close the stream - @return 0 if successful, or EOF (with errno set) if an error occurred. -*/ -int hclose(hFILE *fp) HTS_RESULT_USED; - -/*! - @abstract Close the stream, without flushing or propagating errors - @notes For use while cleaning up after an error only. Preserves errno. -*/ -void hclose_abruptly(hFILE *fp); - -/*! - @abstract Return the stream's error indicator - @return Non-zero (in fact, an errno value) if an error has occurred. - @notes This would be called herror() and return true/false to parallel - ferror(3), but a networking-related herror(3) function already exists. */ -static inline int herrno(hFILE *fp) -{ - return fp->has_errno; -} - -/*! - @abstract Clear the stream's error indicator -*/ -static inline void hclearerr(hFILE *fp) -{ - fp->has_errno = 0; -} - -/*! - @abstract Reposition the read/write stream offset - @return The resulting offset within the stream (as per lseek(2)), - or negative if an error occurred. -*/ -off_t hseek(hFILE *fp, off_t offset, int whence) HTS_RESULT_USED; - -/*! - @abstract Report the current stream offset - @return The offset within the stream, starting from zero. -*/ -static inline off_t htell(hFILE *fp) -{ - return fp->offset + (fp->begin - fp->buffer); -} - -/*! - @abstract Read one character from the stream - @return The character read, or EOF on end-of-file or error -*/ -static inline int hgetc(hFILE *fp) -{ - extern int hgetc2(hFILE *); - return (fp->end > fp->begin)? (unsigned char) *(fp->begin++) : hgetc2(fp); -} - -/*! - @abstract Peek at characters to be read without removing them from buffers - @param fp The file stream - @param buffer The buffer to which the peeked bytes will be written - @param nbytes The number of bytes to peek at; limited by the size of the - internal buffer, which could be as small as 4K. - @return The number of bytes peeked, which may be less than nbytes if EOF - is encountered; or negative, if there was an I/O error. - @notes The characters peeked at remain in the stream's internal buffer, - and will be returned by later hread() etc calls. -*/ -ssize_t hpeek(hFILE *fp, void *buffer, size_t nbytes) HTS_RESULT_USED; - -/*! - @abstract Read a block of characters from the file - @return The number of bytes read, or negative if an error occurred. - @notes The full nbytes requested will be returned, except as limited - by EOF or I/O errors. -*/ -static inline ssize_t HTS_RESULT_USED -hread(hFILE *fp, void *buffer, size_t nbytes) -{ - extern ssize_t hread2(hFILE *, void *, size_t, size_t); - - size_t n = fp->end - fp->begin; - if (n > nbytes) n = nbytes; - memcpy(buffer, fp->begin, n); - fp->begin += n; - return (n == nbytes)? (ssize_t) n : hread2(fp, buffer, nbytes, n); -} - -/*! - @abstract Write a character to the stream - @return The character written, or EOF if an error occurred. -*/ -static inline int hputc(int c, hFILE *fp) -{ - extern int hputc2(int, hFILE *); - if (fp->begin < fp->limit) *(fp->begin++) = c; - else c = hputc2(c, fp); - return c; -} - -/*! - @abstract Write a string to the stream - @return 0 if successful, or EOF if an error occurred. -*/ -static inline int hputs(const char *text, hFILE *fp) -{ - extern int hputs2(const char *, size_t, size_t, hFILE *); - - size_t nbytes = strlen(text), n = fp->limit - fp->begin; - if (n > nbytes) n = nbytes; - memcpy(fp->begin, text, n); - fp->begin += n; - return (n == nbytes)? 0 : hputs2(text, nbytes, n, fp); -} - -/*! - @abstract Write a block of characters to the file - @return Either nbytes, or negative if an error occurred. - @notes In the absence of I/O errors, the full nbytes will be written. -*/ -static inline ssize_t HTS_RESULT_USED -hwrite(hFILE *fp, const void *buffer, size_t nbytes) -{ - extern ssize_t hwrite2(hFILE *, const void *, size_t, size_t); - - size_t n = fp->limit - fp->begin; - if (n > nbytes) n = nbytes; - memcpy(fp->begin, buffer, n); - fp->begin += n; - return (n==nbytes)? (ssize_t) n : hwrite2(fp, buffer, nbytes, n); -} - -/*! - @abstract For writing streams, flush buffered output to the underlying stream - @return 0 if successful, or EOF if an error occurred. -*/ -int hflush(hFILE *fp) HTS_RESULT_USED; - -#ifdef __cplusplus -} -#endif - -#endif