mirror of
https://codeberg.org/la-chouette/minishell.git
synced 2025-12-06 07:28:09 +01:00
107 lines
2.8 KiB
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);
|
|
}
|