263 lines
6.4 KiB
C++
263 lines
6.4 KiB
C++
/*------------------------------------------------------------------------*/
|
|
/* */
|
|
/* CHECKS.H */
|
|
/* */
|
|
/* */
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/*
|
|
* C/C++ Run Time Library - Version 10.0
|
|
*
|
|
* Copyright (c) 1992, 2000 by Inprise Corporation
|
|
* All Rights Reserved.
|
|
*
|
|
*/
|
|
|
|
/* $Revision: 9.6 $ */
|
|
|
|
#ifndef __cplusplus
|
|
#error Must use C++ for CHECKS.H
|
|
#endif
|
|
|
|
//
|
|
// the __CHECKS_H header guard applies to sections of the header that
|
|
// are always included. See also __CHECKS_DIAGS_DEFINED below.
|
|
//
|
|
#ifndef __CHECKS_H
|
|
#define __CHECKS_H
|
|
|
|
#ifndef __FLAT__
|
|
#error 16 bit targets not supported.
|
|
#endif
|
|
|
|
#if !defined( __DEFS_H )
|
|
# include <_defs.h>
|
|
#endif // __DEFS_H
|
|
|
|
#if !defined( __SYSTYPES_H )
|
|
# include <systypes.h>
|
|
#endif // __SYSTYPES_H
|
|
|
|
#if !defined(__EXCEPT_H)
|
|
# include <except.h>
|
|
#endif // __EXCEPT_H
|
|
|
|
#if !defined(RC_INVOKED)
|
|
|
|
#pragma option push -Vo-
|
|
|
|
#if defined(__STDC__)
|
|
#pragma option push -w-nak
|
|
#endif
|
|
|
|
#endif /* !RC_INVOKED */
|
|
|
|
class _EXPCLASS xerror : public xmsg
|
|
{
|
|
public:
|
|
_RTLENTRY xerror( const char *type,
|
|
const char *txt,
|
|
const char *file,
|
|
uint32 line );
|
|
};
|
|
|
|
class precondition : public xerror
|
|
{
|
|
public:
|
|
_RTLENTRY precondition( const char *txt,
|
|
const char *file,
|
|
uint32 line ) : xerror( "Precondition", txt, file, line )
|
|
{
|
|
}
|
|
};
|
|
|
|
class check : public xerror
|
|
{
|
|
public:
|
|
_RTLENTRY check( const char *txt,
|
|
const char *file,
|
|
uint32 line ) : xerror( "Check", txt, file, line )
|
|
{
|
|
}
|
|
};
|
|
|
|
|
|
#if !defined(RC_INVOKED)
|
|
|
|
#if defined(__STDC__)
|
|
#pragma option pop
|
|
#endif
|
|
|
|
#pragma option pop
|
|
|
|
#endif /* !RC_INVOKED */
|
|
|
|
|
|
#endif // __CHECKS_H
|
|
|
|
# if !defined(__CHECKS_DIAGS_DEFINED) && (defined(__TRACE) || defined(__WARN))
|
|
#define __CHECKS_DIAGS_DEFINED
|
|
|
|
#include <systypes.h>
|
|
#include <string>
|
|
#include <sstream>
|
|
|
|
#if defined( _RTLDLL ) || defined( _BUILDRTLDLL )
|
|
#define DIAG_IMPORT __import
|
|
#define DIAG_EXPORT __export
|
|
#if defined( _BUILDRTLDLL )
|
|
#define DIAG_CLASS __export
|
|
#else
|
|
#define DIAG_CLASS __import
|
|
#endif
|
|
#else
|
|
#define DIAG_IMPORT
|
|
#define DIAG_EXPORT
|
|
#define DIAG_CLASS
|
|
#endif
|
|
|
|
|
|
class DIAG_CLASS TDiagGroup {
|
|
public:
|
|
TDiagGroup( uint8 enabled, uint8 level, const char *group);
|
|
|
|
void _RTLENTRY Trace( std::ostringstream &os, const char *fname, uint32 line );
|
|
|
|
void _RTLENTRY Warn( std::ostringstream &os, const char *fname, uint32 line );
|
|
|
|
void _RTLENTRY Enable( uint8 enabled )
|
|
{
|
|
Flags.Enabled = uint8(enabled ? 1 : 0);
|
|
}
|
|
|
|
int _RTLENTRY IsEnabled() { return Flags.Enabled; }
|
|
void _RTLENTRY SetLevel( uint8 level ) { Flags.Level = level; }
|
|
uint8 _RTLENTRY GetLevel() { return Flags.Level; }
|
|
|
|
private:
|
|
void _RTLENTRY Message( const char *type, std::ostringstream &os,
|
|
const char *fname, uint32 line );
|
|
static void _RTLENTRY Output( const std::string &msg );
|
|
struct TFlags
|
|
{
|
|
uint8 Enabled : 1;
|
|
uint8 Level : 7;
|
|
} Flags;
|
|
std::string Group;
|
|
|
|
// no copies
|
|
TDiagGroup(TDiagGroup const &);
|
|
TDiagGroup &operator=(TDiagGroup const &);
|
|
};
|
|
|
|
inline void _RTLENTRY TDiagGroup::Trace(std::ostringstream &os, const char *fname, uint32 line)
|
|
{
|
|
Message("Trace", os, fname, line);
|
|
}
|
|
|
|
inline void _RTLENTRY TDiagGroup::Warn(std::ostringstream &os, const char *fname, uint32 line)
|
|
{
|
|
Message("Warning", os, fname, line);
|
|
}
|
|
|
|
#endif // !__CHECKS_DIAGS_DEFINED && (__TRACE || __WARN)
|
|
|
|
|
|
#if !defined( __DEBUG )
|
|
#define __DEBUG 0
|
|
#endif
|
|
|
|
#undef PRECONDITION
|
|
#undef PRECONDITIONX
|
|
|
|
#define PRECONDITION(p) PRECONDITIONX(p,#p)
|
|
|
|
#if __DEBUG < 1
|
|
#define PRECONDITIONX(p,s) ((void)0)
|
|
#else
|
|
#define PRECONDITIONX(p,s) \
|
|
if(!(p)) {throw precondition(s,__FILE__,__LINE__);}
|
|
#endif
|
|
|
|
#undef CHECK
|
|
#undef CHECKX
|
|
|
|
#define CHECK(p) CHECKX(p,#p)
|
|
|
|
#if __DEBUG < 2
|
|
#define CHECKX(p,s) ((void)0)
|
|
#else
|
|
#define CHECKX(p,s) \
|
|
if(!(p)) {throw check(s,__FILE__,__LINE__);}
|
|
#endif
|
|
|
|
#if defined(__TRACE) || defined(__WARN)
|
|
|
|
#define DECLARE_DIAG_GROUP(g, qual) TDiagGroup & qual _GetDiagGroup##g()
|
|
|
|
#define DIAG_DECLARE_GROUP(g) DECLARE_DIAG_GROUP(g,DIAG_IMPORT);
|
|
#define DIAG_DEFINE_GROUP(g, e, l) \
|
|
DECLARE_DIAG_GROUP(g, DIAG_EXPORT); \
|
|
TDiagGroup &_GetDiagGroup##g() \
|
|
{ \
|
|
static TDiagGroup dg(e, l, #g); \
|
|
return dg; \
|
|
} \
|
|
|
|
#define DIAG_ENABLE(g,s) _GetDiagGroup##g().Enable(s)
|
|
#define DIAG_ISENABLED(g) _GetDiagGroup##g().IsEnabled()
|
|
#define DIAG_SETLEVEL(g,l) _GetDiagGroup##g().SetLevel(l)
|
|
#define DIAG_GETLEVEL(g) _GetDiagGroup##g().GetLevel()
|
|
|
|
#if !defined(_BUILD_CHECKS) && !defined( _DEF_DECLARED )
|
|
#define _DEF_DECLARED
|
|
DECLARE_DIAG_GROUP(Def, _EXPCLASS);
|
|
#endif
|
|
|
|
#else // !defined(__TRACE) && !defined(__WARN)
|
|
|
|
#define DIAG_DECLARE_GROUP(g)
|
|
#define DIAG_DEFINE_GROUP(g,e,l)
|
|
|
|
#define DIAG_ENABLE(g,s) ((void)0)
|
|
#define DIAG_ISENABLED(g) ((void)0)
|
|
#define DIAG_SETLEVEL(g,l) ((void)0)
|
|
#define DIAG_GETLEVEL(g) ((void)0)
|
|
|
|
#endif
|
|
|
|
#if defined(__TRACE)
|
|
#define TRACE(m) TRACEX(Def,0,m)
|
|
#define TRACEX(g,l,m)\
|
|
do { \
|
|
TDiagGroup &dg = _GetDiagGroup##g(); \
|
|
if (dg.IsEnabled() && l <= dg.GetLevel()) { \
|
|
std::ostringstream os; \
|
|
os << m; \
|
|
dg.Trace(os, __FILE__, __LINE__); \
|
|
} \
|
|
} while (0)
|
|
#else
|
|
#define TRACE(m) ((void)0)
|
|
#define TRACEX(g,l,m) ((void)0)
|
|
#endif
|
|
|
|
#if defined(__WARN)
|
|
#define WARN(c,m) WARNX(Def,c,0,m)
|
|
#define WARNX(g,c,l,m)\
|
|
do { \
|
|
if (c) { \
|
|
TDiagGroup &dg = _GetDiagGroup##g(); \
|
|
if (dg.IsEnabled() && l <= dg.GetLevel()) { \
|
|
std::ostringstream os; \
|
|
os << m; \
|
|
dg.Warn(os, __FILE__, __LINE__); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
#else
|
|
#define WARN(c,m) ((void)0)
|
|
#define WARNX(g,c,l,m) ((void)0)
|
|
#endif
|
|
|