10.6. cat.sci

cat.sci defines the function cat which prints the source of a macro (function) if it is available. The argument-, type-, and size-checking part is used in Example 5-4.


function [res] = cat(macname)
// Print definition of function 'macname'
// if it has been loaded via a library.

// AUTHOR
//   Lydia van Dijk
//
//   Copyright 1999, 2000 by Lydia van Dijk.
//   cat is free software distributed under the terms
//   of the GNU General Public License, version 2.

[nl, nr] = argn(0);
if nr ~= 1 then
    error('Call with: cat(macro_name)');
end
if type(macname) ~= 10 then
    error('Expecting a string, got a ' + typeof(macname));
end
if size(macname, '*') ~= 1 then
    sz = size(macname);
    error('Expecting a scalar, got a ' ..
      + sz(1) + 'x' + sz(2) + ' matrix')
end

[res, err] = evstr(macname);
if err ~= 0 then
    select err
    case 4 then
        disp(macname + ' is undefined.');
        return;
    case 25 then
        disp(macname + ' is a builtin function');
        return;
    else
        error('unexpected error', err);
    end // select err
end // err ~= 0

name = whereis(macname);
//disp('name = <' + name + '>');
if name == [] then
    disp(macname + ' is defined, but its definition is unaccessible');
    clear ans;
    return;
end

cont = string(evstr(name)); // path (1) and contents (2..$) of library
fpath = cont(1);
if part(fpath, 1:4) == 'SCI/' then
    fpath = SCI + '/' + part(fpath, 5:length(fpath));
end
fname = fpath + macname + '.sci';

[fh, err] = file('open', fname, 'old');
if err ~= 0 then
    error('Could not open file ' + fname, err);
end
text = read(fh, -1, 1, '(a)');
file('close', fh);
write(%io(2), text);