mirror of
https://github.com/mcneel/opennurbs.git
synced 2026-03-02 12:37:02 +08:00
270 lines
7.2 KiB
C++
270 lines
7.2 KiB
C++
//
|
|
// Copyright (c) 1993-2022 Robert McNeel & Associates. All rights reserved.
|
|
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
|
|
// McNeel & Associates.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
|
|
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
|
|
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
|
|
//
|
|
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(OPENNURBS_ERROR_INC_)
|
|
#define OPENNURBS_ERROR_INC_
|
|
|
|
/*
|
|
// Macros used to log errors and warnings. The ON_Warning() and ON_Error()
|
|
// functions are defined in opennurbs_error.cpp.
|
|
*/
|
|
#define ON_ERROR(msg) ON_ErrorEx(__FILE__,__LINE__,OPENNURBS__FUNCTION__,msg)
|
|
#define ON_WARNING(msg) ON_WarningEx(__FILE__,__LINE__,OPENNURBS__FUNCTION__,msg)
|
|
#define ON_ASSERT_OR_RETURN(cond,returncode) do{if (!(cond)) {ON_ErrorEx(__FILE__,__LINE__,OPENNURBS__FUNCTION__, #cond " is false");return(returncode);}}while(0)
|
|
#define ON_ASSERT_OR_RETURNVOID(cond) do{if (!(cond)) {ON_ErrorEx(__FILE__,__LINE__,OPENNURBS__FUNCTION__, #cond " is false");return;}}while(0)
|
|
|
|
// Do not use ON_ASSERT. If a condition can be checked by ON_ASSERT, then the
|
|
// code must be written detect and respond to that condition. This define will
|
|
// be deleted ASAP. It is being used to detect situations where a crash will
|
|
// occur and then letting the crash occur.
|
|
#define ON_ASSERT(cond) ON_REMOVE_ASAP_AssertEx(cond,__FILE__,__LINE__,OPENNURBS__FUNCTION__, #cond " is false")
|
|
|
|
|
|
ON_BEGIN_EXTERNC
|
|
|
|
/*
|
|
// All error/warning messages are sent to ON_ErrorMessage(). Replace the
|
|
// default handler (defined in opennurbs_error_message.cpp) with something
|
|
// that is appropriate for debugging your application.
|
|
*/
|
|
ON_DECL
|
|
void ON_ErrorMessage(
|
|
int, /* 0 = warning message, 1 = serious error message, 2 = assert failure */
|
|
const char*
|
|
);
|
|
|
|
/*
|
|
Returns:
|
|
Number of opennurbs errors since program started.
|
|
*/
|
|
ON_DECL
|
|
int ON_GetErrorCount(void);
|
|
|
|
/*
|
|
Returns:
|
|
Number of opennurbs warnings since program started.
|
|
*/
|
|
ON_DECL
|
|
int ON_GetWarningCount(void);
|
|
|
|
/*
|
|
Returns:
|
|
Number of math library or floating point errors that have
|
|
been handled since program started.
|
|
*/
|
|
ON_DECL
|
|
int ON_GetMathErrorCount(void);
|
|
|
|
|
|
ON_DECL
|
|
int ON_GetDebugErrorMessage(void);
|
|
|
|
ON_DECL
|
|
void ON_EnableDebugErrorMessage( int bEnableDebugErrorMessage );
|
|
|
|
ON_DECL
|
|
void ON_VARGS_FUNC_CDECL ON_Error(
|
|
const char* file_name, /* __FILE__ will do fine */
|
|
int line_number, /* __LINE__ will do fine */
|
|
const char* format, /* format string */
|
|
... /* format ags */
|
|
);
|
|
|
|
ON_DECL
|
|
void ON_VARGS_FUNC_CDECL ON_ErrorEx(
|
|
const char* file_name, /* __FILE__ will do fine */
|
|
int line_number, /* __LINE__ will do fine */
|
|
const char* function_name, /* OPENNURBS__FUNCTION__ will do fine */
|
|
const char* format, /* format string */
|
|
... /* format ags */
|
|
);
|
|
|
|
ON_DECL
|
|
void ON_VARGS_FUNC_CDECL ON_Warning(
|
|
const char* file_name, /* __FILE__ will do fine */
|
|
int line_number, /* __LINE__ will do fine */
|
|
const char* format, /* format string */
|
|
... /* format ags */
|
|
);
|
|
|
|
ON_DECL
|
|
void ON_VARGS_FUNC_CDECL ON_WarningEx(
|
|
const char* file_name, /* __FILE__ will do fine */
|
|
int line_number, /* __LINE__ will do fine */
|
|
const char* function_name, /*OPENNURBS__FUNCTION__ will do fine */
|
|
const char* format, /* format string */
|
|
... /* format ags */
|
|
);
|
|
|
|
// Ideally - these "assert" functions will be deleted when the SDK can be changed.
|
|
ON_DECL
|
|
void ON_VARGS_FUNC_CDECL ON_REMOVE_ASAP_AssertEx(
|
|
int, // if false, error is flagged
|
|
const char* file_name, /* __FILE__ will do fine */
|
|
int line_number, /* __LINE__ will do fine */
|
|
const char* function_name, /* OPENNURBS__FUNCTION__ will do fine */
|
|
const char* format, /* format string */
|
|
... /* format ags */
|
|
);
|
|
|
|
ON_DECL
|
|
void ON_MathError(
|
|
const char*, /* sModuleName */
|
|
const char*, /* sErrorType */
|
|
const char* /* sFunctionName */
|
|
);
|
|
|
|
ON_END_EXTERNC
|
|
|
|
#if defined(ON_CPLUSPLUS)
|
|
|
|
class ON_CLASS ON_ErrorEvent
|
|
{
|
|
public:
|
|
enum class Type : unsigned char
|
|
{
|
|
Unset = 0,
|
|
Warning = 1, // call to ON_WARNING / ON_Warning / ON_WarningEx
|
|
Error = 2, // call to ON_ERROR / ON_Error / ON_ErrorEx
|
|
Assert = 3, // ON_ASSERT (do not use ON_ASSERT - write code that handles errors and calls ON_ERROR)
|
|
Custom = 4,
|
|
SubDError = 5, // call to ON_SubDIncrementErrorCount()
|
|
BrepError = 6, // call to ON_BrepIncrementErrorCount()
|
|
NotValid = 7 // call to ON_IsNotValid()
|
|
};
|
|
|
|
static const char* TypeToString(
|
|
ON_ErrorEvent::Type event_type
|
|
);
|
|
|
|
const ON_String ToString() const;
|
|
|
|
public:
|
|
ON_ErrorEvent() = default;
|
|
~ON_ErrorEvent() = default;
|
|
ON_ErrorEvent(const ON_ErrorEvent&);
|
|
ON_ErrorEvent& operator=(const ON_ErrorEvent&);
|
|
|
|
ON_ErrorEvent(
|
|
ON_ErrorEvent::Type event_type,
|
|
const char* file_name,
|
|
unsigned int line_number,
|
|
const char* function_name,
|
|
const char* description
|
|
);
|
|
|
|
static const ON_ErrorEvent Create(
|
|
ON_ErrorEvent::Type event_type,
|
|
const char* file_name,
|
|
unsigned int line_number,
|
|
const char* function_name,
|
|
const char* description
|
|
);
|
|
|
|
static const ON_ErrorEvent Unset;
|
|
|
|
const char* FileName() const;
|
|
const char* FunctionName() const;
|
|
const char* Description() const;
|
|
unsigned int LineNumber() const;
|
|
ON_ErrorEvent::Type EventType() const;
|
|
|
|
void Dump(
|
|
class ON_TextLog& text_log
|
|
) const;
|
|
|
|
private:
|
|
friend class ON_ErrorLog;
|
|
|
|
ON_ErrorEvent::Type m_event_type = ON_ErrorEvent::Type::Unset;
|
|
unsigned char m_reserved1 = 0;
|
|
unsigned short m_reserved2 = 0;
|
|
unsigned int m_line_number = 0;
|
|
const char* m_file_name = nullptr;
|
|
const char* m_function_name = nullptr;
|
|
const char* m_description = nullptr;
|
|
char m_buffer[128] = {};
|
|
|
|
void Internal_CopyFrom(const ON_ErrorEvent& src);
|
|
};
|
|
|
|
|
|
class ON_CLASS ON_ErrorLog
|
|
{
|
|
public:
|
|
enum : unsigned int
|
|
{
|
|
MaximumEventCount = 32
|
|
};
|
|
public:
|
|
ON_ErrorLog() = default;
|
|
virtual ~ON_ErrorLog();
|
|
ON_ErrorLog(const ON_ErrorLog&) = default;
|
|
ON_ErrorLog& operator=(const ON_ErrorLog&) = default;
|
|
|
|
/*
|
|
Parameters:
|
|
error_event - [in]
|
|
event to add
|
|
Returns:
|
|
0: Event not added because maximum capacity reached.
|
|
>0: Number of events after adding error_event.
|
|
*/
|
|
virtual
|
|
unsigned int Append(
|
|
const ON_ErrorEvent& error_event
|
|
);
|
|
|
|
/*
|
|
Returns:
|
|
Total number of error events.
|
|
*/
|
|
unsigned int Count() const;
|
|
|
|
/*
|
|
Parameters:
|
|
i - [in]
|
|
zero based event index.
|
|
Returns
|
|
Event at specified index or ON_ErrorEvent::Unset if the index is out of range.
|
|
*/
|
|
const ON_ErrorEvent& Event(unsigned int i) const;
|
|
|
|
void Clear();
|
|
|
|
/*
|
|
Returns:
|
|
True if up to ON_ErrorLog::MaximumErrorCount error events will be saved in this to this error log.
|
|
False if another error log is active.
|
|
*/
|
|
bool EnableLogging();
|
|
|
|
/*
|
|
Description:
|
|
Stop logging errors to this error log.
|
|
*/
|
|
void DisableLogging();
|
|
|
|
void Dump(
|
|
class ON_TextLog& text_log
|
|
) const;
|
|
|
|
protected:
|
|
unsigned int m_event_count = 0;
|
|
ON_ErrorEvent m_events[ON_ErrorLog::MaximumEventCount];
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif
|