# include <unistd.h>
# include <fcntl.h>
# include <stdlib.h>
size_t ft_strlen(const char *s)
{
int i;
i = 0;
while (s[i])
i++;
return (i);
}
int ft_strchr(const char *s)
{
int i;
i = 0;
if (!s)
return (1);
while (s[i] != '\n' && s[i])
i++;
if (s[i] != '\n')
return (1);
return (0);
}
char *ft_strjoin(char const *s1, char const *s2)
{
char *new;
int i;
int j;
if (!s1 || !s2)
return (0);
new
= malloc(sizeof(char) * (ft_strlen
(s1
) + ft_strlen
(s2
)) + 1); if (!new)
return (0);
i = 0;
j = 0;
while (s1[i])
{
new[j] = s1[i];
i++;
j++;
}
i = 0;
while (s2[i])
new[j++] = s2[i++];
new[j] = '\0';
return ((char *)new);
}
void *ft_calloc(size_t count, size_t size)
{
char *d;
size_t i;
size_t j;
if (count == 0 || size == 0)
j = 1;
else if (count > 65535 || size > 65535 || count * size > 65535)
return (NULL);
else
j = count * size;
i = 0;
if (d == 0)
return (0);
while (j > 0)
{
d[i] = '\0';
j--;
i++;
}
return ((void *)d);
}
char *ft_substr(char const *s, unsigned int start, size_t len)
{
char *new;
int i;
if (!s)
return (0);
i = 0;
if (start > ft_strlen(s))
len = 0;
else if (ft_strlen(&s[start]) < len)
len = ft_strlen(&s[start]);
new
= malloc(sizeof(char) * len
+ 1); if (!new)
return (0);
while (len > 0 && s[start])
{
new[i] = s[start];
i++;
start++;
len--;
}
new[i] = '\0';
return (new);
}
char *ft_free(char *buffer, char *buf)
{
char *temp;
temp = ft_strjoin(buffer, buf);
return (temp);
}
void read_line(int fd, char **temp, int *lues, int BUFFER_SIZE)
{
char *buffer;
if (!*temp)
*temp = ft_calloc(1, 1);
while (*lues >= 1 && ft_strchr(*temp) == 1)
{
buffer
= malloc(sizeof(char) * BUFFER_SIZE
+ 1); if (!buffer)
return ;
*lues = read(fd, buffer, BUFFER_SIZE);
if (((*temp == NULL) && *lues == 0) || *lues == -1)
{
return ;
}
buffer[*lues] = '\0';
*temp = ft_free(*temp, buffer);
}
}
void extract_line(char *temp, char **line)
{
int len;
len = 0;
if (temp == NULL)
return ;
while (temp[len] && temp[len] != '\n')
len++;
*line = ft_substr(temp, 0, len + 1);
if (*line == NULL)
return ;
}
char *clean_temp(char *temp)
{
int i;
int j;
char *c;
i = 0;
while (temp[i] != '\n' && temp[i])
i++;
j = (int)ft_strlen(&temp[i]);
c = ft_substr(temp, i +1, j);
if (!c)
return (NULL);
return (c);
}
char *get_next_line(int fd)
{
static char *temp;
char *line;
int lues;
int BUFFER_SIZE = 1;
if (fd < 0 || BUFFER_SIZE <= 0 || read(fd, 0, 0) < 0)
return (NULL);
lues = 1;
read_line(fd, &temp, &lues, BUFFER_SIZE);
if (temp == NULL)
return (NULL);
extract_line(temp, &line);
if (line == NULL)
return (NULL);
temp = clean_temp(temp);
if (line[0] == '\0')
{
line = NULL;
return (NULL);
}
return (line);
}
#include <stdio.h>
int main()
{
int fd;
char *tmp;
int i;
i = 0;
fd = open("0123456789012345678901234567890123456789\n0", O_RDONLY);
tmp = get_next_line(fd);
while (tmp)
{
tmp = get_next_line(fd);
i++;
}
}
IyBpbmNsdWRlIDx1bmlzdGQuaD4KIyBpbmNsdWRlIDxmY250bC5oPgojIGluY2x1ZGUgPHN0ZGxpYi5oPgoKc2l6ZV90CWZ0X3N0cmxlbihjb25zdCBjaGFyICpzKQp7CglpbnQJaTsKCglpID0gMDsKCXdoaWxlIChzW2ldKQoJCWkrKzsKCXJldHVybiAoaSk7Cn0KCmludAlmdF9zdHJjaHIoY29uc3QgY2hhciAqcykKewoJaW50CQkJaTsKCglpID0gMDsKCWlmICghcykKCQlyZXR1cm4gKDEpOwoJd2hpbGUgKHNbaV0gIT0gJ1xuJyAmJiBzW2ldKQoJCWkrKzsKCWlmIChzW2ldICE9ICdcbicpCgkJcmV0dXJuICgxKTsKCXJldHVybiAoMCk7Cn0KCmNoYXIJKmZ0X3N0cmpvaW4oY2hhciBjb25zdCAqczEsIGNoYXIgY29uc3QgKnMyKQp7CgljaGFyCSpuZXc7CglpbnQJCWk7CglpbnQJCWo7CgoJaWYgKCFzMSB8fCAhczIpCgkJcmV0dXJuICgwKTsKCW5ldyA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiAoZnRfc3RybGVuKHMxKSArIGZ0X3N0cmxlbihzMikpICsgMSk7CglpZiAoIW5ldykKCQlyZXR1cm4gKDApOwoJaSA9IDA7CglqID0gMDsKCXdoaWxlIChzMVtpXSkKCXsKCQluZXdbal0gPSBzMVtpXTsKCQlpKys7CgkJaisrOwoJfQoJaSA9IDA7Cgl3aGlsZSAoczJbaV0pCgkJbmV3W2orK10gPSBzMltpKytdOwoJbmV3W2pdID0gJ1wwJzsKCXJldHVybiAoKGNoYXIgKiluZXcpOwp9Cgp2b2lkCSpmdF9jYWxsb2Moc2l6ZV90IGNvdW50LCBzaXplX3Qgc2l6ZSkKewoJY2hhcgkqZDsKCXNpemVfdAlpOwoJc2l6ZV90CWo7CgoJaWYgKGNvdW50ID09IDAgfHwgc2l6ZSA9PSAwKQoJCWogPSAxOwoJZWxzZSBpZiAoY291bnQgPiA2NTUzNSB8fCBzaXplID4gNjU1MzUgfHwgY291bnQgKiBzaXplID4gNjU1MzUpCgkJcmV0dXJuIChOVUxMKTsKCWVsc2UKCQlqID0gY291bnQgKiBzaXplOwoJaSA9IDA7CglkID0gbWFsbG9jKGopOwoJaWYgKGQgPT0gMCkKCQlyZXR1cm4gKDApOwoJd2hpbGUgKGogPiAwKQoJewoJCWRbaV0gPSAnXDAnOwoJCWotLTsKCQlpKys7Cgl9CglyZXR1cm4gKCh2b2lkICopZCk7Cn0KCmNoYXIJKmZ0X3N1YnN0cihjaGFyIGNvbnN0ICpzLCB1bnNpZ25lZCBpbnQgc3RhcnQsIHNpemVfdCBsZW4pCnsKCWNoYXIJKm5ldzsKCWludAkJaTsKCglpZiAoIXMpCgkJcmV0dXJuICgwKTsKCWkgPSAwOwoJaWYgKHN0YXJ0ID4gZnRfc3RybGVuKHMpKQoJCWxlbiA9IDA7CgllbHNlIGlmIChmdF9zdHJsZW4oJnNbc3RhcnRdKSA8IGxlbikKCQlsZW4gPSBmdF9zdHJsZW4oJnNbc3RhcnRdKTsKCW5ldyA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4gKyAxKTsKCWlmICghbmV3KQoJCXJldHVybiAoMCk7Cgl3aGlsZSAobGVuID4gMCAmJiBzW3N0YXJ0XSkKCXsKCQluZXdbaV0gPSBzW3N0YXJ0XTsKCQlpKys7CgkJc3RhcnQrKzsKCQlsZW4tLTsKCX0KCW5ld1tpXSA9ICdcMCc7CglyZXR1cm4gKG5ldyk7Cn0KCmNoYXIJKmZ0X2ZyZWUoY2hhciAqYnVmZmVyLCBjaGFyICpidWYpCnsKCWNoYXIJKnRlbXA7CgoJdGVtcCA9IGZ0X3N0cmpvaW4oYnVmZmVyLCBidWYpOwoJZnJlZShidWZmZXIpOwoJcmV0dXJuICh0ZW1wKTsKfQoKdm9pZAlyZWFkX2xpbmUoaW50IGZkLCBjaGFyICoqdGVtcCwgaW50ICpsdWVzLCBpbnQgQlVGRkVSX1NJWkUpCnsKCWNoYXIJKmJ1ZmZlcjsKCglpZiAoISp0ZW1wKQoJCSp0ZW1wID0gZnRfY2FsbG9jKDEsIDEpOwoJd2hpbGUgKCpsdWVzID49IDEgJiYgZnRfc3RyY2hyKCp0ZW1wKSA9PSAxKQoJewoJCWJ1ZmZlciA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiBCVUZGRVJfU0laRSArIDEpOwoJCWlmICghYnVmZmVyKQoJCQlyZXR1cm4gOwoJCSpsdWVzID0gcmVhZChmZCwgYnVmZmVyLCBCVUZGRVJfU0laRSk7CgkJaWYgKCgoKnRlbXAgPT0gTlVMTCkgJiYgKmx1ZXMgPT0gMCkgfHwgKmx1ZXMgPT0gLTEpCgkJewoJCQlmcmVlKGJ1ZmZlcik7CgkJCXJldHVybiA7CgkJfQoJCWJ1ZmZlclsqbHVlc10gPSAnXDAnOwoJCSp0ZW1wID0gZnRfZnJlZSgqdGVtcCwgYnVmZmVyKTsKCQlmcmVlKGJ1ZmZlcik7Cgl9Cn0KCnZvaWQJZXh0cmFjdF9saW5lKGNoYXIgKnRlbXAsIGNoYXIgKipsaW5lKQp7CglpbnQJCWxlbjsKCglsZW4gPSAwOwoJaWYgKHRlbXAgPT0gTlVMTCkKCQlyZXR1cm4gOwoJd2hpbGUgKHRlbXBbbGVuXSAmJiB0ZW1wW2xlbl0gIT0gJ1xuJykKCQlsZW4rKzsKCSpsaW5lID0gZnRfc3Vic3RyKHRlbXAsIDAsIGxlbiArIDEpOwoJaWYgKCpsaW5lID09IE5VTEwpCgkJcmV0dXJuIDsKfQoKY2hhcgkqY2xlYW5fdGVtcChjaGFyICp0ZW1wKQp7CglpbnQJCWk7CglpbnQJCWo7CgljaGFyCSpjOwoKCWkgPSAwOwoJd2hpbGUgKHRlbXBbaV0gIT0gJ1xuJyAmJiB0ZW1wW2ldKQoJCWkrKzsKCWogPSAoaW50KWZ0X3N0cmxlbigmdGVtcFtpXSk7CgljID0gZnRfc3Vic3RyKHRlbXAsIGkgKzEsIGopOwoJaWYgKCFjKQoJCXJldHVybiAoTlVMTCk7CglmcmVlKHRlbXApOwoJcmV0dXJuIChjKTsKfQoKY2hhcgkqZ2V0X25leHRfbGluZShpbnQgZmQpCnsKCXN0YXRpYyBjaGFyCQkqdGVtcDsKCWNoYXIJCQkqbGluZTsKCWludAkJCQlsdWVzOwoJaW50IEJVRkZFUl9TSVpFID0gMTsKCglpZiAoZmQgPCAwIHx8IEJVRkZFUl9TSVpFIDw9IDAgfHwgcmVhZChmZCwgMCwgMCkgPCAwKQoJCXJldHVybiAoTlVMTCk7CglsdWVzID0gMTsKCXJlYWRfbGluZShmZCwgJnRlbXAsICZsdWVzLCBCVUZGRVJfU0laRSk7CglpZiAodGVtcCA9PSBOVUxMKQoJCXJldHVybiAoTlVMTCk7CglleHRyYWN0X2xpbmUodGVtcCwgJmxpbmUpOwoJaWYgKGxpbmUgPT0gTlVMTCkKCQlyZXR1cm4gKE5VTEwpOwoJdGVtcCA9IGNsZWFuX3RlbXAodGVtcCk7CglpZiAobGluZVswXSA9PSAnXDAnKQoJewoJCWZyZWUobGluZSk7CgkJbGluZSA9IE5VTEw7CgkJcmV0dXJuIChOVUxMKTsKCX0KCXJldHVybiAobGluZSk7Cn0KI2luY2x1ZGUgPHN0ZGlvLmg+CmludCBtYWluKCkKewoJaW50IGZkOwoJY2hhciAqdG1wOwoJaW50IGk7CgoJaSA9IDA7CglmZCA9IG9wZW4oIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcbjAiLCBPX1JET05MWSk7Cgl0bXAgPSBnZXRfbmV4dF9saW5lKGZkKTsKCgl3aGlsZSAodG1wKQoJewkKCQlwcmludGYoIiVzIiwgdG1wKTsKCQlmcmVlKHRtcCk7CgkJdG1wID0gZ2V0X25leHRfbGluZShmZCk7CgkJaSsrOwoJfQoJZnJlZSh0bXApOwp9