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