Skip to content

Commit

Permalink
feat: finish implementation of split
Browse files Browse the repository at this point in the history
  • Loading branch information
ccelomary committed May 13, 2023
1 parent e96b6e4 commit c2cf922
Show file tree
Hide file tree
Showing 9 changed files with 272 additions and 23 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
test/
./a.out
./a.exe
.vscode
22 changes: 22 additions & 0 deletions _copy.c
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);
}
20 changes: 20 additions & 0 deletions _free_split.c
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;
}
24 changes: 1 addition & 23 deletions _getline.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,6 @@ size_t find_next_newline(char *buffer, size_t length)
position++;
return (position);
}

/**
* copy_to_line - function that copy data into line
*
* @line: line that will recieve characters
* @buffer: buffer source of the characters
* @size: length of data that will be copied into line
* Return: line
*/
char *copy_to_line(char *line, char *buffer, size_t size)
{
size_t iter;

iter = 0;
while (iter < size)
{
line[iter] = buffer[iter];
iter++;
}
return (line);
}

/**
* _getline - function takes address of line to fill with characters
*
Expand Down Expand Up @@ -72,7 +50,7 @@ ssize_t _getline(char **line)
*line = _realloc(*line, old_size, old_size + next_newline);
if (!*line)
return (-1);
copy_to_line((*line) + old_size, buffer + current_position, next_newline);
_copy((*line) + old_size, buffer + current_position, next_newline);
old_size += next_newline;
current_position += next_newline;
if (current_position < end_of_buffer)
Expand Down
122 changes: 122 additions & 0 deletions _split.c
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);
}
16 changes: 16 additions & 0 deletions _strlen.c
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);
}
5 changes: 5 additions & 0 deletions shell.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@

#define BUFFER_SIZE 1024

char *_copy(char *dest, char *src, size_t size);
void *_realloc(void *old_buffer, size_t old_size, size_t new_size);
ssize_t _getline(char **line);
size_t _strlen(char *s);
void _free_split(char ***backets);
char **_split(char *line, char *diameter);
void _free_split(char ***backets);
#endif
15 changes: 15 additions & 0 deletions tests/_split_test.c
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);
}
70 changes: 70 additions & 0 deletions tests/is_diameter_test.c
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);
}

0 comments on commit c2cf922

Please sign in to comment.