source: CMT/v1r20p20090520/source/cmt_language.cxx @ 594

Last change on this file since 594 was 486, checked in by rybkin, 16 years ago

See C.L. 381

  • Property svn:eol-style set to native
File size: 10.2 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      else if (w.substr (0, 22) == "-dependencies_options=")
192        {
193          w.substr (22, language.m_dependencies_options);
194        }
195    }
196}
197
198/*----------------------------------------------------------*/
199Language& Language::add (const cmt_string& name)
200  /*----------------------------------------------------------*/
201{
202  static LanguageVector& Languages = languages ();
203
204  if (name == "") return (null ());
205
206  {
207    Language& language = find (name);
208    if (language != null ()) return (language);
209  }
210
211  Language& language = Languages.add ();
212
213  language.clear ();
214  language.m_name = name;
215  language.fragment_name = name;
216
217  return (language);
218}
219
220
221/*----------------------------------------------------------*/
222void Language::clear_all ()
223  /*----------------------------------------------------------*/
224{
225  static LanguageVector& Languages = languages ();
226
227  for (int i = 0; i < Languages.size (); i++)
228    {
229      Language& c = Languages[i];
230      c.clear ();
231    }
232  Languages.clear ();
233}
234
235/*----------------------------------------------------------*/
236Language::LanguageVector& Language::languages ()
237  /*----------------------------------------------------------*/
238{
239  static Database& db = Database::instance ();
240  static LanguageVector& Languages = db.languages ();
241
242  return (Languages);
243}
244
245/*----------------------------------------------------------*/
246Language& Language::null ()
247  /*----------------------------------------------------------*/
248{
249  static Language null_instance;
250
251  return (null_instance);
252}
253
254/*----------------------------------------------------------*/
255Language::Language ()
256  /*----------------------------------------------------------*/
257{
258  clear ();
259}
260
261/*----------------------------------------------------------*/
262Language::~Language ()
263  /*----------------------------------------------------------*/
264{
265}
266
267/*----------------------------------------------------------*/
268void Language::clear ()
269  /*----------------------------------------------------------*/
270{
271  m_name = "";
272  linker = "none";
273  prototypes = false;
274  preprocessor_command = "-I";
275  fragment_name = "";
276  output_suffix = "";
277  suffixes.clear ();
278  extra_output_suffixes.clear ();
279  m_native_dependencies = false;
280  m_dependencies_options = "none";
281  m_native_dependencies_set = false;
282}
283
284/*----------------------------------------------------------*/
285void Language::show ()
286  /*----------------------------------------------------------*/
287{
288  cout << "language " << m_name;
289
290  int i;
291
292  for (i = 0; i < (suffixes.size ()); i++)
293    {
294      cmt_string& suffix = suffixes[i];
295     
296      cout << " -suffix=" << suffix;
297    }
298
299  if (linker != "")
300    {
301      cout << " -linker=" << linker;
302    }
303
304  if (prototypes)
305    {
306      cout << " -prototypes";
307    }
308
309  if (preprocessor_command != "-I")
310    {
311      cout << " -preprocessor_command=" << preprocessor_command;
312    }
313
314  if (fragment_name != m_name)
315    {
316      cout << " -fragment=" << fragment_name;
317    }
318
319  if (output_suffix != "")
320    {
321      cout << " -output_suffix=" << output_suffix;
322    }
323
324  for (i = 0; i < extra_output_suffixes.size (); i++)
325    {
326      cmt_string& suffix = extra_output_suffixes[i];
327     
328      cout << " -extra_output_suffix=" << suffix;
329    }
330
331  if (m_dependencies_options != "none")
332    {
333      cout << " -dependencies_options=" << m_dependencies_options;
334    }
335
336  cout << endl;
337}
338
339/*----------------------------------------------------------*/
340void Language::setup_fragments ()
341  /*----------------------------------------------------------*/
342{
343  cmt_string n = fragment_name;
344
345  application.set (n);
346
347  n += "_library";
348
349  library.set (n);
350}
351
352/*----------------------------------------------------------*/
353bool Language::operator == (const cmt_string& name) const
354  /*----------------------------------------------------------*/
355{
356  if (m_name == name) return (true);
357  return (false);
358}
359
360/*----------------------------------------------------------*/
361bool Language::operator == (const Language& other) const
362  /*----------------------------------------------------------*/
363{
364  if (this == &other) 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::native_dependencies ()
378  /*----------------------------------------------------------*/
379{
380  setup_native_dependencies ();
381  return m_native_dependencies;
382}
383
384/*----------------------------------------------------------*/
385const cmt_string& Language::dependencies_options () const
386  /*----------------------------------------------------------*/
387{
388  static cmt_string null_string;
389
390  return m_dependencies_options == "none" ? null_string : m_dependencies_options;
391}
392
393/*----------------------------------------------------------*/
394void Language::setup_native_dependencies ()
395  /*----------------------------------------------------------*/
396{
397  if (m_native_dependencies_set) return;
398  m_native_dependencies_set = true;
399
400  if (m_dependencies_options != "none")
401    {
402      cmt_string opts (m_dependencies_options);
403      Symbol::expand (opts);
404      if (opts != "")
405        {
406          m_native_dependencies = true;
407        }
408      else
409        {
410          m_native_dependencies = false;
411        }
412    }
413  else
414    {
415      m_native_dependencies = false;
416    }
417
418  return;
419}
Note: See TracBrowser for help on using the repository browser.