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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: file_contents.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:30:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: file_contents.cpp,v 1000.1 2004/06/01 18:30:40 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/file_contents.hpp>
  39. #include <app/project_tree_builder/proj_builder_app.hpp>
  40. #include <app/project_tree_builder/msvc_prj_defines.hpp>
  41. #include <corelib/ncbistr.hpp>
  42. BEGIN_NCBI_SCOPE
  43. //-----------------------------------------------------------------------------
  44. CSimpleMakeFileContents::CSimpleMakeFileContents(void)
  45. {
  46. }
  47. CSimpleMakeFileContents::CSimpleMakeFileContents
  48.     (const CSimpleMakeFileContents& contents)
  49. {
  50.     SetFrom(contents);
  51. }
  52. CSimpleMakeFileContents& CSimpleMakeFileContents::operator=
  53.     (const CSimpleMakeFileContents& contents)
  54. {
  55.     if (this != &contents) {
  56.         SetFrom(contents);
  57.     }
  58.     return *this;
  59. }
  60. CSimpleMakeFileContents::CSimpleMakeFileContents(const string& file_path)
  61. {
  62.     LoadFrom(file_path, this);
  63. }
  64. CSimpleMakeFileContents::~CSimpleMakeFileContents(void)
  65. {
  66. }
  67. void CSimpleMakeFileContents::Clear(void)
  68. {
  69.     m_Contents.clear();
  70. }
  71. void CSimpleMakeFileContents::SetFrom(const CSimpleMakeFileContents& contents)
  72. {
  73.     m_Contents = contents.m_Contents;
  74. }
  75. void CSimpleMakeFileContents::LoadFrom(const string&            file_path,
  76.                                        CSimpleMakeFileContents* fc)
  77. {
  78.     CSimpleMakeFileContents::SParser parser(fc);
  79.     fc->Clear();
  80.     CNcbiIfstream ifs(file_path.c_str(), IOS_BASE::in | IOS_BASE::binary);
  81.     if ( !ifs )
  82.         NCBI_THROW(CProjBulderAppException, eFileOpen, file_path);
  83.     parser.StartParse();
  84.     string strline;
  85.     while ( NcbiGetlineEOL(ifs, strline) )
  86.     parser.AcceptLine(strline);
  87.     parser.EndParse();
  88. }
  89. void CSimpleMakeFileContents::Dump(CNcbiOfstream& ostr) const
  90. {
  91.     ITERATE(TContents, p, m_Contents) {
  92.     ostr << p->first << " = ";
  93.     ITERATE(list<string>, m, p->second) {
  94.     ostr << *m << " ";
  95.     }
  96.     ostr << endl;
  97.     }
  98. }
  99. CSimpleMakeFileContents::SParser::SParser(CSimpleMakeFileContents* fc)
  100.     :m_FileContents(fc)
  101. {
  102. }
  103. void CSimpleMakeFileContents::SParser::StartParse(void)
  104. {
  105.     m_Continue  = false;
  106.     m_CurrentKV = SKeyValue();
  107. }
  108. //------------------------------------------------------------------------------
  109. // helpers ---------------------------------------------------------------------
  110. static bool s_WillContinue(const string& line)
  111. {
  112.     return NStr::EndsWith(line, "\");
  113. }
  114. static void s_StripContinueStr(string* str)
  115. {
  116.     str->erase(str->length() -1, 1); // delete last ''
  117. }
  118. static bool s_SplitKV(const string& line, string* key, string* value)
  119. {
  120.     if ( !NStr::SplitInTwo(line, "=", *key, *value) )
  121.     return false;
  122.     *key = NStr::TruncateSpaces(*key); // only for key - preserve sp for vals
  123.     if ( s_WillContinue(*value) ) 
  124.     s_StripContinueStr(value);
  125.     return true;
  126. }
  127. static bool s_IsKVString(const string& str)
  128. {
  129.     size_t eq_pos = str.find("=");
  130.     if (eq_pos == NPOS)
  131.         return false;
  132.     string mb_key = str.substr(0, eq_pos - 1);
  133.     return mb_key.find_first_of("$()") == NPOS;
  134. }
  135. static bool s_IsCommented(const string& str)
  136. {
  137.     return NStr::StartsWith(str, "#");
  138. }
  139. void CSimpleMakeFileContents::SParser::AcceptLine(const string& line)
  140. {
  141.     string strline = NStr::TruncateSpaces(line);
  142.     if ( s_IsCommented(strline) )
  143.     return;
  144.     if (m_Continue) {
  145.     m_Continue = s_WillContinue(strline);
  146.     if ( strline.empty() ) {
  147.     //fix for ill-formed makefiles:
  148.     m_FileContents->AddReadyKV(m_CurrentKV);
  149.     return;
  150.     } else if ( s_IsKVString(strline) ) {
  151.     //fix for ill-formed makefiles:
  152.     m_FileContents->AddReadyKV(m_CurrentKV);
  153.     m_Continue = false; // guard 
  154.     AcceptLine(strline.c_str()); 
  155.     }
  156.     if (m_Continue)
  157.     s_StripContinueStr(&strline);
  158.     m_CurrentKV.m_Value += strline;
  159.     return;
  160.     
  161.     } else {
  162.     // may be only k=v string
  163.     if ( s_IsKVString(strline) ) {
  164.     m_FileContents->AddReadyKV(m_CurrentKV);
  165.     m_Continue = s_WillContinue(strline);
  166.     s_SplitKV(strline, &m_CurrentKV.m_Key, &m_CurrentKV.m_Value);
  167.     return;
  168.     }
  169.     }
  170. }
  171. void CSimpleMakeFileContents::SParser::EndParse(void)
  172. {
  173.     m_FileContents->AddReadyKV(m_CurrentKV);
  174.     m_Continue = false;
  175.     m_CurrentKV = SKeyValue();
  176. }
  177. void CSimpleMakeFileContents::AddReadyKV(const SKeyValue& kv)
  178. {
  179.     if ( kv.m_Key.empty() ) 
  180.     return;
  181.     list<string> values;
  182.     NStr::Split(kv.m_Value, LIST_SEPARATOR, values);
  183.     m_Contents[kv.m_Key] = values;
  184. }
  185. END_NCBI_SCOPE
  186. /*
  187.  * ===========================================================================
  188.  * $Log: file_contents.cpp,v $
  189.  * Revision 1000.1  2004/06/01 18:30:40  gouriano
  190.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  191.  *
  192.  * Revision 1.11  2004/05/21 21:41:41  gorelenk
  193.  * Added PCH ncbi_pch.hpp
  194.  *
  195.  * Revision 1.10  2004/05/06 20:53:40  gorelenk
  196.  * Changed implementation of s_IsKVString .
  197.  *
  198.  * Revision 1.9  2004/02/17 23:25:08  gorelenk
  199.  * Using NcbiGetlineEOL instead of getline.
  200.  *
  201.  * Revision 1.8  2004/02/06 23:14:58  gorelenk
  202.  * Implemented support of ASN projects, semi-auto configure,
  203.  * CPPFLAGS support. Second working version.
  204.  *
  205.  * Revision 1.7  2004/01/30 20:45:03  gorelenk
  206.  * Second revision.
  207.  *
  208.  * Revision 1.6  2004/01/28 17:55:48  gorelenk
  209.  * += For msvc makefile support of :
  210.  *                 Requires tag, ExcludeProject tag,
  211.  *                 AddToProject section (SourceFiles and IncludeDirs),
  212.  *                 CustomBuild section.
  213.  * += For support of user local site.
  214.  *
  215.  * Revision 1.5  2004/01/26 19:27:27  gorelenk
  216.  * += MSVC meta makefile support
  217.  * += MSVC project makefile support
  218.  *
  219.  * Revision 1.4  2004/01/22 17:57:53  gorelenk
  220.  * first version
  221.  *
  222.  * ===========================================================================
  223.  */