diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2013-06-19 15:29:44 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2013-06-20 16:45:35 +0200 |
commit | 0a927854a10e1e6b9770a81e2e1d9f3093631757 (patch) | |
tree | 3d65d820d9fdba2d0d394d99c36290c851b78ca0 /source/fitz/stream-open.c | |
parent | 1ae8f19179c5f0f8c6352b3c7855465325d5449a (diff) | |
download | mupdf-0a927854a10e1e6b9770a81e2e1d9f3093631757.tar.xz |
Rearrange source files.
Diffstat (limited to 'source/fitz/stream-open.c')
-rw-r--r-- | source/fitz/stream-open.c | 210 |
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; +} |