]> Creatis software - CreaPhase.git/blobdiff - octave_packages/m/miscellaneous/license.m
update packages
[CreaPhase.git] / octave_packages / m / miscellaneous / license.m
diff --git a/octave_packages/m/miscellaneous/license.m b/octave_packages/m/miscellaneous/license.m
new file mode 100644 (file)
index 0000000..a18c929
--- /dev/null
@@ -0,0 +1,187 @@
+## Copyright (C) 2005-2012 William Poetra Yoga Hadisoeseno
+##
+## This file is part of Octave.
+##
+## Octave 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 Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} license
+## Display the license of Octave.
+##
+## @deftypefnx {Function File} {} license ("inuse")
+## Display a list of packages currently being used.
+##
+## @deftypefnx {Function File} {@var{retval} =} license ("inuse")
+## Return a structure containing the fields @code{feature} and @code{user}.
+##
+## @deftypefnx {Function File} {@var{retval} =} license ("test", @var{feature})
+## Return 1 if a license exists for the product identified by the string
+## @var{feature} and 0 otherwise.  The argument @var{feature} is case
+## insensitive and only the first 27 characters are checked.
+##
+## @deftypefnx {Function File} {} license ("test", @var{feature}, @var{toggle})
+## Enable or disable license testing for @var{feature}, depending on
+## @var{toggle}, which may be one of:
+##
+## @table @asis
+## @item "enable"
+## Future tests for the specified license of @var{feature} are conducted
+## as usual.
+##
+## @item "disable"
+## Future tests for the specified license of @var{feature} return 0.
+## @end table
+##
+## @deftypefnx {Function File} {@var{retval} =} license ("checkout", @var{feature})
+## Check out a license for @var{feature}, returning 1 on success and 0
+## on failure.
+##
+## This function is provided for compatibility with @sc{matlab}.
+## @seealso{ver, version}
+## @end deftypefn
+
+## Author: William Poetra Yoga Hadisoeseno <williampoetra@gmail.com>
+
+function retval = license (varargin)
+
+  persistent __octave_licenses__;
+
+  if (isempty (__octave_licenses__))
+    __octave_licenses__ = cell ();
+    __octave_licenses__{1,1} = "Octave";
+    __octave_licenses__{1,2} = "GNU General Public License";
+    __octave_licenses__{1,3} = true;
+    if (exist ("OCTAVE_FORGE_VERSION"))
+      __octave_licenses__{2,1} = "octave-forge";
+      __octave_licenses__{2,2} = "<various licenses>";
+      __octave_licenses__{2,3} = true;
+    endif
+  endif
+
+  nout = nargout;
+  nin = nargin;
+  nr_licenses = rows (__octave_licenses__);
+
+  if (nout > 1 || nin > 3)
+    print_usage ();
+  endif
+
+  if (nin == 0)  
+
+    found = find (strcmp (__octave_licenses__(:,1), "Octave"), 1);
+
+    if (! isempty (found))
+      result = __octave_licenses__{found,2};
+    else
+      result = "unknown";
+    endif
+
+    if (nout == 0)
+      printf ("%s\n", result);
+    else
+      retval = result;
+    endif
+
+  elseif (nin == 1)
+
+    if (nout == 0)
+
+      if (! strcmp (varargin{1}, "inuse"))
+        usage ('license ("inuse")');
+      endif
+
+      printf ("%s\n", __octave_licenses__{:,1});
+
+    else
+
+      if (! strcmp (varargin{1}, "inuse"))
+        usage ('retval = license ("inuse")');
+      endif
+
+      pw = getpwuid (getuid ());
+      if (isstruct (pw))
+        username = pw.name;
+      else
+        username = "octave_user";
+      endif
+
+      retval = struct ("feature", __octave_licenses__(:,1), "user", username);
+
+    endif
+
+  else
+
+    feature = varargin{2}(1:(min ([(length (varargin{2})), 27])));
+
+    if (strcmp (varargin{1}, "test"))
+
+      found = find (strcmpi (__octave_licenses__(:,1), feature), 1);
+
+      if (nin == 2)
+        retval = ! isempty (found) && __octave_licenses__{found,3};
+      else
+        if (! isempty (found))
+          if (strcmp (varargin{3}, "enable"))
+            __octave_licenses__{found,3} = true;
+          elseif (strcmp (varargin{3}, "disable"))
+            __octave_licenses__{found,3} = false;
+          else
+            error ("license: TOGGLE must be either `enable' or `disable'");
+          endif
+        else
+          error ("license: FEATURE `%s' not found", feature);
+        endif
+      endif
+
+    elseif (strcmp (varargin{1}, "checkout"))
+
+      if (nin != 2)
+        usage ('retval = license ("checkout", feature)');
+      endif
+
+      found = find (strcmpi (__octave_licenses__(:,1), feature), 1);
+
+      retval = ! isempty (found) && __octave_licenses__{found,3};
+
+    else
+      print_usage ();
+    endif
+
+  endif
+
+endfunction
+
+
+%!assert (license(), "GNU General Public License")
+%!assert ((license ("inuse")).feature, "Octave")
+
+%!test
+%! lstate = license ("test", "Octave");
+%! license ("test", "Octave", "disable");
+%! assert (license ("test", "Octave"), false);
+%! license ("test", "Octave", "enable");
+%! assert (license ("test", "Octave"), true);
+%! if (lstate == false)
+%!   license ("test", "Octave", "disable");
+%! endif
+
+%!assert (license ("checkout", "Octave"), true)
+
+%% Test input validation
+%!error license ("not_inuse")
+%!error <TOGGLE must be either> license ("test", "Octave", "not_enable")
+%!error <FEATURE `INVALID' not found> license ("test", "INVALID", "enable")
+%!error license ("not_test", "Octave", "enable")
+