[ 
https://issues.apache.org/jira/browse/PROTON-2249?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kim van der Riet updated PROTON-2249:
-------------------------------------
    Description: 
The *{{pn_inspect()}}* method returns a string representation of the inspected 
AMQP type.

While testing an array of type char in which the first char had value 0x0, it 
was observed that this method is not correctly printing the array, but is being 
truncated:
{noformat}
"@PN_CHAR["
{noformat}
and prevents effective checking of the array contents in the test.

The formatting of simple AMQP types is set in the *{{pni_inspect_atom()}}* 
method. The use of the {{%c}} formatting code to print the char is causing null 
chars to terminate the string which is being treated as a c-string. The 
following suggested change fixes this issue and prefixes each char with 'U' to 
indicate it is UTF-32:
{noformat}
diff --git a/c/src/core/codec.c b/c/src/core/codec.c
index b50f286b..1f9185f7 100644
--- a/c/src/core/codec.c
+++ b/c/src/core/codec.c
@@ -129,7 +129,8 @@ int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
  case PN_INT:
    return pn_string_addf(str, "%" PRIi32, atom->u.as_int);
  case PN_CHAR:
-   return pn_string_addf(str, "%c", atom->u.as_char);
+   if (isprint(atom->u.as_char)) return pn_string_addf(str, "U'%c'", 
atom->u.as_char);
+   return pn_string_addf(str, "U'\\x%" PRIx32 "'", atom->u.as_char);
  case PN_ULONG:
    return pn_string_addf(str, "%" PRIu64, atom->u.as_ulong);
  case PN_LONG:
{noformat}
and the array prints as:
{noformat}
"@PN_CHAR[U'\x0', U'5', U'a', U'Z', U'\x7f']"
{noformat}
The following are improved:
 * Each char is surrounded by single quotes {{'\''}}
 * Each char is prefixed by 'U' to indicate it is UTF-32 (see 
[https://en.cppreference.com/w/cpp/language/character_literal)|https://en.cppreference.com/w/cpp/language/character_literal]
 * Printable chars print as the char itself, non-printable chars print as the 
hex ordinal value.

Thoughts?

  was:
The *{{pn_inspect()}}* method returns a string representation of the inspected 
AMQP type.

While testing an array of type char in which the first char had value 0x0, it 
was observed that this method is not correctly printing the array, but is being 
truncated:
{noformat}
"@PN_CHAR["
{noformat}
and prevents effective checking of the array contents in the test.

The formatting of simple AMQP types is set in the *{{pni_inspect_atom()}}* 
method. The following suggested change fixes this issue and prefixes each char 
with 'U' to indicate it is UTF-32:
{noformat}
diff --git a/c/src/core/codec.c b/c/src/core/codec.c
index b50f286b..1f9185f7 100644
--- a/c/src/core/codec.c
+++ b/c/src/core/codec.c
@@ -129,7 +129,8 @@ int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
  case PN_INT:
    return pn_string_addf(str, "%" PRIi32, atom->u.as_int);
  case PN_CHAR:
-   return pn_string_addf(str, "%c", atom->u.as_char);
+   if (isprint(atom->u.as_char)) return pn_string_addf(str, "U'%c'", 
atom->u.as_char);
+   return pn_string_addf(str, "U'\\x%" PRIx32 "'", atom->u.as_char);
  case PN_ULONG:
    return pn_string_addf(str, "%" PRIu64, atom->u.as_ulong);
  case PN_LONG:
{noformat}
and the array prints as:
{noformat}
"@PN_CHAR[U'\x0', U'5', U'a', U'Z', U'\x7f']"
{noformat}
The following are improved:
 * Each char is surrounded by single quotes {{'\''}}
 * Each char is prefixed by 'U' to indicate it is UTF-32 (see 
[https://en.cppreference.com/w/cpp/language/character_literal)|https://en.cppreference.com/w/cpp/language/character_literal]
 * Printable chars print as the char itself, non-printable chars print as the 
hex ordinal value.

Thoughts?


> [Proton-c] AMQP char type does not always print correctly from pn_inspect()
> ---------------------------------------------------------------------------
>
>                 Key: PROTON-2249
>                 URL: https://issues.apache.org/jira/browse/PROTON-2249
>             Project: Qpid Proton
>          Issue Type: Bug
>            Reporter: Kim van der Riet
>            Priority: Major
>
> The *{{pn_inspect()}}* method returns a string representation of the 
> inspected AMQP type.
> While testing an array of type char in which the first char had value 0x0, it 
> was observed that this method is not correctly printing the array, but is 
> being truncated:
> {noformat}
> "@PN_CHAR["
> {noformat}
> and prevents effective checking of the array contents in the test.
> The formatting of simple AMQP types is set in the *{{pni_inspect_atom()}}* 
> method. The use of the {{%c}} formatting code to print the char is causing 
> null chars to terminate the string which is being treated as a c-string. The 
> following suggested change fixes this issue and prefixes each char with 'U' 
> to indicate it is UTF-32:
> {noformat}
> diff --git a/c/src/core/codec.c b/c/src/core/codec.c
> index b50f286b..1f9185f7 100644
> --- a/c/src/core/codec.c
> +++ b/c/src/core/codec.c
> @@ -129,7 +129,8 @@ int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
>   case PN_INT:
>     return pn_string_addf(str, "%" PRIi32, atom->u.as_int);
>   case PN_CHAR:
> -   return pn_string_addf(str, "%c", atom->u.as_char);
> +   if (isprint(atom->u.as_char)) return pn_string_addf(str, "U'%c'", 
> atom->u.as_char);
> +   return pn_string_addf(str, "U'\\x%" PRIx32 "'", atom->u.as_char);
>   case PN_ULONG:
>     return pn_string_addf(str, "%" PRIu64, atom->u.as_ulong);
>   case PN_LONG:
> {noformat}
> and the array prints as:
> {noformat}
> "@PN_CHAR[U'\x0', U'5', U'a', U'Z', U'\x7f']"
> {noformat}
> The following are improved:
>  * Each char is surrounded by single quotes {{'\''}}
>  * Each char is prefixed by 'U' to indicate it is UTF-32 (see 
> [https://en.cppreference.com/w/cpp/language/character_literal)|https://en.cppreference.com/w/cpp/language/character_literal]
>  * Printable chars print as the char itself, non-printable chars print as the 
> hex ordinal value.
> Thoughts?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to