26#if defined (HAVE_CONFIG_H)
50#if defined (USE_READLINE)
68static
mutex event_hook_lock;
70#if defined (USE_READLINE)
86 OCTAVE_DISABLE_COPY_MOVE (gnu_readline)
88 ~gnu_readline () =
default;
92 std::string
do_readline (
const std::string& prompt,
bool& eof);
189 void do_restore_event_hook ();
205 static int operate_and_get_next (
int,
int);
207 static int history_search_backward (
int,
int);
209 static int history_search_forward (
int,
int);
213 static char * command_generator (
const char *text,
int state);
215 static char * command_quoter (
char *text,
int match_type,
216 char *quote_pointer);
218 static char * command_dequoter (
char *text,
int match_type);
220 static int command_char_is_quoted (
char *text,
int index);
222 static int command_accept_line (
int count,
int key);
224 static char ** command_completer (
const char *text,
int start,
int end);
228 startup_hook_fcn m_previous_startup_hook;
230 pre_input_hook_fcn m_previous_pre_input_hook;
232 event_hook_fcn m_previous_event_hook;
234 completion_fcn m_completion_function;
236 quoting_fcn m_quoting_function;
238 dequoting_fcn m_dequoting_function;
240 char_is_quoted_fcn m_char_is_quoted_function;
242 user_accept_line_fcn m_user_accept_line_function;
244 static std::string s_completer_quote_characters;
247std::string gnu_readline::s_completer_quote_characters =
"";
249gnu_readline::gnu_readline ()
251 m_previous_pre_input_hook (nullptr),
252 m_previous_event_hook (nullptr), m_completion_function (nullptr),
253 m_quoting_function (nullptr), m_dequoting_function (nullptr),
254 m_char_is_quoted_function (nullptr), m_user_accept_line_function (nullptr)
259 std::string term = sys::env::getenv (
"TERM");
265 do_blink_matching_paren (
true);
270 gnu_readline::operate_and_get_next,
275gnu_readline::do_set_name (
const std::string& nm)
281gnu_readline::do_readline (
const std::string& prompt,
bool& eof)
287 const char *p = prompt.c_str ();
304gnu_readline::do_set_input_stream (FILE *
f)
310gnu_readline::do_get_input_stream ()
312 return ::octave_rl_get_input_stream ();
316gnu_readline::do_set_output_stream (FILE *
f)
322gnu_readline::do_get_output_stream ()
324 return ::octave_rl_get_output_stream ();
328gnu_readline::do_redisplay ()
340gnu_readline::do_terminal_rows ()
344 return sh > 0 ? sh : 24;
348gnu_readline::do_terminal_cols ()
352 return sw > 0 ? sw : 80;
356gnu_readline::do_clear_screen (
bool skip_redisplay)
362gnu_readline::do_resize_terminal ()
368gnu_readline::do_set_screen_size (
int ht,
int wd)
374gnu_readline::newline_chars ()
380gnu_readline::do_restore_terminal_state ()
386gnu_readline::do_blink_matching_paren (
bool flag)
392gnu_readline::do_erase_empty_line (
bool flag)
394 return ::octave_rl_erase_empty_line (flag ? 1 : 0);
398gnu_readline::do_set_basic_word_break_characters (
const std::string& s)
404gnu_readline::do_set_completer_word_break_characters (
const std::string& s)
409 (gnu_readline::do_completer_word_break_hook);
414gnu_readline::do_set_basic_quote_characters (
const std::string& s)
420gnu_readline::do_set_filename_quote_characters (
const std::string& s)
426gnu_readline::do_set_completer_quote_characters (
const std::string& s)
428 s_completer_quote_characters = s;
432gnu_readline::do_set_completion_append_character (
char c)
438gnu_readline::do_set_completion_function (completion_fcn
f)
440 m_completion_function =
f;
443 = (
f ? gnu_readline::command_completer :
nullptr);
449gnu_readline::do_set_quoting_function (quoting_fcn
f)
451 m_quoting_function =
f;
454 = (
f ? gnu_readline::command_quoter :
nullptr);
460gnu_readline::do_set_dequoting_function (dequoting_fcn
f)
462 m_dequoting_function =
f;
465 = (
f ? gnu_readline::command_dequoter :
nullptr);
471gnu_readline::do_set_char_is_quoted_function (char_is_quoted_fcn
f)
473 m_char_is_quoted_function =
f;
476 = (
f ? gnu_readline::command_char_is_quoted :
nullptr);
482gnu_readline::do_set_user_accept_line_function (user_accept_line_fcn
f)
484 m_user_accept_line_function =
f;
494gnu_readline::completion_fcn
495gnu_readline::do_get_completion_function ()
const
497 return m_completion_function;
500gnu_readline::quoting_fcn
501gnu_readline::do_get_quoting_function ()
const
503 return m_quoting_function;
506gnu_readline::dequoting_fcn
507gnu_readline::do_get_dequoting_function ()
const
509 return m_dequoting_function;
512gnu_readline::char_is_quoted_fcn
513gnu_readline::do_get_char_is_quoted_function ()
const
515 return m_char_is_quoted_function;
518gnu_readline::user_accept_line_fcn
519gnu_readline::do_get_user_accept_line_function ()
const
521 return m_user_accept_line_function;
528looks_like_filename (
const char *line,
char delim)
532 const char *s = strrchr (line, delim);
537 const char *
f = strrchr (line, sys::file_ops::dir_sep_char ());
539 if (
f && (s[1] ==
'~' ||
f != s))
543 std::string candidate_filename = s+1;
545 candidate_filename = candidate_filename.substr (0,
f - s);
549 if (candidate_filename[0] ==
'~')
551 = sys::file_ops::tilde_expand (candidate_filename);
553 retval = sys::dir_exists (candidate_filename);
565gnu_readline::do_completer_word_break_hook ()
570 std::string line = get_line_buffer ();
573 const char *l = line.c_str ();
575 if (looks_like_filename (l,
' ') || looks_like_filename (l,
'\'')
576 || looks_like_filename (l,
'"'))
579 (s_completer_quote_characters.c_str ());
585 static char *word_break_chars =
nullptr;
589 free (word_break_chars);
594 return word_break_chars;
599gnu_readline::do_generate_filename_completions (
const std::string& text)
623 retval[count++] = fn;
637gnu_readline::do_get_line_buffer ()
const
639 return ::octave_rl_line_buffer ();
643gnu_readline::do_get_current_line ()
const
655gnu_readline::do_get_prev_char (
int offset)
const
660 return p > offset ? buf[p - offset - 1] :
'\0';
664gnu_readline::do_replace_line (
const std::string& text,
bool clear_undo)
670gnu_readline::do_kill_full_line ()
676gnu_readline::do_insert_text (
const std::string& text)
682gnu_readline::do_newline ()
688gnu_readline::do_accept_line ()
690 command_accept_line (1,
'\n');
694gnu_readline::do_undo ()
696 return ::octave_rl_do_undo ();
700gnu_readline::do_clear_undo_list ()
706gnu_readline::set_startup_hook (startup_hook_fcn
f)
710 if (
f != m_previous_startup_hook)
715gnu_readline::restore_startup_hook ()
721gnu_readline::set_pre_input_hook (pre_input_hook_fcn
f)
725 if (
f != m_previous_pre_input_hook)
730gnu_readline::restore_pre_input_hook ()
736gnu_readline::set_event_hook (event_hook_fcn
f)
744gnu_readline::restore_event_hook ()
750gnu_readline::do_read_init_file (
const std::string& file)
756gnu_readline::do_re_read_init_file ()
762gnu_readline::do_filename_completion_desired (
bool arg)
764 return ::octave_rl_filename_completion_desired (arg);
768gnu_readline::do_filename_quoting_desired (
bool arg)
770 return ::octave_rl_filename_quoting_desired (arg);
774gnu_readline::do_prefer_env_winsize (
bool arg)
776 return ::octave_rl_prefer_env_winsize (arg);
780gnu_readline::do_interrupt (
bool arg)
786gnu_readline::do_handle_interrupt_signal ()
793 throw interrupt_exception ();
797gnu_readline::operate_and_get_next (
int ,
int )
811 || (x_where >= x_length - 1))
822gnu_readline::history_search_backward (
int count,
int c)
828gnu_readline::history_search_forward (
int count,
int c)
834gnu_readline::command_generator (
const char *text,
int state)
836 char *retval =
nullptr;
840 std::string tmp =
f (text, state);
842 std::size_t
len = tmp.length ();
846 retval =
static_cast<char *
> (std::malloc (
len+1));
849 strcpy (retval, tmp.c_str ());
856gnu_readline::command_quoter (
char *text,
int matches,
char *qcp)
858 char *retval =
nullptr;
862 std::string tmp =
f (text, matches, *qcp);
864 std::size_t
len = tmp.length ();
868 retval =
static_cast<char *
> (std::malloc (
len+1));
871 strcpy (retval, tmp.c_str ());
878gnu_readline::command_dequoter (
char *text,
int quote)
880 char *retval =
nullptr;
884 std::string tmp =
f (text, quote);
886 std::size_t
len = tmp.length ();
890 retval =
static_cast<char *
> (std::malloc (
len+1));
893 strcpy (retval, tmp.c_str ());
900gnu_readline::command_char_is_quoted (
char *text,
int quote)
904 return f (text, quote);
908gnu_readline::command_accept_line (
int count,
int key)
917 return ::octave_rl_newline (count, key);
921gnu_readline::command_completer (
const char *text,
int,
int)
935 default_command_editor ()
936 :
command_editor (), m_input_stream (stdin), m_output_stream (stdout) { }
938 OCTAVE_DISABLE_COPY_MOVE (default_command_editor)
940 ~default_command_editor () =
default;
942 std::string
do_readline (
const std::string& prompt,
bool& eof);
972 FILE *m_input_stream;
974 FILE *m_output_stream;
980 std::fputs (prompt.c_str (), m_output_stream);
981 std::fflush (m_output_stream);
983 return fgetl (m_input_stream, eof);
987default_command_editor::do_set_input_stream (FILE *
f)
993default_command_editor::do_get_input_stream ()
995 return m_input_stream;
999default_command_editor::do_set_output_stream (FILE *
f)
1001 m_output_stream =
f;
1005default_command_editor::do_get_output_stream ()
1007 return m_output_stream;
1011default_command_editor::do_generate_filename_completions (
const std::string&)
1018default_command_editor::do_get_line_buffer ()
const
1024default_command_editor::do_get_current_line ()
const
1031default_command_editor::do_get_prev_char (
int)
const
1037default_command_editor::do_replace_line (
const std::string&,
bool)
1043default_command_editor::do_kill_full_line ()
1049default_command_editor::do_insert_text (
const std::string&)
1055default_command_editor::do_newline ()
1061default_command_editor::do_accept_line ()
1067command_editor::instance_ok ()
1073 make_command_editor ();
1084 (*current_liboctave_error_handler)
1085 (
"unable to create command history object!");
1091command_editor::make_command_editor ()
1093#if defined (USE_READLINE)
1094 s_instance =
new gnu_readline ();
1096 s_instance =
new default_command_editor ();
1104 s_instance =
new default_command_editor ();
1121command_editor::startup_handler ()
1126 std::set<startup_hook_fcn> hook_set = s_startup_hook_set;
1138command_editor::pre_input_handler ()
1143 std::set<pre_input_hook_fcn> hook_set = s_pre_input_hook_set;
1155command_editor::event_handler ()
1158 handle_interrupt_signal ();
1160 event_hook_lock.
lock ();
1162 std::set<event_hook_fcn> hook_set (s_event_hook_set);
1164 event_hook_lock.
unlock ();
1416 return (instance_ok ()
1423 return (instance_ok ()
1430 return (instance_ok ()
1493 return instance_ok () ? s_instance->
do_undo () :
false;
1508 s_startup_hook_set.insert (
f);
1519 auto p = s_startup_hook_set.find (
f);
1521 if (p != s_startup_hook_set.end ())
1522 s_startup_hook_set.erase (p);
1524 if (s_startup_hook_set.empty ())
1534 s_pre_input_hook_set.insert (
f);
1545 auto p = s_pre_input_hook_set.find (
f);
1547 if (p != s_pre_input_hook_set.end ())
1548 s_pre_input_hook_set.erase (p);
1550 if (s_pre_input_hook_set.empty ())
1560 s_event_hook_set.insert (
f);
1568 auto p = s_event_hook_set.find (
f);
1570 if (p != s_event_hook_set.end ())
1571 s_event_hook_set.erase (p);
1586 std::string file = sys::file_ops::tilde_expand (file_arg);
1602 return (instance_ok ()
1609 return (instance_ok ())
1653command_editor::handle_interrupt_signal ()
1691 std::size_t slen = s.length ();
1746 tmpstr = now.strftime (
"%a %b %d");
1748 tmpstr = now.strftime (
"%H:%M:%S");
1750 tmpstr = now.strftime (
"%I:%M:%S");
1752 tmpstr = now.strftime (
"%I:%M %p");
1754 tmpstr = now.strftime (
"%H:%M");
1768 tmpstr = sys::env::get_host_name ();
1770 std::size_t pos = tmpstr.find (
'.');
1772 if (pos != std::string::npos)
1773 tmpstr.resize (pos);
1780 tmpstr = sys::env::get_host_name ();
1801 tmpstr = sys::env::get_program_name ();
1802 tmpstr = sys::env::base_pathname (tmpstr);
1809 tmpstr = sys::env::get_user_name ();
1819 tmpstr = sys::env::get_current_directory ();
1826 std::string home_dir = sys::env::get_home_directory ();
1828 if (c ==
'W' && (home_dir.empty () || tmpstr != home_dir))
1830 if (tmpstr !=
"/" && tmpstr !=
"//")
1832 std::size_t pos = tmpstr.rfind (
'/');
1834 if (pos != std::string::npos && pos != 0)
1835 tmpstr = tmpstr.substr (pos + 1);
1839 tmpstr = sys::env::polite_directory_format (tmpstr);
1846 char number_buffer[32];
1849 snprintf (number_buffer, 32,
"%d", num);
1851 strcpy (number_buffer,
"!");
1852 tmpstr = number_buffer;
1859 char number_buffer[32];
1861 tmpstr = number_buffer;
1872#if defined (USE_READLINE)
1878 tmpstr[0] = ((c ==
'[')
1902 retval.append (tmpstr);
1937 std::size_t slen = s.length ();
1939 while (i < slen && s[i] >=
'0' && s[i] <
'8')
1942 result = (result * 8) + s[i] -
'0';
1946 if (! digits || result > 0777 || i < slen)
1955 (*current_liboctave_error_handler) (
"%s", std::strerror (err_num));
1961 (*current_liboctave_error_handler) (
"%s", s.c_str ());
1964OCTAVE_END_NAMESPACE(octave)
virtual void do_resize_terminal()
static void replace_line(const std::string &text, bool clear_undo=true)
static void set_input_stream(FILE *f)
static void set_quoting_function(quoting_fcn f)
virtual string_vector do_generate_filename_completions(const std::string &text)=0
static bool filename_quoting_desired(bool)
int(* pre_input_hook_fcn)()
static void add_startup_hook(startup_hook_fcn f)
void(* user_accept_line_fcn)(const std::string &)
static void run_event_hooks()
static void set_completer_quote_characters(const std::string &s)
static int current_command_number()
virtual std::string newline_chars()
virtual user_accept_line_fcn do_get_user_accept_line_function() const
static void blink_matching_paren(bool flag)
static void set_user_accept_line_function(user_accept_line_fcn f)
static string_vector generate_filename_completions(const std::string &text)
virtual std::string do_get_current_line() const =0
static char get_prev_char(int)
virtual void do_set_screen_size(int ht, int wd)
static void remove_startup_hook(startup_hook_fcn f)
virtual std::string do_get_line_buffer() const =0
static void set_filename_quote_characters(const std::string &s)
static FILE * get_input_stream()
static int terminal_rows()
virtual bool do_erase_empty_line(bool)
virtual void do_redisplay()
virtual void do_set_basic_quote_characters(const std::string &)
std::string do_readline(const std::string &prompt)
static std::string readline(const std::string &prompt)
virtual void restore_event_hook()
virtual void do_kill_full_line()=0
virtual void do_set_user_accept_line_function(user_accept_line_fcn)
virtual completion_fcn do_get_completion_function() const
virtual void do_set_name(const std::string &)
virtual char do_get_prev_char(int) const =0
virtual void do_set_filename_quote_characters(const std::string &)
static void set_name(const std::string &n)
virtual void do_set_completer_word_break_characters(const std::string &)
virtual void restore_startup_hook()
virtual void do_set_input_stream(FILE *)=0
std::string m_initial_input
static void set_completer_word_break_characters(const std::string &s)
static void increment_current_command_number()
virtual void do_read_init_file(const std::string &)
static void clear_undo_list()
virtual void do_set_completion_append_character(char)
virtual FILE * do_get_output_stream()=0
virtual dequoting_fcn do_get_dequoting_function() const
virtual int do_terminal_cols()
virtual bool do_filename_completion_desired(bool)
static FILE * get_output_stream()
static bool prefer_env_winsize(bool)
static void reset_current_command_number(int n)
virtual char_is_quoted_fcn do_get_char_is_quoted_function() const
int read_octal(const std::string &s)
static void insert_text(const std::string &text)
static bool interrupt(bool=true)
virtual void do_replace_line(const std::string &text, bool clear_undo)=0
virtual void do_re_read_init_file()
static void resize_terminal()
virtual void do_set_output_stream(FILE *)=0
static bool event_loop_interrupted()
static void clear_screen(bool skip_redisplay=false)
static void set_initial_input(const std::string &text)
static void set_output_stream(FILE *f)
void do_interrupt_event_loop(bool arg)
static void accept_line()
static void set_screen_size(int ht, int wd)
virtual void do_set_quoting_function(quoting_fcn)
static void set_basic_word_break_characters(const std::string &s)
static std::string get_current_line()
static bool erase_empty_line(bool flag)
std::string(* quoting_fcn)(const std::string &, int, char)
virtual quoting_fcn do_get_quoting_function() const
virtual void do_set_char_is_quoted_function(char_is_quoted_fcn)
static void add_pre_input_hook(pre_input_hook_fcn f)
virtual int do_terminal_rows()
static void force_default_editor()
static char_is_quoted_fcn get_char_is_quoted_function()
static void set_completion_function(completion_fcn f)
static void remove_event_hook(event_hook_fcn f)
static void set_char_is_quoted_function(char_is_quoted_fcn f)
virtual void do_interrupt(bool)
static bool filename_completion_desired(bool)
static void set_dequoting_function(dequoting_fcn f)
bool do_event_loop_interrupted() const
static quoting_fcn get_quoting_function()
static int insert_initial_input()
static void set_completion_append_character(char c)
virtual void do_clear_screen(bool)
static void restore_terminal_state()
virtual void do_restore_terminal_state()
virtual void do_set_basic_word_break_characters(const std::string &)
virtual std::string do_decode_prompt_string(const std::string &)
virtual void do_set_completion_function(completion_fcn)
virtual void do_blink_matching_paren(bool)
virtual void restore_pre_input_hook()
int(* char_is_quoted_fcn)(const std::string &, int)
virtual void do_clear_undo_list()
static completion_fcn get_completion_function()
static std::string get_line_buffer()
virtual void do_newline()=0
static void kill_full_line()
virtual void do_accept_line()=0
static std::string decode_prompt_string(const std::string &s)
virtual void do_insert_text(const std::string &text)=0
static void interrupt_event_loop(bool flag=true)
static user_accept_line_fcn get_user_accept_line_function()
virtual void set_pre_input_hook(pre_input_hook_fcn)
virtual bool do_prefer_env_winsize(bool)
virtual void do_set_completer_quote_characters(const std::string &)
static dequoting_fcn get_dequoting_function()
static void add_event_hook(event_hook_fcn f)
virtual bool do_filename_quoting_desired(bool)
static void set_basic_quote_characters(const std::string &s)
virtual FILE * do_get_input_stream()=0
virtual void do_handle_interrupt_signal()
virtual void do_set_dequoting_function(dequoting_fcn)
std::string(* completion_fcn)(const std::string &, int)
std::string(* dequoting_fcn)(const std::string &, int)
virtual void set_event_hook(event_hook_fcn)
static void re_read_init_file()
static void read_init_file(const std::string &file="")
static void remove_pre_input_hook(pre_input_hook_fcn f)
static int terminal_cols()
virtual void set_startup_hook(startup_hook_fcn)
int(* startup_hook_fcn)()
int do_insert_initial_input()
static int current_number()
static void set_mark(int n)
static int max_input_history()
void resize(octave_idx_type n, const std::string &rfv="")
char * do_completer_word_break_hook()
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
F77_RET_T const F77_DBLE const F77_DBLE * f
std::string fgetl(FILE *f)
int octave_rl_history_search_backward(int, int)
void octave_rl_set_startup_hook(rl_startup_hook_fcn_ptr)
void octave_rl_set_quoting_function(rl_quoting_fcn_ptr)
void octave_rl_re_read_init_file(void)
void octave_rl_set_completer_word_break_characters(const char *)
void octave_rl_set_pre_input_hook(rl_startup_hook_fcn_ptr)
void octave_rl_kill_full_line(void)
const char * octave_rl_line_buffer(void)
char octave_rl_prompt_end_ignore(void)
void octave_rl_clear_undo_list(void)
void octave_rl_resize_terminal(void)
int octave_rl_history_search_forward(int, int)
const char * octave_rl_get_completer_word_break_characters(void)
void octave_rl_read_init_file(const char *)
char **(* rl_attempted_completion_fcn_ptr)(const char *, int, int)
char * octave_rl_filename_completion_function(const char *, int)
void octave_rl_set_dequoting_function(rl_dequoting_fcn_ptr)
void octave_rl_set_basic_quote_characters(const char *)
void octave_rl_clear_screen(int skip_redisplay)
int octave_rl_screen_width(void)
char octave_rl_prompt_start_ignore(void)
void octave_rl_set_terminal_name(const char *)
void octave_rl_restore_terminal_state(void)
void octave_rl_set_name(const char *)
void octave_rl_set_output_stream(FILE *)
void octave_rl_set_completion_word_break_hook(rl_completion_hook_fcn_ptr)
void octave_rl_initialize(void)
void octave_rl_set_filename_quote_characters(const char *)
void octave_rl_enable_paren_matching(int)
void octave_rl_set_event_hook(rl_event_hook_fcn_ptr f)
char * octave_rl_copy_line(void)
void octave_rl_set_completion_append_character(char)
int octave_rl_screen_height(void)
rl_startup_hook_fcn_ptr octave_rl_get_startup_hook(void)
void octave_rl_set_completion_function(rl_attempted_completion_fcn_ptr)
int octave_rl_point(void)
rl_event_hook_fcn_ptr octave_rl_get_event_hook(void)
rl_pre_input_hook_fcn_ptr octave_rl_get_pre_input_hook(void)
void octave_rl_insert_text(const char *)
int(* rl_char_is_quoted_fcn_ptr)(char *, int)
void octave_rl_recover_from_interrupt(void)
void octave_rl_add_defun(const char *, rl_fcn_ptr, int)
void octave_rl_set_completer_quote_characters(const char *)
void octave_rl_set_screen_size(int ht, int wd)
void octave_rl_replace_line(const char *s, int clear_undo)
char *(* rl_quoting_fcn_ptr)(char *, int, char *)
void octave_rl_set_char_is_quoted_function(rl_char_is_quoted_fcn_ptr)
int octave_rl_newline(int, int)
void octave_rl_set_input_stream(FILE *)
char * octave_rl_readline(const char *)
void octave_rl_redisplay(void)
void octave_rl_set_basic_word_break_characters(const char *)
char *(* rl_dequoting_fcn_ptr)(char *, int)
char ** octave_rl_completion_matches(const char *, rl_completer_fcn_ptr)
std::atomic< bool > octave_signal_caught
std::atomic< sig_atomic_t > octave_interrupt_state
char * octave_strdup_wrapper(const char *str)
uid_t octave_geteuid_wrapper(void)