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