fela

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

util.c (1358B)


      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 #include <string.h>
      4 #include <unistd.h>
      5 #include <signal.h>
      6 
      7 #define allocztn(type, n) allocz(sizeof(type) * n) 
      8 #define alloczt(type) allocz(sizeof(type)) 
      9 
     10 typedef struct mctx {
     11 	int ptrc;
     12 	void **ptrs;
     13 } mctx;
     14 
     15 mctx *gctx;
     16 
     17 void *
     18 alloczctx(mctx *ctx, const size_t size) {
     19 	ctx->ptrs = realloc(ctx->ptrs, sizeof(void *) * (ctx->ptrc + 1));
     20 	ctx->ptrs[ctx->ptrc] = malloc(size);
     21 	memset(ctx->ptrs[ctx->ptrc], 0, size); 
     22 	return ctx->ptrs[ctx->ptrc++];
     23 }
     24 
     25 void *
     26 realloczctx(mctx *ctx, void *ptr, const size_t size) {
     27 	if (!ptr) 
     28 		return alloczctx(ctx, size);
     29 
     30 	for (int i = 0; i < ctx->ptrc; i++) {
     31 		if (ctx->ptrs[i] == ptr) {
     32 			ctx->ptrs[i] = realloc(ctx->ptrs[i], size);
     33 			memset(ctx->ptrs[i], 0, size);
     34 			return ctx->ptrs[i];
     35 		}
     36 	}
     37 	kill(getpid(), SIGSEGV);
     38 }
     39 
     40 void *
     41 reallocz(void *ptr, const size_t size) {
     42 	return realloczctx(gctx, ptr, size);
     43 }
     44 
     45 void *
     46 allocz(const size_t size) {
     47 	return alloczctx(gctx, size);
     48 }
     49 
     50 mctx *
     51 newctx() {
     52 	mctx *ctx = malloc(sizeof(mctx));
     53 	memset(ctx, 0, sizeof(mctx));
     54 	return ctx;
     55 }
     56 
     57 void
     58 freectx(mctx *ctx) {
     59 	for (int i = 0; i < ctx->ptrc; i++) 
     60 		free(ctx->ptrs[i]);
     61 	free(ctx->ptrs);
     62 	free(ctx);
     63 }
     64 
     65 char *
     66 strslice(char *s, int len) {
     67 	char *slice = allocz(len + 1);
     68 	memcpy(slice, s, len);
     69 	return slice;
     70 }
     71 
     72 /* TODO make this allocate to an arena that can be freed */