ioext.c (%read-line): Return a cons of the input line and its terminator.
fports.c, genio.c, genio.h, ports.c, ports.h: Change fgets methods
to return the string length as well as its contents.
(fill_select_type): Return the highest file descriptor.
(scm_select): Tell select about the highest file descriptor. On
some systems the SELECT_SET_SIZE can be as much as 128 bytes.
Therefore the extra overhead for calculating the maximum fd seems
to be more than compensated. Is this correct? In any case,
scm_internal_select will be much faster with this info.
(scm_select, fill_select_type, set_element): Don't accept any kind
of object in the file descriptor list or vector.
* configure.in: AC_CHECK_FUNCS: add "system".
* simpos.c (scm_system): always define: use sysmissing if not
available. Check for HAVE_SYSTEM instead of _Windows (does
Windows lack system or does it have an unusable one?).
Check for error conditions -1 and 127. Use SCM_DEFER_INTS.
Let the argument be optional: if not supplied, call system(NULL).
* ports.c (scm_close_port): relax the type check from OPPORTP to
PORTP; closing a closed port is allowed.
newline. When fgets returns a string whose length is `size-1', it
is ambiguous whether a whole line was retrieved, so we must check
explicitly whether a line terminator is present.
(scm_init_backtrace): Initialize `the-last-stack' to a fluid.
(scm_backtrace): `the-last-stack' is now a fluid.
* init.c (scm_boot_guile_1): Moved call to scm_init_backtrace
after scm_init_fluids.
coop_wait_for_runnable_thread): Disable interrupts so that no
async is executed before a potential error_revive.
(scm_internal_select): Disable interrupts during the parts of the
code which manipulate the sleep queue and the file descriptors.
* coop.c (coop_qinit): Initialize fields used by
scm_internal_select.
(coop_qget, coop_qget, coop_tmp_queue): Made global.
(coop_next_runnable_thread): If GUILE_ISELECT enabled, use
replacement in iselect.c.
(coop_mutex_lock, coop_condition_variable_wait, coop_abort,
coop_join): If GUILE_ISELECT enabled, use
coop_wait_for_runnable_thread instead of
coop_next_runnable_thread.
(usleep, sleep): New replacements for system functions if
GUILE_ISELECT is enabled.
* coop-threads.h: Declare coop_wait_for_runnable_thread.
* coop-defs.h (coop_t): Added fields used by scm_internal_select.
* filesys.c: Added #include "iselect.h". Moved FD-macros to
iselect.h. Implement Scheme level `select' using
scm_internal_select. (See NEWS.)
* genio.c (scm_getc): Block with scm_internal_select. (See NEWS.)
* init.c: Call scm_init_iselect.
* fports.c (scm_fgets): Use malloc/free rather than scm_must_malloc
and scm_must_free, since ultimately the string returned will be copied
by scm_makfrom0str anyway. Also, read any characters that may have
been pushed onto the port with scm_ungetc.
* ports.c (scm_generic_fgets): Same as for scm_fgets.
* ioext.c (scm_read_line): Free string after Guilifying it.
* ports.h (scm_ptobfuns): fgets method returns a char *, not a char.