gdbsupport: add string_xml_appendf
authorSimon Marchi <simon.marchi@polymtl.ca>
Thu, 20 Oct 2022 01:56:47 +0000 (21:56 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Fri, 16 Dec 2022 13:33:12 +0000 (08:33 -0500)
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>
gdbsupport/xml-utils.cc
gdbsupport/xml-utils.h

index e47e23ced590e5644912b80b2c6ef7be6f224e2a..c74bcdd1155d987d5289c5d1665cfa139ec67d06 100644 (file)
@@ -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);
+}
index 695263c5b379b15d3ef23040b30cc66614ac3536..09714027030fbd1daed5ca78d54437681d8ef186 100644 (file)
@@ -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 */