[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" } */