fix edit macro after merge (5c7fd5f)
[scilab.git] / scilab / modules / scinotes / macros / edit.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) ????-2008 - INRIA
3 // Copyright (C) 2008 - INRIA - Allan CORNET
4 // Copyright (C) 2010 - DIGITEO - Allan CORNET
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 // Copyright (C) 2018 - Samuel GOUGEON
7 //
8 // This file is hereby licensed under the terms of the GNU GPL v2.0,
9 // pursuant to article 5.3.4 of the CeCILL v.2.1.
10 // This file was originally licensed under the terms of the CeCILL v2.1,
11 // and continues to be available under such terms.
12 // For more information, see the COPYING file which you should have received
13 // along with this program.
14
15 function edit(macroname, linenumber)
16     // macroname : character string giving a macroname
17     // linenumber : line number (as decimal number or literal one)
18
19     [lhs,rhs] = argn(0);
20     if (rhs > 2) then
21         msg = _("%s: Wrong number of input argument(s): At least %d expected.\n")
22         error(msprintf(msg, "edit", 1));
23     end
24
25     if (rhs >= 1 & type(macroname) ~= 10) then
26         msg = _("%s: Wrong type for input argument #%d: String expected.\n")
27         error(msprintf(msg, "edit", 1));
28     end
29
30     if rhs == 2 then
31         if and(type(linenumber)~=[1 10]) | (type(linenumber)==10 & isnan(strtod(linenumber(1)))) then
32             msg = _("%s: Wrong type for input argument #%d: Number expected.\n")
33             error(msprintf(msg, "edit", 2));
34         end
35         linenumber = strtod(linenumber(1))
36     end
37
38     found = %f;
39     tmp = %f;
40     // tmpdir will have trailing / or \
41     tmpdir= pathconvert(TMPDIR);
42
43     if rhs >= 1 then // macroname or filename is given
44         if regexp(macroname, "/^([a-zA-Z%_#!$?][0-9a-zA-Z_#!$?]*)$/") == [] then
45             // File
46             fname = macroname;
47             found = %t;
48         else
49             if isdef(macroname)
50                 execstr("object = "+macroname)
51                 if type(object)==13
52                     // macroname may be an alias. Example: sinus = sind
53                     // We need to get the original macro name to edit it:
54                     tree = macr2tree(object);
55                     tmp = tree.name
56                     if tmp ~= macroname then
57                         msg = _("edit: ""%s"" is an alias of ""%s"" => editing %s()\n      Please reset %s=%s if %s() is recompiled.\n")
58                         warning(msprintf(msg, macroname, tmp, tmp, macroname, tmp, tmp))
59                         macroname = tmp
60                     end
61
62                     libr = whereis(macroname);
63                     if type(libr($))==10 & libr($)=="script"
64                         // the user-defined macro may overwrite a macro in library
65                         path = whereis_in_libs(macroname)
66                         if path ~= []
67                             // priority = from library:
68                             fname = pathconvert(path) + macroname + ".sci"
69                         else
70                             txt = tree2code(tree, %t);
71                             fname = tmpdir + macroname + ".sci";
72                             mputl(txt, fname);
73                         end
74                         found = %t
75                     else // libr is either a module name or a library name
76                         libr = libr($)
77                         err = execstr("tmp="+libr, "errcatch")
78                         if ~err & type(tmp)==14
79                             [macrolist, path] = libraryinfo(libr);
80                             fname = pathconvert(path) + macroname + ".sci"
81                             found = %t
82                         else // either a module name or any variable name:
83                             // If macroname is a user-defined function,
84                             // whereis() would have reported it as "script".
85                             // => it's a macro in a library, but with a
86                             // macroname equal to a built-in name
87                             // => we must retrieve the library without whereis()
88                             path = whereis_in_libs(macroname)
89                             if path ~= []
90                                 fname = pathconvert(path) + macroname + ".sci"
91                                 found = %t
92                             end
93                         end
94                     end
95                 end
96
97                 if ~found & funptr(macroname)<>0 then
98                     error(msprintf(gettext("%s: %s() is an uneditable hard coded function.\n"), "edit", macroname));
99                 end
100             end
101         end
102     end
103
104     if ~found
105         if ~isdef("macroname","l")
106             macroname = "untitled"
107         end
108         fname = tmpdir + macroname + ".sci";
109         txt = ["function [] = " + macroname + "()"; "endfunction"];
110         mputl(txt, fname);
111     end
112
113     // call the editor with the filename
114     if (rhs == 2) then
115         editor(fname, linenumber, macroname);
116     else
117         editor(fname);
118     end
119
120 endfunction
121
122 // ----------------------------------------------------------------------------
123
124 function path = whereis_in_libs(macroname)
125     path = []
126     for l = librarieslist()'
127         [m, p] = libraryinfo(l)
128         if or(m==macroname)
129             path = p
130             break
131         end
132     end
133 endfunction