# HG changeset patch # User Rik # Date 1544997234 28800 # Node ID 86217421a37f86e65e99ddfecaa19405af560cd4 # Parent 7adb62e4cc39493309849380f899a2fc2cf3c3eb __parse_movargs__.m: Accept dimension and nanflag arguments. * __parse_movargs__.m: Rewrite to accept both dimension and nanflag arguments as both may be present simultaneously. Create a new first argument to the function, caller, which is a string used in error messages so that the correct function is identified as the source of the error. Add BIST tests for function. * movmin.m: Call __parse_movargs__ with first argument of "movmin". diff -r 7adb62e4cc39 -r 86217421a37f scripts/signal/__parse_movargs__.m --- a/scripts/signal/__parse_movargs__.m Sun Dec 16 12:48:00 2018 -0800 +++ b/scripts/signal/__parse_movargs__.m Sun Dec 16 13:53:54 2018 -0800 @@ -27,22 +27,73 @@ ## @seealso{movfun} ## @end deftypefn -function args = __parse_movargs__ (varargin) +function args = __parse_movargs__ (caller, varargin) + + args = {}; - if (isscalar (varargin)) - ## Either DIM or NANCOND - if (ischar (varargin{1})) - args = {"nancond", varargin{1}}; + have_dim = have_nancond = false; + imax = numel (varargin); + i = 1; + while (i <= imax) + arg = varargin{i}; + if (ischar (arg)) + if (any (strcmpi (arg, {"omitnan", "includenan"}))) + args(end+(1:2)) = {"nancond", arg}; + have_nancond = true; + else + i += 1; # Prop/Val pair + if (i > imax) + error ([caller ": property '%s' missing value argument"], arg); + endif + args(end+(1:2)) = {arg, varargin{i}}; + endif + elseif (isnumeric (arg)) + args(end+(1:2)) = {"dim", arg}; + have_dim = true; else - args = {"dim", varargin{1}}; + error ("Octave:invalid-input-arg", + [caller ": invalid input at position %d"], i); + args(end+1) = arg; endif - else - ## Name,Value pairs - args = varargin; - endif + + i += 1; # Advance to next element + if (have_nancond && have_dim) + args = [args, varargin(i:end)]; + break; + endif + endwhile endfunction -## No tests needed for internal function -%!assert (1) +%!test +%! caller = "tstblock"; +%! vararg = {5}; +%! assert (__parse_movargs__ (caller, vararg{:}), {"dim", 5}); +%! vararg = {"Endpoints", "shrink", 3}; +%! assert (__parse_movargs__ (caller, vararg{:}), +%! {"Endpoints", "shrink", "dim", 3}); +%! vararg = {"includenan", 2}; +%! assert (__parse_movargs__ (caller, vararg{:}), +%! {"nancond", "includenan", "dim", 2}); + +%!test +%! caller = "tstblock"; +%! vararg = {"INCLUDENAN"}; +%! assert (__parse_movargs__ (caller, vararg{:}), {"nancond", "INCLUDENAN"}); +%! vararg = {"Endpoints", "fill", "OMITNAN"}; +%! assert (__parse_movargs__ (caller, vararg{:}), +%! {"Endpoints", "fill", "nancond", "OMITNAN"}); +%! vararg = {2, "includenan"}; +%! assert (__parse_movargs__ (caller, vararg{:}), +%! {"dim", 2, "nancond", "includenan"}); + +%!test +%! caller = "tstblock"; +%! vararg = {}; +%! assert (__parse_movargs__ (caller, vararg{:}), {}); +%! vararg = {"Endpoints", "fill"}; +%! assert (__parse_movargs__ (caller, vararg{:}), {"Endpoints", "fill"}); +%! vararg = {5, "omitnan", "Endpoints", "fill"}; +%! assert (__parse_movargs__ (caller, vararg{:}), +%! {"dim", 5, "nancond", "omitnan", "Endpoints", "fill"}); diff -r 7adb62e4cc39 -r 86217421a37f scripts/statistics/movmin.m --- a/scripts/statistics/movmin.m Sun Dec 16 12:48:00 2018 -0800 +++ b/scripts/statistics/movmin.m Sun Dec 16 13:53:54 2018 -0800 @@ -33,7 +33,7 @@ ## @end deftypefn function y = movmin (x, wlen, varargin) - y = movfun (@min, x, wlen, __parse_movargs__ (varargin{:}){:}); + y = movfun (@min, x, wlen, __parse_movargs__ ("movmin", varargin{:}){:}); endfunction