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.
This commit is contained in:
parent
6fb16ce6ea
commit
ccb2231cd8
|
@ -1,3 +1,11 @@
|
||||||
|
2018-03-02 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
|
* charset.c (struct charset_vector): New.
|
||||||
|
(charsets): Change type to charset_vector.
|
||||||
|
(find_charset_names): Adjust.
|
||||||
|
(add_one): Adjust.
|
||||||
|
(_initialize_charset): Adjust.
|
||||||
|
|
||||||
2018-03-02 Simon Marchi <simon.marchi@polymtl.ca>
|
2018-03-02 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
* progspace.h (struct program_space) <deleted_solibs>: Change
|
* progspace.h (struct program_space) <deleted_solibs>: Change
|
||||||
|
|
|
@ -705,21 +705,33 @@ wchar_iterator::iterate (enum wchar_iterate_result *out_result,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The charset.c module initialization function. */
|
struct charset_vector
|
||||||
|
{
|
||||||
|
~charset_vector ()
|
||||||
|
{
|
||||||
|
clear ();
|
||||||
|
}
|
||||||
|
|
||||||
static VEC (char_ptr) *charsets;
|
void clear ()
|
||||||
|
{
|
||||||
|
for (char *c : charsets)
|
||||||
|
xfree (c);
|
||||||
|
|
||||||
|
charsets.clear ();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char *> charsets;
|
||||||
|
};
|
||||||
|
|
||||||
|
static charset_vector charsets;
|
||||||
|
|
||||||
#ifdef PHONY_ICONV
|
#ifdef PHONY_ICONV
|
||||||
|
|
||||||
static void
|
static void
|
||||||
find_charset_names (void)
|
find_charset_names (void)
|
||||||
{
|
{
|
||||||
/* Cast is fine here, because CHARSETS is never released. Note that
|
charsets.charsets.push_back (xstrdup (GDB_DEFAULT_HOST_CHARSET));
|
||||||
the vec does not hold "const char *" pointers instead of "char *"
|
charsets.charsets.push_back (NULL);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* PHONY_ICONV */
|
#else /* PHONY_ICONV */
|
||||||
|
@ -740,7 +752,7 @@ add_one (unsigned int count, const char *const *names, void *data)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < count; ++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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -749,7 +761,8 @@ static void
|
||||||
find_charset_names (void)
|
find_charset_names (void)
|
||||||
{
|
{
|
||||||
iconvlist (add_one, NULL);
|
iconvlist (add_one, NULL);
|
||||||
VEC_safe_push (char_ptr, charsets, NULL);
|
|
||||||
|
charsets.charsets.push_back (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -879,7 +892,7 @@ find_charset_names (void)
|
||||||
break;
|
break;
|
||||||
keep_going = *p;
|
keep_going = *p;
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
VEC_safe_push (char_ptr, charsets, xstrdup (start));
|
charsets.charsets.push_back (xstrdup (start));
|
||||||
if (!keep_going)
|
if (!keep_going)
|
||||||
break;
|
break;
|
||||||
/* Skip any extra spaces. */
|
/* Skip any extra spaces. */
|
||||||
|
@ -900,11 +913,10 @@ find_charset_names (void)
|
||||||
if (fail)
|
if (fail)
|
||||||
{
|
{
|
||||||
/* Some error occurred, so drop the vector. */
|
/* Some error occurred, so drop the vector. */
|
||||||
free_char_ptr_vec (charsets);
|
charsets.clear ();
|
||||||
charsets = NULL;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
VEC_safe_push (char_ptr, charsets, NULL);
|
charsets.charsets.push_back (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_ICONVLIST || HAVE_LIBICONVLIST */
|
#endif /* HAVE_ICONVLIST || HAVE_LIBICONVLIST */
|
||||||
|
@ -994,11 +1006,11 @@ void
|
||||||
_initialize_charset (void)
|
_initialize_charset (void)
|
||||||
{
|
{
|
||||||
/* The first element is always "auto". */
|
/* The first element is always "auto". */
|
||||||
VEC_safe_push (char_ptr, charsets, xstrdup ("auto"));
|
charsets.charsets.push_back (xstrdup ("auto"));
|
||||||
find_charset_names ();
|
find_charset_names ();
|
||||||
|
|
||||||
if (VEC_length (char_ptr, charsets) > 1)
|
if (charsets.charsets.size () > 1)
|
||||||
charset_enum = (const char **) VEC_address (char_ptr, charsets);
|
charset_enum = (const char **) charsets.charsets.data ();
|
||||||
else
|
else
|
||||||
charset_enum = default_charset_names;
|
charset_enum = default_charset_names;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue