source: CMT/v1r16p20040901/src/cmt_language.cxx @ 1

Last change on this file since 1 was 1, checked in by arnault, 19 years ago

Import all tags

File size: 9.1 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.