diff --git a/src/c/file.d b/src/c/file.d index 745187a72..422a930b3 100644 --- a/src/c/file.d +++ b/src/c/file.d @@ -3103,6 +3103,41 @@ set_stream_elt_type(cl_object stream, cl_fixnum byte_size, int flags, stream->stream.byte_size = byte_size; } +cl_object +si_stream_external_format_set(cl_object stream, cl_object format) +{ +#ifdef ECL_CLOS_STREAMS + if (ECL_INSTANCEP(stream)) { + FEerror("Cannot change external format of stream ~A", 1, stream); + } +#endif + switch (stream->stream.mode) { + case smm_input: + case smm_input_file: + case smm_output: + case smm_output_file: + case smm_io: + case smm_io_file: +#ifdef ECL_WSOCK + case smm_input_wsock: + case smm_output_wsock: + case smm_io_wsock: +#endif + { + cl_object elt_type = ecl_stream_element_type(stream); + if (elt_type != @'character' && elt_type != @'base-char') + FEerror("Cannot change external format" + "of binary stream ~A", 1, stream); + set_stream_elt_type(stream, stream->stream.byte_size, + stream->stream.flags, format); + } + break; + default: + FEerror("Cannot change external format of stream ~A", 1, stream); + } + @(return) +} + cl_object ecl_make_file_stream_from_fd(cl_object fname, int fd, enum ecl_smmode smm, cl_fixnum byte_size, int flags, cl_object external_format) diff --git a/src/c/symbols_list.h b/src/c/symbols_list.h index 07c9053b0..b2b428951 100644 --- a/src/c/symbols_list.h +++ b/src/c/symbols_list.h @@ -1794,5 +1794,7 @@ cl_symbols[] = { {SYS_ "+ECL-SYNTAX-PROGV-LIST+", SI_ORDINARY, NULL, -1, OBJNULL}, {SYS_ "WITH-ECL-IO-SYNTAX", SI_ORDINARY, NULL, -1, OBJNULL}, +{SYS_ "STREAM-EXTERNAL-FORMAT-SET", CL_ORDINARY, si_stream_external_format_set, 2, OBJNULL}, + /* Tag for end of list */ {NULL, CL_ORDINARY, NULL, -1, OBJNULL}}; diff --git a/src/c/symbols_list2.h b/src/c/symbols_list2.h index 0aaf719b4..b076fa8c8 100644 --- a/src/c/symbols_list2.h +++ b/src/c/symbols_list2.h @@ -1794,5 +1794,7 @@ cl_symbols[] = { {SYS_ "+ECL-SYNTAX-PROGV-LIST+",NULL}, {SYS_ "WITH-ECL-IO-SYNTAX",NULL}, +{SYS_ "STREAM-EXTERNAL-FORMAT-SET","si_stream_external_format_set"}, + /* Tag for end of list */ {NULL,NULL}}; diff --git a/src/h/external.h b/src/h/external.h index fab4eff8c..f971d0128 100644 --- a/src/h/external.h +++ b/src/h/external.h @@ -625,6 +625,7 @@ extern ECL_API cl_object si_do_read_sequence(cl_object string, cl_object stream, extern ECL_API cl_object si_file_column(cl_object strm); extern ECL_API cl_object cl_interactive_stream_p(cl_object strm); extern ECL_API cl_object si_set_buffering_mode(cl_object strm, cl_object mode); +extern ECL_API cl_object si_stream_external_format_set(cl_object strm, cl_object format); extern ECL_API bool ecl_input_stream_p(cl_object strm); extern ECL_API bool ecl_output_stream_p(cl_object strm);