Initial Commit

This commit is contained in:
2026-08-25 06:38:37 -05:00
commit b1ce7c090d
5 changed files with 186 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
root = true
[*]
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.py]
indent_style = tab
[chinookfile]
indent_style = space
+3
View File
@@ -0,0 +1,3 @@
.chinook/
.environ/
.vscode/
+16
View File
@@ -0,0 +1,16 @@
name: assert
gpid: malunal
semv: 1.0.0
requires:
- remote: git@git.erasit.com:malunal/types
branch: v1.0.0
targets:
- name: malunal.assert
type: archive
deps: [malunal.types]
srcs: [./sources/assert.c]
exports:
- malunal.assert
+111
View File
@@ -0,0 +1,111 @@
/**
* @file assert.h
* @brief Contains the definitions for various types of the library and
* declarations for functions that make the library work.
* @author John Christman (sorakatadzuma@gmail.com)
* @copyright Malunal Studios, LLC.
*/
#include "malunal/types/bool.h"
#include "malunal/types/integer.h"
#include "malunal/types/string.h"
#ifndef MALUNAL_ASSERT_HEADER
#define MALUNAL_ASSERT_HEADER
/**
* @def assert
* @brief A preprocessor macro which can test and throw an assertion.
* @details This will eventually call @c assert_test which will test the
* assertion formally and throw the assertion if necessary.
* @param cond The condition that should be tested.
*/
#ifdef MALUNAL_ENABLE_ASSERTIONS
#define assert(cond) \
assertmsg(cond, (malunal_cstr_t)0)
#else /* Do not enable assertions. */
#define assert(cond)
#endif /* MALUNAL_ENABLE_ASSERTIONS */
/**
* @def assertmsg
* @brief A preprocessor macro which can test and throw an assertion.
* @details This is the same as @c assert but with the added benefit that it
* can provide an additional developer message.
* @param cond The condition that should be tested.
* @param msg The developer message to add to error message.
*/
#ifdef MALUNAL_ENABLE_ASSERTIONS
#define assertmsg(cond, msg) \
assert_test(cond, #cond, msg, __FILE__, __LINE__)
#else /* Do not enable assertions. */
#define assertmsg(cond, msg)
#endif /* MALUNAL_ENABLE_ASSERTIONS */
/**
* @brief A function pointer type declaration.
* @details Allows the ability to handle an assertion failure manually instead
* of the application automatically dumping and exiting.
* @param expr Why the assertion failed.
* @param msg Why the assertion failed, extra.
* @param file The file in which the assertion failed.
* @param line the line in which the assertion failed.
*/
typedef malunal_void_t
(*assertion_handler_pfn_t)(
malunal_cstr_t expr,
malunal_cstr_t msg,
malunal_cstr_t file,
malunal_int32_t line
);
/**
* @brief Sets the global assertion handler.
* @details Provides the capability for developers to catch an assertion and
* handle it manually instead of the application automatically dumping
* and exiting.
* @param handler The pointer to the function which will handle the assertion.
*/
malunal_void_t
assertion_handler(
assertion_handler_pfn_t handler
);
/**
* @brief Tests the given condition.
* @details When the condition fails, this will pass the information to the
* failure function which is responsible for handling the failure.
* @param cond The condition being asserted.
* @param expr The expression being asserted.
* @param msg The developer message about the assertion.
* @param file The file in which the assertion is taking place.
* @param line The line in which the assertion is taking place.
*/
malunal_void_t
assert_test(
malunal_bool_t cond,
malunal_cstr_t expr,
malunal_cstr_t msg,
malunal_cstr_t file,
malunal_int32_t line
);
/**
* @brief Reports that an assertion has failed.
* @details This will pass the information to the global assertion handler if
* one is set, otherwise it will print the error message and abort the
* application.
* @param expr The expression that failed.
* @param msg The developer message about the assertion.
* @param file The file in which the assertion failed.
* @param line The line in which the assertion failed.
*/
malunal_void_t
assert_failed(
malunal_cstr_t expr,
malunal_cstr_t msg,
malunal_cstr_t file,
malunal_int32_t line
);
#endif /* MALUNAL_ASSERT_HEADER */
+42
View File
@@ -0,0 +1,42 @@
// TODO: Replace standard headers when possible.
#include <stdio.h>
#include "malunal/assert.h"
static
assertion_handler_pfn_t
g_handler;
malunal_void_t
assertion_handler(
assertion_handler_pfn_t handler
) {
g_handler = handler;
}
malunal_void_t
assertion_test(
malunal_bool_t cond,
malunal_cstr_t expr,
malunal_cstr_t msg,
malunal_cstr_t file,
malunal_int32_t line
) {
if (!cond) assertion_failed(expr, msg, file, line);
}
malunal_void_t
assertion_failed(
malunal_cstr_t expr,
malunal_cstr_t msg,
malunal_cstr_t file,
malunal_int32_t line
) {
if (g_handler != null)
return (*g_handler)(expr, msg, file, line);
malunal_cstr_t format = msg != null
? "%s:%d '%s' Assertion Failed!\n ↳ %s\n"
: "%s:%d '%s' Assertion Failed!\n";
fprintf(stderr, format, file, line, expr, msg);
abort();
}