source: CMT/v1r25p20140131/source/cmt_language.cxx

Last change on this file was 664, checked in by rybkin, 10 years ago

merge -r 646:663 HEAD

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