view libinterp/corefcn/octave-link.cc @ 20620:e5f36a7854a5

Remove fuzzy matching from odeset/odeget. * levenshtein.cc: Deleted file. * libinterp/corefcn/module.mk: Remove levenshtein.cc from build system. * fuzzy_compare.m: Deleted file. * scripts/ode/module.mk: Remove fuzzy_compare.m from build system * odeget.m: Reword docstring. Use a persistent cellstr variable to keep track of all options. Replace fuzzy_compare() calls with combination of strcmpi and strncmpi. Report errors relative to function odeget rather than OdePkg. Rewrite and extend BIST tests. Add input validation BIST tests. * odeset.m: Reword docstring. Use a persistent cellstr variable to keep track of all options. Replace fuzzy_compare() calls with combination of strcmpi and strncmpi. Report errors relative to function odeset rather than OdePkg. Use more meaningful variables names and create intermediate variables with logical names to help make code readable. Remove interactive input when multiple property names match and just issue an error. Rewrite BIST tests. * ode_struct_value_check.m: Remove input checking for private function which must always be invoked correctly by caller. Use intermediate variables opt and val to make the code more understandable. Consolidate checks on values into single if statements. Use 'val == fix (val)' to check for integer. * __unimplemented__.m: Removed odeset, odeget, ode45 from list.
author Rik <rik@octave.org>
date Fri, 09 Oct 2015 12:03:23 -0700
parents fd0efcdb3718
children
line wrap: on
line source

/*

Copyright (C) 2013-2015 John W. Eaton
Copyright (C) 2011-2015 Jacob Dawid
Copyright (C) 2011-2015 John P. Swensen

This file is part of Octave.

Octave is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

Octave is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "cmd-edit.h"
#include "defun.h"
#include "oct-env.h"
#include "oct-mutex.h"
#include "singleton-cleanup.h"
#include "toplev.h"

#include "octave-link.h"

static int
octave_readline_hook (void)
{
  octave_link::entered_readline_hook ();
  octave_link::generate_events ();
  octave_link::process_events ();
  octave_link::finished_readline_hook ();

  return 0;
}

octave_link *octave_link::instance = 0;

octave_link::octave_link (void)
  : event_queue_mutex (new octave_mutex ()), gui_event_queue (),
    debugging (false), link_enabled (true)
{
  command_editor::add_event_hook (octave_readline_hook);
}

void
octave_link::set_workspace (void)
{
  if (enabled ())
    instance->do_set_workspace ((symbol_table::current_scope ()
                                 == symbol_table::top_scope ()),
                                instance->debugging,
                                symbol_table::workspace_info ());
}

// OBJ should be an object of a class that is derived from the base
// class octave_link, or 0 to disconnect the link.  It is the
// responsibility of the caller to delete obj.

void
octave_link::connect_link (octave_link* obj)
{
  if (obj && instance)
    error ("octave_link is already linked!");
  else
    instance = obj;
}

void
octave_link::do_generate_events (void)
{
}

void
octave_link::do_process_events (void)
{
  event_queue_mutex->lock ();

  gui_event_queue.run ();

  event_queue_mutex->unlock ();
}

void
octave_link::do_discard_events (void)
{
  event_queue_mutex->lock ();

  gui_event_queue.discard ();

  event_queue_mutex->unlock ();
}

DEFUN (__octave_link_enabled__, , ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_enabled__ ()\n\
Undocumented internal function.\n\
@end deftypefn")
{
  return octave_value (octave_link::enabled ());
}

DEFUN (__octave_link_edit_file__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_edit_file__ (@var{file})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value retval;

  if (args.length () == 1)
    {
      std::string file = args(0).string_value ("expecting file name as argument");

      flush_octave_stdout ();

      retval = octave_link::edit_file (file);
    }
  else if (args.length () == 2)
    {
      std::string file = args(0).string_value ("expecting file name as first argument");

      flush_octave_stdout ();

      retval = octave_link::prompt_new_edit_file (file);
    }

  return retval;
}

DEFUN (__octave_link_message_dialog__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_message_dialog__ (@var{dlg}, @var{msg}, @var{title})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value retval;

  if (args.length () == 3)
    {
      std::string dlg = args(0).string_value ("invalid arguments");
      std::string msg = args(1).string_value ("invalid arguments");
      std::string title = args(2).string_value ("invalid arguments");

      flush_octave_stdout ();

      retval = octave_link::message_dialog (dlg, msg, title);
    }

  return retval;
}

DEFUN (__octave_link_question_dialog__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_question_dialog__ (@var{msg}, @var{title}, @var{btn1}, @var{btn2}, @var{btn3}, @var{default})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value retval;

  if (args.length () == 6)
    {
      std::string msg = args(0).string_value ("invalid arguments");
      std::string title = args(1).string_value ("invalid arguments");
      std::string btn1 = args(2).string_value ("invalid arguments");
      std::string btn2 = args(3).string_value ("invalid arguments");
      std::string btn3 = args(4).string_value ("invalid arguments");
      std::string btndef = args(5).string_value ("invalid arguments");

      flush_octave_stdout ();

      retval = octave_link::question_dialog (msg, title, btn1, btn2, btn3,
                                             btndef);
    }

  return retval;
}

DEFUN (__octave_link_file_dialog__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_file_dialog__ (@var{filterlist}, @var{title}, @var{filename}, @var{size} @var{multiselect}, @var{pathname})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value_list retval;

  if (args.length () == 6)
    {

      const Array<std::string> flist = args(0).cellstr_value ();
      std::string title = args(1).string_value ();
      std::string filename = args(2).string_value ();
      Matrix pos = args(3).matrix_value ();
      std::string multi_on = args(4).string_value (); // on, off, create
      std::string pathname = args(5).string_value ();

      octave_idx_type nel;
      octave_link::filter_list filter_lst;

      for (octave_idx_type i = 0; i < flist.rows (); i++)
        filter_lst.push_back (std::make_pair (flist(i,0),
                                              (flist.columns () > 1
                                               ? flist(i,1) : "")));

      if (! error_state)
        {
          flush_octave_stdout ();

          std::list<std::string> items_lst
            = octave_link::file_dialog (filter_lst, title, filename, pathname,
                                        multi_on);

          nel = items_lst.size ();

          retval.resize (3);

          // If 3, then retval is filename, directory, and selected index.
          if (nel <= 3)
            {
              int idx = 0;
              for (std::list<std::string>::iterator it = items_lst.begin ();
                   it != items_lst.end (); it++)
                {
                  retval(idx++) = *it;

                  if (idx == 1 && retval(0).string_value ().length () == 0)
                    retval(0) = 0;

                  if (idx == 3)
                    retval(2) = atoi (retval(2).string_value ().c_str ());
                }
            }
          else
            {
              // Multiple files.
              nel = items_lst.size () - 2;
              Cell items (dim_vector (1, nel));

              std::list<std::string>::iterator it = items_lst.begin ();

              for (int idx = 0; idx < nel; idx++)
                {
                  items.xelem (idx) = *it;
                  it++;
                }

              retval(0) = items;
              retval(1) = *it++;
              retval(2) = atoi (it->c_str ());
            }
        }
      else
        error ("invalid arguments");
    }

  return retval;
}

DEFUN (__octave_link_list_dialog__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_list_dialog__ (@var{list}, @var{mode}, @var{size}, @var{intial}, @var{name}, @var{prompt}, @var{ok_string}, @var{cancel_string})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value_list retval;

  if (args.length () == 8)
    {
      Cell list = args(0).cell_value ();
      const Array<std::string> tlist = list.cellstr_value ();
      octave_idx_type nel = tlist.numel ();
      std::list<std::string> list_lst;
      for (octave_idx_type i = 0; i < nel; i++)
        list_lst.push_back (tlist(i));

      std::string mode = args(1).string_value ();

      Matrix size_matrix = args(2).matrix_value ();
      int width = size_matrix(0);
      int height = size_matrix(1);

      Matrix initial_matrix = args(3).matrix_value ();
      nel = initial_matrix.numel ();
      std::list<int> initial_lst;
      for (octave_idx_type i = 0; i < nel; i++)
        initial_lst.push_back (initial_matrix(i));

      std::string name = args(4).string_value ();
      list = args(5).cell_value ();
      const Array<std::string> plist = list.cellstr_value ();
      nel = plist.numel ();
      std::list<std::string> prompt_lst;
      for (octave_idx_type i = 0; i < nel; i++)
        prompt_lst.push_back (plist(i));
      std::string ok_string = args(6).string_value ();
      std::string cancel_string = args(7).string_value ();

      flush_octave_stdout ();

      std::pair<std::list<int>, int> result
        = octave_link::list_dialog (list_lst, mode, width, height,
                                    initial_lst, name, prompt_lst,
                                    ok_string, cancel_string);

      std::list<int> items_lst = result.first;
      nel = items_lst.size ();
      Matrix items (dim_vector (1, nel));
      octave_idx_type i = 0;
      for (std::list<int>::iterator it = items_lst.begin ();
           it != items_lst.end (); it++)
        {
          items.xelem(i++) = *it;
        }

      retval(1) = result.second;
      retval(0) = items;
    }

  return retval;
}

DEFUN (__octave_link_input_dialog__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_input_dialog__ (@var{prompt}, @var{title}, @var{rowscols}, @var{defaults})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value retval;

  if (args.length () == 4)
    {
      Cell prompt = args(0).cell_value ();
      Array<std::string> tmp = prompt.cellstr_value ();
      octave_idx_type nel = tmp.numel ();
      std::list<std::string> prompt_lst;
      for (octave_idx_type i = 0; i < nel; i++)
        prompt_lst.push_back (tmp(i));

      std::string title = args(1).string_value ();

      Matrix rc = args(2).matrix_value ();
      nel = rc.rows ();
      std::list<float> nr;
      std::list<float> nc;
      for (octave_idx_type i = 0; i < nel; i++)
        {
          nr.push_back (rc(i,0));
          nc.push_back (rc(i,1));
        }

      Cell defaults = args(3).cell_value ();
      tmp = defaults.cellstr_value ();
      nel = tmp.numel ();
      std::list<std::string> defaults_lst;
      for (octave_idx_type i = 0; i < nel; i++)
        defaults_lst.push_back (tmp(i));

      flush_octave_stdout ();

      std::list<std::string> items_lst
        = octave_link::input_dialog (prompt_lst, title, nr, nc,
                                     defaults_lst);

      nel = items_lst.size ();
      Cell items (dim_vector (nel, 1));
      octave_idx_type i = 0;
      for (std::list<std::string>::iterator it = items_lst.begin ();
           it != items_lst.end (); it++)
        {
          items.xelem(i++) = *it;
        }

      retval = items;
    }

  return retval;
}

DEFUN (__octave_link_show_preferences__, , ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_show_preferences__ ()\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value retval;

  retval = octave_link::show_preferences ();

  return retval;
}

DEFUN (__octave_link_show_doc__, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Built-in Function} {} __octave_link_show_doc__ (@var{filename})\n\
Undocumented internal function.\n\
@end deftypefn")
{
  octave_value retval;
  std::string file;

  if (args.length () >= 1)
    file = args(0).string_value();

  retval = octave_link::show_doc (file);

  return retval;
}