# HG changeset patch # User Jaroslav Hajek # Date 1258724773 -3600 # Node ID 87fd803c583bc3891b397694049d2d2ed3258638 # Parent 6867676107f3a5de9f8abfa505a682af1e9abdcd rewrite getfield and setfield diff -r 6867676107f3 -r 87fd803c583b scripts/ChangeLog --- a/scripts/ChangeLog Fri Nov 20 14:43:38 2009 +0100 +++ b/scripts/ChangeLog Fri Nov 20 14:46:13 2009 +0100 @@ -1,3 +1,9 @@ +2009-11-20 Jaroslav Hajek + + * script/miscellaneous/getfield: Deblank field names, gripe on invalid + index. + * script/miscellaneous/setfield: Rewrite using subsasgn. + 2009-11-22 Michael Goffioul * plot/print.m: Properly set the default ghostscript_binary diff -r 6867676107f3 -r 87fd803c583b scripts/miscellaneous/getfield.m --- a/scripts/miscellaneous/getfield.m Fri Nov 20 14:43:38 2009 +0100 +++ b/scripts/miscellaneous/getfield.m Fri Nov 20 14:46:13 2009 +0100 @@ -1,4 +1,5 @@ ## Copyright (C) 2000, 2006, 2007, 2009 Etienne Grossmann +## Copyright (C) 2009 VZLU Prague ## ## This file is part of Octave. ## @@ -42,17 +43,19 @@ ## Author: Etienne Grossmann -function s = getfield (s, varargin) - - for idx = 1:nargin-1 - i = varargin{idx}; - if (iscell (i)) - s = s(i{:}); - else - s = s.(i); - endif - endfor - +function obj = getfield (s, varargin) + if (nargin < 2) + print_usage (); + endif + subs = varargin; + flds = cellfun (@ischar, subs); + idxs = cellfun (@iscell, subs); + if (all (flds | idxs)) + typs = merge (flds, {"."}, {"()"}); + obj = subsref (s, struct ("type", typs, "subs", subs)); + else + error ("getfield: invalid index"); + endif endfunction %!test diff -r 6867676107f3 -r 87fd803c583b scripts/miscellaneous/setfield.m --- a/scripts/miscellaneous/setfield.m Fri Nov 20 14:43:38 2009 +0100 +++ b/scripts/miscellaneous/setfield.m Fri Nov 20 14:46:13 2009 +0100 @@ -1,4 +1,5 @@ ## Copyright (C) 2000, 2006, 2007, 2009 Etienne Grossmann +## Copyright (C) 2009 VZLU Prague ## ## This file is part of Octave. ## @@ -43,22 +44,19 @@ ## Author: Etienne Grossmann function obj = setfield (obj, varargin) - field = "obj"; - for i = 1:nargin-2 - v = varargin{i}; - if (iscell (v)) - sep = "("; - for j = 1:length (v) - field = sprintf ("%s%s%s", field, sep, num2str (v{j})); - sep = ","; - endfor - field = sprintf ("%s)", field); - else - field = sprintf ("%s.%s", field, v); - endif - endfor - val = varargin{nargin-1}; - eval (sprintf ("%s=val;", field)); + if (nargin < 3) + print_usage (); + endif + subs = varargin(1:end-1); + rhs = varargin{end}; + flds = cellfun (@ischar, subs); + idxs = cellfun (@iscell, subs); + if (all (flds | idxs)) + typs = merge (flds, {"."}, {"()"}); + obj = subsasgn (obj, struct ("type", typs, "subs", subs), rhs); + else + error ("setfield: invalid index"); + endif endfunction %!test