add: split_quoted
This commit is contained in:
parent
a9cf6c2afe
commit
a4838cc0b4
@ -1,10 +1,10 @@
|
||||
#include "utils.h"
|
||||
|
||||
int is_in_quote(const char *str)
|
||||
int is_in_quote(const char *str, size_t pos)
|
||||
{
|
||||
int out = 0;
|
||||
|
||||
for (size_t i = 0; str[i] != '\0'; i++)
|
||||
for (size_t i = 0; str[i] != '\0' && i < pos; i++)
|
||||
{
|
||||
if (str[i] == '\"')
|
||||
{
|
||||
|
78
src/utils/split_quoted.c
Normal file
78
src/utils/split_quoted.c
Normal file
@ -0,0 +1,78 @@
|
||||
#include "utils.h"
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static size_t get_len(const char *str, const char* charset)
|
||||
{
|
||||
size_t len = 0;
|
||||
size_t i = 0;
|
||||
|
||||
while (str[i] != '\0')
|
||||
{
|
||||
while (str[i] != '\0' && (is_in_quote(str, i) || strchr(charset, str[i]) != NULL))
|
||||
i++;
|
||||
if (str[i] == '\0')
|
||||
return len;
|
||||
len++;
|
||||
while (str[i] != '\0' && (is_in_quote(str, i) || strchr(charset, str[i]) == NULL))
|
||||
i++;
|
||||
}
|
||||
return (len);
|
||||
}
|
||||
|
||||
void free_tab(char **tab)
|
||||
{
|
||||
for (size_t i = 0; tab[i] != NULL; i++)
|
||||
free(tab[i]);
|
||||
free(tab);
|
||||
}
|
||||
|
||||
int fill_tab(char **tab, const char* str, const char* charset)
|
||||
{
|
||||
const char *start;
|
||||
size_t len = 0;
|
||||
size_t i = 0;
|
||||
|
||||
while (str[i] != '\0')
|
||||
{
|
||||
while (str[i] != '\0' && (is_in_quote(str, i) || strchr(charset, str[i]) != NULL))
|
||||
i++;
|
||||
if (str[i] == '\0')
|
||||
return len;
|
||||
start = str + i;
|
||||
while (str[i] != '\0' && (is_in_quote(str, i) || strchr(charset, str[i]) == NULL))
|
||||
i++;
|
||||
tab[len] = strndup(start, (str + i) - start);
|
||||
if (tab[len] == NULL)
|
||||
{
|
||||
free_tab(tab);
|
||||
return 1;
|
||||
}
|
||||
len++;
|
||||
}
|
||||
}
|
||||
|
||||
char **split_quoted_charset(const char *str, const char *charset)
|
||||
{
|
||||
size_t len = get_len(str, charset);
|
||||
char **tab = malloc((len + 1) * sizeof(char *));
|
||||
if (tab == NULL)
|
||||
return NULL;
|
||||
tab[len] = NULL;
|
||||
if (fill_tab(tab, str, charset))
|
||||
return NULL;
|
||||
return (tab);
|
||||
}
|
||||
|
||||
int main(int ac, char** av)
|
||||
{
|
||||
size_t i = 0;
|
||||
char** tab;
|
||||
if (ac != 2)
|
||||
return 1;
|
||||
tab = split_quoted_charset(av[1], " \t");
|
||||
while ( tab[i] ) printf( "%s\n", tab[i++] );
|
||||
free_tab(tab);
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
int is_in_quote(const char *str);
|
||||
int is_in_quote(const char *str, size_t pos);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user