// C Source File // Created 03/15/2008 06:32:43 PM /* * By Lardmaster, * Feel free to use it for any purposes... I doubt it works at this point. * * Uses unsigned shorts as pointers for the linked list of free block, to save memory. Thus the max number of blocks is 65,535 * Simple fixed block sized memory allocator with free and allocate. * I hope it works :P. */ #include /* * The size of the header at the top of the allocated memory, an int for size, a short for first_free */ #define HEADER_SIZE sizeof(unsigned int)+sizeof(unsigned short) /* * block size, and the short pointer to the first free block */ typedef struct lardbuffer { unsigned int size; unsigned short first_free; } lardbuffer; /* * converts the within buffer(unsigned short) pointer to a system wide pointer */ void * conv_to_ptr(const lardbuffer *b, unsigned short ptr) { return (void*)(b+HEADER_SIZE+ptr*b->size); } /* * converts a systemwide pointer to somewhere inside the buffer into an unsigned short which points locally */ unsigned short conv_to_short(const lardbuffer *b, const void * ptr) { return ((unsigned int)(ptr-(void *)b)-HEADER_SIZE)/b->size; } /* * allocates the buffer with a system malloc call */ lardbuffer * initailize_buffer(unsigned int size, unsigned int maxelements) { int mallocsize=HEADER_SIZE+size*maxelements; lardbuffer * b= (lardbuffer*)(malloc(mallocsize)); b->size=size; b->first_free=0; for(unsigned short i=0; isize */ void * allocate(lardbuffer *b) { void * ptr=conv_to_ptr(b,b->first_free); b->first_free=*((unsigned short*)ptr); return ptr; } /* * a simple inline method to dereference the unsigned short pointers quickly. */ inline unsigned short deref(lardbuffer *b, unsigned short ptr) { return *((unsigned short *)conv_to_ptr(b,ptr)); } /* * frees the memory block pointer to by ptr, which must be in larbuffer b */ void free(lardbuffer *b, void * ptr) { unsigned short next=b->first_free; unsigned short after=deref(b,next); while(after!=0) { if(conv_to_ptr(after)>ptr) { *((unsigned short *)conv_to_ptr(next))=conv_to_short(ptr); *((unsigned short *)ptr)=after; break; } } }