summaryrefslogtreecommitdiff
path: root/source/fitz/stream-open.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2013-06-19 15:29:44 +0200
committerTor Andersson <tor.andersson@artifex.com>2013-06-20 16:45:35 +0200
commit0a927854a10e1e6b9770a81e2e1d9f3093631757 (patch)
tree3d65d820d9fdba2d0d394d99c36290c851b78ca0 /source/fitz/stream-open.c
parent1ae8f19179c5f0f8c6352b3c7855465325d5449a (diff)
downloadmupdf-0a927854a10e1e6b9770a81e2e1d9f3093631757.tar.xz
Rearrange source files.
Diffstat (limited to 'source/fitz/stream-open.c')
-rw-r--r--source/fitz/stream-open.c210
1 files changed, 210 insertions, 0 deletions
diff --git a/source/fitz/stream-open.c b/source/fitz/stream-open.c
new file mode 100644
index 00000000..9e4dc8d4
--- /dev/null
+++ b/source/fitz/stream-open.c
@@ -0,0 +1,210 @@
+#include "mupdf/fitz.h"
+
+fz_stream *
+fz_new_stream(fz_context *ctx, void *state,
+ int(*read)(fz_stream *stm, unsigned char *buf, int len),
+ void(*close)(fz_context *ctx, void *state))
+{
+ fz_stream *stm;
+
+ fz_try(ctx)
+ {
+ stm = fz_malloc_struct(ctx, fz_stream);
+ }
+ fz_catch(ctx)
+ {
+ close(ctx, state);
+ fz_rethrow(ctx);
+ }
+
+ stm->refs = 1;
+ stm->error = 0;
+ stm->eof = 0;
+ stm->pos = 0;
+
+ stm->bits = 0;
+ stm->avail = 0;
+
+ stm->bp = stm->buf;
+ stm->rp = stm->bp;
+ stm->wp = stm->bp;
+ stm->ep = stm->buf + sizeof stm->buf;
+
+ stm->state = state;
+ stm->read = read;
+ stm->close = close;
+ stm->seek = NULL;
+ stm->ctx = ctx;
+
+ return stm;
+}
+
+fz_stream *
+fz_keep_stream(fz_stream *stm)
+{
+ if (stm)
+ stm->refs ++;
+ return stm;
+}
+
+void
+fz_close(fz_stream *stm)
+{
+ if (!stm)
+ return;
+ stm->refs --;
+ if (stm->refs == 0)
+ {
+ if (stm->close)
+ stm->close(stm->ctx, stm->state);
+ fz_free(stm->ctx, stm);
+ }
+}
+
+/* File stream */
+
+static int read_file(fz_stream *stm, unsigned char *buf, int len)
+{
+ int n = read(*(int*)stm->state, buf, len);
+ if (n < 0)
+ fz_throw(stm->ctx, FZ_ERROR_GENERIC, "read error: %s", strerror(errno));
+ return n;
+}
+
+static void seek_file(fz_stream *stm, int offset, int whence)
+{
+ int n = lseek(*(int*)stm->state, offset, whence);
+ if (n < 0)
+ fz_throw(stm->ctx, FZ_ERROR_GENERIC, "cannot lseek: %s", strerror(errno));
+ stm->pos = n;
+ stm->rp = stm->bp;
+ stm->wp = stm->bp;
+}
+
+static void close_file(fz_context *ctx, void *state)
+{
+ int n = close(*(int*)state);
+ if (n < 0)
+ fz_warn(ctx, "close error: %s", strerror(errno));
+ fz_free(ctx, state);
+}
+
+fz_stream *
+fz_open_fd(fz_context *ctx, int fd)
+{
+ fz_stream *stm;
+ int *state;
+
+ state = fz_malloc_struct(ctx, int);
+ *state = fd;
+
+ fz_try(ctx)
+ {
+ stm = fz_new_stream(ctx, state, read_file, close_file);
+ }
+ fz_catch(ctx)
+ {
+ fz_free(ctx, state);
+ fz_rethrow(ctx);
+ }
+ stm->seek = seek_file;
+
+ return stm;
+}
+
+fz_stream *
+fz_open_file(fz_context *ctx, const char *name)
+{
+#ifdef _WIN32
+ char *s = (char*)name;
+ wchar_t *wname, *d;
+ int c, fd;
+ d = wname = fz_malloc(ctx, (strlen(name)+1) * sizeof(wchar_t));
+ while (*s) {
+ s += fz_chartorune(&c, s);
+ *d++ = c;
+ }
+ *d = 0;
+ fd = _wopen(wname, O_BINARY | O_RDONLY, 0);
+ fz_free(ctx, wname);
+#else
+ int fd = open(name, O_BINARY | O_RDONLY, 0);
+#endif
+ if (fd == -1)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open %s", name);
+ return fz_open_fd(ctx, fd);
+}
+
+#ifdef _WIN32
+fz_stream *
+fz_open_file_w(fz_context *ctx, const wchar_t *name)
+{
+ int fd = _wopen(name, O_BINARY | O_RDONLY, 0);
+ if (fd == -1)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file %ls", name);
+ return fz_open_fd(ctx, fd);
+}
+#endif
+
+/* Memory stream */
+
+static int read_buffer(fz_stream *stm, unsigned char *buf, int len)
+{
+ return 0;
+}
+
+static void seek_buffer(fz_stream *stm, int offset, int whence)
+{
+ if (whence == 0)
+ stm->rp = stm->bp + offset;
+ if (whence == 1)
+ stm->rp += offset;
+ if (whence == 2)
+ stm->rp = stm->ep - offset;
+ stm->rp = fz_clampp(stm->rp, stm->bp, stm->ep);
+ stm->wp = stm->ep;
+}
+
+static void close_buffer(fz_context *ctx, void *state_)
+{
+ fz_buffer *state = (fz_buffer *)state_;
+ if (state)
+ fz_drop_buffer(ctx, state);
+}
+
+fz_stream *
+fz_open_buffer(fz_context *ctx, fz_buffer *buf)
+{
+ fz_stream *stm;
+
+ fz_keep_buffer(ctx, buf);
+ stm = fz_new_stream(ctx, buf, read_buffer, close_buffer);
+ stm->seek = seek_buffer;
+
+ stm->bp = buf->data;
+ stm->rp = buf->data;
+ stm->wp = buf->data + buf->len;
+ stm->ep = buf->data + buf->len;
+
+ stm->pos = buf->len;
+
+ return stm;
+}
+
+fz_stream *
+fz_open_memory(fz_context *ctx, unsigned char *data, int len)
+{
+ fz_stream *stm;
+
+ stm = fz_new_stream(ctx, NULL, read_buffer, close_buffer);
+ stm->seek = seek_buffer;
+
+ stm->bp = data;
+ stm->rp = data;
+ stm->wp = data + len;
+ stm->ep = data + len;
+
+ stm->pos = len;
+
+ return stm;
+}