add translator & XML2modelica
[scilab.git] / scilab / modules / scicos / src / translator / translation / libraryManager.ml
1 (*\r
2  *  Translator from Modelica 2.x to flat Modelica\r
3  *\r
4  *  Copyright (C) 2005 - 2007 Imagine S.A.\r
5  *  For more information or commercial use please contact us at www.amesim.com\r
6  *\r
7  *  This program is free software; you can redistribute it and/or\r
8  *  modify it under the terms of the GNU General Public License\r
9  *  as published by the Free Software Foundation; either version 2\r
10  *  of the License, or (at your option) any later version.\r
11  *\r
12  *  This program is distributed in the hope that it will be useful,\r
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  *  GNU General Public License for more details.\r
16  *\r
17  *  You should have received a copy of the GNU General Public License\r
18  *  along with this program; if not, write to the Free Software\r
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
20  *\r
21  *)\r
22 \r
23 let evaluate x = Lazy.force x\r
24 \r
25 let rec parse_stored_libraries lib_paths =\r
26   List.fold_left parse_library [] lib_paths\r
27 \r
28 and parse_command cmd =\r
29   let token_fun = Lexer.token\r
30   and lexbuf = Lexing.from_string cmd in\r
31   Parser.parse Parser.CommandLine token_fun lexbuf\r
32 \r
33 and parse_library lib_syns lib_path =\r
34   try\r
35     let file_names = modelica_file_names_of lib_path in\r
36     lib_syns @ (List.fold_left parse_file [] file_names)\r
37   with\r
38     exn ->\r
39       ExceptHandler.handle exn;\r
40       lib_syns\r
41 \r
42 and parse_file lib_syns file_name =\r
43   let ic = open_in_bin file_name in\r
44   try\r
45     let token_fun = Lexer.token\r
46     and lexbuf = Lexing.from_channel ic in\r
47     let src = Parser.LibraryFile file_name in\r
48     let lib_syn = Parser.parse src token_fun lexbuf in\r
49     close_in ic;\r
50     lib_syn :: lib_syns\r
51   with\r
52     exn ->\r
53       close_in ic;\r
54       ExceptHandler.handle exn;\r
55       lib_syns\r
56 \r
57 and modelica_file_names_of lib_path =\r
58   let rec modelica_file_names_of' acc lib_path =\r
59     let base_name = basename lib_path\r
60     and dir_name = dirname lib_path in\r
61     let lib_path = Filename.concat dir_name base_name in\r
62     match is_directory lib_path with\r
63     | true ->\r
64         let names = Array.to_list (Sys.readdir lib_path) in\r
65         let lib_paths =\r
66           List.map (function s -> Filename.concat lib_path s) names in\r
67         List.fold_left modelica_file_names_of' acc lib_paths\r
68     | false when Filename.check_suffix lib_path ".mo" -> lib_path :: acc\r
69     | false -> acc in\r
70   modelica_file_names_of' [] lib_path\r
71 \r
72 and basename lib_path =\r
73   match Filename.basename lib_path with\r
74   | "." -> basename (Filename.dirname lib_path)\r
75   | s -> s\r
76 \r
77 and dirname lib_path =\r
78   match Filename.basename lib_path with\r
79   | "." -> dirname (Filename.dirname lib_path)\r
80   | _ -> Filename.dirname lib_path\r
81 \r
82 and is_directory dirname =\r
83   try\r
84     Sys.is_directory dirname\r
85   with _ -> false\r
86 \r