diff options
author | Tom Tromey <tom@tromey.com> | 2017-04-06 20:50:38 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-04-12 11:16:18 -0600 |
commit | 80a3b8c578e93119183db5f5e34248f843e410a7 (patch) | |
tree | 3da3b545ac54585d2fbafdec51d01b756c6318ba /gdb/charset.c | |
parent | c83dd8672698bcdf48d27e267e481230075f5900 (diff) | |
download | gdb-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.c | 43 |
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); } |