Hello community,

here is the log from the commit of package octave-forge-general for 
openSUSE:Factory checked in at 2020-05-23 17:20:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/octave-forge-general (Old)
 and      /work/SRC/openSUSE:Factory/.octave-forge-general.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "octave-forge-general"

Sat May 23 17:20:07 2020 rev:3 rq:808065 version:2.1.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/octave-forge-general/octave-forge-general.changes    
    2018-06-29 22:25:54.162506136 +0200
+++ 
/work/SRC/openSUSE:Factory/.octave-forge-general.new.2738/octave-forge-general.changes
      2020-05-23 17:20:10.958465863 +0200
@@ -1,0 +2,15 @@
+Mon May 18 19:55:40 UTC 2020 - Atri Bhattacharya <[email protected]>
+
+- Fix installation of metainfo file.
+
+-------------------------------------------------------------------
+Sun May 10 10:09:18 UTC 2020 - Stefan Brüns <[email protected]>
+
+- Update to version 2.1.1:
+  * updated configure script to detect function names for various
+    octave versions.
+  * added additional BIST tests
+  * minor documentation updates
+- Install metainfo
+
+-------------------------------------------------------------------

Old:
----
  general-2.1.0.tar.gz

New:
----
  general-2.1.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ octave-forge-general.spec ++++++
--- /var/tmp/diff_new_pack.jAOo9t/_old  2020-05-23 17:20:11.630467317 +0200
+++ /var/tmp/diff_new_pack.jAOo9t/_new  2020-05-23 17:20:11.630467317 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package octave-forge-general
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,19 +12,19 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 %define octpkg  general
 Name:           octave-forge-%{octpkg}
-Version:        2.1.0
+Version:        2.1.1
 Release:        0
 Summary:        General tools for Octave
 License:        GPL-3.0-or-later AND BSD-3-Clause
 Group:          Productivity/Scientific/Math
-Url:            http://octave.sourceforge.net
-Source0:        
http://downloads.sourceforge.net/octave/%{octpkg}-%{version}.tar.gz
+URL:            https://octave.sourceforge.io
+Source0:        
https://downloads.sourceforge.net/octave/%{octpkg}-%{version}.tar.gz
 BuildRequires:  gcc-c++
 BuildRequires:  hdf5-devel
 BuildRequires:  octave-devel
@@ -38,11 +38,16 @@
 %setup -q -c %{name}-%{version}
 %octave_pkg_src
 
+# COPY METAINFO FILE TO TOPLEVEL DIR FOR MANUAL INSTALLATION LATER
+find ./ -name "*.metainfo.xml" -exec cp '{}' ./ \;
+
 %build
 %octave_pkg_build
 
 %install
 %octave_pkg_install
+mkdir -p %{buildroot}%{_datadir}/metainfo
+install -m 644 octave-general.metainfo.xml %{buildroot}%{_datadir}/metainfo/
 
 %check
 %octave_pkg_test
@@ -54,8 +59,8 @@
 %octave --eval "pkg rebuild"
 
 %files
-%defattr(-,root,root)
 %{octpackages_dir}/%{octpkg}-%{version}
 %{octlib_dir}/%{octpkg}-%{version}
