diff --git a/get_next_line.c b/get_next_line.c index 92ad58e..9a3517d 100644 --- a/get_next_line.c +++ b/get_next_line.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/23 20:32:46 by kcolin #+# #+# */ -/* Updated: 2024/10/26 10:27:01 by kcolin ### ########.fr */ +/* Updated: 2024/10/31 12:45:27 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ char *ft_strchr(const char *s, int c) { - int i; + size_t i; i = 0; while (s[i] != '\0') @@ -31,7 +31,7 @@ char *ft_strchr(const char *s, int c) size_t ft_strlen(const char *s) { - int i; + size_t i; i = 0; while (s[i] != '\0') @@ -85,7 +85,7 @@ size_t ft_strlcat(char *dst, const char *src, size_t size) } -char *ft_strjoin(char const *s1, char const *s2) +char *ft_strjoin_free_s1(char const *s1, char const *s2) { char *out; size_t len; @@ -96,13 +96,37 @@ char *ft_strjoin(char const *s1, char const *s2) return (NULL); ft_strlcpy(out, s1, len); ft_strlcat(out, s2, len); + free((void *)s1); return (out); } +char *shorten_buffer(char *buffer) +{ + char *outbuf; + char *addr_of_newline; + size_t index_after_newline; + size_t outlen; + + addr_of_newline = ft_strchr(buffer, '\n'); + if (addr_of_newline == 0) + { + outbuf = malloc(1 * sizeof(char)); + outbuf[0] = '\0'; + } + else + { + index_after_newline = addr_of_newline + 1 - buffer; + outlen = ft_strlen(buffer + index_after_newline) + 1; + outbuf = malloc(outlen * sizeof(char)); + ft_strlcpy(outbuf, buffer + index_after_newline, outlen); + } + free(buffer); + return (outbuf); +} char *get_next_line(int fd) { - static char *buffer = ""; + static char *buffer = NULL; char *read_buffer; int num_bytes_read; size_t length; @@ -111,6 +135,11 @@ char *get_next_line(int fd) read_buffer = malloc(BUFFER_SIZE * sizeof(char)); num_bytes_read = 1; length = 0; + if (buffer == NULL) + { + buffer = malloc(sizeof(char)); + buffer[0] = '\0'; + } while (num_bytes_read != 0) { // DONE: if newline found, @@ -119,11 +148,18 @@ char *get_next_line(int fd) // DONE: copy string until newline to new buffer, outbuf = malloc((ft_strchr(buffer, '\n') - buffer + 2) * sizeof(char)); if (outbuf == NULL) + { + free(read_buffer); + free(buffer); + buffer = NULL; return (NULL); + } ft_strlcpy(outbuf, buffer, ft_strchr(buffer, '\n') - buffer + 2); - // TODO: shorten current buffer, - buffer += ft_strchr(buffer, '\n') - buffer + 1; + // DONE: shorten current buffer, + // buffer += ft_strchr(buffer, '\n') - buffer + 1; + buffer = shorten_buffer(buffer); // DONE: and return. + free(read_buffer); return (outbuf); } num_bytes_read = read(fd, read_buffer + length, BUFFER_SIZE - length - 1); @@ -138,8 +174,13 @@ char *get_next_line(int fd) length += num_bytes_read; // DONE: join with big buffer // FIXME: correctly free buffer - buffer = ft_strjoin(buffer, read_buffer); + buffer = ft_strjoin_free_s1(buffer, read_buffer); } free(read_buffer); + if (ft_strlen(buffer) == 0) + { + free(buffer); + buffer = NULL; + } return (buffer); } diff --git a/test.c b/test.c index 9dc3831..99bbfbe 100644 --- a/test.c +++ b/test.c @@ -17,18 +17,21 @@ int main(int argc, char **argv) { int fd; + int i; char *line; if (argc == 2) { fd = open(argv[1], O_RDONLY); line = ""; + i = 0; while (line != NULL) { line = get_next_line(fd); if (line != NULL) { - printf("%s", line); + i++; + printf("%d\t%s", i, line); free(line); } }