This was suggested by Simon during a code review of this package upstream.
The upside is that this makes the function's API more natural and C++.
The downside is an extra malloc, which might be the reason why we went
for using a unique_xmalloc_ptr in the first place. Since this function
is not expected to be called frequently, the API improvement might be
worth the performance impact.
gdb/ChangeLog:
* gmp-utils.h (gmp_string_printf): Rename from gmp_string_asprintf.
Change return type to std::string. Update all callers.
* gmp-utils.c (gmp_string_printf): Likewise.
+2020-11-24 Joel Brobecker <brobecker@adacore.com>
+
+ * gmp-utils.h (gmp_string_printf): Rename from gmp_string_asprintf.
+ Change return type to std::string. Update all callers.
+ * gmp-utils.c (gmp_string_printf): Likewise.
+
2020-11-24 Joel Brobecker <brobecker@adacore.com>
* unittests/gmp-utils-selftests.c (write_fp_test): Use mpq_set_si
print_fixed_point_type_info (struct type *type, int spaces)
{
printfi_filtered (spaces + 2, "scaling factor: %s\n",
- fixed_point_scaling_factor (type).str ().get ());
+ fixed_point_scaling_factor (type).str ().c_str ());
}
static struct obstack dont_print_type_obstack;
/* See gmp-utils.h. */
-gdb::unique_xmalloc_ptr<char>
-gmp_string_asprintf (const char *fmt, ...)
+std::string
+gmp_string_printf (const char *fmt, ...)
{
va_list vp;
- char *buf;
va_start (vp, fmt);
- gmp_vasprintf (&buf, fmt, vp);
+ int size = gmp_vsnprintf (NULL, 0, fmt, vp);
va_end (vp);
- return gdb::unique_xmalloc_ptr<char> (buf);
+ std::string str (size, '\0');
+
+ /* C++11 and later guarantee std::string uses contiguous memory and
+ always includes the terminating '\0'. */
+ va_start (vp, fmt);
+ gmp_vsprintf (&str[0], fmt, vp);
+ va_end (vp);
+
+ return str;
}
/* See gmp-utils.h. */
#include <gmp.h>
#include "gdbsupport/traits.h"
-/* Same as gmp_asprintf, but returning a convenient wrapper type. */
+/* Same as gmp_asprintf, but returning an std::string. */
-gdb::unique_xmalloc_ptr<char> gmp_string_asprintf (const char *fmt, ...);
+std::string gmp_string_printf (const char *fmt, ...);
/* A class to make it easier to use GMP's mpz_t values within GDB. */
bool unsigned_p) const;
/* Return a string containing VAL. */
- gdb::unique_xmalloc_ptr<char> str () const
- { return gmp_string_asprintf ("%Zd", val); }
+ std::string str () const { return gmp_string_printf ("%Zd", val); }
/* The destructor. */
~gdb_mpz () { mpz_clear (val); }
}
/* Return a string representing VAL as "<numerator> / <denominator>". */
- gdb::unique_xmalloc_ptr<char> str () const
- { return gmp_string_asprintf ("%Qd", val); }
+ std::string str () const { return gmp_string_printf ("%Qd", val); }
/* Return VAL rounded to the nearest integer. */
gdb_mpz get_rounded () const;
void
print_type_fixed_point (struct type *type, struct ui_file *stream)
{
- gdb::unique_xmalloc_ptr<char> small_img
- = fixed_point_scaling_factor (type).str ();
+ std::string small_img = fixed_point_scaling_factor (type).str ();
fprintf_filtered (stream, "%s-byte fixed point (small = %s)",
- pulongest (TYPE_LENGTH (type)), small_img.get ());
+ pulongest (TYPE_LENGTH (type)), small_img.c_str ());
}
/* Dump details of a type specified either directly or indirectly.
fixed_point_scaling_factor (type));
const char *fmt = TYPE_LENGTH (type) < 4 ? "%.11Fg" : "%.17Fg";
- gdb::unique_xmalloc_ptr<char> str = gmp_string_asprintf (fmt, f.val);
- fprintf_filtered (stream, "%s", str.get ());
+ std::string str = gmp_string_printf (fmt, f.val);
+ fprintf_filtered (stream, "%s", str.c_str ());
}
}