#include void *ft_memalloc(size_t size) { void *mem; size_t i; i = 0; if (!(mem = malloc(size))) return (NULL); while (i < size) { ((char*)mem)[i] = 0; i++; } return (mem); } size_t ft_strlen(const char *str) { size_t i; i = 0; while (str[i]) i++; return (i); } char *ft_strjoin(char const *s1, char const *s2) { size_t i; size_t j; char *str; size_t str_len; i = 0; j = 0; if (!(s1 && s2)) return (NULL); str_len = (ft_strlen(s1) + ft_strlen(s2)); if (!(str = (char *)malloc(sizeof(*str) * (str_len + 1)))) return (NULL); while (s1[i]) { str[i] = s1[i]; i++; } while (s2[j]) str[i++] = s2[j++]; str[i] = '\0'; return (str); } char *ft_strchr(const char *s, int c) { int i; char ch; i = 0; ch = c; while (s[i]) { if (s[i] == ch) return ((char*)s + i); i++; } if (s[i] == '\0' && ch == '\0') return ((char*)s + i); return (NULL); } char *ft_substr(char const *s, unsigned int start, size_t len) { size_t i; char *rt; i = 0; if (!s) return (NULL); if (start > ft_strlen(s)) len = 0; if (!(rt = (char *)malloc(sizeof(*rt) * (len + 1)))) return (NULL); while (*s + start && i < len) { rt[i] = s[start]; i++; start++; } rt[i] = '\0'; return (rt); } ///////////////////////////////////////////////////////////// static void free_it(char **str) { if (str) { free(*str); *str = NULL; } } static int separate_lines(char **line, char **str, int fd) { int i; char *rest; i = 0; while (str[fd][i] && str[fd][i] != '\n') i++; if (!(*line = ft_substr(str[fd], 0, i))) { free_it(&str[fd]); return (-1); } if (str[fd][i]) { if (!(rest = ft_substr(str[fd], i + 1, ft_strlen(str[fd]) - (i + 1)))) { free_it(&str[fd]); return (-1); } free_it(&str[fd]); str[fd] = rest; return (1); } // free_it(&str[fd]); return (0); } int get_next_line(int fd, char **line) { static char *str[OPEN_MAX]; char buf[BUFFER_SIZE + 1]; int i; char *tmp; if (fd < 0 || fd >= OPEN_MAX || !line || BUFFER_SIZE <= 0 || read(fd, buf, 0) < 0) return (-1); if (!str[fd]) if (!(str[fd] = (char*)ft_memalloc(sizeof(char) * 1))) return (-1); while (!ft_strchr(str[fd], '\n') && (i = read(fd, buf, BUFFER_SIZE)) > 0) { buf[i] = '\0'; if (!(tmp = ft_strjoin(str[fd], buf))) { free_it(&str[fd]); return (-1); } free_it(&str[fd]); str[fd] = tmp; } return (separate_lines(line, str, fd)); } ///////////////////////////////////////////////////////////// int main(int ac, char **av) { int fd1; int fd2; int i; char *line; line = NULL; fd1 = open(av[1], O_RDONLY); fd2 = open(av[2], O_RDONLY); if (ac < 2) return (0); while ((i = get_next_line(fd1, &line)) > 0) { printf("%i", i); printf("%s\n",line); free(line); if ((i = get_next_line(fd2, &line)) > 0) { printf("%s\n",line); free(line); } printf("%i", i); } printf("%i", i); while (1); return (0); }