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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbiapp.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/02/12 21:44:20  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.40
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___NCBIAPP__HPP
  10. #define CORELIB___NCBIAPP__HPP
  11. /*  $Id: ncbiapp.hpp,v 1000.1 2004/02/12 21:44:20 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, Vsevolod Sandomirskiy
  37.  *
  38.  *
  39.  */
  40. /// @file ncbiapp.hpp
  41. /// Defines the CNcbiApplication and CAppException classes for creating
  42. /// NCBI applications.
  43. ///
  44. /// The CNcbiApplication class defines the application framework and the high
  45. /// high level behavior of an application, and the CAppException class is used
  46. /// for the exceptions generated by CNcbiApplication.
  47. #include <corelib/ncbistd.hpp>
  48. #include <corelib/ncbienv.hpp>
  49. #include <corelib/ncbiargs.hpp>
  50. #include <corelib/ncbireg.hpp>
  51. #include <corelib/version.hpp>
  52. #include <memory>
  53. /// Avoid preprocessor name clash with the NCBI C Toolkit.
  54. #if !defined(NCBI_OS_UNIX)  ||  defined(HAVE_NCBI_C)
  55. #  if defined(GetArgs)
  56. #    undef GetArgs
  57. #  endif
  58. #  define GetArgs GetArgs
  59. #endif
  60. /** @addtogroup AppFramework
  61.  *
  62.  * @{
  63.  */
  64. BEGIN_NCBI_SCOPE
  65. /////////////////////////////////////////////////////////////////////////////
  66. ///
  67. /// CAppException --
  68. ///
  69. /// Define exceptions generated by CNcbiApplication.
  70. ///
  71. /// CAppException inherits its basic functionality from CCoreException
  72. /// and defines additional error codes for applications.
  73. class NCBI_XNCBI_EXPORT CAppException : public CCoreException
  74. {
  75. public:
  76.     /// Error types that an application can generate.
  77.     ///
  78.     /// These error conditions are checked for and caught inside AppMain().
  79.     enum EErrCode {
  80.         eUnsetArgs,     ///< Command-line argument description not found
  81.         eSetupDiag,     ///< Application diagnostic stream setup failed
  82.         eLoadConfig,    ///< Registry data failed to load from config file
  83.         eSecond,        ///< Second instance of CNcbiApplication is prohibited
  84.         eNoRegistry     ///< Registry file cannot be opened
  85.     };
  86.     /// Translate from the error code value to its string representation.
  87.     virtual const char* GetErrCodeString(void) const
  88.     {
  89.         switch (GetErrCode()) {
  90.         case eUnsetArgs:  return "eUnsetArgs";
  91.         case eSetupDiag:  return "eSetupDiag";
  92.         case eLoadConfig: return "eLoadConfig";
  93.         case eSecond:     return "eSecond";
  94.         case eNoRegistry: return "eNoRegistry";
  95.         default:    return CException::GetErrCodeString();
  96.         }
  97.     }
  98.     // Standard exception boilerplate code.
  99.     NCBI_EXCEPTION_DEFAULT(CAppException, CCoreException);
  100. };
  101. ///////////////////////////////////////////////////////
  102. // CNcbiApplication
  103. //
  104. /// Where to write the application's diagnostics to.
  105. enum EAppDiagStream {
  106.     eDS_ToStdout,    ///< To standard output stream
  107.     eDS_ToStderr,    ///< To standard error stream
  108.     eDS_ToStdlog,    ///< Add to standard log file (app.name + ".log")
  109.     eDS_ToMemory,    ///< Keep in a temp.memory buffer, see FlushDiag()
  110.     eDS_Disable,     ///< Dont write it anywhere
  111.     eDS_User,        ///< Leave as was previously set (or not set) by user
  112.     eDS_AppSpecific, ///< Depends on the application type
  113.     eDS_Default      ///< "eDS_User" if set, else "eDS_AppSpecific"
  114. };
  115. /////////////////////////////////////////////////////////////////////////////
  116. ///
  117. /// CNcbiApplication --
  118. ///
  119. /// Basic (abstract) NCBI application class.
  120. ///
  121. /// Defines the high level behavior of an NCBI application.
  122. /// A new application is written by deriving a class from the CNcbiApplication
  123. /// and writing an implementation of the Run() and maybe some other (like
  124. /// Init(), Exit(), etc.) methods.
  125. class NCBI_XNCBI_EXPORT CNcbiApplication
  126. {
  127. public:
  128.     /// Singleton method.
  129.     ///
  130.     /// Track the instance of CNcbiApplication, and throw an exception
  131.     /// if an attempt is made to create another instance of the application.
  132.     /// @return
  133.     ///   Current application instance.
  134.     static CNcbiApplication* Instance(void);
  135.     /// Constructor.
  136.     ///
  137.     /// Register the application instance, and reset important
  138.     /// application-specific settings to empty values that will
  139.     /// be set later.
  140.     CNcbiApplication(void);
  141.     /// Destructor.
  142.     ///
  143.     /// Clean up the application settings, flush the diagnostic stream.
  144.     virtual ~CNcbiApplication(void);
  145.     /// Main function (entry point) for the NCBI application.
  146.     ///
  147.     /// You can specify where to write the diagnostics to (EAppDiagStream),
  148.     /// and where to get the configuration file (LoadConfig()) to load
  149.     /// to the application registry (accessible via GetConfig()).
  150.     ///
  151.     /// Throw exception if:
  152.     ///  - not-only instance
  153.     ///  - cannot load explicitly specified config.file
  154.     ///  - SetupDiag() throws an exception
  155.     ///
  156.     /// If application name is not specified a default of "ncbi" is used.
  157.     /// Certain flags such as -logfile, -conffile and -version are special so
  158.     /// AppMain() processes them separately.
  159.     /// @return
  160.     ///   Exit code from Run(). Can also return non-zero value if application
  161.     ///   threw an exception.
  162.     /// @sa
  163.     ///   LoadConfig(), Init(), Run(), Exit()
  164.     int AppMain
  165.     (int                argc,     ///< argc in a regular main(argc, argv, envp)
  166.      const char* const* argv,     ///< argv in a regular main(argc, argv, envp)
  167.      const char* const* envp = 0, ///< argv in a regular main(argc, argv, envp)
  168.      EAppDiagStream     diag = eDS_Default,     ///< Specify diagnostic stream
  169.      const char*        conf = NcbiEmptyCStr,   ///< Specify registry to load
  170.      const string&      name = NcbiEmptyString  ///< Specify application name
  171.      );
  172.     /// Initialize the application.
  173.     ///
  174.     /// The default behavior of this is "do nothing". If you have special
  175.     /// initialization logic that needs to be peformed, then you must override
  176.     /// this method with your own logic.
  177.     virtual void Init(void);
  178.     /// Run the application.
  179.     ///
  180.     /// It is defined as a pure virtual method -- so you must(!) supply the
  181.     /// Run() method to implement the application-specific logic.
  182.     /// @return
  183.     ///   Exit code.
  184.     virtual int Run(void) = 0;
  185.     /// Cleanup on application exit.
  186.     ///
  187.     /// Perform cleanup before exiting. The default behavior of this is
  188.     /// "do nothing". If you have special cleanup logic that needs to be
  189.     /// performed, then you must override this method with your own logic.
  190.     virtual void Exit(void);
  191.     /// Get the application's cached unprocessed command-line arguments.
  192.     const CNcbiArguments& GetArguments(void) const;
  193.     /// Get parsed command line arguments.
  194.     ///
  195.     /// Get command line arguments parsed according to the arg descriptions
  196.     /// set by SetArgDescriptions(). Throw exception if no descriptions
  197.     /// have been set.
  198.     /// @return
  199.     ///   The CArgs object containing parsed cmd.-line arguments.
  200.     /// @sa
  201.     ///   SetArgDescriptions().
  202.     const CArgs& GetArgs(void) const;
  203.     /// Get the application's cached environment.
  204.     const CNcbiEnvironment& GetEnvironment(void) const;
  205.     /// Get a non-const copy of the application's cached environment.
  206.     CNcbiEnvironment& SetEnvironment(void);
  207.     /// Set a specified environment variable by name
  208.     void SetEnvironment(const string& name, const string& value);
  209.     /// Get the application's cached configuration parameters.
  210.     const CNcbiRegistry& GetConfig(void) const;
  211.     CNcbiRegistry& GetConfig(void);
  212.     /// Flush the in-memory diagnostic stream (for "eDS_ToMemory" case only).
  213.     ///
  214.     /// In case of "eDS_ToMemory", the diagnostics is stored in
  215.     /// the internal application memory buffer ("m_DiagStream").
  216.     /// Call this function to dump all the diagnostics to stream "os" and
  217.     /// purge the buffer.
  218.     /// @param  os
  219.     ///   Output stream to dump diagnostics to. If it is NULL, then
  220.     ///   nothing will be written to it (but the buffer will still be purged).
  221.     /// @param  close_diag
  222.     ///   If "close_diag" is TRUE, then also destroy "m_DiagStream".
  223.     /// @return
  224.     ///   Total number of bytes actually written to "os".
  225.     SIZE_TYPE FlushDiag(CNcbiOstream* os, bool close_diag = false);
  226.     /// Get the application's "display" name.
  227.     ///
  228.     /// Get name of this application, suitable for displaying
  229.     /// or for using as the base name for other files.
  230.     /// Will be the 'name' argument of AppMain if given.
  231.     /// Otherwise will be taken from the actual name of the application file
  232.     /// or argv[0].
  233.     string GetProgramDisplayName(void) const;
  234. protected:
  235.     /// Disable argument descriptions.
  236.     ///
  237.     /// Call if you do not want cmd.line args to be parsed at all.
  238.     /// Note that by default ArgDescriptions are enabled (i.e. required).
  239.     void DisableArgDescriptions(void);
  240.     /// Which standard flag's descriptions should not be displayed in
  241.     /// the usage message.
  242.     ///
  243.     /// Do not display descriptions of the standard flags such as the
  244.     ///    -h, -logfile, -conffile, -version
  245.     /// flags in the usage message. Note that you still can pass them in
  246.     /// the command line.
  247.     enum EHideStdArgs {
  248.         fHideHelp     = 0x01,  ///< Hide help description
  249.         fHideLogfile  = 0x02,  ///< Hide log file description
  250.         fHideConffile = 0x04,  ///< Hide configuration file description
  251.         fHideVersion  = 0x08   ///< Hide version description
  252.     };
  253.     typedef int THideStdArgs;  ///< Binary OR of "EHideStdArgs"
  254.     /// Set the hide mask for the Hide Std Flags.
  255.     void HideStdArgs(THideStdArgs hide_mask);
  256.     /// Flags to adjust standard I/O streams' behaviour.
  257.     ///
  258.     /// Set these flags if you insist on using compiler-specific defaults
  259.     /// for standard "C++" I/O streams (Cin/Cout/Cerr).
  260.     enum EStdioSetup {
  261.         fDefault_SyncWithStdio  = 0x01,
  262.         ///< Use compiler-specific default as pertains to the synchronizing
  263.         ///< of "C++" Cin/Cout/Cerr streams with their "C" counterparts.
  264.         fDefault_CinBufferSize  = 0x02
  265.         ///< Use compiler-specific default of Cin buffer size.
  266.     };
  267.     typedef int TStdioSetupFlags;  ///< Binary OR of "EStdioSetup"
  268.     /// Adjust the behavior of standard I/O streams.
  269.     ///
  270.     /// Unless this function is called, the behaviour of "C++" Cin/Cout/Cerr
  271.     /// streams will be the same regardless of the compiler used.
  272.     ///
  273.     /// IMPLEMENTATION NOTE: Do not call this function more than once
  274.     /// and from places other than App's constructor.
  275.     void SetStdioFlags(TStdioSetupFlags stdio_flags);
  276.     /// Set the version number for the program.
  277.     ///
  278.     /// If not set, a default of 0.0.0 (unknown) is used.
  279.     void SetVersion(const CVersionInfo& version);
  280.     /// Get the program version information.
  281.     CVersionInfo GetVersion(void);
  282.     /// Setup the command line argument descriptions.
  283.     ///
  284.     /// Call from the Init() method. The passed "arg_desc" will be owned
  285.     /// by this class, and it will be deleted by ~CNcbiApplication(),
  286.     /// or if SetupArgDescriptions() is called again.
  287.     void SetupArgDescriptions(CArgDescriptions* arg_desc);
  288.     /// Setup the application diagnostic stream.
  289.     /// @return
  290.     ///   TRUE if successful,  FALSE otherwise.
  291.     bool SetupDiag(EAppDiagStream diag);
  292.     /// Setup application specific diagnostic stream.
  293.     ///
  294.     /// Called from SetupDiag when it is passed the eDS_AppSpecific parameter.
  295.     /// Currently, this calls SetupDiag(eDS_ToStderr) to setup diagonistic
  296.     /// stream to the std error channel.
  297.     /// @return
  298.     ///   TRUE if successful, FALSE otherwise.
  299.     virtual bool SetupDiag_AppSpecific(void);
  300.     /// Load settings from the configuration file to the registry.
  301.     ///
  302.     /// This method is called from inside AppMain() to load (add) registry
  303.     /// settings from the configuration file specified as the "conf" arg
  304.     /// passed to AppMain(). The "conf" argument has the following special
  305.     /// meanings:
  306.     ///  - NULL      -- dont even try to load registry from any file at all;
  307.     ///  - non-empty -- if "conf" contains a path, then try to load from the
  308.     ///                 conf.file of name "conf" (only!). Else - see NOTE.
  309.     ///                 TIP: if the path is not fully qualified then:
  310.     ///                      if it starts from "../" or "./" -- look starting
  311.     ///                      from the current working dir.
  312.     ///  - empty     -- compose conf.file name from the application name
  313.     ///                 plus ".ini". If it does not match an existing
  314.     ///                 file, then try to strip file extensions, e.g. for
  315.     ///                 "my_app.cgi.exe" -- try subsequently:
  316.     ///                   "my_app.cgi.exe.ini", "my_app.cgi.ini", "my_app.ini".
  317.     ///
  318.     /// NOTE:
  319.     /// If "conf" arg is empty or non-empty, but without path, then config file
  320.     /// will be sought for in the following order:
  321.     ///  - in the current work directory;
  322.     ///  - in the dir defined by environment variable "NCBI";
  323.     ///  - in the user home directory;
  324.     ///  - in the program dir.
  325.     ///
  326.     /// Throw an exception if "conf" is non-empty, and cannot open file.
  327.     /// Throw an exception if file exists, but contains invalid entries.
  328.     /// @param reg
  329.     ///   The loaded registry is returned via the reg parameter.
  330.     /// @param conf
  331.     ///   The configuration file to loaded the registry entries from.
  332.     /// @param reg_flags
  333.     ///   Flags for loading the registry
  334.     /// @return
  335.     ///   TRUE only if the file was non-NULL, found and successfully read.
  336.     virtual bool LoadConfig(CNcbiRegistry& reg, const string* conf,
  337.                             CNcbiRegistry::TFlags reg_flags);
  338.     /// Load settings from the configuration file to the registry.
  339.     ///
  340.     /// CNcbiApplication::LoadConfig(reg, conf) just calls
  341.     /// LoadConfig(reg, conf, 0).
  342.     virtual bool LoadConfig(CNcbiRegistry& reg, const string* conf);
  343.     /// Get the home directory for the current user.
  344.     string GetHomeDir(void);
  345.     /// Set program's display name.
  346.     ///
  347.     /// Set up application name suitable for display or as a basename for
  348.     /// other files. It can also be set by the user when calling AppMain().
  349.     void SetProgramDisplayName(const string& app_name);
  350.     /// Find the application's executable file.
  351.     ///
  352.     /// Find the path and name of the executable file that this application is
  353.     /// running from. Will be accesible by GetArguments.GetProgramName().
  354.     /// @param argc
  355.     ///   Standard argument count "argc".
  356.     /// @param argv
  357.     ///   Standard argument vector "argv".
  358.     /// @return
  359.     ///   Name of application's executable file.
  360.     string FindProgramExecutablePath(int argc, const char* const* argv);
  361.     /// Honor debug settings.
  362.     ///
  363.     /// Read the [DEBUG] section of the specified registry and
  364.     /// set the diagnostic settings as found in that section.
  365.     /// Specifically, the method reads the settings for parameters:
  366.     /// ABORT_ON_THROW, DIAG_POST_LEVEL, DIAG_MESSAGE_FILE.
  367.     /// @param reg
  368.     ///   Registry to read from. If NULL, use the current registry setting.
  369.     void HonorDebugSettings(CNcbiRegistry* reg = 0);
  370. private:
  371.     /// Setup C++ standard I/O streams' behaviour.
  372.     ///
  373.     /// Called from AppMain() to do compiler-specific optimization
  374.     /// for C++ I/O streams. For example, since SUN WorkShop STL stream
  375.     /// library has significant performance loss when sync_with_stdio is
  376.     /// TRUE (default), so we turn it off. Another, for GCC version greater
  377.     /// than 3.00 we forcibly set cin stream buffer size to 4096 bytes -- which
  378.     /// boosts the performance dramatically.
  379.     void x_SetupStdio(void);
  380.     static CNcbiApplication*   m_Instance;   ///< Current app. instance
  381.     auto_ptr<CVersionInfo>     m_Version;    ///< Program version
  382.     auto_ptr<CNcbiEnvironment> m_Environ;    ///< Cached application env.
  383.     CNcbiRegistry*             m_Config;     ///< Guaranteed to be non-NULL
  384.     bool                       m_OwnsConfig; ///< Whether to delete on destr.
  385.     auto_ptr<CNcbiOstream>     m_DiagStream; ///< Opt., aux., see eDS_ToMemory
  386.     auto_ptr<CNcbiArguments>   m_Arguments;  ///< Command-line arguments
  387.     auto_ptr<CArgDescriptions> m_ArgDesc;    ///< Cmd.-line arg descriptions
  388.     auto_ptr<CArgs>            m_Args;       ///< Parsed cmd.-line args
  389.     bool                       m_DisableArgDesc;  ///< Arg desc. disabled
  390.     THideStdArgs               m_HideArgs;   ///< Std cmd.-line flags to hide
  391.     TStdioSetupFlags           m_StdioFlags; ///< Std C++ I/O adjustments
  392.     char*                      m_CinBuffer;  ///< Cin buffer if changed
  393.     string                     m_ProgramDisplayName;  ///< Display name of app
  394. };
  395. /* @} */
  396. /////////////////////////////////////////////////////////////////////////////
  397. //  IMPLEMENTATION of INLINE functions
  398. /////////////////////////////////////////////////////////////////////////////
  399. inline const CNcbiArguments& CNcbiApplication::GetArguments(void) const {
  400.     return *m_Arguments;
  401. }
  402. inline const CArgs& CNcbiApplication::GetArgs(void) const {
  403.     if ( !m_Args.get() ) {
  404.         NCBI_THROW(CAppException, eUnsetArgs,
  405.                    "Command-line argument description is not found");
  406.     }
  407.     return *m_Args;
  408. }
  409. inline const CNcbiEnvironment& CNcbiApplication::GetEnvironment(void) const {
  410.     return *m_Environ;
  411. }
  412. inline CNcbiEnvironment& CNcbiApplication::SetEnvironment(void) {
  413.     return *m_Environ;
  414. }
  415. inline const CNcbiRegistry& CNcbiApplication::GetConfig(void) const {
  416.     return *m_Config;
  417. }
  418. inline CNcbiRegistry& CNcbiApplication::GetConfig(void) {
  419.     return *m_Config;
  420. }
  421. inline string  CNcbiApplication::GetProgramDisplayName(void) const {
  422.     return m_ProgramDisplayName;
  423. }
  424. END_NCBI_SCOPE
  425. /*
  426.  * ===========================================================================
  427.  * $Log: ncbiapp.hpp,v $
  428.  * Revision 1000.1  2004/02/12 21:44:20  gouriano
  429.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.40
  430.  *
  431.  * Revision 1.40  2004/01/06 18:17:21  dicuccio
  432.  * Added APIs for setting environment variables
  433.  *
  434.  * Revision 1.39  2003/09/29 20:27:59  vakatov
  435.  * + LoadConfig(...., reg_flags)
  436.  *
  437.  * Revision 1.38  2003/08/05 19:59:10  ucko
  438.  * With the new meta-registry setup, we don't necessarily own m_Config.
  439.  *
  440.  * Revision 1.37  2003/07/28 10:58:54  siyan
  441.  * Minor comment changes.
  442.  *
  443.  * Revision 1.36  2003/07/17 00:05:33  siyan
  444.  * Changed doc on some enum types so Doxygen picks them up better.
  445.  *
  446.  * Revision 1.35  2003/07/07 13:55:13  siyan
  447.  * Added documentation and made documentation consistent. Made it easier
  448.  * for Doxygen to pick up necessary documentation.
  449.  *
  450.  * Revision 1.34  2003/06/25 15:58:59  rsmith
  451.  * factor out config file DEBUG settings into HonorDebugSettings
  452.  *
  453.  * Revision 1.33  2003/06/23 18:02:21  vakatov
  454.  * CNcbiApplication::MacArgMunging() moved from header to the source file.
  455.  * Fixed, reformatted and added comments.
  456.  *
  457.  * Revision 1.32  2003/06/16 13:52:27  rsmith
  458.  * Add ProgramDisplayName member. Program name becomes real executable full
  459.  * path. Handle Mac special arg handling better.
  460.  *
  461.  * Revision 1.31  2003/06/05 18:14:34  lavr
  462.  * SetStdioFlags(): comment from impl not to call twice or not from ctor
  463.  *
  464.  * Revision 1.30  2003/03/31 13:26:00  siyan
  465.  * Added doxygen support
  466.  *
  467.  * Revision 1.29  2003/03/19 19:36:09  gouriano
  468.  * added optional adjustment of stdio streams
  469.  *
  470.  * Revision 1.28  2002/12/26 17:12:42  ivanov
  471.  * Added version info and Set/GetVersion functions into CNcbiApplication class
  472.  *
  473.  * Revision 1.27  2002/12/18 22:53:21  dicuccio
  474.  * Added export specifier for building DLLs in windows.  Added global list of
  475.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  476.  *
  477.  * Revision 1.26  2002/10/28 22:36:15  vakatov
  478.  * Fixes in some comments
  479.  *
  480.  * Revision 1.25  2002/08/08 18:38:16  gouriano
  481.  * added HideStdArgs function
  482.  *
  483.  * Revision 1.24  2002/08/02 20:11:51  gouriano
  484.  * added possibility to disable arg descriptions
  485.  *
  486.  * Revision 1.23  2002/07/15 18:17:50  gouriano
  487.  * renamed CNcbiException and its descendents
  488.  *
  489.  * Revision 1.22  2002/07/11 14:17:53  gouriano
  490.  * exceptions replaced by CNcbiException-type ones
  491.  *
  492.  * Revision 1.21  2002/04/11 20:39:16  ivanov
  493.  * CVS log moved to end of the file
  494.  *
  495.  * Revision 1.20  2002/01/10 16:51:52  ivanov
  496.  * Changed LoadConfig() -- new method to search the config file
  497.  *
  498.  * Revision 1.19  2002/01/07 16:58:21  vakatov
  499.  * CNcbiApplication::GetArgs() -- a clearer error message
  500.  *
  501.  * Revision 1.18  2001/05/17 14:50:13  lavr
  502.  * Typos corrected
  503.  *
  504.  * Revision 1.17  2001/04/13 02:58:43  vakatov
  505.  * Do not apply R1.16 for non-UNIX platforms where we cannot configure
  506.  * HAVE_NCBI_C yet
  507.  *
  508.  * Revision 1.16  2001/04/12 22:55:09  vakatov
  509.  * [HAVE_NCBI_C]  Handle #GetArgs to avoid name clash with the NCBI C Toolkit
  510.  *
  511.  * Revision 1.15  2000/11/24 23:33:10  vakatov
  512.  * CNcbiApplication::  added SetupArgDescriptions() and GetArgs() to
  513.  * setup cmd.-line argument description, and then to retrieve their
  514.  * values, respectively. Also implements internal error handling and
  515.  * printout of USAGE for the described arguments.
  516.  *
  517.  * Revision 1.14  2000/01/20 17:51:16  vakatov
  518.  * Major redesign and expansion of the "CNcbiApplication" class to
  519.  *  - embed application arguments   "CNcbiArguments"
  520.  *  - embed application environment "CNcbiEnvironment"
  521.  *  - allow auto-setup or "by choice" (see enum EAppDiagStream) of diagnostics
  522.  *  - allow memory-resided "per application" temp. diagnostic buffer
  523.  *  - allow one to specify exact name of the config.-file to load, or to
  524.  *    ignore the config.file (via constructor's "conf" arg)
  525.  *  - added detailed comments
  526.  *
  527.  * Revision 1.13  1999/12/29 21:20:16  vakatov
  528.  * More intelligent lookup for the default config.file. -- try to strip off
  529.  * file extensions if cannot find an exact match;  more comments and tracing
  530.  *
  531.  * Revision 1.12  1999/11/15 18:57:01  vakatov
  532.  * Added <memory> (for "auto_ptr<>" template)
  533.  *
  534.  * Revision 1.11  1999/11/15 15:53:27  sandomir
  535.  * Registry support moved from CCgiApplication to CNcbiApplication
  536.  *
  537.  * Revision 1.10  1999/04/27 14:49:50  vasilche
  538.  * Added FastCGI interface.
  539.  * CNcbiContext renamed to CCgiContext.
  540.  *
  541.  * Revision 1.9  1998/12/28 17:56:25  vakatov
  542.  * New CVS and development tree structure for the NCBI C++ projects
  543.  *
  544.  * Revision 1.8  1998/12/09 17:30:12  sandomir
  545.  * ncbicgi.hpp deleted from ncbiapp.hpp
  546.  *
  547.  * Revision 1.7  1998/12/09 16:49:56  sandomir
  548.  * CCgiApplication added
  549.  *
  550.  * Revision 1.6  1998/12/07 23:46:52  vakatov
  551.  * Merged with "cgiapp.hpp";  minor fixes
  552.  *
  553.  * Revision 1.4  1998/12/03 21:24:21  sandomir
  554.  * NcbiApplication and CgiApplication updated
  555.  *
  556.  * Revision 1.3  1998/12/01 19:12:36  lewisg
  557.  * added CCgiApplication
  558.  *
  559.  * Revision 1.2  1998/11/05 21:45:13  sandomir
  560.  * std:: deleted
  561.  *
  562.  * Revision 1.1  1998/11/02 22:10:12  sandomir
  563.  * CNcbiApplication added; netest sample updated
  564.  * ===========================================================================
  565.  */
  566. #endif  /* CORELIB___NCBIAPP__HPP */