Remove cleanup_iconv
authorTom Tromey <tom@tromey.com>
Fri, 7 Apr 2017 02:50:38 +0000 (20:50 -0600)
committerTom Tromey <tom@tromey.com>
Wed, 12 Apr 2017 17:16:18 +0000 (11:16 -0600)
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.

gdb/ChangeLog
gdb/charset.c

index 454bbbbfd80c55864af6c8964e18e181662dc84c..e1c8c311646892da98f9f8cc528f3c1ad4d08cfb 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-12  Tom Tromey  <tom@tromey.com>
+
+       * charset.c (iconv_wrapper): New class.
+       (cleanup_iconv): Remove.
+       (convert_between_encodings): Use it.
+
 2017-04-12  Tom Tromey  <tom@tromey.com>
 
        * symfile.h (increment_reading_symtab): Update type.
index 8302c59bacdf7e6fe9123ca2cc8a31baf8e9c756..f55e482b24b8e4f869b54295a119b020605f41d7 100644 (file)
@@ -481,14 +481,32 @@ host_hex_value (char c)
 \f
 /* 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);
 }
 
 \f
This page took 0.028136 seconds and 4 git commands to generate.