+%{_datadir}/metainfo/*.metainfo.xml
 
 %changelog

++++++ general-2.1.0.tar.gz -> general-2.1.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/DESCRIPTION 
new/general-2.1.1/DESCRIPTION
--- old/general-2.1.0/DESCRIPTION       2018-05-13 23:01:51.400133935 +0200
+++ new/general-2.1.1/DESCRIPTION       2020-03-05 14:21:19.000000000 +0100
@@ -1,6 +1,6 @@
 Name: general
-Version: 2.1.0
-Date: 2018-05-11
+Version: 2.1.1
+Date: 2020-02-25
 Author: various authors
 Maintainer: Octave-Forge community <[email protected]>
 Title: General
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/INDEX new/general-2.1.1/INDEX
--- old/general-2.1.0/INDEX     2018-05-13 23:01:51.400133935 +0200
+++ new/general-2.1.1/INDEX     2020-03-05 14:21:19.000000000 +0100
@@ -1,14 +1,18 @@
 general >> General purpose functions
 Dictionaries
  @dict/dict
+ @dict/display
  @dict/get
  @dict/has
  @dict/isempty
  @dict/join
  @dict/length
  @dict/struct
+ @dict/subsasgn
+ @dict/subsref
 Various Functions
  adresamp2
+ cauchy
  majle
  mark_for_deletion
  packfields
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/Makefile new/general-2.1.1/Makefile
--- old/general-2.1.0/Makefile  2018-05-13 23:01:51.400133935 +0200
+++ new/general-2.1.1/Makefile  2020-03-05 14:21:19.000000000 +0100
@@ -2,7 +2,7 @@
 ## Copyright 2015-2016 Oliver Heimlich
 ## Copyright 2017 Julien Bect <[email protected]>
 ## Copyright 2017 Olaf Till <[email protected]>
-## Copyright 2018 John Donoghue <[email protected]>
+## Copyright 2018-2019 John Donoghue <[email protected]>
 ##
 ## Copying and distribution of this file, with or without modification,
 ## are permitted in any medium without royalty provided the copyright
@@ -52,11 +52,18 @@
 vcs := $(if $(wildcard .hg),hg,$(if $(wildcard .git),git,unknown))
 ifeq ($(vcs),hg)
 release_dir_dep := .hg/dirstate
+HG           := hg
+HG_CMD        = $(HG) --config alias.$(1)=$(1) --config defaults.$(1)= $(1)
+HG_ID        := $(shell $(call HG_CMD,identify) --id | sed -e 's/+//' )
+REPO_TIMESTAMP := $(firstword $(shell $(call HG_CMD,log) --rev $(HG_ID) 
--template '{date|hgdate}'))
 endif
 ifeq ($(vcs),git)
 release_dir_dep := .git/index
+REPO_TIMESTAMP := $(firstword $(shell $(GIT) log -n1 --date=unix 
--format="%ad"))
 endif
 
+TAR_REPRODUCIBLE_OPTIONS := --sort=name --mtime="@$(REPO_TIMESTAMP)" --owner=0 
--group=0 --numeric-owner
+TAR_OPTIONS  := --format=ustar $(TAR_REPRODUCIBLE_OPTIONS)
 
 ## .PHONY indicates targets that are not filenames
 ## (https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html)
@@ -95,7 +102,7 @@
 
 ## An implicit rule with a recipe to build the tarballs correctly.
 %.tar.gz: %
-       $(TAR) -c -f - --posix -C "$(target_dir)/" "$(notdir $<)" | gzip -9n > 
"$@"
+       $(TAR) -cf - $(TAR_OPTIONS) -C "$(target_dir)/" "$(notdir $<)" | gzip 
-9n > "$@"
 
 clean-tarballs:
        @echo "## Cleaning release tarballs (package + html)..."
@@ -212,10 +219,8 @@
 
 ## Test package.
 octave_test_commands = \
-' pkgs = pkg("list","general"); cd (pkgs{1}.dir); dirs = { "." }; \
-  dirs(cellfun (@ (x) ! isdir (x), dirs)) = []; \
-  if (isempty (dirs)) error ("no \"inst\" or \"src\" directory"); exit (1); \
-    else __run_test_suite__ (dirs, {}); endif '
+' pkgs = pkg("list","general"); dirs = { pkgs{1}.dir }; \
+  __run_test_suite__ (dirs, {}); '
 ## the following works, too, but provides no overall summary output as
 ## __run_test_suite__ does:
 ##
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/NEWS new/general-2.1.1/NEWS
--- old/general-2.1.0/NEWS      2018-05-13 23:01:51.400133935 +0200
+++ new/general-2.1.1/NEWS      2020-03-05 14:21:19.000000000 +0100
@@ -1,3 +1,13 @@
+Summary of important user-visible changes for general 2.1.1:
+-------------------------------------------------------------------
+
+ ** updated configure script to detect function names for various
+    octave versions.
+
+ ** added additional BIST tests
+
+ ** minor documentation updates
+
 Summary of important user-visible changes for general 2.1.0:
 -------------------------------------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/inst/@dict/display.m 
new/general-2.1.1/inst/@dict/display.m
--- old/general-2.1.0/inst/@dict/display.m      2018-05-13 23:01:51.400133935 
+0200
+++ new/general-2.1.1/inst/@dict/display.m      2020-03-05 14:21:19.000000000 
+0100
@@ -12,8 +12,9 @@
 ##
 ## You should have received a copy of the GNU General Public License along with
 ## this program; if not, see <http://www.gnu.org/licenses/>.
+
 ## -*- texinfo -*-
-## @deftypefn{Function File} display (d)
+## @deftypefn {Function File} display (d)
 ## Overloaded display for dictionaries.
 ## @end deftypefn
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/inst/cauchy.m 
new/general-2.1.1/inst/cauchy.m
--- old/general-2.1.0/inst/cauchy.m     2018-05-13 23:01:51.404133915 +0200
+++ new/general-2.1.1/inst/cauchy.m     2020-03-05 14:21:19.000000000 +0100
@@ -1,5 +1,6 @@
 ## Copyright (C) 2011 Fernando Damian Nieuwveldt <[email protected]>
 ## 2012 Adapted by Juan Pablo Carbajal <[email protected]>
+## 2019 Modifications by John Donoghue <[email protected]>
 ##
 ## This program is free software; you can redistribute it and/or
 ## modify it under the terms of the GNU General Public License
@@ -12,10 +13,11 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} cauchy (@var{N}, @var{r}, @var{x}, @var{f} )
-## Return the Taylor coefficients and numerical differentiation of a function
-## @var{f} for the first @var{N-1} coefficients or derivatives using the fft.
-## @var{N} is the number of points to evaluate,
-## @var{r} is the radius of convergence, needs to be chosen less then the 
smallest singularity,
+## Return the Taylor coefficients and numerical differentiation of a function.
+##
+## @var{f} for the first @var{N-1} coefficients or derivatives using the fft.@*
+## @var{N} is the number of points to evaluate,@*
+## @var{r} is the radius of convergence, needs to be chosen less then the 
smallest singularity,@*
 ## @var{x} is point to evaluate the Taylor expansion or differentiation. For 
example,
 ##
 ## If @var{x} is a scalar, the function @var{f} is evaluated in a row vector
@@ -30,29 +32,29 @@
 ## @end example
 ## @end deftypefn
 
-function deriv = cauchy(N, r, x, f)
+function deriv = cauchy (N, r, x, f)
 
   if nargin != 4
     print_usage ();
-  end
+  endif
 
   [nx m]   = size (x);
   if m > 1
-    error('cauchy:InvalidArgument', 'The 3rd argument must be a column 
vector');
-  end
+    error ('cauchy:InvalidArgument', 'The 3rd argument must be a column 
vector');
+  endif
 
   n        = 0:N-1;
   th       = 2*pi*n/N;
 
   f_p = f (bsxfun (@plus, x, r * exp (i * th) ) );
 
-  evalfft  = real(fft (f_p, [], 2));
+  evalfft  = real (fft (f_p, [], 2));
 
   deriv    = bsxfun (@times, evalfft, 1./(N*(r.^n)).* factorial(n)) ;
 
 endfunction
 
-function g = hermite(order,x)
+function g = hermite (order,x)
    ## N should be bigger than order+1
    N      = 32;
    r      = 0.5;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/inst/majle.m 
new/general-2.1.1/inst/majle.m
--- old/general-2.1.0/inst/majle.m      2018-05-13 23:01:51.404133915 +0200
+++ new/general-2.1.1/inst/majle.m      2020-03-05 14:21:19.000000000 +0100
@@ -25,73 +25,95 @@
 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
USE
 ## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-%MAJLE (Weak) Majorization check
-%    S = MAJLE(X,Y) checks if the real part of X is (weakly) majorized by
-%    the real part of Y, where X and Y must be numeric (full or sparse)
-%    arrays. It returns S=0, if there is no weak majorization of X by Y,
-%    S=1, if there is a weak majorization of X by Y, or S=2, if there is a
-%    strong majorization of X by Y. The shapes of X and Y are ignored.
-%    NUMEL(X) and NUMEL(Y) may be different, in which case one of them is
-%    appended with zeros to match the sizes with the other and, in case of
-%    any negative components, a special warning is issued.  
-%
-%    S = MAJLE(X,Y,MAJLETOL) allows in addition to specify the tolerance in
-%    all inequalities [S,Z] = MAJLE(X,Y,MAJLETOL) also outputs a row vector
-%    Z, which appears in the definition of the (weak) majorization. In the
-%    traditional case, where the real vectors X and Y are of the same size,
-%    Z = CUMSUM(SORT(Y,'descend')-SORT(X,'descend')). Here, X is weakly
-%    majorized by Y, if MIN(Z)>0, and strongly majorized if MIN(Z)=0, see
-%    http://en.wikipedia.org/wiki/Majorization
-%
-%    The value of MAJLETOL depends on how X and Y have been computed, i.e.,
-%    on what the level of error in X or Y is. A good minimal starting point
-%    should be MAJLETOL=eps*MAX(NUMEL(X),NUMEL(Y)). The default is 0. 
-%
-%    % Examples:
-%    x = [2 2 2]; y = [1 2 3]; s = majle(x,y)
-%    % returns the value 2.
-%    x = [2 2 2]; y = [1 2 4]; s = majle(x,y)
-%    % returns the value 1.
-%    x = [2 2 2]; y = [1 2 2]; s = majle(x,y)
-%    % returns the value 0.
-%    x = [2 2 2]; y = [1 2 2]; [s,z] = majle(x,y)
-%    % also returns the vector z = [ 0 0 -1].
-%    x = [2 2 2]; y = [1 2 2]; s = majle(x,y,1)
-%    % returns the value 2.
-%    x = [2 2]; y = [1 2 2]; s = majle(x,y)
-%    % returns the value 1 and warns on tailing with zeros
-%    x = [2 2]; y = [-1 2 2]; s = majle(x,y)
-%    % returns the value 0 and gives two warnings on tailing with zeros
-%    x = [2 -inf]; y = [4 inf]; [s,z] = majle(x,y)
-%    % returns s = 1 and z = [Inf   Inf].
-%    x = [2 inf]; y = [4 inf]; [s,z] = majle(x,y)
-%    % returns  s = 1 and z = [NaN NaN] and a warning on NaNs in z.
-%    x=speye(2); y=sparse([0 2; -1 1]); s = majle(x,y) 
-%    % returns the value 2.
-%    x = [2 2; 2 2]; y = [1 3 4]; [s,z] = majle(x,y) %and 
-%    x = [2 2; 2 2]+i; y = [1 3 4]-2*i; [s,z] = majle(x,y)
-%    % both return s = 2 and z = [2 3 2 0]. 
-%    x = [1 1 1 1 0]; y = [1 1 1 1 1 0 0]'; s = majle(x,y)
-%    % returns the value 1 and warns on tailing with zeros
-%
-%    % One can use this function to check numerically the validity of the
-%    Schur-Horn,Lidskii-Mirsky-Wielandt, and Gelfand-Naimark theorems: 
-%    clear all; n=100; majleTol=n*n*eps;
-%    A = randn(n,n); A = A'+A; eA = -sort(-eig(A)); dA = diag(A);
-%    majle(dA,eA,majleTol) % returns the value 2
-%    % which is the Schur-Horn theorem; and 
-%    B=randn(n,n); B=B'+B; eB=-sort(-eig(B)); 
-%    eAmB=-sort(-eig(A-B));
-%    majle(eA-eB,eAmB,majleTol) % returns the value 2 
-%    % which is the Lidskii-Mirsky-Wielandt theorem; finally
-%    A = randn(n,n); sA = -sort(-svd(A)); 
-%    B = randn(n,n); sB = -sort(-svd(B));
-%    sAB = -sort(-svd(A*B));
-%    majle(log2(sAB)-log2(sA), log2(sB), majleTol) % retuns the value 2
-%    majle(log2(sAB)-log2(sB), log2(sA), majleTol) % retuns the value 2
-%    % which are the log versions of the Gelfand-Naimark theorems
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{S} =} majle (@var{X}, @var{Y})
+## @deftypefnx {Function File} {@var{S} =} majle (@var{X}, @var{Y}, 
@var{MAJLETOL})
+## @deftypefnx {Function File} {@var{[S, Z]} =} majle (@var{X}, @var{Y}, 
@var{MAJLETOL})
+## (Weak) Majorization check
+##
+## S = MAJLE(X,Y) checks if the real part of X is (weakly) majorized by
+## the real part of Y, where X and Y must be numeric (full or sparse)
+## arrays.
+##
+## It returns S=0, if there is no weak majorization of X by Y,
+## S=1, if there is a weak majorization of X by Y, or S=2, if there is a
+## strong majorization of X by Y.
+##
+## The shapes of X and Y are ignored.
+##
+## numel(X) and numel(Y) may be different, in which case one of them is
+## appended with zeros to match the sizes with the other and, in case of
+## any negative components, a special warning is issued.  
+##
+## S = MAJLE(X,Y,MAJLETOL) allows in addition to specify the tolerance in
+## all inequalities
+##
+## [S,Z] = MAJLE(X,Y,MAJLETOL) also outputs a row vector
+## Z, which appears in the definition of the (weak) majorization. In the
+## traditional case, where the real vectors X and Y are of the same size,
+## Z = CUMSUM(SORT(Y,'descend')-SORT(X,'descend')).
+##
+## Here, X is weakly majorized by Y, if MIN(Z)>0, and strongly
+## majorized if MIN(Z)=0, see
+## http://en.wikipedia.org/wiki/Majorization
+##
+## The value of MAJLETOL depends on how X and Y have been computed, i.e.,
+## on what the level of error in X or Y is. A good minimal starting point
+## should be MAJLETOL=eps*MAX(NUMEL(X),NUMEL(Y)). The default is 0. 
+##
+## @example
+## @group
+## % Examples:
+## x = [2 2 2]; y = [1 2 3]; s = majle(x,y)
+## % returns the value 2.
+## x = [2 2 2]; y = [1 2 4]; s = majle(x,y)
+## % returns the value 1.
+## x = [2 2 2]; y = [1 2 2]; s = majle(x,y)
+## % returns the value 0.
+## x = [2 2 2]; y = [1 2 2]; [s,z] = majle(x,y)
+## % also returns the vector z = [ 0 0 -1].
+## x = [2 2 2]; y = [1 2 2]; s = majle(x,y,1)
+## % returns the value 2.
+## x = [2 2]; y = [1 2 2]; s = majle(x,y)
+## % returns the value 1 and warns on tailing with zeros
+## x = [2 2]; y = [-1 2 2]; s = majle(x,y)
+## % returns the value 0 and gives two warnings on tailing with zeros
+## x = [2 -inf]; y = [4 inf]; [s,z] = majle(x,y)
+## % returns s = 1 and z = [Inf   Inf].
+## x = [2 inf]; y = [4 inf]; [s,z] = majle(x,y)
+## % returns  s = 1 and z = [NaN NaN] and a warning on NaNs in z.
+## x=speye(2); y=sparse([0 2; -1 1]); s = majle(x,y) 
+## % returns the value 2.
+## x = [2 2; 2 2]; y = [1 3 4]; [s,z] = majle(x,y) %and 
+## x = [2 2; 2 2]+i; y = [1 3 4]-2*i; [s,z] = majle(x,y)
+## % both return s = 2 and z = [2 3 2 0]. 
+## x = [1 1 1 1 0]; y = [1 1 1 1 1 0 0]'; s = majle(x,y)
+## % returns the value 1 and warns on tailing with zeros
+## @end group
+## @end example
+##
+## One can use this function to check numerically the validity of the
+## Schur-Horn,Lidskii-Mirsky-Wielandt, and Gelfand-Naimark theorems: 
+## @example
+## @group
+## clear all; n=100; majleTol=n*n*eps;
+## A = randn(n,n); A = A'+A; eA = -sort(-eig(A)); dA = diag(A);
+## majle(dA,eA,majleTol) % returns the value 2
+## % which is the Schur-Horn theorem; and 
+## B=randn(n,n); B=B'+B; eB=-sort(-eig(B)); 
+## eAmB=-sort(-eig(A-B));
+## majle(eA-eB,eAmB,majleTol) % returns the value 2 
+## % which is the Lidskii-Mirsky-Wielandt theorem; finally
+## A = randn(n,n); sA = -sort(-svd(A)); 
+## B = randn(n,n); sB = -sort(-svd(B));
+## sAB = -sort(-svd(A*B));
+## majle(log2(sAB)-log2(sA), log2(sB), majleTol) % retuns the value 2
+## majle(log2(sAB)-log2(sB), log2(sA), majleTol) % retuns the value 2
+## % which are the log versions of the Gelfand-Naimark theorems
+## @end group
+## @end example
+## @end deftypefn
 
-%   Tested in MATLAB 7.9.0.529 (R2009b) and Octave 3.2.3. 
 function [s,z]=majle(x,y,majleTol)
 
     if (nargin < 2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/inst/ztvals.m 
new/general-2.1.1/inst/ztvals.m
--- old/general-2.1.0/inst/ztvals.m     2018-05-13 23:01:51.408133896 +0200
+++ new/general-2.1.1/inst/ztvals.m     2020-03-05 14:21:19.000000000 +0100
@@ -42,3 +42,7 @@
   endif
 
 endfunction
+
+%!assert(ztvals([1 0.4 -0.4 -1], 0.5), [1 0 0 -1]) 
+%!assert(ztvals(double([1e-11 1e-6 1])), [0 1e-6 1]) 
+%!assert(ztvals(single([1e-11 1e-6 1])), single([0 0 1])) 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/octave-general.metainfo.xml 
new/general-2.1.1/octave-general.metainfo.xml
--- old/general-2.1.0/octave-general.metainfo.xml       1970-01-01 
01:00:00.000000000 +0100
+++ new/general-2.1.1/octave-general.metainfo.xml       2020-03-05 
14:21:19.000000000 +0100
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="addon">
+  <id>octave-general</id>
+  <extends>www.octave.org-octave.desktop</extends>
+  <name>General</name>
+  <summary>General tools for GNU Octave</summary>
+  <description>
+    <p>Provides functions for dictionaries, field packing,
+    SHA1 hashing and more.
+    </p>
+  </description>
+  <keywords>
+    <keyword>dictionary</keyword>
+    <keyword>field packing</keyword>
+    <keyword>sha1</keyword>
+    <keyword>planar resampling</keyword>
+  </keywords>
+  <url type="homepage">http://octave.sourceforge.net/general</url>
+  <url type="bugtracker">https://savannah.gnu.org/projects/octave</url>
+  <project_license>GPL-3.0+</project_license>
+  <update_contact>[email protected]</update_contact>
+  <metadata_license>FSFAP</metadata_license>
+</component>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/Makefile.in 
new/general-2.1.1/src/Makefile.in
--- old/general-2.1.0/src/Makefile.in   2018-05-13 23:01:51.408133896 +0200
+++ new/general-2.1.1/src/Makefile.in   2020-03-05 14:21:19.000000000 +0100
@@ -1,4 +1,5 @@
 MKOCTFILE := @MKOCTFILE@
+OCTAVE_CONFIG := @OCTAVE_CONFIG@
 CXXFLAGS  := @CXXFLAGS@ @DEFS@
 LIBS      := @LIBS@
 LDFLAGS   := @LDFLAGS@
@@ -6,18 +7,25 @@
 NETTLE_CFLAGS := @NETTLE_CFLAGS@
 NETTLE_LIBS := @NETTLE_LIBS@
 
+ARCHDIR   := "$(shell $(OCTAVE_CONFIG) -p CANONICAL_HOST_TYPE)-$(shell 
$(OCTAVE_CONFIG) -p API_VERSION)"
+
 ifndef MKOCTFILE
 MKOCTFILE := mkoctfile -Wall
 endif
 
 PROGS = $(patsubst %.cc,%.oct,$(wildcard *.cc))
-TST_DIR    := ../inst/test
+TST_DIR    := ../inst/$(ARCHDIR)
 CC_SOURCES  := $(wildcard *.cc)
 CC_TST_SOURCES := $(shell $(GREP) --files-with-matches '^%!' $(CC_SOURCES))
 TST_SOURCES := $(patsubst %.cc,${TST_DIR}/%.cc-tst,$(CC_TST_SOURCES))
 
 
-all: $(PROGS) $(TST_SOURCES)
+ifeq ("@ENABLE_SRC_BISTS@","1")
+  PROGS += tests
+endif
+
+.PHONY: all
+all: $(PROGS)
 
 SHA1.oct: SHA1.cc
        $(MKOCTFILE) $< $(CXXFLAGS) $(NETTLE_CFLAGS) $(LDFLAGS) $(LIBS) 
$(NETTLE_LIBS)
@@ -27,11 +35,22 @@
 $(TST_DIR):
        @mkdir -p "$@"
 
-$(TST_SOURCES): $(TST_DIR)/%.cc-tst: %.cc | $(TST_DIR)
+.PHONY: tests
+tests: $(TST_SOURCES)
+
+$(TST_DIR)/%.cc-tst: %.cc | $(TST_DIR)
        @echo "Extracting tests from $< ..."
        @$(RM) -f "$@" "$@-t"
        @(      echo "## Generated from $<"; \
        $(GREP) '^%!' "$<") > "$@"
 
+.PHONY: clean
 clean:
        rm -f *.o octave-core core *.oct *~
+       test -e $(TST_DIR) && rm -f $(TST_SOURCES) || true
+       test -e $(TST_DIR) && rmdir $(TST_DIR) || true
+
+.PHONY: distclean
+distclean: clean
+       rm -rf autom4te.cache
+       rm -f Makefile config.status config.log config.h configure
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/SHA1.cc 
new/general-2.1.1/src/SHA1.cc
--- old/general-2.1.0/src/SHA1.cc       2018-05-13 23:01:51.408133896 +0200
+++ new/general-2.1.1/src/SHA1.cc       2020-03-05 14:21:19.000000000 +0100
@@ -1,5 +1,5 @@
 // Copyright (C) 1999 Andy Adler <[email protected]>
-// Copyright (C) 2018 John Donoghue <[email protected]>
+// Copyright (C) 2018-2020 John Donoghue <[email protected]>
 //
 // This program is free software; you can redistribute it and/or modify it 
under
 // the terms of the GNU General Public License as published by the Free 
Software
@@ -29,20 +29,23 @@
 
 
 DEFUN_DLD (SHA1, args, ,
-  "hash = SHA1 (...)\n\
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} @var{hash} = SHA1(@var{byte_stream}\n\
+@deftypefnx {Loadable Function} @var{hash} = SHA1(@var{byte_stream}, 
@var{hash_initial})\n\
+\n\
 SHA1 implements the Secure Hash Algorithm Cryptographic\n\
 Hashing (One-Way) function.  (FIPS PUB 180-1)\n\
 \n\
-hash= SHA1( byte_stream, hash_initial )\n\
-hash = Row Vector of  20 byte values;\n\
+@var{hash} is a Row Vector of 20 byte values\n\
 \n\
-hash_initial default is 67452301 EFCDAB89 98BADCFE 10325476 C3D2E1F0\n\
+@var{hash_initial} default is 67452301 EFCDAB89 98BADCFE 10325476 C3D2E1F0\n\
 \n\
 Note: while it is possible to create a \"poor-man's\" MAC (message\n\
 authenticity code) by setting hash_initial to a private value,\n\
 it is better to use an algorithm like HMAC.\n\
 \n\
-HMAC= SHA1( [ passcode, SHA1( [passcode, data ] ) ); ")
+HMAC = SHA1( [ passcode, SHA1( [passcode, data ] ) );\n \
+@end deftypefn")
 {
 #ifndef HAVE_NETTLE
   error ("SHA1: Your system doesn't support or wasnt compiled with the SHA1 
interface");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/aclocal.m4 
new/general-2.1.1/src/aclocal.m4
--- old/general-2.1.0/src/aclocal.m4    2018-05-13 23:01:51.756132186 +0200
+++ new/general-2.1.1/src/aclocal.m4    2020-03-05 14:21:19.000000000 +0100
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -13,7 +13,7 @@
 
 m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], 
[])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
 dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
-dnl serial 11 (pkg-config-0.29)
+dnl serial 11 (pkg-config-0.29.1)
 dnl
 dnl Copyright © 2004 Scott James Remnant <[email protected]>.
 dnl Copyright © 2012-2015 Dan Nicholson <[email protected]>
@@ -55,7 +55,7 @@
 dnl See the "Since" comment for each macro you use to see what version
 dnl of the macros you require.
 m4_defun([PKG_PREREQ],
-[m4_define([PKG_MACROS_VERSION], [0.29])
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
 m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
     [m4_fatal([pkg.m4 version $1 or higher is required but 
]PKG_MACROS_VERSION[ found])])
 ])dnl PKG_PREREQ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/config.h.in 
new/general-2.1.1/src/config.h.in
--- old/general-2.1.0/src/config.h.in   2018-05-13 23:01:52.076130613 +0200
+++ new/general-2.1.1/src/config.h.in   2020-03-05 14:21:19.000000000 +0100
@@ -8,6 +8,18 @@
 /* Define to 1 if you have the <octave/interpreter.h> header file. */
 #undef HAVE_OCTAVE_INTERPRETER_H
 
