From 271fa895f40cd7ebf99e6924b3c036cc88cc2725 Mon Sep 17 00:00:00 2001 From: RaonSol <windows0903@gmail.com> Date: Fri, 15 Jun 2018 21:15:35 +0900 Subject: [PATCH] change input method and fix some bugs --- alloc.c | 38 +++++++++++++++++++------------------- alloc.h | 10 ++++++---- main.c | 20 ++++++++++++++------ 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/alloc.c b/alloc.c index d6528bb..e2af6b6 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 acba404..4cca6cd 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 646319f..6af0c1d 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: -- GitLab