Repository navigation
Expand file tree
/
Copy pathmalloc.c
More file actions
104 lines (84 loc) · 1.65 KB
/
Copy pathmalloc.c
File metadata and controls
104 lines (84 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "malloc.h"
void *glob = NULL;
t_block *call_space(size_t size)
{
t_block *tmp;
t_block *block;
block = sbrk(0);
block = sbrk(size + sizeof(t_block));
if (block == (void *) - 1)
return (NULL);
block->size = size;
block->next = NULL;
block->free = 0;
if (glob != NULL)
{
tmp = glob;
while (tmp->next)
{
tmp = tmp->next;
}
tmp->next = block;
}
else
glob = block;
return (block);
}
t_block *search_block(size_t size)
{
t_block *first;
first = glob;
while (first)
{
if(first->free && first->size >= size)
{
first->free = 0;
return(first);
}
first = first->next;
}
return (NULL);
}
void cut_block(t_block *free_one, size_t size)
{
t_block *other_block;
other_block = (void *)free_one + sizeof(t_block) + (sizeof(char) *size);
other_block->size = free_one->size - size - sizeof(t_block);
other_block->next = free_one->next;
other_block->free = 1;
free_one->size = (void *)other_block - (void *)free_one + sizeof(t_block);
free_one->next = other_block;
}
void *malloc(size_t size)
{
t_block *block;
if (size <= 0)
return (NULL);
if (glob != NULL)
{
block = search_block(size);
if (block && block->size > size)
cut_block(block, size);
else if (!block)
block = call_space(size);
}
else
block = call_space(size);
if (!block)
return (NULL);
return ((void *)block + sizeof(t_block));
}
void free(void *pointer)
{
t_block *block;
block = glob;
if (!pointer)
return ;
while (block && pointer != block)
{
block = block->next;
}
if (!block)
return ;
block->free = 1;
}