+/* Have interpreter::assign */
+#undef OCTAVE_HAVE_INTERPRETER_ASSIGN
+
+/* Have interpreter::mark_for_deletion */
+#undef OCTAVE_HAVE_INTERPRETER_MARK_FOR_DELETION
+
+/* Have interpreter::varval */
+#undef OCTAVE_HAVE_INTERPRETER_VARVAL
+
+/* macro for alternative Octave symbols */
+#undef OCTAVE__VALID_IDENTIFIER
+
 /* macro for alternative Octave symbols */
 #undef OV_ISMAP
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/configure 
new/general-2.1.1/src/configure
--- old/general-2.1.0/src/configure     2018-05-13 23:01:51.920131379 +0200
+++ new/general-2.1.1/src/configure     2020-03-05 14:21:19.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for general 2.1.0.
+# Generated by GNU Autoconf 2.69 for general 2.1.1.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,14 +577,15 @@
 # Identity of this package.
 PACKAGE_NAME='general'
 PACKAGE_TARNAME='general'
-PACKAGE_VERSION='2.1.0'
-PACKAGE_STRING='general 2.1.0'
+PACKAGE_VERSION='2.1.1'
+PACKAGE_STRING='general 2.1.1'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
 ac_unique_file="packfields.cc"
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
+ENABLE_SRC_BISTS
 NETTLE_LIBS
 NETTLE_CFLAGS
 PKG_CONFIG_LIBDIR
