summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Thompson <will.thompson@collabora.co.uk>2009-10-28 19:40:38 +0000
committerColin Walters <walters@verbum.org>2010-01-28 17:01:24 -0500
commita8e620a0ff60eef983a9be95e2b27dbcdcbaf654 (patch)
treeeebb123c2d015158dff6f0644146a4414c1e6562
parent1a33efb54b6a40d48b64c735741298afc699bbd3 (diff)
downloaddbus-a8e620a0ff60eef983a9be95e2b27dbcdcbaf654.tar.gz
Print all-printable-ASCII byte arrays as strings
In practice, ay seems to be used mostly for binary data (in which case, hex output is fine) or for Unix file paths (because they may be non-UTF-8) and similar human-readable strings. So let's print the latter similarly to strings.
-rw-r--r--tools/dbus-print-message.c75
1 files changed, 58 insertions, 17 deletions
diff --git a/tools/dbus-print-message.c b/tools/dbus-print-message.c
index f934c7d1..8a8e351d 100644
--- a/tools/dbus-print-message.c
+++ b/tools/dbus-print-message.c
@@ -21,6 +21,8 @@
*/
#include "dbus-print-message.h"
+#include <stdlib.h>
+
static const char*
type_to_name (int message_type)
{
@@ -49,11 +51,9 @@ indent (int depth)
}
static void
-print_ay (DBusMessageIter *iter, int depth)
+print_hex (unsigned char *bytes, unsigned int len, int depth)
{
- int current_type;
- int n = 0;
- int columns;
+ int i, columns;
printf ("array of bytes [\n");
@@ -65,26 +65,19 @@ print_ay (DBusMessageIter *iter, int depth)
if (columns < 8)
columns = 8;
- current_type = dbus_message_iter_get_arg_type (iter);
+ i = 0;
- while (current_type != DBUS_TYPE_INVALID)
+ while (i < len)
{
- unsigned char val;
- dbus_message_iter_get_basic (iter, &val);
- printf ("%02x", val);
+ printf ("%02x", bytes[i]);
+ i++;
- n++;
-
- dbus_message_iter_next (iter);
- current_type = dbus_message_iter_get_arg_type (iter);
-
- if (current_type != DBUS_TYPE_INVALID)
+ if (i != len)
{
- if (n == columns)
+ if (i % columns == 0)
{
printf ("\n");
indent (depth + 1);
- n = 0;
}
else
{
@@ -98,6 +91,54 @@ print_ay (DBusMessageIter *iter, int depth)
printf ("]\n");
}
+#define DEFAULT_SIZE 100
+
+static void
+print_ay (DBusMessageIter *iter, int depth)
+{
+ /* Not using DBusString because it's not public API. It's 2009, and I'm
+ * manually growing a string chunk by chunk.
+ */
+ unsigned char *bytes = malloc (DEFAULT_SIZE + 1);
+ unsigned int len = 0;
+ unsigned int max = DEFAULT_SIZE;
+ dbus_bool_t all_ascii = TRUE;
+ int current_type;
+
+ while ((current_type = dbus_message_iter_get_arg_type (iter))
+ != DBUS_TYPE_INVALID)
+ {
+ unsigned char val;
+
+ dbus_message_iter_get_basic (iter, &val);
+ bytes[len] = val;
+ len++;
+
+ if (val < 32 || val > 126)
+ all_ascii = FALSE;
+
+ if (len == max)
+ {
+ max *= 2;
+ bytes = realloc (bytes, max + 1);
+ }
+
+ dbus_message_iter_next (iter);
+ }
+
+ if (all_ascii)
+ {
+ bytes[len] = '\0';
+ printf ("array of bytes \"%s\"\n", bytes);
+ }
+ else
+ {
+ print_hex (bytes, len, depth);
+ }
+
+ free (bytes);
+}
+
static void
print_iter (DBusMessageIter *iter, dbus_bool_t literal, int depth)
{