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