57
57
/* but don't open an OS file or initialize the stream. */
59
59
file_open_stream(const char *fname, uint len, const char *file_access,
60
uint buffer_size, stream ** ps, gx_io_device *iodev,
61
iodev_proc_fopen_t fopen_proc, gs_memory_t *mem)
60
uint buffer_size, stream ** ps, gx_io_device *iodev,
61
iodev_proc_fopen_t fopen_proc, gs_memory_t *mem)
65
65
char fmode[4]; /* r/w/a, [+], [b], null */
68
iodev = iodev_default(mem);
68
iodev = iodev_default(mem);
69
69
code = file_prepare_stream(fname, len, file_access, buffer_size, ps, fmode, mem);
74
74
if (fname[0] == 0) /* fopen_proc gets NUL terminated string, not len */
75
return 0; /* so this is the same as len == 0, so return NULL */
75
return 0; /* so this is the same as len == 0, so return NULL */
76
76
code = (*fopen_proc)(iodev, (char *)(*ps)->cbuf, fmode, &file,
77
(char *)(*ps)->cbuf, (*ps)->bsize);
77
(char *)(*ps)->cbuf, (*ps)->bsize);
79
/* discard the stuff we allocated to keep from accumulating stuff needing GC */
80
gs_free_object(mem, (*ps)->cbuf, "file_close(buffer)");
81
gs_free_object(mem, *ps, "file_prepare_stream(stream)");
79
/* discard the stuff we allocated to keep from accumulating stuff needing GC */
80
gs_free_object(mem, (*ps)->cbuf, "file_close(buffer)");
81
gs_free_object(mem, *ps, "file_prepare_stream(stream)");
85
85
file_init_stream(*ps, file, fmode, (*ps)->cbuf, (*ps)->bsize);
105
105
* allocated by file_alloc_stream, so we mustn't free them.
107
107
while (stemp != 0 && stemp->is_temp != 0) {
108
stream *snext = stemp->strm;
108
stream *snext = stemp->strm;
111
if (stemp->is_temp > 1)
112
gs_free_object(mem, stemp->cbuf,
113
"file_close(temp stream buffer)");
111
if (stemp->is_temp > 1)
112
gs_free_object(mem, stemp->cbuf,
113
"file_close(temp stream buffer)");
118
118
gs_free_object(mem, s->cbuf, "file_close(buffer)");
119
119
if (s->close_strm && stemp != 0)
120
return sclose(stemp);
120
return sclose(stemp);
129
129
file_init_stream(stream *s, FILE *file, const char *fmode, byte *buffer,
132
132
switch (fmode[0]) {
134
sappend_file(s, file, buffer, buffer_size);
134
sappend_file(s, file, buffer, buffer_size);
137
/* Defeat buffering for terminals. */
137
/* Defeat buffering for terminals. */
141
fstat(fileno(file), &rstat);
142
sread_file(s, file, buffer,
143
(S_ISCHR(rstat.st_mode) ? 1 : buffer_size));
141
fstat(fileno(file), &rstat);
142
sread_file(s, file, buffer,
143
(S_ISCHR(rstat.st_mode) ? 1 : buffer_size));
147
swrite_file(s, file, buffer, buffer_size);
147
swrite_file(s, file, buffer, buffer_size);
149
149
if (fmode[1] == '+')
150
s->file_modes |= s_mode_read | s_mode_write;
150
s->file_modes |= s_mode_read | s_mode_write;
151
151
s->save_close = s->procs.close;
152
152
s->procs.close = file_close_file;
157
157
/* On a successful return, the C file name is in the stream buffer. */
158
158
/* If fname==0, set up stream, and buffer. */
160
file_prepare_stream(const char *fname, uint len, const char *file_access,
161
uint buffer_size, stream ** ps, char fmode[4], gs_memory_t *mem)
160
file_prepare_stream(const char *fname, uint len, const char *file_access,
161
uint buffer_size, stream ** ps, char fmode[4], gs_memory_t *mem)
164
164
register stream *s;
167
167
strcpy(fmode, file_access);
168
168
strcat(fmode, gp_fmode_binary_suffix);
169
169
if (buffer_size == 0)
170
buffer_size = file_default_buffer_size;
170
buffer_size = file_default_buffer_size;
171
171
if (len >= buffer_size) /* we copy the file name into the buffer */
172
return_error(gs_error_limitcheck);
172
return_error(gs_error_limitcheck);
173
173
/* Allocate the stream first, since it persists */
174
174
/* even after the file has been closed. */
175
175
s = file_alloc_stream(mem, "file_prepare_stream");
177
return_error(gs_error_VMerror);
177
return_error(gs_error_VMerror);
178
178
/* Allocate the buffer. */
179
179
buffer = gs_alloc_bytes(mem, buffer_size, "file_prepare_stream(buffer)");
181
return_error(gs_error_VMerror);
181
return_error(gs_error_VMerror);
182
182
if (fname != 0) {
183
memcpy(buffer, fname, len);
184
buffer[len] = 0; /* terminate string */
183
memcpy(buffer, fname, len);
184
buffer[len] = 0; /* terminate string */
186
buffer[0] = 0; /* safety */
186
buffer[0] = 0; /* safety */
187
187
s->cbuf = buffer;
188
188
s->bsize = s->cbsize = buffer_size;
189
189
s->save_close = 0; /* in case this stream gets disabled before init finishes */