#include #include #include "xfunc.h" #include "libmy.h" #include "get_next.h" static int my_get_size(t_buff *stack) { int res; res = 0; while (stack) { res += stack->size; stack = stack->next; } return (res); } static char *my_pop(t_buff **stack) { int size; char *res; t_buff *tmp; res = NULL; if ((size = my_get_size(*stack)) && (res = xmalloc((size + 1) * sizeof(*res)))) { res[size] = '\0'; while (*stack) { size = my_get_size(*stack); my_strncpy(res + (size - (*stack)->size), (*stack)->str, (*stack)->size); tmp = *stack; *stack = (*stack)->next; free(tmp->str); free(tmp); } } return (res); } static int my_push(t_buff **stack, char *str, int size) { t_buff *new; if (size > 0) if ((new = xmalloc(sizeof(*new)))) if ((new->str = xmalloc(size * sizeof(*(new->str))))) { new->size = size; my_strncpy(new->str, str, size); if (*stack) new->next = *stack; else new->next = NULL; *stack = new; return (size); } return (0); } static char *verif(const int fd, t_buff **stack, char *buff, int str_size) { if (str_size > 0 && my_push(stack, buff, str_size)) return (get_next_line(fd)); else return (my_pop(stack)); } char *get_next_line(const int fd) { int i; char *res; static t_buff *stack; int tot_size; int str_size; char buff[BUF_SIZE]; if ((i = 0) || stack) while (i < stack->size) if (stack->str[i++] == '\n') { str_size = stack->size; tot_size = my_get_size(stack) - str_size; res = my_pop(&stack); my_push(&stack, res + tot_size + i, str_size - i); res[tot_size + i - 1] = '\0'; return (res); } if ((str_size = read(fd, buff, BUF_SIZE)) != (-1)) return (verif(fd, &stack, buff, str_size)); free(my_pop(&stack)); return (NULL); }