Browse Source
I've long wanted to remove 'struct buffer', and thanks to Simon's earlier patch, I was finally able to do so. My feeling has been that gdb already has several decent structures available for growing strings: std::string of course, but also obstack and even objalloc from BFD and dyn-string from libiberty. The previous patches in this series removed all the uses of struct buffer, so this one can remove the code and the remaining #includes.users/aburgess/try-core-file-pid0
10 changed files with 1 additions and 257 deletions
@ -1,178 +0,0 @@ |
|||
/* A simple growing buffer for GDB.
|
|||
|
|||
Copyright (C) 2009-2023 Free Software Foundation, Inc. |
|||
|
|||
This file is part of GDB. |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
|||
#include "common-defs.h" |
|||
#include "xml-utils.h" |
|||
#include "buffer.h" |
|||
#include "inttypes.h" |
|||
void |
|||
buffer_grow (struct buffer *buffer, const char *data, size_t size) |
|||
{ |
|||
char *new_buffer; |
|||
size_t new_buffer_size; |
|||
|
|||
if (size == 0) |
|||
return; |
|||
|
|||
new_buffer_size = buffer->buffer_size; |
|||
|
|||
if (new_buffer_size == 0) |
|||
new_buffer_size = 1; |
|||
|
|||
while (buffer->used_size + size > new_buffer_size) |
|||
new_buffer_size *= 2; |
|||
new_buffer = (char *) xrealloc (buffer->buffer, new_buffer_size); |
|||
memcpy (new_buffer + buffer->used_size, data, size); |
|||
buffer->buffer = new_buffer; |
|||
buffer->buffer_size = new_buffer_size; |
|||
buffer->used_size += size; |
|||
} |
|||
|
|||
void |
|||
buffer_free (struct buffer *buffer) |
|||
{ |
|||
if (!buffer) |
|||
return; |
|||
|
|||
xfree (buffer->buffer); |
|||
buffer->buffer = NULL; |
|||
buffer->buffer_size = 0; |
|||
buffer->used_size = 0; |
|||
} |
|||
|
|||
void |
|||
buffer_init (struct buffer *buffer) |
|||
{ |
|||
memset (buffer, 0, sizeof (*buffer)); |
|||
} |
|||
|
|||
char* |
|||
buffer_finish (struct buffer *buffer) |
|||
{ |
|||
char *ret = buffer->buffer; |
|||
buffer->buffer = NULL; |
|||
buffer->buffer_size = 0; |
|||
buffer->used_size = 0; |
|||
return ret; |
|||
} |
|||
|
|||
void |
|||
buffer_xml_printf (struct buffer *buffer, const char *format, ...) |
|||
{ |
|||
va_list ap; |
|||
const char *f; |
|||
const char *prev; |
|||
int percent = 0; |
|||
|
|||
va_start (ap, format); |
|||
|
|||
prev = format; |
|||
for (f = format; *f; f++) |
|||
{ |
|||
if (percent) |
|||
{ |
|||
char buf[32]; |
|||
char *str = buf; |
|||
const char *f_old = f; |
|||
|
|||
switch (*f) |
|||
{ |
|||
case 's': |
|||
str = va_arg (ap, char *); |
|||
break; |
|||
case 'd': |
|||
sprintf (str, "%d", va_arg (ap, int)); |
|||
break; |
|||
case 'u': |
|||
sprintf (str, "%u", va_arg (ap, unsigned int)); |
|||
break; |
|||
case 'x': |
|||
sprintf (str, "%x", va_arg (ap, unsigned int)); |
|||
break; |
|||
case 'o': |
|||
sprintf (str, "%o", va_arg (ap, unsigned int)); |
|||
break; |
|||
case 'l': |
|||
f++; |
|||
switch (*f) |
|||
{ |
|||
case 'd': |
|||
sprintf (str, "%ld", va_arg (ap, long)); |
|||
break; |
|||
case 'u': |
|||
sprintf (str, "%lu", va_arg (ap, unsigned long)); |
|||
break; |
|||
case 'x': |
|||
sprintf (str, "%lx", va_arg (ap, unsigned long)); |
|||
break; |
|||
case 'o': |
|||
sprintf (str, "%lo", va_arg (ap, unsigned long)); |
|||
break; |
|||
case 'l': |
|||
f++; |
|||
switch (*f) |
|||
{ |
|||
case 'd': |
|||
sprintf (str, "%" PRId64, |
|||
(int64_t) va_arg (ap, long long)); |
|||
break; |
|||
case 'u': |
|||
sprintf (str, "%" PRIu64, |
|||
(uint64_t) va_arg (ap, unsigned long long)); |
|||
break; |
|||
case 'x': |
|||
sprintf (str, "%" PRIx64, |
|||
(uint64_t) va_arg (ap, unsigned long long)); |
|||
break; |
|||
case 'o': |
|||
sprintf (str, "%" PRIo64, |
|||
(uint64_t) va_arg (ap, unsigned long long)); |
|||
break; |
|||
default: |
|||
str = 0; |
|||
break; |
|||
} |
|||
break; |
|||
default: |
|||
str = 0; |
|||
break; |
|||
} |
|||
break; |
|||
default: |
|||
str = 0; |
|||
break; |
|||
} |
|||
|
|||
if (str) |
|||
{ |
|||
buffer_grow (buffer, prev, f_old - prev - 1); |
|||
std::string p = xml_escape_text (str); |
|||
buffer_grow_str (buffer, p.c_str ()); |
|||
prev = f + 1; |
|||
} |
|||
percent = 0; |
|||
} |
|||
else if (*f == '%') |
|||
percent = 1; |
|||
} |
|||
|
|||
buffer_grow_str (buffer, prev); |
|||
va_end (ap); |
|||
} |
|||
|
|||
@ -1,68 +0,0 @@ |
|||
/* A simple growing buffer for GDB.
|
|||
|
|||
Copyright (C) 2009-2023 Free Software Foundation, Inc. |
|||
|
|||
This file is part of GDB. |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
|||
#ifndef COMMON_BUFFER_H |
|||
#define COMMON_BUFFER_H |
|||
|
|||
struct buffer |
|||
{ |
|||
char *buffer; |
|||
size_t buffer_size; /* allocated size */ |
|||
size_t used_size; /* actually used size */ |
|||
}; |
|||
|
|||
/* Append DATA of size SIZE to the end of BUFFER. Grows the buffer to
|
|||
accommodate the new data. */ |
|||
void buffer_grow (struct buffer *buffer, const char *data, size_t size); |
|||
|
|||
/* Append C to the end of BUFFER. Grows the buffer to accommodate the
|
|||
new data. */ |
|||
|
|||
static inline void |
|||
buffer_grow_char (struct buffer *buffer, char c) |
|||
{ |
|||
buffer_grow (buffer, &c, 1); |
|||
} |
|||
|
|||
/* Release any memory held by BUFFER. */ |
|||
void buffer_free (struct buffer *buffer); |
|||
|
|||
/* Initialize BUFFER. BUFFER holds no memory afterwards. */ |
|||
void buffer_init (struct buffer *buffer); |
|||
|
|||
/* Return a pointer into BUFFER data, effectively transferring
|
|||
ownership of the buffer memory to the caller. Calling buffer_free |
|||
afterwards has no effect on the returned data. */ |
|||
char* buffer_finish (struct buffer *buffer); |
|||
|
|||
/* Simple printf to buffer function. Current implemented formatters:
|
|||
%s - grow an xml escaped text in BUFFER. |
|||
%d - grow an signed integer in BUFFER. |
|||
%u - grow an unsigned integer in BUFFER. |
|||
%x - grow an unsigned integer formatted in hexadecimal in BUFFER. |
|||
%o - grow an unsigned integer formatted in octal in BUFFER. */ |
|||
void buffer_xml_printf (struct buffer *buffer, const char *format, ...) |
|||
ATTRIBUTE_PRINTF (2, 3); |
|||
|
|||
#define buffer_grow_str(BUFFER,STRING) \ |
|||
buffer_grow (BUFFER, STRING, strlen (STRING)) |
|||
#define buffer_grow_str0(BUFFER,STRING) \ |
|||
buffer_grow (BUFFER, STRING, strlen (STRING) + 1) |
|||
|
|||
#endif /* COMMON_BUFFER_H */ |
|||
Loading…
Reference in new issue