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

cmt_model.cxx

Go to the documentation of this file.
00001 
00002 #include "cmt_model.h"
00003 #include "cmt_fragment.h"
00004 #include "cmt_symbol.h"
00005 
00009 void CmtModel::filter (cmt_string& text)
00010 {
00011   text.replace_all ("<cmt:tab/>", "\t");
00012   text.replace_all ("<cmt:cr/>",  "\r");
00013   text.replace_all ("<cmt:lf/>",  "\n");
00014 }
00015 
00016 void CmtModel::display (cmt_string& text)
00017 {
00018   text.replace_all ("&lt;", "<");
00019   text.replace_all ("&gt;", ">");
00020   Symbol::expand (text);
00021   cout << text;
00022 }
00023 
00024 void CmtModel::expand (const cmt_string& input_text)
00025 {
00026   int openmarker;
00027   int closemarker;
00028 
00029   CmtSystem::cmt_string_vector subargs;
00030 
00031   cmt_string text = input_text;
00032   cmt_string remaining;
00033 
00034   filter (text);
00035 
00036   for (;;)
00037     {
00043       openmarker = text.find ("<");
00044       if (openmarker == cmt_string::npos) break;
00045       
00046       closemarker = text.find (openmarker, "/>");
00047       if (closemarker == cmt_string::npos) break;
00048 
00049       if (CmtSystem::testenv ("CMTTESTMODEL"))
00050         {
00051           cerr << "text=[" << text << "]" << endl;
00052         }
00053           
00054 
00058       cmt_string command;
00059       text.substr (openmarker + 1, closemarker - openmarker - 1, command);
00060 
00061       if (CmtSystem::testenv ("CMTTESTMODEL"))
00062         {
00063           cerr << "command=[" << command << "]" << endl;
00064         }
00065           
00069       text.substr (closemarker + 2, remaining);
00070 
00074       text.erase (openmarker);
00075       
00079       display (text);
00080           
00084       CmtSystem::split (command, " ", subargs);
00085           
00089       expand (subargs);
00090       
00094       text = remaining;
00095     }
00096   
00097   if (CmtSystem::testenv ("CMTTESTMODEL"))
00098     {
00099       cerr << "text=[" << text << "]" << endl;
00100     }
00101           
00105   display (text);
00106   cout << endl;
00107 }
00108 
00116 void CmtModel::expand (const CmtSystem::cmt_string_vector& arguments)
00117 {
00118   int i;
00119 
00120   Variable::VariableVector variables;
00121 
00126   for (i = 0; i < arguments.size (); i++)
00127     {
00128       const cmt_string& arg = arguments[i];
00129 
00130       if (arg.find ("=") != cmt_string::npos)
00131         {
00132           cmt_string name;
00133           cmt_string value;
00134           int pos = arg.find ("=");
00135 
00136           arg.substr (0, pos, name);
00137           arg.substr (pos + 1, value);
00138 
00139           Variable* v = Variable::find (variables, name);
00140           if (v == 0)
00141             {
00142               v = &(variables.add ());
00143               v->set (name);
00144             }
00145 
00146           (*v) = value;
00147         }
00148     }
00149 
00161   cmt_string text;
00162 
00163   for (i = 0; i < arguments.size (); i++)
00164     {
00165       const cmt_string& arg = arguments[i];
00166 
00167       if (arg.find ("=") == cmt_string::npos)
00168         {
00169           FragmentHandle fragment (arg);
00170           fragment.copy (text, variables, 0);
00171 
00172           filter (text);
00173 
00174           int openmarker;
00175           int closemarker;
00176 
00177           CmtSystem::cmt_string_vector subargs;
00178 
00179           cmt_string remaining;
00180 
00181           for (;;)
00182             {
00188               openmarker = text.find ("<");
00189               if (openmarker == cmt_string::npos) break;
00190 
00191               closemarker = text.find (openmarker, "/>");
00192               if (closemarker == cmt_string::npos)
00193                 {
00201                   text.substr (openmarker + 1, remaining);
00202                   text.erase (openmarker + 1);
00203                   
00207                   display (text);
00208                 }
00209               else
00210                 {
00214                   cmt_string command;
00215                   text.substr (openmarker + 1, closemarker - openmarker - 1, command);
00216 
00220                   text.substr (closemarker + 2, remaining);
00221                   text.erase (openmarker);
00222                   
00226                   display (text);
00227 
00231                   CmtSystem::split (command, " ", subargs);
00232                   
00236                   expand (subargs);
00237                 }
00238 
00242               text = remaining;
00243             }
00244 
00248           display (text);
00249         }
00250     }
00251 }
00252 

Generated at Thu Apr 11 16:49:41 2002 for CMT by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000