4224505ffb1e941540abc091a457a32403c567c9
[scilab.git] / scilab / modules / scicos / macros / scicos_scicos / translator.sci
1 //  Scicos
2 //
3 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 //
19 // See the file ../license.txt
20 //
21 function [ok]=translator(filemo,Mblocks,_Modelica_libs,Flat)
22     //Generate the flat model of the Modelica model given in the filemo file
23     //and the Modelica libraries. Interface to the external tool
24     //translator.
25     // if <name> is the basename of filemo this function produces
26     // - the flat Modelica model file in outpath+name+'f.mo'
27     // - the flat xml representation file in  outpath+name+'f_init.xml'
28     // - the flat xml  file in  outpath+name+'f_relations.xml'
29
30     // TO DO : rename filename too generic
31     TRANSLATOR_FILENAME = "modelicat";
32     if getos() == "Windows" then
33         TRANSLATOR_FILENAME = TRANSLATOR_FILENAME + ".exe";
34     end
35
36     mlibs = pathconvert(_Modelica_libs,%f,%t);
37     filemo = pathconvert(filemo,%f,%t);
38     Flat = pathconvert(Flat,%f,%t);
39
40     name = basename(filemo);
41     namef = name + "f";
42
43     [modelica_libs,modelica_directory] = getModelicaPath();
44
45     molibs = [];
46
47     for k = 1:size(Mblocks,"r")
48         funam = stripblanks(Mblocks(k));
49         [dirF, nameF, extF] = fileparts(funam);
50         if (extF == ".mo") then
51             molibs = [molibs; """" + funam + """"];
52         else
53             molibs = [molibs; """" + modelica_directory + funam + ".mo" + """"]
54         end
55     end
56
57     // directories for translator libraries
58     for k = 1:size(mlibs,"*")
59         modelica_directories = mlibs(k);
60         if modelica_directories<> [] then
61             molibs = [molibs; """" + modelica_directories + """"];
62         end
63     end
64
65     translator_libs = strcat(" -lib "+ molibs);
66
67     // build the sequence of -lib arguments for translator
68     if getos() == "Windows" then, Limit=1000;else, Limit=3500;end
69     if (length(translator_libs)>Limit) then
70         // OS limitation may restrict the length of shell command line
71         // arguments. If there are too many .mo file we catenate them into a
72         // single MYMOPACKAGE.mo file
73         msg = _("There are too many Modelica files.\nIt would be better to define several \nModelica programs in a single file.")
74         messagebox(msprintf(msg),"warning","modal")
75         mymopac = pathconvert(outpath+"MYMOPACKAGE.mo",%f,%t);
76         txt = [];
77         for k = 1:size(molibs,"*")
78             [pathx,fnamex,extensionx] = fileparts(molibs(k));
79             if (fnamex <> "MYMOPACKAGE") then
80                 txt = [txt; mgetl(evstr(molibs(k)))];
81             end
82         end
83         mputl(txt, mymopac);
84         translator_libs= " -lib """+mymopac+"""";
85     end
86     translator_libs = translator_libs + "  -lib """ + filemo + """"
87
88     //Build the shell instruction for calling the translator
89
90     exe = getmodelicacpath() + TRANSLATOR_FILENAME
91     exe = """" + pathconvert(getmodelicacpath() + TRANSLATOR_FILENAME,%f,%t) + """ ";
92
93     out =" -o """+Flat+"""" //flat modelica
94     Errfile = outpath + "S_translator.err""";
95
96     // with the with-init option
97     instr = exe + translator_libs + out + " -with-init -command """ + name + " " + namef + ";"" >""" + Errfile
98
99     if getos() == "Windows" then
100         mputl(instr,outpath+"/gent.bat")
101         instr = outpath + "/gent.bat";
102     end
103
104     if execstr("unix_s(instr)","errcatch") <> 0 then
105         messagebox([_("-------Modelica translator error message:-----");
106         mgetl(outpath + "S_translator.err")], "error", "modal");
107         ok = %f,
108     else
109         ok = %t
110     end
111 endfunction
112