You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.1 KiB
174 lines
5.1 KiB
%RUNSCRIPT Run an M-file in interactive fashion
|
|
%
|
|
% RUNSCRIPT(FNAME, OPTIONS) runs the M-file FNAME and pauses after every
|
|
% executable line in the file until a key is pressed. Comment lines are shown
|
|
% without any delay between lines.
|
|
%
|
|
% Options::
|
|
% 'delay',D Don't wait for keypress, just delay of D seconds (default 0)
|
|
% 'cdelay',D Pause of D seconds after each comment line (default 0)
|
|
% 'begin' Start executing the file after the commnent line %%begin (default true)
|
|
% 'dock' Cause the figures to be docked when created
|
|
% 'path',P Look for the file FNAME in the folder P (default .)
|
|
%
|
|
% Notes::
|
|
% - If not file extension is given in FNAME, .m is assumed.
|
|
% - If the executable statement has comments immediately afterward (no blank lines)
|
|
% then the pause occurs after those comments are displayed.
|
|
% - A simple '-' prompt indicates when the script is paused, hit enter.
|
|
%
|
|
% See also eval.
|
|
|
|
% Copyright (C) 1993-2013, by Peter I. Corke
|
|
%
|
|
% This file is part of The Robotics Toolbox for Matlab (RTB).
|
|
%
|
|
% RTB is free software: you can redistribute it and/or modify
|
|
% it under the terms of the GNU Lesser General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
%
|
|
% RTB 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 Lesser General Public License for more details.
|
|
%
|
|
% You should have received a copy of the GNU Leser General Public License
|
|
% along with RTB. If not, see <http://www.gnu.org/licenses/>.
|
|
%
|
|
% http://www.petercorke.com
|
|
|
|
function runscript(fname, varargin)
|
|
|
|
opt.path = [];
|
|
opt.delay = [];
|
|
opt.begin = true;
|
|
opt.cdelay = 0;
|
|
opt.dock = false;
|
|
|
|
opt = tb_optparse(opt, varargin);
|
|
|
|
close all
|
|
|
|
if opt.dock
|
|
prevDockStatus = get(0,'DefaultFigureWindowStyle');
|
|
set(0,'DefaultFigureWindowStyle','docked');
|
|
end
|
|
|
|
|
|
if ~isempty(opt.path)
|
|
fname = fullfile(opt.path, [fname '.m']);
|
|
else
|
|
fname = [fname '.m'];
|
|
end
|
|
|
|
fp = fopen(fname, 'r');
|
|
|
|
clc
|
|
fprintf('--- runscript <-- %s\n', fname);
|
|
|
|
running = false;
|
|
shouldPause = false;
|
|
loopText = [];
|
|
if ~opt.begin
|
|
running = true;
|
|
end
|
|
|
|
while 1
|
|
% get the next line from the file, bail if EOF
|
|
line = fgetl(fp);
|
|
if line == -1
|
|
break
|
|
end
|
|
|
|
% logic to skip lines until we see one beginning with %%begin
|
|
if ~running
|
|
if strcmp(line, '%%begin')
|
|
running = true;
|
|
end
|
|
continue;
|
|
end;
|
|
|
|
|
|
% display the line and if executable execute it
|
|
if length(strtrim(line)) == 0
|
|
% line was blank
|
|
fprintf(' \n');
|
|
if shouldPause
|
|
scriptwait(opt);
|
|
shouldPause = false;
|
|
end
|
|
elseif strfind1(strtrim(line), '%')
|
|
% line was a comment
|
|
disp(line)
|
|
pause(opt.cdelay)
|
|
|
|
else
|
|
% line is executable
|
|
if shouldPause
|
|
scriptwait(opt);
|
|
|
|
shouldPause = false;
|
|
end
|
|
|
|
% if the start of a loop, stash the text for now
|
|
if strfind1(line, 'for') || strfind1(line, 'while')
|
|
% found a loop, don't eval it until we get to the end
|
|
loopText = strcat(loopText, [line ';']);
|
|
% display the line with a pretend MATLAB prompt
|
|
fprintf('>> '); disp(line)
|
|
continue;
|
|
end
|
|
|
|
if ~isempty(loopText)
|
|
% we're in stashing mode
|
|
loopText = strcat(loopText, line);
|
|
% display the line with a pretend MATLAB prompt
|
|
disp(line);
|
|
|
|
% if the end of a loop, unstash the text and eval it
|
|
if strfind1(line, 'end') && ~isempty(loopText)
|
|
loopText
|
|
evalin('base', loopText);
|
|
shouldPause = true;
|
|
loopText = [];
|
|
continue;
|
|
end
|
|
else
|
|
% display the line with a pretend MATLAB prompt
|
|
fprintf('>> '); disp(line)
|
|
evalin('base', line);
|
|
shouldPause = true;
|
|
end
|
|
end
|
|
end
|
|
fprintf('------ done --------\n');
|
|
if opt.dock
|
|
% restore the docking mode if we set it
|
|
set(0,'DefaultFigureWindowStyle', prevDockStatus)
|
|
end
|
|
end
|
|
|
|
function scriptwait(opt)
|
|
if isempty(opt.delay)
|
|
%a = input('-', 's');
|
|
prompt = 'continue?';
|
|
fprintf(prompt); pause;
|
|
for i=1:length(prompt)
|
|
fprintf('\b');
|
|
end
|
|
else
|
|
pause(opt.delay);
|
|
end
|
|
end
|
|
|
|
% test if s2 is at the start of s1
|
|
function res = strfind1(s1, s2)
|
|
|
|
r = strfind(s1, s2);
|
|
res = false;
|
|
if ~isempty(r) && (r(1) == 1)
|
|
res = true;
|
|
end
|
|
end
|
|
|