SAlloc.c (1337B)
1 #include <stdlib.h> 2 #include <EGong/Util/SAlloc.h> 3 #include <EGong/Util/Log.h> 4 5 void SAlloc_init(struct SAlloc *salloc, size_t chunk){ 6 if(chunk==0){ 7 salloc->chunk_size=EGONG_SALLOC_DEFAULT_CHUNK; 8 } 9 else{ 10 salloc->chunk_size=chunk; 11 } 12 salloc->m_allocd=salloc->s_allocd=0; 13 salloc->data=NULL; 14 } 15 16 void *SAlloc_alloc(struct SAlloc *salloc, size_t size){ 17 salloc->s_allocd+=size; 18 while(salloc->s_allocd>salloc->m_allocd){ 19 salloc->m_allocd+=salloc->chunk_size; 20 } 21 salloc->data=realloc(salloc->data, salloc->chunk_size); 22 if(salloc->data==NULL){ 23 do_log("Couldn't allocate memory", LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR); 24 return NULL; 25 } 26 return (void *)((intptr_t)salloc->data+(intptr_t)(salloc->s_allocd-size)); 27 } 28 int SAlloc_rewind(struct SAlloc *salloc, size_t size){ 29 if(size>=salloc->m_allocd){ 30 do_log("Trying to rewind out of boundary", LOG_TYPE_NORMAL, LOG_LEVEL_WARNING); 31 SAlloc_destroy(salloc); 32 SAlloc_init(salloc, salloc->chunk_size); 33 } 34 salloc->s_allocd-=size; 35 while(salloc->s_allocd<salloc->m_allocd-salloc->chunk_size){ 36 salloc->m_allocd-=salloc->chunk_size; 37 } 38 salloc->data=realloc(salloc->data, salloc->chunk_size); 39 if(salloc->data==NULL){ 40 do_log("Couldn't allocate memory", LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR); 41 return -1; 42 } 43 return 0; 44 } 45 void *SAlloc_destroy(struct SAlloc *salloc){ 46 free(salloc->data); 47 }