⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metareg.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: metareg.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:08:30  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12 * PRODUCTION * =========================================================================== *//*  $Id: metareg.cpp,v 1000.2 2004/06/01 19:08:30 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Author:  Aaron Ucko * * File Description: *   CMetaRegistry * * =========================================================================== */#include <ncbi_pch.hpp>#include <corelib/metareg.hpp>#include <corelib/ncbiapp.hpp>#include <corelib/ncbifile.hpp>BEGIN_NCBI_SCOPEauto_ptr<CMetaRegistry> CMetaRegistry::sm_Instance;DEFINE_CLASS_STATIC_MUTEX(CMetaRegistry::sm_Mutex);CMetaRegistry::~CMetaRegistry(){    ITERATE (vector<SEntry>, it, m_Contents) {        // optionally save if modified?        if ( !(it->flags & fDontOwn) ) {            delete it->registry;        }    }}CMetaRegistry::SEntryCMetaRegistry::x_Load(const string& name, CMetaRegistry::ENameStyle style,                      CMetaRegistry::TFlags flags,                      CNcbiRegistry::TFlags reg_flags, CNcbiRegistry* reg,                      const string& name0, CMetaRegistry::ENameStyle style0){    _TRACE("CMetaRegistry::Load: looking for " << name);    CMutexGuard GUARD(sm_Mutex);    if (flags & fPrivate) {        GUARD.Release();    }    else { // see if we already have it        TIndex::const_iterator iit            = m_Index.find(SKey(name, style, flags, reg_flags));        if (iit != m_Index.end()) {            _TRACE("found in cache");            _ASSERT(iit->second < m_Contents.size());            return m_Contents[iit->second];        }        ITERATE (vector<SEntry>, it, m_Contents) {            if (it->flags != flags  ||  it->reg_flags != reg_flags)                continue;            if (style == eName_AsIs  &&  it->actual_name == name) {                _TRACE("found in cache");                return *it;            }        }    }    string dir;    CDirEntry::SplitPath(name, &dir, 0, 0);    if ( dir.empty() ) {        ITERATE (TSearchPath, it, m_SearchPath) {            SEntry result = x_Load(CDirEntry::MakePath(*it, name), style,                                   flags, reg_flags, reg, name0, style0);            if ( result.registry ) {                return result;            }        }    } else {        switch (style) {        case eName_AsIs: {            CNcbiIfstream in(name.c_str(), IOS_BASE::in | IOS_BASE::binary);            if ( !in.good() ) {                _TRACE("CMetaRegistry::Load() -- cannot open registry file: "                       << name);                break;            }            _TRACE("CMetaRegistry::Load() -- reading registry file: " << name);            SEntry result;            result.flags     = flags;            result.reg_flags = reg_flags;            if ( reg ) {                if ( !reg->Empty() ) { // shouldn't share                    result.flags |= fPrivate;                }                result.registry = reg;                reg->Read(in, reg_flags);            } else {                result.registry = new CNcbiRegistry(in, reg_flags);            }            if ( CDirEntry::IsAbsolutePath(name) ) {                result.actual_name = name;            } else {                result.actual_name = CDirEntry::ConcatPath(CDir::GetCwd(),                                                           name);            }            if ( !(flags & fPrivate) ) {                m_Contents.push_back(result);                m_Index[SKey(name0, style0, flags, reg_flags)]                    = m_Contents.size() - 1;            }            return result;        }        case eName_Ini: {            string name2(name);            for (;;) {                SEntry result = x_Load(name2 + ".ini", eName_AsIs, flags,                                       reg_flags, reg, name0, style0);                if (result.registry) {                    return result;                }                string base, ext; // dir already known                CDirEntry::SplitPath(name2, 0, &base, &ext);                if ( ext.empty() ) {                    break;                }                name2 = CDirEntry::MakePath(dir, base);            }            break;        }        case eName_DotRc: {            string base, ext;            CDirEntry::SplitPath(name, 0, &base, &ext);            return x_Load(CDirEntry::MakePath(dir, '.' + base, ext) + "rc",                          eName_AsIs, flags, reg_flags, reg, name0, style0);        }        }  // switch (style)    }    // not found    SEntry result;    result.flags     = flags;    result.reg_flags = reg_flags;    result.registry  = 0;    if (reg  &&  !(flags & fDontOwn) ) {        delete reg;    }    return result;}void CMetaRegistry::GetDefaultSearchPath(CMetaRegistry::TSearchPath& path){    // set up the default search path:    //    - The current working directory.    //    - The directory, if any, given by the environment variable "NCBI".    //    - The user's home directory.    //    - The directory containing the application, if known    path.push_back(".");    {{        const char* ncbi = getenv("NCBI");        if (ncbi  &&  *ncbi) {            path.push_back(ncbi);        }    }}    path.push_back(CDir::GetHome());    {{        CNcbiApplication* the_app = CNcbiApplication::Instance();        if ( the_app ) {            const CNcbiArguments& args = the_app->GetArguments();            string                dir  = args.GetProgramDirname(eIgnoreLinks);            string                dir2 = args.GetProgramDirname(eFollowLinks);            if (dir.size()) {                path.push_back(dir);            }            if (dir2.size() && dir2 != dir) {                path.push_back(dir2);            }        }    }}}bool CMetaRegistry::SKey::operator <(const SKey& k) const{    if (requested_name < k.requested_name) {        return true;    } else if (requested_name > k.requested_name) {        return false;    }    if (style < k.style) {        return true;    } else if (style > k.style) {        return false;    }    if (flags < k.flags) {        return true;    } else if (flags > k.flags) {        return false;    }    if (reg_flags < k.reg_flags) {        return true;    } else if (reg_flags > k.reg_flags) {        return false;    }    return false;}END_NCBI_SCOPE/* * =========================================================================== * * $Log: metareg.cpp,v $ * Revision 1000.2  2004/06/01 19:08:30  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12 * * Revision 1.12  2004/05/14 13:59:26  gorelenk * Added include of ncbi_pch.hpp * * Revision 1.11  2003/12/08 18:40:22  ucko * Use DEFINE_CLASS_STATIC_MUTEX to avoid possible premature locking. * * Revision 1.10  2003/10/01 14:32:09  ucko * +EFollowLinks * * Revision 1.9  2003/10/01 01:02:49  ucko * Fix (syntactically) broken assertion. * * Revision 1.8  2003/09/30 21:06:24  ucko * Refactored cache to allow flushing of path searches when the search * path changes. * If the application ran through a symlink to another directory, search * the real directory as a fallback. * * Revision 1.7  2003/09/29 20:15:20  vakatov * CMetaRegistry::x_Load() -- thinko fix:  "result.flags |= fPrivate;" (added '|') * * Revision 1.6  2003/08/21 20:50:54  ucko * eName_DotRc: avoid accidentally adding a dot before the rc... * * Revision 1.5  2003/08/18 19:49:09  ucko * Remove an unreachable statement. * * Revision 1.4  2003/08/12 15:15:50  ucko * Open registry files in binary mode per CNcbiRegistry's expectations. * * Revision 1.3  2003/08/06 20:26:17  ucko * Allow Load to take an existing registry to reuse; properly handle flags. * * Revision 1.2  2003/08/05 20:28:51  ucko * CMetaRegistry::GetDefaultSearchPath: don't add the program's directory * if it's empty. * * Revision 1.1  2003/08/05 19:57:59  ucko * CMetaRegistry: Singleton class for loading CRegistry data from files; * keeps track of what it loaded from where, for potential reuse. * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -