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 ("<", "<"); 00019 text.replace_all (">", ">"); 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