Add generation of cleaner_src and set MS env on windows while clean
[scilab.git] / scilab / modules / dynamic_link / macros / windows / dlwDllInfo.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) DIGITEO - 2010-2011  - Allan CORNET
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
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 //=============================================================================
14 function dllinfolist = dlwDllInfo(dllname, options)
15     //=============================================================================
16     
17     function symbolslist = dllinfoimports(dllname)
18         symbolslist = list();
19
20         cmd = dlwGetEnvCmd() + " && dumpbin /IMPORTS """ + dllname +""""
21
22         [result,bOK] = dos(cmd);
23         if bOK == %T then
24             // cleaning output
25             result = stripblanks(result);
26             result(5) = "";
27             result(result == "") = [];
28             result(grep(result, "Import Address")) = [];
29             result(grep(result, "Import Name")) = [];
30             result(grep(result, "Index of first")) = [];
31             result(grep(result, "time date stamp")) = [];
32             dllext = grep(result, getdynlibext());
33             result(1:dllext(1) - 1) = [];
34             data_index = grep(result, ".data");
35             result(data_index(1) - 1 : $) = [];
36             indicedotdll = grep(result, getdynlibext())
37             if (indicedotdll <> []) then
38                 dlllist = result(indicedotdll);
39                 for i = 1:size(dlllist, "*")
40                     symbolsdll = [];
41                     if (i == size(dlllist,"*")) then
42                         symbolsdllstr = result(indicedotdll(i) + 1:$);
43                     else
44                         symbolsdllstr = result(indicedotdll(i) + 1:indicedotdll(i + 1) - 1);
45                     end
46                     for j = 1: size(symbolsdllstr, "*")
47                         tok = tokens(symbolsdllstr(j), " ");
48                         if size(tok, "*") >= 2 then
49                             symbolsdll(j) = tok(2);
50                         end
51                     end
52                     symbolslist(i)= list(dlllist(i), symbolsdll);
53                 end
54             end
55         end
56     endfunction
57     //=============================================================================
58     function symbolslist = dllinfoexports(dllname)
59         symbolslist = list();
60         symbolsdll = [];
61         cmd = dlwGetEnvCmd() + " && dumpbin /EXPORTS """ + dllname +"""";
62         [result, bOK] = dos(cmd);
63         if bOK == %T then
64             result(result == "") = [];
65             ilastcomment = grep(result, "ordinal hint RVA");
66             if ilastcomment <> [] then
67                 result(1:ilastcomment) = [];
68                 data_index = grep(result, ".data");
69                 result(data_index(1) - 1 : $) = [];
70                 for i = 1:size(result, "*")
71                     tok = tokens(result(i), " ");
72                     if size(tok,"*") >=4 then
73                         symbolsdll = [symbolsdll; tok(4)];
74                     end
75                 end
76                 [pat, nam, ext] = fileparts(dllname);
77                 symbolslist = list(nam + ext, symbolsdll);
78             end
79         end
80     endfunction
81     //=============================================================================
82     function dllinfolist = dllinfomachine(dllname)
83         dllinfolist = list();
84         machine = "";
85         cmd = dlwGetEnvCmd() + " && dumpbin /HEADERS """ + dllname +"""";
86         [result, bOK] = dos(cmd);
87         if bOK == %T then
88             iMachine = grep(result, "machine (");
89             if iMachine <> [] then
90                 infomachinestr = result(iMachine(1));
91                 tok = tokens(infomachinestr, " ");
92                 if size(tok, "*") == 3 then
93                     machine = strsubst(tok(3), ")", "");
94                     machine = strsubst(machine, "(", "");
95                 end
96                 [pat, nam, ext] = fileparts(dllname);
97                 dllinfolist = list(nam + ext, machine);
98             end
99         end
100     endfunction
101     //=============================================================================
102
103     [lhs,rhs]=argn(0);
104
105     if rhs == 1 then
106         options = "exports";
107     end
108
109     if type(dllname) <> 10 | size(dllname) <> 1  then
110         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"), "dllinfo", 1));
111     end
112
113     if fileinfo(dllname) == [] then
114         error(msprintf(gettext("%s: The file %s does not exist.\n"), "dllinfo", dllname));
115     end
116
117     fext = fileext(dllname);
118     if ~(strcmp(fext, ".exe", "i") == 0 | strcmp(fext, ".dll", "i")== 0) then
119         error(msprintf(gettext("%s: Cannot open file %s.\n"), "dllinfo", dllname));
120     end
121
122     if type(options) <> 10 | size(options) <> 1 then
123         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"), "dllinfo", 2));
124     end
125
126     if ~(strcmp(options, "imports", "i")== 0 | strcmp(options, "exports", "i")== 0 | strcmp(options, "machine", "i")== 0) then
127         error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), "dllinfo", 2, "''imports'', ''exports'', ''machine''"));
128     end
129
130     dllinfolist = list();
131
132     if findmsvccompiler() <> "unknown" then
133         if strcmp(options, "imports", "i")== 0 then
134             dllinfolist = dllinfoimports(dllname);
135         end
136
137         if strcmp(options, "exports", "i")== 0 then
138             dllinfolist = dllinfoexports(dllname);
139         end
140
141         if strcmp(options, "machine", "i")== 0 then
142             dllinfolist = dllinfomachine(dllname);
143         end
144
145     else
146         warning(msprintf(gettext("%s: This feature required Microsoft visual studio C compiler.\n"), "dllinfo"));
147     end
148
149 endfunction
150 //=============================================================================