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;}