poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] pkl: Fix binary representation in printf/format


From: Jose E. Marchesi
Subject: Re: [PATCH] pkl: Fix binary representation in printf/format
Date: Mon, 24 Jan 2022 18:35:33 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

Hi Mohammad.

OK for both master and maint/poke-2.
Thanks for fixing this!

> printf/format should not add suffix except for %v. This commit
> fix that.
>
> 2022-01-24  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
>
>       * common/pk-utils.h (pk_print_binary): Add new param `use_suffix_p`.
>       (pk_format_binary): Likewise.
>       * common/pk-utils.c (pk_print_binary): Likewise.
>       (pk_format_binary): Likewise.
>       * libpoke/pvm-val.c (pvm_print_val_1): Update `pk_print_binary` usage.
>       * libpoke/pvm.jitter (PVM_PRINTI): Likewise.
>       (PVM_PRINTL): Likewise.
>       (PVM_FORMATI): Likewise.
>       (PVM_FORMATL): Likewise.
>       * testsuite/poke.pkl/format-1.pk: Update test to reflect new behavior.
>       * testsuite/poke.pkl/printf-binary-5.pk: New test.
>       * testsuite/poke.pkl/printf-binary-6.pk: Likewise.
>       * testsuite/poke.pkl/printf-binary-7.pk: Likewise.
>       * testsuite/Makefile.am (EXTRA_DIST): Update.
> ---
>  ChangeLog                             | 17 ++++++++++
>  common/pk-utils.c                     | 48 +++++++++++++++------------
>  common/pk-utils.h                     |  5 +--
>  libpoke/pvm-val.c                     | 12 ++++---
>  libpoke/pvm.jitter                    |  8 ++---
>  testsuite/Makefile.am                 |  3 ++
>  testsuite/poke.pkl/format-1.pk        | 18 +++++-----
>  testsuite/poke.pkl/printf-binary-5.pk |  4 +++
>  testsuite/poke.pkl/printf-binary-6.pk |  4 +++
>  testsuite/poke.pkl/printf-binary-7.pk |  4 +++
>  10 files changed, 82 insertions(+), 41 deletions(-)
>  create mode 100644 testsuite/poke.pkl/printf-binary-5.pk
>  create mode 100644 testsuite/poke.pkl/printf-binary-6.pk
>  create mode 100644 testsuite/poke.pkl/printf-binary-7.pk
>
> diff --git a/ChangeLog b/ChangeLog
> index 4ad95d12..be7ddfb3 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,20 @@
> +2022-01-24  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
> +
> +     * common/pk-utils.h (pk_print_binary): Add new param `use_suffix_p`.
> +     (pk_format_binary): Likewise.
> +     * common/pk-utils.c (pk_print_binary): Likewise.
> +     (pk_format_binary): Likewise.
> +     * libpoke/pvm-val.c (pvm_print_val_1): Update `pk_print_binary` usage.
> +     * libpoke/pvm.jitter (PVM_PRINTI): Likewise.
> +     (PVM_PRINTL): Likewise.
> +     (PVM_FORMATI): Likewise.
> +     (PVM_FORMATL): Likewise.
> +     * testsuite/poke.pkl/format-1.pk: Update test to reflect new behavior.
> +     * testsuite/poke.pkl/printf-binary-5.pk: New test.
> +     * testsuite/poke.pkl/printf-binary-6.pk: Likewise.
> +     * testsuite/poke.pkl/printf-binary-7.pk: Likewise.
> +     * testsuite/Makefile.am (EXTRA_DIST): Update.
> +
>  2022-01-24  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
>  
>       * libpoke/ios-dev-sub.c (ios_dev_sub_handler_normalize): Fix error
> diff --git a/common/pk-utils.c b/common/pk-utils.c
> index 62e63660..f578e2a9 100644
> --- a/common/pk-utils.c
> +++ b/common/pk-utils.c
> @@ -86,46 +86,50 @@ PK_POW (pk_upow, uint64_t)
>  
>  void
>  pk_print_binary (void (*puts_fn) (const char *str),
> -                 uint64_t val, int size, int sign)
> +                 uint64_t val, int size, int sign_p, int use_suffix_p)
>  {
>    char b[65];
>  
> -  for (int z = 0; z < size; z++) {
> +  for (int z = 0; z < size; z++)
>      b[size-1-z] = ((val >> z) & 0x1) + '0';
> -  }
>    b[size] = '\0';
>  
>    puts_fn (b);
>  
> -  if (size == 64)
> -    puts_fn (sign ? "L" : "UL");
> -  else if (size == 16)
> -    puts_fn (sign ? "H" : "UH");
> -  else if (size == 8)
> -    puts_fn (sign ? "B" : "UB");
> -  else if (size == 4)
> -    puts_fn (sign ? "N" : "UN");
> +  if  (use_suffix_p)
> +    {
> +      if (size == 64)
> +        puts_fn (sign_p ? "L" : "UL");
> +      else if (size == 16)
> +        puts_fn (sign_p ? "H" : "UH");
> +      else if (size == 8)
> +        puts_fn (sign_p ? "B" : "UB");
> +      else if (size == 4)
> +        puts_fn (sign_p ? "N" : "UN");
> +    }
>  }
>  
>  int
>  pk_format_binary (char* out, size_t outlen,
> -                  uint64_t val, int size, int sign)
> +                  uint64_t val, int size, int sign_p, int use_suffix_p)
>  {
>    char b[64 /* digits */ + 2 /* suffix */ + 1 /* nul */];
>  
> -  for (int z = 0; z < size; z++) {
> +  for (int z = 0; z < size; z++)
>      b[size-1-z] = ((val >> z) & 0x1) + '0';
> -  }
>    b[size] = '\0';
>  
> -  if (size == 64)
> -    strcat (b, sign ? "L" : "UL");
> -  else if (size == 16)
> -    strcat (b, sign ? "H" : "UH");
> -  else if (size == 8)
> -    strcat (b, sign ? "B" : "UB");
> -  else if (size == 4)
> -    strcat (b, sign ? "N" : "UN");
> +  if (use_suffix_p)
> +    {
> +      if (size == 64)
> +        strcat (b, sign_p ? "L" : "UL");
> +      else if (size == 16)
> +        strcat (b, sign_p ? "H" : "UH");
> +      else if (size == 8)
> +        strcat (b, sign_p ? "B" : "UB");
> +      else if (size == 4)
> +        strcat (b, sign_p ? "N" : "UN");
> +    }
>  
>    if (strlen (b) < outlen)
>      {
> diff --git a/common/pk-utils.h b/common/pk-utils.h
> index eeb1abe8..d0995486 100644
> --- a/common/pk-utils.h
> +++ b/common/pk-utils.h
> @@ -48,11 +48,12 @@ int64_t pk_ipow (int64_t base, uint32_t exp);
>  uint64_t pk_upow (uint64_t base, uint32_t exp);
>  
>  /* Print the given unsigned 64-bit integer in binary. */
> -void pk_print_binary (void (*puts_fn) (const char *str), uint64_t val, int 
> size, int sign);
> +void pk_print_binary (void (*puts_fn) (const char *str), uint64_t val,
> +                      int size, int sign_p, int use_suffix_p);
>  
>  /* Format the given unsigned 64-bit integer in binary. */
>  int pk_format_binary (char* out, size_t outlen, uint64_t val, int size,
> -                      int sign);
> +                      int sign_p, int use_suffix_p);
>  
>  /* Concatenate string arguments into an malloc'ed string. */
>  char *pk_str_concat (const char *s0, ...) __attribute__ ((sentinel));
> diff --git a/libpoke/pvm-val.c b/libpoke/pvm-val.c
> index 9dfb8fd7..18da3209 100644
> --- a/libpoke/pvm-val.c
> +++ b/libpoke/pvm-val.c
> @@ -1143,7 +1143,8 @@ pvm_print_val_1 (pvm vm, int depth, int mode, int base, 
> int indent,
>        if (base == 2)
>          {
>            pk_puts ("0b");
> -          pk_print_binary (pk_puts, ulongval, size, 1);
> +          pk_print_binary (pk_puts, ulongval, size, /*signed_p*/ 1,
> +                           /*use_suffix_p*/ 1);
>          }
>        else
>          {
> @@ -1172,7 +1173,8 @@ pvm_print_val_1 (pvm vm, int depth, int mode, int base, 
> int indent,
>        if (base == 2)
>          {
>            pk_puts ("0b");
> -          pk_print_binary (pk_puts, (uint64_t) uintval, size, 1);
> +          pk_print_binary (pk_puts, (uint64_t) uintval, size, /*signed*/ 1,
> +                           /*use_suffix_p*/ 1);
>          }
>        else
>          {
> @@ -1201,7 +1203,8 @@ pvm_print_val_1 (pvm vm, int depth, int mode, int base, 
> int indent,
>        if (base == 2)
>          {
>            pk_puts ("0b");
> -          pk_print_binary (pk_puts, ulongval, size, 0);
> +          pk_print_binary (pk_puts, ulongval, size, /*signed_p*/ 0,
> +                           /*use_suffix_p*/ 1);
>          }
>        else
>          {
> @@ -1223,7 +1226,8 @@ pvm_print_val_1 (pvm vm, int depth, int mode, int base, 
> int indent,
>        if (base == 2)
>          {
>            pk_puts ("0b");
> -          pk_print_binary (pk_puts, uintval, size, 0);
> +          pk_print_binary (pk_puts, uintval, size, /*signed_p*/ 0,
> +                           /*use_suffix_p*/ 1);
>          }
>        else
>          {
> diff --git a/libpoke/pvm.jitter b/libpoke/pvm.jitter
> index be89b5f9..246f52d0 100644
> --- a/libpoke/pvm.jitter
> +++ b/libpoke/pvm.jitter
> @@ -635,7 +635,7 @@ late-header-c
>        }                                                                     \
>        else if ((BASE) == 2)                                                 \
>        {                                                                     \
> -        pk_print_binary (pk_puts, val, JITTER_ARGN0, 1);                    \
> +        pk_print_binary (pk_puts, val, JITTER_ARGN0, 1, 0);                 \
>          JITTER_DROP_STACK ();                                               \
>          JITTER_DROP_STACK ();                                               \
>          break;                                                              \
> @@ -689,7 +689,7 @@ late-header-c
>        }                                                                     \
>        else if ((BASE) == 2)                                                 \
>        {                                                                     \
> -        pk_print_binary (pk_puts, val, JITTER_ARGN0, 1);                    \
> +        pk_print_binary (pk_puts, val, JITTER_ARGN0, 1, 0);                 \
>          JITTER_DROP_STACK ();                                               \
>          JITTER_DROP_STACK ();                                               \
>          break;                                                              \
> @@ -750,7 +750,7 @@ late-header-c
>        }                                                                     \
>        else if ((BASE) == 2)                                                 \
>        {                                                                     \
> -        n = pk_format_binary ((OUT), (OUTLEN), val, JITTER_ARGN0, SIGNED_P);\
> +        n = pk_format_binary ((OUT), (OUTLEN), val, JITTER_ARGN0, SIGNED_P, 
> 0);\
>          assert (n == 0);                                                    \
>          JITTER_DROP_STACK ();                                               \
>          JITTER_DROP_STACK ();                                               \
> @@ -809,7 +809,7 @@ late-header-c
>        }                                                                     \
>        else if ((BASE) == 2)                                                 \
>        {                                                                     \
> -        n = pk_format_binary ((OUT), (OUTLEN), val, JITTER_ARGN0, SIGNED_P);\
> +        n = pk_format_binary ((OUT), (OUTLEN), val, JITTER_ARGN0, SIGNED_P, 
> 0);\
>          assert (n == 0);                                                    \
>          JITTER_DROP_STACK ();                                               \
>          JITTER_DROP_STACK ();                                               \
> diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
> index ade647a3..3bbf10d7 100644
> --- a/testsuite/Makefile.am
> +++ b/testsuite/Makefile.am
> @@ -1681,6 +1681,9 @@ EXTRA_DIST = \
>    poke.pkl/printf-binary-2.pk \
>    poke.pkl/printf-binary-3.pk \
>    poke.pkl/printf-binary-4.pk \
> +  poke.pkl/printf-binary-5.pk \
> +  poke.pkl/printf-binary-6.pk \
> +  poke.pkl/printf-binary-7.pk \
>    poke.pkl/printf-class-1.pk \
>    poke.pkl/printf-class-2.pk \
>    poke.pkl/printf-class-3.pk \
> diff --git a/testsuite/poke.pkl/format-1.pk b/testsuite/poke.pkl/format-1.pk
> index 331985f1..f1cc48aa 100644
> --- a/testsuite/poke.pkl/format-1.pk
> +++ b/testsuite/poke.pkl/format-1.pk
> @@ -3,19 +3,19 @@
>  var eq = [
>    format("") == "",
>    format("%i1b", 0) == "0",
> -  format("%i8b", 1) == "00000001B",
> -  format("%i8b", -1) == "11111111B",
> -  format("%u8b", 1) == "00000001UB",
> -  format("%u8b", -1) == "11111111UB",
> +  format("%i8b", 1) == "00000001",
> +  format("%i8b", -1) == "11111111",
> +  format("%u8b", 1) == "00000001",
> +  format("%u8b", -1) == "11111111",
>    format("%i13b", -1 as uint<64>) == "1" * 13,
> -  format("%i16b", -1) == "1" * 16 + "H",
> -  format("%i16b", 0xa5) == "0" * 8 + "10100101H",
> -  format("%i16b", 0xa5) == "0" * 8 + "10100101H",
> -  format("%u16b", 0xa5) == "0" * 8 + "10100101UH",
> +  format("%i16b", -1) == "1" * 16,
> +  format("%i16b", 0xa5) == "0" * 8 + "10100101",
> +  format("%i16b", 0xa5) == "0" * 8 + "10100101",
> +  format("%u16b", 0xa5) == "0" * 8 + "10100101",
>    format("%i32b", 0xdeadbeaf) == "11011110101011011011111010101111",
>    format("%u32b", 0xdeadbeaf) == "11011110101011011011111010101111",
>    format("%u63b", -1 as uint<64>) == "1" * 63,
> -  format("%u64b", -1 as uint<64>) == "1" * 64 + "UL",
> +  format("%u64b", -1 as uint<64>) == "1" * 64,
>  ];
>  
>  for (i in eq) printf ("%i32d", i); /* { dg-output "111111111111111" } */
> diff --git a/testsuite/poke.pkl/printf-binary-5.pk 
> b/testsuite/poke.pkl/printf-binary-5.pk
> new file mode 100644
> index 00000000..d6334d71
> --- /dev/null
> +++ b/testsuite/poke.pkl/printf-binary-5.pk
> @@ -0,0 +1,4 @@
> +/* { dg-do run } */
> +
> +/* { dg-command { printf "0b%u4b\n",4L } } */
> +/* { dg-output "0b0100" } */
> diff --git a/testsuite/poke.pkl/printf-binary-6.pk 
> b/testsuite/poke.pkl/printf-binary-6.pk
> new file mode 100644
> index 00000000..8e85878e
> --- /dev/null
> +++ b/testsuite/poke.pkl/printf-binary-6.pk
> @@ -0,0 +1,4 @@
> +/* { dg-do run } */
> +
> +/* { dg-command { printf "0b%u8b\n",4U } } */
> +/* { dg-output "0b00000100" } */
> diff --git a/testsuite/poke.pkl/printf-binary-7.pk 
> b/testsuite/poke.pkl/printf-binary-7.pk
> new file mode 100644
> index 00000000..e00ba551
> --- /dev/null
> +++ b/testsuite/poke.pkl/printf-binary-7.pk
> @@ -0,0 +1,4 @@
> +/* { dg-do run } */
> +
> +/* { dg-command { printf "0b%u16b\n",-1 } } */
> +/* { dg-output "0b1111111111111111" } */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]