hope no one minds with this Dano-like version of BMessage::PrintToStream()

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18089 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2006-07-10 20:00:07 +00:00
parent 11235ae729
commit 67bdea52ce
2 changed files with 102 additions and 128 deletions
+101 -128
View File
@@ -364,175 +364,148 @@ BMessage::IsReply() const
}
template<typename Type> static void
print_to_stream_type(char* buffer, Type* item, int32 count,
uint32 size)
template<typename Type> static uint8 *
print_to_stream_type(uint8* pointer)
{
sprintf(buffer + strlen(buffer), "size=%2ld, ", size);
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
for (int32 i = 0; i < count; i++, item++) {
if (i > 0) /* indent */
printf(buffer);
printf("data[%ld]: ", i);
item->PrintToStream();
}
Type *item = (Type *)pointer;
item->PrintToStream();
return (uint8 *)(item+1);
}
template<typename Type> static void
print_type(char* buffer, const char* format, Type* item, int32 count,
uint32 size, type_code typeCode)
template<typename Type> static uint8 *
print_type(const char* format, uint8* pointer)
{
sprintf(buffer + strlen(buffer), "size=%2ld, ", size);
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
for (int32 i = 0; i < count; i++, item++) {
if (i > 0) /* indent */
printf(buffer);
printf("data[%ld]: ", i);
Type value = *item;
if (typeCode == B_BOOL_TYPE) {
printf("%s (%d)\n", value != 0 ? "true" : "false", (int8)value);
} else {
if (typeCode == B_INT8_TYPE && value < ' ')
value = ' ';
swap_data(typeCode, &value, sizeof(Type), B_SWAP_BENDIAN_TO_HOST);
printf(format, *item, *item, &value);
}
}
Type *item = (Type *)pointer;
printf(format, *item, *item);
return (uint8 *)(item+1);
}
void
BMessage::PrintToStream() const
{
_PrintToStream("");
printf("}\n");
}
void
BMessage::_PrintToStream(const char* indent) const
{
DEBUG_FUNCTION_ENTER;
int32 value = B_BENDIAN_TO_HOST_INT32(what);
printf("BMessage: what = '%.4s' (0x%lx, or %ld)\n",
(char *)&value, what, what);
char buffer[1024];
printf("BMessage(");
if (isprint(*(char *)&value)) {
printf("'%.4s'", (char *)&value);
} else
printf("0x%lx", what);
printf(") {\n");
field_header *field = fFields;
for (int32 i = 0; i < fHeader->field_count; i++, field++) {
value = B_BENDIAN_TO_HOST_INT32(field->type);
sprintf(buffer, " entry %14s, type='%.4s', c=%ld, ",
(char *)(fData + field->offset), (char *)&value, field->count);
ssize_t size = 0;
if (field->flags & FIELD_FLAG_FIXED_SIZE)
size = field->data_size / field->count;
switch (field->type) {
case B_RECT_TYPE:
print_to_stream_type<BRect>(buffer,
(BRect *)(fData + field->offset + field->name_length),
field->count, size);
break;
uint8 *pointer = fData + field->offset + field->name_length;
case B_POINT_TYPE:
print_to_stream_type<BPoint>(buffer,
(BPoint *)(fData + field->offset + field->name_length),
field->count, size);
break;
case B_STRING_TYPE:
{
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
uint8 *pointer = fData + field->offset + field->name_length;
for (int32 i = 0; i < field->count; i++) {
if (i > 0) /* indent */
printf("%s", buffer);
ssize_t size = *(ssize_t *)pointer;
pointer += sizeof(ssize_t);
printf("size=%2ld, data[%ld]: ", size, i);
printf("\"%s\"\n", (char *)pointer);
pointer += size;
}
break;
for (int32 j=0; j<field->count; j++) {
if (field->count == 1) {
printf("%s %s = ", indent,
(char *)(fData + field->offset));
} else {
printf("%s %s[%ld] = ", indent,
(char *)(fData + field->offset), j);
}
case B_INT8_TYPE:
print_type<int8>(buffer, "0x%hx (%d \'%.1s\')\n",
(int8 *)(fData + field->offset + field->name_length),
field->count, size, B_INT8_TYPE);
break;
switch (field->type) {
case B_RECT_TYPE:
pointer = print_to_stream_type<BRect>(pointer);
break;
case B_INT16_TYPE:
print_type<int16>(buffer, "0x%x (%d \'%.2s\')\n",
(int16 *)(fData + field->offset + field->name_length),
field->count, size, B_INT16_TYPE);
break;
case B_POINT_TYPE:
pointer = print_to_stream_type<BPoint>(pointer);
break;
case B_INT32_TYPE:
print_type<int32>(buffer, "0x%lx (%ld \'%.4s\')\n",
(int32 *)(fData + field->offset + field->name_length),
field->count, size, B_INT32_TYPE);
break;
case B_STRING_TYPE: {
ssize_t size = *(ssize_t *)pointer;
pointer += sizeof(ssize_t);
printf("string(\"%s\", %ld bytes)\n", (char *)pointer, size);
pointer += size;
break;
}
case B_INT64_TYPE:
print_type<int64>(buffer, "0x%Lx (%Ld \'%.8s\')\n",
(int64 *)(fData + field->offset + field->name_length),
field->count, size, B_INT64_TYPE);
break;
case B_INT8_TYPE:
pointer = print_type<int8>("int8(0x%hx or %d or \'%.1s\')\n", pointer);
break;
case B_BOOL_TYPE:
print_type<int8>(buffer, NULL,
(int8 *)(fData + field->offset + field->name_length),
field->count, size, B_BOOL_TYPE);
break;
case B_INT16_TYPE:
pointer = print_type<int16>("int16 (0x%x or %d)\n", pointer);
break;
case B_FLOAT_TYPE:
print_type<float>(buffer, "%.4f\n",
(float *)(fData + field->offset + field->name_length),
field->count, size, B_FLOAT_TYPE);
break;
case B_INT32_TYPE:
pointer = print_type<int32>("int32(0x%lx or %ld)\n", pointer);
break;
case B_DOUBLE_TYPE:
print_type<double>(buffer, "%.8f\n",
(double *)(fData + field->offset + field->name_length),
field->count, size, B_DOUBLE_TYPE);
break;
case B_INT64_TYPE:
pointer = print_type<int64>("int64(0x%Lx or %Ld)\n", pointer);
break;
case B_REF_TYPE: {
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
uint8 *pointer = fData + field->offset + field->name_length;
for (int32 i = 0; i < field->count; i++) {
if (i > 0) /* indent */
printf("%s", buffer);
case B_BOOL_TYPE:
printf("bool(%s)\n", *((bool *)pointer)!= 0 ? "true" : "false");
pointer += sizeof(bool);
break;
case B_FLOAT_TYPE:
pointer = print_type<float>("float(%.4f)\n", pointer);
break;
case B_DOUBLE_TYPE:
pointer = print_type<double>("double(%.8f)\n", pointer);
break;
case B_REF_TYPE: {
ssize_t size = *(ssize_t *)pointer;
pointer += sizeof(ssize_t);
entry_ref ref;
BPrivate::entry_ref_unflatten(&ref, (char *)pointer, size);
printf("size=%2ld, data[%ld]: ", size, i);
printf("device=%ld, directory=%lld, name=\"%s\", ",
ref.device, ref.directory, ref.name);
printf("entry_ref(device=%ld, directory=%lld, name=\"%s\", ",
ref.device, ref.directory, ref.name);
BPath path(&ref);
printf("path=\"%s\"\n", path.Path());
printf("path=\"%s\")\n", path.Path());
pointer += size;
break;
}
case B_MESSAGE_TYPE:
{
char buffer[1024];
sprintf(buffer, "%s ", indent);
BMessage message;
const ssize_t size = *(const ssize_t *)pointer;
pointer += sizeof(ssize_t);
if (message.Unflatten((const char *)pointer)!=B_OK) {
fprintf(stderr, "couldn't unflatten item %ld\n", i);
break;
}
message._PrintToStream(buffer);
printf("%s }\n", indent);
pointer += size;
break;
}
default: {
printf("(type = '%.4s')(size = %ld)\n", (char *)&value, size);
}
break;
}
default: {
sprintf(buffer + strlen(buffer), "size=%2ld, \n", size);
printf("%s", buffer);
}
}
}
}
}