Skip to content
Snippets Groups Projects
Commit 38fc25af authored by kwanju's avatar kwanju
Browse files

input.txt 구동 성공, input2.txt 에러

parent 78eb4ef5
No related branches found
No related tags found
No related merge requests found
...@@ -3,9 +3,8 @@ ...@@ -3,9 +3,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#define MSIZE sizeof(meta)-4 #define MSIZE 16
void* total = 0;
void* base = 0; void* base = 0;
void* end = 0; void* end = 0;
void* cur = 0; void* cur = 0;
...@@ -56,32 +55,41 @@ meta* search(void* ptr, size_t size){//current pointer ...@@ -56,32 +55,41 @@ meta* search(void* ptr, size_t size){//current pointer
void *m_malloc(size_t size){ void *m_malloc(size_t size){
if(base == 0){ if(base == 0){
end = cur = total = base = sbrk(0); //sbrk 주소반환 end = cur = base = sbrk(0); //sbrk 주소반환
} }
if((size%4) != 0) if((size%4) != 0)
size = (size/4+1)*4; size = (size/4+1)*4;
// printf("m1\n");
meta* target = search(total, size); //find chunk meta* target = search(end, size); //find chunk
//printf("m2\n");
if(target == 0){ if(target == 0 || (!target->next && target->size < size)){
meta* new = total; meta* new = end;
meta* now = cur; meta* now = cur;
//printf("m3\n");
sbrk(end+size+MSIZE);
// printf("m4\n");
sbrk(total + size + MSIZE); //printf("m4.1\n");
now->next = new; if(end == cur)
new->prev = now;
if(total = cur)
new->prev = 0; new->prev = 0;
else{
// printf("m4.2\n");
now->next = new;
new->prev = cur;
}
new->next = 0; new->next = 0;
new->free = 0; new->free = 0;
// printf("m5\n");
new->size = size; new->size = size;
// printf("m5.1\n");
// if(target != -1) target->next = new;
cur = new; cur = new;
//printf("m6\n");
total = total + size + MSIZE; end = end + size + MSIZE;
return new->data; return new->data;
}else{ }else{
//printf("m4\n");
m_realloc(target->data, size); m_realloc(target->data, size);
} }
return target->data; return target->data;
...@@ -91,51 +99,65 @@ void m_free(void* ptr){ ...@@ -91,51 +99,65 @@ void m_free(void* ptr){
meta* target; meta* target;
target = ptr - MSIZE; target = ptr - MSIZE;
target->free = 1; target->free = 1;
//printf("free error\n");
if(target->prev != NULL){ if(target->prev != -1){
if(target->prev->free == 1){ //이전이 비어있으면 합침 if(target->prev->free == 1){ //이전이 비어있으면 합침
target->prev->size = target->prev->size + target->size + MSIZE; target->prev->size = target->prev->size + target->size + MSIZE;
target->prev->next = target->next; target->prev->next = target->next;
target->next->prev = target->prev; target->next->prev = target->prev;
} }
if(target->next == NULL) //prev는 있지만 next가 없을때 if(!target->next) //prev는 있지만 next가 없을때
end = end - target->size + MSIZE;
target->prev->next = NULL; target->prev->next = NULL;
} }
if(target->next != NULL){ //next가 있을때 if(target->next != -1){ //next가 있을때
if(target->next->free == 1){ //다음이 비어있으면 합침 if(target->next->free == 1){ //다음이 비어있으면 합침
target->next->size = target->next->size + target->size + MSIZE; target->next->size = target->next->size + target->size + MSIZE;
target->next->prev = target->prev; target->next->prev = target->prev;
target->prev->next = target->next; target->prev->next = target->next;
} }
} }
if(!target->next && !target->prev)//둘다 없을때
end = brk(base);
} }
void* m_realloc(void* ptr, size_t size){ void* m_realloc(void* ptr, size_t size){
meta* old = ptr - MSIZE; //meta 제외 사이 meta* old = ptr - MSIZE; //meta 제외 사이
// printf("re1\n");
if(size%4 != 0){ if(size%4 != 0){
size = (size/4 + 1)*4; //4배수 맞추기 size = (size/4 + 1)*4; //4배수 맞추기
} }
// printf("re1-1, %d\n", old->size);
if(old->size == size) return ptr; if(old->size == size){
if(old->next != NULL){ //printf("re1.2\n");
return ptr;
}
// printf("re1.3\n");
if(old->next){
// printf("re2\n");
if(old->next->free == 1){ if(old->next->free == 1){
// printf("re3\n");
old->size = old->size + old->next->size + MSIZE; old->size = old->size + old->next->size + MSIZE;
old->next = old->next->next; old->next = old->next->next;
old->next->prev = old; old->next->prev = old;
// printf("re4\n");
} }
} }
else if(old->size < size){ else if(old->size < size){
// printf("re5\n");
old->free = 1; old->free = 1;
meta* new = m_malloc(size); meta* new = m_malloc(size);
memcpy(new, ptr, size); strcpy(new, ptr);
//printf("re6\n");
return new; return new;
} }
else if(old->size < size + MSIZE){ else if(old->size < size + MSIZE){
// printf("re7\n");
return ptr; return ptr;
} }
else{ else{
meta* new = old + size + MSIZE; // printf("re8\n");
meta* new = (int)old + size + MSIZE;
new->free = 1; new->free = 1;
new->next = old->next; new->next = old->next;
...@@ -150,3 +172,14 @@ void* m_realloc(void* ptr, size_t size){ ...@@ -150,3 +172,14 @@ void* m_realloc(void* ptr, size_t size){
return old->data; return old->data;
} }
} }
void print_all(){
meta* start = base;
while(start){
printf("%d %d ", start->free, start->size);
if(start->free != 1)
printf("%s", start->data);
printf("\n");
start = start->next;
}
}
...@@ -2,10 +2,97 @@ ...@@ -2,10 +2,97 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <string.h>
extern int fit; extern int fit;
char *tok;
int main()
int main(int argc, char *argv[])
{ {
if(argc != 2){ //인자 에러체크
printf("input error argc: %d\n", argc);
exit(1);
}
FILE *file;
char buffer[1024];
char *tok;
if(!(file = fopen(argv[1], "r"))){//file open & error check
printf("file open error\n");
exit(1);
}fgets(buffer, sizeof(buffer), file);
// printf("11111\n");
tok = strtok(buffer, " ");
int buf_num = atoi(buffer); //숫자 문자열->정수형, 개수
if(!buf_num){
printf("buf error\n");
exit(1);
}
tok = strtok(NULL, " "); //FIT 0 1 2(first best worst)
if(tok[0] == 'F'){
fit = 0; //first
}
else if(tok[0] == 'B'){
fit = 1; //best
}
else if(tok[0] == 'W'){
fit = 2; //worst
}
else{
printf("fit type error\n");
exit(1);
}
// printf("2222\n");
//-----------------------------------------------------------//
char **words = (char**)malloc(sizeof(char*)*buf_num);
int j = 0;
int length;
int index;
int num;
char* tmp;
for(int i = 0; i < buf_num; i++){//buf_num만큼 반복작업
// printf("3333\n");
memset(buffer, " ", sizeof(buffer)); //memset
fgets(buffer, sizeof(buffer), file);
// printf("4444\n");
if((tmp = strchr(buffer, '\n')) != NULL)
*tmp = '\0';//문자열 맨뒤의 \n 제거
if(buffer[0] == 's'){//string
// printf("s\n");
length = strlen(buffer+2);
words[j] = m_malloc(length+1);
strcpy(words[j++], buffer+2);
}
else if(buffer[0] == 'f'){//free
m_free(words[atoi(buffer+2)/*index*/]);
}
else if(buffer[0] == 'r'){//realloc
printf("r\n");
tok = strtok(buffer+2, " ");//쪼개고
index = atoi(tok); //n번째
tok = strtok(NULL, " ");
length = atoi(tok); //m byte만큼 할당
// printf("%d, %d\n", index, length);
m_realloc(buffer[index], length);
}
else if(buffer[0] == 'e'){//e = allocate mem sapce
buffer[j++] = m_malloc(atoi(buffer+2)/*index*/);
}else{//error check
printf("error!\n");
exit(1);
}
}
//---------------------------------------------------------------//
//printf("asdad\n");
print_all();
return 0; return 0;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment