* Bug 15899 fixed: tree2code(,%T) now indents with Scinotes prefs
[scilab.git] / scilab / modules / core / 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 //
6 // Copyright (C) 2012 - 2016 - Scilab Enterprises
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
18
19     [lhs,rhs] = argn(0);
20     if (rhs > 2) then
21         error(sprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "edit", 1));
22     end
23
24     if (rhs >= 1 & type(macroname) ~= 10) then
25         error(sprintf(gettext("%s: Wrong type for input argument #%d: String expected.\n"),"edit",1));
26     end
27
28     if (rhs == 2 & type(linenumber) ~= 1) then
29         error(msprintf(gettext("%s: Wrong type for input argument #%d: Double expected.\n"),"edit",2));
30     end
31
32     found = %f;
33     tmp = %f;
34     // tmpdir will have trailing / or \
35     tmpdir= pathconvert(TMPDIR);
36
37     if rhs >= 1 then // macroname or filename is given
38         if regexp(macroname, "/^([a-zA-Z%_#!$?][0-9a-zA-Z_#!$?]*)$/") == [] then
39             fname = macroname;
40             found = %t;
41         else
42             tmpfile = tmpdir + macroname + ".sci";
43             if funptr(macroname)<>0 then
44                 error(msprintf(gettext("%s: %s is an uneditable hard coded function.\n"), "edit", macroname));
45             end
46             libr = whereis(macroname);
47             if libr <> [] then // macroname is the name of a defined function
48                 if size(libr, "*") > 1 then
49                     // we take last definition
50                     libr = libr(1);
51                 end
52                 [macrolist, path] = libraryinfo(libr);
53                 clear macrolist;
54                 // convert path according to getos() == "Windows" value and expand SCI
55                 fname = pathconvert(path) + macroname + ".sci";
56                 found = isfile(fname);
57             elseif isdef(macroname)
58                 if typeof(evstr(macroname)) == "function" then
59                     txt = tree2code(macr2tree(evstr(macroname)));
60                     fname = tmpfile;
61                     mputl(txt, fname);
62                     found = %t;
63                 end
64             end
65         end
66     else //no macroname specified
67         macroname = "untitled";
68         tmpfile = tmpdir + macroname + ".sci";
69         found = %f;
70     end
71
72     if ~found then // macroname is the name of an undefined function
73         fname = tmpfile;
74         txt = ["function [] = " + macroname + "()"; "endfunction"];
75         mputl(txt, fname);
76     end
77
78     // call the editor with the filename
79     if (rhs == 2) then
80         editor(fname, linenumber, macroname);
81     else
82         editor(fname);
83     end
84
85 endfunction