# HG changeset patch # User John W. Eaton # Date 1389128874 18000 # Node ID 8f256148d82b82e6ab9a401dea24b8982f74c9a2 # Parent 3cad99b56fa7015b83e128c7477f6e2c3ce67759# Parent e42d4f1527660a8153cb44fc64bff5fddb42dcc7 maint: Periodic merge of gui-release to default. diff -r 3cad99b56fa7 -r 8f256148d82b libgui/src/m-editor/file-editor-tab.cc --- 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); diff -r 3cad99b56fa7 -r 8f256148d82b libgui/src/m-editor/file-editor-tab.h --- 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 ()); diff -r 3cad99b56fa7 -r 8f256148d82b libgui/src/qtinfo/webinfo.cc --- 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); diff -r 3cad99b56fa7 -r 8f256148d82b libinterp/corefcn/debug.cc --- 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 (); diff -r 3cad99b56fa7 -r 8f256148d82b libinterp/parse-tree/lex.ll --- 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 @@ %} ({CCHAR}[^\r\n]*)?{NL} { - curr_lexer->lexer_debug ("({CCHAR}[^\\r\\n]*)?{NL}"); + curr_lexer->lexer_debug ("({CCHAR}[^\\r\\n])?{NL}"); COMMAND_ARG_FINISH; @@ -339,7 +339,7 @@ } [\,\;] { - curr_lexer->lexer_debug( "[\\,\\;]" ); + curr_lexer->lexer_debug ("[\\,\\;]"); if (yytext[0] != ',' || curr_lexer->command_arg_paren_count == 0) { @@ -361,7 +361,7 @@ // be slurped into that argument as well. %} -[\(\[\{]+ { +[\(\[\{]* { curr_lexer->lexer_debug ("[\\(\\[\\{]+"); curr_lexer->command_arg_paren_count += yyleng; @@ -369,7 +369,7 @@ curr_lexer->current_input_column += yyleng; } -[\)\]\}]+ { +[\)\]\}]* { curr_lexer->lexer_debug ("[\\)\\]\\}]+"); curr_lexer->command_arg_paren_count -= yyleng; @@ -407,8 +407,8 @@ // incorporated into the argument. %} -{S}+ { - curr_lexer->lexer_debug ("{S}+"); +{S}* { + curr_lexer->lexer_debug ("{S}*"); if (curr_lexer->command_arg_paren_count == 0) COMMAND_ARG_FINISH; @@ -422,8 +422,8 @@ // Everything else is slurped into the command arguments. %} -(\.|[^#% \t\r\n\.\,\;\"\'\(\[\{\}\]\)]+) { - curr_lexer->lexer_debug ("(\\.|[^#% \\t\\r\\n\\.\\,\\;\\\"\\'\\(\\[\\{\\}\\]\\)]+)"); +([\.]|[^#% \t\r\n\.\,\;\"\'\(\[\{\}\]\)]*) { + curr_lexer->lexer_debug ("([\.]|[^#% \\t\\r\n\\.\\,\\;\\\"\\'\\(\\[\\{\\}\\]\\)]*"); curr_lexer->string_text += yytext; curr_lexer->current_input_column += yyleng; diff -r 3cad99b56fa7 -r 8f256148d82b test/command.tst --- /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 ) )|') +