minishell/src/buffer/buffer.c

107 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* buffer.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: kcolin <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/12 12:39:58 by kcolin #+# #+# */
/* Updated: 2025/04/09 17:26:24 by kcolin ### ########.fr */
/* */
/* ************************************************************************** */
#include "buffer.h"
#include "libft.h"
#include <stdlib.h>
t_buffer *ft_buffer_new(void)
{
t_buffer *out;
out = ft_calloc(1, sizeof(t_buffer));
if (out == NULL)
return (NULL);
out->length = 0;
out->capacity = SL_BUFFER_SIZE;
out->buffer = ft_calloc(SL_BUFFER_SIZE, sizeof(char));
if (out->buffer == NULL)
{
free(out);
return (NULL);
}
return (out);
}
void ft_buffer_free(t_buffer *buffer)
{
if (buffer != NULL)
free(buffer->buffer);
free(buffer);
}
/*
** grows the buffer such that the new capacity is 1.5 times the old.
**
** in case of error, free all memory and return null.
** else return buffer.
*/
t_buffer *ft_buffer_grow(t_buffer *buffer)
{
char *newbuffer;
if (buffer == NULL)
return (NULL);
newbuffer = ft_calloc(buffer->capacity * 1.5, sizeof(char));
if (newbuffer == NULL)
{
ft_buffer_free(buffer);
return (NULL);
}
ft_memcpy(newbuffer, buffer->buffer, buffer->length);
free(buffer->buffer);
buffer->buffer = newbuffer;
buffer->capacity *= 1.5;
return (buffer);
}
t_buffer *ft_buffer_pushchar(t_buffer *buffer, char c)
{
if (buffer == NULL)
return (NULL);
if (buffer->length + 1 < buffer->capacity)
{
buffer->buffer[buffer->length] = c;
buffer->length++;
}
else
{
buffer = ft_buffer_grow(buffer);
buffer = ft_buffer_pushchar(buffer, c);
}
return (buffer);
}
/*
** push buf to the end of buffer, growing buffer if needed.
**
** also adds an additional null byte to terminate the buffer.
**
** the number of bytes to copy to buffer is n.
** returns buffer.
** in case of error, all memory is freed and null is returned.
*/
t_buffer *ft_buffer_push_buf(t_buffer *buffer, char *buf, size_t n)
{
if (buffer == NULL)
return (NULL);
while (buffer->length + n + 1 > buffer->capacity)
{
buffer = ft_buffer_grow(buffer);
if (buffer == NULL)
return (NULL);
}
ft_memcpy(buffer->buffer + buffer->length, buf, n);
buffer->length += n;
buffer->buffer[buffer->length] = '\0';
return (buffer);
}