Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.45 KB | None | 0 0
  1. #include "get_next_line.h"
  2. #include "libft/includes/libft.h"
  3. #include <stdio.h>
  4. static char         *enlarge_str(char *str, size_t *size)
  5. {
  6.     char            *new_str;
  7.  
  8.     *size *= 2;
  9.     if (!(new_str = (char*)malloc(*size)))
  10.     {
  11.         free(str);
  12.         return (NULL);
  13.     }
  14.     new_str = ft_memcpy(new_str, str, *size / 2);
  15.     free(str);
  16.     return (new_str);
  17. }
  18.  
  19. static char         *manage_str(t_avl_t *r, char *ptr, char *bf, size_t size)
  20. {
  21.     char            *new;
  22.     size_t          n_s;
  23.  
  24.     n_s = r->size + 1 + ((ptr) ? (ptr - bf) : (size));
  25.     if (n_s == 1 && !ptr)
  26.             return (NULL);
  27.     if (!(new = ft_memjoin((char*)r->content, bf, r->size, size)))
  28.         return (NULL);
  29.     free(r->content);
  30.     r->content = new;
  31.     r->size += size;
  32.     if (!(new = (char*)malloc(n_s)))
  33.         return (NULL);
  34.     new = ft_memcpy(new, r->content, n_s - 1);
  35.     *(new + n_s - 1) = '\0';
  36.     r->size = (ptr) ? (r->size - n_s) : (0);
  37.     r->content = (ptr) ? ft_memmove(r->content, ptr + 1, r->size) : (NULL);
  38.     return (new);
  39. }
  40.  
  41. static char         *m_tail(t_avl_t *r, char *ptr)
  42. {
  43.     size_t          n_s;
  44.     char            *new;
  45.  
  46.     n_s = (ptr - (char*)r->content) + 1;
  47.     if (!(new = (char*)malloc(n_s * sizeof(char))))
  48.         return (NULL);
  49.     new = ft_memcpy(new, r->content, n_s - 1);
  50.     *(new + n_s - 1) = '\0';
  51.     r->size -= n_s;
  52.     r->content = ft_memmove(r->content, ptr + 1, r->size);
  53.     return (new);
  54. }
  55.  
  56. static size_t       readmepls(int fd, char **bf, char **check)
  57. {
  58.     size_t          count;
  59.     ssize_t         count_read;
  60.     size_t          ar_size;
  61.  
  62.     count = 0;
  63.     ar_size = BUFF_SIZE;
  64.     while ((count_read = read(fd, *bf + count, BUFF_SIZE)))
  65.     {
  66.         count += count_read;
  67.         if (count == ar_size)
  68.             if (!(*bf = enlarge_str(*bf, &ar_size)))
  69.                 return (-1);
  70.         if ((*check = ft_memchr(*bf, '\n', count)) || count_read < BUFF_SIZE)
  71.             break ;
  72.     }
  73.     return (count);
  74. }
  75.  
  76. int                 get_next_line(const int fd, char **line)
  77. {
  78.     static t_avl_t  *r;
  79.     t_avl_t         *tmp;
  80.     char            *check;
  81.     size_t          count;
  82.     char            *bf;
  83.  
  84.     bf = (char*)malloc(BUFF_SIZE * sizeof(char));
  85.     if (fd < 0 || BUFF_SIZE <= 0 || !line || read(fd, bf, 0) < 0)
  86.     {
  87.         free(bf);
  88.         return (-1);
  89.     }
  90.     if (!(tmp = ft_avl_search(r, fd)))
  91.         if (!(r = ft_avl_insert(r, fd)))
  92.             return (-1);
  93.     tmp = ft_avl_search(r, fd);
  94.     if ((check = ft_memchr(tmp->content, '\n', tmp->size)))
  95.         return (!(*line = m_tail(tmp, check))) ? (-1) : (1);
  96.     count = readmepls(fd, &bf, &check);
  97.     if (!(*line = manage_str(tmp, check, bf, count)) && count)
  98.         return (-1);
  99.     free(bf);
  100.     if (!(*line) && !count)
  101.         r = ft_avl_remove(r, fd);
  102.     return (!(*line) && !count) ? (0) : (1);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement