1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 13:30:26 +02:00

* ports.c (scm_c_port_for_each): New function, mostly copied from

scm_port_for_each.
(scm_port_for_each): Reimplemented using scm_c_port_for_each.
* ports.h (scm_c_port_for_each): New prototype.
This commit is contained in:
Marius Vollmer 2003-04-30 14:38:53 +00:00
parent a1a5dfa888
commit c536b4b32e
2 changed files with 19 additions and 12 deletions

View file

@ -724,21 +724,12 @@ SCM_DEFINE (scm_close_output_port, "close-output-port", 1, 0, 0,
} }
#undef FUNC_NAME #undef FUNC_NAME
SCM_DEFINE (scm_port_for_each, "port-for-each", 1, 0, 0, void
(SCM proc), scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data)
"Apply @var{proc} to each port in the Guile port table\n"
"in turn. The return value is unspecified. More specifically,\n"
"@var{proc} is applied exactly once to every port that exists\n"
"in the system at the time @var{port-for-each} is invoked.\n"
"Changes to the port table while @var{port-for-each} is running\n"
"have no effect as far as @var{port-for-each} is concerned.")
#define FUNC_NAME s_scm_port_for_each
{ {
long i; long i;
SCM ports; SCM ports;
SCM_VALIDATE_PROC (1, proc);
/* Even without pre-emptive multithreading, running arbitrary code /* Even without pre-emptive multithreading, running arbitrary code
while scanning the port table is unsafe because the port table while scanning the port table is unsafe because the port table
can change arbitrarily (from a GC, for example). So we build a can change arbitrarily (from a GC, for example). So we build a
@ -754,14 +745,29 @@ SCM_DEFINE (scm_port_for_each, "port-for-each", 1, 0, 0,
while (ports != SCM_EOL) while (ports != SCM_EOL)
{ {
scm_call_1 (proc, SCM_CAR (ports)); proc (data, SCM_CAR (ports));
ports = SCM_CDR (ports); ports = SCM_CDR (ports);
} }
}
SCM_DEFINE (scm_port_for_each, "port-for-each", 1, 0, 0,
(SCM proc),
"Apply @var{proc} to each port in the Guile port table\n"
"in turn. The return value is unspecified. More specifically,\n"
"@var{proc} is applied exactly once to every port that exists\n"
"in the system at the time @var{port-for-each} is invoked.\n"
"Changes to the port table while @var{port-for-each} is running\n"
"have no effect as far as @var{port-for-each} is concerned.")
#define FUNC_NAME s_scm_port_for_each
{
SCM_VALIDATE_PROC (1, proc);
scm_c_port_for_each ((void (*)(void*,SCM))scm_call_1, proc);
return SCM_UNSPECIFIED; return SCM_UNSPECIFIED;
} }
#undef FUNC_NAME #undef FUNC_NAME
/* Utter miscellany. Gosh, we should clean this up some time. */ /* Utter miscellany. Gosh, we should clean this up some time. */

View file

@ -250,6 +250,7 @@ SCM_API SCM scm_close_input_port (SCM port);
SCM_API SCM scm_close_output_port (SCM port); SCM_API SCM scm_close_output_port (SCM port);
SCM_API SCM scm_close_port (SCM port); SCM_API SCM scm_close_port (SCM port);
SCM_API SCM scm_port_for_each (SCM proc); SCM_API SCM scm_port_for_each (SCM proc);
SCM_API void scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data);
SCM_API SCM scm_input_port_p (SCM x); SCM_API SCM scm_input_port_p (SCM x);
SCM_API SCM scm_output_port_p (SCM x); SCM_API SCM scm_output_port_p (SCM x);
SCM_API SCM scm_port_p (SCM x); SCM_API SCM scm_port_p (SCM x);