@@ -598,6 +599,7 @@
 LDFLAGS
 CXXFLAGS
 CXX
+SED
 GREP
 AWK
 OCTAVE_CONFIG
@@ -1210,7 +1212,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures general 2.1.0 to adapt to many kinds of systems.
+\`configure' configures general 2.1.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1272,7 +1274,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of general 2.1.0:";;
+     short | recursive ) echo "Configuration of general 2.1.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1360,7 +1362,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-general configure 2.1.0
+general configure 2.1.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1483,7 +1485,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by general $as_me 2.1.0, which was
+It was created by general $as_me 2.1.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2031,6 +2033,75 @@
  GREP="$ac_cv_path_GREP"
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not 
truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null 
|| break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
 
 # The same value of CXX as Octave was compiled with is supposed to be used.
 CXX=${CXX:-`${MKOCTFILE} -p CXX`}
@@ -2902,13 +2973,62 @@
 # CXXFLAGS=
 CPPFLAGS="$OCTINCLUDEDIR $CPPFLAGS"
 
-## Simple symbol alternatives of different Octave versions.
 
+for ac_header in octave/interpreter.h
+do :
+  ac_fn_cxx_check_header_compile "$LINENO" "octave/interpreter.h" 
"ac_cv_header_octave_interpreter_h" "#include <octave/oct.h>
+
+"
+if test "x$ac_cv_header_octave_interpreter_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_OCTAVE_INTERPRETER_H 1
+_ACEOF
+
+fi
+
+done
+
+
+## Simple symbol alternatives of different Octave versions.
 
 
 echo '/* generated by configure */' > oct-alt-includes.h
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking   valid_identifier or 
octave::valid_identifier" >&5
+$as_echo_n "checking   valid_identifier or octave::valid_identifier... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <octave/oct.h>
+
+
+int
+main ()
+{
+octave::valid_identifier ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+$as_echo "#define OCTAVE__VALID_IDENTIFIER octave::valid_identifier" 
>>confdefs.h
+
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: 
octave::valid_identifier" >&5
+$as_echo "octave::valid_identifier" >&6; }
+     echo '
+' >> oct-alt-includes.h
+else
+
+$as_echo "#define OCTAVE__VALID_IDENTIFIER   valid_identifier" >>confdefs.h
+
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result:   valid_identifier" >&5
+$as_echo "  valid_identifier" >&6; }
+     echo '' >> oct-alt-includes.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking   is_map or isstruct" >&5
 $as_echo_n "checking   is_map or isstruct... " >&6; }
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2952,19 +3072,97 @@
 
 
 
-for ac_header in octave/interpreter.h
-do :
-  ac_fn_cxx_check_header_compile "$LINENO" "octave/interpreter.h" 
"ac_cv_header_octave_interpreter_h" "#include <octave/oct.h>
 
-"
-if test "x$ac_cv_header_octave_interpreter_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_OCTAVE_INTERPRETER_H 1
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking interpreter::varval" >&5
+$as_echo_n "checking interpreter::varval... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <octave/oct.h>
+                      #include <octave/interpreter.h>
+
+int
+main ()
+{
+octave::interpreter *interp; interp->varval ("varname");
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+$as_echo "#define OCTAVE_HAVE_INTERPRETER_VARVAL 1" >>confdefs.h
+
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking interpreter::assign" >&5
+$as_echo_n "checking interpreter::assign... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <octave/oct.h>
+                      #include <octave/interpreter.h>
+
+int
+main ()
+{
+octave::interpreter *interp; interp->assign ("varname", octave_value ());
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+$as_echo "#define OCTAVE_HAVE_INTERPRETER_ASSIGN 1" >>confdefs.h
+
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking 
interpreter::mark_for_deletion" >&5
+$as_echo_n "checking interpreter::mark_for_deletion... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <octave/oct.h>
+                      #include <octave/interpreter.h>
+
+int
+main ()
+{
+octave::interpreter *interp; interp->mark_for_deletion ("varname");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+$as_echo "#define OCTAVE_HAVE_INTERPRETER_MARK_FOR_DELETION 1" >>confdefs.h
+
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 
 LIBS=$TLIBS
@@ -2977,7 +3175,16 @@
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext 
$LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+
 # End of checks for Octave features.
+octave_major_ver=`$OCTAVE_CONFIG -p VERSION | $SED -e "s/\..*$//"`
+if test -z "$octave_major_ver"; then
+  octave_major_ver=4
+fi
+if test $octave_major_ver -gt 3; then
+  ENABLE_SRC_BISTS=1
+
+fi
 
 ac_config_files="$ac_config_files Makefile"
 
@@ -3487,7 +3694,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by general $as_me 2.1.0, which was
+This file was extended by general $as_me 2.1.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -3549,7 +3756,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-general config.status 2.1.0
+general config.status 2.1.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/configure.ac 
new/general-2.1.1/src/configure.ac
--- old/general-2.1.0/src/configure.ac  2018-05-13 23:01:51.408133896 +0200
+++ new/general-2.1.1/src/configure.ac  2020-03-05 14:21:19.000000000 +0100
@@ -2,6 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 #
 ### Copyright (C) 2015-2017 Olaf Till <[email protected]>
+### Copyright (C) 2018-2020 John DOnoghue <[email protected]>
 ###
 ### This program is free software; you can redistribute it and/or
 ### modify it under the terms of the GNU General Public License as
@@ -18,7 +19,7 @@
 ### <http://www.gnu.org/licenses/>.
 
 AC_PREREQ([2.67])
-AC_INIT([general], [2.1.0])
+AC_INIT([general], [2.1.1])
 AC_CONFIG_SRCDIR([packfields.cc])
 AC_CONFIG_HEADERS([config.h])
 
@@ -43,6 +44,7 @@
 fi
 
 AC_PROG_GREP
+AC_PROG_SED
 
 # The same value of CXX as Octave was compiled with is supposed to be used.
 CXX=${CXX:-`${MKOCTFILE} -p CXX`}
@@ -78,10 +80,25 @@
 # CXXFLAGS=
 CPPFLAGS="$OCTINCLUDEDIR $CPPFLAGS"
 
+AC_CHECK_HEADERS([octave/interpreter.h],
+  [],
+  [],
+  [#include <octave/oct.h>]
+)
+
 ## Simple symbol alternatives of different Octave versions.
 OF_OCTAVE_LIST_ALT_SYMS([
 
 [dnl
+  [valid_identifier],
+  [octave::valid_identifier],
+  [[octave::valid_identifier ("");]],
+  [OCTAVE__VALID_IDENTIFIER],
+  [],
+  []
+],
+
+[dnl
   [is_map],
   [isstruct],
   [[octave_value ().isstruct ();]],
@@ -93,10 +110,25 @@
 ],
    [oct-alt-includes.h])
 
-AC_CHECK_HEADERS([octave/interpreter.h],
-  [],
-  [],
-  [#include <octave/oct.h>]
+OF_OCTAVE_CHECK_SYM(
+  [interpreter::varval],
+  [[octave::interpreter *interp; interp->varval ("varname");]],
+  [OCTAVE_HAVE_INTERPRETER_VARVAL],
+  [[#include <octave/interpreter.h>]]
+)
+
+OF_OCTAVE_CHECK_SYM(
+  [interpreter::assign],
+  [[octave::interpreter *interp; interp->assign ("varname", octave_value 
());]],
+  [OCTAVE_HAVE_INTERPRETER_ASSIGN],
+  [[#include <octave/interpreter.h>]]
+)
+
+OF_OCTAVE_CHECK_SYM(
+  [interpreter::mark_for_deletion],
+  [[octave::interpreter *interp; interp->mark_for_deletion ("varname");]],
+  [OCTAVE_HAVE_INTERPRETER_MARK_FOR_DELETION],
+  [[#include <octave/interpreter.h>]]
 )
 
 LIBS=$TLIBS
@@ -104,7 +136,16 @@
 CXXFLAGS=$TCXXFLAGS
 CPPFLAGS=$TCPPFLAGS
 AC_LANG_POP([C++])
+
 # End of checks for Octave features.
+octave_major_ver=`$OCTAVE_CONFIG -p VERSION | $SED -e "s/\..*$//"`
+if test -z "$octave_major_ver"; then
+  octave_major_ver=4
+fi
+if test $octave_major_ver -gt 3; then
+  ENABLE_SRC_BISTS=1
+  AC_SUBST(ENABLE_SRC_BISTS)
+fi
 
 AC_CONFIG_FILES([Makefile])
 AC_OUTPUT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/m4/octave-forge.m4 
new/general-2.1.1/src/m4/octave-forge.m4
--- old/general-2.1.0/src/m4/octave-forge.m4    2018-05-13 23:01:51.408133896 
+0200
+++ new/general-2.1.1/src/m4/octave-forge.m4    2020-03-05 14:21:19.000000000 
+0100
@@ -1,4 +1,5 @@
 # Copyright (C) 2017 Olaf Till <[email protected]>
+# Copyright (C) 2019 John D <[email protected]>
 # Modifications to print what is searching for by JohnD
 #
 # This program is free software; you can redistribute it and/or modify
@@ -91,3 +92,24 @@
 AH_BOTTOM([#include "$2"])
 
 ])
+
+# check whether can compile 
+# arguments:
+# $1: symbol
+# $2: test for symbol version 2
+# $3: macro name define if sucessfull
+# $4: include directives
+AC_DEFUN([OF_OCTAVE_CHECK_SYM], [
+AC_MSG_CHECKING([$1])
+  AC_COMPILE_IFELSE(
+    [AC_LANG_PROGRAM([[#include <octave/oct.h>]
+                      $4],
+                     [$2])],
+    [AC_DEFINE($3,
+               [1],
+               [Have $1])
+     AC_MSG_RESULT([yes])
+    ],
+    [AC_MSG_RESULT(no)]
+)
+])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/mark_for_deletion.cc 
new/general-2.1.1/src/mark_for_deletion.cc
--- old/general-2.1.0/src/mark_for_deletion.cc  2018-05-13 23:01:51.408133896 
+0200
+++ new/general-2.1.1/src/mark_for_deletion.cc  2020-03-05 14:21:19.000000000 
+0100
@@ -1,4 +1,4 @@
-// Copyright (C) 2002 Andy Adler
+// Copyright (C) 2002-2020 Andy Adler
 //
 // This program is free software; you can redistribute it and/or modify it 
under
 // the terms of the GNU General Public License as published by the Free 
Software
@@ -16,11 +16,27 @@
 #include <octave/oct.h>
 #include <octave/file-io.h>
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_OCTAVE_INTERPRETER_H
+# include <octave/interpreter.h>
+#endif
+
+
+#ifdef DEFMETHOD_DLD
+DEFMETHOD_DLD (mark_for_deletion, interp, args, ,
+#else
 DEFUN_DLD (mark_for_deletion, args,,
-"mark_for_deletion ( filename1, filename2, ... );\n\
-put filenames in the list of files to be deleted\n\
+#endif
+"-*- texinfo -*-\n \
+@deftypefn {Loadable Function} mark_for_deletion (@var{filename}, ...);\n\
+Put filenames in the list of files to be deleted\n\
 when octave terminates.\n\
-This is useful for any function which uses temprorary files.")
+\n \
+This is useful for any function which uses temprorary files.\n \
+@end deftypefn")
 {
   octave_value retval;
   for ( int i=0; i< args.length(); i++) {
@@ -28,8 +44,22 @@
       error ("mark_for_deletion: arguments must be string filenames");
       return retval;
     } else {
+
+#ifdef OCTAVE_HAVE_INTERPRETER_MARK_FOR_DELETION
+      interp.mark_for_deletion( args(i).string_value() );
+#else
       mark_for_deletion( args(i).string_value() );
+#endif
     }
   }
   return retval;
 }
+
+#if 0
+%!test
+%! testname = tempname;
+%! mark_for_deletion(testname);
+%! mark_for_deletion(testname, testname);
+
+%!error <arguments must be string filenames> mark_for_deletion(1)
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/packfields.cc 
new/general-2.1.1/src/packfields.cc
--- old/general-2.1.0/src/packfields.cc 2018-05-13 23:01:51.408133896 +0200
+++ new/general-2.1.1/src/packfields.cc 2020-03-05 14:21:19.000000000 +0100
@@ -58,69 +58,92 @@
   if (nargin > 0)
     {
 #ifdef DEFMETHOD_DLD
+#ifndef OCTAVE_HAVE_INTERPRETER_VARVAL
       octave::symbol_table::scope curr_scope
        = interp.require_current_scope ("packfields");
 #endif
-
+#endif
+      if (! args (0).is_string ())
+        {
+            error ("packfields: expected variable name");
+           return octave_value ();
+        }
       std::string struct_name = args (0).string_value ();
       string_vector fld_names(nargin-1);
       octave_value_list fld_vals(nargin-1);
 
-      if (! error_state && ! valid_identifier (struct_name))
-        error ("packfields: invalid variable name: %s", struct_name.c_str ());
-
+      if (! OCTAVE__VALID_IDENTIFIER (struct_name))
+        {
+          error ("packfields: invalid variable name: %s",
+                 struct_name.c_str ());
+          return octave_value ();
+        }
       for (octave_idx_type i = 0; i < nargin-1; i++)
         {
-          if (error_state)
-            break;
+          if (! args (i+1).is_string ())
+            {
+              error ("packfields: expected variable name for input %d", 
(int)i+1);
+             return octave_value ();
+            }
 
           std::string fld_name = args(i+1).string_value ();
 
-          if (error_state)
-            break;
-
-          if (valid_identifier (fld_name))
+          if (OCTAVE__VALID_IDENTIFIER (fld_name))
             {
               fld_names(i) = fld_name;
 
 #ifdef DEFMETHOD_DLD
+#ifdef OCTAVE_HAVE_INTERPRETER_VARVAL
+              octave_value fld_val = interp.varval (fld_name);
+#else
               octave_value fld_val = curr_scope.varval (fld_name);
+#endif
 #else
               octave_value fld_val = symbol_table::varval (fld_name);
 #endif
               if (fld_val.is_defined ())
                 fld_vals(i) = fld_val;
               else
-                error ("packfields: variable %s not defined", fld_name.c_str 
());
+               {
+                  error ("packfields: variable %s not defined", fld_name.c_str 
());
+                  return octave_value ();
+               }
             }
           else
-            error ("packfields: invalid field name: %s", fld_name.c_str ());
+            {
+              error ("packfields: invalid field name: %s", fld_name.c_str ());
+              return octave_value ();
+            }
         }
 
-      if (! error_state)
-        {
 #ifdef DEFMETHOD_DLD
-          octave_value struct_val = curr_scope.varval (struct_name);
+#ifdef OCTAVE_HAVE_INTERPRETER_VARVAL
+      octave_value struct_val = interp.varval (struct_name);
 #else
-          octave_value struct_val = symbol_table::varval (struct_name);
+      octave_value struct_val = curr_scope.varval (struct_name);
 #endif
+#else
+      octave_value struct_val = symbol_table::varval (struct_name);
+#endif
+      octave_scalar_map map;
 
-          octave_scalar_map map;
-
-          if (struct_val.is_defined () && struct_val.OV_ISMAP ())
-            map = struct_val.scalar_map_value ();
+      if (struct_val.is_defined () && struct_val.OV_ISMAP ())
+        map = struct_val.scalar_map_value ();
 
-          for (octave_idx_type i = 0; i < nargin-1; i++)
-            map.assign (fld_names(i), fld_vals(i));
+      for (octave_idx_type i = 0; i < nargin-1; i++)
+        map.assign (fld_names(i), fld_vals(i));
 
-          struct_val = map;
+      struct_val = map;
 
 #ifdef DEFMETHOD_DLD
-          curr_scope.assign (struct_name, struct_val);
+#ifdef OCTAVE_HAVE_INTERPRETER_ASSIGN
+      interp.assign (struct_name, struct_val);
 #else
-          symbol_table::assign (struct_name, struct_val);
+      curr_scope.assign (struct_name, struct_val);
+#endif
+#else
+      symbol_table::assign (struct_name, struct_val);
 #endif
-        }
     }
   else
     print_usage ();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/general-2.1.0/src/unpackfields.cc 
new/general-2.1.1/src/unpackfields.cc
--- old/general-2.1.0/src/unpackfields.cc       2018-05-13 23:01:51.408133896 
+0200
+++ new/general-2.1.1/src/unpackfields.cc       2020-03-05 14:21:19.000000000 
+0100
@@ -37,7 +37,7 @@
 Create variables from fields of a struct.\n\
 \n\
 Inserts the named fields @var{fld1}, @var{fld2}, @dots{}, from the struct\n\
-named @var{s_name}, into the current scope.  Noe that @var{s_name} is the\n\
+named @var{s_name}, into the current scope.  Note that @var{s_name} is the\n\
 name of the struct in the current scope, not the struct itself.\n\
 \n\
 @example\n\
@@ -64,87 +64,110 @@
   if (nargin > 0)
     {
 #ifdef DEFMETHOD_DLD
+#ifndef OCTAVE_HAVE_INTERPRETER_VARVAL
       octave::symbol_table::scope curr_scope
        = interp.require_current_scope ("unpackfields");
 #endif
-
+#endif
+      if (! args (0).is_string ())
+        {
+            error ("unpackfields: expected variable name");
+           return octave_value ();
+        }
+ 
       std::string struct_name = args (0).string_value ();
       string_vector fld_names(nargin-1);
 
-      if (! error_state && ! valid_identifier (struct_name))
-        error ("unpackfields: invalid variable name: %s", struct_name.c_str 
());
+      if (! OCTAVE__VALID_IDENTIFIER (struct_name))
+        {
+          error ("unpackfields: invalid variable name: %s",
+                 struct_name.c_str ());
+           return octave_value ();
+        }
 
       for (octave_idx_type i = 0; i < nargin-1; i++)
         {
-          if (error_state)
-            break;
+          if (! args (i+1).is_string ())
+            {
+              error ("unpackfields: expected variable name for input %d", 
(int)i+1);
+             return octave_value ();
+            }
 
           std::string fld_name = args(i+1).string_value ();
 
-          if (error_state)
-            break;
-
-          if (valid_identifier (fld_name))
+          if (OCTAVE__VALID_IDENTIFIER (fld_name))
             fld_names(i) = fld_name;
           else
-            error ("unpackfields: invalid field name: %s", fld_name.c_str ());
+            {
+              error ("unpackfields: invalid field name: %s", fld_name.c_str 
());
+              return octave_value ();
+            }
         }
 
-      if (! error_state)
-        {
-          // Force the symbol to be inserted in caller's scope.
+      // Force the symbol to be inserted in caller's scope.
 #ifdef DEFMETHOD_DLD
-          octave_value struct_val = curr_scope.varval (struct_name);
+#ifdef OCTAVE_HAVE_INTERPRETER_VARVAL
+      octave_value struct_val = interp.varval (struct_name);
 #else
-          octave_value struct_val = symbol_table::varval (struct_name);
+      octave_value struct_val = curr_scope.varval (struct_name);
 #endif
-          if (struct_val.OV_ISMAP ())
+#else
+      octave_value struct_val = symbol_table::varval (struct_name);
+#endif
+      if (struct_val.OV_ISMAP ())
+        {
+         if (struct_val.ndims () == 2)
             {
               // Fast code for a built-in struct.
               const octave_scalar_map map = struct_val.scalar_map_value ();
 
-              if (! error_state)
+              // Do the actual work.
+              for (octave_idx_type i = 0; i < nargin-1; i++)
                 {
-                  // Do the actual work.
-                  for (octave_idx_type i = 0; i < nargin-1; i++)
-                    {
-                      octave_scalar_map::const_iterator iter = map.seek 
(fld_names(i));
-                      if (iter != map.end ())
+                  octave_scalar_map::const_iterator iter = map.seek 
(fld_names(i));
+                  if (iter != map.end ())
 #ifdef DEFMETHOD_DLD
-                        curr_scope.assign (fld_names(i), map.contents (iter));
+#ifdef OCTAVE_HAVE_INTERPRETER_ASSIGN
+                    interp.assign (fld_names(i), map.contents (iter));
+#else
+                    curr_scope.assign (fld_names(i), map.contents (iter));
+#endif
 #else
-                        symbol_table::assign (fld_names(i), map.contents 
(iter));
+                    symbol_table::assign (fld_names(i), map.contents (iter));
 #endif
-                      else
-                        {
-                          error ("unpackfields: field %s does not exist", 
fld_names(i).c_str ());
-                          break;
-                        }
+                  else
+                    {
+                      error ("unpackfields: field %s does not exist", 
fld_names(i).c_str ());
+                      break;
                     }
                 }
-              else
-                error ("unpackfields: structure must have singleton 
dimensions");
             }
-          else if (struct_val.is_defined ())
+          else
             {
-              // General case.
-              std::list<octave_value_list> idx (1);
-
-              for (octave_idx_type i = 0; i < nargin-1; i++)
-                {
-                  idx.front () = args(i+1); // Save one string->octave_value 
conversion.
-                  octave_value val = struct_val.subsref (".", idx);
+              error ("unpackfields: structure must have singleton dimensions");
+              return octave_value ();
+            }
+        }
+      else if (struct_val.is_defined ())
+        {
+          // General case.
+          std::list<octave_value_list> idx (1);
 
-                  if (error_state)
-                    break;
+          for (octave_idx_type i = 0; i < nargin-1; i++)
+            {
+              idx.front () = args(i+1); // Save one string->octave_value 
conversion.
+              octave_value val = struct_val.subsref (".", idx);
 
-                  if (val.is_defined ())
+              if (val.is_defined ())
 #ifdef DEFMETHOD_DLD
-                    curr_scope.assign (fld_names(i), val);
+#ifdef OCTAVE_HAVE_INTERPRETER_ASSIGN
+                interp.assign (fld_names(i), val);
 #else
-                    symbol_table::assign (fld_names(i), val);
+                curr_scope.assign (fld_names(i), val);
+#endif
+#else
+                symbol_table::assign (fld_names(i), val);
 #endif
-                }
             }
         }
     }


Reply via email to