diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/common/gdb_vecs.c | 59 | ||||
-rw-r--r-- | gdb/common/gdb_vecs.h | 3 |
3 files changed, 53 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d7d54e2..a19de9f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2014-01-17 Doug Evans <dje@google.com> + * common/gdb_vecs.c (delim_string_to_char_ptr_vec_append): New + function, contents of dirnames_to_char_ptr_vec_append moved here. + (delim_string_to_char_ptr_vec): New function. + (dirnames_to_char_ptr_vec_append): Rewrite. + * common/gdb_vecs.h (delim_string_to_char_ptr_vec): Declare. + +2014-01-17 Doug Evans <dje@google.com> + * common/common-utils.h (FUNCTION_NAME): Renamed from ASSERT_FUNCTION, and moved here ... * common/gdb_assert.h (ASSERT_FUNCTION): ... from here. diff --git a/gdb/common/gdb_vecs.c b/gdb/common/gdb_vecs.c index b256986..4a3330f 100644 --- a/gdb/common/gdb_vecs.c +++ b/gdb/common/gdb_vecs.c @@ -44,35 +44,60 @@ free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec) VEC_free (char_ptr, char_ptr_vec); } -/* Extended version of dirnames_to_char_ptr_vec - additionally if *VECP is - non-NULL the new list elements from DIRNAMES are appended to the existing - *VECP list of entries. *VECP address will be updated by this call. */ +/* Worker function to split character delimiter separated string of fields + STR into a CHAR_PTR_VEC. */ -void -dirnames_to_char_ptr_vec_append (VEC (char_ptr) **vecp, const char *dirnames) +static void +delim_string_to_char_ptr_vec_append (VEC (char_ptr) **vecp, + const char *str, char delimiter) { do { size_t this_len; - char *next_dir, *this_dir; + char *next_field, *this_field; - next_dir = strchr (dirnames, DIRNAME_SEPARATOR); - if (next_dir == NULL) - this_len = strlen (dirnames); + next_field = strchr (str, delimiter); + if (next_field == NULL) + this_len = strlen (str); else { - this_len = next_dir - dirnames; - next_dir++; + this_len = next_field - str; + next_field++; } - this_dir = xmalloc (this_len + 1); - memcpy (this_dir, dirnames, this_len); - this_dir[this_len] = '\0'; - VEC_safe_push (char_ptr, *vecp, this_dir); + this_field = xmalloc (this_len + 1); + memcpy (this_field, str, this_len); + this_field[this_len] = '\0'; + VEC_safe_push (char_ptr, *vecp, this_field); - dirnames = next_dir; + str = next_field; } - while (dirnames != NULL); + while (str != NULL); +} + +/* Split STR, a list of DELIMITER-separated fields, into a CHAR_PTR_VEC. + + You may modify the returned strings. + Read free_char_ptr_vec for its cleanup. */ + +VEC (char_ptr) * +delim_string_to_char_ptr_vec (const char *str, char delimiter) +{ + VEC (char_ptr) *retval = NULL; + + delim_string_to_char_ptr_vec_append (&retval, str, delimiter); + + return retval; +} + +/* Extended version of dirnames_to_char_ptr_vec - additionally if *VECP is + non-NULL the new list elements from DIRNAMES are appended to the existing + *VECP list of entries. *VECP address will be updated by this call. */ + +void +dirnames_to_char_ptr_vec_append (VEC (char_ptr) **vecp, const char *dirnames) +{ + delim_string_to_char_ptr_vec_append (vecp, dirnames, DIRNAME_SEPARATOR); } /* Split DIRNAMES by DIRNAME_SEPARATOR delimiter and return a list of all the diff --git a/gdb/common/gdb_vecs.h b/gdb/common/gdb_vecs.h index 2978205..0606689 100644 --- a/gdb/common/gdb_vecs.h +++ b/gdb/common/gdb_vecs.h @@ -36,6 +36,9 @@ extern void free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec); extern struct cleanup * make_cleanup_free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec); +extern VEC (char_ptr) *delim_string_to_char_ptr_vec (const char *str, + char delimiter); + extern void dirnames_to_char_ptr_vec_append (VEC (char_ptr) **vecp, const char *dirnames); |