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.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/core/lib/support/string.c b/src/core/lib/support/string.c
index 426fce28f8..d20b86f7cf 100644
--- a/src/core/lib/support/string.c
+++ b/src/core/lib/support/string.c
@@ -276,6 +276,32 @@ 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, (size_t)(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) {
+ 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);
+}
+
void *gpr_memrchr(const void *s, int c, size_t n) {
if (s == NULL) return NULL;
char *b = (char *)s;