changeset 19224:7bc6fa304f67

computer.m: Overhaul function. * computer.m: Redo docstring. Put input validation first. Don't bother to calculate unwanted outputs. Add BIST tests for input validation.
author Rik <rik@octave.org>
date Tue, 30 Sep 2014 11:08:24 -0700
parents d70b1cec7743
children 6cf253a39fde
files scripts/miscellaneous/computer.m
diffstat 1 files changed, 47 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/miscellaneous/computer.m	Tue Sep 30 11:00:30 2014 -0700
+++ b/scripts/miscellaneous/computer.m	Tue Sep 30 11:08:24 2014 -0700
@@ -17,45 +17,49 @@
 ## <http://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn  {Function File} {[@var{c}, @var{maxsize}, @var{endian}] =} computer ()
+## @deftypefn  {Function File} {} computer ()
+## @deftypefnx {Function File} {@var{c} =} computer ()
+## @deftypefnx {Function File} {[@var{c}, @var{maxsize}] =} computer ()
+## @deftypefnx {Function File} {[@var{c}, @var{maxsize}, @var{endian}] =} computer ()
 ## @deftypefnx {Function File} {@var{arch} =} computer ("arch")
 ## Print or return a string of the form @var{cpu}-@var{vendor}-@var{os}
-## that identifies the kind of computer Octave is running on.  If invoked
-## with an output argument, the value is returned instead of printed.  For
-## example:
+## that identifies the type of computer that Octave is running on.
+##
+## If invoked with an output argument, the value is returned instead of
+## printed.  For example:
 ##
 ## @example
 ## @group
 ## computer ()
 ##    @print{} i586-pc-linux-gnu
 ##
-## x = computer ()
-##    @result{} x = "i586-pc-linux-gnu"
+## mycomp = computer ()
+##    @result{} mycomp = "i586-pc-linux-gnu"
 ## @end group
 ## @end example
 ##
 ## If two output arguments are requested, also return the maximum number
-## of elements for an array.
+## of elements for an array.  This will depend on whether Octave has been
+## compiled with 32-bit or 64-bit index vectors.
 ##
 ## If three output arguments are requested, also return the byte order
 ## of the current system as a character (@qcode{"B"} for big-endian or
 ## @qcode{"L"} for little-endian).
 ##
-## If the argument @qcode{"arch"} is specified, return a string
-## indicating the architecture of the computer on which Octave is
-## running.
+## If the argument @qcode{"arch"} is specified, return a string indicating the
+## architecture of the computer on which Octave is running.
+## @seealso{isunix, ismac, ispc}
 ## @end deftypefn
 
 function [c, maxsize, endian] = computer (a)
 
-  if (nargin == 1 && ischar (a) && strcmpi (a, "arch"))
-    tmp = ostrsplit (octave_config_info ("canonical_host_type"), "-");
-    if (numel (tmp) == 4)
-      c = sprintf ("%s-%s-%s", tmp{4}, tmp{3}, tmp{1});
-    else
-      c = sprintf ("%s-%s", tmp{3}, tmp{1});
-    endif
-  elseif (nargin == 0)
+  if (nargin > 1)
+    print_usage ();
+  elseif (nargin == 1 && ! strcmpi (a, "arch"))
+    error ('computer: "arch" is only valid argument');
+  endif
+
+  if (nargin == 0)
     msg = octave_config_info ("canonical_host_type");
 
     if (strcmp (msg, "unknown"))
@@ -63,24 +67,35 @@
     endif
 
     if (nargout == 0)
-      printf ("%s\n", msg);
+      disp (msg);
     else
       c = msg;
-      if (strcmp (octave_config_info ("USE_64_BIT_IDX_T"), "true"))
-        maxsize = 2^63-1;
-      else
-        maxsize = 2^31-1;
+      if (isargout (2))
+        if (strcmp (octave_config_info ("USE_64_BIT_IDX_T"), "true"))
+          maxsize = 2^63-1;
+        else
+          maxsize = 2^31-1;
+        endif
       endif
-      if (octave_config_info ("words_big_endian"))
-        endian = "B";
-      elseif (octave_config_info ("words_little_endian"))
-        endian = "L";
-      else
-        endian = "?";
+      if (isargout (3))
+        if (octave_config_info ("words_big_endian"))
+          endian = "B";
+        elseif (octave_config_info ("words_little_endian"))
+          endian = "L";
+        else
+          endian = "?";
+        endif
       endif
     endif
   else
-    print_usage ();
+    ## "arch" argument asked for
+    tmp = ostrsplit (octave_config_info ("canonical_host_type"), "-");
+    if (numel (tmp) == 4)
+      c = sprintf ("%s-%s-%s", tmp{4}, tmp{3}, tmp{1});
+    else
+      c = sprintf ("%s-%s", tmp{3}, tmp{1});
+    endif
+
   endif
 
 endfunction
@@ -90,5 +105,6 @@
 %!assert (computer (), octave_config_info ("canonical_host_type"))
 %!assert (ischar (computer ("arch")))
 
-%!error computer (2)
+%!error computer (1,2)
+%!error <"arch" is only valid argument> computer ("xyz")