All pastes #2071220 Raw Edit

Stuff

public c v1 · immutable
#2071220 ·published 2011-05-28 17:26 UTC
rendered paste body
#define NULL ((void *) 0)#define MEM_SIZE 16384#define size_t unsigned int#define MIN_USABLE 128#define MAGIC_START 16#define MAGIC_END 32typedef struct header {	struct header *next;	struct header *prev;	int magic_no;	size_t size;} header;char memory[MEM_SIZE]={0};header *root;int mem_init(void);void empty_mem(unsigned char *adr, size_t size);unsigned char *copy_header(unsigned char *src, unsigned char *dst);/* Code here */int main(void) {	return 0;}int mem_init(void) {	root = (void *) memory;	root->magic_no = MAGIC_START;	root->size = MEM_SIZE;	root->prev = NULL;	root->next = ((void *) memory + MEM_SIZE - sizeof(header));	root->next->magic_no = MAGIC_END;	root->next->next = NULL;	root->next->prev = root;	root->next->size = MEM_SIZE;}void *mem_alloc (size_t size, size_t *rsize) {	header *iter = root;	header *temp_header = NULL;		if (iter == NULL)		return NULL;	while(iter->size < size) {		iter=iter->next->next;		if(iter == NULL)			return NULL;	}		if(iter->size + 2 * sizeof(header) + MIN_USABLE < size) {		if(iter->prev != NULL && iter->next != NULL) {			iter->prev->next = iter->next->next;			iter->next->next->prev = iter->prev;		}		else if(iter->prev == NULL && iter->next->next == NULL) {			root=NULL;		}				else if(iter->prev == NULL && iter->next->next != NULL) {			root = iter->next->next;			root->prev = NULL;		}				else if(iter->prev != NULL && iter->next->next == NULL) {			iter->prev->next=NULL;		}		*rsize = iter->size;		empty_mem((unsigned char *) iter, iter->size);		return (void *) iter;	}	else {		temp_header = (header *) copy_header((unsigned char *) iter, (unsigned char *) ((unsigned char *) iter + size));			temp_header->size = iter->size - size;		iter->next->prev = temp_header;		iter->next->size = temp_header->size;		if(temp_header->prev == NULL)			root = temp_header;	}}mem_free(void *adr, size_t size) {	header *temp_header = NULL;	header *iter = NULL;	/* Prazni prostor i upiuje headere u taj prostor, ne postavlja prev i next za vanjske */	write_headers((unsigned char *) adr, size);	/* temp_header postaje header koji je lijevo od pocetka novo-oslobodjenog bloka */	temp_header = (header *) ((unsigned char *) adr - sizeof(header));	if(temp_header->magic_no == MAGIC_END) {		/* Ako je prosli blok slobodan, kopiramo taj header na lokaciju kraja novog bloka, povecavamo size i njemu i njegovom pocetnom headeru		 * dodijeljujemo isti (novi) size*/		temp_header = (header *) copy_header((unsigned char *) temp_header, (unsigned char *) ((unsigned char *) adr + size - sizeof(header)));		temp_header->size += size;		temp_header->prev->size = temp_header->size;	}	else {		/* Ako prijasnji blok nije slobodan, moramo ga povezat s zadnjim slobodnim blokom */		temp_header = (header *) adr;		iter = root;		/* Ako ne postoji slobodni blok, ovo postaje novi root blok */		if(iter == NULL) {			root = (header *) adr;		}		/* Ako postoji, iteriramo kroz slobodne blokove, dok ne nadjemo blok ciji sljedeci blok se nalazi na adresi vecoj od naseg trenutnog bloka		 * ili ako takav blok ne postoji */		else {			while(((unsigned int) iter->next < (unsigned int) adr) && iter->next != NULL)				iter=iter->next;		}		/* Od takvog bloka koji se nalazi na adresi vecoj od naseg bloka, kao prijasnji blok postavljamo header na kraju naseg bloka i nasem headeru		 * na kraju bloka postaljvamo sljedeci header kao pocetak tog novog */			temp_header->next->next = iter->next;			iter->next->prev = temp_header->next;		/* Kraju bloka prije naseg postavljamo nas blok kao sljedeci blok, a nasem bloku kao prethodni blok postavljamo kraj tog bloka */			iter->next = temp_header;			temp_header->prev = iter;		/* Pomicemo temp_header na kraj naseg bloka */			temp_header = temp_header->next;	}	temp_header = (header *) ((unsigned char *) temp_header + sizeof(header));	if(temp_header->magic_no == MAGIC_START) {		temp_header = (header *) copy_header ((unsigned char *) ((unsigned char *) temp_header - sizeof(header)), ((unsigned char *) temp_header + temp_header->size - sizeof(header)));void empty_mem(unsigned char *adr, size_t size) {	int i=0;	for(i=0; i<size; i++)		*(adr+i) = 0;}unsigned char *copy_header(unsigned char *src, unsigned char *dst) {	int i=0;	for(i=0; i<sizeof(header); i++)	 *(dst+i) = *(src+i);	return dst;}void write_headers(unsigned char *adr, size_t size) {	header *temp_header = NULL;	empty_mem(adr, size);	temp_header = (header *) adr;	temp_header->magic_no = MAGIC_START;	temp_header->size = size;	temp_header->next = (header *) (adr + size - sizeof(header));	temp_header->next->prev = temp_header;	temp_header->next->size = size;}