#include <cmt_pattern.h>
Collaboration diagram for Pattern:
Public Types | |
typedef cmt_vector<Pattern> | PatternVector |
Public Methods | |
Pattern () | |
~Pattern () | |
void | clear () |
void | apply () const |
Applies a pattern to all uses except CMT itself. More... | |
void | apply (Use* constext_use) const |
void | apply (Use* constext_use, const Template::TemplateVector& templates) const |
Applies a pattern to one particular use. More... | |
void | expand (Use* constext_use, const Template::TemplateVector& templates, cmt_string& line) const |
Public Attributes | |
cmt_string | name |
CmtSystem::cmt_string_vector | words |
bool | global |
Use* | use |
Static Public Methods | |
void | action (const CmtSystem::cmt_string_vector& words, Use* use) |
Pattern* | find (const cmt_string& name) |
Patterns are stored with two keys : <name> and <use>. More... | |
Pattern* | find (const cmt_string& name, Use* use) |
void | add (const cmt_string& name, const CmtSystem::cmt_string_vector& words, int start_index, bool global, Use* use) |
int | pattern_number () |
Get the number of registered patterns. More... | |
Pattern& | pattern (int index) |
Get the index'th pattern in the database. More... | |
void | clear_all () |
PatternVector& | patterns () |
void | apply_all_globals () |
Applies all global patterns to all uses. More... | |
void | apply_all_globals (Use* use) |
Applies all global patterns to a given Use. More... | |
void | show_all_names () |
void | show_all () |
this is the cmt show patterns command It just shows the pattern declarations. More... | |
void | show_all_applied_patterns () |
this is the cmt show applied_patterns command It just shows the pattern applications. More... | |
void | show (const cmt_string& name) |
This is the cmt show pattern <name> command It shows both the pattern definition(s) and the places where it is explicitly applied. More... |
|
Definition at line 20 of file cmt_pattern.h. |
|
Definition at line 395 of file cmt_pattern.cxx. 00396 { 00397 } |
|
Definition at line 400 of file cmt_pattern.cxx. 00402 { 00403 } |
|
Definition at line 18 of file cmt_pattern.cxx. Referenced by Cmt::select(). 00019 { 00020 bool global = false; 00021 int start_index; 00022 00023 if (words.size () < 2) return; 00024 00025 // 00026 // expected syntax is: 00027 // 00028 // pattern [-global] pattern-name any-cmt-statement 00029 // 00030 // where any-cmt-statement may contain "templates" 00031 // 00032 // <package> 00033 // <PACKAGE> 00034 // <version> 00035 // <path> 00036 // 00037 00038 cmt_string& option = words[1]; 00039 00040 if (option == "-global") 00041 { 00042 global = true; 00043 start_index = 2; 00044 } 00045 else 00046 { 00047 start_index = 1; 00048 } 00049 00050 cmt_string& name = words[start_index]; 00051 00052 start_index++; 00053 00054 add (name, words, start_index, global, use); 00055 00056 if (CmtSystem::testenv ("CMTTESTPATTERN")) 00057 { 00058 cout << "Pattern::action> add " << name << endl; 00059 } 00060 } |
|
Definition at line 114 of file cmt_pattern.cxx. Referenced by action(). 00119 { 00120 static PatternVector& Patterns = patterns (); 00121 00122 Pattern* pattern; 00123 00124 pattern = find (name, use); 00125 00126 if (pattern == 0) 00127 { 00128 // No pattern for the pair <name, use> exist yet. 00129 // create one. 00130 Pattern& p = Patterns.add (); 00131 00132 p.clear (); 00133 00134 p.name = name; 00135 p.use = use; 00136 00137 pattern = &p; 00138 } 00139 else 00140 { 00141 pattern->clear (); 00142 } 00143 00144 // 00145 // Install the cmt-statement as a vector of words. 00146 // 00147 for (int i = start_index; i < words.size (); i++) 00148 { 00149 cmt_string& s = pattern->words.add (); 00150 s = words[i]; 00151 } 00152 00153 pattern->global = global; 00154 } |
|
Applies a pattern to one particular use.
Definition at line 453 of file cmt_pattern.cxx. 00455 { 00456 cmt_string line; 00457 00458 expand (context_use, templates, line); 00459 00460 if (line != "") 00461 { 00462 Cmt::parse_requirements_text (line, "", context_use); 00463 } 00464 } |
|
Definition at line 443 of file cmt_pattern.cxx. 00444 { 00445 static Template::TemplateVector dummy_templates; 00446 00447 apply (context_use, dummy_templates); 00448 } |
|
Applies a pattern to all uses except CMT itself.
Definition at line 417 of file cmt_pattern.cxx. Referenced by ApplyPattern::apply(), apply(), apply_all_globals(), and Use::apply_global_patterns(). 00418 { 00419 Use::UsePtrVector& uses = Use::uses (); 00420 00421 Use* current = &(Use::current()); 00422 00423 Use::UsePtrVector list; 00424 00425 if (current != use) 00426 { 00427 if (!current->get_paths (use, list)) return; 00428 } 00429 else 00430 { 00431 list.push_back (current); 00432 } 00433 00434 for (int i = 0; i < list.size (); i++) 00435 { 00436 Use* u = list[i]; 00437 if ((u->package != "CMT") && 00438 (IgnorePattern::find (name, u) == 0)) apply (u); 00439 } 00440 } |
|
Applies all global patterns to a given Use.
Definition at line 219 of file cmt_pattern.cxx. 00220 { 00221 if (use->package == "CMT") return; 00222 00223 static PatternVector& Patterns = patterns (); 00224 00225 int i; 00226 00227 for (i = 0; i < Patterns.size (); i++) 00228 { 00229 Pattern& p = Patterns[i]; 00230 00231 if (p.global) 00232 { 00233 if (IgnorePattern::find (p.name, use) == 0) p.apply (use); 00234 } 00235 } 00236 } |
|
Applies all global patterns to all uses.
Definition at line 202 of file cmt_pattern.cxx. Referenced by Cmt::load(), and Cmt::reach_current_package(). 00203 { 00204 static PatternVector& Patterns = patterns (); 00205 00206 int i; 00207 00208 for (i = 0; i < Patterns.size (); i++) 00209 { 00210 Pattern& p = Patterns[i]; 00211 00212 if (p.global) p.apply (); 00213 } 00214 } |
|
Definition at line 406 of file cmt_pattern.cxx. Referenced by add(), and clear_all(). 00407 { 00408 global = false; 00409 name = ""; 00410 use = 0; 00411 words.clear (); 00412 } |
|
Definition at line 177 of file cmt_pattern.cxx. Referenced by Database::clear(). |
|
Definition at line 467 of file cmt_pattern.cxx. Referenced by apply(), and ApplyPattern::show(). 00470 { 00471 line = ""; 00472 00473 // First re-create the cmt statement as one line. 00474 for (int i = 0; i < words.size (); i++) 00475 { 00476 const cmt_string& w = words[i]; 00477 00478 if (i > 0) line += " "; 00479 00480 if ((w == "\n") | (w == ";")) 00481 { 00482 line += "\n"; 00483 } 00484 else 00485 { 00486 line += "\""; 00487 line += w; 00488 line += "\""; 00489 } 00490 } 00491 00492 if (context_use == 0) context_use = &(Use::current ()); 00493 00494 if (line != "") 00495 { 00496 // Substitute templates from the cmt statement 00497 line.replace_all ("<package>", context_use->package.c_str ()); 00498 line.replace_all ("<PACKAGE>", context_use->prefix.c_str ()); 00499 line.replace_all ("<version>", context_use->version.c_str ()); 00500 line.replace_all ("<path>", context_use->real_path.c_str ()); 00501 00502 for (int j = 0; j < templates.size (); j++) 00503 { 00504 Template& t = templates[j]; 00505 cmt_string s; 00506 s = "<"; 00507 s += t.name; 00508 s += ">"; 00509 line.replace_all (s, t.value); 00510 } 00511 00512 for (;;) 00513 { 00514 int begin = line.find ("<"); 00515 if (begin == cmt_string::npos) break; 00516 int end = line.find (begin, ">"); 00517 if (end == cmt_string::npos) break; 00518 // Do not erase XML constructs 00519 if (line[end-1] == '/') break; 00520 line.erase (begin, end - begin + 1); 00521 } 00522 } 00523 } |
|
Definition at line 91 of file cmt_pattern.cxx. 00092 { 00093 static PatternVector& Patterns = patterns (); 00094 00095 int pattern_index; 00096 Pattern* pattern; 00097 00098 if (Patterns.size () == 0) return (0); 00099 00100 for (pattern_index = 0; pattern_index < Patterns.size (); pattern_index++) 00101 { 00102 pattern = &(Patterns[pattern_index]); 00103 00104 if ((pattern->name == name) && (pattern->use) == use) 00105 { 00106 return (pattern); 00107 } 00108 } 00109 00110 return (0); 00111 } |
|
Patterns are stored with two keys : <name> and <use>. thus search must done against these two keys. Definition at line 69 of file cmt_pattern.cxx. Referenced by add(), ApplyPattern::apply(), and ApplyPattern::show(). 00070 { 00071 Use::UsePtrVector& uses = Use::uses (); 00072 00073 Use* use = &(Use::current ()); 00074 00075 Pattern* p; 00076 00077 p = find (name, use); 00078 if (p != 0) return (p); 00079 00080 for (int i = 0; i < uses.size (); i++) 00081 { 00082 use = uses[i]; 00083 p = find (name, use); 00084 if (p != 0) return (p); 00085 } 00086 00087 return (0); 00088 } |
|
Get the index'th pattern in the database.
Definition at line 169 of file cmt_pattern.cxx. 00170 { 00171 static PatternVector& Patterns = patterns (); 00172 00173 return (Patterns[index]); 00174 } |
|
Get the number of registered patterns.
Definition at line 159 of file cmt_pattern.cxx. 00160 { 00161 static PatternVector& Patterns = patterns (); 00162 00163 return (Patterns.size ()); 00164 } |
|
Definition at line 191 of file cmt_pattern.cxx. Referenced by add(), apply_all_globals(), Use::apply_global_patterns(), clear_all(), find(), pattern(), pattern_number(), show(), show_all(), and show_all_names(). 00192 { 00193 static Database& db = Database::instance (); 00194 static PatternVector& Patterns = db.patterns (); 00195 00196 return (Patterns); 00197 } |
|
This is the cmt show pattern <name> command It shows both the pattern definition(s) and the places where it is explicitly applied.
Definition at line 317 of file cmt_pattern.cxx. Referenced by Cmt::do_show_pattern(). 00318 { 00319 static PatternVector& Patterns = patterns (); 00320 00321 int i; 00322 int j; 00323 00324 bool found = false; 00325 00326 // First show the definitions. 00327 for (i = 0; i < Patterns.size (); i++) 00328 { 00329 Pattern& p = Patterns[i]; 00330 00331 if (p.name == name) 00332 { 00333 found = true; 00334 00335 cout << "# " << p.use->package << " " << p.use->version << " defines "; 00336 if (p.global) cout << "global "; 00337 cout << "pattern " << p.name << " as ["; 00338 00339 for (int wi = 0; wi < p.words.size (); wi++) 00340 { 00341 const cmt_string& s = p.words[wi]; 00342 if (wi > 0) cout << " "; 00343 cout << s; 00344 } 00345 00346 cout << "]" << endl; 00347 } 00348 } 00349 00350 if (!found) 00351 { 00352 CmtError::set (CmtError::pattern_not_found, name); 00353 return; 00354 } 00355 00356 // 00357 // Then show the packages which explicitly apply the pattern. 00358 // 00359 Use* use; 00360 ApplyPattern* apply_pattern = 0; 00361 00362 Use::UsePtrVector& uses = Use::uses (); 00363 00364 for (i = 0; i < uses.size (); i++) 00365 { 00366 use = uses[i]; 00367 for (j = 0; j < use->apply_patterns.size (); j++) 00368 { 00369 apply_pattern = &(use->apply_patterns[j]); 00370 00371 if (apply_pattern->name == name) 00372 { 00373 cout << "# " << use->package << " " << use->version << " applies pattern " << name; 00374 cout << " => "; 00375 apply_pattern->show (); 00376 } 00377 } 00378 } 00379 00380 use = &(Use::current ()); 00381 for (j = 0; j < use->apply_patterns.size (); j++) 00382 { 00383 apply_pattern = &(use->apply_patterns[j]); 00384 00385 if (apply_pattern->name == name) 00386 { 00387 cout << "# " << use->package << " " << use->version << " applies pattern " << name; 00388 cout << " => "; 00389 apply_pattern->show (); 00390 } 00391 } 00392 } |
|
this is the cmt show patterns command It just shows the pattern declarations.
Definition at line 242 of file cmt_pattern.cxx. Referenced by Cmt::do_show_patterns(). 00243 { 00244 static PatternVector& Patterns = patterns (); 00245 00246 int i; 00247 00248 for (i = 0; i < Patterns.size (); i++) 00249 { 00250 Pattern& p = Patterns[i]; 00251 00252 cout << "# " << p.use->package << " " << p.use->version << " defines "; 00253 if (p.global) cout << "global "; 00254 cout << "pattern " << p.name << " as ["; 00255 00256 for (int wi = 0; wi < p.words.size (); wi++) 00257 { 00258 const cmt_string& s = p.words[wi]; 00259 if (wi > 0) cout << " "; 00260 cout << s; 00261 } 00262 00263 cout << "]" << endl; 00264 } 00265 00266 Use* use = &(Use::current ()); 00267 for (i = 0; i < use->apply_patterns.size (); i++) 00268 { 00269 const ApplyPattern& apply_pattern = use->apply_patterns[i]; 00270 00271 cout << "# " << use->package 00272 << " applies pattern " << apply_pattern.name << " => "; 00273 apply_pattern.show (); 00274 } 00275 } |
|
this is the cmt show applied_patterns command It just shows the pattern applications.
Definition at line 281 of file cmt_pattern.cxx. Referenced by Cmt::do_show_applied_patterns(). 00282 { 00283 Use* use = &(Use::current ()); 00284 for (int i = 0; i < use->apply_patterns.size (); i++) 00285 { 00286 const ApplyPattern& apply_pattern = use->apply_patterns[i]; 00287 00288 cout << "# " << use->package 00289 << " applies pattern " << apply_pattern.name << " => "; 00290 apply_pattern.show (); 00291 } 00292 } |
|
Definition at line 295 of file cmt_pattern.cxx. Referenced by Cmt::do_show_pattern_names(). 00296 { 00297 static PatternVector& Patterns = patterns (); 00298 00299 if (Patterns.size () > 0) 00300 { 00301 for (int i = 0; i < Patterns.size (); i++) 00302 { 00303 Pattern& p = Patterns[i]; 00304 00305 cout << p.name << " "; 00306 } 00307 00308 cout << endl; 00309 } 00310 } |
|
Definition at line 59 of file cmt_pattern.h. |
|
Definition at line 57 of file cmt_pattern.h. |
|
Definition at line 60 of file cmt_pattern.h. |
|
Definition at line 58 of file cmt_pattern.h. |