Add BIST tests for octave functions written in C++

From Octave
Revision as of 09:34, 3 October 2018 by Siko1056 (talk | contribs) (Add Category:Development and Category:Testing.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Introduction[edit]

As new features are added to Octave we need to ensure that we don't break existing functionality. At the heart of that promise not to break functionality lies regression testing. Regression testing is done practically daily and certainly whenever a signicant change is committed. The core of the regression tests are Built-In Self Tests (BIST) which are tests written in the Octave language itself that are placed in comments just below the code being tested. The full documentation for these tests is in Appendix B of the manual (Test Functions). While BIST tests exist for most m-file functions, many core functions written in C++ lack these BIST tests. The goal of this sprint topic is to significantly reduce the number of uncovered core functions.

The syntax for writing tests is documented in Appendix B. The general form of the tests is

  1. Basic functionality
    • Does it work for all different combinations of number of inputs and number of outputs
    • Does it work for all expected input classes (matrices, strings, logicals, cell arrays, structs?)
  2. Corner Case functionality
    • Does it work for corner cases (empty matrices, Inf or NaN, etc.)
    • Tests for specific bugs that have been reported on the bug tracker
  3. Input validation
    • Does it correctly generate errors or warnings for bad inputs

Example 1 : Simple Function (rows() from data.cc)[edit]

C++ Code

  octave_value retval;

  if (args.length () == 1)
    retval = args(0).rows ();
  else
    print_usage ();

  return retval;

BIST tests

/*
%!assert (rows (ones (2,5)), 2)
%!assert (rows (ones (5,2)), 5)
%!assert (rows (ones (5,4,3,2)), 2)
%!assert (rows (ones (3,4,5,2)), 3)

%!assert (rows (cell (2,5)), 2)
%!assert (rows (cell (5,2)), 5)
%!assert (rows (cell (5,4,3,2)), 2)
%!assert (rows (cell (3,4,5,2)), 3)

%!test
%! x(2,5,3).a = 1;
%! assert (rows (x), 2);
%! y(5,4,3).b = 2;
%! assert (rows (y), 5);

%!assert (rows ("Hello World"), 1)

%!assert (rows ([]), 0)
%!assert (rows (zeros (2,0), 2)

## Test input validation
%!error rows ()
%!error rows (1,2)
*/

Example 2 : Complicated input validation (issorted() from data.cc)[edit]

C++ Code

  octave_value retval;

  int nargin = args.length ();

  if (nargin < 1 || nargin > 3)
    {
      print_usage ();
      return retval;
    }

  bool by_rows = false;

  sortmode smode = ASCENDING;

  if (nargin > 1)
    {
      octave_value mode_arg;

      if (nargin == 3)
        smode = get_sort_mode_option (args(2));

      std::string tmp = args(1).xstring_value ("issorted: second argument must be a string");
      if (tmp == "rows")
        by_rows = true;
      else
        smode = get_sort_mode_option (args(1));
    }

  octave_value arg = args(0);

  if (by_rows)
    {
      if (arg.is_sparse_type ())
        error ("issorted: sparse matrices not yet supported");
      if (arg.ndims () == 2)
        retval = arg.is_sorted_rows (smode) != UNSORTED;
      else
        error ("issorted: A must be a 2-dimensional object");
    }
  else
    {
      if (arg.dims ().is_vector ())
        retval = args(0).is_sorted (smode) != UNSORTED;
      else
        error ("issorted: needs a vector");
    }

  return retval;
}

BIST tests

