mirror of https://github.com/flysand7/ciabatta.git
assert.h progress
This commit is contained in:
parent
fc03be076a
commit
f8aef19b5c
|
@ -0,0 +1,46 @@
|
|||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <_platform.h>
|
||||
|
||||
#if defined(_os_win)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include<Windows.h>
|
||||
|
||||
// TODO: make it work via printf
|
||||
|
||||
static int _assert_strlen(char const *str)
|
||||
{
|
||||
int len = 0;
|
||||
while(*str++!=0) ++len;
|
||||
return len;
|
||||
}
|
||||
|
||||
static void _assert_win32_prints(HANDLE conout, char const *str)
|
||||
{
|
||||
DWORD written = 0;
|
||||
WriteConsole(conout, str, _assert_strlen(str), &written, NULL);
|
||||
}
|
||||
|
||||
extern void _assert_print(char *cond, char const *func, char const *file, char const *line)
|
||||
{
|
||||
HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if(conout != INVALID_HANDLE_VALUE) {
|
||||
_assert_win32_prints(conout, "Assertion Failed: ");
|
||||
_assert_win32_prints(conout, cond);
|
||||
_assert_win32_prints(conout, "\n\tFile: ");
|
||||
_assert_win32_prints(conout, file);
|
||||
_assert_win32_prints(conout, "\n\tFunc: ");
|
||||
_assert_win32_prints(conout, func);
|
||||
_assert_win32_prints(conout, "\n\tLine: ");
|
||||
_assert_win32_prints(conout, line);
|
||||
}
|
||||
else {
|
||||
// TODO:
|
||||
MessageBoxA(NULL,
|
||||
"Assertion Failed Somewhere, good luck finding it!\n",
|
||||
"Error",
|
||||
MB_OK);
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include<_platform.h>
|
||||
|
||||
extern int main();
|
||||
|
||||
int mainCRTStartup()
|
||||
{
|
||||
return main();
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
#if !defined(_platform_h)
|
||||
#define _platform_h
|
||||
|
||||
// Compiler Identification
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
#define _compiler_msvc
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) && !defined(__clang__)
|
||||
#define _compiler_gnu
|
||||
#endif
|
||||
|
||||
#if defined(__clang__)
|
||||
#define _compiler_clang
|
||||
#endif
|
||||
|
||||
#if !(defined(_compiler_msvc) \
|
||||
|| defined(_compiler_gnu) \
|
||||
|| defined(_compiler_clang))
|
||||
#error "Unsupported Compiler"
|
||||
#endif
|
||||
|
||||
#if !defined(_func)
|
||||
#if defined(_compiler_msvc)
|
||||
#define _func __FUNCTION__
|
||||
#else
|
||||
#define _func __func__
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// OS Identification
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define _os_win
|
||||
#endif
|
||||
|
||||
#if defined(__linux__) && !defined(__ANDROID__)
|
||||
#define _os_linux
|
||||
#endif
|
||||
|
||||
#if !(defined(_os_win) \
|
||||
|| defined(_os_linux))
|
||||
#error "Unsupported OS"
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,32 @@
|
|||
#if !defined(_assert_h)
|
||||
#define _assert_h
|
||||
|
||||
#include "_platform.h"
|
||||
|
||||
extern void _assert_print(char *cond, char const *func, char const *file, char const *line);
|
||||
|
||||
// TODO: use abort() to break
|
||||
#if defined(_compiler_msvc)
|
||||
#include <intrin.h>
|
||||
#define _compiler_brk __debugbreak
|
||||
#else
|
||||
#define _compiler_brk __builtin_trap
|
||||
#endif
|
||||
|
||||
#define _str_(x) #x
|
||||
#define _str(x) _str_(x)
|
||||
|
||||
#if defined(NDEBUG)
|
||||
#define assert(ignore) ((void)0)
|
||||
#else
|
||||
#define _static_assert _Static_assert
|
||||
#define assert(condition) \
|
||||
do { \
|
||||
if(!(condition)) { \
|
||||
_assert_print(#condition, _func, __FILE__, _str(__LINE__)); \
|
||||
_compiler_brk(); \
|
||||
} \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
#error "Complex Numbers aren't implemented"
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
#define EOF -1
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
#define NULL ((void *)0)
|
|
@ -0,0 +1,20 @@
|
|||
|
||||
GNUFLAGS=-Iinc -Icode
|
||||
CLFLAGS=/link /incremental:no /subsystem:windows /nodefaultlib kernel32.lib
|
||||
|
||||
CC=clang
|
||||
CFLAGS=$(GNUFLAGS)
|
||||
LDFLAGS=/nologo /nodefaultlib /entry:mainCRTStartup
|
||||
|
||||
SRC_DIR := code
|
||||
OBJ_DIR := build
|
||||
SRC_FILES := $(wildcard $(SRC_DIR)/*.c)
|
||||
OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC_FILES))
|
||||
|
||||
ciabatta.lib: $(OBJ_FILES)
|
||||
lib $(LDFLAGS) /out:lib/$@ $^
|
||||
|
||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
.PHONY: ciabatta.lib
|
|
@ -0,0 +1,6 @@
|
|||
@echo off
|
||||
cl /c /I ..\inc /nologo /Gm- /GR- /EHa- /Oi /W4 /Z7 test.c
|
||||
clang -c -Wall test.c -otest1.obj
|
||||
|
||||
link /nologo test.obj /nodefaultlib user32.lib kernel32.lib ..\lib\ciabatta.lib -subsystem:console
|
||||
link /nologo test1.obj /nodefaultlib user32.lib kernel32.lib ..\lib\ciabatta.lib -subsystem:console
|
|
@ -0,0 +1,8 @@
|
|||
// MSVC won't use my <assert.h> unless i provide path explicitly
|
||||
// idk
|
||||
#include"..\inc\assert.h"
|
||||
int main()
|
||||
{
|
||||
assert(0);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue