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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_util.h,v $
  4.  * PRODUCTION Revision 1000.1  2004/02/12 21:51:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R6.21
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_UTIL__H
  10. #define CONNECT___NCBI_UTIL__H
  11. /*  $Id: ncbi_util.h,v 1000.1 2004/02/12 21:51:59 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.  * Author:  Denis Vakatov
  37.  *
  38.  * File Description:
  39.  *   Auxiliary (optional) code for "ncbi_core.[ch]"
  40.  *
  41.  *********************************
  42.  *    methods:    LOG_ComposeMessage(), LOG_ToFILE(), MessagePlusErrno(),
  43.  *                CORE_SetLOCK(), CORE_GetLOCK(),
  44.  *                CORE_SetLOG(),  CORE_GetLOG(),   CORE_SetLOGFILE()
  45.  *    flags:      TLOG_FormatFlags, ELOG_FormatFlags
  46.  *    macros:     LOG_Write(), LOG_Data(),
  47.  *                LOG_WRITE(), LOG_DATA(),
  48.  *                THIS_FILE, THIS_MODULE,
  49.  *                LOG_WRITE_ERRNO_EX(), LOG_WRITE_ERRNO()
  50.  *
  51.  */
  52. #include <connect/ncbi_core.h>
  53. #include <stdio.h>
  54. /** @addtogroup UtilityFunc
  55.  *
  56.  * @{
  57.  */
  58. #ifdef __cplusplus
  59. extern "C" {
  60. #endif
  61. /******************************************************************************
  62.  *  MT locking
  63.  */
  64. /* Set the MT critical section lock/unlock handler -- to be used by the core
  65.  * internals to protect internal static variables and other MT-sensitive
  66.  * code from being accessed/changed by several threads simultaneously.
  67.  * It is also to protect fully the core log handler, including its setting up
  68.  * (see CORE_SetLOG below), and its callback and cleanup functions.
  69.  * NOTES:
  70.  * This function itself is so NOT MT-safe!
  71.  * If there is an active MT-lock handler set already, and it is different from
  72.  * the new one, then MT_LOCK_Delete() is called for the old(replaced) handler.
  73.  */
  74. extern NCBI_XCONNECT_EXPORT void    CORE_SetLOCK(MT_LOCK lk);
  75. extern NCBI_XCONNECT_EXPORT MT_LOCK CORE_GetLOCK(void);
  76. /******************************************************************************
  77.  *  ERROR HANDLING and LOGGING
  78.  */
  79. /* Slightly customized LOG_WriteInternal() -- to distinguish between
  80.  * logging only a message vs. logging message with some data.
  81.  */
  82. #define LOG_Write(lg,level,module,file,line,message) 
  83.   (void) ((lg  ||  level == eLOG_Fatal) ? 
  84.   (LOG_WriteInternal(lg,level,module,file,line,message,0,0), 0) : 1)
  85. #define LOG_Data(lg,level,module,file,line,data,size,message) 
  86.   (void) ((lg  ||  level == eLOG_Fatal) ? 
  87.   (LOG_WriteInternal(lg,level,module,file,line,message,data,size), 0) : 1)
  88. /* Auxiliary plain macro to write message (maybe, with raw data) to the log
  89.  */
  90. #define LOG_WRITE(lg, level, message) 
  91.   LOG_Write(lg, level, THIS_MODULE, THIS_FILE, __LINE__, message)
  92. /* AIX's <pthread.h> defines LOG_DATA to be an integer constant; we must
  93.    explicitly drop such definitions to avoid trouble. */
  94. #ifdef LOG_DATA
  95. #  undef LOG_DATA
  96. #endif
  97. #define LOG_DATA(lg, data, size, message) 
  98.   LOG_Data(lg, eLOG_Trace, THIS_MODULE, THIS_FILE, __LINE__, 
  99.            data, size, message)
  100. /* Defaults for the THIS_FILE and THIS_MODULE macros (used by LOG_WRITE)
  101.  */
  102. #if !defined(THIS_FILE)
  103. #  define THIS_FILE __FILE__
  104. #endif
  105. #if !defined(THIS_MODULE)
  106. #  define THIS_MODULE 0
  107. #endif
  108. /* Set the log handler (no logging if "lg" is passed zero) -- to be used by
  109.  * the core internals.
  110.  * If there is an active log handler set already, and it is different from
  111.  * the new one, then LOG_Delete() is called for the old(replaced) logger.
  112.  */
  113. extern NCBI_XCONNECT_EXPORT void CORE_SetLOG(LOG lg);
  114. extern NCBI_XCONNECT_EXPORT LOG  CORE_GetLOG(void);
  115. /* Standard logging to the specified file stream
  116.  */
  117. extern NCBI_XCONNECT_EXPORT void CORE_SetLOGFILE
  118. (FILE*       fp,         /* the file stream to log to */
  119.  int/*bool*/ auto_close  /* do "fclose(fp)" when the LOG is reset/destroyed */
  120.  );
  121. /* CORE_SetLOGFILE(fopen(filename, "a"), TRUE)
  122.  * Return zero on error, non-zero on success
  123.  */
  124. extern NCBI_XCONNECT_EXPORT int/*bool*/ CORE_SetLOGFILE_NAME
  125. (const char* filename  /* log.-file name */
  126.  );
  127. typedef enum {
  128.     fLOG_Default  = 0x0, /* "fLOG_Short" if NDEBUG, else "fLOG_Full"        */
  129.     fLOG_Level    = 0x1,
  130.     fLOG_Module   = 0x2,
  131.     fLOG_FileLine = 0x4, /* (must always be printed for "eLOG_Trace" level) */
  132.     fLOG_DateTime = 0x8,
  133.     fLOG_OmitNoteLevel = 0x4000,/* do not add "NOTE:" if eLOG_Note is level */
  134.     fLOG_None     = 0x8000 /* nothing but specified parts plus msg and data */
  135. } ELOG_Format;
  136. typedef unsigned int TLOG_FormatFlags;  /* binary OR of "ELOG_FormatFlags"  */
  137. #define fLOG_Short  (fLOG_Level)
  138. #define fLOG_Full   (fLOG_Level | fLOG_Module | fLOG_FileLine)
  139. extern NCBI_XCONNECT_EXPORT TLOG_FormatFlags CORE_SetLOGFormatFlags
  140. (TLOG_FormatFlags
  141. );
  142. /* Compose message using the "call_data" info.
  143.  * Full format:
  144.  *     mm/dd/yy HH:MM:SS "<file>", line <line>: [<module>] <level>: <message>
  145.  *     n----- [BEGIN] Raw Data (<raw_size> bytes) -----n
  146.  *     <raw_data>
  147.  *     n----- [END] Raw Data -----n
  148.  *
  149.  *
  150.  * NOTE:  the returned string must be deallocated using "free()".
  151.  */
  152. extern NCBI_XCONNECT_EXPORT char* LOG_ComposeMessage
  153. (const SLOG_Handler* call_data,
  154.  TLOG_FormatFlags    format_flags  /* which fields of "call_data" to use */
  155.  );
  156. /* LOG_Reset() specialized to log to a "FILE*" stream.
  157.  */
  158. extern NCBI_XCONNECT_EXPORT void LOG_ToFILE
  159. (LOG         lg,         /* created by LOG_Create() */
  160.  FILE*       fp,         /* the file stream to log to */
  161.  int/*bool*/ auto_close  /* do "fclose(fp)" when the LOG is reset/destroyed */
  162.  );
  163. /* Add current "errno" (and maybe its description) to the message:
  164.  *   <message> {errno=<errno>,<descr>}
  165.  * Return "buf".
  166.  */
  167. extern NCBI_XCONNECT_EXPORT char* MessagePlusErrno
  168. (const char*  message,  /* [in]  message (can be NULL) */
  169.  int          x_errno,  /* [in]  error code (if it's zero, use "descr" only) */
  170.  const char*  descr,    /* [in]  if NULL, then use "strerror(x_errno)" */
  171.  char*        buf,      /* [out] buffer to put the composed message to */
  172.  size_t       buf_size  /* [in]  max. buffer size */
  173.  );
  174. #define LOG_WRITE_ERRNO_EX(lg, level, message, x_errno, x_descr)  do {   
  175.     if (lg  ||  level == eLOG_Fatal) {                                   
  176.         char _buf[1024];                                                 
  177.         LOG_WRITE(lg, level, MessagePlusErrno(message, x_errno, x_descr, 
  178.                                               _buf, sizeof(_buf)));      
  179.     }                                                                    
  180. } while (0)
  181. #define LOG_WRITE_ERRNO(lg, level, message)                              
  182.      LOG_WRITE_ERRNO_EX(lg, level, message, errno, 0)
  183. /******************************************************************************
  184.  *  REGISTRY
  185.  */
  186. /* Set the registry (no registry if "rg" is passed zero) -- to be used by
  187.  * the core internals.
  188.  * If there is an active registry set already, and it is different from
  189.  * the new one, then REG_Delete() is called for the old(replaced) registry.
  190.  */
  191. extern NCBI_XCONNECT_EXPORT void CORE_SetREG(REG rg);
  192. extern NCBI_XCONNECT_EXPORT REG  CORE_GetREG(void);
  193. /******************************************************************************
  194.  *  MISC
  195.  */
  196. /* Return read-only textual but machine-readable platform description.
  197.  */
  198. extern NCBI_XCONNECT_EXPORT const char* CORE_GetPlatform(void);
  199. #ifdef __cplusplus
  200. }  /* extern "C" */
  201. #endif
  202. /* @} */
  203. /*
  204.  * ---------------------------------------------------------------------------
  205.  * $Log: ncbi_util.h,v $
  206.  * Revision 1000.1  2004/02/12 21:51:59  gouriano
  207.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R6.21
  208.  *
  209.  * Revision 6.21  2004/01/27 17:05:59  ucko
  210.  * #undef LOG_DATA if necessary before #defining it with arguments to
  211.  * avoid trouble on AIX.
  212.  *
  213.  * Revision 6.20  2003/10/21 11:17:17  lavr
  214.  * Add location information in LOG_DATA()
  215.  *
  216.  * Revision 6.19  2003/04/30 16:57:41  lavr
  217.  * Changed internal automatic buf -> _buf to avoid name collision warnings
  218.  *
  219.  * Revision 6.18  2003/04/09 19:06:01  siyan
  220.  * Added doxygen support
  221.  *
  222.  * Revision 6.17  2003/01/17 01:33:41  lavr
  223.  * Specify fLOG_None more precisely
  224.  *
  225.  * Revision 6.16  2003/01/08 01:59:33  lavr
  226.  * DLL-ize CONNECT library for MSVC (add NCBI_XCONNECT_EXPORT)
  227.  *
  228.  * Revision 6.15  2003/01/07 22:21:58  lavr
  229.  * Add NCBI_XCONNECT_EXPORT to public API functions
  230.  *
  231.  * Revision 6.14  2002/12/04 20:59:21  lavr
  232.  * +LOG_WRITE_ERRNO_EX()
  233.  *
  234.  * Revision 6.13  2002/09/19 18:05:47  lavr
  235.  * Header file guard macro changed; log moved to end
  236.  *
  237.  * Revision 6.12  2002/05/07 18:20:34  lavr
  238.  * +fLOG_None
  239.  *
  240.  * Revision 6.11  2002/02/11 21:49:06  lavr
  241.  * +CORE_GetPlatform()
  242.  *
  243.  * Revision 6.10  2001/08/09 16:23:34  lavr
  244.  * Added: fLOG_OmitNoteLevel to log message format flags
  245.  *
  246.  * Revision 6.9  2001/07/30 14:39:47  lavr
  247.  * Do not include date/time in default logging (for ncbidiag.cpp compatibility)
  248.  *
  249.  * Revision 6.8  2001/07/25 19:12:31  lavr
  250.  * Added date/time stamp for message logging
  251.  *
  252.  * Revision 6.7  2001/05/17 18:10:22  vakatov
  253.  * Moved the logging macros from <ncbi_core.h> to <ncbi_util.h>.
  254.  * Logging::  always call the logger if severity is eLOG_Fatal.
  255.  *
  256.  * Revision 6.6  2001/01/12 23:50:37  lavr
  257.  * "a+" -> "a" as a mode in fopen() for a logfile
  258.  *
  259.  * Revision 6.5  2000/06/23 19:34:41  vakatov
  260.  * Added means to log binary data
  261.  *
  262.  * Revision 6.4  2000/05/30 23:23:24  vakatov
  263.  * + CORE_SetLOGFILE_NAME()
  264.  *
  265.  * Revision 6.3  2000/04/07 19:56:06  vakatov
  266.  * Get rid of <errno.h>
  267.  *
  268.  * Revision 6.2  2000/03/24 23:12:05  vakatov
  269.  * Starting the development quasi-branch to implement CONN API.
  270.  * All development is performed in the NCBI C++ tree only, while
  271.  * the NCBI C tree still contains "frozen" (see the last revision) code.
  272.  *
  273.  * Revision 6.1  2000/02/23 22:30:40  vakatov
  274.  * Initial revision
  275.  *
  276.  * ===========================================================================
  277.  */
  278. #endif /* CONNECT___NCBI_UTIL__H */