📄 errorlog.c
字号:
#include <windows.h>
#include <stdio.h>
#include <assert.h> // assert()
#include <stdlib.h>
#include <string.h> // memmove(), strncpy() strncat()
#include "ErrorLog.h"
#define MAX_ERRORS 30 // ...
#define MAX_USER_NAME_LEN 200 // Needed just 10 more chars! (was 100) JP
#define MAX_CONTEXT_LEN 128 // How big should this be? Must be big enough to allow full paths to files, etc...
typedef struct
{
geErrorLog_ErrorIDEnumType ErrorID;
char String[MAX_USER_NAME_LEN+1];
char Context[MAX_CONTEXT_LEN+1];
} geErrorType;
typedef struct
{
int ErrorCount;
int MaxErrors;
geErrorType ErrorList[MAX_ERRORS];
} geErrorLogType;
geErrorLogType geErrorLog_Locals = {0,MAX_ERRORS};
void geErrorLog_Clear(void)
// clears error history
{
geErrorLog_Locals.ErrorCount = 0;
}
int geErrorLog_Count(void)
// reports size of current error log
{
return geErrorLog_Locals.ErrorCount;
}
void geErrorLog_AddExplicit(geErrorLog_ErrorClassType Error,
const char *ErrorIDString,
const char *ErrorFileString,
int LineNumber,
const char *UserString,
const char *Context)
{
char *SDst;
char *CDst;
assert( geErrorLog_Locals.ErrorCount >= 0 );
geErrorLog_Locals.ErrorList[geErrorLog_Locals.ErrorCount].ErrorID = Error;
if (geErrorLog_Locals.ErrorCount>=MAX_ERRORS)
{ // scoot list down by one (loose oldest error)
memmove(
(char *)(&( geErrorLog_Locals.ErrorList[0] )),
(char *)(&( geErrorLog_Locals.ErrorList[1] )),
sizeof(geErrorType) * (geErrorLog_Locals.MaxErrors-1) );
geErrorLog_Locals.ErrorCount = geErrorLog_Locals.MaxErrors-1;
}
assert( geErrorLog_Locals.ErrorCount < geErrorLog_Locals.MaxErrors );
SDst = geErrorLog_Locals.ErrorList[geErrorLog_Locals.ErrorCount].String;
// Copy new error info
if (ErrorIDString != NULL)
{
strncpy(SDst,ErrorIDString,MAX_USER_NAME_LEN);
}
strncat(SDst," ",MAX_USER_NAME_LEN);
if (ErrorFileString!=NULL)
{
const char* pModule = strrchr(ErrorFileString, '\\');
if(!pModule)
pModule = ErrorFileString;
else
pModule++; // skip that backslash
strncat(SDst,pModule,MAX_USER_NAME_LEN);
strncat(SDst," ",MAX_USER_NAME_LEN);
}
{
char Number[20];
itoa(LineNumber,Number,10);
strncat(SDst,Number,MAX_USER_NAME_LEN);
}
if (UserString != NULL)
{
if (UserString[0]!=0)
{
strncat(SDst," ",MAX_USER_NAME_LEN);
strncat(SDst,UserString,MAX_USER_NAME_LEN);
}
}
CDst = geErrorLog_Locals.ErrorList[geErrorLog_Locals.ErrorCount].Context;
// Clear the context string in the errorlog to prepare for a new one
memset(CDst, 0, sizeof(char)*MAX_CONTEXT_LEN);
if (Context != NULL)
{
if (Context[0]!=0)
{
//strncat(SDst," ",MAX_USER_NAME_LEN);
strncat(CDst,Context,MAX_USER_NAME_LEN);
}
}
if (Error == GE_ERR_WINDOWS_API_FAILURE)
{
int LastError;
char *Buff;
LastError = GetLastError();
#ifdef ERRORLOG_FULL_REPORTING
if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
0,
LastError,
0,
(LPTSTR)&Buff,
0,
NULL)!=0)
{
strncat(SDst,Buff,MAX_USER_NAME_LEN);
LocalFree( Buff );
}
else
{
char Number[50];
itoa(LastError,Number,10);
strncat(SDst," LastError=",MAX_USER_NAME_LEN);
strncat(SDst,Number,MAX_USER_NAME_LEN);
}
#else
strncat(SDst," ",MAX_USER_NAME_LEN);
#endif
}
geErrorLog_Locals.ErrorCount++;
#ifndef NDEBUG
{
char buff[100];
sprintf(buff, "ErrorLog: %d -", Error);
OutputDebugString(buff);
OutputDebugString(SDst);
OutputDebugString("\r\n");
}
#endif
}
bool geErrorLog_AppendStringToLastError(const char *String)
{
char *SDst;
if (String == NULL)
{
return false;
}
if (geErrorLog_Locals.ErrorCount>0)
{
SDst = geErrorLog_Locals.ErrorList[geErrorLog_Locals.ErrorCount-1].String;
strncat(SDst,String,MAX_USER_NAME_LEN);
return true;
}
else
{
return false;
}
}
bool geErrorLog_Report(int history, geErrorLog_ErrorClassType *error, const char **UserString, const char **Context)
{
assert( error != NULL );
if ( (history > geErrorLog_Locals.ErrorCount) || (history < 0))
{
return false;
}
*error = geErrorLog_Locals.ErrorList[history].ErrorID;
*UserString = geErrorLog_Locals.ErrorList[history].String;
*Context = geErrorLog_Locals.ErrorList[history].Context;
return true;
}
const char *geErrorLog_IntToString(int Number)
{
static char String[50];
itoa(Number,String,10);
return String;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -