public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Simon Marchi <simon.marchi@polymtl.ca>
To: gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@polymtl.ca>
Subject: [PATCH 1/2] gdbsupport: add string_xml_appendf
Date: Fri, 16 Dec 2022 01:01:47 -0500	[thread overview]
Message-ID: <20221216060148.1261366-2-simon.marchi@polymtl.ca> (raw)
In-Reply-To: <20221216060148.1261366-1-simon.marchi@polymtl.ca>

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
---
 gdbsupport/xml-utils.cc | 105 ++++++++++++++++++++++++++++++++++++++++
 gdbsupport/xml-utils.h  |  10 ++++
 2 files changed, 115 insertions(+)

diff --git a/gdbsupport/xml-utils.cc b/gdbsupport/xml-utils.cc
index e47e23ced590..c74bcdd1155d 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 695263c5b379..09714027030f 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 */
-- 
2.38.1


  reply	other threads:[~2022-12-16  6:01 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-16  6:01 [PATCH 0/2] Remove one use of struct buffer Simon Marchi
2022-12-16  6:01 ` Simon Marchi [this message]
2022-12-16  6:01 ` [PATCH 2/2] gdb: convert linux-osdata.c from buffer to std::string Simon Marchi
2022-12-16 13:09 ` [PATCH 0/2] Remove one use of struct buffer Pedro Alves
2022-12-16 13:32   ` Simon Marchi
2022-12-16 15:04 ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221216060148.1261366-2-simon.marchi@polymtl.ca \
    --to=simon.marchi@polymtl.ca \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).