summaryrefslogtreecommitdiff
path: root/stream/stm_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'stream/stm_misc.c')
-rw-r--r--stream/stm_misc.c128
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;
+ }
+ }
+}
+