-
Notifications
You must be signed in to change notification settings - Fork 0
/
get_next_line.c
173 lines (160 loc) · 4.41 KB
/
get_next_line.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* get_next_line.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ana-lda- <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/21 20:46:55 by anavolkmann #+# #+# */
/* Updated: 2024/06/26 14:54:16 by ana-lda- ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft.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.*/
/* @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 *buffer;
int read_bytes;
buffer = malloc(sizeof(char) * (BUFFER_SIZE + 1));
if (!buffer)
return (NULL);
read_bytes = 1;
while (!ft_strchr(laststr, '\n') && read_bytes > 0)
{
read_bytes = read(fd, buffer, BUFFER_SIZE);
if (read_bytes == -1)
{
free(laststr);
free(buffer);
return (NULL);
}
buffer[read_bytes] = '\0';
laststr = ft_strjoin(laststr, buffer);
}
free(buffer);
return (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')*/
static char *ft_getline(char *laststr)
{
char *line;
int len;
int i;
if (!*laststr)
return (NULL);
len = 0;
while (laststr[len] && laststr[len] != '\n')
len++;
line = malloc(sizeof(char) * (len + 2));
if (!line)
return (NULL);
i = 0;
while (laststr[i] && laststr[i] != '\n')
{
line[i] = laststr[i];
i++;
}
if (laststr[i] == '\n')
line[i++] = '\n';
line[i] = '\0';
return (line);
}
/* @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 */
static char *ft_new_left_str(char *laststr)
{
char *str;
int len;
int i;
if (!*laststr)
{
free(laststr);
return (NULL);
}
len = 0;
while (laststr[len] && laststr[len] != '\n')
len++;
str = malloc(sizeof(char) * (ft_strlen(laststr) - len + 1));
if (!str)
return (NULL);
i = 0;
while (laststr[len])
str[i++] = laststr[++len];
str[i] = '\0';
free(laststr);
return (str);
}
/* @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.*/
char *get_next_line(int fd)
{
char *line;
static char *laststr;
if (fd < 0 || BUFFER_SIZE <= 0)
return (NULL);
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>
int main(void)
{
int fd;
char *str;
fd = open("test.txt", O_RDONLY);
str = get_next_line(fd);
if (fd == -1)
{
printf("Error\n");
return (0);
}
printf("Your fd file is %d\n", fd);
while (str != NULL)
{
printf("%s", str);
free(str);
str = get_next_line(fd);
}
printf("Total of lines on file: %s", str);
close(fd);
return (0);
}#include <stdio.h>
#include <fcntl.h>
int main()
{
char *a;
int i = 0;
int fd = open("test.txt", O_RDONLY);
while (a)
{
a = get_next_line(fd);
printf(" %i -> %s", i, a);
free(a);
i++;
}
} */