/*
%!shared sm, um, sv, uv
%! sm = [1, 2; 3, 4];
%! um = [3, 1; 2, 4];
%! sv = [1, 2, 3, 4];
%! uv = [2, 1, 4, 3];

%!assert (issorted (sm, "rows"))
%!assert (! issorted (um, "rows"))
%!assert (issorted (sv))
%!assert (! issorted (uv))
%!assert (issorted (sv'))
%!assert (! issorted (uv'))
%!assert (issorted (sm, "rows", "ascending"))
%!assert (! issorted (um, "rows", "ascending"))
%!assert (issorted (sv, "ascending"))
%!assert (! issorted (uv, "ascending"))
%!assert (issorted (sv', "ascending"))
%!assert (! issorted (uv', "ascending"))
%!assert (! issorted (sm, "rows", "descending"))
%!assert (issorted (flipud (sm), "rows", "descending"))
%!assert (! issorted (sv, "descending"))
%!assert (issorted (fliplr (sv), "descending"))
%!assert (! issorted (sv', "descending"))
%!assert (issorted (fliplr (sv)', "descending"))
%!assert (! issorted (um, "rows", "either"))
%!assert (! issorted (uv, "either"))
%!assert (issorted (sm, "rows", "either"))
%!assert (issorted (flipud (sm), "rows", "either"))
%!assert (issorted (sv, "either"))
%!assert (issorted (fliplr (sv), "either"))
%!assert (issorted (sv', "either"))
%!assert (issorted (fliplr (sv)', "either"))

%!error <needs a vector> issorted ([])

## Test input validation
%!error issorted () 
%!error issorted (1,2,3,4) 
%!error <second argument must be a string> issorted (1, 2)
%!error <second argument must be a string> issorted (1, {"rows"})
%!error <sparse matrices not yet supported> issorted (sparse ([1 2 3]), "rows")
%!error <A must be a 2-dimensional object> issorted (rand (2,2,2), "rows")
%!error <needs a vector> issorted (ones (2,2))
*/

Example 3 : Interactive or otherwise untestable function (keyboard() from input.cc)[edit]

C++ Code

  octave_value_list retval;

  int nargin = args.length ();

  if (nargin == 0 || nargin == 1)
    {
      unwind_protect frame;

      frame.add_fcn (octave_call_stack::restore_frame,
                     octave_call_stack::current_frame ());

      // Skip the frame assigned to the keyboard function.
      octave_call_stack::goto_frame_relative (0);

      tree_evaluator::debug_mode = true;
      tree_evaluator::quiet_breakpoint_flag = false;

      tree_evaluator::current_frame = octave_call_stack::current_frame ();

      do_keyboard (args);
    }
  else
    print_usage ();

  return retval;

BIST tests

For interactive functions there may be no way to actually test the function. In this case it is appropriate to mark the function so it will no longer show up as untested in later reports. Use the following code to do that.

/*
%!# No BIST tests possible for keyboard function.
*/

But, before you absolutely disable testing for a function, look to see if you can at least do input validation tests. In this case,

/*
%!error keyboard (1,2)
*/

Example 4 : Function tested elsewhere[edit]

The BIST tests are normally located immediately following the DEFUN block. However this is not always the case. For functions that occur in pairs like set()/get() or load()/save() the tests may be located near just one of the functions. Or the tests may be located in a single block somewhere else. This could be the end of the file, or it could be in a separate test file in the test/ directory. In this case, the function needs only to be marked with an explanation about where the tests reside. For example, in bessel.cc there is a large test block at the end of the file and the code includes a note that begins with '%!#'

/*
%!# Function besselj is tested along with other bessels at the end of this file
*/

Alternatively, it may make sense to move the tests to reside next to the function. For example, cputime() does not have tests in data.cc, but it does in test/system.tst.

Detailed Instructions[edit]

The list of undocumented C++ functions is in the Instances section. Tests should be enclosed by '/*' and '*/' multi-line comment markers. The comment block should have one newline above and below it to separate it from surrounding code.

To avoid duplication, sign up for a particular function by editing the Instances section of this wiki page and replacing '???' with your name. When you have edited a file you should verify that everything is okay by executing

make all
./run-octave
test FILENAME.cc
When that passes, let a Maintainer know so that we can check in the changes. Also, add the wiki tags
<strike> ... </strike>
to the Instances section to cross the file off the list. In addition, increment the number of documented functions by +1.

Instances[edit]

Start of Sprint

Total: 485

Fixed: 0

