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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbienv.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/02/12 21:44:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef NCBIENV__HPP
  10. #define NCBIENV__HPP
  11. /*  $Id: ncbienv.hpp,v 1000.1 2004/02/12 21:44:43 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Denis Vakatov, Eugene Vasilchenko
  37.  *
  38.  *
  39.  */
  40. /// @file ncbienv.hpp
  41. /// Defines unified interface to application:
  42. /// - Environment        -- CNcbiEnvironment
  43. /// - Command-line args  -- CNcbiArguments
  44. #include <corelib/ncbifile.hpp>
  45. #include <corelib/ncbimtx.hpp>
  46. #include <map>
  47. #include <deque>
  48. /// Avoid name clash with the NCBI C Toolkit.
  49. #if !defined(NCBI_OS_UNIX)  ||  defined(HAVE_NCBI_C)
  50. #  if defined(GetProgramName)
  51. #    undef GetProgramName
  52. #  endif
  53. #  define GetProgramName GetProgramName
  54. #  if defined(SetProgramName)
  55. #    undef SetProgramName
  56. #  endif
  57. #  define SetProgramName SetProgramName
  58. #endif
  59. /** @addtogroup Environment
  60.  *
  61.  * @{
  62.  */
  63. BEGIN_NCBI_SCOPE
  64. /////////////////////////////////////////////////////////////////////////////
  65. ///
  66. /// CArgumentsException --
  67. ///
  68. /// Define exceptions generated by CArgumentsApplication.
  69. ///
  70. /// CArgumentsException inherits its basic functionality from CCoreException
  71. /// and defines additional error codes for applications.
  72. class NCBI_XNCBI_EXPORT CArgumentsException : public CCoreException
  73. {
  74. public:
  75.     /// Error types that arguments processing can generate.
  76.     enum EErrCode {
  77.         eNegativeArgc,  ///< Negative argc value
  78.         eNoArgs         ///< No arguments
  79.     };
  80.     /// Translate from the error code value to its string representation.
  81.     virtual const char* GetErrCodeString(void) const
  82.     {
  83.         switch (GetErrCode()) {
  84.         case eNegativeArgc:  return "eNegativeArgc";
  85.         case eNoArgs:        return "eNoArgs";
  86.         default:    return CException::GetErrCodeString();
  87.         }
  88.     }
  89.     // Standard exception boilerplate code.
  90.     NCBI_EXCEPTION_DEFAULT(CArgumentsException, CCoreException);
  91. };
  92. /////////////////////////////////////////////////////////////////////////////
  93. ///
  94. /// CNcbiEnvironment --
  95. ///
  96. /// Define the application environment.
  97. ///
  98. /// CNcbiEnvironment provides a data structure for storing, accessing and
  99. /// modifying the environment variables accessed by the C library routine
  100. /// getenv().
  101. class NCBI_XNCBI_EXPORT CNcbiEnvironment
  102. {
  103. public:
  104.     /// Constructor.
  105.     CNcbiEnvironment(void);
  106.     /// Constructor with the envp parameter.
  107.     CNcbiEnvironment(const char* const* envp);
  108.     /// Destructor.
  109.     virtual ~CNcbiEnvironment(void);
  110.     /// Reset environment.
  111.     ///
  112.     /// Delete all cached entries, load new ones from "envp" (if not NULL).
  113.     void Reset(const char* const* envp = 0);
  114.     /// Get environment value by name.
  115.     ///
  116.     /// If environmnent value is not cached then call "Load(name)" to load
  117.     /// the environmnent value.  The loaded name/value pair will then be
  118.     /// cached, too, after the call to "Get()".
  119.     const string& Get(const string& name) const;
  120.     /// Set an environment variable by name
  121.     ///
  122.     /// This will throw an exception if setting the variable fails
  123.     void Set(const string& name, const string& value);
  124. protected:
  125.     /// Load value of specified environment variable.
  126.     virtual string Load(const string& name) const;
  127. private:
  128.     /// Cached environment <name,value> pair.
  129.     mutable map<string, string> m_Cache;
  130. };
  131. /////////////////////////////////////////////////////////////////////////////
  132. ///
  133. /// CNcbiArguments --
  134. ///
  135. /// Store application command-line arguments & application name.
  136. ///
  137. /// CNcbiArgument provides a data structure for storing and accessing the
  138. /// command line arguments and application name.
  139. class NCBI_XNCBI_EXPORT CNcbiArguments
  140. {
  141. public:
  142.     /// Constructor.
  143.     CNcbiArguments(int argc,                ///< Standard argument count
  144.                    const char* const* argv, ///< Standard argument vector
  145.                    const string& program_name = NcbiEmptyString
  146.                                             ///< Program name
  147.                   );
  148.     /// Destructor.
  149.     virtual ~CNcbiArguments(void);
  150.     /// Copy constructor.
  151.     CNcbiArguments(const CNcbiArguments& args);
  152.     /// Assignment operator.
  153.     CNcbiArguments& operator= (const CNcbiArguments& args);
  154.     /// Reset arguments.
  155.     ///
  156.     /// Delete all cached args and program name.  Load new ones from "argc",
  157.     /// "argv" and "program_name".
  158.     void Reset(int argc,                    ///< Standard argument count
  159.                const char* const* argv,     ///< Standard argument vector
  160.                const string& program_name = NcbiEmptyString
  161.                                             ///< Program name
  162.               );
  163.     /// Get size (number) of arguments.
  164.     SIZE_TYPE Size(void) const { return m_Args.size(); }
  165.     /// Get the argument specified by "pos".
  166.     const string& operator[] (SIZE_TYPE pos) const { return m_Args[pos]; }
  167.     /// Add a new argument.
  168.     void Add(const string& arg);
  169.     /// Get program name.
  170.     const string& GetProgramName(EFollowLinks follow_links = eIgnoreLinks)
  171.         const;
  172.     /// Get program base name.
  173.     string GetProgramBasename(EFollowLinks follow_links = eIgnoreLinks) const;
  174.     /// Get program directory name.
  175.     ///
  176.     /// Program name includes the last '/'.
  177.     string GetProgramDirname (EFollowLinks follow_links = eIgnoreLinks) const;
  178.     /// Set program name.
  179.     void SetProgramName(const string& program_name);
  180. private:
  181.     string        m_ProgramName;  ///< Program name if different from the
  182.                                   ///< default m_Args[0]
  183.     deque<string> m_Args;         ///< Queue of arguments
  184.     mutable string     m_ResolvedName;
  185.     mutable CFastMutex m_ResolvedNameMutex;
  186. };
  187. END_NCBI_SCOPE
  188. /* @} */
  189. /*
  190.  * ===========================================================================
  191.  * $Log: ncbienv.hpp,v $
  192.  * Revision 1000.1  2004/02/12 21:44:43  gouriano
  193.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.14
  194.  *
  195.  * Revision 1.14  2004/01/06 18:17:21  dicuccio
  196.  * Added APIs for setting environment variables
  197.  *
  198.  * Revision 1.13  2003/10/01 14:32:09  ucko
  199.  * +EFollowLinks
  200.  *
  201.  * Revision 1.12  2003/09/30 15:09:44  ucko
  202.  * CNcbiArguments::GetProgram{Name,Basename,Dirname}: optionally resolve symlinks.
  203.  *
  204.  * Revision 1.11  2003/07/25 12:26:19  siyan
  205.  * Documentation changes.
  206.  *
  207.  * Revision 1.10  2003/03/31 16:06:06  siyan
  208.  * Added doxygen support
  209.  *
  210.  * Revision 1.9  2002/12/18 22:53:21  dicuccio
  211.  * Added export specifier for building DLLs in windows.  Added global list of
  212.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  213.  *
  214.  * Revision 1.8  2002/07/15 18:17:51  gouriano
  215.  * renamed CNcbiException and its descendents
  216.  *
  217.  * Revision 1.7  2002/07/11 14:17:54  gouriano
  218.  * exceptions replaced by CNcbiException-type ones
  219.  *
  220.  * Revision 1.6  2002/04/11 20:39:17  ivanov
  221.  * CVS log moved to end of the file
  222.  *
  223.  * Revision 1.5  2001/04/13 02:59:31  vakatov
  224.  * Do not apply R1.4 for non-UNIX platforms where we cannot configure
  225.  * HAVE_NCBI_C yet
  226.  *
  227.  * Revision 1.4  2001/04/12 22:56:58  vakatov
  228.  * [HAVE_NCBI_C]  Handle #GetProgramName and #SetProgramName to avoid
  229.  *                name clash with the NCBI C Toolkit
  230.  *
  231.  * Revision 1.3  2000/08/31 23:50:04  vakatov
  232.  * CNcbiArguments:: Inlined Size() and operator[];   use <deque>
  233.  *
  234.  * Revision 1.2  2000/01/20 16:36:02  vakatov
  235.  * Added class CNcbiArguments::   application command-line arguments & name
  236.  * Added CNcbiEnvironment::Reset(), and comments to CNcbiEnvironment::
  237.  * Dont #include <ncbienv.inl>
  238.  *
  239.  * Revision 1.1  1999/05/04 16:14:06  vasilche
  240.  * Fixed problems with program environment.
  241.  * Added class CNcbiEnvironment for cached access to C environment.
  242.  * ===========================================================================
  243.  */
  244. #endif  /* NCBIENV__HPP */