⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 errorlog.c

📁 傅立叶变换和小波变换是图像压缩的重要工具。该代大戏是利用小波变换进行图像压缩。
💻 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 + -