# HG changeset patch # User dbateman # Date 1190833133 0 # Node ID 1401a79af68c3cb9f77185e8ba5606f1b13d28c2 # Parent be176b7e110aa72bf8b21f1a09c7381582ffa606 [project @ 2007-09-26 18:58:52 by dbateman] diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,31 @@ +2007-09-26 David Bateman + + * pkg/pkg.m: Add second argument to setting for prefix for + architecture dependent files. Use throughout. + (pkg:issuperuser): New function, use through to check for + root user. + (pkg:getarchprefix): function to give the archiecture dependent + prefix for a package. + (pkg:getarchdir): New function giving location of architetcure + dependent directory. Use through out. + (pkg:install): Treat architecture dependent directory separately + as in might not be a sub-directory of the package directory. + (pkg:uninstall): ditto. + (pkg:create_pkgadddel): Check for global or local install for + architecture dependent directory. + (pkg:finish_installation): ditto. + (pkg:write_INDEX): ditto. + (pkg:load_packages_and_dependencies): ditto. + (pkg:copy_files): ditto. Add step to copy architecture dependent + files to a new location if user is root. + (pkg:rm_rf): Check if file or directory exists before removing. + (pkg:dirempty): Check if directory exists before checking. + + * plot/___patch__.m: Allow face colors to be passed as strings + + * plot/__plt_get_axis_arg__.m: Treat case of empty "varargin" + needed for calls to "hold" without an argument. + 2007-09-21 John W. Eaton * optimization/sqp.m: Fix typo. diff --git a/scripts/pkg/pkg.m b/scripts/pkg/pkg.m --- a/scripts/pkg/pkg.m +++ b/scripts/pkg/pkg.m @@ -116,6 +116,13 @@ ## @example ## p = pkg prefix ## @end example +## +## The location in which to install the architecture dependent files can be +## independent specified with an addition argument. For example +## +## @example +## pkg prefix ~/my_octave_packages ~/my_octave_packages_for_my_pc +## @end example ## @item local_list ## Set the file in which to look for information on the locally ## installed packages. Locally installed packages are those that are @@ -173,24 +180,24 @@ ## Installation prefix (XXX: what should these be on windows?) persistent user_prefix = false; persistent prefix = -1; + persistent archprefix = -1; persistent local_list = tilde_expand (fullfile("~", ".octave_packages")); persistent global_list = fullfile (OCTAVE_HOME (), "share", "octave", "octave_packages"); mlock (); - if (ispc () && ! isunix ()) - global_install = 1; - else - global_install = (geteuid() == 0); - endif + global_install = issuperuser (); if (prefix == -1) if (global_install) prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages"); + archprefix = fullfile (OCTAVE_HOME (), "libexec", "octave", "packages"); else prefix = fullfile ("~", "octave"); + archprefix = prefix; endif prefix = tilde_expand (prefix); + archprefix = tilde_expand (archprefix); endif ## Handle input @@ -222,9 +229,9 @@ if (! user_prefix) prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages"); endif - case {"list", "install", "uninstall", "load", "unload", ... - "prefix", "local_list", "global_list", "rebuild", "build"} - if (strcmp (action,"none")) + case {"list", "install", "uninstall", "load", "unload", "prefix", ... + "local_list", "global_list", "rebuild", "build"} + if (strcmp (action, "none")) action = varargin{i}; else error ("more than one action specified"); @@ -252,7 +259,7 @@ if (length (files) == 0) error ("you must specify at least one filename when calling 'pkg install'"); endif - install (files, deps, auto, prefix, verbose, local_list, + install (files, deps, auto, prefix, archprefix, verbose, local_list, global_list, global_install); case "uninstall" @@ -276,17 +283,27 @@ case "prefix" if (length (files) == 0 && nargout == 0) - disp (prefix); - elseif (length (files) == 0 && nargout == 1) + printf ("Installation prefix: %s\n", prefix); + printf ("Architecture dependent prefix: %s\n", archprefix); + elseif (length (files) == 0 && nargout >= 1) local_packages = prefix; - elseif (length (files) == 1 && nargout <= 1 && ischar (files{1})) + global_packages = archprefix; + elseif (length (files) >= 1 && nargout <= 2 && ischar (files{1})) prefix = files{1}; - ## if (!strcmp(prefix(end), filesep)) - ## prefix(end+1) = filesep; - ## endif prefix = absolute_pathname (prefix); local_packages = prefix; user_prefix = true; + if (length (files) >= 2 && ischar (files{2})) + archprefix = files{2}; + try + archprefix = absolute_pathname (archprefix); + catch + mkdir (archprefix); + warning ("creating the directory %s\n", archprefix); + archprefix = absolute_pathname (archprefix); + end_try_catch + global_packages = archprefix; + endif else error ("you must specify a prefix directory, or request an output argument"); endif @@ -327,14 +344,16 @@ case "rebuild" if (global_install) - global_packages = rebuild (prefix, global_list, files, auto, verbose); + global_packages = rebuild (prefix, archprefix, global_list, files, + auto, verbose); global_packages = save_order (global_packages); save (global_list, "global_packages"); if (nargout > 0) local_packages = global_packages; endif else - local_packages = rebuild (prefix, local_list, files, auto, verbose); + local_packages = rebuild (prefix, archprefix, local_list, files, auto, + verbose); local_packages = save_order (local_packages); save (local_list, "local_packages"); if (nargout == 0) @@ -353,7 +372,7 @@ endswitch endfunction -function descriptions = rebuild (prefix, list, files, auto, verbose) +function descriptions = rebuild (prefix, archprefix, list, files, auto, verbose) if (isempty (files)) [dirlist, err, msg] = readdir (prefix); if (err) @@ -380,6 +399,8 @@ if (exist (descfile, "file")) desc = get_description (descfile); desc.dir = fullfile (prefix, dirlist{k}); + desc.archprefix = fullfile (archprefix, strcat (desc.name, "-", + desc.version)); if (auto != 0) if (exist (fullfile (desc.dir, "packinfo", ".autoload"), "file")) unlink (fullfile (desc.dir, "packinfo", ".autoload")); @@ -450,7 +471,7 @@ endif files(1) = []; buildlist = fullfile (builddir, "octave_packages"); - install (files, handle_deps, autoload, installdir, verbose, + install (files, handle_deps, autoload, installdir, installdir, verbose, buildlist, "", false); unwind_protect repackage (builddir, buildlist); @@ -465,7 +486,8 @@ end_unwind_protect endfunction -function install (files, handle_deps, autoload, prefix, verbose, local_list, global_list, global_install) +function install (files, handle_deps, autoload, prefix, archprefix, verbose, + local_list, global_list, global_install) # Check that the directory in prefix exist. If it doesn't: create it! if (! exist (prefix, "dir")) @@ -491,7 +513,6 @@ ## Uncompress the packages and read the DESCRIPTION files tmpdirs = packdirs = descriptions = {}; try - ## Warn about non existent files for i = 1:length (files) if (isempty (glob(files{i}))) @@ -549,12 +570,17 @@ [dummy, nm] = fileparts (tgz); if ((length (nm) >= length (desc.name)) && ! strcmp (desc.name, nm(1:length(desc.name)))) - error ("package name '%s' doesn't correspond to its filename '%s'", desc.name, nm); + error ("package name '%s' doesn't correspond to its filename '%s'", + desc.name, nm); endif ## Set default installation directory desc.dir = fullfile (prefix, strcat (desc.name, "-", desc.version)); + ## Set default architectire dependent installation directory + desc.archprefix = fullfile (archprefix, strcat (desc.name, "-", + desc.version)); + ## Save desc descriptions{end+1} = desc; @@ -656,10 +682,10 @@ for i = 1:length (descriptions) desc = descriptions{i}; pdir = packdirs{i}; - copy_files (desc, pdir); - create_pkgadddel (desc, pdir, "PKG_ADD"); - create_pkgadddel (desc, pdir, "PKG_DEL"); - finish_installation (desc, pdir) + copy_files (desc, pdir, global_install); + create_pkgadddel (desc, pdir, "PKG_ADD", global_install); + create_pkgadddel (desc, pdir, "PKG_DEL", global_install); + finish_installation (desc, pdir, global_install) endfor catch ## Something went wrong, delete tmpdirs @@ -668,6 +694,7 @@ endfor for i = 1:length (descriptions) rm_rf (descriptions{i}.dir); + rm_rf (getarchdir (descriptions{i})); endfor rethrow (lasterror ()); end_try_catch @@ -675,9 +702,11 @@ ## Check if the installed directory is empty. If it is remove it ## from the list for i = length (descriptions):-1:1 - if (dirempty (descriptions{i}.dir, {"packinfo", "doc"})) + if (dirempty (descriptions{i}.dir, {"packinfo", "doc"}) && + dirempty (getarchdir (descriptions{i}))) warning ("package %s is empty\n", descriptions{i}.name); rm_rf (descriptions{i}.dir); + rm_rf (getarchdir (descriptions{i})); descriptions(i) = []; endif endfor @@ -738,7 +767,8 @@ idx (end + 1) = i; endif endfor - load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst); + load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, + global_install); endif endfunction @@ -826,8 +856,8 @@ ## Do the actual deletion if (desc.loaded) rmpath (desc.dir); - if (exist (fullfile (desc.dir, getarch()), "dir")) - rmpath (fullfile (desc.dir, getarch ())); + if (exist (getarchdir (desc))) + rmpath (getarchdir (desc)); endif endif if (exist (desc.dir, "dir")) @@ -835,6 +865,13 @@ if (status != 1) error ("couldn't delete directory %s: %s", desc.dir, msg); endif + [status, msg] = rm_rf (getarchdir (desc)); + if (status != 1) + error ("couldn't delete directory %s: %s", getarchdir (desc), msg); + endif + if (dirempty (desc.archprefix)) + rm_rf (desc.archprefix); + endif else warning ("directory %s previously lost", desc.dir); endif @@ -894,7 +931,8 @@ if (exist (fullfile (pack.name, "inst", "bin"), "dir")) movefile (fullfile (pack.name, "inst", "bin"), pack.name); endif - archdir = fullfile (pack.name, "inst", getarch ()); + archdir = fullfile (pack.archprefix, strcat (pack.name, "-", + pack.version), getarch ()); if (exist (archdir, "dir")) if (exist (fullfile (pack.name, "inst", "PKG_ADD"), "file")) unlink (fullfile (pack.name, "inst", "PKG_ADD")); @@ -922,7 +960,12 @@ endif tfile = strcat (pack.name, "-", pack.version, ".tar"); tar (tfile, pack.name); - + try + gzip (tfile); + unlink (tfile); + catch + warning ("failed to compress %s", tfile); + end_try_catch unwind_protect_cleanup if (exist (pack.name, "dir")) rm_rf (pack.name); @@ -1123,16 +1166,18 @@ endif endfunction -function create_pkgadddel (desc, packdir, nm) +function create_pkgadddel (desc, packdir, nm, global_install) instpkg = fullfile (desc.dir, nm); instfid = fopen (instpkg, "wt"); ## If it is exists, most of the PKG_* file should go into the ## architecture dependent directory so that the autoload/mfilename ## commands work as expected. The only part that doesn't is the ## part in the main directory. - if (exist (fullfile (desc.dir, getarch ()), "dir")) - archpkg = fullfile (desc.dir, getarch (), nm); - archfid = fopen (archpkg, "wt"); + archdir = fullfile (getarchprefix (desc), strcat (desc.name, "-", + desc.version), getarch ()); + if (exist (getarchdir (desc, global_install), "dir")) + archpkg = fullfile (getarchdir (desc, global_install), nm); + archfid = fopen (archpkg, "at"); else archpkg = instpkg; archfid = instfid; @@ -1186,7 +1231,7 @@ endif endfunction -function copy_files (desc, packdir, bindir) +function copy_files (desc, packdir, global_install) ## Create the installation directory if (! exist (desc.dir, "dir")) [status, output] = mkdir (desc.dir); @@ -1196,6 +1241,8 @@ endif endif + octfiledir = getarchdir (desc); + ## Copy the files from "inst" to installdir instdir = fullfile (packdir, "inst"); if (! dirempty (instdir)) @@ -1204,6 +1251,55 @@ rm_rf (desc.dir); error ("couldn't copy files to the installation directory"); endif + if (exist (fullfile (desc.dir, getarch ()), "dir") && + ! strcmp (fullfile (desc.dir, getarch ()), octfiledir)) + if (! exist (octfiledir, "dir")) + ## Can be required to create upto three levels of dirs + octm1 = fileparts (octfiledir); + if (! exist (octm1, "dir")) + octm2 = fileparts (octm1); + if (! exist (octm2, "dir")) + octm3 = fileparts (octm2); + if (! exist (octm3, "dir")) + [status, output] = mkdir (octm3); + if (status != 1) + rm_rf (desc.dir); + error ("couldn't create installation directory %s : %s", + octm3, output); + endif + endif + [status, output] = mkdir (octm2); + if (status != 1) + rm_rf (desc.dir); + error ("couldn't create installation directory %s : %s", + octm2, output); + endif + endif + [status, output] = mkdir (octm1); + if (status != 1) + rm_rf (desc.dir); + error ("couldn't create installation directory %s : %s", + octm1, output); + endif + endif + [status, output] = mkdir (octfiledir); + if (status != 1) + rm_rf (desc.dir); + error ("couldn't create installation directory %s : %s", + octfiledir, output); + endif + endif + [status, output] = movefile (fullfile (desc.dir, getarch (), "*"), + octfiledir); + rm_rf (fullfile (desc.dir, getarch ())); + + if (status != 1) + rm_rf (desc.dir); + rm_rf (octfiledir); + error ("couldn't copy files to the installation directory"); + endif + endif + endif ## Create the "packinfo" directory @@ -1211,21 +1307,24 @@ [status, msg] = mkdir (packinfo); if (status != 1) rm_rf (desc.dir); + rm_rf (octfiledir); error ("couldn't create packinfo directory: %s", msg); endif ## Copy DESCRIPTION [status, output] = copyfile (fullfile (packdir, "DESCRIPTION"), packinfo); if (status != 1) - rm_rf (desc.dir); - error ("couldn't copy DESCRIPTION: %s", output); + rm_rf (desc.dir); + rm_rf (octfiledir); + error ("couldn't copy DESCRIPTION: %s", output); endif ## Copy COPYING [status, output] = copyfile (fullfile (packdir, "COPYING"), packinfo); if (status != 1) - rm_rf (desc.dir); - error ("couldn't copy COPYING: %s", output); + rm_rf (desc.dir); + rm_rf (octfiledir); + error ("couldn't copy COPYING: %s", output); endif ## If the file ChangeLog exists, copy it @@ -1234,6 +1333,7 @@ [status, output] = copyfile (fChangeLog, packinfo); if (status != 1) rm_rf (desc.dir); + rm_rf (octfiledir); error ("couldn't copy ChangeLog file: %s", output); endif endif @@ -1244,14 +1344,16 @@ [status, output] = copyfile (fINDEX, packinfo); if (status != 1) rm_rf (desc.dir); + rm_rf (octfiledir); error ("couldn't copy INDEX file: %s", output); endif else try write_INDEX (desc, fullfile (packdir, "inst"), - fullfile (packinfo, "INDEX")); + fullfile (packinfo, "INDEX"), global_install); catch rm_rf (desc.dir); + rm_rf (octfiledir); rethrow (lasterror ()); end_try_catch endif @@ -1262,6 +1364,7 @@ [status, output] = copyfile (fon_uninstall, packinfo); if (status != 1) rm_rf (desc.dir); + rm_rf (octfiledir); error ("couldn't copy on_uninstall.m: %s", output); endif endif @@ -1269,17 +1372,17 @@ ## Is there a doc/ directory that needs to be installed docdir = fullfile (packdir, "doc"); if (exist (docdir, "dir") && ! dirempty (docdir)) - [status, output] = copyfile (docdir, desc.dir); + [status, output] = copyfile (docdir, desc.dir); endif ## Is there a bin/ directory that needs to be installed bindir = fullfile (packdir, "bin"); if (exist (bindir, "dir") && ! dirempty (bindir)) - [status, output] = copyfile (bindir, desc.dir); + [status, output] = copyfile (bindir, desc.dir); endif endfunction -function finish_installation (desc, packdir) +function finish_installation (desc, packdir, global_install) ## Is there a post-install to call? if (exist (fullfile (packdir, "post_install.m"), "file")) wd = pwd (); @@ -1290,6 +1393,7 @@ catch cd (wd); rm_rf (desc.dir); + rm_rf (getarchdir (desc), global_install); rethrow (lasterror ()); end_try_catch endif @@ -1470,7 +1574,7 @@ ## 'desc' describes the package. ## 'dir' is the 'inst' direcotyr in temporary directory. ## 'INDEX' is the name (including path) of resulting INDEX file. -function write_INDEX (desc, dir, INDEX) +function write_INDEX (desc, dir, INDEX, global_install) ## Get names of functions in dir [files, err, msg] = readdir (dir); if (err) @@ -1478,8 +1582,7 @@ endif ## Check for architecture dependent files - arch = getarch(); - tmpdir = fullfile (dir, arch); + tmpdir = getarchdir (desc); if (exist (tmpdir, "dir")) [files2, err, msg] = readdir (tmpdir); if (err) @@ -1718,7 +1821,7 @@ endif ## Load the packages, but take care of the ordering of dependencies - load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst); + load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, true); endfunction function unload_packages (files, handle_deps, local_list, global_list) @@ -1739,35 +1842,36 @@ ## unload all if (length (files) == 1 && strcmp (files{1}, "all")) dirs = pdirs; + desc = installed_pkgs_lst; ## unload package_name1 ... else dirs = {}; + desc = {}; for i = 1:length (files) - idx = strcmp (pnames, files{i}); + idx = strcmp (pnames, files {i}); if (! any (idx)) error ("package %s is not installed", files{i}); endif - dirs{end+1} = pdirs{idx}; + dirs {end + 1} = pdirs {idx}; + desc {end + 1} = installed_pkgs_lst {idx}; endfor endif ## Check for architecture dependent directories - arch = getarch(); archdirs = {}; for i = 1:length (dirs) - tmpdir = fullfile (dirs{i}, arch); + tmpdir = getarchdir (desc {i}); if (exist (tmpdir, "dir")) archdirs{end + 1} = dirs{i}; archdirs{end + 1} = tmpdir; + else + archdirs{end+ 1} = dirs {i}; endif endfor - if (length (archdirs) > 0) - dirs = archdirs; - endif ## Unload the packages - for i = 1:length (dirs) - d = dirs{i}; + for i = 1:length (archdirs) + d = archdirs{i}; idx = strcmp (p, d); if (any (idx)) rmpath (d); @@ -1777,13 +1881,18 @@ endfunction function [status_out, msg_out] = rm_rf (dir) - crr = confirm_recursive_rmdir (); - unwind_protect - confirm_recursive_rmdir (false); - [status, msg] = rmdir (dir, "s"); - unwind_protect_cleanup - confirm_recursive_rmdir (crr); - end_unwind_protect + if (exist (dir)) + crr = confirm_recursive_rmdir (); + unwind_protect + confirm_recursive_rmdir (false); + [status, msg] = rmdir (dir, "s"); + unwind_protect_cleanup + confirm_recursive_rmdir (crr); + end_unwind_protect + else + status = 1; + msg = ""; + endif if (nargout > 0) status_out = status; endif @@ -1793,26 +1902,30 @@ endfunction function emp = dirempty (nm, ign) - if (nargin < 2) - ign = {".", ".."}; - else - ign = [{".", ".."}, ign]; - endif - l = dir (nm); - for i = 1:length (l) - found = false; - for j = 1:length (ign) - if (strcmp (l(i).name, ign{j})) - found = true; - break; + if (exist (nm, "dir")) + if (nargin < 2) + ign = {".", ".."}; + else + ign = [{".", ".."}, ign]; + endif + l = dir (nm); + for i = 1:length (l) + found = false; + for j = 1:length (ign) + if (strcmp (l(i).name, ign{j})) + found = true; + break; + endif + endfor + if (! found) + emp = false; + return endif endfor - if (! found) - emp = false; - return - endif - endfor - emp = true; + emp = true; + else + emp = true; + endif endfunction function arch = getarch () @@ -1821,6 +1934,27 @@ arch = _arch; endfunction +function archprefix = getarchprefix (desc, global_install) + if ((nargin == 2 && global_install) || (nargin < 2 && issuperuser ())) + archprefix = fullfile (octave_config_info ("libexecdir"), "octave", + "packages", strcat(desc.name, "-", desc.version)); + else + archprefix = desc.dir; + endif +endfunction + +function archdir = getarchdir (desc) + archdir = fullfile (desc.archprefix, getarch()); +endfunction + +function s = issuperuser () + if ((ispc () && ! isunix ()) || (geteuid() == 0)) + s = true; + else + s = false; + endif +endfunction + function [status, output] = shell (cmd) persistent have_sh; @@ -1879,9 +2013,9 @@ newdesc(idx) = []; endfunction -function load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst) +function load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, + global_install) idx = load_package_dirs (idx, [], handle_deps, installed_pkgs_lst); - arch = getarch (); dirs = {}; execpath = EXEC_PATH (); for i = idx; @@ -1890,7 +2024,7 @@ if (exist (fullfile (dirs{end}, "bin"), "dir")) execpath = strcat (fullfile(dirs{end}, "bin"), ":", execpath); endif - tmpdir = fullfile (ndir, arch); + tmpdir = getarchdir (installed_pkgs_lst {i}); if (exist (tmpdir, "dir")) dirs{end + 1} = tmpdir; endif diff --git a/scripts/plot/__patch__.m b/scripts/plot/__patch__.m --- a/scripts/plot/__patch__.m +++ b/scripts/plot/__patch__.m @@ -51,13 +51,20 @@ endif endif - if (have_x && nargin > iarg && isnumeric (varargin{iarg})) - c = varargin{iarg}; - have_c = true; - iarg++; + if (have_x && nargin > iarg) + if (isnumeric (varargin{iarg})) + c = varargin{iarg}; + have_c = true; + iarg++; - if (ndims (c) == 3 && size (c, 2) == 1) - c = permute (c, [1, 3, 2]); + if (ndims (c) == 3 && size (c, 2) == 1) + c = permute (c, [1, 3, 2]); + endif + elseif (ischar (varargin{iarg}) && rem (nargin - iarg, 2) != 0) + ## Assume that any additional argument over an even number is color string + c = tolower (varargin{iarg}); + have_c = true; + iarg++; endif endif @@ -96,7 +103,9 @@ c2 = c; endif - if (numel (c2) == 1) + if (ischar (c2)) + set (h, "facecolor", c2); + elseif (numel (c2) == 1) if (isnan (c)) set (h, "facecolor", [1, 1, 1]); set (h, "cdata", c2); diff --git a/scripts/plot/__plt_get_axis_arg__.m b/scripts/plot/__plt_get_axis_arg__.m --- a/scripts/plot/__plt_get_axis_arg__.m +++ b/scripts/plot/__plt_get_axis_arg__.m @@ -23,23 +23,21 @@ function [h, varargin] = __plt_get_axis_arg__ (caller, varargin) - - if (nargin > 1) + if (nargin > 1 && length (varargin) > 0 && ishandle (varargin{1})) tmp = varargin{1}; - if (ishandle (tmp)) - obj = get (tmp); - if (strcmp (obj.type, "axes")) - h = tmp; - varargin(1) = []; - if (isempty (varargin)) - varargin = {}; - endif - else - error ("%s: expecting first argument to be axes handle", caller); + obj = get (tmp); + if (strcmp (obj.type, "axes")) + h = tmp; + varargin(1) = []; + if (isempty (varargin)) + varargin = {}; endif else - h = gca (); + error ("%s: expecting first argument to be axes handle", caller); endif + else + h = gca (); + varargin = {}; endif endfunction diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,20 @@ +2007-09-26 David Bateman + + * graphics.cc (color_values::str2rgb): accept upper, lower and + mixed-case versions of the string representing the color. Allow + black defined as "k" and white as "w". + (color_property::color_property (const octave_value& val, + const radio_values &v)): Modify the constructor to also take a + radio_values argument. Use it. + (patch::properties::set): Change set_facecolor calls to initialize + the color_property argument with the available radio_values. + * graphics.h.in (color_property::color_property + (const octave_value& val, const radio_values &v)): Also pass a + radio_values argument. + + * ov-range.h (sparse_matrix_value, sparse_complex_matrix_value): + New methods. + 2007-09-25 Matthias Drochner * syscalls.cc (Fpopen2): Doc fix. diff --git a/src/graphics.cc b/src/graphics.cc --- a/src/graphics.cc +++ b/src/graphics.cc @@ -90,9 +90,12 @@ bool retval = true; unsigned int len = str.length(); + std::transform (str.begin (), str.end (), str.begin (), tolower); + if (str.compare(0, len, "blue", 0, len) == 0) tmp_rgb[2] = 1; - else if (str.compare(0, len, "black", 0, len) == 0 || str.compare(0, len, "w", 0, len) == 0) + else if (str.compare(0, len, "black", 0, len) == 0 || + str.compare(0, len, "k", 0, len) == 0) tmp_rgb[0] = tmp_rgb[1] = tmp_rgb[2] = 0; else if (str.compare(0, len, "red", 0, len) == 0) tmp_rgb[0] = 1; @@ -104,7 +107,8 @@ tmp_rgb[0] = tmp_rgb[2] = 1; else if (str.compare(0, len, "cyan", 0, len) == 0) tmp_rgb[1] = tmp_rgb[2] = 1; - else if (str.compare(0, len, "white", 0, len) == 0) + else if (str.compare(0, len, "white", 0, len) == 0 || + str.compare(0, len, "w", 0, len) == 0) tmp_rgb[0] = tmp_rgb[1] = tmp_rgb[2] = 1; else retval = false; @@ -118,8 +122,8 @@ return retval; } -color_property::color_property (const octave_value& val) - : radio_val (), current_val () +color_property::color_property (const octave_value& val, const radio_values &v) + : radio_val (v), current_val () { // FIXME -- need some error checking here. @@ -129,11 +133,19 @@ if (! s.empty ()) { - color_values col (s); - if (! error_state) + if (radio_val.contains (s)) + { + current_val = s; + current_type = radio_t; + } + else { - color_val = col; - current_type = color_t; + color_values col (s); + if (! error_state) + { + color_val = col; + current_type = color_t; + } } } else @@ -2119,7 +2131,7 @@ else if (name.compare ("zdata")) set_zdata (val); else if (name.compare ("facecolor")) - set_facecolor (val); + set_facecolor (color_property (val, radio_values ("flat|none|interp"))); else if (name.compare ("facealpha")) set_facealpha (val); else if (name.compare ("edgecolor")) diff --git a/src/graphics.h.in b/src/graphics.h.in --- a/src/graphics.h.in +++ b/src/graphics.h.in @@ -206,7 +206,8 @@ current_val (initial_value) { } - color_property (const octave_value& val); + color_property (const octave_value& val, + const radio_values &v = radio_values()); operator octave_value (void) const {