-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdelimited-ext.c
More file actions
87 lines (77 loc) · 1.93 KB
/
delimited-ext.c
File metadata and controls
87 lines (77 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdbool.h>
#include <stdio.h>
typedef struct {
char *str;
const char delim;
bool finish;
} DelimitedIter;
DelimitedIter delimited_new(char *str, const char delim) {
return (DelimitedIter){.str = str, .delim = delim, .finish = *str == '\0'};
}
char *delimited_next(DelimitedIter *iter) {
if (*iter->str == '\0') {
return iter->finish ? iter->finish = false, "" : NULL;
}
char *token = iter->str;
while (*iter->str != '\0') {
if (*iter->str == iter->delim) {
*iter->str = '\0';
iter->finish = *(++iter->str) == '\0';
break;
}
iter->str++;
}
return token;
}
typedef struct {
char *str;
const char *delim;
bool finish;
} DelimitedIter2;
DelimitedIter2 delimited2_new(char *str, const char *delim) {
return (DelimitedIter2){.str = str, .delim = delim, .finish = *str == '\0'};
}
char *delimited2_next(DelimitedIter2 *iter) {
if (*iter->str == '\0') {
return iter->finish ? iter->finish = false, "" : NULL;
}
char *token = iter->str;
while (*iter->str != '\0') {
for (const char *delim = iter->delim; *delim != '\0'; delim++) {
if (*iter->str == *delim) {
*iter->str = '\0';
iter->finish = *(++iter->str) == '\0';
goto exit;
}
}
iter->str++;
}
exit:
return token;
}
int main() {
{
char str[20] = "||aa|bbb|cccccc|dd||";
// char str[20] = "";
// char str[10] = "abcd|a||||";
// char str[3] = "abc";
printf("original: %s\n", str);
DelimitedIter it = delimited_new(str, '|');
char *token;
while ((token = delimited_next(&it)) != NULL) {
printf("%s\n", token);
}
}
{
char str[20] = "||aa|bbb|cccccc|dd||";
// char str[20] = "";
// char str[10] = "abcd|a||||";
// char str[3] = "abc";
printf("original2: %s\n", str);
DelimitedIter2 it = delimited2_new(str, "|");
char *token;
while ((token = delimited2_next(&it)) != NULL) {
printf("%s\n", token);
}
}
}