EX_03/level-1/broken_gnl/broken_gnl.c

98 lines
1.6 KiB
C

#include "broken_gnl.h"
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
char *ft_strchr(char *s, int c)
{
int i = 0;
while (s[i] && s[i] != c)
i++;
if (s[i] == c)
return (s + i);
else
return (NULL);
}
void *ft_memcpy(void *dest, const void *src, size_t n)
{
size_t i = 0;
while (i < n)
{
((char *)dest)[i] = ((char *)src)[i];
i++;
}
return (dest);
}
size_t ft_strlen(char *s)
{
if (!s)
return 0;
size_t ret = 0;
while (*s)
{
s++;
ret++;
}
return (ret);
}
int str_append_mem(char **s1, char *s2, size_t size2)
{
size_t size1 = ft_strlen(*s1);
char *tmp = malloc(size2 + size1 + 1);
if (!tmp)
return (0);
if (*s1)
ft_memcpy(tmp, *s1, size1);
ft_memcpy(tmp + size1, s2, size2);
tmp [size1 + size2] = 0;
free(*s1);
*s1 = tmp;
return (1);
}
int str_append_str(char **s1, char *s2)
{
return (str_append_mem(s1, s2, ft_strlen(s2)));
}
void *ft_memmove(void *dest, const void *src, size_t n)
{
if (dest == src)
return (dest);
return (ft_memcpy(dest, src, n));
}
char *get_next_line(int fd)
{
static char b[BUFFER_SIZE + 1] = "";
char *ret = NULL;
char *tmp = ft_strchr(b, '\n');
while (!tmp)
{
if (!str_append_str(&ret, b))
return (NULL);
int read_ret = read(fd, b, BUFFER_SIZE);
if (read_ret == -1 || read_ret == 0)
{
free(ret);
return (NULL);
}
b[read_ret] = 0;
tmp = ft_strchr(b, '\n');
}
if (!str_append_mem(&ret, b, tmp - b + 1))
{
free(ret);
return (NULL);
}
ft_memmove(b, tmp + 1, ft_strlen(tmp + 1) + 1);
return (ret);
}