00001
00002
00003
00004
00005
00006
00007 #include <stdio.h>
00008 #include <stdlib.h>
00009 #include <string.h>
00010 #include <ctype.h>
00011
00012 #include "cmt_language.h"
00013 #include "cmt_system.h"
00014 #include "cmt_database.h"
00015
00016
00017
00018
00019
00020
00021
00022
00023 void Language::show (const cmt_string& name)
00024
00025 {
00026 Language& language = find (name);
00027
00028 if (language == null ()) return;
00029
00030 language.show ();
00031 }
00032
00033
00034 void Language::show_all ()
00035
00036 {
00037 static LanguageVector& Languages = languages ();
00038
00039 int number;
00040
00041 for (number = 0; number < Languages.size (); number++)
00042 {
00043 Language& language = Languages[number];
00044
00045 language.show ();
00046 }
00047 }
00048
00049
00050 void Language::show_names ()
00051
00052 {
00053 static LanguageVector& Languages = languages ();
00054
00055 int number;
00056
00057 for (number = 0; number < Languages.size (); number++)
00058 {
00059 Language& language = Languages[number];
00060 cout << language.m_name << endl;
00061 }
00062 }
00063
00064
00065 void Language::setup_all_fragments ()
00066
00067 {
00068 static LanguageVector& Languages = languages ();
00069
00070 int language_index;
00071
00072 if (Languages.size () == 0) return;
00073
00074 for (language_index = 0;
00075 language_index < Languages.size ();
00076 language_index++)
00077 {
00078 Language& language = Languages[language_index];
00079
00080 language.setup_fragments ();
00081 }
00082 }
00083
00084
00085 Language& Language::find (const cmt_string& name)
00086
00087 {
00088 static LanguageVector& Languages = languages ();
00089
00090 int language_index;
00091
00092 if (Languages.size () == 0) return (null ());
00093
00094 for (language_index = 0;
00095 language_index < Languages.size ();
00096 language_index++)
00097 {
00098 Language& language = Languages[language_index];
00099
00100 if (language.m_name == name)
00101 {
00102 return (language);
00103 }
00104 }
00105
00106 return (null ());
00107 }
00108
00109
00110 Language& Language::find_with_suffix (const cmt_string& suffix)
00111
00112 {
00113 static LanguageVector& Languages = languages ();
00114
00115 int language_index;
00116
00117 if (Languages.size () == 0) return (null ());
00118
00119 for (language_index = 0;
00120 language_index < Languages.size ();
00121 language_index++)
00122 {
00123 Language& language = Languages[language_index];
00124
00125 for (int suffix_index = 0;
00126 suffix_index < language.suffixes.size ();
00127 suffix_index++)
00128 {
00129 cmt_string& s = language.suffixes[suffix_index];
00130
00131 if (s == suffix) return (language);
00132 }
00133 }
00134
00135 return (null ());
00136 }
00137
00138
00139 void Language::action (const CmtSystem::cmt_string_vector& words)
00140
00141 {
00142 cmt_string name;
00143
00144 int i = 1;
00145
00146 name = words[i];
00147 if (name == "") return;
00148 i++;
00149
00150 Language& language = add (name);
00151
00152 for (;i < words.size (); i++)
00153 {
00154 cmt_string& w = words[i];
00155 if (w == "") break;
00156
00157 if (w.substr (0, 8) == "-suffix=")
00158 {
00159 cmt_string& suffix = language.suffixes.add ();
00160
00161 suffix.erase (0);
00162 w.substr (8, suffix);
00163 }
00164 else if (w.substr (0, 8) == "-linker=")
00165 {
00166 w.substr (8, language.linker);
00167 }
00168 else if (w.substr (0, 11) == "-prototypes")
00169 {
00170 language.prototypes = true;
00171 }
00172 else if (w.substr (0, 22) == "-preprocessor_command=")
00173 {
00174 w.substr (22, language.preprocessor_command);
00175 }
00176 else if (w.substr (0, 10) == "-fragment=")
00177 {
00178 w.substr (10, language.fragment_name);
00179 }
00180 else if (w.substr (0, 15) == "-output_suffix=")
00181 {
00182 w.substr (15, language.output_suffix);
00183 }
00184 else if (w.substr (0, 21) == "-extra_output_suffix=")
00185 {
00186 cmt_string& suffix = language.extra_output_suffixes.add ();
00187
00188 suffix.erase (0);
00189 w.substr (21, suffix);
00190 }
00191 }
00192 }
00193
00194
00195 Language& Language::add (const cmt_string& name)
00196
00197 {
00198 static LanguageVector& Languages = languages ();
00199
00200 if (name == "") return (null ());
00201
00202 {
00203 Language& language = find (name);
00204 if (language != null ()) return (language);
00205 }
00206
00207 Language& language = Languages.add ();
00208
00209 language.clear ();
00210 language.m_name = name;
00211 language.fragment_name = name;
00212
00213 return (language);
00214 }
00215
00216
00217
00218 void Language::clear_all ()
00219
00220 {
00221 static LanguageVector& Languages = languages ();
00222
00223 for (int i = 0; i < Languages.size (); i++)
00224 {
00225 Language& c = Languages[i];
00226 c.clear ();
00227 }
00228 Languages.clear ();
00229 }
00230
00231
00232 Language::LanguageVector& Language::languages ()
00233
00234 {
00235 static Database& db = Database::instance ();
00236 static LanguageVector& Languages = db.languages ();
00237
00238 return (Languages);
00239 }
00240
00241
00242 Language& Language::null ()
00243
00244 {
00245 static Language null_instance;
00246
00247 return (null_instance);
00248 }
00249
00250
00251 Language::Language ()
00252
00253 {
00254 clear ();
00255 }
00256
00257
00258 Language::~Language ()
00259
00260 {
00261 }
00262
00263
00264 void Language::clear ()
00265
00266 {
00267 m_name = "";
00268 linker = "none";
00269 prototypes = false;
00270 preprocessor_command = "-I";
00271 fragment_name = "";
00272 output_suffix = "";
00273 suffixes.clear ();
00274 extra_output_suffixes.clear ();
00275 }
00276
00277
00278 void Language::show ()
00279
00280 {
00281 cout << "language " << m_name;
00282
00283 int i;
00284
00285 for (i = 0; i < (suffixes.size ()); i++)
00286 {
00287 cmt_string& suffix = suffixes[i];
00288
00289 cout << " -suffix=" << suffix;
00290 }
00291
00292 if (linker != "")
00293 {
00294 cout << " -linker=" << linker;
00295 }
00296
00297 if (prototypes)
00298 {
00299 cout << " -prototypes";
00300 }
00301
00302 if (preprocessor_command != "-I")
00303 {
00304 cout << " -preprocessor_command=" << preprocessor_command;
00305 }
00306
00307 if (fragment_name != m_name)
00308 {
00309 cout << " -fragment=" << fragment_name;
00310 }
00311
00312 if (output_suffix != "")
00313 {
00314 cout << " -output_suffix=" << output_suffix;
00315 }
00316
00317 for (i = 0; i < extra_output_suffixes.size (); i++)
00318 {
00319 cmt_string& suffix = extra_output_suffixes[i];
00320
00321 cout << " -extra_output_suffix=" << suffix;
00322 }
00323
00324 cout << endl;
00325 }
00326
00327
00328 void Language::setup_fragments ()
00329
00330 {
00331 cmt_string n = fragment_name;
00332
00333 application.set (n);
00334
00335 n += "_library";
00336
00337 library.set (n);
00338 }
00339
00340
00341 bool Language::operator == (const cmt_string& name) const
00342
00343 {
00344 if (m_name == name) return (true);
00345 return (false);
00346 }
00347
00348
00349 bool Language::operator == (const Language& other) const
00350
00351 {
00352 if (this == &other) return (true);
00353 return (false);
00354 }
00355
00356
00357 bool Language::operator != (const Language& other) const
00358
00359 {
00360 if (this != &other) return (true);
00361 return (false);
00362 }