3f746ccdc93d50a3d29b39db9b355676af689d8f
[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 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at
10 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11
12 function edit(macroname,linenumber)
13     // macroname : character string giving a macroname
14     // linenumber : line number
15
16     [lhs,rhs] = argn(0);
17     if (rhs > 2) then
18         error(sprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "edit", 1));
19     end
20
21     if (rhs >= 1 & type(macroname) ~= 10) then
22         error(sprintf(gettext("%s: Wrong type for input argument #%d: String expected.\n"),"edit",1));
23     end
24
25     if (rhs == 2 & type(linenumber) ~= 1) then
26         error(msprintf(gettext("%s: Wrong type for input argument #%d: Double expected.\n"),"edit",2));
27     end
28
29     found = %f;
30     tmp = %f;
31     // tmpdir will have trailing / or \
32     tmpdir= pathconvert(TMPDIR);
33
34     if rhs >= 1 then // macroname or filename is given
35         if regexp(macroname, "/^([a-zA-Z%_#!$?][0-9a-zA-Z_#!$?]*)$/") == [] then
36             fname = macroname;
37             found = %t;
38         else
39             tmpfile = tmpdir + macroname + ".sci";
40             if funptr(macroname)<>0 then
41                 error(msprintf(gettext("%s: %s is a uneditable hard coded function.\n"), "edit", macroname));
42             end
43             libr = whereis(macroname);
44             if libr <> [] then // macroname is the name of a defined function
45                 if size(libr, "*") > 1 then
46                     // we take last definition
47                     libr = libr(1);
48                 end
49                 [macrolist, path] = libraryinfo(libr);
50                 clear macrolist;
51                 // convert path according to getos() == "Windows" value and expand SCI
52                 fname = pathconvert(path) + macroname + ".sci";
53                 found = isfile(fname);
54             elseif isdef(macroname)
55                 if typeof(evstr(macroname)) == "function" then
56                     txt = fun2string(evstr(macroname));
57                     txt = strsubst(txt, "=ans(", " = " + macroname + "(");
58                     fname = tmpfile;
59                     mputl(txt, fname);
60                     found = %t;
61                 end
62             end
63         end
64     else //no macroname specified
65         macroname = "untitled";
66         tmpfile = tmpdir + macroname + ".sci";
67         found = %f;
68     end
69
70     if ~found then // macroname is the name of an undefined function
71         fname = tmpfile;
72         txt = ["function [] = " + macroname + "()"; "endfunction"];
73         mputl(txt, fname);
74     end
75
76     // call the editor with the filename
77     if (rhs == 2) then
78         editor(fname, linenumber, macroname);
79     else
80         editor(fname);
81     end
82
83 endfunction