Use a union type for storing the ANSI C stream handle and the POSIX file descriptor

This commit is contained in:
Juan Jose Garcia Ripoll 2009-02-07 18:07:19 +01:00
parent 7308dc932d
commit 1dc66edf3d
5 changed files with 23 additions and 27 deletions

View file

@ -346,7 +346,7 @@ ONCE_MORE:
#endif /* CLOS */
case t_stream:
obj->stream.mode = (short)smm_broadcast;
obj->stream.file = NULL;
obj->stream.file.descriptor = -1;
obj->stream.object0 = OBJNULL;
obj->stream.object1 = OBJNULL;
obj->stream.buffer = NULL;

View file

@ -2725,7 +2725,7 @@ io_file_close(cl_object strm)
ecl_enable_interrupts();
if (failed < 0)
FElibc_error("Cannot close stream ~S.", 1, strm);
strm->stream.file = (void*)-1;
IO_FILE_DESCRIPTOR(strm) = -1;
return generic_close(strm);
}
@ -3137,7 +3137,7 @@ ecl_make_file_stream_from_fd(cl_object fname, int fd, enum ecl_smmode smm,
set_stream_elt_type(stream, byte_size, flags, external_format);
IO_FILE_FILENAME(stream) = fname; /* not really used */
IO_FILE_COLUMN(stream) = 0;
stream->stream.file = (void*)fd;
IO_FILE_DESCRIPTOR(stream) = fd;
stream->stream.last_op = 0;
si_set_finalizer(stream, Ct);
return stream;
@ -3199,7 +3199,7 @@ io_stream_write_byte8(cl_object strm, unsigned char *c, cl_index n)
if (!Null(aux))
ecl_file_position_set(strm, aux);
} else if (strm->stream.last_op > 0) {
ecl_fseeko((FILE*)strm->stream.file, 0, SEEK_CUR);
ecl_fseeko(IO_STREAM_FILE(strm), 0, SEEK_CUR);
}
strm->stream.last_op = -1;
return input_stream_read_byte8(strm, c, n);
@ -3365,7 +3365,7 @@ io_stream_close(cl_object strm)
FElibc_error("Cannot close stream ~S.", 1, strm);
#if !defined(GBC_BOEHM)
ecl_dealloc(strm->stream.buffer);
strm->stream.file = NULL;
IO_STREAM_FILE(strm) = NULL;
#endif
return generic_close(strm);
}
@ -3495,7 +3495,7 @@ si_set_buffering_mode(cl_object stream, cl_object buffer_mode_symbol)
FEerror("Not a valid buffering mode: ~A", 1, buffer_mode_symbol);
}
if (mode == smm_output || mode == smm_io || mode == smm_input) {
FILE *fp = (FILE*)stream->stream.file;
FILE *fp = IO_STREAM_FILE(stream);
setvbuf(fp, 0, _IONBF, 0);
if (buffer_mode != _IONBF) {
cl_index buffer_size = BUFSIZ;
@ -3536,7 +3536,7 @@ ecl_make_stream_from_FILE(cl_object fname, void *f, enum ecl_smmode smm,
set_stream_elt_type(stream, byte_size, flags, external_format);
IO_STREAM_FILENAME(stream) = fname; /* not really used */
IO_STREAM_COLUMN(stream) = 0;
stream->stream.file = f;
IO_STREAM_FILE(stream) = f;
stream->stream.last_op = 0;
si_set_finalizer(stream, Ct);
return stream;
@ -3591,20 +3591,20 @@ ecl_stream_to_handle(cl_object s, bool output)
switch ((enum ecl_smmode)s->stream.mode) {
case smm_input:
if (output) return -1;
return fileno((FILE*)s->stream.file);
return fileno(IO_STREAM_FILE(s));
case smm_input_file:
if (output) return -1;
return (int)s->stream.file;
return IO_FILE_DESCRIPTOR(s);
case smm_output:
if (!output) return -1;
return fileno((FILE*)s->stream.file);
return fileno(IO_STREAM_FILE(s));
case smm_output_file:
if (!output) return -1;
return (int)s->stream.file;
return IO_FILE_DESCRIPTOR(s);
case smm_io:
return fileno((FILE*)s->stream.file);
return fileno(IO_STREAM_FILE(s));
case smm_io_file:
return (int)s->stream.file;
return IO_FILE_DESCRIPTOR(s);
case smm_synonym:
s = SYNONYM_STREAM_STREAM(s);
goto BEGIN;
@ -4483,7 +4483,7 @@ alloc_stream()
{
cl_object x = ecl_alloc_object(t_stream);
x->stream.closed = 0;
x->stream.file = NULL;
x->stream.file.descriptor = -1;
x->stream.object0 =
x->stream.object1 = OBJNULL;
x->stream.int0 = x->stream.int1 = 0;

View file

@ -655,16 +655,9 @@ sweep_phase(void)
break;
#endif
case t_stream:
#if defined(ECL_WSOCK)
if (x->stream.mode == smm_input_wsock
|| x->stream.mode == smm_output_wsock
|| x->stream.mode == smm_io_wsock) {
closesocket((int)x->stream.file);
} else
#endif
if (x->stream.file != NULL)
fclose(x->stream.file);
x->stream.file = NULL;
if (!x->stream.closed)
cl_close(1, x);
break;
#ifdef ECL_THREADS
case t_lock:
#if defined(_MSC_VER) || defined(mingw32)

View file

@ -152,11 +152,11 @@ extern void* ecl_dynamic_callback_make(cl_object data, enum ecl_ffi_calling_conv
#define ECHO_STREAM_INPUT(strm) (strm)->stream.object0
#define ECHO_STREAM_OUTPUT(strm) (strm)->stream.object1
#define CONCATENATED_STREAM_LIST(strm) (strm)->stream.object0
#define IO_STREAM_FILE(strm) (FILE*)((strm)->stream.file)
#define IO_STREAM_FILE(strm) (FILE*)((strm)->stream.file.stream)
#define IO_STREAM_COLUMN(strm) (strm)->stream.int1
#define IO_STREAM_ELT_TYPE(strm) (strm)->stream.object0
#define IO_STREAM_FILENAME(strm) (strm)->stream.object1
#define IO_FILE_DESCRIPTOR(strm) (cl_fixnum)((strm)->stream.file)
#define IO_FILE_DESCRIPTOR(strm) (strm)->stream.file.descriptor
#define IO_FILE_COLUMN(strm) (strm)->stream.int1
#define IO_FILE_ELT_TYPE(strm) (strm)->stream.object0
#define IO_FILE_FILENAME(strm) (strm)->stream.object1

View file

@ -547,7 +547,10 @@ struct ecl_stream {
HEADER2(mode,closed); /* stream mode of enum smmode */
/* closed stream? */
struct ecl_file_ops *ops; /* dispatch table */
void *file; /* file pointer */
union {
void *stream; /* ANSI C streams */
cl_fixnum descriptor; /* POSIX files */
} file;
cl_object object0; /* some object */
cl_object object1; /* some object */
cl_object byte_stack; /* buffer for unread bytes */