Skip to content

Commit

Permalink
pronto sem bonus
Browse files Browse the repository at this point in the history
  • Loading branch information
Ana Laura Da Silva Volkmann committed May 24, 2024
1 parent da02524 commit 41d09bf
Show file tree
Hide file tree
Showing 4 changed files with 169 additions and 128 deletions.
76 changes: 50 additions & 26 deletions get_next_line.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,53 @@
/* ::: :::::::: */
/* get_next_line.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: anavolkmann <anavolkmann@student.42.fr> +#+ +:+ +#+ */
/* By: ana-lda- <ana-lda-@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/21 20:46:55 by anavolkmann #+# #+# */
/* Updated: 2024/05/21 21:14:12 by anavolkmann ### ########.fr */
/* Updated: 2024/05/24 16:45:57 by ana-lda- ### ########.fr */
/* */
/* ************************************************************************** */

#include "get_next_line.h"

/* static variables: persistência se refere à característica de um estado que sobrevive ao processo
que o criou. Sem essa capacidade, o estado só existiria na RAM, e seria perdido quando a RAM parasse.*/
/* static variables: persistência se refere à característica de um
estado que sobrevive ao processo que o criou. Sem essa capacidade,
o estado só existiria na RAM, e seria perdido quando a RAM parasse.*/

/* @brief Pega o fd aberto e salva em uma variável "buf" o que foi lido a partir dele.
depois junta-se à variável estática cumulativa para a persistência das informações.
@param fd pointer para a variável estática cumulativa de execuções anteriores
@return o novo valor da variavel estatica com buffer combinado para a persistence da info*/
/* @brief Pega o fd aberto e salva em uma variável "buf" o que foi
lido a partir dele. depois junta-se à variável estática cumulativa
para a persistência das informações.
@param fd pointer para a variável estática cumulativa de
execuções anteriores
@return o novo valor da variavel estatica com buffer combinado
para a persistence da info*/
char *ft_read_left_str(int fd, char *laststr)
{
char *buf;
int read_bytes;
char *buffer;
int bytes_read;

buf = malloc((BUFFER_SIZE + 1) * sizeof(char));
if (!buf)
buffer = malloc((BUFFER_SIZE + 1) * sizeof(char));
if (!buffer)
return (NULL);
read_bytes = 1;
while (!ft_strchr(laststr, '\n') && read_bytes != 0)
bytes_read = 1;
while (!ft_strchr(laststr, '\n') && bytes_read != 0)
{
read_bytes = read(fd, buf, BUFFER_SIZE);
if (read_bytes == -1)
bytes_read = read(fd, buffer, BUFFER_SIZE);
if (bytes_read == 0)
{
free(buf);
return (NULL);
free(buffer);
return (laststr);
}
buf[read_bytes] = '\0';
laststr = ft_strjoin(laststr, buf);
buffer[bytes_read] = '\0';
laststr = ft_strjoin(laststr, buffer);
}
free(buf);
return (laststr)
free(buffer);
return (laststr);
}
/* @brief Esta função pega um descritor de arquivo aberto e retorna sua próxima linha.
Esta função possui comportamento indefinido ao ler um arquivo binário.

/* @brief Esta função pega um descritor de arquivo aberto e retorna
sua próxima linha. Esta função possui comportamento indefinido
ao ler um arquivo binário.
@param fd Um descritor de arquivo
@return uma string com a linha lida até `\n`
Se ocorrer um erro ou não houver mais nada para ler, retorna NULL.*/
Expand All @@ -54,10 +60,28 @@ char *get_next_line(int fd)

if (fd < 0 || BUFFER_SIZE <= 0)
return (0);
laststr = ft_read_to_left_str(fd, laststr);
laststr = ft_read_left_str(fd, laststr);
if (!laststr)
return (NULL);
line = ft_getline(laststr);
laststr = ft_new_left_str(laststr);
return (line);
}
}

#include <stdio.h>
#include <fcntl.h>

int main()
{
char *a;
int i = 0;
int fd = open("test.txt", O_RDONLY);

while (i < 30)
{
a = get_next_line(fd);
printf(" %i -> %s\n", i, a);
free(a);
i++;
}
}
18 changes: 10 additions & 8 deletions get_next_line.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: ana-lda- <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/17 11:03:21 by ana-lda- #+# #+# */
/* Updated: 2024/05/17 11:07:51 by ana-lda- ### ########.fr */
/* Updated: 2024/05/24 16:32:49 by ana-lda- ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -17,13 +17,15 @@
# include <stdlib.h>

# ifndef BUFFER_SIZE
# define BUFFER_SIZE 1000
#endif
# define BUFFER_SIZE 1000
# endif

size_t ft_strlen(char *s);
char *ft_getline(char *laststr);
char *ft_strchr(char *s, int c);
char *ft_new_left_str(char *laststr);
char *ft_strjoin(char *laststr, char *buf);
size_t ft_strlen(char *s);
char *ft_getline(char *laststr);
char *ft_strchr(char *s, int c);
char *ft_new_left_str(char *laststr);
char *ft_strjoin(char *laststr, char *buf);
char *ft_read_left_str(int fd, char *laststr);
char *get_next_line(int fd);

#endif
197 changes: 103 additions & 94 deletions get_next_line_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,122 +3,131 @@
/* ::: :::::::: */
/* get_next_line_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: anavolkmann <anavolkmann@student.42.fr> +#+ +:+ +#+ */
/* By: ana-lda- <ana-lda-@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/17 11:11:12 by ana-lda- #+# #+# */
/* Updated: 2024/05/21 20:47:55 by anavolkmann ### ########.fr */
/* Updated: 2024/05/24 16:18:31 by ana-lda- ### ########.fr */
/* */
/* ************************************************************************** */

#include "get_next_line.h"

size_t ft_strlen(char *s)
size_t ft_strlen(char *s)
{
size_t i;
size_t i;

i = 0;
while (!s)
return (0);
while (s[1])
i++;
return (i);
i = 0;
while (!s)
return (0);
while (s[i])
i++;
return (i);
}

char *ft_strchr(char *s, int c)
char *ft_strchr(char *s, int c)
{
int i;
int i;

i = 0;
if (!s)
return (0);
if (c == '\0')
return ((char *)&s[ft_strlen(s)]);
while (s[i] == (char) c)
{
if (s[i] == (char) c)
return ((char *)&s[i]);
i++;
}
return (0);
i = 0;
if (!s)
return (NULL);
while (s[i])
{
if (s[i] == (char) c)
return ((char *)&s[i]);
i++;
}
if ((char) c == '\0')
return ((char *)&s[ft_strlen(s)]);
return (NULL);
}

char *ft_strjoin(char *laststr, char *buf)
char *ft_strjoin(char *laststr, char *buf)
{
size_t i;
size_t j;
char *str;
size_t i;
size_t j;
char *str;

if (!laststr)
{
laststr = (char *)malloc(1 * sizeof(char));
laststr[0] = '\0';
}
if (!laststr || !buf)
return (NULL);
i = -1;
j = 0;
if (laststr)
while (laststr[i++] != '\0')
str[i] = laststr[i];
while (buf[j] != '\0')
str[i++] = buf[j++];
str[ft_strlen(laststr) + ft_strlen(buf)] = '\0';
free(laststr);
return (str);
if (!laststr)
{
laststr = (char *)malloc(1 * sizeof(char));
laststr[0] = '\0';
}
if (!laststr || !buf)
return (NULL);
str = (char *)malloc(sizeof(*laststr)
* (ft_strlen(laststr) + (ft_strlen(buf) + 1)));
if (!str)
return (NULL);
i = -1;
j = 0;
if (laststr)
while (laststr[++i] != '\0')
str[i] = laststr[i];
while (buf[j] != '\0')
str[i++] = buf[j++];
str[ft_strlen(laststr) + ft_strlen(buf)] = '\0';
free(laststr);
return (str);
}

/* @brief extrai a linha (terminando em quebra de linha e '\0' ou so '\0')
@param laststr o ponteiro para variavel estatica cumulativa de execucoes anteriores da GNL
@return a string com a linha completa terminando em uma quebra de linha ('\n') + ('\0')*/
char *ft_getline(char *laststr)
/* @brief extrai a linha (terminando em quebra de linha e '\0' ou
so '\0')
@param laststr o ponteiro para variavel estatica cumulativa de
execucoes anteriores da GNL
@return a string com a linha completa terminando em uma quebra
de linha ('\n') + ('\0')*/
char *ft_getline(char *laststr)
{
int i;
char *str;
int i;
char *str;

i = 0;
if (!laststr)
return (NULL);
while (laststr[i] && laststr[i] != '\n')
i++;
str = (char *)malloc(sizeof(char) * (i + 2));
if (!str)
return (NULL);
i = 0;
while (laststr[i] && laststr[i] != '\n')
{
str[i] = laststr[i];
i++;
}
str[i] = '\0';
return (str);
i = 0;
if (!laststr)
return (NULL);
while (laststr[i] && laststr[i] != '\n')
i++;
str = (char *)malloc(sizeof(char) * (i + 2));
if (!str)
return (NULL);
i = 0;
while (laststr[i] && laststr[i] != '\n')
{
str[i] = laststr[i];
i++;
}
str[i] = '\0';
return (str);
}

/* @brief armazena na variavel estatica cumulariva a nova variavel atualizada com o que resta
da original, MENOS a linha extraida
@param laststr ponteiro para a variavel estatica cumulariva de outras execucoes da GNL
@return a nova string atualizada com o que resta da static original, MENOS a linha extraida */
char *ft_new_left_str(char *laststr)
/* @brief armazena na variavel estatica cumulariva a nova variavel
atualizada com o que resta da original, MENOS a linha extraida
@param laststr ponteiro para a variavel estatica cumulariva de
outras execucoes da GNL
@return a nova string atualizada com o que resta da static
original, MENOS a linha extraida */
char *ft_new_left_str(char *laststr)
{
int i;
int j;
char *str;
int i;
int j;
char *str;

i = 0;
while (laststr[i] && laststr != '\n')
i++;
if (!laststr[i])
{
free(laststr);
return (NULL);
}
str = (char *)malloc(sizeof(char) * (ft_strlen(laststr) - i + 1));
if (!str)
return (NULL);
i++;
j = 0;
while (laststr[i])
str[j++] = laststr[i++];
str[j] = '\0';
free(laststr);
return (str);
}
i = 0;
while (laststr[i] && laststr[i] != '\n')
i++;
if (!laststr[i])
{
free(laststr);
return (NULL);
}
str = (char *)malloc(sizeof(char) * (ft_strlen(laststr) - i + 1));
if (!str)
return (NULL);
i++;
j = 0;
while (laststr[i])
str[j++] = laststr[i++];
str[j] = '\0';
free(laststr);
return (str);
}
6 changes: 6 additions & 0 deletions test.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
primeira linha
segunda linha

quarta linha

sexta linha

0 comments on commit 41d09bf

Please sign in to comment.