## Copyright (C) 2013 David Turner
##
## 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
## .
## -*- texinfo -*-
## @deftypefn {Function File} {} clearvars (@var{varargin})
## Clear the listed variables from memory
## @end deftypefn
## Author: David Turner
function clearvars (varargin)
count = 0;
global_mode = false;
except_mode = false;
regexp_mode = false;
# parse argument list
for arg = 1:nargin
curr_arg = varargin{arg};
if strcmp(curr_arg, "-global")
global_mode = true;
continue;
endif
if strcmp(curr_arg, "-except")
except_mode = true;
regexp_mode = false;
continue;
endif
if strcmp(curr_arg, "-regexp")
regexp_mode = true;
continue;
endif
count += 1;
vars(count).global = global_mode;
vars(count).except = except_mode;
vars(count).regexp = regexp_mode;
vars(count).var_name = curr_arg;
# cannot preserve "ans" (bug 53359)
if except_mode && isequal(curr_arg,"ans")
error("The -except option is incompatible with variable name 'ans'.");
end
endfor
# do we need a wildcard?
if count == 0 || all([vars.except])
count += 1;
vars(count).global = global_mode;
vars(count).except = false;
vars(count).regexp = false;
vars(count).var_name = '*';
endif
# expand regular expressions
for c = 1:count
if vars(c).global == false
eval_str = 'who(';
else
eval_str = 'who("global",';
endif
if vars(c).regexp
eval_str = [eval_str '"-regexp",'];
endif
eval_str = [eval_str "'" vars(c).var_name "')"];
# replace with cell array of matching strings
vars(c).var_name = evalin('caller',eval_str);
endfor
# clear variables one by one (brute force, probably not worth optimizing)
for c1 = find([vars.except] == false)
for v1 = 1:numel(vars(c1).var_name)
# look for a match between the clear and except variables
match = false;
for c2 = find([vars.except] == true)
for v2 = 1:numel(vars(c2).var_name)
match |= isequal(vars(c1).var_name{v1},vars(c2).var_name{v2});
endfor
endfor
# no match found, therefore we clear the variable
if match == false
if vars(c).global == false
eval_str = ['clear ' vars(c1).var_name{v1}];
else
eval_str = ['clear -global ' vars(c1).var_name{v1}];
endif
evalin("caller",eval_str);
endif
endfor
endfor
# clear corrupted "ans" variable
evalin("caller","clear ans");
endfunction