[utils] Version of string_split for single character delimiters which modifies the input string directly rather than creating (essentially) a copy

This commit is contained in:
Al
2015-09-09 17:41:23 -07:00
parent c1da2fa94b
commit b3f89a207a
2 changed files with 60 additions and 15 deletions

View File

@@ -21,8 +21,7 @@ int string_compare_len_case_insensitive(const char *str1, const char *str2, size
unsigned char c1, c2;
if (!len)
return 0;
if (len == 0) return 0;
do {
c1 = *s1++;
@@ -424,7 +423,15 @@ char_array *char_array_from_string(char *str) {
size_t len = strlen(str);
char_array *array = char_array_new_size(len+1);
strcpy(array->a, str);
array->n = strlen(str);
array->n = len;
return array;
}
char_array *char_array_from_string_no_copy(char *str, size_t n) {
char_array *array = malloc(sizeof(char_array));
array->a = str;
array->m = n;
array->n = n;
return array;
}
@@ -773,6 +780,27 @@ cstring_array *cstring_array_split(char *str, const char *separator, size_t sepa
return string_array;
}
cstring_array *cstring_array_split_no_copy(char *str, char separator, int *count) {
*count = 0;
char *ptr = str;
size_t len = strlen(str);
size_t skip_len = 1;
for (int i = 0; i < len; i++, ptr++) {
if (*ptr == separator) {
*ptr = '\0';
}
}
char_array *array = char_array_from_string_no_copy(str, len);
cstring_array *string_array = cstring_array_from_char_array(array);
*count = cstring_array_num_strings(string_array);
return string_array;
}
char **cstring_array_to_strings(cstring_array *self) {
char **strings = malloc(self->indices->n * sizeof(char *));