summaryrefslogtreecommitdiff
path: root/fitz/stm_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'fitz/stm_misc.c')
-rw-r--r--fitz/stm_misc.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/fitz/stm_misc.c b/fitz/stm_misc.c
new file mode 100644
index 00000000..70c1c315
--- /dev/null
+++ b/fitz/stm_misc.c
@@ -0,0 +1,97 @@
+/*
+ * Miscellaneous I/O functions
+ */
+
+#include "fitz-base.h"
+#include "fitz-stream.h"
+
+int
+fz_tell(fz_stream *stm)
+{
+ if (stm->mode == FZ_SREAD)
+ return fz_rtell(stm);
+ return fz_wtell(stm);
+}
+
+fz_error *
+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.
+ */
+
+fz_error *
+fz_readline(fz_stream *stm, char *mem, int n)
+{
+ fz_error *error;
+
+ 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';
+
+ error = fz_readerror(stm);
+ if (error)
+ return fz_rethrow(error, "cannot read line");
+ return fz_okay;
+}
+
+/*
+ * Utility function to consume all the contents of an input stream into
+ * a freshly allocated buffer.
+ */
+
+fz_error *
+fz_readall(fz_buffer **bufp, fz_stream *stm, int sizehint)
+{
+ fz_error *error;
+ fz_buffer *buf;
+ int c;
+
+ if (sizehint == 0)
+ sizehint = 4 * 1024;
+
+ error = fz_newbuffer(&buf, sizehint);
+ if (error)
+ return fz_rethrow(error, "cannot create scratch buffer");
+
+ for (c = fz_readbyte(stm); c != EOF; c = fz_readbyte(stm))
+ {
+ if (buf->wp == buf->ep)
+ {
+ error = fz_growbuffer(buf);
+ if (error)
+ {
+ fz_dropbuffer(buf);
+ return fz_rethrow(error, "cannot resize scratch buffer");
+ }
+ }
+
+ *buf->wp++ = c;
+ }
+
+ *bufp = buf;
+ return fz_okay;
+}
+