GNU Octave  6.2.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
input.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1993-2021 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 // Get command input interactively or from files.
27 
28 #if defined (HAVE_CONFIG_H)
29 # include "config.h"
30 #endif
31 
32 #include <cstdio>
33 #include <cstdlib>
34 #include <cstring>
35 #include <cassert>
36 
37 #include <algorithm>
38 #include <iostream>
39 #include <queue>
40 #include <sstream>
41 #include <string>
42 
43 #include "cmd-edit.h"
44 #include "file-ops.h"
45 #include "iconv-wrappers.h"
46 #include "localcharset-wrapper.h"
47 #include "oct-string.h"
48 #include "quit.h"
49 #include "str-vec.h"
50 #include "uniconv-wrappers.h"
51 
52 #include "builtin-defun-decls.h"
53 #include "defun.h"
54 #include "error.h"
55 #include "errwarn.h"
56 #include "event-manager.h"
57 #include "help.h"
58 #include "hook-fcn.h"
59 #include "input.h"
60 #include "interpreter-private.h"
61 #include "interpreter.h"
62 #include "load-path.h"
63 #include "octave.h"
64 #include "oct-map.h"
65 #include "oct-hist.h"
66 #include "interpreter.h"
67 #include "event-manager.h"
68 #include "ovl.h"
69 #include "ov-fcn-handle.h"
70 #include "ov-usr-fcn.h"
71 #include "pager.h"
72 #include "parse.h"
73 #include "pt-eval.h"
74 #include "pt-stmt.h"
75 #include "sighandlers.h"
76 #include "sysdep.h"
77 #include "interpreter.h"
78 #include "unwind-prot.h"
79 #include "utils.h"
80 #include "variables.h"
81 
82 // The time we last printed a prompt.
84 
85 // TRUE after a call to completion_matches.
87 
88 // TRUE if the plotting system has requested a call to drawnow at
89 // the next user prompt.
90 bool Vdrawnow_requested = false;
91 
92 // TRUE if we are recording line numbers in a source file.
93 // Always true except when debugging and taking input directly from
94 // the terminal.
95 bool Vtrack_line_num = true;
96 
97 namespace octave
98 {
99  static std::string
100  quoting_filename (const std::string& text, int, char quote)
101  {
102  if (quote)
103  return text;
104  else
105  return ("'" + text);
106  }
107 
108  // Try to parse a partial command line in reverse, excluding trailing TEXT.
109  // If it appears a variable has been indexed by () or {},
110  // return that expression,
111  // to allow autocomplete of field names of arrays of structures.
112  static std::string
113  find_indexed_expression (const std::string& text)
114  {
115  std::string line = command_editor::get_line_buffer ();
116 
117  int pos = line.length () - text.length ();
118  int curly_count = 0;
119  int paren_count = 0;
120 
121  int last = --pos;
122 
123  while (pos >= 0 && (line[pos] == ')' || line[pos] == '}'))
124  {
125  if (line[pos] == ')')
126  paren_count++;
127  else
128  curly_count++;
129 
130  while (curly_count + paren_count > 0 && --pos >= 0)
131  {
132  if (line[pos] == ')')
133  paren_count++;
134  else if (line[pos] == '(')
135  paren_count--;
136  else if (line[pos] == '}')
137  curly_count++;
138  else if (line[pos] == '{')
139  curly_count--;
140  }
141 
142  while (--pos >= 0 && line[pos] == ' ')
143  ;
144  }
145 
146  while (pos >= 0 && (isalnum (line[pos]) || line[pos] == '_'))
147  pos--;
148 
149  if (++pos >= 0)
150  return (line.substr (pos, last + 1 - pos));
151  else
152  return std::string ();
153  }
154 
155  static string_vector
156  generate_struct_completions (const std::string& text,
157  std::string& prefix, std::string& hint)
158  {
159  string_vector names;
160 
161  size_t pos = text.rfind ('.');
162  bool array = false;
163 
164  if (pos != std::string::npos)
165  {
166  if (pos == text.length ())
167  hint = "";
168  else
169  hint = text.substr (pos+1);
170 
171  prefix = text.substr (0, pos);
172 
173  if (prefix == "")
174  {
175  array = true;
176  prefix = find_indexed_expression (text);
177  }
178 
179  std::string base_name = prefix;
180 
181  pos = base_name.find_first_of ("{(. ");
182 
183  if (pos != std::string::npos)
184  base_name = base_name.substr (0, pos);
185 
186  interpreter& interp
187  = __get_interpreter__ ("generate_struct_completions");
188 
189  if (interp.is_variable (base_name))
190  {
191  int parse_status;
192 
193  error_system& es = interp.get_error_system ();
194 
195  unwind_protect frame;
196 
197  frame.add_method (es, &error_system::set_discard_warning_messages,
198  es.discard_warning_messages ());
199 
200  es.discard_warning_messages (true);
201 
202  try
203  {
204  octave_value tmp
205  = interp.eval_string (prefix, true, parse_status);
206 
207  frame.run ();
208 
209  if (tmp.is_defined ()
210  && (tmp.isstruct () || tmp.isjava () || tmp.is_classdef_object ()))
211  names = tmp.map_keys ();
212  }
213  catch (const execution_exception&)
214  {
215  interp.recover_from_exception ();
216  }
217  }
218  }
219 
220  // Undo look-back that found the array expression,
221  // but insert an extra "." to distinguish from the non-struct case.
222  if (array)
223  prefix = ".";
224 
225  return names;
226  }
227 
228  // FIXME: this will have to be much smarter to work "correctly".
229  static bool
230  looks_like_struct (const std::string& text, char prev_char)
231  {
232  bool retval = (! text.empty ()
233  && (text != "." || prev_char == ')' || prev_char == '}')
234  && text.find_first_of (sys::file_ops::dir_sep_chars ()) == std::string::npos
235  && text.find ("..") == std::string::npos
236  && text.rfind ('.') != std::string::npos);
237 
238  return retval;
239  }
240 
241  // FIXME: make this generate filenames when appropriate.
242 
243  static string_vector
244  generate_possible_completions (const std::string& text, std::string& prefix,
245  std::string& hint, bool& deemed_struct)
246  {
247  string_vector names;
248 
249  prefix = "";
250 
251  char prev_char = command_editor::get_prev_char (text.length ());
252  deemed_struct = looks_like_struct (text, prev_char);
253 
254  if (deemed_struct)
255  names = generate_struct_completions (text, prefix, hint);
256  else
257  names = make_name_list ();
258 
259  // Sort and remove duplicates.
260 
261  names.sort (true);
262 
263  return names;
264  }
265 
266  static bool
267  is_completing_dirfns (void)
268  {
269  static std::string dirfns_commands[] = {"cd", "isfile", "isfolder", "ls"};
270  static const size_t dirfns_commands_length = 4;
271 
272  bool retval = false;
273 
274  std::string line = command_editor::get_line_buffer ();
275 
276  for (size_t i = 0; i < dirfns_commands_length; i++)
277  {
278  int index = line.find (dirfns_commands[i] + ' ');
279 
280  if (index == 0)
281  {
282  retval = true;
283  break;
284  }
285  }
286 
287  return retval;
288  }
289 
290  static std::string
291  generate_completion (const std::string& text, int state)
292  {
293  std::string retval;
294 
295  static std::string prefix;
296  static std::string hint;
297 
298  static size_t hint_len = 0;
299 
300  static int list_index = 0;
301  static int name_list_len = 0;
302  static int name_list_total_len = 0;
303  static string_vector name_list;
304  static string_vector file_name_list;
305 
306  static int matches = 0;
307 
308  if (state == 0)
309  {
310  list_index = 0;
311 
312  prefix = "";
313 
314  hint = text;
315 
316  // No reason to display symbols while completing a
317  // file/directory operation.
318 
319  bool deemed_struct = false;
320 
321  if (is_completing_dirfns ())
322  name_list = string_vector ();
323  else
324  name_list = generate_possible_completions (text, prefix, hint,
325  deemed_struct);
326 
327  name_list_len = name_list.numel ();
328 
329  // If the line was something like "a{1}." then text = "." but
330  // we don't want to expand all the . files.
331  if (! deemed_struct)
332  {
333 
335 
336  name_list.append (file_name_list);
337 
338  }
339 
340  name_list_total_len = name_list.numel ();
341 
342  hint_len = hint.length ();
343 
344  matches = 0;
345 
346  for (int i = 0; i < name_list_len; i++)
347  if (hint == name_list[i].substr (0, hint_len))
348  matches++;
349  }
350 
351  if (name_list_total_len > 0 && matches > 0)
352  {
353  while (list_index < name_list_total_len)
354  {
355  std::string name = name_list[list_index];
356 
357  list_index++;
358 
359  if (hint == name.substr (0, hint_len))
360  {
361  // Special case: array reference forces prefix="."
362  // in generate_struct_completions ()
363  if (list_index <= name_list_len && ! prefix.empty ())
364  retval = (prefix == "." ? "" : prefix) + '.' + name;
365  else
366  retval = name;
367 
368  char prev_char =
370 
371  if (matches == 1 && looks_like_struct (retval, prev_char))
372  {
373  // Don't append anything, since we don't know
374  // whether it should be '(' or '.'.
375 
377  }
378  else
379  {
380  input_system& input_sys
381  = __get_input_system__ ("generate_completion");
382 
384  (input_sys.completion_append_char ());
385  }
386 
387  break;
388  }
389  }
390  }
391 
392  return retval;
393  }
394 
395  static int internal_input_event_hook_fcn (void)
396  {
397  octave_quit ();
398 
399  input_system& input_sys
400  = __get_input_system__ ("internal_input_event_hook_fcn");
401 
402  input_sys.run_input_event_hooks ();
403 
404  return 0;
405  }
406 
407  // Use literal "octave" in default setting for PS1 instead of
408  // "\\s" to avoid setting the prompt to "octave.exe" or
409  // "octave-gui", etc.
410 
411  input_system::input_system (interpreter& interp)
412  : m_interpreter (interp), m_PS1 (R"(octave:\#> )"), m_PS2 ("> "),
413  m_completion_append_char (' '), m_gud_mode (false),
414  m_mfile_encoding ("system"), m_auto_repeat_debug_command (true),
415  m_last_debugging_command ("\n"), m_input_event_hook_functions (),
416  m_initialized (false)
417  { }
418 
419  void input_system::initialize (bool line_editing)
420  {
421  if (m_initialized)
422  return;
423 
424  // Force default line editor if we don't want readline editing.
425  if (! line_editing)
426  {
428  return;
429  }
430 
431  // If we are using readline, this allows conditional parsing of the
432  // .inputrc file.
433 
434  command_editor::set_name ("Octave");
435 
436  // FIXME: this needs to include a comma too, but that
437  // causes trouble for the new struct element completion code.
438 
439  static const char *s = "\t\n !\"\'*+-/:;<=>(){}[\\]^`~";
440 
442 
444 
446 
447  command_editor::set_filename_quote_characters (" \t\n\\\"'@<>=;|&()#$`?*[!:{");
448 
450 
451  command_editor::set_completion_function (generate_completion);
452 
453  command_editor::set_quoting_function (quoting_filename);
454 
455  command_editor::add_event_hook (internal_input_event_hook_fcn);
456 
457  m_initialized = true;
458  }
459 
461  input_system::PS1 (const octave_value_list& args, int nargout)
462  {
463  return set_internal_variable (m_PS1, args, nargout, "PS1");
464  }
465 
467  input_system::PS2 (const octave_value_list& args, int nargout)
468  {
469  return set_internal_variable (m_PS2, args, nargout, "PS2");
470  }
471 
474  int nargout)
475  {
476  return set_internal_variable (m_completion_append_char, args, nargout,
477  "completion_append_char");
478  }
479 
481  input_system::gud_mode (const octave_value_list& args, int nargout)
482  {
483  return set_internal_variable (m_gud_mode, args, nargout, "__gud_mode__");
484  }
485 
487  input_system::mfile_encoding (const octave_value_list& args, int nargout)
488  {
489  // Save current value in case there is an error in the additional
490  // validation below.
491 
492  std::string saved_encoding = m_mfile_encoding;
493 
494  // We must pass the actual variable to change here for temporary
495  // "local" settings to work properly.
496 
498  = set_internal_variable (m_mfile_encoding, args, nargout,
499  "__mfile_encoding__");
500 
501  // Additional validation if the encoding has changed.
502 
503  if (m_mfile_encoding != saved_encoding)
504  {
505  if (m_mfile_encoding.empty ())
506  {
507  m_mfile_encoding = "system";
508  }
509  else
510  {
512  m_mfile_encoding.end (),
513  m_mfile_encoding.begin (), ::tolower);
514 
515  std::string encoding = (m_mfile_encoding.compare ("system") == 0)
517 
518  // Check for valid encoding name.
519  void *codec
520  = octave_iconv_open_wrapper (encoding.c_str (), "utf-8");
521 
522  if (codec == reinterpret_cast<void *> (-1))
523  {
524  m_mfile_encoding = saved_encoding;
525  if (errno == EINVAL)
526  error ("__mfile_encoding__: conversion from encoding '%s' "
527  "not supported", encoding.c_str ());
528  else
529  error ("__mfile_encoding__: error %d opening encoding '%s'.",
530  errno, encoding.c_str ());
531  }
532  else
534  }
535 
536  }
537 
538  // Synchronize the related gui preference for editor encoding
539  feval ("__event_manager_gui_preference__",
540  ovl ("editor/default_encoding", m_mfile_encoding));
541 
542  return retval;
543  }
544 
547  int nargout)
548  {
549  return set_internal_variable (m_auto_repeat_debug_command, args, nargout,
550  "auto_repeat_debug_command");
551  }
552 
553  bool input_system::yes_or_no (const std::string& prompt)
554  {
555  std::string prompt_string = prompt + "(yes or no) ";
556 
557  while (1)
558  {
559  bool eof = false;
560 
561  std::string input_buf = interactive_input (prompt_string, eof);
562 
563  if (input_buf == "yes")
564  return true;
565  else if (input_buf == "no")
566  return false;
567  else
568  message (nullptr, "Please answer yes or no.");
569  }
570  }
571 
572  std::string input_system::interactive_input (const std::string& s, bool& eof)
573  {
575 
577  {
578  bool eval_error = false;
579 
580  try
581  {
583  }
584  catch (const execution_exception& e)
585  {
586  eval_error = true;
587 
589  }
590 
591  flush_stdout ();
592 
593  // We set Vdrawnow_requested to false even if there is an error in
594  // drawnow so that the error doesn't reappear at every prompt.
595 
596  Vdrawnow_requested = false;
597 
598  if (eval_error)
599  return "\n";
600  }
601 
602  return gnu_readline (s, eof);
603  }
604 
605  // If the user simply hits return, this will produce an empty matrix.
606 
608  input_system::get_user_input (const octave_value_list& args, int nargout)
609  {
611 
612  int read_as_string = 0;
613 
614  if (args.length () == 2)
615  read_as_string++;
616 
617  std::string prompt = args(0).xstring_value ("input: unrecognized argument");
618 
619  output_system& output_sys = m_interpreter.get_output_system ();
620 
621  output_sys.reset ();
622 
623  octave_diary << prompt;
624 
625  bool eof = false;
626 
627  std::string input_buf = interactive_input (prompt.c_str (), eof);
628 
629  if (input_buf.empty ())
630  error ("input: reading user-input failed!");
631 
632  size_t len = input_buf.length ();
633 
634  octave_diary << input_buf;
635 
636  if (input_buf[len - 1] != '\n')
637  octave_diary << "\n";
638 
639  if (read_as_string)
640  {
641  // FIXME: fix gnu_readline and octave_gets instead!
642  if (input_buf.length () == 1 && input_buf[0] == '\n')
643  retval(0) = "";
644  else
645  retval(0) = input_buf;
646  }
647  else
648  {
649  int parse_status = 0;
650 
651  retval
652  = m_interpreter.eval_string (input_buf, true, parse_status, nargout);
653 
654  tree_evaluator& tw = m_interpreter.get_evaluator ();
655 
656  if (! tw.in_debug_repl () && retval.empty ())
657  retval(0) = Matrix ();
658  }
659 
660  return retval;
661  }
662 
663  bool input_system::have_input_event_hooks (void) const
664  {
666  }
667 
669  {
670  m_input_event_hook_functions.insert (hook_fcn.id (), hook_fcn);
671  }
672 
673  bool input_system::remove_input_event_hook (const std::string& hook_fcn_id)
674  {
676  = m_input_event_hook_functions.find (hook_fcn_id);
677 
678  if (p == m_input_event_hook_functions.end ())
679  return false;
680 
682  return true;
683  }
684 
686  {
688  }
689 
691  {
693  }
694 
695  std::string
696  input_system::gnu_readline (const std::string& s, bool& eof) const
697  {
698  octave_quit ();
699 
700  eof = false;
701 
702  std::string retval = command_editor::readline (s, eof);
703 
704  if (! eof && retval.empty ())
705  retval = "\n";
706 
707  return retval;
708  }
709 
710  std::string base_reader::octave_gets (const std::string& prompt, bool& eof)
711  {
712  octave_quit ();
713 
714  eof = false;
715 
716  std::string retval;
717 
718  // Process pre input event hook function prior to flushing output and
719  // printing the prompt.
720 
721  tree_evaluator& tw = m_interpreter.get_evaluator ();
722 
723  event_manager& evmgr = m_interpreter.get_event_manager ();
724 
725  if (m_interpreter.interactive ())
726  {
727  if (! tw.in_debug_repl ())
728  evmgr.exit_debugger_event ();
729 
730  evmgr.pre_input_event ();
731 
732  evmgr.set_workspace ();
733  }
734 
735  bool history_skip_auto_repeated_debugging_command = false;
736 
737  input_system& input_sys = m_interpreter.get_input_system ();
738 
740 
741  output_system& output_sys = m_interpreter.get_output_system ();
742 
743  output_sys.reset ();
744 
745  octave_diary << prompt;
746 
747  retval = input_sys.interactive_input (prompt, eof);
748 
749  // There is no need to update the load_path cache if there is no
750  // user input.
751  if (retval != "\n"
752  && retval.find_first_not_of (" \t\n\r") != std::string::npos)
753  {
754  load_path& lp = m_interpreter.get_load_path ();
755 
756  lp.update ();
757 
758  if (tw.in_debug_repl ())
759  input_sys.last_debugging_command (retval);
760  else
761  input_sys.last_debugging_command ("\n");
762  }
763  else if (tw.in_debug_repl () && input_sys.auto_repeat_debug_command ())
764  {
765  retval = input_sys.last_debugging_command ();
766  history_skip_auto_repeated_debugging_command = true;
767  }
768 
769  if (retval != "\n")
770  {
771  if (! history_skip_auto_repeated_debugging_command)
772  {
774  evmgr.append_history (retval);
775  }
776 
777  octave_diary << retval;
778 
779  if (! retval.empty () && retval.back () != '\n')
780  octave_diary << "\n";
781  }
782  else
783  octave_diary << "\n";
784 
785  // Process post input event hook function after the internal history
786  // list has been updated.
787 
788  if (m_interpreter.interactive ())
789  evmgr.post_input_event ();
790 
791  return retval;
792  }
793 
794  class
795  terminal_reader : public base_reader
796  {
797  public:
798 
799  terminal_reader (interpreter& interp)
800  : base_reader (interp), m_eof (false), m_input_queue ()
801  { }
802 
803  std::string get_input (const std::string& prompt, bool& eof);
804 
805  std::string input_source (void) const { return s_in_src; }
806 
807  bool input_from_terminal (void) const { return true; }
808 
809  private:
810 
811  bool m_eof;
812  std::queue<std::string> m_input_queue;
813 
814  static const std::string s_in_src;
815  };
816 
817  class
818  file_reader : public base_reader
819  {
820  public:
821 
822  file_reader (interpreter& interp, FILE *f_arg)
823  : base_reader (interp), m_file (f_arg) { }
824 
825  std::string get_input (const std::string& prompt, bool& eof);
826 
827  std::string input_source (void) const { return s_in_src; }
828 
829  bool input_from_file (void) const { return true; }
830 
831  private:
832 
833  FILE *m_file;
834 
835  static const std::string s_in_src;
836  };
837 
838  class
839  eval_string_reader : public base_reader
840  {
841  public:
842 
843  eval_string_reader (interpreter& interp, const std::string& str)
844  : base_reader (interp), m_eval_string (str)
845  { }
846 
847  std::string get_input (const std::string& prompt, bool& eof);
848 
849  std::string input_source (void) const { return s_in_src; }
850 
851  bool input_from_eval_string (void) const { return true; }
852 
853  private:
854 
855  std::string m_eval_string;
856 
857  static const std::string s_in_src;
858  };
859 
860  input_reader::input_reader (interpreter& interp)
861  : m_rep (new terminal_reader (interp))
862  { }
863 
864  input_reader::input_reader (interpreter& interp, FILE *file)
865  : m_rep (new file_reader (interp, file))
866  { }
867 
868  input_reader::input_reader (interpreter& interp, const std::string& str)
869  : m_rep (new eval_string_reader (interp, str))
870  { }
871 
872  const std::string base_reader::s_in_src ("invalid");
873 
874  const std::string terminal_reader::s_in_src ("terminal");
875 
876  // If octave_gets returns multiple lines, we cache the input and
877  // return it one line at a time. Multiple input lines may happen when
878  // using readline and bracketed paste mode is enabled, for example.
879  // Instead of queueing lines here, it might be better to modify the
880  // grammar in the parser to handle multiple lines when working
881  // interactively. See also bug #59938.
882 
883  std::string
884  terminal_reader::get_input (const std::string& prompt, bool& eof)
885  {
886  octave_quit ();
887 
888  eof = false;
889 
890  if (m_input_queue.empty ())
891  {
892  std::string input = octave_gets (prompt, m_eof);
893 
894  size_t len = input.size ();
895 
896  if (len == 0)
897  {
898  if (m_eof)
899  {
900  eof = m_eof;
901  return input;
902  }
903  else
904  {
905  // Can this happen, or will the string returned from
906  // octave_gets always end in a newline character?
907 
908  input = "\n";
909  len = 1;
910  }
911  }
912 
913  size_t beg = 0;
914  while (beg < len)
915  {
916  size_t end = input.find ('\n', beg);
917 
918  if (end == std::string::npos)
919  {
920  m_input_queue.push (input.substr (beg));
921  break;
922  }
923  else
924  {
925  m_input_queue.push (input.substr (beg, end-beg+1));
926  beg = end + 1;
927  }
928  }
929  }
930 
931  std::string retval = m_input_queue.front ();
932  m_input_queue.pop ();
933 
934  if (m_input_queue.empty ())
935  eof = m_eof;
936 
937  return retval;
938  }
939 
940  const std::string file_reader::s_in_src ("file");
941 
942  std::string
943  file_reader::get_input (const std::string& /*prompt*/, bool& eof)
944  {
945  octave_quit ();
946 
947  eof = false;
948 
949  std::string src_str = octave_fgets (m_file, eof);
950 
951  input_system& input_sys = m_interpreter.get_input_system ();
952 
953  std::string mfile_encoding = input_sys.mfile_encoding ();
954 
955  std::string encoding;
956  if (mfile_encoding.compare ("system") == 0)
957  {
958  encoding = octave_locale_charset_wrapper ();
959  // encoding identifiers should consist of ASCII only characters
960  std::transform (encoding.begin (), encoding.end (), encoding.begin (),
961  ::tolower);
962  }
963  else
964  encoding = mfile_encoding;
965 
966  if (encoding.compare ("utf-8") == 0)
967  {
968  // Check for BOM and strip it
969  if (src_str.compare (0, 3, "\xef\xbb\xbf") == 0)
970  src_str.erase (0, 3);
971 
972  // replace invalid portions of the string
973  // FIXME: Include file name that corresponds to m_file.
974  if (string::u8_validate ("get_input", src_str) > 0)
975  warning_with_id ("octave:get_input:invalid_utf8",
976  "Invalid UTF-8 byte sequences have been replaced.");
977  }
978  else
979  {
980  // convert encoding to UTF-8 before returning string
981  const char *src = src_str.c_str ();
982  size_t srclen = src_str.length ();
983 
984  size_t length;
985  uint8_t *utf8_str;
986 
987  utf8_str = octave_u8_conv_from_encoding (encoding.c_str (), src, srclen,
988  &length);
989 
990  if (! utf8_str)
991  error ("file_reader::get_input: "
992  "converting from codepage '%s' to UTF-8: %s",
993  encoding.c_str (), std::strerror (errno));
994 
995  unwind_protect frame;
996  frame.add_fcn (::free, static_cast<void *> (utf8_str));
997 
998  src_str = std::string (reinterpret_cast<char *> (utf8_str), length);
999  }
1000 
1001  return src_str;
1002  }
1003 
1004  const std::string eval_string_reader::s_in_src ("eval_string");
1005 
1006  std::string
1007  eval_string_reader::get_input (const std::string& /*prompt*/, bool& eof)
1008  {
1009  octave_quit ();
1010 
1011  eof = false;
1012 
1013  std::string retval;
1014 
1015  retval = m_eval_string;
1016 
1017  // Clear the eval string so that the next call will return
1018  // an empty character string with EOF = true.
1019  m_eval_string = "";
1020 
1021  if (retval.empty ())
1022  eof = true;
1023 
1024  return retval;
1025  }
1026 }
1027 
1028 DEFMETHOD (input, interp, args, nargout,
1029  doc: /* -*- texinfo -*-
1030 @deftypefn {} {@var{ans} =} input (@var{prompt})
1031 @deftypefnx {} {@var{ans} =} input (@var{prompt}, "s")
1032 Print @var{prompt} and wait for user input.
1033 
1034 For example,
1035 
1036 @example
1037 input ("Pick a number, any number! ")
1038 @end example
1039 
1040 @noindent
1041 prints the prompt
1042 
1043 @example
1044 Pick a number, any number!
1045 @end example
1046 
1047 @noindent
1048 and waits for the user to enter a value. The string entered by the user
1049 is evaluated as an expression, so it may be a literal constant, a variable
1050 name, or any other valid Octave code.
1051 
1052 The number of return arguments, their size, and their class depend on the
1053 expression entered.
1054 
1055 If you are only interested in getting a literal string value, you can call
1056 @code{input} with the character string @qcode{"s"} as the second argument.
1057 This tells Octave to return the string entered by the user directly, without
1058 evaluating it first.
1059 
1060 Because there may be output waiting to be displayed by the pager, it is a
1061 good idea to always call @code{fflush (stdout)} before calling @code{input}.
1062  This will ensure that all pending output is written to the screen before
1063 your prompt.
1064 @seealso{yes_or_no, kbhit, pause, menu, listdlg}
1065 @end deftypefn */)
1066 {
1067  int nargin = args.length ();
1068 
1069  if (nargin < 1 || nargin > 2)
1070  print_usage ();
1071 
1072  octave::input_system& input_sys = interp.get_input_system ();
1073 
1074  return input_sys.get_user_input (args, std::max (nargout, 1));
1075 }
1076 
1077 DEFMETHOD (yes_or_no, interp, args, ,
1078  doc: /* -*- texinfo -*-
1079 @deftypefn {} {@var{ans} =} yes_or_no ("@var{prompt}")
1080 Ask the user a yes-or-no question.
1081 
1082 Return logical true if the answer is yes or false if the answer is no.
1083 
1084 Takes one argument, @var{prompt}, which is the string to display when asking
1085 the question. @var{prompt} should end in a space; @code{yes-or-no} adds the
1086 string @samp{(yes or no) } to it. The user must confirm the answer with
1087 @key{RET} and can edit it until it has been confirmed.
1088 @seealso{input}
1089 @end deftypefn */)
1090 {
1091  int nargin = args.length ();
1092 
1093  if (nargin > 1)
1094  print_usage ();
1095 
1096  octave::input_system& input_sys = interp.get_input_system ();
1097 
1098  std::string prompt;
1099 
1100  if (nargin == 1)
1101  prompt = args(0).xstring_value ("yes_or_no: PROMPT must be a string");
1102 
1103  return ovl (input_sys.yes_or_no (prompt));
1104 }
1105 
1106 DEFMETHOD (keyboard, interp, args, ,
1107  doc: /* -*- texinfo -*-
1108 @deftypefn {} {} keyboard ()
1109 @deftypefnx {} {} keyboard ("@var{prompt}")
1110 Stop m-file execution and enter debug mode.
1111 
1112 When the @code{keyboard} function is executed, Octave prints a prompt and
1113 waits for user input. The input strings are then evaluated and the results
1114 are printed. This makes it possible to examine the values of variables
1115 within a function, and to assign new values if necessary. To leave the
1116 prompt and return to normal execution type @samp{return} or @samp{dbcont}.
1117 The @code{keyboard} function does not return an exit status.
1118 
1119 If @code{keyboard} is invoked without arguments, a default prompt of
1120 @samp{debug> } is used.
1121 @seealso{dbstop, dbcont, dbquit}
1122 @end deftypefn */)
1123 {
1124  int nargin = args.length ();
1125 
1126  if (nargin > 1)
1127  print_usage ();
1128 
1129  octave::tree_evaluator& tw = interp.get_evaluator ();
1130 
1131  if (nargin == 1)
1132  {
1133  std::string prompt
1134  = args(0).xstring_value ("keyboard: PROMPT must be a string");
1135 
1136  tw.keyboard (prompt);
1137  }
1138  else
1139  tw.keyboard ();
1140 
1141  return ovl ();
1142 }
1143 
1144 DEFUN (completion_matches, args, nargout,
1145  doc: /* -*- texinfo -*-
1146 @deftypefn {} {} completion_matches (@var{hint})
1147 Generate possible completions given @var{hint}.
1148 
1149 This function is provided for the benefit of programs like Emacs which
1150 might be controlling Octave and handling user input. The current
1151 command number is not incremented when this function is called. This is
1152 a feature, not a bug.
1153 @end deftypefn */)
1154 {
1155  if (args.length () != 1)
1156  print_usage ();
1157 
1159 
1160  std::string hint = args(0).string_value ();
1161 
1162  int n = 32;
1163 
1164  string_vector list (n);
1165 
1166  int k = 0;
1167 
1168  for (;;)
1169  {
1170  std::string cmd = octave::generate_completion (hint, k);
1171 
1172  if (! cmd.empty ())
1173  {
1174  if (k == n)
1175  {
1176  n *= 2;
1177  list.resize (n);
1178  }
1179 
1180  list[k++] = cmd;
1181  }
1182  else
1183  {
1184  list.resize (k);
1185  break;
1186  }
1187  }
1188 
1189  if (nargout > 0)
1190  {
1191  if (! list.empty ())
1192  retval = list;
1193  else
1194  retval = "";
1195  }
1196  else
1197  {
1198  // We don't use string_vector::list_in_columns here
1199  // because it will be easier for Emacs if the names
1200  // appear in a single column.
1201 
1202  int len = list.numel ();
1203 
1204  for (int i = 0; i < len; i++)
1205  octave_stdout << list[i] << "\n";
1206  }
1207 
1209 
1210  return retval;
1211 }
1212 
1213 /*
1214 %!assert (ischar (completion_matches ("")))
1215 %!assert (ischar (completion_matches ("a")))
1216 %!assert (ischar (completion_matches (" ")))
1217 %!assert (isempty (completion_matches (" ")))
1218 %!assert (any (strcmp ("abs", deblank (cellstr (completion_matches (""))))))
1219 %!assert (any (strcmp ("abs", deblank (cellstr (completion_matches ("a"))))))
1220 %!assert (any (strcmp ("abs", deblank (cellstr (completion_matches ("ab"))))))
1221 %!assert (any (strcmp ("abs", deblank (cellstr (completion_matches ("abs"))))))
1222 %!assert (! any (strcmp ("abs", deblank (cellstr (completion_matches ("absa"))))))
1223 
1224 %!error completion_matches ()
1225 %!error completion_matches (1, 2)
1226 */
1227 
1228 DEFUN (readline_read_init_file, args, ,
1229  doc: /* -*- texinfo -*-
1230 @deftypefn {} {} readline_read_init_file (@var{file})
1231 Read the readline library initialization file @var{file}.
1232 
1233 If @var{file} is omitted, read the default initialization file
1234 (normally @file{~/.inputrc}).
1235 
1236 @xref{Readline Init File, , , readline, GNU Readline Library},
1237 for details.
1238 @seealso{readline_re_read_init_file}
1239 @end deftypefn */)
1240 {
1241  int nargin = args.length ();
1242 
1243  if (nargin > 1)
1244  print_usage ();
1245 
1246  if (nargin == 0)
1248  else
1249  {
1250  std::string file = args(0).string_value ();
1251 
1253  }
1254 
1255  return ovl ();
1256 }
1257 
1258 DEFUN (readline_re_read_init_file, args, ,
1259  doc: /* -*- texinfo -*-
1260 @deftypefn {} {} readline_re_read_init_file ()
1261 Re-read the last readline library initialization file that was read.
1262 
1263 @xref{Readline Init File, , , readline, GNU Readline Library},
1264 for details.
1265 @seealso{readline_read_init_file}
1266 @end deftypefn */)
1267 {
1268  if (args.length () != 0)
1269  print_usage ();
1270 
1272 
1273  return ovl ();
1274 }
1275 
1276 DEFMETHOD (add_input_event_hook, interp, args, ,
1277  doc: /* -*- texinfo -*-
1278 @deftypefn {} {@var{id} =} add_input_event_hook (@var{fcn})
1279 @deftypefnx {} {@var{id} =} add_input_event_hook (@var{fcn}, @var{data})
1280 Add the named function or function handle @var{fcn} to the list of functions
1281 to call periodically when Octave is waiting for input.
1282 
1283 The function should have the form
1284 
1285 @example
1286 @var{fcn} (@var{data})
1287 @end example
1288 
1289 If @var{data} is omitted, Octave calls the function without any arguments.
1290 
1291 The returned identifier may be used to remove the function handle from the
1292 list of input hook functions.
1293 @seealso{remove_input_event_hook}
1294 @end deftypefn */)
1295 {
1296  int nargin = args.length ();
1297 
1298  if (nargin < 1 || nargin > 2)
1299  print_usage ();
1300 
1301  octave_value user_data;
1302 
1303  if (nargin == 2)
1304  user_data = args(1);
1305 
1306  octave::input_system& input_sys = interp.get_input_system ();
1307 
1308  hook_function hook_fcn (args(0), user_data);
1309 
1310  input_sys.add_input_event_hook (hook_fcn);
1311 
1312  return ovl (hook_fcn.id ());
1313 }
1314 
1315 DEFMETHOD (remove_input_event_hook, interp, args, ,
1316  doc: /* -*- texinfo -*-
1317 @deftypefn {} {} remove_input_event_hook (@var{name})
1318 @deftypefnx {} {} remove_input_event_hook (@var{fcn_id})
1319 Remove the named function or function handle with the given identifier
1320 from the list of functions to call periodically when Octave is waiting
1321 for input.
1322 @seealso{add_input_event_hook}
1323 @end deftypefn */)
1324 {
1325  int nargin = args.length ();
1326 
1327  if (nargin < 1 || nargin > 2)
1328  print_usage ();
1329 
1330  std::string hook_fcn_id = args(0).xstring_value ("remove_input_event_hook: argument not valid as a hook function name or id");
1331 
1332  bool warn = (nargin < 2);
1333 
1334  octave::input_system& input_sys = interp.get_input_system ();
1335 
1336  if (! input_sys.remove_input_event_hook (hook_fcn_id) && warn)
1337  warning ("remove_input_event_hook: %s not found in list",
1338  hook_fcn_id.c_str ());
1339 
1340  return ovl ();
1341 }
1342 
1343 DEFMETHOD (PS1, interp, args, nargout,
1344  doc: /* -*- texinfo -*-
1345 @deftypefn {} {@var{val} =} PS1 ()
1346 @deftypefnx {} {@var{old_val} =} PS1 (@var{new_val})
1347 @deftypefnx {} {} PS1 (@var{new_val}, "local")
1348 Query or set the primary prompt string.
1349 
1350 When executing interactively, Octave displays the primary prompt when it is
1351 ready to read a command.
1352 
1353 The default value of the primary prompt string is @qcode{'octave:\#> '}.
1354 To change it, use a command like
1355 
1356 @example
1357 PS1 ("\\u@@\\H> ")
1358 @end example
1359 
1360 @noindent
1361 which will result in the prompt @samp{boris@@kremvax> } for the user
1362 @samp{boris} logged in on the host @samp{kremvax.kgb.su}. Note that two
1363 backslashes are required to enter a backslash into a double-quoted
1364 character string. @xref{Strings}.
1365 
1366 You can also use ANSI escape sequences if your terminal supports them.
1367 This can be useful for coloring the prompt. For example,
1368 
1369 @example
1370 PS1 ('\[\033[01;31m\]\s:\#> \[\033[0m\]')
1371 @end example
1372 
1373 @noindent
1374 will give the default Octave prompt a red coloring.
1375 
1376 When called from inside a function with the @qcode{"local"} option, the
1377 variable is changed locally for the function and any subroutines it calls.
1378 The original variable value is restored when exiting the function.
1379 @seealso{PS2, PS4}
1380 @end deftypefn */)
1381 {
1382  octave::input_system& input_sys = interp.get_input_system ();
1383 
1384  return input_sys.PS1 (args, nargout);
1385 }
1386 
1387 DEFMETHOD (PS2, interp, args, nargout,
1388  doc: /* -*- texinfo -*-
1389 @deftypefn {} {@var{val} =} PS2 ()
1390 @deftypefnx {} {@var{old_val} =} PS2 (@var{new_val})
1391 @deftypefnx {} {} PS2 (@var{new_val}, "local")
1392 Query or set the secondary prompt string.
1393 
1394 The secondary prompt is printed when Octave is expecting additional input to
1395 complete a command. For example, if you are typing a @code{for} loop that
1396 spans several lines, Octave will print the secondary prompt at the beginning
1397 of each line after the first. The default value of the secondary prompt
1398 string is @qcode{"> "}.
1399 
1400 When called from inside a function with the @qcode{"local"} option, the
1401 variable is changed locally for the function and any subroutines it calls.
1402 The original variable value is restored when exiting the function.
1403 @seealso{PS1, PS4}
1404 @end deftypefn */)
1405 {
1406  octave::input_system& input_sys = interp.get_input_system ();
1407 
1408  return input_sys.PS2 (args, nargout);
1409 }
1410 
1411 DEFMETHOD (completion_append_char, interp, args, nargout,
1412  doc: /* -*- texinfo -*-
1413 @deftypefn {} {@var{val} =} completion_append_char ()
1414 @deftypefnx {} {@var{old_val} =} completion_append_char (@var{new_val})
1415 @deftypefnx {} {} completion_append_char (@var{new_val}, "local")
1416 Query or set the internal character variable that is appended to
1417 successful command-line completion attempts.
1418 
1419 The default value is @qcode{" "} (a single space).
1420 
1421 When called from inside a function with the @qcode{"local"} option, the
1422 variable is changed locally for the function and any subroutines it calls.
1423 The original variable value is restored when exiting the function.
1424 @end deftypefn */)
1425 {
1426  octave::input_system& input_sys = interp.get_input_system ();
1427 
1428  return input_sys.completion_append_char (args, nargout);
1429 }
1430 
1431 DEFMETHOD (__request_drawnow__, , args, ,
1432  doc: /* -*- texinfo -*-
1433 @deftypefn {} {} __request_drawnow__ ()
1434 @deftypefnx {} {} __request_drawnow__ (@var{flag})
1435 Undocumented internal function.
1436 @end deftypefn */)
1437 {
1438  int nargin = args.length ();
1439 
1440  if (nargin > 1)
1441  print_usage ();
1442 
1443  if (nargin == 0)
1444  Vdrawnow_requested = true;
1445  else
1446  Vdrawnow_requested = args(0).bool_value ();
1447 
1448  return ovl ();
1449 }
1450 
1451 DEFMETHOD (__gud_mode__, interp, args, nargout,
1452  doc: /* -*- texinfo -*-
1453 @deftypefn {} {} __gud_mode__ ()
1454 Undocumented internal function.
1455 @end deftypefn */)
1456 {
1457  octave::input_system& input_sys = interp.get_input_system ();
1458 
1459  return input_sys.gud_mode (args, nargout);
1460 }
1461 
1462 DEFMETHOD (__mfile_encoding__, interp, args, nargout,
1463  doc: /* -*- texinfo -*-
1464 @deftypefn {} {@var{current_encoding} =} __mfile_encoding__ (@var{new_encoding})
1465 Set and query the codepage that is used for reading .m files.
1466 @end deftypefn */)
1467 {
1468  octave::input_system& input_sys = interp.get_input_system ();
1469 
1470  return input_sys.mfile_encoding (args, nargout);
1471 }
1472 
1473 DEFMETHOD (auto_repeat_debug_command, interp, args, nargout,
1474  doc: /* -*- texinfo -*-
1475 @deftypefn {} {@var{val} =} auto_repeat_debug_command ()
1476 @deftypefnx {} {@var{old_val} =} auto_repeat_debug_command (@var{new_val})
1477 @deftypefnx {} {} auto_repeat_debug_command (@var{new_val}, "local")
1478 Query or set the internal variable that controls whether debugging
1479 commands are automatically repeated when the input line is empty (typing
1480 just @key{RET}).
1481 
1482 When called from inside a function with the @qcode{"local"} option, the
1483 variable is changed locally for the function and any subroutines it calls.
1484 The original variable value is restored when exiting the function.
1485 @end deftypefn */)
1486 {
1487  octave::input_system& input_sys = interp.get_input_system ();
1488 
1489  return input_sys.auto_repeat_debug_command (args, nargout);
1490 }
1491 
1492 // Always define these functions. The macro is intended to allow the
1493 // declarations to be hidden, not so that Octave will not provide the
1494 // functions if they are requested.
1495 
1496 // #if defined (OCTAVE_USE_DEPRECATED_FUNCTIONS)
1497 
1498 bool
1499 octave_yes_or_no (const std::string& prompt)
1500 {
1501  octave::input_system& input_sys
1502  = octave::__get_input_system__ ("set_default_prompts");
1503 
1504  return input_sys.yes_or_no (prompt);
1505 }
1506 
1507 void
1508 remove_input_event_hook_functions (void)
1509 {
1510  octave::input_system& input_sys
1511  = octave::__get_input_system__ ("remove_input_event_hook_functions");
1512 
1513  input_sys.clear_input_event_hooks ();
1514 }
1515 
1516 // Fix things up so that input can come from the standard input. This
1517 // may need to become much more complicated, which is why it's in a
1518 // separate function.
1519 
1520 FILE *
1521 get_input_from_stdin (void)
1522 {
1525 }
1526 
1527 // #endif
charNDArray max(char d, const charNDArray &m)
Definition: chNDArray.cc:230
Definition: dMatrix.h:42
map_type::iterator iterator
Definition: hook-fcn.h:183
void clear(void)
Definition: hook-fcn.h:204
void run(const octave_value_list &initial_args=octave_value_list())
Definition: hook-fcn.h:227
bool empty(void) const
Definition: hook-fcn.h:202
void erase(iterator p)
Definition: hook-fcn.h:225
iterator find(const std::string &id)
Definition: hook-fcn.h:211
iterator end(void)
Definition: hook-fcn.h:221
void insert(const std::string &id, const hook_function &f)
Definition: hook-fcn.h:206
std::string id(void) const
Definition: hook-fcn.h:103
interpreter & m_interpreter
Definition: input.h:247
std::string octave_gets(const std::string &prompt, bool &eof)
static const std::string s_in_src
Definition: input.h:251
static void set_basic_quote_characters(const std::string &s)
Definition: cmd-edit.cc:1329
static void re_read_init_file(void)
Definition: cmd-edit.cc:1589
static void set_completion_function(completion_fcn f)
Definition: cmd-edit.cc:1357
static std::string get_line_buffer(void)
Definition: cmd-edit.cc:1432
static void set_basic_word_break_characters(const std::string &s)
Definition: cmd-edit.cc:1315
static void set_name(const std::string &n)
Definition: cmd-edit.cc:1172
static void set_completer_quote_characters(const std::string &s)
Definition: cmd-edit.cc:1343
static string_vector generate_filename_completions(const std::string &text)
Definition: cmd-edit.cc:1424
static void set_input_stream(FILE *f)
Definition: cmd-edit.cc:1203
static void read_init_file(const std::string &file="")
Definition: cmd-edit.cc:1578
static void set_completer_word_break_characters(const std::string &s)
Definition: cmd-edit.cc:1322
static void set_completion_append_character(char c)
Definition: cmd-edit.cc:1350
static FILE * get_input_stream(void)
Definition: cmd-edit.cc:1210
static void force_default_editor(void)
Definition: cmd-edit.cc:1097
static void add_event_hook(event_hook_fcn f)
Definition: cmd-edit.cc:1552
static std::string readline(const std::string &prompt)
Definition: cmd-edit.cc:1179
static void set_quoting_function(quoting_fcn f)
Definition: cmd-edit.cc:1364
static void set_filename_quote_characters(const std::string &s)
Definition: cmd-edit.cc:1336
static char get_prev_char(int)
Definition: cmd-edit.cc:1446
static bool add(const std::string &)
Definition: cmd-hist.cc:605
void set_discard_warning_messages(bool flag)
Definition: error.h:101
void exit_debugger_event(void)
input_reader(interpreter &interp)
octave_value PS1(const octave_value_list &args, int nargout)
octave_value completion_append_char(const octave_value_list &args, int nargout)
hook_function_list m_input_event_hook_functions
Definition: input.h:210
std::string gnu_readline(const std::string &s, bool &eof) const
std::string interactive_input(const std::string &s, bool &eof)
octave_value mfile_encoding(const octave_value_list &args, int nargout)
bool remove_input_event_hook(const std::string &hook_fcn_id)
bool m_auto_repeat_debug_command
Definition: input.h:203
std::string PS1(void) const
Definition: input.h:71
interpreter & m_interpreter
Definition: input.h:184
octave_value_list get_user_input(const octave_value_list &args, int nargout)
std::string m_PS1
Definition: input.h:187
char m_completion_append_char
Definition: input.h:194
std::string mfile_encoding(void) const
Definition: input.h:139
octave_value auto_repeat_debug_command(const octave_value_list &args, int nargout)
void initialize(bool line_editing)
std::string m_PS2
Definition: input.h:190
void add_input_event_hook(const hook_function &hook_fcn)
void run_input_event_hooks(void)
bool auto_repeat_debug_command(void) const
Definition: input.h:153
octave_value PS2(const octave_value_list &args, int nargout)
bool yes_or_no(const std::string &prompt)
input_system(interpreter &interp)
bool have_input_event_hooks(void) const
char completion_append_char(void) const
Definition: input.h:110
bool gud_mode(void) const
Definition: input.h:126
std::string m_mfile_encoding
Definition: input.h:200
std::string PS2(void) const
Definition: input.h:84
octave_value gud_mode(const octave_value_list &args, int nargout)
void clear_input_event_hooks(void)
output_system & get_output_system(void)
Definition: interpreter.h:228
input_system & get_input_system(void)
Definition: interpreter.h:223
octave_value_list eval_string(const std::string &eval_str, bool silent, int &parse_status, int nargout)
load_path & get_load_path(void)
Definition: interpreter.h:243
void handle_exception(const execution_exception &e)
bool interactive(void) const
Definition: interpreter.h:158
event_manager & get_event_manager(void)
Definition: interpreter.h:290
tree_evaluator & get_evaluator(void)
void update(void) const
Definition: load-path.cc:395
void reset(void)
Definition: pager.cc:315
void stamp(void)
Definition: oct-time.cc:109
void keyboard(const std::string &prompt="keyboard> ")
Definition: pt-eval.cc:841
octave_idx_type length(void) const
Definition: ovl.h:113
bool is_classdef_object(void) const
Definition: ov.h:611
bool is_defined(void) const
Definition: ov.h:551
bool isstruct(void) const
Definition: ov.h:605
bool isjava(void) const
Definition: ov.h:623
string_vector map_keys(void) const
Definition: ov.h:945
string_vector & append(const std::string &s)
Definition: str-vec.cc:110
string_vector & sort(bool make_uniq=false)
Definition: str-vec.cc:77
octave_idx_type numel(void) const
Definition: str-vec.h:100
OCTINTERP_API void print_usage(void)
Definition: defun.cc:53
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition: defun.h:138
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
Definition: defun.h:56
void warning(const char *fmt,...)
Definition: error.cc:1050
void warning_with_id(const char *id, const char *fmt,...)
Definition: error.cc:1065
void error(const char *fmt,...)
Definition: error.cc:968
void message(const char *name, const char *fmt,...)
Definition: error.cc:936
OCTAVE_EXPORT octave_value_list Fdrawnow(octave::interpreter &interp, const octave_value_list &args, int)
Definition: graphics.cc:13698
ColumnVector transform(const Matrix &m, double x, double y, double z)
Definition: graphics.cc:5814
QString name
iconv_t octave_iconv_open_wrapper(const char *tocode, const char *fromcode)
int octave_iconv_close_wrapper(iconv_t cd)
octave::sys::time Vlast_prompt_time
Definition: input.cc:83
bool Vdrawnow_requested
Definition: input.cc:90
bool Vtrack_line_num
Definition: input.cc:95
bool octave_completion_matches_called
Definition: input.cc:86
std::string octave_fgets(FILE *f)
Definition: lo-utils.cc:91
const char * octave_locale_charset_wrapper(void)
octave_idx_type n
Definition: mx-inlines.cc:753
OCTAVE_API unsigned int u8_validate(const std::string &who, std::string &in_string, const u8_fallback_type type=U8_REPLACEMENT_CHAR)
Definition: oct-string.cc:559
std::string dir_sep_chars(void)
Definition: file-ops.cc:252
string_vector make_name_list(void)
static uint32_t state[624]
Definition: randmtzig.cc:190
int pipe_handler_error_count
Definition: sighandlers.cc:65
void flush_stdout(void)
Definition: pager.cc:260
interpreter & __get_interpreter__(const std::string &who)
input_system & __get_input_system__(const std::string &who)
octave_value_list feval(const char *name, const octave_value_list &args, int nargout)
Evaluate an Octave function (built-in or interpreted) and return the list of result values.
Definition: oct-parse.cc:9580
static int input(yyscan_t yyscanner)
void free(void *)
octave_value::octave_value(const Array< char > &chm, char type) return retval
Definition: ov.cc:811
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
Definition: ovl.h:211
#define octave_stdout
Definition: pager.h:313
#define octave_diary
Definition: pager.h:315
static OCTAVE_NORETURN void eval_error(const char *msg, const dim_vector &x, const dim_vector &y)
Definition: pt-tm-const.cc:56
uint8_t * octave_u8_conv_from_encoding(const char *fromcode, const char *src, size_t srclen, size_t *lengthp)
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition: variables.cc:608
F77_RET_T len
Definition: xerbla.cc:61