piscine-bsq/srcs/io.c

74 lines
1.7 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* io.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apago <apago@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/04/04 18:23:57 by apago #+# #+# */
/* Updated: 2023/04/04 18:24:50 by apago ### ########.fr */
/* */
/* ************************************************************************** */
#include "parsing.h"
void copy_bytes(char *dst, char *src, size_t bytes)
{
size_t i;
i = 0;
while (i < bytes)
{
dst[i] = src[i];
i++;
}
}
int push_bytes(size_t n_read, char **res, size_t *offset, size_t *size)
{
char *new_res;
if (n_read <= 0)
return (n_read);
*offset += n_read;
if (*offset == *size)
{
new_res = malloc(*size * 2);
if (!new_res)
return (-1);
copy_bytes(new_res, *res, *size);
free(*res);
*res = new_res;
*size *= 2;
}
return (n_read);
}
char *read_file(int file)
{
size_t size;
size_t offset;
size_t n_read;
char *res;
offset = 0;
size = 1024;
res = malloc(size);
if (!res)
return (0);
while (1)
{
n_read = read(file, &res[offset], size - offset);
n_read = push_bytes(n_read, &res, &offset, &size);
if (!n_read)
break ;
if (n_read < 0)
{
free(res);
return (0);
}
}
res[offset] = 0;
return (res);
}