GNU Octave 7.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
dirfns.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1994-2022 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 (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#include <cerrno>
31#include <cstdio>
32#include <cstddef>
33#include <cstdlib>
34#include <cstring>
35
36#include <sstream>
37#include <string>
38
39#include "file-ops.h"
40#include "file-stat.h"
41#include "glob-match.h"
42#include "oct-env.h"
43#include "oct-glob.h"
44#include "pathsearch.h"
45#include "str-vec.h"
46
47#include "Cell.h"
48#include "defun.h"
49#include "dir-ops.h"
50#include "error.h"
51#include "errwarn.h"
52#include "event-manager.h"
53#include "input.h"
54#include "load-path.h"
55#include "octave.h"
56#include "ovl.h"
57#include "pager.h"
58#include "procstream.h"
59#include "sysdep.h"
60#include "interpreter.h"
61#include "unwind-prot.h"
62#include "utils.h"
63#include "variables.h"
64
65OCTAVE_NAMESPACE_BEGIN
66
67// TRUE means we ask for confirmation before recursively removing a
68// directory tree.
69static bool Vconfirm_recursive_rmdir = true;
70
71DEFMETHOD (cd, interp, args, nargout,
72 doc: /* -*- texinfo -*-
73@deftypefn {} {} cd @var{dir}
74@deftypefnx {} {} cd
75@deftypefnx {} {@var{old_dir} =} cd
76@deftypefnx {} {@var{old_dir} =} cd (@var{dir})
77@deftypefnx {} {} chdir @dots{}
78Change the current working directory to @var{dir}.
79
80If called with no input or output arguments, the current directory is
81changed to the user's home directory (@qcode{"~"}).
82
83For example,
84
85@example
86cd ~/octave
87@end example
88
89@noindent
90changes the current working directory to @file{~/octave}. If the
91directory does not exist, an error message is printed and the working
92directory is not changed.
93
94@code{chdir} is an alias for @code{cd} and can be used in all of the same
95calling formats.
96
97Compatibility Note: When called with no arguments, @sc{matlab} prints the
98present working directory rather than changing to the user's home directory.
99@seealso{pwd, mkdir, rmdir, dir, ls}
100@end deftypefn */)
101{
102 int nargin = args.length ();
103
104 if (nargin > 1)
105 print_usage ();
106
107 octave_value_list retval;
108
109 if (nargout > 0)
110 retval = octave_value (sys::env::get_current_directory ());
111
112 if (nargin == 1)
113 {
114 std::string dirname = args(0).xstring_value ("cd: DIR must be a string");
115
116 if (! dirname.empty ())
117 interp.chdir (dirname);
118 }
119 else if (nargout == 0)
120 {
121 std::string home_dir = sys::env::get_home_directory ();
122
123 if (! home_dir.empty ())
124 interp.chdir (home_dir);
125 }
126
127 return retval;
128}
129
130DEFALIAS (chdir, cd);
131
132DEFUN (pwd, , ,
133 doc: /* -*- texinfo -*-
134@deftypefn {} {} pwd ()
135@deftypefnx {} {@var{dir} =} pwd ()
136Return the current working directory.
137@seealso{cd, dir, ls, mkdir, rmdir}
138@end deftypefn */)
139{
140 return ovl (sys::env::get_current_directory ());
141}
142
143DEFUN (readdir, args, ,
144 doc: /* -*- texinfo -*-
145@deftypefn {} {@var{files} =} readdir (@var{dir})
146@deftypefnx {} {[@var{files}, @var{err}, @var{msg}] =} readdir (@var{dir})
147Return the names of files in the directory @var{dir} as a cell array of
148strings.
149
150If an error occurs, return an empty cell array in @var{files}.
151If successful, @var{err} is 0 and @var{msg} is an empty string.
152Otherwise, @var{err} is nonzero and @var{msg} contains a system-dependent
153error message.
154@seealso{ls, dir, glob, what}
155@end deftypefn */)
156{
157 if (args.length () != 1)
158 print_usage ();
159
160 std::string dirname = args(0).xstring_value ("readdir: DIR must be a string");
161
162 octave_value_list retval = ovl (Cell (), -1.0, "");
163
165
166 string_vector dirlist;
167 std::string msg;
168
169 if (sys::get_dirlist (dirname, dirlist, msg))
170 {
171 retval(0) = Cell (dirlist.sort ());
172 retval(1) = 0.0;
173 }
174 else
175 retval(2) = msg;
176
177 return retval;
178}
179
180// FIXME: should maybe also allow second arg to specify mode?
181// OTOH, that might cause trouble with compatibility later...
182
183DEFUN (__mkdir__, args, ,
184 doc: /* -*- texinfo -*-
185@deftypefn {} {} __mkdir__ (@var{parent}, @var{dir})
186Internal function called by mkdir.m.
187@seealso{mkdir, rmdir, pwd, cd, umask}
188@end deftypefn */)
189{
190 int nargin = args.length ();
191
192 if (nargin < 1 || nargin > 2)
193 print_usage ("mkdir");
194
195 std::string dirname;
196
197 if (nargin == 2)
198 {
199 std::string parent = args(0).xstring_value ("mkdir: PARENT must be a string");
200 std::string dir = args(1).xstring_value ("mkdir: DIR must be a string");
201
202 dirname = sys::file_ops::concat (parent, dir);
203 }
204 else if (nargin == 1)
205 dirname = args(0).xstring_value ("mkdir: DIR must be a string");
206
208
209 sys::file_stat fs (dirname);
210
211 if (fs && fs.is_dir ())
212 {
213 // For Matlab compatibility, return true when directory already exists.
214 return ovl (true, "directory exists", "mkdir");
215 }
216 else
217 {
218 std::string msg;
219
220 int status = sys::mkdir (dirname, 0777, msg);
221
222 if (status < 0)
223 return ovl (false, msg, "mkdir");
224 else
225 return ovl (true, "", "");
226 }
227}
228
229DEFMETHODX ("rmdir", Frmdir, interp, args, nargout,
230 doc: /* -*- texinfo -*-
231@deftypefn {} {} rmdir @var{dir}
232@deftypefnx {} {} rmdir (@var{dir}, "s")
233@deftypefnx {} {[@var{status}, @var{msg}, @var{msgid}] =} rmdir (@dots{})
234Remove the directory named @var{dir}.
235
236If the optional second parameter is supplied with value @qcode{"s"},
237recursively remove all subdirectories as well.
238
239If successful, @var{status} is logical 1, and @var{msg}, @var{msgid} are empty
240character strings (""). Otherwise, @var{status} is logical 0, @var{msg}
241contains a system-dependent error message, and @var{msgid} contains a unique
242message identifier.
243
244@seealso{mkdir, confirm_recursive_rmdir, pwd}
245@end deftypefn */)
246{
247 int nargin = args.length ();
248
249 if (nargin < 1 || nargin > 2)
250 print_usage ();
251
252 std::string dirname = args(0).xstring_value ("rmdir: DIR must be a string");
253
254 std::string fulldir = sys::file_ops::tilde_expand (dirname);
255 octave_value_list retval;
256 int status = -1;
257 std::string msg;
258
259 event_manager& evmgr = interp.get_event_manager ();
260
261 if (nargin == 2)
262 {
263 if (args(1).string_value () != "s")
264 error (R"(rmdir: second argument must be "s" for recursive removal)");
265
266 bool doit = true;
267
268 if (interp.interactive ()
271 {
272 input_system& input_sys = interp.get_input_system ();
273
274 std::string prompt = "remove entire contents of " + fulldir + "? ";
275
276 doit = input_sys.yes_or_no (prompt);
277 }
278
279 if (doit)
280 {
281 evmgr.file_remove (fulldir, "");
282 status = sys::recursive_rmdir (fulldir, msg);
283 }
284 }
285 else
286 {
287 evmgr.file_remove (fulldir, "");
288 status = sys::rmdir (fulldir, msg);
289 }
290
291 evmgr.file_renamed (status >= 0);
292
293 if (nargout == 0)
294 {
295 if (status < 0)
296 error ("rmdir: operation failed: %s", msg.c_str ());
297 }
298 else
299 {
300 if (status < 0)
301 retval = ovl (false, msg, "rmdir");
302 else
303 retval = ovl (true, "", "");
304 }
305
306 return retval;
307}
308
309DEFUNX ("link", Flink, args, nargout,
310 doc: /* -*- texinfo -*-
311@deftypefn {} {} link @var{old} @var{new}
312@deftypefnx {} {[@var{status}, @var{msg}] =} link (@var{old}, @var{new})
313Create a new link (also known as a hard link) to an existing file.
314
315If successful, @var{status} is 0 and @var{msg} is an empty string.
316Otherwise, @var{status} is -1 and @var{msg} contains a system-dependent
317error message.
318@seealso{symlink, unlink, readlink, lstat}
319@end deftypefn */)
320{
321 if (args.length () != 2)
322 print_usage ();
323
324 std::string from = args(0).xstring_value ("link: OLD must be a string");
325 std::string to = args(1).xstring_value ("link: NEW must be a string");
326
327 from = sys::file_ops::tilde_expand (from);
329
330 octave_value_list retval;
331 std::string msg;
332
333 int status = sys::link (from, to, msg);
334
335 if (nargout == 0)
336 {
337 if (status < 0)
338 error ("link: operation failed: %s", msg.c_str ());
339 }
340 else
341 {
342 if (status < 0)
343 retval = ovl (-1.0, msg);
344 else
345 retval = ovl (0.0, "");
346 }
347
348 return retval;
349}
350
351DEFUNX ("symlink", Fsymlink, args, nargout,
352 doc: /* -*- texinfo -*-
353@deftypefn {} {} symlink @var{old} @var{new}
354@deftypefnx {} {[@var{status}, @var{msg}] =} symlink (@var{old}, @var{new})
355Create a symbolic link @var{new} which contains the string @var{old}.
356
357If successful, @var{status} is 0 and @var{msg} is an empty string.
358Otherwise, @var{status} is -1 and @var{msg} contains a system-dependent
359error message.
360@seealso{link, unlink, readlink, lstat}
361@end deftypefn */)
362{
363 if (args.length () != 2)
364 print_usage ();
365
366 std::string from = args(0).xstring_value ("symlink: OLD must be a string");
367 std::string to = args(1).xstring_value ("symlink: NEW must be a string");
368
369 from = sys::file_ops::tilde_expand (from);
371
372 octave_value_list retval;
373 std::string msg;
374
375 int status = sys::symlink (from, to, msg);
376
377 if (nargout == 0)
378 {
379 if (status < 0)
380 error ("symlink: operation failed: %s", msg.c_str ());
381 }
382 else
383 {
384 if (status < 0)
385 retval = ovl (-1.0, msg);
386 else
387 retval = ovl (0.0, "");
388 }
389
390 return retval;
391}
392
393DEFUNX ("readlink", Freadlink, args, ,
394 doc: /* -*- texinfo -*-
395@deftypefn {} {} readlink @var{symlink}
396@deftypefnx {} {[@var{result}, @var{err}, @var{msg}] =} readlink (@var{symlink})
397Read the value of the symbolic link @var{symlink}.
398
399If successful, @var{result} contains the contents of the symbolic link
400@var{symlink}, @var{err} is 0, and @var{msg} is an empty string.
401Otherwise, @var{err} is nonzero and @var{msg} contains a system-dependent
402error message.
403@seealso{lstat, symlink, link, unlink, delete}
404@end deftypefn */)
405{
406 if (args.length () != 1)
407 print_usage ();
408
409 std::string symlink = args(0).xstring_value ("readlink: SYMLINK must be a string");
410
412
413 std::string result, msg;
414
415 int status = sys::readlink (symlink, result, msg);
416
417 if (status < 0)
418 return ovl ("", -1.0, msg);
419 else
420 return ovl (result, status, "");
421}
422
423DEFMETHODX ("rename", Frename, interp, args, nargout,
424 doc: /* -*- texinfo -*-
425@deftypefn {} {} rename @var{old} @var{new}
426@deftypefnx {} {[@var{status}, @var{msg}] =} rename (@var{old}, @var{new})
427Change the name of file @var{old} to @var{new}.
428
429If successful, @var{status} is 0 and @var{msg} is an empty string.
430Otherwise, @var{status} is -1 and @var{msg} contains a system-dependent
431error message.
432@seealso{movefile, copyfile, ls, dir}
433@end deftypefn */)
434{
435 if (args.length () != 2)
436 print_usage ();
437
438 std::string from = args(0).xstring_value ("rename: OLD must be a string");
439 std::string to = args(1).xstring_value ("rename: NEW must be a string");
440
441 from = sys::file_ops::tilde_expand (from);
443
444 octave_value_list retval;
445 std::string msg;
446
447 event_manager& evmgr = interp.get_event_manager ();
448
449 evmgr.file_remove (from, to);
450
451 int status = sys::rename (from, to, msg);
452
453 evmgr.file_renamed (status >= 0);
454
455 if (nargout == 0)
456 {
457 if (status < 0)
458 error ("rename: operation failed: %s", msg.c_str ());
459 }
460 else
461 {
462 if (status < 0)
463 retval = ovl (-1.0, msg);
464 else
465 retval = ovl (0.0, "");
466 }
467
468 return retval;
469}
470
471DEFUN (glob, args, ,
472 doc: /* -*- texinfo -*-
473@deftypefn {} {} glob (@var{pattern})
474Given an array of pattern strings (as a char array or a cell array) in
475@var{pattern}, return a cell array of filenames that match any of
476them, or an empty cell array if no patterns match.
477
478The pattern strings are interpreted as filename globbing patterns (as they
479are used by Unix shells).
480
481Within a pattern
482
483@table @code
484@item *
485matches any string, including the null string,
486
487@item ?
488matches any single character, and
489
490@item [@dots{}]
491matches any of the enclosed characters.
492@end table
493
494Tilde expansion is performed on each of the patterns before looking for
495matching filenames. For example:
496
497@example
498ls
499 @result{}
500 file1 file2 file3 myfile1 myfile1b
501glob ("*file1")
502 @result{}
503 @{
504 [1,1] = file1
505 [2,1] = myfile1
506 @}
507glob ("myfile?")
508 @result{}
509 @{
510 [1,1] = myfile1
511 @}
512glob ("file[12]")
513 @result{}
514 @{
515 [1,1] = file1
516 [2,1] = file2
517 @}
518@end example
519
520Note: On Windows, patterns that contain non-ASCII characters are not
521supported.
522
523@seealso{ls, dir, readdir, what}
524@end deftypefn */)
525{
526 if (args.length () != 1)
527 print_usage ();
528
529 string_vector pat
530 = args(0).xstring_vector_value ("glob: PATTERN must be a string");
531
533
534 return ovl (Cell (pattern.glob ()));
535}
536
537
538DEFUN (__wglob__, args, ,
539 doc: /* -*- texinfo -*-
540@deftypefn {} {} __wglob__ (@var{pattern})
541Windows-like glob for dir.
542
543Given an array of pattern strings (as a char array or a cell array) in
544@var{pattern}, return a cell array of filenames that match any of
545them, or an empty cell array if no patterns match.
546
547The pattern strings are interpreted as filename globbing patterns
548(roughly as they are used by Windows dir).
549
550Within a pattern
551
552@table @code
553@item *
554matches any string, including the null string,
555
556@item ?
557matches any single character, and
558
559@item *.*
560matches any string, even if no . is present.
561@end table
562
563Tilde expansion is performed on each of the patterns before looking for
564matching filenames. For example:
565
566@example
567ls
568 @result{}
569 file1 file2 file3 myfile1 myfile1b
570glob ("*file1")
571 @result{}
572 @{
573 [1,1] = file1
574 [2,1] = myfile1
575 @}
576glob ("myfile?")
577 @result{}
578 @{
579 [1,1] = myfile1
580 @}
581glob ("*.*")
582 @result{}
583 @{
584 [1,1] = file1
585 [2,1] = file2
586 [3,1] = file3
587 [4,1] = myfile1
588 [5,1] = myfile1b
589 @}
590@end example
591@seealso{glob, dir}
592@end deftypefn */)
593{
594 if (args.length () == 0)
595 return ovl ();
596
597 string_vector pat = args(0).string_vector_value ();
598
600
601 return ovl (Cell (sys::windows_glob (pattern)));
602}
603
604/*
605%!test
606%! tmpdir = tempname ();
607%! filename = {"file1", "file2", "file3", "myfile1", "myfile1b"};
608%! if (mkdir (tmpdir))
609%! cwd = pwd ();
610%! cd (tmpdir);
611%! if (strcmp (canonicalize_file_name (pwd), canonicalize_file_name (tmpdir)))
612%! a = 0;
613%! for n = 1:5
614%! save (filename{n}, "a");
615%! endfor
616%! else
617%! sts = rmdir (tmpdir);
618%! error ("Couldn't change to temporary directory");
619%! endif
620%! else
621%! error ("Couldn't create temporary directory");
622%! endif
623%! result1 = glob ("*file1");
624%! result2 = glob ("myfile?");
625%! result3 = glob ("file[12]");
626%! for n = 1:5
627%! delete (filename{n});
628%! endfor
629%! cd (cwd);
630%! sts = rmdir (tmpdir);
631%! assert (result1, {"file1"; "myfile1"});
632%! assert (result2, {"myfile1"});
633%! assert (result3, {"file1"; "file2"});
634*/
635
636DEFUN (__fnmatch__, args, ,
637 doc: /* -*- texinfo -*-
638@deftypefn {} {} fnmatch (@var{pattern}, @var{string})
639Return true or false for each element of @var{string} that matches any of
640the elements of the string array @var{pattern}, using the rules of
641filename pattern matching.
642
643For example:
644
645@example
646@group
647fnmatch ("a*b", @{"ab"; "axyzb"; "xyzab"@})
648 @result{} [ 1; 1; 0 ]
649@end group
650@end example
651@seealso{glob, regexp}
652@end deftypefn */)
653{
654 if (args.length () != 2)
655 print_usage ();
656
657 string_vector pat = args(0).string_vector_value ();
658 string_vector str = args(1).string_vector_value ();
659
661
662 return ovl (pattern.match (str));
663}
664
665DEFUN (filesep, args, ,
666 doc: /* -*- texinfo -*-
667@deftypefn {} {} filesep ()
668@deftypefnx {} {} filesep ("all")
669Return the system-dependent character used to separate directory names.
670
671If @qcode{"all"} is given, the function returns all valid file separators
672in the form of a string. The list of file separators is system-dependent.
673It is @samp{/} (forward slash) under UNIX or @w{Mac OS X}, @samp{/} and
674@samp{\} (forward and backward slashes) under Windows.
675@seealso{pathsep}
676@end deftypefn */)
677{
678 int nargin = args.length ();
679
680 if (nargin > 1)
681 print_usage ();
682
683 octave_value retval;
684
685 if (nargin == 0)
686 retval = sys::file_ops::dir_sep_str ();
687 else
688 {
689 std::string s = args(0).xstring_value ("filesep: argument must be a string");
690 if (s != "all")
691 error (R"(filesep: argument must be "all")");
692
694 }
695
696 return retval;
697}
698
699DEFUN (pathsep, args, ,
700 doc: /* -*- texinfo -*-
701@deftypefn {} {@var{val} =} pathsep ()
702Query the character used to separate directories in a path.
703@seealso{filesep}
704@end deftypefn */)
705{
706 if (args.length () > 0)
707 print_usage ();
708
709 return ovl (directory_path::path_sep_str ());
710}
711
712DEFUN (confirm_recursive_rmdir, args, nargout,
713 doc: /* -*- texinfo -*-
714@deftypefn {} {@var{val} =} confirm_recursive_rmdir ()
715@deftypefnx {} {@var{old_val} =} confirm_recursive_rmdir (@var{new_val})
716@deftypefnx {} {} confirm_recursive_rmdir (@var{new_val}, "local")
717Query or set the internal variable that controls whether Octave
718will ask for confirmation before recursively removing a directory tree.
719
720When called from inside a function with the @qcode{"local"} option, the
721variable is changed locally for the function and any subroutines it calls.
722The original variable value is restored when exiting the function.
723@seealso{rmdir}
724@end deftypefn */)
725{
726 return set_internal_variable (Vconfirm_recursive_rmdir, args, nargout,
727 "confirm_recursive_rmdir");
728}
729
730OCTAVE_NAMESPACE_END
ComplexNDArray concat(NDArray &ra, ComplexNDArray &rb, const Array< octave_idx_type > &ra_idx)
Definition: CNDArray.cc:418
Definition: Cell.h:43
static bool forced_interactive(void)
Definition: octave.cc:325
Provides threadsafe access to octave.
void file_renamed(bool load_new)
void file_remove(const std::string &old_name, const std::string &new_name)
string_vector glob(void) const
Definition: glob-match.cc:41
bool match(const std::string &str) const
Definition: glob-match.cc:35
bool yes_or_no(const std::string &prompt)
string_vector & sort(bool make_uniq=false)
Definition: str-vec.cc:77
static octave_idx_type link(octave_idx_type s, octave_idx_type t, octave_idx_type *pp)
Definition: colamd.cc:99
OCTINTERP_API void print_usage(void)
Definition: defun-int.h:72
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition: defun.h:111
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
Definition: defun.h:56
#define DEFUNX(name, fname, args_name, nargout_name, doc)
Macro to define a builtin function with certain internal name.
Definition: defun.h:85
#define DEFALIAS(alias, name)
Macro to define an alias for another existing function name.
Definition: defun.h:160
OCTAVE_EXPORT octave_value_list Frename(octave::interpreter &interp, const octave_value_list &args, int nargout)
Definition: dirfns.cc:433
OCTAVE_EXPORT octave_value_list Frmdir(octave::interpreter &interp, const octave_value_list &args, int nargout)
Definition: dirfns.cc:245
OCTAVE_EXPORT octave_value_list Fsymlink(const octave_value_list &args, int nargout)
Definition: dirfns.cc:361
static OCTAVE_NAMESPACE_BEGIN bool Vconfirm_recursive_rmdir
Definition: dirfns.cc:69
OCTAVE_EXPORT octave_value_list Flink(const octave_value_list &args, int nargout)
Definition: dirfns.cc:319
OCTAVE_EXPORT octave_value_list Freadlink(const octave_value_list &args, int)
Definition: dirfns.cc:404
void error(const char *fmt,...)
Definition: error.cc:980
std::string dirname(const std::string &path)
Definition: file-ops.cc:358
std::string tilde_expand(const std::string &name)
Definition: file-ops.cc:281
std::string dir_sep_str(void)
Definition: file-ops.cc:238
string_vector glob(const string_vector &pat)
Definition: oct-glob.cc:82
int readlink(const std::string &path, std::string &result)
Definition: file-ops.cc:477
int rename(const std::string &from, const std::string &to)
Definition: file-ops.cc:503
int mkdir(const std::string &nm, mode_t md)
Definition: file-ops.cc:399
int symlink(const std::string &old_name, const std::string &new_name)
Definition: file-ops.cc:456
int rmdir(const std::string &name)
Definition: file-ops.cc:530
int recursive_rmdir(const std::string &name)
Definition: file-ops.cc:552
string_vector windows_glob(const string_vector &pat)
Definition: oct-glob.cc:207
bool get_dirlist(const std::string &dirname, string_vector &dirlist, std::string &msg)
Definition: lo-sysdep.cc:119
int chdir(const std::string &path_arg)
Definition: lo-sysdep.cc:106
return octave_value(v1.char_array_value() . concat(v2.char_array_value(), ra_idx),((a1.is_sq_string()||a2.is_sq_string()) ? '\'' :'"'))
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
Definition: ovl.h:211
DEFMETHODX("quad", Fquad, interp, args,, doc:)
Definition: quad.cc:132
static std::string dir_sep_chars
Definition: shared-fcns.h:96
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition: variables.cc:587