From 20c5817bbc8ac9fcf59d0df2135fc91336b3c74d Mon Sep 17 00:00:00 2001 From: Axy Date: Sat, 1 Nov 2025 20:56:52 +0100 Subject: [PATCH] Format and bonuses --- get_next_line.c | 113 ++++-------------------------- get_next_line.h | 21 +++++- get_next_line_bonus.c | 135 ++++++++++++++++++++++++++++++++++++ get_next_line_bonus.h | 39 +++++++++++ get_next_line_utils.c | 96 +++++++++++++++++++++++++ get_next_line_utils_bonus.c | 96 +++++++++++++++++++++++++ 6 files changed, 399 insertions(+), 101 deletions(-) create mode 100644 get_next_line_bonus.c create mode 100644 get_next_line_bonus.h create mode 100644 get_next_line_utils.c create mode 100644 get_next_line_utils_bonus.c diff --git a/get_next_line.c b/get_next_line.c index 90f6879..b9d8886 100644 --- a/get_next_line.c +++ b/get_next_line.c @@ -6,111 +6,18 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/01 10:55:35 by agilliar #+# #+# */ -/* Updated: 2025/11/01 16:36:45 by agilliar ### ########.fr */ +/* Updated: 2025/11/01 20:55:35 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include #include -#include +#include "get_next_line.h" -typedef struct s_buf -{ - size_t len; - size_t capacity; - size_t search_offset; - char *buf; -} t_buf; - -typedef struct s_list -{ - int fd; - t_buf buf; - struct s_list *next; -} t_list; - -#define BUFFER_SIZE 256 - -/* - not restrict, therefor it is safe to use it on overlapping memory regions so - long as the destination is before the source -*/ -void *ft_memcpy(void *dest, const void *src, size_t n) -{ - size_t i; - - i = 0; - while (i < n) - { - ((unsigned char *)dest)[i] = ((unsigned char *)src)[i]; - i++; - } - return (dest); -} - -/* - returns false when an allocation error occured -*/ -bool buffer_reserve(t_buf *buf, size_t extra) -{ - size_t new_capacity; - char *new_buf; - - if (buf->len + extra <= buf->capacity) - return (true); - new_capacity = buf->len + extra; - if (new_capacity < buf->capacity * 2) - new_capacity = buf->capacity * 2; - new_buf = malloc(new_capacity); - if (!new_buf) - return (false); - ft_memcpy(new_buf, buf->buf, buf->len); - free(buf->buf); - buf->buf = new_buf; - buf->capacity = new_capacity; - return (true); -} - -bool buffer_read(t_buf *buf, int fd) -{ - char read_buf[BUFFER_SIZE]; - ssize_t res; - - res = read(fd, read_buf, BUFFER_SIZE); - if (res < 1 || !buffer_reserve(buf, res)) - return (false); - ft_memcpy(&buf->buf[buf->len], read_buf, res); - buf->len += res; - return (true); -} - -/* - returns false when an allocation error occured -*/ -bool buffer_shrink_near_fit(t_buf *buf) -{ - char *new_buf; - - if (buf->capacity <= buf->len * 2 + BUFFER_SIZE) - return (true); - new_buf = malloc(buf->len * 2); - if (!new_buf) - return (false); - ft_memcpy(new_buf, buf->buf, buf->len); - free(buf->buf); - buf->buf = new_buf; - buf->capacity = buf->len * 2; - return (true); -} - -bool buffer_search(t_buf *buf) -{ - while (buf->search_offset < buf->len) - if (buf->buf[buf->search_offset++] == '\n') - return (true); - return (false); -} +void *ft_memcpy(void *dest, const void *src, size_t n); +bool buffer_shrink_near_fit(t_buf *buf); +bool buffer_search(t_buf *buf); +bool buffer_read(t_buf *buf, int fd); t_buf *buffers_get(t_list **buffers, int fd) { @@ -126,7 +33,7 @@ t_buf *buffers_get(t_list **buffers, int fd) (*buffers)->buf.len = 0; (*buffers)->buf.capacity = 0; (*buffers)->buf.search_offset = 0; - (*buffers)->buf.buf = malloc(0); + (*buffers)->buf.buf = NULL; return (&(*buffers)->buf); } @@ -216,7 +123,13 @@ int main(int argc, char **argv) continue; any_line = true; printf("line %i file %i: %s", i, j, nl); + free(nl); } } + for (char *nl; (nl = get_next_line(0));) + { + printf("stdin: %s", nl); + free(nl); + } } */ diff --git a/get_next_line.h b/get_next_line.h index 5b88a19..14eb657 100644 --- a/get_next_line.h +++ b/get_next_line.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/01 10:38:19 by agilliar #+# #+# */ -/* Updated: 2025/11/01 13:17:10 by agilliar ### ########.fr */ +/* Updated: 2025/11/01 20:52:08 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,25 @@ # include +typedef struct s_buf +{ + size_t len; + size_t capacity; + size_t search_offset; + char *buf; +} t_buf; + +typedef struct s_list +{ + int fd; + t_buf buf; + struct s_list *next; +} t_list; + +# ifndef BUFFER_SIZE +# define BUFFER_SIZE 256 +# endif + char *get_next_line(int fd); #endif diff --git a/get_next_line_bonus.c b/get_next_line_bonus.c new file mode 100644 index 0000000..bfd9e7b --- /dev/null +++ b/get_next_line_bonus.c @@ -0,0 +1,135 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/01 10:55:35 by agilliar #+# #+# */ +/* Updated: 2025/11/01 20:56:35 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include "get_next_line.h" + +void *ft_memcpy(void *dest, const void *src, size_t n); +bool buffer_shrink_near_fit(t_buf *buf); +bool buffer_search(t_buf *buf); +bool buffer_read(t_buf *buf, int fd); + +t_buf *buffers_get(t_list **buffers, int fd) +{ + while (*buffers && (*buffers)->fd != fd) + buffers = &(*buffers)->next; + if (*buffers) + return (&(*buffers)->buf); + (*buffers) = malloc(sizeof(t_list)); + if (!*buffers) + return (NULL); + (*buffers)->next = NULL; + (*buffers)->fd = fd; + (*buffers)->buf.len = 0; + (*buffers)->buf.capacity = 0; + (*buffers)->buf.search_offset = 0; + (*buffers)->buf.buf = NULL; + return (&(*buffers)->buf); +} + +void *buffers_del(t_list **buffers, int fd) +{ + t_list *next; + + while (*buffers && (*buffers)->fd != fd) + buffers = &(*buffers)->next; + if (!*buffers) + return (NULL); + free((*buffers)->buf.buf); + next = (*buffers)->next; + free(*buffers); + *buffers = next; + return (NULL); +} + +char *ft_substr(const char *src, size_t len) +{ + char *res; + + res = malloc(len + 1); + if (!res) + return (res); + ft_memcpy(res, src, len); + res[len] = '\0'; + return (res); +} + +char *buffer_gnl(t_buf *buf, t_list **buffers, int fd) +{ + char *res; + + res = ft_substr(buf->buf, buf->search_offset); + if (!res) + return (buffers_del(buffers, fd)); + buf->len -= buf->search_offset; + ft_memcpy(buf->buf, &buf->buf[buf->search_offset], buf->len); + buf->search_offset = 0; + buffer_shrink_near_fit(buf); + return (res); +} + +char *get_next_line(int fd) +{ + static t_list *buffers = NULL; + t_buf *buf; + char *res; + + buf = buffers_get(&buffers, fd); + if (!buf) + return (NULL); + while (buf->len != buf->search_offset || buffer_read(buf, fd)) + { + if (buf->search_offset == buf->len) + { + res = ft_substr(buf->buf, buf->len); + buffers_del(&buffers, fd); + return (res); + } + if (buffer_search(buf)) + return (buffer_gnl(buf, &buffers, fd)); + } + return (buffers_del(&buffers, fd)); +} + +/* +#include +#include + +int main(int argc, char **argv) +{ + char *nl; + bool any_line; + + for (int i = 1; i < argc; i++) + ((int *)argv)[i] = open(argv[i], O_RDONLY); + any_line = true; + for (int i = 0; any_line; i++) + { + any_line = false; + for (int j = 1; j < argc; j++) + { + nl = get_next_line(((int *)argv)[j]); + if (!nl) + continue; + any_line = true; + printf("line %i file %i: %s", i, j, nl); + free(nl); + } + } + for (char *nl; (nl = get_next_line(0));) + { + printf("stdin: %s", nl); + free(nl); + } +} +*/ diff --git a/get_next_line_bonus.h b/get_next_line_bonus.h new file mode 100644 index 0000000..6d29c17 --- /dev/null +++ b/get_next_line_bonus.h @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_bonus.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/01 10:38:19 by agilliar #+# #+# */ +/* Updated: 2025/11/01 20:56:39 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H + +# include + +typedef struct s_buf +{ + size_t len; + size_t capacity; + size_t search_offset; + char *buf; +} t_buf; + +typedef struct s_list +{ + int fd; + t_buf buf; + struct s_list *next; +} t_list; + +# ifndef BUFFER_SIZE +# define BUFFER_SIZE 256 +# endif + +char *get_next_line(int fd); + +#endif diff --git a/get_next_line_utils.c b/get_next_line_utils.c new file mode 100644 index 0000000..a7a215c --- /dev/null +++ b/get_next_line_utils.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/01 20:47:32 by agilliar #+# #+# */ +/* Updated: 2025/11/01 20:52:30 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include "get_next_line.h" + +/* + not restrict, therefor it is safe to use it on overlapping memory regions so + long as the destination is before the source +*/ +void *ft_memcpy(void *dest, const void *src, size_t n) +{ + size_t i; + + i = 0; + while (i < n) + { + ((unsigned char *)dest)[i] = ((unsigned char *)src)[i]; + i++; + } + return (dest); +} + +/* + returns false when an allocation error occured +*/ +bool buffer_reserve(t_buf *buf, size_t extra) +{ + size_t new_capacity; + char *new_buf; + + if (buf->len + extra <= buf->capacity) + return (true); + new_capacity = buf->len + extra; + if (new_capacity < buf->capacity * 2) + new_capacity = buf->capacity * 2; + new_buf = malloc(new_capacity); + if (!new_buf) + return (false); + ft_memcpy(new_buf, buf->buf, buf->len); + free(buf->buf); + buf->buf = new_buf; + buf->capacity = new_capacity; + return (true); +} + +bool buffer_read(t_buf *buf, int fd) +{ + char read_buf[BUFFER_SIZE]; + ssize_t res; + + res = read(fd, read_buf, BUFFER_SIZE); + if (res < 1 || !buffer_reserve(buf, res)) + return (false); + ft_memcpy(&buf->buf[buf->len], read_buf, res); + buf->len += res; + return (true); +} + +/* + returns false when an allocation error occured +*/ +bool buffer_shrink_near_fit(t_buf *buf) +{ + char *new_buf; + + if (buf->capacity <= buf->len * 2 + BUFFER_SIZE) + return (true); + new_buf = malloc(buf->len * 2); + if (!new_buf) + return (false); + ft_memcpy(new_buf, buf->buf, buf->len); + free(buf->buf); + buf->buf = new_buf; + buf->capacity = buf->len * 2; + return (true); +} + +bool buffer_search(t_buf *buf) +{ + while (buf->search_offset < buf->len) + if (buf->buf[buf->search_offset++] == '\n') + return (true); + return (false); +} diff --git a/get_next_line_utils_bonus.c b/get_next_line_utils_bonus.c new file mode 100644 index 0000000..7231448 --- /dev/null +++ b/get_next_line_utils_bonus.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/01 20:47:32 by agilliar #+# #+# */ +/* Updated: 2025/11/01 20:56:41 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include "get_next_line.h" + +/* + not restrict, therefor it is safe to use it on overlapping memory regions so + long as the destination is before the source +*/ +void *ft_memcpy(void *dest, const void *src, size_t n) +{ + size_t i; + + i = 0; + while (i < n) + { + ((unsigned char *)dest)[i] = ((unsigned char *)src)[i]; + i++; + } + return (dest); +} + +/* + returns false when an allocation error occured +*/ +bool buffer_reserve(t_buf *buf, size_t extra) +{ + size_t new_capacity; + char *new_buf; + + if (buf->len + extra <= buf->capacity) + return (true); + new_capacity = buf->len + extra; + if (new_capacity < buf->capacity * 2) + new_capacity = buf->capacity * 2; + new_buf = malloc(new_capacity); + if (!new_buf) + return (false); + ft_memcpy(new_buf, buf->buf, buf->len); + free(buf->buf); + buf->buf = new_buf; + buf->capacity = new_capacity; + return (true); +} + +bool buffer_read(t_buf *buf, int fd) +{ + char read_buf[BUFFER_SIZE]; + ssize_t res; + + res = read(fd, read_buf, BUFFER_SIZE); + if (res < 1 || !buffer_reserve(buf, res)) + return (false); + ft_memcpy(&buf->buf[buf->len], read_buf, res); + buf->len += res; + return (true); +} + +/* + returns false when an allocation error occured +*/ +bool buffer_shrink_near_fit(t_buf *buf) +{ + char *new_buf; + + if (buf->capacity <= buf->len * 2 + BUFFER_SIZE) + return (true); + new_buf = malloc(buf->len * 2); + if (!new_buf) + return (false); + ft_memcpy(new_buf, buf->buf, buf->len); + free(buf->buf); + buf->buf = new_buf; + buf->capacity = buf->len * 2; + return (true); +} + +bool buffer_search(t_buf *buf) +{ + while (buf->search_offset < buf->len) + if (buf->buf[buf->search_offset++] == '\n') + return (true); + return (false); +} -- 2.51.0