#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int starts_with(const char* s, const char* prefix) {
return strncmp(s, prefix, strlen(prefix)) == 0;
}
char** split_keep_multi_delims(const char* s, const char** delims, int delim_count, int* out_count) {
int capacity = 16;
int count = 0;
char** result = malloc(capacity * sizeof(char*));
const char* p = s;
char buffer[1024];
int buf_i = 0;
while (*p) {
int matched = 0;
for (int i = 0; i < delim_count; i++) {
const char* d = delims[i];
int len = strlen(d);
if (starts_with(p, d)) {
if (buf_i > 0) {
buffer[buf_i] = '\0';
result[count++] = strdup(buffer);
buf_i = 0;
}
result[count++] = strndup(p, len);
p += len;
matched = 1;
break;
}
}
if (!matched) {
buffer[buf_i++] = *p;
p++;
}
if (count >= capacity) {
capacity *= 2;
result = realloc(result, capacity * sizeof(char*));
}
}
if (buf_i > 0) {
buffer[buf_i] = '\0';
result[count++] = strdup(buffer);
}
*out_count = count;
return result;
}
int main() {
const char* s = "aa==bbb---cccc++++ddddd";
const char* delims[] = {"==", "---", "++++"};
int size;
char** parts = split_keep_multi_delims(s, delims, 3, &size);
for (int i = 0; i < size; i++) {
printf("[%s] ", parts[i]);
free(parts[i]);
}
free(parts);
}
/*
[aa] [==] [bbb] [---] [cccc] [++++] [ddddd]
*/