GDBserver
buffer.c
Go to the documentation of this file.
1 /* A simple growing buffer for GDB.
2 
3  Copyright (C) 2009-2015 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "common-defs.h"
21 #include "xml-utils.h"
22 #include "buffer.h"
23 #include "inttypes.h"
24 void
25 buffer_grow (struct buffer *buffer, const char *data, size_t size)
26 {
27  char *new_buffer;
28  size_t new_buffer_size;
29 
30  if (size == 0)
31  return;
32 
33  new_buffer_size = buffer->buffer_size;
34 
35  if (new_buffer_size == 0)
36  new_buffer_size = 1;
37 
38  while (buffer->used_size + size > new_buffer_size)
39  new_buffer_size *= 2;
40  new_buffer = xrealloc (buffer->buffer, new_buffer_size);
41  memcpy (new_buffer + buffer->used_size, data, size);
42  buffer->buffer = new_buffer;
43  buffer->buffer_size = new_buffer_size;
44  buffer->used_size += size;
45 }
46 
47 void
49 {
50  if (!buffer)
51  return;
52 
53  xfree (buffer->buffer);
54  buffer->buffer = NULL;
55  buffer->buffer_size = 0;
56  buffer->used_size = 0;
57 }
58 
59 void
61 {
62  memset (buffer, 0, sizeof (*buffer));
63 }
64 
65 char*
67 {
68  char *ret = buffer->buffer;
69  buffer->buffer = NULL;
70  buffer->buffer_size = 0;
71  buffer->used_size = 0;
72  return ret;
73 }
74 
75 void
76 buffer_xml_printf (struct buffer *buffer, const char *format, ...)
77 {
78  va_list ap;
79  const char *f;
80  const char *prev;
81  int percent = 0;
82 
83  va_start (ap, format);
84 
85  prev = format;
86  for (f = format; *f; f++)
87  {
88  if (percent)
89  {
90  char buf[32];
91  char *p;
92  char *str = buf;
93  const char *f_old = f;
94 
95  switch (*f)
96  {
97  case 's':
98  str = va_arg (ap, char *);
99  break;
100  case 'd':
101  sprintf (str, "%d", va_arg (ap, int));
102  break;
103  case 'u':
104  sprintf (str, "%u", va_arg (ap, unsigned int));
105  break;
106  case 'x':
107  sprintf (str, "%x", va_arg (ap, unsigned int));
108  break;
109  case 'o':
110  sprintf (str, "%o", va_arg (ap, unsigned int));
111  break;
112  case 'l':
113  f++;
114  switch (*f)
115  {
116  case 'd':
117  sprintf (str, "%ld", va_arg (ap, long));
118  break;
119  case 'u':
120  sprintf (str, "%lu", va_arg (ap, unsigned long));
121  break;
122  case 'x':
123  sprintf (str, "%lx", va_arg (ap, unsigned long));
124  break;
125  case 'o':
126  sprintf (str, "%lo", va_arg (ap, unsigned long));
127  break;
128  case 'l':
129  f++;
130  switch (*f)
131  {
132  case 'd':
133  sprintf (str, "%" PRId64,
134  (int64_t) va_arg (ap, long long));
135  break;
136  case 'u':
137  sprintf (str, "%" PRIu64,
138  (uint64_t) va_arg (ap, unsigned long long));
139  break;
140  case 'x':
141  sprintf (str, "%" PRIx64,
142  (uint64_t) va_arg (ap, unsigned long long));
143  break;
144  case 'o':
145  sprintf (str, "%" PRIo64,
146  (uint64_t) va_arg (ap, unsigned long long));
147  break;
148  default:
149  str = 0;
150  break;
151  }
152  break;
153  default:
154  str = 0;
155  break;
156  }
157  break;
158  default:
159  str = 0;
160  break;
161  }
162 
163  if (str)
164  {
165  buffer_grow (buffer, prev, f_old - prev - 1);
166  p = xml_escape_text (str);
167  buffer_grow_str (buffer, p);
168  xfree (p);
169  prev = f + 1;
170  }
171  percent = 0;
172  }
173  else if (*f == '%')
174  percent = 1;
175  }
176 
177  buffer_grow_str (buffer, prev);
178  va_end (ap);
179 }
180 
void buffer_free(struct buffer *buffer)
Definition: buffer.c:48
char * buffer
Definition: buffer.h:25
size_t used_size
Definition: buffer.h:27
char * xml_escape_text(const char *text)
Definition: xml-utils.c:27
void buffer_xml_printf(struct buffer *buffer, const char *format,...)
Definition: buffer.c:76
#define buffer_grow_str(BUFFER, STRING)
Definition: buffer.h:54
PTR xrealloc(PTR ptr, size_t size)
Definition: common-utils.c:51
void xfree(void *ptr)
Definition: common-utils.c:97
void buffer_init(struct buffer *buffer)
Definition: buffer.c:60
Definition: buffer.h:23
size_t buffer_size
Definition: buffer.h:26
char * buffer_finish(struct buffer *buffer)
Definition: buffer.c:66
void buffer_grow(struct buffer *buffer, const char *data, size_t size)
Definition: buffer.c:25