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

MacroBuilder Class Reference

Inheritance diagram for MacroBuilder:

Inheritance graph
[legend]
Collaboration diagram for MacroBuilder:

Collaboration graph
[legend]
List of all members.

Public Member Functions

const cmt_string build (const Symbol &symbol, const cmt_string &tag_name="")
const cmt_string clean (const Symbol &symbol, const cmt_string &tag_name="")

Member Function Documentation

const cmt_string MacroBuilder::build const Symbol symbol,
const cmt_string tag_name = ""
[virtual]
 

Implements ValueBuilder.

Definition at line 2316 of file cmt_symbol.cxx.

References cmt_regexp::iterator::_length, cmt_regexp::iterator::_pos, action_show_macro, ActionType, cmt_regexp::begin(), SymbolValueList::command_type, CommandMacro, CommandMacroAppend, CommandMacroPrepend, CommandMacroRemove, CommandMacroRemoveAll, CommandMacroRemoveAllRegexp, CommandMacroRemoveRegexp, SymbolValueList::discarded, Use::discarded, cmt_regexp::end(), Cmt::get_action(), Cmt::get_current_target(), SymbolValueList::is_reflexive, Symbol::name, SymbolValueList::select_first(), SymbolValueList::show(), cmt_vector< T >::size(), SymbolValue::text, SymbolValueList::use, Symbol::value_is_reflexive(), Symbol::value_lists, and SymbolValueList::values.

