Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void *pointer;
  6. void *move_to_end(void *ptr){
  7.     void *ptr_to_be_moved;
  8.     short int size=*(short int*)ptr;
  9.     ptr_to_be_moved=ptr;
  10.     ptr_to_be_moved=(char*)ptr_to_be_moved+size;
  11.     return ptr_to_be_moved;}
  12.  
  13. int invalid_pointer(void *ptr){
  14.     void *p,*end;
  15.     int res=0;
  16.     p=pointer;
  17.     end=move_to_end(end);
  18.     p=(short int*)p+1;
  19.     while(p!=end){
  20.         if(p==ptr)res=1;
  21.         p=(char *)p+*(short int*)p;
  22.     }
  23.     return res;
  24.  
  25. }
  26. void merge(void *ptr){
  27.     void *end_pointer;
  28.     short int shift,tmp,shift2;
  29.     ptr=pointer;
  30.     ptr=(short int*)ptr+1;
  31.    
  32.     end_pointer=move_to_end(pointer);
  33.     while(ptr!=end_pointer){
  34.     //  printf("mam hlavicku na adrese %p s hodnotou %d\n",ptr,(*(short int*)ptr));
  35.         shift=*(short int*)ptr;
  36.         shift2=*(short int*)((char*)ptr+shift+2);
  37.         if(shift%2==0 && shift2%2==0){
  38.     //      printf("JE MOZNE SPOJIT \n");
  39.             ptr=(char*)ptr+shift+2;
  40.             tmp=*(short int*)ptr;
  41.             ptr=(char*)ptr-shift-2;
  42.             *(short int*)ptr=shift+2+tmp;
  43.             shift=*(short int*)ptr;
  44.            
  45.         }
  46. //      else printf("neni co spojit \n");
  47.         if(shift%2==0)ptr=(char*)ptr+shift+2;
  48.         else ptr=(char*)ptr+shift+1;
  49.     }
  50.  
  51.     }
  52.  
  53.  
  54.  
  55.  
  56. void memory_init(void *ptr, unsigned int size){
  57.     pointer=ptr; //priradim na pointeru ukazovatel na prve "slovo"v pamati
  58.     (*(short int*)ptr)=size; //ulozim do neho vyhradenu velkost
  59.     ptr=(short int*)ptr+1;
  60.     (*(short int*)ptr)=size-4; //oznacim si dalsie nasledujuce slovo nulou
  61.    
  62. }
  63. void *memory_alloc(unsigned int size){
  64.    
  65.     void *temp_ptr;
  66.     void *end_ptr;
  67.     //bool even_odd=0;
  68.     short int temp_var,initial_size,msize_counter,swap,header_size;
  69.     end_ptr=pointer;
  70.     end_ptr=move_to_end(end_ptr);
  71.    
  72.     temp_ptr=pointer;
  73.     initial_size=(*(short int*)temp_ptr);       //ulozim si celkovy pocet
  74.     temp_ptr=(short int *)temp_ptr+1;           //posuniem sa dalej teraz ukazujem na prvu velkost v pamati ....
  75.    
  76.     while((temp_var=(*(short int*)temp_ptr))%2==1 || temp_var<size ){  
  77.             //  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);
  78.                 if(temp_var%2==0)temp_ptr=(char *)temp_ptr+temp_var+2;
  79.                 else temp_ptr=(char *)temp_ptr+temp_var+1;
  80.     }                                           //mam spravenu podmienku ze to prejde az kym nenajde first fit ked nenajde vrati null a koncime
  81.  
  82.     //printf("nasiel som volne miesto %d miest ",(*(short int*)temp_ptr));
  83.     //printf("%p ktore sa nachadza na adrese \n",(char*)temp_ptr);
  84.    
  85. //  if(((char*)temp_ptr+size)>end_ptr){printf("nedostatok miesta v pamati funkcia vracia NULL\n");return NULL;}
  86.         if(size%2!=0)size++;                    //zaukruhlim pokial pride neparne
  87.        
  88.        
  89.         if(size==temp_var){                 //pokial sa mi presne hodi do bloku len prepisem header
  90.             size++;
  91.             *(short int*)temp_ptr=size;         //porobim si novu hlavicku
  92.             temp_ptr=(short int *)temp_ptr+1;   //posuniem sa na prvy prok novo alokovanej pamate
  93.     //      printf("%p ktore sa nachadza na adrese \n",(char*)temp_ptr);
  94.     //      printf("%p a ktore konci na adrese \n",(char*)temp_ptr+size-1);
  95.             return temp_ptr;                    //vratim pointer na ten novy blok
  96.             }
  97.  
  98.         if(size<temp_var){                  //pokial mi presne nefitne do bloku
  99.             size++;                            
  100.             swap=*(short int*)temp_ptr;
  101.             *(short int*)temp_ptr=size;
  102.     //      printf("%p tu davam novu hlavicku\n",temp_ptr);
  103.             temp_ptr=(char*)temp_ptr+size+1;
  104.     //      printf("%p tu sa presuvam koli novej hlavicke\n",temp_ptr);//posuniem sa na to kde mam novy head zapisat
  105.             *(short int*)temp_ptr=swap-size-1;
  106.     //      printf(" ktora ukazuje na %p\n",(char*)temp_ptr+swap-size+1);
  107.             if((*(short int*)temp_ptr%2)==1) *(short int*)temp_ptr=*(short int*)temp_ptr-1;
  108.             temp_ptr=(char *)temp_ptr-size-1;
  109.             temp_ptr=(short int*)temp_ptr+1;
  110.         //  printf("%p tu sa presuvam na novo alokovanu pamat\n",temp_ptr);
  111.             return temp_ptr;
  112.             }
  113.  
  114.  
  115.                
  116.                    
  117.  
  118.        
  119.  
  120.     //}
  121.  
  122.    
  123.     return 0;
  124. }
  125. void memory_free(void *ptr){
  126.     int i_p;
  127.     i_p=invalid_pointer(ptr);
  128.     ptr=(short int*)ptr-1;
  129.     if(i_p==0){
  130.         printf("Invalid Pointer!\n");
  131.         exit(1);
  132.     }
  133. //      printf("povodna hodnota v hlavicke bola %d\n",(*(short int*)ptr));
  134.     (*(short int*)ptr)--;
  135. //  printf("menim hlavicku na adrese %p na hodnotu %d\n",ptr,(*(short int*)ptr));
  136.     merge(pointer);//oznacim header ako prazdny
  137.  
  138.  
  139.  
  140.  
  141.  
  142. }
  143.  
  144.  
  145.  
  146.  
  147.  
  148. int main (){
  149.     char region[50];
  150.      memory_init(region, 50);
  151.    
  152.      char* pointer=(char*)memory_alloc(10);
  153.    
  154.     if (pointer)
  155.     memset(pointer, 0, 10);
  156.     if (pointer)
  157.     memory_free(pointer);
  158.  
  159.     pointer=(char*)memory_alloc(10);
  160.     pointer=(char*)memory_alloc(15);
  161.  
  162.     if (pointer)
  163.     memset(pointer, 0, 15);
  164.     if (pointer)
  165.     memory_free(pointer);
  166.    
  167.    
  168.  
  169.  
  170.  
  171.  
  172. return 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement