* Bug 16679 fixed: get_function_path('acosh') yielded an error
[scilab.git] / scilab / modules / functions / macros / deff.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2012 - 2016 - Scilab Enterprises
4 // Copyright (C) 2020 - Samuel GOUGEON
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function varargout = deff(varargin)
14     [lhs, rhs] = argn();
15     if rhs < 1 | rhs > 2  then
16         msg = _("%s: Wrong number of input arguments: %d or %d expected.\n")
17         error(msprintf(msg, "deff", 1, 2))
18     end
19     if rhs == 2 then    // Usual deff syntax
20         prototype = varargin(1)
21         text = matrix(varargin(2), -1, 1)
22     else
23         text = matrix(varargin(1), -1, 1)
24         if size(text,"*")==1
25             // We must split the input into the prototype and the definition
26             // The prototype is ended with the first ")":
27             [b, e, prototype] = regexp(text,"/.*?\)/", "o")
28             text = part(text,e+1:$)
29             // Case r = fun(x,y) x^2+y (single output, no r= in the definition:
30             if grep(prototype, "=") <> [] & grep(text,"=")==[]
31                 outvar = strtok(prototype, "=")
32                 if grep(outvar,",")==[]
33                     text = outvar + " = " + text
34                 end
35             end
36         else
37             prototype = varargin(1)(1)
38             text = varargin(1)(2:$)
39         end
40     end
41     // Detect @ in the prototype and replace it, if any (can't be a function's name):
42     if grep(prototype, "@") <> [] // "/(?:[^(]*?)=\s*(.+?)(?:\s*\()/")
43         prototype = strsubst(prototype, "@", "%funcname");
44     end
45
46     // try to build execstr string
47     str = ["function " + prototype ; text ; "endfunction"];
48     execstr(str);
49
50     %deff_func = funclist();
51     if size(%deff_func, "*") <= 0 | size(%deff_func, "*") <> 1 then
52         return
53     else
54         if argn(1) == 0
55             execstr(%deff_func + "= return(" + %deff_func + ")");
56         else
57             execstr("varargout = list(" + %deff_func + ");")
58         end
59     end
60 endfunction