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