-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: finish implementation of split
- Loading branch information
Showing
9 changed files
with
272 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
test/ | ||
./a.out | ||
./a.exe | ||
.vscode |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#include "shell.h" | ||
/** | ||
* copy_to_line - function that copy data into dest | ||
* | ||
* @dest: buffer in which the data will be copied | ||
* @src: buffer source of the characters | ||
* @size: length of data that will be copied into line | ||
* Return: dest | ||
*/ | ||
char *_copy(char *dest, char *src, size_t size) | ||
{ | ||
size_t iter; | ||
|
||
iter = 0; | ||
while (iter < size) | ||
{ | ||
dest[iter] = src[iter]; | ||
iter++; | ||
} | ||
dest[iter] = 0; | ||
return (dest); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
#include "shell.h" | ||
/** | ||
* _free_split - function that frees the allocted backets | ||
* | ||
* @backets: backets to free | ||
* Return: void | ||
*/ | ||
void _free_split(char ***backets) | ||
{ | ||
char **head; | ||
|
||
head = *backets; | ||
while (*head) | ||
{ | ||
free(*head); | ||
head++; | ||
} | ||
free(*backets); | ||
*backets = NULL; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
#include "shell.h" | ||
#include <stdio.h> | ||
|
||
int check_diameter(char *str, char *diameter) | ||
{ | ||
size_t iter; | ||
|
||
iter = 0; | ||
while (str[iter] && diameter[iter] && str[iter] == diameter[iter]) | ||
iter++; | ||
if (diameter[iter]) | ||
return (0); | ||
if (str[iter] == diameter[iter - 1]) | ||
return (2); | ||
return (1); | ||
} | ||
|
||
size_t backet_count(char *line, char *diameter) | ||
{ | ||
size_t counter, index, before, is_diameter; | ||
|
||
counter = 0; | ||
index = 0; | ||
before = 0; | ||
while (line[index]) | ||
{ | ||
is_diameter = check_diameter(line + index, diameter); | ||
if (is_diameter) | ||
{ | ||
if (is_diameter == 2) | ||
{ | ||
index++; | ||
before = 1; | ||
} | ||
else if (is_diameter == 1 && before) | ||
{ | ||
before = 0; | ||
index++; | ||
} | ||
else | ||
{ | ||
counter++; | ||
index += _strlen(diameter); | ||
} | ||
} | ||
else | ||
index++; | ||
} | ||
return (counter + 1); | ||
} | ||
|
||
size_t get_next_diameter(char *line, char *diameter) | ||
{ | ||
size_t index, before, is_diameter; | ||
|
||
index = 0; | ||
before = 0; | ||
while (line[index]) | ||
{ | ||
is_diameter = check_diameter(line + index, diameter); | ||
if (is_diameter) | ||
{ | ||
if (is_diameter == 2) | ||
{ | ||
index++; | ||
before = 1; | ||
} | ||
else if (is_diameter == 1 && before) | ||
{ | ||
before = 0; | ||
index++; | ||
} | ||
else | ||
return (index); | ||
} | ||
else | ||
index++; | ||
} | ||
return (index); | ||
} | ||
|
||
void free_backets(char **backets, size_t current_position) | ||
{ | ||
size_t index; | ||
|
||
index = 0; | ||
while (index < current_position) | ||
{ | ||
free(backets[index]); | ||
index++; | ||
} | ||
free(backets); | ||
} | ||
|
||
char **_split(char *line, char *diameter) | ||
{ | ||
char **backets; | ||
size_t backet_length, current_line_position, backet_index; | ||
size_t next_diameter; | ||
|
||
backet_length = backet_count(line, diameter); | ||
backets = malloc(sizeof(char *) * (backet_length + 1)); | ||
if (!backets) | ||
return (NULL); | ||
current_line_position = 0; | ||
backet_index = 0; | ||
while (backet_index < backet_length) | ||
{ | ||
next_diameter = get_next_diameter(line + current_line_position, diameter); | ||
backets[backet_index] = malloc(sizeof(char) * (next_diameter + 1)); | ||
if (!backets[backet_index]) | ||
{ | ||
free_backets(backets, backet_index); | ||
return (NULL); | ||
} | ||
_copy(backets[backet_index], line + current_line_position, next_diameter); | ||
backet_index++; | ||
current_line_position += next_diameter + _strlen(diameter); | ||
} | ||
backets[backet_length] = NULL; | ||
return (backets); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#include "shell.h" | ||
/** | ||
* _strlen - function that calculate the length of given string | ||
* | ||
* @s: string (characters) | ||
* Return: number of characters | ||
*/ | ||
size_t _strlen(char *s) | ||
{ | ||
size_t len; | ||
|
||
len = 0; | ||
while (s[len]) | ||
len++; | ||
return (len); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
#include "../shell.h" | ||
#include <stdio.h> | ||
|
||
int main(void) | ||
{ | ||
char **s = _split("hello||world|again|and&&again&&", "&&"); | ||
char **v = s; | ||
while (*v) | ||
{ | ||
printf("%s\n", *v); | ||
v++; | ||
} | ||
_free_split(&s); | ||
return (0); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
#include <stdio.h> | ||
#include <sys/types.h> | ||
|
||
size_t _strlen(char *s) | ||
{ | ||
size_t len; | ||
|
||
len = 0; | ||
while (s[len]) | ||
len++; | ||
return (len); | ||
} | ||
|
||
int check_diameter(char *str, char *diameter) | ||
{ | ||
size_t iter; | ||
|
||
iter = 0; | ||
while (str[iter] && diameter[iter] && str[iter] == diameter[iter]) | ||
iter++; | ||
if (diameter[iter]) | ||
return (0); | ||
if (str[iter] == diameter[iter - 1]) | ||
return (2); | ||
return (1); | ||
} | ||
|
||
size_t backet_count(char *line, char *diameter) | ||
{ | ||
size_t counter, index, before, is_diameter; | ||
|
||
counter = 0; | ||
index = 0; | ||
before = 0; | ||
while (line[index]) | ||
{ | ||
is_diameter = check_diameter(line + index, diameter); | ||
if (is_diameter) | ||
{ | ||
if (is_diameter == 2) | ||
{ | ||
index++; | ||
before = 1; | ||
} | ||
else if (is_diameter == 1 && before) | ||
{ | ||
before = 0; | ||
index++; | ||
} | ||
else | ||
{ | ||
counter++; | ||
index += _strlen(diameter); | ||
} | ||
} | ||
else | ||
index++; | ||
} | ||
return (counter + 1); | ||
} | ||
|
||
int main(void) | ||
{ | ||
// printf("%d\n", is_diameter("||", "|")); | ||
// printf("%d\n", is_diameter("|", "||")); | ||
// printf("%d\n", is_diameter("|||", "||")); | ||
// printf("%d\n", is_diameter("|", "|")); | ||
printf("%lu\n", backet_count("hello||world|||again||World", "||")); | ||
return (0); | ||
} |