diff --git a/alloc.c b/alloc.c
index d6528bb6138a13b2265b362839d8a8eab7b9f0a7..e2af6b60dc108e4b98f913b581277909cad8247b 100644
--- a/alloc.c
+++ b/alloc.c
@@ -3,7 +3,6 @@
 #include <string.h>
 #include <limits.h>
 #include "alloc.h"
-#define align(n) (((n+3)/4)*4)
 meta *base;
 meta *last;
 
@@ -14,14 +13,14 @@ void *m_find(size_t size)
 
   meta *cur=base, *ans=0;
   size_t max=0, min=SIZE_T_MAX;
-  bool find=false;
+  int find=FALSE;
 
   do
   {
     switch(fit_type)
     {
       case FIRST_FIT:
-        if(cur->free && cur->size>=size) find=true;
+        if(cur->free && cur->size>=size) find=TRUE;
         break;
 
       case BEST_FIT:
@@ -48,31 +47,34 @@ void *m_find(size_t size)
   return !ans?ans:ans+1;
 }
 
-void *m_merge(meta *cur1, meta *cur2)
+meta *m_merge(meta *cur1, meta *cur2)
 {
   cur1->next=cur2->next;
   cur1->size+=(cur2->size+META_SIZE);
+  
+  if(cur2==last) last=cur1;
+  
   if(cur2->next && cur2->next->free)
     m_merge(cur1, cur2->next);
   else if(cur1->prev && cur1->prev->free)
-    cur1=(m_merge(cur1->prev, cur1)-META_SIZE);
-  return cur1+1;
+    cur1=m_merge(cur1->prev, cur1);
+  return cur1;
 }
 
-void *m_split(meta *cur, size_t size)
+meta *m_split(meta *cur, size_t size)
 {
-  if(cur->size<=size) return cur+1;
-
   size_t size_sum=size+META_SIZE;
+  if(cur->size<=size_sum) return cur;
+  
   meta *new_meta=(void *)cur+size_sum;
   new_meta->prev=cur;
   new_meta->next=cur->next;
-  new_meta->free=true;
+  new_meta->free=TRUE;
   new_meta->size=cur->size-size_sum;
 
   cur->size=size;
   cur->next=new_meta;
-  return cur+1;
+  return cur;
 }
 
 void *m_malloc(size_t size)
@@ -86,7 +88,7 @@ void *m_malloc(size_t size)
     //if(sbrk(0)==-1) return;
     base=sbrk(0);
     sbrk((int)size_sum);
-    base->free=true;
+    base->free=TRUE;
     base->size=size;
     last=base;
   }
@@ -101,7 +103,7 @@ void *m_malloc(size_t size)
     meta *result_meta=last;
     last=sbrk((int)size_sum);
     last->prev=result_meta;
-    last->free=true;
+    last->free=TRUE;
     last->size=size;
     result_meta->next=last;
     result=result_meta+1;
@@ -112,7 +114,7 @@ void *m_malloc(size_t size)
     else
       result=last+1;
   }
-  result=m_split(result-META_SIZE, size);
+  result=m_split(result-META_SIZE, size)+1;
   
   return result;
 }
@@ -124,7 +126,6 @@ void *m_realloc(void *ptr, size_t size)
   meta *cur_meta=cur-META_SIZE;
 
   if(cur_meta->size==size) return ptr;
-  //TODO: case when extra size is sufficient
   if(cur_meta->size>size)
     cur=m_split(cur_meta, size);
   else if(cur_meta->next && cur_meta->next->free && cur_meta->size+cur_meta->next->size+META_SIZE > size)
@@ -135,13 +136,13 @@ void *m_realloc(void *ptr, size_t size)
     if(cur_meta->size+META_SIZE > size)
       cur=m_split(cur_meta, size);
   }
-  //nothing to merge or split
+  //if nothing to merge or split
   else
   {
     cur=m_malloc(size);
     cur_meta=cur-META_SIZE;
     memcpy(cur, ptr, size);
-    cur_meta->free=false;
+    cur_meta->free=FALSE;
     m_free(ptr);
   }
   
@@ -153,7 +154,7 @@ void m_free(void *ptr)
   //if(!ptr) return 0;
 
   meta *cur=ptr-META_SIZE;
-  cur->free=true;
+  cur->free=TRUE;
   
   if(cur->prev && cur->prev->free)
     cur=m_merge(cur->prev,cur);
@@ -170,7 +171,6 @@ void m_free(void *ptr)
   //back to origin state if there are no blocks
   else if(!cur->prev && cur==last)
     base=last=NULL;
-  //return 1;
 }
 
 void *m_travel(int idx)
diff --git a/alloc.h b/alloc.h
index acba4047f19a05f25d3f7d1ac2fb52cfac946ed9..4cca6cd694fdefd2ee09574b618e637490ce9235 100644
--- a/alloc.h
+++ b/alloc.h
@@ -1,24 +1,26 @@
 #include <stdio.h>
-#include <stdbool.h>
 #ifndef _ALLOC_H_
 #define _ALLOC_H_
 #define FIRST_FIT 'F'
 #define BEST_FIT 'B'
 #define WORST_FIT 'W'
+#define TRUE 1
+#define FALSE 0
 #define META_SIZE sizeof(struct meta_struct)
+#define align(n) (((n+3)/4)*4)
 
 typedef struct meta_struct {
   struct meta_struct *prev;
   struct meta_struct *next;
-  bool free;
+  size_t free;
   size_t size;
 } meta;
 
 extern int fit_type;
 
+meta *m_merge(meta *cur1, meta *cur2);
+meta *m_split(meta *cur, size_t size);
 void *m_find(size_t size);
-void *m_merge(meta *cur1, meta *cur2);
-void *m_split(meta *cur, size_t size);
 void *m_malloc(size_t size);
 void *m_realloc(void *ptr, size_t size);
 void m_free(void *ptr);
diff --git a/main.c b/main.c
index 646319f2097ae46d238378875c98e9fd290b3d2e..6af0c1d6bf047b25adcf8bcd7011afaef65d001c 100644
--- a/main.c
+++ b/main.c
@@ -2,7 +2,6 @@
 #include <string.h>
 #include "alloc.h"
 #define BUF_MAX 1000
-#define FILE_PATH "test1.txt"
 #define STRING 's'
 #define FREE 'f'
 #define REALLOC 'r'
@@ -11,9 +10,15 @@ char buf[BUF_MAX+10];
 void *ptr;
 int fit_type;
 
-int main()
+int main(int argc, char *argv[])
 {
-  FILE *fp=fopen(FILE_PATH, "rt");
+  if(argc==1)
+  {
+    printf("Input file name\n");
+    return 0;
+  }
+  
+  FILE *fp=fopen(argv[1], "r");
   if(!fp)
   {
     printf("Cannot open file!\n");
@@ -32,12 +37,15 @@ int main()
       case STRING:
         fgets(buf, BUF_MAX, fp);
         size_alloc=strlen(buf);
-        buf[size_alloc-1]='\0';
+        
+        //organize format
+        if(buf[size_alloc-1]=='\n')
+          buf[size_alloc-1]='\0';
+        
         ptr=m_malloc(size_alloc);
         strcpy(ptr, buf);
         meta *tmp=ptr-META_SIZE;
-        tmp->free=false;
-        //(meta *)(ptr-META_SIZE)->free=false;
+        tmp->free=0;
         break;
 
       case FREE: