Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

cmt_language.cxx

Go to the documentation of this file.
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 /*  Operations on Language                                  */
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 }

Generated at Thu May 16 16:27:06 2002 for CMT by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000