02318 {
02319     // Control of recursivity
02320   static int level = 0;
02321 
02322   cmt_string temp;
02323   cmt_string previous_temp;
02324   static const cmt_string empty;
02325   bool show_it = false;
02326 
02327   ActionType action = Cmt::get_action ();
02328 
02329   if (action == action_show_macro)
02330     {
02331       if (symbol.name == Cmt::get_current_target ())
02332         {
02333              // Should not display on recursive calls
02334           if (level == 0) show_it = m_display_it;
02335         }
02336     }
02337 
02338   level++;
02339 
02340   temp = "";
02341 
02342   int i;
02343 
02344   bool first_definition = true;
02345   bool defined = false;
02346 
02347   for (i = 0; i < symbol.value_lists.size (); i++)
02348     {
02349       const SymbolValueList& value_list = symbol.value_lists[i];
02350 
02351       if ((value_list.use != 0) &&
02352           (value_list.use->discarded)) continue;
02353 
02354       if (value_list.command_type != CommandMacroPrepend) continue;
02355 
02356       const int selected = value_list.select_first (tag_name);
02357 
02358       if (selected < 0) continue;
02359 
02360       SymbolValue& value = value_list.values[selected];
02361 
02362       if (show_it)
02363         {
02364           value_list.show (symbol, value, first_definition);
02365         }
02366 
02367       if (value_list.discarded) continue;
02368 
02369       previous_temp = temp;
02370       temp = value.text;
02371       temp += previous_temp;
02372     }
02373 
02374   previous_temp = temp;
02375   temp = "";
02376 
02377   first_definition = true;
02378 
02379   for (i = 0; i < symbol.value_lists.size (); i++)
02380     {
02381       const SymbolValueList& value_list = symbol.value_lists[i];
02382 
02383       if ((value_list.use != 0) &&
02384           (value_list.use->discarded)) continue;
02385 
02386       if (value_list.command_type != CommandMacro) continue;
02387 
02388       const int selected = value_list.select_first (tag_name);
02389 
02390       if (selected < 0) continue;
02391 
02392       SymbolValue& value = value_list.values[selected];
02393 
02394       if (show_it)
02395         {
02396           value_list.show (symbol, value, first_definition);
02397         }
02398 
02399       // WARNING:
02400       // Commented just for a test : should be uncommented after the test
02401       if (value_list.discarded) continue;
02402       
02403       if (!value_list.is_reflexive || 
02404           !symbol.value_is_reflexive (value.text))
02405         {
02406           temp = value.text;
02407 
02408           if (!defined)
02409             {
02410               defined = true;
02411             }
02412           else
02413             {
02414               /*
02415               if ((!Cmt::get_quiet ()) &&
02416                   ((action == action_show_macro) ||
02417                    (action == action_show_set) ||
02418                    (action == action_show_action) ||
02419                    (action == action_show_macros) ||
02420                    (action == action_show_sets) ||
02421                    (action == action_show_actions)))
02422                 {
02423                   cerr << "#CMT> Warning: Symbol " << symbol.name << " overridden";
02424                   
02425                   if (value_list.use != 0)
02426                     {
02427                       cerr << " in package " << value_list.use->get_package_name ();
02428                     }
02429 
02430                   cerr << endl;
02431                 }
02432               */
02433             }
02434         }
02435     }
02436 
02437   previous_temp += temp;
02438   temp = previous_temp;
02439 
02440   for (i = 0; i < symbol.value_lists.size (); i++)
02441     {
02442       const SymbolValueList& value_list = symbol.value_lists[i];
02443 
02444       if ((value_list.use != 0) &&
02445           (value_list.use->discarded)) continue;
02446 
02447       if (value_list.command_type != CommandMacroAppend) continue;
02448 
02449       const int selected = value_list.select_first (tag_name);
02450 
02451       if (selected < 0) continue;
02452 
02453       SymbolValue& value = value_list.values[selected];
02454 
02455       if (show_it)
02456         {
02457           value_list.show (symbol, value, first_definition);
02458         }
02459 
02460       if (value_list.discarded) continue;
02461 
02462       temp += value.text;
02463     }
02464 
02465   for (i = 0; i < symbol.value_lists.size (); i++)
02466     {
02467       const SymbolValueList& value_list = symbol.value_lists[i];
02468 
02469       if ((value_list.use != 0) &&
02470           (value_list.use->discarded)) continue;
02471 
02472       if ((value_list.command_type != CommandMacroRemove) &&
02473           (value_list.command_type != CommandMacroRemoveRegexp) &&
02474           (value_list.command_type != CommandMacroRemoveAll) &&
02475           (value_list.command_type != CommandMacroRemoveAllRegexp)) continue;
02476 
02477       const int selected = value_list.select_first (tag_name);
02478 
02479       if (selected < 0) continue;
02480 
02481       SymbolValue& value = value_list.values[selected];
02482 
02483       if (show_it)
02484         {
02485           value_list.show (symbol, value, first_definition);
02486         }
02487 
02488       if (value_list.discarded) continue;
02489 
02490       switch (value_list.command_type)
02491         {
02492           case CommandMacroRemove :
02493             temp.replace (value.text, empty);
02494             break;
02495           case CommandMacroRemoveRegexp :
02496             if (value.text != "")
02497               {
02498                 cmt_regexp e (value.text);
02499                 cmt_regexp::iterator it;
02500 
02501                 it = e.begin (temp);
02502                 if (it != e.end ())
02503                   {
02504                     temp.erase (it._pos, it._length);
02505                   }
02506               }
02507             break;
02508           case CommandMacroRemoveAll :
02509             temp.replace_all (value.text, empty);
02510             break;
02511           case CommandMacroRemoveAllRegexp :
02512             if (value.text != "")
02513               {
02514                 cmt_regexp e (value.text);
02515                 cmt_regexp::iterator it;
02516 
02517                 for (;;)
02518                   {
02519                     it = e.begin (temp);
02520                     if (it != e.end ())
02521                       {
02522                         temp.erase (it._pos, it._length);
02523                       }
02524                     else
02525                       {
02526                         break;
02527                       }
02528                   }
02529               }
02530             break;
02531         }
02532     }
02533 
02534   level--;
02535 
02536   return (temp);
02537 }

const cmt_string MacroBuilder::clean const Symbol symbol,
const cmt_string tag_name = ""
[inline, virtual]
 

Implements ValueBuilder.

Definition at line 49 of file cmt_symbol.cxx.

00051       {
00052         static const cmt_string empty = "";
00053         return (empty);
00054       }


The documentation for this class was generated from the following file:
Generated on Mon May 2 10:25:53 2005 for CMT by doxygen 1.3.5