resolver.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: resolver.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:31:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: resolver.cpp,v 1000.1 2004/06/01 18:31:38 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Viatcheslav Gorelenkov
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <app/project_tree_builder/resolver.hpp>
  39. #include <corelib/ncbistr.hpp>
  40. BEGIN_NCBI_SCOPE
  41. //-----------------------------------------------------------------------------
  42. CSymResolver::CSymResolver(void)
  43. {
  44.     Clear();
  45. }
  46. CSymResolver::CSymResolver(const CSymResolver& resolver)
  47. {
  48.     SetFrom(resolver);
  49. }
  50. CSymResolver::CSymResolver(const string& file_path)
  51. {
  52.     LoadFrom(file_path, this);
  53. }
  54. CSymResolver& CSymResolver::operator= (const CSymResolver& resolver)
  55. {
  56.     if (this != &resolver) {
  57.     Clear();
  58.     SetFrom(resolver);
  59.     }
  60.     return *this;
  61. }
  62. CSymResolver::~CSymResolver(void)
  63. {
  64.     Clear();
  65. }
  66. string CSymResolver::StripDefine(const string& define)
  67. {
  68.     return string(define, 2, define.length() - 3);
  69. }
  70. void CSymResolver::Resolve(const string& define, list<string>* resolved_def)
  71. {
  72.     resolved_def->clear();
  73.     if ( !IsDefine(define) ) {
  74.     resolved_def->push_back(define);
  75.     return;
  76.     }
  77.     string str_define = StripDefine(define);
  78.     CSimpleMakeFileContents::TContents::const_iterator m =
  79.         m_Cache.find(str_define);
  80.     if (m != m_Cache.end()) {
  81.     *resolved_def = m->second;
  82.     return;
  83.     }
  84.     
  85.     ITERATE(CSimpleMakeFileContents::TContents, p, m_Data.m_Contents) {
  86.     if (p->first == str_define) {
  87.             ITERATE(list<string>, n, p->second) {
  88.                 list<string> new_resolved_def;
  89.                 Resolve(*n, &new_resolved_def);
  90.                 copy(new_resolved_def.begin(),
  91.                      new_resolved_def.end(),
  92.                      back_inserter(*resolved_def));
  93.             }
  94.     }
  95.     }
  96.     m_Cache[str_define] = *resolved_def;
  97. }
  98. CSymResolver& CSymResolver::operator+= (const CSymResolver& src)
  99. {
  100.     // Clear cache for resolved defines
  101.     m_Cache.clear();
  102.     
  103.     // Add contents of src
  104.     copy(src.m_Data.m_Contents.begin(), 
  105.          src.m_Data.m_Contents.end(), 
  106.          inserter(m_Data.m_Contents, m_Data.m_Contents.end()));
  107.     return *this;
  108. }
  109. bool CSymResolver::IsDefine(const string& param)
  110. {
  111.     return NStr::StartsWith(param, "$(")  &&  NStr::EndsWith(param, ")");
  112. }
  113. void CSymResolver::LoadFrom(const string& file_path, 
  114.                             CSymResolver * resolver)
  115. {
  116.     resolver->Clear();
  117.     CSimpleMakeFileContents::LoadFrom(file_path, &resolver->m_Data);
  118. }
  119. bool CSymResolver::IsEmpty(void) const
  120. {
  121.     return m_Data.m_Contents.empty();
  122. }
  123. void CSymResolver::Clear(void)
  124. {
  125.     m_Data.m_Contents.clear();
  126.     m_Cache.clear();
  127. }
  128. void CSymResolver::SetFrom(const CSymResolver& resolver)
  129. {
  130.     m_Data  = resolver.m_Data;
  131.     m_Cache = resolver.m_Cache;
  132. }
  133. //-----------------------------------------------------------------------------
  134. // Filter opt defines like $(SRC_C:.core_%)           to $(SRC_C).
  135. // or $(OBJMGR_LIBS:dbapi_driver=dbapi_driver-static) to $(OBJMGR_LIBS)
  136. string FilterDefine(const string& define)
  137. {
  138.     if ( !CSymResolver::IsDefine(define) )
  139.         return define;
  140.     string res;
  141.     for(string::const_iterator p = define.begin(); p != define.end(); ++p) {
  142.         char ch = *p;
  143.         if ( !(ch == '$'   || 
  144.                ch == '('   || 
  145.                ch == '_'   || 
  146.                isalpha(ch) || 
  147.                isdigit(ch) ) )
  148.             break;
  149.         res += ch;
  150.     }
  151.     res += ')';
  152.     return res;
  153. }
  154. END_NCBI_SCOPE
  155. /*
  156.  * ===========================================================================
  157.  * $Log: resolver.cpp,v $
  158.  * Revision 1000.1  2004/06/01 18:31:38  gouriano
  159.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  160.  *
  161.  * Revision 1.8  2004/05/21 21:41:41  gorelenk
  162.  * Added PCH ncbi_pch.hpp
  163.  *
  164.  * Revision 1.7  2004/02/17 16:18:33  gorelenk
  165.  * Added digit as an allowed symbol for makefile defines.
  166.  *
  167.  * Revision 1.6  2004/02/10 18:16:00  gorelenk
  168.  * Fixed recursive resolving procedure.
  169.  *
  170.  * Revision 1.5  2004/02/04 23:57:22  gorelenk
  171.  * Added definition of function FilterDefine.
  172.  *
  173.  * Revision 1.4  2004/01/28 17:55:50  gorelenk
  174.  * += For msvc makefile support of :
  175.  *                 Requires tag, ExcludeProject tag,
  176.  *                 AddToProject section (SourceFiles and IncludeDirs),
  177.  *                 CustomBuild section.
  178.  * += For support of user local site.
  179.  *
  180.  * Revision 1.3  2004/01/22 17:57:55  gorelenk
  181.  * first version
  182.  *
  183.  * ===========================================================================
  184.  */
  185.