-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcreate_data.c
123 lines (114 loc) · 3.29 KB
/
create_data.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* create_data.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cdomet-d <cdomet-d@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/26 15:40:32 by csweetin #+# #+# */
/* Updated: 2024/10/31 14:19:59 by cdomet-d ### ########.fr */
/* */
/* ************************************************************************** */
#include "parsing.h"
void count_word(char *line, size_t i, size_t *word)
{
char quotetype;
quotetype = 0;
while (line[i] && line[i] != '>' && line[i] != '<' && line[i] != '|')
{
if (line[i] == ' ' || (line[i] >= '\t' && line[i] <= '\r'))
{
*word += 1;
while (line[i] && (line[i] == ' '
|| (line[i] >= '\t' && line[i] <= '\r')))
i++;
}
if (line[i] == '"' || line[i] == '\'')
{
quotetype = line[i++];
while (line[i] && line[i] != quotetype)
i++;
}
if (line[i] && line[i] != '>' && line[i] != '<' && line[i] != '|')
i++;
}
if ((line[i] == '\0' || line[i] == '>' || line[i] == '<' || line[i] == '|')
&& (line[i - 1] != ' ' && (line[i - 1] < '\t' || line[i - 1] > '\r')))
*word += 1;
}
static size_t count_letter(char *line, size_t letter)
{
size_t temp;
char quotetype;
quotetype = 0;
temp = letter;
while (line[letter] && line[letter] != ' ' && (line[letter] < '\t'
|| line[letter] > '\r') && line[letter] != '>'
&& line[letter] != '<' && line[letter] != '|')
{
if (line[letter] == '"' || line[letter] == '\'')
{
quotetype = line[letter++];
while (line[letter] && line[letter] != quotetype)
letter++;
}
if (line[letter])
letter++;
}
letter -= temp;
return (letter);
}
static void fill_tab(char *line, size_t *i, char **tab, size_t *word)
{
size_t letter;
char quotetype;
letter = 0;
while (line[*i] && line[*i] != ' ' && (line[*i] < '\t' || line[*i] > '\r')
&& line[*i] != '>' && line[*i] != '<' && line[*i] != '|')
{
if (line[*i] == '"' || line[*i] == '\'')
{
quotetype = line[*i];
tab[*word][letter++] = line[*i];
*i += 1;
while (line[*i] && line[*i] != quotetype)
{
tab[*word][letter++] = line[*i];
*i += 1;
}
}
if (line[*i])
{
tab[*word][letter++] = line[*i];
*i += 1;
}
}
tab[*word][letter] = '\0';
}
char **build_tab(char *line, size_t *i, size_t word)
{
char **tab;
size_t letter;
size_t j;
tab = NULL;
letter = 0;
tab = ft_calloc(sizeof(char *), word + 1);
if (!tab)
return (print_error(errno, "minishell: parsing"));
j = word;
word = 0;
while (j-- > 0)
{
while (line[*i] && ((line[*i] >= '\t' && line[*i] <= '\r')
|| line[*i] == ' '))
*i += 1;
letter = count_letter(line, *i);
tab[word] = ft_calloc(sizeof(char), letter + 1);
if (!tab[word])
return (free_darr(tab), print_error(errno, "minishell: parsing"));
fill_tab(line, i, tab, &word);
word++;
}
tab[word] = NULL;
return (tab);
}