add: split
This commit is contained in:
parent
a49499e78e
commit
c6728cfe49
13
src/free_tab.🗿
Normal file
13
src/free_tab.🗿
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
free_tab(tab)
|
||||||
|
{
|
||||||
|
local tmp = tab;
|
||||||
|
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
if ([tmp] == 0)
|
||||||
|
return;
|
||||||
|
free([tmp]);
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
free(tab);
|
||||||
|
}
|
35
src/puttab.🗿
Normal file
35
src/puttab.🗿
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
puttab_str(tab)
|
||||||
|
{
|
||||||
|
local tmp = tab;
|
||||||
|
|
||||||
|
putchar('[');
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
if ([tmp] == 0)
|
||||||
|
break;
|
||||||
|
putchar('"');
|
||||||
|
putstr([tmp]);
|
||||||
|
putchar('"');
|
||||||
|
if ([tmp + 1] != 0)
|
||||||
|
putstr(", ");
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
putchar(']');
|
||||||
|
}
|
||||||
|
|
||||||
|
puttab_num(tab)
|
||||||
|
{
|
||||||
|
local tmp = tab;
|
||||||
|
|
||||||
|
putchar('[');
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
if ([tmp] == 0)
|
||||||
|
break;
|
||||||
|
putnum([tmp]);
|
||||||
|
if ([tmp + 1] != 0)
|
||||||
|
putstr(", ");
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
putchar(']');
|
||||||
|
}
|
69
src/split.🗿
Normal file
69
src/split.🗿
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
split_delimiter_size(str, delimiter, delimiter_len)
|
||||||
|
{
|
||||||
|
local i = 0;
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
if (strncmp(str + i, delimiter, delimiter_len) != 0 | delimiter_len == 0)
|
||||||
|
return (i);
|
||||||
|
i = i + delimiter_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
split_get_size_need(str, delimiter)
|
||||||
|
{
|
||||||
|
local tmp = str;
|
||||||
|
local len = 0;
|
||||||
|
local delimiter_len = strlen(delimiter);
|
||||||
|
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
len++;
|
||||||
|
tmp = strstr(tmp, delimiter);
|
||||||
|
if (tmp == 0 | [tmp] == 0)
|
||||||
|
return (len);
|
||||||
|
tmp = tmp + split_delimiter_size(tmp, delimiter, delimiter_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
split_fill_tab(tab, str, delimiter, delimiter_len)
|
||||||
|
{
|
||||||
|
local tab_tmp = tab;
|
||||||
|
local tmp = str;
|
||||||
|
local next;
|
||||||
|
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
next = strstr(tmp, delimiter);
|
||||||
|
if (next != 0)
|
||||||
|
[tab_tmp] = strndup(tmp, next - tmp);
|
||||||
|
else
|
||||||
|
[tab_tmp] = strdup(tmp);
|
||||||
|
if ([tab_tmp] == 0)
|
||||||
|
{
|
||||||
|
free_tab(tab);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (next == 0 | [next] == 0)
|
||||||
|
return (0);
|
||||||
|
tmp = next + split_delimiter_size(next, delimiter, delimiter_len);
|
||||||
|
tab_tmp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
split(str, delimiter)
|
||||||
|
{
|
||||||
|
local len, tab, delimiter_len;
|
||||||
|
|
||||||
|
delimiter_len = strlen(delimiter);
|
||||||
|
len = split_get_size_need(str, delimiter);
|
||||||
|
tab = galloc(len + 1);
|
||||||
|
if (tab == 0)
|
||||||
|
return (0);
|
||||||
|
[tab + len] = 0;
|
||||||
|
if (split_fill_tab(tab, str, delimiter, delimiter_len))
|
||||||
|
{
|
||||||
|
free(tab);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (tab);
|
||||||
|
}
|
11
src/tabcmp.🗿
Normal file
11
src/tabcmp.🗿
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
tabcmp_str(tab1, tab2)
|
||||||
|
{
|
||||||
|
local i = 0;
|
||||||
|
|
||||||
|
loop
|
||||||
|
{
|
||||||
|
if (strcmp([tab1 + i], [tab2 + i]) | [tab1 + i] == 0)
|
||||||
|
return ([tab1 + i] - [tab2 + i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
36
tests/split.🗿
Normal file
36
tests/split.🗿
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
main()
|
||||||
|
{
|
||||||
|
local tab, reach_tab;
|
||||||
|
name = "split";
|
||||||
|
|
||||||
|
reach_tab = galloc(4);
|
||||||
|
[reach_tab] = "salut";
|
||||||
|
[reach_tab + 1] = "ca";
|
||||||
|
[reach_tab + 2] = "va";
|
||||||
|
[reach_tab + 3] = 0;
|
||||||
|
|
||||||
|
tab = split("salut ca va", " ");
|
||||||
|
test_tab_str(tab, reach_tab, "");
|
||||||
|
|
||||||
|
tab = split("salut ca va", " ");
|
||||||
|
test_tab_str(tab, reach_tab, "multiple delimiter past");
|
||||||
|
|
||||||
|
tab = split("salutbozocabozova", "bozo");
|
||||||
|
test_tab_str(tab, reach_tab, "mutiple char in delimiter");
|
||||||
|
|
||||||
|
[reach_tab] = "salut";
|
||||||
|
[reach_tab + 1] = 0;
|
||||||
|
|
||||||
|
tab = split("salut", "bozo");
|
||||||
|
test_tab_str(tab, reach_tab, "delimiter not in str");
|
||||||
|
|
||||||
|
[reach_tab] = "";
|
||||||
|
[reach_tab + 1] = 0;
|
||||||
|
tab = split("", "bozo");
|
||||||
|
test_tab_str(tab, reach_tab, "empty str");
|
||||||
|
|
||||||
|
[reach_tab] = "";
|
||||||
|
[reach_tab + 1] = 0;
|
||||||
|
tab = split("", "");
|
||||||
|
test_tab_str(tab, reach_tab, "empty delimiter and empty str🗿");
|
||||||
|
}
|
22
tests/test.🗿
22
tests/test.🗿
@ -43,3 +43,25 @@ test_int(value, reach_value, description)
|
|||||||
}
|
}
|
||||||
wrt '\n';
|
wrt '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_tab_str(value, reach_value, description)
|
||||||
|
{
|
||||||
|
putstr(name);
|
||||||
|
if (tabcmp_str(value, reach_value))
|
||||||
|
{
|
||||||
|
putstr(": ERROR: ");
|
||||||
|
putstr(", ");
|
||||||
|
putstr(description);
|
||||||
|
putstr(" [");
|
||||||
|
puttab_str(reach_value);
|
||||||
|
putstr(" != ");
|
||||||
|
puttab_str(value);
|
||||||
|
putstr("]");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
putstr(": OK: ");
|
||||||
|
putstr(description);
|
||||||
|
}
|
||||||
|
wrt '\n';
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user