aboutsummaryrefslogtreecommitdiff
path: root/gdb/charset.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-04-06 20:50:38 -0600
committerTom Tromey <tom@tromey.com>2017-04-12 11:16:18 -0600
commit80a3b8c578e93119183db5f5e34248f843e410a7 (patch)
tree3da3b545ac54585d2fbafdec51d01b756c6318ba /gdb/charset.c
parentc83dd8672698bcdf48d27e267e481230075f5900 (diff)
downloadgdb-80a3b8c578e93119183db5f5e34248f843e410a7.zip
gdb-80a3b8c578e93119183db5f5e34248f843e410a7.tar.gz
gdb-80a3b8c578e93119183db5f5e34248f843e410a7.tar.bz2
Remove cleanup_iconv
This introduces a new "iconv_wrapper" class, to be used in convert_between_encodings. This allows the removal of cleanup_iconv. gdb/ChangeLog 2017-04-12 Tom Tromey <tom@tromey.com> * charset.c (iconv_wrapper): New class. (cleanup_iconv): Remove. (convert_between_encodings): Use it.
Diffstat (limited to 'gdb/charset.c')
-rw-r--r--gdb/charset.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/gdb/charset.c b/gdb/charset.c
index 8302c59..f55e482 100644
--- a/gdb/charset.c
+++ b/gdb/charset.c
@@ -481,14 +481,32 @@ host_hex_value (char c)
/* Public character management functions. */
-/* A cleanup function which is run to close an iconv descriptor. */
-
-static void
-cleanup_iconv (void *p)
+class iconv_wrapper
{
- iconv_t *descp = (iconv_t *) p;
- iconv_close (*descp);
-}
+public:
+
+ iconv_wrapper (const char *to, const char *from)
+ {
+ m_desc = iconv_open (to, from);
+ if (m_desc == (iconv_t) -1)
+ perror_with_name (_("Converting character sets"));
+ }
+
+ ~iconv_wrapper ()
+ {
+ iconv_close (m_desc);
+ }
+
+ size_t convert (ICONV_CONST char **inp, size_t *inleft, char **outp,
+ size_t *outleft)
+ {
+ return iconv (m_desc, inp, inleft, outp, outleft);
+ }
+
+private:
+
+ iconv_t m_desc;
+};
void
convert_between_encodings (const char *from, const char *to,
@@ -496,8 +514,6 @@ convert_between_encodings (const char *from, const char *to,
int width, struct obstack *output,
enum transliterations translit)
{
- iconv_t desc;
- struct cleanup *cleanups;
size_t inleft;
ICONV_CONST char *inp;
unsigned int space_request;
@@ -509,10 +525,7 @@ convert_between_encodings (const char *from, const char *to,
return;
}
- desc = iconv_open (to, from);
- if (desc == (iconv_t) -1)
- perror_with_name (_("Converting character sets"));
- cleanups = make_cleanup (cleanup_iconv, &desc);
+ iconv_wrapper desc (to, from);
inleft = num_bytes;
inp = (ICONV_CONST char *) bytes;
@@ -531,7 +544,7 @@ convert_between_encodings (const char *from, const char *to,
outp = (char *) obstack_base (output) + old_size;
outleft = space_request;
- r = iconv (desc, &inp, &inleft, &outp, &outleft);
+ r = desc.convert (&inp, &inleft, &outp, &outleft);
/* Now make sure that the object on the obstack only includes
bytes we have converted. */
@@ -583,8 +596,6 @@ convert_between_encodings (const char *from, const char *to,
}
}
}
-
- do_cleanups (cleanups);
}