my_free and my_malloc(ZT)

#include <stdio.h>
#include <memory.h>
#define HEAP_SIZE 200
#define PAGE_SIZE 68
#define SIZE_MASK 0x7fffffff
#define USED_MASK 0x80000000
#define LY_DBG(x) x
#pragma pack(1)
struct Page_Index{
Page_Index* pPre_Page_Index;
unsigned int ucBlock_Size;
};
#pragma pack()
void *my_malloc(size_t size);
void  my_free(void *memblock);
void output_bytes(unsigned int data_size,unsigned char *buf);
bool mem_init(unsigned char* mem_to_init,size_t mem_size_to_be_inited);
static unsigned char heap[HEAP_SIZE]={0};

void main(){
   unsigned char *p[10];
   int i;
   mem_init(heap,HEAP_SIZE);


   for(i=0;i<10;i++){
      p[i]=(unsigned char*)my_malloc(1);
      printf("p[%d]=%p/n",i,p[i]);
   }
   //output_bytes(HEAP_SIZE,heap);
   return;
}
void  my_free(void *memblock){
   unsigned char * s;
   unsigned char * r;
   unsigned char * q;
   unsigned char * p=(unsigned char *)memblock-sizeof(Page_Index);
   if(memblock==NULL||(!((((Page_Index*)p)->ucBlock_Size)&USED_MASK))  ){
      printf("Invalid arg of free./n");
      return;
   }
   (((Page_Index*)p)->ucBlock_Size)&=SIZE_MASK;
   q=p+((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index);

   if(((((Page_Index*)q)->ucBlock_Size)!=0))//((((Page_Index*)q)->ucBlock_Size)==0)  none to think;
   if(!((((Page_Index*)q)->ucBlock_Size)&USED_MASK)){//((((Page_Index*)q)->ucBlock_Size)&USED_MASK)==1  none to think;
      r=q+((((Page_Index*)q)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index);
      (((Page_Index*)p)->ucBlock_Size)=((((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index)+((((Page_Index*)q)->ucBlock_Size)&SIZE_MASK))&SIZE_MASK);
      (((Page_Index*)r)->pPre_Page_Index)=(Page_Index*)p;
   }
   else{
      s=(unsigned char*)(((Page_Index*)p)->pPre_Page_Index);
      if(s!=NULL){
      if(((((Page_Index*)s)->ucBlock_Size)!=0))
         if(!((((Page_Index*)s)->ucBlock_Size)&USED_MASK)){
            (((Page_Index*)q)->pPre_Page_Index)=(Page_Index*)s;
            //r=(unsigned char*)(((Page_Index*)s)->pPre_Page_Index);
            (((Page_Index*)s)->ucBlock_Size)+=(((Page_Index*)p)->ucBlock_Size)+sizeof(Page_Index);
            (((Page_Index*)s)->ucBlock_Size)&=SIZE_MASK;
         }
      }
   }
   else{
      s=(unsigned char*)(((Page_Index*)p)->pPre_Page_Index);
      if(s!=NULL){
         if(((((Page_Index*)s)->ucBlock_Size)!=0))
            if(!((((Page_Index*)s)->ucBlock_Size)&USED_MASK)){
            r=p+((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK);
            (((Page_Index*)r)->pPre_Page_Index)=(Page_Index*)s;
            (((Page_Index*)s)->ucBlock_Size)+=((((((Page_Index*)s)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index)+((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK))&SIZE_MASK);
         }
      }
   }
}

void *my_malloc(unsigned int size){
   Page_Index* pPage_Index=(Page_Index*)heap;
   unsigned char * p=(unsigned char *)pPage_Index;
   unsigned char * q;
   unsigned char * r;
   unsigned int next_page_size;
   Page_Index Temp_Page;
   if(size<=0||size>(HEAP_SIZE-sizeof(Page_Index)*2))
      return NULL;
   while(((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)!=0){
      r=p;
      if((!(((Page_Index*)p)->ucBlock_Size&USED_MASK))&&((((Page_Index*)p)->ucBlock_Size)>=size))
      {
         if((next_page_size=(((Page_Index*)p)->ucBlock_Size&SIZE_MASK)-size)>sizeof(Page_Index)){
            ((Page_Index*)p)->ucBlock_Size=size|USED_MASK;
            q=p+sizeof(Page_Index)+size;
            ((Page_Index*)q)->pPre_Page_Index=(Page_Index*)p;
            ((Page_Index*)q)->ucBlock_Size=(next_page_size-sizeof(Page_Index))&SIZE_MASK;
            p=q+sizeof(Page_Index)+((Page_Index*)q)->ucBlock_Size;
            ((Page_Index*)p)->pPre_Page_Index=(Page_Index*)q;
         }
         ((Page_Index*)r)->ucBlock_Size|=USED_MASK;
         return r+sizeof(Page_Index);
      }
      else
         p+=(((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index));
   }
   return NULL;
}
bool mem_init(unsigned char* mem_to_init,size_t mem_size_to_be_inited){
   Page_Index Temp_Page;

   Temp_Page.pPre_Page_Index=NULL;
   unsigned char *p=mem_to_init;
   if(mem_to_init==NULL){
      printf("Invalid heap pointer./n");
      return true;
   }
   if(mem_size_to_be_inited<2*sizeof(Page_Index)){
      printf("Invalid heap size./n");
      return true;
   }
   Temp_Page.ucBlock_Size=(mem_size_to_be_inited-2*sizeof(Page_Index))&SIZE_MASK;
   memcpy(p,&Temp_Page,sizeof(Page_Index));
   printf("mem_to_init=%p/n",mem_to_init);
   printf("p=%p/n",p);
   p+=(Temp_Page.ucBlock_Size+sizeof(Page_Index));
   printf("p=%p/n",p);
   Temp_Page.pPre_Page_Index=(Page_Index*)mem_to_init;
   Temp_Page.ucBlock_Size=0x00000000&SIZE_MASK;
   memcpy(p,&Temp_Page,sizeof(Page_Index));
   return false;
}
void output_bytes(unsigned int data_size,unsigned char *buf)
{
   int i;
   for (i = 0; i < data_size; i++) {
      LY_DBG(printf("%02X  ", buf[i]));
      if (((i+1) & 0x0000000F) == 0 && i != 0)
      LY_DBG(printf("/t%d/n", i+1));  
   }
   LY_DBG(printf("/n"));
}

你可能感兴趣的:(struct,null,include,output)