Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1989, 1995, 1996, 1997, 1998, 1999 Aladdin Enterprises.  All rights reserved.
2
 
3
  This software is provided AS-IS with no warranty, either express or
4
  implied.
5
 
6
  This software is distributed under license and may not be copied,
7
  modified or distributed except as expressly authorized under the terms
8
  of the license contained in the file LICENSE in this distribution.
9
 
10
  For more information about licensing, please refer to
11
  http://www.ghostscript.com/licensing/. For information on
12
  commercial licensing, go to http://www.artifex.com/licensing/ or
13
  contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14
  San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
*/
16
 
17
/* $Id: files.h,v 1.10 2004/08/04 19:36:12 stefan Exp $ */
18
/* Definitions for interpreter support for file objects */
19
/* Requires stream.h */
20
 
21
#ifndef files_INCLUDED
22
#  define files_INCLUDED
23
 
24
/*
25
 * File objects store a pointer to a stream in value.pfile.
26
 * A file object is valid if its "size" matches the read_id or write_id
27
 * (as appropriate) in the stream it points to.  This arrangement
28
 * allows us to detect closed files reliably, while allowing us to
29
 * reuse closed streams for new files.
30
 */
31
#define fptr(pref) (pref)->value.pfile
32
#define make_file(pref,a,id,s)\
33
  make_tasv(pref,t_file,a,id,pfile,s)
34
 
35
/* The stdxxx files.  We have to access them through procedures, */
36
/* because they might have to be opened when referenced. */
37
int zget_stdin(i_ctx_t *, stream **);
38
int zget_stdout(i_ctx_t *, stream **);
39
int zget_stderr(i_ctx_t *, stream **);
40
/* Test whether a stream is stdin. */
41
bool zis_stdin(const stream *);
42
 
43
/* Define access to the stdio refs for operators. */
44
#define ref_stdio (i_ctx_p->stdio)
45
#define ref_stdin ref_stdio[0]
46
#define ref_stdout ref_stdio[1]
47
#define ref_stderr ref_stdio[2]
48
/* An invalid (closed) file. */
49
#define avm_invalid_file_entry avm_foreign
50
extern stream *const invalid_file_entry;
51
/* Make an invalid file object. */
52
void make_invalid_file(ref *);
53
 
54
/*
55
 * Macros for checking file validity.
56
 * NOTE: in order to work around a bug in the Borland 5.0 compiler,
57
 * you must use file_is_invalid rather than !file_is_valid.
58
 */
59
#define file_is_valid(svar,op)\
60
  (svar = fptr(op), (svar->read_id | svar->write_id) == r_size(op))
61
#define file_is_invalid(svar,op)\
62
  (svar = fptr(op), (svar->read_id | svar->write_id) != r_size(op))
63
#define check_file(svar,op)\
64
  BEGIN\
65
    check_type(*(op), t_file);\
66
    if ( file_is_invalid(svar, op) ) return_error(e_invalidaccess);\
67
  END
68
 
69
/*
70
 * If a file is open for both reading and writing, its read_id, write_id,
71
 * and stream procedures and modes reflect the current mode of use;
72
 * an id check failure will switch it to the other mode.
73
 */
74
int file_switch_to_read(const ref *);
75
 
76
#define check_read_file(svar,op)\
77
  BEGIN\
78
    check_read_type(*(op), t_file);\
79
    check_read_known_file(svar, op, return);\
80
  END
81
#define check_read_known_file(svar,op,error_return)\
82
  check_read_known_file_else(svar, op, error_return, svar = invalid_file_entry)
83
#define check_read_known_file_else(svar,op,error_return,invalid_action)\
84
  BEGIN\
85
    svar = fptr(op);\
86
    if (svar->read_id != r_size(op)) {\
87
	if (svar->read_id == 0 && svar->write_id == r_size(op)) {\
88
	    int fcode = file_switch_to_read(op);\
89
\
90
	    if (fcode < 0)\
91
		 error_return(fcode);\
92
	} else {\
93
	    invalid_action;	/* closed or reopened file */\
94
	}\
95
    }\
96
  END
97
int file_switch_to_write(const ref *);
98
 
99
#define check_write_file(svar,op)\
100
  BEGIN\
101
    check_write_type(*(op), t_file);\
102
    check_write_known_file(svar, op, return);\
103
  END
104
#define check_write_known_file(svar,op,error_return)\
105
  BEGIN\
106
    svar = fptr(op);\
107
    if ( svar->write_id != r_size(op) )\
108
	{	int fcode = file_switch_to_write(op);\
109
		if ( fcode < 0 ) error_return(fcode);\
110
	}\
111
  END
112
 
113
/* Data exported by zfile.c. */
114
	/* for zfilter.c and ziodev.c */
115
extern const uint file_default_buffer_size;
116
 
117
#ifndef gs_file_path_ptr_DEFINED
118
#  define gs_file_path_ptr_DEFINED
119
typedef struct gs_file_path_s *gs_file_path_ptr;
120
#endif
121
 
122
/* Procedures exported by zfile.c. */
123
	/* for imainarg.c */
124
FILE *lib_fopen(const gs_file_path_ptr pfpath, const gs_memory_t *mem, const char *);
125
 
126
	/* for imain.c */
127
int lib_file_open(const gs_file_path_ptr pfpath, i_ctx_t *, const char *, uint, byte *, uint, 
128
		  uint *, ref *, gs_memory_t *);
129
 
130
	/* for imain.c */
131
#ifndef gs_ref_memory_DEFINED
132
#  define gs_ref_memory_DEFINED
133
typedef struct gs_ref_memory_s gs_ref_memory_t;
134
#endif
135
int file_read_string(const byte *, uint, ref *, gs_ref_memory_t *);
136
 
137
	/* for os_open in ziodev.c */
138
#ifdef iodev_proc_fopen		/* in gxiodev.h */
139
int file_open_stream(const char *, uint, const char *, uint, stream **,
140
		     gx_io_device *, iodev_proc_fopen_t, gs_memory_t *);
141
#endif
142
 
143
	/* for zfilter.c */
144
int filter_open(const char *, uint, ref *, const stream_procs *,
145
		const stream_template *, const stream_state *,
146
		gs_memory_t *);
147
 
148
	/* for zfileio.c */
149
void make_stream_file(ref *, stream *, const char *);
150
 
151
	/* for ziodev.c */
152
int file_close_finish(stream *);
153
int file_close_disable(stream *);
154
int file_close_file(stream *);
155
 
156
	/* for gsmain.c, interp.c */
157
int file_close(ref *);
158
 
159
	/* for zfproc.c, ziodev.c */
160
stream *file_alloc_stream(gs_memory_t *, client_name_t);
161
 
162
/* Procedures exported by zfileio.c. */
163
	/* for ziodev.c */
164
int zreadline_from(stream *s, gs_string *buf, gs_memory_t *bufmem,
165
		   uint *pcount, bool *pin_eol);
166
 
167
/* Procedures exported by zfileio.c. */
168
	/* for zfile.c */
169
int zfilelineedit(i_ctx_t *i_ctx_p);
170
 
171
	/* for zfproc.c */
172
int zneedstdin(i_ctx_t *i_ctx_p);
173
int zneedstdout(i_ctx_t *i_ctx_p);
174
int zneedstderr(i_ctx_t *i_ctx_p);
175
#endif /* files_INCLUDED */