Files
minishell/minishell-codex/src/utils/split_utils.c
2026-02-09 20:47:43 +01:00

68 lines
895 B
C

#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);
}