All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Subject: Re: [PATCH v3 03/27] util/hexdump: Use a GString for qemu_hexdump_line
Date: Fri, 12 Apr 2024 19:41:00 +0200	[thread overview]
Message-ID: <698cc16f-cfb4-47a8-86fe-e4c8a6faecb6@linaro.org> (raw)
In-Reply-To: <20240412073346.458116-4-richard.henderson@linaro.org>

On 12/4/24 09:33, Richard Henderson wrote:
> Allocate a new, or append to an existing GString instead of
> using a fixed sized buffer.  Require the caller to determine
> the length of the line -- do not bound len here.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   include/qemu/cutils.h  | 15 ++++++++++-----
>   hw/virtio/vhost-vdpa.c | 14 ++++++++------
>   util/hexdump.c         | 29 +++++++++++++++++------------
>   3 files changed, 35 insertions(+), 23 deletions(-)
> 
> diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
> index d0c5386e6c..7311fb36ca 100644
> --- a/include/qemu/cutils.h
> +++ b/include/qemu/cutils.h
> @@ -252,12 +252,17 @@ static inline const char *yes_no(bool b)
>    */
>   int parse_debug_env(const char *name, int max, int initial);
>   
> -/*
> - * Hexdump a line of a byte buffer into a hexadecimal/ASCII buffer
> +/**
> + * qemu_hexdump_line:
> + * @str: GString into which to append
> + * @buf: buffer to dump
> + * @len: number of bytes to dump
> + *
> + * Append @len bytes of @buf as hexadecimal into @str.
> + * If @str is NULL, allocate a new string and return it;
> + * otherwise return @str.
>    */
> -#define QEMU_HEXDUMP_LINE_BYTES 16 /* Number of bytes to dump */
> -#define QEMU_HEXDUMP_LINE_LEN 75   /* Number of characters in line */
> -void qemu_hexdump_line(char *line, const void *bufptr, size_t len);
> +GString *qemu_hexdump_line(GString *str, const void *buf, size_t len);


