source: CMT/v1r20b1/source/cmt_language.cxx@ 327

Last change on this file since 327 was 11, checked in by arnault, 21 years ago

Changing eol-style property

  • Property svn:eol-style set to native
File size: 8.7 KB
Line 
1//-----------------------------------------------------------
2// Copyright Christian Arnault LAL-Orsay CNRS
3// arnault@lal.in2p3.fr
4// See the complete license in cmt_license.txt "http://www.cecill.info".
5//-----------------------------------------------------------
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <ctype.h>
11
12#include "cmt_language.h"
13#include "cmt_system.h"
14#include "cmt_database.h"
15
16/*----------------------------------------------------------*/
17/* */
18/* Operations on Language */
19/* */
20/*----------------------------------------------------------*/
21
22/*----------------------------------------------------------*/
23void Language::show (const cmt_string& name)
24/*----------------------------------------------------------*/
25{
26 Language& language = find (name);
27
28 if (language == null ()) return;
29
30 language.show ();
31}
32
33/*----------------------------------------------------------*/
34void Language::show_all ()
35/*----------------------------------------------------------*/
36{
37 static LanguageVector& Languages = languages ();
38
39 int number;
40
41 for (number = 0; number < Languages.size (); number++)
42 {
43 Language& language = Languages[number];
44
45 language.show ();
46 }
47}
48
49/*----------------------------------------------------------*/
50void Language::show_names ()
51/*----------------------------------------------------------*/
52{
53 static LanguageVector& Languages = languages ();
54
55 int number;
56
57 for (number = 0; number < Languages.size (); number++)
58 {
59 Language& language = Languages[number];
60 cout << language.m_name << endl;
61 }
62}
63
64/*----------------------------------------------------------*/
65void Language::setup_all_fragments ()
66/*----------------------------------------------------------*/
67{
68 static LanguageVector& Languages = languages ();
69
70 int language_index;
71
72 if (Languages.size () == 0) return;
73
74 for (language_index = 0;
75 language_index < Languages.size ();
76 language_index++)
77 {
78 Language& language = Languages[language_index];
79
80 language.setup_fragments ();
81 }
82}
83
84/*----------------------------------------------------------*/
85Language& Language::find (const cmt_string& name)
86/*----------------------------------------------------------*/
87{
88 static LanguageVector& Languages = languages ();
89
90 int language_index;
91
92 if (Languages.size () == 0) return (null ());
93
94 for (language_index = 0;
95 language_index < Languages.size ();
96 language_index++)
97 {
98 Language& language = Languages[language_index];
99
100 if (language.m_name == name)
101 {
102 return (language);
103 }
104 }
105
106 return (null ());
107}
108
109/*----------------------------------------------------------*/
110Language& Language::find_with_suffix (const cmt_string& suffix)
111/*----------------------------------------------------------*/
112{
113 static LanguageVector& Languages = languages ();
114
115 int language_index;
116
117 if (Languages.size () == 0) return (null ());
118
119 for (language_index = 0;
120 language_index < Languages.size ();
121 language_index++)
122 {
123 Language& language = Languages[language_index];
124
125 for (int suffix_index = 0;
126 suffix_index < language.suffixes.size ();
127 suffix_index++)
128 {
129 cmt_string& s = language.suffixes[suffix_index];
130
131 if (s == suffix) return (language);
132 }
133 }
134
135 return (null ());
136}
137
138/*----------------------------------------------------------*/
139void Language::action (const CmtSystem::cmt_string_vector& words)
140/*----------------------------------------------------------*/
141{
142 cmt_string name;
143
144 int i = 1;
145
146 name = words[i];
147 if (name == "") return;
148 i++;
149
150 Language& language = add (name);
151
152 for (;i < words.size (); i++)
153 {
154 cmt_string& w = words[i];
155 if (w == "") break;
156
157 if (w.substr (0, 8) == "-suffix=")
158 {
159 cmt_string& suffix = language.suffixes.add ();
160
161 suffix.erase (0);
162 w.substr (8, suffix);
163 }
164 else if (w.substr (0, 8) == "-linker=")
165 {
166 w.substr (8, language.linker);
167 }
168 else if (w.substr (0, 11) == "-prototypes")
169 {
170 language.prototypes = true;
171 }
172 else if (w.substr (0, 22) == "-preprocessor_command=")
173 {
174 w.substr (22, language.preprocessor_command);
175 }
176 else if (w.substr (0, 10) == "-fragment=")
177 {
178 w.substr (10, language.fragment_name);
179 }
180 else if (w.substr (0, 15) == "-output_suffix=")
181 {
182 w.substr (15, language.output_suffix);
183 }
184 else if (w.substr (0, 21) == "-extra_output_suffix=")
185 {
186 cmt_string& suffix = language.extra_output_suffixes.add ();
187
188 suffix.erase (0);
189 w.substr (21, suffix);
190 }
191 }
192}
193
194/*----------------------------------------------------------*/
195Language& Language::add (const cmt_string& name)
196/*----------------------------------------------------------*/
197{
198 static LanguageVector& Languages = languages ();
199
200 if (name == "") return (null ());
201
202 {
203 Language& language = find (name);
204 if (language != null ()) return (language);
205 }
206
207 Language& language = Languages.add ();
208
209 language.clear ();
210 language.m_name = name;
211 language.fragment_name = name;
212
213 return (language);
214}
215
216
217/*----------------------------------------------------------*/
218void Language::clear_all ()
219/*----------------------------------------------------------*/
220{
221 static LanguageVector& Languages = languages ();
222
223 for (int i = 0; i < Languages.size (); i++)
224 {
225 Language& c = Languages[i];
226 c.clear ();
227 }
228 Languages.clear ();
229}
230
231/*----------------------------------------------------------*/
232Language::LanguageVector& Language::languages ()
233/*----------------------------------------------------------*/
234{
235 static Database& db = Database::instance ();
236 static LanguageVector& Languages = db.languages ();
237
238 return (Languages);
239}
240
241/*----------------------------------------------------------*/
242Language& Language::null ()
243/*----------------------------------------------------------*/
244{
245 static Language null_instance;
246
247 return (null_instance);
248}
249
250/*----------------------------------------------------------*/
251Language::Language ()
252/*----------------------------------------------------------*/
253{
254 clear ();
255}
256
257/*----------------------------------------------------------*/
258Language::~Language ()
259/*----------------------------------------------------------*/
260{
261}
262
263/*----------------------------------------------------------*/
264void Language::clear ()
265/*----------------------------------------------------------*/
266{
267 m_name = "";
268 linker = "none";
269 prototypes = false;
270 preprocessor_command = "-I";
271 fragment_name = "";
272 output_suffix = "";
273 suffixes.clear ();
274 extra_output_suffixes.clear ();
275}
276
277/*----------------------------------------------------------*/
278void Language::show ()
279/*----------------------------------------------------------*/
280{
281 cout << "language " << m_name;
282
283 int i;
284
285 for (i = 0; i < (suffixes.size ()); i++)
286 {
287 cmt_string& suffix = suffixes[i];
288
289 cout << " -suffix=" << suffix;
290 }
291
292 if (linker != "")
293 {
294 cout << " -linker=" << linker;
295 }
296
297 if (prototypes)
298 {
299 cout << " -prototypes";
300 }
301
302 if (preprocessor_command != "-I")
303 {
304 cout << " -preprocessor_command=" << preprocessor_command;
305 }
306
307 if (fragment_name != m_name)
308 {
309 cout << " -fragment=" << fragment_name;
310 }
311
312 if (output_suffix != "")
313 {
314 cout << " -output_suffix=" << output_suffix;
315 }
316
317 for (i = 0; i < extra_output_suffixes.size (); i++)
318 {
319 cmt_string& suffix = extra_output_suffixes[i];
320
321 cout << " -extra_output_suffix=" << suffix;
322 }
323
324 cout << endl;
325}
326
327/*----------------------------------------------------------*/
328void Language::setup_fragments ()
329/*----------------------------------------------------------*/
330{
331 cmt_string n = fragment_name;
332
333 application.set (n);
334
335 n += "_library";
336
337 library.set (n);
338}
339
340/*----------------------------------------------------------*/
341bool Language::operator == (const cmt_string& name) const
342/*----------------------------------------------------------*/
343{
344 if (m_name == name) return (true);
345 return (false);
346}
347
348/*----------------------------------------------------------*/
349bool Language::operator == (const Language& other) const
350/*----------------------------------------------------------*/
351{
352 if (this == &other) return (true);
353 return (false);
354}
355
356/*----------------------------------------------------------*/
357bool Language::operator != (const Language& other) const
358/*----------------------------------------------------------*/
359{
360 if (this != &other) return (true);
361 return (false);
362}
Note: See TracBrowser for help on using the repository browser.