From: Doug Evans Date: Fri, 17 Jan 2014 18:23:29 +0000 (-0800) Subject: Add delim_string_to_char_ptr_vec. X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=749234e5402bddc054d77b4113ecd09eda7a872e;p=deliverable%2Fbinutils-gdb.git Add delim_string_to_char_ptr_vec. * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d7d54e235b..a19de9fa6e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2014-01-17 Doug Evans + + * 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 * common/common-utils.h (FUNCTION_NAME): Renamed from ASSERT_FUNCTION, diff --git a/gdb/common/gdb_vecs.c b/gdb/common/gdb_vecs.c index b25698627c..4a3330f596 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 29782050e2..0606689530 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);