Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void *pointer;
- void *move_to_end(void *ptr){
- void *ptr_to_be_moved;
- short int size=*(short int*)ptr;
- ptr_to_be_moved=ptr;
- ptr_to_be_moved=(char*)ptr_to_be_moved+size;
- return ptr_to_be_moved;}
- int invalid_pointer(void *ptr){
- void *p,*end;
- int res=0;
- p=pointer;
- end=move_to_end(end);
- p=(short int*)p+1;
- while(p!=end){
- if(p==ptr)res=1;
- p=(char *)p+*(short int*)p;
- }
- return res;
- }
- void merge(void *ptr){
- void *end_pointer;
- short int shift,tmp,shift2;
- ptr=pointer;
- ptr=(short int*)ptr+1;
- end_pointer=move_to_end(pointer);
- while(ptr!=end_pointer){
- // printf("mam hlavicku na adrese %p s hodnotou %d\n",ptr,(*(short int*)ptr));
- shift=*(short int*)ptr;
- shift2=*(short int*)((char*)ptr+shift+2);
- if(shift%2==0 && shift2%2==0){
- // printf("JE MOZNE SPOJIT \n");
- ptr=(char*)ptr+shift+2;
- tmp=*(short int*)ptr;
- ptr=(char*)ptr-shift-2;
- *(short int*)ptr=shift+2+tmp;
- shift=*(short int*)ptr;
- }
- // else printf("neni co spojit \n");
- if(shift%2==0)ptr=(char*)ptr+shift+2;
- else ptr=(char*)ptr+shift+1;
- }
- }
- void memory_init(void *ptr, unsigned int size){
- pointer=ptr; //priradim na pointeru ukazovatel na prve "slovo"v pamati
- (*(short int*)ptr)=size; //ulozim do neho vyhradenu velkost
- ptr=(short int*)ptr+1;
- (*(short int*)ptr)=size-4; //oznacim si dalsie nasledujuce slovo nulou
- }
- void *memory_alloc(unsigned int size){
- void *temp_ptr;
- void *end_ptr;
- //bool even_odd=0;
- short int temp_var,initial_size,msize_counter,swap,header_size;
- end_ptr=pointer;
- end_ptr=move_to_end(end_ptr);
- temp_ptr=pointer;
- initial_size=(*(short int*)temp_ptr); //ulozim si celkovy pocet
- temp_ptr=(short int *)temp_ptr+1; //posuniem sa dalej teraz ukazujem na prvu velkost v pamati ....
- while((temp_var=(*(short int*)temp_ptr))%2==1 || temp_var<size ){
- // if((temp_var%2)!=0)printf("nasiel som plne s velkostou hlavicky %d na adrese %p hladam dalej\n",(*(short int*)temp_ptr),temp_ptr);
- if(temp_var%2==0)temp_ptr=(char *)temp_ptr+temp_var+2;
- else temp_ptr=(char *)temp_ptr+temp_var+1;
- } //mam spravenu podmienku ze to prejde az kym nenajde first fit ked nenajde vrati null a koncime
- //printf("nasiel som volne miesto %d miest ",(*(short int*)temp_ptr));
- //printf("%p ktore sa nachadza na adrese \n",(char*)temp_ptr);
- // if(((char*)temp_ptr+size)>end_ptr){printf("nedostatok miesta v pamati funkcia vracia NULL\n");return NULL;}
- if(size%2!=0)size++; //zaukruhlim pokial pride neparne
- if(size==temp_var){ //pokial sa mi presne hodi do bloku len prepisem header
- size++;
- *(short int*)temp_ptr=size; //porobim si novu hlavicku
- temp_ptr=(short int *)temp_ptr+1; //posuniem sa na prvy prok novo alokovanej pamate
- // printf("%p ktore sa nachadza na adrese \n",(char*)temp_ptr);
- // printf("%p a ktore konci na adrese \n",(char*)temp_ptr+size-1);
- return temp_ptr; //vratim pointer na ten novy blok
- }
- if(size<temp_var){ //pokial mi presne nefitne do bloku
- size++;
- swap=*(short int*)temp_ptr;
- *(short int*)temp_ptr=size;
- // printf("%p tu davam novu hlavicku\n",temp_ptr);
- temp_ptr=(char*)temp_ptr+size+1;
- // printf("%p tu sa presuvam koli novej hlavicke\n",temp_ptr);//posuniem sa na to kde mam novy head zapisat
- *(short int*)temp_ptr=swap-size-1;
- // printf(" ktora ukazuje na %p\n",(char*)temp_ptr+swap-size+1);
- if((*(short int*)temp_ptr%2)==1) *(short int*)temp_ptr=*(short int*)temp_ptr-1;
- temp_ptr=(char *)temp_ptr-size-1;
- temp_ptr=(short int*)temp_ptr+1;
- // printf("%p tu sa presuvam na novo alokovanu pamat\n",temp_ptr);
- return temp_ptr;
- }
- //}
- return 0;
- }
- void memory_free(void *ptr){
- int i_p;
- i_p=invalid_pointer(ptr);
- ptr=(short int*)ptr-1;
- if(i_p==0){
- printf("Invalid Pointer!\n");
- exit(1);
- }
- // printf("povodna hodnota v hlavicke bola %d\n",(*(short int*)ptr));
- (*(short int*)ptr)--;
- // printf("menim hlavicku na adrese %p na hodnotu %d\n",ptr,(*(short int*)ptr));
- merge(pointer);//oznacim header ako prazdny
- }
- int main (){
- char region[50];
- memory_init(region, 50);
- char* pointer=(char*)memory_alloc(10);
- if (pointer)
- memset(pointer, 0, 10);
- if (pointer)
- memory_free(pointer);
- pointer=(char*)memory_alloc(10);
- pointer=(char*)memory_alloc(15);
- if (pointer)
- memset(pointer, 0, 15);
- if (pointer)
- memory_free(pointer);
- return 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement