Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / valprint.c
index b19123f23e4efcd8886383d75fa5add95aa2b650..d1d3232e10d7d7d1eb668c6ea2be0bb485b3f799 100644 (file)
@@ -70,9 +70,6 @@ struct converted_character
   int repeat_count;
 };
 
-typedef struct converted_character converted_character_d;
-DEF_VEC_O (converted_character_d);
-
 /* Command lists for set/show print raw.  */
 struct cmd_list_element *setprintrawlist;
 struct cmd_list_element *showprintrawlist;
@@ -1888,7 +1885,7 @@ print_function_pointer_address (const struct value_print_options *options,
 {
   CORE_ADDR func_addr
     = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
-                                         &current_target);
+                                         current_top_target ());
 
   /* If the function pointer is represented by a description, print
      the address of the description.  */
@@ -2099,10 +2096,10 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
   return (nread);
 }
 
-/* Read a string from the inferior, at ADDR, with LEN characters of WIDTH bytes
-   each.  Fetch at most FETCHLIMIT characters.  BUFFER will be set to a newly
-   allocated buffer containing the string, which the caller is responsible to
-   free, and BYTES_READ will be set to the number of bytes read.  Returns 0 on
+/* Read a string from the inferior, at ADDR, with LEN characters of
+   WIDTH bytes each.  Fetch at most FETCHLIMIT characters.  BUFFER
+   will be set to a newly allocated buffer containing the string, and
+   BYTES_READ will be set to the number of bytes read.  Returns 0 on
    success, or a target_xfer_status on failure.
 
    If LEN > 0, reads the lesser of LEN or FETCHLIMIT characters
@@ -2125,20 +2122,18 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
 
 int
 read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
-            enum bfd_endian byte_order, gdb_byte **buffer, int *bytes_read)
+            enum bfd_endian byte_order, gdb::unique_xmalloc_ptr<gdb_byte> *buffer,
+            int *bytes_read)
 {
   int errcode;                 /* Errno returned from bad reads.  */
   unsigned int nfetch;         /* Chars to fetch / chars fetched.  */
   gdb_byte *bufptr;            /* Pointer to next available byte in
                                   buffer.  */
-  struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain.  */
 
   /* Loop until we either have all the characters, or we encounter
      some error, such as bumping into the end of the address space.  */
 
-  *buffer = NULL;
-
-  old_chain = make_cleanup (free_current_contents, buffer);
+  buffer->reset (nullptr);
 
   if (len > 0)
     {
@@ -2146,8 +2141,8 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
         one operation.  */
       unsigned int fetchlen = std::min ((unsigned) len, fetchlimit);
 
-      *buffer = (gdb_byte *) xmalloc (fetchlen * width);
-      bufptr = *buffer;
+      buffer->reset ((gdb_byte *) xmalloc (fetchlen * width));
+      bufptr = buffer->get ();
 
       nfetch = partial_memory_read (addr, bufptr, fetchlen * width, &errcode)
        / width;
@@ -2176,12 +2171,12 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
          nfetch = std::min ((unsigned long) chunksize, fetchlimit - bufsize);
 
          if (*buffer == NULL)
-           *buffer = (gdb_byte *) xmalloc (nfetch * width);
+           buffer->reset ((gdb_byte *) xmalloc (nfetch * width));
          else
-           *buffer = (gdb_byte *) xrealloc (*buffer,
-                                            (nfetch + bufsize) * width);
+           buffer->reset ((gdb_byte *) xrealloc (buffer->release (),
+                                                 (nfetch + bufsize) * width));
 
-         bufptr = *buffer + bufsize * width;
+         bufptr = buffer->get () + bufsize * width;
          bufsize += nfetch;
 
          /* Read as much as we can.  */
@@ -2213,24 +2208,23 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
            }
        }
       while (errcode == 0      /* no error */
-            && bufptr - *buffer < fetchlimit * width   /* no overrun */
+            && bufptr - buffer->get () < fetchlimit * width    /* no overrun */
             && !found_nul);    /* haven't found NUL yet */
     }
   else
     {                          /* Length of string is really 0!  */
       /* We always allocate *buffer.  */
-      *buffer = bufptr = (gdb_byte *) xmalloc (1);
+      buffer->reset ((gdb_byte *) xmalloc (1));
+      bufptr = buffer->get ();
       errcode = 0;
     }
 
   /* bufptr and addr now point immediately beyond the last byte which we
      consider part of the string (including a '\0' which ends the string).  */
