GCC Code Coverage Report


Directory: ./
File: src/inhibitors/array_string.c
Date: 2024-06-05 00:36:48
Exec Total Coverage
Lines: 0 61 0.0%
Functions: 0 7 0.0%
Branches: 0 44 0.0%

Line Branch Exec Source
1 /*
2 ** EPITECH PROJECT, 2024
3 ** 42sh
4 ** File description:
5 ** The file containing the array_string function
6 */
7 /**
8 * @file array_string.c
9 * @brief The file containing the array_string function
10 */
11
12 #include "../../include/myshell.h"
13
14 /**
15 * @brief Check if the string is not a separator
16 * @param str The string
17 * @param sep The separator
18 * @return <b>int</b> <u>1</u> if the string is not a separator,
19 * <u>0</u> otherwise
20 */
21 static int my_str_is_not_a_separator(char const *str, char const *sep)
22 {
23 if (my_strncmp(str, sep, my_strlen(sep)) == 0)
24 return 0;
25 return 1;
26 }
27
28 /**
29 * @brief Count the number of words and separators
30 * @param str The string
31 * @param sep The separator
32 * @param word The number of words
33 * @param separator The list of separators
34 * @return <b>void</b>
35 */
36 static void check_words_and_num(char const *str, int *sep, int *word,
37 char const *separator)
38 {
39 for (int i = 0; str[i] != '\0'; i++) {
40 if ((my_str_is_not_a_separator(str + i, separator)
41 || char_is_inhibited((char *)str, i) ||
42 char_is_paranthesed((char *)str, i)) && *sep == 1) {
43 *word = *word + 1;
44 *sep = 0;
45 }
46 if (my_str_is_not_a_separator(str + i, separator) == 0
47 && char_is_inhibited((char *)str, i) == 0 &&
48 char_is_paranthesed((char *)str, i) == 0)
49 *sep = 1;
50 }
51 }
52
53 /**
54 * @brief Count the number of letters in a word
55 * @param str The string
56 * @param which_lettre The index of the letter
57 * @param nbr_lettre The number of letters
58 * @param separator The list of separators
59 * @return <b>void</b>
60 */
61 static void count_letter(char const *str, int which_lettre, int *nbr_lettre,
62 char const *separator)
63 {
64 for (int i = which_lettre; str[i] != '\0'
65 && (my_str_is_not_a_separator(str + i, separator)
66 || char_is_inhibited((char *)str, i) ||
67 char_is_paranthesed((char *)str, i)); i++)
68 *nbr_lettre = *nbr_lettre + 1;
69 }
70
71 /**
72 * @brief Reset the number of letters in a word
73 * @param str The string
74 * @param which_lettre The index of the letter
75 * @param nbr_lettre The number of letters
76 * @param separator The list of separators
77 * @return <b>void</b>
78 */
79 static void reset_nbr_letter(char const *str,
80 int *which_lettre, int *nbr_lettre, char const *separator)
81 {
82 for (; str[*which_lettre] != '\0'
83 && my_str_is_not_a_separator(str + *which_lettre, separator) == 0
84 && char_is_inhibited((char *)str, *which_lettre) == 0
85 && char_is_paranthesed((char *)str, *which_lettre) == 0;
86 *which_lettre = *which_lettre + my_strlen(separator));
87 *nbr_lettre = 0;
88 }
89
90 /**
91 * @brief Get the next word
92 * @param str The string
93 * @param separator The list of separators
94 * @return <b>char *</b> The next word
95 */
96 static char *nbr_sep(char *str, char const *separator)
97 {
98 int nbr_sep = 0;
99
100 for (int i = 0; my_str_is_not_a_separator(str + i, separator) == 0
101 && (char_is_inhibited((char *)str, i) == 0 ||
102 char_is_paranthesed((char *)str, i)); i++)
103 nbr_sep++;
104 return &str[nbr_sep];
105 }
106
107 /**
108 * @brief Initialise the value of the array of words
109 * @param string The string
110 * @param str The string
111 * @param info The information
112 * @param separator The list of separators
113 * @return <b>char **</b> The array of words
114 */
115 static char **initialise_value(char **string, char const *str,
116 int **info, char const *separator)
117 {
118 char **array_of_word;
119
120 *string = nbr_sep(*string, separator);
121 check_words_and_num(str, info[1], info[0], separator);
122 array_of_word = malloc(sizeof(char *) * ((*(info[0])) + 1));
123 return array_of_word;
124 }
125
126 /**
127 * @brief Transform a string into an array of words delimited by a string
128 * with inhibitors
129 * @param str The string to transform
130 * @param separator The separator
131 * @return <b>char **</b> The array of words
132 */
133 char **array_string(char const *str, char const *separator)
134 {
135 int word = 0;
136 int sep = 1;
137 int *info[2] = {&word, &sep};
138 int nbr_lettre = 0;
139 int which_lettre = 0;
140 char *string = (char *)str;
141 char **array_of_word = initialise_value(&string, str, info, separator);
142
143 for (int elem = 0; elem < word; elem++) {
144 count_letter(string, which_lettre, &nbr_lettre, separator);
145 array_of_word[elem] = malloc(sizeof(char) * (nbr_lettre + 1));
146 for (int chara = 0; chara < nbr_lettre; chara++) {
147 array_of_word[elem][chara] = string[which_lettre];
148 which_lettre++;
149 }
150 array_of_word[elem][nbr_lettre] = '\0';
151 reset_nbr_letter(string, &which_lettre, &nbr_lettre, separator);
152 }
153 array_of_word[word] = NULL;
154 return array_of_word;
155 }
156