summaryrefslogtreecommitdiff
path: root/gdbsupport
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2022-10-19 21:56:47 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2022-12-16 08:33:12 -0500
commit65cded61a2219719df46066880ccc80c45112130 (patch)
tree6442b8f0339a0bd2ba7ebb80e31c1347e409ec08 /gdbsupport
parent38c0c0cac9f4b0298312ca6791db155dfaaf8442 (diff)
downloadbinutils-gdb-65cded61a2219719df46066880ccc80c45112130.tar.gz
gdbsupport: add string_xml_appendf
Add a version of buffer_xml_printf (defined in gdbsupport/buffer.{c,h}) that appends to an std::string, rather than a struct buffer. Call it "string" rather than "buffer" since it operates on an std::string rather than a buffer. And call it "appendf" rather than "printf", since it appends to and does not replace the string's content. This mirrors string_appendf. Place the new version in gdbsupport/xml-utils.h. The code is a direct copy of buffer_xml_printf. The old version is going to disappear at some point, which is why I didn't do any effort to share code. Change-Id: I30e030627ab4970fd0b9eba3b7e8cec78fa561ba Approved-By: Pedro Alves <pedro@palves.net>
Diffstat (limited to 'gdbsupport')
-rw-r--r--gdbsupport/xml-utils.cc105
-rw-r--r--gdbsupport/xml-utils.h10
2 files changed, 115 insertions, 0 deletions
diff --git a/gdbsupport/xml-utils.cc b/gdbsupport/xml-utils.cc
index e47e23ced59..c74bcdd1155 100644
--- a/gdbsupport/xml-utils.cc
+++ b/gdbsupport/xml-utils.cc
@@ -61,3 +61,108 @@ xml_escape_text_append (std::string &result, const char *text)
break;
}
}
+
+/* See xml-utils.h. */
+
+void
+string_xml_appendf (std::string &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.append (prev, f_old - prev - 1);
+ xml_escape_text_append (buffer, str);
+ prev = f + 1;
+ }
+ percent = 0;
+ }
+ else if (*f == '%')
+ percent = 1;
+ }
+
+ buffer.append (prev);
+ va_end (ap);
+}
diff --git a/gdbsupport/xml-utils.h b/gdbsupport/xml-utils.h
index 695263c5b37..09714027030 100644
--- a/gdbsupport/xml-utils.h
+++ b/gdbsupport/xml-utils.h
@@ -30,4 +30,14 @@ extern std::string xml_escape_text (const char *text);
extern void xml_escape_text_append (std::string &result, const char *text);
+/* Simple printf to string function. Current implemented formatters:
+ %s - append an xml escaped text to BUFFER.
+ %d - append an signed integer to BUFFER.
+ %u - append an unsigned integer to BUFFER.
+ %x - append an unsigned integer formatted in hexadecimal to BUFFER.
+ %o - append an unsigned integer formatted in octal to BUFFER. */
+
+void string_xml_appendf (std::string &buffer, const char *format, ...)
+ ATTRIBUTE_PRINTF (2, 3);
+
#endif /* COMMON_XML_UTILS_H */