function [varargout] = parseArgs(pnames,dflts,varargin) %parseArgs Process parameter name/value pairs for dataset arrays % [A,B,...] = parseArgs(PNAMES,DFLTS,'NAME1',VAL1,'NAME2',VAL2,...) % [A,B,...,SETFLAG] = parseArgs(...) % [A,B,...,SETFLAG,EXTRA] = parseArgs(...) % Copyright 2012 The MathWorks, Inc. % Initialize some variables nparams = length(pnames); varargout = dflts; setflag = false(1,nparams); unrecog = {}; nargs = length(varargin); dosetflag = nargout>nparams; dounrecog = nargout>(nparams+1); % Must have name/value pairs if mod(nargs,2)~=0 m = message('stats:dataset:parseArgs:WrongNumberArgs'); throwAsCaller(MException(m.Identifier, '%s', getString(m))); end % Process name/value pairs for j=1:2:nargs pname = varargin{j}; if ~ischar(pname) m = message('stats:dataset:parseArgs:IllegalParamName'); throwAsCaller(MException(m.Identifier, '%s', getString(m))); end mask = strncmpi(pname,pnames,length(pname)); % look for partial match if ~any(mask) if dounrecog % if they've asked to get back unrecognized names/values, add this % one to the list unrecog((end+1):(end+2)) = {varargin{j} varargin{j+1}}; continue else % otherwise, it's an error m = message('stats:dataset:parseArgs:BadParamName',pname); throwAsCaller(MException(m.Identifier, '%s', getString(m))); end elseif sum(mask)>1 mask = strcmpi(pname,pnames); % use exact match to resolve ambiguity if sum(mask)~=1 m = message('stats:dataset:parseArgs:AmbiguousParamName',pname); throwAsCaller(MException(m.Identifier, '%s', getString(m))); end end varargout{mask} = varargin{j+1}; setflag(mask) = true; end % Return extra stuff if requested if dosetflag setflag = cell2struct(num2cell(setflag),pnames,2); varargout{nparams+1} = setflag; if dounrecog varargout{nparams+2} = unrecog; end end