> diff --git a/util/hexdump.c b/util/hexdump.c
> index dbc536fe84..521e346bc6 100644
> --- a/util/hexdump.c
> +++ b/util/hexdump.c
> @@ -16,22 +16,25 @@
>   #include "qemu/osdep.h"
>   #include "qemu/cutils.h"
>   
> -void qemu_hexdump_line(char *line, const void *bufptr, size_t len)
> +GString *qemu_hexdump_line(GString *str, const void *vbuf, size_t len)
>   {
> -    const char *buf = bufptr;
> -    int i, c;
> +    const uint8_t *buf = vbuf;
> +    size_t i;
>   
> -    if (len > QEMU_HEXDUMP_LINE_BYTES) {
> -        len = QEMU_HEXDUMP_LINE_BYTES;
> +    if (str == NULL) {
> +        /* Estimate the length of the output to avoid reallocs. */
> +        i = len * 3 + len / 4;
> +        str = g_string_sized_new(i + 1);
>       }

[*]
          else {
            g_string_truncate(str, 0);
          }

>   
>       for (i = 0; i < len; i++) {
>           if (i != 0 && (i % 4) == 0) {
> -            *line++ = ' ';
> +            g_string_append_c(str, ' ');
>           }
> -        line += sprintf(line, " %02x", (unsigned char)buf[i]);
> +        g_string_append_printf(str, " %02x", buf[i]);
>       }
> -    *line = '\0';
> +
> +    return str;
>   }
>   
>   static void asciidump_line(char *line, const void *bufptr, size_t len)
> @@ -49,24 +52,26 @@ static void asciidump_line(char *line, const void *bufptr, size_t len)
>       *line = '\0';
>   }
>   
> +#define QEMU_HEXDUMP_LINE_BYTES 16
>   #define QEMU_HEXDUMP_LINE_WIDTH \
>       (QEMU_HEXDUMP_LINE_BYTES * 2 + QEMU_HEXDUMP_LINE_BYTES / 4)
>   
>   void qemu_hexdump(FILE *fp, const char *prefix,
>                     const void *bufptr, size_t size)
>   {
> -    char line[QEMU_HEXDUMP_LINE_LEN];
> +    g_autoptr(GString) str = g_string_sized_new(QEMU_HEXDUMP_LINE_WIDTH + 1);
>       char ascii[QEMU_HEXDUMP_LINE_BYTES + 1];
>       size_t b, len;
>   
>       for (b = 0; b < size; b += len) {
>           len = MIN(size - b, QEMU_HEXDUMP_LINE_BYTES);
>   
> -        qemu_hexdump_line(line, bufptr + b, len);
> +        g_string_truncate(str, 0);

Shouldn't we truncate in [*] ?

> +        qemu_hexdump_line(str, bufptr + b, len);
>           asciidump_line(ascii, bufptr + b, len);
>   
> -        fprintf(fp, "%s: %04x: %-*s %s\n",
> -                prefix, b, QEMU_HEXDUMP_LINE_WIDTH, line, ascii);
> +        fprintf(fp, "%s: %04zx: %-*s %s\n",
> +                prefix, b, QEMU_HEXDUMP_LINE_WIDTH, str->str, ascii);
>       }
>   
>   }



  reply	other threads:[~2024-04-12 17:41 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-12  7:33 [PATCH v3 00/27] misc: Replace sprintf Richard Henderson
2024-04-12  7:33 ` [PATCH v3 01/27] util/hexdump: Remove b parameter from qemu_hexdump_line Richard Henderson
2024-04-12 10:00   ` Philippe Mathieu-Daudé
2024-06-03 19:40   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 02/27] util/hexdump: Remove ascii " Richard Henderson
2024-04-12 10:03   ` Philippe Mathieu-Daudé
2024-06-03 17:42   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 03/27] util/hexdump: Use a GString for qemu_hexdump_line Richard Henderson
2024-04-12 17:41   ` Philippe Mathieu-Daudé [this message]
2024-04-12 18:59     ` Richard Henderson
2024-04-13  9:45       ` Philippe Mathieu-Daudé
2024-04-13 12:02         ` Stefan Hajnoczi
2024-04-12  7:33 ` [PATCH v3 04/27] util/hexdump: Add unit_len and block_len to qemu_hexdump_line Richard Henderson
2024-04-12 17:42   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 05/27] util/hexdump: Inline g_string_append_printf "%02x" Richard Henderson
2024-04-12 17:43   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 06/27] hw/mips/malta: Add re-usable rng_seed_hex_new() method Richard Henderson
2024-06-03 18:56   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 07/27] system/qtest: Replace sprintf by qemu_hexdump_line Richard Henderson
2024-04-12 17:45   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 08/27] hw/scsi/scsi-disk: Use qemu_hexdump_line to avoid sprintf Richard Henderson
2024-04-12 17:45   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 09/27] hw/ide/atapi: " Richard Henderson
2024-06-03 18:57   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 10/27] hw/dma/pl330: " Richard Henderson
2024-06-03 18:59   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 11/27] backends/tpm: " Richard Henderson
2024-04-12 17:47   ` Philippe Mathieu-Daudé
2024-04-12  7:33 ` [PATCH v3 12/27] disas/m68k: Replace sprintf() by snprintf() Richard Henderson
2024-04-12  7:33 ` [PATCH v3 13/27] disas/microblaze: " Richard Henderson
2024-04-12  7:33 ` [PATCH v3 14/27] disas/microblaze: Split out print_immval_addr Richard Henderson
2024-06-03 19:14   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 15/27] target/microblaze: Re-indent print_insn_microblaze Richard Henderson
2024-06-03 19:14   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 16/27] disas/microblaze: Merge op->name output into each fprintf Richard Henderson
2024-06-03 19:15   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 17/27] disas/microblaze: Print registers directly with PRIreg Richard Henderson
2024-06-03 19:17   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 18/27] disas/microblaze: Print immediates directly with PRIimm Richard Henderson
2024-06-03 19:17   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 19/27] disas/microblaze: Print registers directly with PRIrfsl Richard Henderson
2024-06-03 19:17   ` Pierrick Bouvier
2024-06-03 19:18   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 20/27] disas/microblaze: Split get_field_special Richard Henderson
2024-06-03 19:20   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 21/27] disas/riscv: Use GString in format_inst Richard Henderson
2024-06-03 19:24   ` Pierrick Bouvier
2024-06-04  0:15   ` Alistair Francis
2024-04-12  7:33 ` [PATCH v3 22/27] linux-user/flatload: Replace sprintf() by snprintf() Richard Henderson
2024-04-12  9:48   ` Peter Maydell
2024-06-03 19:02   ` Pierrick Bouvier
2024-04-12  7:33 ` [PATCH v3 23/27] hw/misc/imx: " Richard Henderson
2024-04-12  7:33 ` [PATCH v3 24/27] hw/net/rocker: " Richard Henderson
2024-04-12 10:58   ` Philippe Mathieu-Daudé
2024-04-12 14:51     ` Richard Henderson
2024-04-12  7:33 ` [PATCH v3 25/27] hw/riscv/virt: Replace sprintf by g_strdup_printf Richard Henderson
2024-06-03 19:06   ` Pierrick Bouvier
2024-06-04  0:16   ` Alistair Francis
2024-04-12  7:33 ` [PATCH v3 26/27] target/arm: Replace sprintf() by snprintf() Richard Henderson
2024-04-12  7:33 ` [PATCH v3 27/27] target/i386/kvm: Improve KVM_EXIT_NOTIFY warnings Richard Henderson
2024-04-12 10:59   ` Philippe Mathieu-Daudé
2024-04-16 15:32   ` Peter Maydell
2024-04-16 15:32   ` Zhao Liu

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=698cc16f-cfb4-47a8-86fe-e4c8a6faecb6@linaro.org \
    --to=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.