From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id 4D29838388CD for ; Fri, 16 Dec 2022 06:01:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4D29838388CD Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 2BG61nPA020732 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 16 Dec 2022 01:01:54 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 2BG61nPA020732 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1671170514; bh=wWfE6KyICeq+ylLD7iBVYE7W/7kvJA0jPR3FsLKEdwY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HoBwAgn9p0IZXbdmMfLE0udyw+Gi03z40qA57sjRZT/HOPfTK7xXql3z08XfK5Py/ eKXeFzEhgBxlJ+9UTWmIW1yPBNDphMJu+we5lSGDKFd7b1PPBohkD5PFemZfzTQH5h BxgJ3snJI15k/0R4lnV63zOGSSQp8eaV43+pgN98= Received: from simark.localdomain (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 889C01E11A; Fri, 16 Dec 2022 01:01:49 -0500 (EST) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 1/2] gdbsupport: add string_xml_appendf Date: Fri, 16 Dec 2022 01:01:47 -0500 Message-Id: <20221216060148.1261366-2-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221216060148.1261366-1-simon.marchi@polymtl.ca> References: <20221216060148.1261366-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Fri, 16 Dec 2022 06:01:49 +0000 X-Spam-Status: No, score=-3189.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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