GNU Octave  3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cmd-edit.h
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 1996-2013 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 #if !defined (octave_cmd_edit_h)
24 #define octave_cmd_edit_h 1
25 
26 #include <cstdio>
27 
28 #include <set>
29 #include <string>
30 
31 #include "str-vec.h"
32 
33 class
34 OCTAVE_API
36 {
37 protected:
38 
40  : command_number (0), interrupted (false), initial_input () { }
41 
42 public:
43 
44  typedef int (*startup_hook_fcn) (void);
45 
46  typedef int (*pre_input_hook_fcn) (void);
47 
48  typedef int (*event_hook_fcn) (void);
49 
50  typedef std::string (*completion_fcn) (const std::string&, int);
51 
52  typedef std::string (*quoting_fcn) (const std::string&, int, char);
53 
54  typedef std::string (*dequoting_fcn) (const std::string&, int);
55 
56  typedef int (*char_is_quoted_fcn) (const std::string&, int);
57 
58  typedef void (*user_accept_line_fcn) (const std::string&);
59 
60  virtual ~command_editor (void) { }
61 
62  static void set_name (const std::string& n);
63 
64  static std::string readline (const std::string& prompt);
65 
66  static std::string readline (const std::string& prompt, bool& eof);
67 
68  static void set_input_stream (FILE *f);
69 
70  static FILE *get_input_stream (void);
71 
72  static void set_output_stream (FILE *f);
73 
74  static FILE *get_output_stream (void);
75 
76  static void redisplay (void);
77 
78  static int terminal_rows (void);
79 
80  static int terminal_cols (void);
81 
82  static void clear_screen (bool skip_redisplay = false);
83 
84  static void resize_terminal (void);
85 
86  static std::string decode_prompt_string (const std::string& s);
87 
88  static void restore_terminal_state (void);
89 
90  static void blink_matching_paren (bool flag);
91 
92  static void set_basic_word_break_characters (const std::string& s);
93 
94  static void set_completer_word_break_characters (const std::string& s);
95 
96  static void set_basic_quote_characters (const std::string& s);
97 
98  static void set_filename_quote_characters (const std::string& s);
99 
100  static void set_completer_quote_characters (const std::string& s);
101 
102  static void set_completion_append_character (char c);
103 
104  static void set_completion_function (completion_fcn f);
105 
106  static void set_quoting_function (quoting_fcn f);
107 
108  static void set_dequoting_function (dequoting_fcn f);
109 
110  static void set_char_is_quoted_function (char_is_quoted_fcn f);
111 
112  static void set_user_accept_line_function (user_accept_line_fcn f);
113 
114  static completion_fcn get_completion_function (void);
115 
116  static quoting_fcn get_quoting_function (void);
117 
118  static dequoting_fcn get_dequoting_function (void);
119 
120  static char_is_quoted_fcn get_char_is_quoted_function (void);
121 
122  static user_accept_line_fcn get_user_accept_line_function (void);
123 
124  static string_vector generate_filename_completions (const std::string& text);
125 
126  static std::string get_line_buffer (void);
127 
128  static std::string get_current_line (void);
129 
130  static void replace_line (const std::string& text, bool clear_undo = true);
131 
132  static void insert_text (const std::string& text);
133 
134  static void newline (void);
135 
136  static void accept_line (void);
137 
138  static bool undo (void);
139 
140  static void clear_undo_list (void);
141 
142  static void add_startup_hook (startup_hook_fcn f);
143 
144  static void remove_startup_hook (startup_hook_fcn f);
145 
146  static void add_pre_input_hook (pre_input_hook_fcn f);
147 
148  static void remove_pre_input_hook (pre_input_hook_fcn f);
149 
150  static void add_event_hook (event_hook_fcn f);
151 
152  static void remove_event_hook (event_hook_fcn f);
153 
154  static void run_event_hooks (void);
155 
156  static void read_init_file (const std::string& file = std::string ());
157 
158  static void re_read_init_file (void);
159 
160  static bool filename_completion_desired (bool);
161 
162  static bool filename_quoting_desired (bool);
163 
164  static bool interrupt (bool = true);
165 
166  static int current_command_number (void);
167 
168  static void reset_current_command_number (int n);
169 
170  static void increment_current_command_number (void);
171 
172  static void force_default_editor (void);
173 
174  static void set_initial_input (const std::string& text);
175 
176  static int insert_initial_input (void);
177 
178 private:
179 
180  // No copying!
181 
183 
184  command_editor& operator = (const command_editor&);
185 
186  static bool instance_ok (void);
187 
188  static void make_command_editor (void);
189 
190  static int startup_handler (void);
191 
192  static int pre_input_handler (void);
193 
194  static int event_handler (void);
195 
196  static std::set<startup_hook_fcn> startup_hook_set;
197 
198  static std::set<pre_input_hook_fcn> pre_input_hook_set;
199 
200  static std::set<event_hook_fcn> event_hook_set;
201 
202  typedef std::set<startup_hook_fcn>::iterator startup_hook_set_iterator;
203  typedef std::set<startup_hook_fcn>::const_iterator startup_hook_set_const_iterator;
204 
205  typedef std::set<pre_input_hook_fcn>::iterator pre_input_hook_set_iterator;
206  typedef std::set<pre_input_hook_fcn>::const_iterator pre_input_hook_set_const_iterator;
207 
208  typedef std::set<event_hook_fcn>::iterator event_hook_set_iterator;
209  typedef std::set<event_hook_fcn>::const_iterator event_hook_set_const_iterator;
210 
211  // The real thing.
213 
214  static void cleanup_instance (void) { delete instance; instance = 0; }
215 
216 protected:
217 
218  // To use something other than the GNU readline library, derive a new
219  // class from command_editor, overload these functions as
220  // necessary, and make instance point to the new class.
221 
222  virtual void do_set_name (const std::string&) { }
223 
224  std::string do_readline (const std::string& prompt)
225  {
226  bool eof;
227 
228  return do_readline (prompt, eof);
229  }
230 
231  virtual std::string do_readline (const std::string&, bool&) = 0;
232 
233  virtual void do_set_input_stream (FILE *) = 0;
234 
235  virtual FILE *do_get_input_stream (void) = 0;
236 
237  virtual void do_set_output_stream (FILE *) = 0;
238 
239  virtual FILE *do_get_output_stream (void) = 0;
240 
241  virtual void do_redisplay (void) { }
242 
243  virtual int do_terminal_rows (void) { return 24; }
244 
245  virtual int do_terminal_cols (void) { return 80; }
246 
247  virtual void do_clear_screen (bool) { }
248 
249  virtual void do_resize_terminal (void) { }
250 
251  virtual std::string do_decode_prompt_string (const std::string&);
252 
253  virtual std::string newline_chars (void) { return "\n"; }
254 
255  virtual void do_restore_terminal_state (void) { }
256 
257  virtual void do_blink_matching_paren (bool) { }
258 
259  virtual void do_set_basic_word_break_characters (const std::string&) { }
260 
261  virtual void do_set_completer_word_break_characters (const std::string&) { }
262 
263  virtual void do_set_basic_quote_characters (const std::string&) { }
264 
265  virtual void do_set_filename_quote_characters (const std::string&) { }
266 
267  virtual void do_set_completer_quote_characters (const std::string&) { }
268 
269  virtual void do_set_completion_append_character (char) { }
270 
271  virtual void do_set_completion_function (completion_fcn) { }
272 
273  virtual void do_set_quoting_function (quoting_fcn) { }
274 
275  virtual void do_set_dequoting_function (dequoting_fcn) { }
276 
277  virtual void do_set_char_is_quoted_function (char_is_quoted_fcn) { }
278 
279  virtual void do_set_user_accept_line_function (user_accept_line_fcn) { }
280 
281  virtual completion_fcn do_get_completion_function (void) const { return 0; }
282 
283  virtual quoting_fcn do_get_quoting_function (void) const { return 0; }
284 
285  virtual dequoting_fcn do_get_dequoting_function (void) const { return 0; }
286 
287  virtual char_is_quoted_fcn do_get_char_is_quoted_function (void) const
288  { return 0; }
289 
290  virtual user_accept_line_fcn do_get_user_accept_line_function (void) const
291  { return 0; }
292 
293  virtual string_vector
294  do_generate_filename_completions (const std::string& text) = 0;
295 
296  virtual std::string do_get_line_buffer (void) const = 0;
297 
298  virtual std::string do_get_current_line (void) const = 0;
299 
300  virtual void do_replace_line (const std::string& text, bool clear_undo) = 0;
301 
302  virtual void do_insert_text (const std::string& text) = 0;
303 
304  virtual void do_newline (void) = 0;
305 
306  virtual void do_accept_line (void) = 0;
307 
308  virtual bool do_undo (void) { return false; }
309 
310  virtual void do_clear_undo_list (void) { }
311 
312  virtual void set_startup_hook (startup_hook_fcn) { }
313 
314  virtual void restore_startup_hook (void) { }
315 
316  virtual void set_pre_input_hook (pre_input_hook_fcn) { }
317 
318  virtual void restore_pre_input_hook (void) { }
319 
320  virtual void set_event_hook (event_hook_fcn) { }
321 
322  virtual void restore_event_hook (void) { }
323 
324  virtual void do_read_init_file (const std::string&) { }
325 
326  virtual void do_re_read_init_file (void) { }
327 
328  virtual bool do_filename_completion_desired (bool) { return false; }
329 
330  virtual bool do_filename_quoting_desired (bool) { return false; }
331 
332  virtual void do_interrupt (bool) { }
333 
334  int do_insert_initial_input (void);
335 
336  int read_octal (const std::string& s);
337 
338  void error (int);
339 
340  void error (const std::string&);
341 
342  // The current command number.
344 
346 
347  std::string initial_input;
348 };
349 
350 #endif