From 1e05635a00b545f163bc7aaeaf8aa1d37c63943d Mon Sep 17 00:00:00 2001 From: sinanmohd Date: Sat, 20 May 2023 19:02:23 +0530 Subject: 8.7: initial commit --- 8.7/Makefile | 12 ++++++ 8.7/main.c | 14 +++++++ 8.7/malloc.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 8.7/malloc.h | 5 +++ 4 files changed, 153 insertions(+) create mode 100644 8.7/Makefile create mode 100644 8.7/main.c create mode 100644 8.7/malloc.c create mode 100644 8.7/malloc.h diff --git a/8.7/Makefile b/8.7/Makefile new file mode 100644 index 0000000..1201253 --- /dev/null +++ b/8.7/Makefile @@ -0,0 +1,12 @@ +OBJECTS = main.o malloc.o +CC = gcc +CFLAGS = -Wvla -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -fsanitize=address + +main: $(OBJECTS) + $(CC) $(CFLAGS) -o main $(OBJECTS) + +main.o: malloc.h + +.PHONY: clean +clean: + rm -f main $(OBJECTS) diff --git a/8.7/main.c b/8.7/main.c new file mode 100644 index 0000000..e1cecb6 --- /dev/null +++ b/8.7/main.c @@ -0,0 +1,14 @@ +#include +#include +#include "malloc.h" + +int main(void) +{ + char *s = my_calloc(sizeof(char), 11); + + strcpy(s, "just werks"); + printf("%s\n", s); + my_free(s); + + return 0; +} diff --git a/8.7/malloc.c b/8.7/malloc.c new file mode 100644 index 0000000..1b7b345 --- /dev/null +++ b/8.7/malloc.c @@ -0,0 +1,122 @@ +#include +#include +#include "malloc.h" + +#define NALLOC 128 +#define MAX_BYTES (size_t) 8192 + +typedef long long Align; + +typedef union header { + struct { + union header *ptr; + size_t size; + } s; + + Align x; +} Header; + +static size_t maxalloc; +static Header base; +static Header *freep = NULL; + +static Header *my_morecore(size_t nunits); + +void *my_calloc(size_t n ,size_t size) +{ + char *p, *temp; + size_t nb; + + nb = n * size; + if ((p = temp = my_malloc(nb)) == NULL) + while (nb-- > 0) + *temp++ = '\0'; + + return p; +} + +void *my_malloc(size_t nbytes) +{ + Header *prevp, *p; + size_t nunits; + + if (nbytes > MAX_BYTES) { + fprintf(stderr, "alloc:can't allocate more than %lu bytes\n", + MAX_BYTES); + return NULL; + } + + if ((prevp = freep) == NULL) { + base.s.ptr = prevp = freep = &base; + base.s.size = 0; + } + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + for (p = freep->s.ptr; ; prevp = p, p = p->s.ptr) { + if (p->s.size >= nunits) { + if (p->s.size == nunits) { + prevp->s.ptr = p->s.ptr; + } else { + p->s.size -= nunits; + p += p->s.size; + p->s.size = nunits; + } + + freep = prevp; + return (void *)(p + 1); + } + + if (p == freep) + if ((p = my_morecore(nunits)) == NULL) + return NULL; + } + + return NULL; +} + +static Header *my_morecore(size_t nunits) +{ + Header *p; + + if (nunits < NALLOC) + nunits = NALLOC; + + if ((p = sbrk(nunits * sizeof(Header))) == (Header *) -1) + return NULL; + + if ((p->s.size = nunits) > maxalloc) + maxalloc = nunits; + + my_free (p + 1); + return freep; +} + +void my_free(void *ap) +{ + Header *bp, *p; + + bp = (Header *)ap - 1; + if (bp->s.size == 0 || bp->s.size > maxalloc) { + fprintf(stderr, "alloc: can't free %lu units", bp->s.size); + return; + } + for (p = freep; !(bp > p && bp < p->s.ptr) ; p = p->s.ptr) + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + + if (bp + bp->s.size == p->s.ptr) { + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + } else { + bp->s.ptr = p->s.ptr; + } + + if (p + p->s.size == bp) { + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + } else { + p->s.ptr = bp; + } + + freep = p; +} diff --git a/8.7/malloc.h b/8.7/malloc.h new file mode 100644 index 0000000..ca317fa --- /dev/null +++ b/8.7/malloc.h @@ -0,0 +1,5 @@ +#include + +void *my_malloc(size_t nbytes); +void *my_calloc(size_t n ,size_t size); +void my_free(void *ap); -- cgit v1.2.3