diff --git a/src/c/gbc.d b/src/c/gbc.d index 947678ff5..5654ef40a 100644 --- a/src/c/gbc.d +++ b/src/c/gbc.d @@ -598,6 +598,8 @@ sweep_phase(void) if (x->d.m == FREE) continue; else if (x->d.m) { + /* FIXME!!! Here should come a finalization + procedure for streams */ x->d.m = FALSE; continue; } diff --git a/src/c/symbols_list.h b/src/c/symbols_list.h index 66101cf35..04c7d2df0 100644 --- a/src/c/symbols_list.h +++ b/src/c/symbols_list.h @@ -1027,6 +1027,7 @@ cl_symbols[] = { {SYS_ "CHAR-SET", SI_ORDINARY, si_char_set, 3}, {SYS_ "CHDIR", SI_ORDINARY, si_chdir, 1}, {SYS_ "CLEAR-COMPILER-PROPERTIES", SI_ORDINARY, cl_identity, 1}, +{SYS_ "CLOSE-PIPE", SI_ORDINARY, si_close_pipe, 1}, {SYS_ "COERCE-TO-FUNCTION", SI_ORDINARY, si_coerce_to_function, 1}, {SYS_ "COERCE-TO-PACKAGE", SI_ORDINARY, si_coerce_to_package, 1}, {SYS_ "COMPILED-FUNCTION-BLOCK", SI_ORDINARY, si_compiled_function_block, 1}, diff --git a/src/c/unixsys.d b/src/c/unixsys.d index 6f4b85a98..39668a05e 100644 --- a/src/c/unixsys.d +++ b/src/c/unixsys.d @@ -38,21 +38,34 @@ si_system(cl_object cmd) cl_object si_open_pipe(cl_object cmd) { - FILE *ptr; - cl_object stream; + FILE *ptr; + cl_object stream; - assert_type_string(cmd); - - if ((ptr = popen(cmd->string.self, OPEN_R)) == NULL) - @(return Cnil) - stream = cl_alloc_object(t_stream); - stream->stream.mode = smm_input; - stream->stream.file = ptr; - stream->stream.object0 = @'base-char'; - stream->stream.object1 = cmd; - stream->stream.int0 = stream->stream.int1 = 0; + assert_type_string(cmd); + ptr = popen(cmd->string.self, "r"); + if (ptr == NULL) + @(return Cnil); + stream = cl_alloc_object(t_stream); + stream->stream.mode = smm_input; + stream->stream.file = ptr; + stream->stream.object0 = @'base-char'; + stream->stream.object1 = @'si::open-pipe'; + stream->stream.int0 = stream->stream.int1 = 0; #if !defined(GBC_BOEHM) - setbuf(ptr, stream->stream.buffer = cl_alloc_atomic(BUFSIZ)); + setbuf(ptr, stream->stream.buffer = cl_alloc_atomic(BUFSIZ)); #endif - @(return stream) + @(return stream) +} + +cl_object +si_close_pipe(cl_object stream) +{ + if (type_of(stream) == t_stream && + stream->stream.object1 == @'si::open-pipe') { + stream->stream.mode = smm_closed; + pclose(stream->stream.file); + stream->stream.file = NULL; + stream->stream.object0 = OBJNULL; + } + @(return) } diff --git a/src/h/external.h b/src/h/external.h index 4528c607b..5ae7d8b8c 100644 --- a/src/h/external.h +++ b/src/h/external.h @@ -1353,6 +1353,7 @@ extern void init_interrupt(void); extern cl_object si_system(cl_object cmd); extern cl_object si_open_pipe(cl_object cmd); +extern cl_object si_close_pipe(cl_object stream); #ifdef __cplusplus }