*** empty log message ***
[bpt/guile.git] / libguile / readline.c
index 8840bd2..7861e0d 100644 (file)
 #include <readline/readline.h>
 #include <readline/history.h>
 
+scm_option scm_readline_opts[] = {
+  { SCM_OPTION_BOOLEAN, "history-file", 1,
+    "Use history file." },
+  { SCM_OPTION_INTEGER, "history-length", 200,
+    "History length." }
+};
+
+extern void stifle_history (int max);
+
+SCM_PROC (s_readline_options, "readline-options-interface", 0, 1, 0, scm_readline_options);
+
+SCM
+scm_readline_options (setting)
+     SCM setting;
+{
+  SCM ans = scm_options (setting,
+                        scm_readline_opts,
+                        SCM_N_READLINE_OPTIONS,
+                        s_readline_options);
+  stifle_history (SCM_HISTORY_LENGTH);
+  return ans;
+}
+
 #ifndef HAVE_STRDUP
 static char *
 strdup (char *s)
@@ -63,16 +86,19 @@ strdup (char *s)
 
 #ifndef HAVE_RL_CLEANUP_AFTER_SIGNAL
 
-/* This is readline functions added in release 2.3.  They will work
+/* These are readline functions added in release 2.3.  They will work
  * together with readline-2.1 and 2.2.  (The readline interface is
  * disabled for earlier releases.)
+ * They are declared static; if we want to use them elsewhere, then
+ * we need external declarations for them, but at the moment, I don't
+ * think anything else in Guile ought to use these.
  */
 
 extern void _rl_clean_up_for_exit ();
 extern void _rl_kill_kbd_macro ();
 extern int _rl_init_argument ();
 
-void
+static void
 rl_cleanup_after_signal ()
 {
 #ifdef HAVE_RL_CLEAR_SIGNALS
@@ -85,7 +111,7 @@ rl_cleanup_after_signal ()
   rl_pending_input = 0;
 }
 
-void
+static void
 rl_free_line_state ()
 {
   register HIST_ENTRY *entry;
@@ -260,8 +286,30 @@ scm_add_history (SCM text)
   return SCM_UNSPECIFIED;
 }
 
-static SCM subr_filename_completion_function;
-static char s_filename_completion_function[] = "filename-completion-function";
+
+SCM_PROC (s_read_history, "read-history", 1, 0, 0, scm_read_history);
+
+SCM
+scm_read_history (SCM file)
+{
+  SCM_ASSERT (SCM_NIMP (file) && SCM_STRINGP (file),
+             file, SCM_ARG1, s_read_history);
+  return read_history (SCM_ROCHARS (file)) ? SCM_BOOL_F : SCM_BOOL_T;
+}
+
+
+SCM_PROC (s_write_history, "write-history", 1, 0, 0, scm_write_history);
+
+SCM
+scm_write_history (SCM file)
+{
+  SCM_ASSERT (SCM_NIMP (file) && SCM_STRINGP (file),
+             file, SCM_ARG1, s_write_history);
+  return write_history (SCM_ROCHARS (file)) ? SCM_BOOL_F : SCM_BOOL_T;
+}
+
+
+SCM_PROC (s_filename_completion_function, "filename-completion-function", 2, 0, 0, scm_filename_completion_function);
 
 SCM
 scm_filename_completion_function (SCM text, SCM continuep)
@@ -317,10 +365,6 @@ void
 scm_init_readline ()
 {
 #include "readline.x"
-  subr_filename_completion_function
-    = scm_make_subr (s_filename_completion_function,
-                    scm_tc7_subr_2,
-                    scm_filename_completion_function);
   scm_readline_completion_function_var
     = scm_sysintern ("*readline-completion-function*", SCM_BOOL_F);
   rl_getc_function = current_input_getc;
@@ -329,6 +373,9 @@ scm_init_readline ()
 #ifdef USE_THREADS
   scm_mutex_init (&reentry_barrier_mutex);
 #endif
+  scm_init_opts (scm_readline_options,
+                scm_readline_opts,
+                SCM_N_READLINE_OPTIONS);
   scm_add_feature ("readline");
 }