mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 01:07:52 +00:00
Implement -list-thread-groups --available
* Makefile.in (XMLFILES): Add osdata.dtd.
(SFILES): Add osdata.c.
(COMMON_OBS): Add osdata.o.
* linux-nat.c: Include pwd.h, sys/types.h, gdb_dirent.h and xml-support.h.
(linux_nat_xfer_osdata): New function.
(linux_xfer_partial): Handle TARGET_OBJECT_OSDATA.
* osdata.c: New file.
* osdata.h: New file.
* remote.c (PACKET_qXfer_osdata): New packet enum.
(remote_protocol_features): Add "qXfer:osdata:read".
(remote_read_qxfer): Handle TARGET_OBJECT_OSDATA.
(extended_remote_can_run): New.
(init_extended_remote_ops): Set to_can_run to
extended_remote_can_run.
(_initialize_remote): Add packet config command for
"qXfer:osdata:read".
* xml-support.c (obstack_xml_printf): New function.
* xml-support.h (obstack_xml_printf): Declare.
* target.c (target_get_osdata): New function.
* target.h (enum target_object): Add TARGET_OBJECT_OSDATA.
(target_os_data): Declare.
* features/osdata.dtd: New file.
* mi/mi-main.c (mi_list_thread_groups): Handle the --available
option.
This commit is contained in:
@@ -1291,3 +1291,95 @@ xml_escape_text (const char *text)
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
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 = realloc (buffer->buffer, new_buffer_size);
|
||||
if (!new_buffer)
|
||||
abort ();
|
||||
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;
|
||||
|
||||
free (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)
|
||||
{
|
||||
switch (*f)
|
||||
{
|
||||
case 's':
|
||||
{
|
||||
char *p;
|
||||
char *a = va_arg (ap, char *);
|
||||
buffer_grow (buffer, prev, f - prev - 1);
|
||||
p = xml_escape_text (a);
|
||||
buffer_grow_str (buffer, p);
|
||||
free (p);
|
||||
prev = f + 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
percent = 0;
|
||||
}
|
||||
else if (*f == '%')
|
||||
percent = 1;
|
||||
}
|
||||
|
||||
buffer_grow_str (buffer, prev);
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user