Initial commit and conversion

This commit is contained in:
2026-02-15 10:45:05 -06:00
commit d3d47076f1
7 changed files with 324 additions and 0 deletions

71
src/except.c Normal file
View File

@@ -0,0 +1,71 @@
#include <stdlib.h>
#include <stdio.h>
#include <assert.h> // for now
#include "../include/except.h"
struct Except_Frame *except_stack = NULL;
void except_raise(const struct Exception *e, const char *file,int line)
{
#ifdef WIN32
struct Except_Frame *p;
if (except_index == -1)
except_init();
p = TlsGetValue(except_index);
#else
struct Except_Frame *p = except_stack;
#endif
assert(e);
if (p == NULL) {
fprintf(stderr, "Uncaught exception");
if (e->reason)
fprintf(stderr, " %s", e->reason);
else
fprintf(stderr, " at 0x%p", (void*)e);
if (file && line > 0)
fprintf(stderr, " raised at %s:%d\n", file, line);
fprintf(stderr, "aborting...\n");
fflush(stderr);
abort();
}
p->exception = e;
p->file = file;
p->line = line;
#ifdef WIN32
except_pop();
#else
except_stack = except_stack->prev;
#endif
longjmp(p->env, EXCEPT_STATE_RAISED);
}
#ifdef WIN32
_CRTIMP void __cdecl _assert(void *, void *, unsigned);
#undef assert
#define assert(e) ((e) || (_assert(#e, __FILE__, __LINE__), 0))
int except_index = -1;
void except_init(void) {
BOOL cond;
except_index = TlsAlloc();
assert(except_index != TLS_OUT_OF_INDEXES);
cond = TlsSetValue(except_index, NULL);
assert(cond == TRUE);
}
void Except_push(Except_Frame *fp) {
BOOL cond;
fp->prev = TlsGetValue(except_index);
cond = TlsSetValue(except_index, fp);
assert(cond == TRUE);
}
void Except_pop(void) {
BOOL cond;
Except_Frame *tos = TlsGetValue(Except_index);
cond = TlsSetValue(except_index, tos->prev);
assert(cond == TRUE);
}
#endif