-  *bytes_read = bufptr - *buffer;
+  *bytes_read = bufptr - buffer->get ();
 
   QUIT;
 
-  discard_cleanups (old_chain);
-
   return errcode;
 }
 
@@ -2438,11 +2432,11 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream,
 
 static int
 count_next_character (wchar_iterator *iter,
-                     VEC (converted_character_d) **vec)
+                     std::vector<converted_character> *vec)
 {
   struct converted_character *current;
 
-  if (VEC_empty (converted_character_d, *vec))
+  if (vec->empty ())
     {
       struct converted_character tmp;
       gdb_wchar_t *chars;
@@ -2454,10 +2448,10 @@ count_next_character (wchar_iterator *iter,
          gdb_assert (tmp.num_chars < MAX_WCHARS);
          memcpy (tmp.chars, chars, tmp.num_chars * sizeof (gdb_wchar_t));
        }
-      VEC_safe_push (converted_character_d, *vec, &tmp);
+      vec->push_back (tmp);
     }
 
-  current = VEC_last (converted_character_d, *vec);
+  current = &vec->back ();
 
   /* Count repeated characters or bytes.  */
   current->repeat_count = 1;
@@ -2511,7 +2505,7 @@ count_next_character (wchar_iterator *iter,
 
       /* Push this next converted character onto the result vector.  */
       repeat = current->repeat_count;
-      VEC_safe_push (converted_character_d, *vec, &d);
+      vec->push_back (d);
       return repeat;
     }
 }
