save commit
This commit is contained in:
67
minishell-codex/src/utils/split_utils.c
Normal file
67
minishell-codex/src/utils/split_utils.c
Normal file
@@ -0,0 +1,67 @@
|
||||
#include "minishell.h"
|
||||
|
||||
static size_t count_parts(const char *s, char delim)
|
||||
{
|
||||
size_t count = 0;
|
||||
int in = 0;
|
||||
while (*s)
|
||||
{
|
||||
if (*s == delim)
|
||||
in = 0;
|
||||
else if (!in)
|
||||
{
|
||||
in = 1;
|
||||
count++;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
char **ms_split(const char *s, char delim)
|
||||
{
|
||||
char **out;
|
||||
size_t parts;
|
||||
size_t i = 0;
|
||||
size_t start = 0;
|
||||
size_t len = 0;
|
||||
int in = 0;
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
parts = count_parts(s, delim);
|
||||
out = (char **)calloc(parts + 1, sizeof(char *));
|
||||
if (!out)
|
||||
return NULL;
|
||||
while (s[i])
|
||||
{
|
||||
if (s[i] == delim)
|
||||
{
|
||||
if (in)
|
||||
{
|
||||
out[len++] = ms_strndup(s + start, i - start);
|
||||
in = 0;
|
||||
}
|
||||
}
|
||||
else if (!in)
|
||||
{
|
||||
in = 1;
|
||||
start = i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (in)
|
||||
out[len++] = ms_strndup(s + start, i - start);
|
||||
out[len] = NULL;
|
||||
return out;
|
||||
}
|
||||
|
||||
void ms_free_split(char **sp)
|
||||
{
|
||||
size_t i = 0;
|
||||
if (!sp)
|
||||
return;
|
||||
while (sp[i])
|
||||
free(sp[i++]);
|
||||
free(sp);
|
||||
}
|
||||
Reference in New Issue
Block a user