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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbienv.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:09:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbienv.cpp,v 1000.2 2004/06/01 19:09:02 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.  * Authors:  Denis Vakatov, Eugene Vasilchenko
  35.  *
  36.  * File Description:
  37.  *   Unified interface to application:
  38.  *      environment     -- CNcbiEnvironment
  39.  *      cmd.-line args  -- CNcbiArguments
  40.  *
  41.  */
  42. #include <ncbi_pch.hpp>
  43. #include <corelib/ncbienv.hpp>
  44. #include <corelib/ncbifile.hpp>
  45. #include <algorithm>
  46. #ifdef NCBI_OS_LINUX
  47. #include <unistd.h>
  48. #endif
  49. BEGIN_NCBI_SCOPE
  50. ///////////////////////////////////////////////////////
  51. //  CNcbiEnvironment::
  52. CNcbiEnvironment::CNcbiEnvironment(void)
  53. {
  54.     return;
  55. }
  56. CNcbiEnvironment::CNcbiEnvironment(const char* const* envp)
  57. {
  58.     Reset(envp);
  59. }
  60. CNcbiEnvironment::~CNcbiEnvironment(void)
  61. {
  62.     return;
  63. }
  64. void CNcbiEnvironment::Reset(const char* const* envp)
  65. {
  66.     // delete old environment values
  67.     m_Cache.clear();
  68.     // load new environment values from "envp"
  69.     if ( !envp )
  70.         return;
  71.     for ( ;  *envp;  envp++) {
  72.         const char* s = *envp;
  73.         const char* eq = strchr(s, '=');
  74.         if ( !eq ) {
  75.             ERR_POST("CNcbiEnvironment: bad string '" << s << "'");
  76.             continue;
  77.         }
  78.         m_Cache[string(s, eq)] = eq + 1;
  79.     }
  80. }
  81. const string& CNcbiEnvironment::Get(const string& name) const
  82. {
  83.     map<string, string>::const_iterator i = m_Cache.find(name);
  84.     if ( i != m_Cache.end() )
  85.         return i->second;
  86.     return m_Cache[name] = Load(name);
  87. }
  88. void CNcbiEnvironment::Set(const string& name, const string& value)
  89. {
  90. #ifdef NCBI_OS_MSWIN
  91. #define putenv _putenv
  92. #endif
  93.     char* str = strdup((name + "=" + value).c_str());
  94.     if ( !str ) {
  95.         throw bad_alloc();
  96.     }
  97.     if (putenv(str) != 0) {
  98.         NCBI_THROW(CErrnoTemplException<CCoreException>, eErrno,
  99.                    "failed to set environment variable " + name);
  100.     }
  101.     m_Cache[name] = value;
  102. #ifdef NCBI_OS_MSWIN
  103. #undef putenv
  104. #endif
  105. }
  106. string CNcbiEnvironment::Load(const string& name) const
  107. {
  108.     const char* s = getenv(name.c_str());
  109.     if ( !s )
  110.         return NcbiEmptyString;
  111.     else
  112.         return s;
  113. }
  114. ///////////////////////////////////////////////////////
  115. //  CNcbiArguments::
  116. CNcbiArguments::CNcbiArguments(int argc, const char* const* argv,
  117.                                const string& program_name)
  118. {
  119.     Reset(argc, argv, program_name);
  120. }
  121. CNcbiArguments::~CNcbiArguments(void)
  122. {
  123.     return;
  124. }
  125. CNcbiArguments::CNcbiArguments(const CNcbiArguments& args)
  126.     : m_ProgramName(args.m_ProgramName),
  127.       m_Args(args.m_Args)
  128. {
  129.     return;
  130. }
  131. CNcbiArguments& CNcbiArguments::operator= (const CNcbiArguments& args)
  132. {
  133.     if (&args == this)
  134.         return *this;
  135.     m_ProgramName = args.m_ProgramName;
  136.     m_Args.clear();
  137.     copy(args.m_Args.begin(), args.m_Args.end(), back_inserter(m_Args));
  138.     return *this;
  139. }
  140. void CNcbiArguments::Reset(int argc, const char* const* argv,
  141.                            const string& program_name)
  142. {
  143.     // check args
  144.     if (argc < 0) {
  145.         NCBI_THROW(CArgumentsException,eNegativeArgc,
  146.             "Negative number of command-line arguments");
  147.     }
  148.     if ((argc == 0) != (argv == 0)) {
  149.         if (argv == 0) {
  150.             NCBI_THROW(CArgumentsException,eNoArgs,
  151.                 "Command-line arguments are absent");
  152.         }
  153.         ERR_POST(Info <<
  154.                  "CNcbiArguments(): zero "argc", non-zero "argv"");
  155.     }
  156.     // clear old args, store new ones
  157.     m_Args.clear();
  158.     for (int i = 0;  i < argc;  i++) {
  159.         if ( !argv[i] ) {
  160.             ERR_POST(Warning <<
  161.                      "CNcbiArguments() -- NULL cmd.-line arg #" << i);
  162.             continue;
  163.         }
  164.         m_Args.push_back(argv[i]);
  165.     }
  166.     // set application name
  167.     SetProgramName(program_name);
  168. }
  169. const string& CNcbiArguments::GetProgramName(EFollowLinks follow_links) const
  170. {
  171.     if (follow_links) {
  172.         CFastMutexGuard LOCK(m_ResolvedNameMutex);
  173.         if ( !m_ResolvedName.size() ) {
  174. #ifdef NCBI_OS_LINUX
  175.             string proc_link = "/proc/" + NStr::IntToString(getpid()) + "/exe";
  176.             m_ResolvedName = CDirEntry::NormalizePath(proc_link, follow_links);
  177. #else
  178.             m_ResolvedName = CDirEntry::NormalizePath
  179.                 (GetProgramName(eIgnoreLinks), follow_links);
  180. #endif
  181.         }
  182.         return m_ResolvedName;
  183.     } else if ( !m_ProgramName.empty() ) {
  184.         return m_ProgramName;
  185.     } else if ( m_Args.size() ) {
  186.         return m_Args[0];
  187.     } else {
  188.         static const string kDefProgramName("ncbi");
  189.         return kDefProgramName;
  190.     }
  191. }
  192. string CNcbiArguments::GetProgramBasename(EFollowLinks follow_links) const
  193. {
  194.     const string& name = GetProgramName(follow_links);
  195.     SIZE_TYPE base_pos = name.find_last_of("/\:");
  196.     if (base_pos == NPOS)
  197.         return name;
  198.     return name.substr(base_pos + 1);
  199. }
  200. string CNcbiArguments::GetProgramDirname(EFollowLinks follow_links) const
  201. {
  202.     const string& name = GetProgramName(follow_links);
  203.     SIZE_TYPE base_pos = name.find_last_of("/\:");
  204.     if (base_pos == NPOS)
  205.         return NcbiEmptyString;
  206.     return name.substr(0, base_pos + 1);
  207. }
  208. void CNcbiArguments::SetProgramName(const string& program_name)
  209. {
  210.     m_ProgramName = program_name;
  211.     CFastMutexGuard LOCK(m_ResolvedNameMutex);
  212.     m_ResolvedName.erase();
  213. }
  214. void CNcbiArguments::Add(const string& arg)
  215. {
  216.     m_Args.push_back(arg);
  217. }
  218. END_NCBI_SCOPE
  219. /*
  220.  * ===========================================================================
  221.  * $Log: ncbienv.cpp,v $
  222.  * Revision 1000.2  2004/06/01 19:09:02  gouriano
  223.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  224.  *
  225.  * Revision 1.12  2004/05/14 13:59:27  gorelenk
  226.  * Added include of ncbi_pch.hpp
  227.  *
  228.  * Revision 1.11  2004/01/07 14:26:40  dicuccio
  229.  * Changed CErrnoTemplExceptionEx to CErrnoTempException in Set() to please
  230.  * WorkShop
  231.  *
  232.  * Revision 1.10  2004/01/06 20:17:41  dicuccio
  233.  * Use CCoreException instead of CException in Set()
  234.  *
  235.  * Revision 1.9  2004/01/06 18:17:49  dicuccio
  236.  * Added APIs for setting environment variables
  237.  *
  238.  * Revision 1.8  2003/10/01 14:32:09  ucko
  239.  * +EFollowLinks
  240.  *
  241.  * Revision 1.7  2003/09/30 15:10:11  ucko
  242.  * CNcbiArguments::GetProgram{Name,Basename,Dirname}: optionally resolve symlinks.
  243.  *
  244.  * Revision 1.6  2002/07/15 18:17:24  gouriano
  245.  * renamed CNcbiException and its descendents
  246.  *
  247.  * Revision 1.5  2002/07/11 14:18:26  gouriano
  248.  * exceptions replaced by CNcbiException-type ones
  249.  *
  250.  * Revision 1.4  2002/04/11 21:08:02  ivanov
  251.  * CVS log moved to end of the file
  252.  *
  253.  * Revision 1.3  2000/08/31 23:50:21  vakatov
  254.  * CNcbiArguments:: Inlined Size() and operator[];   use <deque>
  255.  *
  256.  * Revision 1.2  2000/01/20 16:36:04  vakatov
  257.  * Added class CNcbiArguments::   application command-line arguments & name
  258.  * Added CNcbiEnvironment::Reset(), and comments to CNcbiEnvironment::
  259.  * Dont #include <ncbienv.inl>
  260.  *
  261.  * Revision 1.1  1999/05/04 16:14:46  vasilche
  262.  * Fixed problems with program environment.
  263.  * Added class CNcbiEnvironment for cached access to C environment.
  264.  *
  265.  * ===========================================================================
  266.  */