68 lines
895 B
C
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);
|
|
}
|