Initial commit
This commit is contained in:
		
							
								
								
									
										20
									
								
								include/arena.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								include/arena.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #ifndef ARENA_INCLUDED | ||||
| #define ARENA_INCLUDED | ||||
|  | ||||
| struct Arena { | ||||
|     unsigned char *beg; | ||||
|     unsigned char *end; | ||||
| }; | ||||
| typedef struct Arena Arena; | ||||
|  | ||||
| extern void *arena_alloc(int flags, struct Arena *a, size_t nbytes,  | ||||
|         size_t align, size_t count, const char *file, int line); | ||||
|  | ||||
| extern struct Arena arena_new(int flags, size_t cap, const char *file, int line); | ||||
| extern void arena_back(struct Arena *a, void *buf, size_t len); | ||||
|  | ||||
| #define ARENA(flags, cap) arena_new((flags), (cap), __FILE__, __LINE__) | ||||
| #define ARENA_BACK(a, buf, len) arena_back((a), (buf), (len)) | ||||
| #define ARENA_ALLOC(flags, a, nbytes, align, count) \ | ||||
|     arena_alloc((flags), (a), (nbytes), (align), (count), __FILE__, __LINE__) | ||||
| #endif | ||||
							
								
								
									
										81
									
								
								include/except.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								include/except.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| #ifndef EXCEPT_INCLUDED | ||||
| #define EXCEPT_INCLUDED | ||||
|  | ||||
| #include <setjmp.h> | ||||
| #define UNUSED(x) (void)(x) | ||||
|  | ||||
| struct Exception { | ||||
| 	const char *reason; | ||||
| }; | ||||
| typedef struct Exception Exception; | ||||
|  | ||||
| struct ExceptFrame { | ||||
| 	struct ExceptFrame *prev;   // Exception Stack | ||||
| 	jmp_buf env;                // Enviroment Buffer | ||||
|     	const char *file;           // Exception File | ||||
| 	int line;                   // Exception Line | ||||
| 	const Exception *exception; // Exception Reason | ||||
| }; | ||||
| typedef struct ExceptFrame ExceptFrame; | ||||
|  | ||||
| // Exception States  | ||||
| enum { EXCEPT_ENTERED=0, EXCEPT_RAISED, EXCEPT_HANDLED, EXCEPT_FINALIZED}; | ||||
|  | ||||
| void except_raise(const Exception *e, const char *file,int line); // Raise exceptions | ||||
|  | ||||
| // External declarations  | ||||
| extern ExceptFrame *except_stack; // Global exception stack | ||||
| extern const Exception assert_failed; // Forward declaration for assert.  | ||||
| extern void asserted(int e); | ||||
|  | ||||
| #ifdef NDEBUG | ||||
| #define ASSERTED(e) ((void)0) | ||||
| #else | ||||
| #define ASSERTED(e) ((void)((e)||(RAISE(assert_failed),0))) | ||||
| #endif | ||||
|  | ||||
| // Raise an Exception. | ||||
| #define RAISE(e) except_raise(&(e), __FILE__, __LINE__) | ||||
|  | ||||
| // Reraise the currect exception. | ||||
| #define RERAISE except_raise(except_frame.exception, \ | ||||
| 	except_frame.file, except_frame.line) | ||||
|  | ||||
| // Switch to the previous exception frame and return. | ||||
| #define RETURN switch (except_stack = except_stack->prev,0) default: return | ||||
|  | ||||
| // Start a try block. | ||||
| #define TRY do { \ | ||||
| 	volatile int except_flag; \ | ||||
| 	ExceptFrame except_frame; \ | ||||
| 	except_frame.prev = except_stack; \ | ||||
| 	except_stack = &except_frame;  \ | ||||
| 	except_flag = setjmp(except_frame.env); \ | ||||
| 	if (except_flag == EXCEPT_ENTERED) { | ||||
|  | ||||
| // Handle specific example. | ||||
| #define EXCEPT(e) \ | ||||
| 		if (except_flag == EXCEPT_ENTERED) except_stack = except_stack->prev; \ | ||||
| 	} else if (except_frame.exception == &(e)) { \ | ||||
| 		except_flag = EXCEPT_HANDLED; | ||||
|  | ||||
| // Catch all other exceptions.         | ||||
| #define ELSE \ | ||||
| 		if (except_flag == EXCEPT_ENTERED) except_stack = except_stack->prev; \ | ||||
| 	} else { \ | ||||
| 		except_flag = EXCEPT_HANDLED; | ||||
|  | ||||
| // Execute finalization code.         | ||||
| #define FINALLY \ | ||||
| 		if (except_flag == EXCEPT_ENTERED) except_stack = except_stack->prev; \ | ||||
| 	} { \ | ||||
| 		if (except_flag == EXCEPT_ENTERED) \ | ||||
| 			except_flag = EXCEPT_FINALIZED; | ||||
|  | ||||
| // End Try block.          | ||||
| #define END_TRY \ | ||||
| 		if (except_flag == EXCEPT_ENTERED) except_stack = except_stack->prev; \ | ||||
| 		} if (except_flag == EXCEPT_RAISED) RERAISE; \ | ||||
| } while (0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										35
									
								
								include/mem.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								include/mem.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| #ifndef MEM_INCLUDED | ||||
| #define MEM_INCLUDED | ||||
|  | ||||
| #include "except.h" // Exceptions | ||||
| #include <stddef.h> // size_t | ||||
|  | ||||
| /* General Macros*/ | ||||
| #define MEM_KB(x) ((size_t)(x) * 1024ULL) | ||||
| #define MEM_MB(x) ((size_t)(x) * 1024ULL * 1024ULL) | ||||
| #define MEM_GB(x) ((size_t)(x) * 1024ULL * 1024ULL * 1024ULL) | ||||
| #define MEM_SIZE(x)    (ptrdiff_t)sizeof(x) | ||||
| #define MEM_COUNT(a)   (MEM_SIZE(a) / MEM_SIZE(*(a))) | ||||
| #define MEM_LEN(s)     (MEM_COUNT(s) - 1) | ||||
|  | ||||
| /* Default behavior is to throw exceptions and zero out memory*/ | ||||
| enum MemFlags { | ||||
|     NOZERO       = 1 << 0,  /* 0001 */ | ||||
|     SOFT_FAIL    = 1 << 1,  /* 0010 */ | ||||
|     HARD_FAIL    = 1 << 2,  /* 0100 */ | ||||
| }; | ||||
|  | ||||
| extern const Exception OOM; // Out of memory | ||||
|  | ||||
| extern void *mem_alloc (int flags, size_t nbytes, const char *file, int line); | ||||
| extern void mem_free(void *ptr, const char *file, int line); | ||||
| extern void *mem_resize(int flags, void *ptr, size_t nbytes, const char *file, int line); | ||||
| extern int mem_is_zero(const void *ptr, size_t nbytes); | ||||
|  | ||||
|  | ||||
| #define ALLOC(flags, nbytes)  mem_alloc((flags), (nbytes), __FILE__, __LINE__) | ||||
| #define FREE(ptr) ((void)(mem_free((ptr), __FILE__, __LINE__), (ptr) = 0)) | ||||
| #define RESIZE(flags, ptr, nbytes) 	((ptr) = mem_resize((flags), (ptr), \ | ||||
| 	(nbytes), __FILE__, __LINE__)) | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user