-
Notifications
You must be signed in to change notification settings - Fork 0
/
get_next_line.c
156 lines (145 loc) · 3.85 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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* get_next_line.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tchow-so <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/11/27 09:23:49 by tchow-so #+# #+# */
/* Updated: 2024/01/03 08:47:56 by tchow-so ### ########.fr */
/* */
/* ************************************************************************** */
/* This project is about programming a function that returns a line read
from a file descriptor. */
#include "get_next_line.h"
char *read_from_fd(char *str, int fd);
char *get_line(char *str);
char *clear_line(char *str);
char *get_next_line(int fd)
{
static char *str;
char *line;
if (fd < 0 || BUFFER_SIZE <= 0)
return (NULL);
if (!str)
{
str = malloc(1);
str[0] = '\0';
}
str = read_from_fd(str, fd);
if (!str)
return (NULL);
line = get_line(str);
str = clear_line(str);
return (line);
}
/* read BUFFER_SIZE bytes from file (identified by fd) */
char *read_from_fd(char *str, int fd)
{
int bytes_read;
char *buffer;
buffer = malloc(sizeof(char) * (BUFFER_SIZE + 1));
if (!buffer)
return (NULL);
bytes_read = 1;
while (!ft_strchr_gnl(str, '\n') && bytes_read != 0)
{
bytes_read = read(fd, buffer, BUFFER_SIZE);
if (bytes_read == -1)
{
free(str);
free(buffer);
return (NULL);
}
buffer[bytes_read] = '\0';
str = ft_strjoin_gnl(str, buffer);
}
free(buffer);
return (str);
}
/* get line from 'str' and terminate it */
char *get_line(char *str)
{
int i;
char *line;
i = 0;
if (str[i] == '\0')
return (NULL);
while (str[i] && str[i] != '\n')
i++;
if (str[i] == '\0')
line = malloc(i + 1);
else
line = malloc(i + 2);
if (!line)
return (NULL);
i = 0;
while (str[i] && str[i] != '\n')
{
line[i] = str[i];
i++;
}
if (str[i] == '\n')
line[i++] = '\n';
line[i] = '\0';
return (line);
}
/* clear previous line from 'str' */
char *clear_line(char *str)
{
int i;
int j;
char *tmp;
i = 0;
while (str[i] && (str[i] != '\n'))
i++;
if (!str[i])
{
free(str);
return (NULL);
}
tmp = malloc(sizeof(char) * (ft_strlen_gnl(str) - i + 1));
if (!tmp)
{
free(tmp);
return (NULL);
}
i++;
j = 0;
while (str[i])
tmp[j++] = str[i++];
tmp[j] = '\0';
free(str);
return (tmp);
}
// GET NEXT LINE
/* 1. checks vality of fd and BUFFER_SIZE values;
2. reads BUFFER_SIZE bytes from file (identified by its descriptor, fd)
2.1. allocates memory space to buffer
(pre-defined macro BUFFER_SIZE + 1);
2.2. checks for successful memory allocation;
2.3. checks if newline character is found, and if there are
still bytes to be read, otherwise frees memory;
2.4. null-terminates buffer;
2.5. joins buffer-sized strings to 'str' until newline
character is found;
2.6. frees 'buffer'';
2.7. returns 'str' (start to end of line);
3. gets line from str
3.1. checks for empty str;
3.2. increments index 'i' until newline character or
null-terminator is found;
3.3. allocates memory according to scenario (+1 for '\0',
+2 for '\n\0');
3.4. copies str;
4. clears previous line
4.1. increments 'str' index until finding newline character;
4.2. checks for 'str';
4.3. allocates memory to temporary variable 'tmp';
4.4. checks successful memory allocation;
4.5. copies 'str' content after newline character is found
to 'tmp';
4.6. null-terminates 'tmp';
4.7. frees 'str';
4.8. returns 'tmp';
5. returns line */