#include <cmt_fragment.h>
Collaboration diagram for Fragment:
Public Types |
|
typedef cmt_vector< Fragment >? | FragmentVector |
Public Methods |
|
? | Fragment () |
? | Fragment (const cmt_string &fragment_name) |
? | ~Fragment () |
void? | clear () |
int? | print () |
bool? | locate () |
bool? | copy (FILE *out, int variables,...) |
bool? | copy (cmt_string &out, int variables,...) |
bool? | copy (FILE *out, int variables, va_list ids) |
bool? | copy (cmt_string &out, int variables, va_list ids) |
bool? | wincopy (FILE *out, int variables, va_list ids) |
bool? | wincopy (cmt_string &out, int variables, va_list ids) |
bool? | copy (FILE *out, const Variable::VariableVector &vector, int variables,...) |
bool? | copy (cmt_string &out, const Variable::VariableVector &vector, int variables,...) |
bool? | copy (FILE *out, const Variable::VariableVector &vector, int variables, va_list ids) |
bool? | copy (cmt_string &out, const Variable::VariableVector &vector, int variables, va_list ids) |
bool? | wincopy (FILE *out, const Variable::VariableVector &vector, int variables, va_list ids) |
bool? | wincopy (cmt_string &out, const Variable::VariableVector &vector, int variables, va_list ids) |
Static Public Methods |
|
void? | action (const CmtSystem::cmt_string_vector &words, Use *use) |
Fragment *? | find (const cmt_string &name) |
void? | add (const cmt_string &name, const cmt_string &suffix, const cmt_string &header, const cmt_string &trailer, bool need_dependencies, Use *use) |
void? | show (const cmt_string &name) |
void? | show_all () |
void? | clear_all () |
bool? | copy (FILE *out, const cmt_string &name, int variables,...) |
bool? | copy (cmt_string &out, const cmt_string &name, int variables,...) |
bool? | copy (FILE *out, const cmt_string &name, const Variable::VariableVector &vector, int variables,...) |
bool? | copy (cmt_string &out, const cmt_string &name, const Variable::VariableVector &vector, int variables,...) |
FragmentVector &? | fragments () |
Public Attributes |
|
cmt_string? | name |
cmt_string? | suffix |
cmt_string? | header |
cmt_string? | trailer |
bool? | need_dependencies |
cmt_string? | path |
UseRef? | use |
|
? |
Definition at line 53 of file cmt_fragment.h. |
|
? |
Definition at line 373 of file cmt_fragment.cxx. References use. 00374 { 00375 use = 0; 00376 } |
|
? |
Definition at line 379 of file cmt_fragment.cxx. |
|
? |
Definition at line 387 of file cmt_fragment.cxx. References use. 00388 { 00389 use = 0; 00390 } |
|
? |
Definition at line 238 of file cmt_fragment.cxx. References fragment_action_iterator::add_word(), fragment_action_iterator::commit(), Symbol::expand(), Cmt::get_current_access(), Use::get_current_scope(), ScopePrivate, cmt_vector< cmt_string >::size(), CmtSystem::split(), and UserMode. Referenced by KwdMakeFragment::action(). 00240 { 00241 if ((Cmt::get_current_access () == UserMode) && 00242 (use->get_current_scope () == ScopePrivate)) return; 00243 00244 if (words.size () <= 1) return; 00245 00246 fragment_action_iterator it (use); 00247 00248 for (int i = 1; i < words.size (); i++) 00249 { 00250 const cmt_string& w = words[i]; 00251 cmt_string ew = w; 00252 00253 Symbol::expand (ew); 00254 if (ew != w) 00255 { 00256 CmtSystem::cmt_string_vector ws; 00257 00258 CmtSystem::split (ew, " ", ws); 00259 00260 for (int j = 0; j < ws.size (); ++j) 00261 { 00262 const cmt_string& ww = ws[j]; 00263 it.add_word (ww); 00264 } 00265 } 00266 else 00267 { 00268 it.add_word (ew); 00269 } 00270 } 00271 00272 it.commit (); 00273 } |
|
? |
Definition at line 300 of file cmt_fragment.cxx. References cmt_vector< Fragment >::add(), find(), fragments(), header, name, need_dependencies, suffix, trailer, and use. Referenced by fragment_action_iterator::add_word(), and fragment_action_iterator::commit(). 00306 { 00307 static FragmentVector& Fragments = fragments (); 00308 00309 { 00310 Fragment* fragment; 00311 00312 if (name == "") return; 00313 00314 fragment = find (name); 00315 if (fragment != 0) 00316 { 00317 if (suffix != "") 00318 { 00319 fragment->suffix = suffix; 00320 } 00321 00322 if (header != "") 00323 { 00324 fragment->header = header; 00325 } 00326 00327 if (trailer != "") 00328 { 00329 fragment->trailer = trailer; 00330 } 00331 00332 fragment->need_dependencies = need_dependencies; 00333 00334 fragment->use = use; 00335 return; 00336 } 00337 } 00338 00339 Fragment& fragment = Fragments.add (); 00340 00341 fragment.name = name; 00342 fragment.suffix = suffix; 00343 fragment.header = header; 00344 fragment.trailer = trailer; 00345 fragment.need_dependencies = need_dependencies; 00346 fragment.use = use; 00347 } |
|
? |
Definition at line 393 of file cmt_fragment.cxx. References header, name, need_dependencies, path, suffix, trailer, and use. Referenced by clear_all(). |
|
? |
Definition at line 350 of file cmt_fragment.cxx. References cmt_vector< Fragment >::clear(), clear(), fragments(), and cmt_vector< Fragment >::size(). Referenced by Database::clear(). 00351 { 00352 static FragmentVector& Fragments = fragments (); 00353 00354 for (int i = 0; i < Fragments.size (); i++) 00355 { 00356 Fragment& f = Fragments[i]; 00357 f.clear (); 00358 } 00359 00360 Fragments.clear (); 00361 } |
|
? |
Definition at line 835 of file cmt_fragment.cxx. References locate(), Variable::macro_braces(), Variable::macro_pars(), path, cmt_string::read(), cmt_string::replace_all(), cmt_vector< Variable >::size(), and Variable::value. 00836 { 00837 int i; 00838 00839 if (!locate ()) return (false); 00840 00841 out.read (path); 00842 00843 Variable* var = 0; 00844 00845 for (i = 0; i < vector.size (); i++) 00846 { 00847 var = &(vector[i]); 00848 out.replace_all (var->macro_braces (), var->value); 00849 out.replace_all (var->macro_pars (), var->value); 00850 } 00851 00852 for (i = 0; i < variables; i++) 00853 { 00854 var = va_arg (ids, Variable*); 00855 out.replace_all (var->macro_braces (), var->value); 00856 out.replace_all (var->macro_pars (), var->value); 00857 } 00858 00859 return (true); 00860 } |
|
? |
Definition at line 818 of file cmt_fragment.cxx. References copy(), and cmt_string::write(). 00819 { 00820 static cmt_string cline; 00821 00822 bool result = copy (cline, vector, variables, ids); 00823 if (result) 00824 { 00825 cline.write (out); 00826 return (true); 00827 } 00828 else 00829 { 00830 return (false); 00831 } 00832 } |
|
? |
Definition at line 806 of file cmt_fragment.cxx. References copy(). 00807 { 00808 va_list ids; 00809 00810 va_start (ids, variables); 00811 bool result = copy (out, vector, variables, ids); 00812 va_end (ids); 00813 00814 return (result); 00815 } |
|
? |
Definition at line 794 of file cmt_fragment.cxx. References copy(). 00795 { 00796 va_list ids; 00797 00798 va_start (ids, variables); 00799 bool result = copy (out, vector, variables, ids); 00800 va_end (ids); 00801 00802 return (result); 00803 } |
|
? |
Definition at line 587 of file cmt_fragment.cxx. References locate(), Variable::macro_braces(), Variable::macro_pars(), path, cmt_string::read(), cmt_string::replace_all(), and Variable::value. 00588 { 00589 int i; 00590 00591 if (!locate ()) return (false); 00592 00593 out.read (path); 00594 00595 Variable* var = 0; 00596 for (i = 0; i < variables; i++) 00597 { 00598 var = va_arg (ids, Variable*); 00599 out.replace_all (var->macro_braces (), var->value); 00600 out.replace_all (var->macro_pars (), var->value); 00601 } 00602 00603 return (true); 00604 } |
|
? |
Definition at line 570 of file cmt_fragment.cxx. References copy(), and cmt_string::write(). 00571 { 00572 static cmt_string cline; 00573 00574 bool result = copy (cline, variables, ids); 00575 if (result) 00576 { 00577 cline.write (out); 00578 return (true); 00579 } 00580 else 00581 { 00582 return (false); 00583 } 00584 } |
|
? |
Definition at line 558 of file cmt_fragment.cxx. References copy(). 00559 { 00560 va_list ids; 00561 00562 va_start (ids, variables); 00563 bool result = copy (out, variables, ids); 00564 va_end (ids); 00565 00566 return (result); 00567 } |
|
? |
Definition at line 546 of file cmt_fragment.cxx. References copy(). 00547 { 00548 va_list ids; 00549 00550 va_start (ids, variables); 00551 bool result = copy (out, variables, ids); 00552 va_end (ids); 00553 00554 return (result); 00555 } |
|
? |
Definition at line 776 of file cmt_fragment.cxx. References copy(), and find(). 00780 { 00781 va_list ids; 00782 00783 Fragment* fragment = Fragment::find (name); 00784 if (fragment == 0) return (false); 00785 00786 va_start (ids, variables); 00787 bool result = fragment->copy (out, vector, variables, ids); 00788 va_end (ids); 00789 00790 return (result); 00791 } |
|
? |
Definition at line 758 of file cmt_fragment.cxx. References copy(), and find(). 00762 { 00763 va_list ids; 00764 00765 Fragment* fragment = Fragment::find (name); 00766 if (fragment == 0) return (false); 00767 00768 va_start (ids, variables); 00769 bool result = fragment->copy (out, vector, variables, ids); 00770 va_end (ids); 00771 00772 return (result); 00773 } |
|
? |
Definition at line 529 of file cmt_fragment.cxx. References copy(), and find(). 00532 { 00533 va_list ids; 00534 00535 Fragment* fragment = Fragment::find (name); 00536 if (fragment == 0) return (false); 00537 00538 va_start (ids, variables); 00539 bool result = fragment->copy (out, variables, ids); 00540 va_end (ids); 00541 00542 return (result); 00543 } |
|
? |
Definition at line 512 of file cmt_fragment.cxx. References find(). Referenced by FragmentHandle::copy(), and copy(). 00515 { 00516 va_list ids; 00517 00518 Fragment* fragment = Fragment::find (name); 00519 if (fragment == 0) return (false); 00520 00521 va_start (ids, variables); 00522 bool result = fragment->copy (out, variables, ids); 00523 va_end (ids); 00524 00525 return (result); 00526 } |
|
? |
Definition at line 276 of file cmt_fragment.cxx. References fragments(), name, and cmt_vector< Fragment >::size(). Referenced by add(), fragment_action_iterator::add_word(), copy(), FragmentHandle::setup(), and show(). 00277 { 00278 static FragmentVector& Fragments = fragments (); 00279 00280 int fragment_index; 00281 00282 if (Fragments.size () == 0) return (0); 00283 00284 for (fragment_index = 0; 00285 fragment_index < Fragments.size (); 00286 fragment_index++) 00287 { 00288 Fragment& fragment = Fragments[fragment_index]; 00289 00290 if (fragment.name == name) 00291 { 00292 return (&fragment); 00293 } 00294 } 00295 00296 return (0); 00297 } |
|
? |
Definition at line 364 of file cmt_fragment.cxx. References Database::fragments(), and Database::instance(). Referenced by add(), clear_all(), find(), and show_all(). 00365 { 00366 static Database& db = Database::instance (); 00367 static FragmentVector& Fragments = db.fragments (); 00368 00369 return (Fragments); 00370 } |
|
? |
Definition at line 436 of file cmt_fragment.cxx. References Cmt::build_nmake(), CmtSystem::file_separator(), Use::find(), Use::get_full_path(), mgr_style, name, path, Use::style, CmtSystem::test_file(), and use. Referenced by copy(), print(), and wincopy(). 00437 { 00438 cmt_string root_path; 00439 00440 if (use == 0) 00441 { 00442 // Assume CMT 00443 use = Use::find ("CMT"); 00444 } 00445 00446 use->get_full_path (root_path); 00447 00448 if (path != "") return (true); 00449 00450 // First try |
|
? |
Definition at line 405 of file cmt_fragment.cxx. References Use::current(), locate(), name, path, Use::reduce_path(), suffix, and use. Referenced by show(), and show_all(). 00406 { 00407 int result = 1; 00408 00409 if (name == "") return (0); 00410 00411 locate (); 00412 00413 if (use == 0) 00414 { 00415 Use& u = Use::current(); 00416 use = &u; 00417 } 00418 00419 cmt_string the_path = path; 00420 00421 use->reduce_path (the_path); 00422 00423 cout << the_path; 00424 00425 if (suffix != "") 00426 { 00427 cout << "->" << suffix; 00428 } 00429 00430 cout << endl; 00431 00432 return (result); 00433 } |
|
? |
Definition at line 134 of file cmt_fragment.cxx. References find(), and print(). Referenced by Cmt::do_show_fragment(). 00135 { 00136 Fragment* fragment = Fragment::find (name); 00137 if (fragment == 0) 00138 { 00139 cout << "Fragment " << name << " not found" << endl; 00140 } 00141 else 00142 { 00143 fragment->print (); 00144 } 00145 } |
|
? |
Definition at line 148 of file cmt_fragment.cxx. References fragments(), print(), and cmt_vector< Fragment >::size(). Referenced by Cmt::do_show_fragments(). 00149 { 00150 static FragmentVector& Fragments = fragments (); 00151 00152 int number; 00153 00154 for (number = 0; number < Fragments.size (); number++) 00155 { 00156 Fragment& fragment = Fragments[number]; 00157 00158 fragment.print (); 00159 } 00160 } |
|
? |
Definition at line 880 of file cmt_fragment.cxx. References Symbol::find(), cmt_string::find(), CmtSystem::getenv(), locate(), Variable::macro_braces(), Variable::macro_pars(), cmt_string::npos, path, cmt_string::read(), cmt_string::replace_all(), Symbol::resolve_macro_value(), cmt_vector< Variable >::size(), cmt_string::substr(), and Variable::value. 00882 { 00883 int i; 00884 00885 if (!locate ()) return (false); 00886 00887 out.read (path); 00888 00889 Variable* var = 0; 00890 00891 for (i = 0; i < vector.size (); i++) 00892 { 00893 var = &(vector[i]); 00894 out.replace_all (var->macro_braces (), var->value); 00895 out.replace_all (var->macro_pars (), var->value); 00896 } 00897 00898 for (i = 0; i < variables; i++) 00899 { 00900 var = va_arg (ids, Variable*); 00901 out.replace_all (var->macro_braces (), var->value); 00902 out.replace_all (var->macro_pars (), var->value); 00903 } 00904 00905 cmt_string pattern; 00906 cmt_string macro_name; 00907 char end_pattern; 00908 00909 int start = 0; 00910 00911 for (;;) 00912 { 00913 // 00914 // Try and substitute all ${xxx} or $(xxx) patterns 00915 // using symbol values. 00916 // 00917 int par; 00918 int brace; 00919 int begin; 00920 00921 par = out.find (start, "$("); 00922 brace = out.find (start, "${"); 00923 00924 if (par == cmt_string::npos) 00925 { 00926 // No parentheses. Look for brace 00927 if (brace == cmt_string::npos) 00928 { 00929 // No pattern, finish the scan. 00930 break; 00931 } 00932 00933 // Brace found 00934 end_pattern = '}'; 00935 begin = brace; 00936 } 00937 else 00938 { 00939 // Parenthese found. Look for closest from {par, brace} 00940 if ((brace == cmt_string::npos) || 00941 (brace > par)) 00942 { 00943 end_pattern = ')'; 00944 begin = par; 00945 } 00946 else 00947 { 00948 end_pattern = '}'; 00949 begin = brace; 00950 } 00951 } 00952 00953 // Skip the pattern intro. 00954 start = begin + 2; 00955 00956 int end; 00957 end = out.find (start, end_pattern); 00958 if (end == cmt_string::npos) 00959 { 00960 // The pattern is a fake one (no ending!) 00961 break; 00962 } 00963 00964 // This should never happen... 00965 if (end < begin) break; 00966 00967 // Extract the complete pattern 00968 out.substr (begin, end - begin + 1, pattern); 00969 00970 // Then only the macro name 00971 out.substr (begin + 2, end - begin - 2, macro_name); 00972 00973 if (macro_name == "CFG") 00974 { 00975 // This is a Windows reserved keyword... 00976 start = end + 1; 00977 } 00978 else 00979 { 00980 Symbol* macro = Symbol::find (macro_name); 00981 if (macro != 0) 00982 { 00983 // Macro found 00984 cmt_string value = macro->resolve_macro_value (); 00985 //cout << "resolve_macro_value2> value=" << value << endl; 00986 out.replace_all (pattern, value); 00987 00988 // The substitution will restart from the same place 00989 // allowing for recursive replacements 00990 start = begin; 00991 } 00992 else 00993 { 00994 // Macro not found. Look for env. variable 00995 cmt_string value = CmtSystem::getenv (macro_name); 00996 //cout << "resolve_macro_value3> " << macro_name << "=" << value << endl; 00997 out.replace_all (pattern, value); 00998 00999 // The substitution will restart from the same place 01000 // allowing for recursive replacements 01001 start = begin; 01002 } 01003 } 01004 } 01005 01006 // Uniformly install CR-LF doublets. 01007 01008 out.replace_all ("\r\n", "\n"); 01009 out.replace_all ("\n", "\r\n"); 01010 01011 return (true); 01012 } |
|
? |
Definition at line 863 of file cmt_fragment.cxx. References wincopy(), and cmt_string::write(). 00864 { 00865 static cmt_string cline; 00866 00867 bool result = wincopy (cline, vector, variables, ids); 00868 if (result) 00869 { 00870 cline.write (out); 00871 return (true); 00872 } 00873 else 00874 { 00875 return (false); 00876 } 00877 } |
|
? |
Definition at line 625 of file cmt_fragment.cxx. References Symbol::find(), cmt_string::find(), CmtSystem::getenv(), locate(), Variable::macro_braces(), Variable::macro_pars(), cmt_string::npos, path, cmt_string::read(), cmt_string::replace_all(), Symbol::resolve_macro_value(), cmt_string::substr(), and Variable::value. 00626 { 00627 int i; 00628 00629 if (!locate ()) return (false); 00630 00631 out.read (path); 00632 00633 Variable* var = 0; 00634 for (i = 0; i < variables; i++) 00635 { 00636 var = va_arg (ids, Variable*); 00637 out.replace_all (var->macro_braces (), var->value); 00638 out.replace_all (var->macro_pars (), var->value); 00639 } 00640 00641 cmt_string pattern; 00642 cmt_string macro_name; 00643 char end_pattern; 00644 00645 int start = 0; 00646 00647 for (;;) 00648 { 00649 // 00650 // Try and substitute all ${xxx} or $(xxx) patterns 00651 // using symbol values. 00652 // 00653 int par; 00654 int brace; 00655 int begin; 00656 00657 par = out.find (start, "$("); 00658 brace = out.find (start, "${"); 00659 00660 if (par == cmt_string::npos) 00661 { 00662 // No parentheses. Look for brace 00663 if (brace == cmt_string::npos) 00664 { 00665 // No pattern, finish the scan. 00666 break; 00667 } 00668 00669 // Brace found 00670 end_pattern = '}'; 00671 begin = brace; 00672 } 00673 else 00674 { 00675 // Parenthese found. Look for closest from {par, brace} 00676 if ((brace == cmt_string::npos) || 00677 (brace > par)) 00678 { 00679 end_pattern = ')'; 00680 begin = par; 00681 } 00682 else 00683 { 00684 end_pattern = '}'; 00685 begin = brace; 00686 } 00687 } 00688 00689 // Skip the pattern intro. 00690 start = begin + 2; 00691 00692 int end; 00693 end = out.find (start, end_pattern); 00694 if (end == cmt_string::npos) 00695 { 00696 // The pattern is a fake one (no ending!) 00697 break; 00698 } 00699 00700 // This should never happen... 00701 if (end < begin) break; 00702 00703 // Extract the complete pattern 00704 out.substr (begin, end - begin + 1, pattern); 00705 00706 // Then only the macro name 00707 out.substr (begin + 2, end - begin - 2, macro_name); 00708 00709 if (macro_name == "CFG") 00710 { 00711 // This is a Windows reserved keyword... 00712 start = end + 1; 00713 } 00714 else 00715 { 00716 Symbol* macro = Symbol::find (macro_name); 00717 if (macro != 0) 00718 { 00719 // Macro found 00720 cmt_string value = macro->resolve_macro_value (); 00721 //cout << "resolve_macro_value2> value=" << value << endl; 00722 out.replace_all (pattern, value); 00723 00724 // The substitution will restart from the same place 00725 // allowing for recursive replacements 00726 start = begin; 00727 } 00728 else 00729 { 00730 // Macro not found. Look for env. variable 00731 cmt_string value = CmtSystem::getenv (macro_name); 00732 //cout << "resolve_macro_value3> " << macro_name << "=" << value << endl; 00733 out.replace_all (pattern, value); 00734 00735 // The substitution will restart from the same place 00736 // allowing for recursive replacements 00737 start = begin; 00738 } 00739 } 00740 } 00741 00742 // Uniformly install CR-LF doublets. 00743 00744 out.replace_all ("\r\n", "\n"); 00745 out.replace_all ("\n", "\r\n"); 00746 00747 return (true); 00748 } |
|
? |
Definition at line 607 of file cmt_fragment.cxx. References cmt_string::write(). Referenced by FragmentHandle::wincopy(), and wincopy(). 00608 { 00609 static cmt_string cline; 00610 00611 bool result = wincopy (cline, variables, ids); 00612 00613 if (result) 00614 { 00615 cline.write (out); 00616 return (true); 00617 } 00618 else 00619 { 00620 return (false); 00621 } 00622 } |
|
? |
Definition at line 100 of file cmt_fragment.h. Referenced by add(), clear(), and FragmentHandle::header(). |
|
? |
Definition at line 98 of file cmt_fragment.h. Referenced by add(), clear(), find(), Fragment(), locate(), FragmentHandle::name(), and print(). |
|
? |
Definition at line 102 of file cmt_fragment.h. Referenced by add(), clear(), and FragmentHandle::need_dependencies(). |
|
? |
Definition at line 103 of file cmt_fragment.h. Referenced by clear(), copy(), Fragment(), locate(), print(), and wincopy(). |
|
? |
Definition at line 99 of file cmt_fragment.h. Referenced by add(), clear(), print(), and FragmentHandle::suffix(). |
|
? |
Definition at line 101 of file cmt_fragment.h. Referenced by add(), clear(), and FragmentHandle::trailer(). |
|
? |
Definition at line 104 of file cmt_fragment.h. Referenced by add(), clear(), Fragment(), locate(), print(), and ~Fragment(). |