mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
The following change makes it possible for applications to have
their own version of scm_readline. * readline.c, readline.h (rl_cleanup_after_signal, rl_free_line_state): Made global. (scm_readline_init_ports): New function. (scm_readline): Use scm_readline_init_ports. (Thanks to Anders Holst.)
This commit is contained in:
parent
ae9e7aac5f
commit
2e3d59875a
2 changed files with 53 additions and 26 deletions
|
@ -82,7 +82,7 @@ extern void _rl_clean_up_for_exit ();
|
|||
extern void _rl_kill_kbd_macro ();
|
||||
extern int _rl_init_argument ();
|
||||
|
||||
static void
|
||||
void
|
||||
rl_cleanup_after_signal ()
|
||||
{
|
||||
#ifdef HAVE_RL_CLEAR_SIGNALS
|
||||
|
@ -95,7 +95,7 @@ rl_cleanup_after_signal ()
|
|||
rl_pending_input = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
rl_free_line_state ()
|
||||
{
|
||||
register HIST_ENTRY *entry;
|
||||
|
@ -218,6 +218,32 @@ stream_from_fport (SCM port, char *mode, const char *subr)
|
|||
return f;
|
||||
}
|
||||
|
||||
void
|
||||
scm_readline_init_ports (SCM inp, SCM outp)
|
||||
{
|
||||
if (SCM_UNBNDP (inp))
|
||||
inp = scm_cur_inp;
|
||||
|
||||
if (SCM_UNBNDP (outp))
|
||||
outp = scm_cur_outp;
|
||||
|
||||
if (!(SCM_NIMP (inp) && SCM_OPINFPORTP (inp))) {
|
||||
scm_misc_error (0,
|
||||
"Input port is not open or not a file port",
|
||||
SCM_EOL);
|
||||
}
|
||||
|
||||
if (!(SCM_NIMP (outp) && SCM_OPOUTFPORTP (outp))) {
|
||||
scm_misc_error (0,
|
||||
"Output port is not open or not a file port",
|
||||
SCM_EOL);
|
||||
}
|
||||
|
||||
input_port = inp;
|
||||
rl_instream = stream_from_fport (inp, "r", s_readline);
|
||||
rl_outstream = stream_from_fport (outp, "w", s_readline);
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_readline (SCM text, SCM inp, SCM outp, SCM read_hook)
|
||||
{
|
||||
|
@ -237,11 +263,23 @@ scm_readline (SCM text, SCM inp, SCM outp, SCM read_hook)
|
|||
SCM_COERCE_SUBSTR (text);
|
||||
}
|
||||
|
||||
if (SCM_UNBNDP (inp))
|
||||
inp = scm_cur_inp;
|
||||
if (!((SCM_UNBNDP (inp) && SCM_NIMP (scm_cur_inp) && SCM_OPINFPORTP (inp))
|
||||
|| SCM_NIMP (inp) && SCM_OPINFPORTP (inp)))
|
||||
{
|
||||
--in_readline;
|
||||
scm_misc_error (s_readline,
|
||||
"Input port is not open or not a file port",
|
||||
SCM_EOL);
|
||||
}
|
||||
|
||||
if (SCM_UNBNDP (outp))
|
||||
outp = scm_cur_outp;
|
||||
if (!((SCM_UNBNDP (outp) && SCM_NIMP (scm_cur_outp) && SCM_OPINFPORTP (outp))
|
||||
|| (SCM_NIMP (outp) && SCM_OPOUTFPORTP (outp))))
|
||||
{
|
||||
--in_readline;
|
||||
scm_misc_error (s_readline,
|
||||
"Output port is not open or not a file port",
|
||||
SCM_EOL);
|
||||
}
|
||||
|
||||
if (!(SCM_UNBNDP (read_hook) || SCM_FALSEP (read_hook)))
|
||||
{
|
||||
|
@ -253,24 +291,7 @@ scm_readline (SCM text, SCM inp, SCM outp, SCM read_hook)
|
|||
before_read = read_hook;
|
||||
}
|
||||
|
||||
if (!(SCM_NIMP (inp) && SCM_OPINFPORTP (inp)))
|
||||
{
|
||||
--in_readline;
|
||||
scm_misc_error (s_readline,
|
||||
"Input port is not open or not a file port",
|
||||
SCM_EOL);
|
||||
}
|
||||
if (!(SCM_NIMP (outp) && SCM_OPOUTFPORTP (outp)))
|
||||
{
|
||||
--in_readline;
|
||||
scm_misc_error (s_readline,
|
||||
"Output port is not open or not a file port",
|
||||
SCM_EOL);
|
||||
}
|
||||
|
||||
input_port = inp;
|
||||
rl_instream = stream_from_fport (inp, "r", s_readline);
|
||||
rl_outstream = stream_from_fport (outp, "w", s_readline);
|
||||
scm_readline_init_ports (inp, outp);
|
||||
|
||||
ans = scm_internal_catch (SCM_BOOL_T,
|
||||
(scm_catch_body_t) internal_readline,
|
||||
|
@ -474,7 +495,7 @@ scm_init_readline ()
|
|||
rl_completion_entry_function = (Function*) completion_function;
|
||||
rl_basic_word_break_characters = "\t\n\"'`;()";
|
||||
#ifdef USE_THREADS
|
||||
scm_mutex_init (&reentry_barrier_mutex);
|
||||
scm_mutex_init (&reentry_barrier_mutex, NULL);
|
||||
#endif
|
||||
scm_init_opts (scm_readline_options,
|
||||
scm_readline_opts,
|
||||
|
|
|
@ -30,6 +30,7 @@ extern scm_option scm_readline_opts[];
|
|||
#define SCM_N_READLINE_OPTIONS 3
|
||||
|
||||
extern SCM scm_readline_options (SCM setting);
|
||||
extern void scm_readline_init_ports (SCM inp, SCM outp);
|
||||
extern SCM scm_readline (SCM txt, SCM inp, SCM outp, SCM read_hook);
|
||||
extern SCM scm_add_history (SCM txt);
|
||||
extern SCM scm_read_history (SCM file);
|
||||
|
@ -37,4 +38,9 @@ extern SCM scm_write_history (SCM file);
|
|||
extern SCM scm_filename_completion_function (SCM text, SCM continuep);
|
||||
extern void scm_init_readline (void);
|
||||
|
||||
#ifndef HAVE_RL_CLEANUP_AFTER_SIGNAL
|
||||
void rl_cleanup_after_signal ();
|
||||
void rl_free_line_state ();
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue