changeset 18238:8f256148d82b

maint: Periodic merge of gui-release to default.
author John W. Eaton <jwe@octave.org>
date Tue, 07 Jan 2014 16:07:54 -0500
parents 3cad99b56fa7 (current diff) e42d4f152766 (diff)
children c0f036b5e292 f3314c4b9266
files libinterp/parse-tree/lex.ll
diffstat 6 files changed, 211 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc	Tue Jan 07 13:20:28 2014 -0500
+++ b/libgui/src/m-editor/file-editor-tab.cc	Tue Jan 07 16:07:54 2014 -0500
@@ -51,6 +51,8 @@
 #include "file-editor-tab.h"
 #include "file-editor.h"
 
+#include "file-ops.h"
+
 #include "debug.h"
 #include "octave-qt-link.h"
 #include "version.h"
@@ -616,17 +618,40 @@
     bp_table::remove_all_breakpoints_in_file (info.function_name, true);
 }
 
+file_editor_tab::bp_info::bp_info (const QString& fname, int l)
+  : line (l), file (fname.toStdString ())
+{
+  QFileInfo file_info (fname);
+
+  QString q_dir = file_info.absolutePath ();
+  QString q_function_name = file_info.fileName ();
+
+  // We have to cut off the suffix, because octave appends it.
+  q_function_name.chop (file_info.suffix ().length () + 1);
+
+  dir = q_dir.toStdString ();
+  function_name = q_function_name.toStdString ();
+
+  // Is the last component of DIR @foo?  If so, strip it and prepend it
+  // to the name of the function.
+
+  size_t pos = dir.rfind (file_ops::dir_sep_chars ());
+
+  if (pos != std::string::npos && pos < dir.length () - 1)
+    {
+      if (dir[pos+1] == '@')
+        {
+          function_name = file_ops::concat (dir.substr (pos+1), function_name);
+
+          dir = dir.substr (0, pos);
+        }
+    }
+}
+
 void
 file_editor_tab::request_add_breakpoint (int line)
 {
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, line+1);
+  bp_info info (_file_name, line+1);
 
   octave_link::post_event
     (this, &file_editor_tab::add_breakpoint_callback, info);
@@ -635,14 +660,7 @@
 void
 file_editor_tab::request_remove_breakpoint (int line)
 {
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, line+1);
+  bp_info info (_file_name, line+1);
 
   octave_link::post_event
     (this, &file_editor_tab::remove_breakpoint_callback, info);
@@ -703,14 +721,7 @@
   if (ID != this)
     return;
 
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, 0);
+  bp_info info (_file_name);
 
   octave_link::post_event
     (this, &file_editor_tab::remove_all_breakpoints_callback, info);
--- a/libgui/src/m-editor/file-editor-tab.h	Tue Jan 07 13:20:28 2014 -0500
+++ b/libgui/src/m-editor/file-editor-tab.h	Tue Jan 07 16:07:54 2014 -0500
@@ -165,15 +165,12 @@
 
   struct bp_info
   {
-    bp_info (const QString& f, const QString& d, const QString& fn, int l)
-      : file (f.toStdString ()), dir (d.toStdString ()),
-        function_name (fn.toStdString ()), line (l)
-    { }
+    bp_info (const QString& fname, int l = 0);
 
+    int line;
     std::string file;
     std::string dir;
     std::string function_name;
-    int line;
   };
 
   bool valid_file_name (const QString& file=QString ());
--- a/libgui/src/qtinfo/webinfo.cc	Tue Jan 07 13:20:28 2014 -0500
+++ b/libgui/src/qtinfo/webinfo.cc	Tue Jan 07 16:07:54 2014 -0500
@@ -57,7 +57,10 @@
   _tab_bar->setSizePolicy (QSizePolicy::Preferred,QSizePolicy::Preferred);
   _tab_bar->setExpanding (false);
   _tab_bar->setTabsClosable (true);
+#ifdef HAVE_QTABWIDGET_SETMOVABLE
   _tab_bar->setMovable (true);
+#endif
+  _tab_bar->setStyleSheet ("QTabBar::tab {max-height: 4ex; }");
   hbox_layout->addWidget (_tab_bar);
 
   _zoom_in_button = new QToolButton (this);
--- a/libinterp/corefcn/debug.cc	Tue Jan 07 13:20:28 2014 -0500
+++ b/libinterp/corefcn/debug.cc	Tue Jan 07 16:07:54 2014 -0500
@@ -178,7 +178,14 @@
     dbg_fcn = octave_call_stack::caller_user_code ();
   else
     {
-      octave_value fcn = symbol_table::find_function (fname);
+      std::string name = fname;
+
+      size_t name_len = name.length ();
+
+      if (! name.empty () && name_len > 2 && name.substr (name_len-2) == ".m")
+        name = name.substr (0, name_len-2);
+
+      octave_value fcn = symbol_table::find_function (name);
 
       if (fcn.is_defined () && fcn.is_user_code ())
         dbg_fcn = fcn.user_code_value ();
--- a/libinterp/parse-tree/lex.ll	Tue Jan 07 13:20:28 2014 -0500
+++ b/libinterp/parse-tree/lex.ll	Tue Jan 07 16:07:54 2014 -0500
@@ -43,7 +43,7 @@
 
 }
 
-%s COMMAND_START
+%x COMMAND_START
 %s MATRIX_START
 
 %x INPUT_FILE_START
@@ -325,7 +325,7 @@
 %}
 
 <COMMAND_START>({CCHAR}[^\r\n]*)?{NL} {
-    curr_lexer->lexer_debug ("<COMMAND_START>({CCHAR}[^\\r\\n]*)?{NL}");
+    curr_lexer->lexer_debug ("<COMMAND_START>({CCHAR}[^\\r\\n])?{NL}");
 
     COMMAND_ARG_FINISH;
 
@@ -339,7 +339,7 @@
   }
 
 <COMMAND_START>[\,\;] {
-    curr_lexer->lexer_debug( "<COMMAND_START>[\\,\\;]" );
+    curr_lexer->lexer_debug ("<COMMAND_START>[\\,\\;]");
 
     if (yytext[0] != ',' || curr_lexer->command_arg_paren_count == 0)
       {
@@ -361,7 +361,7 @@
 // be slurped into that argument as well.
 %}
 
-<COMMAND_START>[\(\[\{]+ {
+<COMMAND_START>[\(\[\{]* {
     curr_lexer->lexer_debug ("<COMMAND_START>[\\(\\[\\{]+");
 
     curr_lexer->command_arg_paren_count += yyleng;
@@ -369,7 +369,7 @@
     curr_lexer->current_input_column += yyleng;
   }
 
-<COMMAND_START>[\)\]\}]+ {
+<COMMAND_START>[\)\]\}]* {
    curr_lexer->lexer_debug ("<COMMAND_START>[\\)\\]\\}]+");
 
    curr_lexer->command_arg_paren_count -= yyleng;
@@ -407,8 +407,8 @@
 // incorporated into the argument.
 %}
 
-<COMMAND_START>{S}+ {
-    curr_lexer->lexer_debug ("<COMMAND_START>{S}+");
+<COMMAND_START>{S}* {
+    curr_lexer->lexer_debug ("<COMMAND_START>{S}*");
 
     if (curr_lexer->command_arg_paren_count == 0)
       COMMAND_ARG_FINISH;
@@ -422,8 +422,8 @@
 // Everything else is slurped into the command arguments.
 %}
 
-<COMMAND_START>(\.|[^#% \t\r\n\.\,\;\"\'\(\[\{\}\]\)]+) {
-    curr_lexer->lexer_debug ("<COMMAND_START>(\\.|[^#% \\t\\r\\n\\.\\,\\;\\\"\\'\\(\\[\\{\\}\\]\\)]+)");
+<COMMAND_START>([\.]|[^#% \t\r\n\.\,\;\"\'\(\[\{\}\]\)]*) {
+    curr_lexer->lexer_debug ("<COMMAND_START>([\.]|[^#% \\t\\r\n\\.\\,\\;\\\"\\'\\(\\[\\{\\}\\]\\)]*");
 
     curr_lexer->string_text += yytext;
     curr_lexer->current_input_column += yyleng;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/command.tst	Tue Jan 07 16:07:54 2014 -0500
@@ -0,0 +1,154 @@
+## Don't alter the spacing in the command_test lines.  These are
+## specifically testing for possible differences in things like
+##   A(X) or A( X ) or A (X) or A ( X )
+
+%!function command_test (varargin)
+%!  assignin ('caller', 'cmd_out', ['|', sprintf('%s|', varargin{:})]);
+%!endfunction
+
+%!function gobble_command (varargin)
+%!endfunction
+
+## 0, 1, 2, 3 simple arguments
+%!test
+%! command_test
+%! assert (cmd_out, '|')
+%!test
+%! command_test a
+%! assert (cmd_out, '|a|')
+%!test
+%! command_test aa     b
+%! assert (cmd_out, '|aa|b|')
+%!test
+%! command_test aaa  bb    c
+%! assert (cmd_out, '|aaa|bb|c|')
+
+## continuation
+%!test
+%! command_test a...
+%!  bb ccc
+%! assert (cmd_out, '|a|bb|ccc|')
+%!test
+%! command_test a ...
+%!  bb ccc
+%! assert (cmd_out, '|a|bb|ccc|')
+%!test
+%! command_test aa(...
+%!  bb cc
+%! assert (cmd_out, '|aa(|bb|cc|')
+%!test
+%! command_test aa(   ...
+%!  bb cc
+%! assert (cmd_out, '|aa(   |bb|cc|')
+
+## comments
+%!test
+%! command_test aa bb cc%comment
+%! assert (cmd_out, '|aa|bb|cc|')
+%!test
+%! command_test aa bb cc#comment
+%! assert (cmd_out, '|aa|bb|cc|')
+%!test
+%! command_test aa bb cc   %comment
+%! assert (cmd_out, '|aa|bb|cc|')
+%!test
+%! command_test aa bb cc   #comment
+%! assert (cmd_out, '|aa|bb|cc|')
+%!test
+%! command_test aa bb cc(  %comment
+%! assert (cmd_out, '|aa|bb|cc(  |')
+%!test
+%! command_test aa bb cc(  #comment
+%! assert (cmd_out, '|aa|bb|cc(  |')
+
+## semicolons and commas; multiple commands
+%!test
+%! command_test aa bb, gobble_command cc
+%! assert (cmd_out, '|aa|bb|')
+%!test
+%! command_test aa bb ; gobble_command cc
+%! assert (cmd_out, '|aa|bb|')
+%!test
+%! command_test aa bb ; command_test cc dd
+%! assert (cmd_out, '|cc|dd|')
+%!test
+%! command_test aa bb
+%!test
+%! command_test cc dd
+%! assert (cmd_out, '|cc|dd|')
+
+## parenthesis matching
+%!test
+%! command_test aa(bb,cc,dd) ee(ff,gg) hh
+%! assert (cmd_out, '|aa(bb,cc,dd)|ee(ff,gg)|hh|')
+%!test
+%! command_test aa([bb,cc)]
+%! assert (cmd_out, '|aa([bb,cc)]|')
+%!test
+%! command_test aa(,@!$@"bb"'cc'
+%! assert (cmd_out, '|aa(,@!$@"bb"''cc''|')
+%!test
+%! command_test aa(bb,cc,dd)
+%! assert (cmd_out, '|aa(bb,cc,dd)|')
+%!test
+%! command_test aa( bb,cc,dd )
+%! assert (cmd_out, '|aa( bb,cc,dd )|')
+%!test
+%! command_test aa (bb,cc,dd)
+%! assert (cmd_out, '|aa|(bb,cc,dd)|')
+%!test
+%! command_test aa ( bb,cc,dd )
+%! assert (cmd_out, '|aa|( bb,cc,dd )|')
+%!test
+%! command_test aa(bb, cc, dd)
+%! assert (cmd_out, '|aa(bb, cc, dd)|')
+%!test
+%! command_test aa( bb, cc, dd )
+%! assert (cmd_out, '|aa( bb, cc, dd )|')
+%!test
+%! command_test aa (bb, cc, dd)
+%! assert (cmd_out, '|aa|(bb, cc, dd)|')
+%!test
+%! command_test aa ( bb, cc, dd )
+%! assert (cmd_out, '|aa|( bb, cc, dd )|')
+
+## single and double quotes
+%!test
+%! command_test "aa" 'bb' cc
+%! assert (cmd_out, '|aa|bb|cc|')
+%!test
+%! command_test "aa"'bb'cc
+%! assert (cmd_out, '|aabbcc|')
+%!test
+%! command_test aa'bb'"cc"
+%! assert (cmd_out, '|aabbcc|')
+%!test
+%! command_test "aa"bb'cc'
+%! assert (cmd_out, '|aabbcc|')
+
+## CVX-inspired
+%!test
+%! command_test Z(n,n) hermitian toeplitz
+%! assert (cmd_out, '|Z(n,n)|hermitian|toeplitz|')
+%!test
+%! command_test X( n, n ) symmetric
+%! assert (cmd_out, '|X( n, n )|symmetric|')
+%!test
+%! command_test xw( nm-1, nv );
+%! assert (cmd_out, '|xw( nm-1, nv )|')
+%!test
+%! command_test x( sx ) y( sx ) z( sx )
+%! assert (cmd_out, '|x( sx )|y( sx )|z( sx )|')
+%!test
+%! command_test coeffs(deg+1) complex;
+%! assert (cmd_out, '|coeffs(deg+1)|complex|')
+%!test
+%! command_test w( 1, npairs * nv ) v( 1, npairs * nv )
+%! assert (cmd_out, '|w( 1, npairs * nv )|v( 1, npairs * nv )|')
+%!test
+%! command_test w(m,1)   % edge weights
+%! assert (cmd_out, '|w(m,1)|')
+%!test
+%! command_test x2( size( x ) )
+%! assert (cmd_out, '|x2( size( x ) )|')
+