aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/support/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/lib/support/string.c')
-rw-r--r--src/core/lib/support/string.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/core/lib/support/string.c b/src/core/lib/support/string.c
index cafeb4364d..4db3f9a66c 100644
--- a/src/core/lib/support/string.c
+++ b/src/core/lib/support/string.c
@@ -267,5 +267,28 @@ int gpr_stricmp(const char *a, const char *b) {
return ca - cb;
}
+static void add_string_to_split(const char *beg, const char *end, char ***strs,
+ size_t *nstrs, size_t *capstrs) {
+ char *out = gpr_malloc((size_t)(end - beg) + 1);
+ memcpy(out, beg, end - beg);
+ out[end - beg] = 0;
+ if (*nstrs == *capstrs) {
+ *capstrs = GPR_MAX(8, 2 * *capstrs);
+ *strs = gpr_realloc(*strs, sizeof(*strs) * *capstrs);
+ }
+ (*strs)[*nstrs] = out;
+ ++*nstrs;
+}
+
void gpr_string_split(const char *input, const char *sep, char ***strs,
- size_t *nstrs) {}
+ size_t *nstrs) {
+ char *next;
+ *strs = NULL;
+ *nstrs = 0;
+ size_t capstrs = 0;
+ while ((next = strstr(input, sep))) {
+ add_string_to_split(input, next, strs, nstrs, &capstrs);
+ input = next + strlen(sep);
+ }
+ add_string_to_split(input, input + strlen(input), strs, nstrs, &capstrs);
+}