Owner File
 ??? corefcn/__ichol__.cc:__ichol0__
 ??? corefcn/__ilu__.cc:__ilu0__
 ??? corefcn/__ilu__.cc:__iluc__
 ??? corefcn/balance.cc:balance
 ??? corefcn/cellfun.cc:cellindexmat
 ??? corefcn/colloc.cc:colloc
 ??? corefcn/daspk.cc:daspk
 ??? corefcn/dasrt.cc:dasrt
 ??? corefcn/data.cc:permute
 ??? corefcn/data.cc:ipermute
 ??? corefcn/data.cc:length
 ??? corefcn/data.cc:ndims
 ??? corefcn/data.cc:numel
 ??? corefcn/data.cc:size
 ??? corefcn/data.cc:size_equal
 ??? corefcn/data.cc:nnz
 ??? corefcn/data.cc:nzmax
 ??? corefcn/data.cc:columns
 ??? corefcn/data.cc:isinteger
 ??? corefcn/data.cc:iscomplex
 ??? corefcn/data.cc:isfloat
 ??? corefcn/data.cc:complex
 ??? corefcn/data.cc:isreal
 ??? corefcn/data.cc:e
 ??? corefcn/data.cc:pi
 ??? corefcn/data.cc:realmax
 ??? corefcn/data.cc:realmin
 ??? corefcn/data.cc:I
 ??? corefcn/data.cc:false
 ??? corefcn/data.cc:true
 ??? corefcn/data.cc:resize
 ??? corefcn/data.cc:squeeze
 ??? corefcn/data.cc:full
 ??? corefcn/data.cc:not
 ??? corefcn/data.cc:uplus
 ??? corefcn/data.cc:uminus
 ??? corefcn/data.cc:plus
 ??? corefcn/data.cc:minus
 ??? corefcn/data.cc:mtimes
 ??? corefcn/data.cc:mrdivide
 ??? corefcn/data.cc:mpower
 ??? corefcn/data.cc:mldivide
 ??? corefcn/data.cc:lt
 ??? corefcn/data.cc:le
 ??? corefcn/data.cc:eq
 ??? corefcn/data.cc:ge
 ??? corefcn/data.cc:gt
 ??? corefcn/data.cc:ne
 ??? corefcn/data.cc:times
 ??? corefcn/data.cc:rdivide
 ??? corefcn/data.cc:power
 ??? corefcn/data.cc:ldivide
 ??? corefcn/data.cc:and
 ??? corefcn/data.cc:or
 ??? corefcn/data.cc:colon
 ??? corefcn/data.cc:tic
 ??? corefcn/data.cc:cputime
 ??? corefcn/data.cc:__sort_rows_idx__
 ??? corefcn/data.cc:nth_element
 ??? corefcn/data.cc:__accumarray_sum__
 ??? corefcn/data.cc:__accumarray_min__
 ??? corefcn/data.cc:__accumarray_max__
 ??? corefcn/data.cc:__accumdim_sum__
 ??? corefcn/data.cc:merge
 ??? corefcn/data.cc:repelems
 ??? corefcn/debug.cc:dbstop
 ??? corefcn/debug.cc:dbclear
 ??? corefcn/debug.cc:dbstatus
 ??? corefcn/debug.cc:dbwhere
 ??? corefcn/debug.cc:dbtype
 ??? corefcn/debug.cc:dblist
 ??? corefcn/debug.cc:dbstack
 ??? corefcn/debug.cc:dbup
 ??? corefcn/debug.cc:dbdown
 ??? corefcn/debug.cc:dbstep
 ??? corefcn/debug.cc:dbcont
 ??? corefcn/debug.cc:dbquit
 ??? corefcn/debug.cc:isdebugmode
 ??? corefcn/debug.cc:__db_next_breakpoint_quiet__
 ??? corefcn/dirfns.cc:cd
 ??? corefcn/dirfns.cc:pwd
 ??? corefcn/dirfns.cc:readdir
 ??? corefcn/dirfns.cc:mkdir
 ??? corefcn/dirfns.cc:rmdir
 ??? corefcn/dirfns.cc:link
 ??? corefcn/dirfns.cc:symlink
 ??? corefcn/dirfns.cc:readlink
 ??? corefcn/dirfns.cc:rename
 ??? corefcn/dirfns.cc:__fnmatch__
 ??? corefcn/dirfns.cc:filesep
 ??? corefcn/dirfns.cc:pathsep
 ??? corefcn/dirfns.cc:confirm_recursive_rmdir
 ??? corefcn/error.cc:rethrow
 ??? corefcn/error.cc:error
 ??? corefcn/error.cc:warning
 ??? corefcn/error.cc:lasterror
 ??? corefcn/error.cc:lasterr
 ??? corefcn/error.cc:lastwarn
 ??? corefcn/error.cc:__usage__
 ??? corefcn/error.cc:beep_on_error
 ??? corefcn/error.cc:debug_on_error
 ??? corefcn/error.cc:debug_on_warning
 ??? corefcn/fft.cc:fft
 ??? corefcn/fft2.cc:fft2
 ??? corefcn/fftn.cc:fftn
 ??? corefcn/fftn.cc:ifftn
 ??? corefcn/file-io.cc:fclose
 ??? corefcn/file-io.cc:fclear
 ??? corefcn/file-io.cc:fflush
 ??? corefcn/file-io.cc:fgetl
 ??? corefcn/file-io.cc:fgets
 ??? corefcn/file-io.cc:fskipl
 ??? corefcn/file-io.cc:fopen
 ??? corefcn/file-io.cc:freport
 ??? corefcn/file-io.cc:frewind
 ??? corefcn/file-io.cc:fseek
 ??? corefcn/file-io.cc:ftell
 ??? corefcn/file-io.cc:fprintf
 ??? corefcn/file-io.cc:printf
 ??? corefcn/file-io.cc:fputs
 ??? corefcn/file-io.cc:puts
 ??? corefcn/file-io.cc:sprintf
 ??? corefcn/file-io.cc:fscanf
 ??? corefcn/file-io.cc:sscanf
 ??? corefcn/file-io.cc:scanf
 ??? corefcn/file-io.cc:fread
 ??? corefcn/file-io.cc:fwrite
 ??? corefcn/file-io.cc:feof
 ??? corefcn/file-io.cc:ferror
 ??? corefcn/file-io.cc:popen
 ??? corefcn/file-io.cc:pclose
 ??? corefcn/file-io.cc:tmpfile
 ??? corefcn/file-io.cc:mkstemp
 ??? corefcn/file-io.cc:umask
 ??? corefcn/file-io.cc:P_tmpdir
 ??? corefcn/file-io.cc:SEEK_SET
 ??? corefcn/file-io.cc:SEEK_CUR
 ??? corefcn/file-io.cc:SEEK_END
 ??? corefcn/file-io.cc:stdin
 ??? corefcn/file-io.cc:stdout
 ??? corefcn/file-io.cc:stderr
 ??? corefcn/getgrent.cc:getgrent
 ??? corefcn/getgrent.cc:getgrgid
 ??? corefcn/getgrent.cc:getgrnam
 ??? corefcn/getgrent.cc:setgrent
 ??? corefcn/getgrent.cc:endgrent
 ??? corefcn/getpwent.cc:getpwent
 ??? corefcn/getpwent.cc:getpwuid
 ??? corefcn/getpwent.cc:getpwnam
 ??? corefcn/getpwent.cc:setpwent
 ??? corefcn/getpwent.cc:endpwent
 ??? corefcn/graphics.cc:ishandle
 ??? corefcn/graphics.cc:__is_handle_visible__
 ??? corefcn/graphics.cc:set
 ??? corefcn/graphics.cc:__get__
 ??? corefcn/graphics.cc:__go_figure__
 ??? corefcn/graphics.cc:__calc_dimensions__
 ??? corefcn/graphics.cc:__go_axes__
 ??? corefcn/graphics.cc:__go_line__
 ??? corefcn/graphics.cc:__go_text__
 ??? corefcn/graphics.cc:__go_image__
 ??? corefcn/graphics.cc:__go_surface__
 ??? corefcn/graphics.cc:__go_patch__
 ??? corefcn/graphics.cc:__go_hggroup__
 ??? corefcn/graphics.cc:__go_uimenu__
 ??? corefcn/graphics.cc:__go_uicontrol__
 ??? corefcn/graphics.cc:__go_uipanel__
 ??? corefcn/graphics.cc:__go_uicontextmenu__
 ??? corefcn/graphics.cc:__go_uitoolbar__
 ??? corefcn/graphics.cc:__go_uipushtool__
 ??? corefcn/graphics.cc:__go_uitoggletool__
 ??? corefcn/graphics.cc:__go_delete__
 ??? corefcn/graphics.cc:__go_axes_init__
 ??? corefcn/graphics.cc:__go_handles__
 ??? corefcn/graphics.cc:__go_figure_handles__
 ??? corefcn/graphics.cc:__go_execute_callback__
 ??? corefcn/graphics.cc:__image_pixel_size__
 ??? corefcn/graphics.cc:available_graphics_toolkits
 ??? corefcn/graphics.cc:register_graphics_toolkit
 ??? corefcn/graphics.cc:loaded_graphics_toolkits
 ??? corefcn/graphics.cc:drawnow
 ??? corefcn/graphics.cc:addlistener
 ??? corefcn/graphics.cc:dellistener
 ??? corefcn/graphics.cc:addproperty
 ??? corefcn/graphics.cc:waitfor
 ??? corefcn/graphics.cc:__zoom__
 ??? corefcn/help.cc:built_in_docstrings_file
 ??? corefcn/help.cc:get_help_text
 ??? corefcn/help.cc:get_help_text_from_file
 ??? corefcn/help.cc:__operators__
 ??? corefcn/help.cc:__keywords__
 ??? corefcn/help.cc:__builtins__
 ??? corefcn/help.cc:__which__
 ??? corefcn/help.cc:__list_functions__
 ??? corefcn/help.cc:doc_cache_file
 ??? corefcn/help.cc:texi_macros_file
 ??? corefcn/help.cc:info_file
 ??? corefcn/help.cc:info_program
 ??? corefcn/help.cc:makeinfo_program
 ??? corefcn/help.cc:suppress_verbose_help_message
 ??? corefcn/input.cc:input
 ??? corefcn/input.cc:yes_or_no
 ??? corefcn/input.cc:keyboard
 ??? corefcn/input.cc:__echostate__
 ??? corefcn/input.cc:readline_read_init_file
 ??? corefcn/input.cc:readline_re_read_init_file
 ??? corefcn/input.cc:add_input_event_hook
 ??? corefcn/input.cc:remove_input_event_hook
 ??? corefcn/input.cc:PS1
 ??? corefcn/input.cc:PS2
 ??? corefcn/input.cc:PS4
 ??? corefcn/input.cc:completion_append_char
 ??? corefcn/input.cc:echo_executing_commands
 ??? corefcn/input.cc:__request_drawnow__
 ??? corefcn/input.cc:__gud_mode__
 ??? corefcn/input.cc:filemarker
 ??? corefcn/inv.cc:inverse
 ??? corefcn/load-path.cc:genpath
 ??? corefcn/load-path.cc:rehash
 ??? corefcn/load-path.cc:command_line_path
 ??? corefcn/load-path.cc:restoredefaultpath
 ??? corefcn/load-path.cc:__pathorig__
 ??? corefcn/load-path.cc:path
 ??? corefcn/load-path.cc:addpath
 ??? corefcn/load-path.cc:rmpath
 ??? corefcn/load-path.cc:__dump_load_path__
 ??? corefcn/load-save.cc:load
 ??? corefcn/load-save.cc:save
 ??? corefcn/load-save.cc:crash_dumps_octave_core
 ??? corefcn/load-save.cc:save_default_options
 ??? corefcn/load-save.cc:octave_core_file_limit
 ??? corefcn/load-save.cc:octave_core_file_name
 ??? corefcn/load-save.cc:octave_core_file_options
 ??? corefcn/load-save.cc:save_header_format_string
 ??? corefcn/ls-oct-text.cc:save_precision
 ??? corefcn/mappers.cc:angle
 ??? corefcn/oct-hist.cc:edit_history
 ??? corefcn/oct-hist.cc:history
 ??? corefcn/oct-hist.cc:run_history
 ??? corefcn/oct-hist.cc:history_control
 ??? corefcn/oct-hist.cc:history_size
 ??? corefcn/oct-hist.cc:history_file
 ??? corefcn/oct-hist.cc:history_timestamp_format_string
 ??? corefcn/oct-hist.cc:history_save
 ??? corefcn/octave-link.cc:__octave_link_enabled__
 ??? corefcn/octave-link.cc:__octave_link_edit_file__
 ??? corefcn/octave-link.cc:__octave_link_message_dialog__
 ??? corefcn/octave-link.cc:__octave_link_question_dialog__
 ??? corefcn/octave-link.cc:__octave_link_file_dialog__
 ??? corefcn/octave-link.cc:__octave_link_list_dialog__
 ??? corefcn/octave-link.cc:__octave_link_input_dialog__
 ??? corefcn/octave-link.cc:__octave_link_show_preferences__
 ??? corefcn/octave-link.cc:__octave_link_show_doc__
 ??? corefcn/pager.cc:diary
 ??? corefcn/pager.cc:__diaryfile__
 ??? corefcn/pager.cc:__diarystate__
 ??? corefcn/pager.cc:more
 ??? corefcn/pager.cc:terminal_size
 ??? corefcn/pager.cc:page_output_immediately
 ??? corefcn/pager.cc:page_screen_output
 ??? corefcn/pager.cc:PAGER
 ??? corefcn/pager.cc:PAGER_FLAGS
 ??? corefcn/pr-output.cc:rats
 ??? corefcn/pr-output.cc:disp
 ??? corefcn/pr-output.cc:format
 ??? corefcn/pr-output.cc:__compactformat__
 ??? corefcn/pr-output.cc:__formatstring__
 ??? corefcn/pr-output.cc:fixed_point_format
 ??? corefcn/pr-output.cc:print_empty_dimensions
 ??? corefcn/pr-output.cc:split_long_rows
 ??? corefcn/pr-output.cc:output_max_field_width
 ??? corefcn/pr-output.cc:output_precision
 ??? corefcn/profiler.cc:__profiler_enable__
 ??? corefcn/profiler.cc:__profiler_reset__
 ??? corefcn/profiler.cc:__profiler_data__
 ??? corefcn/pt-jit.cc:jit_failcnt
 ??? corefcn/pt-jit.cc:debug_jit
 ??? corefcn/pt-jit.cc:jit_enable
 ??? corefcn/pt-jit.cc:jit_startcnt
 ??? corefcn/sparse.cc:issparse
 ??? corefcn/sparse.cc:sparse
 ??? corefcn/sparse.cc:spalloc
 ??? corefcn/sub2ind.cc:ind2sub
 ??? corefcn/symtab.cc:__current_scope__
 ??? corefcn/symtab.cc:__dump_symtab_info__
 ??? corefcn/symtab.cc:__get_cmdline_fcn_txt__
 ??? corefcn/symtab.cc:set_variable
 ??? corefcn/syscalls.cc:dup2
 ??? corefcn/syscalls.cc:exec
 ??? corefcn/syscalls.cc:fcntl
 ??? corefcn/syscalls.cc:fork
 ??? corefcn/syscalls.cc:getpgrp
 ??? corefcn/syscalls.cc:getpid
 ??? corefcn/syscalls.cc:getppid
 ??? corefcn/syscalls.cc:getegid
 ??? corefcn/syscalls.cc:getgid
 ??? corefcn/syscalls.cc:geteuid
 ??? corefcn/syscalls.cc:getuid
 ??? corefcn/syscalls.cc:kill
 ??? corefcn/syscalls.cc:lstat
 ??? corefcn/syscalls.cc:pipe
 ??? corefcn/syscalls.cc:stat
 ??? corefcn/syscalls.cc:S_ISREG
 ??? corefcn/syscalls.cc:S_ISDIR
 ??? corefcn/syscalls.cc:S_ISCHR
 ??? corefcn/syscalls.cc:S_ISBLK
 ??? corefcn/syscalls.cc:S_ISFIFO
 ??? corefcn/syscalls.cc:S_ISLNK
 ??? corefcn/syscalls.cc:S_ISSOCK
 ??? corefcn/syscalls.cc:gethostname
 ??? corefcn/syscalls.cc:uname
 ??? corefcn/syscalls.cc:unlink
 ??? corefcn/syscalls.cc:waitpid
 ??? corefcn/syscalls.cc:WIFEXITED
 ??? corefcn/syscalls.cc:WEXITSTATUS
 ??? corefcn/syscalls.cc:WIFSIGNALED
 ??? corefcn/syscalls.cc:WTERMSIG
 ??? corefcn/syscalls.cc:WCOREDUMP
 ??? corefcn/syscalls.cc:WIFSTOPPED
 ??? corefcn/syscalls.cc:WSTOPSIG
 ??? corefcn/syscalls.cc:WIFCONTINUED
 ??? corefcn/syscalls.cc:canonicalize_file_name
 ??? corefcn/syscalls.cc:F_DUPFD
 ??? corefcn/syscalls.cc:F_GETFD
 ??? corefcn/syscalls.cc:F_GETFL
 ??? corefcn/syscalls.cc:F_SETFD
 ??? corefcn/syscalls.cc:F_SETFL
 ??? corefcn/syscalls.cc:O_APPEND
 ??? corefcn/syscalls.cc:O_ASYNC
 ??? corefcn/syscalls.cc:O_CREAT
 ??? corefcn/syscalls.cc:O_EXCL
 ??? corefcn/syscalls.cc:O_NONBLOCK
 ??? corefcn/syscalls.cc:O_RDONLY
 ??? corefcn/syscalls.cc:O_RDWR
 ??? corefcn/syscalls.cc:O_SYNC
 ??? corefcn/syscalls.cc:O_TRUNC
 ??? corefcn/syscalls.cc:O_WRONLY
 ??? corefcn/syscalls.cc:WNOHANG
 ??? corefcn/syscalls.cc:WUNTRACED
 ??? corefcn/syscalls.cc:WCONTINUE
 ??? corefcn/sysdep.cc:__open_with_system_app__
 ??? corefcn/sysdep.cc:clc
 ??? corefcn/sysdep.cc:unsetenv
 ??? corefcn/sysdep.cc:kbhit
 ??? corefcn/sysdep.cc:have_window_system
 ??? corefcn/toplev.cc:quit
 ??? corefcn/toplev.cc:warranty
 ??? corefcn/toplev.cc:atexit
 ??? corefcn/tril.cc:tril
 ??? corefcn/typecast.cc:typecast
 ??? corefcn/typecast.cc:bitpack
 ??? corefcn/typecast.cc:bitunpack
 ??? corefcn/urlwrite.cc:urlwrite
 ??? corefcn/urlwrite.cc:urlread
 ??? corefcn/urlwrite.cc:__ftp__
 ??? corefcn/urlwrite.cc:__ftp_pwd__
 ??? corefcn/urlwrite.cc:__ftp_cwd__
 ??? corefcn/urlwrite.cc:__ftp_dir__
 ??? corefcn/urlwrite.cc:__ftp_ascii__
 ??? corefcn/urlwrite.cc:__ftp_binary__
 ??? corefcn/urlwrite.cc:__ftp_close__
 ??? corefcn/urlwrite.cc:__ftp_mode__
 ??? corefcn/urlwrite.cc:__ftp_delete__
 ??? corefcn/urlwrite.cc:__ftp_rmdir__
 ??? corefcn/urlwrite.cc:__ftp_mkdir__
 ??? corefcn/urlwrite.cc:__ftp_rename__
 ??? corefcn/urlwrite.cc:__ftp_mput__
 ??? corefcn/urlwrite.cc:__ftp_mget__
 ??? corefcn/variables.cc:isglobal
 ??? corefcn/variables.cc:who
 ??? corefcn/variables.cc:whos
 ??? corefcn/variables.cc:mlock
 ??? corefcn/variables.cc:munlock
 ??? corefcn/variables.cc:mislocked
 ??? corefcn/variables.cc:clear
 ??? corefcn/variables.cc:whos_line_format
 ??? corefcn/variables.cc:missing_function_hook
 ??? corefcn/variables.cc:__varval__
 ??? corefcn/variables.cc:missing_component_hook
 ??? dldfcn/__eigs__.cc:__eigs__
 ??? dldfcn/__init_fltk__.cc:__fltk_check__
 ??? dldfcn/__init_fltk__.cc:__init_fltk__
 ??? dldfcn/__init_fltk__.cc:__have_fltk__
 ??? dldfcn/__init_gnuplot__.cc:__init_gnuplot__
 ??? dldfcn/__init_gnuplot__.cc:__have_gnuplot__
 ??? dldfcn/__magick_read__.cc:__magick_ping__
 ??? dldfcn/audiodevinfo.cc:__recorder_audiorecorder__
 ??? dldfcn/audiodevinfo.cc:__recorder_getaudiodata__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_channels__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_fs__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_id__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_nbits__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_sample_number__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_tag__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_total_samples__
 ??? dldfcn/audiodevinfo.cc:__recorder_get_userdata__
 ??? dldfcn/audiodevinfo.cc:__recorder_isrecording__
 ??? dldfcn/audiodevinfo.cc:__recorder_pause__
 ??? dldfcn/audiodevinfo.cc:__recorder_recordblocking__
 ??? dldfcn/audiodevinfo.cc:__recorder_record__
 ??? dldfcn/audiodevinfo.cc:__recorder_resume__
 ??? dldfcn/audiodevinfo.cc:__recorder_set_fs__
 ??? dldfcn/audiodevinfo.cc:__recorder_set_tag__
 ??? dldfcn/audiodevinfo.cc:__recorder_set_userdata__
 ??? dldfcn/audiodevinfo.cc:__recorder_stop__
 ??? dldfcn/audiodevinfo.cc:__player_audioplayer__
 ??? dldfcn/audiodevinfo.cc:__player_get_channels__
 ??? dldfcn/audiodevinfo.cc:__player_get_fs__
 ??? dldfcn/audiodevinfo.cc:__player_get_id__
 ??? dldfcn/audiodevinfo.cc:__player_get_nbits__
 ??? dldfcn/audiodevinfo.cc:__player_get_sample_number__
 ??? dldfcn/audiodevinfo.cc:__player_get_tag__
 ??? dldfcn/audiodevinfo.cc:__player_get_total_samples__
 ??? dldfcn/audiodevinfo.cc:__player_get_userdata__
 ??? dldfcn/audiodevinfo.cc:__player_isplaying__
 ??? dldfcn/audiodevinfo.cc:__player_pause__
 ??? dldfcn/audiodevinfo.cc:__player_playblocking__
 ??? dldfcn/audiodevinfo.cc:__player_play__
 ??? dldfcn/audiodevinfo.cc:__player_resume__
 ??? dldfcn/audiodevinfo.cc:__player_set_fs__
 ??? dldfcn/audiodevinfo.cc:__player_set_tag__
 ??? dldfcn/audiodevinfo.cc:__player_set_userdata__
 ??? dldfcn/audiodevinfo.cc:__player_stop__
 ??? dldfcn/audioread.cc:audioread
 ??? dldfcn/audioread.cc:audiowrite
 ??? dldfcn/audioread.cc:audioinfo
 ??? dldfcn/ccolamd.cc:ccolamd
 ??? dldfcn/ccolamd.cc:csymamd
 ??? dldfcn/chol.cc:chol2inv
 ??? dldfcn/colamd.cc:colamd
 ??? dldfcn/colamd.cc:symamd
 ??? dldfcn/colamd.cc:etree
 ??? dldfcn/symbfact.cc:symbfact
 ??? dldfcn/symrcm.cc:symrcm
 ??? octave-value/ov-cell.cc:iscell
 ??? octave-value/ov-cell.cc:cell
 ??? octave-value/ov-cell.cc:iscellstr
 ??? octave-value/ov-cell.cc:cellstr
 ??? octave-value/ov-class.cc:__parent_classes__
 ??? octave-value/ov-class.cc:isobject
 ??? octave-value/ov-class.cc:ismethod
 ??? octave-value/ov-class.cc:__methods__
 ??? octave-value/ov-class.cc:superiorto
 ??? octave-value/ov-class.cc:inferiorto
 ??? octave-value/ov-classdef.cc:__meta_get_package__
 ??? octave-value/ov-classdef.cc:__superclass_reference__
 ??? octave-value/ov-classdef.cc:__meta_class_query__
 ??? octave-value/ov-classdef.cc:metaclass
 ??? octave-value/ov-fcn-handle.cc:functions
 ??? octave-value/ov-fcn-handle.cc:func2str
 ??? octave-value/ov-java.cc:__java_init__
 ??? octave-value/ov-java.cc:__java_exit__
 ??? octave-value/ov-java.cc:__java_get__
 ??? octave-value/ov-java.cc:__java_set__
 ??? octave-value/ov-java.cc:java2mat
 ??? octave-value/ov-java.cc:java_matrix_autoconversion
 ??? octave-value/ov-java.cc:java_unsigned_autoconversion
 ??? octave-value/ov-java.cc:debug_java
 ??? octave-value/ov-struct.cc:isstruct
 ??? octave-value/ov-struct.cc:__fieldnames__
 ??? octave-value/ov-struct.cc:isfield
 ??? octave-value/ov-struct.cc:struct_levels_to_print
 ??? octave-value/ov-struct.cc:print_struct_array_contents
 ??? octave-value/ov-usr-fcn.cc:nargin
 ??? octave-value/ov-usr-fcn.cc:nargout
 ??? octave-value/ov-usr-fcn.cc:optimize_subsasgn_calls
 ??? octave-value/ov.cc:subsref
 ??? octave.cc:__version_info__
 ??? parse-tree/lex.ll:__display_tokens__
 ??? parse-tree/lex.ll:__token_count__
 ??? parse-tree/lex.ll:__lexer_debug_flag__
 ??? parse-tree/oct-parse.in.yy:autoload
 ??? parse-tree/oct-parse.in.yy:mfilename
 ??? parse-tree/oct-parse.in.yy:source
 ??? parse-tree/oct-parse.in.yy:feval
 ??? parse-tree/oct-parse.in.yy:builtin
 ??? parse-tree/oct-parse.in.yy:assignin
 ??? parse-tree/oct-parse.in.yy:evalin
 ??? parse-tree/oct-parse.in.yy:__parser_debug_flag__
 ??? parse-tree/oct-parse.in.yy:__parse_file__
 ??? corefcn/DASRT-opts.cc:dasrt_options
 ??? corefcn/Quad-opts.cc:quad_options
 ??? corefcn/DASSL-opts.cc:dassl_options
 ??? corefcn/LSODE-opts.cc:lsode_options
 ??? corefcn/DASPK-opts.cc:daspk_options