From maintainers-request at octave dot org Mon Jan 24 12:48:40 2005 Subject: patch to plot all data at once without "hold on" if possible From: "John W. Eaton" To: Daniel J Sebald Cc: octave maintainers mailing list , graphics@octave.org Date: Mon, 24 Jan 2005 13:51:14 -0500 On 24-Jan-2005, Daniel J Sebald wrote: | I've attached a patch for slight modifications to a variety of | __plot###__.m scripts that will allow plot() to be carried out in a | single step in most convenient uses. | | The reason I did this is that with gnuplot one can set the output to PDF | and put a series of plots in the file then page through using AcroRead | or Xpdf. The problem was that the __plt__.m script used "hold on" for | all multiple line and/or symbol plots. The result in the PDF file was, | for example, one page with the symbols and a next page with the symbols | and stems. | | From the original writing of __plt__.m it would have been nice to not | use "hold on". Even in x11 one line is drawn, then the plot ranges | readjust upon the plotting of the second line. Anyhow, the patch would | improve things. | | The patch is a very simple workaround that avoids upsetting the apple | cart. I modified __plt1__.m, __plt2__.m, __plt2ss__.m, and __plt2vv__.m | to have variable output arguments. Call all these routines without | output arguments, they behave just as previously. With output | arguments, they return the data and the associated format string... | EXCEPT in the case of matrices which are done as a loop so format | strings are not easily returned. In the latter case functions return | empty matrices and __plt__.m can adjust accordingly. | | __plt__.m will save all the returned data and construct a single gnuplot | string for the plots. The exception is that when matrices are passed | into the plot() function. In that case, the matrix portions utilize the | same "hold on" approach. Hence, if one uses just a string of vectors in | the plot command, e.g., | | plot([1:50], "-r;steep;", [1:50]*2, "-g;steeper;") | | You should see slightly nicer behavior. I started with your patch and fixed a few more things. My changes are below. I think it is safe to make backwardly-incompatible changes to the __pltXX__ functions since they were supposed to be "internal" functions. This is a change that should have been made a long time ago. Thanks! jwe scripts/ChangeLog: 2005-01-24 John W. Eaton * plot/__plr2__.m, plot/__plt2__.m: Improve diagnostics. * plot/__plr__.m: Use __plt__, not specific __pltXX__ functions. * plot/__plt1__.m, plot/__plt2__.m, plot/__plt2mm__.m, plot/__plt2mv__.m, plot/__plt2ss__.m, plot/__plt2vm__.m, plot/__plt2vv__.m: Return data and gnuplot commands instead of evaluating them. * plot/__plt__.m: Handle evaluation of all gnuplot commands here. Based on changes from Daniel J Sebald . Index: scripts/plot/__plr2__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plr2__.m,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- scripts/plot/__plr2__.m 9 Aug 2002 18:58:14 -0000 1.17 +++ scripts/plot/__plr2__.m 24 Jan 2005 18:38:45 -0000 1.18 at @ -41,12 +41,14 @@ if (isscalar (rho)) x = rho * cos (theta); y = rho * sin (theta); - __plt2ss__ (x, y, fmt); + __plt__ (x, y, fmt); + else + error ("__plr2__: invalid data for plotting"); endif elseif (isvector (theta)) if (isvector (rho)) if (length (theta) != length (rho)) - error ("polar: vector lengths must match"); + error ("__plr2__: vector lengths must match"); endif if (rows (rho) == 1) rho = rho'; at @ -56,7 +58,7 @@ endif x = rho .* cos (theta); y = rho .* sin (theta); - __plt2vv__ (x, y, fmt); + __plt__ (x, y, fmt); elseif (ismatrix (rho)) [t_nr, t_nc] = size (theta); if (t_nr == 1) at @ -73,11 +75,13 @@ r_nc = tmp; endif if (t_nr != r_nr) - error ("polar: vector and matrix sizes must match"); + error ("__plr2__: vector and matrix sizes must match"); endif x = diag (cos (theta)) * rho; y = diag (sin (theta)) * rho; - __plt2vm__ (x, y, fmt); + __plt__ (x, y, fmt); + else + error ("__plr2__: invalid data for plotting") endif elseif (ismatrix (theta)) if (isvector (rho)) at @ -96,20 +100,24 @@ t_nc = tmp; endif if (r_nr != t_nr) - error ("polar: vector and matrix sizes must match"); + error ("__plr2__: vector and matrix sizes must match"); endif diag_r = diag (rho); x = diag_r * cos (theta); y = diag_r * sin (theta); - __plt2mv__ (x, y, fmt); + __plt__ (x, y, fmt); elseif (ismatrix (rho)) if (size (rho) != size (theta)) - error ("polar: matrix dimensions must match"); + error ("__plr2__: matrix dimensions must match"); endif x = rho .* cos (theta); y = rho .* sin (theta); - __plt2mm__ (x, y, fmt); + __plt__ (x, y, fmt); + else + error ("__plr2__: invalid data for plotting") endif + else + error ("__plr2__: invalid data for plotting") endif endfunction Index: scripts/plot/__plr__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plr__.m,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- scripts/plot/__plr__.m 9 Aug 2002 18:58:14 -0000 1.17 +++ scripts/plot/__plr__.m 24 Jan 2005 18:38:45 -0000 1.18 at @ -43,6 +43,11 @@ endif endif + ## Note that we call __plt__ instead of __pltXX__ below, even though + ## we know the argument types. This is so we don't have to duplicate + ## the functionality of __plt__ here (the __pltXX__ functions only + ## return data and fmtstr now). + if (nargin <= 2) if (any (imag (theta))) theta = real (theta); at @ -54,7 +59,7 @@ if (isscalar (rho)) x = rho * cos (theta); y = rho * sin (theta); - __plt2ss__ (x, y, fmt); + __plt__ (x, y, fmt); endif elseif (isvector (theta)) if (isvector (rho)) at @ -69,7 +74,7 @@ endif x = rho .* cos (theta); y = rho .* sin (theta); - __plt2vv__ (x, y, fmt); + __plt__ (x, y, fmt); elseif (ismatrix (rho)) [t_nr, t_nc] = size (theta); if (t_nr == 1) at @ -90,7 +95,7 @@ endif x = diag (cos (theta)) * rho; y = diag (sin (theta)) * rho; - __plt2vm__ (x, y, fmt); + __plt__ (x, y, fmt); endif elseif (ismatrix (theta)) if (isvector (rho)) at @ -114,14 +119,14 @@ diag_r = diag (r); x = diag_r * cos (theta); y = diag_r * sin (theta); - __plt2mv__ (x, y, fmt); + __plt__ (x, y, fmt); elseif (ismatrix (rho)) if (size (rho) != size (theta)) error ("polar: matrix dimensions must match"); endif x = rho .* cos (theta); y = rho .* sin (theta); - __plt2mm__ (x, y, fmt); + __plt__ (x, y, fmt); endif endif else Index: scripts/plot/__plt1__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt1__.m,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- scripts/plot/__plt1__.m 18 Jan 2000 04:09:06 -0000 1.12 +++ scripts/plot/__plt1__.m 24 Jan 2005 18:38:45 -0000 1.13 at @ -18,15 +18,15 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt1__ (@var{x1}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt1__ (@var{x1}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt1__ (x1, fmt) +function [data, fmtstr] = __plt1__ (x1, fmt) - if (nargin < 1 || nargin > 2) - usage ("__plt1__ (x1, fmt)"); + if (nargin < 1 || nargin > 2 || nargout != 2) + usage ("[data, fmtstr] = __plt1__ (x1, fmt)"); endif if (nargin == 1) at @ -53,6 +53,6 @@ x1 = (1:nr)'; endif - __plt2__ (x1, x2, fmt); + [data, fmtstr] = __plt2__ (x1, x2, fmt); endfunction Index: scripts/plot/__plt2__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt2__.m,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- scripts/plot/__plt2__.m 9 Aug 2002 18:58:14 -0000 1.12 +++ scripts/plot/__plt2__.m 24 Jan 2005 18:38:45 -0000 1.13 at @ -18,15 +18,15 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt2__ (@var{x1}, @var{x2}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt2__ (@var{x1}, @var{x2}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt2__ (x1, x2, fmt) +function [data, fmtstr] = __plt2__ (x1, x2, fmt) - if (nargin < 2 || nargin > 3) - usage ("__plt2__ (x1, x2, fmt)"); + if (nargin < 2 || nargin > 3 || nargout != 2) + usage ("[data, fmtstr] = __plt2__ (x1, x2, fmt)"); endif if (nargin == 2) at @ -40,25 +40,35 @@ if (any (any (imag (x1)))) x1 = real (x1); endif + if (any (any (imag (x2)))) x2 = real (x2); endif + if (isscalar (x1)) if (isscalar (x2)) - __plt2ss__ (x1, x2, fmt); + [data, fmtstr] = __plt2ss__ (x1, x2, fmt); + else + error ("__plt2__: invalid data for plotting"); endif elseif (isvector (x1)) if (isvector (x2)) - __plt2vv__ (x1, x2, fmt); + [data, fmtstr] = __plt2vv__ (x1, x2, fmt); elseif (ismatrix (x2)) - __plt2vm__ (x1, x2, fmt); + [data, fmtstr] = __plt2vm__ (x1, x2, fmt); + else + error ("__plt2__: invalid data for plotting"); endif elseif (ismatrix (x1)) if (isvector (x2)) - __plt2mv__ (x1, x2, fmt); + [data, fmtstr] = __plt2mv__ (x1, x2, fmt); elseif (ismatrix (x2)) - __plt2mm__ (x1, x2, fmt); + [data, fmtstr] = __plt2mm__ (x1, x2, fmt); + else + error ("__plt2__: invalid data for plotting"); endif + else + error ("__plt2__: invalid data for plotting"); endif endfunction Index: scripts/plot/__plt2mm__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt2mm__.m,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- scripts/plot/__plt2mm__.m 2 Jan 2003 17:59:17 -0000 1.18 +++ scripts/plot/__plt2mm__.m 24 Jan 2005 18:38:45 -0000 1.19 at @ -18,18 +18,16 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt2mm__ (@var{x}, @var{y}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt2mm__ (@var{x}, @var{y}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt2mm__ (x, y, fmt) +function [data, fmtstr] = __plt2mm__ (x, y, fmt) - if (nargin < 2 || nargin > 3) - msg = sprintf ("__plt2mm__ (x, y)\n"); - msg = sprintf ("%s __plt2mm__ (x, y, fmt)", msg); - usage (msg); - elseif (nargin == 2 || fmt == "") + if (nargin < 2 || nargin > 3 || nargout != 2) + usage ("[data, fmtstr] = __plt2mm__ (x, y, fmt)"); + elseif (nargin == 2 || isempty (fmt)) fmt = " "; ## Yes, this is intentionally not an empty string! endif at @ -40,20 +38,18 @@ fmt_nr = rows (fmt); if (x_nr == y_nr && x_nc == y_nc) if (x_nc > 0) - tmp = [x, y]; - cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1, - deblank (fmt (k, :))); - if (k < fmt_nr) - k++; + if (rows (fmt) == 1) + fmt = repmat (fmt, x_nc, 1); endif - for i = 2:x_nc - cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, i, x_nc, x_nc+i, - deblank (fmt (k, :))); - if (k < fmt_nr) - k++; - endif + tmp = [x, y]; + dtmp = cell (x_nc, 1); + ftmp = cell (x_nc, 1); + for i = 1:x_nc + dtmp{i} = tmp(:,[i,x_nc+i]); + ftmp{i} = deblank (fmt(i,:)); endfor - eval (cmd); + data = dtmp; + fmtstr = ftmp; else error ("__plt2mm__: arguments must be a matrices"); endif Index: scripts/plot/__plt2mv__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt2mv__.m,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- scripts/plot/__plt2mv__.m 2 Jan 2003 17:59:17 -0000 1.19 +++ scripts/plot/__plt2mv__.m 24 Jan 2005 18:38:45 -0000 1.20 at @ -18,18 +18,16 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt2mv__ (@var{x}, @var{y}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt2mv__ (@var{x}, @var{y}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt2mv__ (x, y, fmt) +function [data, fmtstr] = __plt2mv__ (x, y, fmt) - if (nargin < 2 || nargin > 3) - msg = sprintf ("__plt2mv__ (x, y)\n"); - msg = sprintf ("%s __plt2mv__ (x, y, fmt)", msg); - usage (msg); - elseif (nargin == 2 || fmt == "") + if (nargin < 2 || nargin > 3 || nargout != 2) + usage ("[data, fmtstr] = __plt2mv__ (x, y, fmt)"); + elseif (nargin == 2 || isempty (fmt)) fmt = " "; ## Yes, this is intentionally not an empty string! endif at @ -54,23 +52,19 @@ error ("__plt2mv__: matrix dimensions must match"); endif - k = 1; - fmt_nr = rows (fmt); if (x_nc > 0) - tmp = [x, y]; - cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1, - deblank (fmt (k, :))); - if (k < fmt_nr) - k++; + if (rows (fmt) == 1) + fmt = repmat (fmt, x_nc, 1); endif - for i = 2:x_nc - cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, i, x_nc-i+1, x_nc+1, - deblank (fmt (k, :))); - if (k < fmt_nr) - k++; - endif + tmp = [x, y]; + dtmp = cell (x_nc, 1); + ftmp = cell (x_nc, 1); + for i = 1:x_nc + dtmp{i} = tmp(:,[i,x_nc+1]); + ftmp{i} = deblank (fmt(i,:)); endfor - eval (cmd); + data = dtmp; + fmtstr = ftmp; else error ("__plt2mv__: arguments must be a matrices"); endif Index: scripts/plot/__plt2ss__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt2ss__.m,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- scripts/plot/__plt2ss__.m 2 Jan 2003 17:59:17 -0000 1.17 +++ scripts/plot/__plt2ss__.m 24 Jan 2005 18:38:45 -0000 1.18 at @ -18,17 +18,15 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt2ss__ (@var{x}, @var{y}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt2ss__ (@var{x}, @var{y}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt2ss__ (x, y, fmt) +function [data, fmtstr] = __plt2ss__ (x, y, fmt) - if (nargin < 2 || nargin > 3) - msg = sprintf ("__plt2ss__ (x, y)"); - msg = sprintf ("%s __plt2ss__ (x, y, fmt)", msg); - usage (msg); + if (nargin < 2 || nargin > 3 || nargout != 2) + usage ("[data, fmtstr] = __plt2ss__ (x, y, fmt)"); elseif (nargin == 2) fmt = ""; elseif (rows (fmt) > 1) at @ -40,8 +38,8 @@ if (x_nr == 1 && x_nr == y_nr && x_nc == 1 && x_nc == y_nc) tmp = [x, y]; - cmd = sprintf ("gplot tmp %s", fmt); - eval (cmd); + data = tmp; + fmtstr = fmt; else error ("__plt2ss__: arguments must be scalars"); endif Index: scripts/plot/__plt2vm__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt2vm__.m,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- scripts/plot/__plt2vm__.m 9 Nov 2004 05:53:11 -0000 1.20 +++ scripts/plot/__plt2vm__.m 24 Jan 2005 18:38:45 -0000 1.21 at @ -18,18 +18,16 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt2vm__ (@var{x}, @var{y}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt2vm__ (@var{x}, @var{y}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt2vm__ (x, y, fmt) +function [data, fmtstr] = __plt2vm__ (x, y, fmt) - if (nargin < 2 || nargin > 3) - msg = sprintf ("__plt2vm__ (x, y)\n"); - msg = sprintf ("%s __plt2vm__ (x, y, fmt)", msg); - usage (msg); - elseif (nargin == 2 || fmt == "") + if (nargin < 2 || nargin > 3 || nargout != 2) + usage ("[data, fmtstr] = __plt2vm__ (x, y, fmt)"); + elseif (nargin == 2 || isempty (fmt)) fmt = " "; ## Yes, this is intentionally not an empty string! endif at @ -54,23 +52,19 @@ error ("__plt2vm__: matrix dimensions must match"); endif - k = 1; - fmt_nr = rows (fmt); if (y_nc > 0) - tmp = [x, y]; - cmd = sprintf ("gplot tmp(:,%d:%d:%d) %s", 1, x_nc, x_nc+1, - deblank (fmt (k, :))); - if (k < fmt_nr) - k++; + if (rows (fmt) == 1) + fmt = repmat (fmt, y_nc, 1); endif - for i = 2:y_nc - cmd = sprintf ("%s, tmp(:,%d:%d:%d) %s", cmd, 1, i, i+1, - deblank (fmt (k, :))); - if (k < fmt_nr) - k++; - endif + tmp = [x, y]; + dtmp = cell (y_nc, 1); + ftmp = cell (y_nc, 1); + for i = 1:y_nc + dtmp{i} = tmp(:,[1,i+1]); + ftmp{i} = deblank (fmt(i,:)); endfor - eval (cmd); + data = dtmp; + fmtstr = ftmp; else error ("__plt2vm__: arguments must be a matrices"); endif Index: scripts/plot/__plt2vv__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt2vv__.m,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- scripts/plot/__plt2vv__.m 2 Jan 2003 17:59:17 -0000 1.17 +++ scripts/plot/__plt2vv__.m 24 Jan 2005 18:38:45 -0000 1.18 at @ -18,17 +18,15 @@ ## 02111-1307, USA. ## -*- texinfo -*- -## at deftypefn {Function File} {} __plt2vv__ (@var{x}, @var{y}, @var{fmt}) +## at deftypefn {Function File} {[data, fmtstr] =} __plt2vv__ (@var{x}, @var{y}, @var{fmt}) ## at end deftypefn ## Author: jwe -function __plt2vv__ (x, y, fmt) +function [data, fmtstr] = __plt2vv__ (x, y, fmt) - if (nargin < 2 || nargin > 3) - msg = sprintf ("__plt2vv__ (x, y)\n"); - msg = sprintf ("%s __plt2vv__ (x, y, fmt)", msg); - usage (msg); + if (nargin < 2 || nargin > 3 || nargout != 2) + usage ("[data, fmtstr] = __plt2vv__ (x, y, fmt)"); elseif (nargin == 2) fmt = ""; elseif (rows (fmt) > 1) at @ -56,8 +54,7 @@ error ("__plt2vv__: vector lengths must match"); endif - tmp = [x, y]; - cmd = sprintf ("gplot tmp %s", fmt); - eval (cmd); + data = [x, y]; + fmtstr = fmt; endfunction Index: scripts/plot/__plt__.m =================================================================== RCS file: /usr/local/cvsroot/octave/scripts/plot/__plt__.m,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- scripts/plot/__plt__.m 23 Jan 2004 03:15:53 -0000 1.24 +++ scripts/plot/__plt__.m 24 Jan 2005 18:38:45 -0000 1.25 at @ -27,11 +27,7 @@ nargs = nargin (); - if (nargs == 2) - - __plt1__ (varargin{1}, ""); - - elseif (nargs > 2) + if (nargs >= 2) first_plot = 1; hold_state = ishold (); at @ -39,35 +35,64 @@ unwind_protect k = 1; + j = 1; x = varargin{k++}; nargs -= 2; x_set = 1; y_set = 0; + gp_cmd = "gplot"; + have_gp_cmd = false; - ## Gather arguments, decode format, and plot lines. + ## Gather arguments, decode format, gather plot strings, and plot lines. while (nargs-- > 0) fmt = ""; new = varargin{k++}; + if (j > 1) + sep = ",\\\n"; + else + sep = ""; + endif + if (isstr (new)) if (! x_set) error ("plot: no data to plot"); endif fmt = __pltopt__ (caller, new); if (! y_set) - __plt1__ (x, fmt); + [data{j}, fmtstr] = __plt1__ (x, fmt); else - __plt2__ (x, y, fmt); + [data{j}, fmtstr] = __plt2__ (x, y, fmt); + endif + if (iscell (data{j})) + for i = 1:length (data{j}) + gp_cmd = sprintf ("%s%s data{%d}{%d} %s", gp_cmd, sep, + j, i, fmtstr{i}); + sep = ",\\\n"; + have_gp_cmd = true; + endfor + else + gp_cmd = sprintf ("%s%s data{%d} %s", gp_cmd, sep, j++, fmtstr); + have_gp_cmd = true; endif - hold on; x_set = 0; y_set = 0; elseif (x_set) if (y_set) - __plt2__ (x, y, fmt); - hold on; + [data{j}, fmtstr] = __plt2__ (x, y, fmt); + if (iscell (data{j})) + for i = 1:length (data{j}) + gp_cmd = sprintf ("%s%s data{%d}{%d} %s", gp_cmd, sep, + j, i, fmtstr{i}); + sep = ",\\\n"; + have_gp_cmd = true; + endfor + else + gp_cmd = sprintf ("%s%s data{%d} %s", gp_cmd, sep, j++, fmtstr); + have_gp_cmd = true; + endif x = new; y_set = 0; else at @ -83,14 +108,29 @@ ## Handle last plot. - if (x_set) + if (x_set) if (y_set) - __plt2__ (x, y, fmt); + [data{j}, fmtstr] = __plt2__ (x, y, fmt); else - __plt1__ (x, fmt); + [data{j}, fmtstr] = __plt1__ (x, fmt); + endif + if (iscell (data{j})) + for i = 1:length (data{j}) + gp_cmd = sprintf ("%s%s data{%d}{%d} %s", gp_cmd, sep, + j, i, fmtstr{i}); + sep = ",\\\n"; + have_gp_cmd = true; + endfor + else + gp_cmd = sprintf ("%s%s data{%d} %s", gp_cmd, sep, j++, fmtstr); + have_gp_cmd = true; endif endif + if (have_gp_cmd) + eval (gp_cmd); + endif + unwind_protect_cleanup if (! hold_state)