Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

cmt_language.cxx

Go to the documentation of this file.
00001 //-----------------------------------------------------------
00002 // Copyright Christian Arnault LAL-Orsay CNRS
00003 // arnault@lal.in2p3.fr
00004 // See the complete license in cmt_license.txt "http://www.cecill.info". 
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 /*  Operations on Language                                  */
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 }

Generated on Mon May 2 10:25:05 2005 for CMT by doxygen 1.3.5