@@ -2523,13 +2517,13 @@ count_next_character (wchar_iterator *iter,
 
 static void
 print_converted_chars_to_obstack (struct obstack *obstack,
-                                 VEC (converted_character_d) *chars,
+                                 const std::vector<converted_character> &chars,
                                  int quote_char, int width,
                                  enum bfd_endian byte_order,
                                  const struct value_print_options *options)
 {
   unsigned int idx;
-  struct converted_character *elem;
+  const converted_character *elem;
   enum {START, SINGLE, REPEAT, INCOMPLETE, FINISH} state, last;
   gdb_wchar_t wide_quote_char = gdb_btowc (quote_char);
   int need_escape = 0;
@@ -2578,7 +2572,6 @@ print_converted_chars_to_obstack (struct obstack *obstack,
        case REPEAT:
          {
            int j;
-           char *s;
 
            /* We are outputting a character with a repeat count
               greater than options->repeat_count_threshold.  */
@@ -2601,13 +2594,13 @@ print_converted_chars_to_obstack (struct obstack *obstack,
              print_wchar (gdb_WEOF, elem->buf, elem->buflen, width,
                           byte_order, obstack, quote_char, &need_escape);
            obstack_grow_wstr (obstack, LCST ("'"));
-           s = xstrprintf (_(" <repeats %u times>"), elem->repeat_count);
+           std::string s = string_printf (_(" <repeats %u times>"),
+                                          elem->repeat_count);
            for (j = 0; s[j]; ++j)
              {
                gdb_wchar_t w = gdb_btowc (s[j]);
                obstack_grow (obstack, &w, sizeof (gdb_wchar_t));
              }
-           xfree (s);
          }
          break;
 
@@ -2646,7 +2639,7 @@ print_converted_chars_to_obstack (struct obstack *obstack,
       last = state;
       if (state != FINISH)
        {
-         elem = VEC_index (converted_character_d, chars, idx++);
+         elem = &chars[idx++];
          switch (elem->result)
            {
            case wchar_iterate_ok:
@@ -2689,10 +2682,8 @@ generic_printstr (struct ui_file *stream, struct type *type,
   enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
   unsigned int i;
   int width = TYPE_LENGTH (type);
-  struct cleanup *cleanup;
   int finished = 0;
   struct converted_character *last;
-  VEC (converted_character_d) *converted_chars;
 
   if (length == -1)
     {
@@ -2725,9 +2716,7 @@ generic_printstr (struct ui_file *stream, struct type *type,
 
   /* Arrange to iterate over the characters, in wchar_t form.  */
   wchar_iterator iter (string, length * width, encoding, width);
-  converted_chars = NULL;
-  cleanup = make_cleanup (VEC_cleanup (converted_character_d),
-                         &converted_chars);
+  std::vector<converted_character> converted_chars;
 
   /* Convert characters until the string is over or the maximum
      number of printed characters has been reached.  */
@@ -2752,7 +2741,7 @@ generic_printstr (struct ui_file *stream, struct type *type,
 
   /* Get the last element and determine if the entire string was
      processed.  */
-  last = VEC_last (converted_character_d, converted_chars);
+  last = &converted_chars.back ();
   finished = (last->result == wchar_iterate_eof);
 
   /* Ensure that CONVERTED_CHARS is terminated.  */
@@ -2779,8 +2768,6 @@ generic_printstr (struct ui_file *stream, struct type *type,
   obstack_1grow (&output, '\0');
 
   fputs_filtered ((const char *) obstack_base (&output), stream);
-
-  do_cleanups (cleanup);
 }
 
 /* Print a string from the inferior, starting at ADDR and printing up to LEN
@@ -2802,8 +2789,7 @@ val_print_string (struct type *elttype, const char *encoding,
   int found_nul;               /* Non-zero if we found the nul char.  */
   unsigned int fetchlimit;     /* Maximum number of chars to print.  */
   int bytes_read;
-  gdb_byte *buffer = NULL;     /* Dynamically growable fetch buffer.  */
-  struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain.  */
+  gdb::unique_xmalloc_ptr<gdb_byte> buffer;    /* Dynamically growable fetch buffer.  */
   struct gdbarch *gdbarch = get_type_arch (elttype);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int width = TYPE_LENGTH (elttype);
@@ -2821,7 +2807,6 @@ val_print_string (struct type *elttype, const char *encoding,
 
   err = read_string (addr, len, width, fetchlimit, byte_order,
                     &buffer, &bytes_read);
-  old_chain = make_cleanup (xfree, buffer);
 
   addr += bytes_read;
 
@@ -2832,8 +2817,8 @@ val_print_string (struct type *elttype, const char *encoding,
   /* Determine found_nul by looking at the last character read.  */
   found_nul = 0;
   if (bytes_read >= width)
-    found_nul = extract_unsigned_integer (buffer + bytes_read - width, width,
-                                         byte_order) == 0;
+    found_nul = extract_unsigned_integer (buffer.get () + bytes_read - width,
+                                         width, byte_order) == 0;
   if (len == -1 && !found_nul)
     {
       gdb_byte *peekbuf;
@@ -2861,7 +2846,7 @@ val_print_string (struct type *elttype, const char *encoding,
      and then the error message.  */
   if (err == 0 || bytes_read > 0)
     {
-      LA_PRINT_STRING (stream, elttype, buffer, bytes_read / width,
+      LA_PRINT_STRING (stream, elttype, buffer.get (), bytes_read / width,
                       encoding, force_ellipsis, options);
     }
 
@@ -2875,7 +2860,6 @@ val_print_string (struct type *elttype, const char *encoding,
     }
 
   gdb_flush (stream);
-  do_cleanups (old_chain);
 
   return (bytes_read / width);
 }
This page took 0.030519 seconds and 4 git commands to generate.