#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. |
1.2.3 written by Dimitri van Heesch,
© 1997-2000