forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			201 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <kinc/global.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdarg.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*! \file error.h
							 | 
						||
| 
								 | 
							
								    \brief Contains functionality to stop the program in case of an error and create a user-visible error message.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    The affirm and error functions print an error message and then exit the program. Error messages can be made
							 | 
						||
| 
								 | 
							
								    visible to the user (unless a console window is active this is only implemented for Windows).
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Exits the program when a condition is untrue and shows
							 | 
						||
| 
								 | 
							
								/// a generic error message.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <remarks>
							 | 
						||
| 
								 | 
							
								/// This is an alternative to assert which also persists in release
							 | 
						||
| 
								 | 
							
								/// builds. Use this instead of assert in situations where you want
							 | 
						||
| 
								 | 
							
								/// your users to see what's going wrong.
							 | 
						||
| 
								 | 
							
								/// This uses Kinc's log and error functionality to make errors
							 | 
						||
| 
								 | 
							
								/// visible.
							 | 
						||
| 
								 | 
							
								/// </remarks>
							 | 
						||
| 
								 | 
							
								/// <param name="condition">
							 | 
						||
| 
								 | 
							
								/// Exits the program if condition is false,
							 | 
						||
| 
								 | 
							
								/// otherwise does nothing.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_affirm(bool condition);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Exits the program when a condition is untrue and shows
							 | 
						||
| 
								 | 
							
								/// a provided error message.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <remarks>
							 | 
						||
| 
								 | 
							
								/// This is equivalent to kinc_affirm() but uses the provided message
							 | 
						||
| 
								 | 
							
								/// instead of a generic one.
							 | 
						||
| 
								 | 
							
								/// </remarks>
							 | 
						||
| 
								 | 
							
								/// <param name="condition">
							 | 
						||
| 
								 | 
							
								/// Exits the program if condition is false,
							 | 
						||
| 
								 | 
							
								/// otherwise does nothing.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								/// <param name="format">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the first printf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								/// <param name="...">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the second printf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_affirm_message(bool condition, const char *format, ...);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Equivalent to kinc_affirm_message but uses a va_list parameter.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <remarks>
							 | 
						||
| 
								 | 
							
								/// You will need this if you want to provide the parameters using va_start/va_end.
							 | 
						||
| 
								 | 
							
								/// </remarks>
							 | 
						||
| 
								 | 
							
								/// <param name="condition">
							 | 
						||
| 
								 | 
							
								/// Exits the program if condition is false,
							 | 
						||
| 
								 | 
							
								/// otherwise does nothing.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								/// <param name="format">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the first vprintf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								/// <param name="...">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the second vprintf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_affirm_args(bool condition, const char *format, va_list args);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Exits the program and shows a generic error message
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <remarks>
							 | 
						||
| 
								 | 
							
								/// Mainly this just calls exit(EXIT_FAILURE) but will also use
							 | 
						||
| 
								 | 
							
								/// Kore's log function and on Windows show an error message box.
							 | 
						||
| 
								 | 
							
								/// </remarks>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_error(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Exits the program and shows a provided error message.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <remarks>
							 | 
						||
| 
								 | 
							
								/// This is equivalent to kinc_error() but uses the provided message
							 | 
						||
| 
								 | 
							
								/// instead of a generic one.
							 | 
						||
| 
								 | 
							
								/// </remarks>
							 | 
						||
| 
								 | 
							
								/// <param name="format">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the first printf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								/// <param name="...">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the second printf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_error_message(const char *format, ...);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Equivalent to kinc_error_message but uses a va_list parameter.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <remarks>
							 | 
						||
| 
								 | 
							
								/// You will need this if you want to provide the parameters using va_start/va_end.
							 | 
						||
| 
								 | 
							
								/// </remarks>
							 | 
						||
| 
								 | 
							
								/// <param name="format">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the first vprintf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								/// <param name="...">
							 | 
						||
| 
								 | 
							
								/// The parameter is equivalent to the second vprintf parameter.
							 | 
						||
| 
								 | 
							
								/// </param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_error_args(const char *format, va_list args);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_IMPLEMENTATION_ROOT
							 | 
						||
| 
								 | 
							
								#define KINC_IMPLEMENTATION
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_IMPLEMENTATION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef KINC_IMPLEMENTATION_ROOT
							 | 
						||
| 
								 | 
							
								#undef KINC_IMPLEMENTATION
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#include <kinc/log.h>
							 | 
						||
| 
								 | 
							
								#ifndef KINC_IMPLEMENTATION_ROOT
							 | 
						||
| 
								 | 
							
								#define KINC_IMPLEMENTATION
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WINDOWS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <kinc/backend/MiniWindows.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/backend/SystemMicrosoft.h>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_affirm(bool condition) {
							 | 
						||
| 
								 | 
							
									if (!condition) {
							 | 
						||
| 
								 | 
							
										kinc_error();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_affirm_message(bool condition, const char *format, ...) {
							 | 
						||
| 
								 | 
							
									if (!condition) {
							 | 
						||
| 
								 | 
							
										va_list args;
							 | 
						||
| 
								 | 
							
										va_start(args, format);
							 | 
						||
| 
								 | 
							
										kinc_error_args(format, args);
							 | 
						||
| 
								 | 
							
										va_end(args);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_affirm_args(bool condition, const char *format, va_list args) {
							 | 
						||
| 
								 | 
							
									if (!condition) {
							 | 
						||
| 
								 | 
							
										kinc_error_args(format, args);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_error(void) {
							 | 
						||
| 
								 | 
							
									kinc_error_message("Unknown error");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_error_message(const char *format, ...) {
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										va_list args;
							 | 
						||
| 
								 | 
							
										va_start(args, format);
							 | 
						||
| 
								 | 
							
										kinc_log_args(KINC_LOG_LEVEL_ERROR, format, args);
							 | 
						||
| 
								 | 
							
										va_end(args);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WINDOWS
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										va_list args;
							 | 
						||
| 
								 | 
							
										va_start(args, format);
							 | 
						||
| 
								 | 
							
										wchar_t buffer[4096];
							 | 
						||
| 
								 | 
							
										kinc_microsoft_format(format, args, buffer);
							 | 
						||
| 
								 | 
							
										MessageBoxW(NULL, buffer, L"Error", 0);
							 | 
						||
| 
								 | 
							
										va_end(args);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef KINC_NO_CLIB
							 | 
						||
| 
								 | 
							
									exit(EXIT_FAILURE);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_error_args(const char *format, va_list args) {
							 | 
						||
| 
								 | 
							
									kinc_log_args(KINC_LOG_LEVEL_ERROR, format, args);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WINDOWS
							 | 
						||
| 
								 | 
							
									wchar_t buffer[4096];
							 | 
						||
| 
								 | 
							
									kinc_microsoft_format(format, args, buffer);
							 | 
						||
| 
								 | 
							
									MessageBoxW(NULL, buffer, L"Error", 0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef KINC_NO_CLIB
							 | 
						||
| 
								 | 
							
									exit(EXIT_FAILURE);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 |