diff options
Diffstat (limited to 'stream/stm_misc.c')
-rw-r--r-- | stream/stm_misc.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/stream/stm_misc.c b/stream/stm_misc.c new file mode 100644 index 00000000..010676fd --- /dev/null +++ b/stream/stm_misc.c @@ -0,0 +1,128 @@ +/* + * Miscellaneous I/O functions + */ + +#include "fitz.h" + +int fz_tell(fz_stream *stm) +{ + if (stm->mode == FZ_SREAD) + return fz_rtell(stm); + return fz_wtell(stm); +} + +int fz_seek(fz_stream *stm, int offset, int whence) +{ + if (stm->mode == FZ_SREAD) + return fz_rseek(stm, offset, whence); + return fz_wseek(stm, offset, whence); +} + +/* + * Read a line terminated by LF or CR or CRLF. + */ + +int fz_readline(fz_stream *stm, char *mem, int n) +{ + char *s = mem; + int c = EOF; + while (n > 1) + { + c = fz_readbyte(stm); + if (c == EOF) + break; + if (c == '\r') { + c = fz_peekbyte(stm); + if (c == '\n') + c = fz_readbyte(stm); + break; + } + if (c == '\n') + break; + *s++ = c; + n--; + } + if (n) + *s = '\0'; + return s - mem; +} + +/* + * Utility function to consume all the contents of an input stream into + * a freshly allocated buffer; realloced and trimmed to size. + */ + +enum { CHUNKSIZE = 1024 * 4 }; + +int fz_readall(fz_buffer **bufp, fz_stream *stm) +{ + fz_buffer *real; + unsigned char *newbuf; + unsigned char *buf; + int len; + int pos; + int n; + + *bufp = nil; + + len = 0; + pos = 0; + buf = nil; + + while (1) + { + if (len - pos == 0) + { + len += CHUNKSIZE; + newbuf = fz_realloc(buf, len); + if (!newbuf) + { + fz_free(buf); + return -1; + } + buf = newbuf; + } + + n = fz_read(stm, buf + pos, len - pos); + + if (n < 0) + { + fz_free(buf); + return -1; + } + + pos += n; + + if (n < CHUNKSIZE) + { + if (pos > 0) + { + newbuf = fz_realloc(buf, pos); + if (!newbuf) + { + fz_free(buf); + return -1; + } + } + else newbuf = buf; + + real = *bufp = fz_malloc(sizeof(fz_buffer)); + if (!real) + { + fz_free(newbuf); + return -1; + } + + real->refs = 1; + real->ownsdata = 1; + real->bp = buf; + real->rp = buf; + real->wp = buf + pos; + real->ep = buf + pos; + real->eof = 1; + + return real->wp - real->rp; + } + } +} + |