Skip to content
Snippets Groups Projects
Commit 271fa895 authored by 강병수's avatar 강병수
Browse files

change input method and fix some bugs

parent 91a22009
Branches
No related tags found
No related merge requests found
......@@ -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)
......
#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);
......
......@@ -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);
//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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment