bug 13890 : fix macro getd, avoid use of stack order
[scilab.git] / scilab / modules / functions / macros / getd.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) ENPC
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10
11 function getd(path,option)
12
13     // get all .sci files in the specified directory
14
15     [lhs,rhs]=argn(0);
16
17     if rhs<=0 then
18         path="./";
19     end
20
21     // convert path according to getos() == 'Windows' flag
22     // and with env var substitutions
23     path = pathconvert(path,%t,%t);
24
25     // list the sci files
26     lst          = listfiles(path+"*.sci",%f);
27     lst_filtered = [];
28
29     // remove wrong files extension
30     // bug 2289
31
32     for i=1:size(lst,"*")
33         if( regexp(lst(i),"/.sci$/") <> [] ) then
34             lst_filtered = [lst_filtered;lst(i)];
35         end
36     end
37
38     lst = lst_filtered;
39     clear lst_filtered;
40
41     if lst==[] | lst== "" then
42         error(msprintf(gettext("%s: I cannot find any files with extension %s in %s\n"),"getd",".sci",path));
43         return ;
44     end
45
46     old = who("get");
47     //prot = funcprot();funcprot(0)
48
49     for k=1:size(lst,"*");
50         if fileparts(lst(k),"extension")==".sci" then
51             if execstr("exec(lst(k));","errcatch")<>0 then
52                 warning(msprintf(gettext("%s: Incorrect function in file %s.\n"),"getd",lst(k)))
53             end
54         end
55     end
56
57     //funcprot(prot);
58     new = who("get");
59     for i=1:size(old, "*")
60         b = find(new == old(i));
61         if isempty(b) == %f then
62             new(b) = [];
63         end
64     end
65
66     //new = new(1:(size(new,"*")-nold-2));  // -4 becomes -2: fix the fix for bug 2807
67     if new<>[] then
68         execstr("["+strcat(new,",")+"]=resume("+strcat(new,",")+")")
69     end
70
71 endfunction