diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2018-03-02 23:22:09 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2018-03-02 23:22:09 -0500 |
commit | ccb2231cd848c89f04ab2e1e54b013d69ea34893 (patch) | |
tree | cf96bd8b8ed26c6700d0539a1750aa02c4c8d9bb /gdb/charset.c | |
parent | 6fb16ce6eaba92b86a22eac58eb0eb61b3fd8804 (diff) | |
download | fsf-binutils-gdb-ccb2231cd848c89f04ab2e1e54b013d69ea34893.zip fsf-binutils-gdb-ccb2231cd848c89f04ab2e1e54b013d69ea34893.tar.gz fsf-binutils-gdb-ccb2231cd848c89f04ab2e1e54b013d69ea34893.tar.bz2 |
C++ify charsets
This patch makes the charset list an std::vector instead of a VEC.
Because we must have access to the raw pointers as a simple array, we
can't use a vector of unique_ptr/unique_xmalloc_ptr. Therefore, wrap
the vector in a simple class to facilitate the cleanup. This allows
removing one usage of free_char_ptr_vec.
gdb/ChangeLog:
* charset.c (struct charset_vector): New.
(charsets): Change type to charset_vector.
(find_charset_names): Adjust.
(add_one): Adjust.
(_initialize_charset): Adjust.
Diffstat (limited to 'gdb/charset.c')
-rw-r--r-- | gdb/charset.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/gdb/charset.c b/gdb/charset.c index 98a5179..fcb24a4 100644 --- a/gdb/charset.c +++ b/gdb/charset.c @@ -705,21 +705,33 @@ wchar_iterator::iterate (enum wchar_iterate_result *out_result, return -1; } -/* The charset.c module initialization function. */ +struct charset_vector +{ + ~charset_vector () + { + clear (); + } + + void clear () + { + for (char *c : charsets) + xfree (c); -static VEC (char_ptr) *charsets; + charsets.clear (); + } + + std::vector<char *> charsets; +}; + +static charset_vector charsets; #ifdef PHONY_ICONV static void find_charset_names (void) { - /* Cast is fine here, because CHARSETS is never released. Note that - the vec does not hold "const char *" pointers instead of "char *" - because the non-phony version stores heap-allocated strings in - it. */ - VEC_safe_push (char_ptr, charsets, (char *) GDB_DEFAULT_HOST_CHARSET); - VEC_safe_push (char_ptr, charsets, NULL); + charsets.charsets.push_back (xstrdup (GDB_DEFAULT_HOST_CHARSET)); + charsets.charsets.push_back (NULL); } #else /* PHONY_ICONV */ @@ -740,7 +752,7 @@ add_one (unsigned int count, const char *const *names, void *data) unsigned int i; for (i = 0; i < count; ++i) - VEC_safe_push (char_ptr, charsets, xstrdup (names[i])); + charsets.charsets.push_back (xstrdup (names[i])); return 0; } @@ -749,7 +761,8 @@ static void find_charset_names (void) { iconvlist (add_one, NULL); - VEC_safe_push (char_ptr, charsets, NULL); + + charsets.charsets.push_back (NULL); } #else @@ -879,7 +892,7 @@ find_charset_names (void) break; keep_going = *p; *p = '\0'; - VEC_safe_push (char_ptr, charsets, xstrdup (start)); + charsets.charsets.push_back (xstrdup (start)); if (!keep_going) break; /* Skip any extra spaces. */ @@ -900,11 +913,10 @@ find_charset_names (void) if (fail) { /* Some error occurred, so drop the vector. */ - free_char_ptr_vec (charsets); - charsets = NULL; + charsets.clear (); } else - VEC_safe_push (char_ptr, charsets, NULL); + charsets.charsets.push_back (NULL); } #endif /* HAVE_ICONVLIST || HAVE_LIBICONVLIST */ @@ -994,11 +1006,11 @@ void _initialize_charset (void) { /* The first element is always "auto". */ - VEC_safe_push (char_ptr, charsets, xstrdup ("auto")); + charsets.charsets.push_back (xstrdup ("auto")); find_charset_names (); - if (VEC_length (char_ptr, charsets) > 1) - charset_enum = (const char **) VEC_address (char_ptr, charsets); + if (charsets.charsets.size () > 1) + charset_enum = (const char **) charsets.charsets.data (); else charset_enum = default_charset_names; |