summaryrefslogtreecommitdiff
path: root/gs/base/gsiodevs.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/base/gsiodevs.c')
-rw-r--r--gs/base/gsiodevs.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/gs/base/gsiodevs.c b/gs/base/gsiodevs.c
new file mode 100644
index 000000000..364167c36
--- /dev/null
+++ b/gs/base/gsiodevs.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 2001-2006 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id$ */
+/* %stdxxx IODevice implementation for non-PostScript configurations */
+#include "gx.h"
+#include "gserrors.h"
+#include "gxiodev.h"
+#include "stream.h"
+#include "strimpl.h"
+
+const char iodev_dtype_stdio[] = "Special";
+#define iodev_stdio(dname, open) {\
+ dname, iodev_dtype_stdio,\
+ { iodev_no_init, open, iodev_no_open_file,\
+ iodev_no_fopen, iodev_no_fclose,\
+ iodev_no_delete_file, iodev_no_rename_file, iodev_no_file_status,\
+ iodev_no_enumerate_files, NULL, NULL,\
+ iodev_no_get_params, iodev_no_put_params\
+ }\
+}
+
+#define STDIO_BUF_SIZE 128
+static int
+stdio_close_file(stream *s)
+{
+ /* Don't close stdio files, but do free the buffer. */
+ gs_memory_t *mem = s->memory;
+
+ s->file = 0;
+ gs_free_object(mem, s->cbuf, "stdio_close_file(buffer)");
+ return 0;
+}
+static int
+stdio_open(gx_io_device * iodev, const char *access, stream ** ps,
+ gs_memory_t * mem, char rw, FILE *file,
+ void (*srw_file)(stream *, FILE *, byte *, uint))
+{
+ stream *s;
+ byte *buf;
+
+ if (!streq1(access, rw))
+ return_error(gs_error_invalidfileaccess);
+ s = s_alloc(mem, "stdio_open(stream)");
+ buf = gs_alloc_bytes(mem, STDIO_BUF_SIZE, "stdio_open(buffer)");
+ if (s == 0 || buf == 0) {
+ gs_free_object(mem, buf, "stdio_open(buffer)");
+ gs_free_object(mem, s, "stdio_open(stream)");
+ return_error(gs_error_VMerror);
+ }
+ srw_file(s, file, buf, STDIO_BUF_SIZE);
+ s->procs.close = stdio_close_file;
+ *ps = s;
+ return 0;
+}
+
+static int
+stdin_open(gx_io_device * iodev, const char *access, stream ** ps,
+ gs_memory_t * mem)
+{
+ return stdio_open(iodev, access, ps, mem, 'r',
+ mem->gs_lib_ctx->fstdin, sread_file);
+}
+const gx_io_device gs_iodev_stdin = iodev_stdio("%stdin%", stdin_open);
+
+static int
+stdout_open(gx_io_device * iodev, const char *access, stream ** ps,
+ gs_memory_t * mem)
+{
+ return stdio_open(iodev, access, ps, mem, 'w',
+ mem->gs_lib_ctx->fstdout, swrite_file);
+}
+const gx_io_device gs_iodev_stdout = iodev_stdio("%stdout%", stdout_open);
+
+static int
+stderr_open(gx_io_device * iodev, const char *access, stream ** ps,
+ gs_memory_t * mem)
+{
+ return stdio_open(iodev, access, ps, mem, 'w',
+ mem->gs_lib_ctx->fstderr, swrite_file);
+}
+const gx_io_device gs_iodev_stderr = iodev_stdio("%stderr%", stderr_open);