source: CMT/v1r21/source/cmt_language.cxx

Last change on this file was 528, checked in by rybkin, 15 years ago

See C.L. 415

  • Property svn:eol-style set to native
File size: 10.3 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#include "cmt_error.h"
16
17/*----------------------------------------------------------*/
18/*                                                          */
19/*  Operations on Language                                  */
20/*                                                          */
21/*----------------------------------------------------------*/
22
23/*----------------------------------------------------------*/
24void Language::show (const cmt_string& name)
25  /*----------------------------------------------------------*/
26{
27  Language& language = find (name);
28
29  if (language == null ())
30    {
31      cmt_string t (name);
32
33      CmtError::set (CmtError::language_not_found, t);
34    }
35  else
36    {
37      language.show ();
38    }
39}
40
41/*----------------------------------------------------------*/
42void Language::show_all ()
43  /*----------------------------------------------------------*/
44{
45  static LanguageVector& Languages = languages ();
46
47  int number;
48
49  for (number = 0; number < Languages.size (); number++)
50    {
51      Language& language = Languages[number];
52
53      language.show ();
54    }
55}
56
57/*----------------------------------------------------------*/
58void Language::show_names ()
59  /*----------------------------------------------------------*/
60{
61  static LanguageVector& Languages = languages ();
62
63  int number;
64
65  for (number = 0; number < Languages.size (); number++)
66    {
67      Language& language = Languages[number];
68      cout << language.m_name << endl;
69    }
70}
71
72/*----------------------------------------------------------*/
73void Language::setup_all_fragments ()
74  /*----------------------------------------------------------*/
75{
76  static LanguageVector& Languages = languages ();
77
78  int language_index;
79
80  if (Languages.size () == 0) return;
81
82  for (language_index = 0;
83       language_index < Languages.size ();
84       language_index++)
85    {
86      Language& language = Languages[language_index];
87
88      language.setup_fragments ();
89    }
90}
91
92/*----------------------------------------------------------*/
93Language& Language::find (const cmt_string& name)
94  /*----------------------------------------------------------*/
95{
96  static LanguageVector& Languages = languages ();
97
98  int language_index;
99
100  if (Languages.size () == 0) return (null ());
101
102  for (language_index = 0;
103       language_index < Languages.size ();
104       language_index++)
105    {
106      Language& language = Languages[language_index];
107
108      if (language.m_name == name)
109        {
110          return (language);
111        }
112    }
113
114  return (null ());
115}
116
117/*----------------------------------------------------------*/
118Language& Language::find_with_suffix (const cmt_string& suffix)
119  /*----------------------------------------------------------*/
120{
121  static LanguageVector& Languages = languages ();
122
123  int language_index;
124
125  if (Languages.size () == 0) return (null ());
126
127  for (language_index = 0;
128       language_index < Languages.size ();
129       language_index++)
130    {
131      Language& language = Languages[language_index];
132
133      for (int suffix_index = 0;
134           suffix_index < language.suffixes.size ();
135           suffix_index++)
136        {
137          cmt_string& s = language.suffixes[suffix_index];
138
139          if (s == suffix) return (language);
140        }
141    }
142
143  return (null ());
144}
145
146/*----------------------------------------------------------*/
147void Language::action (const CmtSystem::cmt_string_vector& words)
148  /*----------------------------------------------------------*/
149{
150  cmt_string name;
151
152  int i = 1;
153
154  name = words[i];
155  if (name == "") return;
156  i++;
157
158  Language& language = add (name);
159
160  for (;i < words.size (); i++)
161    {
162      cmt_string& w = words[i];
163      if (w == "") break;
164
165      if (w.substr (0, 8) == "-suffix=")
166        {
167          cmt_string& suffix = language.suffixes.add ();
168
169          suffix.erase (0);
170          w.substr (8, suffix);
171        }
172      else if (w.substr (0, 8) == "-linker=")
173        {
174          w.substr (8, language.linker);
175        }
176      else if (w.substr (0, 11) == "-prototypes")
177        {
178          language.prototypes = true;
179        }
180      else if (w.substr (0, 22) == "-preprocessor_command=")
181        {
182          w.substr (22, language.preprocessor_command);
183        }
184      else if (w.substr (0, 10) == "-fragment=")
185        {
186          w.substr (10, language.fragment_name);
187        }
188      else if (w.substr (0, 15) == "-output_suffix=")
189        {
190          w.substr (15, language.output_suffix);
191        }
192      else if (w.substr (0, 21) == "-extra_output_suffix=")
193        {
194          cmt_string& suffix = language.extra_output_suffixes.add ();
195
196          suffix.erase (0);
197          w.substr (21, suffix);
198        }
199      else if (w.substr (0, 22) == "-dependencies_options=")
200        {
201          w.substr (22, language.m_dependencies_options);
202        }
203    }
204}
205
206/*----------------------------------------------------------*/
207Language& Language::add (const cmt_string& name)
208  /*----------------------------------------------------------*/
209{
210  static LanguageVector& Languages = languages ();
211
212  if (name == "") return (null ());
213
214  {
215    Language& language = find (name);
216    if (language != null ()) return (language);
217  }
218
219  Language& language = Languages.add ();
220
221  language.clear ();
222  language.m_name = name;
223  language.fragment_name = name;
224
225  return (language);
226}
227
228
229/*----------------------------------------------------------*/
230void Language::clear_all ()
231  /*----------------------------------------------------------*/
232{
233  static LanguageVector& Languages = languages ();
234
235  for (int i = 0; i < Languages.size (); i++)
236    {
237      Language& c = Languages[i];
238      c.clear ();
239    }
240  Languages.clear ();
241}
242
243/*----------------------------------------------------------*/
244Language::LanguageVector& Language::languages ()
245  /*----------------------------------------------------------*/
246{
247  static Database& db = Database::instance ();
248  static LanguageVector& Languages = db.languages ();
249
250  return (Languages);
251}
252
253/*----------------------------------------------------------*/
254Language& Language::null ()
255  /*----------------------------------------------------------*/
256{
257  static Language null_instance;
258
259  return (null_instance);
260}
261
262/*----------------------------------------------------------*/
263Language::Language ()
264  /*----------------------------------------------------------*/
265{
266  clear ();
267}
268
269/*----------------------------------------------------------*/
270Language::~Language ()
271  /*----------------------------------------------------------*/
272{
273}
274
275/*----------------------------------------------------------*/
276void Language::clear ()
277  /*----------------------------------------------------------*/
278{
279  m_name = "";
280  linker = "none";
281  prototypes = false;
282  preprocessor_command = "-I";
283  fragment_name = "";
284  output_suffix = "";
285  suffixes.clear ();
286  extra_output_suffixes.clear ();
287  m_native_dependencies = false;
288  m_dependencies_options = "none";
289  m_native_dependencies_set = false;
290}
291
292/*----------------------------------------------------------*/
293void Language::show ()
294  /*----------------------------------------------------------*/
295{
296  cout << "language " << m_name;
297
298  int i;
299
300  for (i = 0; i < (suffixes.size ()); i++)
301    {
302      cmt_string& suffix = suffixes[i];
303     
304      cout << " -suffix=" << suffix;
305    }
306
307  if (linker != "")
308    {
309      cout << " -linker=" << linker;
310    }
311
312  if (prototypes)
313    {
314      cout << " -prototypes";
315    }
316
317  if (preprocessor_command != "-I")
318    {
319      cout << " -preprocessor_command=" << preprocessor_command;
320    }
321
322  if (fragment_name != m_name)
323    {
324      cout << " -fragment=" << fragment_name;
325    }
326
327  if (output_suffix != "")
328    {
329      cout << " -output_suffix=" << output_suffix;
330    }
331
332  for (i = 0; i < extra_output_suffixes.size (); i++)
333    {
334      cmt_string& suffix = extra_output_suffixes[i];
335     
336      cout << " -extra_output_suffix=" << suffix;
337    }
338
339  if (m_dependencies_options != "none")
340    {
341      cout << " -dependencies_options=" << m_dependencies_options;
342    }
343
344  cout << endl;
345}
346
347/*----------------------------------------------------------*/
348void Language::setup_fragments ()
349  /*----------------------------------------------------------*/
350{
351  cmt_string n = fragment_name;
352
353  application.set (n);
354
355  n += "_library";
356
357  library.set (n);
358}
359
360/*----------------------------------------------------------*/
361bool Language::operator == (const cmt_string& name) const
362  /*----------------------------------------------------------*/
363{
364  if (m_name == name) return (true);
365  return (false);
366}
367
368/*----------------------------------------------------------*/
369bool Language::operator == (const Language& other) const
370  /*----------------------------------------------------------*/
371{
372  if (this == &other) return (true);
373  return (false);
374}
375
376/*----------------------------------------------------------*/
377bool Language::operator != (const Language& other) const
378  /*----------------------------------------------------------*/
379{
380  if (this != &other) return (true);
381  return (false);
382}
383
384/*----------------------------------------------------------*/
385bool Language::native_dependencies ()
386  /*----------------------------------------------------------*/
387{
388  setup_native_dependencies ();
389  return m_native_dependencies;
390}
391
392/*----------------------------------------------------------*/
393const cmt_string& Language::dependencies_options () const
394  /*----------------------------------------------------------*/
395{
396  static cmt_string null_string;
397
398  return m_dependencies_options == "none" ? null_string : m_dependencies_options;
399}
400
401/*----------------------------------------------------------*/
402void Language::setup_native_dependencies ()
403  /*----------------------------------------------------------*/
404{
405  if (m_native_dependencies_set) return;
406  m_native_dependencies_set = true;
407
408  if (m_dependencies_options != "none")
409    {
410      cmt_string opts (m_dependencies_options);
411      Symbol::expand (opts);
412      if (opts != "")
413        {
414          m_native_dependencies = true;
415        }
416      else
417        {
418          m_native_dependencies = false;
419        }
420    }
421  else
422    {
423      m_native_dependencies = false;
424    }
425
426  return;
427}
Note: See TracBrowser for help on using the repository browser.