diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2022-10-19 21:56:47 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2022-12-16 08:33:12 -0500 |
commit | 65cded61a2219719df46066880ccc80c45112130 (patch) | |
tree | 6442b8f0339a0bd2ba7ebb80e31c1347e409ec08 | |
parent | 38c0c0cac9f4b0298312ca6791db155dfaaf8442 (diff) | |
download | fsf-binutils-gdb-65cded61a2219719df46066880ccc80c45112130.zip fsf-binutils-gdb-65cded61a2219719df46066880ccc80c45112130.tar.gz fsf-binutils-gdb-65cded61a2219719df46066880ccc80c45112130.tar.bz2 |
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>
-rw-r--r-- | gdbsupport/xml-utils.cc | 105 | ||||
-rw-r--r-- | gdbsupport/xml-utils.h | 10 |
2 files changed, 115 insertions, 0 deletions
diff --git a/gdbsupport/xml-utils.cc b/gdbsupport/xml-utils.cc index e47e23c..c74bcdd 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 695263c..0971402 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 */ |