From 36358c9489cebd702cdf8152b14c017100caf2b8 Mon Sep 17 00:00:00 2001
From: kh06089 <kh06089@ajou.ac.kr>
Date: Sun, 17 Jun 2018 22:21:23 +0900
Subject: [PATCH] last submit_assignment4

---
 alloc.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 alloc.h |  10 ++++-
 main    | Bin 14972 -> 14984 bytes
 main.c  |  54 ++++++++++++++++++++++-
 4 files changed, 197 insertions(+), 2 deletions(-)

diff --git a/alloc.c b/alloc.c
index 931b9fd..8a2d385 100644
--- a/alloc.c
+++ b/alloc.c
@@ -1 +1,136 @@
 #include "alloc.h"
+#include <unistd.h>
+#include <memory.h>
+#include <stdio.h>
+
+void *m_malloc(size_t size);
+void m_free(void *ptr);
+void *m_realloc(void *ptr, size_t size);
+
+meta *meta1 = NULL;
+meta *meta2 = NULL;
+
+int mode = -1;
+
+void select_mode(char cr){
+	if(cr == 'F'){
+		mode = 1;	
+	}
+	else if(cr == 'B'){
+		mode = 2;	
+	}
+	else if(cr == 'W'){
+		mode = 3;	
+	}
+}
+
+meta *find_block(size_t size2){
+	meta *temp = meta1;
+	meta *block = NULL;
+	while(temp != 0){
+		if(temp->free != 0 && temp->size >= size2){
+			if(mode == 1){
+				return temp;			
+			}		
+			else if(mode == 2){
+				if(block == 0 || (block->size - size2 >	temp->size - size2)){
+					block = temp;
+				}
+			}
+			else if(mode == 3){
+				if(block == 0 || block->size < temp->size){
+					block = temp;				
+				}
+			}	
+		}
+		temp = temp->next;
+	}
+	return block;
+}
+
+void *m_malloc(size_t size){
+	if(mode ==-1||size <=0){
+		return NULL;		
+	}
+	if(meta1 == NULL){
+		meta1 = sbrk(size + sizeof(meta));
+		meta1->prev = NULL;
+		meta1->next = NULL;
+		meta1->free = 0;		
+		meta1->size = size;
+		meta2 = meta1;
+		return meta1 + sizeof(meta);	
+	}
+	meta *block = find_block(size);
+	if(block == 0){
+		block = sbrk(size + sizeof(meta));
+		block->prev = meta2;
+		block->next = NULL;
+		block->free = 0;
+		block->size = size;
+		meta2->next = block;
+		meta2 = block;
+		return block + sizeof(meta);	
+	}
+	block->free = 0;
+	if(block->size - size > sizeof(meta)){
+		block->size = size;
+		meta *block2 = block + sizeof(meta) + size;
+		block2->prev = block;
+		block2->next = block->next;
+		block2->free = 1;
+		block2->size = block->size - (size + sizeof(meta));
+		block->next = block2; 
+	}
+	return block + sizeof(meta);
+}
+
+void m_free(void *ptr){
+	meta *temp = (meta*)ptr - sizeof(meta);
+	temp->free = 1;
+	if(temp->prev !=0 && temp->prev->free !=0){				
+		temp->next->prev = temp->prev;		
+		temp->prev->next = temp->next;
+		temp->prev->size += temp->size;	
+		temp = temp->prev;	
+	}
+
+	if(temp->next !=0 && temp->next->free !=0){
+		temp->size += temp->next->size;
+		if(temp->next == meta2){
+			meta2 = temp;		
+		}	
+		temp->next = temp->next->next;
+		if(temp->next->next != 0){
+			temp->next->next->prev = temp;		
+		}
+	}
+	
+	while(meta2 !=0 && meta2->free !=0){
+		meta2 = meta2->prev;
+		if(meta2 !=0){
+			meta2->next = NULL;		
+		}	
+		else{
+			meta1 = NULL;		
+		}
+		
+		brk(meta2);
+	} 
+}
+
+void *m_realloc(void *ptr, size_t size){
+	meta *temp = (meta*)ptr - sizeof(meta);
+	if(temp->size >= size){
+		return ptr;	
+	}
+	void *new_ptr = m_malloc(size);
+	memcpy(new_ptr, ptr, temp->size);
+	m_free(ptr);
+	return new_ptr;
+}
+
+
+
+
+
diff --git a/alloc.h b/alloc.h
index 3245f55..628ebb2 100644
--- a/alloc.h
+++ b/alloc.h
@@ -1,8 +1,16 @@
 #ifndef _ALLOC_H_
 #define _ALLOC_H_
+#include <unistd.h>
 
 typedef struct meta_struct {
+	struct meta_struct *prev;
+	struct meta_struct *next;
+	int free;	
+	size_t size;
+	
+}meta;
 
-} meta;
+meta *meta1;
+meta *meta2;
 
 #endif
diff --git a/main b/main
index 46ac1c4e7ddb9537dcab3abadc4e6507ba893967..ea9c6baf6268190d1cc43e8ebbddbc30d50bc301 100755
GIT binary patch
delta 2290
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

delta 2290
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

diff --git a/main.c b/main.c
index b5fba06..9c28879 100644
--- a/main.c
+++ b/main.c
@@ -1,6 +1,58 @@
 #include "alloc.h"
+#include <string.h>
+#include <stdio.h>
+#include <memory.h>
+
+void *arr1[512];
+int temp;
+
 
 int main()
 {
-  return 0;
+	int num1;
+	int cr;
+	scanf("%d %c", &num1, &cr);
+	select_mode(cr);
+	while(num1 != -1){
+		char class;
+		scanf("%c", &class);
+		if(class == 's'){
+			char arr2[512] = {};
+			int num2 = 0;
+			while(1){
+				char cr2 = getchar();
+				if(cr2 == '\n'){
+					break;				
+				}
+				arr2[num2] = cr2;
+				num2++;			
+			}		
+			arr1[temp] = m_malloc(num2);
+			memcpy(arr1[temp], arr2,strlen(arr2));
+			temp++;
+		}
+		else if(class == 'f'){
+			int num2;
+			int num3;
+			scanf("%d %d", &num2, &num3);
+			arr1[num2] = m_realloc(arr1[num2], num3);
+		}
+		else if(class == 'r'){
+			int num3;
+			scanf("%d" , &num3);
+			arr1[temp] = m_malloc(num3);
+			temp++;	
+		}
+		num1--;	
+	}
+	
+	meta *temp2 = meta1;
+	while(temp2 !=0){
+		printf("%d %d" , temp2->free, temp2->size);
+		if(temp2->free == 0){
+			printf("%s\n", (char*)(temp2 + sizeof(meta)));		
+		}
+		temp2 = temp2->next;	
+	}	
+	return 0;
 }
-- 
GitLab