xref: /plan9/sys/src/cmd/gs/src/gsiodevs.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 2000 Aladdin Enterprises.  All rights reserved.
23ff48bf5SDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
53ff48bf5SDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
93ff48bf5SDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
153ff48bf5SDavid du Colombier */
163ff48bf5SDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsiodevs.c,v 1.6 2004/08/04 19:36:12 stefan Exp $ */
183ff48bf5SDavid du Colombier /* %stdxxx IODevice implementation for non-PostScript configurations */
193ff48bf5SDavid du Colombier #include "gx.h"
203ff48bf5SDavid du Colombier #include "gserrors.h"
213ff48bf5SDavid du Colombier #include "gxiodev.h"
223ff48bf5SDavid du Colombier #include "stream.h"
233ff48bf5SDavid du Colombier #include "strimpl.h"
243ff48bf5SDavid du Colombier 
253ff48bf5SDavid du Colombier const char iodev_dtype_stdio[] = "Special";
263ff48bf5SDavid du Colombier #define iodev_stdio(dname, open) {\
273ff48bf5SDavid du Colombier     dname, iodev_dtype_stdio,\
283ff48bf5SDavid du Colombier 	{ iodev_no_init, open, iodev_no_open_file,\
293ff48bf5SDavid du Colombier 	  iodev_no_fopen, iodev_no_fclose,\
303ff48bf5SDavid du Colombier 	  iodev_no_delete_file, iodev_no_rename_file, iodev_no_file_status,\
313ff48bf5SDavid du Colombier 	  iodev_no_enumerate_files, NULL, NULL,\
323ff48bf5SDavid du Colombier 	  iodev_no_get_params, iodev_no_put_params\
333ff48bf5SDavid du Colombier 	}\
343ff48bf5SDavid du Colombier }
353ff48bf5SDavid du Colombier 
363ff48bf5SDavid du Colombier #define STDIO_BUF_SIZE 128
373ff48bf5SDavid du Colombier private int
stdio_close_file(stream * s)383ff48bf5SDavid du Colombier stdio_close_file(stream *s)
393ff48bf5SDavid du Colombier {
403ff48bf5SDavid du Colombier     /* Don't close stdio files, but do free the buffer. */
413ff48bf5SDavid du Colombier     gs_memory_t *mem = s->memory;
423ff48bf5SDavid du Colombier 
433ff48bf5SDavid du Colombier     s->file = 0;
443ff48bf5SDavid du Colombier     gs_free_object(mem, s->cbuf, "stdio_close_file(buffer)");
453ff48bf5SDavid du Colombier     return 0;
463ff48bf5SDavid du Colombier }
473ff48bf5SDavid du Colombier private 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))483ff48bf5SDavid du Colombier stdio_open(gx_io_device * iodev, const char *access, stream ** ps,
493ff48bf5SDavid du Colombier 	   gs_memory_t * mem, char rw, FILE *file,
50*593dc095SDavid du Colombier 	   void (*srw_file)(stream *, FILE *, byte *, uint))
513ff48bf5SDavid du Colombier {
523ff48bf5SDavid du Colombier     stream *s;
533ff48bf5SDavid du Colombier     byte *buf;
543ff48bf5SDavid du Colombier 
553ff48bf5SDavid du Colombier     if (!streq1(access, rw))
563ff48bf5SDavid du Colombier 	return_error(gs_error_invalidfileaccess);
573ff48bf5SDavid du Colombier     s = s_alloc(mem, "stdio_open(stream)");
583ff48bf5SDavid du Colombier     buf = gs_alloc_bytes(mem, STDIO_BUF_SIZE, "stdio_open(buffer)");
593ff48bf5SDavid du Colombier     if (s == 0 || buf == 0) {
603ff48bf5SDavid du Colombier 	gs_free_object(mem, buf, "stdio_open(buffer)");
613ff48bf5SDavid du Colombier 	gs_free_object(mem, s, "stdio_open(stream)");
623ff48bf5SDavid du Colombier 	return_error(gs_error_VMerror);
633ff48bf5SDavid du Colombier     }
643ff48bf5SDavid du Colombier     srw_file(s, file, buf, STDIO_BUF_SIZE);
653ff48bf5SDavid du Colombier     s->procs.close = stdio_close_file;
663ff48bf5SDavid du Colombier     *ps = s;
673ff48bf5SDavid du Colombier     return 0;
683ff48bf5SDavid du Colombier }
693ff48bf5SDavid du Colombier 
703ff48bf5SDavid du Colombier private int
stdin_open(gx_io_device * iodev,const char * access,stream ** ps,gs_memory_t * mem)713ff48bf5SDavid du Colombier stdin_open(gx_io_device * iodev, const char *access, stream ** ps,
723ff48bf5SDavid du Colombier 	   gs_memory_t * mem)
733ff48bf5SDavid du Colombier {
74*593dc095SDavid du Colombier     return stdio_open(iodev, access, ps, mem, 'r',
75*593dc095SDavid du Colombier 		      mem->gs_lib_ctx->fstdin, sread_file);
763ff48bf5SDavid du Colombier }
773ff48bf5SDavid du Colombier const gx_io_device gs_iodev_stdin = iodev_stdio("%stdin%", stdin_open);
783ff48bf5SDavid du Colombier 
793ff48bf5SDavid du Colombier private int
stdout_open(gx_io_device * iodev,const char * access,stream ** ps,gs_memory_t * mem)803ff48bf5SDavid du Colombier stdout_open(gx_io_device * iodev, const char *access, stream ** ps,
813ff48bf5SDavid du Colombier 	    gs_memory_t * mem)
823ff48bf5SDavid du Colombier {
83*593dc095SDavid du Colombier     return stdio_open(iodev, access, ps, mem, 'w',
84*593dc095SDavid du Colombier 		      mem->gs_lib_ctx->fstdout, swrite_file);
853ff48bf5SDavid du Colombier }
863ff48bf5SDavid du Colombier const gx_io_device gs_iodev_stdout = iodev_stdio("%stdout%", stdout_open);
873ff48bf5SDavid du Colombier 
883ff48bf5SDavid du Colombier private int
stderr_open(gx_io_device * iodev,const char * access,stream ** ps,gs_memory_t * mem)893ff48bf5SDavid du Colombier stderr_open(gx_io_device * iodev, const char *access, stream ** ps,
903ff48bf5SDavid du Colombier 	    gs_memory_t * mem)
913ff48bf5SDavid du Colombier {
92*593dc095SDavid du Colombier     return stdio_open(iodev, access, ps, mem, 'w',
93*593dc095SDavid du Colombier 		      mem->gs_lib_ctx->fstderr, swrite_file);
943ff48bf5SDavid du Colombier }
953ff48bf5SDavid du Colombier const gx_io_device gs_iodev_stderr = iodev_stdio("%stderr%", stderr_open);
96